").attr("class", "status "+ data.status).text(data.status)
+ ).append(
+ $("
").text(data.message)
+ )
+ ).append(
+ $("
").attr("class","card-text").append(
+ $("").text(data.author)
+ ).append(
+ $("").text("authored")
+ ).append(
+ $("").attr("data-livestamp", data.created_at)
+ ).append(
+ $("").text("to")
+ ).append(
+ $("").text(data.branch)
+ )
+ )
+ ).css("display", "flex").hide().fadeIn(1000);
+
+ // TODO it is very possible that the group may not
+ // exist, in which case the we'll need to create the
+ // gropu as well.
+
+ // append to the latest group in the timeline.
+ $(".card").first().before(el);
+ });
+}
+
+function Subscribe(repo, _callback) {
+ var callback = _callback;
+
+ var events = new EventSource("/api/stream/" + repo, {withCredentials: true});
+ events.onmessage = function (event) {
+ if (callback !== undefined) {
+ callback(JSON.parse(event.data));
+ }
+ };
+
+ events.onerror = function (event) {
+ callback = undefined;
+ if (events !== undefined) {
+ events.close();
+ events = undefined;
+ }
+ console.log('user event stream closed due to error.', event);
+ };
+};
+
+
+
+function RepoConfigViewModel(repo) {
+ var self = this;
+
+ var timeoutLabel = $(".timeout-label")
+
+ $("input[type='range']").change(function(e) {
+ var timeout = parseInt(e.target.value);
+ timeoutLabel.text(timeout + " minutes");
+ patchRepo(repo, { timeout: timeout })
+ })
+
+ $("#push").change(function(e) {
+ patchRepo(repo, {
+ allow_push: e.target.checked,
+ })
+ })
+
+ $("#pull").change(function(e) {
+ patchRepo(repo, {
+ allow_pr: e.target.checked,
+ })
+ })
+
+ $("#tag").change(function(e) {
+ patchRepo(repo, {
+ allow_tag: e.target.checked,
+ })
+ })
+
+ $("#deploy").change(function(e) {
+ patchRepo(repo, {
+ allow_deploy: e.target.checked,
+ })
+ })
+
+ $("#trusted").change(function(e) {
+ patchRepo(repo, {
+ trusted: e.target.checked,
+ })
+ })
+
+ $(".btn-danger").click(function(e) {
+ var r = confirm("Are you sure you want to delete this repository?");
+ if (r !== false) {
+ deleteRepo(repo);
+ }
+ })
+}
+
+function deleteRepo(repo) {
+ $.ajax({
+ url: "/api/repos/"+repo,
+ type: "DELETE",
+ contentType: "application/json",
+ success: function() {
+ window.location.href="/";
+ },
+ });
+}
+
+function patchRepo(repo, data) {
+ $.ajax({
+ url: "/api/repos/"+repo,
+ type: "PATCH",
+ contentType: "application/json",
+ data: JSON.stringify(data)
+ });
+}
\ No newline at end of file
diff --git a/static/scripts/repos.js b/static/scripts/repos.js
new file mode 100644
index 000000000..9ba5e4f14
--- /dev/null
+++ b/static/scripts/repos.js
@@ -0,0 +1,31 @@
+
+
+
+
+
+function RepoListViewModel(repos) {
+ var self = this;
+
+ var mapped = $.map(repos, function(repo) {
+ return new Repo(repo)
+ });
+
+ self.repos = ko.observableArray(mapped);
+ self.newRepo = ko.observable();
+
+ self.addRepo = function() {
+ $.ajax({
+ url: "/api/repos/"+self.newRepo(),
+ type: "POST",
+ contentType: "application/json",
+ success: function( data ) {
+ self.repos.push(new Repo(data));
+ self.repos.sort(RepoCompare);
+ self.newRepo("");
+ },
+ error: function( data ) {
+ console.log(data);
+ }
+ });
+ };
+}
diff --git a/static/scripts/search.js b/static/scripts/search.js
new file mode 100644
index 000000000..73970737b
--- /dev/null
+++ b/static/scripts/search.js
@@ -0,0 +1,36 @@
+
+
+var remoteRepos = new Bloodhound({
+ queryTokenizer: Bloodhound.tokenizers.whitespace,
+ datumTokenizer: Bloodhound.tokenizers.obj.whitespace("full_name"),
+
+ identify: function(obj) { return obj.full_name; },
+ prefetch: '/api/user/repos/remote'
+});
+
+
+function reposWithDefaults(q, sync) {
+ if (q === "") {
+ sync(remoteRepos.all())
+ } else {
+ remoteRepos.search(q, sync);
+ }
+}
+
+$('.typeahead').typeahead({
+ hint: true,
+ highlight: true,
+ minLength: 0
+},
+{
+ name: "repos",
+ display: "full_name",
+ source: reposWithDefaults,
+ templates: {
+ suggestion: function(obj) {
+ return "";
+ }
+ }
+}).bind('typeahead:select', function(ev, suggestion) {
+ window.location.href="/"+suggestion.full_name;
+});
diff --git a/static/scripts/term.js b/static/scripts/term.js
new file mode 100644
index 000000000..ef49d73ca
--- /dev/null
+++ b/static/scripts/term.js
@@ -0,0 +1,394 @@
+var Filter, STYLES, defaults, entities, extend, toHexString, _i, _results,
+ __slice = [].slice;
+
+// theme stuff:
+// http://ciembor.github.io/4bit
+// https://github.com/lysyi3m/osx-terminal-themes
+
+STYLES = {
+ 'ef0': 'color:#000',
+ 'ef1': 'color:#b87a7a',
+ 'ef2': 'color:#7ab87a',
+ 'ef3': 'color:#b8b87a',
+ 'ef4': 'color:#7a7ab8',
+ 'ef5': 'color:#b87ab8',
+ 'ef6': 'color:#7ab8b8',
+ 'ef7': 'color:#d9d9d9',
+ 'ef8': 'color:#262626',
+ 'ef9': 'color:#dbbdbd',
+ 'ef10': 'color:#bddbbd',
+ 'ef11': 'color:#dbdbbd',
+ 'ef12': 'color:#bdbddb',
+ 'ef13': 'color:#dbbddb',
+ 'ef14': 'color:#bddbdb',
+ 'ef15': 'color:#FFF',
+ 'eb0': 'background-color:#000',
+ 'eb1': 'background-color:#b87a7a',
+ 'eb2': 'background-color:#7ab87a',
+ 'eb3': 'background-color:#b8b87a',
+ 'eb4': 'background-color:#7a7ab8',
+ 'eb5': 'background-color:#b87ab8',
+ 'eb6': 'background-color:#7ab8b8',
+ 'eb7': 'background-color:#d9d9d9',
+ 'eb8': 'background-color:#262626',
+ 'eb9': 'background-color:#dbbdbd',
+ 'eb10': 'background-color:#bddbbd',
+ 'eb11': 'background-color:#dbdbbd',
+ 'eb12': 'background-color:#bdbddb',
+ 'eb13': 'background-color:#dbbddb',
+ 'eb14': 'background-color:#bddbdb',
+ 'eb15': 'background-color:#FFF'
+};
+
+toHexString = function(num) {
+ num = num.toString(16);
+ while (num.length < 2) {
+ num = "0" + num;
+ }
+ return num;
+};
+
+[0, 1, 2, 3, 4, 5].forEach(function(red) {
+ return [0, 1, 2, 3, 4, 5].forEach(function(green) {
+ return [0, 1, 2, 3, 4, 5].forEach(function(blue) {
+ var b, c, g, n, r, rgb;
+ c = 16 + (red * 36) + (green * 6) + blue;
+ r = red > 0 ? red * 40 + 55 : 0;
+ g = green > 0 ? green * 40 + 55 : 0;
+ b = blue > 0 ? blue * 40 + 55 : 0;
+ rgb = ((function() {
+ var _i, _len, _ref, _results;
+ _ref = [r, g, b];
+ _results = [];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ n = _ref[_i];
+ _results.push(toHexString(n));
+ }
+ return _results;
+ })()).join('');
+ STYLES["ef" + c] = "color:#" + rgb;
+ return STYLES["eb" + c] = "background-color:#" + rgb;
+ });
+ });
+});
+
+(function() {
+ _results = [];
+ for (_i = 0; _i <= 23; _i++){ _results.push(_i); }
+ return _results;
+}).apply(this).forEach(function(gray) {
+ var c, l;
+ c = gray + 232;
+ l = toHexString(gray * 10 + 8);
+ STYLES["ef" + c] = "color:#" + l + l + l;
+ return STYLES["eb" + c] = "background-color:#" + l + l + l;
+});
+
+extend = function() {
+ var dest, k, obj, objs, v, _j, _len;
+ dest = arguments[0], objs = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ for (_j = 0, _len = objs.length; _j < _len; _j++) {
+ obj = objs[_j];
+ for (k in obj) {
+ v = obj[k];
+ dest[k] = v;
+ }
+ }
+ return dest;
+};
+
+defaults = {
+ fg: '#FFF',
+ bg: '#000',
+ newline: false,
+ escapeXML: false,
+ stream: false
+};
+
+Filter = (function() {
+ function Filter(options) {
+ if (options == null) {
+ options = {};
+ }
+ this.opts = extend({}, defaults, options);
+ this.input = [];
+ this.stack = [];
+ this.stickyStack = [];
+ }
+
+ Filter.prototype.toHtml = function(input) {
+ var buf;
+ this.input = typeof input === 'string' ? [input] : input;
+ buf = [];
+ this.stickyStack.forEach((function(_this) {
+ return function(element) {
+ return _this.generateOutput(element.token, element.data, function(chunk) {
+ return buf.push(chunk);
+ });
+ };
+ })(this));
+ this.forEach(function(chunk) {
+ return buf.push(chunk);
+ });
+ this.input = [];
+ return buf.join('');
+ };
+
+ Filter.prototype.forEach = function(callback) {
+ var buf;
+ buf = '';
+ this.input.forEach((function(_this) {
+ return function(chunk) {
+ buf += chunk;
+ return _this.tokenize(buf, function(token, data) {
+ _this.generateOutput(token, data, callback);
+ if (_this.opts.stream) {
+ return _this.updateStickyStack(token, data);
+ }
+ });
+ };
+ })(this));
+ if (this.stack.length) {
+ return callback(this.resetStyles());
+ }
+ };
+
+ Filter.prototype.generateOutput = function(token, data, callback) {
+ switch (token) {
+ case 'text':
+ return callback(this.pushText(data));
+ case 'display':
+ return this.handleDisplay(data, callback);
+ case 'xterm256':
+ return callback(this.pushStyle("ef" + data));
+ }
+ };
+
+ Filter.prototype.updateStickyStack = function(token, data) {
+ var notCategory;
+ notCategory = function(category) {
+ return function(e) {
+ return (category === null || e.category !== category) && category !== 'all';
+ };
+ };
+ if (token !== 'text') {
+ this.stickyStack = this.stickyStack.filter(notCategory(this.categoryForCode(data)));
+ return this.stickyStack.push({
+ token: token,
+ data: data,
+ category: this.categoryForCode(data)
+ });
+ }
+ };
+
+ Filter.prototype.handleDisplay = function(code, callback) {
+ code = parseInt(code, 10);
+ if (code === -1) {
+ callback('
');
+ }
+ if (code === 0) {
+ if (this.stack.length) {
+ callback(this.resetStyles());
+ }
+ }
+ if (code === 1) {
+ callback(this.pushTag('b'));
+ }
+ if (code === 2) {
+
+ }
+ if ((2 < code && code < 5)) {
+ callback(this.pushTag('u'));
+ }
+ if ((4 < code && code < 7)) {
+ callback(this.pushTag('blink'));
+ }
+ if (code === 7) {
+
+ }
+ if (code === 8) {
+ callback(this.pushStyle('display:none'));
+ }
+ if (code === 9) {
+ callback(this.pushTag('strike'));
+ }
+ if (code === 24) {
+ callback(this.closeTag('u'));
+ }
+ if ((29 < code && code < 38)) {
+ callback(this.pushStyle("ef" + (code - 30)));
+ }
+ if (code === 39) {
+ callback(this.pushStyle("color:" + this.opts.fg));
+ }
+ if ((39 < code && code < 48)) {
+ callback(this.pushStyle("eb" + (code - 40)));
+ }
+ if (code === 49) {
+ callback(this.pushStyle("background-color:" + this.opts.bg));
+ }
+ if ((89 < code && code < 98)) {
+ callback(this.pushStyle("ef" + (8 + (code - 90))));
+ }
+ if ((99 < code && code < 108)) {
+ return callback(this.pushStyle("eb" + (8 + (code - 100))));
+ }
+ };
+
+ Filter.prototype.categoryForCode = function(code) {
+ code = parseInt(code, 10);
+ if (code === 0) {
+ return 'all';
+ } else if (code === 1) {
+ return 'bold';
+ } else if ((2 < code && code < 5)) {
+ return 'underline';
+ } else if ((4 < code && code < 7)) {
+ return 'blink';
+ } else if (code === 8) {
+ return 'hide';
+ } else if (code === 9) {
+ return 'strike';
+ } else if ((29 < code && code < 38) || code === 39 || (89 < code && code < 98)) {
+ return 'foreground-color';
+ } else if ((39 < code && code < 48) || code === 49 || (99 < code && code < 108)) {
+ return 'background-color';
+ } else {
+ return null;
+ }
+ };
+
+ Filter.prototype.pushTag = function(tag, style) {
+ if (style == null) {
+ style = '';
+ }
+ if (style.length && style.indexOf(':') === -1) {
+ style = STYLES[style];
+ }
+ this.stack.push(tag);
+ return ["<" + tag, (style ? " style=\"" + style + "\"" : void 0), ">"].join('');
+ };
+
+ Filter.prototype.pushText = function(text) {
+ if (this.opts.escapeXML) {
+ return entities.encodeXML(text);
+ } else {
+ return text;
+ }
+ };
+
+ Filter.prototype.pushStyle = function(style) {
+ return this.pushTag("span", style);
+ };
+
+ Filter.prototype.closeTag = function(style) {
+ var last;
+ if (this.stack.slice(-1)[0] === style) {
+ last = this.stack.pop();
+ }
+ if (last != null) {
+ return "" + style + ">";
+ }
+ };
+
+ Filter.prototype.resetStyles = function() {
+ var stack, _ref;
+ _ref = [this.stack, []], stack = _ref[0], this.stack = _ref[1];
+ return stack.reverse().map(function(tag) {
+ return "" + tag + ">";
+ }).join('');
+ };
+
+ Filter.prototype.tokenize = function(text, callback) {
+ var ansiHandler, ansiMatch, ansiMess, handler, i, length, newline, process, realText, remove, removeXterm256, tokens, _j, _len, _results1;
+ ansiMatch = false;
+ ansiHandler = 3;
+ remove = function(m) {
+ return '';
+ };
+ removeXterm256 = function(m, g1) {
+ callback('xterm256', g1);
+ return '';
+ };
+ newline = (function(_this) {
+ return function(m) {
+ if (_this.opts.newline) {
+ callback('display', -1);
+ } else {
+ callback('text', m);
+ }
+ return '';
+ };
+ })(this);
+ ansiMess = function(m, g1) {
+ var code, _j, _len;
+ ansiMatch = true;
+ if (g1.trim().length === 0) {
+ g1 = '0';
+ }
+ g1 = g1.trimRight(';').split(';');
+ for (_j = 0, _len = g1.length; _j < _len; _j++) {
+ code = g1[_j];
+ callback('display', code);
+ }
+ return '';
+ };
+ realText = function(m) {
+ callback('text', m);
+ return '';
+ };
+ tokens = [
+ {
+ pattern: /^\x08+/,
+ sub: remove
+ }, {
+ pattern: /^\x1b\[[012]?K/,
+ sub: remove
+ }, {
+ pattern: /^\x1b\[38;5;(\d+)m/,
+ sub: removeXterm256
+ }, {
+ pattern: /^\n+/,
+ sub: newline
+ }, {
+ pattern: /^\x1b\[((?:\d{1,3};?)+|)m/,
+ sub: ansiMess
+ }, {
+ pattern: /^\x1b\[?[\d;]{0,3}/,
+ sub: remove
+ }, {
+ pattern: /^([^\x1b\x08\n]+)/,
+ sub: realText
+ }
+ ];
+ process = function(handler, i) {
+ var matches;
+ if (i > ansiHandler && ansiMatch) {
+ return;
+ } else {
+ ansiMatch = false;
+ }
+ matches = text.match(handler.pattern);
+ text = text.replace(handler.pattern, handler.sub);
+ if (matches == null) {
+
+ }
+ };
+ _results1 = [];
+ while ((length = text.length) > 0) {
+ for (i = _j = 0, _len = tokens.length; _j < _len; i = ++_j) {
+ handler = tokens[i];
+ process(handler, i);
+ }
+ if (text.length === length) {
+ break;
+ } else {
+ _results1.push(void 0);
+ }
+ }
+ return _results1;
+ };
+
+ return Filter;
+
+})();
\ No newline at end of file
diff --git a/static/scripts/term_buf.js b/static/scripts/term_buf.js
new file mode 100644
index 000000000..a1e8545b9
--- /dev/null
+++ b/static/scripts/term_buf.js
@@ -0,0 +1,52 @@
+;// Live commit updates
+
+if(typeof(Drone) === 'undefined') { Drone = {}; }
+
+(function () {
+ Drone.Buffer = function() {
+ this.lineFormatter = new Filter({stream: true, newline: false});
+ }
+
+ Drone.Buffer.prototype = {
+ lineBuffer: "",
+ autoFollow: false,
+ stoppingRefresh: false,
+
+ start: function(el) {
+ if(typeof(el) === 'string') {
+ this.el = document.getElementById(el);
+ } else {
+ this.el = el;
+ }
+
+ this.el.innerHTML="";
+ this.update();
+ },
+
+ stop: function() {
+ this.stoppingRefresh = true;
+ },
+
+ update: function() {
+ if(this.lineBuffer.length > 0) {
+ this.el.innerHTML += this.lineFormatter.toHtml(escapeHTML(this.lineBuffer));
+ this.lineBuffer = '';
+
+ if (this.autoFollow) {
+ window.scrollTo(0, document.body.scrollHeight);
+ }
+ }
+
+ if(this.stoppingRefresh) {
+ this.stoppingRefresh = false;
+ } else {
+ window.requestAnimationFrame(this.update.bind(this));
+ }
+ },
+
+ write: function(data) {
+ this.lineBuffer += data;
+ }
+ };
+
+})();
\ No newline at end of file
diff --git a/static/scripts/users.js b/static/scripts/users.js
new file mode 100644
index 000000000..877109803
--- /dev/null
+++ b/static/scripts/users.js
@@ -0,0 +1,78 @@
+
+function UserViewModel() {
+ var self = this;
+
+ // handle requests to create a new user.
+ $(".modal-user button").click(function(e) {
+ var login = $(".modal-user input").val();
+ var user = { login: login };
+
+ $(".alert-danger").hide();
+
+ $.ajax({
+ url: "/api/users",
+ type: "POST",
+ data: JSON.stringify(user),
+ contentType: "application/json",
+ success: function( data ) {
+ // clears the form value
+ $(".modal-user input").val("");
+
+ // find an existing item in the list and clone it.
+ var el = $(".col-sm-4").first().clone();
+ el.find("img").attr("src", data.avatar_url);
+ el.find("h3").text(data.login);
+ el.find("p").text(data.email);
+ el.find(".card").attr("data-id", data.login);
+ el.find(".card").attr("data-admin", data.admin);
+
+ $( ".user-row" ).prepend(el);
+ },
+ error: function(data) {
+ $(".alert-danger").text(data.responseText);
+ $(".alert-danger").show();
+ }
+ });
+ });
+
+
+ $(".user-row").on('click', '.btn-group .btn-info', function(){
+ // gets the unique identifier for the click row, which is
+ // the user login id.
+ var row = $( this ).closest("[data-id]");
+ var id = row.data("id");
+ var admin = row.data("admin") == true;
+
+ row.attr("data-admin", !admin);
+
+ $.ajax({
+ url: "/api/users/"+id,
+ type: "PATCH",
+ data: JSON.stringify({active:true, admin: !admin}),
+ contentType: "application/json"
+ });
+
+ });
+
+ $(".user-row").on('click', '.btn-group .btn-danger', function(){
+ // gets the unique identifier for the click row, which is
+ // the user login id.
+ var row = $( this ).closest("[data-id]");
+ var id = row.data("id");
+
+ var r = confirm("Are you sure you want to delete "+id+"?");
+ if (r === false) {
+ return;
+ }
+
+ // makes an API call to delete the user and then, if successful,
+ // removes from the list.
+ $.ajax({
+ url: "/api/users/"+id,
+ type: "DELETE",
+ success: function( data ) {
+ row.parent().remove();
+ }
+ });
+ });
+}
diff --git a/static/scripts/utils.js b/static/scripts/utils.js
new file mode 100644
index 000000000..89f0b98b4
--- /dev/null
+++ b/static/scripts/utils.js
@@ -0,0 +1,15 @@
+Array.prototype.remove = function() {
+ var what, a = arguments, L = a.length, ax;
+ while (L && this.length) {
+ what = a[--L];
+ while ((ax = this.indexOf(what)) !== -1) {
+ this.splice(ax, 1);
+ }
+ }
+ return this;
+};
+
+function escapeHTML(html) {
+ return document.createElement('div').appendChild(
+ document.createTextNode(html)).parentNode.innerHTML;
+}
diff --git a/static/scripts/vendor/livestamp.js b/static/scripts/vendor/livestamp.js
new file mode 100644
index 000000000..8ee7819fd
--- /dev/null
+++ b/static/scripts/vendor/livestamp.js
@@ -0,0 +1,138 @@
+// Livestamp.js / v2.0.0 / (c) 2015 Matt Bradley / MIT License
+(function (plugin) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(['jquery', 'moment'], plugin);
+ } else {
+ // Browser globals
+ plugin(jQuery, moment);
+ }
+}(function($, moment) {
+ var updateInterval = 1e3,
+ paused = false,
+ $livestamps = $([]),
+
+ init = function() {
+ livestampGlobal.resume();
+ },
+
+ prep = function($el, timestamp) {
+ var oldData = $el.data('livestampdata');
+ if (typeof timestamp == 'number')
+ timestamp *= 1e3;
+
+ $el.removeAttr('data-livestamp')
+ .removeData('livestamp');
+
+ timestamp = moment(timestamp);
+ if (moment.isMoment(timestamp) && !isNaN(+timestamp)) {
+ var newData = $.extend({ }, { 'original': $el.contents() }, oldData);
+ newData.moment = moment(timestamp);
+
+ $el.data('livestampdata', newData).empty();
+ $livestamps.push($el[0]);
+ }
+ },
+
+ run = function() {
+ if (paused) return;
+ livestampGlobal.update();
+ setTimeout(run, updateInterval);
+ },
+
+ livestampGlobal = {
+ update: function() {
+ $('[data-livestamp]').each(function() {
+ var $this = $(this);
+ prep($this, $this.data('livestamp'));
+ });
+
+ var toRemove = [];
+ $livestamps.each(function() {
+ var $this = $(this),
+ data = $this.data('livestampdata');
+
+ if (data === undefined)
+ toRemove.push(this);
+ else if (moment.isMoment(data.moment)) {
+ var from = $this.html(),
+ to = data.moment.fromNow();
+
+ if (from != to) {
+ var e = $.Event('change.livestamp');
+ $this.trigger(e, [from, to]);
+ if (!e.isDefaultPrevented())
+ $this.html(to);
+ }
+ }
+ });
+
+ $livestamps = $livestamps.not(toRemove);
+ delete $livestamps.prevObject
+ },
+
+ pause: function() {
+ paused = true;
+ },
+
+ resume: function() {
+ paused = false;
+ run();
+ },
+
+ interval: function(interval) {
+ if (interval === undefined)
+ return updateInterval;
+ updateInterval = interval;
+ }
+ },
+
+ livestampLocal = {
+ add: function($el, timestamp) {
+ if (typeof timestamp == 'number')
+ timestamp *= 1e3;
+ timestamp = moment(timestamp);
+
+ if (moment.isMoment(timestamp) && !isNaN(+timestamp)) {
+ $el.each(function() {
+ prep($(this), timestamp);
+ });
+ livestampGlobal.update();
+ }
+
+ return $el;
+ },
+
+ destroy: function($el) {
+ $livestamps = $livestamps.not($el);
+ $el.each(function() {
+ var $this = $(this),
+ data = $this.data('livestampdata');
+
+ if (data === undefined)
+ return $el;
+
+ $this
+ .html(data.original ? data.original : '')
+ .removeData('livestampdata');
+ });
+
+ return $el;
+ },
+
+ isLivestamp: function($el) {
+ return $el.data('livestampdata') !== undefined;
+ }
+ };
+
+ $.livestamp = livestampGlobal;
+ $(init);
+ $.fn.livestamp = function(method, options) {
+ if (!livestampLocal[method]) {
+ options = method;
+ method = 'add';
+ }
+
+ return livestampLocal[method](this, options);
+ };
+}));
\ No newline at end of file
diff --git a/static/scripts/vendor/plates.js b/static/scripts/vendor/plates.js
new file mode 100644
index 000000000..a9a18e2b2
--- /dev/null
+++ b/static/scripts/vendor/plates.js
@@ -0,0 +1,666 @@
+var Plates = (typeof module !== 'undefined' && 'id' in module && typeof exports !== 'undefined') ? exports : {};
+
+!function(exports, env, undefined) {
+ "use strict";
+
+ //
+ // Cache variables to increase lookup speed.
+ //
+ var _toString = Object.prototype.toString;
+
+ //
+ // Polyfill the Array#indexOf method for cross browser compatibility.
+ //
+ [].indexOf || (Array.prototype.indexOf = function indexOf(a, b ,c){
+ for (
+ c = this.length , b = (c+ ~~b) % c;
+ b < c && (!(b in this) || this[b] !==a );
+ b++
+ );
+
+ return b^c ? b : -1;
+ });
+
+ //
+ // Polyfill Array.isArray for cross browser compatibility.
+ //
+ Array.isArray || (Array.isArray = function isArray(a) {
+ return _toString.call(a) === '[object Array]';
+ });
+
+ //
+ // ### function fetch(data, mapping, value, key)
+ // #### @data {Object} the data that we need to fetch a value from
+ // #### @mapping {Object} The iterated mapping step
+ // #### @tagbody {String} the tagbody we operated against
+ // #### @key {String} optional key if the mapping doesn't have a dataKey
+ // Fetches the correct piece of data
+ //
+ function fetch(data, mapping, value, tagbody, key) {
+ key = mapping.dataKey || key;
+
+ //
+ // Check if we have data manipulation or filtering function.
+ //
+ if (mapping.dataKey && typeof mapping.dataKey === 'function') {
+ return mapping.dataKey(data, value || '', tagbody || '', key);
+ }
+
+ //
+ // See if we are using dot notation style
+ //
+ if (!~key.indexOf('.')) return data[key];
+
+ var result = key
+ , structure = data;
+
+ for (var paths = key.split('.'), i = 0, length = paths.length; i < length && structure; i++) {
+ result = structure[+paths[i] || paths[i]];
+ structure = result;
+ }
+
+ return result !== undefined ? result : data[key];
+ }
+
+ //
+ // compileMappings
+ //
+ // sort the mappings so that mappings for the same attribute and value go consecutive
+ // and inside those, those that change attributes appear first.
+ //
+ function compileMappings(oldMappings) {
+ var mappings = oldMappings.slice(0);
+
+ mappings.sort(function(map1, map2) {
+ if (!map1.attribute) return 1;
+ if (!map2.attribute) return -1;
+
+ if (map1.attribute !== map2.attribute) {
+ return map1.attribute < map2.attribute ? -1 : 1;
+ }
+ if (map1.value !== map2.value) {
+ return map1.value < map2.value ? -1 : 1;
+ }
+ if (! ('replace' in map1) && ! ('replace' in map2)) {
+ throw new Error('Conflicting mappings for attribute ' + map1.attribute + ' and value ' + map1.value);
+ }
+ if (map1.replace) {
+ return 1;
+ }
+ return -1;
+ });
+
+ return mappings;
+ }
+
+//
+// Matches a closing tag to a open tag
+//
+function matchClosing(input, tagname, html) {
+ var closeTag = '' + tagname + '>',
+ openTag = new RegExp('< *' + tagname + '( *|>)', 'g'),
+ closeCount = 0,
+ openCount = -1,
+ from, to, chunk
+ ;
+
+ from = html.search(input);
+ to = from;
+
+ while(to > -1 && closeCount !== openCount) {
+ to = html.indexOf(closeTag, to);
+ if (to > -1) {
+ to += tagname.length + 3;
+ closeCount ++;
+ chunk = html.slice(from, to);
+ openCount = chunk.match(openTag).length;
+ }
+ }
+ if (to === -1) {
+ throw new Error('Unmatched tag ' + tagname + ' in ' + html)
+ }
+
+ return chunk;
+}
+
+ var Merge = function Merge() {};
+ Merge.prototype = {
+ nest: [],
+
+ tag: new RegExp([
+ '<',
+ '(/?)', // 2 - is closing
+ '([-:\\w]+)', // 3 - name
+ '((?:[-\\w]+(?:', '=',
+ '(?:\\w+|["|\'](?:.*)["|\']))?)*)', // 4 - attributes
+ '(/?)', // 5 - is self-closing
+ '>'
+ ].join('\\s*')),
+
+ //
+ // HTML attribute parser.
+ //
+ attr: /([\-\w]*)\s*=\s*(?:(["\'])([\-\.\w\s\/:;]*)\2)/gi,
+
+ //
+ // In HTML5 it's allowed to have to use self closing tags without closing
+ // separators. So we need to detect these elements based on the tag name.
+ //
+ selfClosing: /^(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/,
+
+ //
+ // ### function hasClass(str, className)
+ // #### @str {String} the class attribute
+ // #### @className {String} the className that the classAttribute should contain
+ //
+ // Helper function for detecting if a class attribute contains the className
+ //
+ hasClass: function hasClass(str, className) {
+ return ~str.split(' ').indexOf(className);
+ },
+
+ //
+ // ### function iterate(html, value, components, tagname, key)
+ // #### @html {String} peice of HTML
+ // #### @value {Mixed} iterateable object with data
+ // #### @components {Array} result of the this.tag regexp execution
+ // #### @tagname {String} the name of the tag that we iterate on
+ // #### @key {String} the key of the data that we need to extract from the value
+ // #### @map {Object} attribute mappings
+ //
+ // Iterate over over the supplied HTML.
+ //
+ iterate: function iterate(html, value, components, tagname, key, map) {
+ var output = '',
+ segment = matchClosing(components.input, tagname, html),
+ data = {};
+
+ // Is it an array?
+ if (Array.isArray(value)) {
+ // Yes: set the output to the result of iterating through the array
+ for (var i = 0, l = value.length; i < l; i++) {
+ // If there is a key, then we have a simple object and
+ // must construct a simple object to use as the data
+ if (key) {
+ data[key] = value[i];
+ } else {
+ data = value[i];
+ }
+
+ output += this.bind(segment, data, map);
+ }
+
+ return output;
+ } else if (typeof value === 'object') {
+ // We need to refine the selection now that we know we're dealing with a
+ // nested object
+ segment = segment.slice(components.input.length, -(tagname.length + 3));
+ return output += this.bind(segment, value, map);
+ }
+
+ return value;
+ },
+
+ //
+ // ### function bind(html, data, map)
+ // #### @html {String} the template that we need to modify
+ // #### @data {Object} data for the template
+ // #### @map {Mapper} instructions for the data placement in the template
+ // Process the actual template
+ //
+ bind: function bind(html, data, map) {
+ if (Array.isArray(data)) {
+ var output = '';
+
+ for (var i = 0, l = data.length; i' && intag) {
+ intag = false;
+ tagbody = html.slice(left, i + 1);
+ components = this.tag.exec(tagbody);
+
+ if(!components) {
+ intag = true;
+ continue;
+ }
+
+ isClosing = components[1];
+ tagname = components[2];
+ attributes = components[3];
+ selfClosing = components[4];
+ isSelfClosing = this.selfClosing.test(tagname);
+
+ if (matchmode) {
+ //
+ // and its a closing.
+ //
+ if (!!isClosing) {
+ if (openers <= 0) {
+ matchmode = false;
+ } else {
+ --openers;
+ }
+ } else if (!isSelfClosing) {
+ //
+ // and its not a self-closing tag
+ //
+ ++openers;
+ }
+ }
+
+ if (!isClosing && !matchmode) {
+ //
+ // if there is a match in progress and
+ //
+ if (mappings && mappings.length > 0) {
+ for (var ii = mappings.length - 1; ii >= 0; ii--) {
+ var setAttribute = false
+ , mapping = mappings[ii]
+ , shouldSetAttribute = mapping.re && attributes.match(mapping.re);
+
+ //
+ // check if we are targetting a element only or attributes
+ //
+ if ('tag' in mapping && !this.attr.test(tagbody) && mapping.tag === tagname) {
+ tagbody = tagbody + fetch(data, mapping, '', tagbody);
+ continue;
+ }
+
+ tagbody = tagbody.replace(this.attr, function(str, key, q, value, a) {
+ var newdata;
+
+ if (shouldSetAttribute && mapping.replace !== key || remove) {
+ return str;
+ } else if (shouldSetAttribute || typeof mapping.replacePartial1 !== 'undefined') {
+ setAttribute = true;
+
+ //
+ // determine if we should use the replace argument or some value from the data object.
+ //
+ if (typeof mapping.replacePartial2 !== 'undefined') {
+ newdata = value.replace(mapping.replacePartial1, mapping.replacePartial2);
+ } else if (typeof mapping.replacePartial1 !== 'undefined' && mapping.dataKey) {
+ newdata = value.replace(mapping.replacePartial1, fetch(data, mapping, value, tagbody, key));
+ } else {
+ newdata = fetch(data, mapping, value, tagbody, key);
+ }
+
+ return key + '="' + (newdata || '') + '"';
+ } else if (!mapping.replace && mapping.attribute === key) {
+ if (
+ mapping.value === value ||
+ that.hasClass(value, mapping.value ||
+ mappings.conf.where === key) ||
+ (_toString.call(mapping.value) === '[object RegExp]' &&
+ mapping.value.exec(value) !== null)
+ ) {
+ if (mapping.remove) {
+ //
+ // only increase the remove counter if it's not a self
+ // closing element. As matchmode is suffectient to
+ // remove tose
+ //
+ if (!isSelfClosing) remove++;
+ matchmode = true;
+ } else if (mapping.plates) {
+ var partial = that.bind(
+ mapping.plates
+ , typeof mapping.data === 'string' ? fetch(data, { dataKey: mapping.data }) : mapping.data || data
+ , mapping.mapper
+ );
+
+ buffer += tagbody + that.iterate(html, partial, components, tagname, undefined, map);
+ matchmode = true;
+ } else {
+ var v = newdata = fetch(data, mapping, value, tagbody, key);
+ newdata = tagbody + newdata;
+
+ if (Array.isArray(v)) {
+ newdata = that.iterate(html, v, components, tagname, value, map);
+ // If the item is an array, then we need to tell
+ // Plates that we're dealing with nests
+ that.nest.push(tagname);
+ } else if (typeof v === 'object') {
+ newdata = tagbody + that.iterate(html, v, components, tagname, value, map);
+ }
+
+ buffer += newdata || '';
+ matchmode = true;
+ }
+ }
+ }
+
+ return str;
+ });
+
+ //
+ // Do we need to create the attributes if they don't exist.
+ //
+ if (createAttribute && shouldSetAttribute && !setAttribute) {
+ var spliced = selfClosing ? 2 : 1
+ , close = selfClosing ? '/>': '>'
+ , left = tagbody.substr(0, tagbody.length - spliced);
+
+ if (left[left.length - 1] === ' ') {
+ left = left.substr(0, left.length - 1);
+
+ if (selfClosing) {
+ close = ' ' + close;
+ }
+ }
+
+ tagbody = [
+ left,
+ ' ',
+ mapping.replace,
+ '="',
+ fetch(data, mapping),
+ '"',
+ close
+ ].join('');
+ }
+ }
+ } else {
+ //
+ // if there is no map, we are just looking to match
+ // the specified id to a data key in the data object.
+ //
+ tagbody.replace(this.attr, function (attr, key, q, value, idx) {
+ if (key === map && map.conf.where || 'id' && data[value]) {
+ var v = data[value],
+ nest = Array.isArray(v),
+ output = nest || typeof v === 'object'
+ ? that.iterate(html.substr(left), v, components, tagname, value, map)
+ : v;
+
+ // If the item is an array, then we need to tell
+ // Plates that we're dealing with nests
+ if (nest) { that.nest.push(tagname); }
+
+ buffer += nest ? output : tagbody + output;
+ matchmode = true;
+ }
+ });
+ }
+ }
+
+ //
+ // if there is currently no match in progress
+ // just write the tagbody to the buffer.
+ //
+ if (!matchmode && that.nest.length === 0) {
+ if (!remove) buffer += tagbody;
+
+ if (remove && !!isClosing) --remove;
+ } else if (!matchmode && that.nest.length) {
+ this.nest.pop();
+ }
+ } else if (!intag && !matchmode) {
+ //
+ // currently not inside a tag and there is no
+ // match in progress, we can write the char to
+ // the buffer.
+ //
+ if (!remove) buffer += c;
+ }
+ }
+ return buffer;
+ }
+ };
+
+ //
+ // ### function Mapper(conf)
+ // #### @conf {Object} configuration object
+ // Constructor function for the Mapper instance that is responsible for
+ // providing the mapping for the data structure
+ //
+ function Mapper(conf) {
+ if (!(this instanceof Mapper)) { return new Mapper(conf); }
+
+ this.mappings = [];
+ this.conf = conf || {};
+ }
+
+ //
+ // ### function last(newitem)
+ // #### @newitem {Boolean} do we need to add a new item to the mapping
+ // Helper function for adding new attribute maps to a Mapper instance
+ //
+ function last(newitem) {
+ if (newitem) {
+ this.mappings.push({});
+ }
+
+ var m = this.mappings[this.mappings.length - 1];
+
+ if (m && m.attribute && m.value && m.dataKey && m.replace) {
+ m.re = new RegExp(m.attribute + '=([\'"]?)' + m.value + '\\1');
+ } else if (m) {
+ delete m.re;
+ }
+
+ return m;
+ }
+
+ //
+ // Create the actual chainable methods: where('class').is('foo').insert('bla')
+ //
+ Mapper.prototype = {
+ //
+ // ### function replace(val1, val2)
+ // #### @val1 {String|RegExp} The part of the attribute that needs to be replaced
+ // #### @val2 {String} The value it should be replaced with
+ //
+ replace: function replace(val1, val2) {
+ var l = last.call(this);
+ l.replacePartial1 = val1;
+ l.replacePartial2 = val2;
+ return this;
+ },
+
+ //
+ // ### function use(val)
+ // #### @val {String} A string that represents a key.
+ // Data will be inserted into the attribute that was specified in the
+ // `where` clause.
+ //
+ use: function use(val) {
+ last.call(this).dataKey = val;
+ return last.call(this) && this;
+ },
+
+ //
+ // ### function where(val)
+ // #### @val {String} an attribute that may be found in a tag
+ // This method will initiate a clause. Once a clause has been established
+ // other member methods will be chained to each other in any order.
+ //
+ where: function where(val) {
+ last.call(this, true).attribute = val;
+ return last.call(this) && this;
+ },
+
+ //
+ // ### function class(val)
+ // #### @val {String} a value that may be found in the `class` attribute of a tag
+ // the method name should be wrapped in quotes or it will throw errors in IE.
+ //
+ 'class': function className(val) {
+ return this.where('class').is(val);
+ },
+
+ //
+ // ### function tag(val)
+ // #### @val {String} the name of the tag should be found
+ //
+ tag: function tag(val) {
+ last.call(this, true).tag = val;
+ return this;
+ },
+
+ //
+ // ### function is(val)
+ // #### @val {string} The value of the attribute that was specified in the
+ // `where` clause.
+ //
+ is: function is(val) {
+ last.call(this).value = val;
+ return last.call(this) && this;
+ },
+
+ //
+ // ### function has(val)
+ // #### @val {String|RegExp} The value of the attribute that was specified
+ // in the `where` clause.
+ //
+ has: function has(val) {
+ last.call(this).value = val;
+ this.replace(val);
+ return last.call(this) && this;
+ },
+
+ //
+ // ### function insert(val)
+ // #### @val {String} A string that represents a key. Data will be inserted
+ // in to the attribute that was specified in the `where` clause.
+ //
+ insert: function insert(val) {
+ var l = last.call(this);
+ l.replace = l.attribute;
+ l.dataKey = val;
+ return last.call(this) && this;
+ },
+
+ //
+ // ### function as(val)
+ // #### @val {String} A string that represents an attribute in the tag.
+ // If there is no attribute by that name name found, one may be created
+ // depending on the options that where passed in the `Plates.Map`
+ // constructor.
+ //
+ as: function as(val) {
+ last.call(this).replace = val;
+ return last.call(this) && this;
+ },
+
+ //
+ // ### function remove()
+ // This will remove the element that was specified in the `where` clause
+ // from the template.
+ //
+ remove: function remove() {
+ last.call(this).remove = true;
+ return last.call(this, true);
+ },
+
+ //
+ // ### function append(plates, data, map)
+ // #### @plates {String} Template or path/id of the template
+ // #### @data {Object|String} data for the appended template
+ // #### @map {Plates.Map} mapping for the data
+ //
+ append: function append(plates, data, map) {
+ var l = last.call(this);
+
+ if (data instanceof Mapper) {
+ map = data;
+ data = undefined;
+ }
+
+ // If the supplied plates template doesn't contain any HTML it's most
+ // likely that we need to import it. To improve performance we will cache
+ // the result of the file system.
+ if (!/<[^<]+?>/.test(plates) && !exports.cache[plates]) {
+ // figure out if we are running in Node.js or a browser
+ if ('document' in env && 'getElementById' in env.document) {
+ exports.cache[plates] = document.getElementById(plates).innerHTML;
+ } else {
+ exports.cache[plates] = require('fs').readFileSync(
+ require('path').join(process.cwd(), plates),
+ 'utf8'
+ );
+ }
+ }
+
+ l.plates = exports.cache[plates] || plates;
+ l.data = data;
+ l.mapper = map;
+
+ return last.call(this, true);
+ }
+ };
+
+ //
+ // Provide helpful aliases that well help with increased compatibility as not
+ // all browsers allow the Mapper#class prototype (IE).
+ //
+ Mapper.prototype.className = Mapper.prototype['class'];
+
+ //
+ // Aliases of different methods.
+ //
+ Mapper.prototype.partial = Mapper.prototype.append;
+ Mapper.prototype.to = Mapper.prototype.use;
+
+ //
+ // Expose a simple cache object so people can clear the cached partials if
+ // they want to.
+ //
+ exports.cache = {};
+
+ //
+ // Expose the Plates#bind interface.
+ //
+ exports.bind = function bind(html, data, map) {
+ var merge = new Merge();
+ return merge.bind(html, data, map);
+ };
+
+ //
+ // Expose the Mapper.
+ //
+ exports.Map = Mapper;
+}(Plates, this);
\ No newline at end of file
diff --git a/static/scripts_gen/.gitkeep b/static/scripts_gen/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/static/static.go b/static/static.go
new file mode 100644
index 000000000..568b08fdf
--- /dev/null
+++ b/static/static.go
@@ -0,0 +1,26 @@
+package static
+
+import (
+ "net/http"
+
+ "github.com/elazarl/go-bindata-assetfs"
+)
+
+//go:generate go run ../contrib/generate-js.go -dir scripts/ -o scripts_gen/drone.min.js
+//go:generate sassc --style compact styles/style.sass styles_gen/style.css
+//go:generate go-bindata-assetfs -ignore "\\.go" -pkg static -o static_gen.go ./...
+
+func FileSystem() http.FileSystem {
+ fs := &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: ""}
+ return &binaryFileSystem{
+ fs,
+ }
+}
+
+type binaryFileSystem struct {
+ fs http.FileSystem
+}
+
+func (b *binaryFileSystem) Open(name string) (http.File, error) {
+ return b.fs.Open(name[1:])
+}
diff --git a/static/styles/header.sass b/static/styles/header.sass
new file mode 100644
index 000000000..e69de29bb
diff --git a/static/styles/modules/badges.sass b/static/styles/modules/badges.sass
new file mode 100644
index 000000000..139597f9c
--- /dev/null
+++ b/static/styles/modules/badges.sass
@@ -0,0 +1,2 @@
+
+
diff --git a/static/styles/modules/navbar.sass b/static/styles/modules/navbar.sass
new file mode 100644
index 000000000..e834d948d
--- /dev/null
+++ b/static/styles/modules/navbar.sass
@@ -0,0 +1,56 @@
+.navbar
+ background-color: #FFF;
+ border-radius: 0px;
+ height: 53px;
+ z-index: 2;
+ margin-top:10px;
+
+.navbar-brand
+ background-image: url(/static/images/logo_dark.svg);
+ width: 30px;
+ height: 30px;
+ margin-top: 3px;
+ background-size: 30px;
+ background-repeat: no-repeat;
+ background-position: center center;
+
+.navbar img
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+
+.navbar .dropdown
+ display: inline-block;
+
+ button
+ background: none;
+ border: none;
+ color: #2b303b;
+ min-wdith:24px;
+ max-width:24px;
+
+ .material-icons
+ line-height: 32px;
+ min-wdith:24px;
+ max-width:24px;
+
+.navbar-nav.navbar-right
+ display: inline-block;
+ float: right;
+ li
+ display: inline-block;
+ vertical-align:middle;
+
+.navbar-form
+ margin-right: 20px;
+ width: 350px;
+ .twitter-typeahead
+ width:100%;
+
+ .form-control
+ color: #747C84;
+ border: none;
+ background-color: #eff1f5;
+ border-radius: 0px;
+ padding: 0.3rem 0.75rem;
+ width:100%;
diff --git a/static/styles/modules/range.sass b/static/styles/modules/range.sass
new file mode 100644
index 000000000..7cecb0bef
--- /dev/null
+++ b/static/styles/modules/range.sass
@@ -0,0 +1,95 @@
+input[type="range"]:focus ~ .slider-label
+ display: inline-block;
+
+input[type=range]
+ -webkit-appearance: none;
+ margin: 6px 0;
+ width: 200px;
+
+input[type=range]:focus
+ outline: none;
+
+input[type=range]::-webkit-slider-runnable-track
+ width: 100%;
+ height: 8px;
+ cursor: pointer;
+ animate: 0.2s;
+ box-shadow: none;
+ background: rgba(0, 150, 136, 0.5);
+ background: rgba(102, 187, 106, 0.5);
+ border-radius: 5px;
+ border: none;
+
+input[type=range]::-webkit-slider-thumb
+ box-shadow: none;
+ border: none;
+ height: 26px;
+ width: 26px;
+ border-radius: 50px;
+ background: #009688;
+ background: #66bb6a;
+ cursor: pointer;
+ -webkit-appearance: none;
+ margin-top: -10px;
+
+input[type=range]:focus::-webkit-slider-runnable-track
+ background: rgba(0, 150, 136, 0.5);
+ background: rgba(102, 187, 106, 0.5);
+
+input[type=range]::-moz-range-track
+ width: 100%;
+ height: 8px;
+ cursor: pointer;
+ animate: 0.2s;
+ box-shadow: none;
+ background: rgba(0, 150, 136, 0.5);
+ background: rgba(102, 187, 106, 0.5);
+ border-radius: 5px;
+ border: none;
+
+input[type=range]::-moz-range-thumb
+ box-shadow: none;
+ border: none;
+ height: 26px;
+ width: 26px;
+ border-radius: 50px;
+ background: #009688;
+ background: #66bb6a;
+ cursor: pointer;
+
+input[type=range]::-ms-track
+ width: 100%;
+ height: 8.4px;
+ cursor: pointer;
+ animate: 0.2s;
+ background: transparent;
+ border-color: transparent;
+ border-width: 16px 0;
+ color: transparent;
+
+input[type=range]::-ms-fill-lower
+ background: #2a6495;
+ border: 0.2px solid #010101;
+ border-radius: 2.6px;
+ box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
+
+input[type=range]::-ms-fill-upper
+ background: #3071a9;
+ border: 0.2px solid #010101;
+ border-radius: 2.6px;
+ box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
+
+input[type=range]::-ms-thumb
+ box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
+ border: 1px solid #000000;
+ height: 36px;
+ width: 16px;
+ border-radius: 3px;
+ background: #ffffff;
+ cursor: pointer;
+
+input[type=range]:focus::-ms-fill-lower
+ background: #3071a9;
+
+input[type=range]:focus::-ms-fill-upper
+ background: #367ebd;
diff --git a/static/styles/modules/status.sass b/static/styles/modules/status.sass
new file mode 100644
index 000000000..53b8f7fb1
--- /dev/null
+++ b/static/styles/modules/status.sass
@@ -0,0 +1,46 @@
+.success,
+.failure,
+.killed,
+.error,
+.running,
+.pending
+ padding: 0px 15px;
+ color: #FFF;
+ width: 100px;
+ text-align: center;
+ border-radius: 2px;
+ text-transform:uppercase;
+ font-size:11px;
+ line-height: 22px;
+ display:inline-block;
+ margin-right:10px;
+
+.error,
+.killed,
+.failure
+ background: #bf616a;
+
+.success
+ background: #a3be8c;
+
+.pending,
+.running
+ background: #ebcb8b;
+ animation: horizontal 2s ease infinite;
+
+
+@keyframes horizontal
+ 0%
+ transform:translate(0,0)
+ 6%
+ transform:translate(5px,0)
+ 12%
+ transform:translate(0,0)
+ 18%
+ transform:translate(5px,0)
+ 24%
+ transform:translate(0,0)
+ 30%
+ transform:translate(5px,0)
+ 36%,100%
+ transform:translate(0,0)
diff --git a/static/styles/modules/subnav.sass b/static/styles/modules/subnav.sass
new file mode 100644
index 000000000..f28b9e8ea
--- /dev/null
+++ b/static/styles/modules/subnav.sass
@@ -0,0 +1,95 @@
+.subnav
+ background: #FFF;
+ border-bottom:1px solid #EEE;
+ height:75px;
+ min-height:75px;
+ max-height:75px;
+ margin-bottom:40px;
+ position:relative;
+
+ ol
+ float: left;
+ margin:0px;
+ margin-left: 20px;
+ padding:0px;
+
+ li
+ line-height: 75px;
+ display: inline-block;
+ vertical-align: middle;
+ font-size: 21px;
+
+ .btn
+ background:transparent
+ outline:none;
+ .btn:focus
+ outline:none;
+
+ .btn-info
+ cursor: pointer;
+ width: auto;
+ text-transform: uppercase;
+ padding: 0px 10px;
+ border-radius: 2px;
+ font-size: 11px;
+ line-height: 30px;
+ height: auto;
+ margin-left: 10px;
+ border-color: #95AEC7;
+ color: #95AEC7;
+
+ li.separator i
+ vertical-align:middle
+
+ li a
+ color: #2B303B;
+ line-height: 75px;
+ text-decoration:none;
+ &:hover
+ text-decoration:none;
+
+
+ .nav-tabs
+ position:absolute;
+ bottom:-1px;
+ right:30px;
+ border-bottom:1px solid #eee;
+
+ .nav-tabs .nav-link
+ border:none;
+ color: #C7CCD1;
+ font-size:13px;
+ padding:10px 20px;
+ text-transform:uppercase;
+
+ .nav-tabs .nav-link.active
+ border: 1px solid #eee;
+ border-bottom:1px solid #fff;
+ color: #2b303b;
+
+
+
+
+
+// .nav-tabs
+// position:absolute;
+// bottom:-1px;
+// right:30px;
+// border-bottom:1px solid #eee;
+//
+// .nav-tabs .nav-link
+// border:none;
+// color: #C7CCD1;
+// font-size:13px;
+// padding:10px 0px;
+// margin-left:10px;
+// margin-right:10px;
+// text-transform:uppercase;
+//
+// .nav-tabs .nav-item:last-child .nav-link
+// margin-right:5px;
+//
+// .nav-tabs .nav-link.active
+// border: none;
+// border-bottom:2px solid #2b303b;
+// color: #2b303b;
\ No newline at end of file
diff --git a/static/styles/modules/switch.sass b/static/styles/modules/switch.sass
new file mode 100644
index 000000000..f05ec75bc
--- /dev/null
+++ b/static/styles/modules/switch.sass
@@ -0,0 +1,43 @@
+// http://codepen.io/batazor/pen/KwKryj
+
+.switch
+ display: inline-block;
+ position: relative;
+ width: 40px;
+ height: 8px;
+ border-radius: 10.416666666666668px;
+ background: #E0E0E0;
+ -webkit-transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+ vertical-align: middle;
+ cursor: pointer;
+
+.switch::before
+ content: '';
+ position: absolute;
+ top: -8.604166666666667px;
+ left: -2.604166666666667px;
+ width: 26.04166666666667px;
+ height: 26.04166666666667px;
+ background: #bdbdbd;
+ border-radius: 50%;
+ -webkit-transition: left 0.28s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: left 0.28s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+
+switch:active::before
+ box-shadow: 0 2px 10.416666666666668px rgba(0, 0, 0, 0.28), 0 0 0 25px rgba(0, 0, 0, 0.1);
+
+switch:active::before
+ box-shadow: 0 2px 10.416666666666668px rgba(0, 0, 0, 0.28), 0 0 0 25px rgba(0, 0, 0, 0.1);
+
+input:checked + .switch
+ background: rgba(0, 150, 136, 0.5);
+ background: rgba(102, 187, 106, 0.5);
+
+input:checked + .switch::before
+ left: 20.562499999999996px;
+ background: #009688;
+ background: #66bb6a;
+
+input:checked + .switch:active::before
+ box-shadow: 0 2px 10.416666666666668px rgba(0, 0, 0, 0.28), 0 0 0 25px rgba(0, 150, 136, 0.2);
diff --git a/static/styles/modules/timeline.sass b/static/styles/modules/timeline.sass
new file mode 100644
index 000000000..c3021005f
--- /dev/null
+++ b/static/styles/modules/timeline.sass
@@ -0,0 +1,86 @@
+.timeline
+ padding-left:50px;
+ position:relative;
+ margin-top:10px;
+ margin-bottom:40px;
+
+ .card
+ display:flex;
+ border:none;
+ border-radius:0px;
+ border-top: 1px solid #eceeef;
+ text-decoration:none;
+ color:#2b303b;
+ .card-header
+ background:#FFF;
+ border:none;
+ padding:0px;
+ width: 50px;
+ min-width: 50px;
+ max-width: 50px;
+ padding-top:30px;
+ .card-block
+ flex: 1 1 auto;
+ padding: 30px 12px 12px 12px;
+ p
+ color: #ADB3BA;
+ margin-top:2px;
+ font-size:0px;
+
+ em
+ text-decoration:none;
+ color: #747C84;
+ font-style:normal;
+ font-size:0.9rem;
+ span
+ margin:0px 5px;
+ font-size:0.9rem;
+
+ h3
+ display:inline-block;
+ line-height:22px;
+ font-size:18px;
+
+ .card:nth-child(2)
+ border-top:0px;
+
+.timeline:before
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 14px;
+ z-index: -1;
+ display: block;
+ width: 1px;
+ content: "";
+ background-color: #DFE2E5;
+
+.group
+ padding-bottom:16px;
+
+.group-title
+ font-size: 13px;
+ text-transform: uppercase;
+ color: #ADB3BA;
+ margin-bottom:30px;
+ margin-top:30px;
+ position:relative;
+ line-height:20px;
+
+.group-title:before
+ content: '\f01f';
+ font-family:"octicons";
+ position:absolute;
+ left:-48px;
+ font-size:20px;
+ background:#FFF;
+ width:24px;
+ vertical-align: middle;
+ text-align: center;
+ color:#ADB3BA;
+
+.group:first-child .group-title
+ margin-top:0px;
+
+.group:last-child
+ padding-bottom:0px;
\ No newline at end of file
diff --git a/static/styles/pages/build.sass b/static/styles/pages/build.sass
new file mode 100644
index 000000000..13b7ea5e3
--- /dev/null
+++ b/static/styles/pages/build.sass
@@ -0,0 +1,156 @@
+
+// this is the build output section of the page that displays
+// the ansi terminal output.
+
+#output
+ background: #0d1926;
+ color: #d9e6f2;
+ margin-right:15px;
+ font-size: 13px;
+ color: #eff1f5;
+ border-radius: 2px;
+ background: #2b303b;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ box-sizing: border-box;
+ padding: 35px 40px;
+ font-family: "Roboto Mono";
+ min-height: calc(100vh - 205px);
+
+#follow
+ position:absolute;
+
+.build-summary
+ padding-left:20px;
+ p
+ color: #ADB3BA;
+ margin-top:4px;
+ font-size:0.9rem;
+ em
+ color: #747C84;
+ text-decoration:none;
+ font-style:normal;
+
+// .success,
+// .failure,
+// .killed,
+// .error,
+// .running,
+// .pending
+// font-size: 15px;
+// padding: 2px 28px;
+// width: auto;
+.job-summary
+ padding-left:20px;
+ font-size:0.9rem;
+ dt
+ color: #ADB3BA;
+ font-weight:normal;
+ dd
+ color: #747C84;
+ text-decoration:none;
+ font-style:normal;
+
+.build-summary > div
+ h3
+ display:inline;
+ line-height:28px;
+ font-size:18px;
+
+.job-list
+ padding-left:20px;
+ margin-bottom:20px;
+
+.job-list a
+ h3
+ margin-bottom:10px;
+ color: #2b303b;
+ font-size:14px;
+ margin-top:14px;
+ .env
+ font-family: "Roboto Mono"
+ text-decoration:none;
+ color:#747C84;
+ font-size:15px;
+ display: block;
+ border-top: 1px solid #eee;
+ padding-top: 20px;
+ padding-bottom:20px;
+ position:relative;
+ &:not(.active) > div:nth-child(2) > div
+ display:none
+
+// &:not(.active) > div:nth-child(2) > h3
+// color:#ADB3BA;
+// &:not(.active) > div:nth-child(1):after
+// content: "\2026";
+// display:block;
+// padding:0px 10px;
+// vertical-align:middle;
+// border:1px solid #eee;
+// background:#fff;
+// position:absolute;
+// right:0px;
+// top:0px;
+// height: 20px;
+// line-height: 10px;
+
+.job-list a:last-child
+ border-bottom: 1px solid #eee;
+
+.job-list a > div:first-child
+ margin-bottom:10px;
+ position:relative;
+
+//.job-list a.active:after
+// content: "";
+// border-left: 2px solid #eee;
+// position: absolute;
+// top: 0px;
+// left: -35px;
+// bottom: 0px;
+// width: 10px;
+
+.build-btn-group
+ margin-left:20px;
+ .btn
+ background: #FFF;
+ outline: none;
+ cursor: pointer;
+ width: auto;
+ text-transform: uppercase;
+ padding: 0px 10px;
+ border-radius: 2px;
+ font-size: 11px;
+ line-height: 30px;
+ height: auto;
+ margin-right: 10px;
+
+ .btn-danger
+ border: 1px solid #bf616a;
+ color: #bf616a;
+
+ &.btn-info
+ border-color: #95AEC7;
+ color: #95AEC7;
+
+.tail
+ position: fixed;
+ bottom: 50px;
+ right: 80px;
+ width: 38px;
+ height: 38px;
+ background: rgba(255,255,255,0.2);
+ border-radius: 50%;
+ box-shadow: 1px 2px 2px rgba(0,0,0,0.2);
+ cursor: pointer;
+ bottom: 15px;
+ right: 60px;
+ border:none;
+ outline:none;
+ display:none;
+
+.tail i
+ color:rgba(255,255,255,0.5);
+ line-height:38px;
+ display:inline-block;
diff --git a/static/styles/pages/login.sass b/static/styles/pages/login.sass
new file mode 100644
index 000000000..cde93f97c
--- /dev/null
+++ b/static/styles/pages/login.sass
@@ -0,0 +1,87 @@
+
+body.login
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width:100%;
+ height:100%;
+ overflow:hidden;
+
+ div
+ position:relative;
+ width: 220px;
+ height: 30px;
+
+
+
+ div.logo
+ background-image: url(/static/images/logo_dark.svg);
+ background-size: 35px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ position:absolute;
+ top:0px;
+ left:0px;
+ height:30px;
+ width:35px;
+
+ animation-name: fadein;
+ animation-duration: 1.5s;
+ animation-timing-function: ease-in;
+
+ a
+ background: #2b303b;
+ color: #FFF;
+ text-decoration:none;
+ position:absolute;
+ top:0px;
+ right:0px;
+ text-transform: uppercase;
+ font-size: 13px;
+ min-width: 150px;
+ text-align: center;
+ padding: 5px;
+ animation-name: fadein;
+ animation-duration: 1.5s;
+ animation-timing-function: ease-in;
+
+ div.alert
+ position:fixed;
+ top:0px;
+ left:0px;
+ right:0px;
+ line-height:25px;
+ padding:20px;
+ width:100%;
+ border:none;
+ text-align:center;
+ vertical-align:middle;
+ height:auto;
+ border-radius:0px;
+
+@keyframes flyin
+ 0%
+ left:-3000px;
+ 100%
+ left:0px;
+
+@keyframes flyin_right
+ 0%
+ right:-3000px;
+ 100%
+ right:0px;
+
+@keyframes fadein
+ 0%
+ opacity:0;
+ 100%
+ opacity:1;
\ No newline at end of file
diff --git a/static/styles/pages/repo.sass b/static/styles/pages/repo.sass
new file mode 100644
index 000000000..d7a818a51
--- /dev/null
+++ b/static/styles/pages/repo.sass
@@ -0,0 +1,101 @@
+
+.container.repo_config,
+.container.repo_secrets
+ max-width:800px !important;
+ .row
+ border-bottom: 1px solid #f0f4f7;
+
+ .row:last-child
+ border: none;
+ margin-bottom: 30px;
+ .col-md-12
+ padding:0px;
+ .row:nth-last-child(2)
+ border:none;
+
+ .col-md-3
+ padding: 30px;
+ padding-left: 0px;
+ max-width: 200px;
+ font-size:15px;
+ color: #2b303b;
+ .col-md-9
+ padding: 30px;
+ color: #65737e;
+ font-size:15px;
+
+ .btn.btn-info
+ border-color: #95AEC7;
+ color: #95AEC7;
+ background: #FFF;
+ outline: none;
+ cursor: pointer;
+ width: auto;
+ text-transform: uppercase;
+ padding: 0px 10px;
+ border-radius: 2px;
+ font-size: 11px;
+ line-height: 30px;
+ height: auto;
+ margin-left: 10px;
+
+ pre
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ box-sizing: border-box;
+ font-family: "Roboto Mono";
+ color: #2b303b;
+
+ input[type="range"] + span
+ margin-left:15px;
+
+ .alert.alert-danger
+ background: #FFF;
+ border: 1px solid #bf616a;
+ border-radius:2px;
+ margin-top:40px;
+ color: #bf616a;
+ .btn.btn-danger
+ margin-right:15px;
+ border: 1px solid #bf616a;
+ color: #bf616a;
+ background:#FFF;
+ border-radius:2px;
+ font-size:13px;
+ text-transform:uppercase;
+
+
+.container.repo_secrets
+ textarea
+ border: none;
+ background: #eff1f5;
+ width: 100%;
+ border-radius: 3px;
+ margin-bottom: 10px;
+ height: 150px;
+ padding: 10px 15px;
+ .btn.btn-info
+ margin-left:0px;
+ .result
+ margin-top:20px;
+ white-space: pre;
+
+
+.container.repo_activate
+ max-width:800px !important;
+
+ .alert.alert-info
+ color: #3498DB;
+ background: rgba(52, 152, 219, 0.12);
+ border-radius: 2px;
+ border: none;
+ margin-top:20px;
+ padding: 30px;
+ .btn.btn-info
+ color: #3498DB;
+ background: #3498DB;
+ border: 1px solid #3498DB;
+ background: #FFF;
+ border-radius: 2px;
+ text-transform: uppercase;
+ font-size: 13px;
diff --git a/static/styles/pages/user.sass b/static/styles/pages/user.sass
new file mode 100644
index 000000000..e136ceef9
--- /dev/null
+++ b/static/styles/pages/user.sass
@@ -0,0 +1,44 @@
+
+.container.profile
+ max-width:800px !important;
+ margin-bottom:40px;
+
+ .row
+ border-bottom: 1px solid #f0f4f7;
+
+ .row:last-child
+ border-bottom: none;
+
+ .col-md-3
+ padding: 30px;
+ padding-left: 0px;
+ max-width: 200px;
+ font-size:15px;
+ color: #2b303b;
+
+ .col-md-9
+ padding: 30px;
+ color: #65737e;
+ font-size:15px;
+
+ .btn.btn-info
+ border-color: #95AEC7;
+ color: #95AEC7;
+ background: #FFF;
+ outline: none;
+ cursor: pointer;
+ width: auto;
+ text-transform: uppercase;
+ padding: 0px 10px;
+ border-radius: 2px;
+ font-size: 11px;
+ line-height: 30px;
+ height: auto;
+ margin-left: 10px;
+
+ pre
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ box-sizing: border-box;
+ font-family: "Roboto Mono";
+ color: #2b303b;
diff --git a/static/styles/pages/users.sass b/static/styles/pages/users.sass
new file mode 100644
index 000000000..571384f84
--- /dev/null
+++ b/static/styles/pages/users.sass
@@ -0,0 +1,71 @@
+.user-row
+ .col-sm-4
+ width:100%;
+ .col-sm-4:last-child .card
+ border-bottom:none
+ .card
+ border: none;
+ border-bottom: 1px solid #EEE;
+ border-radius: 0px;
+ position: relative
+ display: flex;
+ .card-block
+ h3
+ font-size: 1.1rem;
+
+ .card-text
+ color: rgba(0,0,0,0.5);
+ font-size:0.95rem;
+ margin:0px;
+
+ .btn-group
+ position: absolute;
+ top: 15px;
+ right: 0px;
+
+ .btn
+ background: #FFF;
+ outline: none;
+ cursor: pointer;
+ width: auto;
+ text-transform: uppercase;
+ padding: 0px 10px;
+ border-radius: 2px;
+ font-size: 11px;
+ line-height: 30px;
+ height: auto;
+ margin-left: 10px;
+
+ .btn-danger
+ border: 1px solid #bf616a;
+ color: #bf616a;
+
+ .btn-info
+ border-color: #95AEC7;
+ color: #95AEC7;
+
+ .card-header
+ background: #FFF;
+ border-bottom: none;
+ padding-right:0px;
+ padding-left:0px;
+ width:45px;
+
+
+.card-header
+ img
+ vertical-align: middle;
+ width: 32px;
+ height: 32px;
+ border-radius: 3px;
+
+[data-admin="true"] h3:after
+ content: "admin";
+ text-transform: uppercase;
+ color: #fff;
+ display: inline-block;
+ font-size: 12px;
+ margin-left: 15px;
+ background: #a3be8c;
+ border-radius: 3px;
+ padding: 2px 5px;
diff --git a/static/styles/search.sass b/static/styles/search.sass
new file mode 100644
index 000000000..8d6807d2f
--- /dev/null
+++ b/static/styles/search.sass
@@ -0,0 +1,37 @@
+
+
+.tt-open
+ position: absolute;
+ top: 34px;
+ left: 0px;
+ z-index: 100;
+ display: none;
+ background: #FFF;
+ min-width:100%;
+ border: 1px solid #eee;
+ border-radius:0px;
+
+.tt-selectable:hover,
+.tt-cursor
+ background:#f4f4f4;
+
+.tt-selectable
+ padding: 1rem 0.75rem;
+ cursor: pointer;
+ display: flex;
+
+ div:first-child
+ width: 75px;
+ max-width:75px;
+ min-width:75px;
+
+ img
+ width: 32px;
+ max-width:32px;
+ min-width:32px;
+ border-radius:50%;
+ text-align:left;
+ margin-left:1rem;
+ div:last-child
+ flex: 1 1 auto;
+ line-height:32px;
\ No newline at end of file
diff --git a/static/styles/style.sass b/static/styles/style.sass
new file mode 100644
index 000000000..0a55e3e03
--- /dev/null
+++ b/static/styles/style.sass
@@ -0,0 +1,106 @@
+
+
+@import modules/badges.sass
+@import modules/navbar.sass
+@import modules/subnav.sass
+@import modules/switch.sass
+@import modules/range.sass
+@import modules/timeline.sass
+@import modules/status.sass
+
+
+@import pages/build.sass
+@import pages/users.sass
+@import pages/user.sass
+@import pages/repo.sass
+@import pages/login.sass
+
+@import header
+@import search
+
+
+.hidden
+ display:none;
+
+// page navigation
+
+:focus
+ outline:none;
+
+::-moz-focus-inner
+ border:0;
+
+.container
+ max-width:980px !important;
+
+
+.modal-content
+ padding:20px;
+ .form-control
+ border-radius: 2px;
+ .btn
+ margin-top:20px;
+
+// node section
+
+.node-row
+ .col-sm-4
+ width:100%;
+ .col-sm-4:last-child .card
+ border-bottom:none
+ .card
+ border: none;
+ border-bottom: 1px solid #EEE;
+ border-radius: 0px;
+ position: relative
+ display: flex;
+ .card-block
+ h3
+ font-size: 1.1rem;
+ .card-text
+ color: rgba(0,0,0,0.5);
+ font-size:0.95rem;
+ margin:0px;
+
+ .btn-group
+ position: absolute;
+ top: 15px;
+ right: 0px;
+
+ .btn-danger
+ color: #bf616a;
+ background: #FFF;
+ border: 1px solid #bf616a;
+ outline: none;
+ cursor: pointer;
+ width: auto;
+ text-transform: uppercase;
+ padding: 0px 10px;
+ border-radius: 2px;
+ font-size: 11px;
+ line-height: 30px;
+ height: auto;
+ margin-left: 10px;
+
+ .card-header
+ background: #FFF;
+ border-bottom: none;
+ padding-right:0px;
+ padding-left:0px;
+ width:45px;
+
+
+
+
+
+i.linux_amd64
+ width: 32px;
+ height: 32px;
+ display: inline-block;
+ background: url(/static/images/ubuntu.svg);
+ background-size: 32px;
+ background-repeat: no-repeat;
+
+
+
+
diff --git a/static/styles_gen/.gitkeep b/static/styles_gen/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/template/amber/400.amber b/template/amber/400.amber
new file mode 100644
index 000000000..48901e1cc
--- /dev/null
+++ b/template/amber/400.amber
@@ -0,0 +1,8 @@
+extends base
+
+block append head
+ title Bad Request
+
+block content
+ div.container
+ div.alert.alert-danger Bad Request
diff --git a/template/amber/401.amber b/template/amber/401.amber
new file mode 100644
index 000000000..751022ba8
--- /dev/null
+++ b/template/amber/401.amber
@@ -0,0 +1,8 @@
+extends base
+
+block append head
+ title Not Authorized
+
+block content
+ div.container
+ div.alert.alert-danger Not Authorized
diff --git a/template/amber/403.amber b/template/amber/403.amber
new file mode 100644
index 000000000..b4cb20ac2
--- /dev/null
+++ b/template/amber/403.amber
@@ -0,0 +1,8 @@
+extends base
+
+block append head
+ title Forbidden
+
+block content
+ div.container
+ div.alert.alert-danger Access Forbidden.
diff --git a/template/amber/404.amber b/template/amber/404.amber
new file mode 100644
index 000000000..2bad487a0
--- /dev/null
+++ b/template/amber/404.amber
@@ -0,0 +1,8 @@
+extends base
+
+block append head
+ title Not Found
+
+block content
+ div.container
+ div.alert.alert-danger Not Found
diff --git a/template/amber/500.amber b/template/amber/500.amber
new file mode 100644
index 000000000..6a0380df8
--- /dev/null
+++ b/template/amber/500.amber
@@ -0,0 +1,8 @@
+extends base
+
+block append head
+ title Internal Server Error
+
+block content
+ div.container
+ div.alert.alert-danger Oops. Something went wrong.
diff --git a/template/amber/_feed.amber b/template/amber/_feed.amber
new file mode 100644
index 000000000..1628e1c24
--- /dev/null
+++ b/template/amber/_feed.amber
@@ -0,0 +1,71 @@
+extends base
+
+block append head
+ title Dashboard
+
+block menu
+ li
+ a[href="/"] Home
+ li
+ a[href="/settings/profile"] Profile
+ if User.Admin
+ li
+ a[href="/settings/people"] People
+ li
+ a[href="/settings/nodes"] Nodes
+
+
+block content
+ h1 Feed
+ hr
+ table
+ tbody[data-bind="foreach: feed"]
+ tr
+ td
+ a[data-bind="text: full_name, attr: {href: full_name() + '/' + number() }"]
+ td[data-bind="text: $data.full_name"]
+ td[data-bind="text: $data.owner"]
+ td[data-bind="text: $data.name"]
+ td[data-bind="text: $data.private"]
+ td[data-bind="text: $data.trusted"]
+ td[data-bind="text: $data.avatar_url"]
+ td[data-bind="text: $data.clone_url"]
+ td[data-bind="text: $data.number"]
+ td[data-bind="text: $data.commit"]
+ td[data-bind="text: $data.branch"]
+ td[data-bind="text: $data.author"]
+ td[data-bind="text: $data.status"]
+
+block append scripts
+ script
+ var feed = #{json(Feed)};
+
+ function Activity(data) {
+ this.full_name = ko.observable(data.full_name);
+ this.owner = ko.observable(data.owner);
+ this.name = ko.observable(data.name);
+ this.private = ko.observable(data.private);
+ this.trusted = ko.observable(data.trusted);
+ this.avatar_url = ko.observable(data.avatar);
+ this.clone_url = ko.observable(data.clone_url);
+ this.link_url = ko.observable(data.link_url);
+ this.number = ko.observable(data.number);
+ this.commit = ko.observable(data.commit);
+ this.started_at = ko.observable(data.started_at);
+ this.finished_at = ko.observable(data.finished_at);
+ this.exit_code = ko.observable(data.exit_code);
+ this.status = ko.observable(data.status);
+ this.environment = ko.observable(data.environment);
+ }
+
+ function FeedViewModel() {
+ var self = this;
+
+ var mapped = $.map(feed, function(activity) {
+ return new Activity(activity)
+ });
+
+ self.feed = ko.observableArray(mapped);
+ }
+
+ ko.applyBindings(new FeedViewModel());
diff --git a/template/amber/_users.amber b/template/amber/_users.amber
new file mode 100644
index 000000000..5cadb86fd
--- /dev/null
+++ b/template/amber/_users.amber
@@ -0,0 +1,97 @@
+extends base
+
+block append head
+ title Users
+
+block content
+ div.container
+ h1 Users
+ hr
+ form
+ input[type="text"][placeholder="ie octocat"][data-bind="value: newUserLogin"]
+ button[type="button"][data-bind="click: addUser"] add user
+ hr
+ if len(Users) <= 1
+ div.alert.alert-info
+ | You should add users
+ table
+ tbody[data-bind="foreachInit: users"]
+ tr[data-template]
+ td[data-bind="text: $data.login"]
+ td[data-bind="text: $data.email"]
+ td[data-bind="text: $data.avatar_url"]
+ td[data-bind="text: $data.active"]
+ td[data-bind="text: $data.admin"]
+ td
+ button.delete[data-bind="click: $parent.removeUser"] delete
+ td
+ button.delete[data-bind="click: $parent.toggleAdmin"] toggle
+ each $user in Users
+ tr[data-init]
+ td[data-bind="init, text: login"] #{$user.Login}
+ td[data-bind="init, text: email"] #{$user.Email}
+ td[data-bind="init, text: avatar_url"] #{$user.Avatar}
+ td[data-bind="init, text: active"] #{$user.Active}
+ td[data-bind="init, text: admin"] #{$user.Admin}
+ td
+ button.delete[data-bind="init, click: $parent.removeUser"] delete
+ td
+ button.delete[data-bind="init, click: $parent.toggleAdmin"] toggle
+
+block append scripts
+ script
+ function User(data) {
+ this.login = ko.observable(data.login);
+ this.email = ko.observable(data.email);
+ this.avatar_url = ko.observable(data.avatar_url);
+ this.active = ko.observable(data.active);
+ this.admin = ko.observable(data.admin);
+ }
+
+ function UserViewModel() {
+ var self = this;
+
+ self.users = ko.observableArray();
+ self.newUserLogin = ko.observable();
+
+ self.removeUser = function(user) {
+ $.ajax({
+ url: "/api/users/"+user.login(),
+ type: "DELETE",
+ success: function( data ) {
+ self.users.remove(user);
+ self.users.sort(self.sort);
+ }
+ });
+ };
+
+ self.addUser = function() {
+ $.ajax({
+ url: "/api/users",
+ type: "POST",
+ data: ko.toJSON({ "login": self.newUserLogin() }),
+ contentType: "application/json",
+ success: function( data ) {
+ self.newUserLogin("");
+ self.users.push(new User(data));
+ self.users.sort(self.sort);
+ }
+ });
+ };
+
+ self.toggleAdmin = function(user) {
+ user.admin(!user.admin());
+ $.ajax({
+ url: "/api/users/"+user.login(),
+ type: "PATCH",
+ data: ko.toJSON(user),
+ contentType: "application/json"
+ });
+ };
+
+ self.sort = function(a, b) {
+ return a.login().toLowerCase() > b.login().toLowerCase() ? 1 : -1;
+ };
+ }
+
+ ko.applyBindings(new UserViewModel());
\ No newline at end of file
diff --git a/template/amber/base.amber b/template/amber/base.amber
new file mode 100644
index 000000000..7e644df21
--- /dev/null
+++ b/template/amber/base.amber
@@ -0,0 +1,55 @@
+doctype 5
+html
+ head
+ block head
+ meta[charset="utf-8"]
+ meta[name="viewport"][content="width=device-width, initial-scale=1"]
+ meta[http-equiv="x-ua-compatible"][content="ie=edge"]
+ link[rel="icon"][type="image/x-icon"][href="/static/images/favicon.ico"]
+
+ link[rel="stylesheet"][href="https://fonts.googleapis.com/icon?family=Material+Icons"]
+ link[rel="stylesheet"][href="https://fonts.googleapis.com/css?family=Roboto+Mono"]
+ link[rel="stylesheet"][href="https://fonts.googleapis.com/css?family=Roboto"]
+ link[rel="stylesheet"][href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.min.css"]
+ link[rel="stylesheet"][href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.1.0/octicons.min.css"]
+ link[rel="stylesheet"][href="/static/styles_gen/style.css"]
+
+ if Csrf
+ meta[name="_csrf"][content=Csrf]
+
+ body
+ nav.navbar
+ div.container-fluid
+ a.navbar-brand[href="/"]
+ if User
+ ul.nav.navbar-nav.navbar-right
+ li
+ form.navbar-form
+ input.form-control.typeahead[type="text"][placeholder="Search..."]
+ li
+ img[src=User.Avatar]
+ li
+ div.dropdown
+ button[type="button"][data-toggle="dropdown"]
+ i.material-icons expand_more
+ div.dropdown-menu.dropdown-menu-right
+ a.dropdown-item[href="/settings/profile"] Profile
+ if User.Admin
+ a.dropdown-item[href="/settings/people"] People
+ a.dropdown-item[href="/settings/nodes"] Nodes
+ a.dropdown-item[href="/logout"] Logout
+
+
+ div.subnav
+ div.container-fluid
+ block header
+
+ div#content
+ block content
+
+ block scripts
+ script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"]
+ script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"]
+ script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/js/bootstrap.min.js"]
+ script[type="text/javascript"][src="https://cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.11.1/typeahead.bundle.min.js"]
+ script[type="text/javascript"][src="/static/scripts_gen/drone.min.js"]
diff --git a/template/amber/build.amber b/template/amber/build.amber
new file mode 100644
index 000000000..a001da042
--- /dev/null
+++ b/template/amber/build.amber
@@ -0,0 +1,70 @@
+extends base
+
+block append head
+ title #{Repo.Name} · #{Build.Number}
+
+
+block header
+ ol
+ li
+ a[href="/"+Repo.FullName]
+ | #{Repo.Owner} / #{Repo.Name}
+ li.separator
+ i.material-icons chevron_right
+ li #{Build.Number}
+
+
+block content
+ div.container-fluid
+ div.row
+ div.col-md-4
+ div.build-summary
+ div
+ div[class=Build.Status][style="display:none"] #{Build.Status}
+ h3 #{Build.Message}
+ p
+ em #{Build.Author}
+ span authored
+ em[data-livestamp=Build.Created]
+ span to
+ em #{Build.Branch}
+
+
+
+
+ div.job-list
+ $curr = Job
+ $build = Build
+ $repo = Repo
+ each $job in Jobs
+ a[href="/" + $repo.FullName +"/"+ $build.Number+"/"+$job.Number][data-job=$job.Number]
+ .active ? $curr.Number == $job.Number
+ div
+ div.status[class=$job.Status] #{$job.Status}
+ div
+ if len($job.Environment) != 0
+ h3
+ each $key, $val in $job.Environment
+ div.env #{$key}=#{$val}
+ div
+ | finished
+ span[data-livestamp=$job.Finished]
+ div with exit code #{$job.ExitCode}
+
+ div.build-btn-group
+ button.btn.btn-info#restart restart
+
+ div.col-md-8
+ pre#output
+ button.tail#tail
+ i.material-icons expand_more
+
+block append scripts
+ script
+ var repo = #{json(Repo.FullName)};
+ var build = #{json(Build.Number)};
+ var job = #{json(Job.Number)};
+ var status = #{json(Job.Status)};
+
+ var view = new JobViewModel(repo, build, job, status);
+
diff --git a/template/amber/login.amber b/template/amber/login.amber
new file mode 100644
index 000000000..a736df090
--- /dev/null
+++ b/template/amber/login.amber
@@ -0,0 +1,36 @@
+doctype 5
+html
+ head
+ title Login
+ meta[charset="utf-8"]
+ meta[name="viewport"][content="width=device-width, initial-scale=1"]
+ meta[http-equiv="x-ua-compatible"][content="ie=edge"]
+ link[rel="icon"][type="image/x-icon"][href="/static/images/favicon.ico"]
+
+ link[rel="stylesheet"][href="https://fonts.googleapis.com/icon?family=Material+Icons"]
+ link[rel="stylesheet"][href="https://fonts.googleapis.com/css?family=Roboto+Mono"]
+ link[rel="stylesheet"][href="https://fonts.googleapis.com/css?family=Roboto"]
+ link[rel="stylesheet"][href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.min.css"]
+ link[rel="stylesheet"][href="/static/styles_gen/style.css"]
+ style
+ html { height: 100%; overflow: hidden; }
+
+ body.login
+ div
+ div.logo
+ a[href="/authorize"] Login
+
+ if Error == "oauth_error"
+ div.alert.alert-danger
+ | We failed to authorize your account. Please contact your
+ | system administrator to check the logs and see what went wrong.
+
+ else if Error == "access_denied"
+ div.alert.alert-danger
+ | Unable to login. Registration is closed.
+
+ else if Error == "internal_error"
+ div.alert.alert-danger
+ | We encountered an unexpected error. Please contact your
+ | system administrator to check the logs and see what went wrong.
+
diff --git a/template/amber/nodes.amber b/template/amber/nodes.amber
new file mode 100644
index 000000000..0df94cdce
--- /dev/null
+++ b/template/amber/nodes.amber
@@ -0,0 +1,52 @@
+extends base
+
+block append head
+ title Docker Nodes
+
+
+block header
+ ol
+ li Docker Nodes
+ li
+ button.btn.btn-info[data-toggle="modal"][data-target=".modal-node"]
+ | add node
+
+
+block content
+ div.container
+ div.alert.alert-danger.hidden
+ div.row.node-row
+ each $node in Nodes
+ div.col-sm-4
+ div.card[data-id=$node.ID]
+ div.card-header
+ i[class="linux_amd64"]
+ div.card-block
+ h3.addr #{$node.Addr}
+ p.arch.card-text #{$node.Arch}
+ div.btn-group
+ button.btn.btn-danger Delete
+
+ div.modal.modal-node[role="dialog"]
+ div.modal-dialog
+ div.modal-content
+ form
+ fieldset.form-group
+ label[for="addr"] Address
+ input.form-control[type="text"][placeholder="unix:///var/run/docker/docker.sock"]#addr
+ fieldset.form-group
+ label[for="key"] Key
+ textarea.form-control#key
+ fieldset.form-group
+ label[for="cert"] Cert
+ textarea.form-control#cert
+ fieldset.form-group
+ label[for="ca"] CA
+ textarea.form-control#ca
+ button.btn.btn-info[type="button"] add node
+
+
+
+block append scripts
+ script
+ var view = new NodeViewModel();
diff --git a/template/amber/repo.amber b/template/amber/repo.amber
new file mode 100644
index 000000000..79e7d9dc0
--- /dev/null
+++ b/template/amber/repo.amber
@@ -0,0 +1,50 @@
+extends base
+
+block append head
+ title #{Repo.Name}
+
+block header
+ ol
+ li #{Repo.Owner} / #{Repo.Name}
+
+ ul.nav.nav-tabs
+ li.nav-item
+ a.nav-link.active[href="/"+Repo.FullName] Builds
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings/badges"] Badges
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings/encrypt"] Secrets
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings"] Settings
+
+block content
+ div.container
+ if len(Builds) == 0
+ div.alert.alert-info
+ | You have no builds
+
+ div.timeline
+ $repo = Repo
+ each $group in Groups
+ div.group
+ div.group-title
+ | commits on #{$group.Date}
+ each $build in $group.Builds
+ a.card[href=$repo.Name+"/"+$build.Number][data-build=$build.Number]
+ div.card-header
+ img[src=$build.Avatar]
+ div.card-block
+ div
+ div.status[class=$build.Status] #{$build.Status}
+ h3 #{$build.Message}
+ p.card-text
+ em #{$build.Author}
+ span authored
+ em[data-livestamp=$build.Created]
+ span to
+ em #{$build.Branch}
+
+
+block append scripts
+ script
+ new RepoViewModel("#{Repo.FullName}");
diff --git a/template/amber/repo_activate.amber b/template/amber/repo_activate.amber
new file mode 100644
index 000000000..ecd9d1ab2
--- /dev/null
+++ b/template/amber/repo_activate.amber
@@ -0,0 +1,33 @@
+extends base
+
+block append head
+ title #{Repo.Name}
+
+block header
+ ol
+ li #{Repo.Owner} / #{Repo.Name}
+
+block content
+ div.container.repo_activate
+ div.alert.alert-danger.hidden
+ div.alert.alert-info
+ | This repository is not yet activated.
+ button.btn.btn-info#activateRepo Activate Now
+
+
+block append scripts
+ script
+ $( "#activateRepo" ).click(function() {
+ $( "#activateRepo" ).hide();
+ $.ajax({
+ type: "POST",
+ url: "/api/repos/#{Repo.FullName}",
+ success: function() {
+ window.location.href="/#{Repo.FullName}"
+ },
+ error: function(err) {
+ $(".alert-info").hide();
+ $(".alert-danger").text("Unable to activate this repository. You must have administrative access to this repository. Also, please check the third-party application access policy to ensure Drone is approved. "+ err.responseText).show();
+ }
+ });
+ });
\ No newline at end of file
diff --git a/template/amber/repo_badge.amber b/template/amber/repo_badge.amber
new file mode 100644
index 000000000..75a760263
--- /dev/null
+++ b/template/amber/repo_badge.amber
@@ -0,0 +1,37 @@
+extends base
+
+block append head
+ title #{Repo.Name}
+
+block header
+ ol
+ li #{Repo.Owner} / #{Repo.Name}
+
+ ul.nav.nav-tabs
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName] Builds
+ li.nav-item
+ a.nav-link.active[href="/"+Repo.FullName+"/settings/badges"] Badges
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings/encrypt"] Secrets
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings"] Settings
+
+block content
+ div.container.repo_config
+ div.row
+ div.col-md-3 Markdown
+ div.col-md-9
+ pre
+ | [](#{Link}/#{Repo.FullName})
+ div.row
+ div.col-md-3 Markup
+ div.col-md-9
+ pre
+ | <a href="#{Link}/api/badges/#{Repo.FullName}/status.svg"><img src="#{Link}/#{Repo.FullName}" /></a>
+ div.row
+ div.col-md-3 CC Menu
+ div.col-md-9
+ pre
+ | http://beta.drone.io/api/badges/#{Repo.FullName}/cc.xml
+
diff --git a/template/amber/repo_config.amber b/template/amber/repo_config.amber
new file mode 100644
index 000000000..c26a82cd7
--- /dev/null
+++ b/template/amber/repo_config.amber
@@ -0,0 +1,81 @@
+extends base
+
+block append head
+ title #{Repo.Name}
+
+block header
+ ol
+ li #{Repo.Owner} / #{Repo.Name}
+
+ ul.nav.nav-tabs
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName] Builds
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings/badges"] Badges
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings/encrypt"] Secrets
+ li.nav-item
+ a.nav-link.active[href="/"+Repo.FullName+"/settings"] Settings
+
+block content
+ div.container.repo_config
+ div.row
+ div.col-md-3 Push Hooks
+ div.col-md-9
+ if Repo.AllowPush
+ input#push[type="checkbox"][hidden="hidden"][checked]
+ else
+ input#push[type="checkbox"][hidden="hidden"]
+ label.switch[for="push"]
+ div.row
+ div.col-md-3 Pull Request Hooks
+ div.col-md-9
+ if Repo.AllowPull
+ input#pull[type="checkbox"][hidden="hidden"][checked]
+ else
+ input#pull[type="checkbox"][hidden="hidden"]
+ label.switch[for="pull"]
+ div.row
+ div.col-md-3 Tag Hooks
+ div.col-md-9
+ if Repo.AllowTag
+ input#tag[type="checkbox"][hidden="hidden"][checked]
+ else
+ input#tag[type="checkbox"][hidden="hidden"]
+ label.switch[for="tag"]
+ div.row
+ div.col-md-3 Deploy Hook
+ div.col-md-9
+ if Repo.AllowDeploy
+ input#deploy[type="checkbox"][hidden="hidden"][checked]
+ else
+ input#deploy[type="checkbox"][hidden="hidden"]
+ label.switch[for="deploy"]
+ div.row
+ div.col-md-3 Timeout in Minutes
+ div.col-md-9
+ input[type="range"][min="0"][max="900"][value=Repo.Timeout]
+ span.timeout-label
+ | #{Repo.Timeout} minutes
+ div.row
+ div.col-md-3 Trusted
+ div.col-md-9
+ if Repo.IsTrusted
+ input#trusted[type="checkbox"][hidden="hidden"][checked]
+ else
+ input#trusted[type="checkbox"][hidden="hidden"]
+ label.switch[for="trusted"]
+ div.row
+ div.col-md-3 Public Key
+ div.col-md-9
+ pre #{Key.Public}
+ div.row
+ div.col-md-12
+ div.alert.alert-danger
+ button.btn.btn-danger Delete
+ span Permanently deletes the build history. This action cannot be undone.
+
+
+block append scripts
+ script
+ var view = new RepoConfigViewModel(#{Repo.FullName});
\ No newline at end of file
diff --git a/template/amber/repo_secret.amber b/template/amber/repo_secret.amber
new file mode 100644
index 000000000..ff7ba36d0
--- /dev/null
+++ b/template/amber/repo_secret.amber
@@ -0,0 +1,45 @@
+extends base
+
+block append head
+ title #{Repo.Name}
+
+block header
+ ol
+ li #{Repo.Owner} / #{Repo.Name}
+
+ ul.nav.nav-tabs
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName] Builds
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings/badges"] Badges
+ li.nav-item
+ a.nav-link.active[href="/"+Repo.FullName+"/settings/encrypt"] Secrets
+ li.nav-item
+ a.nav-link[href="/"+Repo.FullName+"/settings"] Settings
+
+block content
+ div.container.repo_secrets
+ div
+ textarea.secrets[spellcheck="false"]
+ div.alert.alert-danger.hidden
+ button.btn.btn-info#encryptButton Generate
+ div
+ pre.result
+
+block append scripts
+ script
+ $("#encryptButton").click(function(){
+ $( ".alert-danger" ).hide();
+ $.ajax({
+ url: "/api/repos/#{Repo.FullName}/encrypt",
+ type: "POST",
+ contentType: "text/plain",
+ data: $(".secrets").val(),
+ success: function( data ) {
+ $( ".result" ).text( data );
+ },
+ error: function( data ) {
+ $( ".alert-danger" ).text(data.responseText).show();
+ }
+ });
+ });
diff --git a/template/amber/repos.amber b/template/amber/repos.amber
new file mode 100644
index 000000000..6f8085926
--- /dev/null
+++ b/template/amber/repos.amber
@@ -0,0 +1,13 @@
+extends base
+
+block append head
+ title Dashboard
+
+block content
+ div.container
+ div.alert.alert-info
+ | We haven't decided what to put on the main screen yet. This will
+ | be decided before we snapshot a beta release. In the mean time,
+ | use the search box to find a repository. Make sure you type the
+ | fully qualified repository name (ie owner/name)
+
diff --git a/template/amber/user.amber b/template/amber/user.amber
new file mode 100644
index 000000000..9a428ad99
--- /dev/null
+++ b/template/amber/user.amber
@@ -0,0 +1,33 @@
+extends base
+
+block append head
+ title Profile
+
+block header
+ ol
+ li Account Profile
+
+
+block content
+ div.container.profile
+ div.row
+ div.col-md-3 Login
+ div.col-md-9 #{User.Login}
+ div.row
+ div.col-md-3 Email
+ div.col-md-9 #{User.Email}
+
+ div.row
+ div.col-md-3 Token
+ div.col-md-9
+ button.btn.btn-info#showToken show token
+ pre.result
+
+block append scripts
+ script
+ $( "#showToken" ).click(function() {
+ $( "#showToken" ).hide();
+ $.post( "/api/user/token", function( data ) {
+ $( ".result" ).text( data );
+ });
+ });
diff --git a/template/amber/users.amber b/template/amber/users.amber
new file mode 100644
index 000000000..3f950951e
--- /dev/null
+++ b/template/amber/users.amber
@@ -0,0 +1,40 @@
+extends base
+
+block append head
+ title Users
+
+block header
+ ol
+ li User Management
+ li
+ button.btn.btn-info[data-toggle="modal"][data-target=".modal-user"]
+ | add user
+
+block content
+ div.container
+ div.alert.alert-danger.hidden
+ div.row.user-row
+ each $user in Users
+ div.col-sm-4
+ div.card[data-id=$user.Login][data-admin=$user.Admin]
+ div.card-header
+ img.avatar[src=$user.Avatar]
+ div.card-block
+ h3.login #{$user.Login}
+ p.email.card-text #{$user.Email}
+ div.btn-group
+ button.btn.btn-info Toggle Admin
+ button.btn.btn-danger Delete
+
+
+ div.modal.modal-user[role="dialog"]
+ div.modal-dialog
+ div.modal-content
+ form
+ label[for="login"] Username
+ input.form-control[type="text"][placeholder="ie octocat"]#login
+ button.btn.btn-info[type="button"] add user
+
+block append scripts
+ script
+ var view = new UserViewModel();
diff --git a/template/amber_gen/.gitkeep b/template/amber_gen/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/template/template.go b/template/template.go
new file mode 100644
index 000000000..cb6c755a7
--- /dev/null
+++ b/template/template.go
@@ -0,0 +1,57 @@
+package template
+
+//go:generate sh -c "amberc amber/400.amber > amber_gen/400.html"
+//go:generate sh -c "amberc amber/401.amber > amber_gen/401.html"
+//go:generate sh -c "amberc amber/403.amber > amber_gen/403.html"
+//go:generate sh -c "amberc amber/404.amber > amber_gen/404.html"
+//go:generate sh -c "amberc amber/500.amber > amber_gen/500.html"
+//go:generate sh -c "amberc amber/build.amber > amber_gen/build.html"
+//go:generate sh -c "amberc amber/login.amber > amber_gen/login.html"
+//go:generate sh -c "amberc amber/repos.amber > amber_gen/repos.html"
+//go:generate sh -c "amberc amber/repo.amber > amber_gen/repo.html"
+//go:generate sh -c "amberc amber/repo_badge.amber > amber_gen/repo_badge.html"
+//go:generate sh -c "amberc amber/repo_activate.amber > amber_gen/repo_activate.html"
+//go:generate sh -c "amberc amber/repo_config.amber > amber_gen/repo_config.html"
+//go:generate sh -c "amberc amber/repo_secret.amber > amber_gen/repo_secret.html"
+//go:generate sh -c "amberc amber/users.amber > amber_gen/users.html"
+//go:generate sh -c "amberc amber/user.amber > amber_gen/user.html"
+//go:generate sh -c "amberc amber/nodes.amber > amber_gen/nodes.html"
+
+//go:generate go-bindata -pkg template -o template_gen.go amber_gen/
+
+import (
+ "encoding/json"
+ "html/template"
+ "path/filepath"
+
+ "github.com/eknkc/amber"
+)
+
+func Load() *template.Template {
+ amber.FuncMap["json"] = marshal
+
+ dir, _ := AssetDir("amber_gen")
+ tmpl := template.New("_")
+ tmpl.Funcs(amber.FuncMap)
+
+ for _, name := range dir {
+ if filepath.Ext(name) != ".html" {
+ continue
+ }
+
+ path := filepath.Join("amber_gen", name)
+ src := MustAsset(path)
+ tmpl = template.Must(
+ tmpl.New(name).Parse(string(src)),
+ )
+ }
+
+ return tmpl
+}
+
+// marshal is a helper function to render data as JSON
+// inside the tempalte.
+func marshal(v interface{}) template.JS {
+ a, _ := json.Marshal(v)
+ return template.JS(a)
+}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/agent.go b/vendor/code.google.com/p/go.crypto/ssh/agent.go
new file mode 100644
index 000000000..a91da34c7
--- /dev/null
+++ b/vendor/code.google.com/p/go.crypto/ssh/agent.go
@@ -0,0 +1,250 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ssh
+
+import (
+ "encoding/base64"
+ "errors"
+ "io"
+ "sync"
+)
+
+// See [PROTOCOL.agent], section 3.
+const (
+ // 3.2 Requests from client to agent for protocol 2 key operations
+ agentRequestIdentities = 11
+ agentSignRequest = 13
+ agentAddIdentity = 17
+ agentRemoveIdentity = 18
+ agentRemoveAllIdentities = 19
+ agentAddIdConstrained = 25
+
+ // 3.3 Key-type independent requests from client to agent
+ agentAddSmartcardKey = 20
+ agentRemoveSmartcardKey = 21
+ agentLock = 22
+ agentUnlock = 23
+ agentAddSmartcardKeyConstrained = 26
+
+ // 3.4 Generic replies from agent to client
+ agentFailure = 5
+ agentSuccess = 6
+
+ // 3.6 Replies from agent to client for protocol 2 key operations
+ agentIdentitiesAnswer = 12
+ agentSignResponse = 14
+
+ // 3.7 Key constraint identifiers
+ agentConstrainLifetime = 1
+ agentConstrainConfirm = 2
+)
+
+// maxAgentResponseBytes is the maximum agent reply size that is accepted. This
+// is a sanity check, not a limit in the spec.
+const maxAgentResponseBytes = 16 << 20
+
+// Agent messages:
+// These structures mirror the wire format of the corresponding ssh agent
+// messages found in [PROTOCOL.agent].
+
+type failureAgentMsg struct{}
+
+type successAgentMsg struct{}
+
+// See [PROTOCOL.agent], section 2.5.2.
+type requestIdentitiesAgentMsg struct{}
+
+// See [PROTOCOL.agent], section 2.5.2.
+type identitiesAnswerAgentMsg struct {
+ NumKeys uint32
+ Keys []byte `ssh:"rest"`
+}
+
+// See [PROTOCOL.agent], section 2.6.2.
+type signRequestAgentMsg struct {
+ KeyBlob []byte
+ Data []byte
+ Flags uint32
+}
+
+// See [PROTOCOL.agent], section 2.6.2.
+type signResponseAgentMsg struct {
+ SigBlob []byte
+}
+
+// AgentKey represents a protocol 2 key as defined in [PROTOCOL.agent],
+// section 2.5.2.
+type AgentKey struct {
+ blob []byte
+ Comment string
+}
+
+// String returns the storage form of an agent key with the format, base64
+// encoded serialized key, and the comment if it is not empty.
+func (ak *AgentKey) String() string {
+ algo, _, ok := parseString(ak.blob)
+ if !ok {
+ return "ssh: malformed key"
+ }
+
+ s := string(algo) + " " + base64.StdEncoding.EncodeToString(ak.blob)
+
+ if ak.Comment != "" {
+ s += " " + ak.Comment
+ }
+
+ return s
+}
+
+// Key returns an agent's public key as one of the supported key or certificate types.
+func (ak *AgentKey) Key() (PublicKey, error) {
+ if key, _, ok := ParsePublicKey(ak.blob); ok {
+ return key, nil
+ }
+ return nil, errors.New("ssh: failed to parse key blob")
+}
+
+func parseAgentKey(in []byte) (out *AgentKey, rest []byte, ok bool) {
+ ak := new(AgentKey)
+
+ if ak.blob, in, ok = parseString(in); !ok {
+ return
+ }
+
+ comment, in, ok := parseString(in)
+ if !ok {
+ return
+ }
+ ak.Comment = string(comment)
+
+ return ak, in, true
+}
+
+// AgentClient provides a means to communicate with an ssh agent process based
+// on the protocol described in [PROTOCOL.agent]?rev=1.6.
+type AgentClient struct {
+ // conn is typically represented by using a *net.UnixConn
+ conn io.ReadWriter
+ // mu is used to prevent concurrent access to the agent
+ mu sync.Mutex
+}
+
+// NewAgentClient creates and returns a new *AgentClient using the
+// passed in io.ReadWriter as a connection to a ssh agent.
+func NewAgentClient(rw io.ReadWriter) *AgentClient {
+ return &AgentClient{conn: rw}
+}
+
+// sendAndReceive sends req to the agent and waits for a reply. On success,
+// the reply is unmarshaled into reply and replyType is set to the first byte of
+// the reply, which contains the type of the message.
+func (ac *AgentClient) sendAndReceive(req []byte) (reply interface{}, replyType uint8, err error) {
+ // ac.mu prevents multiple, concurrent requests. Since the agent is typically
+ // on the same machine, we don't attempt to pipeline the requests.
+ ac.mu.Lock()
+ defer ac.mu.Unlock()
+
+ msg := make([]byte, stringLength(len(req)))
+ marshalString(msg, req)
+ if _, err = ac.conn.Write(msg); err != nil {
+ return
+ }
+
+ var respSizeBuf [4]byte
+ if _, err = io.ReadFull(ac.conn, respSizeBuf[:]); err != nil {
+ return
+ }
+ respSize, _, _ := parseUint32(respSizeBuf[:])
+
+ if respSize > maxAgentResponseBytes {
+ err = errors.New("ssh: agent reply too large")
+ return
+ }
+
+ buf := make([]byte, respSize)
+ if _, err = io.ReadFull(ac.conn, buf); err != nil {
+ return
+ }
+ return unmarshalAgentMsg(buf)
+}
+
+// RequestIdentities queries the agent for protocol 2 keys as defined in
+// [PROTOCOL.agent] section 2.5.2.
+func (ac *AgentClient) RequestIdentities() ([]*AgentKey, error) {
+ req := marshal(agentRequestIdentities, requestIdentitiesAgentMsg{})
+
+ msg, msgType, err := ac.sendAndReceive(req)
+ if err != nil {
+ return nil, err
+ }
+
+ switch msg := msg.(type) {
+ case *identitiesAnswerAgentMsg:
+ if msg.NumKeys > maxAgentResponseBytes/8 {
+ return nil, errors.New("ssh: too many keys in agent reply")
+ }
+ keys := make([]*AgentKey, msg.NumKeys)
+ data := msg.Keys
+ for i := uint32(0); i < msg.NumKeys; i++ {
+ var key *AgentKey
+ var ok bool
+ if key, data, ok = parseAgentKey(data); !ok {
+ return nil, ParseError{agentIdentitiesAnswer}
+ }
+ keys[i] = key
+ }
+ return keys, nil
+ case *failureAgentMsg:
+ return nil, errors.New("ssh: failed to list keys")
+ }
+ return nil, UnexpectedMessageError{agentIdentitiesAnswer, msgType}
+}
+
+// SignRequest requests the signing of data by the agent using a protocol 2 key
+// as defined in [PROTOCOL.agent] section 2.6.2.
+func (ac *AgentClient) SignRequest(key PublicKey, data []byte) ([]byte, error) {
+ req := marshal(agentSignRequest, signRequestAgentMsg{
+ KeyBlob: MarshalPublicKey(key),
+ Data: data,
+ })
+
+ msg, msgType, err := ac.sendAndReceive(req)
+ if err != nil {
+ return nil, err
+ }
+
+ switch msg := msg.(type) {
+ case *signResponseAgentMsg:
+ return msg.SigBlob, nil
+ case *failureAgentMsg:
+ return nil, errors.New("ssh: failed to sign challenge")
+ }
+ return nil, UnexpectedMessageError{agentSignResponse, msgType}
+}
+
+// unmarshalAgentMsg parses an agent message in packet, returning the parsed
+// form and the message type of packet.
+func unmarshalAgentMsg(packet []byte) (interface{}, uint8, error) {
+ if len(packet) < 1 {
+ return nil, 0, ParseError{0}
+ }
+ var msg interface{}
+ switch packet[0] {
+ case agentFailure:
+ msg = new(failureAgentMsg)
+ case agentSuccess:
+ msg = new(successAgentMsg)
+ case agentIdentitiesAnswer:
+ msg = new(identitiesAnswerAgentMsg)
+ case agentSignResponse:
+ msg = new(signResponseAgentMsg)
+ default:
+ return nil, 0, UnexpectedMessageError{0, packet[0]}
+ }
+ if err := unmarshal(msg, packet, packet[0]); err != nil {
+ return nil, 0, err
+ }
+ return msg, packet[0], nil
+}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/agent/client.go b/vendor/code.google.com/p/go.crypto/ssh/agent/client.go
deleted file mode 100644
index 7f2ae5027..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/agent/client.go
+++ /dev/null
@@ -1,563 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
- Package agent implements a client to an ssh-agent daemon.
-
-References:
- [PROTOCOL.agent]: http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.agent
-*/
-package agent
-
-import (
- "bytes"
- "crypto/dsa"
- "crypto/ecdsa"
- "crypto/elliptic"
- "crypto/rsa"
- "encoding/base64"
- "encoding/binary"
- "errors"
- "fmt"
- "io"
- "math/big"
- "sync"
-
- "golang.org/x/crypto/ssh"
-)
-
-// Agent represents the capabilities of an ssh-agent.
-type Agent interface {
- // List returns the identities known to the agent.
- List() ([]*Key, error)
-
- // Sign has the agent sign the data using a protocol 2 key as defined
- // in [PROTOCOL.agent] section 2.6.2.
- Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error)
-
- // Insert adds a private key to the agent. If a certificate
- // is given, that certificate is added as public key.
- Add(s interface{}, cert *ssh.Certificate, comment string) error
-
- // Remove removes all identities with the given public key.
- Remove(key ssh.PublicKey) error
-
- // RemoveAll removes all identities.
- RemoveAll() error
-
- // Lock locks the agent. Sign and Remove will fail, and List will empty an empty list.
- Lock(passphrase []byte) error
-
- // Unlock undoes the effect of Lock
- Unlock(passphrase []byte) error
-
- // Signers returns signers for all the known keys.
- Signers() ([]ssh.Signer, error)
-}
-
-// See [PROTOCOL.agent], section 3.
-const (
- agentRequestV1Identities = 1
-
- // 3.2 Requests from client to agent for protocol 2 key operations
- agentAddIdentity = 17
- agentRemoveIdentity = 18
- agentRemoveAllIdentities = 19
- agentAddIdConstrained = 25
-
- // 3.3 Key-type independent requests from client to agent
- agentAddSmartcardKey = 20
- agentRemoveSmartcardKey = 21
- agentLock = 22
- agentUnlock = 23
- agentAddSmartcardKeyConstrained = 26
-
- // 3.7 Key constraint identifiers
- agentConstrainLifetime = 1
- agentConstrainConfirm = 2
-)
-
-// maxAgentResponseBytes is the maximum agent reply size that is accepted. This
-// is a sanity check, not a limit in the spec.
-const maxAgentResponseBytes = 16 << 20
-
-// Agent messages:
-// These structures mirror the wire format of the corresponding ssh agent
-// messages found in [PROTOCOL.agent].
-
-// 3.4 Generic replies from agent to client
-const agentFailure = 5
-
-type failureAgentMsg struct{}
-
-const agentSuccess = 6
-
-type successAgentMsg struct{}
-
-// See [PROTOCOL.agent], section 2.5.2.
-const agentRequestIdentities = 11
-
-type requestIdentitiesAgentMsg struct{}
-
-// See [PROTOCOL.agent], section 2.5.2.
-const agentIdentitiesAnswer = 12
-
-type identitiesAnswerAgentMsg struct {
- NumKeys uint32 `sshtype:"12"`
- Keys []byte `ssh:"rest"`
-}
-
-// See [PROTOCOL.agent], section 2.6.2.
-const agentSignRequest = 13
-
-type signRequestAgentMsg struct {
- KeyBlob []byte `sshtype:"13"`
- Data []byte
- Flags uint32
-}
-
-// See [PROTOCOL.agent], section 2.6.2.
-
-// 3.6 Replies from agent to client for protocol 2 key operations
-const agentSignResponse = 14
-
-type signResponseAgentMsg struct {
- SigBlob []byte `sshtype:"14"`
-}
-
-type publicKey struct {
- Format string
- Rest []byte `ssh:"rest"`
-}
-
-// Key represents a protocol 2 public key as defined in
-// [PROTOCOL.agent], section 2.5.2.
-type Key struct {
- Format string
- Blob []byte
- Comment string
-}
-
-func clientErr(err error) error {
- return fmt.Errorf("agent: client error: %v", err)
-}
-
-// String returns the storage form of an agent key with the format, base64
-// encoded serialized key, and the comment if it is not empty.
-func (k *Key) String() string {
- s := string(k.Format) + " " + base64.StdEncoding.EncodeToString(k.Blob)
-
- if k.Comment != "" {
- s += " " + k.Comment
- }
-
- return s
-}
-
-// Type returns the public key type.
-func (k *Key) Type() string {
- return k.Format
-}
-
-// Marshal returns key blob to satisfy the ssh.PublicKey interface.
-func (k *Key) Marshal() []byte {
- return k.Blob
-}
-
-// Verify satisfies the ssh.PublicKey interface, but is not
-// implemented for agent keys.
-func (k *Key) Verify(data []byte, sig *ssh.Signature) error {
- return errors.New("agent: agent key does not know how to verify")
-}
-
-type wireKey struct {
- Format string
- Rest []byte `ssh:"rest"`
-}
-
-func parseKey(in []byte) (out *Key, rest []byte, err error) {
- var record struct {
- Blob []byte
- Comment string
- Rest []byte `ssh:"rest"`
- }
-
- if err := ssh.Unmarshal(in, &record); err != nil {
- return nil, nil, err
- }
-
- var wk wireKey
- if err := ssh.Unmarshal(record.Blob, &wk); err != nil {
- return nil, nil, err
- }
-
- return &Key{
- Format: wk.Format,
- Blob: record.Blob,
- Comment: record.Comment,
- }, record.Rest, nil
-}
-
-// client is a client for an ssh-agent process.
-type client struct {
- // conn is typically a *net.UnixConn
- conn io.ReadWriter
- // mu is used to prevent concurrent access to the agent
- mu sync.Mutex
-}
-
-// NewClient returns an Agent that talks to an ssh-agent process over
-// the given connection.
-func NewClient(rw io.ReadWriter) Agent {
- return &client{conn: rw}
-}
-
-// call sends an RPC to the agent. On success, the reply is
-// unmarshaled into reply and replyType is set to the first byte of
-// the reply, which contains the type of the message.
-func (c *client) call(req []byte) (reply interface{}, err error) {
- c.mu.Lock()
- defer c.mu.Unlock()
-
- msg := make([]byte, 4+len(req))
- binary.BigEndian.PutUint32(msg, uint32(len(req)))
- copy(msg[4:], req)
- if _, err = c.conn.Write(msg); err != nil {
- return nil, clientErr(err)
- }
-
- var respSizeBuf [4]byte
- if _, err = io.ReadFull(c.conn, respSizeBuf[:]); err != nil {
- return nil, clientErr(err)
- }
- respSize := binary.BigEndian.Uint32(respSizeBuf[:])
- if respSize > maxAgentResponseBytes {
- return nil, clientErr(err)
- }
-
- buf := make([]byte, respSize)
- if _, err = io.ReadFull(c.conn, buf); err != nil {
- return nil, clientErr(err)
- }
- reply, err = unmarshal(buf)
- if err != nil {
- return nil, clientErr(err)
- }
- return reply, err
-}
-
-func (c *client) simpleCall(req []byte) error {
- resp, err := c.call(req)
- if err != nil {
- return err
- }
- if _, ok := resp.(*successAgentMsg); ok {
- return nil
- }
- return errors.New("agent: failure")
-}
-
-func (c *client) RemoveAll() error {
- return c.simpleCall([]byte{agentRemoveAllIdentities})
-}
-
-func (c *client) Remove(key ssh.PublicKey) error {
- req := ssh.Marshal(&agentRemoveIdentityMsg{
- KeyBlob: key.Marshal(),
- })
- return c.simpleCall(req)
-}
-
-func (c *client) Lock(passphrase []byte) error {
- req := ssh.Marshal(&agentLockMsg{
- Passphrase: passphrase,
- })
- return c.simpleCall(req)
-}
-
-func (c *client) Unlock(passphrase []byte) error {
- req := ssh.Marshal(&agentUnlockMsg{
- Passphrase: passphrase,
- })
- return c.simpleCall(req)
-}
-
-// List returns the identities known to the agent.
-func (c *client) List() ([]*Key, error) {
- // see [PROTOCOL.agent] section 2.5.2.
- req := []byte{agentRequestIdentities}
-
- msg, err := c.call(req)
- if err != nil {
- return nil, err
- }
-
- switch msg := msg.(type) {
- case *identitiesAnswerAgentMsg:
- if msg.NumKeys > maxAgentResponseBytes/8 {
- return nil, errors.New("agent: too many keys in agent reply")
- }
- keys := make([]*Key, msg.NumKeys)
- data := msg.Keys
- for i := uint32(0); i < msg.NumKeys; i++ {
- var key *Key
- var err error
- if key, data, err = parseKey(data); err != nil {
- return nil, err
- }
- keys[i] = key
- }
- return keys, nil
- case *failureAgentMsg:
- return nil, errors.New("agent: failed to list keys")
- }
- panic("unreachable")
-}
-
-// Sign has the agent sign the data using a protocol 2 key as defined
-// in [PROTOCOL.agent] section 2.6.2.
-func (c *client) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) {
- req := ssh.Marshal(signRequestAgentMsg{
- KeyBlob: key.Marshal(),
- Data: data,
- })
-
- msg, err := c.call(req)
- if err != nil {
- return nil, err
- }
-
- switch msg := msg.(type) {
- case *signResponseAgentMsg:
- var sig ssh.Signature
- if err := ssh.Unmarshal(msg.SigBlob, &sig); err != nil {
- return nil, err
- }
-
- return &sig, nil
- case *failureAgentMsg:
- return nil, errors.New("agent: failed to sign challenge")
- }
- panic("unreachable")
-}
-
-// unmarshal parses an agent message in packet, returning the parsed
-// form and the message type of packet.
-func unmarshal(packet []byte) (interface{}, error) {
- if len(packet) < 1 {
- return nil, errors.New("agent: empty packet")
- }
- var msg interface{}
- switch packet[0] {
- case agentFailure:
- return new(failureAgentMsg), nil
- case agentSuccess:
- return new(successAgentMsg), nil
- case agentIdentitiesAnswer:
- msg = new(identitiesAnswerAgentMsg)
- case agentSignResponse:
- msg = new(signResponseAgentMsg)
- default:
- return nil, fmt.Errorf("agent: unknown type tag %d", packet[0])
- }
- if err := ssh.Unmarshal(packet, msg); err != nil {
- return nil, err
- }
- return msg, nil
-}
-
-type rsaKeyMsg struct {
- Type string `sshtype:"17"`
- N *big.Int
- E *big.Int
- D *big.Int
- Iqmp *big.Int // IQMP = Inverse Q Mod P
- P *big.Int
- Q *big.Int
- Comments string
-}
-
-type dsaKeyMsg struct {
- Type string `sshtype:"17"`
- P *big.Int
- Q *big.Int
- G *big.Int
- Y *big.Int
- X *big.Int
- Comments string
-}
-
-type ecdsaKeyMsg struct {
- Type string `sshtype:"17"`
- Curve string
- KeyBytes []byte
- D *big.Int
- Comments string
-}
-
-// Insert adds a private key to the agent.
-func (c *client) insertKey(s interface{}, comment string) error {
- var req []byte
- switch k := s.(type) {
- case *rsa.PrivateKey:
- if len(k.Primes) != 2 {
- return fmt.Errorf("agent: unsupported RSA key with %d primes", len(k.Primes))
- }
- k.Precompute()
- req = ssh.Marshal(rsaKeyMsg{
- Type: ssh.KeyAlgoRSA,
- N: k.N,
- E: big.NewInt(int64(k.E)),
- D: k.D,
- Iqmp: k.Precomputed.Qinv,
- P: k.Primes[0],
- Q: k.Primes[1],
- Comments: comment,
- })
- case *dsa.PrivateKey:
- req = ssh.Marshal(dsaKeyMsg{
- Type: ssh.KeyAlgoDSA,
- P: k.P,
- Q: k.Q,
- G: k.G,
- Y: k.Y,
- X: k.X,
- Comments: comment,
- })
- case *ecdsa.PrivateKey:
- nistID := fmt.Sprintf("nistp%d", k.Params().BitSize)
- req = ssh.Marshal(ecdsaKeyMsg{
- Type: "ecdsa-sha2-" + nistID,
- Curve: nistID,
- KeyBytes: elliptic.Marshal(k.Curve, k.X, k.Y),
- D: k.D,
- Comments: comment,
- })
- default:
- return fmt.Errorf("agent: unsupported key type %T", s)
- }
- resp, err := c.call(req)
- if err != nil {
- return err
- }
- if _, ok := resp.(*successAgentMsg); ok {
- return nil
- }
- return errors.New("agent: failure")
-}
-
-type rsaCertMsg struct {
- Type string `sshtype:"17"`
- CertBytes []byte
- D *big.Int
- Iqmp *big.Int // IQMP = Inverse Q Mod P
- P *big.Int
- Q *big.Int
- Comments string
-}
-
-type dsaCertMsg struct {
- Type string `sshtype:"17"`
- CertBytes []byte
- X *big.Int
- Comments string
-}
-
-type ecdsaCertMsg struct {
- Type string `sshtype:"17"`
- CertBytes []byte
- D *big.Int
- Comments string
-}
-
-// Insert adds a private key to the agent. If a certificate is given,
-// that certificate is added instead as public key.
-func (c *client) Add(s interface{}, cert *ssh.Certificate, comment string) error {
- if cert == nil {
- return c.insertKey(s, comment)
- } else {
- return c.insertCert(s, cert, comment)
- }
-}
-
-func (c *client) insertCert(s interface{}, cert *ssh.Certificate, comment string) error {
- var req []byte
- switch k := s.(type) {
- case *rsa.PrivateKey:
- if len(k.Primes) != 2 {
- return fmt.Errorf("agent: unsupported RSA key with %d primes", len(k.Primes))
- }
- k.Precompute()
- req = ssh.Marshal(rsaCertMsg{
- Type: cert.Type(),
- CertBytes: cert.Marshal(),
- D: k.D,
- Iqmp: k.Precomputed.Qinv,
- P: k.Primes[0],
- Q: k.Primes[1],
- Comments: comment,
- })
- case *dsa.PrivateKey:
- req = ssh.Marshal(dsaCertMsg{
- Type: cert.Type(),
- CertBytes: cert.Marshal(),
- X: k.X,
- Comments: comment,
- })
- case *ecdsa.PrivateKey:
- req = ssh.Marshal(ecdsaCertMsg{
- Type: cert.Type(),
- CertBytes: cert.Marshal(),
- D: k.D,
- Comments: comment,
- })
- default:
- return fmt.Errorf("agent: unsupported key type %T", s)
- }
-
- signer, err := ssh.NewSignerFromKey(s)
- if err != nil {
- return err
- }
- if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 {
- return errors.New("agent: signer and cert have different public key")
- }
-
- resp, err := c.call(req)
- if err != nil {
- return err
- }
- if _, ok := resp.(*successAgentMsg); ok {
- return nil
- }
- return errors.New("agent: failure")
-}
-
-// Signers provides a callback for client authentication.
-func (c *client) Signers() ([]ssh.Signer, error) {
- keys, err := c.List()
- if err != nil {
- return nil, err
- }
-
- var result []ssh.Signer
- for _, k := range keys {
- result = append(result, &agentKeyringSigner{c, k})
- }
- return result, nil
-}
-
-type agentKeyringSigner struct {
- agent *client
- pub ssh.PublicKey
-}
-
-func (s *agentKeyringSigner) PublicKey() ssh.PublicKey {
- return s.pub
-}
-
-func (s *agentKeyringSigner) Sign(rand io.Reader, data []byte) (*ssh.Signature, error) {
- // The agent has its own entropy source, so the rand argument is ignored.
- return s.agent.Sign(s.pub, data)
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/agent/client_test.go b/vendor/code.google.com/p/go.crypto/ssh/agent/client_test.go
deleted file mode 100644
index 80e2c2c38..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/agent/client_test.go
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package agent
-
-import (
- "bytes"
- "crypto/rand"
- "errors"
- "net"
- "os"
- "os/exec"
- "path/filepath"
- "strconv"
- "testing"
-
- "golang.org/x/crypto/ssh"
-)
-
-// startAgent executes ssh-agent, and returns a Agent interface to it.
-func startAgent(t *testing.T) (client Agent, socket string, cleanup func()) {
- if testing.Short() {
- // ssh-agent is not always available, and the key
- // types supported vary by platform.
- t.Skip("skipping test due to -short")
- }
-
- bin, err := exec.LookPath("ssh-agent")
- if err != nil {
- t.Skip("could not find ssh-agent")
- }
-
- cmd := exec.Command(bin, "-s")
- out, err := cmd.Output()
- if err != nil {
- t.Fatalf("cmd.Output: %v", err)
- }
-
- /* Output looks like:
-
- SSH_AUTH_SOCK=/tmp/ssh-P65gpcqArqvH/agent.15541; export SSH_AUTH_SOCK;
- SSH_AGENT_PID=15542; export SSH_AGENT_PID;
- echo Agent pid 15542;
- */
- fields := bytes.Split(out, []byte(";"))
- line := bytes.SplitN(fields[0], []byte("="), 2)
- line[0] = bytes.TrimLeft(line[0], "\n")
- if string(line[0]) != "SSH_AUTH_SOCK" {
- t.Fatalf("could not find key SSH_AUTH_SOCK in %q", fields[0])
- }
- socket = string(line[1])
-
- line = bytes.SplitN(fields[2], []byte("="), 2)
- line[0] = bytes.TrimLeft(line[0], "\n")
- if string(line[0]) != "SSH_AGENT_PID" {
- t.Fatalf("could not find key SSH_AGENT_PID in %q", fields[2])
- }
- pidStr := line[1]
- pid, err := strconv.Atoi(string(pidStr))
- if err != nil {
- t.Fatalf("Atoi(%q): %v", pidStr, err)
- }
-
- conn, err := net.Dial("unix", string(socket))
- if err != nil {
- t.Fatalf("net.Dial: %v", err)
- }
-
- ac := NewClient(conn)
- return ac, socket, func() {
- proc, _ := os.FindProcess(pid)
- if proc != nil {
- proc.Kill()
- }
- conn.Close()
- os.RemoveAll(filepath.Dir(socket))
- }
-}
-
-func testAgent(t *testing.T, key interface{}, cert *ssh.Certificate) {
- agent, _, cleanup := startAgent(t)
- defer cleanup()
-
- testAgentInterface(t, agent, key, cert)
-}
-
-func testAgentInterface(t *testing.T, agent Agent, key interface{}, cert *ssh.Certificate) {
- signer, err := ssh.NewSignerFromKey(key)
- if err != nil {
- t.Fatalf("NewSignerFromKey(%T): %v", key, err)
- }
- // The agent should start up empty.
- if keys, err := agent.List(); err != nil {
- t.Fatalf("RequestIdentities: %v", err)
- } else if len(keys) > 0 {
- t.Fatalf("got %d keys, want 0: %v", len(keys), keys)
- }
-
- // Attempt to insert the key, with certificate if specified.
- var pubKey ssh.PublicKey
- if cert != nil {
- err = agent.Add(key, cert, "comment")
- pubKey = cert
- } else {
- err = agent.Add(key, nil, "comment")
- pubKey = signer.PublicKey()
- }
- if err != nil {
- t.Fatalf("insert(%T): %v", key, err)
- }
-
- // Did the key get inserted successfully?
- if keys, err := agent.List(); err != nil {
- t.Fatalf("List: %v", err)
- } else if len(keys) != 1 {
- t.Fatalf("got %v, want 1 key", keys)
- } else if keys[0].Comment != "comment" {
- t.Fatalf("key comment: got %v, want %v", keys[0].Comment, "comment")
- } else if !bytes.Equal(keys[0].Blob, pubKey.Marshal()) {
- t.Fatalf("key mismatch")
- }
-
- // Can the agent make a valid signature?
- data := []byte("hello")
- sig, err := agent.Sign(pubKey, data)
- if err != nil {
- t.Fatalf("Sign(%s): %v", pubKey.Type(), err)
- }
-
- if err := pubKey.Verify(data, sig); err != nil {
- t.Fatalf("Verify(%s): %v", pubKey.Type(), err)
- }
-}
-
-func TestAgent(t *testing.T) {
- for _, keyType := range []string{"rsa", "dsa", "ecdsa"} {
- testAgent(t, testPrivateKeys[keyType], nil)
- }
-}
-
-func TestCert(t *testing.T) {
- cert := &ssh.Certificate{
- Key: testPublicKeys["rsa"],
- ValidBefore: ssh.CertTimeInfinity,
- CertType: ssh.UserCert,
- }
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
-
- testAgent(t, testPrivateKeys["rsa"], cert)
-}
-
-// netPipe is analogous to net.Pipe, but it uses a real net.Conn, and
-// therefore is buffered (net.Pipe deadlocks if both sides start with
-// a write.)
-func netPipe() (net.Conn, net.Conn, error) {
- listener, err := net.Listen("tcp", "127.0.0.1:0")
- if err != nil {
- return nil, nil, err
- }
- defer listener.Close()
- c1, err := net.Dial("tcp", listener.Addr().String())
- if err != nil {
- return nil, nil, err
- }
-
- c2, err := listener.Accept()
- if err != nil {
- c1.Close()
- return nil, nil, err
- }
-
- return c1, c2, nil
-}
-
-func TestAuth(t *testing.T) {
- a, b, err := netPipe()
- if err != nil {
- t.Fatalf("netPipe: %v", err)
- }
-
- defer a.Close()
- defer b.Close()
-
- agent, _, cleanup := startAgent(t)
- defer cleanup()
-
- if err := agent.Add(testPrivateKeys["rsa"], nil, "comment"); err != nil {
- t.Errorf("Add: %v", err)
- }
-
- serverConf := ssh.ServerConfig{}
- serverConf.AddHostKey(testSigners["rsa"])
- serverConf.PublicKeyCallback = func(c ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
- if bytes.Equal(key.Marshal(), testPublicKeys["rsa"].Marshal()) {
- return nil, nil
- }
-
- return nil, errors.New("pubkey rejected")
- }
-
- go func() {
- conn, _, _, err := ssh.NewServerConn(a, &serverConf)
- if err != nil {
- t.Fatalf("Server: %v", err)
- }
- conn.Close()
- }()
-
- conf := ssh.ClientConfig{}
- conf.Auth = append(conf.Auth, ssh.PublicKeysCallback(agent.Signers))
- conn, _, _, err := ssh.NewClientConn(b, "", &conf)
- if err != nil {
- t.Fatalf("NewClientConn: %v", err)
- }
- conn.Close()
-}
-
-func TestLockClient(t *testing.T) {
- agent, _, cleanup := startAgent(t)
- defer cleanup()
- testLockAgent(agent, t)
-}
-
-func testLockAgent(agent Agent, t *testing.T) {
- if err := agent.Add(testPrivateKeys["rsa"], nil, "comment 1"); err != nil {
- t.Errorf("Add: %v", err)
- }
- if err := agent.Add(testPrivateKeys["dsa"], nil, "comment dsa"); err != nil {
- t.Errorf("Add: %v", err)
- }
- if keys, err := agent.List(); err != nil {
- t.Errorf("List: %v", err)
- } else if len(keys) != 2 {
- t.Errorf("Want 2 keys, got %v", keys)
- }
-
- passphrase := []byte("secret")
- if err := agent.Lock(passphrase); err != nil {
- t.Errorf("Lock: %v", err)
- }
-
- if keys, err := agent.List(); err != nil {
- t.Errorf("List: %v", err)
- } else if len(keys) != 0 {
- t.Errorf("Want 0 keys, got %v", keys)
- }
-
- signer, _ := ssh.NewSignerFromKey(testPrivateKeys["rsa"])
- if _, err := agent.Sign(signer.PublicKey(), []byte("hello")); err == nil {
- t.Fatalf("Sign did not fail")
- }
-
- if err := agent.Remove(signer.PublicKey()); err == nil {
- t.Fatalf("Remove did not fail")
- }
-
- if err := agent.RemoveAll(); err == nil {
- t.Fatalf("RemoveAll did not fail")
- }
-
- if err := agent.Unlock(nil); err == nil {
- t.Errorf("Unlock with wrong passphrase succeeded")
- }
- if err := agent.Unlock(passphrase); err != nil {
- t.Errorf("Unlock: %v", err)
- }
-
- if err := agent.Remove(signer.PublicKey()); err != nil {
- t.Fatalf("Remove: %v", err)
- }
-
- if keys, err := agent.List(); err != nil {
- t.Errorf("List: %v", err)
- } else if len(keys) != 1 {
- t.Errorf("Want 1 keys, got %v", keys)
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/agent/forward.go b/vendor/code.google.com/p/go.crypto/ssh/agent/forward.go
deleted file mode 100644
index fd24ba900..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/agent/forward.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package agent
-
-import (
- "errors"
- "io"
- "net"
- "sync"
-
- "golang.org/x/crypto/ssh"
-)
-
-// RequestAgentForwarding sets up agent forwarding for the session.
-// ForwardToAgent or ForwardToRemote should be called to route
-// the authentication requests.
-func RequestAgentForwarding(session *ssh.Session) error {
- ok, err := session.SendRequest("auth-agent-req@openssh.com", true, nil)
- if err != nil {
- return err
- }
- if !ok {
- return errors.New("forwarding request denied")
- }
- return nil
-}
-
-// ForwardToAgent routes authentication requests to the given keyring.
-func ForwardToAgent(client *ssh.Client, keyring Agent) error {
- channels := client.HandleChannelOpen(channelType)
- if channels == nil {
- return errors.New("agent: already have handler for " + channelType)
- }
-
- go func() {
- for ch := range channels {
- channel, reqs, err := ch.Accept()
- if err != nil {
- continue
- }
- go ssh.DiscardRequests(reqs)
- go func() {
- ServeAgent(keyring, channel)
- channel.Close()
- }()
- }
- }()
- return nil
-}
-
-const channelType = "auth-agent@openssh.com"
-
-// ForwardToRemote routes authentication requests to the ssh-agent
-// process serving on the given unix socket.
-func ForwardToRemote(client *ssh.Client, addr string) error {
- channels := client.HandleChannelOpen(channelType)
- if channels == nil {
- return errors.New("agent: already have handler for " + channelType)
- }
- conn, err := net.Dial("unix", addr)
- if err != nil {
- return err
- }
- conn.Close()
-
- go func() {
- for ch := range channels {
- channel, reqs, err := ch.Accept()
- if err != nil {
- continue
- }
- go ssh.DiscardRequests(reqs)
- go forwardUnixSocket(channel, addr)
- }
- }()
- return nil
-}
-
-func forwardUnixSocket(channel ssh.Channel, addr string) {
- conn, err := net.Dial("unix", addr)
- if err != nil {
- return
- }
-
- var wg sync.WaitGroup
- wg.Add(2)
- go func() {
- io.Copy(conn, channel)
- conn.(*net.UnixConn).CloseWrite()
- wg.Done()
- }()
- go func() {
- io.Copy(channel, conn)
- channel.CloseWrite()
- wg.Done()
- }()
-
- wg.Wait()
- conn.Close()
- channel.Close()
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/agent/keyring.go b/vendor/code.google.com/p/go.crypto/ssh/agent/keyring.go
deleted file mode 100644
index 831a5b9ae..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/agent/keyring.go
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package agent
-
-import (
- "bytes"
- "crypto/rand"
- "crypto/subtle"
- "errors"
- "fmt"
- "sync"
-
- "golang.org/x/crypto/ssh"
-)
-
-type privKey struct {
- signer ssh.Signer
- comment string
-}
-
-type keyring struct {
- mu sync.Mutex
- keys []privKey
-
- locked bool
- passphrase []byte
-}
-
-var errLocked = errors.New("agent: locked")
-
-// NewKeyring returns an Agent that holds keys in memory. It is safe
-// for concurrent use by multiple goroutines.
-func NewKeyring() Agent {
- return &keyring{}
-}
-
-// RemoveAll removes all identities.
-func (r *keyring) RemoveAll() error {
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.locked {
- return errLocked
- }
-
- r.keys = nil
- return nil
-}
-
-// Remove removes all identities with the given public key.
-func (r *keyring) Remove(key ssh.PublicKey) error {
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.locked {
- return errLocked
- }
-
- want := key.Marshal()
- found := false
- for i := 0; i < len(r.keys); {
- if bytes.Equal(r.keys[i].signer.PublicKey().Marshal(), want) {
- found = true
- r.keys[i] = r.keys[len(r.keys)-1]
- r.keys = r.keys[len(r.keys)-1:]
- continue
- } else {
- i++
- }
- }
-
- if !found {
- return errors.New("agent: key not found")
- }
- return nil
-}
-
-// Lock locks the agent. Sign and Remove will fail, and List will empty an empty list.
-func (r *keyring) Lock(passphrase []byte) error {
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.locked {
- return errLocked
- }
-
- r.locked = true
- r.passphrase = passphrase
- return nil
-}
-
-// Unlock undoes the effect of Lock
-func (r *keyring) Unlock(passphrase []byte) error {
- r.mu.Lock()
- defer r.mu.Unlock()
- if !r.locked {
- return errors.New("agent: not locked")
- }
- if len(passphrase) != len(r.passphrase) || 1 != subtle.ConstantTimeCompare(passphrase, r.passphrase) {
- return fmt.Errorf("agent: incorrect passphrase")
- }
-
- r.locked = false
- r.passphrase = nil
- return nil
-}
-
-// List returns the identities known to the agent.
-func (r *keyring) List() ([]*Key, error) {
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.locked {
- // section 2.7: locked agents return empty.
- return nil, nil
- }
-
- var ids []*Key
- for _, k := range r.keys {
- pub := k.signer.PublicKey()
- ids = append(ids, &Key{
- Format: pub.Type(),
- Blob: pub.Marshal(),
- Comment: k.comment})
- }
- return ids, nil
-}
-
-// Insert adds a private key to the keyring. If a certificate
-// is given, that certificate is added as public key.
-func (r *keyring) Add(priv interface{}, cert *ssh.Certificate, comment string) error {
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.locked {
- return errLocked
- }
- signer, err := ssh.NewSignerFromKey(priv)
-
- if err != nil {
- return err
- }
-
- if cert != nil {
- signer, err = ssh.NewCertSigner(cert, signer)
- if err != nil {
- return err
- }
- }
-
- r.keys = append(r.keys, privKey{signer, comment})
-
- return nil
-}
-
-// Sign returns a signature for the data.
-func (r *keyring) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) {
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.locked {
- return nil, errLocked
- }
-
- wanted := key.Marshal()
- for _, k := range r.keys {
- if bytes.Equal(k.signer.PublicKey().Marshal(), wanted) {
- return k.signer.Sign(rand.Reader, data)
- }
- }
- return nil, errors.New("not found")
-}
-
-// Signers returns signers for all the known keys.
-func (r *keyring) Signers() ([]ssh.Signer, error) {
- r.mu.Lock()
- defer r.mu.Unlock()
- if r.locked {
- return nil, errLocked
- }
-
- s := make([]ssh.Signer, len(r.keys))
- for _, k := range r.keys {
- s = append(s, k.signer)
- }
- return s, nil
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/agent/server.go b/vendor/code.google.com/p/go.crypto/ssh/agent/server.go
deleted file mode 100644
index be9df0eb0..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/agent/server.go
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package agent
-
-import (
- "crypto/rsa"
- "encoding/binary"
- "fmt"
- "io"
- "log"
- "math/big"
-
- "golang.org/x/crypto/ssh"
-)
-
-// Server wraps an Agent and uses it to implement the agent side of
-// the SSH-agent, wire protocol.
-type server struct {
- agent Agent
-}
-
-func (s *server) processRequestBytes(reqData []byte) []byte {
- rep, err := s.processRequest(reqData)
- if err != nil {
- if err != errLocked {
- // TODO(hanwen): provide better logging interface?
- log.Printf("agent %d: %v", reqData[0], err)
- }
- return []byte{agentFailure}
- }
-
- if err == nil && rep == nil {
- return []byte{agentSuccess}
- }
-
- return ssh.Marshal(rep)
-}
-
-func marshalKey(k *Key) []byte {
- var record struct {
- Blob []byte
- Comment string
- }
- record.Blob = k.Marshal()
- record.Comment = k.Comment
-
- return ssh.Marshal(&record)
-}
-
-type agentV1IdentityMsg struct {
- Numkeys uint32 `sshtype:"2"`
-}
-
-type agentRemoveIdentityMsg struct {
- KeyBlob []byte `sshtype:"18"`
-}
-
-type agentLockMsg struct {
- Passphrase []byte `sshtype:"22"`
-}
-
-type agentUnlockMsg struct {
- Passphrase []byte `sshtype:"23"`
-}
-
-func (s *server) processRequest(data []byte) (interface{}, error) {
- switch data[0] {
- case agentRequestV1Identities:
- return &agentV1IdentityMsg{0}, nil
- case agentRemoveIdentity:
- var req agentRemoveIdentityMsg
- if err := ssh.Unmarshal(data, &req); err != nil {
- return nil, err
- }
-
- var wk wireKey
- if err := ssh.Unmarshal(req.KeyBlob, &wk); err != nil {
- return nil, err
- }
-
- return nil, s.agent.Remove(&Key{Format: wk.Format, Blob: req.KeyBlob})
-
- case agentRemoveAllIdentities:
- return nil, s.agent.RemoveAll()
-
- case agentLock:
- var req agentLockMsg
- if err := ssh.Unmarshal(data, &req); err != nil {
- return nil, err
- }
-
- return nil, s.agent.Lock(req.Passphrase)
-
- case agentUnlock:
- var req agentLockMsg
- if err := ssh.Unmarshal(data, &req); err != nil {
- return nil, err
- }
- return nil, s.agent.Unlock(req.Passphrase)
-
- case agentSignRequest:
- var req signRequestAgentMsg
- if err := ssh.Unmarshal(data, &req); err != nil {
- return nil, err
- }
-
- var wk wireKey
- if err := ssh.Unmarshal(req.KeyBlob, &wk); err != nil {
- return nil, err
- }
-
- k := &Key{
- Format: wk.Format,
- Blob: req.KeyBlob,
- }
-
- sig, err := s.agent.Sign(k, req.Data) // TODO(hanwen): flags.
- if err != nil {
- return nil, err
- }
- return &signResponseAgentMsg{SigBlob: ssh.Marshal(sig)}, nil
- case agentRequestIdentities:
- keys, err := s.agent.List()
- if err != nil {
- return nil, err
- }
-
- rep := identitiesAnswerAgentMsg{
- NumKeys: uint32(len(keys)),
- }
- for _, k := range keys {
- rep.Keys = append(rep.Keys, marshalKey(k)...)
- }
- return rep, nil
- case agentAddIdentity:
- return nil, s.insertIdentity(data)
- }
-
- return nil, fmt.Errorf("unknown opcode %d", data[0])
-}
-
-func (s *server) insertIdentity(req []byte) error {
- var record struct {
- Type string `sshtype:"17"`
- Rest []byte `ssh:"rest"`
- }
- if err := ssh.Unmarshal(req, &record); err != nil {
- return err
- }
-
- switch record.Type {
- case ssh.KeyAlgoRSA:
- var k rsaKeyMsg
- if err := ssh.Unmarshal(req, &k); err != nil {
- return err
- }
-
- priv := rsa.PrivateKey{
- PublicKey: rsa.PublicKey{
- E: int(k.E.Int64()),
- N: k.N,
- },
- D: k.D,
- Primes: []*big.Int{k.P, k.Q},
- }
- priv.Precompute()
-
- return s.agent.Add(&priv, nil, k.Comments)
- }
- return fmt.Errorf("not implemented: %s", record.Type)
-}
-
-// ServeAgent serves the agent protocol on the given connection. It
-// returns when an I/O error occurs.
-func ServeAgent(agent Agent, c io.ReadWriter) error {
- s := &server{agent}
-
- var length [4]byte
- for {
- if _, err := io.ReadFull(c, length[:]); err != nil {
- return err
- }
- l := binary.BigEndian.Uint32(length[:])
- if l > maxAgentResponseBytes {
- // We also cap requests.
- return fmt.Errorf("agent: request too large: %d", l)
- }
-
- req := make([]byte, l)
- if _, err := io.ReadFull(c, req); err != nil {
- return err
- }
-
- repData := s.processRequestBytes(req)
- if len(repData) > maxAgentResponseBytes {
- return fmt.Errorf("agent: reply too large: %d bytes", len(repData))
- }
-
- binary.BigEndian.PutUint32(length[:], uint32(len(repData)))
- if _, err := c.Write(length[:]); err != nil {
- return err
- }
- if _, err := c.Write(repData); err != nil {
- return err
- }
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/agent/server_test.go b/vendor/code.google.com/p/go.crypto/ssh/agent/server_test.go
deleted file mode 100644
index def5f8ccc..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/agent/server_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package agent
-
-import (
- "testing"
-
- "golang.org/x/crypto/ssh"
-)
-
-func TestServer(t *testing.T) {
- c1, c2, err := netPipe()
- if err != nil {
- t.Fatalf("netPipe: %v", err)
- }
- defer c1.Close()
- defer c2.Close()
- client := NewClient(c1)
-
- go ServeAgent(NewKeyring(), c2)
-
- testAgentInterface(t, client, testPrivateKeys["rsa"], nil)
-}
-
-func TestLockServer(t *testing.T) {
- testLockAgent(NewKeyring(), t)
-}
-
-func TestSetupForwardAgent(t *testing.T) {
- a, b, err := netPipe()
- if err != nil {
- t.Fatalf("netPipe: %v", err)
- }
-
- defer a.Close()
- defer b.Close()
-
- _, socket, cleanup := startAgent(t)
- defer cleanup()
-
- serverConf := ssh.ServerConfig{
- NoClientAuth: true,
- }
- serverConf.AddHostKey(testSigners["rsa"])
- incoming := make(chan *ssh.ServerConn, 1)
- go func() {
- conn, _, _, err := ssh.NewServerConn(a, &serverConf)
- if err != nil {
- t.Fatalf("Server: %v", err)
- }
- incoming <- conn
- }()
-
- conf := ssh.ClientConfig{}
- conn, chans, reqs, err := ssh.NewClientConn(b, "", &conf)
- if err != nil {
- t.Fatalf("NewClientConn: %v", err)
- }
- client := ssh.NewClient(conn, chans, reqs)
-
- if err := ForwardToRemote(client, socket); err != nil {
- t.Fatalf("SetupForwardAgent: %v", err)
- }
-
- server := <-incoming
- ch, reqs, err := server.OpenChannel(channelType, nil)
- if err != nil {
- t.Fatalf("OpenChannel(%q): %v", channelType, err)
- }
- go ssh.DiscardRequests(reqs)
-
- agentClient := NewClient(ch)
- testAgentInterface(t, agentClient, testPrivateKeys["rsa"], nil)
- conn.Close()
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/agent/testdata_test.go b/vendor/code.google.com/p/go.crypto/ssh/agent/testdata_test.go
deleted file mode 100644
index b7a8781e1..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/agent/testdata_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// IMPLEMENTOR NOTE: To avoid a package loop, this file is in three places:
-// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three
-// instances.
-
-package agent
-
-import (
- "crypto/rand"
- "fmt"
-
- "golang.org/x/crypto/ssh"
- "golang.org/x/crypto/ssh/testdata"
-)
-
-var (
- testPrivateKeys map[string]interface{}
- testSigners map[string]ssh.Signer
- testPublicKeys map[string]ssh.PublicKey
-)
-
-func init() {
- var err error
-
- n := len(testdata.PEMBytes)
- testPrivateKeys = make(map[string]interface{}, n)
- testSigners = make(map[string]ssh.Signer, n)
- testPublicKeys = make(map[string]ssh.PublicKey, n)
- for t, k := range testdata.PEMBytes {
- testPrivateKeys[t], err = ssh.ParseRawPrivateKey(k)
- if err != nil {
- panic(fmt.Sprintf("Unable to parse test key %s: %v", t, err))
- }
- testSigners[t], err = ssh.NewSignerFromKey(testPrivateKeys[t])
- if err != nil {
- panic(fmt.Sprintf("Unable to create signer for test key %s: %v", t, err))
- }
- testPublicKeys[t] = testSigners[t].PublicKey()
- }
-
- // Create a cert and sign it for use in tests.
- testCert := &ssh.Certificate{
- Nonce: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
- ValidPrincipals: []string{"gopher1", "gopher2"}, // increases test coverage
- ValidAfter: 0, // unix epoch
- ValidBefore: ssh.CertTimeInfinity, // The end of currently representable time.
- Reserved: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
- Key: testPublicKeys["ecdsa"],
- SignatureKey: testPublicKeys["rsa"],
- Permissions: ssh.Permissions{
- CriticalOptions: map[string]string{},
- Extensions: map[string]string{},
- },
- }
- testCert.SignCert(rand.Reader, testSigners["rsa"])
- testPrivateKeys["cert"] = testPrivateKeys["ecdsa"]
- testSigners["cert"], err = ssh.NewCertSigner(testCert, testSigners["ecdsa"])
- if err != nil {
- panic(fmt.Sprintf("Unable to create certificate signer: %v", err))
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/benchmark_test.go b/vendor/code.google.com/p/go.crypto/ssh/benchmark_test.go
deleted file mode 100644
index d9f7eb9b6..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/benchmark_test.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssh
-
-import (
- "errors"
- "io"
- "net"
- "testing"
-)
-
-type server struct {
- *ServerConn
- chans <-chan NewChannel
-}
-
-func newServer(c net.Conn, conf *ServerConfig) (*server, error) {
- sconn, chans, reqs, err := NewServerConn(c, conf)
- if err != nil {
- return nil, err
- }
- go DiscardRequests(reqs)
- return &server{sconn, chans}, nil
-}
-
-func (s *server) Accept() (NewChannel, error) {
- n, ok := <-s.chans
- if !ok {
- return nil, io.EOF
- }
- return n, nil
-}
-
-func sshPipe() (Conn, *server, error) {
- c1, c2, err := netPipe()
- if err != nil {
- return nil, nil, err
- }
-
- clientConf := ClientConfig{
- User: "user",
- }
- serverConf := ServerConfig{
- NoClientAuth: true,
- }
- serverConf.AddHostKey(testSigners["ecdsa"])
- done := make(chan *server, 1)
- go func() {
- server, err := newServer(c2, &serverConf)
- if err != nil {
- done <- nil
- }
- done <- server
- }()
-
- client, _, reqs, err := NewClientConn(c1, "", &clientConf)
- if err != nil {
- return nil, nil, err
- }
-
- server := <-done
- if server == nil {
- return nil, nil, errors.New("server handshake failed.")
- }
- go DiscardRequests(reqs)
-
- return client, server, nil
-}
-
-func BenchmarkEndToEnd(b *testing.B) {
- b.StopTimer()
-
- client, server, err := sshPipe()
- if err != nil {
- b.Fatalf("sshPipe: %v", err)
- }
-
- defer client.Close()
- defer server.Close()
-
- size := (1 << 20)
- input := make([]byte, size)
- output := make([]byte, size)
- b.SetBytes(int64(size))
- done := make(chan int, 1)
-
- go func() {
- newCh, err := server.Accept()
- if err != nil {
- b.Fatalf("Client: %v", err)
- }
- ch, incoming, err := newCh.Accept()
- go DiscardRequests(incoming)
- for i := 0; i < b.N; i++ {
- if _, err := io.ReadFull(ch, output); err != nil {
- b.Fatalf("ReadFull: %v", err)
- }
- }
- ch.Close()
- done <- 1
- }()
-
- ch, in, err := client.OpenChannel("speed", nil)
- if err != nil {
- b.Fatalf("OpenChannel: %v", err)
- }
- go DiscardRequests(in)
-
- b.ResetTimer()
- b.StartTimer()
- for i := 0; i < b.N; i++ {
- if _, err := ch.Write(input); err != nil {
- b.Fatalf("WriteFull: %v", err)
- }
- }
- ch.Close()
- b.StopTimer()
-
- <-done
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/buffer.go b/vendor/code.google.com/p/go.crypto/ssh/buffer.go
index 6931b5114..601dad342 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/buffer.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/buffer.go
@@ -43,29 +43,29 @@ func newBuffer() *buffer {
// buf must not be modified after the call to write.
func (b *buffer) write(buf []byte) {
b.Cond.L.Lock()
+ defer b.Cond.L.Unlock()
e := &element{buf: buf}
b.tail.next = e
b.tail = e
b.Cond.Signal()
- b.Cond.L.Unlock()
}
// eof closes the buffer. Reads from the buffer once all
// the data has been consumed will receive os.EOF.
func (b *buffer) eof() error {
b.Cond.L.Lock()
+ defer b.Cond.L.Unlock()
b.closed = true
b.Cond.Signal()
- b.Cond.L.Unlock()
return nil
}
-// Read reads data from the internal buffer in buf. Reads will block
-// if no data is available, or until the buffer is closed.
+// Read reads data from the internal buffer in buf.
+// Reads will block if no data is available, or until
+// the buffer is closed.
func (b *buffer) Read(buf []byte) (n int, err error) {
b.Cond.L.Lock()
defer b.Cond.L.Unlock()
-
for len(buf) > 0 {
// if there is data in b.head, copy it
if len(b.head.buf) > 0 {
@@ -79,12 +79,10 @@ func (b *buffer) Read(buf []byte) (n int, err error) {
b.head = b.head.next
continue
}
-
// if at least one byte has been copied, return
if n > 0 {
break
}
-
// if nothing was read, and there is nothing outstanding
// check to see if the buffer is closed.
if b.closed {
diff --git a/vendor/code.google.com/p/go.crypto/ssh/buffer_test.go b/vendor/code.google.com/p/go.crypto/ssh/buffer_test.go
index d5781cb3d..135c4aec0 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/buffer_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/buffer_test.go
@@ -9,33 +9,33 @@ import (
"testing"
)
-var alphabet = []byte("abcdefghijklmnopqrstuvwxyz")
+var BYTES = []byte("abcdefghijklmnopqrstuvwxyz")
func TestBufferReadwrite(t *testing.T) {
b := newBuffer()
- b.write(alphabet[:10])
+ b.write(BYTES[:10])
r, _ := b.Read(make([]byte, 10))
if r != 10 {
t.Fatalf("Expected written == read == 10, written: 10, read %d", r)
}
b = newBuffer()
- b.write(alphabet[:5])
+ b.write(BYTES[:5])
r, _ = b.Read(make([]byte, 10))
if r != 5 {
t.Fatalf("Expected written == read == 5, written: 5, read %d", r)
}
b = newBuffer()
- b.write(alphabet[:10])
+ b.write(BYTES[:10])
r, _ = b.Read(make([]byte, 5))
if r != 5 {
t.Fatalf("Expected written == 10, read == 5, written: 10, read %d", r)
}
b = newBuffer()
- b.write(alphabet[:5])
- b.write(alphabet[5:15])
+ b.write(BYTES[:5])
+ b.write(BYTES[5:15])
r, _ = b.Read(make([]byte, 10))
r2, _ := b.Read(make([]byte, 10))
if r != 10 || r2 != 5 || 15 != r+r2 {
@@ -45,14 +45,14 @@ func TestBufferReadwrite(t *testing.T) {
func TestBufferClose(t *testing.T) {
b := newBuffer()
- b.write(alphabet[:10])
+ b.write(BYTES[:10])
b.eof()
_, err := b.Read(make([]byte, 5))
if err != nil {
t.Fatal("expected read of 5 to not return EOF")
}
b = newBuffer()
- b.write(alphabet[:10])
+ b.write(BYTES[:10])
b.eof()
r, err := b.Read(make([]byte, 5))
r2, err2 := b.Read(make([]byte, 10))
@@ -61,7 +61,7 @@ func TestBufferClose(t *testing.T) {
}
b = newBuffer()
- b.write(alphabet[:10])
+ b.write(BYTES[:10])
b.eof()
r, err = b.Read(make([]byte, 5))
r2, err2 = b.Read(make([]byte, 10))
diff --git a/vendor/code.google.com/p/go.crypto/ssh/certs.go b/vendor/code.google.com/p/go.crypto/ssh/certs.go
index 9962ff0f3..d958f3108 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/certs.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/certs.go
@@ -5,12 +5,6 @@
package ssh
import (
- "bytes"
- "errors"
- "fmt"
- "io"
- "net"
- "sort"
"time"
)
@@ -24,348 +18,67 @@ const (
CertAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com"
)
-// Certificate types distinguish between host and user
-// certificates. The values can be set in the CertType field of
-// Certificate.
+// Certificate types are used to specify whether a certificate is for identification
+// of a user or a host. Current identities are defined in [PROTOCOL.certkeys].
const (
UserCert = 1
HostCert = 2
)
-// Signature represents a cryptographic signature.
-type Signature struct {
+type signature struct {
Format string
Blob []byte
}
-// CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that
-// a certificate does not expire.
-const CertTimeInfinity = 1<<64 - 1
+type tuple struct {
+ Name string
+ Data string
+}
-// An Certificate represents an OpenSSH certificate as defined in
+const (
+ maxUint64 = 1<<64 - 1
+ maxInt64 = 1<<63 - 1
+)
+
+// CertTime represents an unsigned 64-bit time value in seconds starting from
+// UNIX epoch. We use CertTime instead of time.Time in order to properly handle
+// the "infinite" time value ^0, which would become negative when expressed as
+// an int64.
+type CertTime uint64
+
+func (ct CertTime) Time() time.Time {
+ if ct > maxInt64 {
+ return time.Unix(maxInt64, 0)
+ }
+ return time.Unix(int64(ct), 0)
+}
+
+func (ct CertTime) IsInfinite() bool {
+ return ct == maxUint64
+}
+
+// An OpenSSHCertV01 represents an OpenSSH certificate as defined in
// [PROTOCOL.certkeys]?rev=1.8.
-type Certificate struct {
- Nonce []byte
- Key PublicKey
- Serial uint64
- CertType uint32
- KeyId string
- ValidPrincipals []string
- ValidAfter uint64
- ValidBefore uint64
- Permissions
- Reserved []byte
- SignatureKey PublicKey
- Signature *Signature
+type OpenSSHCertV01 struct {
+ Nonce []byte
+ Key PublicKey
+ Serial uint64
+ Type uint32
+ KeyId string
+ ValidPrincipals []string
+ ValidAfter, ValidBefore CertTime
+ CriticalOptions []tuple
+ Extensions []tuple
+ Reserved []byte
+ SignatureKey PublicKey
+ Signature *signature
}
-// genericCertData holds the key-independent part of the certificate data.
-// Overall, certificates contain an nonce, public key fields and
-// key-independent fields.
-type genericCertData struct {
- Serial uint64
- CertType uint32
- KeyId string
- ValidPrincipals []byte
- ValidAfter uint64
- ValidBefore uint64
- CriticalOptions []byte
- Extensions []byte
- Reserved []byte
- SignatureKey []byte
- Signature []byte
-}
-
-func marshalStringList(namelist []string) []byte {
- var to []byte
- for _, name := range namelist {
- s := struct{ N string }{name}
- to = append(to, Marshal(&s)...)
- }
- return to
-}
-
-func marshalTuples(tups map[string]string) []byte {
- keys := make([]string, 0, len(tups))
- for k := range tups {
- keys = append(keys, k)
- }
- sort.Strings(keys)
-
- var r []byte
- for _, k := range keys {
- s := struct{ K, V string }{k, tups[k]}
- r = append(r, Marshal(&s)...)
- }
- return r
-}
-
-func parseTuples(in []byte) (map[string]string, error) {
- tups := map[string]string{}
- var lastKey string
- var haveLastKey bool
-
- for len(in) > 0 {
- nameBytes, rest, ok := parseString(in)
- if !ok {
- return nil, errShortRead
- }
- data, rest, ok := parseString(rest)
- if !ok {
- return nil, errShortRead
- }
- name := string(nameBytes)
-
- // according to [PROTOCOL.certkeys], the names must be in
- // lexical order.
- if haveLastKey && name <= lastKey {
- return nil, fmt.Errorf("ssh: certificate options are not in lexical order")
- }
- lastKey, haveLastKey = name, true
-
- tups[name] = string(data)
- in = rest
- }
- return tups, nil
-}
-
-func parseCert(in []byte, privAlgo string) (*Certificate, error) {
- nonce, rest, ok := parseString(in)
- if !ok {
- return nil, errShortRead
- }
-
- key, rest, err := parsePubKey(rest, privAlgo)
- if err != nil {
- return nil, err
- }
-
- var g genericCertData
- if err := Unmarshal(rest, &g); err != nil {
- return nil, err
- }
-
- c := &Certificate{
- Nonce: nonce,
- Key: key,
- Serial: g.Serial,
- CertType: g.CertType,
- KeyId: g.KeyId,
- ValidAfter: g.ValidAfter,
- ValidBefore: g.ValidBefore,
- }
-
- for principals := g.ValidPrincipals; len(principals) > 0; {
- principal, rest, ok := parseString(principals)
- if !ok {
- return nil, errShortRead
- }
- c.ValidPrincipals = append(c.ValidPrincipals, string(principal))
- principals = rest
- }
-
- c.CriticalOptions, err = parseTuples(g.CriticalOptions)
- if err != nil {
- return nil, err
- }
- c.Extensions, err = parseTuples(g.Extensions)
- if err != nil {
- return nil, err
- }
- c.Reserved = g.Reserved
- k, err := ParsePublicKey(g.SignatureKey)
- if err != nil {
- return nil, err
- }
-
- c.SignatureKey = k
- c.Signature, rest, ok = parseSignatureBody(g.Signature)
- if !ok || len(rest) > 0 {
- return nil, errors.New("ssh: signature parse error")
- }
-
- return c, nil
-}
-
-type openSSHCertSigner struct {
- pub *Certificate
- signer Signer
-}
-
-// NewCertSigner returns a Signer that signs with the given Certificate, whose
-// private key is held by signer. It returns an error if the public key in cert
-// doesn't match the key used by signer.
-func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) {
- if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 {
- return nil, errors.New("ssh: signer and cert have different public key")
- }
-
- return &openSSHCertSigner{cert, signer}, nil
-}
-
-func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) {
- return s.signer.Sign(rand, data)
-}
-
-func (s *openSSHCertSigner) PublicKey() PublicKey {
- return s.pub
-}
-
-const sourceAddressCriticalOption = "source-address"
-
-// CertChecker does the work of verifying a certificate. Its methods
-// can be plugged into ClientConfig.HostKeyCallback and
-// ServerConfig.PublicKeyCallback. For the CertChecker to work,
-// minimally, the IsAuthority callback should be set.
-type CertChecker struct {
- // SupportedCriticalOptions lists the CriticalOptions that the
- // server application layer understands. These are only used
- // for user certificates.
- SupportedCriticalOptions []string
-
- // IsAuthority should return true if the key is recognized as
- // an authority. This allows for certificates to be signed by other
- // certificates.
- IsAuthority func(auth PublicKey) bool
-
- // Clock is used for verifying time stamps. If nil, time.Now
- // is used.
- Clock func() time.Time
-
- // UserKeyFallback is called when CertChecker.Authenticate encounters a
- // public key that is not a certificate. It must implement validation
- // of user keys or else, if nil, all such keys are rejected.
- UserKeyFallback func(conn ConnMetadata, key PublicKey) (*Permissions, error)
-
- // HostKeyFallback is called when CertChecker.CheckHostKey encounters a
- // public key that is not a certificate. It must implement host key
- // validation or else, if nil, all such keys are rejected.
- HostKeyFallback func(addr string, remote net.Addr, key PublicKey) error
-
- // IsRevoked is called for each certificate so that revocation checking
- // can be implemented. It should return true if the given certificate
- // is revoked and false otherwise. If nil, no certificates are
- // considered to have been revoked.
- IsRevoked func(cert *Certificate) bool
-}
-
-// CheckHostKey checks a host key certificate. This method can be
-// plugged into ClientConfig.HostKeyCallback.
-func (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) error {
- cert, ok := key.(*Certificate)
- if !ok {
- if c.HostKeyFallback != nil {
- return c.HostKeyFallback(addr, remote, key)
- }
- return errors.New("ssh: non-certificate host key")
- }
- if cert.CertType != HostCert {
- return fmt.Errorf("ssh: certificate presented as a host key has type %d", cert.CertType)
- }
-
- return c.CheckCert(addr, cert)
-}
-
-// Authenticate checks a user certificate. Authenticate can be used as
-// a value for ServerConfig.PublicKeyCallback.
-func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permissions, error) {
- cert, ok := pubKey.(*Certificate)
- if !ok {
- if c.UserKeyFallback != nil {
- return c.UserKeyFallback(conn, pubKey)
- }
- return nil, errors.New("ssh: normal key pairs not accepted")
- }
-
- if cert.CertType != UserCert {
- return nil, fmt.Errorf("ssh: cert has type %d", cert.CertType)
- }
-
- if err := c.CheckCert(conn.User(), cert); err != nil {
- return nil, err
- }
-
- return &cert.Permissions, nil
-}
-
-// CheckCert checks CriticalOptions, ValidPrincipals, revocation, timestamp and
-// the signature of the certificate.
-func (c *CertChecker) CheckCert(principal string, cert *Certificate) error {
- if c.IsRevoked != nil && c.IsRevoked(cert) {
- return fmt.Errorf("ssh: certicate serial %d revoked", cert.Serial)
- }
-
- for opt, _ := range cert.CriticalOptions {
- // sourceAddressCriticalOption will be enforced by
- // serverAuthenticate
- if opt == sourceAddressCriticalOption {
- continue
- }
-
- found := false
- for _, supp := range c.SupportedCriticalOptions {
- if supp == opt {
- found = true
- break
- }
- }
- if !found {
- return fmt.Errorf("ssh: unsupported critical option %q in certificate", opt)
- }
- }
-
- if len(cert.ValidPrincipals) > 0 {
- // By default, certs are valid for all users/hosts.
- found := false
- for _, p := range cert.ValidPrincipals {
- if p == principal {
- found = true
- break
- }
- }
- if !found {
- return fmt.Errorf("ssh: principal %q not in the set of valid principals for given certificate: %q", principal, cert.ValidPrincipals)
- }
- }
-
- if !c.IsAuthority(cert.SignatureKey) {
- return fmt.Errorf("ssh: certificate signed by unrecognized authority")
- }
-
- clock := c.Clock
- if clock == nil {
- clock = time.Now
- }
-
- unixNow := clock().Unix()
- if after := int64(cert.ValidAfter); after < 0 || unixNow < int64(cert.ValidAfter) {
- return fmt.Errorf("ssh: cert is not yet valid")
- }
- if before := int64(cert.ValidBefore); cert.ValidBefore != CertTimeInfinity && (unixNow >= before || before < 0) {
- return fmt.Errorf("ssh: cert has expired")
- }
- if err := cert.SignatureKey.Verify(cert.bytesForSigning(), cert.Signature); err != nil {
- return fmt.Errorf("ssh: certificate signature does not verify")
- }
-
- return nil
-}
-
-// SignCert sets c.SignatureKey to the authority's public key and stores a
-// Signature, by authority, in the certificate.
-func (c *Certificate) SignCert(rand io.Reader, authority Signer) error {
- c.Nonce = make([]byte, 32)
- if _, err := io.ReadFull(rand, c.Nonce); err != nil {
- return err
- }
- c.SignatureKey = authority.PublicKey()
-
- sig, err := authority.Sign(rand, c.bytesForSigning())
- if err != nil {
- return err
- }
- c.Signature = sig
- return nil
+// validateOpenSSHCertV01Signature uses the cert's SignatureKey to verify that
+// the cert's Signature.Blob is the result of signing the cert bytes starting
+// from the algorithm string and going up to and including the SignatureKey.
+func validateOpenSSHCertV01Signature(cert *OpenSSHCertV01) bool {
+ return cert.SignatureKey.Verify(cert.BytesForSigning(), cert.Signature.Blob)
}
var certAlgoNames = map[string]string{
@@ -387,69 +100,260 @@ func certToPrivAlgo(algo string) string {
panic("unknown cert algorithm")
}
-func (cert *Certificate) bytesForSigning() []byte {
- c2 := *cert
- c2.Signature = nil
- out := c2.Marshal()
- // Drop trailing signature length.
- return out[:len(out)-4]
+func (cert *OpenSSHCertV01) marshal(includeAlgo, includeSig bool) []byte {
+ algoName := cert.PublicKeyAlgo()
+ pubKey := cert.Key.Marshal()
+ sigKey := MarshalPublicKey(cert.SignatureKey)
+
+ var length int
+ if includeAlgo {
+ length += stringLength(len(algoName))
+ }
+ length += stringLength(len(cert.Nonce))
+ length += len(pubKey)
+ length += 8 // Length of Serial
+ length += 4 // Length of Type
+ length += stringLength(len(cert.KeyId))
+ length += lengthPrefixedNameListLength(cert.ValidPrincipals)
+ length += 8 // Length of ValidAfter
+ length += 8 // Length of ValidBefore
+ length += tupleListLength(cert.CriticalOptions)
+ length += tupleListLength(cert.Extensions)
+ length += stringLength(len(cert.Reserved))
+ length += stringLength(len(sigKey))
+ if includeSig {
+ length += signatureLength(cert.Signature)
+ }
+
+ ret := make([]byte, length)
+ r := ret
+ if includeAlgo {
+ r = marshalString(r, []byte(algoName))
+ }
+ r = marshalString(r, cert.Nonce)
+ copy(r, pubKey)
+ r = r[len(pubKey):]
+ r = marshalUint64(r, cert.Serial)
+ r = marshalUint32(r, cert.Type)
+ r = marshalString(r, []byte(cert.KeyId))
+ r = marshalLengthPrefixedNameList(r, cert.ValidPrincipals)
+ r = marshalUint64(r, uint64(cert.ValidAfter))
+ r = marshalUint64(r, uint64(cert.ValidBefore))
+ r = marshalTupleList(r, cert.CriticalOptions)
+ r = marshalTupleList(r, cert.Extensions)
+ r = marshalString(r, cert.Reserved)
+ r = marshalString(r, sigKey)
+ if includeSig {
+ r = marshalSignature(r, cert.Signature)
+ }
+ if len(r) > 0 {
+ panic("ssh: internal error, marshaling certificate did not fill the entire buffer")
+ }
+ return ret
}
-// Marshal serializes c into OpenSSH's wire format. It is part of the
-// PublicKey interface.
-func (c *Certificate) Marshal() []byte {
- generic := genericCertData{
- Serial: c.Serial,
- CertType: c.CertType,
- KeyId: c.KeyId,
- ValidPrincipals: marshalStringList(c.ValidPrincipals),
- ValidAfter: uint64(c.ValidAfter),
- ValidBefore: uint64(c.ValidBefore),
- CriticalOptions: marshalTuples(c.CriticalOptions),
- Extensions: marshalTuples(c.Extensions),
- Reserved: c.Reserved,
- SignatureKey: c.SignatureKey.Marshal(),
- }
- if c.Signature != nil {
- generic.Signature = Marshal(c.Signature)
- }
- genericBytes := Marshal(&generic)
- keyBytes := c.Key.Marshal()
- _, keyBytes, _ = parseString(keyBytes)
- prefix := Marshal(&struct {
- Name string
- Nonce []byte
- Key []byte `ssh:"rest"`
- }{c.Type(), c.Nonce, keyBytes})
-
- result := make([]byte, 0, len(prefix)+len(genericBytes))
- result = append(result, prefix...)
- result = append(result, genericBytes...)
- return result
+func (cert *OpenSSHCertV01) BytesForSigning() []byte {
+ return cert.marshal(true, false)
}
-// Type returns the key name. It is part of the PublicKey interface.
-func (c *Certificate) Type() string {
- algo, ok := certAlgoNames[c.Key.Type()]
+func (cert *OpenSSHCertV01) Marshal() []byte {
+ return cert.marshal(false, true)
+}
+
+func (c *OpenSSHCertV01) PublicKeyAlgo() string {
+ algo, ok := certAlgoNames[c.Key.PublicKeyAlgo()]
if !ok {
panic("unknown cert key type")
}
return algo
}
-// Verify verifies a signature against the certificate's public
-// key. It is part of the PublicKey interface.
-func (c *Certificate) Verify(data []byte, sig *Signature) error {
+func (c *OpenSSHCertV01) PrivateKeyAlgo() string {
+ return c.Key.PrivateKeyAlgo()
+}
+
+func (c *OpenSSHCertV01) Verify(data []byte, sig []byte) bool {
return c.Key.Verify(data, sig)
}
-func parseSignatureBody(in []byte) (out *Signature, rest []byte, ok bool) {
- format, in, ok := parseString(in)
+func parseOpenSSHCertV01(in []byte, algo string) (out *OpenSSHCertV01, rest []byte, ok bool) {
+ cert := new(OpenSSHCertV01)
+
+ if cert.Nonce, in, ok = parseString(in); !ok {
+ return
+ }
+
+ privAlgo := certToPrivAlgo(algo)
+ cert.Key, in, ok = parsePubKey(in, privAlgo)
if !ok {
return
}
- out = &Signature{
+ // We test PublicKeyAlgo to make sure we don't use some weird sub-cert.
+ if cert.Key.PublicKeyAlgo() != privAlgo {
+ ok = false
+ return
+ }
+
+ if cert.Serial, in, ok = parseUint64(in); !ok {
+ return
+ }
+
+ if cert.Type, in, ok = parseUint32(in); !ok {
+ return
+ }
+
+ keyId, in, ok := parseString(in)
+ if !ok {
+ return
+ }
+ cert.KeyId = string(keyId)
+
+ if cert.ValidPrincipals, in, ok = parseLengthPrefixedNameList(in); !ok {
+ return
+ }
+
+ va, in, ok := parseUint64(in)
+ if !ok {
+ return
+ }
+ cert.ValidAfter = CertTime(va)
+
+ vb, in, ok := parseUint64(in)
+ if !ok {
+ return
+ }
+ cert.ValidBefore = CertTime(vb)
+
+ if cert.CriticalOptions, in, ok = parseTupleList(in); !ok {
+ return
+ }
+
+ if cert.Extensions, in, ok = parseTupleList(in); !ok {
+ return
+ }
+
+ if cert.Reserved, in, ok = parseString(in); !ok {
+ return
+ }
+
+ sigKey, in, ok := parseString(in)
+ if !ok {
+ return
+ }
+ if cert.SignatureKey, _, ok = ParsePublicKey(sigKey); !ok {
+ return
+ }
+
+ if cert.Signature, in, ok = parseSignature(in); !ok {
+ return
+ }
+
+ ok = true
+ return cert, in, ok
+}
+
+func lengthPrefixedNameListLength(namelist []string) int {
+ length := 4 // length prefix for list
+ for _, name := range namelist {
+ length += 4 // length prefix for name
+ length += len(name)
+ }
+ return length
+}
+
+func marshalLengthPrefixedNameList(to []byte, namelist []string) []byte {
+ length := uint32(lengthPrefixedNameListLength(namelist) - 4)
+ to = marshalUint32(to, length)
+ for _, name := range namelist {
+ to = marshalString(to, []byte(name))
+ }
+ return to
+}
+
+func parseLengthPrefixedNameList(in []byte) (out []string, rest []byte, ok bool) {
+ list, rest, ok := parseString(in)
+ if !ok {
+ return
+ }
+
+ for len(list) > 0 {
+ var next []byte
+ if next, list, ok = parseString(list); !ok {
+ return nil, nil, false
+ }
+ out = append(out, string(next))
+ }
+ ok = true
+ return
+}
+
+func tupleListLength(tupleList []tuple) int {
+ length := 4 // length prefix for list
+ for _, t := range tupleList {
+ length += 4 // length prefix for t.Name
+ length += len(t.Name)
+ length += 4 // length prefix for t.Data
+ length += len(t.Data)
+ }
+ return length
+}
+
+func marshalTupleList(to []byte, tuplelist []tuple) []byte {
+ length := uint32(tupleListLength(tuplelist) - 4)
+ to = marshalUint32(to, length)
+ for _, t := range tuplelist {
+ to = marshalString(to, []byte(t.Name))
+ to = marshalString(to, []byte(t.Data))
+ }
+ return to
+}
+
+func parseTupleList(in []byte) (out []tuple, rest []byte, ok bool) {
+ list, rest, ok := parseString(in)
+ if !ok {
+ return
+ }
+
+ for len(list) > 0 {
+ var name, data []byte
+ var ok bool
+ name, list, ok = parseString(list)
+ if !ok {
+ return nil, nil, false
+ }
+ data, list, ok = parseString(list)
+ if !ok {
+ return nil, nil, false
+ }
+ out = append(out, tuple{string(name), string(data)})
+ }
+ ok = true
+ return
+}
+
+func signatureLength(sig *signature) int {
+ length := 4 // length prefix for signature
+ length += stringLength(len(sig.Format))
+ length += stringLength(len(sig.Blob))
+ return length
+}
+
+func marshalSignature(to []byte, sig *signature) []byte {
+ length := uint32(signatureLength(sig) - 4)
+ to = marshalUint32(to, length)
+ to = marshalString(to, []byte(sig.Format))
+ to = marshalString(to, sig.Blob)
+ return to
+}
+
+func parseSignatureBody(in []byte) (out *signature, rest []byte, ok bool) {
+ var format []byte
+ if format, in, ok = parseString(in); !ok {
+ return
+ }
+
+ out = &signature{
Format: string(format),
}
@@ -460,14 +364,14 @@ func parseSignatureBody(in []byte) (out *Signature, rest []byte, ok bool) {
return out, in, ok
}
-func parseSignature(in []byte) (out *Signature, rest []byte, ok bool) {
- sigBytes, rest, ok := parseString(in)
- if !ok {
+func parseSignature(in []byte) (out *signature, rest []byte, ok bool) {
+ var sigBytes []byte
+ if sigBytes, rest, ok = parseString(in); !ok {
return
}
- out, trailing, ok := parseSignatureBody(sigBytes)
- if !ok || len(trailing) > 0 {
+ out, sigBytes, ok = parseSignatureBody(sigBytes)
+ if !ok || len(sigBytes) > 0 {
return nil, nil, false
}
return
diff --git a/vendor/code.google.com/p/go.crypto/ssh/certs_test.go b/vendor/code.google.com/p/go.crypto/ssh/certs_test.go
index 7d1b00f6d..3cec28ec1 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/certs_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/certs_test.go
@@ -6,9 +6,7 @@ package ssh
import (
"bytes"
- "crypto/rand"
"testing"
- "time"
)
// Cert generated by ssh-keygen 6.0p1 Debian-4.
@@ -18,16 +16,16 @@ var exampleSSHCert = `ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb
func TestParseCert(t *testing.T) {
authKeyBytes := []byte(exampleSSHCert)
- key, _, _, rest, err := ParseAuthorizedKey(authKeyBytes)
- if err != nil {
- t.Fatalf("ParseAuthorizedKey: %v", err)
+ key, _, _, rest, ok := ParseAuthorizedKey(authKeyBytes)
+ if !ok {
+ t.Fatalf("could not parse certificate")
}
if len(rest) > 0 {
t.Errorf("rest: got %q, want empty", rest)
}
- if _, ok := key.(*Certificate); !ok {
- t.Fatalf("got %#v, want *Certificate", key)
+ if _, ok = key.(*OpenSSHCertV01); !ok {
+ t.Fatalf("got %#v, want *OpenSSHCertV01", key)
}
marshaled := MarshalAuthorizedKey(key)
@@ -39,118 +37,19 @@ func TestParseCert(t *testing.T) {
}
}
-func TestValidateCert(t *testing.T) {
- key, _, _, _, err := ParseAuthorizedKey([]byte(exampleSSHCert))
- if err != nil {
- t.Fatalf("ParseAuthorizedKey: %v", err)
- }
- validCert, ok := key.(*Certificate)
- if !ok {
- t.Fatalf("got %v (%T), want *Certificate", key, key)
- }
- checker := CertChecker{}
- checker.IsAuthority = func(k PublicKey) bool {
- return bytes.Equal(k.Marshal(), validCert.SignatureKey.Marshal())
+func TestVerifyCert(t *testing.T) {
+ key, _, _, _, _ := ParseAuthorizedKey([]byte(exampleSSHCert))
+ validCert := key.(*OpenSSHCertV01)
+ if ok := validateOpenSSHCertV01Signature(validCert); !ok {
+ t.Error("Unable to validate certificate!")
}
- if err := checker.CheckCert("user", validCert); err != nil {
- t.Errorf("Unable to validate certificate: %v", err)
+ invalidCert := &OpenSSHCertV01{
+ Key: rsaKey.PublicKey(),
+ SignatureKey: ecdsaKey.PublicKey(),
+ Signature: &signature{},
}
- invalidCert := &Certificate{
- Key: testPublicKeys["rsa"],
- SignatureKey: testPublicKeys["ecdsa"],
- ValidBefore: CertTimeInfinity,
- Signature: &Signature{},
- }
- if err := checker.CheckCert("user", invalidCert); err == nil {
- t.Error("Invalid cert signature passed validation")
- }
-}
-
-func TestValidateCertTime(t *testing.T) {
- cert := Certificate{
- ValidPrincipals: []string{"user"},
- Key: testPublicKeys["rsa"],
- ValidAfter: 50,
- ValidBefore: 100,
- }
-
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
-
- for ts, ok := range map[int64]bool{
- 25: false,
- 50: true,
- 99: true,
- 100: false,
- 125: false,
- } {
- checker := CertChecker{
- Clock: func() time.Time { return time.Unix(ts, 0) },
- }
- checker.IsAuthority = func(k PublicKey) bool {
- return bytes.Equal(k.Marshal(),
- testPublicKeys["ecdsa"].Marshal())
- }
-
- if v := checker.CheckCert("user", &cert); (v == nil) != ok {
- t.Errorf("Authenticate(%d): %v", ts, v)
- }
- }
-}
-
-// TODO(hanwen): tests for
-//
-// host keys:
-// * fallbacks
-
-func TestHostKeyCert(t *testing.T) {
- cert := &Certificate{
- ValidPrincipals: []string{"hostname", "hostname.domain"},
- Key: testPublicKeys["rsa"],
- ValidBefore: CertTimeInfinity,
- CertType: HostCert,
- }
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
-
- checker := &CertChecker{
- IsAuthority: func(p PublicKey) bool {
- return bytes.Equal(testPublicKeys["ecdsa"].Marshal(), p.Marshal())
- },
- }
-
- certSigner, err := NewCertSigner(cert, testSigners["rsa"])
- if err != nil {
- t.Errorf("NewCertSigner: %v", err)
- }
-
- for _, name := range []string{"hostname", "otherhost"} {
- c1, c2, err := netPipe()
- if err != nil {
- t.Fatalf("netPipe: %v", err)
- }
- defer c1.Close()
- defer c2.Close()
-
- go func() {
- conf := ServerConfig{
- NoClientAuth: true,
- }
- conf.AddHostKey(certSigner)
- _, _, _, err := NewServerConn(c1, &conf)
- if err != nil {
- t.Fatalf("NewServerConn: %v", err)
- }
- }()
-
- config := &ClientConfig{
- User: "user",
- HostKeyCallback: checker.CheckHostKey,
- }
- _, _, _, err = NewClientConn(c2, name, config)
-
- succeed := name == "hostname"
- if (err == nil) != succeed {
- t.Fatalf("NewClientConn(%q): %v", name, err)
- }
+ if ok := validateOpenSSHCertV01Signature(invalidCert); ok {
+ t.Error("Invalid cert signature passed validation!")
}
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/channel.go b/vendor/code.google.com/p/go.crypto/ssh/channel.go
index 5403c7e45..c5413c9f9 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/channel.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/channel.go
@@ -5,102 +5,71 @@
package ssh
import (
- "encoding/binary"
"errors"
"fmt"
"io"
- "log"
"sync"
+ "sync/atomic"
)
+// extendedDataTypeCode identifies an OpenSSL extended data type. See RFC 4254,
+// section 5.2.
+type extendedDataTypeCode uint32
+
const (
+ // extendedDataStderr is the extended data type that is used for stderr.
+ extendedDataStderr extendedDataTypeCode = 1
+
+ // minPacketLength defines the smallest valid packet
minPacketLength = 9
- // channelMaxPacket contains the maximum number of bytes that will be
- // sent in a single packet. As per RFC 4253, section 6.1, 32k is also
- // the minimum.
- channelMaxPacket = 1 << 15
- // We follow OpenSSH here.
- channelWindowSize = 64 * channelMaxPacket
+
+ // channelMaxPacketSize defines the maximum packet size advertised in open messages
+ channelMaxPacketSize = 1 << 15 // RFC 4253 6.1, minimum 32 KiB
+
+ // channelWindowSize defines the window size advertised in open messages
+ channelWindowSize = 64 * channelMaxPacketSize // Like OpenSSH
)
-// NewChannel represents an incoming request to a channel. It must either be
-// accepted for use by calling Accept, or rejected by calling Reject.
-type NewChannel interface {
- // Accept accepts the channel creation request. It returns the Channel
- // and a Go channel containing SSH requests. The Go channel must be
- // serviced otherwise the Channel will hang.
- Accept() (Channel, <-chan *Request, error)
-
- // Reject rejects the channel creation request. After calling
- // this, no other methods on the Channel may be called.
+// A Channel is an ordered, reliable, duplex stream that is multiplexed over an
+// SSH connection. Channel.Read can return a ChannelRequest as an error.
+type Channel interface {
+ // Accept accepts the channel creation request.
+ Accept() error
+ // Reject rejects the channel creation request. After calling this, no
+ // other methods on the Channel may be called. If they are then the
+ // peer is likely to signal a protocol error and drop the connection.
Reject(reason RejectionReason, message string) error
+ // Read may return a ChannelRequest as an error.
+ Read(data []byte) (int, error)
+ Write(data []byte) (int, error)
+ Close() error
+
+ // Stderr returns an io.Writer that writes to this channel with the
+ // extended data type set to stderr.
+ Stderr() io.Writer
+
+ // AckRequest either sends an ack or nack to the channel request.
+ AckRequest(ok bool) error
+
// ChannelType returns the type of the channel, as supplied by the
// client.
ChannelType() string
-
// ExtraData returns the arbitrary payload for this channel, as supplied
// by the client. This data is specific to the channel type.
ExtraData() []byte
}
-// A Channel is an ordered, reliable, flow-controlled, duplex stream
-// that is multiplexed over an SSH connection.
-type Channel interface {
- // Read reads up to len(data) bytes from the channel.
- Read(data []byte) (int, error)
-
- // Write writes len(data) bytes to the channel.
- Write(data []byte) (int, error)
-
- // Close signals end of channel use. No data may be sent after this
- // call.
- Close() error
-
- // CloseWrite signals the end of sending in-band
- // data. Requests may still be sent, and the other side may
- // still send data
- CloseWrite() error
-
- // SendRequest sends a channel request. If wantReply is true,
- // it will wait for a reply and return the result as a
- // boolean, otherwise the return value will be false. Channel
- // requests are out-of-band messages so they may be sent even
- // if the data stream is closed or blocked by flow control.
- SendRequest(name string, wantReply bool, payload []byte) (bool, error)
-
- // Stderr returns an io.ReadWriter that writes to this channel
- // with the extended data type set to stderr. Stderr may
- // safely be read and written from a different goroutine than
- // Read and Write respectively.
- Stderr() io.ReadWriter
-}
-
-// Request is a request sent outside of the normal stream of
-// data. Requests can either be specific to an SSH channel, or they
-// can be global.
-type Request struct {
- Type string
+// ChannelRequest represents a request sent on a channel, outside of the normal
+// stream of bytes. It may result from calling Read on a Channel.
+type ChannelRequest struct {
+ Request string
WantReply bool
Payload []byte
-
- ch *channel
- mux *mux
}
-// Reply sends a response to a request. It must be called for all requests
-// where WantReply is true and is a no-op otherwise. The payload argument is
-// ignored for replies to channel-specific requests.
-func (r *Request) Reply(ok bool, payload []byte) error {
- if !r.WantReply {
- return nil
- }
-
- if r.ch == nil {
- return r.mux.ackRequest(ok, payload)
- }
-
- return r.ch.ackRequest(ok)
+func (c ChannelRequest) Error() string {
+ return "ssh: channel request received"
}
// RejectionReason is an enumeration used when rejecting channel creation
@@ -129,6 +98,464 @@ func (r RejectionReason) String() string {
return fmt.Sprintf("unknown reason %d", int(r))
}
+type channel struct {
+ packetConn // the underlying transport
+ localId, remoteId uint32
+ remoteWin window
+ maxPacket uint32
+ isClosed uint32 // atomic bool, non zero if true
+}
+
+func (c *channel) sendWindowAdj(n int) error {
+ msg := windowAdjustMsg{
+ PeersId: c.remoteId,
+ AdditionalBytes: uint32(n),
+ }
+ return c.writePacket(marshal(msgChannelWindowAdjust, msg))
+}
+
+// sendEOF sends EOF to the remote side. RFC 4254 Section 5.3
+func (c *channel) sendEOF() error {
+ return c.writePacket(marshal(msgChannelEOF, channelEOFMsg{
+ PeersId: c.remoteId,
+ }))
+}
+
+// sendClose informs the remote side of our intent to close the channel.
+func (c *channel) sendClose() error {
+ return c.packetConn.writePacket(marshal(msgChannelClose, channelCloseMsg{
+ PeersId: c.remoteId,
+ }))
+}
+
+func (c *channel) sendChannelOpenFailure(reason RejectionReason, message string) error {
+ reject := channelOpenFailureMsg{
+ PeersId: c.remoteId,
+ Reason: reason,
+ Message: message,
+ Language: "en",
+ }
+ return c.writePacket(marshal(msgChannelOpenFailure, reject))
+}
+
+func (c *channel) writePacket(b []byte) error {
+ if c.closed() {
+ return io.EOF
+ }
+ if uint32(len(b)) > c.maxPacket {
+ return fmt.Errorf("ssh: cannot write %d bytes, maxPacket is %d bytes", len(b), c.maxPacket)
+ }
+ return c.packetConn.writePacket(b)
+}
+
+func (c *channel) closed() bool {
+ return atomic.LoadUint32(&c.isClosed) > 0
+}
+
+func (c *channel) setClosed() bool {
+ return atomic.CompareAndSwapUint32(&c.isClosed, 0, 1)
+}
+
+type serverChan struct {
+ channel
+ // immutable once created
+ chanType string
+ extraData []byte
+
+ serverConn *ServerConn
+ myWindow uint32
+ theyClosed bool // indicates the close msg has been received from the remote side
+ theySentEOF bool
+ isDead uint32
+ err error
+
+ pendingRequests []ChannelRequest
+ pendingData []byte
+ head, length int
+
+ // This lock is inferior to serverConn.lock
+ cond *sync.Cond
+}
+
+func (c *serverChan) Accept() error {
+ c.serverConn.lock.Lock()
+ defer c.serverConn.lock.Unlock()
+
+ if c.serverConn.err != nil {
+ return c.serverConn.err
+ }
+
+ confirm := channelOpenConfirmMsg{
+ PeersId: c.remoteId,
+ MyId: c.localId,
+ MyWindow: c.myWindow,
+ MaxPacketSize: c.maxPacket,
+ }
+ return c.writePacket(marshal(msgChannelOpenConfirm, confirm))
+}
+
+func (c *serverChan) Reject(reason RejectionReason, message string) error {
+ c.serverConn.lock.Lock()
+ defer c.serverConn.lock.Unlock()
+
+ if c.serverConn.err != nil {
+ return c.serverConn.err
+ }
+
+ return c.sendChannelOpenFailure(reason, message)
+}
+
+func (c *serverChan) handlePacket(packet interface{}) {
+ c.cond.L.Lock()
+ defer c.cond.L.Unlock()
+
+ switch packet := packet.(type) {
+ case *channelRequestMsg:
+ req := ChannelRequest{
+ Request: packet.Request,
+ WantReply: packet.WantReply,
+ Payload: packet.RequestSpecificData,
+ }
+
+ c.pendingRequests = append(c.pendingRequests, req)
+ c.cond.Signal()
+ case *channelCloseMsg:
+ c.theyClosed = true
+ c.cond.Signal()
+ case *channelEOFMsg:
+ c.theySentEOF = true
+ c.cond.Signal()
+ case *windowAdjustMsg:
+ if !c.remoteWin.add(packet.AdditionalBytes) {
+ panic("illegal window update")
+ }
+ default:
+ panic("unknown packet type")
+ }
+}
+
+func (c *serverChan) handleData(data []byte) {
+ c.cond.L.Lock()
+ defer c.cond.L.Unlock()
+
+ // The other side should never send us more than our window.
+ if len(data)+c.length > len(c.pendingData) {
+ // TODO(agl): we should tear down the channel with a protocol
+ // error.
+ return
+ }
+
+ c.myWindow -= uint32(len(data))
+ for i := 0; i < 2; i++ {
+ tail := c.head + c.length
+ if tail >= len(c.pendingData) {
+ tail -= len(c.pendingData)
+ }
+ n := copy(c.pendingData[tail:], data)
+ data = data[n:]
+ c.length += n
+ }
+
+ c.cond.Signal()
+}
+
+func (c *serverChan) Stderr() io.Writer {
+ return extendedDataChannel{c: c, t: extendedDataStderr}
+}
+
+// extendedDataChannel is an io.Writer that writes any data to c as extended
+// data of the given type.
+type extendedDataChannel struct {
+ t extendedDataTypeCode
+ c *serverChan
+}
+
+func (edc extendedDataChannel) Write(data []byte) (n int, err error) {
+ const headerLength = 13 // 1 byte message type, 4 bytes remoteId, 4 bytes extended message type, 4 bytes data length
+ c := edc.c
+ for len(data) > 0 {
+ space := min(c.maxPacket-headerLength, len(data))
+ if space, err = c.getWindowSpace(space); err != nil {
+ return 0, err
+ }
+ todo := data
+ if uint32(len(todo)) > space {
+ todo = todo[:space]
+ }
+
+ packet := make([]byte, headerLength+len(todo))
+ packet[0] = msgChannelExtendedData
+ marshalUint32(packet[1:], c.remoteId)
+ marshalUint32(packet[5:], uint32(edc.t))
+ marshalUint32(packet[9:], uint32(len(todo)))
+ copy(packet[13:], todo)
+
+ if err = c.writePacket(packet); err != nil {
+ return
+ }
+
+ n += len(todo)
+ data = data[len(todo):]
+ }
+
+ return
+}
+
+func (c *serverChan) Read(data []byte) (n int, err error) {
+ n, err, windowAdjustment := c.read(data)
+
+ if windowAdjustment > 0 {
+ packet := marshal(msgChannelWindowAdjust, windowAdjustMsg{
+ PeersId: c.remoteId,
+ AdditionalBytes: windowAdjustment,
+ })
+ err = c.writePacket(packet)
+ }
+
+ return
+}
+
+func (c *serverChan) read(data []byte) (n int, err error, windowAdjustment uint32) {
+ c.cond.L.Lock()
+ defer c.cond.L.Unlock()
+
+ if c.err != nil {
+ return 0, c.err, 0
+ }
+
+ for {
+ if c.theySentEOF || c.theyClosed || c.dead() {
+ return 0, io.EOF, 0
+ }
+
+ if len(c.pendingRequests) > 0 {
+ req := c.pendingRequests[0]
+ if len(c.pendingRequests) == 1 {
+ c.pendingRequests = nil
+ } else {
+ oldPendingRequests := c.pendingRequests
+ c.pendingRequests = make([]ChannelRequest, len(oldPendingRequests)-1)
+ copy(c.pendingRequests, oldPendingRequests[1:])
+ }
+
+ return 0, req, 0
+ }
+
+ if c.length > 0 {
+ tail := min(uint32(c.head+c.length), len(c.pendingData))
+ n = copy(data, c.pendingData[c.head:tail])
+ c.head += n
+ c.length -= n
+ if c.head == len(c.pendingData) {
+ c.head = 0
+ }
+
+ windowAdjustment = uint32(len(c.pendingData)-c.length) - c.myWindow
+ if windowAdjustment < uint32(len(c.pendingData)/2) {
+ windowAdjustment = 0
+ }
+ c.myWindow += windowAdjustment
+
+ return
+ }
+
+ c.cond.Wait()
+ }
+
+ panic("unreachable")
+}
+
+// getWindowSpace takes, at most, max bytes of space from the peer's window. It
+// returns the number of bytes actually reserved.
+func (c *serverChan) getWindowSpace(max uint32) (uint32, error) {
+ if c.dead() || c.closed() {
+ return 0, io.EOF
+ }
+ return c.remoteWin.reserve(max), nil
+}
+
+func (c *serverChan) dead() bool {
+ return atomic.LoadUint32(&c.isDead) > 0
+}
+
+func (c *serverChan) setDead() {
+ atomic.StoreUint32(&c.isDead, 1)
+}
+
+func (c *serverChan) Write(data []byte) (n int, err error) {
+ const headerLength = 9 // 1 byte message type, 4 bytes remoteId, 4 bytes data length
+ for len(data) > 0 {
+ space := min(c.maxPacket-headerLength, len(data))
+ if space, err = c.getWindowSpace(space); err != nil {
+ return 0, err
+ }
+ todo := data
+ if uint32(len(todo)) > space {
+ todo = todo[:space]
+ }
+
+ packet := make([]byte, headerLength+len(todo))
+ packet[0] = msgChannelData
+ marshalUint32(packet[1:], c.remoteId)
+ marshalUint32(packet[5:], uint32(len(todo)))
+ copy(packet[9:], todo)
+
+ if err = c.writePacket(packet); err != nil {
+ return
+ }
+
+ n += len(todo)
+ data = data[len(todo):]
+ }
+
+ return
+}
+
+// Close signals the intent to close the channel.
+func (c *serverChan) Close() error {
+ c.serverConn.lock.Lock()
+ defer c.serverConn.lock.Unlock()
+
+ if c.serverConn.err != nil {
+ return c.serverConn.err
+ }
+
+ if !c.setClosed() {
+ return errors.New("ssh: channel already closed")
+ }
+ return c.sendClose()
+}
+
+func (c *serverChan) AckRequest(ok bool) error {
+ c.serverConn.lock.Lock()
+ defer c.serverConn.lock.Unlock()
+
+ if c.serverConn.err != nil {
+ return c.serverConn.err
+ }
+
+ if !ok {
+ ack := channelRequestFailureMsg{
+ PeersId: c.remoteId,
+ }
+ return c.writePacket(marshal(msgChannelFailure, ack))
+ }
+
+ ack := channelRequestSuccessMsg{
+ PeersId: c.remoteId,
+ }
+ return c.writePacket(marshal(msgChannelSuccess, ack))
+}
+
+func (c *serverChan) ChannelType() string {
+ return c.chanType
+}
+
+func (c *serverChan) ExtraData() []byte {
+ return c.extraData
+}
+
+// A clientChan represents a single RFC 4254 channel multiplexed
+// over a SSH connection.
+type clientChan struct {
+ channel
+ stdin *chanWriter
+ stdout *chanReader
+ stderr *chanReader
+ msg chan interface{}
+}
+
+// newClientChan returns a partially constructed *clientChan
+// using the local id provided. To be usable clientChan.remoteId
+// needs to be assigned once known.
+func newClientChan(cc packetConn, id uint32) *clientChan {
+ c := &clientChan{
+ channel: channel{
+ packetConn: cc,
+ localId: id,
+ remoteWin: window{Cond: newCond()},
+ },
+ msg: make(chan interface{}, 16),
+ }
+ c.stdin = &chanWriter{
+ channel: &c.channel,
+ }
+ c.stdout = &chanReader{
+ channel: &c.channel,
+ buffer: newBuffer(),
+ }
+ c.stderr = &chanReader{
+ channel: &c.channel,
+ buffer: newBuffer(),
+ }
+ return c
+}
+
+// waitForChannelOpenResponse, if successful, fills out
+// the remoteId and records any initial window advertisement.
+func (c *clientChan) waitForChannelOpenResponse() error {
+ switch msg := (<-c.msg).(type) {
+ case *channelOpenConfirmMsg:
+ if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 {
+ return errors.New("ssh: invalid MaxPacketSize from peer")
+ }
+ // fixup remoteId field
+ c.remoteId = msg.MyId
+ c.maxPacket = msg.MaxPacketSize
+ c.remoteWin.add(msg.MyWindow)
+ return nil
+ case *channelOpenFailureMsg:
+ return errors.New(safeString(msg.Message))
+ }
+ return errors.New("ssh: unexpected packet")
+}
+
+// Close signals the intent to close the channel.
+func (c *clientChan) Close() error {
+ if !c.setClosed() {
+ return errors.New("ssh: channel already closed")
+ }
+ c.stdout.eof()
+ c.stderr.eof()
+ return c.sendClose()
+}
+
+// A chanWriter represents the stdin of a remote process.
+type chanWriter struct {
+ *channel
+ // indicates the writer has been closed. eof is owned by the
+ // caller of Write/Close.
+ eof bool
+}
+
+// Write writes data to the remote process's standard input.
+func (w *chanWriter) Write(data []byte) (written int, err error) {
+ const headerLength = 9 // 1 byte message type, 4 bytes remoteId, 4 bytes data length
+ for len(data) > 0 {
+ if w.eof || w.closed() {
+ err = io.EOF
+ return
+ }
+ // never send more data than maxPacket even if
+ // there is sufficient window.
+ n := min(w.maxPacket-headerLength, len(data))
+ r := w.remoteWin.reserve(n)
+ n = r
+ remoteId := w.remoteId
+ packet := []byte{
+ msgChannelData,
+ byte(remoteId >> 24), byte(remoteId >> 16), byte(remoteId >> 8), byte(remoteId),
+ byte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n),
+ }
+ if err = w.writePacket(append(packet, data[:n]...)); err != nil {
+ break
+ }
+ data = data[n:]
+ written += int(n)
+ }
+ return
+}
+
func min(a uint32, b int) uint32 {
if a < uint32(b) {
return a
@@ -136,496 +563,32 @@ func min(a uint32, b int) uint32 {
return uint32(b)
}
-type channelDirection uint8
-
-const (
- channelInbound channelDirection = iota
- channelOutbound
-)
-
-// channel is an implementation of the Channel interface that works
-// with the mux class.
-type channel struct {
- // R/O after creation
- chanType string
- extraData []byte
- localId, remoteId uint32
-
- // maxIncomingPayload and maxRemotePayload are the maximum
- // payload sizes of normal and extended data packets for
- // receiving and sending, respectively. The wire packet will
- // be 9 or 13 bytes larger (excluding encryption overhead).
- maxIncomingPayload uint32
- maxRemotePayload uint32
-
- mux *mux
-
- // decided is set to true if an accept or reject message has been sent
- // (for outbound channels) or received (for inbound channels).
- decided bool
-
- // direction contains either channelOutbound, for channels created
- // locally, or channelInbound, for channels created by the peer.
- direction channelDirection
-
- // Pending internal channel messages.
- msg chan interface{}
-
- // Since requests have no ID, there can be only one request
- // with WantReply=true outstanding. This lock is held by a
- // goroutine that has such an outgoing request pending.
- sentRequestMu sync.Mutex
-
- incomingRequests chan *Request
-
- sentEOF bool
-
- // thread-safe data
- remoteWin window
- pending *buffer
- extPending *buffer
-
- // windowMu protects myWindow, the flow-control window.
- windowMu sync.Mutex
- myWindow uint32
-
- // writeMu serializes calls to mux.conn.writePacket() and
- // protects sentClose and packetPool. This mutex must be
- // different from windowMu, as writePacket can block if there
- // is a key exchange pending.
- writeMu sync.Mutex
- sentClose bool
-
- // packetPool has a buffer for each extended channel ID to
- // save allocations during writes.
- packetPool map[uint32][]byte
+func (w *chanWriter) Close() error {
+ w.eof = true
+ return w.sendEOF()
}
-// writePacket sends a packet. If the packet is a channel close, it updates
-// sentClose. This method takes the lock c.writeMu.
-func (c *channel) writePacket(packet []byte) error {
- c.writeMu.Lock()
- if c.sentClose {
- c.writeMu.Unlock()
- return io.EOF
- }
- c.sentClose = (packet[0] == msgChannelClose)
- err := c.mux.conn.writePacket(packet)
- c.writeMu.Unlock()
- return err
+// A chanReader represents stdout or stderr of a remote process.
+type chanReader struct {
+ *channel // the channel backing this reader
+ *buffer
}
-func (c *channel) sendMessage(msg interface{}) error {
- if debugMux {
- log.Printf("send %d: %#v", c.mux.chanList.offset, msg)
- }
-
- p := Marshal(msg)
- binary.BigEndian.PutUint32(p[1:], c.remoteId)
- return c.writePacket(p)
-}
-
-// WriteExtended writes data to a specific extended stream. These streams are
-// used, for example, for stderr.
-func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) {
- if c.sentEOF {
- return 0, io.EOF
- }
- // 1 byte message type, 4 bytes remoteId, 4 bytes data length
- opCode := byte(msgChannelData)
- headerLength := uint32(9)
- if extendedCode > 0 {
- headerLength += 4
- opCode = msgChannelExtendedData
- }
-
- c.writeMu.Lock()
- packet := c.packetPool[extendedCode]
- // We don't remove the buffer from packetPool, so
- // WriteExtended calls from different goroutines will be
- // flagged as errors by the race detector.
- c.writeMu.Unlock()
-
- for len(data) > 0 {
- space := min(c.maxRemotePayload, len(data))
- if space, err = c.remoteWin.reserve(space); err != nil {
- return n, err
- }
- if want := headerLength + space; uint32(cap(packet)) < want {
- packet = make([]byte, want)
- } else {
- packet = packet[:want]
- }
-
- todo := data[:space]
-
- packet[0] = opCode
- binary.BigEndian.PutUint32(packet[1:], c.remoteId)
- if extendedCode > 0 {
- binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode))
- }
- binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo)))
- copy(packet[headerLength:], todo)
- if err = c.writePacket(packet); err != nil {
- return n, err
- }
-
- n += len(todo)
- data = data[len(todo):]
- }
-
- c.writeMu.Lock()
- c.packetPool[extendedCode] = packet
- c.writeMu.Unlock()
-
- return n, err
-}
-
-func (c *channel) handleData(packet []byte) error {
- headerLen := 9
- isExtendedData := packet[0] == msgChannelExtendedData
- if isExtendedData {
- headerLen = 13
- }
- if len(packet) < headerLen {
- // malformed data packet
- return parseError(packet[0])
- }
-
- var extended uint32
- if isExtendedData {
- extended = binary.BigEndian.Uint32(packet[5:])
- }
-
- length := binary.BigEndian.Uint32(packet[headerLen-4 : headerLen])
- if length == 0 {
- return nil
- }
- if length > c.maxIncomingPayload {
- // TODO(hanwen): should send Disconnect?
- return errors.New("ssh: incoming packet exceeds maximum payload size")
- }
-
- data := packet[headerLen:]
- if length != uint32(len(data)) {
- return errors.New("ssh: wrong packet length")
- }
-
- c.windowMu.Lock()
- if c.myWindow < length {
- c.windowMu.Unlock()
- // TODO(hanwen): should send Disconnect with reason?
- return errors.New("ssh: remote side wrote too much")
- }
- c.myWindow -= length
- c.windowMu.Unlock()
-
- if extended == 1 {
- c.extPending.write(data)
- } else if extended > 0 {
- // discard other extended data.
- } else {
- c.pending.write(data)
- }
- return nil
-}
-
-func (c *channel) adjustWindow(n uint32) error {
- c.windowMu.Lock()
- // Since myWindow is managed on our side, and can never exceed
- // the initial window setting, we don't worry about overflow.
- c.myWindow += uint32(n)
- c.windowMu.Unlock()
- return c.sendMessage(windowAdjustMsg{
- AdditionalBytes: uint32(n),
- })
-}
-
-func (c *channel) ReadExtended(data []byte, extended uint32) (n int, err error) {
- switch extended {
- case 1:
- n, err = c.extPending.Read(data)
- case 0:
- n, err = c.pending.Read(data)
- default:
- return 0, fmt.Errorf("ssh: extended code %d unimplemented", extended)
- }
-
- if n > 0 {
- err = c.adjustWindow(uint32(n))
- // sendWindowAdjust can return io.EOF if the remote
- // peer has closed the connection, however we want to
- // defer forwarding io.EOF to the caller of Read until
- // the buffer has been drained.
- if n > 0 && err == io.EOF {
- err = nil
- }
- }
-
- return n, err
-}
-
-func (c *channel) close() {
- c.pending.eof()
- c.extPending.eof()
- close(c.msg)
- close(c.incomingRequests)
- c.writeMu.Lock()
- // This is not necesary for a normal channel teardown, but if
- // there was another error, it is.
- c.sentClose = true
- c.writeMu.Unlock()
- // Unblock writers.
- c.remoteWin.close()
-}
-
-// responseMessageReceived is called when a success or failure message is
-// received on a channel to check that such a message is reasonable for the
-// given channel.
-func (c *channel) responseMessageReceived() error {
- if c.direction == channelInbound {
- return errors.New("ssh: channel response message received on inbound channel")
- }
- if c.decided {
- return errors.New("ssh: duplicate response received for channel")
- }
- c.decided = true
- return nil
-}
-
-func (c *channel) handlePacket(packet []byte) error {
- switch packet[0] {
- case msgChannelData, msgChannelExtendedData:
- return c.handleData(packet)
- case msgChannelClose:
- c.sendMessage(channelCloseMsg{PeersId: c.remoteId})
- c.mux.chanList.remove(c.localId)
- c.close()
- return nil
- case msgChannelEOF:
- // RFC 4254 is mute on how EOF affects dataExt messages but
- // it is logical to signal EOF at the same time.
- c.extPending.eof()
- c.pending.eof()
- return nil
- }
-
- decoded, err := decode(packet)
+// Read reads data from the remote process's stdout or stderr.
+func (r *chanReader) Read(buf []byte) (int, error) {
+ n, err := r.buffer.Read(buf)
if err != nil {
- return err
- }
-
- switch msg := decoded.(type) {
- case *channelOpenFailureMsg:
- if err := c.responseMessageReceived(); err != nil {
- return err
+ if err == io.EOF {
+ return n, err
}
- c.mux.chanList.remove(msg.PeersId)
- c.msg <- msg
- case *channelOpenConfirmMsg:
- if err := c.responseMessageReceived(); err != nil {
- return err
- }
- if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 {
- return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize)
- }
- c.remoteId = msg.MyId
- c.maxRemotePayload = msg.MaxPacketSize
- c.remoteWin.add(msg.MyWindow)
- c.msg <- msg
- case *windowAdjustMsg:
- if !c.remoteWin.add(msg.AdditionalBytes) {
- return fmt.Errorf("ssh: invalid window update for %d bytes", msg.AdditionalBytes)
- }
- case *channelRequestMsg:
- req := Request{
- Type: msg.Request,
- WantReply: msg.WantReply,
- Payload: msg.RequestSpecificData,
- ch: c,
- }
-
- c.incomingRequests <- &req
- default:
- c.msg <- msg
+ return 0, err
}
- return nil
-}
-
-func (m *mux) newChannel(chanType string, direction channelDirection, extraData []byte) *channel {
- ch := &channel{
- remoteWin: window{Cond: newCond()},
- myWindow: channelWindowSize,
- pending: newBuffer(),
- extPending: newBuffer(),
- direction: direction,
- incomingRequests: make(chan *Request, 16),
- msg: make(chan interface{}, 16),
- chanType: chanType,
- extraData: extraData,
- mux: m,
- packetPool: make(map[uint32][]byte),
- }
- ch.localId = m.chanList.add(ch)
- return ch
-}
-
-var errUndecided = errors.New("ssh: must Accept or Reject channel")
-var errDecidedAlready = errors.New("ssh: can call Accept or Reject only once")
-
-type extChannel struct {
- code uint32
- ch *channel
-}
-
-func (e *extChannel) Write(data []byte) (n int, err error) {
- return e.ch.WriteExtended(data, e.code)
-}
-
-func (e *extChannel) Read(data []byte) (n int, err error) {
- return e.ch.ReadExtended(data, e.code)
-}
-
-func (c *channel) Accept() (Channel, <-chan *Request, error) {
- if c.decided {
- return nil, nil, errDecidedAlready
- }
- c.maxIncomingPayload = channelMaxPacket
- confirm := channelOpenConfirmMsg{
- PeersId: c.remoteId,
- MyId: c.localId,
- MyWindow: c.myWindow,
- MaxPacketSize: c.maxIncomingPayload,
- }
- c.decided = true
- if err := c.sendMessage(confirm); err != nil {
- return nil, nil, err
- }
-
- return c, c.incomingRequests, nil
-}
-
-func (ch *channel) Reject(reason RejectionReason, message string) error {
- if ch.decided {
- return errDecidedAlready
- }
- reject := channelOpenFailureMsg{
- PeersId: ch.remoteId,
- Reason: reason,
- Message: message,
- Language: "en",
- }
- ch.decided = true
- return ch.sendMessage(reject)
-}
-
-func (ch *channel) Read(data []byte) (int, error) {
- if !ch.decided {
- return 0, errUndecided
- }
- return ch.ReadExtended(data, 0)
-}
-
-func (ch *channel) Write(data []byte) (int, error) {
- if !ch.decided {
- return 0, errUndecided
- }
- return ch.WriteExtended(data, 0)
-}
-
-func (ch *channel) CloseWrite() error {
- if !ch.decided {
- return errUndecided
- }
- ch.sentEOF = true
- return ch.sendMessage(channelEOFMsg{
- PeersId: ch.remoteId})
-}
-
-func (ch *channel) Close() error {
- if !ch.decided {
- return errUndecided
- }
-
- return ch.sendMessage(channelCloseMsg{
- PeersId: ch.remoteId})
-}
-
-// Extended returns an io.ReadWriter that sends and receives data on the given,
-// SSH extended stream. Such streams are used, for example, for stderr.
-func (ch *channel) Extended(code uint32) io.ReadWriter {
- if !ch.decided {
- return nil
- }
- return &extChannel{code, ch}
-}
-
-func (ch *channel) Stderr() io.ReadWriter {
- return ch.Extended(1)
-}
-
-func (ch *channel) SendRequest(name string, wantReply bool, payload []byte) (bool, error) {
- if !ch.decided {
- return false, errUndecided
- }
-
- if wantReply {
- ch.sentRequestMu.Lock()
- defer ch.sentRequestMu.Unlock()
- }
-
- msg := channelRequestMsg{
- PeersId: ch.remoteId,
- Request: name,
- WantReply: wantReply,
- RequestSpecificData: payload,
- }
-
- if err := ch.sendMessage(msg); err != nil {
- return false, err
- }
-
- if wantReply {
- m, ok := (<-ch.msg)
- if !ok {
- return false, io.EOF
- }
- switch m.(type) {
- case *channelRequestFailureMsg:
- return false, nil
- case *channelRequestSuccessMsg:
- return true, nil
- default:
- return false, fmt.Errorf("ssh: unexpected response to channel request: %#v", m)
- }
- }
-
- return false, nil
-}
-
-// ackRequest either sends an ack or nack to the channel request.
-func (ch *channel) ackRequest(ok bool) error {
- if !ch.decided {
- return errUndecided
- }
-
- var msg interface{}
- if !ok {
- msg = channelRequestFailureMsg{
- PeersId: ch.remoteId,
- }
- } else {
- msg = channelRequestSuccessMsg{
- PeersId: ch.remoteId,
- }
- }
- return ch.sendMessage(msg)
-}
-
-func (ch *channel) ChannelType() string {
- return ch.chanType
-}
-
-func (ch *channel) ExtraData() []byte {
- return ch.extraData
+ err = r.sendWindowAdj(n)
+ if err == io.EOF && n > 0 {
+ // sendWindowAdjust can return io.EOF if the remote peer has
+ // closed the connection, however we want to defer forwarding io.EOF to the
+ // caller of Read until the buffer has been drained.
+ err = nil
+ }
+ return n, err
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/cipher.go b/vendor/code.google.com/p/go.crypto/ssh/cipher.go
index 642696bbb..bc2e98380 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/cipher.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/cipher.go
@@ -8,28 +8,11 @@ import (
"crypto/aes"
"crypto/cipher"
"crypto/rc4"
- "crypto/subtle"
- "encoding/binary"
- "errors"
- "fmt"
- "hash"
- "io"
)
-const (
- packetSizeMultiple = 16 // TODO(huin) this should be determined by the cipher.
-
- // RFC 4253 section 6.1 defines a minimum packet size of 32768 that implementations
- // MUST be able to process (plus a few more kilobytes for padding and mac). The RFC
- // indicates implementations SHOULD be able to handle larger packet sizes, but then
- // waffles on about reasonable limits.
- //
- // OpenSSH caps their maxPacket at 256kB so we choose to do
- // the same. maxPacket is also used to ensure that uint32
- // length fields do not overflow, so it should remain well
- // below 4G.
- maxPacket = 256 * 1024
-)
+// streamDump is used to dump the initial keystream for stream ciphers. It is a
+// a write-only buffer, and not intended for reading so do not require a mutex.
+var streamDump [512]byte
// noneCipher implements cipher.Stream and provides no encryption. It is used
// by the transport before the first key-exchange.
@@ -51,14 +34,14 @@ func newRC4(key, iv []byte) (cipher.Stream, error) {
return rc4.NewCipher(key)
}
-type streamCipherMode struct {
+type cipherMode struct {
keySize int
ivSize int
skip int
createFunc func(key, iv []byte) (cipher.Stream, error)
}
-func (c *streamCipherMode) createStream(key, iv []byte) (cipher.Stream, error) {
+func (c *cipherMode) createCipher(key, iv []byte) (cipher.Stream, error) {
if len(key) < c.keySize {
panic("ssh: key length too small for cipher")
}
@@ -71,11 +54,6 @@ func (c *streamCipherMode) createStream(key, iv []byte) (cipher.Stream, error) {
return nil, err
}
- var streamDump []byte
- if c.skip > 0 {
- streamDump = make([]byte, 512)
- }
-
for remainingToDump := c.skip; remainingToDump > 0; {
dumpThisTime := remainingToDump
if dumpThisTime > len(streamDump) {
@@ -88,10 +66,18 @@ func (c *streamCipherMode) createStream(key, iv []byte) (cipher.Stream, error) {
return stream, nil
}
+// Specifies a default set of ciphers and a preference order. This is based on
+// OpenSSH's default client preference order, minus algorithms that are not
+// implemented.
+var DefaultCipherOrder = []string{
+ "aes128-ctr", "aes192-ctr", "aes256-ctr",
+ "arcfour256", "arcfour128",
+}
+
// cipherModes documents properties of supported ciphers. Ciphers not included
// are not supported and will not be negotiated, even if explicitly requested in
// ClientConfig.Crypto.Ciphers.
-var cipherModes = map[string]*streamCipherMode{
+var cipherModes = map[string]*cipherMode{
// Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms
// are defined in the order specified in the RFC.
"aes128-ctr": {16, aes.BlockSize, 0, newAESCTR},
@@ -102,243 +88,13 @@ var cipherModes = map[string]*streamCipherMode{
// They are defined in the order specified in the RFC.
"arcfour128": {16, 0, 1536, newRC4},
"arcfour256": {32, 0, 1536, newRC4},
-
- // Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.
- // Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and
- // RC4) has problems with weak keys, and should be used with caution."
- // RFC4345 introduces improved versions of Arcfour.
- "arcfour": {16, 0, 0, newRC4},
-
- // AES-GCM is not a stream cipher, so it is constructed with a
- // special case. If we add any more non-stream ciphers, we
- // should invest a cleaner way to do this.
- gcmCipherID: {16, 12, 0, nil},
}
-// prefixLen is the length of the packet prefix that contains the packet length
-// and number of padding bytes.
-const prefixLen = 5
-
-// streamPacketCipher is a packetCipher using a stream cipher.
-type streamPacketCipher struct {
- mac hash.Hash
- cipher cipher.Stream
-
- // The following members are to avoid per-packet allocations.
- prefix [prefixLen]byte
- seqNumBytes [4]byte
- padding [2 * packetSizeMultiple]byte
- packetData []byte
- macResult []byte
-}
-
-// readPacket reads and decrypt a single packet from the reader argument.
-func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) {
- if _, err := io.ReadFull(r, s.prefix[:]); err != nil {
- return nil, err
- }
-
- s.cipher.XORKeyStream(s.prefix[:], s.prefix[:])
- length := binary.BigEndian.Uint32(s.prefix[0:4])
- paddingLength := uint32(s.prefix[4])
-
- var macSize uint32
- if s.mac != nil {
- s.mac.Reset()
- binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum)
- s.mac.Write(s.seqNumBytes[:])
- s.mac.Write(s.prefix[:])
- macSize = uint32(s.mac.Size())
- }
-
- if length <= paddingLength+1 {
- return nil, errors.New("ssh: invalid packet length, packet too small")
- }
-
- if length > maxPacket {
- return nil, errors.New("ssh: invalid packet length, packet too large")
- }
-
- // the maxPacket check above ensures that length-1+macSize
- // does not overflow.
- if uint32(cap(s.packetData)) < length-1+macSize {
- s.packetData = make([]byte, length-1+macSize)
- } else {
- s.packetData = s.packetData[:length-1+macSize]
- }
-
- if _, err := io.ReadFull(r, s.packetData); err != nil {
- return nil, err
- }
- mac := s.packetData[length-1:]
- data := s.packetData[:length-1]
- s.cipher.XORKeyStream(data, data)
-
- if s.mac != nil {
- s.mac.Write(data)
- s.macResult = s.mac.Sum(s.macResult[:0])
- if subtle.ConstantTimeCompare(s.macResult, mac) != 1 {
- return nil, errors.New("ssh: MAC failure")
- }
- }
-
- return s.packetData[:length-paddingLength-1], nil
-}
-
-// writePacket encrypts and sends a packet of data to the writer argument
-func (s *streamPacketCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error {
- if len(packet) > maxPacket {
- return errors.New("ssh: packet too large")
- }
-
- paddingLength := packetSizeMultiple - (prefixLen+len(packet))%packetSizeMultiple
- if paddingLength < 4 {
- paddingLength += packetSizeMultiple
- }
-
- length := len(packet) + 1 + paddingLength
- binary.BigEndian.PutUint32(s.prefix[:], uint32(length))
- s.prefix[4] = byte(paddingLength)
- padding := s.padding[:paddingLength]
- if _, err := io.ReadFull(rand, padding); err != nil {
- return err
- }
-
- if s.mac != nil {
- s.mac.Reset()
- binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum)
- s.mac.Write(s.seqNumBytes[:])
- s.mac.Write(s.prefix[:])
- s.mac.Write(packet)
- s.mac.Write(padding)
- }
-
- s.cipher.XORKeyStream(s.prefix[:], s.prefix[:])
- s.cipher.XORKeyStream(packet, packet)
- s.cipher.XORKeyStream(padding, padding)
-
- if _, err := w.Write(s.prefix[:]); err != nil {
- return err
- }
- if _, err := w.Write(packet); err != nil {
- return err
- }
- if _, err := w.Write(padding); err != nil {
- return err
- }
-
- if s.mac != nil {
- s.macResult = s.mac.Sum(s.macResult[:0])
- if _, err := w.Write(s.macResult); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-type gcmCipher struct {
- aead cipher.AEAD
- prefix [4]byte
- iv []byte
- buf []byte
-}
-
-func newGCMCipher(iv, key, macKey []byte) (packetCipher, error) {
- c, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
-
- aead, err := cipher.NewGCM(c)
- if err != nil {
- return nil, err
- }
-
- return &gcmCipher{
- aead: aead,
- iv: iv,
- }, nil
-}
-
-const gcmTagSize = 16
-
-func (c *gcmCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error {
- // Pad out to multiple of 16 bytes. This is different from the
- // stream cipher because that encrypts the length too.
- padding := byte(packetSizeMultiple - (1+len(packet))%packetSizeMultiple)
- if padding < 4 {
- padding += packetSizeMultiple
- }
-
- length := uint32(len(packet) + int(padding) + 1)
- binary.BigEndian.PutUint32(c.prefix[:], length)
- if _, err := w.Write(c.prefix[:]); err != nil {
- return err
- }
-
- if cap(c.buf) < int(length) {
- c.buf = make([]byte, length)
- } else {
- c.buf = c.buf[:length]
- }
-
- c.buf[0] = padding
- copy(c.buf[1:], packet)
- if _, err := io.ReadFull(rand, c.buf[1+len(packet):]); err != nil {
- return err
- }
- c.buf = c.aead.Seal(c.buf[:0], c.iv, c.buf, c.prefix[:])
- if _, err := w.Write(c.buf); err != nil {
- return err
- }
- c.incIV()
-
- return nil
-}
-
-func (c *gcmCipher) incIV() {
- for i := 4 + 7; i >= 4; i-- {
- c.iv[i]++
- if c.iv[i] != 0 {
- break
- }
- }
-}
-
-func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) {
- if _, err := io.ReadFull(r, c.prefix[:]); err != nil {
- return nil, err
- }
- length := binary.BigEndian.Uint32(c.prefix[:])
- if length > maxPacket {
- return nil, errors.New("ssh: max packet length exceeded.")
- }
-
- if cap(c.buf) < int(length+gcmTagSize) {
- c.buf = make([]byte, length+gcmTagSize)
- } else {
- c.buf = c.buf[:length+gcmTagSize]
- }
-
- if _, err := io.ReadFull(r, c.buf); err != nil {
- return nil, err
- }
-
- plain, err := c.aead.Open(c.buf[:0], c.iv, c.buf, c.prefix[:])
- if err != nil {
- return nil, err
- }
- c.incIV()
-
- padding := plain[0]
- if padding < 4 || padding >= 20 {
- return nil, fmt.Errorf("ssh: illegal padding %d", padding)
- }
-
- if int(padding+1) >= len(plain) {
- return nil, fmt.Errorf("ssh: padding %d too large", padding)
- }
- plain = plain[1 : length-uint32(padding)]
- return plain, nil
+// defaultKeyExchangeOrder specifies a default set of key exchange algorithms
+// with preferences.
+var defaultKeyExchangeOrder = []string{
+ // P384 and P521 are not constant-time yet, but since we don't
+ // reuse ephemeral keys, using them for ECDH should be OK.
+ kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521,
+ kexAlgoDH14SHA1, kexAlgoDH1SHA1,
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/cipher_test.go b/vendor/code.google.com/p/go.crypto/ssh/cipher_test.go
index e279af04b..ea27bd8a8 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/cipher_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/cipher_test.go
@@ -6,54 +6,57 @@ package ssh
import (
"bytes"
- "crypto"
- "crypto/rand"
"testing"
)
+// TestCipherReversal tests that each cipher factory produces ciphers that can
+// encrypt and decrypt some data successfully.
+func TestCipherReversal(t *testing.T) {
+ testData := []byte("abcdefghijklmnopqrstuvwxyz012345")
+ testKey := []byte("AbCdEfGhIjKlMnOpQrStUvWxYz012345")
+ testIv := []byte("sdflkjhsadflkjhasdflkjhsadfklhsa")
+
+ cryptBuffer := make([]byte, 32)
+
+ for name, cipherMode := range cipherModes {
+ encrypter, err := cipherMode.createCipher(testKey, testIv)
+ if err != nil {
+ t.Errorf("failed to create encrypter for %q: %s", name, err)
+ continue
+ }
+ decrypter, err := cipherMode.createCipher(testKey, testIv)
+ if err != nil {
+ t.Errorf("failed to create decrypter for %q: %s", name, err)
+ continue
+ }
+
+ copy(cryptBuffer, testData)
+
+ encrypter.XORKeyStream(cryptBuffer, cryptBuffer)
+ if name == "none" {
+ if !bytes.Equal(cryptBuffer, testData) {
+ t.Errorf("encryption made change with 'none' cipher")
+ continue
+ }
+ } else {
+ if bytes.Equal(cryptBuffer, testData) {
+ t.Errorf("encryption made no change with %q", name)
+ continue
+ }
+ }
+
+ decrypter.XORKeyStream(cryptBuffer, cryptBuffer)
+ if !bytes.Equal(cryptBuffer, testData) {
+ t.Errorf("decrypted bytes not equal to input with %q", name)
+ continue
+ }
+ }
+}
+
func TestDefaultCiphersExist(t *testing.T) {
- for _, cipherAlgo := range supportedCiphers {
+ for _, cipherAlgo := range DefaultCipherOrder {
if _, ok := cipherModes[cipherAlgo]; !ok {
t.Errorf("default cipher %q is unknown", cipherAlgo)
}
}
}
-
-func TestPacketCiphers(t *testing.T) {
- for cipher := range cipherModes {
- kr := &kexResult{Hash: crypto.SHA1}
- algs := directionAlgorithms{
- Cipher: cipher,
- MAC: "hmac-sha1",
- Compression: "none",
- }
- client, err := newPacketCipher(clientKeys, algs, kr)
- if err != nil {
- t.Errorf("newPacketCipher(client, %q): %v", cipher, err)
- continue
- }
- server, err := newPacketCipher(clientKeys, algs, kr)
- if err != nil {
- t.Errorf("newPacketCipher(client, %q): %v", cipher, err)
- continue
- }
-
- want := "bla bla"
- input := []byte(want)
- buf := &bytes.Buffer{}
- if err := client.writePacket(0, buf, rand.Reader, input); err != nil {
- t.Errorf("writePacket(%q): %v", cipher, err)
- continue
- }
-
- packet, err := server.readPacket(0, buf)
- if err != nil {
- t.Errorf("readPacket(%q): %v", cipher, err)
- continue
- }
-
- if string(packet) != want {
- t.Errorf("roundtrip(%q): got %q, want %q", cipher, packet, want)
- }
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/client.go b/vendor/code.google.com/p/go.crypto/ssh/client.go
index 03c4e77d4..e2d255705 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/client.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/client.go
@@ -5,198 +5,520 @@
package ssh
import (
+ "crypto/rand"
+ "encoding/binary"
"errors"
"fmt"
+ "io"
"net"
"sync"
)
-// Client implements a traditional SSH client that supports shells,
-// subprocesses, port forwarding and tunneled dialing.
-type Client struct {
- Conn
+// ClientConn represents the client side of an SSH connection.
+type ClientConn struct {
+ transport *transport
+ config *ClientConfig
+ chanList // channels associated with this connection
+ forwardList // forwarded tcpip connections from the remote side
+ globalRequest
- forwards forwardList // forwarded tcpip connections from the remote side
- mu sync.Mutex
- channelHandlers map[string]chan NewChannel
+ // Address as passed to the Dial function.
+ dialAddress string
+
+ serverVersion string
}
-// HandleChannelOpen returns a channel on which NewChannel requests
-// for the given type are sent. If the type already is being handled,
-// nil is returned. The channel is closed when the connection is closed.
-func (c *Client) HandleChannelOpen(channelType string) <-chan NewChannel {
- c.mu.Lock()
- defer c.mu.Unlock()
- if c.channelHandlers == nil {
- // The SSH channel has been closed.
- c := make(chan NewChannel)
- close(c)
- return c
- }
-
- ch := c.channelHandlers[channelType]
- if ch != nil {
- return nil
- }
-
- ch = make(chan NewChannel, 16)
- c.channelHandlers[channelType] = ch
- return ch
+type globalRequest struct {
+ sync.Mutex
+ response chan interface{}
}
-// NewClient creates a Client on top of the given connection.
-func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client {
- conn := &Client{
- Conn: c,
- channelHandlers: make(map[string]chan NewChannel, 1),
- }
-
- go conn.handleGlobalRequests(reqs)
- go conn.handleChannelOpens(chans)
- go func() {
- conn.Wait()
- conn.forwards.closeAll()
- }()
- go conn.forwards.handleChannels(conn.HandleChannelOpen("forwarded-tcpip"))
- return conn
+// Client returns a new SSH client connection using c as the underlying transport.
+func Client(c net.Conn, config *ClientConfig) (*ClientConn, error) {
+ return clientWithAddress(c, "", config)
}
-// NewClientConn establishes an authenticated SSH connection using c
-// as the underlying transport. The Request and NewChannel channels
-// must be serviced or the connection will hang.
-func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan NewChannel, <-chan *Request, error) {
- fullConf := *config
- fullConf.SetDefaults()
- conn := &connection{
- sshConn: sshConn{conn: c},
+func clientWithAddress(c net.Conn, addr string, config *ClientConfig) (*ClientConn, error) {
+ conn := &ClientConn{
+ transport: newTransport(c, config.rand(), true /* is client */),
+ config: config,
+ globalRequest: globalRequest{response: make(chan interface{}, 1)},
+ dialAddress: addr,
}
- if err := conn.clientHandshake(addr, &fullConf); err != nil {
- c.Close()
- return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %v", err)
+ if err := conn.handshake(); err != nil {
+ conn.transport.Close()
+ return nil, fmt.Errorf("handshake failed: %v", err)
}
- conn.mux = newMux(conn.transport)
- return conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil
+ go conn.mainLoop()
+ return conn, nil
}
-// clientHandshake performs the client side key exchange. See RFC 4253 Section
-// 7.
-func (c *connection) clientHandshake(dialAddress string, config *ClientConfig) error {
- c.clientVersion = []byte(packageVersion)
- if config.ClientVersion != "" {
- c.clientVersion = []byte(config.ClientVersion)
+// Close closes the connection.
+func (c *ClientConn) Close() error { return c.transport.Close() }
+
+// LocalAddr returns the local network address.
+func (c *ClientConn) LocalAddr() net.Addr { return c.transport.LocalAddr() }
+
+// RemoteAddr returns the remote network address.
+func (c *ClientConn) RemoteAddr() net.Addr { return c.transport.RemoteAddr() }
+
+// handshake performs the client side key exchange. See RFC 4253 Section 7.
+func (c *ClientConn) handshake() error {
+ clientVersion := []byte(packageVersion)
+ if c.config.ClientVersion != "" {
+ clientVersion = []byte(c.config.ClientVersion)
}
- var err error
- c.serverVersion, err = exchangeVersions(c.sshConn.conn, c.clientVersion)
+ serverVersion, err := exchangeVersions(c.transport.Conn, clientVersion)
+ if err != nil {
+ return err
+ }
+ c.serverVersion = string(serverVersion)
+
+ clientKexInit := kexInitMsg{
+ KexAlgos: c.config.Crypto.kexes(),
+ ServerHostKeyAlgos: supportedHostKeyAlgos,
+ CiphersClientServer: c.config.Crypto.ciphers(),
+ CiphersServerClient: c.config.Crypto.ciphers(),
+ MACsClientServer: c.config.Crypto.macs(),
+ MACsServerClient: c.config.Crypto.macs(),
+ CompressionClientServer: supportedCompressions,
+ CompressionServerClient: supportedCompressions,
+ }
+ kexInitPacket := marshal(msgKexInit, clientKexInit)
+ if err := c.transport.writePacket(kexInitPacket); err != nil {
+ return err
+ }
+ packet, err := c.transport.readPacket()
if err != nil {
return err
}
- c.transport = newClientTransport(
- newTransport(c.sshConn.conn, config.Rand, true /* is client */),
- c.clientVersion, c.serverVersion, config, dialAddress, c.sshConn.RemoteAddr())
- if err := c.transport.requestKeyChange(); err != nil {
+ var serverKexInit kexInitMsg
+ if err = unmarshal(&serverKexInit, packet, msgKexInit); err != nil {
return err
}
- if packet, err := c.transport.readPacket(); err != nil {
- return err
- } else if packet[0] != msgNewKeys {
- return unexpectedMessageError(msgNewKeys, packet[0])
- }
- return c.clientAuthenticate(config)
-}
-
-// verifyHostKeySignature verifies the host key obtained in the key
-// exchange.
-func verifyHostKeySignature(hostKey PublicKey, result *kexResult) error {
- sig, rest, ok := parseSignatureBody(result.Signature)
- if len(rest) > 0 || !ok {
- return errors.New("ssh: signature parse error")
+ algs := findAgreedAlgorithms(&clientKexInit, &serverKexInit)
+ if algs == nil {
+ return errors.New("ssh: no common algorithms")
}
- return hostKey.Verify(result.H, sig)
-}
-
-// NewSession opens a new Session for this client. (A session is a remote
-// execution of a program.)
-func (c *Client) NewSession() (*Session, error) {
- ch, in, err := c.OpenChannel("session", nil)
- if err != nil {
- return nil, err
- }
- return newSession(ch, in)
-}
-
-func (c *Client) handleGlobalRequests(incoming <-chan *Request) {
- for r := range incoming {
- // This handles keepalive messages and matches
- // the behaviour of OpenSSH.
- r.Reply(false, nil)
- }
-}
-
-// handleChannelOpens channel open messages from the remote side.
-func (c *Client) handleChannelOpens(in <-chan NewChannel) {
- for ch := range in {
- c.mu.Lock()
- handler := c.channelHandlers[ch.ChannelType()]
- c.mu.Unlock()
-
- if handler != nil {
- handler <- ch
- } else {
- ch.Reject(UnknownChannelType, fmt.Sprintf("unknown channel type: %v", ch.ChannelType()))
+ if serverKexInit.FirstKexFollows && algs.kex != serverKexInit.KexAlgos[0] {
+ // The server sent a Kex message for the wrong algorithm,
+ // which we have to ignore.
+ if _, err := c.transport.readPacket(); err != nil {
+ return err
}
}
- c.mu.Lock()
- for _, ch := range c.channelHandlers {
- close(ch)
+ kex, ok := kexAlgoMap[algs.kex]
+ if !ok {
+ return fmt.Errorf("ssh: unexpected key exchange algorithm %v", algs.kex)
}
- c.channelHandlers = nil
- c.mu.Unlock()
+
+ magics := handshakeMagics{
+ clientVersion: clientVersion,
+ serverVersion: serverVersion,
+ clientKexInit: kexInitPacket,
+ serverKexInit: packet,
+ }
+ result, err := kex.Client(c.transport, c.config.rand(), &magics)
+ if err != nil {
+ return err
+ }
+
+ err = verifyHostKeySignature(algs.hostKey, result.HostKey, result.H, result.Signature)
+ if err != nil {
+ return err
+ }
+
+ if checker := c.config.HostKeyChecker; checker != nil {
+ err = checker.Check(c.dialAddress, c.transport.RemoteAddr(), algs.hostKey, result.HostKey)
+ if err != nil {
+ return err
+ }
+ }
+
+ c.transport.prepareKeyChange(algs, result)
+
+ if err = c.transport.writePacket([]byte{msgNewKeys}); err != nil {
+ return err
+ }
+ if packet, err = c.transport.readPacket(); err != nil {
+ return err
+ }
+ if packet[0] != msgNewKeys {
+ return UnexpectedMessageError{msgNewKeys, packet[0]}
+ }
+ return c.authenticate()
}
-// Dial starts a client connection to the given SSH server. It is a
-// convenience function that connects to the given network address,
-// initiates the SSH handshake, and then sets up a Client. For access
-// to incoming channels and requests, use net.Dial with NewClientConn
-// instead.
-func Dial(network, addr string, config *ClientConfig) (*Client, error) {
+// Verify the host key obtained in the key exchange.
+func verifyHostKeySignature(hostKeyAlgo string, hostKeyBytes []byte, data []byte, signature []byte) error {
+ hostKey, rest, ok := ParsePublicKey(hostKeyBytes)
+ if len(rest) > 0 || !ok {
+ return errors.New("ssh: could not parse hostkey")
+ }
+
+ sig, rest, ok := parseSignatureBody(signature)
+ if len(rest) > 0 || !ok {
+ return errors.New("ssh: signature parse error")
+ }
+ if sig.Format != hostKeyAlgo {
+ return fmt.Errorf("ssh: unexpected signature type %q", sig.Format)
+ }
+
+ if !hostKey.Verify(data, sig.Blob) {
+ return errors.New("ssh: host key signature error")
+ }
+ return nil
+}
+
+// mainLoop reads incoming messages and routes channel messages
+// to their respective ClientChans.
+func (c *ClientConn) mainLoop() {
+ defer func() {
+ c.transport.Close()
+ c.chanList.closeAll()
+ c.forwardList.closeAll()
+ }()
+
+ for {
+ packet, err := c.transport.readPacket()
+ if err != nil {
+ break
+ }
+ // TODO(dfc) A note on blocking channel use.
+ // The msg, data and dataExt channels of a clientChan can
+ // cause this loop to block indefinitely if the consumer does
+ // not service them.
+ switch packet[0] {
+ case msgChannelData:
+ if len(packet) < 9 {
+ // malformed data packet
+ return
+ }
+ remoteId := binary.BigEndian.Uint32(packet[1:5])
+ length := binary.BigEndian.Uint32(packet[5:9])
+ packet = packet[9:]
+
+ if length != uint32(len(packet)) {
+ return
+ }
+ ch, ok := c.getChan(remoteId)
+ if !ok {
+ return
+ }
+ ch.stdout.write(packet)
+ case msgChannelExtendedData:
+ if len(packet) < 13 {
+ // malformed data packet
+ return
+ }
+ remoteId := binary.BigEndian.Uint32(packet[1:5])
+ datatype := binary.BigEndian.Uint32(packet[5:9])
+ length := binary.BigEndian.Uint32(packet[9:13])
+ packet = packet[13:]
+
+ if length != uint32(len(packet)) {
+ return
+ }
+ // RFC 4254 5.2 defines data_type_code 1 to be data destined
+ // for stderr on interactive sessions. Other data types are
+ // silently discarded.
+ if datatype == 1 {
+ ch, ok := c.getChan(remoteId)
+ if !ok {
+ return
+ }
+ ch.stderr.write(packet)
+ }
+ default:
+ decoded, err := decode(packet)
+ if err != nil {
+ if _, ok := err.(UnexpectedMessageError); ok {
+ fmt.Printf("mainLoop: unexpected message: %v\n", err)
+ continue
+ }
+ return
+ }
+ switch msg := decoded.(type) {
+ case *channelOpenMsg:
+ c.handleChanOpen(msg)
+ case *channelOpenConfirmMsg:
+ ch, ok := c.getChan(msg.PeersId)
+ if !ok {
+ return
+ }
+ ch.msg <- msg
+ case *channelOpenFailureMsg:
+ ch, ok := c.getChan(msg.PeersId)
+ if !ok {
+ return
+ }
+ ch.msg <- msg
+ case *channelCloseMsg:
+ ch, ok := c.getChan(msg.PeersId)
+ if !ok {
+ return
+ }
+ ch.Close()
+ close(ch.msg)
+ c.chanList.remove(msg.PeersId)
+ case *channelEOFMsg:
+ ch, ok := c.getChan(msg.PeersId)
+ if !ok {
+ return
+ }
+ ch.stdout.eof()
+ // RFC 4254 is mute on how EOF affects dataExt messages but
+ // it is logical to signal EOF at the same time.
+ ch.stderr.eof()
+ case *channelRequestSuccessMsg:
+ ch, ok := c.getChan(msg.PeersId)
+ if !ok {
+ return
+ }
+ ch.msg <- msg
+ case *channelRequestFailureMsg:
+ ch, ok := c.getChan(msg.PeersId)
+ if !ok {
+ return
+ }
+ ch.msg <- msg
+ case *channelRequestMsg:
+ ch, ok := c.getChan(msg.PeersId)
+ if !ok {
+ return
+ }
+ ch.msg <- msg
+ case *windowAdjustMsg:
+ ch, ok := c.getChan(msg.PeersId)
+ if !ok {
+ return
+ }
+ if !ch.remoteWin.add(msg.AdditionalBytes) {
+ // invalid window update
+ return
+ }
+ case *globalRequestMsg:
+ // This handles keepalive messages and matches
+ // the behaviour of OpenSSH.
+ if msg.WantReply {
+ c.transport.writePacket(marshal(msgRequestFailure, globalRequestFailureMsg{}))
+ }
+ case *globalRequestSuccessMsg, *globalRequestFailureMsg:
+ c.globalRequest.response <- msg
+ case *disconnectMsg:
+ return
+ default:
+ fmt.Printf("mainLoop: unhandled message %T: %v\n", msg, msg)
+ }
+ }
+ }
+}
+
+// Handle channel open messages from the remote side.
+func (c *ClientConn) handleChanOpen(msg *channelOpenMsg) {
+ if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 {
+ c.sendConnectionFailed(msg.PeersId)
+ }
+
+ switch msg.ChanType {
+ case "forwarded-tcpip":
+ laddr, rest, ok := parseTCPAddr(msg.TypeSpecificData)
+ if !ok {
+ // invalid request
+ c.sendConnectionFailed(msg.PeersId)
+ return
+ }
+
+ l, ok := c.forwardList.lookup(*laddr)
+ if !ok {
+ // TODO: print on a more structured log.
+ fmt.Println("could not find forward list entry for", laddr)
+ // Section 7.2, implementations MUST reject spurious incoming
+ // connections.
+ c.sendConnectionFailed(msg.PeersId)
+ return
+ }
+ raddr, rest, ok := parseTCPAddr(rest)
+ if !ok {
+ // invalid request
+ c.sendConnectionFailed(msg.PeersId)
+ return
+ }
+ ch := c.newChan(c.transport)
+ ch.remoteId = msg.PeersId
+ ch.remoteWin.add(msg.PeersWindow)
+ ch.maxPacket = msg.MaxPacketSize
+
+ m := channelOpenConfirmMsg{
+ PeersId: ch.remoteId,
+ MyId: ch.localId,
+ MyWindow: channelWindowSize,
+ MaxPacketSize: channelMaxPacketSize,
+ }
+
+ c.transport.writePacket(marshal(msgChannelOpenConfirm, m))
+ l <- forward{ch, raddr}
+ default:
+ // unknown channel type
+ m := channelOpenFailureMsg{
+ PeersId: msg.PeersId,
+ Reason: UnknownChannelType,
+ Message: fmt.Sprintf("unknown channel type: %v", msg.ChanType),
+ Language: "en_US.UTF-8",
+ }
+ c.transport.writePacket(marshal(msgChannelOpenFailure, m))
+ }
+}
+
+// sendGlobalRequest sends a global request message as specified
+// in RFC4254 section 4. To correctly synchronise messages, a lock
+// is held internally until a response is returned.
+func (c *ClientConn) sendGlobalRequest(m interface{}) (*globalRequestSuccessMsg, error) {
+ c.globalRequest.Lock()
+ defer c.globalRequest.Unlock()
+ if err := c.transport.writePacket(marshal(msgGlobalRequest, m)); err != nil {
+ return nil, err
+ }
+ r := <-c.globalRequest.response
+ if r, ok := r.(*globalRequestSuccessMsg); ok {
+ return r, nil
+ }
+ return nil, errors.New("request failed")
+}
+
+// sendConnectionFailed rejects an incoming channel identified
+// by remoteId.
+func (c *ClientConn) sendConnectionFailed(remoteId uint32) error {
+ m := channelOpenFailureMsg{
+ PeersId: remoteId,
+ Reason: ConnectionFailed,
+ Message: "invalid request",
+ Language: "en_US.UTF-8",
+ }
+ return c.transport.writePacket(marshal(msgChannelOpenFailure, m))
+}
+
+// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr.
+// RFC 4254 section 7.2 is mute on what to do if parsing fails but the forwardlist
+// requires a valid *net.TCPAddr to operate, so we enforce that restriction here.
+func parseTCPAddr(b []byte) (*net.TCPAddr, []byte, bool) {
+ addr, b, ok := parseString(b)
+ if !ok {
+ return nil, b, false
+ }
+ port, b, ok := parseUint32(b)
+ if !ok {
+ return nil, b, false
+ }
+ ip := net.ParseIP(string(addr))
+ if ip == nil {
+ return nil, b, false
+ }
+ return &net.TCPAddr{IP: ip, Port: int(port)}, b, true
+}
+
+// Dial connects to the given network address using net.Dial and
+// then initiates a SSH handshake, returning the resulting client connection.
+func Dial(network, addr string, config *ClientConfig) (*ClientConn, error) {
conn, err := net.Dial(network, addr)
if err != nil {
return nil, err
}
- c, chans, reqs, err := NewClientConn(conn, addr, config)
- if err != nil {
- return nil, err
- }
- return NewClient(c, chans, reqs), nil
+ return clientWithAddress(conn, addr, config)
}
-// A ClientConfig structure is used to configure a Client. It must not be
-// modified after having been passed to an SSH function.
+// A ClientConfig structure is used to configure a ClientConn. After one has
+// been passed to an SSH function it must not be modified.
type ClientConfig struct {
- // Config contains configuration that is shared between clients and
- // servers.
- Config
+ // Rand provides the source of entropy for key exchange. If Rand is
+ // nil, the cryptographic random reader in package crypto/rand will
+ // be used.
+ Rand io.Reader
- // User contains the username to authenticate as.
+ // The username to authenticate.
User string
- // Auth contains possible authentication methods to use with the
- // server. Only the first instance of a particular RFC 4252 method will
- // be used during authentication.
- Auth []AuthMethod
+ // A slice of ClientAuth methods. Only the first instance
+ // of a particular RFC 4252 method will be used during authentication.
+ Auth []ClientAuth
- // HostKeyCallback, if not nil, is called during the cryptographic
- // handshake to validate the server's host key. A nil HostKeyCallback
+ // HostKeyChecker, if not nil, is called during the cryptographic
+ // handshake to validate the server's host key. A nil HostKeyChecker
// implies that all host keys are accepted.
- HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error
+ HostKeyChecker HostKeyChecker
- // ClientVersion contains the version identification string that will
- // be used for the connection. If empty, a reasonable default is used.
+ // Cryptographic-related configuration.
+ Crypto CryptoConfig
+
+ // The identification string that will be used for the connection.
+ // If empty, a reasonable default is used.
ClientVersion string
}
+
+func (c *ClientConfig) rand() io.Reader {
+ if c.Rand == nil {
+ return rand.Reader
+ }
+ return c.Rand
+}
+
+// Thread safe channel list.
+type chanList struct {
+ // protects concurrent access to chans
+ sync.Mutex
+ // chans are indexed by the local id of the channel, clientChan.localId.
+ // The PeersId value of messages received by ClientConn.mainLoop is
+ // used to locate the right local clientChan in this slice.
+ chans []*clientChan
+}
+
+// Allocate a new ClientChan with the next avail local id.
+func (c *chanList) newChan(p packetConn) *clientChan {
+ c.Lock()
+ defer c.Unlock()
+ for i := range c.chans {
+ if c.chans[i] == nil {
+ ch := newClientChan(p, uint32(i))
+ c.chans[i] = ch
+ return ch
+ }
+ }
+ i := len(c.chans)
+ ch := newClientChan(p, uint32(i))
+ c.chans = append(c.chans, ch)
+ return ch
+}
+
+func (c *chanList) getChan(id uint32) (*clientChan, bool) {
+ c.Lock()
+ defer c.Unlock()
+ if id >= uint32(len(c.chans)) {
+ return nil, false
+ }
+ return c.chans[id], true
+}
+
+func (c *chanList) remove(id uint32) {
+ c.Lock()
+ defer c.Unlock()
+ c.chans[id] = nil
+}
+
+func (c *chanList) closeAll() {
+ c.Lock()
+ defer c.Unlock()
+
+ for _, ch := range c.chans {
+ if ch == nil {
+ continue
+ }
+ ch.Close()
+ close(ch.msg)
+ }
+}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/client_auth.go b/vendor/code.google.com/p/go.crypto/ssh/client_auth.go
index e15be3ef2..29be0ca42 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/client_auth.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/client_auth.go
@@ -5,16 +5,16 @@
package ssh
import (
- "bytes"
"errors"
"fmt"
"io"
+ "net"
)
-// clientAuthenticate authenticates with the remote server. See RFC 4252.
-func (c *connection) clientAuthenticate(config *ClientConfig) error {
+// authenticate authenticates with the remote server. See RFC 4252.
+func (c *ClientConn) authenticate() error {
// initiate user auth session
- if err := c.transport.writePacket(Marshal(&serviceRequestMsg{serviceUserAuth})); err != nil {
+ if err := c.transport.writePacket(marshal(msgServiceRequest, serviceRequestMsg{serviceUserAuth})); err != nil {
return err
}
packet, err := c.transport.readPacket()
@@ -22,16 +22,14 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
return err
}
var serviceAccept serviceAcceptMsg
- if err := Unmarshal(packet, &serviceAccept); err != nil {
+ if err := unmarshal(&serviceAccept, packet, msgServiceAccept); err != nil {
return err
}
-
// during the authentication phase the client first attempts the "none" method
// then any untried methods suggested by the server.
- tried := make(map[string]bool)
- var lastMethods []string
- for auth := AuthMethod(new(noneAuth)); auth != nil; {
- ok, methods, err := auth.auth(c.transport.getSessionID(), config.User, c.transport, config.Rand)
+ tried, remain := make(map[string]bool), make(map[string]bool)
+ for auth := ClientAuth(new(noneAuth)); auth != nil; {
+ ok, methods, err := auth.auth(c.transport.sessionID, c.config.User, c.transport, c.config.rand())
if err != nil {
return err
}
@@ -40,46 +38,49 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
return nil
}
tried[auth.method()] = true
- if methods == nil {
- methods = lastMethods
- }
- lastMethods = methods
-
- auth = nil
-
- findNext:
- for _, a := range config.Auth {
- candidateMethod := a.method()
- if tried[candidateMethod] {
+ delete(remain, auth.method())
+ for _, meth := range methods {
+ if tried[meth] {
+ // if we've tried meth already, skip it.
continue
}
- for _, meth := range methods {
- if meth == candidateMethod {
- auth = a
- break findNext
- }
+ remain[meth] = true
+ }
+ auth = nil
+ for _, a := range c.config.Auth {
+ if remain[a.method()] {
+ auth = a
+ break
}
}
}
return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", keys(tried))
}
-func keys(m map[string]bool) []string {
- s := make([]string, 0, len(m))
-
- for key := range m {
- s = append(s, key)
+func keys(m map[string]bool) (s []string) {
+ for k := range m {
+ s = append(s, k)
}
- return s
+ return
}
-// An AuthMethod represents an instance of an RFC 4252 authentication method.
-type AuthMethod interface {
+// HostKeyChecker represents a database of known server host keys.
+type HostKeyChecker interface {
+ // Check is called during the handshake to check server's
+ // public key for unexpected changes. The hostKey argument is
+ // in SSH wire format. It can be parsed using
+ // ssh.ParsePublicKey. The address before DNS resolution is
+ // passed in the addr argument, so the key can also be checked
+ // against the hostname.
+ Check(addr string, remote net.Addr, algorithm string, hostKey []byte) error
+}
+
+// A ClientAuth represents an instance of an RFC 4252 authentication method.
+type ClientAuth interface {
// auth authenticates user over transport t.
// Returns true if authentication is successful.
// If authentication is not successful, a []string of alternative
- // method names is returned. If the slice is nil, it will be ignored
- // and the previous set of possible methods will be reused.
+ // method names is returned.
auth(session []byte, user string, p packetConn, rand io.Reader) (bool, []string, error)
// method returns the RFC 4252 method name.
@@ -90,7 +91,7 @@ type AuthMethod interface {
type noneAuth int
func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {
- if err := c.writePacket(Marshal(&userAuthRequestMsg{
+ if err := c.writePacket(marshal(msgUserAuthRequest, userAuthRequestMsg{
User: user,
Service: serviceSSH,
Method: "none",
@@ -105,31 +106,29 @@ func (n *noneAuth) method() string {
return "none"
}
-// passwordCallback is an AuthMethod that fetches the password through
-// a function call, e.g. by prompting the user.
-type passwordCallback func() (password string, err error)
+// "password" authentication, RFC 4252 Section 8.
+type passwordAuth struct {
+ ClientPassword
+}
-func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {
+func (p *passwordAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {
type passwordAuthMsg struct {
- User string `sshtype:"50"`
+ User string
Service string
Method string
Reply bool
Password string
}
- pw, err := cb()
- // REVIEW NOTE: is there a need to support skipping a password attempt?
- // The program may only find out that the user doesn't have a password
- // when prompting.
+ pw, err := p.Password(user)
if err != nil {
return false, nil, err
}
- if err := c.writePacket(Marshal(&passwordAuthMsg{
+ if err := c.writePacket(marshal(msgUserAuthRequest, passwordAuthMsg{
User: user,
Service: serviceSSH,
- Method: cb.method(),
+ Method: "password",
Reply: false,
Password: pw,
})); err != nil {
@@ -139,98 +138,110 @@ func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand
return handleAuthResponse(c)
}
-func (cb passwordCallback) method() string {
+func (p *passwordAuth) method() string {
return "password"
}
-// Password returns an AuthMethod using the given password.
-func Password(secret string) AuthMethod {
- return passwordCallback(func() (string, error) { return secret, nil })
+// A ClientPassword implements access to a client's passwords.
+type ClientPassword interface {
+ // Password returns the password to use for user.
+ Password(user string) (password string, err error)
}
-// PasswordCallback returns an AuthMethod that uses a callback for
-// fetching a password.
-func PasswordCallback(prompt func() (secret string, err error)) AuthMethod {
- return passwordCallback(prompt)
+// ClientAuthPassword returns a ClientAuth using password authentication.
+func ClientAuthPassword(impl ClientPassword) ClientAuth {
+ return &passwordAuth{impl}
+}
+
+// ClientKeyring implements access to a client key ring.
+type ClientKeyring interface {
+ // Key returns the i'th Publickey, or nil if no key exists at i.
+ Key(i int) (key PublicKey, err error)
+
+ // Sign returns a signature of the given data using the i'th key
+ // and the supplied random source.
+ Sign(i int, rand io.Reader, data []byte) (sig []byte, err error)
+}
+
+// "publickey" authentication, RFC 4252 Section 7.
+type publickeyAuth struct {
+ ClientKeyring
}
type publickeyAuthMsg struct {
- User string `sshtype:"50"`
+ User string
Service string
Method string
// HasSig indicates to the receiver packet that the auth request is signed and
// should be used for authentication of the request.
HasSig bool
Algoname string
- PubKey []byte
- // Sig is tagged with "rest" so Marshal will exclude it during
- // validateKey
+ Pubkey string
+ // Sig is defined as []byte so marshal will exclude it during validateKey
Sig []byte `ssh:"rest"`
}
-// publicKeyCallback is an AuthMethod that uses a set of key
-// pairs for authentication.
-type publicKeyCallback func() ([]Signer, error)
-
-func (cb publicKeyCallback) method() string {
- return "publickey"
-}
-
-func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {
+func (p *publickeyAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {
// Authentication is performed in two stages. The first stage sends an
// enquiry to test if each key is acceptable to the remote. The second
// stage attempts to authenticate with the valid keys obtained in the
// first stage.
- signers, err := cb()
- if err != nil {
- return false, nil, err
- }
- var validKeys []Signer
- for _, signer := range signers {
- if ok, err := validateKey(signer.PublicKey(), user, c); ok {
- validKeys = append(validKeys, signer)
+ var index int
+ // a map of public keys to their index in the keyring
+ validKeys := make(map[int]PublicKey)
+ for {
+ key, err := p.Key(index)
+ if err != nil {
+ return false, nil, err
+ }
+ if key == nil {
+ // no more keys in the keyring
+ break
+ }
+
+ if ok, err := p.validateKey(key, user, c); ok {
+ validKeys[index] = key
} else {
if err != nil {
return false, nil, err
}
}
+ index++
}
// methods that may continue if this auth is not successful.
var methods []string
- for _, signer := range validKeys {
- pub := signer.PublicKey()
-
- pubKey := pub.Marshal()
- sign, err := signer.Sign(rand, buildDataSignedForAuth(session, userAuthRequestMsg{
+ for i, key := range validKeys {
+ pubkey := MarshalPublicKey(key)
+ algoname := key.PublicKeyAlgo()
+ data := buildDataSignedForAuth(session, userAuthRequestMsg{
User: user,
Service: serviceSSH,
- Method: cb.method(),
- }, []byte(pub.Type()), pubKey))
+ Method: p.method(),
+ }, []byte(algoname), pubkey)
+ sigBlob, err := p.Sign(i, rand, data)
if err != nil {
return false, nil, err
}
-
// manually wrap the serialized signature in a string
- s := Marshal(sign)
+ s := serializeSignature(key.PublicKeyAlgo(), sigBlob)
sig := make([]byte, stringLength(len(s)))
marshalString(sig, s)
msg := publickeyAuthMsg{
User: user,
Service: serviceSSH,
- Method: cb.method(),
+ Method: p.method(),
HasSig: true,
- Algoname: pub.Type(),
- PubKey: pubKey,
+ Algoname: algoname,
+ Pubkey: string(pubkey),
Sig: sig,
}
- p := Marshal(&msg)
+ p := marshal(msgUserAuthRequest, msg)
if err := c.writePacket(p); err != nil {
return false, nil, err
}
- var success bool
- success, methods, err = handleAuthResponse(c)
+ success, methods, err := handleAuthResponse(c)
if err != nil {
return false, nil, err
}
@@ -241,27 +252,28 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand
return false, methods, nil
}
-// validateKey validates the key provided is acceptable to the server.
-func validateKey(key PublicKey, user string, c packetConn) (bool, error) {
- pubKey := key.Marshal()
+// validateKey validates the key provided it is acceptable to the server.
+func (p *publickeyAuth) validateKey(key PublicKey, user string, c packetConn) (bool, error) {
+ pubkey := MarshalPublicKey(key)
+ algoname := key.PublicKeyAlgo()
msg := publickeyAuthMsg{
User: user,
Service: serviceSSH,
- Method: "publickey",
+ Method: p.method(),
HasSig: false,
- Algoname: key.Type(),
- PubKey: pubKey,
+ Algoname: algoname,
+ Pubkey: string(pubkey),
}
- if err := c.writePacket(Marshal(&msg)); err != nil {
+ if err := c.writePacket(marshal(msgUserAuthRequest, msg)); err != nil {
return false, err
}
- return confirmKeyAck(key, c)
+ return p.confirmKeyAck(key, c)
}
-func confirmKeyAck(key PublicKey, c packetConn) (bool, error) {
- pubKey := key.Marshal()
- algoname := key.Type()
+func (p *publickeyAuth) confirmKeyAck(key PublicKey, c packetConn) (bool, error) {
+ pubkey := MarshalPublicKey(key)
+ algoname := key.PublicKeyAlgo()
for {
packet, err := c.readPacket()
@@ -272,32 +284,30 @@ func confirmKeyAck(key PublicKey, c packetConn) (bool, error) {
case msgUserAuthBanner:
// TODO(gpaul): add callback to present the banner to the user
case msgUserAuthPubKeyOk:
- var msg userAuthPubKeyOkMsg
- if err := Unmarshal(packet, &msg); err != nil {
+ msg := userAuthPubKeyOkMsg{}
+ if err := unmarshal(&msg, packet, msgUserAuthPubKeyOk); err != nil {
return false, err
}
- if msg.Algo != algoname || !bytes.Equal(msg.PubKey, pubKey) {
+ if msg.Algo != algoname || msg.PubKey != string(pubkey) {
return false, nil
}
return true, nil
case msgUserAuthFailure:
return false, nil
default:
- return false, unexpectedMessageError(msgUserAuthSuccess, packet[0])
+ return false, UnexpectedMessageError{msgUserAuthSuccess, packet[0]}
}
}
+ panic("unreachable")
}
-// PublicKeys returns an AuthMethod that uses the given key
-// pairs.
-func PublicKeys(signers ...Signer) AuthMethod {
- return publicKeyCallback(func() ([]Signer, error) { return signers, nil })
+func (p *publickeyAuth) method() string {
+ return "publickey"
}
-// PublicKeysCallback returns an AuthMethod that runs the given
-// function to obtain a list of key pairs.
-func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMethod {
- return publicKeyCallback(getSigners)
+// ClientAuthKeyring returns a ClientAuth using public key authentication.
+func ClientAuthKeyring(impl ClientKeyring) ClientAuth {
+ return &publickeyAuth{impl}
}
// handleAuthResponse returns whether the preceding authentication request succeeded
@@ -314,8 +324,8 @@ func handleAuthResponse(c packetConn) (bool, []string, error) {
case msgUserAuthBanner:
// TODO: add callback to present the banner to the user
case msgUserAuthFailure:
- var msg userAuthFailureMsg
- if err := Unmarshal(packet, &msg); err != nil {
+ msg := userAuthFailureMsg{}
+ if err := unmarshal(&msg, packet, msgUserAuthFailure); err != nil {
return false, nil, err
}
return false, msg.Methods, nil
@@ -324,40 +334,98 @@ func handleAuthResponse(c packetConn) (bool, []string, error) {
case msgDisconnect:
return false, nil, io.EOF
default:
- return false, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0])
+ return false, nil, UnexpectedMessageError{msgUserAuthSuccess, packet[0]}
}
}
+ panic("unreachable")
}
-// KeyboardInteractiveChallenge should print questions, optionally
-// disabling echoing (e.g. for passwords), and return all the answers.
-// Challenge may be called multiple times in a single session. After
-// successful authentication, the server may send a challenge with no
-// questions, for which the user and instruction messages should be
-// printed. RFC 4256 section 3.3 details how the UI should behave for
-// both CLI and GUI environments.
-type KeyboardInteractiveChallenge func(user, instruction string, questions []string, echos []bool) (answers []string, err error)
-
-// KeyboardInteractive returns a AuthMethod using a prompt/response
-// sequence controlled by the server.
-func KeyboardInteractive(challenge KeyboardInteractiveChallenge) AuthMethod {
- return challenge
+// ClientAuthAgent returns a ClientAuth using public key authentication via
+// an agent.
+func ClientAuthAgent(agent *AgentClient) ClientAuth {
+ return ClientAuthKeyring(&agentKeyring{agent: agent})
}
-func (cb KeyboardInteractiveChallenge) method() string {
+// agentKeyring implements ClientKeyring.
+type agentKeyring struct {
+ agent *AgentClient
+ keys []*AgentKey
+}
+
+func (kr *agentKeyring) Key(i int) (key PublicKey, err error) {
+ if kr.keys == nil {
+ if kr.keys, err = kr.agent.RequestIdentities(); err != nil {
+ return
+ }
+ }
+ if i >= len(kr.keys) {
+ return
+ }
+ return kr.keys[i].Key()
+}
+
+func (kr *agentKeyring) Sign(i int, rand io.Reader, data []byte) (sig []byte, err error) {
+ var key PublicKey
+ if key, err = kr.Key(i); err != nil {
+ return
+ }
+ if key == nil {
+ return nil, errors.New("ssh: key index out of range")
+ }
+ if sig, err = kr.agent.SignRequest(key, data); err != nil {
+ return
+ }
+
+ // Unmarshal the signature.
+
+ var ok bool
+ if _, sig, ok = parseString(sig); !ok {
+ return nil, errors.New("ssh: malformed signature response from agent")
+ }
+ if sig, _, ok = parseString(sig); !ok {
+ return nil, errors.New("ssh: malformed signature response from agent")
+ }
+ return sig, nil
+}
+
+// ClientKeyboardInteractive should prompt the user for the given
+// questions.
+type ClientKeyboardInteractive interface {
+ // Challenge should print the questions, optionally disabling
+ // echoing (eg. for passwords), and return all the answers.
+ // Challenge may be called multiple times in a single
+ // session. After successful authentication, the server may
+ // send a challenge with no questions, for which the user and
+ // instruction messages should be printed. RFC 4256 section
+ // 3.3 details how the UI should behave for both CLI and
+ // GUI environments.
+ Challenge(user, instruction string, questions []string, echos []bool) ([]string, error)
+}
+
+// ClientAuthKeyboardInteractive returns a ClientAuth using a
+// prompt/response sequence controlled by the server.
+func ClientAuthKeyboardInteractive(impl ClientKeyboardInteractive) ClientAuth {
+ return &keyboardInteractiveAuth{impl}
+}
+
+type keyboardInteractiveAuth struct {
+ ClientKeyboardInteractive
+}
+
+func (k *keyboardInteractiveAuth) method() string {
return "keyboard-interactive"
}
-func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {
+func (k *keyboardInteractiveAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {
type initiateMsg struct {
- User string `sshtype:"50"`
+ User string
Service string
Method string
Language string
Submethods string
}
- if err := c.writePacket(Marshal(&initiateMsg{
+ if err := c.writePacket(marshal(msgUserAuthRequest, initiateMsg{
User: user,
Service: serviceSSH,
Method: "keyboard-interactive",
@@ -380,18 +448,18 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe
// OK
case msgUserAuthFailure:
var msg userAuthFailureMsg
- if err := Unmarshal(packet, &msg); err != nil {
+ if err := unmarshal(&msg, packet, msgUserAuthFailure); err != nil {
return false, nil, err
}
return false, msg.Methods, nil
case msgUserAuthSuccess:
return true, nil, nil
default:
- return false, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0])
+ return false, nil, UnexpectedMessageError{msgUserAuthInfoRequest, packet[0]}
}
var msg userAuthInfoRequestMsg
- if err := Unmarshal(packet, &msg); err != nil {
+ if err := unmarshal(&msg, packet, packet[0]); err != nil {
return false, nil, err
}
@@ -410,10 +478,10 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe
}
if len(rest) != 0 {
- return false, nil, errors.New("ssh: extra data following keyboard-interactive pairs")
+ return false, nil, fmt.Errorf("ssh: junk following message %q", rest)
}
- answers, err := cb(msg.User, msg.Instruction, prompts, echos)
+ answers, err := k.Challenge(msg.User, msg.Instruction, prompts, echos)
if err != nil {
return false, nil, err
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/client_auth_test.go b/vendor/code.google.com/p/go.crypto/ssh/client_auth_test.go
index c92b58786..f2fc9c646 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/client_auth_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/client_auth_test.go
@@ -6,388 +6,363 @@ package ssh
import (
"bytes"
- "crypto/rand"
- "errors"
- "fmt"
+ "crypto/dsa"
+ "io"
+ "io/ioutil"
+ "math/big"
"strings"
"testing"
+
+ _ "crypto/sha1"
)
+// private key for mock server
+const testServerPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEA19lGVsTqIT5iiNYRgnoY1CwkbETW5cq+Rzk5v/kTlf31XpSU
+70HVWkbTERECjaYdXM2gGcbb+sxpq6GtXf1M3kVomycqhxwhPv4Cr6Xp4WT/jkFx
+9z+FFzpeodGJWjOH6L2H5uX1Cvr9EDdQp9t9/J32/qBFntY8GwoUI/y/1MSTmMiF
+tupdMODN064vd3gyMKTwrlQ8tZM6aYuyOPsutLlUY7M5x5FwMDYvnPDSeyT/Iw0z
+s3B+NCyqeeMd2T7YzQFnRATj0M7rM5LoSs7DVqVriOEABssFyLj31PboaoLhOKgc
+qoM9khkNzr7FHVvi+DhYM2jD0DwvqZLN6NmnLwIDAQABAoIBAQCGVj+kuSFOV1lT
++IclQYA6bM6uY5mroqcSBNegVxCNhWU03BxlW//BE9tA/+kq53vWylMeN9mpGZea
+riEMIh25KFGWXqXlOOioH8bkMsqA8S7sBmc7jljyv+0toQ9vCCtJ+sueNPhxQQxH
+D2YvUjfzBQ04I9+wn30BByDJ1QA/FoPsunxIOUCcRBE/7jxuLYcpR+JvEF68yYIh
+atXRld4W4in7T65YDR8jK1Uj9XAcNeDYNpT/M6oFLx1aPIlkG86aCWRO19S1jLPT
+b1ZAKHHxPMCVkSYW0RqvIgLXQOR62D0Zne6/2wtzJkk5UCjkSQ2z7ZzJpMkWgDgN
+ifCULFPBAoGBAPoMZ5q1w+zB+knXUD33n1J+niN6TZHJulpf2w5zsW+m2K6Zn62M
+MXndXlVAHtk6p02q9kxHdgov34Uo8VpuNjbS1+abGFTI8NZgFo+bsDxJdItemwC4
+KJ7L1iz39hRN/ZylMRLz5uTYRGddCkeIHhiG2h7zohH/MaYzUacXEEy3AoGBANz8
+e/msleB+iXC0cXKwds26N4hyMdAFE5qAqJXvV3S2W8JZnmU+sS7vPAWMYPlERPk1
+D8Q2eXqdPIkAWBhrx4RxD7rNc5qFNcQWEhCIxC9fccluH1y5g2M+4jpMX2CT8Uv+
+3z+NoJ5uDTXZTnLCfoZzgZ4nCZVZ+6iU5U1+YXFJAoGBANLPpIV920n/nJmmquMj
+orI1R/QXR9Cy56cMC65agezlGOfTYxk5Cfl5Ve+/2IJCfgzwJyjWUsFx7RviEeGw
+64o7JoUom1HX+5xxdHPsyZ96OoTJ5RqtKKoApnhRMamau0fWydH1yeOEJd+TRHhc
+XStGfhz8QNa1dVFvENczja1vAoGABGWhsd4VPVpHMc7lUvrf4kgKQtTC2PjA4xoc
+QJ96hf/642sVE76jl+N6tkGMzGjnVm4P2j+bOy1VvwQavKGoXqJBRd5Apppv727g
+/SM7hBXKFc/zH80xKBBgP/i1DR7kdjakCoeu4ngeGywvu2jTS6mQsqzkK+yWbUxJ
+I7mYBsECgYB/KNXlTEpXtz/kwWCHFSYA8U74l7zZbVD8ul0e56JDK+lLcJ0tJffk
+gqnBycHj6AhEycjda75cs+0zybZvN4x65KZHOGW/O/7OAWEcZP5TPb3zf9ned3Hl
+NsZoFj52ponUM6+99A2CmezFCN16c4mbA//luWF+k3VVqR6BpkrhKw==
+-----END RSA PRIVATE KEY-----`
+
+const testClientPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
+MIIBOwIBAAJBALdGZxkXDAjsYk10ihwU6Id2KeILz1TAJuoq4tOgDWxEEGeTrcld
+r/ZwVaFzjWzxaf6zQIJbfaSEAhqD5yo72+sCAwEAAQJBAK8PEVU23Wj8mV0QjwcJ
+tZ4GcTUYQL7cF4+ezTCE9a1NrGnCP2RuQkHEKxuTVrxXt+6OF15/1/fuXnxKjmJC
+nxkCIQDaXvPPBi0c7vAxGwNY9726x01/dNbHCE0CBtcotobxpwIhANbbQbh3JHVW
+2haQh4fAG5mhesZKAGcxTyv4mQ7uMSQdAiAj+4dzMpJWdSzQ+qGHlHMIBvVHLkqB
+y2VdEyF7DPCZewIhAI7GOI/6LDIFOvtPo6Bj2nNmyQ1HU6k/LRtNIXi4c9NJAiAr
+rrxx26itVhJmcvoUhOjwuzSlP2bE5VHAvkGB352YBg==
+-----END RSA PRIVATE KEY-----`
+
+// keychain implements the ClientKeyring interface
+type keychain struct {
+ keys []Signer
+}
+
+func (k *keychain) Key(i int) (PublicKey, error) {
+ if i < 0 || i >= len(k.keys) {
+ return nil, nil
+ }
+
+ return k.keys[i].PublicKey(), nil
+}
+
+func (k *keychain) Sign(i int, rand io.Reader, data []byte) (sig []byte, err error) {
+ return k.keys[i].Sign(rand, data)
+}
+
+func (k *keychain) add(key Signer) {
+ k.keys = append(k.keys, key)
+}
+
+func (k *keychain) loadPEM(file string) error {
+ buf, err := ioutil.ReadFile(file)
+ if err != nil {
+ return err
+ }
+ key, err := ParsePrivateKey(buf)
+ if err != nil {
+ return err
+ }
+ k.add(key)
+ return nil
+}
+
+// password implements the ClientPassword interface
+type password string
+
+func (p password) Password(user string) (string, error) {
+ return string(p), nil
+}
+
type keyboardInteractive map[string]string
-func (cr keyboardInteractive) Challenge(user string, instruction string, questions []string, echos []bool) ([]string, error) {
+func (cr *keyboardInteractive) Challenge(user string, instruction string, questions []string, echos []bool) ([]string, error) {
var answers []string
for _, q := range questions {
- answers = append(answers, cr[q])
+ answers = append(answers, (*cr)[q])
}
return answers, nil
}
// reused internally by tests
-var clientPassword = "tiger"
-
-// tryAuth runs a handshake with a given config against an SSH server
-// with config serverConfig
-func tryAuth(t *testing.T, config *ClientConfig) error {
- c1, c2, err := netPipe()
- if err != nil {
- t.Fatalf("netPipe: %v", err)
- }
- defer c1.Close()
- defer c2.Close()
-
- certChecker := CertChecker{
- IsAuthority: func(k PublicKey) bool {
- return bytes.Equal(k.Marshal(), testPublicKeys["ecdsa"].Marshal())
+var (
+ rsaKey Signer
+ dsaKey Signer
+ clientKeychain = new(keychain)
+ clientPassword = password("tiger")
+ serverConfig = &ServerConfig{
+ PasswordCallback: func(conn *ServerConn, user, pass string) bool {
+ return user == "testuser" && pass == string(clientPassword)
},
- UserKeyFallback: func(conn ConnMetadata, key PublicKey) (*Permissions, error) {
- if conn.User() == "testuser" && bytes.Equal(key.Marshal(), testPublicKeys["rsa"].Marshal()) {
- return nil, nil
- }
-
- return nil, fmt.Errorf("pubkey for %q not acceptable", conn.User())
+ PublicKeyCallback: func(conn *ServerConn, user, algo string, pubkey []byte) bool {
+ key, _ := clientKeychain.Key(0)
+ expected := MarshalPublicKey(key)
+ algoname := key.PublicKeyAlgo()
+ return user == "testuser" && algo == algoname && bytes.Equal(pubkey, expected)
},
- IsRevoked: func(c *Certificate) bool {
- return c.Serial == 666
- },
- }
-
- serverConfig := &ServerConfig{
- PasswordCallback: func(conn ConnMetadata, pass []byte) (*Permissions, error) {
- if conn.User() == "testuser" && string(pass) == clientPassword {
- return nil, nil
- }
- return nil, errors.New("password auth failed")
- },
- PublicKeyCallback: certChecker.Authenticate,
- KeyboardInteractiveCallback: func(conn ConnMetadata, challenge KeyboardInteractiveChallenge) (*Permissions, error) {
- ans, err := challenge("user",
+ KeyboardInteractiveCallback: func(conn *ServerConn, user string, client ClientKeyboardInteractive) bool {
+ ans, err := client.Challenge("user",
"instruction",
[]string{"question1", "question2"},
[]bool{true, true})
if err != nil {
- return nil, err
+ return false
}
- ok := conn.User() == "testuser" && ans[0] == "answer1" && ans[1] == "answer2"
- if ok {
- challenge("user", "motd", nil, nil)
- return nil, nil
- }
- return nil, errors.New("keyboard-interactive failed")
- },
- AuthLogCallback: func(conn ConnMetadata, method string, err error) {
- t.Logf("user %q, method %q: %v", conn.User(), method, err)
+ ok := user == "testuser" && ans[0] == "answer1" && ans[1] == "answer2"
+ client.Challenge("user", "motd", nil, nil)
+ return ok
},
}
- serverConfig.AddHostKey(testSigners["rsa"])
+)
- go newServer(c1, serverConfig)
- _, _, _, err = NewClientConn(c2, "", config)
- return err
+func init() {
+ var err error
+ rsaKey, err = ParsePrivateKey([]byte(testServerPrivateKey))
+ if err != nil {
+ panic("unable to set private key: " + err.Error())
+ }
+ rawDSAKey := new(dsa.PrivateKey)
+
+ // taken from crypto/dsa/dsa_test.go
+ rawDSAKey.P, _ = new(big.Int).SetString("A9B5B793FB4785793D246BAE77E8FF63CA52F442DA763C440259919FE1BC1D6065A9350637A04F75A2F039401D49F08E066C4D275A5A65DA5684BC563C14289D7AB8A67163BFBF79D85972619AD2CFF55AB0EE77A9002B0EF96293BDD0F42685EBB2C66C327079F6C98000FBCB79AACDE1BC6F9D5C7B1A97E3D9D54ED7951FEF", 16)
+ rawDSAKey.Q, _ = new(big.Int).SetString("E1D3391245933D68A0714ED34BBCB7A1F422B9C1", 16)
+ rawDSAKey.G, _ = new(big.Int).SetString("634364FC25248933D01D1993ECABD0657CC0CB2CEED7ED2E3E8AECDFCDC4A25C3B15E9E3B163ACA2984B5539181F3EFF1A5E8903D71D5B95DA4F27202B77D2C44B430BB53741A8D59A8F86887525C9F2A6A5980A195EAA7F2FF910064301DEF89D3AA213E1FAC7768D89365318E370AF54A112EFBA9246D9158386BA1B4EEFDA", 16)
+ rawDSAKey.Y, _ = new(big.Int).SetString("32969E5780CFE1C849A1C276D7AEB4F38A23B591739AA2FE197349AEEBD31366AEE5EB7E6C6DDB7C57D02432B30DB5AA66D9884299FAA72568944E4EEDC92EA3FBC6F39F53412FBCC563208F7C15B737AC8910DBC2D9C9B8C001E72FDC40EB694AB1F06A5A2DBD18D9E36C66F31F566742F11EC0A52E9F7B89355C02FB5D32D2", 16)
+ rawDSAKey.X, _ = new(big.Int).SetString("5078D4D29795CBE76D3AACFE48C9AF0BCDBEE91A", 16)
+
+ dsaKey, err = NewSignerFromKey(rawDSAKey)
+ if err != nil {
+ panic("NewSignerFromKey: " + err.Error())
+ }
+ clientKeychain.add(rsaKey)
+ serverConfig.AddHostKey(rsaKey)
+}
+
+// newMockAuthServer creates a new Server bound to
+// the loopback interface. The server exits after
+// processing one handshake.
+func newMockAuthServer(t *testing.T) string {
+ l, err := Listen("tcp", "127.0.0.1:0", serverConfig)
+ if err != nil {
+ t.Fatalf("unable to newMockAuthServer: %s", err)
+ }
+ go func() {
+ defer l.Close()
+ c, err := l.Accept()
+ if err != nil {
+ t.Errorf("Unable to accept incoming connection: %v", err)
+ return
+ }
+ if err := c.Handshake(); err != nil {
+ // not Errorf because this is expected to
+ // fail for some tests.
+ t.Logf("Handshaking error: %v", err)
+ return
+ }
+ defer c.Close()
+ }()
+ return l.Addr().String()
}
func TestClientAuthPublicKey(t *testing.T) {
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- PublicKeys(testSigners["rsa"]),
+ Auth: []ClientAuth{
+ ClientAuthKeyring(clientKeychain),
},
}
- if err := tryAuth(t, config); err != nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err != nil {
t.Fatalf("unable to dial remote side: %s", err)
}
+ c.Close()
}
-func TestAuthMethodPassword(t *testing.T) {
+func TestClientAuthPassword(t *testing.T) {
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- Password(clientPassword),
+ Auth: []ClientAuth{
+ ClientAuthPassword(clientPassword),
},
}
- if err := tryAuth(t, config); err != nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err != nil {
t.Fatalf("unable to dial remote side: %s", err)
}
+ c.Close()
}
-func TestAuthMethodFallback(t *testing.T) {
- var passwordCalled bool
+func TestClientAuthWrongPassword(t *testing.T) {
+ wrongPw := password("wrong")
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- PublicKeys(testSigners["rsa"]),
- PasswordCallback(
- func() (string, error) {
- passwordCalled = true
- return "WRONG", nil
- }),
+ Auth: []ClientAuth{
+ ClientAuthPassword(wrongPw),
+ ClientAuthKeyring(clientKeychain),
},
}
- if err := tryAuth(t, config); err != nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err != nil {
t.Fatalf("unable to dial remote side: %s", err)
}
-
- if passwordCalled {
- t.Errorf("password auth tried before public-key auth.")
- }
+ c.Close()
}
-func TestAuthMethodWrongPassword(t *testing.T) {
- config := &ClientConfig{
- User: "testuser",
- Auth: []AuthMethod{
- Password("wrong"),
- PublicKeys(testSigners["rsa"]),
- },
- }
-
- if err := tryAuth(t, config); err != nil {
- t.Fatalf("unable to dial remote side: %s", err)
- }
-}
-
-func TestAuthMethodKeyboardInteractive(t *testing.T) {
+func TestClientAuthKeyboardInteractive(t *testing.T) {
answers := keyboardInteractive(map[string]string{
"question1": "answer1",
"question2": "answer2",
})
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- KeyboardInteractive(answers.Challenge),
+ Auth: []ClientAuth{
+ ClientAuthKeyboardInteractive(&answers),
},
}
- if err := tryAuth(t, config); err != nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err != nil {
t.Fatalf("unable to dial remote side: %s", err)
}
+ c.Close()
}
-func TestAuthMethodWrongKeyboardInteractive(t *testing.T) {
+func TestClientAuthWrongKeyboardInteractive(t *testing.T) {
answers := keyboardInteractive(map[string]string{
"question1": "answer1",
"question2": "WRONG",
})
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- KeyboardInteractive(answers.Challenge),
+ Auth: []ClientAuth{
+ ClientAuthKeyboardInteractive(&answers),
},
}
- if err := tryAuth(t, config); err == nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err == nil {
+ c.Close()
t.Fatalf("wrong answers should not have authenticated with KeyboardInteractive")
}
}
// the mock server will only authenticate ssh-rsa keys
-func TestAuthMethodInvalidPublicKey(t *testing.T) {
+func TestClientAuthInvalidPublicKey(t *testing.T) {
+ kc := new(keychain)
+
+ kc.add(dsaKey)
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- PublicKeys(testSigners["dsa"]),
+ Auth: []ClientAuth{
+ ClientAuthKeyring(kc),
},
}
- if err := tryAuth(t, config); err == nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err == nil {
+ c.Close()
t.Fatalf("dsa private key should not have authenticated with rsa public key")
}
}
// the client should authenticate with the second key
-func TestAuthMethodRSAandDSA(t *testing.T) {
+func TestClientAuthRSAandDSA(t *testing.T) {
+ kc := new(keychain)
+ kc.add(dsaKey)
+ kc.add(rsaKey)
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- PublicKeys(testSigners["dsa"], testSigners["rsa"]),
+ Auth: []ClientAuth{
+ ClientAuthKeyring(kc),
},
}
- if err := tryAuth(t, config); err != nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err != nil {
t.Fatalf("client could not authenticate with rsa key: %v", err)
}
+ c.Close()
}
func TestClientHMAC(t *testing.T) {
- for _, mac := range supportedMACs {
+ kc := new(keychain)
+ kc.add(rsaKey)
+ for _, mac := range DefaultMACOrder {
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- PublicKeys(testSigners["rsa"]),
+ Auth: []ClientAuth{
+ ClientAuthKeyring(kc),
},
- Config: Config{
+ Crypto: CryptoConfig{
MACs: []string{mac},
},
}
- if err := tryAuth(t, config); err != nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err != nil {
t.Fatalf("client could not authenticate with mac algo %s: %v", mac, err)
}
+ c.Close()
}
}
// issue 4285.
func TestClientUnsupportedCipher(t *testing.T) {
+ kc := new(keychain)
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- PublicKeys(),
+ Auth: []ClientAuth{
+ ClientAuthKeyring(kc),
},
- Config: Config{
+ Crypto: CryptoConfig{
Ciphers: []string{"aes128-cbc"}, // not currently supported
},
}
- if err := tryAuth(t, config); err == nil {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err == nil {
t.Errorf("expected no ciphers in common")
+ c.Close()
}
}
func TestClientUnsupportedKex(t *testing.T) {
+ kc := new(keychain)
config := &ClientConfig{
User: "testuser",
- Auth: []AuthMethod{
- PublicKeys(),
+ Auth: []ClientAuth{
+ ClientAuthKeyring(kc),
},
- Config: Config{
+ Crypto: CryptoConfig{
KeyExchanges: []string{"diffie-hellman-group-exchange-sha256"}, // not currently supported
},
}
- if err := tryAuth(t, config); err == nil || !strings.Contains(err.Error(), "no common algorithms") {
+ c, err := Dial("tcp", newMockAuthServer(t), config)
+ if err == nil || !strings.Contains(err.Error(), "no common algorithms") {
t.Errorf("got %v, expected 'no common algorithms'", err)
}
-}
-
-func TestClientLoginCert(t *testing.T) {
- cert := &Certificate{
- Key: testPublicKeys["rsa"],
- ValidBefore: CertTimeInfinity,
- CertType: UserCert,
- }
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
- certSigner, err := NewCertSigner(cert, testSigners["rsa"])
- if err != nil {
- t.Fatalf("NewCertSigner: %v", err)
- }
-
- clientConfig := &ClientConfig{
- User: "user",
- }
- clientConfig.Auth = append(clientConfig.Auth, PublicKeys(certSigner))
-
- t.Log("should succeed")
- if err := tryAuth(t, clientConfig); err != nil {
- t.Errorf("cert login failed: %v", err)
- }
-
- t.Log("corrupted signature")
- cert.Signature.Blob[0]++
- if err := tryAuth(t, clientConfig); err == nil {
- t.Errorf("cert login passed with corrupted sig")
- }
-
- t.Log("revoked")
- cert.Serial = 666
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
- if err := tryAuth(t, clientConfig); err == nil {
- t.Errorf("revoked cert login succeeded")
- }
- cert.Serial = 1
-
- t.Log("sign with wrong key")
- cert.SignCert(rand.Reader, testSigners["dsa"])
- if err := tryAuth(t, clientConfig); err == nil {
- t.Errorf("cert login passed with non-authoritive key")
- }
-
- t.Log("host cert")
- cert.CertType = HostCert
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
- if err := tryAuth(t, clientConfig); err == nil {
- t.Errorf("cert login passed with wrong type")
- }
- cert.CertType = UserCert
-
- t.Log("principal specified")
- cert.ValidPrincipals = []string{"user"}
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
- if err := tryAuth(t, clientConfig); err != nil {
- t.Errorf("cert login failed: %v", err)
- }
-
- t.Log("wrong principal specified")
- cert.ValidPrincipals = []string{"fred"}
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
- if err := tryAuth(t, clientConfig); err == nil {
- t.Errorf("cert login passed with wrong principal")
- }
- cert.ValidPrincipals = nil
-
- t.Log("added critical option")
- cert.CriticalOptions = map[string]string{"root-access": "yes"}
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
- if err := tryAuth(t, clientConfig); err == nil {
- t.Errorf("cert login passed with unrecognized critical option")
- }
-
- t.Log("allowed source address")
- cert.CriticalOptions = map[string]string{"source-address": "127.0.0.42/24"}
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
- if err := tryAuth(t, clientConfig); err != nil {
- t.Errorf("cert login with source-address failed: %v", err)
- }
-
- t.Log("disallowed source address")
- cert.CriticalOptions = map[string]string{"source-address": "127.0.0.42"}
- cert.SignCert(rand.Reader, testSigners["ecdsa"])
- if err := tryAuth(t, clientConfig); err == nil {
- t.Errorf("cert login with source-address succeeded")
+ if c != nil {
+ c.Close()
}
}
-
-func testPermissionsPassing(withPermissions bool, t *testing.T) {
- serverConfig := &ServerConfig{
- PublicKeyCallback: func(conn ConnMetadata, key PublicKey) (*Permissions, error) {
- if conn.User() == "nopermissions" {
- return nil, nil
- } else {
- return &Permissions{}, nil
- }
- },
- }
- serverConfig.AddHostKey(testSigners["rsa"])
-
- clientConfig := &ClientConfig{
- Auth: []AuthMethod{
- PublicKeys(testSigners["rsa"]),
- },
- }
- if withPermissions {
- clientConfig.User = "permissions"
- } else {
- clientConfig.User = "nopermissions"
- }
-
- c1, c2, err := netPipe()
- if err != nil {
- t.Fatalf("netPipe: %v", err)
- }
- defer c1.Close()
- defer c2.Close()
-
- go NewClientConn(c2, "", clientConfig)
- serverConn, err := newServer(c1, serverConfig)
- if err != nil {
- t.Fatal(err)
- }
- if p := serverConn.Permissions; (p != nil) != withPermissions {
- t.Fatalf("withPermissions is %t, but Permissions object is %#v", withPermissions, p)
- }
-}
-
-func TestPermissionsPassing(t *testing.T) {
- testPermissionsPassing(true, t)
-}
-
-func TestNoPermissionsPassing(t *testing.T) {
- testPermissionsPassing(false, t)
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/client_test.go b/vendor/code.google.com/p/go.crypto/ssh/client_test.go
index 1fe790cb4..f6c11b958 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/client_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/client_test.go
@@ -1,7 +1,3 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
package ssh
import (
@@ -11,7 +7,6 @@ import (
func testClientVersion(t *testing.T, config *ClientConfig, expected string) {
clientConn, serverConn := net.Pipe()
- defer clientConn.Close()
receivedVersion := make(chan string, 1)
go func() {
version, err := readVersion(serverConn)
@@ -22,7 +17,7 @@ func testClientVersion(t *testing.T, config *ClientConfig, expected string) {
}
serverConn.Close()
}()
- NewClientConn(clientConn, "", config)
+ Client(clientConn, config)
actual := <-receivedVersion
if actual != expected {
t.Fatalf("got %s; want %s", actual, expected)
diff --git a/vendor/code.google.com/p/go.crypto/ssh/common.go b/vendor/code.google.com/p/go.crypto/ssh/common.go
index 2fd7fd927..4870e569e 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/common.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/common.go
@@ -6,9 +6,7 @@ package ssh
import (
"crypto"
- "crypto/rand"
"fmt"
- "io"
"sync"
_ "crypto/sha1"
@@ -23,39 +21,16 @@ const (
serviceSSH = "ssh-connection"
)
-// supportedCiphers specifies the supported ciphers in preference order.
-var supportedCiphers = []string{
- "aes128-ctr", "aes192-ctr", "aes256-ctr",
- "aes128-gcm@openssh.com",
- "arcfour256", "arcfour128",
-}
-
-// supportedKexAlgos specifies the supported key-exchange algorithms in
-// preference order.
var supportedKexAlgos = []string{
- // P384 and P521 are not constant-time yet, but since we don't
- // reuse ephemeral keys, using them for ECDH should be OK.
kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521,
kexAlgoDH14SHA1, kexAlgoDH1SHA1,
}
-// supportedKexAlgos specifies the supported host-key algorithms (i.e. methods
-// of authenticating servers) in preference order.
var supportedHostKeyAlgos = []string{
- CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01,
- CertAlgoECDSA384v01, CertAlgoECDSA521v01,
-
KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521,
KeyAlgoRSA, KeyAlgoDSA,
}
-// supportedMACs specifies a default set of MAC algorithms in preference order.
-// This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed
-// because they have reached the end of their useful life.
-var supportedMACs = []string{
- "hmac-sha1", "hmac-sha1-96",
-}
-
var supportedCompressions = []string{compressionNone}
// hashFuncs keeps the mapping of supported algorithms to their respective
@@ -73,15 +48,23 @@ var hashFuncs = map[string]crypto.Hash{
CertAlgoECDSA521v01: crypto.SHA512,
}
-// unexpectedMessageError results when the SSH message that we received didn't
+// UnexpectedMessageError results when the SSH message that we received didn't
// match what we wanted.
-func unexpectedMessageError(expected, got uint8) error {
- return fmt.Errorf("ssh: unexpected message type %d (expected %d)", got, expected)
+type UnexpectedMessageError struct {
+ expected, got uint8
}
-// parseError results from a malformed SSH message.
-func parseError(tag uint8) error {
- return fmt.Errorf("ssh: parse error in message type %d", tag)
+func (u UnexpectedMessageError) Error() string {
+ return fmt.Sprintf("ssh: unexpected message type %d (expected %d)", u.got, u.expected)
+}
+
+// ParseError results from a malformed SSH message.
+type ParseError struct {
+ msgType uint8
+}
+
+func (p ParseError) Error() string {
+ return fmt.Sprintf("ssh: parse error in message type %d", p.msgType)
}
func findCommonAlgorithm(clientAlgos []string, serverAlgos []string) (commonAlgo string, ok bool) {
@@ -107,17 +90,15 @@ func findCommonCipher(clientCiphers []string, serverCiphers []string) (commonCip
return
}
-type directionAlgorithms struct {
- Cipher string
- MAC string
- Compression string
-}
-
type algorithms struct {
- kex string
- hostKey string
- w directionAlgorithms
- r directionAlgorithms
+ kex string
+ hostKey string
+ wCipher string
+ rCipher string
+ rMAC string
+ wMAC string
+ rCompression string
+ wCompression string
}
func findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algorithms) {
@@ -133,32 +114,32 @@ func findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algor
return
}
- result.w.Cipher, ok = findCommonCipher(clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer)
+ result.wCipher, ok = findCommonCipher(clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer)
if !ok {
return
}
- result.r.Cipher, ok = findCommonCipher(clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient)
+ result.rCipher, ok = findCommonCipher(clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient)
if !ok {
return
}
- result.w.MAC, ok = findCommonAlgorithm(clientKexInit.MACsClientServer, serverKexInit.MACsClientServer)
+ result.wMAC, ok = findCommonAlgorithm(clientKexInit.MACsClientServer, serverKexInit.MACsClientServer)
if !ok {
return
}
- result.r.MAC, ok = findCommonAlgorithm(clientKexInit.MACsServerClient, serverKexInit.MACsServerClient)
+ result.rMAC, ok = findCommonAlgorithm(clientKexInit.MACsServerClient, serverKexInit.MACsServerClient)
if !ok {
return
}
- result.w.Compression, ok = findCommonAlgorithm(clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer)
+ result.wCompression, ok = findCommonAlgorithm(clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer)
if !ok {
return
}
- result.r.Compression, ok = findCommonAlgorithm(clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient)
+ result.rCompression, ok = findCommonAlgorithm(clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient)
if !ok {
return
}
@@ -166,87 +147,133 @@ func findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algor
return result
}
-// If rekeythreshold is too small, we can't make any progress sending
-// stuff.
-const minRekeyThreshold uint64 = 256
-
-// Config contains configuration data common to both ServerConfig and
-// ClientConfig.
-type Config struct {
- // Rand provides the source of entropy for cryptographic
- // primitives. If Rand is nil, the cryptographic random reader
- // in package crypto/rand will be used.
- Rand io.Reader
-
- // The maximum number of bytes sent or received after which a
- // new key is negotiated. It must be at least 256. If
- // unspecified, 1 gigabyte is used.
- RekeyThreshold uint64
-
+// Cryptographic configuration common to both ServerConfig and ClientConfig.
+type CryptoConfig struct {
// The allowed key exchanges algorithms. If unspecified then a
// default set of algorithms is used.
KeyExchanges []string
- // The allowed cipher algorithms. If unspecified then a sensible
- // default is used.
+ // The allowed cipher algorithms. If unspecified then DefaultCipherOrder is
+ // used.
Ciphers []string
- // The allowed MAC algorithms. If unspecified then a sensible default
- // is used.
+ // The allowed MAC algorithms. If unspecified then DefaultMACOrder is used.
MACs []string
}
-// SetDefaults sets sensible values for unset fields in config. This is
-// exported for testing: Configs passed to SSH functions are copied and have
-// default values set automatically.
-func (c *Config) SetDefaults() {
- if c.Rand == nil {
- c.Rand = rand.Reader
- }
+func (c *CryptoConfig) ciphers() []string {
if c.Ciphers == nil {
- c.Ciphers = supportedCiphers
+ return DefaultCipherOrder
}
+ return c.Ciphers
+}
+func (c *CryptoConfig) kexes() []string {
if c.KeyExchanges == nil {
- c.KeyExchanges = supportedKexAlgos
+ return defaultKeyExchangeOrder
}
+ return c.KeyExchanges
+}
+func (c *CryptoConfig) macs() []string {
if c.MACs == nil {
- c.MACs = supportedMACs
+ return DefaultMACOrder
}
+ return c.MACs
+}
- if c.RekeyThreshold == 0 {
- // RFC 4253, section 9 suggests rekeying after 1G.
- c.RekeyThreshold = 1 << 30
- }
- if c.RekeyThreshold < minRekeyThreshold {
- c.RekeyThreshold = minRekeyThreshold
+// serialize a signed slice according to RFC 4254 6.6. The name should
+// be a key type name, rather than a cert type name.
+func serializeSignature(name string, sig []byte) []byte {
+ length := stringLength(len(name))
+ length += stringLength(len(sig))
+
+ ret := make([]byte, length)
+ r := marshalString(ret, []byte(name))
+ r = marshalString(r, sig)
+
+ return ret
+}
+
+// MarshalPublicKey serializes a supported key or certificate for use
+// by the SSH wire protocol. It can be used for comparison with the
+// pubkey argument of ServerConfig's PublicKeyCallback as well as for
+// generating an authorized_keys or host_keys file.
+func MarshalPublicKey(key PublicKey) []byte {
+ // See also RFC 4253 6.6.
+ algoname := key.PublicKeyAlgo()
+ blob := key.Marshal()
+
+ length := stringLength(len(algoname))
+ length += len(blob)
+ ret := make([]byte, length)
+ r := marshalString(ret, []byte(algoname))
+ copy(r, blob)
+ return ret
+}
+
+// pubAlgoToPrivAlgo returns the private key algorithm format name that
+// corresponds to a given public key algorithm format name. For most
+// public keys, the private key algorithm name is the same. For some
+// situations, such as openssh certificates, the private key algorithm and
+// public key algorithm names differ. This accounts for those situations.
+func pubAlgoToPrivAlgo(pubAlgo string) string {
+ switch pubAlgo {
+ case CertAlgoRSAv01:
+ return KeyAlgoRSA
+ case CertAlgoDSAv01:
+ return KeyAlgoDSA
+ case CertAlgoECDSA256v01:
+ return KeyAlgoECDSA256
+ case CertAlgoECDSA384v01:
+ return KeyAlgoECDSA384
+ case CertAlgoECDSA521v01:
+ return KeyAlgoECDSA521
}
+ return pubAlgo
}
// buildDataSignedForAuth returns the data that is signed in order to prove
// possession of a private key. See RFC 4252, section 7.
func buildDataSignedForAuth(sessionId []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte {
- data := struct {
- Session []byte
- Type byte
- User string
- Service string
- Method string
- Sign bool
- Algo []byte
- PubKey []byte
- }{
- sessionId,
- msgUserAuthRequest,
- req.User,
- req.Service,
- req.Method,
- true,
- algo,
- pubKey,
+ user := []byte(req.User)
+ service := []byte(req.Service)
+ method := []byte(req.Method)
+
+ length := stringLength(len(sessionId))
+ length += 1
+ length += stringLength(len(user))
+ length += stringLength(len(service))
+ length += stringLength(len(method))
+ length += 1
+ length += stringLength(len(algo))
+ length += stringLength(len(pubKey))
+
+ ret := make([]byte, length)
+ r := marshalString(ret, sessionId)
+ r[0] = msgUserAuthRequest
+ r = r[1:]
+ r = marshalString(r, user)
+ r = marshalString(r, service)
+ r = marshalString(r, method)
+ r[0] = 1
+ r = r[1:]
+ r = marshalString(r, algo)
+ r = marshalString(r, pubKey)
+ return ret
+}
+
+// safeString sanitises s according to RFC 4251, section 9.2.
+// All control characters except tab, carriage return and newline are
+// replaced by 0x20.
+func safeString(s string) string {
+ out := []byte(s)
+ for i, c := range out {
+ if c < 0x20 && c != 0xd && c != 0xa && c != 0x9 {
+ out[i] = 0x20
+ }
}
- return Marshal(data)
+ return string(out)
}
func appendU16(buf []byte, n uint16) []byte {
@@ -257,12 +284,6 @@ func appendU32(buf []byte, n uint32) []byte {
return append(buf, byte(n>>24), byte(n>>16), byte(n>>8), byte(n))
}
-func appendU64(buf []byte, n uint64) []byte {
- return append(buf,
- byte(n>>56), byte(n>>48), byte(n>>40), byte(n>>32),
- byte(n>>24), byte(n>>16), byte(n>>8), byte(n))
-}
-
func appendInt(buf []byte, n int) []byte {
return appendU32(buf, uint32(n))
}
@@ -275,9 +296,11 @@ func appendString(buf []byte, s string) []byte {
func appendBool(buf []byte, b bool) []byte {
if b {
- return append(buf, 1)
+ buf = append(buf, 1)
+ } else {
+ buf = append(buf, 0)
}
- return append(buf, 0)
+ return buf
}
// newCond is a helper to hide the fact that there is no usable zero
@@ -288,9 +311,7 @@ func newCond() *sync.Cond { return sync.NewCond(new(sync.Mutex)) }
// wishing to write to a channel.
type window struct {
*sync.Cond
- win uint32 // RFC 4254 5.2 says the window size can grow to 2^32-1
- writeWaiters int
- closed bool
+ win uint32 // RFC 4254 5.2 says the window size can grow to 2^32-1
}
// add adds win to the amount of window available
@@ -314,44 +335,18 @@ func (w *window) add(win uint32) bool {
return true
}
-// close sets the window to closed, so all reservations fail
-// immediately.
-func (w *window) close() {
- w.L.Lock()
- w.closed = true
- w.Broadcast()
- w.L.Unlock()
-}
-
// reserve reserves win from the available window capacity.
// If no capacity remains, reserve will block. reserve may
// return less than requested.
-func (w *window) reserve(win uint32) (uint32, error) {
- var err error
+func (w *window) reserve(win uint32) uint32 {
w.L.Lock()
- w.writeWaiters++
- w.Broadcast()
- for w.win == 0 && !w.closed {
+ for w.win == 0 {
w.Wait()
}
- w.writeWaiters--
if w.win < win {
win = w.win
}
w.win -= win
- if w.closed {
- err = io.EOF
- }
w.L.Unlock()
- return win, err
-}
-
-// waitWriterBlocked waits until some goroutine is blocked for further
-// writes. It is used in tests only.
-func (w *window) waitWriterBlocked() {
- w.Cond.L.Lock()
- for w.writeWaiters == 0 {
- w.Cond.Wait()
- }
- w.Cond.L.Unlock()
+ return win
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/common_test.go b/vendor/code.google.com/p/go.crypto/ssh/common_test.go
new file mode 100644
index 000000000..d9df56fab
--- /dev/null
+++ b/vendor/code.google.com/p/go.crypto/ssh/common_test.go
@@ -0,0 +1,57 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ssh
+
+import (
+ "io"
+ "net"
+ "testing"
+)
+
+func TestSafeString(t *testing.T) {
+ strings := map[string]string{
+ "\x20\x0d\x0a": "\x20\x0d\x0a",
+ "flibble": "flibble",
+ "new\x20line": "new\x20line",
+ "123456\x07789": "123456 789",
+ "\t\t\x10\r\n": "\t\t \r\n",
+ }
+
+ for s, expected := range strings {
+ actual := safeString(s)
+ if expected != actual {
+ t.Errorf("expected: %v, actual: %v", []byte(expected), []byte(actual))
+ }
+ }
+}
+
+// Make sure Read/Write are not exposed.
+func TestConnHideRWMethods(t *testing.T) {
+ for _, c := range []interface{}{new(ServerConn), new(ClientConn)} {
+ if _, ok := c.(io.Reader); ok {
+ t.Errorf("%T implements io.Reader", c)
+ }
+ if _, ok := c.(io.Writer); ok {
+ t.Errorf("%T implements io.Writer", c)
+ }
+ }
+}
+
+func TestConnSupportsLocalRemoteMethods(t *testing.T) {
+ type LocalAddr interface {
+ LocalAddr() net.Addr
+ }
+ type RemoteAddr interface {
+ RemoteAddr() net.Addr
+ }
+ for _, c := range []interface{}{new(ServerConn), new(ClientConn)} {
+ if _, ok := c.(LocalAddr); !ok {
+ t.Errorf("%T does not implement LocalAddr", c)
+ }
+ if _, ok := c.(RemoteAddr); !ok {
+ t.Errorf("%T does not implement RemoteAddr", c)
+ }
+ }
+}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/connection.go b/vendor/code.google.com/p/go.crypto/ssh/connection.go
deleted file mode 100644
index 93551e241..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/connection.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssh
-
-import (
- "fmt"
- "net"
-)
-
-// OpenChannelError is returned if the other side rejects an
-// OpenChannel request.
-type OpenChannelError struct {
- Reason RejectionReason
- Message string
-}
-
-func (e *OpenChannelError) Error() string {
- return fmt.Sprintf("ssh: rejected: %s (%s)", e.Reason, e.Message)
-}
-
-// ConnMetadata holds metadata for the connection.
-type ConnMetadata interface {
- // User returns the user ID for this connection.
- // It is empty if no authentication is used.
- User() string
-
- // SessionID returns the sesson hash, also denoted by H.
- SessionID() []byte
-
- // ClientVersion returns the client's version string as hashed
- // into the session ID.
- ClientVersion() []byte
-
- // ServerVersion returns the client's version string as hashed
- // into the session ID.
- ServerVersion() []byte
-
- // RemoteAddr returns the remote address for this connection.
- RemoteAddr() net.Addr
-
- // LocalAddr returns the local address for this connection.
- LocalAddr() net.Addr
-}
-
-// Conn represents an SSH connection for both server and client roles.
-// Conn is the basis for implementing an application layer, such
-// as ClientConn, which implements the traditional shell access for
-// clients.
-type Conn interface {
- ConnMetadata
-
- // SendRequest sends a global request, and returns the
- // reply. If wantReply is true, it returns the response status
- // and payload. See also RFC4254, section 4.
- SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error)
-
- // OpenChannel tries to open an channel. If the request is
- // rejected, it returns *OpenChannelError. On success it returns
- // the SSH Channel and a Go channel for incoming, out-of-band
- // requests. The Go channel must be serviced, or the
- // connection will hang.
- OpenChannel(name string, data []byte) (Channel, <-chan *Request, error)
-
- // Close closes the underlying network connection
- Close() error
-
- // Wait blocks until the connection has shut down, and returns the
- // error causing the shutdown.
- Wait() error
-
- // TODO(hanwen): consider exposing:
- // RequestKeyChange
- // Disconnect
-}
-
-// DiscardRequests consumes and rejects all requests from the
-// passed-in channel.
-func DiscardRequests(in <-chan *Request) {
- for req := range in {
- if req.WantReply {
- req.Reply(false, nil)
- }
- }
-}
-
-// A connection represents an incoming connection.
-type connection struct {
- transport *handshakeTransport
- sshConn
-
- // The connection protocol.
- *mux
-}
-
-func (c *connection) Close() error {
- return c.sshConn.conn.Close()
-}
-
-// sshconn provides net.Conn metadata, but disallows direct reads and
-// writes.
-type sshConn struct {
- conn net.Conn
-
- user string
- sessionID []byte
- clientVersion []byte
- serverVersion []byte
-}
-
-func dup(src []byte) []byte {
- dst := make([]byte, len(src))
- copy(dst, src)
- return dst
-}
-
-func (c *sshConn) User() string {
- return c.user
-}
-
-func (c *sshConn) RemoteAddr() net.Addr {
- return c.conn.RemoteAddr()
-}
-
-func (c *sshConn) Close() error {
- return c.conn.Close()
-}
-
-func (c *sshConn) LocalAddr() net.Addr {
- return c.conn.LocalAddr()
-}
-
-func (c *sshConn) SessionID() []byte {
- return dup(c.sessionID)
-}
-
-func (c *sshConn) ClientVersion() []byte {
- return dup(c.clientVersion)
-}
-
-func (c *sshConn) ServerVersion() []byte {
- return dup(c.serverVersion)
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/doc.go b/vendor/code.google.com/p/go.crypto/ssh/doc.go
index d4d16f08d..22ff33881 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/doc.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/doc.go
@@ -13,6 +13,7 @@ others.
References:
[PROTOCOL.certkeys]: http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys
+ [PROTOCOL.agent]: http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.agent
[SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1
*/
package ssh
diff --git a/vendor/code.google.com/p/go.crypto/ssh/example_test.go b/vendor/code.google.com/p/go.crypto/ssh/example_test.go
index 22f42ecc5..a88a6773d 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/example_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/example_test.go
@@ -9,23 +9,17 @@ import (
"fmt"
"io/ioutil"
"log"
- "net"
"net/http"
- "golang.org/x/crypto/ssh/terminal"
+ "code.google.com/p/go.crypto/ssh/terminal"
)
-func ExampleNewServerConn() {
+func ExampleListen() {
// An SSH server is represented by a ServerConfig, which holds
// certificate details and handles authentication of ServerConns.
config := &ServerConfig{
- PasswordCallback: func(c ConnMetadata, pass []byte) (*Permissions, error) {
- // Should use constant-time compare (or better, salt+hash) in
- // a production setting.
- if c.User() == "testuser" && string(pass) == "tiger" {
- return nil, nil
- }
- return nil, fmt.Errorf("password rejected for %q", c.User())
+ PasswordCallback: func(conn *ServerConn, user, pass string) bool {
+ return user == "testuser" && pass == "tiger"
},
}
@@ -43,65 +37,50 @@ func ExampleNewServerConn() {
// Once a ServerConfig has been configured, connections can be
// accepted.
- listener, err := net.Listen("tcp", "0.0.0.0:2022")
+ listener, err := Listen("tcp", "0.0.0.0:2022", config)
if err != nil {
panic("failed to listen for connection")
}
- nConn, err := listener.Accept()
+ sConn, err := listener.Accept()
if err != nil {
panic("failed to accept incoming connection")
}
-
- // Before use, a handshake must be performed on the incoming
- // net.Conn.
- _, chans, reqs, err := NewServerConn(nConn, config)
- if err != nil {
+ if err := sConn.Handshake(); err != nil {
panic("failed to handshake")
}
- // The incoming Request channel must be serviced.
- go DiscardRequests(reqs)
- // Service the incoming Channel channel.
- for newChannel := range chans {
+ // A ServerConn multiplexes several channels, which must
+ // themselves be Accepted.
+ for {
+ // Accept reads from the connection, demultiplexes packets
+ // to their corresponding channels and returns when a new
+ // channel request is seen. Some goroutine must always be
+ // calling Accept; otherwise no messages will be forwarded
+ // to the channels.
+ channel, err := sConn.Accept()
+ if err != nil {
+ panic("error from Accept")
+ }
+
// Channels have a type, depending on the application level
// protocol intended. In the case of a shell, the type is
// "session" and ServerShell may be used to present a simple
// terminal interface.
- if newChannel.ChannelType() != "session" {
- newChannel.Reject(UnknownChannelType, "unknown channel type")
+ if channel.ChannelType() != "session" {
+ channel.Reject(UnknownChannelType, "unknown channel type")
continue
}
- channel, requests, err := newChannel.Accept()
- if err != nil {
- panic("could not accept channel.")
- }
-
- // Sessions have out-of-band requests such as "shell",
- // "pty-req" and "env". Here we handle only the
- // "shell" request.
- go func(in <-chan *Request) {
- for req := range in {
- ok := false
- switch req.Type {
- case "shell":
- ok = true
- if len(req.Payload) > 0 {
- // We don't accept any
- // commands, only the
- // default shell.
- ok = false
- }
- }
- req.Reply(ok, nil)
- }
- }(requests)
+ channel.Accept()
term := terminal.NewTerminal(channel, "> ")
-
+ serverTerm := &ServerTerminal{
+ Term: term,
+ Channel: channel,
+ }
go func() {
defer channel.Close()
for {
- line, err := term.ReadLine()
+ line, err := serverTerm.ReadLine()
if err != nil {
break
}
@@ -116,11 +95,13 @@ func ExampleDial() {
// the "password" authentication method is supported.
//
// To authenticate with the remote server you must pass at least one
- // implementation of AuthMethod via the Auth field in ClientConfig.
+ // implementation of ClientAuth via the Auth field in ClientConfig.
config := &ClientConfig{
User: "username",
- Auth: []AuthMethod{
- Password("yourpassword"),
+ Auth: []ClientAuth{
+ // ClientAuthPassword wraps a ClientPassword implementation
+ // in a type that implements ClientAuth.
+ ClientAuthPassword(password("yourpassword")),
},
}
client, err := Dial("tcp", "yourserver.com:22", config)
@@ -146,11 +127,11 @@ func ExampleDial() {
fmt.Println(b.String())
}
-func ExampleClient_Listen() {
+func ExampleClientConn_Listen() {
config := &ClientConfig{
User: "username",
- Auth: []AuthMethod{
- Password("password"),
+ Auth: []ClientAuth{
+ ClientAuthPassword(password("password")),
},
}
// Dial your ssh server.
@@ -177,8 +158,8 @@ func ExampleSession_RequestPty() {
// Create client config
config := &ClientConfig{
User: "username",
- Auth: []AuthMethod{
- Password("password"),
+ Auth: []ClientAuth{
+ ClientAuthPassword(password("password")),
},
}
// Connect to ssh server
diff --git a/vendor/code.google.com/p/go.crypto/ssh/handshake.go b/vendor/code.google.com/p/go.crypto/ssh/handshake.go
deleted file mode 100644
index a1e2c23da..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/handshake.go
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssh
-
-import (
- "crypto/rand"
- "errors"
- "fmt"
- "io"
- "log"
- "net"
- "sync"
-)
-
-// debugHandshake, if set, prints messages sent and received. Key
-// exchange messages are printed as if DH were used, so the debug
-// messages are wrong when using ECDH.
-const debugHandshake = false
-
-// keyingTransport is a packet based transport that supports key
-// changes. It need not be thread-safe. It should pass through
-// msgNewKeys in both directions.
-type keyingTransport interface {
- packetConn
-
- // prepareKeyChange sets up a key change. The key change for a
- // direction will be effected if a msgNewKeys message is sent
- // or received.
- prepareKeyChange(*algorithms, *kexResult) error
-
- // getSessionID returns the session ID. prepareKeyChange must
- // have been called once.
- getSessionID() []byte
-}
-
-// rekeyingTransport is the interface of handshakeTransport that we
-// (internally) expose to ClientConn and ServerConn.
-type rekeyingTransport interface {
- packetConn
-
- // requestKeyChange asks the remote side to change keys. All
- // writes are blocked until the key change succeeds, which is
- // signaled by reading a msgNewKeys.
- requestKeyChange() error
-
- // getSessionID returns the session ID. This is only valid
- // after the first key change has completed.
- getSessionID() []byte
-}
-
-// handshakeTransport implements rekeying on top of a keyingTransport
-// and offers a thread-safe writePacket() interface.
-type handshakeTransport struct {
- conn keyingTransport
- config *Config
-
- serverVersion []byte
- clientVersion []byte
-
- hostKeys []Signer // If hostKeys are given, we are the server.
-
- // On read error, incoming is closed, and readError is set.
- incoming chan []byte
- readError error
-
- // data for host key checking
- hostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error
- dialAddress string
- remoteAddr net.Addr
-
- readSinceKex uint64
-
- // Protects the writing side of the connection
- mu sync.Mutex
- cond *sync.Cond
- sentInitPacket []byte
- sentInitMsg *kexInitMsg
- writtenSinceKex uint64
- writeError error
-}
-
-func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, serverVersion []byte) *handshakeTransport {
- t := &handshakeTransport{
- conn: conn,
- serverVersion: serverVersion,
- clientVersion: clientVersion,
- incoming: make(chan []byte, 16),
- config: config,
- }
- t.cond = sync.NewCond(&t.mu)
- return t
-}
-
-func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ClientConfig, dialAddr string, addr net.Addr) *handshakeTransport {
- t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion)
- t.dialAddress = dialAddr
- t.remoteAddr = addr
- t.hostKeyCallback = config.HostKeyCallback
- go t.readLoop()
- return t
-}
-
-func newServerTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ServerConfig) *handshakeTransport {
- t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion)
- t.hostKeys = config.hostKeys
- go t.readLoop()
- return t
-}
-
-func (t *handshakeTransport) getSessionID() []byte {
- return t.conn.getSessionID()
-}
-
-func (t *handshakeTransport) id() string {
- if len(t.hostKeys) > 0 {
- return "server"
- }
- return "client"
-}
-
-func (t *handshakeTransport) readPacket() ([]byte, error) {
- p, ok := <-t.incoming
- if !ok {
- return nil, t.readError
- }
- return p, nil
-}
-
-func (t *handshakeTransport) readLoop() {
- for {
- p, err := t.readOnePacket()
- if err != nil {
- t.readError = err
- close(t.incoming)
- break
- }
- if p[0] == msgIgnore || p[0] == msgDebug {
- continue
- }
- t.incoming <- p
- }
-}
-
-func (t *handshakeTransport) readOnePacket() ([]byte, error) {
- if t.readSinceKex > t.config.RekeyThreshold {
- if err := t.requestKeyChange(); err != nil {
- return nil, err
- }
- }
-
- p, err := t.conn.readPacket()
- if err != nil {
- return nil, err
- }
-
- t.readSinceKex += uint64(len(p))
- if debugHandshake {
- msg, err := decode(p)
- log.Printf("%s got %T %v (%v)", t.id(), msg, msg, err)
- }
- if p[0] != msgKexInit {
- return p, nil
- }
- err = t.enterKeyExchange(p)
-
- t.mu.Lock()
- if err != nil {
- // drop connection
- t.conn.Close()
- t.writeError = err
- }
-
- if debugHandshake {
- log.Printf("%s exited key exchange, err %v", t.id(), err)
- }
-
- // Unblock writers.
- t.sentInitMsg = nil
- t.sentInitPacket = nil
- t.cond.Broadcast()
- t.writtenSinceKex = 0
- t.mu.Unlock()
-
- if err != nil {
- return nil, err
- }
-
- t.readSinceKex = 0
- return []byte{msgNewKeys}, nil
-}
-
-// sendKexInit sends a key change message, and returns the message
-// that was sent. After initiating the key change, all writes will be
-// blocked until the change is done, and a failed key change will
-// close the underlying transport. This function is safe for
-// concurrent use by multiple goroutines.
-func (t *handshakeTransport) sendKexInit() (*kexInitMsg, []byte, error) {
- t.mu.Lock()
- defer t.mu.Unlock()
- return t.sendKexInitLocked()
-}
-
-func (t *handshakeTransport) requestKeyChange() error {
- _, _, err := t.sendKexInit()
- return err
-}
-
-// sendKexInitLocked sends a key change message. t.mu must be locked
-// while this happens.
-func (t *handshakeTransport) sendKexInitLocked() (*kexInitMsg, []byte, error) {
- // kexInits may be sent either in response to the other side,
- // or because our side wants to initiate a key change, so we
- // may have already sent a kexInit. In that case, don't send a
- // second kexInit.
- if t.sentInitMsg != nil {
- return t.sentInitMsg, t.sentInitPacket, nil
- }
- msg := &kexInitMsg{
- KexAlgos: t.config.KeyExchanges,
- CiphersClientServer: t.config.Ciphers,
- CiphersServerClient: t.config.Ciphers,
- MACsClientServer: t.config.MACs,
- MACsServerClient: t.config.MACs,
- CompressionClientServer: supportedCompressions,
- CompressionServerClient: supportedCompressions,
- }
- io.ReadFull(rand.Reader, msg.Cookie[:])
-
- if len(t.hostKeys) > 0 {
- for _, k := range t.hostKeys {
- msg.ServerHostKeyAlgos = append(
- msg.ServerHostKeyAlgos, k.PublicKey().Type())
- }
- } else {
- msg.ServerHostKeyAlgos = supportedHostKeyAlgos
- }
- packet := Marshal(msg)
-
- // writePacket destroys the contents, so save a copy.
- packetCopy := make([]byte, len(packet))
- copy(packetCopy, packet)
-
- if err := t.conn.writePacket(packetCopy); err != nil {
- return nil, nil, err
- }
-
- t.sentInitMsg = msg
- t.sentInitPacket = packet
- return msg, packet, nil
-}
-
-func (t *handshakeTransport) writePacket(p []byte) error {
- t.mu.Lock()
- if t.writtenSinceKex > t.config.RekeyThreshold {
- t.sendKexInitLocked()
- }
- for t.sentInitMsg != nil {
- t.cond.Wait()
- }
- if t.writeError != nil {
- return t.writeError
- }
- t.writtenSinceKex += uint64(len(p))
-
- var err error
- switch p[0] {
- case msgKexInit:
- err = errors.New("ssh: only handshakeTransport can send kexInit")
- case msgNewKeys:
- err = errors.New("ssh: only handshakeTransport can send newKeys")
- default:
- err = t.conn.writePacket(p)
- }
- t.mu.Unlock()
- return err
-}
-
-func (t *handshakeTransport) Close() error {
- return t.conn.Close()
-}
-
-// enterKeyExchange runs the key exchange.
-func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
- if debugHandshake {
- log.Printf("%s entered key exchange", t.id())
- }
- myInit, myInitPacket, err := t.sendKexInit()
- if err != nil {
- return err
- }
-
- otherInit := &kexInitMsg{}
- if err := Unmarshal(otherInitPacket, otherInit); err != nil {
- return err
- }
-
- magics := handshakeMagics{
- clientVersion: t.clientVersion,
- serverVersion: t.serverVersion,
- clientKexInit: otherInitPacket,
- serverKexInit: myInitPacket,
- }
-
- clientInit := otherInit
- serverInit := myInit
- if len(t.hostKeys) == 0 {
- clientInit = myInit
- serverInit = otherInit
-
- magics.clientKexInit = myInitPacket
- magics.serverKexInit = otherInitPacket
- }
-
- algs := findAgreedAlgorithms(clientInit, serverInit)
- if algs == nil {
- return errors.New("ssh: no common algorithms")
- }
-
- // We don't send FirstKexFollows, but we handle receiving it.
- if otherInit.FirstKexFollows && algs.kex != otherInit.KexAlgos[0] {
- // other side sent a kex message for the wrong algorithm,
- // which we have to ignore.
- if _, err := t.conn.readPacket(); err != nil {
- return err
- }
- }
-
- kex, ok := kexAlgoMap[algs.kex]
- if !ok {
- return fmt.Errorf("ssh: unexpected key exchange algorithm %v", algs.kex)
- }
-
- var result *kexResult
- if len(t.hostKeys) > 0 {
- result, err = t.server(kex, algs, &magics)
- } else {
- result, err = t.client(kex, algs, &magics)
- }
-
- if err != nil {
- return err
- }
-
- t.conn.prepareKeyChange(algs, result)
- if err = t.conn.writePacket([]byte{msgNewKeys}); err != nil {
- return err
- }
- if packet, err := t.conn.readPacket(); err != nil {
- return err
- } else if packet[0] != msgNewKeys {
- return unexpectedMessageError(msgNewKeys, packet[0])
- }
- return nil
-}
-
-func (t *handshakeTransport) server(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) {
- var hostKey Signer
- for _, k := range t.hostKeys {
- if algs.hostKey == k.PublicKey().Type() {
- hostKey = k
- }
- }
-
- r, err := kex.Server(t.conn, t.config.Rand, magics, hostKey)
- return r, err
-}
-
-func (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) {
- result, err := kex.Client(t.conn, t.config.Rand, magics)
- if err != nil {
- return nil, err
- }
-
- hostKey, err := ParsePublicKey(result.HostKey)
- if err != nil {
- return nil, err
- }
-
- if err := verifyHostKeySignature(hostKey, result); err != nil {
- return nil, err
- }
-
- if t.hostKeyCallback != nil {
- err = t.hostKeyCallback(t.dialAddress, t.remoteAddr, hostKey)
- if err != nil {
- return nil, err
- }
- }
-
- return result, nil
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/handshake_test.go b/vendor/code.google.com/p/go.crypto/ssh/handshake_test.go
deleted file mode 100644
index 613c49822..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/handshake_test.go
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssh
-
-import (
- "bytes"
- "crypto/rand"
- "fmt"
- "net"
- "testing"
-)
-
-type testChecker struct {
- calls []string
-}
-
-func (t *testChecker) Check(dialAddr string, addr net.Addr, key PublicKey) error {
- if dialAddr == "bad" {
- return fmt.Errorf("dialAddr is bad")
- }
-
- if tcpAddr, ok := addr.(*net.TCPAddr); !ok || tcpAddr == nil {
- return fmt.Errorf("testChecker: got %T want *net.TCPAddr", addr)
- }
-
- t.calls = append(t.calls, fmt.Sprintf("%s %v %s %x", dialAddr, addr, key.Type(), key.Marshal()))
-
- return nil
-}
-
-// netPipe is analogous to net.Pipe, but it uses a real net.Conn, and
-// therefore is buffered (net.Pipe deadlocks if both sides start with
-// a write.)
-func netPipe() (net.Conn, net.Conn, error) {
- listener, err := net.Listen("tcp", "127.0.0.1:0")
- if err != nil {
- return nil, nil, err
- }
- defer listener.Close()
- c1, err := net.Dial("tcp", listener.Addr().String())
- if err != nil {
- return nil, nil, err
- }
-
- c2, err := listener.Accept()
- if err != nil {
- c1.Close()
- return nil, nil, err
- }
-
- return c1, c2, nil
-}
-
-func handshakePair(clientConf *ClientConfig, addr string) (client *handshakeTransport, server *handshakeTransport, err error) {
- a, b, err := netPipe()
- if err != nil {
- return nil, nil, err
- }
-
- trC := newTransport(a, rand.Reader, true)
- trS := newTransport(b, rand.Reader, false)
- clientConf.SetDefaults()
-
- v := []byte("version")
- client = newClientTransport(trC, v, v, clientConf, addr, a.RemoteAddr())
-
- serverConf := &ServerConfig{}
- serverConf.AddHostKey(testSigners["ecdsa"])
- serverConf.SetDefaults()
- server = newServerTransport(trS, v, v, serverConf)
-
- return client, server, nil
-}
-
-func TestHandshakeBasic(t *testing.T) {
- checker := &testChecker{}
- trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr")
- if err != nil {
- t.Fatalf("handshakePair: %v", err)
- }
-
- defer trC.Close()
- defer trS.Close()
-
- go func() {
- // Client writes a bunch of stuff, and does a key
- // change in the middle. This should not confuse the
- // handshake in progress
- for i := 0; i < 10; i++ {
- p := []byte{msgRequestSuccess, byte(i)}
- if err := trC.writePacket(p); err != nil {
- t.Fatalf("sendPacket: %v", err)
- }
- if i == 5 {
- // halfway through, we request a key change.
- _, _, err := trC.sendKexInit()
- if err != nil {
- t.Fatalf("sendKexInit: %v", err)
- }
- }
- }
- trC.Close()
- }()
-
- // Server checks that client messages come in cleanly
- i := 0
- for {
- p, err := trS.readPacket()
- if err != nil {
- break
- }
- if p[0] == msgNewKeys {
- continue
- }
- want := []byte{msgRequestSuccess, byte(i)}
- if bytes.Compare(p, want) != 0 {
- t.Errorf("message %d: got %q, want %q", i, p, want)
- }
- i++
- }
- if i != 10 {
- t.Errorf("received %d messages, want 10.", i)
- }
-
- // If all went well, we registered exactly 1 key change.
- if len(checker.calls) != 1 {
- t.Fatalf("got %d host key checks, want 1", len(checker.calls))
- }
-
- pub := testSigners["ecdsa"].PublicKey()
- want := fmt.Sprintf("%s %v %s %x", "addr", trC.remoteAddr, pub.Type(), pub.Marshal())
- if want != checker.calls[0] {
- t.Errorf("got %q want %q for host key check", checker.calls[0], want)
- }
-}
-
-func TestHandshakeError(t *testing.T) {
- checker := &testChecker{}
- trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "bad")
- if err != nil {
- t.Fatalf("handshakePair: %v", err)
- }
- defer trC.Close()
- defer trS.Close()
-
- // send a packet
- packet := []byte{msgRequestSuccess, 42}
- if err := trC.writePacket(packet); err != nil {
- t.Errorf("writePacket: %v", err)
- }
-
- // Now request a key change.
- _, _, err = trC.sendKexInit()
- if err != nil {
- t.Errorf("sendKexInit: %v", err)
- }
-
- // the key change will fail, and afterwards we can't write.
- if err := trC.writePacket([]byte{msgRequestSuccess, 43}); err == nil {
- t.Errorf("writePacket after botched rekey succeeded.")
- }
-
- readback, err := trS.readPacket()
- if err != nil {
- t.Fatalf("server closed too soon: %v", err)
- }
- if bytes.Compare(readback, packet) != 0 {
- t.Errorf("got %q want %q", readback, packet)
- }
- readback, err = trS.readPacket()
- if err == nil {
- t.Errorf("got a message %q after failed key change", readback)
- }
-}
-
-func TestHandshakeTwice(t *testing.T) {
- checker := &testChecker{}
- trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr")
- if err != nil {
- t.Fatalf("handshakePair: %v", err)
- }
-
- defer trC.Close()
- defer trS.Close()
-
- // send a packet
- packet := make([]byte, 5)
- packet[0] = msgRequestSuccess
- if err := trC.writePacket(packet); err != nil {
- t.Errorf("writePacket: %v", err)
- }
-
- // Now request a key change.
- _, _, err = trC.sendKexInit()
- if err != nil {
- t.Errorf("sendKexInit: %v", err)
- }
-
- // Send another packet. Use a fresh one, since writePacket destroys.
- packet = make([]byte, 5)
- packet[0] = msgRequestSuccess
- if err := trC.writePacket(packet); err != nil {
- t.Errorf("writePacket: %v", err)
- }
-
- // 2nd key change.
- _, _, err = trC.sendKexInit()
- if err != nil {
- t.Errorf("sendKexInit: %v", err)
- }
-
- packet = make([]byte, 5)
- packet[0] = msgRequestSuccess
- if err := trC.writePacket(packet); err != nil {
- t.Errorf("writePacket: %v", err)
- }
-
- packet = make([]byte, 5)
- packet[0] = msgRequestSuccess
- for i := 0; i < 5; i++ {
- msg, err := trS.readPacket()
- if err != nil {
- t.Fatalf("server closed too soon: %v", err)
- }
- if msg[0] == msgNewKeys {
- continue
- }
-
- if bytes.Compare(msg, packet) != 0 {
- t.Errorf("packet %d: got %q want %q", i, msg, packet)
- }
- }
- if len(checker.calls) != 2 {
- t.Errorf("got %d key changes, want 2", len(checker.calls))
- }
-}
-
-func TestHandshakeAutoRekeyWrite(t *testing.T) {
- checker := &testChecker{}
- clientConf := &ClientConfig{HostKeyCallback: checker.Check}
- clientConf.RekeyThreshold = 500
- trC, trS, err := handshakePair(clientConf, "addr")
- if err != nil {
- t.Fatalf("handshakePair: %v", err)
- }
- defer trC.Close()
- defer trS.Close()
-
- for i := 0; i < 5; i++ {
- packet := make([]byte, 251)
- packet[0] = msgRequestSuccess
- if err := trC.writePacket(packet); err != nil {
- t.Errorf("writePacket: %v", err)
- }
- }
-
- j := 0
- for ; j < 5; j++ {
- _, err := trS.readPacket()
- if err != nil {
- break
- }
- }
-
- if j != 5 {
- t.Errorf("got %d, want 5 messages", j)
- }
-
- if len(checker.calls) != 2 {
- t.Errorf("got %d key changes, wanted 2", len(checker.calls))
- }
-}
-
-type syncChecker struct {
- called chan int
-}
-
-func (t *syncChecker) Check(dialAddr string, addr net.Addr, key PublicKey) error {
- t.called <- 1
- return nil
-}
-
-func TestHandshakeAutoRekeyRead(t *testing.T) {
- sync := &syncChecker{make(chan int, 2)}
- clientConf := &ClientConfig{
- HostKeyCallback: sync.Check,
- }
- clientConf.RekeyThreshold = 500
-
- trC, trS, err := handshakePair(clientConf, "addr")
- if err != nil {
- t.Fatalf("handshakePair: %v", err)
- }
- defer trC.Close()
- defer trS.Close()
-
- packet := make([]byte, 501)
- packet[0] = msgRequestSuccess
- if err := trS.writePacket(packet); err != nil {
- t.Fatalf("writePacket: %v", err)
- }
- // While we read out the packet, a key change will be
- // initiated.
- if _, err := trC.readPacket(); err != nil {
- t.Fatalf("readPacket(client): %v", err)
- }
-
- <-sync.called
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/kex.go b/vendor/code.google.com/p/go.crypto/ssh/kex.go
index 6a835c763..d2e3b7071 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/kex.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/kex.go
@@ -30,10 +30,10 @@ type kexResult struct {
// Shared secret. See also RFC 4253, section 8.
K []byte
- // Host key as hashed into H.
+ // Host key as hashed into H
HostKey []byte
- // Signature of H.
+ // Signature of H
Signature []byte
// A cryptographic hash function that matches the security
@@ -94,7 +94,7 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha
kexDHInit := kexDHInitMsg{
X: X,
}
- if err := c.writePacket(Marshal(&kexDHInit)); err != nil {
+ if err := c.writePacket(marshal(msgKexDHInit, kexDHInit)); err != nil {
return nil, err
}
@@ -104,7 +104,7 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha
}
var kexDHReply kexDHReplyMsg
- if err = Unmarshal(packet, &kexDHReply); err != nil {
+ if err = unmarshal(&kexDHReply, packet, msgKexDHReply); err != nil {
return nil, err
}
@@ -138,7 +138,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha
return
}
var kexDHInit kexDHInitMsg
- if err = Unmarshal(packet, &kexDHInit); err != nil {
+ if err = unmarshal(&kexDHInit, packet, msgKexDHInit); err != nil {
return
}
@@ -153,7 +153,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha
return nil, err
}
- hostKeyBytes := priv.PublicKey().Marshal()
+ hostKeyBytes := MarshalPublicKey(priv.PublicKey())
h := hashFunc.New()
magics.write(h)
@@ -179,7 +179,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha
Y: Y,
Signature: sig,
}
- packet = Marshal(&kexDHReply)
+ packet = marshal(msgKexDHReply, kexDHReply)
err = c.writePacket(packet)
return &kexResult{
@@ -207,7 +207,7 @@ func (kex *ecdh) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (
ClientPubKey: elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y),
}
- serialized := Marshal(&kexInit)
+ serialized := marshal(msgKexECDHInit, kexInit)
if err := c.writePacket(serialized); err != nil {
return nil, err
}
@@ -218,7 +218,7 @@ func (kex *ecdh) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (
}
var reply kexECDHReplyMsg
- if err = Unmarshal(packet, &reply); err != nil {
+ if err = unmarshal(&reply, packet, msgKexECDHReply); err != nil {
return nil, err
}
@@ -297,7 +297,7 @@ func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, p
}
var kexECDHInit kexECDHInitMsg
- if err = Unmarshal(packet, &kexECDHInit); err != nil {
+ if err = unmarshal(&kexECDHInit, packet, msgKexECDHInit); err != nil {
return nil, err
}
@@ -314,7 +314,7 @@ func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, p
return nil, err
}
- hostKeyBytes := priv.PublicKey().Marshal()
+ hostKeyBytes := MarshalPublicKey(priv.PublicKey())
serializedEphKey := elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y)
@@ -346,7 +346,7 @@ func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, p
Signature: sig,
}
- serialized := Marshal(&reply)
+ serialized := marshal(msgKexECDHReply, reply)
if err := c.writePacket(serialized); err != nil {
return nil, err
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/kex_test.go b/vendor/code.google.com/p/go.crypto/ssh/kex_test.go
index 0db5f9be1..1e931a313 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/kex_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/kex_test.go
@@ -29,7 +29,7 @@ func TestKexes(t *testing.T) {
c <- kexResultErr{r, e}
}()
go func() {
- r, e := kex.Server(b, rand.Reader, &magics, testSigners["ecdsa"])
+ r, e := kex.Server(b, rand.Reader, &magics, ecdsaKey)
s <- kexResultErr{r, e}
}()
diff --git a/vendor/code.google.com/p/go.crypto/ssh/keys.go b/vendor/code.google.com/p/go.crypto/ssh/keys.go
index e8af511ee..b41fefc80 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/keys.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/keys.go
@@ -33,7 +33,7 @@ const (
// parsePubKey parses a public key of the given algorithm.
// Use ParsePublicKey for keys with prepended algorithm.
-func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) {
+func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, ok bool) {
switch algo {
case KeyAlgoRSA:
return parseRSA(in)
@@ -42,19 +42,15 @@ func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err err
case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521:
return parseECDSA(in)
case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01:
- cert, err := parseCert(in, certToPrivAlgo(algo))
- if err != nil {
- return nil, nil, err
- }
- return cert, nil, nil
+ return parseOpenSSHCertV01(in, algo)
}
- return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", err)
+ return nil, nil, false
}
// parseAuthorizedKey parses a public key in OpenSSH authorized_keys format
// (see sshd(8) manual page) once the options and key type fields have been
// removed.
-func parseAuthorizedKey(in []byte) (out PublicKey, comment string, err error) {
+func parseAuthorizedKey(in []byte) (out PublicKey, comment string, ok bool) {
in = bytes.TrimSpace(in)
i := bytes.IndexAny(in, " \t")
@@ -66,20 +62,20 @@ func parseAuthorizedKey(in []byte) (out PublicKey, comment string, err error) {
key := make([]byte, base64.StdEncoding.DecodedLen(len(base64Key)))
n, err := base64.StdEncoding.Decode(key, base64Key)
if err != nil {
- return nil, "", err
+ return
}
key = key[:n]
- out, err = ParsePublicKey(key)
- if err != nil {
- return nil, "", err
+ out, _, ok = ParsePublicKey(key)
+ if !ok {
+ return nil, "", false
}
comment = string(bytes.TrimSpace(in[i:]))
- return out, comment, nil
+ return
}
// ParseAuthorizedKeys parses a public key from an authorized_keys
// file used in OpenSSH according to the sshd(8) manual page.
-func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) {
+func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, ok bool) {
for len(in) > 0 {
end := bytes.IndexByte(in, '\n')
if end != -1 {
@@ -106,8 +102,8 @@ func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []str
continue
}
- if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
- return out, comment, options, rest, nil
+ if out, comment, ok = parseAuthorizedKey(in[i:]); ok {
+ return
}
// No key type recognised. Maybe there's an options field at
@@ -147,42 +143,38 @@ func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []str
continue
}
- if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
+ if out, comment, ok = parseAuthorizedKey(in[i:]); ok {
options = candidateOptions
- return out, comment, options, rest, nil
+ return
}
in = rest
continue
}
- return nil, "", nil, nil, errors.New("ssh: no key found")
+ return
}
// ParsePublicKey parses an SSH public key formatted for use in
// the SSH wire protocol according to RFC 4253, section 6.6.
-func ParsePublicKey(in []byte) (out PublicKey, err error) {
+func ParsePublicKey(in []byte) (out PublicKey, rest []byte, ok bool) {
algo, in, ok := parseString(in)
if !ok {
- return nil, errShortRead
- }
- var rest []byte
- out, rest, err = parsePubKey(in, string(algo))
- if len(rest) > 0 {
- return nil, errors.New("ssh: trailing junk in public key")
+ return
}
- return out, err
+ return parsePubKey(in, string(algo))
}
-// MarshalAuthorizedKey serializes key for inclusion in an OpenSSH
-// authorized_keys file. The return value ends with newline.
+// MarshalAuthorizedKey returns a byte stream suitable for inclusion
+// in an OpenSSH authorized_keys file following the format specified
+// in the sshd(8) manual page.
func MarshalAuthorizedKey(key PublicKey) []byte {
b := &bytes.Buffer{}
- b.WriteString(key.Type())
+ b.WriteString(key.PublicKeyAlgo())
b.WriteByte(' ')
e := base64.NewEncoder(base64.StdEncoding, b)
- e.Write(key.Marshal())
+ e.Write(MarshalPublicKey(key))
e.Close()
b.WriteByte('\n')
return b.Bytes()
@@ -190,81 +182,84 @@ func MarshalAuthorizedKey(key PublicKey) []byte {
// PublicKey is an abstraction of different types of public keys.
type PublicKey interface {
- // Type returns the key's type, e.g. "ssh-rsa".
- Type() string
+ // PrivateKeyAlgo returns the name of the encryption system.
+ PrivateKeyAlgo() string
+
+ // PublicKeyAlgo returns the algorithm for the public key,
+ // which may be different from PrivateKeyAlgo for certificates.
+ PublicKeyAlgo() string
// Marshal returns the serialized key data in SSH wire format,
- // with the name prefix.
+ // without the name prefix. Callers should typically use
+ // MarshalPublicKey().
Marshal() []byte
// Verify that sig is a signature on the given data using this
// key. This function will hash the data appropriately first.
- Verify(data []byte, sig *Signature) error
+ Verify(data []byte, sigBlob []byte) bool
}
-// A Signer can create signatures that verify against a public key.
+// A Signer is can create signatures that verify against a public key.
type Signer interface {
// PublicKey returns an associated PublicKey instance.
PublicKey() PublicKey
// Sign returns raw signature for the given data. This method
// will apply the hash specified for the keytype to the data.
- Sign(rand io.Reader, data []byte) (*Signature, error)
+ Sign(rand io.Reader, data []byte) ([]byte, error)
}
type rsaPublicKey rsa.PublicKey
-func (r *rsaPublicKey) Type() string {
+func (r *rsaPublicKey) PrivateKeyAlgo() string {
return "ssh-rsa"
}
+func (r *rsaPublicKey) PublicKeyAlgo() string {
+ return r.PrivateKeyAlgo()
+}
+
// parseRSA parses an RSA key according to RFC 4253, section 6.6.
-func parseRSA(in []byte) (out PublicKey, rest []byte, err error) {
- var w struct {
- E *big.Int
- N *big.Int
- Rest []byte `ssh:"rest"`
- }
- if err := Unmarshal(in, &w); err != nil {
- return nil, nil, err
- }
+func parseRSA(in []byte) (out PublicKey, rest []byte, ok bool) {
+ key := new(rsa.PublicKey)
- if w.E.BitLen() > 24 {
- return nil, nil, errors.New("ssh: exponent too large")
+ bigE, in, ok := parseInt(in)
+ if !ok || bigE.BitLen() > 24 {
+ return
}
- e := w.E.Int64()
+ e := bigE.Int64()
if e < 3 || e&1 == 0 {
- return nil, nil, errors.New("ssh: incorrect exponent")
+ ok = false
+ return
+ }
+ key.E = int(e)
+
+ if key.N, in, ok = parseInt(in); !ok {
+ return
}
- var key rsa.PublicKey
- key.E = int(e)
- key.N = w.N
- return (*rsaPublicKey)(&key), w.Rest, nil
+ ok = true
+ return (*rsaPublicKey)(key), in, ok
}
func (r *rsaPublicKey) Marshal() []byte {
+ // See RFC 4253, section 6.6.
e := new(big.Int).SetInt64(int64(r.E))
- wirekey := struct {
- Name string
- E *big.Int
- N *big.Int
- }{
- KeyAlgoRSA,
- e,
- r.N,
- }
- return Marshal(&wirekey)
+ length := intLength(e)
+ length += intLength(r.N)
+
+ ret := make([]byte, length)
+ rest := marshalInt(ret, e)
+ marshalInt(rest, r.N)
+
+ return ret
}
-func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error {
- if sig.Format != r.Type() {
- return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type())
- }
+func (r *rsaPublicKey) Verify(data []byte, sig []byte) bool {
h := crypto.SHA1.New()
h.Write(data)
digest := h.Sum(nil)
- return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig.Blob)
+ return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig) == nil
}
type rsaPrivateKey struct {
@@ -275,66 +270,64 @@ func (r *rsaPrivateKey) PublicKey() PublicKey {
return (*rsaPublicKey)(&r.PrivateKey.PublicKey)
}
-func (r *rsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) {
+func (r *rsaPrivateKey) Sign(rand io.Reader, data []byte) ([]byte, error) {
h := crypto.SHA1.New()
h.Write(data)
digest := h.Sum(nil)
- blob, err := rsa.SignPKCS1v15(rand, r.PrivateKey, crypto.SHA1, digest)
- if err != nil {
- return nil, err
- }
- return &Signature{
- Format: r.PublicKey().Type(),
- Blob: blob,
- }, nil
+ return rsa.SignPKCS1v15(rand, r.PrivateKey, crypto.SHA1, digest)
}
type dsaPublicKey dsa.PublicKey
-func (r *dsaPublicKey) Type() string {
+func (r *dsaPublicKey) PrivateKeyAlgo() string {
return "ssh-dss"
}
+func (r *dsaPublicKey) PublicKeyAlgo() string {
+ return r.PrivateKeyAlgo()
+}
+
// parseDSA parses an DSA key according to RFC 4253, section 6.6.
-func parseDSA(in []byte) (out PublicKey, rest []byte, err error) {
- var w struct {
- P, Q, G, Y *big.Int
- Rest []byte `ssh:"rest"`
- }
- if err := Unmarshal(in, &w); err != nil {
- return nil, nil, err
+func parseDSA(in []byte) (out PublicKey, rest []byte, ok bool) {
+ key := new(dsa.PublicKey)
+
+ if key.P, in, ok = parseInt(in); !ok {
+ return
}
- key := &dsaPublicKey{
- Parameters: dsa.Parameters{
- P: w.P,
- Q: w.Q,
- G: w.G,
- },
- Y: w.Y,
+ if key.Q, in, ok = parseInt(in); !ok {
+ return
}
- return key, w.Rest, nil
+
+ if key.G, in, ok = parseInt(in); !ok {
+ return
+ }
+
+ if key.Y, in, ok = parseInt(in); !ok {
+ return
+ }
+
+ ok = true
+ return (*dsaPublicKey)(key), in, ok
}
-func (k *dsaPublicKey) Marshal() []byte {
- w := struct {
- Name string
- P, Q, G, Y *big.Int
- }{
- k.Type(),
- k.P,
- k.Q,
- k.G,
- k.Y,
- }
+func (r *dsaPublicKey) Marshal() []byte {
+ // See RFC 4253, section 6.6.
+ length := intLength(r.P)
+ length += intLength(r.Q)
+ length += intLength(r.G)
+ length += intLength(r.Y)
- return Marshal(&w)
+ ret := make([]byte, length)
+ rest := marshalInt(ret, r.P)
+ rest = marshalInt(rest, r.Q)
+ rest = marshalInt(rest, r.G)
+ marshalInt(rest, r.Y)
+
+ return ret
}
-func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error {
- if sig.Format != k.Type() {
- return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
- }
+func (k *dsaPublicKey) Verify(data []byte, sigBlob []byte) bool {
h := crypto.SHA1.New()
h.Write(data)
digest := h.Sum(nil)
@@ -344,15 +337,12 @@ func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error {
// r, followed by s (which are 160-bit integers, without lengths or
// padding, unsigned, and in network byte order).
// For DSS purposes, sig.Blob should be exactly 40 bytes in length.
- if len(sig.Blob) != 40 {
- return errors.New("ssh: DSA signature parse error")
+ if len(sigBlob) != 40 {
+ return false
}
- r := new(big.Int).SetBytes(sig.Blob[:20])
- s := new(big.Int).SetBytes(sig.Blob[20:])
- if dsa.Verify((*dsa.PublicKey)(k), digest, r, s) {
- return nil
- }
- return errors.New("ssh: signature did not verify")
+ r := new(big.Int).SetBytes(sigBlob[:20])
+ s := new(big.Int).SetBytes(sigBlob[20:])
+ return dsa.Verify((*dsa.PublicKey)(k), digest, r, s)
}
type dsaPrivateKey struct {
@@ -363,7 +353,7 @@ func (k *dsaPrivateKey) PublicKey() PublicKey {
return (*dsaPublicKey)(&k.PrivateKey.PublicKey)
}
-func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) {
+func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) ([]byte, error) {
h := crypto.SHA1.New()
h.Write(data)
digest := h.Sum(nil)
@@ -373,21 +363,14 @@ func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) {
}
sig := make([]byte, 40)
- rb := r.Bytes()
- sb := s.Bytes()
-
- copy(sig[20-len(rb):20], rb)
- copy(sig[40-len(sb):], sb)
-
- return &Signature{
- Format: k.PublicKey().Type(),
- Blob: sig,
- }, nil
+ copy(sig[:20], r.Bytes())
+ copy(sig[20:], s.Bytes())
+ return sig, nil
}
type ecdsaPublicKey ecdsa.PublicKey
-func (key *ecdsaPublicKey) Type() string {
+func (key *ecdsaPublicKey) PrivateKeyAlgo() string {
return "ecdsa-sha2-" + key.nistID()
}
@@ -404,7 +387,7 @@ func (key *ecdsaPublicKey) nistID() string {
}
func supportedEllipticCurve(curve elliptic.Curve) bool {
- return curve == elliptic.P256() || curve == elliptic.P384() || curve == elliptic.P521()
+ return (curve == elliptic.P256() || curve == elliptic.P384() || curve == elliptic.P521())
}
// ecHash returns the hash to match the given elliptic curve, see RFC
@@ -420,11 +403,15 @@ func ecHash(curve elliptic.Curve) crypto.Hash {
return crypto.SHA512
}
+func (key *ecdsaPublicKey) PublicKeyAlgo() string {
+ return key.PrivateKeyAlgo()
+}
+
// parseECDSA parses an ECDSA key according to RFC 5656, section 3.1.
-func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) {
- identifier, in, ok := parseString(in)
- if !ok {
- return nil, nil, errShortRead
+func parseECDSA(in []byte) (out PublicKey, rest []byte, ok bool) {
+ var identifier []byte
+ if identifier, in, ok = parseString(in); !ok {
+ return
}
key := new(ecdsa.PublicKey)
@@ -437,42 +424,38 @@ func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) {
case "nistp521":
key.Curve = elliptic.P521()
default:
- return nil, nil, errors.New("ssh: unsupported curve")
+ ok = false
+ return
}
var keyBytes []byte
if keyBytes, in, ok = parseString(in); !ok {
- return nil, nil, errShortRead
+ return
}
key.X, key.Y = elliptic.Unmarshal(key.Curve, keyBytes)
if key.X == nil || key.Y == nil {
- return nil, nil, errors.New("ssh: invalid curve point")
+ ok = false
+ return
}
- return (*ecdsaPublicKey)(key), in, nil
+ return (*ecdsaPublicKey)(key), in, ok
}
func (key *ecdsaPublicKey) Marshal() []byte {
// See RFC 5656, section 3.1.
keyBytes := elliptic.Marshal(key.Curve, key.X, key.Y)
- w := struct {
- Name string
- ID string
- Key []byte
- }{
- key.Type(),
- key.nistID(),
- keyBytes,
- }
- return Marshal(&w)
+ ID := key.nistID()
+ length := stringLength(len(ID))
+ length += stringLength(len(keyBytes))
+
+ ret := make([]byte, length)
+ r := marshalString(ret, []byte(ID))
+ r = marshalString(r, keyBytes)
+ return ret
}
-func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error {
- if sig.Format != key.Type() {
- return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type())
- }
-
+func (key *ecdsaPublicKey) Verify(data []byte, sigBlob []byte) bool {
h := ecHash(key.Curve).New()
h.Write(data)
digest := h.Sum(nil)
@@ -481,19 +464,15 @@ func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error {
// The ecdsa_signature_blob value has the following specific encoding:
// mpint r
// mpint s
- var ecSig struct {
- R *big.Int
- S *big.Int
+ r, rest, ok := parseInt(sigBlob)
+ if !ok {
+ return false
}
-
- if err := Unmarshal(sig.Blob, &ecSig); err != nil {
- return err
+ s, rest, ok := parseInt(rest)
+ if !ok || len(rest) > 0 {
+ return false
}
-
- if ecdsa.Verify((*ecdsa.PublicKey)(key), digest, ecSig.R, ecSig.S) {
- return nil
- }
- return errors.New("ssh: signature did not verify")
+ return ecdsa.Verify((*ecdsa.PublicKey)(key), digest, r, s)
}
type ecdsaPrivateKey struct {
@@ -504,7 +483,7 @@ func (k *ecdsaPrivateKey) PublicKey() PublicKey {
return (*ecdsaPublicKey)(&k.PrivateKey.PublicKey)
}
-func (k *ecdsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) {
+func (k *ecdsaPrivateKey) Sign(rand io.Reader, data []byte) ([]byte, error) {
h := ecHash(k.PrivateKey.PublicKey.Curve).New()
h.Write(data)
digest := h.Sum(nil)
@@ -516,13 +495,10 @@ func (k *ecdsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error)
sig := make([]byte, intLength(r)+intLength(s))
rest := marshalInt(sig, r)
marshalInt(rest, s)
- return &Signature{
- Format: k.PublicKey().Type(),
- Blob: sig,
- }, nil
+ return sig, nil
}
-// NewSignerFromKey takes a pointer to rsa, dsa or ecdsa PrivateKey
+// NewPrivateKey takes a pointer to rsa, dsa or ecdsa PrivateKey
// returns a corresponding Signer instance. EC keys should use P256,
// P384 or P521.
func NewSignerFromKey(k interface{}) (Signer, error) {
@@ -564,49 +540,54 @@ func NewPublicKey(k interface{}) (PublicKey, error) {
return sshKey, nil
}
-// ParsePrivateKey returns a Signer from a PEM encoded private key. It supports
-// the same keys as ParseRawPrivateKey.
+// ParsePublicKey parses a PEM encoded private key. It supports
+// PKCS#1, RSA, DSA and ECDSA private keys.
func ParsePrivateKey(pemBytes []byte) (Signer, error) {
- key, err := ParseRawPrivateKey(pemBytes)
- if err != nil {
- return nil, err
- }
-
- return NewSignerFromKey(key)
-}
-
-// ParseRawPrivateKey returns a private key from a PEM encoded private key. It
-// supports RSA (PKCS#1), DSA (OpenSSL), and ECDSA private keys.
-func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) {
block, _ := pem.Decode(pemBytes)
if block == nil {
return nil, errors.New("ssh: no key found")
}
+ var rawkey interface{}
switch block.Type {
case "RSA PRIVATE KEY":
- return x509.ParsePKCS1PrivateKey(block.Bytes)
+ rsa, err := x509.ParsePKCS1PrivateKey(block.Bytes)
+ if err != nil {
+ return nil, err
+ }
+ rawkey = rsa
case "EC PRIVATE KEY":
- return x509.ParseECPrivateKey(block.Bytes)
+ ec, err := x509.ParseECPrivateKey(block.Bytes)
+ if err != nil {
+ return nil, err
+ }
+ rawkey = ec
case "DSA PRIVATE KEY":
- return ParseDSAPrivateKey(block.Bytes)
+ ec, err := parseDSAPrivate(block.Bytes)
+ if err != nil {
+ return nil, err
+ }
+ rawkey = ec
default:
return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type)
}
+
+ return NewSignerFromKey(rawkey)
}
-// ParseDSAPrivateKey returns a DSA private key from its ASN.1 DER encoding, as
-// specified by the OpenSSL DSA man page.
-func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) {
- var k struct {
+// parseDSAPrivate parses a DSA key in ASN.1 DER encoding, as
+// documented in the OpenSSL DSA manpage.
+// TODO(hanwen): move this in to crypto/x509 after the Go 1.2 freeze.
+func parseDSAPrivate(p []byte) (*dsa.PrivateKey, error) {
+ k := struct {
Version int
P *big.Int
Q *big.Int
G *big.Int
Priv *big.Int
Pub *big.Int
- }
- rest, err := asn1.Unmarshal(der, &k)
+ }{}
+ rest, err := asn1.Unmarshal(p, &k)
if err != nil {
return nil, errors.New("ssh: failed to parse DSA key: " + err.Error())
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/keys_test.go b/vendor/code.google.com/p/go.crypto/ssh/keys_test.go
index 36b97ad22..3c4b73515 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/keys_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/keys_test.go
@@ -1,25 +1,66 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
package ssh
import (
- "bytes"
"crypto/dsa"
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/rsa"
- "encoding/base64"
- "fmt"
"reflect"
"strings"
"testing"
-
- "golang.org/x/crypto/ssh/testdata"
)
+var (
+ ecdsaKey Signer
+ ecdsa384Key Signer
+ ecdsa521Key Signer
+ testCertKey Signer
+)
+
+type testSigner struct {
+ Signer
+ pub PublicKey
+}
+
+func (ts *testSigner) PublicKey() PublicKey {
+ if ts.pub != nil {
+ return ts.pub
+ }
+ return ts.Signer.PublicKey()
+}
+
+func init() {
+ raw256, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ ecdsaKey, _ = NewSignerFromKey(raw256)
+
+ raw384, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
+ ecdsa384Key, _ = NewSignerFromKey(raw384)
+
+ raw521, _ := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
+ ecdsa521Key, _ = NewSignerFromKey(raw521)
+
+ // Create a cert and sign it for use in tests.
+ testCert := &OpenSSHCertV01{
+ Nonce: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
+ Key: ecdsaKey.PublicKey(),
+ ValidPrincipals: []string{"gopher1", "gopher2"}, // increases test coverage
+ ValidAfter: 0, // unix epoch
+ ValidBefore: maxUint64, // The end of currently representable time.
+ Reserved: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
+ SignatureKey: rsaKey.PublicKey(),
+ }
+ sigBytes, _ := rsaKey.Sign(rand.Reader, testCert.BytesForSigning())
+ testCert.Signature = &signature{
+ Format: testCert.SignatureKey.PublicKeyAlgo(),
+ Blob: sigBytes,
+ }
+ testCertKey = &testSigner{
+ Signer: ecdsaKey,
+ pub: testCert,
+ }
+}
+
func rawKey(pub PublicKey) interface{} {
switch k := pub.(type) {
case *rsaPublicKey:
@@ -28,18 +69,23 @@ func rawKey(pub PublicKey) interface{} {
return (*dsa.PublicKey)(k)
case *ecdsaPublicKey:
return (*ecdsa.PublicKey)(k)
- case *Certificate:
+ case *OpenSSHCertV01:
return k
}
panic("unknown key type")
}
func TestKeyMarshalParse(t *testing.T) {
- for _, priv := range testSigners {
+ keys := []Signer{rsaKey, dsaKey, ecdsaKey, ecdsa384Key, ecdsa521Key, testCertKey}
+ for _, priv := range keys {
pub := priv.PublicKey()
- roundtrip, err := ParsePublicKey(pub.Marshal())
- if err != nil {
- t.Errorf("ParsePublicKey(%T): %v", pub, err)
+ roundtrip, rest, ok := ParsePublicKey(MarshalPublicKey(pub))
+ if !ok {
+ t.Errorf("ParsePublicKey(%T) failed", pub)
+ }
+
+ if len(rest) > 0 {
+ t.Errorf("ParsePublicKey(%T): trailing junk", pub)
}
k1 := rawKey(pub)
@@ -67,12 +113,9 @@ func TestUnsupportedCurves(t *testing.T) {
}
func TestNewPublicKey(t *testing.T) {
- for _, k := range testSigners {
+ keys := []Signer{rsaKey, dsaKey, ecdsaKey}
+ for _, k := range keys {
raw := rawKey(k.PublicKey())
- // Skip certificates, as NewPublicKey does not support them.
- if _, ok := raw.(*Certificate); ok {
- continue
- }
pub, err := NewPublicKey(raw)
if err != nil {
t.Errorf("NewPublicKey(%#v): %v", raw, err)
@@ -84,7 +127,8 @@ func TestNewPublicKey(t *testing.T) {
}
func TestKeySignVerify(t *testing.T) {
- for _, priv := range testSigners {
+ keys := []Signer{rsaKey, dsaKey, ecdsaKey, testCertKey}
+ for _, priv := range keys {
pub := priv.PublicKey()
data := []byte("sign me")
@@ -93,20 +137,19 @@ func TestKeySignVerify(t *testing.T) {
t.Fatalf("Sign(%T): %v", priv, err)
}
- if err := pub.Verify(data, sig); err != nil {
- t.Errorf("publicKey.Verify(%T): %v", priv, err)
- }
- sig.Blob[5]++
- if err := pub.Verify(data, sig); err == nil {
- t.Errorf("publicKey.Verify on broken sig did not fail")
+ if !pub.Verify(data, sig) {
+ t.Errorf("publicKey.Verify(%T) failed", priv)
}
}
}
func TestParseRSAPrivateKey(t *testing.T) {
- key := testPrivateKeys["rsa"]
+ key, err := ParsePrivateKey([]byte(testServerPrivateKey))
+ if err != nil {
+ t.Fatalf("ParsePrivateKey: %v", err)
+ }
- rsa, ok := key.(*rsa.PrivateKey)
+ rsa, ok := key.(*rsaPrivateKey)
if !ok {
t.Fatalf("got %T, want *rsa.PrivateKey", rsa)
}
@@ -117,11 +160,21 @@ func TestParseRSAPrivateKey(t *testing.T) {
}
func TestParseECPrivateKey(t *testing.T) {
- key := testPrivateKeys["ecdsa"]
+ // Taken from the data in test/ .
+ pem := []byte(`-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEINGWx0zo6fhJ/0EAfrPzVFyFC9s18lBt3cRoEDhS3ARooAoGCCqGSM49
+AwEHoUQDQgAEi9Hdw6KvZcWxfg2IDhA7UkpDtzzt6ZqJXSsFdLd+Kx4S3Sx4cVO+
+6/ZOXRnPmNAlLUqjShUsUBBngG0u2fqEqA==
+-----END EC PRIVATE KEY-----`)
- ecKey, ok := key.(*ecdsa.PrivateKey)
+ key, err := ParsePrivateKey(pem)
+ if err != nil {
+ t.Fatalf("ParsePrivateKey: %v", err)
+ }
+
+ ecKey, ok := key.(*ecdsaPrivateKey)
if !ok {
- t.Fatalf("got %T, want *ecdsa.PrivateKey", ecKey)
+ t.Fatalf("got %T, want *ecdsaPrivateKey", ecKey)
}
if !validateECPublicKey(ecKey.Curve, ecKey.X, ecKey.Y) {
@@ -129,11 +182,22 @@ func TestParseECPrivateKey(t *testing.T) {
}
}
+// ssh-keygen -t dsa -f /tmp/idsa.pem
+var dsaPEM = `-----BEGIN DSA PRIVATE KEY-----
+MIIBuwIBAAKBgQD6PDSEyXiI9jfNs97WuM46MSDCYlOqWw80ajN16AohtBncs1YB
+lHk//dQOvCYOsYaE+gNix2jtoRjwXhDsc25/IqQbU1ahb7mB8/rsaILRGIbA5WH3
+EgFtJmXFovDz3if6F6TzvhFpHgJRmLYVR8cqsezL3hEZOvvs2iH7MorkxwIVAJHD
+nD82+lxh2fb4PMsIiaXudAsBAoGAQRf7Q/iaPRn43ZquUhd6WwvirqUj+tkIu6eV
+2nZWYmXLlqFQKEy4Tejl7Wkyzr2OSYvbXLzo7TNxLKoWor6ips0phYPPMyXld14r
+juhT24CrhOzuLMhDduMDi032wDIZG4Y+K7ElU8Oufn8Sj5Wge8r6ANmmVgmFfynr
+FhdYCngCgYEA3ucGJ93/Mx4q4eKRDxcWD3QzWyqpbRVRRV1Vmih9Ha/qC994nJFz
+DQIdjxDIT2Rk2AGzMqFEB68Zc3O+Wcsmz5eWWzEwFxaTwOGWTyDqsDRLm3fD+QYj
+nOwuxb0Kce+gWI8voWcqC9cyRm09jGzu2Ab3Bhtpg8JJ8L7gS3MRZK4CFEx4UAfY
+Fmsr0W6fHB9nhS4/UXM8
+-----END DSA PRIVATE KEY-----`
+
func TestParseDSA(t *testing.T) {
- // We actually exercise the ParsePrivateKey codepath here, as opposed to
- // using the ParseRawPrivateKey+NewSignerFromKey path that testdata_test.go
- // uses.
- s, err := ParsePrivateKey(testdata.PEMBytes["dsa"])
+ s, err := ParsePrivateKey([]byte(dsaPEM))
if err != nil {
t.Fatalf("ParsePrivateKey returned error: %s", err)
}
@@ -144,163 +208,7 @@ func TestParseDSA(t *testing.T) {
t.Fatalf("dsa.Sign: %v", err)
}
- if err := s.PublicKey().Verify(data, sig); err != nil {
- t.Errorf("Verify failed: %v", err)
- }
-}
-
-// Tests for authorized_keys parsing.
-
-// getTestKey returns a public key, and its base64 encoding.
-func getTestKey() (PublicKey, string) {
- k := testPublicKeys["rsa"]
-
- b := &bytes.Buffer{}
- e := base64.NewEncoder(base64.StdEncoding, b)
- e.Write(k.Marshal())
- e.Close()
-
- return k, b.String()
-}
-
-func TestMarshalParsePublicKey(t *testing.T) {
- pub, pubSerialized := getTestKey()
- line := fmt.Sprintf("%s %s user@host", pub.Type(), pubSerialized)
-
- authKeys := MarshalAuthorizedKey(pub)
- actualFields := strings.Fields(string(authKeys))
- if len(actualFields) == 0 {
- t.Fatalf("failed authKeys: %v", authKeys)
- }
-
- // drop the comment
- expectedFields := strings.Fields(line)[0:2]
-
- if !reflect.DeepEqual(actualFields, expectedFields) {
- t.Errorf("got %v, expected %v", actualFields, expectedFields)
- }
-
- actPub, _, _, _, err := ParseAuthorizedKey([]byte(line))
- if err != nil {
- t.Fatalf("cannot parse %v: %v", line, err)
- }
- if !reflect.DeepEqual(actPub, pub) {
- t.Errorf("got %v, expected %v", actPub, pub)
- }
-}
-
-type authResult struct {
- pubKey PublicKey
- options []string
- comments string
- rest string
- ok bool
-}
-
-func testAuthorizedKeys(t *testing.T, authKeys []byte, expected []authResult) {
- rest := authKeys
- var values []authResult
- for len(rest) > 0 {
- var r authResult
- var err error
- r.pubKey, r.comments, r.options, rest, err = ParseAuthorizedKey(rest)
- r.ok = (err == nil)
- t.Log(err)
- r.rest = string(rest)
- values = append(values, r)
- }
-
- if !reflect.DeepEqual(values, expected) {
- t.Errorf("got %#v, expected %#v", values, expected)
- }
-}
-
-func TestAuthorizedKeyBasic(t *testing.T) {
- pub, pubSerialized := getTestKey()
- line := "ssh-rsa " + pubSerialized + " user@host"
- testAuthorizedKeys(t, []byte(line),
- []authResult{
- {pub, nil, "user@host", "", true},
- })
-}
-
-func TestAuth(t *testing.T) {
- pub, pubSerialized := getTestKey()
- authWithOptions := []string{
- `# comments to ignore before any keys...`,
- ``,
- `env="HOME=/home/root",no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host`,
- `# comments to ignore, along with a blank line`,
- ``,
- `env="HOME=/home/root2" ssh-rsa ` + pubSerialized + ` user2@host2`,
- ``,
- `# more comments, plus a invalid entry`,
- `ssh-rsa data-that-will-not-parse user@host3`,
- }
- for _, eol := range []string{"\n", "\r\n"} {
- authOptions := strings.Join(authWithOptions, eol)
- rest2 := strings.Join(authWithOptions[3:], eol)
- rest3 := strings.Join(authWithOptions[6:], eol)
- testAuthorizedKeys(t, []byte(authOptions), []authResult{
- {pub, []string{`env="HOME=/home/root"`, "no-port-forwarding"}, "user@host", rest2, true},
- {pub, []string{`env="HOME=/home/root2"`}, "user2@host2", rest3, true},
- {nil, nil, "", "", false},
- })
- }
-}
-
-func TestAuthWithQuotedSpaceInEnv(t *testing.T) {
- pub, pubSerialized := getTestKey()
- authWithQuotedSpaceInEnv := []byte(`env="HOME=/home/root dir",no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host`)
- testAuthorizedKeys(t, []byte(authWithQuotedSpaceInEnv), []authResult{
- {pub, []string{`env="HOME=/home/root dir"`, "no-port-forwarding"}, "user@host", "", true},
- })
-}
-
-func TestAuthWithQuotedCommaInEnv(t *testing.T) {
- pub, pubSerialized := getTestKey()
- authWithQuotedCommaInEnv := []byte(`env="HOME=/home/root,dir",no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host`)
- testAuthorizedKeys(t, []byte(authWithQuotedCommaInEnv), []authResult{
- {pub, []string{`env="HOME=/home/root,dir"`, "no-port-forwarding"}, "user@host", "", true},
- })
-}
-
-func TestAuthWithQuotedQuoteInEnv(t *testing.T) {
- pub, pubSerialized := getTestKey()
- authWithQuotedQuoteInEnv := []byte(`env="HOME=/home/\"root dir",no-port-forwarding` + "\t" + `ssh-rsa` + "\t" + pubSerialized + ` user@host`)
- authWithDoubleQuotedQuote := []byte(`no-port-forwarding,env="HOME=/home/ \"root dir\"" ssh-rsa ` + pubSerialized + "\t" + `user@host`)
- testAuthorizedKeys(t, []byte(authWithQuotedQuoteInEnv), []authResult{
- {pub, []string{`env="HOME=/home/\"root dir"`, "no-port-forwarding"}, "user@host", "", true},
- })
-
- testAuthorizedKeys(t, []byte(authWithDoubleQuotedQuote), []authResult{
- {pub, []string{"no-port-forwarding", `env="HOME=/home/ \"root dir\""`}, "user@host", "", true},
- })
-}
-
-func TestAuthWithInvalidSpace(t *testing.T) {
- _, pubSerialized := getTestKey()
- authWithInvalidSpace := []byte(`env="HOME=/home/root dir", no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host
-#more to follow but still no valid keys`)
- testAuthorizedKeys(t, []byte(authWithInvalidSpace), []authResult{
- {nil, nil, "", "", false},
- })
-}
-
-func TestAuthWithMissingQuote(t *testing.T) {
- pub, pubSerialized := getTestKey()
- authWithMissingQuote := []byte(`env="HOME=/home/root,no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host
-env="HOME=/home/root",shared-control ssh-rsa ` + pubSerialized + ` user@host`)
-
- testAuthorizedKeys(t, []byte(authWithMissingQuote), []authResult{
- {pub, []string{`env="HOME=/home/root"`, `shared-control`}, "user@host", "", true},
- })
-}
-
-func TestInvalidEntry(t *testing.T) {
- authInvalid := []byte(`ssh-rsa`)
- _, _, _, _, err := ParseAuthorizedKey(authInvalid)
- if err == nil {
- t.Errorf("got valid entry for %q", authInvalid)
+ if !s.PublicKey().Verify(data, sig) {
+ t.Error("Verify failed.")
}
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/mac.go b/vendor/code.google.com/p/go.crypto/ssh/mac.go
index aff404291..6862d3e34 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/mac.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/mac.go
@@ -43,6 +43,11 @@ func (t truncatingMAC) Size() int {
func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() }
+// Specifies a default set of MAC algorithms and a preference order.
+// This is based on RFC 4253, section 6.4, with the removal of the
+// hmac-md5 variants as they have reached the end of their useful life.
+var DefaultMACOrder = []string{"hmac-sha1", "hmac-sha1-96"}
+
var macModes = map[string]*macMode{
"hmac-sha1": {20, func(key []byte) hash.Hash {
return hmac.New(sha1.New, key)
diff --git a/vendor/code.google.com/p/go.crypto/ssh/mempipe_test.go b/vendor/code.google.com/p/go.crypto/ssh/mempipe_test.go
index 92519dd6b..ec1b854ec 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/mempipe_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/mempipe_test.go
@@ -36,32 +36,24 @@ func (t *memTransport) readPacket() ([]byte, error) {
}
}
-func (t *memTransport) closeSelf() error {
- t.Lock()
- defer t.Unlock()
- if t.eof {
+func (t *memTransport) Close() error {
+ t.write.Lock()
+ defer t.write.Unlock()
+ if t.write.eof {
return io.EOF
}
- t.eof = true
- t.Cond.Broadcast()
+ t.write.eof = true
+ t.write.Cond.Broadcast()
return nil
}
-func (t *memTransport) Close() error {
- err := t.write.closeSelf()
- t.closeSelf()
- return err
-}
-
func (t *memTransport) writePacket(p []byte) error {
t.write.Lock()
defer t.write.Unlock()
if t.write.eof {
return io.EOF
}
- c := make([]byte, len(p))
- copy(c, p)
- t.write.pending = append(t.write.pending, c)
+ t.write.pending = append(t.write.pending, p)
t.write.Cond.Signal()
return nil
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/messages.go b/vendor/code.google.com/p/go.crypto/ssh/messages.go
index f9e44bb1e..94c3ea039 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/messages.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/messages.go
@@ -7,25 +7,58 @@ package ssh
import (
"bytes"
"encoding/binary"
- "errors"
- "fmt"
"io"
"math/big"
"reflect"
- "strconv"
)
// These are SSH message type numbers. They are scattered around several
// documents but many were taken from [SSH-PARAMETERS].
const (
- msgIgnore = 2
- msgUnimplemented = 3
- msgDebug = 4
- msgNewKeys = 21
+ msgDisconnect = 1
+ msgIgnore = 2
+ msgUnimplemented = 3
+ msgDebug = 4
+ msgServiceRequest = 5
+ msgServiceAccept = 6
+
+ msgKexInit = 20
+ msgNewKeys = 21
+
+ // Diffie-Helman
+ msgKexDHInit = 30
+ msgKexDHReply = 31
+
+ msgKexECDHInit = 30
+ msgKexECDHReply = 31
// Standard authentication messages
- msgUserAuthSuccess = 52
- msgUserAuthBanner = 53
+ msgUserAuthRequest = 50
+ msgUserAuthFailure = 51
+ msgUserAuthSuccess = 52
+ msgUserAuthBanner = 53
+ msgUserAuthPubKeyOk = 60
+
+ // Method specific messages
+ msgUserAuthInfoRequest = 60
+ msgUserAuthInfoResponse = 61
+
+ msgGlobalRequest = 80
+ msgRequestSuccess = 81
+ msgRequestFailure = 82
+
+ // Channel manipulation
+ msgChannelOpen = 90
+ msgChannelOpenConfirm = 91
+ msgChannelOpenFailure = 92
+ msgChannelWindowAdjust = 93
+ msgChannelData = 94
+ msgChannelExtendedData = 95
+ msgChannelEOF = 96
+ msgChannelClose = 97
+ msgChannelRequest = 98
+ msgChannelSuccess = 99
+ msgChannelFailure = 100
)
// SSH messages:
@@ -36,25 +69,15 @@ const (
// ssh tag of "rest" receives the remainder of a packet when unmarshaling.
// See RFC 4253, section 11.1.
-const msgDisconnect = 1
-
-// disconnectMsg is the message that signals a disconnect. It is also
-// the error type returned from mux.Wait()
type disconnectMsg struct {
- Reason uint32 `sshtype:"1"`
+ Reason uint32
Message string
Language string
}
-func (d *disconnectMsg) Error() string {
- return fmt.Sprintf("ssh: disconnect reason %d: %s", d.Reason, d.Message)
-}
-
// See RFC 4253, section 7.1.
-const msgKexInit = 20
-
type kexInitMsg struct {
- Cookie [16]byte `sshtype:"20"`
+ Cookie [16]byte
KexAlgos []string
ServerHostKeyAlgos []string
CiphersClientServer []string
@@ -70,74 +93,53 @@ type kexInitMsg struct {
}
// See RFC 4253, section 8.
-
-// Diffie-Helman
-const msgKexDHInit = 30
-
type kexDHInitMsg struct {
- X *big.Int `sshtype:"30"`
+ X *big.Int
}
-const msgKexECDHInit = 30
-
type kexECDHInitMsg struct {
- ClientPubKey []byte `sshtype:"30"`
+ ClientPubKey []byte
}
-const msgKexECDHReply = 31
-
type kexECDHReplyMsg struct {
- HostKey []byte `sshtype:"31"`
+ HostKey []byte
EphemeralPubKey []byte
Signature []byte
}
-const msgKexDHReply = 31
-
type kexDHReplyMsg struct {
- HostKey []byte `sshtype:"31"`
+ HostKey []byte
Y *big.Int
Signature []byte
}
// See RFC 4253, section 10.
-const msgServiceRequest = 5
-
type serviceRequestMsg struct {
- Service string `sshtype:"5"`
+ Service string
}
// See RFC 4253, section 10.
-const msgServiceAccept = 6
-
type serviceAcceptMsg struct {
- Service string `sshtype:"6"`
+ Service string
}
// See RFC 4252, section 5.
-const msgUserAuthRequest = 50
-
type userAuthRequestMsg struct {
- User string `sshtype:"50"`
+ User string
Service string
Method string
Payload []byte `ssh:"rest"`
}
// See RFC 4252, section 5.1
-const msgUserAuthFailure = 51
-
type userAuthFailureMsg struct {
- Methods []string `sshtype:"51"`
+ Methods []string
PartialSuccess bool
}
// See RFC 4256, section 3.2
-const msgUserAuthInfoRequest = 60
-const msgUserAuthInfoResponse = 61
-
type userAuthInfoRequestMsg struct {
- User string `sshtype:"60"`
+ User string
Instruction string
DeprecatedLanguage string
NumPrompts uint32
@@ -145,24 +147,17 @@ type userAuthInfoRequestMsg struct {
}
// See RFC 4254, section 5.1.
-const msgChannelOpen = 90
-
type channelOpenMsg struct {
- ChanType string `sshtype:"90"`
+ ChanType string
PeersId uint32
PeersWindow uint32
MaxPacketSize uint32
TypeSpecificData []byte `ssh:"rest"`
}
-const msgChannelExtendedData = 95
-const msgChannelData = 94
-
// See RFC 4254, section 5.1.
-const msgChannelOpenConfirm = 91
-
type channelOpenConfirmMsg struct {
- PeersId uint32 `sshtype:"91"`
+ PeersId uint32
MyId uint32
MyWindow uint32
MaxPacketSize uint32
@@ -170,239 +165,172 @@ type channelOpenConfirmMsg struct {
}
// See RFC 4254, section 5.1.
-const msgChannelOpenFailure = 92
-
type channelOpenFailureMsg struct {
- PeersId uint32 `sshtype:"92"`
+ PeersId uint32
Reason RejectionReason
Message string
Language string
}
-const msgChannelRequest = 98
-
type channelRequestMsg struct {
- PeersId uint32 `sshtype:"98"`
+ PeersId uint32
Request string
WantReply bool
RequestSpecificData []byte `ssh:"rest"`
}
// See RFC 4254, section 5.4.
-const msgChannelSuccess = 99
-
type channelRequestSuccessMsg struct {
- PeersId uint32 `sshtype:"99"`
+ PeersId uint32
}
// See RFC 4254, section 5.4.
-const msgChannelFailure = 100
-
type channelRequestFailureMsg struct {
- PeersId uint32 `sshtype:"100"`
+ PeersId uint32
}
// See RFC 4254, section 5.3
-const msgChannelClose = 97
-
type channelCloseMsg struct {
- PeersId uint32 `sshtype:"97"`
+ PeersId uint32
}
// See RFC 4254, section 5.3
-const msgChannelEOF = 96
-
type channelEOFMsg struct {
- PeersId uint32 `sshtype:"96"`
+ PeersId uint32
}
// See RFC 4254, section 4
-const msgGlobalRequest = 80
-
type globalRequestMsg struct {
- Type string `sshtype:"80"`
+ Type string
WantReply bool
- Data []byte `ssh:"rest"`
}
// See RFC 4254, section 4
-const msgRequestSuccess = 81
-
type globalRequestSuccessMsg struct {
- Data []byte `ssh:"rest" sshtype:"81"`
+ Data []byte `ssh:"rest"`
}
// See RFC 4254, section 4
-const msgRequestFailure = 82
-
type globalRequestFailureMsg struct {
- Data []byte `ssh:"rest" sshtype:"82"`
+ Data []byte `ssh:"rest"`
}
// See RFC 4254, section 5.2
-const msgChannelWindowAdjust = 93
-
type windowAdjustMsg struct {
- PeersId uint32 `sshtype:"93"`
+ PeersId uint32
AdditionalBytes uint32
}
// See RFC 4252, section 7
-const msgUserAuthPubKeyOk = 60
-
type userAuthPubKeyOkMsg struct {
- Algo string `sshtype:"60"`
- PubKey []byte
+ Algo string
+ PubKey string
}
-// typeTag returns the type byte for the given type. The type should
-// be struct.
-func typeTag(structType reflect.Type) byte {
- var tag byte
- var tagStr string
- tagStr = structType.Field(0).Tag.Get("sshtype")
- i, err := strconv.Atoi(tagStr)
- if err == nil {
- tag = byte(i)
- }
- return tag
-}
-
-func fieldError(t reflect.Type, field int, problem string) error {
- if problem != "" {
- problem = ": " + problem
- }
- return fmt.Errorf("ssh: unmarshal error for field %s of type %s%s", t.Field(field).Name, t.Name(), problem)
-}
-
-var errShortRead = errors.New("ssh: short read")
-
-// Unmarshal parses data in SSH wire format into a structure. The out
-// argument should be a pointer to struct. If the first member of the
-// struct has the "sshtype" tag set to a number in decimal, the packet
-// must start that number. In case of error, Unmarshal returns a
-// ParseError or UnexpectedMessageError.
-func Unmarshal(data []byte, out interface{}) error {
- v := reflect.ValueOf(out).Elem()
- structType := v.Type()
- expectedType := typeTag(structType)
- if len(data) == 0 {
- return parseError(expectedType)
+// unmarshal parses the SSH wire data in packet into out using
+// reflection. expectedType, if non-zero, is the SSH message type that
+// the packet is expected to start with. unmarshal either returns nil
+// on success, or a ParseError or UnexpectedMessageError on error.
+func unmarshal(out interface{}, packet []byte, expectedType uint8) error {
+ if len(packet) == 0 {
+ return ParseError{expectedType}
}
if expectedType > 0 {
- if data[0] != expectedType {
- return unexpectedMessageError(expectedType, data[0])
+ if packet[0] != expectedType {
+ return UnexpectedMessageError{expectedType, packet[0]}
}
- data = data[1:]
+ packet = packet[1:]
}
+ v := reflect.ValueOf(out).Elem()
+ structType := v.Type()
var ok bool
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
t := field.Type()
switch t.Kind() {
case reflect.Bool:
- if len(data) < 1 {
- return errShortRead
+ if len(packet) < 1 {
+ return ParseError{expectedType}
}
- field.SetBool(data[0] != 0)
- data = data[1:]
+ field.SetBool(packet[0] != 0)
+ packet = packet[1:]
case reflect.Array:
if t.Elem().Kind() != reflect.Uint8 {
- return fieldError(structType, i, "array of unsupported type")
+ panic("array of non-uint8")
}
- if len(data) < t.Len() {
- return errShortRead
+ if len(packet) < t.Len() {
+ return ParseError{expectedType}
}
for j, n := 0, t.Len(); j < n; j++ {
- field.Index(j).Set(reflect.ValueOf(data[j]))
+ field.Index(j).Set(reflect.ValueOf(packet[j]))
}
- data = data[t.Len():]
- case reflect.Uint64:
- var u64 uint64
- if u64, data, ok = parseUint64(data); !ok {
- return errShortRead
- }
- field.SetUint(u64)
+ packet = packet[t.Len():]
case reflect.Uint32:
var u32 uint32
- if u32, data, ok = parseUint32(data); !ok {
- return errShortRead
+ if u32, packet, ok = parseUint32(packet); !ok {
+ return ParseError{expectedType}
}
field.SetUint(uint64(u32))
- case reflect.Uint8:
- if len(data) < 1 {
- return errShortRead
- }
- field.SetUint(uint64(data[0]))
- data = data[1:]
case reflect.String:
var s []byte
- if s, data, ok = parseString(data); !ok {
- return fieldError(structType, i, "")
+ if s, packet, ok = parseString(packet); !ok {
+ return ParseError{expectedType}
}
field.SetString(string(s))
case reflect.Slice:
switch t.Elem().Kind() {
case reflect.Uint8:
if structType.Field(i).Tag.Get("ssh") == "rest" {
- field.Set(reflect.ValueOf(data))
- data = nil
+ field.Set(reflect.ValueOf(packet))
+ packet = nil
} else {
var s []byte
- if s, data, ok = parseString(data); !ok {
- return errShortRead
+ if s, packet, ok = parseString(packet); !ok {
+ return ParseError{expectedType}
}
field.Set(reflect.ValueOf(s))
}
case reflect.String:
var nl []string
- if nl, data, ok = parseNameList(data); !ok {
- return errShortRead
+ if nl, packet, ok = parseNameList(packet); !ok {
+ return ParseError{expectedType}
}
field.Set(reflect.ValueOf(nl))
default:
- return fieldError(structType, i, "slice of unsupported type")
+ panic("slice of unknown type")
}
case reflect.Ptr:
if t == bigIntType {
var n *big.Int
- if n, data, ok = parseInt(data); !ok {
- return errShortRead
+ if n, packet, ok = parseInt(packet); !ok {
+ return ParseError{expectedType}
}
field.Set(reflect.ValueOf(n))
} else {
- return fieldError(structType, i, "pointer to unsupported type")
+ panic("pointer to unknown type")
}
default:
- return fieldError(structType, i, "unsupported type")
+ panic("unknown type")
}
}
- if len(data) != 0 {
- return parseError(expectedType)
+ if len(packet) != 0 {
+ return ParseError{expectedType}
}
return nil
}
-// Marshal serializes the message in msg to SSH wire format. The msg
-// argument should be a struct or pointer to struct. If the first
-// member has the "sshtype" tag set to a number in decimal, that
-// number is prepended to the result. If the last of member has the
-// "ssh" tag set to "rest", its contents are appended to the output.
-func Marshal(msg interface{}) []byte {
+// marshal serializes the message in msg. The given message type is
+// prepended if it is non-zero.
+func marshal(msgType uint8, msg interface{}) []byte {
out := make([]byte, 0, 64)
- return marshalStruct(out, msg)
-}
-
-func marshalStruct(out []byte, msg interface{}) []byte {
- v := reflect.Indirect(reflect.ValueOf(msg))
- msgType := typeTag(v.Type())
if msgType > 0 {
out = append(out, msgType)
}
+ v := reflect.ValueOf(msg)
for i, n := 0, v.NumField(); i < n; i++ {
field := v.Field(i)
switch t := field.Type(); t.Kind() {
@@ -414,17 +342,13 @@ func marshalStruct(out []byte, msg interface{}) []byte {
out = append(out, v)
case reflect.Array:
if t.Elem().Kind() != reflect.Uint8 {
- panic(fmt.Sprintf("array of non-uint8 in field %d: %T", i, field.Interface()))
+ panic("array of non-uint8")
}
for j, l := 0, t.Len(); j < l; j++ {
out = append(out, uint8(field.Index(j).Uint()))
}
case reflect.Uint32:
out = appendU32(out, uint32(field.Uint()))
- case reflect.Uint64:
- out = appendU64(out, uint64(field.Uint()))
- case reflect.Uint8:
- out = append(out, uint8(field.Uint()))
case reflect.String:
s := field.String()
out = appendInt(out, len(s))
@@ -451,7 +375,7 @@ func marshalStruct(out []byte, msg interface{}) []byte {
binary.BigEndian.PutUint32(out[offset:], uint32(len(out)-offset-4))
}
default:
- panic(fmt.Sprintf("slice of unknown type in field %d: %T", i, field.Interface()))
+ panic("slice of unknown type")
}
case reflect.Ptr:
if t == bigIntType {
@@ -469,7 +393,7 @@ func marshalStruct(out []byte, msg interface{}) []byte {
out = out[:oldLength+needed]
marshalInt(out[oldLength:], n)
} else {
- panic(fmt.Sprintf("pointer to unknown type in field %d: %T", i, field.Interface()))
+ panic("pointer to unknown type")
}
}
}
@@ -553,6 +477,17 @@ func parseUint64(in []byte) (uint64, []byte, bool) {
return binary.BigEndian.Uint64(in), in[8:], true
}
+func nameListLength(namelist []string) int {
+ length := 4 /* uint32 length prefix */
+ for i, name := range namelist {
+ if i != 0 {
+ length++ /* comma */
+ }
+ length += len(name)
+ }
+ return length
+}
+
func intLength(n *big.Int) int {
length := 4 /* length bytes */
if n.Sign() < 0 {
@@ -715,9 +650,9 @@ func decode(packet []byte) (interface{}, error) {
case msgChannelFailure:
msg = new(channelRequestFailureMsg)
default:
- return nil, unexpectedMessageError(0, packet[0])
+ return nil, UnexpectedMessageError{0, packet[0]}
}
- if err := Unmarshal(packet, msg); err != nil {
+ if err := unmarshal(msg, packet, packet[0]); err != nil {
return nil, err
}
return msg, nil
diff --git a/vendor/code.google.com/p/go.crypto/ssh/messages_test.go b/vendor/code.google.com/p/go.crypto/ssh/messages_test.go
index 21d52daf2..ec1d7be6f 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/messages_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/messages_test.go
@@ -5,7 +5,6 @@
package ssh
import (
- "bytes"
"math/big"
"math/rand"
"reflect"
@@ -33,62 +32,48 @@ func TestIntLength(t *testing.T) {
}
}
-type msgAllTypes struct {
- Bool bool `sshtype:"21"`
- Array [16]byte
- Uint64 uint64
- Uint32 uint32
- Uint8 uint8
- String string
- Strings []string
- Bytes []byte
- Int *big.Int
- Rest []byte `ssh:"rest"`
-}
-
-func (t *msgAllTypes) Generate(rand *rand.Rand, size int) reflect.Value {
- m := &msgAllTypes{}
- m.Bool = rand.Intn(2) == 1
- randomBytes(m.Array[:], rand)
- m.Uint64 = uint64(rand.Int63n(1<<63 - 1))
- m.Uint32 = uint32(rand.Intn((1 << 31) - 1))
- m.Uint8 = uint8(rand.Intn(1 << 8))
- m.String = string(m.Array[:])
- m.Strings = randomNameList(rand)
- m.Bytes = m.Array[:]
- m.Int = randomInt(rand)
- m.Rest = m.Array[:]
- return reflect.ValueOf(m)
+var messageTypes = []interface{}{
+ &kexInitMsg{},
+ &kexDHInitMsg{},
+ &serviceRequestMsg{},
+ &serviceAcceptMsg{},
+ &userAuthRequestMsg{},
+ &channelOpenMsg{},
+ &channelOpenConfirmMsg{},
+ &channelOpenFailureMsg{},
+ &channelRequestMsg{},
+ &channelRequestSuccessMsg{},
}
func TestMarshalUnmarshal(t *testing.T) {
rand := rand.New(rand.NewSource(0))
- iface := &msgAllTypes{}
- ty := reflect.ValueOf(iface).Type()
+ for i, iface := range messageTypes {
+ ty := reflect.ValueOf(iface).Type()
- n := 100
- if testing.Short() {
- n = 5
- }
- for j := 0; j < n; j++ {
- v, ok := quick.Value(ty, rand)
- if !ok {
- t.Errorf("failed to create value")
- break
+ n := 100
+ if testing.Short() {
+ n = 5
}
+ for j := 0; j < n; j++ {
+ v, ok := quick.Value(ty, rand)
+ if !ok {
+ t.Errorf("#%d: failed to create value", i)
+ break
+ }
- m1 := v.Elem().Interface()
- m2 := iface
+ m1 := v.Elem().Interface()
+ m2 := iface
- marshaled := Marshal(m1)
- if err := Unmarshal(marshaled, m2); err != nil {
- t.Errorf("Unmarshal %#v: %s", m1, err)
- break
- }
+ marshaled := marshal(msgIgnore, m1)
+ if err := unmarshal(m2, marshaled, msgIgnore); err != nil {
+ t.Errorf("#%d failed to unmarshal %#v: %s", i, m1, err)
+ break
+ }
- if !reflect.DeepEqual(v.Interface(), m2) {
- t.Errorf("got: %#v\nwant:%#v\n%x", m2, m1, marshaled)
- break
+ if !reflect.DeepEqual(v.Interface(), m2) {
+ t.Errorf("#%d\ngot: %#v\nwant:%#v\n%x", i, m2, m1, marshaled)
+ break
+ }
}
}
}
@@ -96,37 +81,33 @@ func TestMarshalUnmarshal(t *testing.T) {
func TestUnmarshalEmptyPacket(t *testing.T) {
var b []byte
var m channelRequestSuccessMsg
- if err := Unmarshal(b, &m); err == nil {
- t.Fatalf("unmarshal of empty slice succeeded")
+ err := unmarshal(&m, b, msgChannelRequest)
+ want := ParseError{msgChannelRequest}
+ if _, ok := err.(ParseError); !ok {
+ t.Fatalf("got %T, want %T", err, want)
+ }
+ if got := err.(ParseError); want != got {
+ t.Fatal("got %#v, want %#v", got, want)
}
}
func TestUnmarshalUnexpectedPacket(t *testing.T) {
type S struct {
- I uint32 `sshtype:"43"`
+ I uint32
S string
B bool
}
- s := S{11, "hello", true}
- packet := Marshal(s)
- packet[0] = 42
+ s := S{42, "hello", true}
+ packet := marshal(42, s)
roundtrip := S{}
- err := Unmarshal(packet, &roundtrip)
+ err := unmarshal(&roundtrip, packet, 43)
if err == nil {
t.Fatal("expected error, not nil")
}
-}
-
-func TestMarshalPtr(t *testing.T) {
- s := struct {
- S string
- }{"hello"}
-
- m1 := Marshal(s)
- m2 := Marshal(&s)
- if !bytes.Equal(m1, m2) {
- t.Errorf("got %q, want %q for marshaled pointer", m2, m1)
+ want := UnexpectedMessageError{43, 42}
+ if got, ok := err.(UnexpectedMessageError); !ok || want != got {
+ t.Fatal("expected %q, got %q", want, got)
}
}
@@ -138,9 +119,9 @@ func TestBareMarshalUnmarshal(t *testing.T) {
}
s := S{42, "hello", true}
- packet := Marshal(s)
+ packet := marshal(0, s)
roundtrip := S{}
- Unmarshal(packet, &roundtrip)
+ unmarshal(&roundtrip, packet, 0)
if !reflect.DeepEqual(s, roundtrip) {
t.Errorf("got %#v, want %#v", roundtrip, s)
@@ -152,7 +133,7 @@ func TestBareMarshal(t *testing.T) {
I uint32
}
s := S2{42}
- packet := Marshal(s)
+ packet := marshal(0, s)
i, rest, ok := parseUint32(packet)
if len(rest) > 0 || !ok {
t.Errorf("parseInt(%q): parse error", packet)
@@ -209,36 +190,43 @@ func (*kexDHInitMsg) Generate(rand *rand.Rand, size int) reflect.Value {
return reflect.ValueOf(dhi)
}
+// TODO(dfc) maybe this can be removed in the future if testing/quick can handle
+// derived basic types.
+func (RejectionReason) Generate(rand *rand.Rand, size int) reflect.Value {
+ m := RejectionReason(Prohibited)
+ return reflect.ValueOf(m)
+}
+
var (
_kexInitMsg = new(kexInitMsg).Generate(rand.New(rand.NewSource(0)), 10).Elem().Interface()
_kexDHInitMsg = new(kexDHInitMsg).Generate(rand.New(rand.NewSource(0)), 10).Elem().Interface()
- _kexInit = Marshal(_kexInitMsg)
- _kexDHInit = Marshal(_kexDHInitMsg)
+ _kexInit = marshal(msgKexInit, _kexInitMsg)
+ _kexDHInit = marshal(msgKexDHInit, _kexDHInitMsg)
)
func BenchmarkMarshalKexInitMsg(b *testing.B) {
for i := 0; i < b.N; i++ {
- Marshal(_kexInitMsg)
+ marshal(msgKexInit, _kexInitMsg)
}
}
func BenchmarkUnmarshalKexInitMsg(b *testing.B) {
m := new(kexInitMsg)
for i := 0; i < b.N; i++ {
- Unmarshal(_kexInit, m)
+ unmarshal(m, _kexInit, msgKexInit)
}
}
func BenchmarkMarshalKexDHInitMsg(b *testing.B) {
for i := 0; i < b.N; i++ {
- Marshal(_kexDHInitMsg)
+ marshal(msgKexDHInit, _kexDHInitMsg)
}
}
func BenchmarkUnmarshalKexDHInitMsg(b *testing.B) {
m := new(kexDHInitMsg)
for i := 0; i < b.N; i++ {
- Unmarshal(_kexDHInit, m)
+ unmarshal(m, _kexDHInit, msgKexDHInit)
}
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/mux.go b/vendor/code.google.com/p/go.crypto/ssh/mux.go
deleted file mode 100644
index 321880ad9..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/mux.go
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssh
-
-import (
- "encoding/binary"
- "fmt"
- "io"
- "log"
- "sync"
- "sync/atomic"
-)
-
-// debugMux, if set, causes messages in the connection protocol to be
-// logged.
-const debugMux = false
-
-// chanList is a thread safe channel list.
-type chanList struct {
- // protects concurrent access to chans
- sync.Mutex
-
- // chans are indexed by the local id of the channel, which the
- // other side should send in the PeersId field.
- chans []*channel
-
- // This is a debugging aid: it offsets all IDs by this
- // amount. This helps distinguish otherwise identical
- // server/client muxes
- offset uint32
-}
-
-// Assigns a channel ID to the given channel.
-func (c *chanList) add(ch *channel) uint32 {
- c.Lock()
- defer c.Unlock()
- for i := range c.chans {
- if c.chans[i] == nil {
- c.chans[i] = ch
- return uint32(i) + c.offset
- }
- }
- c.chans = append(c.chans, ch)
- return uint32(len(c.chans)-1) + c.offset
-}
-
-// getChan returns the channel for the given ID.
-func (c *chanList) getChan(id uint32) *channel {
- id -= c.offset
-
- c.Lock()
- defer c.Unlock()
- if id < uint32(len(c.chans)) {
- return c.chans[id]
- }
- return nil
-}
-
-func (c *chanList) remove(id uint32) {
- id -= c.offset
- c.Lock()
- if id < uint32(len(c.chans)) {
- c.chans[id] = nil
- }
- c.Unlock()
-}
-
-// dropAll forgets all channels it knows, returning them in a slice.
-func (c *chanList) dropAll() []*channel {
- c.Lock()
- defer c.Unlock()
- var r []*channel
-
- for _, ch := range c.chans {
- if ch == nil {
- continue
- }
- r = append(r, ch)
- }
- c.chans = nil
- return r
-}
-
-// mux represents the state for the SSH connection protocol, which
-// multiplexes many channels onto a single packet transport.
-type mux struct {
- conn packetConn
- chanList chanList
-
- incomingChannels chan NewChannel
-
- globalSentMu sync.Mutex
- globalResponses chan interface{}
- incomingRequests chan *Request
-
- errCond *sync.Cond
- err error
-}
-
-// When debugging, each new chanList instantiation has a different
-// offset.
-var globalOff uint32
-
-func (m *mux) Wait() error {
- m.errCond.L.Lock()
- defer m.errCond.L.Unlock()
- for m.err == nil {
- m.errCond.Wait()
- }
- return m.err
-}
-
-// newMux returns a mux that runs over the given connection.
-func newMux(p packetConn) *mux {
- m := &mux{
- conn: p,
- incomingChannels: make(chan NewChannel, 16),
- globalResponses: make(chan interface{}, 1),
- incomingRequests: make(chan *Request, 16),
- errCond: newCond(),
- }
- if debugMux {
- m.chanList.offset = atomic.AddUint32(&globalOff, 1)
- }
-
- go m.loop()
- return m
-}
-
-func (m *mux) sendMessage(msg interface{}) error {
- p := Marshal(msg)
- return m.conn.writePacket(p)
-}
-
-func (m *mux) SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) {
- if wantReply {
- m.globalSentMu.Lock()
- defer m.globalSentMu.Unlock()
- }
-
- if err := m.sendMessage(globalRequestMsg{
- Type: name,
- WantReply: wantReply,
- Data: payload,
- }); err != nil {
- return false, nil, err
- }
-
- if !wantReply {
- return false, nil, nil
- }
-
- msg, ok := <-m.globalResponses
- if !ok {
- return false, nil, io.EOF
- }
- switch msg := msg.(type) {
- case *globalRequestFailureMsg:
- return false, msg.Data, nil
- case *globalRequestSuccessMsg:
- return true, msg.Data, nil
- default:
- return false, nil, fmt.Errorf("ssh: unexpected response to request: %#v", msg)
- }
-}
-
-// ackRequest must be called after processing a global request that
-// has WantReply set.
-func (m *mux) ackRequest(ok bool, data []byte) error {
- if ok {
- return m.sendMessage(globalRequestSuccessMsg{Data: data})
- }
- return m.sendMessage(globalRequestFailureMsg{Data: data})
-}
-
-// TODO(hanwen): Disconnect is a transport layer message. We should
-// probably send and receive Disconnect somewhere in the transport
-// code.
-
-// Disconnect sends a disconnect message.
-func (m *mux) Disconnect(reason uint32, message string) error {
- return m.sendMessage(disconnectMsg{
- Reason: reason,
- Message: message,
- })
-}
-
-func (m *mux) Close() error {
- return m.conn.Close()
-}
-
-// loop runs the connection machine. It will process packets until an
-// error is encountered. To synchronize on loop exit, use mux.Wait.
-func (m *mux) loop() {
- var err error
- for err == nil {
- err = m.onePacket()
- }
-
- for _, ch := range m.chanList.dropAll() {
- ch.close()
- }
-
- close(m.incomingChannels)
- close(m.incomingRequests)
- close(m.globalResponses)
-
- m.conn.Close()
-
- m.errCond.L.Lock()
- m.err = err
- m.errCond.Broadcast()
- m.errCond.L.Unlock()
-
- if debugMux {
- log.Println("loop exit", err)
- }
-}
-
-// onePacket reads and processes one packet.
-func (m *mux) onePacket() error {
- packet, err := m.conn.readPacket()
- if err != nil {
- return err
- }
-
- if debugMux {
- if packet[0] == msgChannelData || packet[0] == msgChannelExtendedData {
- log.Printf("decoding(%d): data packet - %d bytes", m.chanList.offset, len(packet))
- } else {
- p, _ := decode(packet)
- log.Printf("decoding(%d): %d %#v - %d bytes", m.chanList.offset, packet[0], p, len(packet))
- }
- }
-
- switch packet[0] {
- case msgNewKeys:
- // Ignore notification of key change.
- return nil
- case msgDisconnect:
- return m.handleDisconnect(packet)
- case msgChannelOpen:
- return m.handleChannelOpen(packet)
- case msgGlobalRequest, msgRequestSuccess, msgRequestFailure:
- return m.handleGlobalPacket(packet)
- }
-
- // assume a channel packet.
- if len(packet) < 5 {
- return parseError(packet[0])
- }
- id := binary.BigEndian.Uint32(packet[1:])
- ch := m.chanList.getChan(id)
- if ch == nil {
- return fmt.Errorf("ssh: invalid channel %d", id)
- }
-
- return ch.handlePacket(packet)
-}
-
-func (m *mux) handleDisconnect(packet []byte) error {
- var d disconnectMsg
- if err := Unmarshal(packet, &d); err != nil {
- return err
- }
-
- if debugMux {
- log.Printf("caught disconnect: %v", d)
- }
- return &d
-}
-
-func (m *mux) handleGlobalPacket(packet []byte) error {
- msg, err := decode(packet)
- if err != nil {
- return err
- }
-
- switch msg := msg.(type) {
- case *globalRequestMsg:
- m.incomingRequests <- &Request{
- Type: msg.Type,
- WantReply: msg.WantReply,
- Payload: msg.Data,
- mux: m,
- }
- case *globalRequestSuccessMsg, *globalRequestFailureMsg:
- m.globalResponses <- msg
- default:
- panic(fmt.Sprintf("not a global message %#v", msg))
- }
-
- return nil
-}
-
-// handleChannelOpen schedules a channel to be Accept()ed.
-func (m *mux) handleChannelOpen(packet []byte) error {
- var msg channelOpenMsg
- if err := Unmarshal(packet, &msg); err != nil {
- return err
- }
-
- if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 {
- failMsg := channelOpenFailureMsg{
- PeersId: msg.PeersId,
- Reason: ConnectionFailed,
- Message: "invalid request",
- Language: "en_US.UTF-8",
- }
- return m.sendMessage(failMsg)
- }
-
- c := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData)
- c.remoteId = msg.PeersId
- c.maxRemotePayload = msg.MaxPacketSize
- c.remoteWin.add(msg.PeersWindow)
- m.incomingChannels <- c
- return nil
-}
-
-func (m *mux) OpenChannel(chanType string, extra []byte) (Channel, <-chan *Request, error) {
- ch, err := m.openChannel(chanType, extra)
- if err != nil {
- return nil, nil, err
- }
-
- return ch, ch.incomingRequests, nil
-}
-
-func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) {
- ch := m.newChannel(chanType, channelOutbound, extra)
-
- ch.maxIncomingPayload = channelMaxPacket
-
- open := channelOpenMsg{
- ChanType: chanType,
- PeersWindow: ch.myWindow,
- MaxPacketSize: ch.maxIncomingPayload,
- TypeSpecificData: extra,
- PeersId: ch.localId,
- }
- if err := m.sendMessage(open); err != nil {
- return nil, err
- }
-
- switch msg := (<-ch.msg).(type) {
- case *channelOpenConfirmMsg:
- return ch, nil
- case *channelOpenFailureMsg:
- return nil, &OpenChannelError{msg.Reason, msg.Message}
- default:
- return nil, fmt.Errorf("ssh: unexpected packet in response to channel open: %T", msg)
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/mux_test.go b/vendor/code.google.com/p/go.crypto/ssh/mux_test.go
deleted file mode 100644
index 523038960..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/mux_test.go
+++ /dev/null
@@ -1,525 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssh
-
-import (
- "io"
- "io/ioutil"
- "sync"
- "testing"
-)
-
-func muxPair() (*mux, *mux) {
- a, b := memPipe()
-
- s := newMux(a)
- c := newMux(b)
-
- return s, c
-}
-
-// Returns both ends of a channel, and the mux for the the 2nd
-// channel.
-func channelPair(t *testing.T) (*channel, *channel, *mux) {
- c, s := muxPair()
-
- res := make(chan *channel, 1)
- go func() {
- newCh, ok := <-s.incomingChannels
- if !ok {
- t.Fatalf("No incoming channel")
- }
- if newCh.ChannelType() != "chan" {
- t.Fatalf("got type %q want chan", newCh.ChannelType())
- }
- ch, _, err := newCh.Accept()
- if err != nil {
- t.Fatalf("Accept %v", err)
- }
- res <- ch.(*channel)
- }()
-
- ch, err := c.openChannel("chan", nil)
- if err != nil {
- t.Fatalf("OpenChannel: %v", err)
- }
-
- return <-res, ch, c
-}
-
-// Test that stderr and stdout can be addressed from different
-// goroutines. This is intended for use with the race detector.
-func TestMuxChannelExtendedThreadSafety(t *testing.T) {
- writer, reader, mux := channelPair(t)
- defer writer.Close()
- defer reader.Close()
- defer mux.Close()
-
- var wr, rd sync.WaitGroup
- magic := "hello world"
-
- wr.Add(2)
- go func() {
- io.WriteString(writer, magic)
- wr.Done()
- }()
- go func() {
- io.WriteString(writer.Stderr(), magic)
- wr.Done()
- }()
-
- rd.Add(2)
- go func() {
- c, err := ioutil.ReadAll(reader)
- if string(c) != magic {
- t.Fatalf("stdout read got %q, want %q (error %s)", c, magic, err)
- }
- rd.Done()
- }()
- go func() {
- c, err := ioutil.ReadAll(reader.Stderr())
- if string(c) != magic {
- t.Fatalf("stderr read got %q, want %q (error %s)", c, magic, err)
- }
- rd.Done()
- }()
-
- wr.Wait()
- writer.CloseWrite()
- rd.Wait()
-}
-
-func TestMuxReadWrite(t *testing.T) {
- s, c, mux := channelPair(t)
- defer s.Close()
- defer c.Close()
- defer mux.Close()
-
- magic := "hello world"
- magicExt := "hello stderr"
- go func() {
- _, err := s.Write([]byte(magic))
- if err != nil {
- t.Fatalf("Write: %v", err)
- }
- _, err = s.Extended(1).Write([]byte(magicExt))
- if err != nil {
- t.Fatalf("Write: %v", err)
- }
- err = s.Close()
- if err != nil {
- t.Fatalf("Close: %v", err)
- }
- }()
-
- var buf [1024]byte
- n, err := c.Read(buf[:])
- if err != nil {
- t.Fatalf("server Read: %v", err)
- }
- got := string(buf[:n])
- if got != magic {
- t.Fatalf("server: got %q want %q", got, magic)
- }
-
- n, err = c.Extended(1).Read(buf[:])
- if err != nil {
- t.Fatalf("server Read: %v", err)
- }
-
- got = string(buf[:n])
- if got != magicExt {
- t.Fatalf("server: got %q want %q", got, magic)
- }
-}
-
-func TestMuxChannelOverflow(t *testing.T) {
- reader, writer, mux := channelPair(t)
- defer reader.Close()
- defer writer.Close()
- defer mux.Close()
-
- wDone := make(chan int, 1)
- go func() {
- if _, err := writer.Write(make([]byte, channelWindowSize)); err != nil {
- t.Errorf("could not fill window: %v", err)
- }
- writer.Write(make([]byte, 1))
- wDone <- 1
- }()
- writer.remoteWin.waitWriterBlocked()
-
- // Send 1 byte.
- packet := make([]byte, 1+4+4+1)
- packet[0] = msgChannelData
- marshalUint32(packet[1:], writer.remoteId)
- marshalUint32(packet[5:], uint32(1))
- packet[9] = 42
-
- if err := writer.mux.conn.writePacket(packet); err != nil {
- t.Errorf("could not send packet")
- }
- if _, err := reader.SendRequest("hello", true, nil); err == nil {
- t.Errorf("SendRequest succeeded.")
- }
- <-wDone
-}
-
-func TestMuxChannelCloseWriteUnblock(t *testing.T) {
- reader, writer, mux := channelPair(t)
- defer reader.Close()
- defer writer.Close()
- defer mux.Close()
-
- wDone := make(chan int, 1)
- go func() {
- if _, err := writer.Write(make([]byte, channelWindowSize)); err != nil {
- t.Errorf("could not fill window: %v", err)
- }
- if _, err := writer.Write(make([]byte, 1)); err != io.EOF {
- t.Errorf("got %v, want EOF for unblock write", err)
- }
- wDone <- 1
- }()
-
- writer.remoteWin.waitWriterBlocked()
- reader.Close()
- <-wDone
-}
-
-func TestMuxConnectionCloseWriteUnblock(t *testing.T) {
- reader, writer, mux := channelPair(t)
- defer reader.Close()
- defer writer.Close()
- defer mux.Close()
-
- wDone := make(chan int, 1)
- go func() {
- if _, err := writer.Write(make([]byte, channelWindowSize)); err != nil {
- t.Errorf("could not fill window: %v", err)
- }
- if _, err := writer.Write(make([]byte, 1)); err != io.EOF {
- t.Errorf("got %v, want EOF for unblock write", err)
- }
- wDone <- 1
- }()
-
- writer.remoteWin.waitWriterBlocked()
- mux.Close()
- <-wDone
-}
-
-func TestMuxReject(t *testing.T) {
- client, server := muxPair()
- defer server.Close()
- defer client.Close()
-
- go func() {
- ch, ok := <-server.incomingChannels
- if !ok {
- t.Fatalf("Accept")
- }
- if ch.ChannelType() != "ch" || string(ch.ExtraData()) != "extra" {
- t.Fatalf("unexpected channel: %q, %q", ch.ChannelType(), ch.ExtraData())
- }
- ch.Reject(RejectionReason(42), "message")
- }()
-
- ch, err := client.openChannel("ch", []byte("extra"))
- if ch != nil {
- t.Fatal("openChannel not rejected")
- }
-
- ocf, ok := err.(*OpenChannelError)
- if !ok {
- t.Errorf("got %#v want *OpenChannelError", err)
- } else if ocf.Reason != 42 || ocf.Message != "message" {
- t.Errorf("got %#v, want {Reason: 42, Message: %q}", ocf, "message")
- }
-
- want := "ssh: rejected: unknown reason 42 (message)"
- if err.Error() != want {
- t.Errorf("got %q, want %q", err.Error(), want)
- }
-}
-
-func TestMuxChannelRequest(t *testing.T) {
- client, server, mux := channelPair(t)
- defer server.Close()
- defer client.Close()
- defer mux.Close()
-
- var received int
- var wg sync.WaitGroup
- wg.Add(1)
- go func() {
- for r := range server.incomingRequests {
- received++
- r.Reply(r.Type == "yes", nil)
- }
- wg.Done()
- }()
- _, err := client.SendRequest("yes", false, nil)
- if err != nil {
- t.Fatalf("SendRequest: %v", err)
- }
- ok, err := client.SendRequest("yes", true, nil)
- if err != nil {
- t.Fatalf("SendRequest: %v", err)
- }
-
- if !ok {
- t.Errorf("SendRequest(yes): %v", ok)
-
- }
-
- ok, err = client.SendRequest("no", true, nil)
- if err != nil {
- t.Fatalf("SendRequest: %v", err)
- }
- if ok {
- t.Errorf("SendRequest(no): %v", ok)
-
- }
-
- client.Close()
- wg.Wait()
-
- if received != 3 {
- t.Errorf("got %d requests, want %d", received, 3)
- }
-}
-
-func TestMuxGlobalRequest(t *testing.T) {
- clientMux, serverMux := muxPair()
- defer serverMux.Close()
- defer clientMux.Close()
-
- var seen bool
- go func() {
- for r := range serverMux.incomingRequests {
- seen = seen || r.Type == "peek"
- if r.WantReply {
- err := r.Reply(r.Type == "yes",
- append([]byte(r.Type), r.Payload...))
- if err != nil {
- t.Errorf("AckRequest: %v", err)
- }
- }
- }
- }()
-
- _, _, err := clientMux.SendRequest("peek", false, nil)
- if err != nil {
- t.Errorf("SendRequest: %v", err)
- }
-
- ok, data, err := clientMux.SendRequest("yes", true, []byte("a"))
- if !ok || string(data) != "yesa" || err != nil {
- t.Errorf("SendRequest(\"yes\", true, \"a\"): %v %v %v",
- ok, data, err)
- }
- if ok, data, err := clientMux.SendRequest("yes", true, []byte("a")); !ok || string(data) != "yesa" || err != nil {
- t.Errorf("SendRequest(\"yes\", true, \"a\"): %v %v %v",
- ok, data, err)
- }
-
- if ok, data, err := clientMux.SendRequest("no", true, []byte("a")); ok || string(data) != "noa" || err != nil {
- t.Errorf("SendRequest(\"no\", true, \"a\"): %v %v %v",
- ok, data, err)
- }
-
- clientMux.Disconnect(0, "")
- if !seen {
- t.Errorf("never saw 'peek' request")
- }
-}
-
-func TestMuxGlobalRequestUnblock(t *testing.T) {
- clientMux, serverMux := muxPair()
- defer serverMux.Close()
- defer clientMux.Close()
-
- result := make(chan error, 1)
- go func() {
- _, _, err := clientMux.SendRequest("hello", true, nil)
- result <- err
- }()
-
- <-serverMux.incomingRequests
- serverMux.conn.Close()
- err := <-result
-
- if err != io.EOF {
- t.Errorf("want EOF, got %v", io.EOF)
- }
-}
-
-func TestMuxChannelRequestUnblock(t *testing.T) {
- a, b, connB := channelPair(t)
- defer a.Close()
- defer b.Close()
- defer connB.Close()
-
- result := make(chan error, 1)
- go func() {
- _, err := a.SendRequest("hello", true, nil)
- result <- err
- }()
-
- <-b.incomingRequests
- connB.conn.Close()
- err := <-result
-
- if err != io.EOF {
- t.Errorf("want EOF, got %v", err)
- }
-}
-
-func TestMuxDisconnect(t *testing.T) {
- a, b := muxPair()
- defer a.Close()
- defer b.Close()
-
- go func() {
- for r := range b.incomingRequests {
- r.Reply(true, nil)
- }
- }()
-
- a.Disconnect(42, "whatever")
- ok, _, err := a.SendRequest("hello", true, nil)
- if ok || err == nil {
- t.Errorf("got reply after disconnecting")
- }
- err = b.Wait()
- if d, ok := err.(*disconnectMsg); !ok || d.Reason != 42 {
- t.Errorf("got %#v, want disconnectMsg{Reason:42}", err)
- }
-}
-
-func TestMuxCloseChannel(t *testing.T) {
- r, w, mux := channelPair(t)
- defer mux.Close()
- defer r.Close()
- defer w.Close()
-
- result := make(chan error, 1)
- go func() {
- var b [1024]byte
- _, err := r.Read(b[:])
- result <- err
- }()
- if err := w.Close(); err != nil {
- t.Errorf("w.Close: %v", err)
- }
-
- if _, err := w.Write([]byte("hello")); err != io.EOF {
- t.Errorf("got err %v, want io.EOF after Close", err)
- }
-
- if err := <-result; err != io.EOF {
- t.Errorf("got %v (%T), want io.EOF", err, err)
- }
-}
-
-func TestMuxCloseWriteChannel(t *testing.T) {
- r, w, mux := channelPair(t)
- defer mux.Close()
-
- result := make(chan error, 1)
- go func() {
- var b [1024]byte
- _, err := r.Read(b[:])
- result <- err
- }()
- if err := w.CloseWrite(); err != nil {
- t.Errorf("w.CloseWrite: %v", err)
- }
-
- if _, err := w.Write([]byte("hello")); err != io.EOF {
- t.Errorf("got err %v, want io.EOF after CloseWrite", err)
- }
-
- if err := <-result; err != io.EOF {
- t.Errorf("got %v (%T), want io.EOF", err, err)
- }
-}
-
-func TestMuxInvalidRecord(t *testing.T) {
- a, b := muxPair()
- defer a.Close()
- defer b.Close()
-
- packet := make([]byte, 1+4+4+1)
- packet[0] = msgChannelData
- marshalUint32(packet[1:], 29348723 /* invalid channel id */)
- marshalUint32(packet[5:], 1)
- packet[9] = 42
-
- a.conn.writePacket(packet)
- go a.SendRequest("hello", false, nil)
- // 'a' wrote an invalid packet, so 'b' has exited.
- req, ok := <-b.incomingRequests
- if ok {
- t.Errorf("got request %#v after receiving invalid packet", req)
- }
-}
-
-func TestZeroWindowAdjust(t *testing.T) {
- a, b, mux := channelPair(t)
- defer a.Close()
- defer b.Close()
- defer mux.Close()
-
- go func() {
- io.WriteString(a, "hello")
- // bogus adjust.
- a.sendMessage(windowAdjustMsg{})
- io.WriteString(a, "world")
- a.Close()
- }()
-
- want := "helloworld"
- c, _ := ioutil.ReadAll(b)
- if string(c) != want {
- t.Errorf("got %q want %q", c, want)
- }
-}
-
-func TestMuxMaxPacketSize(t *testing.T) {
- a, b, mux := channelPair(t)
- defer a.Close()
- defer b.Close()
- defer mux.Close()
-
- large := make([]byte, a.maxRemotePayload+1)
- packet := make([]byte, 1+4+4+1+len(large))
- packet[0] = msgChannelData
- marshalUint32(packet[1:], a.remoteId)
- marshalUint32(packet[5:], uint32(len(large)))
- packet[9] = 42
-
- if err := a.mux.conn.writePacket(packet); err != nil {
- t.Errorf("could not send packet")
- }
-
- go a.SendRequest("hello", false, nil)
-
- _, ok := <-b.incomingRequests
- if ok {
- t.Errorf("connection still alive after receiving large packet.")
- }
-}
-
-// Don't ship code with debug=true.
-func TestDebug(t *testing.T) {
- if debugMux {
- t.Error("mux debug switched on")
- }
- if debugHandshake {
- t.Error("handshake debug switched on")
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/server.go b/vendor/code.google.com/p/go.crypto/ssh/server.go
index 8c4f1429e..b4defbef4 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/server.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/server.go
@@ -6,52 +6,38 @@ package ssh
import (
"bytes"
+ "crypto/rand"
+ "encoding/binary"
"errors"
"fmt"
"io"
"net"
+ "sync"
+
+ _ "crypto/sha1"
)
-// The Permissions type holds fine-grained permissions that are
-// specific to a user or a specific authentication method for a
-// user. Permissions, except for "source-address", must be enforced in
-// the server application layer, after successful authentication. The
-// Permissions are passed on in ServerConn so a server implementation
-// can honor them.
-type Permissions struct {
- // Critical options restrict default permissions. Common
- // restrictions are "source-address" and "force-command". If
- // the server cannot enforce the restriction, or does not
- // recognize it, the user should not authenticate.
- CriticalOptions map[string]string
-
- // Extensions are extra functionality that the server may
- // offer on authenticated connections. Common extensions are
- // "permit-agent-forwarding", "permit-X11-forwarding". Lack of
- // support for an extension does not preclude authenticating a
- // user.
- Extensions map[string]string
-}
-
-// ServerConfig holds server specific configuration data.
type ServerConfig struct {
- // Config contains configuration shared between client and server.
- Config
-
hostKeys []Signer
+ // Rand provides the source of entropy for key exchange. If Rand is
+ // nil, the cryptographic random reader in package crypto/rand will
+ // be used.
+ Rand io.Reader
+
// NoClientAuth is true if clients are allowed to connect without
// authenticating.
NoClientAuth bool
- // PasswordCallback, if non-nil, is called when a user
- // attempts to authenticate using a password.
- PasswordCallback func(conn ConnMetadata, password []byte) (*Permissions, error)
+ // PasswordCallback, if non-nil, is called when a user attempts to
+ // authenticate using a password. It may be called concurrently from
+ // several goroutines.
+ PasswordCallback func(conn *ServerConn, user, password string) bool
// PublicKeyCallback, if non-nil, is called when a client attempts public
// key authentication. It must return true if the given public key is
- // valid for the given user. For example, see CertChecker.Authenticate.
- PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error)
+ // valid for the given user.
+ PublicKeyCallback func(conn *ServerConn, user, algo string, pubkey []byte) bool
// KeyboardInteractiveCallback, if non-nil, is called when
// keyboard-interactive authentication is selected (RFC
@@ -60,19 +46,24 @@ type ServerConfig struct {
// Challenge rounds. To avoid information leaks, the client
// should be presented a challenge even if the user is
// unknown.
- KeyboardInteractiveCallback func(conn ConnMetadata, client KeyboardInteractiveChallenge) (*Permissions, error)
+ KeyboardInteractiveCallback func(conn *ServerConn, user string, client ClientKeyboardInteractive) bool
- // AuthLogCallback, if non-nil, is called to log all authentication
- // attempts.
- AuthLogCallback func(conn ConnMetadata, method string, err error)
+ // Cryptographic-related configuration.
+ Crypto CryptoConfig
+}
+
+func (c *ServerConfig) rand() io.Reader {
+ if c.Rand == nil {
+ return rand.Reader
+ }
+ return c.Rand
}
// AddHostKey adds a private key as a host key. If an existing host
-// key exists with the same algorithm, it is overwritten. Each server
-// config must have at least one host key.
+// key exists with the same algorithm, it is overwritten.
func (s *ServerConfig) AddHostKey(key Signer) {
for i, k := range s.hostKeys {
- if k.PublicKey().Type() == key.PublicKey().Type() {
+ if k.PublicKey().PublicKeyAlgo() == key.PublicKey().PublicKeyAlgo() {
s.hostKeys[i] = key
return
}
@@ -81,69 +72,68 @@ func (s *ServerConfig) AddHostKey(key Signer) {
s.hostKeys = append(s.hostKeys, key)
}
+// SetRSAPrivateKey sets the private key for a Server. A Server must have a
+// private key configured in order to accept connections. The private key must
+// be in the form of a PEM encoded, PKCS#1, RSA private key. The file "id_rsa"
+// typically contains such a key.
+func (s *ServerConfig) SetRSAPrivateKey(pemBytes []byte) error {
+ priv, err := ParsePrivateKey(pemBytes)
+ if err != nil {
+ return err
+ }
+ s.AddHostKey(priv)
+ return nil
+}
+
// cachedPubKey contains the results of querying whether a public key is
-// acceptable for a user.
+// acceptable for a user. The cache only applies to a single ServerConn.
type cachedPubKey struct {
- user string
- pubKeyData []byte
- result error
- perms *Permissions
+ user, algo string
+ pubKey []byte
+ result bool
}
const maxCachedPubKeys = 16
-// pubKeyCache caches tests for public keys. Since SSH clients
-// will query whether a public key is acceptable before attempting to
-// authenticate with it, we end up with duplicate queries for public
-// key validity. The cache only applies to a single ServerConn.
-type pubKeyCache struct {
- keys []cachedPubKey
-}
-
-// get returns the result for a given user/algo/key tuple.
-func (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) {
- for _, k := range c.keys {
- if k.user == user && bytes.Equal(k.pubKeyData, pubKeyData) {
- return k, true
- }
- }
- return cachedPubKey{}, false
-}
-
-// add adds the given tuple to the cache.
-func (c *pubKeyCache) add(candidate cachedPubKey) {
- if len(c.keys) < maxCachedPubKeys {
- c.keys = append(c.keys, candidate)
- }
-}
-
-// ServerConn is an authenticated SSH connection, as seen from the
-// server
+// A ServerConn represents an incoming connection.
type ServerConn struct {
- Conn
+ transport *transport
+ config *ServerConfig
- // If the succeeding authentication callback returned a
- // non-nil Permissions pointer, it is stored here.
- Permissions *Permissions
+ channels map[uint32]*serverChan
+ nextChanId uint32
+
+ // lock protects err and channels.
+ lock sync.Mutex
+ err error
+
+ // cachedPubKeys contains the cache results of tests for public keys.
+ // Since SSH clients will query whether a public key is acceptable
+ // before attempting to authenticate with it, we end up with duplicate
+ // queries for public key validity.
+ cachedPubKeys []cachedPubKey
+
+ // User holds the successfully authenticated user name.
+ // It is empty if no authentication is used. It is populated before
+ // any authentication callback is called and not assigned to after that.
+ User string
+
+ // ClientVersion is the client's version, populated after
+ // Handshake is called. It should not be modified.
+ ClientVersion []byte
+
+ // Our version.
+ serverVersion []byte
}
-// NewServerConn starts a new SSH server with c as the underlying
-// transport. It starts with a handshake and, if the handshake is
-// unsuccessful, it closes the connection and returns an error. The
-// Request and NewChannel channels must be serviced, or the connection
-// will hang.
-func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) {
- fullConf := *config
- fullConf.SetDefaults()
- s := &connection{
- sshConn: sshConn{conn: c},
+// Server returns a new SSH server connection
+// using c as the underlying transport.
+func Server(c net.Conn, config *ServerConfig) *ServerConn {
+ return &ServerConn{
+ transport: newTransport(c, config.rand(), false /* not client */),
+ channels: make(map[uint32]*serverChan),
+ config: config,
}
- perms, err := s.serverHandshake(&fullConf)
- if err != nil {
- c.Close()
- return nil, nil, nil, err
- }
- return &ServerConn{s, perms}, s.mux.incomingChannels, s.mux.incomingRequests, nil
}
// signAndMarshal signs the data with the appropriate algorithm,
@@ -154,60 +144,134 @@ func signAndMarshal(k Signer, rand io.Reader, data []byte) ([]byte, error) {
return nil, err
}
- return Marshal(sig), nil
+ return serializeSignature(k.PublicKey().PrivateKeyAlgo(), sig), nil
}
-// handshake performs key exchange and user authentication.
-func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) {
- if len(config.hostKeys) == 0 {
- return nil, errors.New("ssh: server has no host keys")
- }
+// Close closes the connection.
+func (s *ServerConn) Close() error { return s.transport.Close() }
+// LocalAddr returns the local network address.
+func (c *ServerConn) LocalAddr() net.Addr { return c.transport.LocalAddr() }
+
+// RemoteAddr returns the remote network address.
+func (c *ServerConn) RemoteAddr() net.Addr { return c.transport.RemoteAddr() }
+
+// Handshake performs an SSH transport and client authentication on the given ServerConn.
+func (s *ServerConn) Handshake() error {
var err error
s.serverVersion = []byte(packageVersion)
- s.clientVersion, err = exchangeVersions(s.sshConn.conn, s.serverVersion)
+ s.ClientVersion, err = exchangeVersions(s.transport.Conn, s.serverVersion)
if err != nil {
- return nil, err
+ return err
}
-
- tr := newTransport(s.sshConn.conn, config.Rand, false /* not client */)
- s.transport = newServerTransport(tr, s.clientVersion, s.serverVersion, config)
-
- if err := s.transport.requestKeyChange(); err != nil {
- return nil, err
- }
-
- if packet, err := s.transport.readPacket(); err != nil {
- return nil, err
- } else if packet[0] != msgNewKeys {
- return nil, unexpectedMessageError(msgNewKeys, packet[0])
+ if err := s.clientInitHandshake(nil, nil); err != nil {
+ return err
}
var packet []byte
if packet, err = s.transport.readPacket(); err != nil {
- return nil, err
+ return err
}
-
var serviceRequest serviceRequestMsg
- if err = Unmarshal(packet, &serviceRequest); err != nil {
- return nil, err
+ if err := unmarshal(&serviceRequest, packet, msgServiceRequest); err != nil {
+ return err
}
if serviceRequest.Service != serviceUserAuth {
- return nil, errors.New("ssh: requested service '" + serviceRequest.Service + "' before authenticating")
+ return errors.New("ssh: requested service '" + serviceRequest.Service + "' before authenticating")
}
serviceAccept := serviceAcceptMsg{
Service: serviceUserAuth,
}
- if err := s.transport.writePacket(Marshal(&serviceAccept)); err != nil {
- return nil, err
+ if err := s.transport.writePacket(marshal(msgServiceAccept, serviceAccept)); err != nil {
+ return err
}
- perms, err := s.serverAuthenticate(config)
- if err != nil {
- return nil, err
+ if err := s.authenticate(); err != nil {
+ return err
}
- s.mux = newMux(s.transport)
- return perms, err
+ return err
+}
+
+func (s *ServerConn) clientInitHandshake(clientKexInit *kexInitMsg, clientKexInitPacket []byte) (err error) {
+ serverKexInit := kexInitMsg{
+ KexAlgos: s.config.Crypto.kexes(),
+ CiphersClientServer: s.config.Crypto.ciphers(),
+ CiphersServerClient: s.config.Crypto.ciphers(),
+ MACsClientServer: s.config.Crypto.macs(),
+ MACsServerClient: s.config.Crypto.macs(),
+ CompressionClientServer: supportedCompressions,
+ CompressionServerClient: supportedCompressions,
+ }
+ for _, k := range s.config.hostKeys {
+ serverKexInit.ServerHostKeyAlgos = append(
+ serverKexInit.ServerHostKeyAlgos, k.PublicKey().PublicKeyAlgo())
+ }
+
+ serverKexInitPacket := marshal(msgKexInit, serverKexInit)
+ if err = s.transport.writePacket(serverKexInitPacket); err != nil {
+ return
+ }
+
+ if clientKexInitPacket == nil {
+ clientKexInit = new(kexInitMsg)
+ if clientKexInitPacket, err = s.transport.readPacket(); err != nil {
+ return
+ }
+ if err = unmarshal(clientKexInit, clientKexInitPacket, msgKexInit); err != nil {
+ return
+ }
+ }
+
+ algs := findAgreedAlgorithms(clientKexInit, &serverKexInit)
+ if algs == nil {
+ return errors.New("ssh: no common algorithms")
+ }
+
+ if clientKexInit.FirstKexFollows && algs.kex != clientKexInit.KexAlgos[0] {
+ // The client sent a Kex message for the wrong algorithm,
+ // which we have to ignore.
+ if _, err = s.transport.readPacket(); err != nil {
+ return
+ }
+ }
+
+ var hostKey Signer
+ for _, k := range s.config.hostKeys {
+ if algs.hostKey == k.PublicKey().PublicKeyAlgo() {
+ hostKey = k
+ }
+ }
+
+ kex, ok := kexAlgoMap[algs.kex]
+ if !ok {
+ return fmt.Errorf("ssh: unexpected key exchange algorithm %v", algs.kex)
+ }
+
+ magics := handshakeMagics{
+ serverVersion: s.serverVersion,
+ clientVersion: s.ClientVersion,
+ serverKexInit: marshal(msgKexInit, serverKexInit),
+ clientKexInit: clientKexInitPacket,
+ }
+ result, err := kex.Server(s.transport, s.config.rand(), &magics, hostKey)
+ if err != nil {
+ return err
+ }
+
+ if err = s.transport.prepareKeyChange(algs, result); err != nil {
+ return err
+ }
+
+ if err = s.transport.writePacket([]byte{msgNewKeys}); err != nil {
+ return
+ }
+ if packet, err := s.transport.readPacket(); err != nil {
+ return err
+ } else if packet[0] != msgNewKeys {
+ return UnexpectedMessageError{msgNewKeys, packet[0]}
+ }
+
+ return
}
func isAcceptableAlgo(algo string) bool {
@@ -219,212 +283,181 @@ func isAcceptableAlgo(algo string) bool {
return false
}
-func checkSourceAddress(addr net.Addr, sourceAddr string) error {
- if addr == nil {
- return errors.New("ssh: no address known for client, but source-address match required")
+// testPubKey returns true if the given public key is acceptable for the user.
+func (s *ServerConn) testPubKey(user, algo string, pubKey []byte) bool {
+ if s.config.PublicKeyCallback == nil || !isAcceptableAlgo(algo) {
+ return false
}
- tcpAddr, ok := addr.(*net.TCPAddr)
- if !ok {
- return fmt.Errorf("ssh: remote address %v is not an TCP address when checking source-address match", addr)
- }
-
- if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil {
- if bytes.Equal(allowedIP, tcpAddr.IP) {
- return nil
- }
- } else {
- _, ipNet, err := net.ParseCIDR(sourceAddr)
- if err != nil {
- return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err)
- }
-
- if ipNet.Contains(tcpAddr.IP) {
- return nil
+ for _, c := range s.cachedPubKeys {
+ if c.user == user && c.algo == algo && bytes.Equal(c.pubKey, pubKey) {
+ return c.result
}
}
- return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr)
+ result := s.config.PublicKeyCallback(s, user, algo, pubKey)
+ if len(s.cachedPubKeys) < maxCachedPubKeys {
+ c := cachedPubKey{
+ user: user,
+ algo: algo,
+ pubKey: make([]byte, len(pubKey)),
+ result: result,
+ }
+ copy(c.pubKey, pubKey)
+ s.cachedPubKeys = append(s.cachedPubKeys, c)
+ }
+
+ return result
}
-func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) {
+func (s *ServerConn) authenticate() error {
+ var userAuthReq userAuthRequestMsg
var err error
- var cache pubKeyCache
- var perms *Permissions
+ var packet []byte
userAuthLoop:
for {
- var userAuthReq userAuthRequestMsg
- if packet, err := s.transport.readPacket(); err != nil {
- return nil, err
- } else if err = Unmarshal(packet, &userAuthReq); err != nil {
- return nil, err
+ if packet, err = s.transport.readPacket(); err != nil {
+ return err
+ }
+ if err = unmarshal(&userAuthReq, packet, msgUserAuthRequest); err != nil {
+ return err
}
if userAuthReq.Service != serviceSSH {
- return nil, errors.New("ssh: client attempted to negotiate for unknown service: " + userAuthReq.Service)
+ return errors.New("ssh: client attempted to negotiate for unknown service: " + userAuthReq.Service)
}
- s.user = userAuthReq.User
- perms = nil
- authErr := errors.New("no auth passed yet")
-
switch userAuthReq.Method {
case "none":
- if config.NoClientAuth {
- s.user = ""
- authErr = nil
+ if s.config.NoClientAuth {
+ break userAuthLoop
}
case "password":
- if config.PasswordCallback == nil {
- authErr = errors.New("ssh: password auth not configured")
+ if s.config.PasswordCallback == nil {
break
}
payload := userAuthReq.Payload
if len(payload) < 1 || payload[0] != 0 {
- return nil, parseError(msgUserAuthRequest)
+ return ParseError{msgUserAuthRequest}
}
payload = payload[1:]
password, payload, ok := parseString(payload)
if !ok || len(payload) > 0 {
- return nil, parseError(msgUserAuthRequest)
+ return ParseError{msgUserAuthRequest}
}
- perms, authErr = config.PasswordCallback(s, password)
+ s.User = userAuthReq.User
+ if s.config.PasswordCallback(s, userAuthReq.User, string(password)) {
+ break userAuthLoop
+ }
case "keyboard-interactive":
- if config.KeyboardInteractiveCallback == nil {
- authErr = errors.New("ssh: keyboard-interactive auth not configubred")
+ if s.config.KeyboardInteractiveCallback == nil {
break
}
- prompter := &sshClientKeyboardInteractive{s}
- perms, authErr = config.KeyboardInteractiveCallback(s, prompter.Challenge)
+ s.User = userAuthReq.User
+ if s.config.KeyboardInteractiveCallback(s, s.User, &sshClientKeyboardInteractive{s}) {
+ break userAuthLoop
+ }
case "publickey":
- if config.PublicKeyCallback == nil {
- authErr = errors.New("ssh: publickey auth not configured")
+ if s.config.PublicKeyCallback == nil {
break
}
payload := userAuthReq.Payload
if len(payload) < 1 {
- return nil, parseError(msgUserAuthRequest)
+ return ParseError{msgUserAuthRequest}
}
isQuery := payload[0] == 0
payload = payload[1:]
algoBytes, payload, ok := parseString(payload)
if !ok {
- return nil, parseError(msgUserAuthRequest)
+ return ParseError{msgUserAuthRequest}
}
algo := string(algoBytes)
- if !isAcceptableAlgo(algo) {
- authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo)
- break
- }
- pubKeyData, payload, ok := parseString(payload)
+ pubKey, payload, ok := parseString(payload)
if !ok {
- return nil, parseError(msgUserAuthRequest)
+ return ParseError{msgUserAuthRequest}
}
-
- pubKey, err := ParsePublicKey(pubKeyData)
- if err != nil {
- return nil, err
- }
-
- candidate, ok := cache.get(s.user, pubKeyData)
- if !ok {
- candidate.user = s.user
- candidate.pubKeyData = pubKeyData
- candidate.perms, candidate.result = config.PublicKeyCallback(s, pubKey)
- if candidate.result == nil && candidate.perms != nil && candidate.perms.CriticalOptions != nil && candidate.perms.CriticalOptions[sourceAddressCriticalOption] != "" {
- candidate.result = checkSourceAddress(
- s.RemoteAddr(),
- candidate.perms.CriticalOptions[sourceAddressCriticalOption])
- }
- cache.add(candidate)
- }
-
if isQuery {
// The client can query if the given public key
// would be okay.
if len(payload) > 0 {
- return nil, parseError(msgUserAuthRequest)
+ return ParseError{msgUserAuthRequest}
}
-
- if candidate.result == nil {
+ if s.testPubKey(userAuthReq.User, algo, pubKey) {
okMsg := userAuthPubKeyOkMsg{
Algo: algo,
- PubKey: pubKeyData,
+ PubKey: string(pubKey),
}
- if err = s.transport.writePacket(Marshal(&okMsg)); err != nil {
- return nil, err
+ if err = s.transport.writePacket(marshal(msgUserAuthPubKeyOk, okMsg)); err != nil {
+ return err
}
continue userAuthLoop
}
- authErr = candidate.result
} else {
sig, payload, ok := parseSignature(payload)
if !ok || len(payload) > 0 {
- return nil, parseError(msgUserAuthRequest)
+ return ParseError{msgUserAuthRequest}
}
// Ensure the public key algo and signature algo
// are supported. Compare the private key
// algorithm name that corresponds to algo with
// sig.Format. This is usually the same, but
// for certs, the names differ.
- if !isAcceptableAlgo(sig.Format) {
+ if !isAcceptableAlgo(algo) || !isAcceptableAlgo(sig.Format) || pubAlgoToPrivAlgo(algo) != sig.Format {
break
}
- signedData := buildDataSignedForAuth(s.transport.getSessionID(), userAuthReq, algoBytes, pubKeyData)
-
- if err := pubKey.Verify(signedData, sig); err != nil {
- return nil, err
+ signedData := buildDataSignedForAuth(s.transport.sessionID, userAuthReq, algoBytes, pubKey)
+ key, _, ok := ParsePublicKey(pubKey)
+ if !ok {
+ return ParseError{msgUserAuthRequest}
}
- authErr = candidate.result
- perms = candidate.perms
+ if !key.Verify(signedData, sig.Blob) {
+ return ParseError{msgUserAuthRequest}
+ }
+ // TODO(jmpittman): Implement full validation for certificates.
+ s.User = userAuthReq.User
+ if s.testPubKey(userAuthReq.User, algo, pubKey) {
+ break userAuthLoop
+ }
}
- default:
- authErr = fmt.Errorf("ssh: unknown method %q", userAuthReq.Method)
- }
-
- if config.AuthLogCallback != nil {
- config.AuthLogCallback(s, userAuthReq.Method, authErr)
- }
-
- if authErr == nil {
- break userAuthLoop
}
var failureMsg userAuthFailureMsg
- if config.PasswordCallback != nil {
+ if s.config.PasswordCallback != nil {
failureMsg.Methods = append(failureMsg.Methods, "password")
}
- if config.PublicKeyCallback != nil {
+ if s.config.PublicKeyCallback != nil {
failureMsg.Methods = append(failureMsg.Methods, "publickey")
}
- if config.KeyboardInteractiveCallback != nil {
+ if s.config.KeyboardInteractiveCallback != nil {
failureMsg.Methods = append(failureMsg.Methods, "keyboard-interactive")
}
if len(failureMsg.Methods) == 0 {
- return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false")
+ return errors.New("ssh: no authentication methods configured but NoClientAuth is also false")
}
- if err = s.transport.writePacket(Marshal(&failureMsg)); err != nil {
- return nil, err
+ if err = s.transport.writePacket(marshal(msgUserAuthFailure, failureMsg)); err != nil {
+ return err
}
}
- if err = s.transport.writePacket([]byte{msgUserAuthSuccess}); err != nil {
- return nil, err
+ packet = []byte{msgUserAuthSuccess}
+ if err = s.transport.writePacket(packet); err != nil {
+ return err
}
- return perms, nil
+
+ return nil
}
// sshClientKeyboardInteractive implements a ClientKeyboardInteractive by
// asking the client on the other side of a ServerConn.
type sshClientKeyboardInteractive struct {
- *connection
+ *ServerConn
}
func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
@@ -438,7 +471,7 @@ func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, quest
prompts = appendBool(prompts, echos[i])
}
- if err := c.transport.writePacket(Marshal(&userAuthInfoRequestMsg{
+ if err := c.transport.writePacket(marshal(msgUserAuthInfoRequest, userAuthInfoRequestMsg{
Instruction: instruction,
NumPrompts: uint32(len(questions)),
Prompts: prompts,
@@ -451,19 +484,19 @@ func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, quest
return nil, err
}
if packet[0] != msgUserAuthInfoResponse {
- return nil, unexpectedMessageError(msgUserAuthInfoResponse, packet[0])
+ return nil, UnexpectedMessageError{msgUserAuthInfoResponse, packet[0]}
}
packet = packet[1:]
n, packet, ok := parseUint32(packet)
if !ok || int(n) != len(questions) {
- return nil, parseError(msgUserAuthInfoResponse)
+ return nil, &ParseError{msgUserAuthInfoResponse}
}
for i := uint32(0); i < n; i++ {
ans, rest, ok := parseString(packet)
if !ok {
- return nil, parseError(msgUserAuthInfoResponse)
+ return nil, &ParseError{msgUserAuthInfoResponse}
}
answers = append(answers, string(ans))
@@ -475,3 +508,185 @@ func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, quest
return answers, nil
}
+
+const defaultWindowSize = 32768
+
+// Accept reads and processes messages on a ServerConn. It must be called
+// in order to demultiplex messages to any resulting Channels.
+func (s *ServerConn) Accept() (Channel, error) {
+ // TODO(dfc) s.lock is not held here so visibility of s.err is not guaranteed.
+ if s.err != nil {
+ return nil, s.err
+ }
+
+ for {
+ packet, err := s.transport.readPacket()
+ if err != nil {
+
+ s.lock.Lock()
+ s.err = err
+ s.lock.Unlock()
+
+ // TODO(dfc) s.lock protects s.channels but isn't being held here.
+ for _, c := range s.channels {
+ c.setDead()
+ c.handleData(nil)
+ }
+
+ return nil, err
+ }
+
+ switch packet[0] {
+ case msgChannelData:
+ if len(packet) < 9 {
+ // malformed data packet
+ return nil, ParseError{msgChannelData}
+ }
+ remoteId := binary.BigEndian.Uint32(packet[1:5])
+ s.lock.Lock()
+ c, ok := s.channels[remoteId]
+ if !ok {
+ s.lock.Unlock()
+ continue
+ }
+ if length := binary.BigEndian.Uint32(packet[5:9]); length > 0 {
+ packet = packet[9:]
+ c.handleData(packet[:length])
+ }
+ s.lock.Unlock()
+ default:
+ decoded, err := decode(packet)
+ if err != nil {
+ return nil, err
+ }
+ switch msg := decoded.(type) {
+ case *channelOpenMsg:
+ if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 {
+ return nil, errors.New("ssh: invalid MaxPacketSize from peer")
+ }
+ c := &serverChan{
+ channel: channel{
+ packetConn: s.transport,
+ remoteId: msg.PeersId,
+ remoteWin: window{Cond: newCond()},
+ maxPacket: msg.MaxPacketSize,
+ },
+ chanType: msg.ChanType,
+ extraData: msg.TypeSpecificData,
+ myWindow: defaultWindowSize,
+ serverConn: s,
+ cond: newCond(),
+ pendingData: make([]byte, defaultWindowSize),
+ }
+ c.remoteWin.add(msg.PeersWindow)
+ s.lock.Lock()
+ c.localId = s.nextChanId
+ s.nextChanId++
+ s.channels[c.localId] = c
+ s.lock.Unlock()
+ return c, nil
+
+ case *channelRequestMsg:
+ s.lock.Lock()
+ c, ok := s.channels[msg.PeersId]
+ if !ok {
+ s.lock.Unlock()
+ continue
+ }
+ c.handlePacket(msg)
+ s.lock.Unlock()
+
+ case *windowAdjustMsg:
+ s.lock.Lock()
+ c, ok := s.channels[msg.PeersId]
+ if !ok {
+ s.lock.Unlock()
+ continue
+ }
+ c.handlePacket(msg)
+ s.lock.Unlock()
+
+ case *channelEOFMsg:
+ s.lock.Lock()
+ c, ok := s.channels[msg.PeersId]
+ if !ok {
+ s.lock.Unlock()
+ continue
+ }
+ c.handlePacket(msg)
+ s.lock.Unlock()
+
+ case *channelCloseMsg:
+ s.lock.Lock()
+ c, ok := s.channels[msg.PeersId]
+ if !ok {
+ s.lock.Unlock()
+ continue
+ }
+ c.handlePacket(msg)
+ s.lock.Unlock()
+
+ case *globalRequestMsg:
+ if msg.WantReply {
+ if err := s.transport.writePacket([]byte{msgRequestFailure}); err != nil {
+ return nil, err
+ }
+ }
+
+ case *kexInitMsg:
+ s.lock.Lock()
+ if err := s.clientInitHandshake(msg, packet); err != nil {
+ s.lock.Unlock()
+ return nil, err
+ }
+ s.lock.Unlock()
+ case *disconnectMsg:
+ return nil, io.EOF
+ default:
+ // Unknown message. Ignore.
+ }
+ }
+ }
+
+ panic("unreachable")
+}
+
+// A Listener implements a network listener (net.Listener) for SSH connections.
+type Listener struct {
+ listener net.Listener
+ config *ServerConfig
+}
+
+// Addr returns the listener's network address.
+func (l *Listener) Addr() net.Addr {
+ return l.listener.Addr()
+}
+
+// Close closes the listener.
+func (l *Listener) Close() error {
+ return l.listener.Close()
+}
+
+// Accept waits for and returns the next incoming SSH connection.
+// The receiver should call Handshake() in another goroutine
+// to avoid blocking the accepter.
+func (l *Listener) Accept() (*ServerConn, error) {
+ c, err := l.listener.Accept()
+ if err != nil {
+ return nil, err
+ }
+ return Server(c, l.config), nil
+}
+
+// Listen creates an SSH listener accepting connections on
+// the given network address using net.Listen.
+func Listen(network, addr string, config *ServerConfig) (*Listener, error) {
+ l, err := net.Listen(network, addr)
+ if err != nil {
+ return nil, err
+ }
+ return &Listener{
+ l,
+ config,
+ }, nil
+}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/server_terminal.go b/vendor/code.google.com/p/go.crypto/ssh/server_terminal.go
new file mode 100644
index 000000000..708a9159e
--- /dev/null
+++ b/vendor/code.google.com/p/go.crypto/ssh/server_terminal.go
@@ -0,0 +1,81 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ssh
+
+// A Terminal is capable of parsing and generating virtual terminal
+// data from an SSH client.
+type Terminal interface {
+ ReadLine() (line string, err error)
+ SetSize(x, y int)
+ Write([]byte) (int, error)
+}
+
+// ServerTerminal contains the state for running a terminal that is capable of
+// reading lines of input.
+type ServerTerminal struct {
+ Term Terminal
+ Channel Channel
+}
+
+// parsePtyRequest parses the payload of the pty-req message and extracts the
+// dimensions of the terminal. See RFC 4254, section 6.2.
+func parsePtyRequest(s []byte) (width, height int, ok bool) {
+ _, s, ok = parseString(s)
+ if !ok {
+ return
+ }
+ width32, s, ok := parseUint32(s)
+ if !ok {
+ return
+ }
+ height32, _, ok := parseUint32(s)
+ width = int(width32)
+ height = int(height32)
+ if width < 1 {
+ ok = false
+ }
+ if height < 1 {
+ ok = false
+ }
+ return
+}
+
+func (ss *ServerTerminal) Write(buf []byte) (n int, err error) {
+ return ss.Term.Write(buf)
+}
+
+// ReadLine returns a line of input from the terminal.
+func (ss *ServerTerminal) ReadLine() (line string, err error) {
+ for {
+ if line, err = ss.Term.ReadLine(); err == nil {
+ return
+ }
+
+ req, ok := err.(ChannelRequest)
+ if !ok {
+ return
+ }
+
+ ok = false
+ switch req.Request {
+ case "pty-req":
+ var width, height int
+ width, height, ok = parsePtyRequest(req.Payload)
+ ss.Term.SetSize(width, height)
+ case "shell":
+ ok = true
+ if len(req.Payload) > 0 {
+ // We don't accept any commands, only the default shell.
+ ok = false
+ }
+ case "env":
+ ok = true
+ }
+ if req.WantReply {
+ ss.Channel.AckRequest(ok)
+ }
+ }
+ panic("unreachable")
+}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/session.go b/vendor/code.google.com/p/go.crypto/ssh/session.go
index 3b42b508a..39f2d2230 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/session.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/session.go
@@ -129,126 +129,128 @@ type Session struct {
Stdout io.Writer
Stderr io.Writer
- ch Channel // the channel backing this session
- started bool // true once Start, Run or Shell is invoked.
+ *clientChan // the channel backing this session
+
+ started bool // true once Start, Run or Shell is invoked.
copyFuncs []func() error
errors chan error // one send per copyFunc
// true if pipe method is active
stdinpipe, stdoutpipe, stderrpipe bool
-
- // stdinPipeWriter is non-nil if StdinPipe has not been called
- // and Stdin was specified by the user; it is the write end of
- // a pipe connecting Session.Stdin to the stdin channel.
- stdinPipeWriter io.WriteCloser
-
- exitStatus chan error
-}
-
-// SendRequest sends an out-of-band channel request on the SSH channel
-// underlying the session.
-func (s *Session) SendRequest(name string, wantReply bool, payload []byte) (bool, error) {
- return s.ch.SendRequest(name, wantReply, payload)
-}
-
-func (s *Session) Close() error {
- return s.ch.Close()
}
// RFC 4254 Section 6.4.
type setenvRequest struct {
- Name string
- Value string
+ PeersId uint32
+ Request string
+ WantReply bool
+ Name string
+ Value string
+}
+
+// RFC 4254 Section 6.5.
+type subsystemRequestMsg struct {
+ PeersId uint32
+ Request string
+ WantReply bool
+ Subsystem string
}
// Setenv sets an environment variable that will be applied to any
// command executed by Shell or Run.
func (s *Session) Setenv(name, value string) error {
- msg := setenvRequest{
- Name: name,
- Value: value,
+ req := setenvRequest{
+ PeersId: s.remoteId,
+ Request: "env",
+ WantReply: true,
+ Name: name,
+ Value: value,
}
- ok, err := s.ch.SendRequest("env", true, Marshal(&msg))
- if err == nil && !ok {
- err = errors.New("ssh: setenv failed")
+ if err := s.writePacket(marshal(msgChannelRequest, req)); err != nil {
+ return err
}
- return err
+ return s.waitForResponse()
}
// RFC 4254 Section 6.2.
type ptyRequestMsg struct {
- Term string
- Columns uint32
- Rows uint32
- Width uint32
- Height uint32
- Modelist string
+ PeersId uint32
+ Request string
+ WantReply bool
+ Term string
+ Columns uint32
+ Rows uint32
+ Width uint32
+ Height uint32
+ Modelist string
}
// RequestPty requests the association of a pty with the session on the remote host.
func (s *Session) RequestPty(term string, h, w int, termmodes TerminalModes) error {
var tm []byte
for k, v := range termmodes {
- kv := struct {
- Key byte
- Val uint32
- }{k, v}
-
- tm = append(tm, Marshal(&kv)...)
+ tm = append(tm, k)
+ tm = appendU32(tm, v)
}
tm = append(tm, tty_OP_END)
req := ptyRequestMsg{
- Term: term,
- Columns: uint32(w),
- Rows: uint32(h),
- Width: uint32(w * 8),
- Height: uint32(h * 8),
- Modelist: string(tm),
+ PeersId: s.remoteId,
+ Request: "pty-req",
+ WantReply: true,
+ Term: term,
+ Columns: uint32(w),
+ Rows: uint32(h),
+ Width: uint32(w * 8),
+ Height: uint32(h * 8),
+ Modelist: string(tm),
}
- ok, err := s.ch.SendRequest("pty-req", true, Marshal(&req))
- if err == nil && !ok {
- err = errors.New("ssh: pty-req failed")
+ if err := s.writePacket(marshal(msgChannelRequest, req)); err != nil {
+ return err
}
- return err
-}
-
-// RFC 4254 Section 6.5.
-type subsystemRequestMsg struct {
- Subsystem string
+ return s.waitForResponse()
}
// RequestSubsystem requests the association of a subsystem with the session on the remote host.
// A subsystem is a predefined command that runs in the background when the ssh session is initiated
func (s *Session) RequestSubsystem(subsystem string) error {
- msg := subsystemRequestMsg{
+ req := subsystemRequestMsg{
+ PeersId: s.remoteId,
+ Request: "subsystem",
+ WantReply: true,
Subsystem: subsystem,
}
- ok, err := s.ch.SendRequest("subsystem", true, Marshal(&msg))
- if err == nil && !ok {
- err = errors.New("ssh: subsystem request failed")
+ if err := s.writePacket(marshal(msgChannelRequest, req)); err != nil {
+ return err
}
- return err
+ return s.waitForResponse()
}
// RFC 4254 Section 6.9.
type signalMsg struct {
- Signal string
+ PeersId uint32
+ Request string
+ WantReply bool
+ Signal string
}
// Signal sends the given signal to the remote process.
// sig is one of the SIG* constants.
func (s *Session) Signal(sig Signal) error {
- msg := signalMsg{
- Signal: string(sig),
+ req := signalMsg{
+ PeersId: s.remoteId,
+ Request: "signal",
+ WantReply: false,
+ Signal: string(sig),
}
-
- _, err := s.ch.SendRequest("signal", false, Marshal(&msg))
- return err
+ return s.writePacket(marshal(msgChannelRequest, req))
}
// RFC 4254 Section 6.5.
type execMsg struct {
- Command string
+ PeersId uint32
+ Request string
+ WantReply bool
+ Command string
}
// Start runs cmd on the remote host. Typically, the remote
@@ -259,16 +261,17 @@ func (s *Session) Start(cmd string) error {
return errors.New("ssh: session already started")
}
req := execMsg{
- Command: cmd,
+ PeersId: s.remoteId,
+ Request: "exec",
+ WantReply: true,
+ Command: cmd,
}
-
- ok, err := s.ch.SendRequest("exec", true, Marshal(&req))
- if err == nil && !ok {
- err = fmt.Errorf("ssh: command %v failed", cmd)
- }
- if err != nil {
+ if err := s.writePacket(marshal(msgChannelRequest, req)); err != nil {
return err
}
+ if err := s.waitForResponse(); err != nil {
+ return fmt.Errorf("ssh: could not execute command %s: %v", cmd, err)
+ }
return s.start()
}
@@ -336,17 +339,31 @@ func (s *Session) Shell() error {
if s.started {
return errors.New("ssh: session already started")
}
-
- ok, err := s.ch.SendRequest("shell", true, nil)
- if err == nil && !ok {
- return fmt.Errorf("ssh: cound not start shell")
+ req := channelRequestMsg{
+ PeersId: s.remoteId,
+ Request: "shell",
+ WantReply: true,
}
- if err != nil {
+ if err := s.writePacket(marshal(msgChannelRequest, req)); err != nil {
return err
}
+ if err := s.waitForResponse(); err != nil {
+ return fmt.Errorf("ssh: could not execute shell: %v", err)
+ }
return s.start()
}
+func (s *Session) waitForResponse() error {
+ msg := <-s.msg
+ switch msg.(type) {
+ case *channelRequestSuccessMsg:
+ return nil
+ case *channelRequestFailureMsg:
+ return errors.New("ssh: request failed")
+ }
+ return fmt.Errorf("ssh: unknown packet %T received: %v", msg, msg)
+}
+
func (s *Session) start() error {
s.started = true
@@ -377,11 +394,8 @@ func (s *Session) Wait() error {
if !s.started {
return errors.New("ssh: session not started")
}
- waitErr := <-s.exitStatus
+ waitErr := s.wait()
- if s.stdinPipeWriter != nil {
- s.stdinPipeWriter.Close()
- }
var copyError error
for _ = range s.copyFuncs {
if err := <-s.errors; err != nil && copyError == nil {
@@ -394,35 +408,52 @@ func (s *Session) Wait() error {
return copyError
}
-func (s *Session) wait(reqs <-chan *Request) error {
+func (s *Session) wait() error {
wm := Waitmsg{status: -1}
- // Wait for msg channel to be closed before returning.
- for msg := range reqs {
- switch msg.Type {
- case "exit-status":
- d := msg.Payload
- wm.status = int(d[0])<<24 | int(d[1])<<16 | int(d[2])<<8 | int(d[3])
- case "exit-signal":
- var sigval struct {
- Signal string
- CoreDumped bool
- Error string
- Lang string
- }
- if err := Unmarshal(msg.Payload, &sigval); err != nil {
- return err
- }
- // Must sanitize strings?
- wm.signal = sigval.Signal
- wm.msg = sigval.Error
- wm.lang = sigval.Lang
- default:
- // This handles keepalives and matches
- // OpenSSH's behaviour.
- if msg.WantReply {
- msg.Reply(false, nil)
+ // Wait for msg channel to be closed before returning.
+ for msg := range s.msg {
+ switch msg := msg.(type) {
+ case *channelRequestMsg:
+ switch msg.Request {
+ case "exit-status":
+ d := msg.RequestSpecificData
+ wm.status = int(d[0])<<24 | int(d[1])<<16 | int(d[2])<<8 | int(d[3])
+ case "exit-signal":
+ signal, rest, ok := parseString(msg.RequestSpecificData)
+ if !ok {
+ return fmt.Errorf("wait: could not parse request data: %v", msg.RequestSpecificData)
+ }
+ wm.signal = safeString(string(signal))
+
+ // skip coreDumped bool
+ if len(rest) == 0 {
+ return fmt.Errorf("wait: could not parse request data: %v", msg.RequestSpecificData)
+ }
+ rest = rest[1:]
+
+ errmsg, rest, ok := parseString(rest)
+ if !ok {
+ return fmt.Errorf("wait: could not parse request data: %v", msg.RequestSpecificData)
+ }
+ wm.msg = safeString(string(errmsg))
+
+ lang, _, ok := parseString(rest)
+ if !ok {
+ return fmt.Errorf("wait: could not parse request data: %v", msg.RequestSpecificData)
+ }
+ wm.lang = safeString(string(lang))
+ default:
+ // This handles keepalives and matches
+ // OpenSSH's behaviour.
+ if msg.WantReply {
+ s.writePacket(marshal(msgChannelFailure, channelRequestFailureMsg{
+ PeersId: s.remoteId,
+ }))
+ }
}
+ default:
+ return fmt.Errorf("wait: unexpected packet %T received: %v", msg, msg)
}
}
if wm.status == 0 {
@@ -445,20 +476,12 @@ func (s *Session) stdin() {
if s.stdinpipe {
return
}
- var stdin io.Reader
if s.Stdin == nil {
- stdin = new(bytes.Buffer)
- } else {
- r, w := io.Pipe()
- go func() {
- _, err := io.Copy(w, s.Stdin)
- w.CloseWithError(err)
- }()
- stdin, s.stdinPipeWriter = r, w
+ s.Stdin = new(bytes.Buffer)
}
s.copyFuncs = append(s.copyFuncs, func() error {
- _, err := io.Copy(s.ch, stdin)
- if err1 := s.ch.CloseWrite(); err == nil && err1 != io.EOF {
+ _, err := io.Copy(s.clientChan.stdin, s.Stdin)
+ if err1 := s.clientChan.stdin.Close(); err == nil && err1 != io.EOF {
err = err1
}
return err
@@ -473,7 +496,7 @@ func (s *Session) stdout() {
s.Stdout = ioutil.Discard
}
s.copyFuncs = append(s.copyFuncs, func() error {
- _, err := io.Copy(s.Stdout, s.ch)
+ _, err := io.Copy(s.Stdout, s.clientChan.stdout)
return err
})
}
@@ -486,21 +509,11 @@ func (s *Session) stderr() {
s.Stderr = ioutil.Discard
}
s.copyFuncs = append(s.copyFuncs, func() error {
- _, err := io.Copy(s.Stderr, s.ch.Stderr())
+ _, err := io.Copy(s.Stderr, s.clientChan.stderr)
return err
})
}
-// sessionStdin reroutes Close to CloseWrite.
-type sessionStdin struct {
- io.Writer
- ch Channel
-}
-
-func (s *sessionStdin) Close() error {
- return s.ch.CloseWrite()
-}
-
// StdinPipe returns a pipe that will be connected to the
// remote command's standard input when the command starts.
func (s *Session) StdinPipe() (io.WriteCloser, error) {
@@ -511,7 +524,7 @@ func (s *Session) StdinPipe() (io.WriteCloser, error) {
return nil, errors.New("ssh: StdinPipe after process started")
}
s.stdinpipe = true
- return &sessionStdin{s.ch, s.ch}, nil
+ return s.clientChan.stdin, nil
}
// StdoutPipe returns a pipe that will be connected to the
@@ -528,7 +541,7 @@ func (s *Session) StdoutPipe() (io.Reader, error) {
return nil, errors.New("ssh: StdoutPipe after process started")
}
s.stdoutpipe = true
- return s.ch, nil
+ return s.clientChan.stdout, nil
}
// StderrPipe returns a pipe that will be connected to the
@@ -545,20 +558,28 @@ func (s *Session) StderrPipe() (io.Reader, error) {
return nil, errors.New("ssh: StderrPipe after process started")
}
s.stderrpipe = true
- return s.ch.Stderr(), nil
+ return s.clientChan.stderr, nil
}
-// newSession returns a new interactive session on the remote host.
-func newSession(ch Channel, reqs <-chan *Request) (*Session, error) {
- s := &Session{
- ch: ch,
+// NewSession returns a new interactive session on the remote host.
+func (c *ClientConn) NewSession() (*Session, error) {
+ ch := c.newChan(c.transport)
+ if err := c.transport.writePacket(marshal(msgChannelOpen, channelOpenMsg{
+ ChanType: "session",
+ PeersId: ch.localId,
+ PeersWindow: channelWindowSize,
+ MaxPacketSize: channelMaxPacketSize,
+ })); err != nil {
+ c.chanList.remove(ch.localId)
+ return nil, err
}
- s.exitStatus = make(chan error, 1)
- go func() {
- s.exitStatus <- s.wait(reqs)
- }()
-
- return s, nil
+ if err := ch.waitForChannelOpenResponse(); err != nil {
+ c.chanList.remove(ch.localId)
+ return nil, fmt.Errorf("ssh: unable to open session: %v", err)
+ }
+ return &Session{
+ clientChan: ch,
+ }, nil
}
// An ExitError reports unsuccessful completion of a remote command.
diff --git a/vendor/code.google.com/p/go.crypto/ssh/session_test.go b/vendor/code.google.com/p/go.crypto/ssh/session_test.go
index fce986822..5cff58a9f 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/session_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/session_test.go
@@ -12,60 +12,71 @@ import (
"io"
"io/ioutil"
"math/rand"
+ "net"
"testing"
- "golang.org/x/crypto/ssh/terminal"
+ "code.google.com/p/go.crypto/ssh/terminal"
)
-type serverType func(Channel, <-chan *Request, *testing.T)
+type serverType func(*serverChan, *testing.T)
// dial constructs a new test server and returns a *ClientConn.
-func dial(handler serverType, t *testing.T) *Client {
- c1, c2, err := netPipe()
+func dial(handler serverType, t *testing.T) *ClientConn {
+ l, err := Listen("tcp", "127.0.0.1:0", serverConfig)
if err != nil {
- t.Fatalf("netPipe: %v", err)
+ t.Fatalf("unable to listen: %v", err)
}
-
go func() {
- defer c1.Close()
- conf := ServerConfig{
- NoClientAuth: true,
- }
- conf.AddHostKey(testSigners["rsa"])
-
- _, chans, reqs, err := NewServerConn(c1, &conf)
+ defer l.Close()
+ conn, err := l.Accept()
if err != nil {
- t.Fatalf("Unable to handshake: %v", err)
+ t.Errorf("Unable to accept: %v", err)
+ return
}
- go DiscardRequests(reqs)
-
- for newCh := range chans {
- if newCh.ChannelType() != "session" {
- newCh.Reject(UnknownChannelType, "unknown channel type")
- continue
+ defer conn.Close()
+ if err := conn.Handshake(); err != nil {
+ t.Errorf("Unable to handshake: %v", err)
+ return
+ }
+ done := make(chan struct{})
+ for {
+ ch, err := conn.Accept()
+ if err == io.EOF || err == io.ErrUnexpectedEOF {
+ return
+ }
+ // We sometimes get ECONNRESET rather than EOF.
+ if _, ok := err.(*net.OpError); ok {
+ return
}
-
- ch, inReqs, err := newCh.Accept()
if err != nil {
- t.Errorf("Accept: %v", err)
+ t.Errorf("Unable to accept incoming channel request: %v", err)
+ return
+ }
+ if ch.ChannelType() != "session" {
+ ch.Reject(UnknownChannelType, "unknown channel type")
continue
}
+ ch.Accept()
go func() {
- handler(ch, inReqs, t)
+ defer close(done)
+ handler(ch.(*serverChan), t)
}()
}
+ <-done
}()
config := &ClientConfig{
User: "testuser",
+ Auth: []ClientAuth{
+ ClientAuthPassword(clientPassword),
+ },
}
- conn, chans, reqs, err := NewClientConn(c2, "", config)
+ c, err := Dial("tcp", l.Addr().String(), config)
if err != nil {
t.Fatalf("unable to dial remote side: %v", err)
}
-
- return NewClient(conn, chans, reqs)
+ return c
}
// Test a simple string is returned to session.Stdout.
@@ -319,6 +330,164 @@ func TestExitWithoutStatusOrSignal(t *testing.T) {
}
}
+func TestInvalidServerMessage(t *testing.T) {
+ conn := dial(sendInvalidRecord, t)
+ defer conn.Close()
+ session, err := conn.NewSession()
+ if err != nil {
+ t.Fatalf("Unable to request new session: %v", err)
+ }
+ // Make sure that we closed all the clientChans when the connection
+ // failed.
+ session.wait()
+
+ defer session.Close()
+}
+
+// In the wild some clients (and servers) send zero sized window updates.
+// Test that the client can continue after receiving a zero sized update.
+func TestClientZeroWindowAdjust(t *testing.T) {
+ conn := dial(sendZeroWindowAdjust, t)
+ defer conn.Close()
+ session, err := conn.NewSession()
+ if err != nil {
+ t.Fatalf("Unable to request new session: %v", err)
+ }
+ defer session.Close()
+
+ if err := session.Shell(); err != nil {
+ t.Fatalf("Unable to execute command: %v", err)
+ }
+ err = session.Wait()
+ if err != nil {
+ t.Fatalf("expected nil but got %v", err)
+ }
+}
+
+// In the wild some clients (and servers) send zero sized window updates.
+// Test that the server can continue after receiving a zero size update.
+func TestServerZeroWindowAdjust(t *testing.T) {
+ conn := dial(exitStatusZeroHandler, t)
+ defer conn.Close()
+ session, err := conn.NewSession()
+ if err != nil {
+ t.Fatalf("Unable to request new session: %v", err)
+ }
+ defer session.Close()
+
+ if err := session.Shell(); err != nil {
+ t.Fatalf("Unable to execute command: %v", err)
+ }
+
+ // send a bogus zero sized window update
+ session.clientChan.sendWindowAdj(0)
+
+ err = session.Wait()
+ if err != nil {
+ t.Fatalf("expected nil but got %v", err)
+ }
+}
+
+// Verify that the client never sends a packet larger than maxpacket.
+func TestClientStdinRespectsMaxPacketSize(t *testing.T) {
+ conn := dial(discardHandler, t)
+ defer conn.Close()
+ session, err := conn.NewSession()
+ if err != nil {
+ t.Fatalf("failed to request new session: %v", err)
+ }
+ defer session.Close()
+ stdin, err := session.StdinPipe()
+ if err != nil {
+ t.Fatalf("failed to obtain stdinpipe: %v", err)
+ }
+ const size = 100 * 1000
+ for i := 0; i < 10; i++ {
+ n, err := stdin.Write(make([]byte, size))
+ if n != size || err != nil {
+ t.Fatalf("failed to write: %d, %v", n, err)
+ }
+ }
+}
+
+// Verify that the client never accepts a packet larger than maxpacket.
+func TestServerStdoutRespectsMaxPacketSize(t *testing.T) {
+ conn := dial(largeSendHandler, t)
+ defer conn.Close()
+ session, err := conn.NewSession()
+ if err != nil {
+ t.Fatalf("Unable to request new session: %v", err)
+ }
+ defer session.Close()
+ out, err := session.StdoutPipe()
+ if err != nil {
+ t.Fatalf("Unable to connect to Stdout: %v", err)
+ }
+ if err := session.Shell(); err != nil {
+ t.Fatalf("Unable to execute command: %v", err)
+ }
+ if _, err := ioutil.ReadAll(out); err != nil {
+ t.Fatalf("failed to read: %v", err)
+ }
+}
+
+func TestClientCannotSendAfterEOF(t *testing.T) {
+ conn := dial(exitWithoutSignalOrStatus, t)
+ defer conn.Close()
+ session, err := conn.NewSession()
+ if err != nil {
+ t.Fatalf("Unable to request new session: %v", err)
+ }
+ defer session.Close()
+ in, err := session.StdinPipe()
+ if err != nil {
+ t.Fatalf("Unable to connect channel stdin: %v", err)
+ }
+ if err := session.Shell(); err != nil {
+ t.Fatalf("Unable to execute command: %v", err)
+ }
+ if err := in.Close(); err != nil {
+ t.Fatalf("Unable to close stdin: %v", err)
+ }
+ if _, err := in.Write([]byte("foo")); err == nil {
+ t.Fatalf("Session write should fail")
+ }
+}
+
+func TestClientCannotSendAfterClose(t *testing.T) {
+ conn := dial(exitWithoutSignalOrStatus, t)
+ defer conn.Close()
+ session, err := conn.NewSession()
+ if err != nil {
+ t.Fatalf("Unable to request new session: %v", err)
+ }
+ defer session.Close()
+ in, err := session.StdinPipe()
+ if err != nil {
+ t.Fatalf("Unable to connect channel stdin: %v", err)
+ }
+ if err := session.Shell(); err != nil {
+ t.Fatalf("Unable to execute command: %v", err)
+ }
+ // close underlying channel
+ if err := session.channel.Close(); err != nil {
+ t.Fatalf("Unable to close session: %v", err)
+ }
+ if _, err := in.Write([]byte("foo")); err == nil {
+ t.Fatalf("Session write should fail")
+ }
+}
+
+func TestClientCannotSendHugePacket(t *testing.T) {
+ // client and server use the same transport write code so this
+ // test suffices for both.
+ conn := dial(shellHandler, t)
+ defer conn.Close()
+ if err := conn.transport.writePacket(make([]byte, maxPacket*2)); err == nil {
+ t.Fatalf("huge packet write should fail")
+ }
+}
+
// windowTestBytes is the number of bytes that we'll send to the SSH server.
const windowTestBytes = 16000 * 200
@@ -391,104 +560,93 @@ func TestClientHandlesKeepalives(t *testing.T) {
}
type exitStatusMsg struct {
- Status uint32
+ PeersId uint32
+ Request string
+ WantReply bool
+ Status uint32
}
type exitSignalMsg struct {
+ PeersId uint32
+ Request string
+ WantReply bool
Signal string
CoreDumped bool
Errmsg string
Lang string
}
-func handleTerminalRequests(in <-chan *Request) {
- for req := range in {
- ok := false
- switch req.Type {
- case "shell":
- ok = true
- if len(req.Payload) > 0 {
- // We don't accept any commands, only the default shell.
- ok = false
- }
- case "env":
- ok = true
- }
- req.Reply(ok, nil)
+func newServerShell(ch *serverChan, prompt string) *ServerTerminal {
+ term := terminal.NewTerminal(ch, prompt)
+ return &ServerTerminal{
+ Term: term,
+ Channel: ch,
}
}
-func newServerShell(ch Channel, in <-chan *Request, prompt string) *terminal.Terminal {
- term := terminal.NewTerminal(ch, prompt)
- go handleTerminalRequests(in)
- return term
-}
-
-func exitStatusZeroHandler(ch Channel, in <-chan *Request, t *testing.T) {
+func exitStatusZeroHandler(ch *serverChan, t *testing.T) {
defer ch.Close()
// this string is returned to stdout
- shell := newServerShell(ch, in, "> ")
+ shell := newServerShell(ch, "> ")
readLine(shell, t)
sendStatus(0, ch, t)
}
-func exitStatusNonZeroHandler(ch Channel, in <-chan *Request, t *testing.T) {
+func exitStatusNonZeroHandler(ch *serverChan, t *testing.T) {
defer ch.Close()
- shell := newServerShell(ch, in, "> ")
+ shell := newServerShell(ch, "> ")
readLine(shell, t)
sendStatus(15, ch, t)
}
-func exitSignalAndStatusHandler(ch Channel, in <-chan *Request, t *testing.T) {
+func exitSignalAndStatusHandler(ch *serverChan, t *testing.T) {
defer ch.Close()
- shell := newServerShell(ch, in, "> ")
+ shell := newServerShell(ch, "> ")
readLine(shell, t)
sendStatus(15, ch, t)
sendSignal("TERM", ch, t)
}
-func exitSignalHandler(ch Channel, in <-chan *Request, t *testing.T) {
+func exitSignalHandler(ch *serverChan, t *testing.T) {
defer ch.Close()
- shell := newServerShell(ch, in, "> ")
+ shell := newServerShell(ch, "> ")
readLine(shell, t)
sendSignal("TERM", ch, t)
}
-func exitSignalUnknownHandler(ch Channel, in <-chan *Request, t *testing.T) {
+func exitSignalUnknownHandler(ch *serverChan, t *testing.T) {
defer ch.Close()
- shell := newServerShell(ch, in, "> ")
+ shell := newServerShell(ch, "> ")
readLine(shell, t)
sendSignal("SYS", ch, t)
}
-func exitWithoutSignalOrStatus(ch Channel, in <-chan *Request, t *testing.T) {
+func exitWithoutSignalOrStatus(ch *serverChan, t *testing.T) {
defer ch.Close()
- shell := newServerShell(ch, in, "> ")
+ shell := newServerShell(ch, "> ")
readLine(shell, t)
}
-func shellHandler(ch Channel, in <-chan *Request, t *testing.T) {
+func shellHandler(ch *serverChan, t *testing.T) {
defer ch.Close()
// this string is returned to stdout
- shell := newServerShell(ch, in, "golang")
+ shell := newServerShell(ch, "golang")
readLine(shell, t)
sendStatus(0, ch, t)
}
// Ignores the command, writes fixed strings to stderr and stdout.
// Strings are "this-is-stdout." and "this-is-stderr.".
-func fixedOutputHandler(ch Channel, in <-chan *Request, t *testing.T) {
+func fixedOutputHandler(ch *serverChan, t *testing.T) {
defer ch.Close()
- _, err := ch.Read(nil)
- req, ok := <-in
- if !ok {
+ _, err := ch.Read(make([]byte, 0))
+ if _, ok := err.(ChannelRequest); !ok {
t.Fatalf("error: expected channel request, got: %#v", err)
return
}
-
// ignore request, always send some text
- req.Reply(true, nil)
+ ch.AckRequest(true)
_, err = io.WriteString(ch, "this-is-stdout.")
if err != nil {
@@ -501,39 +659,84 @@ func fixedOutputHandler(ch Channel, in <-chan *Request, t *testing.T) {
sendStatus(0, ch, t)
}
-func readLine(shell *terminal.Terminal, t *testing.T) {
+func readLine(shell *ServerTerminal, t *testing.T) {
if _, err := shell.ReadLine(); err != nil && err != io.EOF {
t.Errorf("unable to read line: %v", err)
}
}
-func sendStatus(status uint32, ch Channel, t *testing.T) {
+func sendStatus(status uint32, ch *serverChan, t *testing.T) {
msg := exitStatusMsg{
- Status: status,
+ PeersId: ch.remoteId,
+ Request: "exit-status",
+ WantReply: false,
+ Status: status,
}
- if _, err := ch.SendRequest("exit-status", false, Marshal(&msg)); err != nil {
+ if err := ch.writePacket(marshal(msgChannelRequest, msg)); err != nil {
t.Errorf("unable to send status: %v", err)
}
}
-func sendSignal(signal string, ch Channel, t *testing.T) {
+func sendSignal(signal string, ch *serverChan, t *testing.T) {
sig := exitSignalMsg{
+ PeersId: ch.remoteId,
+ Request: "exit-signal",
+ WantReply: false,
Signal: signal,
CoreDumped: false,
Errmsg: "Process terminated",
Lang: "en-GB-oed",
}
- if _, err := ch.SendRequest("exit-signal", false, Marshal(&sig)); err != nil {
+ if err := ch.writePacket(marshal(msgChannelRequest, sig)); err != nil {
t.Errorf("unable to send signal: %v", err)
}
}
-func discardHandler(ch Channel, t *testing.T) {
+func sendInvalidRecord(ch *serverChan, t *testing.T) {
defer ch.Close()
+ packet := make([]byte, 1+4+4+1)
+ packet[0] = msgChannelData
+ marshalUint32(packet[1:], 29348723 /* invalid channel id */)
+ marshalUint32(packet[5:], 1)
+ packet[9] = 42
+
+ if err := ch.writePacket(packet); err != nil {
+ t.Errorf("unable send invalid record: %v", err)
+ }
+}
+
+func sendZeroWindowAdjust(ch *serverChan, t *testing.T) {
+ defer ch.Close()
+ // send a bogus zero sized window update
+ ch.sendWindowAdj(0)
+ shell := newServerShell(ch, "> ")
+ readLine(shell, t)
+ sendStatus(0, ch, t)
+}
+
+func discardHandler(ch *serverChan, t *testing.T) {
+ defer ch.Close()
+ // grow the window to avoid being fooled by
+ // the initial 1 << 14 window.
+ ch.sendWindowAdj(1024 * 1024)
io.Copy(ioutil.Discard, ch)
}
-func echoHandler(ch Channel, in <-chan *Request, t *testing.T) {
+func largeSendHandler(ch *serverChan, t *testing.T) {
+ defer ch.Close()
+ // grow the window to avoid being fooled by
+ // the initial 1 << 14 window.
+ ch.sendWindowAdj(1024 * 1024)
+ shell := newServerShell(ch, "> ")
+ readLine(shell, t)
+ // try to send more than the 32k window
+ // will allow
+ if err := ch.writePacket(make([]byte, 128*1024)); err == nil {
+ t.Errorf("wrote packet larger than 32k")
+ }
+}
+
+func echoHandler(ch *serverChan, t *testing.T) {
defer ch.Close()
if n, err := copyNRandomly("echohandler", ch, ch, windowTestBytes); err != nil {
t.Errorf("short write, wrote %d, expected %d: %v ", n, windowTestBytes, err)
@@ -570,59 +773,17 @@ func copyNRandomly(title string, dst io.Writer, src io.Reader, n int) (int, erro
return written, nil
}
-func channelKeepaliveSender(ch Channel, in <-chan *Request, t *testing.T) {
+func channelKeepaliveSender(ch *serverChan, t *testing.T) {
defer ch.Close()
- shell := newServerShell(ch, in, "> ")
+ shell := newServerShell(ch, "> ")
readLine(shell, t)
- if _, err := ch.SendRequest("keepalive@openssh.com", true, nil); err != nil {
+ msg := channelRequestMsg{
+ PeersId: ch.remoteId,
+ Request: "keepalive@openssh.com",
+ WantReply: true,
+ }
+ if err := ch.writePacket(marshal(msgChannelRequest, msg)); err != nil {
t.Errorf("unable to send channel keepalive request: %v", err)
}
sendStatus(0, ch, t)
}
-
-func TestClientWriteEOF(t *testing.T) {
- conn := dial(simpleEchoHandler, t)
- defer conn.Close()
-
- session, err := conn.NewSession()
- if err != nil {
- t.Fatal(err)
- }
- defer session.Close()
- stdin, err := session.StdinPipe()
- if err != nil {
- t.Fatalf("StdinPipe failed: %v", err)
- }
- stdout, err := session.StdoutPipe()
- if err != nil {
- t.Fatalf("StdoutPipe failed: %v", err)
- }
-
- data := []byte(`0000`)
- _, err = stdin.Write(data)
- if err != nil {
- t.Fatalf("Write failed: %v", err)
- }
- stdin.Close()
-
- res, err := ioutil.ReadAll(stdout)
- if err != nil {
- t.Fatalf("Read failed: %v", err)
- }
-
- if !bytes.Equal(data, res) {
- t.Fatalf("Read differed from write, wrote: %v, read: %v", data, res)
- }
-}
-
-func simpleEchoHandler(ch Channel, in <-chan *Request, t *testing.T) {
- defer ch.Close()
- data, err := ioutil.ReadAll(ch)
- if err != nil {
- t.Errorf("handler read error: %v", err)
- }
- _, err = ch.Write(data)
- if err != nil {
- t.Errorf("handler write error: %v", err)
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/tcpip.go b/vendor/code.google.com/p/go.crypto/ssh/tcpip.go
index 4ecad0b3f..74fc1a7c0 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/tcpip.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/tcpip.go
@@ -16,11 +16,10 @@ import (
"time"
)
-// Listen requests the remote peer open a listening socket on
-// addr. Incoming connections will be available by calling Accept on
-// the returned net.Listener. The listener must be serviced, or the
-// SSH connection may hang.
-func (c *Client) Listen(n, addr string) (net.Listener, error) {
+// Listen requests the remote peer open a listening socket
+// on addr. Incoming connections will be available by calling
+// Accept on the returned net.Listener.
+func (c *ClientConn) Listen(n, addr string) (net.Listener, error) {
laddr, err := net.ResolveTCPAddr(n, addr)
if err != nil {
return nil, err
@@ -60,7 +59,7 @@ func isBrokenOpenSSHVersion(versionStr string) bool {
// autoPortListenWorkaround simulates automatic port allocation by
// trying random ports repeatedly.
-func (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) {
+func (c *ClientConn) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) {
var sshListener net.Listener
var err error
const tries = 10
@@ -78,45 +77,44 @@ func (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, err
// RFC 4254 7.1
type channelForwardMsg struct {
- addr string
- rport uint32
+ Message string
+ WantReply bool
+ raddr string
+ rport uint32
}
// ListenTCP requests the remote peer open a listening socket
// on laddr. Incoming connections will be available by calling
// Accept on the returned net.Listener.
-func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) {
- if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) {
+func (c *ClientConn) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) {
+ if laddr.Port == 0 && isBrokenOpenSSHVersion(c.serverVersion) {
return c.autoPortListenWorkaround(laddr)
}
m := channelForwardMsg{
+ "tcpip-forward",
+ true, // sendGlobalRequest waits for a reply
laddr.IP.String(),
uint32(laddr.Port),
}
// send message
- ok, resp, err := c.SendRequest("tcpip-forward", true, Marshal(&m))
+ resp, err := c.sendGlobalRequest(m)
if err != nil {
return nil, err
}
- if !ok {
- return nil, errors.New("ssh: tcpip-forward request denied by peer")
- }
// If the original port was 0, then the remote side will
// supply a real port number in the response.
if laddr.Port == 0 {
- var p struct {
- Port uint32
+ port, _, ok := parseUint32(resp.Data)
+ if !ok {
+ return nil, errors.New("unable to parse response")
}
- if err := Unmarshal(resp, &p); err != nil {
- return nil, err
- }
- laddr.Port = int(p.Port)
+ laddr.Port = int(port)
}
// Register this forward, using the port number we obtained.
- ch := c.forwards.add(*laddr)
+ ch := c.forwardList.add(*laddr)
return &tcpListener{laddr, c, ch}, nil
}
@@ -139,7 +137,7 @@ type forwardEntry struct {
// arguments to add/remove/lookup should be address as specified in
// the original forward-request.
type forward struct {
- newCh NewChannel // the ssh client channel underlying this forward
+ c *clientChan // the ssh client channel underlying this forward
raddr *net.TCPAddr // the raddr of the incoming connection
}
@@ -154,59 +152,6 @@ func (l *forwardList) add(addr net.TCPAddr) chan forward {
return f.c
}
-// See RFC 4254, section 7.2
-type forwardedTCPPayload struct {
- Addr string
- Port uint32
- OriginAddr string
- OriginPort uint32
-}
-
-// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr.
-func parseTCPAddr(addr string, port uint32) (*net.TCPAddr, error) {
- if port == 0 || port > 65535 {
- return nil, fmt.Errorf("ssh: port number out of range: %d", port)
- }
- ip := net.ParseIP(string(addr))
- if ip == nil {
- return nil, fmt.Errorf("ssh: cannot parse IP address %q", addr)
- }
- return &net.TCPAddr{IP: ip, Port: int(port)}, nil
-}
-
-func (l *forwardList) handleChannels(in <-chan NewChannel) {
- for ch := range in {
- var payload forwardedTCPPayload
- if err := Unmarshal(ch.ExtraData(), &payload); err != nil {
- ch.Reject(ConnectionFailed, "could not parse forwarded-tcpip payload: "+err.Error())
- continue
- }
-
- // RFC 4254 section 7.2 specifies that incoming
- // addresses should list the address, in string
- // format. It is implied that this should be an IP
- // address, as it would be impossible to connect to it
- // otherwise.
- laddr, err := parseTCPAddr(payload.Addr, payload.Port)
- if err != nil {
- ch.Reject(ConnectionFailed, err.Error())
- continue
- }
- raddr, err := parseTCPAddr(payload.OriginAddr, payload.OriginPort)
- if err != nil {
- ch.Reject(ConnectionFailed, err.Error())
- continue
- }
-
- if ok := l.forward(*laddr, *raddr, ch); !ok {
- // Section 7.2, implementations MUST reject spurious incoming
- // connections.
- ch.Reject(Prohibited, "no forward for address")
- continue
- }
- }
-}
-
// remove removes the forward entry, and the channel feeding its
// listener.
func (l *forwardList) remove(addr net.TCPAddr) {
@@ -231,22 +176,21 @@ func (l *forwardList) closeAll() {
l.entries = nil
}
-func (l *forwardList) forward(laddr, raddr net.TCPAddr, ch NewChannel) bool {
+func (l *forwardList) lookup(addr net.TCPAddr) (chan forward, bool) {
l.Lock()
defer l.Unlock()
for _, f := range l.entries {
- if laddr.IP.Equal(f.laddr.IP) && laddr.Port == f.laddr.Port {
- f.c <- forward{ch, &raddr}
- return true
+ if addr.IP.Equal(f.laddr.IP) && addr.Port == f.laddr.Port {
+ return f.c, true
}
}
- return false
+ return nil, false
}
type tcpListener struct {
laddr *net.TCPAddr
- conn *Client
+ conn *ClientConn
in <-chan forward
}
@@ -256,33 +200,30 @@ func (l *tcpListener) Accept() (net.Conn, error) {
if !ok {
return nil, io.EOF
}
- ch, incoming, err := s.newCh.Accept()
- if err != nil {
- return nil, err
- }
- go DiscardRequests(incoming)
-
return &tcpChanConn{
- Channel: ch,
- laddr: l.laddr,
- raddr: s.raddr,
+ tcpChan: &tcpChan{
+ clientChan: s.c,
+ Reader: s.c.stdout,
+ Writer: s.c.stdin,
+ },
+ laddr: l.laddr,
+ raddr: s.raddr,
}, nil
}
// Close closes the listener.
func (l *tcpListener) Close() error {
m := channelForwardMsg{
+ "cancel-tcpip-forward",
+ true,
l.laddr.IP.String(),
uint32(l.laddr.Port),
}
-
- // this also closes the listener.
- l.conn.forwards.remove(*l.laddr)
- ok, _, err := l.conn.SendRequest("cancel-tcpip-forward", true, Marshal(&m))
- if err == nil && !ok {
- err = errors.New("ssh: cancel-tcpip-forward failed")
+ l.conn.forwardList.remove(*l.laddr)
+ if _, err := l.conn.sendGlobalRequest(m); err != nil {
+ return err
}
- return err
+ return nil
}
// Addr returns the listener's network address.
@@ -292,7 +233,7 @@ func (l *tcpListener) Addr() net.Addr {
// Dial initiates a connection to the addr from the remote host.
// The resulting connection has a zero LocalAddr() and RemoteAddr().
-func (c *Client) Dial(n, addr string) (net.Conn, error) {
+func (c *ClientConn) Dial(n, addr string) (net.Conn, error) {
// Parse the address into host and numeric port.
host, portString, err := net.SplitHostPort(addr)
if err != nil {
@@ -312,7 +253,7 @@ func (c *Client) Dial(n, addr string) (net.Conn, error) {
return nil, err
}
return &tcpChanConn{
- Channel: ch,
+ tcpChan: ch,
laddr: zeroAddr,
raddr: zeroAddr,
}, nil
@@ -321,7 +262,7 @@ func (c *Client) Dial(n, addr string) (net.Conn, error) {
// DialTCP connects to the remote address raddr on the network net,
// which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used
// as the local address for the connection.
-func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) {
+func (c *ClientConn) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) {
if laddr == nil {
laddr = &net.TCPAddr{
IP: net.IPv4zero,
@@ -333,7 +274,7 @@ func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error)
return nil, err
}
return &tcpChanConn{
- Channel: ch,
+ tcpChan: ch,
laddr: laddr,
raddr: raddr,
}, nil
@@ -341,32 +282,54 @@ func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error)
// RFC 4254 7.2
type channelOpenDirectMsg struct {
- raddr string
- rport uint32
- laddr string
- lport uint32
+ ChanType string
+ PeersId uint32
+ PeersWindow uint32
+ MaxPacketSize uint32
+ raddr string
+ rport uint32
+ laddr string
+ lport uint32
}
-func (c *Client) dial(laddr string, lport int, raddr string, rport int) (Channel, error) {
- msg := channelOpenDirectMsg{
- raddr: raddr,
- rport: uint32(rport),
- laddr: laddr,
- lport: uint32(lport),
+// dial opens a direct-tcpip connection to the remote server. laddr and raddr are passed as
+// strings and are expected to be resolvable at the remote end.
+func (c *ClientConn) dial(laddr string, lport int, raddr string, rport int) (*tcpChan, error) {
+ ch := c.newChan(c.transport)
+ if err := c.transport.writePacket(marshal(msgChannelOpen, channelOpenDirectMsg{
+ ChanType: "direct-tcpip",
+ PeersId: ch.localId,
+ PeersWindow: channelWindowSize,
+ MaxPacketSize: channelMaxPacketSize,
+ raddr: raddr,
+ rport: uint32(rport),
+ laddr: laddr,
+ lport: uint32(lport),
+ })); err != nil {
+ c.chanList.remove(ch.localId)
+ return nil, err
}
- ch, in, err := c.OpenChannel("direct-tcpip", Marshal(&msg))
- go DiscardRequests(in)
- return ch, err
+ if err := ch.waitForChannelOpenResponse(); err != nil {
+ c.chanList.remove(ch.localId)
+ return nil, fmt.Errorf("ssh: unable to open direct tcpip connection: %v", err)
+ }
+ return &tcpChan{
+ clientChan: ch,
+ Reader: ch.stdout,
+ Writer: ch.stdin,
+ }, nil
}
type tcpChan struct {
- Channel // the backing channel
+ *clientChan // the backing channel
+ io.Reader
+ io.Writer
}
// tcpChanConn fulfills the net.Conn interface without
// the tcpChan having to hold laddr or raddr directly.
type tcpChanConn struct {
- Channel
+ *tcpChan
laddr, raddr net.Addr
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/tcpip_test.go b/vendor/code.google.com/p/go.crypto/ssh/tcpip_test.go
index f1265cb49..7fa9fc43f 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/tcpip_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/tcpip_test.go
@@ -1,7 +1,3 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
package ssh
import (
diff --git a/vendor/code.google.com/p/go.crypto/ssh/terminal/terminal.go b/vendor/code.google.com/p/go.crypto/ssh/terminal/terminal.go
index 965f0cfcf..86853d6b3 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/terminal/terminal.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/terminal/terminal.go
@@ -5,7 +5,6 @@
package terminal
import (
- "bytes"
"io"
"sync"
"unicode/utf8"
@@ -54,7 +53,7 @@ type Terminal struct {
lock sync.Mutex
c io.ReadWriter
- prompt []rune
+ prompt string
// line is the current line being entered.
line []rune
@@ -62,9 +61,6 @@ type Terminal struct {
pos int
// echo is true if local echo is enabled
echo bool
- // pasteActive is true iff there is a bracketed paste operation in
- // progress.
- pasteActive bool
// cursorX contains the current X value of the cursor where the left
// edge is 0. cursorY contains the row number where the first row of
@@ -102,7 +98,7 @@ func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
return &Terminal{
Escape: &vt100EscapeCodes,
c: c,
- prompt: []rune(prompt),
+ prompt: prompt,
termWidth: 80,
termHeight: 24,
echo: true,
@@ -112,7 +108,6 @@ func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
const (
keyCtrlD = 4
- keyCtrlU = 21
keyEnter = '\r'
keyEscape = 27
keyBackspace = 127
@@ -127,36 +122,26 @@ const (
keyEnd
keyDeleteWord
keyDeleteLine
- keyClearScreen
- keyPasteStart
- keyPasteEnd
)
-var pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
-var pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'}
-
// bytesToKey tries to parse a key sequence from b. If successful, it returns
// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
-func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
+func bytesToKey(b []byte) (rune, []byte) {
if len(b) == 0 {
return utf8.RuneError, nil
}
- if !pasteActive {
- switch b[0] {
- case 1: // ^A
- return keyHome, b[1:]
- case 5: // ^E
- return keyEnd, b[1:]
- case 8: // ^H
- return keyBackspace, b[1:]
- case 11: // ^K
- return keyDeleteLine, b[1:]
- case 12: // ^L
- return keyClearScreen, b[1:]
- case 23: // ^W
- return keyDeleteWord, b[1:]
- }
+ switch b[0] {
+ case 1: // ^A
+ return keyHome, b[1:]
+ case 5: // ^E
+ return keyEnd, b[1:]
+ case 8: // ^H
+ return keyBackspace, b[1:]
+ case 11: // ^K
+ return keyDeleteLine, b[1:]
+ case 23: // ^W
+ return keyDeleteWord, b[1:]
}
if b[0] != keyEscape {
@@ -167,7 +152,7 @@ func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
return r, b[l:]
}
- if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
+ if len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
switch b[2] {
case 'A':
return keyUp, b[3:]
@@ -177,6 +162,11 @@ func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
return keyRight, b[3:]
case 'D':
return keyLeft, b[3:]
+ }
+ }
+
+ if len(b) >= 3 && b[0] == keyEscape && b[1] == 'O' {
+ switch b[2] {
case 'H':
return keyHome, b[3:]
case 'F':
@@ -184,7 +174,7 @@ func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
}
}
- if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {
+ if len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {
switch b[5] {
case 'C':
return keyAltRight, b[6:]
@@ -193,20 +183,12 @@ func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
}
}
- if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {
- return keyPasteStart, b[6:]
- }
-
- if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) {
- return keyPasteEnd, b[6:]
- }
-
// If we get here then we have a key that we don't recognise, or a
// partial sequence. It's not clear how one should find the end of a
- // sequence without knowing them all, but it seems that [a-zA-Z~] only
+ // sequence without knowing them all, but it seems that [a-zA-Z] only
// appears at the end of a sequence.
for i, c := range b[0:] {
- if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' {
+ if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' {
return keyUnknown, b[i+1:]
}
}
@@ -234,7 +216,7 @@ func (t *Terminal) moveCursorToPos(pos int) {
return
}
- x := visualLength(t.prompt) + pos
+ x := len(t.prompt) + pos
y := x / t.termWidth
x = x % t.termWidth
@@ -314,29 +296,6 @@ func (t *Terminal) setLine(newLine []rune, newPos int) {
t.pos = newPos
}
-func (t *Terminal) advanceCursor(places int) {
- t.cursorX += places
- t.cursorY += t.cursorX / t.termWidth
- if t.cursorY > t.maxLine {
- t.maxLine = t.cursorY
- }
- t.cursorX = t.cursorX % t.termWidth
-
- if places > 0 && t.cursorX == 0 {
- // Normally terminals will advance the current position
- // when writing a character. But that doesn't happen
- // for the last character in a line. However, when
- // writing a character (except a new line) that causes
- // a line wrap, the position will be advanced two
- // places.
- //
- // So, if we are stopping at the end of a line, we
- // need to write a newline so that our cursor can be
- // advanced to the next line.
- t.outBuf = append(t.outBuf, '\n')
- }
-}
-
func (t *Terminal) eraseNPreviousChars(n int) {
if n == 0 {
return
@@ -355,7 +314,7 @@ func (t *Terminal) eraseNPreviousChars(n int) {
for i := 0; i < n; i++ {
t.queue(space)
}
- t.advanceCursor(n)
+ t.cursorX += n
t.moveCursorToPos(t.pos)
}
}
@@ -404,35 +363,9 @@ func (t *Terminal) countToRightWord() int {
return pos - t.pos
}
-// visualLength returns the number of visible glyphs in s.
-func visualLength(runes []rune) int {
- inEscapeSeq := false
- length := 0
-
- for _, r := range runes {
- switch {
- case inEscapeSeq:
- if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {
- inEscapeSeq = false
- }
- case r == '\x1b':
- inEscapeSeq = true
- default:
- length++
- }
- }
-
- return length
-}
-
// handleKey processes the given key and, optionally, returns a line of text
// that the user has entered.
func (t *Terminal) handleKey(key rune) (line string, ok bool) {
- if t.pasteActive && key != keyEnter {
- t.addKeyToLine(key)
- return
- }
-
switch key {
case keyBackspace:
if t.pos == 0 {
@@ -516,27 +449,10 @@ func (t *Terminal) handleKey(key rune) (line string, ok bool) {
// end of line.
for i := t.pos; i < len(t.line); i++ {
t.queue(space)
- t.advanceCursor(1)
+ t.cursorX++
}
t.line = t.line[:t.pos]
t.moveCursorToPos(t.pos)
- case keyCtrlD:
- // Erase the character under the current position.
- // The EOF case when the line is empty is handled in
- // readLine().
- if t.pos < len(t.line) {
- t.pos++
- t.eraseNPreviousChars(1)
- }
- case keyCtrlU:
- t.eraseNPreviousChars(t.pos)
- case keyClearScreen:
- // Erases the screen and moves the cursor to the home position.
- t.queue([]rune("\x1b[2J\x1b[H"))
- t.queue(t.prompt)
- t.cursorX, t.cursorY = 0, 0
- t.advanceCursor(visualLength(t.prompt))
- t.setLine(t.line, t.pos)
default:
if t.AutoCompleteCallback != nil {
prefix := string(t.line[:t.pos])
@@ -557,29 +473,23 @@ func (t *Terminal) handleKey(key rune) (line string, ok bool) {
if len(t.line) == maxLineLength {
return
}
- t.addKeyToLine(key)
+ if len(t.line) == cap(t.line) {
+ newLine := make([]rune, len(t.line), 2*(1+len(t.line)))
+ copy(newLine, t.line)
+ t.line = newLine
+ }
+ t.line = t.line[:len(t.line)+1]
+ copy(t.line[t.pos+1:], t.line[t.pos:])
+ t.line[t.pos] = key
+ if t.echo {
+ t.writeLine(t.line[t.pos:])
+ }
+ t.pos++
+ t.moveCursorToPos(t.pos)
}
return
}
-// addKeyToLine inserts the given key at the current position in the current
-// line.
-func (t *Terminal) addKeyToLine(key rune) {
- if len(t.line) == cap(t.line) {
- newLine := make([]rune, len(t.line), 2*(1+len(t.line)))
- copy(newLine, t.line)
- t.line = newLine
- }
- t.line = t.line[:len(t.line)+1]
- copy(t.line[t.pos+1:], t.line[t.pos:])
- t.line[t.pos] = key
- if t.echo {
- t.writeLine(t.line[t.pos:])
- }
- t.pos++
- t.moveCursorToPos(t.pos)
-}
-
func (t *Terminal) writeLine(line []rune) {
for len(line) != 0 {
remainingOnLine := t.termWidth - t.cursorX
@@ -588,8 +498,16 @@ func (t *Terminal) writeLine(line []rune) {
todo = remainingOnLine
}
t.queue(line[:todo])
- t.advanceCursor(visualLength(line[:todo]))
+ t.cursorX += todo
line = line[todo:]
+
+ if t.cursorX == t.termWidth {
+ t.cursorX = 0
+ t.cursorY++
+ if t.cursorY > t.maxLine {
+ t.maxLine = t.cursorY
+ }
+ }
}
}
@@ -624,11 +542,14 @@ func (t *Terminal) Write(buf []byte) (n int, err error) {
return
}
- t.writeLine(t.prompt)
+ t.queue([]rune(t.prompt))
+ chars := len(t.prompt)
if t.echo {
- t.writeLine(t.line)
+ t.queue(t.line)
+ chars += len(t.line)
}
-
+ t.cursorX = chars % t.termWidth
+ t.cursorY = chars / t.termWidth
t.moveCursorToPos(t.pos)
if _, err = t.c.Write(t.outBuf); err != nil {
@@ -645,7 +566,7 @@ func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
defer t.lock.Unlock()
oldPrompt := t.prompt
- t.prompt = []rune(prompt)
+ t.prompt = prompt
t.echo = false
line, err = t.readLine()
@@ -668,41 +589,22 @@ func (t *Terminal) readLine() (line string, err error) {
// t.lock must be held at this point
if t.cursorX == 0 && t.cursorY == 0 {
- t.writeLine(t.prompt)
+ t.writeLine([]rune(t.prompt))
t.c.Write(t.outBuf)
t.outBuf = t.outBuf[:0]
}
- lineIsPasted := t.pasteActive
-
for {
rest := t.remainder
lineOk := false
for !lineOk {
var key rune
- key, rest = bytesToKey(rest, t.pasteActive)
+ key, rest = bytesToKey(rest)
if key == utf8.RuneError {
break
}
- if !t.pasteActive {
- if key == keyCtrlD {
- if len(t.line) == 0 {
- return "", io.EOF
- }
- }
- if key == keyPasteStart {
- t.pasteActive = true
- if len(t.line) == 0 {
- lineIsPasted = true
- }
- continue
- }
- } else if key == keyPasteEnd {
- t.pasteActive = false
- continue
- }
- if !t.pasteActive {
- lineIsPasted = false
+ if key == keyCtrlD {
+ return "", io.EOF
}
line, lineOk = t.handleKey(key)
}
@@ -719,9 +621,6 @@ func (t *Terminal) readLine() (line string, err error) {
t.historyIndex = -1
t.history.Add(line)
}
- if lineIsPasted {
- err = ErrPasteIndicator
- }
return
}
@@ -749,102 +648,14 @@ func (t *Terminal) SetPrompt(prompt string) {
t.lock.Lock()
defer t.lock.Unlock()
- t.prompt = []rune(prompt)
+ t.prompt = prompt
}
-func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) {
- // Move cursor to column zero at the start of the line.
- t.move(t.cursorY, 0, t.cursorX, 0)
- t.cursorX, t.cursorY = 0, 0
- t.clearLineToRight()
- for t.cursorY < numPrevLines {
- // Move down a line
- t.move(0, 1, 0, 0)
- t.cursorY++
- t.clearLineToRight()
- }
- // Move back to beginning.
- t.move(t.cursorY, 0, 0, 0)
- t.cursorX, t.cursorY = 0, 0
-
- t.queue(t.prompt)
- t.advanceCursor(visualLength(t.prompt))
- t.writeLine(t.line)
- t.moveCursorToPos(t.pos)
-}
-
-func (t *Terminal) SetSize(width, height int) error {
+func (t *Terminal) SetSize(width, height int) {
t.lock.Lock()
defer t.lock.Unlock()
- if width == 0 {
- width = 1
- }
-
- oldWidth := t.termWidth
t.termWidth, t.termHeight = width, height
-
- switch {
- case width == oldWidth:
- // If the width didn't change then nothing else needs to be
- // done.
- return nil
- case width < oldWidth:
- // Some terminals (e.g. xterm) will truncate lines that were
- // too long when shinking. Others, (e.g. gnome-terminal) will
- // attempt to wrap them. For the former, repainting t.maxLine
- // works great, but that behaviour goes badly wrong in the case
- // of the latter because they have doubled every full line.
-
- // We assume that we are working on a terminal that wraps lines
- // and adjust the cursor position based on every previous line
- // wrapping and turning into two. This causes the prompt on
- // xterms to move upwards, which isn't great, but it avoids a
- // huge mess with gnome-terminal.
- if t.cursorX >= t.termWidth {
- t.cursorX = t.termWidth - 1
- }
- t.cursorY *= 2
- t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2)
- case width > oldWidth:
- // If the terminal expands then our position calculations will
- // be wrong in the future because we think the cursor is
- // |t.pos| chars into the string, but there will be a gap at
- // the end of any wrapped line.
- //
- // But the position will actually be correct until we move, so
- // we can move back to the beginning and repaint everything.
- t.clearAndRepaintLinePlusNPrevious(t.maxLine)
- }
-
- _, err := t.c.Write(t.outBuf)
- t.outBuf = t.outBuf[:0]
- return err
-}
-
-type pasteIndicatorError struct{}
-
-func (pasteIndicatorError) Error() string {
- return "terminal: ErrPasteIndicator not correctly handled"
-}
-
-// ErrPasteIndicator may be returned from ReadLine as the error, in addition
-// to valid line data. It indicates that bracketed paste mode is enabled and
-// that the returned line consists only of pasted data. Programs may wish to
-// interpret pasted data more literally than typed data.
-var ErrPasteIndicator = pasteIndicatorError{}
-
-// SetBracketedPasteMode requests that the terminal bracket paste operations
-// with markers. Not all terminals support this but, if it is supported, then
-// enabling this mode will stop any autocomplete callback from running due to
-// pastes. Additionally, any lines that are completely pasted will be returned
-// from ReadLine with the error set to ErrPasteIndicator.
-func (t *Terminal) SetBracketedPasteMode(on bool) {
- if on {
- io.WriteString(t.c, "\x1b[?2004h")
- } else {
- io.WriteString(t.c, "\x1b[?2004l")
- }
}
// stRingBuffer is a ring buffer of strings.
diff --git a/vendor/code.google.com/p/go.crypto/ssh/terminal/terminal_test.go b/vendor/code.google.com/p/go.crypto/ssh/terminal/terminal_test.go
index 657980120..641576c88 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/terminal/terminal_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/terminal/terminal_test.go
@@ -163,40 +163,6 @@ var keyPressTests = []struct {
line: "£",
throwAwayLines: 1,
},
- {
- // Ctrl-D at the end of the line should be ignored.
- in: "a\004\r",
- line: "a",
- },
- {
- // a, b, left, Ctrl-D should erase the b.
- in: "ab\x1b[D\004\r",
- line: "a",
- },
- {
- // a, b, c, d, left, left, ^U should erase to the beginning of
- // the line.
- in: "abcd\x1b[D\x1b[D\025\r",
- line: "cd",
- },
- {
- // Bracketed paste mode: control sequences should be returned
- // verbatim in paste mode.
- in: "abc\x1b[200~de\177f\x1b[201~\177\r",
- line: "abcde\177",
- },
- {
- // Enter in bracketed paste mode should still work.
- in: "abc\x1b[200~d\refg\x1b[201~h\r",
- line: "efgh",
- throwAwayLines: 1,
- },
- {
- // Lines consisting entirely of pasted data should be indicated as such.
- in: "\x1b[200~a\r",
- line: "a",
- err: ErrPasteIndicator,
- },
}
func TestKeyPresses(t *testing.T) {
diff --git a/vendor/code.google.com/p/go.crypto/ssh/terminal/util.go b/vendor/code.google.com/p/go.crypto/ssh/terminal/util.go
index 0763c9a97..8df94f5d6 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/terminal/util.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/terminal/util.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd
+// +build linux,!appengine darwin
// Package terminal provides support functions for dealing with terminals, as
// commonly found on UNIX systems.
diff --git a/vendor/code.google.com/p/go.crypto/ssh/terminal/util_bsd.go b/vendor/code.google.com/p/go.crypto/ssh/terminal/util_bsd.go
index 9c1ffd145..1654453bd 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/terminal/util_bsd.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/terminal/util_bsd.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build darwin dragonfly freebsd netbsd openbsd
+// +build darwin
package terminal
diff --git a/vendor/code.google.com/p/go.crypto/ssh/terminal/util_linux.go b/vendor/code.google.com/p/go.crypto/ssh/terminal/util_linux.go
index 5883b22d7..283144b7b 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/terminal/util_linux.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/terminal/util_linux.go
@@ -2,10 +2,11 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build linux
+
package terminal
-// These constants are declared here, rather than importing
-// them from the syscall package as some syscall packages, even
-// on linux, for example gccgo, do not declare them.
-const ioctlReadTermios = 0x5401 // syscall.TCGETS
-const ioctlWriteTermios = 0x5402 // syscall.TCSETS
+import "syscall"
+
+const ioctlReadTermios = syscall.TCGETS
+const ioctlWriteTermios = syscall.TCSETS
diff --git a/vendor/code.google.com/p/go.crypto/ssh/terminal/util_windows.go b/vendor/code.google.com/p/go.crypto/ssh/terminal/util_windows.go
deleted file mode 100644
index 2dd6c3d97..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/terminal/util_windows.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-// Package terminal provides support functions for dealing with terminals, as
-// commonly found on UNIX systems.
-//
-// Putting a terminal into raw mode is the most common requirement:
-//
-// oldState, err := terminal.MakeRaw(0)
-// if err != nil {
-// panic(err)
-// }
-// defer terminal.Restore(0, oldState)
-package terminal
-
-import (
- "io"
- "syscall"
- "unsafe"
-)
-
-const (
- enableLineInput = 2
- enableEchoInput = 4
- enableProcessedInput = 1
- enableWindowInput = 8
- enableMouseInput = 16
- enableInsertMode = 32
- enableQuickEditMode = 64
- enableExtendedFlags = 128
- enableAutoPosition = 256
- enableProcessedOutput = 1
- enableWrapAtEolOutput = 2
-)
-
-var kernel32 = syscall.NewLazyDLL("kernel32.dll")
-
-var (
- procGetConsoleMode = kernel32.NewProc("GetConsoleMode")
- procSetConsoleMode = kernel32.NewProc("SetConsoleMode")
- procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
-)
-
-type (
- short int16
- word uint16
-
- coord struct {
- x short
- y short
- }
- smallRect struct {
- left short
- top short
- right short
- bottom short
- }
- consoleScreenBufferInfo struct {
- size coord
- cursorPosition coord
- attributes word
- window smallRect
- maximumWindowSize coord
- }
-)
-
-type State struct {
- mode uint32
-}
-
-// IsTerminal returns true if the given file descriptor is a terminal.
-func IsTerminal(fd int) bool {
- var st uint32
- r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
- return r != 0 && e == 0
-}
-
-// MakeRaw put the terminal connected to the given file descriptor into raw
-// mode and returns the previous state of the terminal so that it can be
-// restored.
-func MakeRaw(fd int) (*State, error) {
- var st uint32
- _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
- if e != 0 {
- return nil, error(e)
- }
- st &^= (enableEchoInput | enableProcessedInput | enableLineInput | enableProcessedOutput)
- _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(st), 0)
- if e != 0 {
- return nil, error(e)
- }
- return &State{st}, nil
-}
-
-// GetState returns the current state of a terminal which may be useful to
-// restore the terminal after a signal.
-func GetState(fd int) (*State, error) {
- var st uint32
- _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
- if e != 0 {
- return nil, error(e)
- }
- return &State{st}, nil
-}
-
-// Restore restores the terminal connected to the given file descriptor to a
-// previous state.
-func Restore(fd int, state *State) error {
- _, _, err := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(state.mode), 0)
- return err
-}
-
-// GetSize returns the dimensions of the given terminal.
-func GetSize(fd int) (width, height int, err error) {
- var info consoleScreenBufferInfo
- _, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&info)), 0)
- if e != 0 {
- return 0, 0, error(e)
- }
- return int(info.size.x), int(info.size.y), nil
-}
-
-// ReadPassword reads a line of input from a terminal without local echo. This
-// is commonly used for inputting passwords and other sensitive data. The slice
-// returned does not include the \n.
-func ReadPassword(fd int) ([]byte, error) {
- var st uint32
- _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0)
- if e != 0 {
- return nil, error(e)
- }
- old := st
-
- st &^= (enableEchoInput)
- st |= (enableProcessedInput | enableLineInput | enableProcessedOutput)
- _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(st), 0)
- if e != 0 {
- return nil, error(e)
- }
-
- defer func() {
- syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(old), 0)
- }()
-
- var buf [16]byte
- var ret []byte
- for {
- n, err := syscall.Read(syscall.Handle(fd), buf[:])
- if err != nil {
- return nil, err
- }
- if n == 0 {
- if len(ret) == 0 {
- return nil, io.EOF
- }
- break
- }
- if buf[n-1] == '\n' {
- n--
- }
- if n > 0 && buf[n-1] == '\r' {
- n--
- }
- ret = append(ret, buf[:n]...)
- if n < len(buf) {
- break
- }
- }
-
- return ret, nil
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/test/agent_unix_test.go b/vendor/code.google.com/p/go.crypto/ssh/test/agent_unix_test.go
deleted file mode 100644
index 502e24feb..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/test/agent_unix_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd
-
-package test
-
-import (
- "bytes"
- "testing"
-
- "golang.org/x/crypto/ssh"
- "golang.org/x/crypto/ssh/agent"
-)
-
-func TestAgentForward(t *testing.T) {
- server := newServer(t)
- defer server.Shutdown()
- conn := server.Dial(clientConfig())
- defer conn.Close()
-
- keyring := agent.NewKeyring()
- keyring.Add(testPrivateKeys["dsa"], nil, "")
- pub := testPublicKeys["dsa"]
-
- sess, err := conn.NewSession()
- if err != nil {
- t.Fatalf("NewSession: %v", err)
- }
- if err := agent.RequestAgentForwarding(sess); err != nil {
- t.Fatalf("RequestAgentForwarding: %v", err)
- }
-
- if err := agent.ForwardToAgent(conn, keyring); err != nil {
- t.Fatalf("SetupForwardKeyring: %v", err)
- }
- out, err := sess.CombinedOutput("ssh-add -L")
- if err != nil {
- t.Fatalf("running ssh-add: %v, out %s", err, out)
- }
- key, _, _, _, err := ssh.ParseAuthorizedKey(out)
- if err != nil {
- t.Fatalf("ParseAuthorizedKey(%q): %v", out, err)
- }
-
- if !bytes.Equal(key.Marshal(), pub.Marshal()) {
- t.Fatalf("got key %s, want %s", ssh.MarshalAuthorizedKey(key), ssh.MarshalAuthorizedKey(pub))
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/test/cert_test.go b/vendor/code.google.com/p/go.crypto/ssh/test/cert_test.go
deleted file mode 100644
index 364790f17..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/test/cert_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd
-
-package test
-
-import (
- "crypto/rand"
- "testing"
-
- "golang.org/x/crypto/ssh"
-)
-
-func TestCertLogin(t *testing.T) {
- s := newServer(t)
- defer s.Shutdown()
-
- // Use a key different from the default.
- clientKey := testSigners["dsa"]
- caAuthKey := testSigners["ecdsa"]
- cert := &ssh.Certificate{
- Key: clientKey.PublicKey(),
- ValidPrincipals: []string{username()},
- CertType: ssh.UserCert,
- ValidBefore: ssh.CertTimeInfinity,
- }
- if err := cert.SignCert(rand.Reader, caAuthKey); err != nil {
- t.Fatalf("SetSignature: %v", err)
- }
-
- certSigner, err := ssh.NewCertSigner(cert, clientKey)
- if err != nil {
- t.Fatalf("NewCertSigner: %v", err)
- }
-
- conf := &ssh.ClientConfig{
- User: username(),
- }
- conf.Auth = append(conf.Auth, ssh.PublicKeys(certSigner))
- client, err := s.TryDial(conf)
- if err != nil {
- t.Fatalf("TryDial: %v", err)
- }
- client.Close()
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/test/forward_unix_test.go b/vendor/code.google.com/p/go.crypto/ssh/test/forward_unix_test.go
index 877a88cde..3a57c100c 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/test/forward_unix_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/test/forward_unix_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build darwin dragonfly freebsd linux netbsd openbsd
+// +build darwin freebsd linux netbsd openbsd plan9
package test
diff --git a/vendor/code.google.com/p/go.crypto/ssh/test/keys_test.go b/vendor/code.google.com/p/go.crypto/ssh/test/keys_test.go
new file mode 100644
index 000000000..b1164220e
--- /dev/null
+++ b/vendor/code.google.com/p/go.crypto/ssh/test/keys_test.go
@@ -0,0 +1,246 @@
+package test
+
+import (
+ "reflect"
+ "strings"
+ "testing"
+
+ "code.google.com/p/go.crypto/ssh"
+)
+
+var (
+ validKey = `AAAAB3NzaC1yc2EAAAADAQABAAABAQDEX/dPu4PmtvgK3La9zioCEDrJ` +
+ `yUr6xEIK7Pr+rLgydcqWTU/kt7w7gKjOw4vvzgHfjKl09CWyvgb+y5dCiTk` +
+ `9MxI+erGNhs3pwaoS+EavAbawB7iEqYyTep3YaJK+4RJ4OX7ZlXMAIMrTL+` +
+ `UVrK89t56hCkFYaAgo3VY+z6rb/b3bDBYtE1Y2tS7C3au73aDgeb9psIrSV` +
+ `86ucKBTl5X62FnYiyGd++xCnLB6uLximM5OKXfLzJQNS/QyZyk12g3D8y69` +
+ `Xw1GzCSKX1u1+MQboyf0HJcG2ryUCLHdcDVppApyHx2OLq53hlkQ/yxdflD` +
+ `qCqAE4j+doagSsIfC1T2T`
+
+ authWithOptions = []string{
+ `# comments to ignore before any keys...`,
+ ``,
+ `env="HOME=/home/root",no-port-forwarding ssh-rsa ` + validKey + ` user@host`,
+ `# comments to ignore, along with a blank line`,
+ ``,
+ `env="HOME=/home/root2" ssh-rsa ` + validKey + ` user2@host2`,
+ ``,
+ `# more comments, plus a invalid entry`,
+ `ssh-rsa data-that-will-not-parse user@host3`,
+ }
+
+ authOptions = strings.Join(authWithOptions, "\n")
+ authWithCRLF = strings.Join(authWithOptions, "\r\n")
+ authInvalid = []byte(`ssh-rsa`)
+ authWithQuotedCommaInEnv = []byte(`env="HOME=/home/root,dir",no-port-forwarding ssh-rsa ` + validKey + ` user@host`)
+ authWithQuotedSpaceInEnv = []byte(`env="HOME=/home/root dir",no-port-forwarding ssh-rsa ` + validKey + ` user@host`)
+ authWithQuotedQuoteInEnv = []byte(`env="HOME=/home/\"root dir",no-port-forwarding` + "\t" + `ssh-rsa` + "\t" + validKey + ` user@host`)
+
+ authWithDoubleQuotedQuote = []byte(`no-port-forwarding,env="HOME=/home/ \"root dir\"" ssh-rsa ` + validKey + "\t" + `user@host`)
+ authWithInvalidSpace = []byte(`env="HOME=/home/root dir", no-port-forwarding ssh-rsa ` + validKey + ` user@host
+#more to follow but still no valid keys`)
+ authWithMissingQuote = []byte(`env="HOME=/home/root,no-port-forwarding ssh-rsa ` + validKey + ` user@host
+env="HOME=/home/root",shared-control ssh-rsa ` + validKey + ` user@host`)
+
+ testClientPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAxF/3T7uD5rb4Cty2vc4qAhA6yclK+sRCCuz6/qy4MnXKlk1P
+5Le8O4CozsOL784B34ypdPQlsr4G/suXQok5PTMSPnqxjYbN6cGqEvhGrwG2sAe4
+hKmMk3qd2GiSvuESeDl+2ZVzACDK0y/lFayvPbeeoQpBWGgIKN1WPs+q2/292wwW
+LRNWNrUuwt2ru92g4Hm/abCK0lfOrnCgU5eV+thZ2IshnfvsQpyweri8YpjOTil3
+y8yUDUv0MmcpNdoNw/MuvV8NRswkil9btfjEG6Mn9ByXBtq8lAix3XA1aaQKch8d
+ji6ud4ZZEP8sXX5Q6gqgBOI/naGoErCHwtU9kwIDAQABAoIBAFJRKAp0QEZmTHPB
+MZk+4r0asIoFpziXLFgIHu7C2DPOzK1Umzj1DCKlPB3wOqi7Ym2jOSWdcnAK2EPW
+dAGgJC5TSkKGjAcXixmB5RkumfKidUI0+lQh/puTurcMnvcEwglDkLkEvMBA/sSo
+Pw9m486rOgOnmNzGPyViItURmD2+0yDdLl/vOsO/L1p76GCd0q0J3LqnmsQmawi7
+Zwj2Stm6BIrggG5GsF204Iet5219TYLo4g1Qb2AlJ9C8P1FtAWhMwJalDxH9Os2/
+KCDjnaq5n3bXbIU+3QjskjeVXL/Fnbhjnh4zs1EA7eHzl9dCGbcZ2LOimo2PRo8q
+wVQmz4ECgYEA9dhiu74TxRVoaO5N2X+FsMzRO8gZdP3Z9IrV4jVN8WT4Vdp0snoF
+gkVkqqbQUNKUb5K6B3Js/qNKfcjLbCNq9fewTcT6WsHQdtPbX/QA6Pa2Z29wrlA2
+wrIYaAkmVaHny7wsOmgX01aOnuf2MlUnksK43sjZHdIo/m+sDKwwY1cCgYEAzHx4
+mwUDMdRF4qpDKJhthraBNejRextNQQYsHVnNaMwZ4aeQcH5l85Cgjm7VpGlbVyBQ
+h4zwFvllImp3D2U3mjVkV8Tm9ID98eWvw2YDzBnS3P3SysajD23Z+BXSG9GNv/8k
+oAm+bVlvnJy4haK2AcIMk1YFuDuAOmy73abk7iUCgYEAj4qVM1sq/eKfAM1LJRfg
+/jbIX+hYfMePD8pUUWygIra6jJ4tjtvSBZrwyPb3IImjY3W/KoP0AcVjxAeORohz
+dkP1a6L8LiuFxSuzpdW5BkyuebxGhXCOWKVVvMDC4jLTPVCUXlHSv3GFemCjjgXM
+QlNxT5rjsha4Gr8nLIsJAacCgYA4VA1Q/pd7sXKy1p37X8nD8yAyvnh+Be5I/C9I
+woUP2jFC9MqYAmmJJ4ziz2swiAkuPeuQ+2Tjnz2ZtmQnrIUdiJmkh8vrDGFnshKx
+q7deELsCPzVCwGcIiAUkDra7DQWUHu9y2lxHePyC0rUNst2aLF8UcvzOXC2danhx
+vViQtQKBgCmZ7YavE/GNWww8N3xHBJ6UPmUuhQlnAbgNCcdyz30MevBg/JbyUTs2
+slftTH15QusJ1UoITnnZuFJ40LqDvh8UhiK09ffM/IbUx839/m2vUOdFZB/WNn9g
+Cy0LzddU4KE8JZ/tlk68+hM5fjLLA0aqSunaql5CKfplwLu8x1hL
+-----END RSA PRIVATE KEY-----
+`
+ keys = map[string]string{
+ "ssh_host_dsa_key": `-----BEGIN DSA PRIVATE KEY-----
+MIIBugIBAAKBgQDe2SIKvZdBp+InawtSXH0NotiMPhm3udyu4hh/E+icMz264kDX
+v+sV7ddnSQGQWZ/eVU7Jtx29dCMD1VlFpEd7yGKzmdwJIeA+YquNWoqBRQEJsWWS
+7Fsfvv83dA/DTNIQfOY3+TIs6Mb9vagbgQMU3JUWEhbLE9LCEU6UwwRlpQIVAL4p
+JF83SwpE8Jx6KnDpR89npkl/AoGAAy00TdDnAXvStwrZiAFbjZi8xDmPa9WwpfhJ
+Rkno45TthDLrS+WmqY8/LTwlqZdOBtoBAynMJfKkUiZM21lWWpL1hRKYdwBlIBy5
+XdR2/6wcPSuZ0tCQhDBTstX0Q3P1j198KGKvzy7q9vILKQwtSRqLS1y4JJERafdO
+E+9CnGwCgYBz0WwBe2EZtGhGhBdnelTIBeo7PIsr0PzqxQj+dc8PBl8K9FfhRyOp
+U39stUvoUxE9vaIFrY1P5xENjLFnPf+hlcuf40GUWEssW9YWPOaBp8afa9hY5Sxs
+pvNR6eZFEFOJnx/ZgcA4g+vbrgGi5cM0W470mbGw2CkfJQUafdoIgAIUF+2I9kZe
+2FTBuC9uacqczDlc+0k=
+-----END DSA PRIVATE KEY-----`,
+ "ssh_host_rsa_key": `-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAuf76Ue2Wtae9oDtaS6rIJgO7iCFTsZUTW9LBsvx/2nli6jKU
+d9tUbBRzgdbnRLJ32UljXhERuB/axlrX8/lBzUZ+oYiM0KkEEOXY1z/bcMxdRxGF
+XHuf4uXvyC2XyA4+ZvBeS4j1QFyIHZ62o7gAlKMTjiek3B4AQEJAlCLmhH3jB8wc
+K/IYXAOlNGM5G44/ZLQpTi8diOV6DLs7tJ7rtEQedOEJfZng5rwp0USFkqcbfDbe
+9/hk0J32jZvOtZNBokYtBb4YEdIiWBzzNtHzU3Dzw61+TKVXaH5HaIvzL9iMrw9f
+kJbJyogfZk9BJfemEN+xqP72jlhE8LXNhpTxFQIDAQABAoIBAHbdf+Y5+5XuNF6h
+b8xpwW2h9whBnDYiOnP1VfroKWFbMB7R4lZS4joMO+FfkP8zOyqvHwTvza4pFWys
+g9SUmDvy8FyVYsC7MzEFYzX0xm3o/Te898ip7P1Zy4rXsGeWysSImwqU5X+TYx3i
+33/zyNM1APtZVJ+jwK9QZ+sD/uPuZK2yS03HGSMZq6ebdoOSaYhluKrxXllSLO1J
+KJxDiDdy2lEFw0W8HcI3ly1lg6OI+TRqqaCcLVNF4fNJmYIFM+2VEI9BdgynIh0Q
+pMZlJKgaEBcSqCymnTK81ohYD1cV4st2B0km3Sw35Rl04Ij5ITeiya3hp8VfE6UY
+PljkA6UCgYEA4811FTFj+kzNZ86C4OW1T5sM4NZt8gcz6CSvVnl+bDzbEOMMyzP7
+2I9zKsR5ApdodH2m8d+RUw1Oe0bNGW5xig/DH/hn9lLQaO52JAi0we8A94dUUMSq
+fUk9jKZEXpP/MlfTdJaPos9mxT7z8jREQxIiqH9AV0rLVDOCfDbSWj8CgYEA0QTE
+IAUuki3UUqYKzLQrh/QmhY5KTx5amNW9XZ2VGtJvDPJrtBSBZlPEuXZAc4eBWEc7
+U3Y9QwsalzupU6Yi6+gmofaXs8xJnj+jKth1DnJvrbLLGlSmf2Ijnwt22TyFUOtt
+UAknpjHutDjQPf7pUGWaCPgwwKFsdB8EBjpJF6sCgYAfXesBQAvEK08dPBJJZVfR
+3kenrd71tIgxLtv1zETcIoUHjjv0vvOunhH9kZAYC0EWyTZzl5UrGmn0D4uuNMbt
+e74iaNHn2P9Zc3xQ+eHp0j8P1lKFzI6tMaiH9Vz0qOw6wl0bcJ/WizhbcI+migvc
+MGMVUHBLlMDqly0gbWwJgQKBgQCgtb9ut01FjANSwORQ3L8Tu3/a9Lrh9n7GQKFn
+V4CLrP1BwStavOF5ojMCPo/zxF6JV8ufsqwL3n/FhFP/QyBarpb1tTqTPiHkkR2O
+Ffx67TY9IdnUFv4lt3mYEiKBiW0f+MSF42Qe/wmAfKZw5IzUCirTdrFVi0huSGK5
+vxrwHQKBgHZ7RoC3I2f6F5fflA2ZAe9oJYC7XT624rY7VeOBwK0W0F47iV3euPi/
+pKvLIBLcWL1Lboo+girnmSZtIYg2iLS3b4T9VFcKWg0y4AVwmhMWe9jWIltfWAAX
+9l0lNikMRGAx3eXudKXEtbGt3/cUzPVaQUHy5LiBxkxnFxgaJPXs
+-----END RSA PRIVATE KEY-----`,
+ "ssh_host_ecdsa_key": `-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEINGWx0zo6fhJ/0EAfrPzVFyFC9s18lBt3cRoEDhS3ARooAoGCCqGSM49
+AwEHoUQDQgAEi9Hdw6KvZcWxfg2IDhA7UkpDtzzt6ZqJXSsFdLd+Kx4S3Sx4cVO+
+6/ZOXRnPmNAlLUqjShUsUBBngG0u2fqEqA==
+-----END EC PRIVATE KEY-----`,
+ "authorized_keys": `ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEX/dPu4PmtvgK3La9zioCEDrJyUr6xEIK7Pr+rLgydcqWTU/kt7w7gKjOw4vvzgHfjKl09CWyvgb+y5dCiTk9MxI+erGNhs3pwaoS+EavAbawB7iEqYyTep3YaJK+4RJ4OX7ZlXMAIMrTL+UVrK89t56hCkFYaAgo3VY+z6rb/b3bDBYtE1Y2tS7C3au73aDgeb9psIrSV86ucKBTl5X62FnYiyGd++xCnLB6uLximM5OKXfLzJQNS/QyZyk12g3D8y69Xw1GzCSKX1u1+MQboyf0HJcG2ryUCLHdcDVppApyHx2OLq53hlkQ/yxdflDqCqAE4j+doagSsIfC1T2T user@host`,
+ }
+)
+
+func TestMarshalParsePublicKey(t *testing.T) {
+ pub := getTestPublicKey(t)
+
+ authKeys := ssh.MarshalAuthorizedKey(pub)
+ actualFields := strings.Fields(string(authKeys))
+ if len(actualFields) == 0 {
+ t.Fatalf("failed authKeys: %v", authKeys)
+ }
+
+ // drop the comment
+ expectedFields := strings.Fields(keys["authorized_keys"])[0:2]
+
+ if !reflect.DeepEqual(actualFields, expectedFields) {
+ t.Errorf("got %v, expected %v", actualFields, expectedFields)
+ }
+
+ actPub, _, _, _, ok := ssh.ParseAuthorizedKey([]byte(keys["authorized_keys"]))
+ if !ok {
+ t.Fatalf("cannot parse %v", keys["authorized_keys"])
+ }
+ if !reflect.DeepEqual(actPub, pub) {
+ t.Errorf("got %v, expected %v", actPub, pub)
+ }
+}
+
+type authResult struct {
+ pubKey interface{} //*rsa.PublicKey
+ options []string
+ comments string
+ rest string
+ ok bool
+}
+
+func testAuthorizedKeys(t *testing.T, authKeys []byte, expected []authResult) {
+ rest := authKeys
+ var values []authResult
+ for len(rest) > 0 {
+ var r authResult
+ r.pubKey, r.comments, r.options, rest, r.ok = ssh.ParseAuthorizedKey(rest)
+ r.rest = string(rest)
+ values = append(values, r)
+ }
+
+ if !reflect.DeepEqual(values, expected) {
+ t.Errorf("got %q, expected %q", values, expected)
+ }
+
+}
+
+func getTestPublicKey(t *testing.T) ssh.PublicKey {
+ priv, err := ssh.ParsePrivateKey([]byte(testClientPrivateKey))
+ if err != nil {
+ t.Fatalf("ParsePrivateKey: %v", err)
+ }
+
+ return priv.PublicKey()
+}
+
+func TestAuth(t *testing.T) {
+ pub := getTestPublicKey(t)
+ rest2 := strings.Join(authWithOptions[3:], "\n")
+ rest3 := strings.Join(authWithOptions[6:], "\n")
+ testAuthorizedKeys(t, []byte(authOptions), []authResult{
+ {pub, []string{`env="HOME=/home/root"`, "no-port-forwarding"}, "user@host", rest2, true},
+ {pub, []string{`env="HOME=/home/root2"`}, "user2@host2", rest3, true},
+ {nil, nil, "", "", false},
+ })
+}
+
+func TestAuthWithCRLF(t *testing.T) {
+ pub := getTestPublicKey(t)
+ rest2 := strings.Join(authWithOptions[3:], "\r\n")
+ rest3 := strings.Join(authWithOptions[6:], "\r\n")
+ testAuthorizedKeys(t, []byte(authWithCRLF), []authResult{
+ {pub, []string{`env="HOME=/home/root"`, "no-port-forwarding"}, "user@host", rest2, true},
+ {pub, []string{`env="HOME=/home/root2"`}, "user2@host2", rest3, true},
+ {nil, nil, "", "", false},
+ })
+}
+
+func TestAuthWithQuotedSpaceInEnv(t *testing.T) {
+ pub := getTestPublicKey(t)
+ testAuthorizedKeys(t, []byte(authWithQuotedSpaceInEnv), []authResult{
+ {pub, []string{`env="HOME=/home/root dir"`, "no-port-forwarding"}, "user@host", "", true},
+ })
+}
+
+func TestAuthWithQuotedCommaInEnv(t *testing.T) {
+ pub := getTestPublicKey(t)
+ testAuthorizedKeys(t, []byte(authWithQuotedCommaInEnv), []authResult{
+ {pub, []string{`env="HOME=/home/root,dir"`, "no-port-forwarding"}, "user@host", "", true},
+ })
+}
+
+func TestAuthWithQuotedQuoteInEnv(t *testing.T) {
+ pub := getTestPublicKey(t)
+ testAuthorizedKeys(t, []byte(authWithQuotedQuoteInEnv), []authResult{
+ {pub, []string{`env="HOME=/home/\"root dir"`, "no-port-forwarding"}, "user@host", "", true},
+ })
+
+ testAuthorizedKeys(t, []byte(authWithDoubleQuotedQuote), []authResult{
+ {pub, []string{"no-port-forwarding", `env="HOME=/home/ \"root dir\""`}, "user@host", "", true},
+ })
+
+}
+
+func TestAuthWithInvalidSpace(t *testing.T) {
+ testAuthorizedKeys(t, []byte(authWithInvalidSpace), []authResult{
+ {nil, nil, "", "", false},
+ })
+}
+
+func TestAuthWithMissingQuote(t *testing.T) {
+ pub := getTestPublicKey(t)
+ testAuthorizedKeys(t, []byte(authWithMissingQuote), []authResult{
+ {pub, []string{`env="HOME=/home/root"`, `shared-control`}, "user@host", "", true},
+ })
+}
+
+func TestInvalidEntry(t *testing.T) {
+ _, _, _, _, ok := ssh.ParseAuthorizedKey(authInvalid)
+ if ok {
+ t.Errorf("Expected invalid entry, returned valid entry")
+ }
+}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/test/session_test.go b/vendor/code.google.com/p/go.crypto/ssh/test/session_test.go
index 0b7892ba7..bd7307dd3 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/test/session_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/test/session_test.go
@@ -10,8 +10,7 @@ package test
import (
"bytes"
- "errors"
- "golang.org/x/crypto/ssh"
+ "code.google.com/p/go.crypto/ssh"
"io"
"strings"
"testing"
@@ -39,13 +38,12 @@ func TestHostKeyCheck(t *testing.T) {
defer server.Shutdown()
conf := clientConfig()
- hostDB := hostKeyDB()
- conf.HostKeyCallback = hostDB.Check
+ k := conf.HostKeyChecker.(*storedHostKey)
// change the keys.
- hostDB.keys[ssh.KeyAlgoRSA][25]++
- hostDB.keys[ssh.KeyAlgoDSA][25]++
- hostDB.keys[ssh.KeyAlgoECDSA256][25]++
+ k.keys[ssh.KeyAlgoRSA][25]++
+ k.keys[ssh.KeyAlgoDSA][25]++
+ k.keys[ssh.KeyAlgoECDSA256][25]++
conn, err := server.TryDial(conf)
if err == nil {
@@ -56,53 +54,6 @@ func TestHostKeyCheck(t *testing.T) {
}
}
-func TestRunCommandStdin(t *testing.T) {
- server := newServer(t)
- defer server.Shutdown()
- conn := server.Dial(clientConfig())
- defer conn.Close()
-
- session, err := conn.NewSession()
- if err != nil {
- t.Fatalf("session failed: %v", err)
- }
- defer session.Close()
-
- r, w := io.Pipe()
- defer r.Close()
- defer w.Close()
- session.Stdin = r
-
- err = session.Run("true")
- if err != nil {
- t.Fatalf("session failed: %v", err)
- }
-}
-
-func TestRunCommandStdinError(t *testing.T) {
- server := newServer(t)
- defer server.Shutdown()
- conn := server.Dial(clientConfig())
- defer conn.Close()
-
- session, err := conn.NewSession()
- if err != nil {
- t.Fatalf("session failed: %v", err)
- }
- defer session.Close()
-
- r, w := io.Pipe()
- defer r.Close()
- session.Stdin = r
- pipeErr := errors.New("closing write end of pipe")
- w.CloseWithError(pipeErr)
-
- err = session.Run("true")
- if err != pipeErr {
- t.Fatalf("expected %v, found %v", pipeErr, err)
- }
-}
-
func TestRunCommandFailed(t *testing.T) {
server := newServer(t)
defer server.Shutdown()
@@ -156,7 +107,7 @@ func TestFuncLargeRead(t *testing.T) {
t.Fatalf("unable to acquire stdout pipe: %s", err)
}
- err = session.Start("dd if=/dev/urandom bs=2048 count=1024")
+ err = session.Start("dd if=/dev/urandom bs=2048 count=1")
if err != nil {
t.Fatalf("unable to execute remote command: %s", err)
}
@@ -167,53 +118,11 @@ func TestFuncLargeRead(t *testing.T) {
t.Fatalf("error reading from remote stdout: %s", err)
}
- if n != 2048*1024 {
+ if n != 2048 {
t.Fatalf("Expected %d bytes but read only %d from remote command", 2048, n)
}
}
-func TestKeyChange(t *testing.T) {
- server := newServer(t)
- defer server.Shutdown()
- conf := clientConfig()
- hostDB := hostKeyDB()
- conf.HostKeyCallback = hostDB.Check
- conf.RekeyThreshold = 1024
- conn := server.Dial(conf)
- defer conn.Close()
-
- for i := 0; i < 4; i++ {
- session, err := conn.NewSession()
- if err != nil {
- t.Fatalf("unable to create new session: %s", err)
- }
-
- stdout, err := session.StdoutPipe()
- if err != nil {
- t.Fatalf("unable to acquire stdout pipe: %s", err)
- }
-
- err = session.Start("dd if=/dev/urandom bs=1024 count=1")
- if err != nil {
- t.Fatalf("unable to execute remote command: %s", err)
- }
- buf := new(bytes.Buffer)
- n, err := io.Copy(buf, stdout)
- if err != nil {
- t.Fatalf("error reading from remote stdout: %s", err)
- }
-
- want := int64(1024)
- if n != want {
- t.Fatalf("Expected %d bytes but read only %d from remote command", want, n)
- }
- }
-
- if changes := hostDB.checkCount; changes < 4 {
- t.Errorf("got %d key changes, want 4", changes)
- }
-}
-
func TestInvalidTerminalMode(t *testing.T) {
server := newServer(t)
defer server.Shutdown()
@@ -274,44 +183,3 @@ func TestValidTerminalMode(t *testing.T) {
t.Fatalf("terminal mode failure: expected -echo in stty output, got %s", sttyOutput)
}
}
-
-func TestCiphers(t *testing.T) {
- var config ssh.Config
- config.SetDefaults()
- cipherOrder := config.Ciphers
-
- for _, ciph := range cipherOrder {
- server := newServer(t)
- defer server.Shutdown()
- conf := clientConfig()
- conf.Ciphers = []string{ciph}
- // Don't fail if sshd doesnt have the cipher.
- conf.Ciphers = append(conf.Ciphers, cipherOrder...)
- conn, err := server.TryDial(conf)
- if err == nil {
- conn.Close()
- } else {
- t.Fatalf("failed for cipher %q", ciph)
- }
- }
-}
-
-func TestMACs(t *testing.T) {
- var config ssh.Config
- config.SetDefaults()
- macOrder := config.MACs
-
- for _, mac := range macOrder {
- server := newServer(t)
- defer server.Shutdown()
- conf := clientConfig()
- conf.MACs = []string{mac}
- // Don't fail if sshd doesnt have the MAC.
- conf.MACs = append(conf.MACs, macOrder...)
- if conn, err := server.TryDial(conf); err == nil {
- conn.Close()
- } else {
- t.Fatalf("failed for MAC %q", mac)
- }
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/test/tcpip_test.go b/vendor/code.google.com/p/go.crypto/ssh/test/tcpip_test.go
index a2eb9358d..ee06b60b6 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/test/tcpip_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/test/tcpip_test.go
@@ -9,38 +9,39 @@ package test
// direct-tcpip functional tests
import (
- "io"
"net"
+ "net/http"
"testing"
)
-func TestDial(t *testing.T) {
+func TestTCPIPHTTP(t *testing.T) {
+ // google.com will generate at least one redirect, possibly three
+ // depending on your location.
+ doTest(t, "http://google.com")
+}
+
+func TestTCPIPHTTPS(t *testing.T) {
+ doTest(t, "https://encrypted.google.com/")
+}
+
+func doTest(t *testing.T, url string) {
server := newServer(t)
defer server.Shutdown()
- sshConn := server.Dial(clientConfig())
- defer sshConn.Close()
-
- l, err := net.Listen("tcp", "127.0.0.1:0")
- if err != nil {
- t.Fatalf("Listen: %v", err)
- }
- defer l.Close()
-
- go func() {
- for {
- c, err := l.Accept()
- if err != nil {
- break
- }
-
- io.WriteString(c, c.RemoteAddr().String())
- c.Close()
- }
- }()
-
- conn, err := sshConn.Dial("tcp", l.Addr().String())
- if err != nil {
- t.Fatalf("Dial: %v", err)
- }
+ conn := server.Dial(clientConfig())
defer conn.Close()
+
+ tr := &http.Transport{
+ Dial: func(n, addr string) (net.Conn, error) {
+ return conn.Dial(n, addr)
+ },
+ }
+ client := &http.Client{
+ Transport: tr,
+ }
+ resp, err := client.Get(url)
+ if err != nil {
+ t.Fatalf("unable to proxy: %s", err)
+ }
+ // got a body without error
+ t.Log(resp)
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/test/test_unix_test.go b/vendor/code.google.com/p/go.crypto/ssh/test/test_unix_test.go
index f1fc50b2e..86df3f480 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/test/test_unix_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/test/test_unix_test.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build darwin dragonfly freebsd linux netbsd openbsd plan9
+// +build darwin freebsd linux netbsd openbsd plan9
package test
@@ -11,6 +11,7 @@ package test
import (
"bytes"
"fmt"
+ "io"
"io/ioutil"
"log"
"net"
@@ -21,15 +22,14 @@ import (
"testing"
"text/template"
- "golang.org/x/crypto/ssh"
- "golang.org/x/crypto/ssh/testdata"
+ "code.google.com/p/go.crypto/ssh"
)
const sshd_config = `
Protocol 2
-HostKey {{.Dir}}/id_rsa
-HostKey {{.Dir}}/id_dsa
-HostKey {{.Dir}}/id_ecdsa
+HostKey {{.Dir}}/ssh_host_rsa_key
+HostKey {{.Dir}}/ssh_host_dsa_key
+HostKey {{.Dir}}/ssh_host_ecdsa_key
Pidfile {{.Dir}}/sshd.pid
#UsePrivilegeSeparation no
KeyRegenerationInterval 3600
@@ -41,14 +41,41 @@ PermitRootLogin no
StrictModes no
RSAAuthentication yes
PubkeyAuthentication yes
-AuthorizedKeysFile {{.Dir}}/id_user.pub
-TrustedUserCAKeys {{.Dir}}/id_ecdsa.pub
+AuthorizedKeysFile {{.Dir}}/authorized_keys
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
`
-var configTmpl = template.Must(template.New("").Parse(sshd_config))
+var (
+ configTmpl template.Template
+ privateKey ssh.Signer
+ hostKeyRSA ssh.Signer
+ hostKeyECDSA ssh.Signer
+ hostKeyDSA ssh.Signer
+)
+
+func init() {
+ template.Must(configTmpl.Parse(sshd_config))
+
+ for n, k := range map[string]*ssh.Signer{
+ "ssh_host_ecdsa_key": &hostKeyECDSA,
+ "ssh_host_rsa_key": &hostKeyRSA,
+ "ssh_host_dsa_key": &hostKeyDSA,
+ } {
+ var err error
+ *k, err = ssh.ParsePrivateKey([]byte(keys[n]))
+ if err != nil {
+ panic(fmt.Sprintf("ParsePrivateKey(%q): %v", n, err))
+ }
+ }
+
+ var err error
+ privateKey, err = ssh.ParsePrivateKey([]byte(testClientPrivateKey))
+ if err != nil {
+ panic(fmt.Sprintf("ParsePrivateKey: %v", err))
+ }
+}
type server struct {
t *testing.T
@@ -80,44 +107,36 @@ func username() string {
type storedHostKey struct {
// keys map from an algorithm string to binary key data.
keys map[string][]byte
-
- // checkCount counts the Check calls. Used for testing
- // rekeying.
- checkCount int
}
func (k *storedHostKey) Add(key ssh.PublicKey) {
if k.keys == nil {
k.keys = map[string][]byte{}
}
- k.keys[key.Type()] = key.Marshal()
+ k.keys[key.PublicKeyAlgo()] = ssh.MarshalPublicKey(key)
}
-func (k *storedHostKey) Check(addr string, remote net.Addr, key ssh.PublicKey) error {
- k.checkCount++
- algo := key.Type()
-
- if k.keys == nil || bytes.Compare(key.Marshal(), k.keys[algo]) != 0 {
+func (k *storedHostKey) Check(addr string, remote net.Addr, algo string, key []byte) error {
+ if k.keys == nil || bytes.Compare(key, k.keys[algo]) != 0 {
return fmt.Errorf("host key mismatch. Got %q, want %q", key, k.keys[algo])
}
return nil
}
-func hostKeyDB() *storedHostKey {
- keyChecker := &storedHostKey{}
- keyChecker.Add(testPublicKeys["ecdsa"])
- keyChecker.Add(testPublicKeys["rsa"])
- keyChecker.Add(testPublicKeys["dsa"])
- return keyChecker
-}
-
func clientConfig() *ssh.ClientConfig {
+ keyChecker := storedHostKey{}
+ keyChecker.Add(hostKeyECDSA.PublicKey())
+ keyChecker.Add(hostKeyRSA.PublicKey())
+ keyChecker.Add(hostKeyDSA.PublicKey())
+
+ kc := new(keychain)
+ kc.keys = append(kc.keys, privateKey)
config := &ssh.ClientConfig{
User: username(),
- Auth: []ssh.AuthMethod{
- ssh.PublicKeys(testSigners["user"]),
+ Auth: []ssh.ClientAuth{
+ ssh.ClientAuthKeyring(kc),
},
- HostKeyCallback: hostKeyDB().Check,
+ HostKeyChecker: &keyChecker,
}
return config
}
@@ -152,7 +171,7 @@ func unixConnection() (*net.UnixConn, *net.UnixConn, error) {
return c1.(*net.UnixConn), c2.(*net.UnixConn), nil
}
-func (s *server) TryDial(config *ssh.ClientConfig) (*ssh.Client, error) {
+func (s *server) TryDial(config *ssh.ClientConfig) (*ssh.ClientConn, error) {
sshd, err := exec.LookPath("sshd")
if err != nil {
s.t.Skipf("skipping test: %v", err)
@@ -178,14 +197,10 @@ func (s *server) TryDial(config *ssh.ClientConfig) (*ssh.Client, error) {
s.t.Fatalf("s.cmd.Start: %v", err)
}
s.clientConn = c1
- conn, chans, reqs, err := ssh.NewClientConn(c1, "", config)
- if err != nil {
- return nil, err
- }
- return ssh.NewClient(conn, chans, reqs), nil
+ return ssh.Client(c1, config)
}
-func (s *server) Dial(config *ssh.ClientConfig) *ssh.Client {
+func (s *server) Dial(config *ssh.ClientConfig) *ssh.ClientConn {
conn, err := s.TryDial(config)
if err != nil {
s.t.Fail()
@@ -211,22 +226,8 @@ func (s *server) Shutdown() {
s.cleanup()
}
-func writeFile(path string, contents []byte) {
- f, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0600)
- if err != nil {
- panic(err)
- }
- defer f.Close()
- if _, err := f.Write(contents); err != nil {
- panic(err)
- }
-}
-
// newServer returns a new mock ssh server.
func newServer(t *testing.T) *server {
- if testing.Short() {
- t.Skip("skipping test due to -short")
- }
dir, err := ioutil.TempDir("", "sshtest")
if err != nil {
t.Fatal(err)
@@ -243,10 +244,15 @@ func newServer(t *testing.T) *server {
}
f.Close()
- for k, v := range testdata.PEMBytes {
- filename := "id_" + k
- writeFile(filepath.Join(dir, filename), v)
- writeFile(filepath.Join(dir, filename+".pub"), ssh.MarshalAuthorizedKey(testPublicKeys[k]))
+ for k, v := range keys {
+ f, err := os.OpenFile(filepath.Join(dir, k), os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0600)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := f.Write([]byte(v)); err != nil {
+ t.Fatal(err)
+ }
+ f.Close()
}
return &server{
@@ -259,3 +265,32 @@ func newServer(t *testing.T) *server {
},
}
}
+
+// keychain implements the ClientKeyring interface.
+type keychain struct {
+ keys []ssh.Signer
+}
+
+func (k *keychain) Key(i int) (ssh.PublicKey, error) {
+ if i < 0 || i >= len(k.keys) {
+ return nil, nil
+ }
+ return k.keys[i].PublicKey(), nil
+}
+
+func (k *keychain) Sign(i int, rand io.Reader, data []byte) (sig []byte, err error) {
+ return k.keys[i].Sign(rand, data)
+}
+
+func (k *keychain) loadPEM(file string) error {
+ buf, err := ioutil.ReadFile(file)
+ if err != nil {
+ return err
+ }
+ key, err := ssh.ParsePrivateKey(buf)
+ if err != nil {
+ return err
+ }
+ k.keys = append(k.keys, key)
+ return nil
+}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/test/testdata_test.go b/vendor/code.google.com/p/go.crypto/ssh/test/testdata_test.go
deleted file mode 100644
index ae48c7516..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/test/testdata_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// IMPLEMENTOR NOTE: To avoid a package loop, this file is in three places:
-// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three
-// instances.
-
-package test
-
-import (
- "crypto/rand"
- "fmt"
-
- "golang.org/x/crypto/ssh"
- "golang.org/x/crypto/ssh/testdata"
-)
-
-var (
- testPrivateKeys map[string]interface{}
- testSigners map[string]ssh.Signer
- testPublicKeys map[string]ssh.PublicKey
-)
-
-func init() {
- var err error
-
- n := len(testdata.PEMBytes)
- testPrivateKeys = make(map[string]interface{}, n)
- testSigners = make(map[string]ssh.Signer, n)
- testPublicKeys = make(map[string]ssh.PublicKey, n)
- for t, k := range testdata.PEMBytes {
- testPrivateKeys[t], err = ssh.ParseRawPrivateKey(k)
- if err != nil {
- panic(fmt.Sprintf("Unable to parse test key %s: %v", t, err))
- }
- testSigners[t], err = ssh.NewSignerFromKey(testPrivateKeys[t])
- if err != nil {
- panic(fmt.Sprintf("Unable to create signer for test key %s: %v", t, err))
- }
- testPublicKeys[t] = testSigners[t].PublicKey()
- }
-
- // Create a cert and sign it for use in tests.
- testCert := &ssh.Certificate{
- Nonce: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
- ValidPrincipals: []string{"gopher1", "gopher2"}, // increases test coverage
- ValidAfter: 0, // unix epoch
- ValidBefore: ssh.CertTimeInfinity, // The end of currently representable time.
- Reserved: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
- Key: testPublicKeys["ecdsa"],
- SignatureKey: testPublicKeys["rsa"],
- Permissions: ssh.Permissions{
- CriticalOptions: map[string]string{},
- Extensions: map[string]string{},
- },
- }
- testCert.SignCert(rand.Reader, testSigners["rsa"])
- testPrivateKeys["cert"] = testPrivateKeys["ecdsa"]
- testSigners["cert"], err = ssh.NewCertSigner(testCert, testSigners["ecdsa"])
- if err != nil {
- panic(fmt.Sprintf("Unable to create certificate signer: %v", err))
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/testdata/doc.go b/vendor/code.google.com/p/go.crypto/ssh/testdata/doc.go
deleted file mode 100644
index 430248698..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/testdata/doc.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This package contains test data shared between the various subpackages of
-// the code.google.com/p/go.crypto/ssh package. Under no circumstance should
-// this data be used for production code.
-package testdata
diff --git a/vendor/code.google.com/p/go.crypto/ssh/testdata/keys.go b/vendor/code.google.com/p/go.crypto/ssh/testdata/keys.go
deleted file mode 100644
index 5ff1c0e03..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/testdata/keys.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testdata
-
-var PEMBytes = map[string][]byte{
- "dsa": []byte(`-----BEGIN DSA PRIVATE KEY-----
-MIIBuwIBAAKBgQD6PDSEyXiI9jfNs97WuM46MSDCYlOqWw80ajN16AohtBncs1YB
-lHk//dQOvCYOsYaE+gNix2jtoRjwXhDsc25/IqQbU1ahb7mB8/rsaILRGIbA5WH3
-EgFtJmXFovDz3if6F6TzvhFpHgJRmLYVR8cqsezL3hEZOvvs2iH7MorkxwIVAJHD
-nD82+lxh2fb4PMsIiaXudAsBAoGAQRf7Q/iaPRn43ZquUhd6WwvirqUj+tkIu6eV
-2nZWYmXLlqFQKEy4Tejl7Wkyzr2OSYvbXLzo7TNxLKoWor6ips0phYPPMyXld14r
-juhT24CrhOzuLMhDduMDi032wDIZG4Y+K7ElU8Oufn8Sj5Wge8r6ANmmVgmFfynr
-FhdYCngCgYEA3ucGJ93/Mx4q4eKRDxcWD3QzWyqpbRVRRV1Vmih9Ha/qC994nJFz
-DQIdjxDIT2Rk2AGzMqFEB68Zc3O+Wcsmz5eWWzEwFxaTwOGWTyDqsDRLm3fD+QYj
-nOwuxb0Kce+gWI8voWcqC9cyRm09jGzu2Ab3Bhtpg8JJ8L7gS3MRZK4CFEx4UAfY
-Fmsr0W6fHB9nhS4/UXM8
------END DSA PRIVATE KEY-----
-`),
- "ecdsa": []byte(`-----BEGIN EC PRIVATE KEY-----
-MHcCAQEEINGWx0zo6fhJ/0EAfrPzVFyFC9s18lBt3cRoEDhS3ARooAoGCCqGSM49
-AwEHoUQDQgAEi9Hdw6KvZcWxfg2IDhA7UkpDtzzt6ZqJXSsFdLd+Kx4S3Sx4cVO+
-6/ZOXRnPmNAlLUqjShUsUBBngG0u2fqEqA==
------END EC PRIVATE KEY-----
-`),
- "rsa": []byte(`-----BEGIN RSA PRIVATE KEY-----
-MIIBOwIBAAJBALdGZxkXDAjsYk10ihwU6Id2KeILz1TAJuoq4tOgDWxEEGeTrcld
-r/ZwVaFzjWzxaf6zQIJbfaSEAhqD5yo72+sCAwEAAQJBAK8PEVU23Wj8mV0QjwcJ
-tZ4GcTUYQL7cF4+ezTCE9a1NrGnCP2RuQkHEKxuTVrxXt+6OF15/1/fuXnxKjmJC
-nxkCIQDaXvPPBi0c7vAxGwNY9726x01/dNbHCE0CBtcotobxpwIhANbbQbh3JHVW
-2haQh4fAG5mhesZKAGcxTyv4mQ7uMSQdAiAj+4dzMpJWdSzQ+qGHlHMIBvVHLkqB
-y2VdEyF7DPCZewIhAI7GOI/6LDIFOvtPo6Bj2nNmyQ1HU6k/LRtNIXi4c9NJAiAr
-rrxx26itVhJmcvoUhOjwuzSlP2bE5VHAvkGB352YBg==
------END RSA PRIVATE KEY-----
-`),
- "user": []byte(`-----BEGIN EC PRIVATE KEY-----
-MHcCAQEEILYCAeq8f7V4vSSypRw7pxy8yz3V5W4qg8kSC3zJhqpQoAoGCCqGSM49
-AwEHoUQDQgAEYcO2xNKiRUYOLEHM7VYAp57HNyKbOdYtHD83Z4hzNPVC4tM5mdGD
-PLL8IEwvYu2wq+lpXfGQnNMbzYf9gspG0w==
------END EC PRIVATE KEY-----
-`),
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/testdata_test.go b/vendor/code.google.com/p/go.crypto/ssh/testdata_test.go
deleted file mode 100644
index f2828c1b5..000000000
--- a/vendor/code.google.com/p/go.crypto/ssh/testdata_test.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// IMPLEMENTOR NOTE: To avoid a package loop, this file is in three places:
-// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three
-// instances.
-
-package ssh
-
-import (
- "crypto/rand"
- "fmt"
-
- "golang.org/x/crypto/ssh/testdata"
-)
-
-var (
- testPrivateKeys map[string]interface{}
- testSigners map[string]Signer
- testPublicKeys map[string]PublicKey
-)
-
-func init() {
- var err error
-
- n := len(testdata.PEMBytes)
- testPrivateKeys = make(map[string]interface{}, n)
- testSigners = make(map[string]Signer, n)
- testPublicKeys = make(map[string]PublicKey, n)
- for t, k := range testdata.PEMBytes {
- testPrivateKeys[t], err = ParseRawPrivateKey(k)
- if err != nil {
- panic(fmt.Sprintf("Unable to parse test key %s: %v", t, err))
- }
- testSigners[t], err = NewSignerFromKey(testPrivateKeys[t])
- if err != nil {
- panic(fmt.Sprintf("Unable to create signer for test key %s: %v", t, err))
- }
- testPublicKeys[t] = testSigners[t].PublicKey()
- }
-
- // Create a cert and sign it for use in tests.
- testCert := &Certificate{
- Nonce: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
- ValidPrincipals: []string{"gopher1", "gopher2"}, // increases test coverage
- ValidAfter: 0, // unix epoch
- ValidBefore: CertTimeInfinity, // The end of currently representable time.
- Reserved: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
- Key: testPublicKeys["ecdsa"],
- SignatureKey: testPublicKeys["rsa"],
- Permissions: Permissions{
- CriticalOptions: map[string]string{},
- Extensions: map[string]string{},
- },
- }
- testCert.SignCert(rand.Reader, testSigners["rsa"])
- testPrivateKeys["cert"] = testPrivateKeys["ecdsa"]
- testSigners["cert"], err = NewCertSigner(testCert, testSigners["ecdsa"])
- if err != nil {
- panic(fmt.Sprintf("Unable to create certificate signer: %v", err))
- }
-}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/transport.go b/vendor/code.google.com/p/go.crypto/ssh/transport.go
index 4f68b0473..46fa26268 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/transport.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/transport.go
@@ -6,12 +6,26 @@ package ssh
import (
"bufio"
+ "crypto/cipher"
+ "crypto/subtle"
+ "encoding/binary"
"errors"
+ "hash"
"io"
+ "net"
+ "sync"
)
const (
- gcmCipherID = "aes128-gcm@openssh.com"
+ packetSizeMultiple = 16 // TODO(huin) this should be determined by the cipher.
+
+ // RFC 4253 section 6.1 defines a minimum packet size of 32768 that implementations
+ // MUST be able to process (plus a few more kilobytes for padding and mac). The RFC
+ // indicates implementations SHOULD be able to handle larger packet sizes, but then
+ // waffles on about reasonable limits.
+ //
+ // OpenSSH caps their maxPacket at 256kb so we choose to do the same.
+ maxPacket = 256 * 1024
)
// packetConn represents a transport that implements packet based
@@ -27,128 +41,225 @@ type packetConn interface {
Close() error
}
-// transport is the keyingTransport that implements the SSH packet
-// protocol.
+// transport represents the SSH connection to the remote peer.
type transport struct {
- reader connectionState
- writer connectionState
+ reader
+ writer
- bufReader *bufio.Reader
- bufWriter *bufio.Writer
- rand io.Reader
-
- io.Closer
+ net.Conn
// Initial H used for the session ID. Once assigned this does
// not change, even during subsequent key exchanges.
sessionID []byte
}
-func (t *transport) getSessionID() []byte {
- if t.sessionID == nil {
- panic("session ID not set yet")
- }
- s := make([]byte, len(t.sessionID))
- copy(s, t.sessionID)
- return s
+// reader represents the incoming connection state.
+type reader struct {
+ io.Reader
+ common
}
-// packetCipher represents a combination of SSH encryption/MAC
-// protocol. A single instance should be used for one direction only.
-type packetCipher interface {
- // writePacket encrypts the packet and writes it to w. The
- // contents of the packet are generally scrambled.
- writePacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error
-
- // readPacket reads and decrypts a packet of data. The
- // returned packet may be overwritten by future calls of
- // readPacket.
- readPacket(seqnum uint32, r io.Reader) ([]byte, error)
-}
-
-// connectionState represents one side (read or write) of the
-// connection. This is necessary because each direction has its own
-// keys, and can even have its own algorithms
-type connectionState struct {
- packetCipher
- seqNum uint32
- dir direction
- pendingKeyChange chan packetCipher
+// writer represents the outgoing connection state.
+type writer struct {
+ sync.Mutex // protects writer.Writer from concurrent writes
+ *bufio.Writer
+ rand io.Reader
+ common
}
// prepareKeyChange sets up key material for a keychange. The key changes in
// both directions are triggered by reading and writing a msgNewKey packet
// respectively.
func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error {
+ t.writer.cipherAlgo = algs.wCipher
+ t.writer.macAlgo = algs.wMAC
+ t.writer.compressionAlgo = algs.wCompression
+
+ t.reader.cipherAlgo = algs.rCipher
+ t.reader.macAlgo = algs.rMAC
+ t.reader.compressionAlgo = algs.rCompression
+
if t.sessionID == nil {
t.sessionID = kexResult.H
}
kexResult.SessionID = t.sessionID
-
- if ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult); err != nil {
- return err
- } else {
- t.reader.pendingKeyChange <- ciph
- }
-
- if ciph, err := newPacketCipher(t.writer.dir, algs.w, kexResult); err != nil {
- return err
- } else {
- t.writer.pendingKeyChange <- ciph
- }
-
+ t.reader.pendingKeyChange <- kexResult
+ t.writer.pendingKeyChange <- kexResult
return nil
}
-// Read and decrypt next packet.
-func (t *transport) readPacket() ([]byte, error) {
- return t.reader.readPacket(t.bufReader)
+// common represents the cipher state needed to process messages in a single
+// direction.
+type common struct {
+ seqNum uint32
+ mac hash.Hash
+ cipher cipher.Stream
+
+ cipherAlgo string
+ macAlgo string
+ compressionAlgo string
+
+ dir direction
+ pendingKeyChange chan *kexResult
}
-func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) {
- packet, err := s.packetCipher.readPacket(s.seqNum, r)
- s.seqNum++
- if err == nil && len(packet) == 0 {
- err = errors.New("ssh: zero length packet")
+// Read and decrypt a single packet from the remote peer.
+func (r *reader) readPacket() ([]byte, error) {
+ var lengthBytes = make([]byte, 5)
+ var macSize uint32
+ if _, err := io.ReadFull(r, lengthBytes); err != nil {
+ return nil, err
}
+ r.cipher.XORKeyStream(lengthBytes, lengthBytes)
+
+ if r.mac != nil {
+ r.mac.Reset()
+ seqNumBytes := []byte{
+ byte(r.seqNum >> 24),
+ byte(r.seqNum >> 16),
+ byte(r.seqNum >> 8),
+ byte(r.seqNum),
+ }
+ r.mac.Write(seqNumBytes)
+ r.mac.Write(lengthBytes)
+ macSize = uint32(r.mac.Size())
+ }
+
+ length := binary.BigEndian.Uint32(lengthBytes[0:4])
+ paddingLength := uint32(lengthBytes[4])
+
+ if length <= paddingLength+1 {
+ return nil, errors.New("ssh: invalid packet length, packet too small")
+ }
+
+ if length > maxPacket {
+ return nil, errors.New("ssh: invalid packet length, packet too large")
+ }
+
+ packet := make([]byte, length-1+macSize)
+ if _, err := io.ReadFull(r, packet); err != nil {
+ return nil, err
+ }
+ mac := packet[length-1:]
+ r.cipher.XORKeyStream(packet, packet[:length-1])
+
+ if r.mac != nil {
+ r.mac.Write(packet[:length-1])
+ if subtle.ConstantTimeCompare(r.mac.Sum(nil), mac) != 1 {
+ return nil, errors.New("ssh: MAC failure")
+ }
+ }
+
+ r.seqNum++
+ packet = packet[:length-paddingLength-1]
+
if len(packet) > 0 && packet[0] == msgNewKeys {
select {
- case cipher := <-s.pendingKeyChange:
- s.packetCipher = cipher
+ case k := <-r.pendingKeyChange:
+ if err := r.setupKeys(r.dir, k); err != nil {
+ return nil, err
+ }
default:
return nil, errors.New("ssh: got bogus newkeys message.")
}
}
-
- // The packet may point to an internal buffer, so copy the
- // packet out here.
- fresh := make([]byte, len(packet))
- copy(fresh, packet)
-
- return fresh, err
+ return packet, nil
}
-func (t *transport) writePacket(packet []byte) error {
- return t.writer.writePacket(t.bufWriter, t.rand, packet)
+// Read and decrypt next packet discarding debug and noop messages.
+func (t *transport) readPacket() ([]byte, error) {
+ for {
+ packet, err := t.reader.readPacket()
+ if err != nil {
+ return nil, err
+ }
+ if len(packet) == 0 {
+ return nil, errors.New("ssh: zero length packet")
+ }
+
+ if packet[0] != msgIgnore && packet[0] != msgDebug {
+ return packet, nil
+ }
+ }
+ panic("unreachable")
}
-func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error {
+// Encrypt and send a packet of data to the remote peer.
+func (w *writer) writePacket(packet []byte) error {
changeKeys := len(packet) > 0 && packet[0] == msgNewKeys
- err := s.packetCipher.writePacket(s.seqNum, w, rand, packet)
+ if len(packet) > maxPacket {
+ return errors.New("ssh: packet too large")
+ }
+ w.Mutex.Lock()
+ defer w.Mutex.Unlock()
+
+ paddingLength := packetSizeMultiple - (5+len(packet))%packetSizeMultiple
+ if paddingLength < 4 {
+ paddingLength += packetSizeMultiple
+ }
+
+ length := len(packet) + 1 + paddingLength
+ lengthBytes := []byte{
+ byte(length >> 24),
+ byte(length >> 16),
+ byte(length >> 8),
+ byte(length),
+ byte(paddingLength),
+ }
+ padding := make([]byte, paddingLength)
+ _, err := io.ReadFull(w.rand, padding)
if err != nil {
return err
}
+
+ if w.mac != nil {
+ w.mac.Reset()
+ seqNumBytes := []byte{
+ byte(w.seqNum >> 24),
+ byte(w.seqNum >> 16),
+ byte(w.seqNum >> 8),
+ byte(w.seqNum),
+ }
+ w.mac.Write(seqNumBytes)
+ w.mac.Write(lengthBytes)
+ w.mac.Write(packet)
+ w.mac.Write(padding)
+ }
+
+ // TODO(dfc) lengthBytes, packet and padding should be
+ // subslices of a single buffer
+ w.cipher.XORKeyStream(lengthBytes, lengthBytes)
+ w.cipher.XORKeyStream(packet, packet)
+ w.cipher.XORKeyStream(padding, padding)
+
+ if _, err := w.Write(lengthBytes); err != nil {
+ return err
+ }
+ if _, err := w.Write(packet); err != nil {
+ return err
+ }
+ if _, err := w.Write(padding); err != nil {
+ return err
+ }
+
+ if w.mac != nil {
+ if _, err := w.Write(w.mac.Sum(nil)); err != nil {
+ return err
+ }
+ }
+
+ w.seqNum++
if err = w.Flush(); err != nil {
return err
}
- s.seqNum++
+
if changeKeys {
select {
- case cipher := <-s.pendingKeyChange:
- s.packetCipher = cipher
+ case k := <-w.pendingKeyChange:
+ err = w.setupKeys(w.dir, k)
default:
panic("ssh: no key material for msgNewKeys")
}
@@ -156,20 +267,24 @@ func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []
return err
}
-func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transport {
+func newTransport(conn net.Conn, rand io.Reader, isClient bool) *transport {
t := &transport{
- bufReader: bufio.NewReader(rwc),
- bufWriter: bufio.NewWriter(rwc),
- rand: rand,
- reader: connectionState{
- packetCipher: &streamPacketCipher{cipher: noneCipher{}},
- pendingKeyChange: make(chan packetCipher, 1),
+ reader: reader{
+ Reader: bufio.NewReader(conn),
+ common: common{
+ cipher: noneCipher{},
+ pendingKeyChange: make(chan *kexResult, 1),
+ },
},
- writer: connectionState{
- packetCipher: &streamPacketCipher{cipher: noneCipher{}},
- pendingKeyChange: make(chan packetCipher, 1),
+ writer: writer{
+ Writer: bufio.NewWriter(conn),
+ rand: rand,
+ common: common{
+ cipher: noneCipher{},
+ pendingKeyChange: make(chan *kexResult, 1),
+ },
},
- Closer: rwc,
+ Conn: conn,
}
if isClient {
t.reader.dir = serverKeys
@@ -188,64 +303,48 @@ type direction struct {
macKeyTag []byte
}
+// TODO(dfc) can this be made a constant ?
var (
serverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}}
clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}}
)
-// generateKeys generates key material for IV, MAC and encryption.
-func generateKeys(d direction, algs directionAlgorithms, kex *kexResult) (iv, key, macKey []byte) {
- cipherMode := cipherModes[algs.Cipher]
- macMode := macModes[algs.MAC]
-
- iv = make([]byte, cipherMode.ivSize)
- key = make([]byte, cipherMode.keySize)
- macKey = make([]byte, macMode.keySize)
-
- generateKeyMaterial(iv, d.ivTag, kex)
- generateKeyMaterial(key, d.keyTag, kex)
- generateKeyMaterial(macKey, d.macKeyTag, kex)
- return
-}
-
// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as
// described in RFC 4253, section 6.4. direction should either be serverKeys
// (to setup server->client keys) or clientKeys (for client->server keys).
-func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) {
- iv, key, macKey := generateKeys(d, algs, kex)
+func (c *common) setupKeys(d direction, r *kexResult) error {
+ cipherMode := cipherModes[c.cipherAlgo]
+ macMode := macModes[c.macAlgo]
- if algs.Cipher == gcmCipherID {
- return newGCMCipher(iv, key, macKey)
- }
+ iv := make([]byte, cipherMode.ivSize)
+ key := make([]byte, cipherMode.keySize)
+ macKey := make([]byte, macMode.keySize)
- c := &streamPacketCipher{
- mac: macModes[algs.MAC].new(macKey),
- }
- c.macResult = make([]byte, c.mac.Size())
+ h := r.Hash.New()
+ generateKeyMaterial(iv, d.ivTag, r.K, r.H, r.SessionID, h)
+ generateKeyMaterial(key, d.keyTag, r.K, r.H, r.SessionID, h)
+ generateKeyMaterial(macKey, d.macKeyTag, r.K, r.H, r.SessionID, h)
+
+ c.mac = macMode.new(macKey)
var err error
- c.cipher, err = cipherModes[algs.Cipher].createStream(key, iv)
- if err != nil {
- return nil, err
- }
-
- return c, nil
+ c.cipher, err = cipherMode.createCipher(key, iv)
+ return err
}
// generateKeyMaterial fills out with key material generated from tag, K, H
// and sessionId, as specified in RFC 4253, section 7.2.
-func generateKeyMaterial(out, tag []byte, r *kexResult) {
+func generateKeyMaterial(out, tag []byte, K, H, sessionId []byte, h hash.Hash) {
var digestsSoFar []byte
- h := r.Hash.New()
for len(out) > 0 {
h.Reset()
- h.Write(r.K)
- h.Write(r.H)
+ h.Write(K)
+ h.Write(H)
if len(digestsSoFar) == 0 {
h.Write(tag)
- h.Write(r.SessionID)
+ h.Write(sessionId)
} else {
h.Write(digestsSoFar)
}
diff --git a/vendor/code.google.com/p/go.crypto/ssh/transport_test.go b/vendor/code.google.com/p/go.crypto/ssh/transport_test.go
index 92d83abf9..332011460 100644
--- a/vendor/code.google.com/p/go.crypto/ssh/transport_test.go
+++ b/vendor/code.google.com/p/go.crypto/ssh/transport_test.go
@@ -6,8 +6,6 @@ package ssh
import (
"bytes"
- "crypto/rand"
- "encoding/binary"
"strings"
"testing"
)
@@ -69,41 +67,3 @@ func TestExchangeVersions(t *testing.T) {
}
}
}
-
-type closerBuffer struct {
- bytes.Buffer
-}
-
-func (b *closerBuffer) Close() error {
- return nil
-}
-
-func TestTransportMaxPacketWrite(t *testing.T) {
- buf := &closerBuffer{}
- tr := newTransport(buf, rand.Reader, true)
- huge := make([]byte, maxPacket+1)
- err := tr.writePacket(huge)
- if err == nil {
- t.Errorf("transport accepted write for a huge packet.")
- }
-}
-
-func TestTransportMaxPacketReader(t *testing.T) {
- var header [5]byte
- huge := make([]byte, maxPacket+128)
- binary.BigEndian.PutUint32(header[0:], uint32(len(huge)))
- // padding.
- header[4] = 0
-
- buf := &closerBuffer{}
- buf.Write(header[:])
- buf.Write(huge)
-
- tr := newTransport(buf, rand.Reader, true)
- _, err := tr.readPacket()
- if err == nil {
- t.Errorf("transport succeeded reading huge packet.")
- } else if !strings.Contains(err.Error(), "large") {
- t.Errorf("got %q, should mention %q", err.Error(), "large")
- }
-}
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/.gitignore b/vendor/github.com/Bugagazavr/go-gitlab-client/.gitignore
deleted file mode 100644
index c444d00ec..000000000
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.DS_Store
-.idea
-examples/config.json
\ No newline at end of file
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/.travis.yml b/vendor/github.com/Bugagazavr/go-gitlab-client/.travis.yml
deleted file mode 100644
index a8de6ec6e..000000000
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/.travis.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-language: go
-go:
- - 1.4
-
-script:
- - make deps test
\ No newline at end of file
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/gitlab_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/gitlab_test.go
index 654e39dc1..f4088e457 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/gitlab_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/gitlab_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/hook_payload_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/hook_payload_test.go
index a85e21375..483d1bbae 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/hook_payload_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/hook_payload_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"io/ioutil"
"testing"
)
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/hooks_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/hooks_test.go
index 0b9f79b6e..18ae7fc1f 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/hooks_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/hooks_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/projects_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/projects_test.go
index 6fcbda844..b1230dedf 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/projects_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/projects_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/public_keys_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/public_keys_test.go
index 03ded77cb..d3be64a1f 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/public_keys_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/public_keys_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/repositories_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/repositories_test.go
index 36a4d7bda..d55ffd0dc 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/repositories_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/repositories_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/session_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/session_test.go
index 05cd272df..28665563b 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/session_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/session_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/users_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/users_test.go
index ef1cefbf7..0102697a5 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/users_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/users_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/github.com/Bugagazavr/go-gitlab-client/util_test.go b/vendor/github.com/Bugagazavr/go-gitlab-client/util_test.go
index ea46535c7..fdaed9cd3 100644
--- a/vendor/github.com/Bugagazavr/go-gitlab-client/util_test.go
+++ b/vendor/github.com/Bugagazavr/go-gitlab-client/util_test.go
@@ -1,7 +1,7 @@
package gogitlab
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/github.com/BurntSushi/migration/Makefile b/vendor/github.com/BurntSushi/migration/Makefile
deleted file mode 100644
index ca043d9be..000000000
--- a/vendor/github.com/BurntSushi/migration/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-build:
- go build
-
-push:
- git push origin master
- git push github master
-
diff --git a/vendor/github.com/BurntSushi/migration/README.md b/vendor/github.com/BurntSushi/migration/README.md
deleted file mode 100644
index 18c224e39..000000000
--- a/vendor/github.com/BurntSushi/migration/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-Package migration for Golang automatically handles versioning of a database
-schema by applying a series of migrations supplied by the client. It uses
-features only from the database/sql package, so it tries to be driver
-independent. However, to track the version of the database, it is necessary to
-execute some SQL. I've made an effort to keep those queries simple, but if they
-don't work with your database, you may override them.
-
-This package works by applying a series of migrations to a database. Once a
-migration is created, it should never be changed. Every time a database is
-opened with this package, all necessary migrations are executed in a single
-transaction. If any part of the process fails, an error is returned and the
-transaction is rolled back so that the database is left untouched. (Note that
-for this to be useful, you'll need to use a database that supports rolling back
-changes to your schema. Notably, MySQL does not support this, although SQLite
-and PostgreSQL do.)
-
-The version of a database is defined as the number of migrations applied to it.
-
-
-### Installation
-
-If you have Go installed and
-[your GOPATH is setup](http://golang.org/doc/code.html#GOPATH), then
-`migration` can be installed with `go get`:
-
- go get github.com/BurntSushi/migration
-
-
-### Documentation
-
-Documentation is available at
-[godoc.org/github.com/BurntSushi/migration](http://godoc.org/github.com/BurntSushi/migration).
-
-
-### Unstable
-
-At the moment, I'm still experimenting with the public API, so I may still
-introduce breaking changes. In general though, I am happy with the overall
-architecture.
-
diff --git a/vendor/github.com/BurntSushi/migration/UNLICENSE b/vendor/github.com/BurntSushi/migration/UNLICENSE
deleted file mode 100644
index 68a49daad..000000000
--- a/vendor/github.com/BurntSushi/migration/UNLICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-This is free and unencumbered software released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-For more information, please refer to
diff --git a/vendor/github.com/BurntSushi/migration/doc.go b/vendor/github.com/BurntSushi/migration/doc.go
deleted file mode 100644
index 1a07c2fff..000000000
--- a/vendor/github.com/BurntSushi/migration/doc.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-Package migration automatically handles versioning of a database
-schema by applying a series of migrations supplied by the client. It uses
-features only from the database/sql package, so it tries to be driver
-independent. However, to track the version of the database, it is necessary to
-execute some SQL. I've made an effort to keep those queries simple, but if they
-don't work with your database, you may override them.
-
-This package works by applying a series of migrations to a database. Once a
-migration is created, it should never be changed. Every time a database is
-opened with this package, all necessary migrations are executed in a single
-transaction. If any part of the process fails, an error is returned and the
-transaction is rolled back so that the database is left untouched. (Note that
-for this to be useful, you'll need to use a database that supports rolling back
-changes to your schema. Notably, MySQL does not support this, although SQLite
-and PostgreSQL do.)
-
-The version of a database is defined as the number of migrations applied to it.
-*/
-package migration
diff --git a/vendor/github.com/BurntSushi/migration/migration.go b/vendor/github.com/BurntSushi/migration/migration.go
deleted file mode 100644
index 9713ca7c8..000000000
--- a/vendor/github.com/BurntSushi/migration/migration.go
+++ /dev/null
@@ -1,237 +0,0 @@
-package migration
-
-import (
- "database/sql"
- "fmt"
-)
-
-var ef = fmt.Errorf
-
-// LimitedTx specifies the behavior of a transaction *without* commit and
-// rollback functions. Values with this type are given to client functions.
-// In particular, the migration routines in this package
-// handle transaction commits and rollbacks. Therefore the functions provided
-// by the client should not use them.
-type LimitedTx interface {
- Exec(query string, args ...interface{}) (sql.Result, error)
- Prepare(query string) (*sql.Stmt, error)
- Query(query string, args ...interface{}) (*sql.Rows, error)
- QueryRow(query string, args ...interface{}) *sql.Row
- Stmt(stmt *sql.Stmt) *sql.Stmt
-}
-
-// GetVersion is any function that can retrieve the migration version of a
-// particular database. It is exposed in case a client wants to override the
-// default behavior of this package. (For example, by using the `user_version`
-// PRAGMA in SQLite.)
-//
-// The DefaultGetVersion function provided with this package creates its own
-// table with a single column and a single row.
-//
-// The version returned should be equivalent to the number of migrations
-// applied to this database. It should be 0 if no migrations have been applied
-// yet.
-//
-// If an error is returned, the migration automatically fails.
-//
-// Note that a LimitedTx is used to emphasize that functions with this type
-// MUST NOT call Commit or Rollback. The migration routine in this pacakge will
-// do it for you.
-type GetVersion func(LimitedTx) (int, error)
-
-// The default way to get the version from a database. If the database has
-// had no migrations performed, then it creates a table with a single row and
-// a single column storing the version as 0. It then returns 0.
-//
-// If the table exists, then the version stored in the table is returned.
-var DefaultGetVersion GetVersion = defaultGetVersion
-
-// SetVersion is the dual of GetVersion. It allows the client to define a
-// different mechanism for setting the database version than the one used by
-// DefaultSetVersion in this package.
-//
-// If an error is returned, the migration that tried to set the version
-// automatically fails.
-//
-// Note that a LimitedTx is used to emphasize that functions with this type
-// MUST NOT call Commit or Rollback. The migration routine in this pacakge will
-// do it for you.
-type SetVersion func(LimitedTx, int) error
-
-// The default way to set the version of the database. If the database has had
-// no migrations performed, then it creates a table with a single row and a
-// single column and storing the version given there.
-//
-// If the table exists, then the existing version is overwritten.
-var DefaultSetVersion SetVersion = defaultSetVersion
-
-// Migrator corresponds to a function that updates the database by one version.
-// Note that a migration should NOT call Rollback or Commit. Instead, this
-// package will call Rollback for you if your migration returns an error. If
-// no error is returned, then the next migration is applied. When all
-// migrations have been applied, the version is updated and the changes are
-// committed to the database.
-type Migrator func(LimitedTx) error
-
-// Open wraps the Open function from the database/sql package, but performs
-// a series of migrations on a database if they haven't been performed already.
-//
-// Migrations are tracked by a simple versioning scheme. The version of the
-// database is the number of migrations that have been performed on it.
-// Similarly, the version of your library is the number of migrations that are
-// given to this function.
-//
-// If Open returns successfully, then the database and your library will have
-// the same versions. If there was a problem migrating---or if the database
-// version is greater than your library version---then an error is returned.
-// Since all migrations are performed in a single transaction, if an error
-// occurs, no changes are made to the database. (Assuming you're using a
-// relational database that allows modifications to a schema to be rolled back.)
-//
-// Note that this versioning scheme includes no semantic analysis. It is up to
-// client to ensure that once a migration is defined, it never changes.
-//
-// The details of how the version is stored are opaque to the client, but in
-// general, it will add a table to your database called "migration_version"
-// with a single column containing a single row.
-func Open(driver, dsn string, migrations []Migrator) (*sql.DB, error) {
- return OpenWith(driver, dsn, migrations, nil, nil)
-}
-
-// OpenWith is exactly like Open, except it allows the client to specify their
-// own versioning scheme. Note that vget and vset must BOTH be
-// nil or BOTH be non-nil. Otherwise, this function panics. This is because the
-// implementation of one generally relies on the implementation of the other.
-//
-// If vget and vset are both set to nil, then the behavior of this
-// function is identical to the behavior of Open.
-func OpenWith(
- driver, dsn string,
- migrations []Migrator,
- vget GetVersion, vset SetVersion,
-) (*sql.DB, error) {
- if (vget == nil && vset != nil) || (vget != nil && vset == nil) {
- panic("vget/vset must both be nil or both be non-nil")
- }
- if vget == nil {
- vget = DefaultGetVersion
- }
- if vset == nil {
- vset = DefaultSetVersion
- }
-
- db, err := sql.Open(driver, dsn)
- if err != nil {
- return nil, err
- }
- if err := (migration{db, migrations, vget, vset}).migrate(); err != nil {
- return nil, err
- }
- return db, nil
-}
-
-type migration struct {
- *sql.DB
- migrations []Migrator
- getVersion GetVersion
- setVersion SetVersion
-}
-
-// Stmt satisfies the LimitedTx interface.
-func (m migration) Stmt(stmt *sql.Stmt) *sql.Stmt {
- return stmt
-}
-
-func (m migration) migrate() error {
- libVersion := len(m.migrations)
- dbVersion, err := m.getVersion(m)
- if err != nil {
- return ef("Could not get DB version: %s", err)
- }
- if dbVersion > libVersion {
- return ef("Database version (%d) is greater than library version (%d).",
- dbVersion, libVersion)
- }
- if dbVersion == libVersion {
- return nil
- }
-
- tx, err := m.Begin()
- if err != nil {
- return ef("Could not start transaction: %s", err)
- }
- for i := dbVersion; i < libVersion; i++ {
- if err := m.migrations[i](tx); err != nil {
- if err2 := tx.Rollback(); err2 != nil {
- return ef(
- "When migrating from %d to %d, got error '%s' and "+
- "got error '%s' after trying to rollback.",
- i, i+1, err, err2)
- }
- return ef(
- "When migrating from %d to %d, got error '%s' and "+
- "successfully rolled back.", i, i+1, err)
- }
- }
- if err := m.setVersion(tx, libVersion); err != nil {
- if err2 := tx.Rollback(); err2 != nil {
- return ef(
- "When trying to set version to %d (from %d), got error '%s' "+
- "and got error '%s' after trying to rollback.",
- libVersion, dbVersion, err, err2)
- }
- return ef(
- "When trying to set version to %d (from %d), got error '%s' "+
- "and successfully rolled back.",
- libVersion, dbVersion, err)
- }
- if err := tx.Commit(); err != nil {
- return ef("Error committing migration from %d to %d: %s",
- dbVersion, libVersion, err)
- }
- return nil
-}
-
-func defaultGetVersion(tx LimitedTx) (int, error) {
- v, err := getVersion(tx)
- if err != nil {
- if err := createVersionTable(tx); err != nil {
- return 0, err
- }
- return getVersion(tx)
- }
- return v, nil
-}
-
-func defaultSetVersion(tx LimitedTx, version int) error {
- if err := setVersion(tx, version); err != nil {
- if err := createVersionTable(tx); err != nil {
- return err
- }
- return setVersion(tx, version)
- }
- return nil
-}
-
-func getVersion(tx LimitedTx) (int, error) {
- var version int
- r := tx.QueryRow("SELECT version FROM migration_version")
- if err := r.Scan(&version); err != nil {
- return 0, err
- }
- return version, nil
-}
-
-func setVersion(tx LimitedTx, version int) error {
- _, err := tx.Exec("UPDATE migration_version SET version = $1", version)
- return err
-}
-
-func createVersionTable(tx LimitedTx) error {
- _, err := tx.Exec(`
- CREATE TABLE migration_version (
- version INTEGER
- );
- INSERT INTO migration_version (version) VALUES (0)`)
- return err
-}
diff --git a/vendor/github.com/BurntSushi/migration/session.vim b/vendor/github.com/BurntSushi/migration/session.vim
deleted file mode 100644
index 562164be0..000000000
--- a/vendor/github.com/BurntSushi/migration/session.vim
+++ /dev/null
@@ -1 +0,0 @@
-au BufWritePost *.go silent!make tags > /dev/null 2>&1
diff --git a/vendor/github.com/Sirupsen/logrus/.gitignore b/vendor/github.com/Sirupsen/logrus/.gitignore
deleted file mode 100644
index 66be63a00..000000000
--- a/vendor/github.com/Sirupsen/logrus/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-logrus
diff --git a/vendor/github.com/Sirupsen/logrus/.travis.yml b/vendor/github.com/Sirupsen/logrus/.travis.yml
deleted file mode 100644
index 2d8c08661..000000000
--- a/vendor/github.com/Sirupsen/logrus/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: go
-go:
- - 1.2
- - 1.3
- - 1.4
- - tip
-install:
- - go get -t ./...
diff --git a/vendor/github.com/Sirupsen/logrus/README.md b/vendor/github.com/Sirupsen/logrus/README.md
index e755e7c18..ef6501f1c 100644
--- a/vendor/github.com/Sirupsen/logrus/README.md
+++ b/vendor/github.com/Sirupsen/logrus/README.md
@@ -242,9 +242,6 @@ func init() {
* [`github.com/johntdyer/slackrus`](https://github.com/johntdyer/slackrus)
Hook for Slack chat.
-* [`github.com/wercker/journalhook`](https://github.com/wercker/journalhook).
- Hook for logging to `systemd-journald`.
-
#### Level logging
Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic.
diff --git a/vendor/github.com/Sirupsen/logrus/entry_test.go b/vendor/github.com/Sirupsen/logrus/entry_test.go
index 4e479916b..98717df49 100644
--- a/vendor/github.com/Sirupsen/logrus/entry_test.go
+++ b/vendor/github.com/Sirupsen/logrus/entry_test.go
@@ -5,7 +5,7 @@ import (
"fmt"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
func TestEntryPanicln(t *testing.T) {
diff --git a/vendor/github.com/Sirupsen/logrus/examples/basic/basic.go b/vendor/github.com/Sirupsen/logrus/examples/basic/basic.go
index 317a85970..a62ba45de 100644
--- a/vendor/github.com/Sirupsen/logrus/examples/basic/basic.go
+++ b/vendor/github.com/Sirupsen/logrus/examples/basic/basic.go
@@ -1,7 +1,7 @@
package main
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus"
)
var log = logrus.New()
@@ -9,7 +9,6 @@ var log = logrus.New()
func init() {
log.Formatter = new(logrus.JSONFormatter)
log.Formatter = new(logrus.TextFormatter) // default
- log.Level = logrus.DebugLevel
}
func main() {
@@ -24,11 +23,6 @@ func main() {
}
}()
- log.WithFields(logrus.Fields{
- "animal": "walrus",
- "number": 8,
- }).Debug("Started observing beach")
-
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
@@ -39,10 +33,6 @@ func main() {
"number": 122,
}).Warn("The group's number increased tremendously!")
- log.WithFields(logrus.Fields{
- "temperature": -4,
- }).Debug("Temperature changes")
-
log.WithFields(logrus.Fields{
"animal": "orca",
"size": 9009,
diff --git a/vendor/github.com/Sirupsen/logrus/examples/hook/hook.go b/vendor/github.com/Sirupsen/logrus/examples/hook/hook.go
index b9a46c5a2..42e7a4c98 100644
--- a/vendor/github.com/Sirupsen/logrus/examples/hook/hook.go
+++ b/vendor/github.com/Sirupsen/logrus/examples/hook/hook.go
@@ -1,8 +1,8 @@
package main
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus/hooks/airbrake"
+ "github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus/hooks/airbrake"
"github.com/tobi/airbrake-go"
)
diff --git a/vendor/github.com/Sirupsen/logrus/exported.go b/vendor/github.com/Sirupsen/logrus/exported.go
index a67e1b802..fd092fc7e 100644
--- a/vendor/github.com/Sirupsen/logrus/exported.go
+++ b/vendor/github.com/Sirupsen/logrus/exported.go
@@ -36,8 +36,6 @@ func SetLevel(level Level) {
// GetLevel returns the standard logger level.
func GetLevel() Level {
- std.mu.Lock()
- defer std.mu.Unlock()
return std.Level
}
diff --git a/vendor/github.com/Sirupsen/logrus/hook_test.go b/vendor/github.com/Sirupsen/logrus/hook_test.go
index e80a9d015..13f34cb6f 100644
--- a/vendor/github.com/Sirupsen/logrus/hook_test.go
+++ b/vendor/github.com/Sirupsen/logrus/hook_test.go
@@ -3,7 +3,7 @@ package logrus
import (
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
type TestHook struct {
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go b/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go
index 8808eff42..880d21ecd 100644
--- a/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go
+++ b/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go
@@ -1,7 +1,7 @@
package logrus_airbrake
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus"
"github.com/tobi/airbrake-go"
)
@@ -9,7 +9,7 @@ import (
// with the Airbrake API. You must set:
// * airbrake.Endpoint
// * airbrake.ApiKey
-// * airbrake.Environment
+// * airbrake.Environment (only sends exceptions when set to "production")
//
// Before using this hook, to send an error. Entries that trigger an Error,
// Fatal or Panic should now include an "error" field to send to Airbrake.
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go b/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go
deleted file mode 100644
index 8076589a7..000000000
--- a/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package logrus_airbrake
-
-import (
- "encoding/xml"
- "errors"
- "net/http"
- "net/http/httptest"
- "testing"
- "time"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
- "github.com/tobi/airbrake-go"
-)
-
-type notice struct {
- Error struct {
- Message string `xml:"message"`
- } `xml:"error"`
-}
-
-func TestNoticeReceived(t *testing.T) {
- msg := make(chan string, 1)
- expectedMsg := "foo"
-
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- var notice notice
- if err := xml.NewDecoder(r.Body).Decode(¬ice); err != nil {
- t.Error(err)
- }
- r.Body.Close()
-
- msg <- notice.Error.Message
- }))
- defer ts.Close()
-
- hook := &AirbrakeHook{}
-
- airbrake.Environment = "production"
- airbrake.Endpoint = ts.URL
- airbrake.ApiKey = "foo"
-
- log := logrus.New()
- log.Hooks.Add(hook)
-
- log.WithFields(logrus.Fields{
- "error": errors.New(expectedMsg),
- }).Error("Airbrake will not see this string")
-
- select {
- case received := <-msg:
- if received != expectedMsg {
- t.Errorf("Unexpected message received: %s", received)
- }
- case <-time.After(time.Second):
- t.Error("Timed out; no notice received by Airbrake API")
- }
-}
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go b/vendor/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go
index 67f597d22..c0f10c1bd 100644
--- a/vendor/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go
+++ b/vendor/github.com/Sirupsen/logrus/hooks/papertrail/papertrail.go
@@ -6,7 +6,7 @@ import (
"os"
"time"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus"
)
const (
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/papertrail/papertrail_test.go b/vendor/github.com/Sirupsen/logrus/hooks/papertrail/papertrail_test.go
index e37a68d93..96318d003 100644
--- a/vendor/github.com/Sirupsen/logrus/hooks/papertrail/papertrail_test.go
+++ b/vendor/github.com/Sirupsen/logrus/hooks/papertrail/papertrail_test.go
@@ -4,7 +4,7 @@ import (
"fmt"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus"
"github.com/stvp/go-udp-testing"
)
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/sentry/README.md b/vendor/github.com/Sirupsen/logrus/hooks/sentry/README.md
index 19e58bb45..a409f3b04 100644
--- a/vendor/github.com/Sirupsen/logrus/hooks/sentry/README.md
+++ b/vendor/github.com/Sirupsen/logrus/hooks/sentry/README.md
@@ -57,5 +57,5 @@ with a call to `NewSentryHook`. This can be changed by assigning a value to the
```go
hook, _ := logrus_sentry.NewSentryHook(...)
-hook.Timeout = 20*time.Second
+hook.Timeout = 20*time.Seconds
```
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/sentry/sentry.go b/vendor/github.com/Sirupsen/logrus/hooks/sentry/sentry.go
index 2f482bae9..379f281c5 100644
--- a/vendor/github.com/Sirupsen/logrus/hooks/sentry/sentry.go
+++ b/vendor/github.com/Sirupsen/logrus/hooks/sentry/sentry.go
@@ -4,7 +4,7 @@ import (
"fmt"
"time"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus"
"github.com/getsentry/raven-go"
)
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/sentry/sentry_test.go b/vendor/github.com/Sirupsen/logrus/hooks/sentry/sentry_test.go
index ed82d4ff4..45f18d170 100644
--- a/vendor/github.com/Sirupsen/logrus/hooks/sentry/sentry_test.go
+++ b/vendor/github.com/Sirupsen/logrus/hooks/sentry/sentry_test.go
@@ -9,7 +9,7 @@ import (
"strings"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus"
"github.com/getsentry/raven-go"
)
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog.go b/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog.go
index 34f11823d..b6fa37462 100644
--- a/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog.go
+++ b/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog.go
@@ -2,7 +2,7 @@ package logrus_syslog
import (
"fmt"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus"
"log/syslog"
"os"
)
diff --git a/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog_test.go b/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog_test.go
index 6915db411..42762dc10 100644
--- a/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog_test.go
+++ b/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog_test.go
@@ -1,7 +1,7 @@
package logrus_syslog
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/Sirupsen/logrus"
+ "github.com/Sirupsen/logrus"
"log/syslog"
"testing"
)
diff --git a/vendor/github.com/Sirupsen/logrus/json_formatter.go b/vendor/github.com/Sirupsen/logrus/json_formatter.go
index 0e38a6191..b09227c2b 100644
--- a/vendor/github.com/Sirupsen/logrus/json_formatter.go
+++ b/vendor/github.com/Sirupsen/logrus/json_formatter.go
@@ -11,13 +11,7 @@ type JSONFormatter struct{}
func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
data := make(Fields, len(entry.Data)+3)
for k, v := range entry.Data {
- // Otherwise errors are ignored by `encoding/json`
- // https://github.com/Sirupsen/logrus/issues/137
- if err, ok := v.(error); ok {
- data[k] = err.Error()
- } else {
- data[k] = v
- }
+ data[k] = v
}
prefixFieldClashes(data)
data["time"] = entry.Time.Format(time.RFC3339)
diff --git a/vendor/github.com/Sirupsen/logrus/json_formatter_test.go b/vendor/github.com/Sirupsen/logrus/json_formatter_test.go
deleted file mode 100644
index 1d7087325..000000000
--- a/vendor/github.com/Sirupsen/logrus/json_formatter_test.go
+++ /dev/null
@@ -1,120 +0,0 @@
-package logrus
-
-import (
- "encoding/json"
- "errors"
-
- "testing"
-)
-
-func TestErrorNotLost(t *testing.T) {
- formatter := &JSONFormatter{}
-
- b, err := formatter.Format(WithField("error", errors.New("wild walrus")))
- if err != nil {
- t.Fatal("Unable to format entry: ", err)
- }
-
- entry := make(map[string]interface{})
- err = json.Unmarshal(b, &entry)
- if err != nil {
- t.Fatal("Unable to unmarshal formatted entry: ", err)
- }
-
- if entry["error"] != "wild walrus" {
- t.Fatal("Error field not set")
- }
-}
-
-func TestErrorNotLostOnFieldNotNamedError(t *testing.T) {
- formatter := &JSONFormatter{}
-
- b, err := formatter.Format(WithField("omg", errors.New("wild walrus")))
- if err != nil {
- t.Fatal("Unable to format entry: ", err)
- }
-
- entry := make(map[string]interface{})
- err = json.Unmarshal(b, &entry)
- if err != nil {
- t.Fatal("Unable to unmarshal formatted entry: ", err)
- }
-
- if entry["omg"] != "wild walrus" {
- t.Fatal("Error field not set")
- }
-}
-
-func TestFieldClashWithTime(t *testing.T) {
- formatter := &JSONFormatter{}
-
- b, err := formatter.Format(WithField("time", "right now!"))
- if err != nil {
- t.Fatal("Unable to format entry: ", err)
- }
-
- entry := make(map[string]interface{})
- err = json.Unmarshal(b, &entry)
- if err != nil {
- t.Fatal("Unable to unmarshal formatted entry: ", err)
- }
-
- if entry["fields.time"] != "right now!" {
- t.Fatal("fields.time not set to original time field")
- }
-
- if entry["time"] != "0001-01-01T00:00:00Z" {
- t.Fatal("time field not set to current time, was: ", entry["time"])
- }
-}
-
-func TestFieldClashWithMsg(t *testing.T) {
- formatter := &JSONFormatter{}
-
- b, err := formatter.Format(WithField("msg", "something"))
- if err != nil {
- t.Fatal("Unable to format entry: ", err)
- }
-
- entry := make(map[string]interface{})
- err = json.Unmarshal(b, &entry)
- if err != nil {
- t.Fatal("Unable to unmarshal formatted entry: ", err)
- }
-
- if entry["fields.msg"] != "something" {
- t.Fatal("fields.msg not set to original msg field")
- }
-}
-
-func TestFieldClashWithLevel(t *testing.T) {
- formatter := &JSONFormatter{}
-
- b, err := formatter.Format(WithField("level", "something"))
- if err != nil {
- t.Fatal("Unable to format entry: ", err)
- }
-
- entry := make(map[string]interface{})
- err = json.Unmarshal(b, &entry)
- if err != nil {
- t.Fatal("Unable to unmarshal formatted entry: ", err)
- }
-
- if entry["fields.level"] != "something" {
- t.Fatal("fields.level not set to original level field")
- }
-}
-
-func TestJSONEntryEndsWithNewline(t *testing.T) {
- formatter := &JSONFormatter{}
-
- b, err := formatter.Format(WithField("level", "something"))
- if err != nil {
- t.Fatal("Unable to format entry: ", err)
- }
-
- if b[len(b)-1] != '\n' {
- t.Fatal("Expected JSON log entry to end with a newline")
- }
-}
diff --git a/vendor/github.com/Sirupsen/logrus/logrus_test.go b/vendor/github.com/Sirupsen/logrus/logrus_test.go
index 796a8f9ac..7f52c6fbc 100644
--- a/vendor/github.com/Sirupsen/logrus/logrus_test.go
+++ b/vendor/github.com/Sirupsen/logrus/logrus_test.go
@@ -5,10 +5,9 @@ import (
"encoding/json"
"strconv"
"strings"
- "sync"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
func LogAndAssertJSON(t *testing.T, log func(*Logger), assertions func(fields Fields)) {
@@ -282,20 +281,3 @@ func TestParseLevel(t *testing.T) {
l, err = ParseLevel("invalid")
assert.Equal(t, "not a valid logrus Level: \"invalid\"", err.Error())
}
-
-func TestGetSetLevelRace(t *testing.T) {
- wg := sync.WaitGroup{}
- for i := 0; i < 100; i++ {
- wg.Add(1)
- go func(i int) {
- defer wg.Done()
- if i%2 == 0 {
- SetLevel(InfoLevel)
- } else {
- GetLevel()
- }
- }(i)
-
- }
- wg.Wait()
-}
diff --git a/vendor/github.com/Sirupsen/logrus/text_formatter.go b/vendor/github.com/Sirupsen/logrus/text_formatter.go
index 71dcb6617..4e5173419 100644
--- a/vendor/github.com/Sirupsen/logrus/text_formatter.go
+++ b/vendor/github.com/Sirupsen/logrus/text_formatter.go
@@ -15,7 +15,6 @@ const (
green = 32
yellow = 33
blue = 34
- gray = 37
)
var (
@@ -35,34 +34,20 @@ func miniTS() int {
type TextFormatter struct {
// Set to true to bypass checking for a TTY before outputting colors.
- ForceColors bool
-
- // Force disabling colors.
+ ForceColors bool
DisableColors bool
-
- // Disable timestamp logging. useful when output is redirected to logging
- // system that already adds timestamps.
+ // Set to true to disable timestamp logging (useful when the output
+ // is redirected to a logging system already adding a timestamp)
DisableTimestamp bool
-
- // Enable logging the full timestamp when a TTY is attached instead of just
- // the time passed since beginning of execution.
- FullTimestamp bool
-
- // The fields are sorted by default for a consistent output. For applications
- // that log extremely frequently and don't use the JSON formatter this may not
- // be desired.
- DisableSorting bool
}
func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
+
var keys []string = make([]string, 0, len(entry.Data))
for k := range entry.Data {
keys = append(keys, k)
}
-
- if !f.DisableSorting {
- sort.Strings(keys)
- }
+ sort.Strings(keys)
b := &bytes.Buffer{}
@@ -71,7 +56,7 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
isColored := (f.ForceColors || isTerminal) && !f.DisableColors
if isColored {
- f.printColored(b, entry, keys)
+ printColored(b, entry, keys)
} else {
if !f.DisableTimestamp {
f.appendKeyValue(b, "time", entry.Time.Format(time.RFC3339))
@@ -87,11 +72,9 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
return b.Bytes(), nil
}
-func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string) {
+func printColored(b *bytes.Buffer, entry *Entry, keys []string) {
var levelColor int
switch entry.Level {
- case DebugLevel:
- levelColor = gray
case WarnLevel:
levelColor = yellow
case ErrorLevel, FatalLevel, PanicLevel:
@@ -102,11 +85,7 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []strin
levelText := strings.ToUpper(entry.Level.String())[0:4]
- if !f.FullTimestamp {
- fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, miniTS(), entry.Message)
- } else {
- fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(time.RFC3339), entry.Message)
- }
+ fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, miniTS(), entry.Message)
for _, k := range keys {
v := entry.Data[k]
fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=%v", levelColor, k, v)
@@ -117,7 +96,7 @@ func needsQuoting(text string) bool {
for _, ch := range text {
if !((ch >= 'a' && ch <= 'z') ||
(ch >= 'A' && ch <= 'Z') ||
- (ch >= '0' && ch <= '9') ||
+ (ch >= '0' && ch < '9') ||
ch == '-' || ch == '.') {
return false
}
diff --git a/vendor/github.com/Sirupsen/logrus/text_formatter_test.go b/vendor/github.com/Sirupsen/logrus/text_formatter_test.go
index 28a949907..f604f1b00 100644
--- a/vendor/github.com/Sirupsen/logrus/text_formatter_test.go
+++ b/vendor/github.com/Sirupsen/logrus/text_formatter_test.go
@@ -25,13 +25,9 @@ func TestQuoting(t *testing.T) {
checkQuoting(false, "abcd")
checkQuoting(false, "v1.0")
- checkQuoting(false, "1234567890")
checkQuoting(true, "/foobar")
checkQuoting(true, "x y")
checkQuoting(true, "x,y")
checkQuoting(false, errors.New("invalid"))
checkQuoting(true, errors.New("invalid argument"))
}
-
-// TODO add tests for sorting etc., this requires a parser for the text
-// formatter output.
diff --git a/vendor/github.com/codegangsta/cli/LICENSE b/vendor/github.com/codegangsta/cli/LICENSE
new file mode 100644
index 000000000..5515ccfb7
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/LICENSE
@@ -0,0 +1,21 @@
+Copyright (C) 2013 Jeremy Saenz
+All Rights Reserved.
+
+MIT LICENSE
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/codegangsta/cli/README.md b/vendor/github.com/codegangsta/cli/README.md
new file mode 100644
index 000000000..0e8327b8b
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/README.md
@@ -0,0 +1,298 @@
+[](https://travis-ci.org/codegangsta/cli)
+
+# cli.go
+cli.go is simple, fast, and fun package for building command line apps in Go. The goal is to enable developers to write fast and distributable command line applications in an expressive way.
+
+You can view the API docs here:
+http://godoc.org/github.com/codegangsta/cli
+
+## Overview
+Command line apps are usually so tiny that there is absolutely no reason why your code should *not* be self-documenting. Things like generating help text and parsing command flags/options should not hinder productivity when writing a command line app.
+
+**This is where cli.go comes into play.** cli.go makes command line programming fun, organized, and expressive!
+
+## Installation
+Make sure you have a working Go environment (go 1.1 is *required*). [See the install instructions](http://golang.org/doc/install.html).
+
+To install `cli.go`, simply run:
+```
+$ go get github.com/codegangsta/cli
+```
+
+Make sure your `PATH` includes to the `$GOPATH/bin` directory so your commands can be easily used:
+```
+export PATH=$PATH:$GOPATH/bin
+```
+
+## Getting Started
+One of the philosophies behind cli.go is that an API should be playful and full of discovery. So a cli.go app can be as little as one line of code in `main()`.
+
+``` go
+package main
+
+import (
+ "os"
+ "github.com/codegangsta/cli"
+)
+
+func main() {
+ cli.NewApp().Run(os.Args)
+}
+```
+
+This app will run and show help text, but is not very useful. Let's give an action to execute and some help documentation:
+
+``` go
+package main
+
+import (
+ "os"
+ "github.com/codegangsta/cli"
+)
+
+func main() {
+ app := cli.NewApp()
+ app.Name = "boom"
+ app.Usage = "make an explosive entrance"
+ app.Action = func(c *cli.Context) {
+ println("boom! I say!")
+ }
+
+ app.Run(os.Args)
+}
+```
+
+Running this already gives you a ton of functionality, plus support for things like subcommands and flags, which are covered below.
+
+## Example
+
+Being a programmer can be a lonely job. Thankfully by the power of automation that is not the case! Let's create a greeter app to fend off our demons of loneliness!
+
+Start by creating a directory named `greet`, and within it, add a file, `greet.go` with the following code in it:
+
+``` go
+package main
+
+import (
+ "os"
+ "github.com/codegangsta/cli"
+)
+
+func main() {
+ app := cli.NewApp()
+ app.Name = "greet"
+ app.Usage = "fight the loneliness!"
+ app.Action = func(c *cli.Context) {
+ println("Hello friend!")
+ }
+
+ app.Run(os.Args)
+}
+```
+
+Install our command to the `$GOPATH/bin` directory:
+
+```
+$ go install
+```
+
+Finally run our new command:
+
+```
+$ greet
+Hello friend!
+```
+
+cli.go also generates some bitchass help text:
+```
+$ greet help
+NAME:
+ greet - fight the loneliness!
+
+USAGE:
+ greet [global options] command [command options] [arguments...]
+
+VERSION:
+ 0.0.0
+
+COMMANDS:
+ help, h Shows a list of commands or help for one command
+
+GLOBAL OPTIONS
+ --version Shows version information
+```
+
+### Arguments
+You can lookup arguments by calling the `Args` function on `cli.Context`.
+
+``` go
+...
+app.Action = func(c *cli.Context) {
+ println("Hello", c.Args()[0])
+}
+...
+```
+
+### Flags
+Setting and querying flags is simple.
+``` go
+...
+app.Flags = []cli.Flag {
+ cli.StringFlag{
+ Name: "lang",
+ Value: "english",
+ Usage: "language for the greeting",
+ },
+}
+app.Action = func(c *cli.Context) {
+ name := "someone"
+ if len(c.Args()) > 0 {
+ name = c.Args()[0]
+ }
+ if c.String("lang") == "spanish" {
+ println("Hola", name)
+ } else {
+ println("Hello", name)
+ }
+}
+...
+```
+
+#### Alternate Names
+
+You can set alternate (or short) names for flags by providing a comma-delimited list for the `Name`. e.g.
+
+``` go
+app.Flags = []cli.Flag {
+ cli.StringFlag{
+ Name: "lang, l",
+ Value: "english",
+ Usage: "language for the greeting",
+ },
+}
+```
+
+That flag can then be set with `--lang spanish` or `-l spanish`. Note that giving two different forms of the same flag in the same command invocation is an error.
+
+#### Values from the Environment
+
+You can also have the default value set from the environment via `EnvVar`. e.g.
+
+``` go
+app.Flags = []cli.Flag {
+ cli.StringFlag{
+ Name: "lang, l",
+ Value: "english",
+ Usage: "language for the greeting",
+ EnvVar: "APP_LANG",
+ },
+}
+```
+
+The `EnvVar` may also be given as a comma-delimited "cascade", where the first environment variable that resolves is used as the default.
+
+``` go
+app.Flags = []cli.Flag {
+ cli.StringFlag{
+ Name: "lang, l",
+ Value: "english",
+ Usage: "language for the greeting",
+ EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG",
+ },
+}
+```
+
+### Subcommands
+
+Subcommands can be defined for a more git-like command line app.
+```go
+...
+app.Commands = []cli.Command{
+ {
+ Name: "add",
+ ShortName: "a",
+ Usage: "add a task to the list",
+ Action: func(c *cli.Context) {
+ println("added task: ", c.Args().First())
+ },
+ },
+ {
+ Name: "complete",
+ ShortName: "c",
+ Usage: "complete a task on the list",
+ Action: func(c *cli.Context) {
+ println("completed task: ", c.Args().First())
+ },
+ },
+ {
+ Name: "template",
+ ShortName: "r",
+ Usage: "options for task templates",
+ Subcommands: []cli.Command{
+ {
+ Name: "add",
+ Usage: "add a new template",
+ Action: func(c *cli.Context) {
+ println("new task template: ", c.Args().First())
+ },
+ },
+ {
+ Name: "remove",
+ Usage: "remove an existing template",
+ Action: func(c *cli.Context) {
+ println("removed task template: ", c.Args().First())
+ },
+ },
+ },
+ },
+}
+...
+```
+
+### Bash Completion
+
+You can enable completion commands by setting the `EnableBashCompletion`
+flag on the `App` object. By default, this setting will only auto-complete to
+show an app's subcommands, but you can write your own completion methods for
+the App or its subcommands.
+```go
+...
+var tasks = []string{"cook", "clean", "laundry", "eat", "sleep", "code"}
+app := cli.NewApp()
+app.EnableBashCompletion = true
+app.Commands = []cli.Command{
+ {
+ Name: "complete",
+ ShortName: "c",
+ Usage: "complete a task on the list",
+ Action: func(c *cli.Context) {
+ println("completed task: ", c.Args().First())
+ },
+ BashComplete: func(c *cli.Context) {
+ // This will complete if no args are passed
+ if len(c.Args()) > 0 {
+ return
+ }
+ for _, t := range tasks {
+ fmt.Println(t)
+ }
+ },
+ }
+}
+...
+```
+
+#### To Enable
+
+Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while
+setting the `PROG` variable to the name of your program:
+
+`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete`
+
+
+## Contribution Guidelines
+Feel free to put up a pull request to fix a bug or maybe add a feature. I will give it a code review and make sure that it does not break backwards compatibility. If I or any other collaborators agree that it is in line with the vision of the project, we will work with you to get the code into a mergeable state and merge it into the master branch.
+
+If you are have contributed something significant to the project, I will most likely add you as a collaborator. As a collaborator you are given the ability to merge others pull requests. It is very important that new code does not break existing code, so be careful about what code you do choose to merge. If you have any questions feel free to link @codegangsta to the issue in question and we can review it together.
+
+If you feel like you have contributed to the project but have not yet been added as a collaborator, I probably forgot to add you. Hit @codegangsta up over email and we will get it figured out.
diff --git a/vendor/github.com/codegangsta/cli/app.go b/vendor/github.com/codegangsta/cli/app.go
new file mode 100644
index 000000000..edf02fbc0
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/app.go
@@ -0,0 +1,275 @@
+package cli
+
+import (
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "text/tabwriter"
+ "text/template"
+ "time"
+)
+
+// App is the main structure of a cli application. It is recomended that
+// and app be created with the cli.NewApp() function
+type App struct {
+ // The name of the program. Defaults to os.Args[0]
+ Name string
+ // Description of the program.
+ Usage string
+ // Version of the program
+ Version string
+ // List of commands to execute
+ Commands []Command
+ // List of flags to parse
+ Flags []Flag
+ // Boolean to enable bash completion commands
+ EnableBashCompletion bool
+ // Boolean to hide built-in help command
+ HideHelp bool
+ // Boolean to hide built-in version flag
+ HideVersion bool
+ // An action to execute when the bash-completion flag is set
+ BashComplete func(context *Context)
+ // An action to execute before any subcommands are run, but after the context is ready
+ // If a non-nil error is returned, no subcommands are run
+ Before func(context *Context) error
+ // The action to execute when no subcommands are specified
+ Action func(context *Context)
+ // Execute this function if the proper command cannot be found
+ CommandNotFound func(context *Context, command string)
+ // Compilation date
+ Compiled time.Time
+ // Author
+ Author string
+ // Author e-mail
+ Email string
+ // Writer writer to write output to
+ Writer io.Writer
+}
+
+// Tries to find out when this binary was compiled.
+// Returns the current time if it fails to find it.
+func compileTime() time.Time {
+ info, err := os.Stat(os.Args[0])
+ if err != nil {
+ return time.Now()
+ }
+ return info.ModTime()
+}
+
+// Creates a new cli Application with some reasonable defaults for Name, Usage, Version and Action.
+func NewApp() *App {
+ return &App{
+ Name: os.Args[0],
+ Usage: "A new cli application",
+ Version: "0.0.0",
+ BashComplete: DefaultAppComplete,
+ Action: helpCommand.Action,
+ Compiled: compileTime(),
+ Author: "Author",
+ Email: "unknown@email",
+ Writer: os.Stdout,
+ }
+}
+
+// Entry point to the cli app. Parses the arguments slice and routes to the proper flag/args combination
+func (a *App) Run(arguments []string) error {
+ if HelpPrinter == nil {
+ defer func() {
+ HelpPrinter = nil
+ }()
+
+ HelpPrinter = func(templ string, data interface{}) {
+ w := tabwriter.NewWriter(a.Writer, 0, 8, 1, '\t', 0)
+ t := template.Must(template.New("help").Parse(templ))
+ err := t.Execute(w, data)
+ if err != nil {
+ panic(err)
+ }
+ w.Flush()
+ }
+ }
+
+ // append help to commands
+ if a.Command(helpCommand.Name) == nil && !a.HideHelp {
+ a.Commands = append(a.Commands, helpCommand)
+ a.appendFlag(HelpFlag)
+ }
+
+ //append version/help flags
+ if a.EnableBashCompletion {
+ a.appendFlag(BashCompletionFlag)
+ }
+
+ if !a.HideVersion {
+ a.appendFlag(VersionFlag)
+ }
+
+ // parse flags
+ set := flagSet(a.Name, a.Flags)
+ set.SetOutput(ioutil.Discard)
+ err := set.Parse(arguments[1:])
+ nerr := normalizeFlags(a.Flags, set)
+ if nerr != nil {
+ fmt.Fprintln(a.Writer, nerr)
+ context := NewContext(a, set, set)
+ ShowAppHelp(context)
+ fmt.Fprintln(a.Writer)
+ return nerr
+ }
+ context := NewContext(a, set, set)
+
+ if err != nil {
+ fmt.Fprintf(a.Writer, "Incorrect Usage.\n\n")
+ ShowAppHelp(context)
+ fmt.Fprintln(a.Writer)
+ return err
+ }
+
+ if checkCompletions(context) {
+ return nil
+ }
+
+ if checkHelp(context) {
+ return nil
+ }
+
+ if checkVersion(context) {
+ return nil
+ }
+
+ if a.Before != nil {
+ err := a.Before(context)
+ if err != nil {
+ return err
+ }
+ }
+
+ args := context.Args()
+ if args.Present() {
+ name := args.First()
+ c := a.Command(name)
+ if c != nil {
+ return c.Run(context)
+ }
+ }
+
+ // Run default Action
+ a.Action(context)
+ return nil
+}
+
+// Another entry point to the cli app, takes care of passing arguments and error handling
+func (a *App) RunAndExitOnError() {
+ if err := a.Run(os.Args); err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+}
+
+// Invokes the subcommand given the context, parses ctx.Args() to generate command-specific flags
+func (a *App) RunAsSubcommand(ctx *Context) error {
+ // append help to commands
+ if len(a.Commands) > 0 {
+ if a.Command(helpCommand.Name) == nil && !a.HideHelp {
+ a.Commands = append(a.Commands, helpCommand)
+ a.appendFlag(HelpFlag)
+ }
+ }
+
+ // append flags
+ if a.EnableBashCompletion {
+ a.appendFlag(BashCompletionFlag)
+ }
+
+ // parse flags
+ set := flagSet(a.Name, a.Flags)
+ set.SetOutput(ioutil.Discard)
+ err := set.Parse(ctx.Args().Tail())
+ nerr := normalizeFlags(a.Flags, set)
+ context := NewContext(a, set, ctx.globalSet)
+
+ if nerr != nil {
+ fmt.Fprintln(a.Writer, nerr)
+ if len(a.Commands) > 0 {
+ ShowSubcommandHelp(context)
+ } else {
+ ShowCommandHelp(ctx, context.Args().First())
+ }
+ fmt.Fprintln(a.Writer)
+ return nerr
+ }
+
+ if err != nil {
+ fmt.Fprintf(a.Writer, "Incorrect Usage.\n\n")
+ ShowSubcommandHelp(context)
+ return err
+ }
+
+ if checkCompletions(context) {
+ return nil
+ }
+
+ if len(a.Commands) > 0 {
+ if checkSubcommandHelp(context) {
+ return nil
+ }
+ } else {
+ if checkCommandHelp(ctx, context.Args().First()) {
+ return nil
+ }
+ }
+
+ if a.Before != nil {
+ err := a.Before(context)
+ if err != nil {
+ return err
+ }
+ }
+
+ args := context.Args()
+ if args.Present() {
+ name := args.First()
+ c := a.Command(name)
+ if c != nil {
+ return c.Run(context)
+ }
+ }
+
+ // Run default Action
+ if len(a.Commands) > 0 {
+ a.Action(context)
+ } else {
+ a.Action(ctx)
+ }
+
+ return nil
+}
+
+// Returns the named command on App. Returns nil if the command does not exist
+func (a *App) Command(name string) *Command {
+ for _, c := range a.Commands {
+ if c.HasName(name) {
+ return &c
+ }
+ }
+
+ return nil
+}
+
+func (a *App) hasFlag(flag Flag) bool {
+ for _, f := range a.Flags {
+ if flag == f {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (a *App) appendFlag(flag Flag) {
+ if !a.hasFlag(flag) {
+ a.Flags = append(a.Flags, flag)
+ }
+}
diff --git a/vendor/github.com/codegangsta/cli/app_test.go b/vendor/github.com/codegangsta/cli/app_test.go
new file mode 100644
index 000000000..141319940
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/app_test.go
@@ -0,0 +1,467 @@
+package cli_test
+
+import (
+ "fmt"
+ "os"
+ "testing"
+
+ "github.com/codegangsta/cli"
+)
+
+func ExampleApp() {
+ // set args for examples sake
+ os.Args = []string{"greet", "--name", "Jeremy"}
+
+ app := cli.NewApp()
+ app.Name = "greet"
+ app.Flags = []cli.Flag{
+ cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"},
+ }
+ app.Action = func(c *cli.Context) {
+ fmt.Printf("Hello %v\n", c.String("name"))
+ }
+ app.Run(os.Args)
+ // Output:
+ // Hello Jeremy
+}
+
+func ExampleAppSubcommand() {
+ // set args for examples sake
+ os.Args = []string{"say", "hi", "english", "--name", "Jeremy"}
+ app := cli.NewApp()
+ app.Name = "say"
+ app.Commands = []cli.Command{
+ {
+ Name: "hello",
+ ShortName: "hi",
+ Usage: "use it to see a description",
+ Description: "This is how we describe hello the function",
+ Subcommands: []cli.Command{
+ {
+ Name: "english",
+ ShortName: "en",
+ Usage: "sends a greeting in english",
+ Description: "greets someone in english",
+ Flags: []cli.Flag{
+ cli.StringFlag{
+ Name: "name",
+ Value: "Bob",
+ Usage: "Name of the person to greet",
+ },
+ },
+ Action: func(c *cli.Context) {
+ fmt.Println("Hello,", c.String("name"))
+ },
+ },
+ },
+ },
+ }
+
+ app.Run(os.Args)
+ // Output:
+ // Hello, Jeremy
+}
+
+func ExampleAppHelp() {
+ // set args for examples sake
+ os.Args = []string{"greet", "h", "describeit"}
+
+ app := cli.NewApp()
+ app.Name = "greet"
+ app.Flags = []cli.Flag{
+ cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"},
+ }
+ app.Commands = []cli.Command{
+ {
+ Name: "describeit",
+ ShortName: "d",
+ Usage: "use it to see a description",
+ Description: "This is how we describe describeit the function",
+ Action: func(c *cli.Context) {
+ fmt.Printf("i like to describe things")
+ },
+ },
+ }
+ app.Run(os.Args)
+ // Output:
+ // NAME:
+ // describeit - use it to see a description
+ //
+ // USAGE:
+ // command describeit [arguments...]
+ //
+ // DESCRIPTION:
+ // This is how we describe describeit the function
+}
+
+func ExampleAppBashComplete() {
+ // set args for examples sake
+ os.Args = []string{"greet", "--generate-bash-completion"}
+
+ app := cli.NewApp()
+ app.Name = "greet"
+ app.EnableBashCompletion = true
+ app.Commands = []cli.Command{
+ {
+ Name: "describeit",
+ ShortName: "d",
+ Usage: "use it to see a description",
+ Description: "This is how we describe describeit the function",
+ Action: func(c *cli.Context) {
+ fmt.Printf("i like to describe things")
+ },
+ }, {
+ Name: "next",
+ Usage: "next example",
+ Description: "more stuff to see when generating bash completion",
+ Action: func(c *cli.Context) {
+ fmt.Printf("the next example")
+ },
+ },
+ }
+
+ app.Run(os.Args)
+ // Output:
+ // describeit
+ // d
+ // next
+ // help
+ // h
+}
+
+func TestApp_Run(t *testing.T) {
+ s := ""
+
+ app := cli.NewApp()
+ app.Action = func(c *cli.Context) {
+ s = s + c.Args().First()
+ }
+
+ err := app.Run([]string{"command", "foo"})
+ expect(t, err, nil)
+ err = app.Run([]string{"command", "bar"})
+ expect(t, err, nil)
+ expect(t, s, "foobar")
+}
+
+var commandAppTests = []struct {
+ name string
+ expected bool
+}{
+ {"foobar", true},
+ {"batbaz", true},
+ {"b", true},
+ {"f", true},
+ {"bat", false},
+ {"nothing", false},
+}
+
+func TestApp_Command(t *testing.T) {
+ app := cli.NewApp()
+ fooCommand := cli.Command{Name: "foobar", ShortName: "f"}
+ batCommand := cli.Command{Name: "batbaz", ShortName: "b"}
+ app.Commands = []cli.Command{
+ fooCommand,
+ batCommand,
+ }
+
+ for _, test := range commandAppTests {
+ expect(t, app.Command(test.name) != nil, test.expected)
+ }
+}
+
+func TestApp_CommandWithArgBeforeFlags(t *testing.T) {
+ var parsedOption, firstArg string
+
+ app := cli.NewApp()
+ command := cli.Command{
+ Name: "cmd",
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "option", Value: "", Usage: "some option"},
+ },
+ Action: func(c *cli.Context) {
+ parsedOption = c.String("option")
+ firstArg = c.Args().First()
+ },
+ }
+ app.Commands = []cli.Command{command}
+
+ app.Run([]string{"", "cmd", "my-arg", "--option", "my-option"})
+
+ expect(t, parsedOption, "my-option")
+ expect(t, firstArg, "my-arg")
+}
+
+func TestApp_Float64Flag(t *testing.T) {
+ var meters float64
+
+ app := cli.NewApp()
+ app.Flags = []cli.Flag{
+ cli.Float64Flag{Name: "height", Value: 1.5, Usage: "Set the height, in meters"},
+ }
+ app.Action = func(c *cli.Context) {
+ meters = c.Float64("height")
+ }
+
+ app.Run([]string{"", "--height", "1.93"})
+ expect(t, meters, 1.93)
+}
+
+func TestApp_ParseSliceFlags(t *testing.T) {
+ var parsedOption, firstArg string
+ var parsedIntSlice []int
+ var parsedStringSlice []string
+
+ app := cli.NewApp()
+ command := cli.Command{
+ Name: "cmd",
+ Flags: []cli.Flag{
+ cli.IntSliceFlag{Name: "p", Value: &cli.IntSlice{}, Usage: "set one or more ip addr"},
+ cli.StringSliceFlag{Name: "ip", Value: &cli.StringSlice{}, Usage: "set one or more ports to open"},
+ },
+ Action: func(c *cli.Context) {
+ parsedIntSlice = c.IntSlice("p")
+ parsedStringSlice = c.StringSlice("ip")
+ parsedOption = c.String("option")
+ firstArg = c.Args().First()
+ },
+ }
+ app.Commands = []cli.Command{command}
+
+ app.Run([]string{"", "cmd", "my-arg", "-p", "22", "-p", "80", "-ip", "8.8.8.8", "-ip", "8.8.4.4"})
+
+ IntsEquals := func(a, b []int) bool {
+ if len(a) != len(b) {
+ return false
+ }
+ for i, v := range a {
+ if v != b[i] {
+ return false
+ }
+ }
+ return true
+ }
+
+ StrsEquals := func(a, b []string) bool {
+ if len(a) != len(b) {
+ return false
+ }
+ for i, v := range a {
+ if v != b[i] {
+ return false
+ }
+ }
+ return true
+ }
+ var expectedIntSlice = []int{22, 80}
+ var expectedStringSlice = []string{"8.8.8.8", "8.8.4.4"}
+
+ if !IntsEquals(parsedIntSlice, expectedIntSlice) {
+ t.Errorf("%v does not match %v", parsedIntSlice, expectedIntSlice)
+ }
+
+ if !StrsEquals(parsedStringSlice, expectedStringSlice) {
+ t.Errorf("%v does not match %v", parsedStringSlice, expectedStringSlice)
+ }
+}
+
+func TestApp_DefaultStdout(t *testing.T) {
+ app := cli.NewApp()
+
+ if app.Writer != os.Stdout {
+ t.Error("Default output writer not set.")
+ }
+}
+
+type mockWriter struct {
+ written []byte
+}
+
+func (fw *mockWriter) Write(p []byte) (n int, err error) {
+ if fw.written == nil {
+ fw.written = p
+ } else {
+ fw.written = append(fw.written, p...)
+ }
+
+ return len(p), nil
+}
+
+func (fw *mockWriter) GetWritten() (b []byte) {
+ return fw.written
+}
+
+func TestApp_SetStdout(t *testing.T) {
+ w := &mockWriter{}
+
+ app := cli.NewApp()
+ app.Name = "test"
+ app.Writer = w
+
+ err := app.Run([]string{"help"})
+
+ if err != nil {
+ t.Fatalf("Run error: %s", err)
+ }
+
+ if len(w.written) == 0 {
+ t.Error("App did not write output to desired writer.")
+ }
+}
+
+func TestApp_BeforeFunc(t *testing.T) {
+ beforeRun, subcommandRun := false, false
+ beforeError := fmt.Errorf("fail")
+ var err error
+
+ app := cli.NewApp()
+
+ app.Before = func(c *cli.Context) error {
+ beforeRun = true
+ s := c.String("opt")
+ if s == "fail" {
+ return beforeError
+ }
+
+ return nil
+ }
+
+ app.Commands = []cli.Command{
+ cli.Command{
+ Name: "sub",
+ Action: func(c *cli.Context) {
+ subcommandRun = true
+ },
+ },
+ }
+
+ app.Flags = []cli.Flag{
+ cli.StringFlag{Name: "opt"},
+ }
+
+ // run with the Before() func succeeding
+ err = app.Run([]string{"command", "--opt", "succeed", "sub"})
+
+ if err != nil {
+ t.Fatalf("Run error: %s", err)
+ }
+
+ if beforeRun == false {
+ t.Errorf("Before() not executed when expected")
+ }
+
+ if subcommandRun == false {
+ t.Errorf("Subcommand not executed when expected")
+ }
+
+ // reset
+ beforeRun, subcommandRun = false, false
+
+ // run with the Before() func failing
+ err = app.Run([]string{"command", "--opt", "fail", "sub"})
+
+ // should be the same error produced by the Before func
+ if err != beforeError {
+ t.Errorf("Run error expected, but not received")
+ }
+
+ if beforeRun == false {
+ t.Errorf("Before() not executed when expected")
+ }
+
+ if subcommandRun == true {
+ t.Errorf("Subcommand executed when NOT expected")
+ }
+
+}
+
+func TestAppHelpPrinter(t *testing.T) {
+ oldPrinter := cli.HelpPrinter
+ defer func() {
+ cli.HelpPrinter = oldPrinter
+ }()
+
+ var wasCalled = false
+ cli.HelpPrinter = func(template string, data interface{}) {
+ wasCalled = true
+ }
+
+ app := cli.NewApp()
+ app.Run([]string{"-h"})
+
+ if wasCalled == false {
+ t.Errorf("Help printer expected to be called, but was not")
+ }
+}
+
+func TestAppVersionPrinter(t *testing.T) {
+ oldPrinter := cli.VersionPrinter
+ defer func() {
+ cli.VersionPrinter = oldPrinter
+ }()
+
+ var wasCalled = false
+ cli.VersionPrinter = func(c *cli.Context) {
+ wasCalled = true
+ }
+
+ app := cli.NewApp()
+ ctx := cli.NewContext(app, nil, nil)
+ cli.ShowVersion(ctx)
+
+ if wasCalled == false {
+ t.Errorf("Version printer expected to be called, but was not")
+ }
+}
+
+func TestAppCommandNotFound(t *testing.T) {
+ beforeRun, subcommandRun := false, false
+ app := cli.NewApp()
+
+ app.CommandNotFound = func(c *cli.Context, command string) {
+ beforeRun = true
+ }
+
+ app.Commands = []cli.Command{
+ cli.Command{
+ Name: "bar",
+ Action: func(c *cli.Context) {
+ subcommandRun = true
+ },
+ },
+ }
+
+ app.Run([]string{"command", "foo"})
+
+ expect(t, beforeRun, true)
+ expect(t, subcommandRun, false)
+}
+
+func TestGlobalFlagsInSubcommands(t *testing.T) {
+ subcommandRun := false
+ app := cli.NewApp()
+
+ app.Flags = []cli.Flag{
+ cli.BoolFlag{Name: "debug, d", Usage: "Enable debugging"},
+ }
+
+ app.Commands = []cli.Command{
+ cli.Command{
+ Name: "foo",
+ Subcommands: []cli.Command{
+ {
+ Name: "bar",
+ Action: func(c *cli.Context) {
+ if c.GlobalBool("debug") {
+ subcommandRun = true
+ }
+ },
+ },
+ },
+ },
+ }
+
+ app.Run([]string{"command", "-d", "foo", "bar"})
+
+ expect(t, subcommandRun, true)
+}
diff --git a/vendor/github.com/codegangsta/cli/autocomplete/bash_autocomplete b/vendor/github.com/codegangsta/cli/autocomplete/bash_autocomplete
new file mode 100644
index 000000000..9b55dd990
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/autocomplete/bash_autocomplete
@@ -0,0 +1,13 @@
+#! /bin/bash
+
+_cli_bash_autocomplete() {
+ local cur prev opts base
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+ opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion )
+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+ return 0
+ }
+
+ complete -F _cli_bash_autocomplete $PROG
\ No newline at end of file
diff --git a/vendor/github.com/codegangsta/cli/autocomplete/zsh_autocomplete b/vendor/github.com/codegangsta/cli/autocomplete/zsh_autocomplete
new file mode 100644
index 000000000..5430a18f9
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/autocomplete/zsh_autocomplete
@@ -0,0 +1,5 @@
+autoload -U compinit && compinit
+autoload -U bashcompinit && bashcompinit
+
+script_dir=$(dirname $0)
+source ${script_dir}/bash_autocomplete
diff --git a/vendor/github.com/codegangsta/cli/cli.go b/vendor/github.com/codegangsta/cli/cli.go
new file mode 100644
index 000000000..b74254581
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/cli.go
@@ -0,0 +1,19 @@
+// Package cli provides a minimal framework for creating and organizing command line
+// Go applications. cli is designed to be easy to understand and write, the most simple
+// cli application can be written as follows:
+// func main() {
+// cli.NewApp().Run(os.Args)
+// }
+//
+// Of course this application does not do much, so let's make this an actual application:
+// func main() {
+// app := cli.NewApp()
+// app.Name = "greet"
+// app.Usage = "say a greeting"
+// app.Action = func(c *cli.Context) {
+// println("Greetings")
+// }
+//
+// app.Run(os.Args)
+// }
+package cli
diff --git a/vendor/github.com/codegangsta/cli/cli_test.go b/vendor/github.com/codegangsta/cli/cli_test.go
new file mode 100644
index 000000000..879a793dc
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/cli_test.go
@@ -0,0 +1,100 @@
+package cli_test
+
+import (
+ "os"
+
+ "github.com/codegangsta/cli"
+)
+
+func Example() {
+ app := cli.NewApp()
+ app.Name = "todo"
+ app.Usage = "task list on the command line"
+ app.Commands = []cli.Command{
+ {
+ Name: "add",
+ ShortName: "a",
+ Usage: "add a task to the list",
+ Action: func(c *cli.Context) {
+ println("added task: ", c.Args().First())
+ },
+ },
+ {
+ Name: "complete",
+ ShortName: "c",
+ Usage: "complete a task on the list",
+ Action: func(c *cli.Context) {
+ println("completed task: ", c.Args().First())
+ },
+ },
+ }
+
+ app.Run(os.Args)
+}
+
+func ExampleSubcommand() {
+ app := cli.NewApp()
+ app.Name = "say"
+ app.Commands = []cli.Command{
+ {
+ Name: "hello",
+ ShortName: "hi",
+ Usage: "use it to see a description",
+ Description: "This is how we describe hello the function",
+ Subcommands: []cli.Command{
+ {
+ Name: "english",
+ ShortName: "en",
+ Usage: "sends a greeting in english",
+ Description: "greets someone in english",
+ Flags: []cli.Flag{
+ cli.StringFlag{
+ Name: "name",
+ Value: "Bob",
+ Usage: "Name of the person to greet",
+ },
+ },
+ Action: func(c *cli.Context) {
+ println("Hello, ", c.String("name"))
+ },
+ }, {
+ Name: "spanish",
+ ShortName: "sp",
+ Usage: "sends a greeting in spanish",
+ Flags: []cli.Flag{
+ cli.StringFlag{
+ Name: "surname",
+ Value: "Jones",
+ Usage: "Surname of the person to greet",
+ },
+ },
+ Action: func(c *cli.Context) {
+ println("Hola, ", c.String("surname"))
+ },
+ }, {
+ Name: "french",
+ ShortName: "fr",
+ Usage: "sends a greeting in french",
+ Flags: []cli.Flag{
+ cli.StringFlag{
+ Name: "nickname",
+ Value: "Stevie",
+ Usage: "Nickname of the person to greet",
+ },
+ },
+ Action: func(c *cli.Context) {
+ println("Bonjour, ", c.String("nickname"))
+ },
+ },
+ },
+ }, {
+ Name: "bye",
+ Usage: "says goodbye",
+ Action: func(c *cli.Context) {
+ println("bye")
+ },
+ },
+ }
+
+ app.Run(os.Args)
+}
diff --git a/vendor/github.com/codegangsta/cli/command.go b/vendor/github.com/codegangsta/cli/command.go
new file mode 100644
index 000000000..1536b15e2
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/command.go
@@ -0,0 +1,144 @@
+package cli
+
+import (
+ "fmt"
+ "io/ioutil"
+ "strings"
+)
+
+// Command is a subcommand for a cli.App.
+type Command struct {
+ // The name of the command
+ Name string
+ // short name of the command. Typically one character
+ ShortName string
+ // A short description of the usage of this command
+ Usage string
+ // A longer explanation of how the command works
+ Description string
+ // The function to call when checking for bash command completions
+ BashComplete func(context *Context)
+ // An action to execute before any sub-subcommands are run, but after the context is ready
+ // If a non-nil error is returned, no sub-subcommands are run
+ Before func(context *Context) error
+ // The function to call when this command is invoked
+ Action func(context *Context)
+ // List of child commands
+ Subcommands []Command
+ // List of flags to parse
+ Flags []Flag
+ // Treat all flags as normal arguments if true
+ SkipFlagParsing bool
+ // Boolean to hide built-in help command
+ HideHelp bool
+}
+
+// Invokes the command given the context, parses ctx.Args() to generate command-specific flags
+func (c Command) Run(ctx *Context) error {
+
+ if len(c.Subcommands) > 0 || c.Before != nil {
+ return c.startApp(ctx)
+ }
+
+ if !c.HideHelp {
+ // append help to flags
+ c.Flags = append(
+ c.Flags,
+ HelpFlag,
+ )
+ }
+
+ if ctx.App.EnableBashCompletion {
+ c.Flags = append(c.Flags, BashCompletionFlag)
+ }
+
+ set := flagSet(c.Name, c.Flags)
+ set.SetOutput(ioutil.Discard)
+
+ firstFlagIndex := -1
+ for index, arg := range ctx.Args() {
+ if strings.HasPrefix(arg, "-") {
+ firstFlagIndex = index
+ break
+ }
+ }
+
+ var err error
+ if firstFlagIndex > -1 && !c.SkipFlagParsing {
+ args := ctx.Args()
+ regularArgs := args[1:firstFlagIndex]
+ flagArgs := args[firstFlagIndex:]
+ err = set.Parse(append(flagArgs, regularArgs...))
+ } else {
+ err = set.Parse(ctx.Args().Tail())
+ }
+
+ if err != nil {
+ fmt.Fprint(ctx.App.Writer, "Incorrect Usage.\n\n")
+ ShowCommandHelp(ctx, c.Name)
+ fmt.Fprintln(ctx.App.Writer)
+ return err
+ }
+
+ nerr := normalizeFlags(c.Flags, set)
+ if nerr != nil {
+ fmt.Fprintln(ctx.App.Writer, nerr)
+ fmt.Fprintln(ctx.App.Writer)
+ ShowCommandHelp(ctx, c.Name)
+ fmt.Fprintln(ctx.App.Writer)
+ return nerr
+ }
+ context := NewContext(ctx.App, set, ctx.globalSet)
+
+ if checkCommandCompletions(context, c.Name) {
+ return nil
+ }
+
+ if checkCommandHelp(context, c.Name) {
+ return nil
+ }
+ context.Command = c
+ c.Action(context)
+ return nil
+}
+
+// Returns true if Command.Name or Command.ShortName matches given name
+func (c Command) HasName(name string) bool {
+ return c.Name == name || c.ShortName == name
+}
+
+func (c Command) startApp(ctx *Context) error {
+ app := NewApp()
+
+ // set the name and usage
+ app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name)
+ if c.Description != "" {
+ app.Usage = c.Description
+ } else {
+ app.Usage = c.Usage
+ }
+
+ // set CommandNotFound
+ app.CommandNotFound = ctx.App.CommandNotFound
+
+ // set the flags and commands
+ app.Commands = c.Subcommands
+ app.Flags = c.Flags
+ app.HideHelp = c.HideHelp
+
+ // bash completion
+ app.EnableBashCompletion = ctx.App.EnableBashCompletion
+ if c.BashComplete != nil {
+ app.BashComplete = c.BashComplete
+ }
+
+ // set the actions
+ app.Before = c.Before
+ if c.Action != nil {
+ app.Action = c.Action
+ } else {
+ app.Action = helpSubcommand.Action
+ }
+
+ return app.RunAsSubcommand(ctx)
+}
diff --git a/vendor/github.com/codegangsta/cli/command_test.go b/vendor/github.com/codegangsta/cli/command_test.go
new file mode 100644
index 000000000..c0f556ad2
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/command_test.go
@@ -0,0 +1,49 @@
+package cli_test
+
+import (
+ "flag"
+ "testing"
+
+ "github.com/codegangsta/cli"
+)
+
+func TestCommandDoNotIgnoreFlags(t *testing.T) {
+ app := cli.NewApp()
+ set := flag.NewFlagSet("test", 0)
+ test := []string{"blah", "blah", "-break"}
+ set.Parse(test)
+
+ c := cli.NewContext(app, set, set)
+
+ command := cli.Command{
+ Name: "test-cmd",
+ ShortName: "tc",
+ Usage: "this is for testing",
+ Description: "testing",
+ Action: func(_ *cli.Context) {},
+ }
+ err := command.Run(c)
+
+ expect(t, err.Error(), "flag provided but not defined: -break")
+}
+
+func TestCommandIgnoreFlags(t *testing.T) {
+ app := cli.NewApp()
+ set := flag.NewFlagSet("test", 0)
+ test := []string{"blah", "blah"}
+ set.Parse(test)
+
+ c := cli.NewContext(app, set, set)
+
+ command := cli.Command{
+ Name: "test-cmd",
+ ShortName: "tc",
+ Usage: "this is for testing",
+ Description: "testing",
+ Action: func(_ *cli.Context) {},
+ SkipFlagParsing: true,
+ }
+ err := command.Run(c)
+
+ expect(t, err, nil)
+}
diff --git a/vendor/github.com/codegangsta/cli/context.go b/vendor/github.com/codegangsta/cli/context.go
new file mode 100644
index 000000000..c9f645b18
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/context.go
@@ -0,0 +1,339 @@
+package cli
+
+import (
+ "errors"
+ "flag"
+ "strconv"
+ "strings"
+ "time"
+)
+
+// Context is a type that is passed through to
+// each Handler action in a cli application. Context
+// can be used to retrieve context-specific Args and
+// parsed command-line options.
+type Context struct {
+ App *App
+ Command Command
+ flagSet *flag.FlagSet
+ globalSet *flag.FlagSet
+ setFlags map[string]bool
+ globalSetFlags map[string]bool
+}
+
+// Creates a new context. For use in when invoking an App or Command action.
+func NewContext(app *App, set *flag.FlagSet, globalSet *flag.FlagSet) *Context {
+ return &Context{App: app, flagSet: set, globalSet: globalSet}
+}
+
+// Looks up the value of a local int flag, returns 0 if no int flag exists
+func (c *Context) Int(name string) int {
+ return lookupInt(name, c.flagSet)
+}
+
+// Looks up the value of a local time.Duration flag, returns 0 if no time.Duration flag exists
+func (c *Context) Duration(name string) time.Duration {
+ return lookupDuration(name, c.flagSet)
+}
+
+// Looks up the value of a local float64 flag, returns 0 if no float64 flag exists
+func (c *Context) Float64(name string) float64 {
+ return lookupFloat64(name, c.flagSet)
+}
+
+// Looks up the value of a local bool flag, returns false if no bool flag exists
+func (c *Context) Bool(name string) bool {
+ return lookupBool(name, c.flagSet)
+}
+
+// Looks up the value of a local boolT flag, returns false if no bool flag exists
+func (c *Context) BoolT(name string) bool {
+ return lookupBoolT(name, c.flagSet)
+}
+
+// Looks up the value of a local string flag, returns "" if no string flag exists
+func (c *Context) String(name string) string {
+ return lookupString(name, c.flagSet)
+}
+
+// Looks up the value of a local string slice flag, returns nil if no string slice flag exists
+func (c *Context) StringSlice(name string) []string {
+ return lookupStringSlice(name, c.flagSet)
+}
+
+// Looks up the value of a local int slice flag, returns nil if no int slice flag exists
+func (c *Context) IntSlice(name string) []int {
+ return lookupIntSlice(name, c.flagSet)
+}
+
+// Looks up the value of a local generic flag, returns nil if no generic flag exists
+func (c *Context) Generic(name string) interface{} {
+ return lookupGeneric(name, c.flagSet)
+}
+
+// Looks up the value of a global int flag, returns 0 if no int flag exists
+func (c *Context) GlobalInt(name string) int {
+ return lookupInt(name, c.globalSet)
+}
+
+// Looks up the value of a global time.Duration flag, returns 0 if no time.Duration flag exists
+func (c *Context) GlobalDuration(name string) time.Duration {
+ return lookupDuration(name, c.globalSet)
+}
+
+// Looks up the value of a global bool flag, returns false if no bool flag exists
+func (c *Context) GlobalBool(name string) bool {
+ return lookupBool(name, c.globalSet)
+}
+
+// Looks up the value of a global string flag, returns "" if no string flag exists
+func (c *Context) GlobalString(name string) string {
+ return lookupString(name, c.globalSet)
+}
+
+// Looks up the value of a global string slice flag, returns nil if no string slice flag exists
+func (c *Context) GlobalStringSlice(name string) []string {
+ return lookupStringSlice(name, c.globalSet)
+}
+
+// Looks up the value of a global int slice flag, returns nil if no int slice flag exists
+func (c *Context) GlobalIntSlice(name string) []int {
+ return lookupIntSlice(name, c.globalSet)
+}
+
+// Looks up the value of a global generic flag, returns nil if no generic flag exists
+func (c *Context) GlobalGeneric(name string) interface{} {
+ return lookupGeneric(name, c.globalSet)
+}
+
+// Determines if the flag was actually set
+func (c *Context) IsSet(name string) bool {
+ if c.setFlags == nil {
+ c.setFlags = make(map[string]bool)
+ c.flagSet.Visit(func(f *flag.Flag) {
+ c.setFlags[f.Name] = true
+ })
+ }
+ return c.setFlags[name] == true
+}
+
+// Determines if the global flag was actually set
+func (c *Context) GlobalIsSet(name string) bool {
+ if c.globalSetFlags == nil {
+ c.globalSetFlags = make(map[string]bool)
+ c.globalSet.Visit(func(f *flag.Flag) {
+ c.globalSetFlags[f.Name] = true
+ })
+ }
+ return c.globalSetFlags[name] == true
+}
+
+// Returns a slice of flag names used in this context.
+func (c *Context) FlagNames() (names []string) {
+ for _, flag := range c.Command.Flags {
+ name := strings.Split(flag.getName(), ",")[0]
+ if name == "help" {
+ continue
+ }
+ names = append(names, name)
+ }
+ return
+}
+
+// Returns a slice of global flag names used by the app.
+func (c *Context) GlobalFlagNames() (names []string) {
+ for _, flag := range c.App.Flags {
+ name := strings.Split(flag.getName(), ",")[0]
+ if name == "help" || name == "version" {
+ continue
+ }
+ names = append(names, name)
+ }
+ return
+}
+
+type Args []string
+
+// Returns the command line arguments associated with the context.
+func (c *Context) Args() Args {
+ args := Args(c.flagSet.Args())
+ return args
+}
+
+// Returns the nth argument, or else a blank string
+func (a Args) Get(n int) string {
+ if len(a) > n {
+ return a[n]
+ }
+ return ""
+}
+
+// Returns the first argument, or else a blank string
+func (a Args) First() string {
+ return a.Get(0)
+}
+
+// Return the rest of the arguments (not the first one)
+// or else an empty string slice
+func (a Args) Tail() []string {
+ if len(a) >= 2 {
+ return []string(a)[1:]
+ }
+ return []string{}
+}
+
+// Checks if there are any arguments present
+func (a Args) Present() bool {
+ return len(a) != 0
+}
+
+// Swaps arguments at the given indexes
+func (a Args) Swap(from, to int) error {
+ if from >= len(a) || to >= len(a) {
+ return errors.New("index out of range")
+ }
+ a[from], a[to] = a[to], a[from]
+ return nil
+}
+
+func lookupInt(name string, set *flag.FlagSet) int {
+ f := set.Lookup(name)
+ if f != nil {
+ val, err := strconv.Atoi(f.Value.String())
+ if err != nil {
+ return 0
+ }
+ return val
+ }
+
+ return 0
+}
+
+func lookupDuration(name string, set *flag.FlagSet) time.Duration {
+ f := set.Lookup(name)
+ if f != nil {
+ val, err := time.ParseDuration(f.Value.String())
+ if err == nil {
+ return val
+ }
+ }
+
+ return 0
+}
+
+func lookupFloat64(name string, set *flag.FlagSet) float64 {
+ f := set.Lookup(name)
+ if f != nil {
+ val, err := strconv.ParseFloat(f.Value.String(), 64)
+ if err != nil {
+ return 0
+ }
+ return val
+ }
+
+ return 0
+}
+
+func lookupString(name string, set *flag.FlagSet) string {
+ f := set.Lookup(name)
+ if f != nil {
+ return f.Value.String()
+ }
+
+ return ""
+}
+
+func lookupStringSlice(name string, set *flag.FlagSet) []string {
+ f := set.Lookup(name)
+ if f != nil {
+ return (f.Value.(*StringSlice)).Value()
+
+ }
+
+ return nil
+}
+
+func lookupIntSlice(name string, set *flag.FlagSet) []int {
+ f := set.Lookup(name)
+ if f != nil {
+ return (f.Value.(*IntSlice)).Value()
+
+ }
+
+ return nil
+}
+
+func lookupGeneric(name string, set *flag.FlagSet) interface{} {
+ f := set.Lookup(name)
+ if f != nil {
+ return f.Value
+ }
+ return nil
+}
+
+func lookupBool(name string, set *flag.FlagSet) bool {
+ f := set.Lookup(name)
+ if f != nil {
+ val, err := strconv.ParseBool(f.Value.String())
+ if err != nil {
+ return false
+ }
+ return val
+ }
+
+ return false
+}
+
+func lookupBoolT(name string, set *flag.FlagSet) bool {
+ f := set.Lookup(name)
+ if f != nil {
+ val, err := strconv.ParseBool(f.Value.String())
+ if err != nil {
+ return true
+ }
+ return val
+ }
+
+ return false
+}
+
+func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
+ switch ff.Value.(type) {
+ case *StringSlice:
+ default:
+ set.Set(name, ff.Value.String())
+ }
+}
+
+func normalizeFlags(flags []Flag, set *flag.FlagSet) error {
+ visited := make(map[string]bool)
+ set.Visit(func(f *flag.Flag) {
+ visited[f.Name] = true
+ })
+ for _, f := range flags {
+ parts := strings.Split(f.getName(), ",")
+ if len(parts) == 1 {
+ continue
+ }
+ var ff *flag.Flag
+ for _, name := range parts {
+ name = strings.Trim(name, " ")
+ if visited[name] {
+ if ff != nil {
+ return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name)
+ }
+ ff = set.Lookup(name)
+ }
+ }
+ if ff == nil {
+ continue
+ }
+ for _, name := range parts {
+ name = strings.Trim(name, " ")
+ if !visited[name] {
+ copyFlag(name, ff, set)
+ }
+ }
+ }
+ return nil
+}
diff --git a/vendor/github.com/codegangsta/cli/context_test.go b/vendor/github.com/codegangsta/cli/context_test.go
new file mode 100644
index 000000000..7c9a4436f
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/context_test.go
@@ -0,0 +1,99 @@
+package cli_test
+
+import (
+ "flag"
+ "testing"
+ "time"
+
+ "github.com/codegangsta/cli"
+)
+
+func TestNewContext(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.Int("myflag", 12, "doc")
+ globalSet := flag.NewFlagSet("test", 0)
+ globalSet.Int("myflag", 42, "doc")
+ command := cli.Command{Name: "mycommand"}
+ c := cli.NewContext(nil, set, globalSet)
+ c.Command = command
+ expect(t, c.Int("myflag"), 12)
+ expect(t, c.GlobalInt("myflag"), 42)
+ expect(t, c.Command.Name, "mycommand")
+}
+
+func TestContext_Int(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.Int("myflag", 12, "doc")
+ c := cli.NewContext(nil, set, set)
+ expect(t, c.Int("myflag"), 12)
+}
+
+func TestContext_Duration(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.Duration("myflag", time.Duration(12*time.Second), "doc")
+ c := cli.NewContext(nil, set, set)
+ expect(t, c.Duration("myflag"), time.Duration(12*time.Second))
+}
+
+func TestContext_String(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.String("myflag", "hello world", "doc")
+ c := cli.NewContext(nil, set, set)
+ expect(t, c.String("myflag"), "hello world")
+}
+
+func TestContext_Bool(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.Bool("myflag", false, "doc")
+ c := cli.NewContext(nil, set, set)
+ expect(t, c.Bool("myflag"), false)
+}
+
+func TestContext_BoolT(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.Bool("myflag", true, "doc")
+ c := cli.NewContext(nil, set, set)
+ expect(t, c.BoolT("myflag"), true)
+}
+
+func TestContext_Args(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.Bool("myflag", false, "doc")
+ c := cli.NewContext(nil, set, set)
+ set.Parse([]string{"--myflag", "bat", "baz"})
+ expect(t, len(c.Args()), 2)
+ expect(t, c.Bool("myflag"), true)
+}
+
+func TestContext_IsSet(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.Bool("myflag", false, "doc")
+ set.String("otherflag", "hello world", "doc")
+ globalSet := flag.NewFlagSet("test", 0)
+ globalSet.Bool("myflagGlobal", true, "doc")
+ c := cli.NewContext(nil, set, globalSet)
+ set.Parse([]string{"--myflag", "bat", "baz"})
+ globalSet.Parse([]string{"--myflagGlobal", "bat", "baz"})
+ expect(t, c.IsSet("myflag"), true)
+ expect(t, c.IsSet("otherflag"), false)
+ expect(t, c.IsSet("bogusflag"), false)
+ expect(t, c.IsSet("myflagGlobal"), false)
+}
+
+func TestContext_GlobalIsSet(t *testing.T) {
+ set := flag.NewFlagSet("test", 0)
+ set.Bool("myflag", false, "doc")
+ set.String("otherflag", "hello world", "doc")
+ globalSet := flag.NewFlagSet("test", 0)
+ globalSet.Bool("myflagGlobal", true, "doc")
+ globalSet.Bool("myflagGlobalUnset", true, "doc")
+ c := cli.NewContext(nil, set, globalSet)
+ set.Parse([]string{"--myflag", "bat", "baz"})
+ globalSet.Parse([]string{"--myflagGlobal", "bat", "baz"})
+ expect(t, c.GlobalIsSet("myflag"), false)
+ expect(t, c.GlobalIsSet("otherflag"), false)
+ expect(t, c.GlobalIsSet("bogusflag"), false)
+ expect(t, c.GlobalIsSet("myflagGlobal"), true)
+ expect(t, c.GlobalIsSet("myflagGlobalUnset"), false)
+ expect(t, c.GlobalIsSet("bogusGlobal"), false)
+}
diff --git a/vendor/github.com/codegangsta/cli/flag.go b/vendor/github.com/codegangsta/cli/flag.go
new file mode 100644
index 000000000..ddd6ef8a7
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/flag.go
@@ -0,0 +1,447 @@
+package cli
+
+import (
+ "flag"
+ "fmt"
+ "os"
+ "strconv"
+ "strings"
+ "time"
+)
+
+// This flag enables bash-completion for all commands and subcommands
+var BashCompletionFlag = BoolFlag{
+ Name: "generate-bash-completion",
+}
+
+// This flag prints the version for the application
+var VersionFlag = BoolFlag{
+ Name: "version, v",
+ Usage: "print the version",
+}
+
+// This flag prints the help for all commands and subcommands
+var HelpFlag = BoolFlag{
+ Name: "help, h",
+ Usage: "show help",
+}
+
+// Flag is a common interface related to parsing flags in cli.
+// For more advanced flag parsing techniques, it is recomended that
+// this interface be implemented.
+type Flag interface {
+ fmt.Stringer
+ // Apply Flag settings to the given flag set
+ Apply(*flag.FlagSet)
+ getName() string
+}
+
+func flagSet(name string, flags []Flag) *flag.FlagSet {
+ set := flag.NewFlagSet(name, flag.ContinueOnError)
+
+ for _, f := range flags {
+ f.Apply(set)
+ }
+ return set
+}
+
+func eachName(longName string, fn func(string)) {
+ parts := strings.Split(longName, ",")
+ for _, name := range parts {
+ name = strings.Trim(name, " ")
+ fn(name)
+ }
+}
+
+// Generic is a generic parseable type identified by a specific flag
+type Generic interface {
+ Set(value string) error
+ String() string
+}
+
+// GenericFlag is the flag type for types implementing Generic
+type GenericFlag struct {
+ Name string
+ Value Generic
+ Usage string
+ EnvVar string
+}
+
+func (f GenericFlag) String() string {
+ return withEnvHint(f.EnvVar, fmt.Sprintf("%s%s %v\t`%v` %s", prefixFor(f.Name), f.Name, f.Value, "-"+f.Name+" option -"+f.Name+" option", f.Usage))
+}
+
+func (f GenericFlag) Apply(set *flag.FlagSet) {
+ val := f.Value
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ val.Set(envVal)
+ break
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.Var(f.Value, name, f.Usage)
+ })
+}
+
+func (f GenericFlag) getName() string {
+ return f.Name
+}
+
+type StringSlice []string
+
+func (f *StringSlice) Set(value string) error {
+ *f = append(*f, value)
+ return nil
+}
+
+func (f *StringSlice) String() string {
+ return fmt.Sprintf("%s", *f)
+}
+
+func (f *StringSlice) Value() []string {
+ return *f
+}
+
+type StringSliceFlag struct {
+ Name string
+ Value *StringSlice
+ Usage string
+ EnvVar string
+}
+
+func (f StringSliceFlag) String() string {
+ firstName := strings.Trim(strings.Split(f.Name, ",")[0], " ")
+ pref := prefixFor(firstName)
+ return withEnvHint(f.EnvVar, fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), pref+firstName+" option "+pref+firstName+" option", f.Usage))
+}
+
+func (f StringSliceFlag) Apply(set *flag.FlagSet) {
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ newVal := &StringSlice{}
+ for _, s := range strings.Split(envVal, ",") {
+ s = strings.TrimSpace(s)
+ newVal.Set(s)
+ }
+ f.Value = newVal
+ break
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.Var(f.Value, name, f.Usage)
+ })
+}
+
+func (f StringSliceFlag) getName() string {
+ return f.Name
+}
+
+type IntSlice []int
+
+func (f *IntSlice) Set(value string) error {
+
+ tmp, err := strconv.Atoi(value)
+ if err != nil {
+ return err
+ } else {
+ *f = append(*f, tmp)
+ }
+ return nil
+}
+
+func (f *IntSlice) String() string {
+ return fmt.Sprintf("%d", *f)
+}
+
+func (f *IntSlice) Value() []int {
+ return *f
+}
+
+type IntSliceFlag struct {
+ Name string
+ Value *IntSlice
+ Usage string
+ EnvVar string
+}
+
+func (f IntSliceFlag) String() string {
+ firstName := strings.Trim(strings.Split(f.Name, ",")[0], " ")
+ pref := prefixFor(firstName)
+ return withEnvHint(f.EnvVar, fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), pref+firstName+" option "+pref+firstName+" option", f.Usage))
+}
+
+func (f IntSliceFlag) Apply(set *flag.FlagSet) {
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ newVal := &IntSlice{}
+ for _, s := range strings.Split(envVal, ",") {
+ s = strings.TrimSpace(s)
+ err := newVal.Set(s)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, err.Error())
+ }
+ }
+ f.Value = newVal
+ break
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.Var(f.Value, name, f.Usage)
+ })
+}
+
+func (f IntSliceFlag) getName() string {
+ return f.Name
+}
+
+type BoolFlag struct {
+ Name string
+ Usage string
+ EnvVar string
+}
+
+func (f BoolFlag) String() string {
+ return withEnvHint(f.EnvVar, fmt.Sprintf("%s\t%v", prefixedNames(f.Name), f.Usage))
+}
+
+func (f BoolFlag) Apply(set *flag.FlagSet) {
+ val := false
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ envValBool, err := strconv.ParseBool(envVal)
+ if err == nil {
+ val = envValBool
+ }
+ break
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.Bool(name, val, f.Usage)
+ })
+}
+
+func (f BoolFlag) getName() string {
+ return f.Name
+}
+
+type BoolTFlag struct {
+ Name string
+ Usage string
+ EnvVar string
+}
+
+func (f BoolTFlag) String() string {
+ return withEnvHint(f.EnvVar, fmt.Sprintf("%s\t%v", prefixedNames(f.Name), f.Usage))
+}
+
+func (f BoolTFlag) Apply(set *flag.FlagSet) {
+ val := true
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ envValBool, err := strconv.ParseBool(envVal)
+ if err == nil {
+ val = envValBool
+ break
+ }
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.Bool(name, val, f.Usage)
+ })
+}
+
+func (f BoolTFlag) getName() string {
+ return f.Name
+}
+
+type StringFlag struct {
+ Name string
+ Value string
+ Usage string
+ EnvVar string
+}
+
+func (f StringFlag) String() string {
+ var fmtString string
+ fmtString = "%s %v\t%v"
+
+ if len(f.Value) > 0 {
+ fmtString = "%s '%v'\t%v"
+ } else {
+ fmtString = "%s %v\t%v"
+ }
+
+ return withEnvHint(f.EnvVar, fmt.Sprintf(fmtString, prefixedNames(f.Name), f.Value, f.Usage))
+}
+
+func (f StringFlag) Apply(set *flag.FlagSet) {
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ f.Value = envVal
+ break
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.String(name, f.Value, f.Usage)
+ })
+}
+
+func (f StringFlag) getName() string {
+ return f.Name
+}
+
+type IntFlag struct {
+ Name string
+ Value int
+ Usage string
+ EnvVar string
+}
+
+func (f IntFlag) String() string {
+ return withEnvHint(f.EnvVar, fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), f.Value, f.Usage))
+}
+
+func (f IntFlag) Apply(set *flag.FlagSet) {
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ envValInt, err := strconv.ParseUint(envVal, 10, 64)
+ if err == nil {
+ f.Value = int(envValInt)
+ break
+ }
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.Int(name, f.Value, f.Usage)
+ })
+}
+
+func (f IntFlag) getName() string {
+ return f.Name
+}
+
+type DurationFlag struct {
+ Name string
+ Value time.Duration
+ Usage string
+ EnvVar string
+}
+
+func (f DurationFlag) String() string {
+ return withEnvHint(f.EnvVar, fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), f.Value, f.Usage))
+}
+
+func (f DurationFlag) Apply(set *flag.FlagSet) {
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ envValDuration, err := time.ParseDuration(envVal)
+ if err == nil {
+ f.Value = envValDuration
+ break
+ }
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.Duration(name, f.Value, f.Usage)
+ })
+}
+
+func (f DurationFlag) getName() string {
+ return f.Name
+}
+
+type Float64Flag struct {
+ Name string
+ Value float64
+ Usage string
+ EnvVar string
+}
+
+func (f Float64Flag) String() string {
+ return withEnvHint(f.EnvVar, fmt.Sprintf("%s '%v'\t%v", prefixedNames(f.Name), f.Value, f.Usage))
+}
+
+func (f Float64Flag) Apply(set *flag.FlagSet) {
+ if f.EnvVar != "" {
+ for _, envVar := range strings.Split(f.EnvVar, ",") {
+ envVar = strings.TrimSpace(envVar)
+ if envVal := os.Getenv(envVar); envVal != "" {
+ envValFloat, err := strconv.ParseFloat(envVal, 10)
+ if err == nil {
+ f.Value = float64(envValFloat)
+ }
+ }
+ }
+ }
+
+ eachName(f.Name, func(name string) {
+ set.Float64(name, f.Value, f.Usage)
+ })
+}
+
+func (f Float64Flag) getName() string {
+ return f.Name
+}
+
+func prefixFor(name string) (prefix string) {
+ if len(name) == 1 {
+ prefix = "-"
+ } else {
+ prefix = "--"
+ }
+
+ return
+}
+
+func prefixedNames(fullName string) (prefixed string) {
+ parts := strings.Split(fullName, ",")
+ for i, name := range parts {
+ name = strings.Trim(name, " ")
+ prefixed += prefixFor(name) + name
+ if i < len(parts)-1 {
+ prefixed += ", "
+ }
+ }
+ return
+}
+
+func withEnvHint(envVar, str string) string {
+ envText := ""
+ if envVar != "" {
+ envText = fmt.Sprintf(" [$%s]", strings.Join(strings.Split(envVar, ","), ", $"))
+ }
+ return str + envText
+}
diff --git a/vendor/github.com/codegangsta/cli/flag_test.go b/vendor/github.com/codegangsta/cli/flag_test.go
new file mode 100644
index 000000000..4f0ba555b
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/flag_test.go
@@ -0,0 +1,743 @@
+package cli_test
+
+import (
+ "fmt"
+ "os"
+ "reflect"
+ "strings"
+ "testing"
+
+ "github.com/codegangsta/cli"
+)
+
+var boolFlagTests = []struct {
+ name string
+ expected string
+}{
+ {"help", "--help\t"},
+ {"h", "-h\t"},
+}
+
+func TestBoolFlagHelpOutput(t *testing.T) {
+
+ for _, test := range boolFlagTests {
+ flag := cli.BoolFlag{Name: test.name}
+ output := flag.String()
+
+ if output != test.expected {
+ t.Errorf("%s does not match %s", output, test.expected)
+ }
+ }
+}
+
+var stringFlagTests = []struct {
+ name string
+ value string
+ expected string
+}{
+ {"help", "", "--help \t"},
+ {"h", "", "-h \t"},
+ {"h", "", "-h \t"},
+ {"test", "Something", "--test 'Something'\t"},
+}
+
+func TestStringFlagHelpOutput(t *testing.T) {
+
+ for _, test := range stringFlagTests {
+ flag := cli.StringFlag{Name: test.name, Value: test.value}
+ output := flag.String()
+
+ if output != test.expected {
+ t.Errorf("%s does not match %s", output, test.expected)
+ }
+ }
+}
+
+func TestStringFlagWithEnvVarHelpOutput(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_FOO", "derp")
+ for _, test := range stringFlagTests {
+ flag := cli.StringFlag{Name: test.name, Value: test.value, EnvVar: "APP_FOO"}
+ output := flag.String()
+
+ if !strings.HasSuffix(output, " [$APP_FOO]") {
+ t.Errorf("%s does not end with [$APP_FOO]", output)
+ }
+ }
+}
+
+var stringSliceFlagTests = []struct {
+ name string
+ value *cli.StringSlice
+ expected string
+}{
+ {"help", func() *cli.StringSlice {
+ s := &cli.StringSlice{}
+ s.Set("")
+ return s
+ }(), "--help '--help option --help option'\t"},
+ {"h", func() *cli.StringSlice {
+ s := &cli.StringSlice{}
+ s.Set("")
+ return s
+ }(), "-h '-h option -h option'\t"},
+ {"h", func() *cli.StringSlice {
+ s := &cli.StringSlice{}
+ s.Set("")
+ return s
+ }(), "-h '-h option -h option'\t"},
+ {"test", func() *cli.StringSlice {
+ s := &cli.StringSlice{}
+ s.Set("Something")
+ return s
+ }(), "--test '--test option --test option'\t"},
+}
+
+func TestStringSliceFlagHelpOutput(t *testing.T) {
+
+ for _, test := range stringSliceFlagTests {
+ flag := cli.StringSliceFlag{Name: test.name, Value: test.value}
+ output := flag.String()
+
+ if output != test.expected {
+ t.Errorf("%q does not match %q", output, test.expected)
+ }
+ }
+}
+
+func TestStringSliceFlagWithEnvVarHelpOutput(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_QWWX", "11,4")
+ for _, test := range stringSliceFlagTests {
+ flag := cli.StringSliceFlag{Name: test.name, Value: test.value, EnvVar: "APP_QWWX"}
+ output := flag.String()
+
+ if !strings.HasSuffix(output, " [$APP_QWWX]") {
+ t.Errorf("%q does not end with [$APP_QWWX]", output)
+ }
+ }
+}
+
+var intFlagTests = []struct {
+ name string
+ expected string
+}{
+ {"help", "--help '0'\t"},
+ {"h", "-h '0'\t"},
+}
+
+func TestIntFlagHelpOutput(t *testing.T) {
+
+ for _, test := range intFlagTests {
+ flag := cli.IntFlag{Name: test.name}
+ output := flag.String()
+
+ if output != test.expected {
+ t.Errorf("%s does not match %s", output, test.expected)
+ }
+ }
+}
+
+func TestIntFlagWithEnvVarHelpOutput(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_BAR", "2")
+ for _, test := range intFlagTests {
+ flag := cli.IntFlag{Name: test.name, EnvVar: "APP_BAR"}
+ output := flag.String()
+
+ if !strings.HasSuffix(output, " [$APP_BAR]") {
+ t.Errorf("%s does not end with [$APP_BAR]", output)
+ }
+ }
+}
+
+var durationFlagTests = []struct {
+ name string
+ expected string
+}{
+ {"help", "--help '0'\t"},
+ {"h", "-h '0'\t"},
+}
+
+func TestDurationFlagHelpOutput(t *testing.T) {
+
+ for _, test := range durationFlagTests {
+ flag := cli.DurationFlag{Name: test.name}
+ output := flag.String()
+
+ if output != test.expected {
+ t.Errorf("%s does not match %s", output, test.expected)
+ }
+ }
+}
+
+func TestDurationFlagWithEnvVarHelpOutput(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_BAR", "2h3m6s")
+ for _, test := range durationFlagTests {
+ flag := cli.DurationFlag{Name: test.name, EnvVar: "APP_BAR"}
+ output := flag.String()
+
+ if !strings.HasSuffix(output, " [$APP_BAR]") {
+ t.Errorf("%s does not end with [$APP_BAR]", output)
+ }
+ }
+}
+
+var intSliceFlagTests = []struct {
+ name string
+ value *cli.IntSlice
+ expected string
+}{
+ {"help", &cli.IntSlice{}, "--help '--help option --help option'\t"},
+ {"h", &cli.IntSlice{}, "-h '-h option -h option'\t"},
+ {"h", &cli.IntSlice{}, "-h '-h option -h option'\t"},
+ {"test", func() *cli.IntSlice {
+ i := &cli.IntSlice{}
+ i.Set("9")
+ return i
+ }(), "--test '--test option --test option'\t"},
+}
+
+func TestIntSliceFlagHelpOutput(t *testing.T) {
+
+ for _, test := range intSliceFlagTests {
+ flag := cli.IntSliceFlag{Name: test.name, Value: test.value}
+ output := flag.String()
+
+ if output != test.expected {
+ t.Errorf("%q does not match %q", output, test.expected)
+ }
+ }
+}
+
+func TestIntSliceFlagWithEnvVarHelpOutput(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_SMURF", "42,3")
+ for _, test := range intSliceFlagTests {
+ flag := cli.IntSliceFlag{Name: test.name, Value: test.value, EnvVar: "APP_SMURF"}
+ output := flag.String()
+
+ if !strings.HasSuffix(output, " [$APP_SMURF]") {
+ t.Errorf("%q does not end with [$APP_SMURF]", output)
+ }
+ }
+}
+
+var float64FlagTests = []struct {
+ name string
+ expected string
+}{
+ {"help", "--help '0'\t"},
+ {"h", "-h '0'\t"},
+}
+
+func TestFloat64FlagHelpOutput(t *testing.T) {
+
+ for _, test := range float64FlagTests {
+ flag := cli.Float64Flag{Name: test.name}
+ output := flag.String()
+
+ if output != test.expected {
+ t.Errorf("%s does not match %s", output, test.expected)
+ }
+ }
+}
+
+func TestFloat64FlagWithEnvVarHelpOutput(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_BAZ", "99.4")
+ for _, test := range float64FlagTests {
+ flag := cli.Float64Flag{Name: test.name, EnvVar: "APP_BAZ"}
+ output := flag.String()
+
+ if !strings.HasSuffix(output, " [$APP_BAZ]") {
+ t.Errorf("%s does not end with [$APP_BAZ]", output)
+ }
+ }
+}
+
+var genericFlagTests = []struct {
+ name string
+ value cli.Generic
+ expected string
+}{
+ {"help", &Parser{}, "--help \t`-help option -help option` "},
+ {"h", &Parser{}, "-h \t`-h option -h option` "},
+ {"test", &Parser{}, "--test \t`-test option -test option` "},
+}
+
+func TestGenericFlagHelpOutput(t *testing.T) {
+
+ for _, test := range genericFlagTests {
+ flag := cli.GenericFlag{Name: test.name}
+ output := flag.String()
+
+ if output != test.expected {
+ t.Errorf("%q does not match %q", output, test.expected)
+ }
+ }
+}
+
+func TestGenericFlagWithEnvVarHelpOutput(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_ZAP", "3")
+ for _, test := range genericFlagTests {
+ flag := cli.GenericFlag{Name: test.name, EnvVar: "APP_ZAP"}
+ output := flag.String()
+
+ if !strings.HasSuffix(output, " [$APP_ZAP]") {
+ t.Errorf("%s does not end with [$APP_ZAP]", output)
+ }
+ }
+}
+
+func TestParseMultiString(t *testing.T) {
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "serve, s"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.String("serve") != "10" {
+ t.Errorf("main name not set")
+ }
+ if ctx.String("s") != "10" {
+ t.Errorf("short name not set")
+ }
+ },
+ }).Run([]string{"run", "-s", "10"})
+}
+
+func TestParseMultiStringFromEnv(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_COUNT", "20")
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "count, c", EnvVar: "APP_COUNT"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.String("count") != "20" {
+ t.Errorf("main name not set")
+ }
+ if ctx.String("c") != "20" {
+ t.Errorf("short name not set")
+ }
+ },
+ }).Run([]string{"run"})
+}
+
+func TestParseMultiStringFromEnvCascade(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_COUNT", "20")
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.StringFlag{Name: "count, c", EnvVar: "COMPAT_COUNT,APP_COUNT"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.String("count") != "20" {
+ t.Errorf("main name not set")
+ }
+ if ctx.String("c") != "20" {
+ t.Errorf("short name not set")
+ }
+ },
+ }).Run([]string{"run"})
+}
+
+func TestParseMultiStringSlice(t *testing.T) {
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.StringSliceFlag{Name: "serve, s", Value: &cli.StringSlice{}},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.StringSlice("serve"), []string{"10", "20"}) {
+ t.Errorf("main name not set")
+ }
+ if !reflect.DeepEqual(ctx.StringSlice("s"), []string{"10", "20"}) {
+ t.Errorf("short name not set")
+ }
+ },
+ }).Run([]string{"run", "-s", "10", "-s", "20"})
+}
+
+func TestParseMultiStringSliceFromEnv(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_INTERVALS", "20,30,40")
+
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.StringSliceFlag{Name: "intervals, i", Value: &cli.StringSlice{}, EnvVar: "APP_INTERVALS"},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.StringSlice("intervals"), []string{"20", "30", "40"}) {
+ t.Errorf("main name not set from env")
+ }
+ if !reflect.DeepEqual(ctx.StringSlice("i"), []string{"20", "30", "40"}) {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }).Run([]string{"run"})
+}
+
+func TestParseMultiStringSliceFromEnvCascade(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_INTERVALS", "20,30,40")
+
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.StringSliceFlag{Name: "intervals, i", Value: &cli.StringSlice{}, EnvVar: "COMPAT_INTERVALS,APP_INTERVALS"},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.StringSlice("intervals"), []string{"20", "30", "40"}) {
+ t.Errorf("main name not set from env")
+ }
+ if !reflect.DeepEqual(ctx.StringSlice("i"), []string{"20", "30", "40"}) {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }).Run([]string{"run"})
+}
+
+func TestParseMultiInt(t *testing.T) {
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.IntFlag{Name: "serve, s"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Int("serve") != 10 {
+ t.Errorf("main name not set")
+ }
+ if ctx.Int("s") != 10 {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run", "-s", "10"})
+}
+
+func TestParseMultiIntFromEnv(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_TIMEOUT_SECONDS", "10")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.IntFlag{Name: "timeout, t", EnvVar: "APP_TIMEOUT_SECONDS"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Int("timeout") != 10 {
+ t.Errorf("main name not set")
+ }
+ if ctx.Int("t") != 10 {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+func TestParseMultiIntFromEnvCascade(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_TIMEOUT_SECONDS", "10")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.IntFlag{Name: "timeout, t", EnvVar: "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Int("timeout") != 10 {
+ t.Errorf("main name not set")
+ }
+ if ctx.Int("t") != 10 {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+func TestParseMultiIntSlice(t *testing.T) {
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.IntSliceFlag{Name: "serve, s", Value: &cli.IntSlice{}},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.IntSlice("serve"), []int{10, 20}) {
+ t.Errorf("main name not set")
+ }
+ if !reflect.DeepEqual(ctx.IntSlice("s"), []int{10, 20}) {
+ t.Errorf("short name not set")
+ }
+ },
+ }).Run([]string{"run", "-s", "10", "-s", "20"})
+}
+
+func TestParseMultiIntSliceFromEnv(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_INTERVALS", "20,30,40")
+
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.IntSliceFlag{Name: "intervals, i", Value: &cli.IntSlice{}, EnvVar: "APP_INTERVALS"},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.IntSlice("intervals"), []int{20, 30, 40}) {
+ t.Errorf("main name not set from env")
+ }
+ if !reflect.DeepEqual(ctx.IntSlice("i"), []int{20, 30, 40}) {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }).Run([]string{"run"})
+}
+
+func TestParseMultiIntSliceFromEnvCascade(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_INTERVALS", "20,30,40")
+
+ (&cli.App{
+ Flags: []cli.Flag{
+ cli.IntSliceFlag{Name: "intervals, i", Value: &cli.IntSlice{}, EnvVar: "COMPAT_INTERVALS,APP_INTERVALS"},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.IntSlice("intervals"), []int{20, 30, 40}) {
+ t.Errorf("main name not set from env")
+ }
+ if !reflect.DeepEqual(ctx.IntSlice("i"), []int{20, 30, 40}) {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }).Run([]string{"run"})
+}
+
+func TestParseMultiFloat64(t *testing.T) {
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.Float64Flag{Name: "serve, s"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Float64("serve") != 10.2 {
+ t.Errorf("main name not set")
+ }
+ if ctx.Float64("s") != 10.2 {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run", "-s", "10.2"})
+}
+
+func TestParseMultiFloat64FromEnv(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_TIMEOUT_SECONDS", "15.5")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.Float64Flag{Name: "timeout, t", EnvVar: "APP_TIMEOUT_SECONDS"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Float64("timeout") != 15.5 {
+ t.Errorf("main name not set")
+ }
+ if ctx.Float64("t") != 15.5 {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+func TestParseMultiFloat64FromEnvCascade(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_TIMEOUT_SECONDS", "15.5")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.Float64Flag{Name: "timeout, t", EnvVar: "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Float64("timeout") != 15.5 {
+ t.Errorf("main name not set")
+ }
+ if ctx.Float64("t") != 15.5 {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+func TestParseMultiBool(t *testing.T) {
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.BoolFlag{Name: "serve, s"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Bool("serve") != true {
+ t.Errorf("main name not set")
+ }
+ if ctx.Bool("s") != true {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run", "--serve"})
+}
+
+func TestParseMultiBoolFromEnv(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_DEBUG", "1")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.BoolFlag{Name: "debug, d", EnvVar: "APP_DEBUG"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Bool("debug") != true {
+ t.Errorf("main name not set from env")
+ }
+ if ctx.Bool("d") != true {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+func TestParseMultiBoolFromEnvCascade(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_DEBUG", "1")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.BoolFlag{Name: "debug, d", EnvVar: "COMPAT_DEBUG,APP_DEBUG"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.Bool("debug") != true {
+ t.Errorf("main name not set from env")
+ }
+ if ctx.Bool("d") != true {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+func TestParseMultiBoolT(t *testing.T) {
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.BoolTFlag{Name: "serve, s"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.BoolT("serve") != true {
+ t.Errorf("main name not set")
+ }
+ if ctx.BoolT("s") != true {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run", "--serve"})
+}
+
+func TestParseMultiBoolTFromEnv(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_DEBUG", "0")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.BoolTFlag{Name: "debug, d", EnvVar: "APP_DEBUG"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.BoolT("debug") != false {
+ t.Errorf("main name not set from env")
+ }
+ if ctx.BoolT("d") != false {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+func TestParseMultiBoolTFromEnvCascade(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_DEBUG", "0")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.BoolTFlag{Name: "debug, d", EnvVar: "COMPAT_DEBUG,APP_DEBUG"},
+ },
+ Action: func(ctx *cli.Context) {
+ if ctx.BoolT("debug") != false {
+ t.Errorf("main name not set from env")
+ }
+ if ctx.BoolT("d") != false {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+type Parser [2]string
+
+func (p *Parser) Set(value string) error {
+ parts := strings.Split(value, ",")
+ if len(parts) != 2 {
+ return fmt.Errorf("invalid format")
+ }
+
+ (*p)[0] = parts[0]
+ (*p)[1] = parts[1]
+
+ return nil
+}
+
+func (p *Parser) String() string {
+ return fmt.Sprintf("%s,%s", p[0], p[1])
+}
+
+func TestParseGeneric(t *testing.T) {
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.GenericFlag{Name: "serve, s", Value: &Parser{}},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"10", "20"}) {
+ t.Errorf("main name not set")
+ }
+ if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"10", "20"}) {
+ t.Errorf("short name not set")
+ }
+ },
+ }
+ a.Run([]string{"run", "-s", "10,20"})
+}
+
+func TestParseGenericFromEnv(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_SERVE", "20,30")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.GenericFlag{Name: "serve, s", Value: &Parser{}, EnvVar: "APP_SERVE"},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"20", "30"}) {
+ t.Errorf("main name not set from env")
+ }
+ if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"20", "30"}) {
+ t.Errorf("short name not set from env")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
+
+func TestParseGenericFromEnvCascade(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("APP_FOO", "99,2000")
+ a := cli.App{
+ Flags: []cli.Flag{
+ cli.GenericFlag{Name: "foos", Value: &Parser{}, EnvVar: "COMPAT_FOO,APP_FOO"},
+ },
+ Action: func(ctx *cli.Context) {
+ if !reflect.DeepEqual(ctx.Generic("foos"), &Parser{"99", "2000"}) {
+ t.Errorf("value not set from env")
+ }
+ },
+ }
+ a.Run([]string{"run"})
+}
diff --git a/vendor/github.com/codegangsta/cli/help.go b/vendor/github.com/codegangsta/cli/help.go
new file mode 100644
index 000000000..bfb278851
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/help.go
@@ -0,0 +1,211 @@
+package cli
+
+import "fmt"
+
+// The text template for the Default help topic.
+// cli.go uses text/template to render templates. You can
+// render custom help text by setting this variable.
+var AppHelpTemplate = `NAME:
+ {{.Name}} - {{.Usage}}
+
+USAGE:
+ {{.Name}} {{if .Flags}}[global options] {{end}}command{{if .Flags}} [command options]{{end}} [arguments...]
+
+VERSION:
+ {{.Version}}{{if or .Author .Email}}
+
+AUTHOR:{{if .Author}}
+ {{.Author}}{{if .Email}} - <{{.Email}}>{{end}}{{else}}
+ {{.Email}}{{end}}{{end}}
+
+COMMANDS:
+ {{range .Commands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}}
+ {{end}}{{if .Flags}}
+GLOBAL OPTIONS:
+ {{range .Flags}}{{.}}
+ {{end}}{{end}}
+`
+
+// The text template for the command help topic.
+// cli.go uses text/template to render templates. You can
+// render custom help text by setting this variable.
+var CommandHelpTemplate = `NAME:
+ {{.Name}} - {{.Usage}}
+
+USAGE:
+ command {{.Name}}{{if .Flags}} [command options]{{end}} [arguments...]{{if .Description}}
+
+DESCRIPTION:
+ {{.Description}}{{end}}{{if .Flags}}
+
+OPTIONS:
+ {{range .Flags}}{{.}}
+ {{end}}{{ end }}
+`
+
+// The text template for the subcommand help topic.
+// cli.go uses text/template to render templates. You can
+// render custom help text by setting this variable.
+var SubcommandHelpTemplate = `NAME:
+ {{.Name}} - {{.Usage}}
+
+USAGE:
+ {{.Name}} command{{if .Flags}} [command options]{{end}} [arguments...]
+
+COMMANDS:
+ {{range .Commands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}}
+ {{end}}{{if .Flags}}
+OPTIONS:
+ {{range .Flags}}{{.}}
+ {{end}}{{end}}
+`
+
+var helpCommand = Command{
+ Name: "help",
+ ShortName: "h",
+ Usage: "Shows a list of commands or help for one command",
+ Action: func(c *Context) {
+ args := c.Args()
+ if args.Present() {
+ ShowCommandHelp(c, args.First())
+ } else {
+ ShowAppHelp(c)
+ }
+ },
+}
+
+var helpSubcommand = Command{
+ Name: "help",
+ ShortName: "h",
+ Usage: "Shows a list of commands or help for one command",
+ Action: func(c *Context) {
+ args := c.Args()
+ if args.Present() {
+ ShowCommandHelp(c, args.First())
+ } else {
+ ShowSubcommandHelp(c)
+ }
+ },
+}
+
+// Prints help for the App
+type helpPrinter func(templ string, data interface{})
+
+var HelpPrinter helpPrinter = nil
+
+// Prints version for the App
+var VersionPrinter = printVersion
+
+func ShowAppHelp(c *Context) {
+ HelpPrinter(AppHelpTemplate, c.App)
+}
+
+// Prints the list of subcommands as the default app completion method
+func DefaultAppComplete(c *Context) {
+ for _, command := range c.App.Commands {
+ fmt.Fprintln(c.App.Writer, command.Name)
+ if command.ShortName != "" {
+ fmt.Fprintln(c.App.Writer, command.ShortName)
+ }
+ }
+}
+
+// Prints help for the given command
+func ShowCommandHelp(c *Context, command string) {
+ for _, c := range c.App.Commands {
+ if c.HasName(command) {
+ HelpPrinter(CommandHelpTemplate, c)
+ return
+ }
+ }
+
+ if c.App.CommandNotFound != nil {
+ c.App.CommandNotFound(c, command)
+ } else {
+ fmt.Fprintf(c.App.Writer, "No help topic for '%v'\n", command)
+ }
+}
+
+// Prints help for the given subcommand
+func ShowSubcommandHelp(c *Context) {
+ ShowCommandHelp(c, c.Command.Name)
+}
+
+// Prints the version number of the App
+func ShowVersion(c *Context) {
+ VersionPrinter(c)
+}
+
+func printVersion(c *Context) {
+ fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version)
+}
+
+// Prints the lists of commands within a given context
+func ShowCompletions(c *Context) {
+ a := c.App
+ if a != nil && a.BashComplete != nil {
+ a.BashComplete(c)
+ }
+}
+
+// Prints the custom completions for a given command
+func ShowCommandCompletions(ctx *Context, command string) {
+ c := ctx.App.Command(command)
+ if c != nil && c.BashComplete != nil {
+ c.BashComplete(ctx)
+ }
+}
+
+func checkVersion(c *Context) bool {
+ if c.GlobalBool("version") {
+ ShowVersion(c)
+ return true
+ }
+
+ return false
+}
+
+func checkHelp(c *Context) bool {
+ if c.GlobalBool("h") || c.GlobalBool("help") {
+ ShowAppHelp(c)
+ return true
+ }
+
+ return false
+}
+
+func checkCommandHelp(c *Context, name string) bool {
+ if c.Bool("h") || c.Bool("help") {
+ ShowCommandHelp(c, name)
+ return true
+ }
+
+ return false
+}
+
+func checkSubcommandHelp(c *Context) bool {
+ if c.GlobalBool("h") || c.GlobalBool("help") {
+ ShowSubcommandHelp(c)
+ return true
+ }
+
+ return false
+}
+
+func checkCompletions(c *Context) bool {
+ if (c.GlobalBool(BashCompletionFlag.Name) || c.Bool(BashCompletionFlag.Name)) && c.App.EnableBashCompletion {
+ ShowCompletions(c)
+ return true
+ }
+
+ return false
+}
+
+func checkCommandCompletions(c *Context, name string) bool {
+ if c.Bool(BashCompletionFlag.Name) && c.App.EnableBashCompletion {
+ ShowCommandCompletions(c, name)
+ return true
+ }
+
+ return false
+}
diff --git a/vendor/github.com/codegangsta/cli/helpers_test.go b/vendor/github.com/codegangsta/cli/helpers_test.go
new file mode 100644
index 000000000..cdc4feb2f
--- /dev/null
+++ b/vendor/github.com/codegangsta/cli/helpers_test.go
@@ -0,0 +1,19 @@
+package cli_test
+
+import (
+ "reflect"
+ "testing"
+)
+
+/* Test Helpers */
+func expect(t *testing.T, a interface{}, b interface{}) {
+ if a != b {
+ t.Errorf("Expected %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a))
+ }
+}
+
+func refute(t *testing.T, a interface{}, b interface{}) {
+ if a == b {
+ t.Errorf("Did not expect %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a))
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/README.md b/vendor/github.com/denisenkom/go-mssqldb/README.md
new file mode 100644
index 000000000..50e659209
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/README.md
@@ -0,0 +1,83 @@
+# A pure Go MSSQL driver for Go's database/sql package
+
+## Install
+
+ go get github.com/denisenkom/go-mssqldb
+
+## Tests
+
+`go test` is used for testing. A running instance of MSSQL server is required.
+Environment variables are used to pass login information.
+
+Example:
+
+ env HOST=localhost SQLUSER=sa SQLPASSWORD=sa DATABASE=test go test
+
+## Connection Parameters
+
+* "server" - host or host\instance (default localhost)
+* "port" - used only when there is no instance in server (default 1433)
+* "failoverpartner" - host or host\instance (default is no partner). Used only until a successful connection has been made; thereafter, the partner provided in the first successful connection is used.
+* "failoverport" - used only when there is no instance in failoverpartner (default 1433)
+* "user id" - enter the SQL Server Authentication user id or the Windows Authentication user id in the DOMAIN\User format. On Windows, if user id is empty or missing Single-Sign-On is used.
+* "password"
+* "database"
+* "connection timeout" - in seconds (default is 30)
+* "dial timeout" - in seconds (default is 5)
+* "keepAlive" - in seconds; 0 to disable (default is 0)
+* "log" - logging flags (default 0/no logging, 63 for full logging)
+ * 1 log errors
+ * 2 log messages
+ * 4 log rows affected
+ * 8 trace sql statements
+ * 16 log statement parameters
+ * 32 log transaction begin/end
+* "encrypt"
+ * disable - Data send between client and server is not encrypted.
+ * false - Data sent between client and server is not encrypted beyond the login packet. (Default)
+ * true - Data sent between client and server is encrypted.
+* "TrustServerCertificate"
+ * false - Server certificate is checked. Default is false if encypt is specified.
+ * true - Server certificate is not checked. Default is true if encrypt is not specified. If trust server certificate is true, driver accepts any certificate presented by the server and any host name in that certificate. In this mode, TLS is susceptible to man-in-the-middle attacks. This should be used only for testing.
+* "certificate" - The file that contains the public key certificate of the CA that signed the SQL Server certificate. The specified certificate overrides the go platform specific CA certificates.
+* "hostNameInCertificate" - Specifies the Common Name (CN) in the server certificate. Default value is the server host.
+* "ServerSPN" - The kerberos SPN (Service Principal Name) for the server. Default is MSSQLSvc/host:port.
+* "Workstation ID" - The workstation name (default is the host name)
+* "app name" - The application name (default is go-mssqldb)
+* "ApplicationIntent" - Can be given the value "ReadOnly" to initiate a read-only connection to an Availability Group listener.
+
+Example:
+
+```go
+ db, err := sql.Open("mssql", "server=localhost;user id=sa")
+```
+
+## Statement Parameters
+
+In the SQL statement text, literals may be replaced by a parameter that matches one of the following:
+
+* ?
+* ?nnn
+* :nnn
+* $nnn
+
+where nnn represents an integer.
+
+## Features
+
+* Can be used with SQL Server 2005 or newer
+* Can be used with Microsoft Azure SQL Database
+* Can be used on all go supported platforms (e.g. Linux, Mac OS X and Windows)
+* Supports new date/time types: date, time, datetime2, datetimeoffset
+* Supports string parameters longer than 8000 characters
+* Supports encryption using SSL/TLS
+* Supports SQL Server and Windows Authentication
+* Supports Single-Sign-On on Windows
+* Supports connections to AlwaysOn Availability Group listeners, including re-direction to read-only replicas.
+
+## Known Issues
+
+* SQL Server 2008 and 2008 R2 engine cannot handle login records when SSL encryption is not disabled.
+To fix SQL Server 2008 R2 issue, install SQL Server 2008 R2 Service Pack 2.
+To fix SQL Server 2008 issue, install Microsoft SQL Server 2008 Service Pack 3 and Cumulative update package 3 for SQL Server 2008 SP3.
+More information: http://support.microsoft.com/kb/2653857
diff --git a/vendor/github.com/denisenkom/go-mssqldb/buf.go b/vendor/github.com/denisenkom/go-mssqldb/buf.go
new file mode 100644
index 000000000..4fb2c4798
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/buf.go
@@ -0,0 +1,212 @@
+package mssql
+
+import (
+ "encoding/binary"
+ "io"
+)
+
+type header struct {
+ PacketType uint8
+ Status uint8
+ Size uint16
+ Spid uint16
+ PacketNo uint8
+ Pad uint8
+}
+
+type tdsBuffer struct {
+ buf []byte
+ pos uint16
+ transport io.ReadWriteCloser
+ size uint16
+ final bool
+ packet_type uint8
+ afterFirst func()
+}
+
+func newTdsBuffer(bufsize int, transport io.ReadWriteCloser) *tdsBuffer {
+ buf := make([]byte, bufsize)
+ w := new(tdsBuffer)
+ w.buf = buf
+ w.pos = 8
+ w.transport = transport
+ w.size = 0
+ return w
+}
+
+func (w *tdsBuffer) flush() (err error) {
+ binary.BigEndian.PutUint16(w.buf[2:], w.pos)
+ if _, err = w.transport.Write(w.buf[:w.pos]); err != nil {
+ return err
+ }
+ if w.afterFirst != nil {
+ w.afterFirst()
+ w.afterFirst = nil
+ }
+ w.pos = 8
+ w.buf[6] += 1
+ return nil
+}
+
+func (w *tdsBuffer) Write(p []byte) (nn int, err error) {
+ total := 0
+ for {
+ copied := copy(w.buf[w.pos:], p)
+ w.pos += uint16(copied)
+ total += copied
+ if copied == len(p) {
+ break
+ }
+ if err = w.flush(); err != nil {
+ return total, err
+ }
+ p = p[copied:]
+ }
+ return total, nil
+}
+
+func (w *tdsBuffer) WriteByte(b byte) error {
+ if int(w.pos) == len(w.buf) {
+ if err := w.flush(); err != nil {
+ return err
+ }
+ }
+ w.buf[w.pos] = b
+ w.pos += 1
+ return nil
+}
+
+func (w *tdsBuffer) BeginPacket(packet_type byte) {
+ w.buf[0] = packet_type
+ w.buf[1] = 0 // packet is incomplete
+ w.buf[4] = 0 // spid
+ w.buf[5] = 0
+ w.buf[6] = 1 // packet id
+ w.buf[7] = 0 // window
+ w.pos = 8
+}
+
+func (w *tdsBuffer) FinishPacket() (err error) {
+ w.buf[1] = 1 // packet is complete
+ binary.BigEndian.PutUint16(w.buf[2:], w.pos)
+ _, err = w.transport.Write(w.buf[:w.pos])
+ if w.afterFirst != nil {
+ w.afterFirst()
+ w.afterFirst = nil
+ }
+ return err
+}
+
+func (r *tdsBuffer) readNextPacket() error {
+ header := header{}
+ var err error
+ err = binary.Read(r.transport, binary.BigEndian, &header)
+ if err != nil {
+ return err
+ }
+ offset := uint16(binary.Size(header))
+ _, err = io.ReadFull(r.transport, r.buf[offset:header.Size])
+ if err != nil {
+ return err
+ }
+ r.pos = offset
+ r.size = header.Size
+ r.final = header.Status != 0
+ r.packet_type = header.PacketType
+ return nil
+}
+
+func (r *tdsBuffer) BeginRead() (uint8, error) {
+ err := r.readNextPacket()
+ if err != nil {
+ return 0, err
+ }
+ return r.packet_type, nil
+}
+
+func (r *tdsBuffer) ReadByte() (res byte, err error) {
+ if r.pos == r.size {
+ if r.final {
+ return 0, io.EOF
+ }
+ err = r.readNextPacket()
+ if err != nil {
+ return 0, err
+ }
+ }
+ res = r.buf[r.pos]
+ r.pos++
+ return res, nil
+}
+
+func (r *tdsBuffer) byte() byte {
+ b, err := r.ReadByte()
+ if err != nil {
+ badStreamPanic(err)
+ }
+ return b
+}
+
+func (r *tdsBuffer) ReadFull(buf []byte) {
+ _, err := io.ReadFull(r, buf[:])
+ if err != nil {
+ badStreamPanic(err)
+ }
+}
+
+func (r *tdsBuffer) uint64() uint64 {
+ var buf [8]byte
+ r.ReadFull(buf[:])
+ return binary.LittleEndian.Uint64(buf[:])
+}
+
+func (r *tdsBuffer) int32() int32 {
+ return int32(r.uint32())
+}
+
+func (r *tdsBuffer) uint32() uint32 {
+ var buf [4]byte
+ r.ReadFull(buf[:])
+ return binary.LittleEndian.Uint32(buf[:])
+}
+
+func (r *tdsBuffer) uint16() uint16 {
+ var buf [2]byte
+ r.ReadFull(buf[:])
+ return binary.LittleEndian.Uint16(buf[:])
+}
+
+func (r *tdsBuffer) BVarChar() string {
+ l := int(r.byte())
+ return r.readUcs2(l)
+}
+
+func (r *tdsBuffer) UsVarChar() string {
+ l := int(r.uint16())
+ return r.readUcs2(l)
+}
+
+func (r *tdsBuffer) readUcs2(numchars int) string {
+ b := make([]byte, numchars*2)
+ r.ReadFull(b)
+ res, err := ucs22str(b)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ return res
+}
+
+func (r *tdsBuffer) Read(buf []byte) (n int, err error) {
+ if r.pos == r.size {
+ if r.final {
+ return 0, io.EOF
+ }
+ err = r.readNextPacket()
+ if err != nil {
+ return 0, err
+ }
+ }
+ copied := copy(buf, r.buf[r.pos:r.size])
+ r.pos += uint16(copied)
+ return copied, nil
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/charset.go b/vendor/github.com/denisenkom/go-mssqldb/charset.go
new file mode 100644
index 000000000..f1cc247a9
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/charset.go
@@ -0,0 +1,113 @@
+package mssql
+
+type charsetMap struct {
+ sb [256]rune // single byte runes, -1 for a double byte character lead byte
+ db map[int]rune // double byte runes
+}
+
+func collation2charset(col collation) *charsetMap {
+ // http://msdn.microsoft.com/en-us/library/ms144250.aspx
+ // http://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx
+ switch col.sortId {
+ case 30, 31, 32, 33, 34:
+ return cp437
+ case 40, 41, 42, 44, 49, 55, 56, 57, 58, 59, 60, 61:
+ return cp850
+ case 50, 51, 52, 53, 54, 71, 72, 73, 74, 75:
+ return cp1252
+ case 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96:
+ return cp1250
+ case 104, 105, 106, 107, 108:
+ return cp1251
+ case 112, 113, 114, 121, 124:
+ return cp1253
+ case 128, 129, 130:
+ return cp1254
+ case 136, 137, 138:
+ return cp1255
+ case 144, 145, 146:
+ return cp1256
+ case 152, 153, 154, 155, 156, 157, 158, 159, 160:
+ return cp1257
+ case 183, 184, 185, 186:
+ return cp1252
+ case 192, 193:
+ return cp932
+ case 194, 195:
+ return cp949
+ case 196, 197:
+ return cp950
+ case 198, 199:
+ return cp936
+ case 200:
+ return cp932
+ case 201:
+ return cp949
+ case 202:
+ return cp950
+ case 203:
+ return cp936
+ case 204, 205, 206:
+ return cp874
+ case 210, 211, 212, 213, 214, 215, 216, 217:
+ return cp1252
+ }
+ // http://technet.microsoft.com/en-us/library/aa176553(v=sql.80).aspx
+ switch col.getLcid() {
+ case 0x001e, 0x041e:
+ return cp874
+ case 0x0411, 0x10411:
+ return cp932
+ case 0x0804, 0x1004, 0x20804:
+ return cp936
+ case 0x0012, 0x0412:
+ return cp949
+ case 0x0404, 0x1404, 0x0c04, 0x7c04, 0x30404:
+ return cp950
+ case 0x041c, 0x041a, 0x0405, 0x040e, 0x104e, 0x0415, 0x0418, 0x041b, 0x0424, 0x1040e:
+ return cp1250
+ case 0x0423, 0x0402, 0x042f, 0x0419, 0x081a, 0x0c1a, 0x0422, 0x043f, 0x0444, 0x082c:
+ return cp1251
+ case 0x0408:
+ return cp1253
+ case 0x041f, 0x042c, 0x0443:
+ return cp1254
+ case 0x040d:
+ return cp1255
+ case 0x0401, 0x0801, 0xc01, 0x1001, 0x1401, 0x1801, 0x1c01, 0x2001, 0x2401, 0x2801, 0x2c01, 0x3001, 0x3401, 0x3801, 0x3c01, 0x4001, 0x0429, 0x0420:
+ return cp1256
+ case 0x0425, 0x0426, 0x0427, 0x0827:
+ return cp1257
+ case 0x042a:
+ return cp1258
+ case 0x0439, 0x045a, 0x0465:
+ return nil
+ }
+ return cp1252
+}
+
+func charset2utf8(col collation, s []byte) string {
+ cm := collation2charset(col)
+ if cm == nil {
+ return string(s)
+ }
+ buf := make([]rune, 0, len(s))
+ for i := 0; i < len(s); i++ {
+ ch := cm.sb[s[i]]
+ if ch == -1 {
+ if i+1 == len(s) {
+ ch = 0xfffd
+ } else {
+ n := int(s[i+1]) + (int(s[i]) << 8)
+ i++
+ var ok bool
+ ch, ok = cm.db[n]
+ if !ok {
+ ch = 0xfffd
+ }
+ }
+ }
+ buf = append(buf, ch)
+ }
+ return string(buf)
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/collation.go b/vendor/github.com/denisenkom/go-mssqldb/collation.go
new file mode 100644
index 000000000..ac9cf20b7
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/collation.go
@@ -0,0 +1,39 @@
+package mssql
+
+import (
+ "encoding/binary"
+ "io"
+)
+
+// http://msdn.microsoft.com/en-us/library/dd340437.aspx
+
+type collation struct {
+ lcidAndFlags uint32
+ sortId uint8
+}
+
+func (c collation) getLcid() uint32 {
+ return c.lcidAndFlags & 0x000fffff
+}
+
+func (c collation) getFlags() uint32 {
+ return (c.lcidAndFlags & 0x0ff00000) >> 20
+}
+
+func (c collation) getVersion() uint32 {
+ return (c.lcidAndFlags & 0xf0000000) >> 28
+}
+
+func readCollation(r *tdsBuffer) (res collation) {
+ res.lcidAndFlags = r.uint32()
+ res.sortId = r.byte()
+ return
+}
+
+func writeCollation(w io.Writer, col collation) (err error) {
+ if err = binary.Write(w, binary.LittleEndian, col.lcidAndFlags); err != nil {
+ return
+ }
+ err = binary.Write(w, binary.LittleEndian, col.sortId)
+ return
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1250.go b/vendor/github.com/denisenkom/go-mssqldb/cp1250.go
new file mode 100644
index 000000000..8207366be
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1250.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1250 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0xFFFD, //UNDEFINED
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0xFFFD, //UNDEFINED
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0xFFFD, //UNDEFINED
+ 0x2030, //PER MILLE SIGN
+ 0x0160, //LATIN CAPITAL LETTER S WITH CARON
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x015A, //LATIN CAPITAL LETTER S WITH ACUTE
+ 0x0164, //LATIN CAPITAL LETTER T WITH CARON
+ 0x017D, //LATIN CAPITAL LETTER Z WITH CARON
+ 0x0179, //LATIN CAPITAL LETTER Z WITH ACUTE
+ 0xFFFD, //UNDEFINED
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0xFFFD, //UNDEFINED
+ 0x2122, //TRADE MARK SIGN
+ 0x0161, //LATIN SMALL LETTER S WITH CARON
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x015B, //LATIN SMALL LETTER S WITH ACUTE
+ 0x0165, //LATIN SMALL LETTER T WITH CARON
+ 0x017E, //LATIN SMALL LETTER Z WITH CARON
+ 0x017A, //LATIN SMALL LETTER Z WITH ACUTE
+ 0x00A0, //NO-BREAK SPACE
+ 0x02C7, //CARON
+ 0x02D8, //BREVE
+ 0x0141, //LATIN CAPITAL LETTER L WITH STROKE
+ 0x00A4, //CURRENCY SIGN
+ 0x0104, //LATIN CAPITAL LETTER A WITH OGONEK
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x00A8, //DIAERESIS
+ 0x00A9, //COPYRIGHT SIGN
+ 0x015E, //LATIN CAPITAL LETTER S WITH CEDILLA
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x017B, //LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x02DB, //OGONEK
+ 0x0142, //LATIN SMALL LETTER L WITH STROKE
+ 0x00B4, //ACUTE ACCENT
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x00B8, //CEDILLA
+ 0x0105, //LATIN SMALL LETTER A WITH OGONEK
+ 0x015F, //LATIN SMALL LETTER S WITH CEDILLA
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x013D, //LATIN CAPITAL LETTER L WITH CARON
+ 0x02DD, //DOUBLE ACUTE ACCENT
+ 0x013E, //LATIN SMALL LETTER L WITH CARON
+ 0x017C, //LATIN SMALL LETTER Z WITH DOT ABOVE
+ 0x0154, //LATIN CAPITAL LETTER R WITH ACUTE
+ 0x00C1, //LATIN CAPITAL LETTER A WITH ACUTE
+ 0x00C2, //LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x0102, //LATIN CAPITAL LETTER A WITH BREVE
+ 0x00C4, //LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x0139, //LATIN CAPITAL LETTER L WITH ACUTE
+ 0x0106, //LATIN CAPITAL LETTER C WITH ACUTE
+ 0x00C7, //LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x010C, //LATIN CAPITAL LETTER C WITH CARON
+ 0x00C9, //LATIN CAPITAL LETTER E WITH ACUTE
+ 0x0118, //LATIN CAPITAL LETTER E WITH OGONEK
+ 0x00CB, //LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x011A, //LATIN CAPITAL LETTER E WITH CARON
+ 0x00CD, //LATIN CAPITAL LETTER I WITH ACUTE
+ 0x00CE, //LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x010E, //LATIN CAPITAL LETTER D WITH CARON
+ 0x0110, //LATIN CAPITAL LETTER D WITH STROKE
+ 0x0143, //LATIN CAPITAL LETTER N WITH ACUTE
+ 0x0147, //LATIN CAPITAL LETTER N WITH CARON
+ 0x00D3, //LATIN CAPITAL LETTER O WITH ACUTE
+ 0x00D4, //LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x0150, //LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ 0x00D6, //LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //MULTIPLICATION SIGN
+ 0x0158, //LATIN CAPITAL LETTER R WITH CARON
+ 0x016E, //LATIN CAPITAL LETTER U WITH RING ABOVE
+ 0x00DA, //LATIN CAPITAL LETTER U WITH ACUTE
+ 0x0170, //LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ 0x00DC, //LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x00DD, //LATIN CAPITAL LETTER Y WITH ACUTE
+ 0x0162, //LATIN CAPITAL LETTER T WITH CEDILLA
+ 0x00DF, //LATIN SMALL LETTER SHARP S
+ 0x0155, //LATIN SMALL LETTER R WITH ACUTE
+ 0x00E1, //LATIN SMALL LETTER A WITH ACUTE
+ 0x00E2, //LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x0103, //LATIN SMALL LETTER A WITH BREVE
+ 0x00E4, //LATIN SMALL LETTER A WITH DIAERESIS
+ 0x013A, //LATIN SMALL LETTER L WITH ACUTE
+ 0x0107, //LATIN SMALL LETTER C WITH ACUTE
+ 0x00E7, //LATIN SMALL LETTER C WITH CEDILLA
+ 0x010D, //LATIN SMALL LETTER C WITH CARON
+ 0x00E9, //LATIN SMALL LETTER E WITH ACUTE
+ 0x0119, //LATIN SMALL LETTER E WITH OGONEK
+ 0x00EB, //LATIN SMALL LETTER E WITH DIAERESIS
+ 0x011B, //LATIN SMALL LETTER E WITH CARON
+ 0x00ED, //LATIN SMALL LETTER I WITH ACUTE
+ 0x00EE, //LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x010F, //LATIN SMALL LETTER D WITH CARON
+ 0x0111, //LATIN SMALL LETTER D WITH STROKE
+ 0x0144, //LATIN SMALL LETTER N WITH ACUTE
+ 0x0148, //LATIN SMALL LETTER N WITH CARON
+ 0x00F3, //LATIN SMALL LETTER O WITH ACUTE
+ 0x00F4, //LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x0151, //LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ 0x00F6, //LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //DIVISION SIGN
+ 0x0159, //LATIN SMALL LETTER R WITH CARON
+ 0x016F, //LATIN SMALL LETTER U WITH RING ABOVE
+ 0x00FA, //LATIN SMALL LETTER U WITH ACUTE
+ 0x0171, //LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ 0x00FC, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0x00FD, //LATIN SMALL LETTER Y WITH ACUTE
+ 0x0163, //LATIN SMALL LETTER T WITH CEDILLA
+ 0x02D9, //DOT ABOVE
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1251.go b/vendor/github.com/denisenkom/go-mssqldb/cp1251.go
new file mode 100644
index 000000000..f5b81c393
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1251.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1251 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x0402, //CYRILLIC CAPITAL LETTER DJE
+ 0x0403, //CYRILLIC CAPITAL LETTER GJE
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0x0453, //CYRILLIC SMALL LETTER GJE
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0x20AC, //EURO SIGN
+ 0x2030, //PER MILLE SIGN
+ 0x0409, //CYRILLIC CAPITAL LETTER LJE
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x040A, //CYRILLIC CAPITAL LETTER NJE
+ 0x040C, //CYRILLIC CAPITAL LETTER KJE
+ 0x040B, //CYRILLIC CAPITAL LETTER TSHE
+ 0x040F, //CYRILLIC CAPITAL LETTER DZHE
+ 0x0452, //CYRILLIC SMALL LETTER DJE
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0xFFFD, //UNDEFINED
+ 0x2122, //TRADE MARK SIGN
+ 0x0459, //CYRILLIC SMALL LETTER LJE
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x045A, //CYRILLIC SMALL LETTER NJE
+ 0x045C, //CYRILLIC SMALL LETTER KJE
+ 0x045B, //CYRILLIC SMALL LETTER TSHE
+ 0x045F, //CYRILLIC SMALL LETTER DZHE
+ 0x00A0, //NO-BREAK SPACE
+ 0x040E, //CYRILLIC CAPITAL LETTER SHORT U
+ 0x045E, //CYRILLIC SMALL LETTER SHORT U
+ 0x0408, //CYRILLIC CAPITAL LETTER JE
+ 0x00A4, //CURRENCY SIGN
+ 0x0490, //CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x0401, //CYRILLIC CAPITAL LETTER IO
+ 0x00A9, //COPYRIGHT SIGN
+ 0x0404, //CYRILLIC CAPITAL LETTER UKRAINIAN IE
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x0407, //CYRILLIC CAPITAL LETTER YI
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x0406, //CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ 0x0456, //CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ 0x0491, //CYRILLIC SMALL LETTER GHE WITH UPTURN
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x0451, //CYRILLIC SMALL LETTER IO
+ 0x2116, //NUMERO SIGN
+ 0x0454, //CYRILLIC SMALL LETTER UKRAINIAN IE
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x0458, //CYRILLIC SMALL LETTER JE
+ 0x0405, //CYRILLIC CAPITAL LETTER DZE
+ 0x0455, //CYRILLIC SMALL LETTER DZE
+ 0x0457, //CYRILLIC SMALL LETTER YI
+ 0x0410, //CYRILLIC CAPITAL LETTER A
+ 0x0411, //CYRILLIC CAPITAL LETTER BE
+ 0x0412, //CYRILLIC CAPITAL LETTER VE
+ 0x0413, //CYRILLIC CAPITAL LETTER GHE
+ 0x0414, //CYRILLIC CAPITAL LETTER DE
+ 0x0415, //CYRILLIC CAPITAL LETTER IE
+ 0x0416, //CYRILLIC CAPITAL LETTER ZHE
+ 0x0417, //CYRILLIC CAPITAL LETTER ZE
+ 0x0418, //CYRILLIC CAPITAL LETTER I
+ 0x0419, //CYRILLIC CAPITAL LETTER SHORT I
+ 0x041A, //CYRILLIC CAPITAL LETTER KA
+ 0x041B, //CYRILLIC CAPITAL LETTER EL
+ 0x041C, //CYRILLIC CAPITAL LETTER EM
+ 0x041D, //CYRILLIC CAPITAL LETTER EN
+ 0x041E, //CYRILLIC CAPITAL LETTER O
+ 0x041F, //CYRILLIC CAPITAL LETTER PE
+ 0x0420, //CYRILLIC CAPITAL LETTER ER
+ 0x0421, //CYRILLIC CAPITAL LETTER ES
+ 0x0422, //CYRILLIC CAPITAL LETTER TE
+ 0x0423, //CYRILLIC CAPITAL LETTER U
+ 0x0424, //CYRILLIC CAPITAL LETTER EF
+ 0x0425, //CYRILLIC CAPITAL LETTER HA
+ 0x0426, //CYRILLIC CAPITAL LETTER TSE
+ 0x0427, //CYRILLIC CAPITAL LETTER CHE
+ 0x0428, //CYRILLIC CAPITAL LETTER SHA
+ 0x0429, //CYRILLIC CAPITAL LETTER SHCHA
+ 0x042A, //CYRILLIC CAPITAL LETTER HARD SIGN
+ 0x042B, //CYRILLIC CAPITAL LETTER YERU
+ 0x042C, //CYRILLIC CAPITAL LETTER SOFT SIGN
+ 0x042D, //CYRILLIC CAPITAL LETTER E
+ 0x042E, //CYRILLIC CAPITAL LETTER YU
+ 0x042F, //CYRILLIC CAPITAL LETTER YA
+ 0x0430, //CYRILLIC SMALL LETTER A
+ 0x0431, //CYRILLIC SMALL LETTER BE
+ 0x0432, //CYRILLIC SMALL LETTER VE
+ 0x0433, //CYRILLIC SMALL LETTER GHE
+ 0x0434, //CYRILLIC SMALL LETTER DE
+ 0x0435, //CYRILLIC SMALL LETTER IE
+ 0x0436, //CYRILLIC SMALL LETTER ZHE
+ 0x0437, //CYRILLIC SMALL LETTER ZE
+ 0x0438, //CYRILLIC SMALL LETTER I
+ 0x0439, //CYRILLIC SMALL LETTER SHORT I
+ 0x043A, //CYRILLIC SMALL LETTER KA
+ 0x043B, //CYRILLIC SMALL LETTER EL
+ 0x043C, //CYRILLIC SMALL LETTER EM
+ 0x043D, //CYRILLIC SMALL LETTER EN
+ 0x043E, //CYRILLIC SMALL LETTER O
+ 0x043F, //CYRILLIC SMALL LETTER PE
+ 0x0440, //CYRILLIC SMALL LETTER ER
+ 0x0441, //CYRILLIC SMALL LETTER ES
+ 0x0442, //CYRILLIC SMALL LETTER TE
+ 0x0443, //CYRILLIC SMALL LETTER U
+ 0x0444, //CYRILLIC SMALL LETTER EF
+ 0x0445, //CYRILLIC SMALL LETTER HA
+ 0x0446, //CYRILLIC SMALL LETTER TSE
+ 0x0447, //CYRILLIC SMALL LETTER CHE
+ 0x0448, //CYRILLIC SMALL LETTER SHA
+ 0x0449, //CYRILLIC SMALL LETTER SHCHA
+ 0x044A, //CYRILLIC SMALL LETTER HARD SIGN
+ 0x044B, //CYRILLIC SMALL LETTER YERU
+ 0x044C, //CYRILLIC SMALL LETTER SOFT SIGN
+ 0x044D, //CYRILLIC SMALL LETTER E
+ 0x044E, //CYRILLIC SMALL LETTER YU
+ 0x044F, //CYRILLIC SMALL LETTER YA
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1252.go b/vendor/github.com/denisenkom/go-mssqldb/cp1252.go
new file mode 100644
index 000000000..ed705d35a
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1252.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1252 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0xFFFD, //UNDEFINED
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0x02C6, //MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //PER MILLE SIGN
+ 0x0160, //LATIN CAPITAL LETTER S WITH CARON
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x0152, //LATIN CAPITAL LIGATURE OE
+ 0xFFFD, //UNDEFINED
+ 0x017D, //LATIN CAPITAL LETTER Z WITH CARON
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0x02DC, //SMALL TILDE
+ 0x2122, //TRADE MARK SIGN
+ 0x0161, //LATIN SMALL LETTER S WITH CARON
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x0153, //LATIN SMALL LIGATURE OE
+ 0xFFFD, //UNDEFINED
+ 0x017E, //LATIN SMALL LETTER Z WITH CARON
+ 0x0178, //LATIN CAPITAL LETTER Y WITH DIAERESIS
+ 0x00A0, //NO-BREAK SPACE
+ 0x00A1, //INVERTED EXCLAMATION MARK
+ 0x00A2, //CENT SIGN
+ 0x00A3, //POUND SIGN
+ 0x00A4, //CURRENCY SIGN
+ 0x00A5, //YEN SIGN
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x00A8, //DIAERESIS
+ 0x00A9, //COPYRIGHT SIGN
+ 0x00AA, //FEMININE ORDINAL INDICATOR
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x00AF, //MACRON
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x00B2, //SUPERSCRIPT TWO
+ 0x00B3, //SUPERSCRIPT THREE
+ 0x00B4, //ACUTE ACCENT
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x00B8, //CEDILLA
+ 0x00B9, //SUPERSCRIPT ONE
+ 0x00BA, //MASCULINE ORDINAL INDICATOR
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //VULGAR FRACTION ONE QUARTER
+ 0x00BD, //VULGAR FRACTION ONE HALF
+ 0x00BE, //VULGAR FRACTION THREE QUARTERS
+ 0x00BF, //INVERTED QUESTION MARK
+ 0x00C0, //LATIN CAPITAL LETTER A WITH GRAVE
+ 0x00C1, //LATIN CAPITAL LETTER A WITH ACUTE
+ 0x00C2, //LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x00C3, //LATIN CAPITAL LETTER A WITH TILDE
+ 0x00C4, //LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00C5, //LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x00C6, //LATIN CAPITAL LETTER AE
+ 0x00C7, //LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x00C8, //LATIN CAPITAL LETTER E WITH GRAVE
+ 0x00C9, //LATIN CAPITAL LETTER E WITH ACUTE
+ 0x00CA, //LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ 0x00CB, //LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x00CC, //LATIN CAPITAL LETTER I WITH GRAVE
+ 0x00CD, //LATIN CAPITAL LETTER I WITH ACUTE
+ 0x00CE, //LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x00CF, //LATIN CAPITAL LETTER I WITH DIAERESIS
+ 0x00D0, //LATIN CAPITAL LETTER ETH
+ 0x00D1, //LATIN CAPITAL LETTER N WITH TILDE
+ 0x00D2, //LATIN CAPITAL LETTER O WITH GRAVE
+ 0x00D3, //LATIN CAPITAL LETTER O WITH ACUTE
+ 0x00D4, //LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x00D5, //LATIN CAPITAL LETTER O WITH TILDE
+ 0x00D6, //LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //MULTIPLICATION SIGN
+ 0x00D8, //LATIN CAPITAL LETTER O WITH STROKE
+ 0x00D9, //LATIN CAPITAL LETTER U WITH GRAVE
+ 0x00DA, //LATIN CAPITAL LETTER U WITH ACUTE
+ 0x00DB, //LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ 0x00DC, //LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x00DD, //LATIN CAPITAL LETTER Y WITH ACUTE
+ 0x00DE, //LATIN CAPITAL LETTER THORN
+ 0x00DF, //LATIN SMALL LETTER SHARP S
+ 0x00E0, //LATIN SMALL LETTER A WITH GRAVE
+ 0x00E1, //LATIN SMALL LETTER A WITH ACUTE
+ 0x00E2, //LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x00E3, //LATIN SMALL LETTER A WITH TILDE
+ 0x00E4, //LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00E5, //LATIN SMALL LETTER A WITH RING ABOVE
+ 0x00E6, //LATIN SMALL LETTER AE
+ 0x00E7, //LATIN SMALL LETTER C WITH CEDILLA
+ 0x00E8, //LATIN SMALL LETTER E WITH GRAVE
+ 0x00E9, //LATIN SMALL LETTER E WITH ACUTE
+ 0x00EA, //LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00EB, //LATIN SMALL LETTER E WITH DIAERESIS
+ 0x00EC, //LATIN SMALL LETTER I WITH GRAVE
+ 0x00ED, //LATIN SMALL LETTER I WITH ACUTE
+ 0x00EE, //LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00EF, //LATIN SMALL LETTER I WITH DIAERESIS
+ 0x00F0, //LATIN SMALL LETTER ETH
+ 0x00F1, //LATIN SMALL LETTER N WITH TILDE
+ 0x00F2, //LATIN SMALL LETTER O WITH GRAVE
+ 0x00F3, //LATIN SMALL LETTER O WITH ACUTE
+ 0x00F4, //LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x00F5, //LATIN SMALL LETTER O WITH TILDE
+ 0x00F6, //LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //DIVISION SIGN
+ 0x00F8, //LATIN SMALL LETTER O WITH STROKE
+ 0x00F9, //LATIN SMALL LETTER U WITH GRAVE
+ 0x00FA, //LATIN SMALL LETTER U WITH ACUTE
+ 0x00FB, //LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00FC, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0x00FD, //LATIN SMALL LETTER Y WITH ACUTE
+ 0x00FE, //LATIN SMALL LETTER THORN
+ 0x00FF, //LATIN SMALL LETTER Y WITH DIAERESIS
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1253.go b/vendor/github.com/denisenkom/go-mssqldb/cp1253.go
new file mode 100644
index 000000000..cb1e1a762
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1253.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1253 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0xFFFD, //UNDEFINED
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0xFFFD, //UNDEFINED
+ 0x2030, //PER MILLE SIGN
+ 0xFFFD, //UNDEFINED
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0xFFFD, //UNDEFINED
+ 0x2122, //TRADE MARK SIGN
+ 0xFFFD, //UNDEFINED
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x00A0, //NO-BREAK SPACE
+ 0x0385, //GREEK DIALYTIKA TONOS
+ 0x0386, //GREEK CAPITAL LETTER ALPHA WITH TONOS
+ 0x00A3, //POUND SIGN
+ 0x00A4, //CURRENCY SIGN
+ 0x00A5, //YEN SIGN
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x00A8, //DIAERESIS
+ 0x00A9, //COPYRIGHT SIGN
+ 0xFFFD, //UNDEFINED
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x2015, //HORIZONTAL BAR
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x00B2, //SUPERSCRIPT TWO
+ 0x00B3, //SUPERSCRIPT THREE
+ 0x0384, //GREEK TONOS
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x0388, //GREEK CAPITAL LETTER EPSILON WITH TONOS
+ 0x0389, //GREEK CAPITAL LETTER ETA WITH TONOS
+ 0x038A, //GREEK CAPITAL LETTER IOTA WITH TONOS
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x038C, //GREEK CAPITAL LETTER OMICRON WITH TONOS
+ 0x00BD, //VULGAR FRACTION ONE HALF
+ 0x038E, //GREEK CAPITAL LETTER UPSILON WITH TONOS
+ 0x038F, //GREEK CAPITAL LETTER OMEGA WITH TONOS
+ 0x0390, //GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ 0x0391, //GREEK CAPITAL LETTER ALPHA
+ 0x0392, //GREEK CAPITAL LETTER BETA
+ 0x0393, //GREEK CAPITAL LETTER GAMMA
+ 0x0394, //GREEK CAPITAL LETTER DELTA
+ 0x0395, //GREEK CAPITAL LETTER EPSILON
+ 0x0396, //GREEK CAPITAL LETTER ZETA
+ 0x0397, //GREEK CAPITAL LETTER ETA
+ 0x0398, //GREEK CAPITAL LETTER THETA
+ 0x0399, //GREEK CAPITAL LETTER IOTA
+ 0x039A, //GREEK CAPITAL LETTER KAPPA
+ 0x039B, //GREEK CAPITAL LETTER LAMDA
+ 0x039C, //GREEK CAPITAL LETTER MU
+ 0x039D, //GREEK CAPITAL LETTER NU
+ 0x039E, //GREEK CAPITAL LETTER XI
+ 0x039F, //GREEK CAPITAL LETTER OMICRON
+ 0x03A0, //GREEK CAPITAL LETTER PI
+ 0x03A1, //GREEK CAPITAL LETTER RHO
+ 0xFFFD, //UNDEFINED
+ 0x03A3, //GREEK CAPITAL LETTER SIGMA
+ 0x03A4, //GREEK CAPITAL LETTER TAU
+ 0x03A5, //GREEK CAPITAL LETTER UPSILON
+ 0x03A6, //GREEK CAPITAL LETTER PHI
+ 0x03A7, //GREEK CAPITAL LETTER CHI
+ 0x03A8, //GREEK CAPITAL LETTER PSI
+ 0x03A9, //GREEK CAPITAL LETTER OMEGA
+ 0x03AA, //GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+ 0x03AB, //GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ 0x03AC, //GREEK SMALL LETTER ALPHA WITH TONOS
+ 0x03AD, //GREEK SMALL LETTER EPSILON WITH TONOS
+ 0x03AE, //GREEK SMALL LETTER ETA WITH TONOS
+ 0x03AF, //GREEK SMALL LETTER IOTA WITH TONOS
+ 0x03B0, //GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+ 0x03B1, //GREEK SMALL LETTER ALPHA
+ 0x03B2, //GREEK SMALL LETTER BETA
+ 0x03B3, //GREEK SMALL LETTER GAMMA
+ 0x03B4, //GREEK SMALL LETTER DELTA
+ 0x03B5, //GREEK SMALL LETTER EPSILON
+ 0x03B6, //GREEK SMALL LETTER ZETA
+ 0x03B7, //GREEK SMALL LETTER ETA
+ 0x03B8, //GREEK SMALL LETTER THETA
+ 0x03B9, //GREEK SMALL LETTER IOTA
+ 0x03BA, //GREEK SMALL LETTER KAPPA
+ 0x03BB, //GREEK SMALL LETTER LAMDA
+ 0x03BC, //GREEK SMALL LETTER MU
+ 0x03BD, //GREEK SMALL LETTER NU
+ 0x03BE, //GREEK SMALL LETTER XI
+ 0x03BF, //GREEK SMALL LETTER OMICRON
+ 0x03C0, //GREEK SMALL LETTER PI
+ 0x03C1, //GREEK SMALL LETTER RHO
+ 0x03C2, //GREEK SMALL LETTER FINAL SIGMA
+ 0x03C3, //GREEK SMALL LETTER SIGMA
+ 0x03C4, //GREEK SMALL LETTER TAU
+ 0x03C5, //GREEK SMALL LETTER UPSILON
+ 0x03C6, //GREEK SMALL LETTER PHI
+ 0x03C7, //GREEK SMALL LETTER CHI
+ 0x03C8, //GREEK SMALL LETTER PSI
+ 0x03C9, //GREEK SMALL LETTER OMEGA
+ 0x03CA, //GREEK SMALL LETTER IOTA WITH DIALYTIKA
+ 0x03CB, //GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+ 0x03CC, //GREEK SMALL LETTER OMICRON WITH TONOS
+ 0x03CD, //GREEK SMALL LETTER UPSILON WITH TONOS
+ 0x03CE, //GREEK SMALL LETTER OMEGA WITH TONOS
+ 0xFFFD, //UNDEFINED
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1254.go b/vendor/github.com/denisenkom/go-mssqldb/cp1254.go
new file mode 100644
index 000000000..a4b09bb44
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1254.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1254 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0xFFFD, //UNDEFINED
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0x02C6, //MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //PER MILLE SIGN
+ 0x0160, //LATIN CAPITAL LETTER S WITH CARON
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x0152, //LATIN CAPITAL LIGATURE OE
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0x02DC, //SMALL TILDE
+ 0x2122, //TRADE MARK SIGN
+ 0x0161, //LATIN SMALL LETTER S WITH CARON
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x0153, //LATIN SMALL LIGATURE OE
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x0178, //LATIN CAPITAL LETTER Y WITH DIAERESIS
+ 0x00A0, //NO-BREAK SPACE
+ 0x00A1, //INVERTED EXCLAMATION MARK
+ 0x00A2, //CENT SIGN
+ 0x00A3, //POUND SIGN
+ 0x00A4, //CURRENCY SIGN
+ 0x00A5, //YEN SIGN
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x00A8, //DIAERESIS
+ 0x00A9, //COPYRIGHT SIGN
+ 0x00AA, //FEMININE ORDINAL INDICATOR
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x00AF, //MACRON
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x00B2, //SUPERSCRIPT TWO
+ 0x00B3, //SUPERSCRIPT THREE
+ 0x00B4, //ACUTE ACCENT
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x00B8, //CEDILLA
+ 0x00B9, //SUPERSCRIPT ONE
+ 0x00BA, //MASCULINE ORDINAL INDICATOR
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //VULGAR FRACTION ONE QUARTER
+ 0x00BD, //VULGAR FRACTION ONE HALF
+ 0x00BE, //VULGAR FRACTION THREE QUARTERS
+ 0x00BF, //INVERTED QUESTION MARK
+ 0x00C0, //LATIN CAPITAL LETTER A WITH GRAVE
+ 0x00C1, //LATIN CAPITAL LETTER A WITH ACUTE
+ 0x00C2, //LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x00C3, //LATIN CAPITAL LETTER A WITH TILDE
+ 0x00C4, //LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00C5, //LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x00C6, //LATIN CAPITAL LETTER AE
+ 0x00C7, //LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x00C8, //LATIN CAPITAL LETTER E WITH GRAVE
+ 0x00C9, //LATIN CAPITAL LETTER E WITH ACUTE
+ 0x00CA, //LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ 0x00CB, //LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x00CC, //LATIN CAPITAL LETTER I WITH GRAVE
+ 0x00CD, //LATIN CAPITAL LETTER I WITH ACUTE
+ 0x00CE, //LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x00CF, //LATIN CAPITAL LETTER I WITH DIAERESIS
+ 0x011E, //LATIN CAPITAL LETTER G WITH BREVE
+ 0x00D1, //LATIN CAPITAL LETTER N WITH TILDE
+ 0x00D2, //LATIN CAPITAL LETTER O WITH GRAVE
+ 0x00D3, //LATIN CAPITAL LETTER O WITH ACUTE
+ 0x00D4, //LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x00D5, //LATIN CAPITAL LETTER O WITH TILDE
+ 0x00D6, //LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //MULTIPLICATION SIGN
+ 0x00D8, //LATIN CAPITAL LETTER O WITH STROKE
+ 0x00D9, //LATIN CAPITAL LETTER U WITH GRAVE
+ 0x00DA, //LATIN CAPITAL LETTER U WITH ACUTE
+ 0x00DB, //LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ 0x00DC, //LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x0130, //LATIN CAPITAL LETTER I WITH DOT ABOVE
+ 0x015E, //LATIN CAPITAL LETTER S WITH CEDILLA
+ 0x00DF, //LATIN SMALL LETTER SHARP S
+ 0x00E0, //LATIN SMALL LETTER A WITH GRAVE
+ 0x00E1, //LATIN SMALL LETTER A WITH ACUTE
+ 0x00E2, //LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x00E3, //LATIN SMALL LETTER A WITH TILDE
+ 0x00E4, //LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00E5, //LATIN SMALL LETTER A WITH RING ABOVE
+ 0x00E6, //LATIN SMALL LETTER AE
+ 0x00E7, //LATIN SMALL LETTER C WITH CEDILLA
+ 0x00E8, //LATIN SMALL LETTER E WITH GRAVE
+ 0x00E9, //LATIN SMALL LETTER E WITH ACUTE
+ 0x00EA, //LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00EB, //LATIN SMALL LETTER E WITH DIAERESIS
+ 0x00EC, //LATIN SMALL LETTER I WITH GRAVE
+ 0x00ED, //LATIN SMALL LETTER I WITH ACUTE
+ 0x00EE, //LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00EF, //LATIN SMALL LETTER I WITH DIAERESIS
+ 0x011F, //LATIN SMALL LETTER G WITH BREVE
+ 0x00F1, //LATIN SMALL LETTER N WITH TILDE
+ 0x00F2, //LATIN SMALL LETTER O WITH GRAVE
+ 0x00F3, //LATIN SMALL LETTER O WITH ACUTE
+ 0x00F4, //LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x00F5, //LATIN SMALL LETTER O WITH TILDE
+ 0x00F6, //LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //DIVISION SIGN
+ 0x00F8, //LATIN SMALL LETTER O WITH STROKE
+ 0x00F9, //LATIN SMALL LETTER U WITH GRAVE
+ 0x00FA, //LATIN SMALL LETTER U WITH ACUTE
+ 0x00FB, //LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00FC, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0x0131, //LATIN SMALL LETTER DOTLESS I
+ 0x015F, //LATIN SMALL LETTER S WITH CEDILLA
+ 0x00FF, //LATIN SMALL LETTER Y WITH DIAERESIS
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1255.go b/vendor/github.com/denisenkom/go-mssqldb/cp1255.go
new file mode 100644
index 000000000..97f9ee9e9
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1255.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1255 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0xFFFD, //UNDEFINED
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0x02C6, //MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //PER MILLE SIGN
+ 0xFFFD, //UNDEFINED
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0x02DC, //SMALL TILDE
+ 0x2122, //TRADE MARK SIGN
+ 0xFFFD, //UNDEFINED
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x00A0, //NO-BREAK SPACE
+ 0x00A1, //INVERTED EXCLAMATION MARK
+ 0x00A2, //CENT SIGN
+ 0x00A3, //POUND SIGN
+ 0x20AA, //NEW SHEQEL SIGN
+ 0x00A5, //YEN SIGN
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x00A8, //DIAERESIS
+ 0x00A9, //COPYRIGHT SIGN
+ 0x00D7, //MULTIPLICATION SIGN
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x00AF, //MACRON
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x00B2, //SUPERSCRIPT TWO
+ 0x00B3, //SUPERSCRIPT THREE
+ 0x00B4, //ACUTE ACCENT
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x00B8, //CEDILLA
+ 0x00B9, //SUPERSCRIPT ONE
+ 0x00F7, //DIVISION SIGN
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //VULGAR FRACTION ONE QUARTER
+ 0x00BD, //VULGAR FRACTION ONE HALF
+ 0x00BE, //VULGAR FRACTION THREE QUARTERS
+ 0x00BF, //INVERTED QUESTION MARK
+ 0x05B0, //HEBREW POINT SHEVA
+ 0x05B1, //HEBREW POINT HATAF SEGOL
+ 0x05B2, //HEBREW POINT HATAF PATAH
+ 0x05B3, //HEBREW POINT HATAF QAMATS
+ 0x05B4, //HEBREW POINT HIRIQ
+ 0x05B5, //HEBREW POINT TSERE
+ 0x05B6, //HEBREW POINT SEGOL
+ 0x05B7, //HEBREW POINT PATAH
+ 0x05B8, //HEBREW POINT QAMATS
+ 0x05B9, //HEBREW POINT HOLAM
+ 0xFFFD, //UNDEFINED
+ 0x05BB, //HEBREW POINT QUBUTS
+ 0x05BC, //HEBREW POINT DAGESH OR MAPIQ
+ 0x05BD, //HEBREW POINT METEG
+ 0x05BE, //HEBREW PUNCTUATION MAQAF
+ 0x05BF, //HEBREW POINT RAFE
+ 0x05C0, //HEBREW PUNCTUATION PASEQ
+ 0x05C1, //HEBREW POINT SHIN DOT
+ 0x05C2, //HEBREW POINT SIN DOT
+ 0x05C3, //HEBREW PUNCTUATION SOF PASUQ
+ 0x05F0, //HEBREW LIGATURE YIDDISH DOUBLE VAV
+ 0x05F1, //HEBREW LIGATURE YIDDISH VAV YOD
+ 0x05F2, //HEBREW LIGATURE YIDDISH DOUBLE YOD
+ 0x05F3, //HEBREW PUNCTUATION GERESH
+ 0x05F4, //HEBREW PUNCTUATION GERSHAYIM
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x05D0, //HEBREW LETTER ALEF
+ 0x05D1, //HEBREW LETTER BET
+ 0x05D2, //HEBREW LETTER GIMEL
+ 0x05D3, //HEBREW LETTER DALET
+ 0x05D4, //HEBREW LETTER HE
+ 0x05D5, //HEBREW LETTER VAV
+ 0x05D6, //HEBREW LETTER ZAYIN
+ 0x05D7, //HEBREW LETTER HET
+ 0x05D8, //HEBREW LETTER TET
+ 0x05D9, //HEBREW LETTER YOD
+ 0x05DA, //HEBREW LETTER FINAL KAF
+ 0x05DB, //HEBREW LETTER KAF
+ 0x05DC, //HEBREW LETTER LAMED
+ 0x05DD, //HEBREW LETTER FINAL MEM
+ 0x05DE, //HEBREW LETTER MEM
+ 0x05DF, //HEBREW LETTER FINAL NUN
+ 0x05E0, //HEBREW LETTER NUN
+ 0x05E1, //HEBREW LETTER SAMEKH
+ 0x05E2, //HEBREW LETTER AYIN
+ 0x05E3, //HEBREW LETTER FINAL PE
+ 0x05E4, //HEBREW LETTER PE
+ 0x05E5, //HEBREW LETTER FINAL TSADI
+ 0x05E6, //HEBREW LETTER TSADI
+ 0x05E7, //HEBREW LETTER QOF
+ 0x05E8, //HEBREW LETTER RESH
+ 0x05E9, //HEBREW LETTER SHIN
+ 0x05EA, //HEBREW LETTER TAV
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x200E, //LEFT-TO-RIGHT MARK
+ 0x200F, //RIGHT-TO-LEFT MARK
+ 0xFFFD, //UNDEFINED
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1256.go b/vendor/github.com/denisenkom/go-mssqldb/cp1256.go
new file mode 100644
index 000000000..e91241b44
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1256.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1256 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0x067E, //ARABIC LETTER PEH
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0x02C6, //MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //PER MILLE SIGN
+ 0x0679, //ARABIC LETTER TTEH
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x0152, //LATIN CAPITAL LIGATURE OE
+ 0x0686, //ARABIC LETTER TCHEH
+ 0x0698, //ARABIC LETTER JEH
+ 0x0688, //ARABIC LETTER DDAL
+ 0x06AF, //ARABIC LETTER GAF
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0x06A9, //ARABIC LETTER KEHEH
+ 0x2122, //TRADE MARK SIGN
+ 0x0691, //ARABIC LETTER RREH
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x0153, //LATIN SMALL LIGATURE OE
+ 0x200C, //ZERO WIDTH NON-JOINER
+ 0x200D, //ZERO WIDTH JOINER
+ 0x06BA, //ARABIC LETTER NOON GHUNNA
+ 0x00A0, //NO-BREAK SPACE
+ 0x060C, //ARABIC COMMA
+ 0x00A2, //CENT SIGN
+ 0x00A3, //POUND SIGN
+ 0x00A4, //CURRENCY SIGN
+ 0x00A5, //YEN SIGN
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x00A8, //DIAERESIS
+ 0x00A9, //COPYRIGHT SIGN
+ 0x06BE, //ARABIC LETTER HEH DOACHASHMEE
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x00AF, //MACRON
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x00B2, //SUPERSCRIPT TWO
+ 0x00B3, //SUPERSCRIPT THREE
+ 0x00B4, //ACUTE ACCENT
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x00B8, //CEDILLA
+ 0x00B9, //SUPERSCRIPT ONE
+ 0x061B, //ARABIC SEMICOLON
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //VULGAR FRACTION ONE QUARTER
+ 0x00BD, //VULGAR FRACTION ONE HALF
+ 0x00BE, //VULGAR FRACTION THREE QUARTERS
+ 0x061F, //ARABIC QUESTION MARK
+ 0x06C1, //ARABIC LETTER HEH GOAL
+ 0x0621, //ARABIC LETTER HAMZA
+ 0x0622, //ARABIC LETTER ALEF WITH MADDA ABOVE
+ 0x0623, //ARABIC LETTER ALEF WITH HAMZA ABOVE
+ 0x0624, //ARABIC LETTER WAW WITH HAMZA ABOVE
+ 0x0625, //ARABIC LETTER ALEF WITH HAMZA BELOW
+ 0x0626, //ARABIC LETTER YEH WITH HAMZA ABOVE
+ 0x0627, //ARABIC LETTER ALEF
+ 0x0628, //ARABIC LETTER BEH
+ 0x0629, //ARABIC LETTER TEH MARBUTA
+ 0x062A, //ARABIC LETTER TEH
+ 0x062B, //ARABIC LETTER THEH
+ 0x062C, //ARABIC LETTER JEEM
+ 0x062D, //ARABIC LETTER HAH
+ 0x062E, //ARABIC LETTER KHAH
+ 0x062F, //ARABIC LETTER DAL
+ 0x0630, //ARABIC LETTER THAL
+ 0x0631, //ARABIC LETTER REH
+ 0x0632, //ARABIC LETTER ZAIN
+ 0x0633, //ARABIC LETTER SEEN
+ 0x0634, //ARABIC LETTER SHEEN
+ 0x0635, //ARABIC LETTER SAD
+ 0x0636, //ARABIC LETTER DAD
+ 0x00D7, //MULTIPLICATION SIGN
+ 0x0637, //ARABIC LETTER TAH
+ 0x0638, //ARABIC LETTER ZAH
+ 0x0639, //ARABIC LETTER AIN
+ 0x063A, //ARABIC LETTER GHAIN
+ 0x0640, //ARABIC TATWEEL
+ 0x0641, //ARABIC LETTER FEH
+ 0x0642, //ARABIC LETTER QAF
+ 0x0643, //ARABIC LETTER KAF
+ 0x00E0, //LATIN SMALL LETTER A WITH GRAVE
+ 0x0644, //ARABIC LETTER LAM
+ 0x00E2, //LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x0645, //ARABIC LETTER MEEM
+ 0x0646, //ARABIC LETTER NOON
+ 0x0647, //ARABIC LETTER HEH
+ 0x0648, //ARABIC LETTER WAW
+ 0x00E7, //LATIN SMALL LETTER C WITH CEDILLA
+ 0x00E8, //LATIN SMALL LETTER E WITH GRAVE
+ 0x00E9, //LATIN SMALL LETTER E WITH ACUTE
+ 0x00EA, //LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00EB, //LATIN SMALL LETTER E WITH DIAERESIS
+ 0x0649, //ARABIC LETTER ALEF MAKSURA
+ 0x064A, //ARABIC LETTER YEH
+ 0x00EE, //LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00EF, //LATIN SMALL LETTER I WITH DIAERESIS
+ 0x064B, //ARABIC FATHATAN
+ 0x064C, //ARABIC DAMMATAN
+ 0x064D, //ARABIC KASRATAN
+ 0x064E, //ARABIC FATHA
+ 0x00F4, //LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x064F, //ARABIC DAMMA
+ 0x0650, //ARABIC KASRA
+ 0x00F7, //DIVISION SIGN
+ 0x0651, //ARABIC SHADDA
+ 0x00F9, //LATIN SMALL LETTER U WITH GRAVE
+ 0x0652, //ARABIC SUKUN
+ 0x00FB, //LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00FC, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0x200E, //LEFT-TO-RIGHT MARK
+ 0x200F, //RIGHT-TO-LEFT MARK
+ 0x06D2, //ARABIC LETTER YEH BARREE
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1257.go b/vendor/github.com/denisenkom/go-mssqldb/cp1257.go
new file mode 100644
index 000000000..bd93e6f89
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1257.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1257 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0xFFFD, //UNDEFINED
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0xFFFD, //UNDEFINED
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0xFFFD, //UNDEFINED
+ 0x2030, //PER MILLE SIGN
+ 0xFFFD, //UNDEFINED
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0xFFFD, //UNDEFINED
+ 0x00A8, //DIAERESIS
+ 0x02C7, //CARON
+ 0x00B8, //CEDILLA
+ 0xFFFD, //UNDEFINED
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0xFFFD, //UNDEFINED
+ 0x2122, //TRADE MARK SIGN
+ 0xFFFD, //UNDEFINED
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0xFFFD, //UNDEFINED
+ 0x00AF, //MACRON
+ 0x02DB, //OGONEK
+ 0xFFFD, //UNDEFINED
+ 0x00A0, //NO-BREAK SPACE
+ 0xFFFD, //UNDEFINED
+ 0x00A2, //CENT SIGN
+ 0x00A3, //POUND SIGN
+ 0x00A4, //CURRENCY SIGN
+ 0xFFFD, //UNDEFINED
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x00D8, //LATIN CAPITAL LETTER O WITH STROKE
+ 0x00A9, //COPYRIGHT SIGN
+ 0x0156, //LATIN CAPITAL LETTER R WITH CEDILLA
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x00C6, //LATIN CAPITAL LETTER AE
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x00B2, //SUPERSCRIPT TWO
+ 0x00B3, //SUPERSCRIPT THREE
+ 0x00B4, //ACUTE ACCENT
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x00F8, //LATIN SMALL LETTER O WITH STROKE
+ 0x00B9, //SUPERSCRIPT ONE
+ 0x0157, //LATIN SMALL LETTER R WITH CEDILLA
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //VULGAR FRACTION ONE QUARTER
+ 0x00BD, //VULGAR FRACTION ONE HALF
+ 0x00BE, //VULGAR FRACTION THREE QUARTERS
+ 0x00E6, //LATIN SMALL LETTER AE
+ 0x0104, //LATIN CAPITAL LETTER A WITH OGONEK
+ 0x012E, //LATIN CAPITAL LETTER I WITH OGONEK
+ 0x0100, //LATIN CAPITAL LETTER A WITH MACRON
+ 0x0106, //LATIN CAPITAL LETTER C WITH ACUTE
+ 0x00C4, //LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00C5, //LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x0118, //LATIN CAPITAL LETTER E WITH OGONEK
+ 0x0112, //LATIN CAPITAL LETTER E WITH MACRON
+ 0x010C, //LATIN CAPITAL LETTER C WITH CARON
+ 0x00C9, //LATIN CAPITAL LETTER E WITH ACUTE
+ 0x0179, //LATIN CAPITAL LETTER Z WITH ACUTE
+ 0x0116, //LATIN CAPITAL LETTER E WITH DOT ABOVE
+ 0x0122, //LATIN CAPITAL LETTER G WITH CEDILLA
+ 0x0136, //LATIN CAPITAL LETTER K WITH CEDILLA
+ 0x012A, //LATIN CAPITAL LETTER I WITH MACRON
+ 0x013B, //LATIN CAPITAL LETTER L WITH CEDILLA
+ 0x0160, //LATIN CAPITAL LETTER S WITH CARON
+ 0x0143, //LATIN CAPITAL LETTER N WITH ACUTE
+ 0x0145, //LATIN CAPITAL LETTER N WITH CEDILLA
+ 0x00D3, //LATIN CAPITAL LETTER O WITH ACUTE
+ 0x014C, //LATIN CAPITAL LETTER O WITH MACRON
+ 0x00D5, //LATIN CAPITAL LETTER O WITH TILDE
+ 0x00D6, //LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //MULTIPLICATION SIGN
+ 0x0172, //LATIN CAPITAL LETTER U WITH OGONEK
+ 0x0141, //LATIN CAPITAL LETTER L WITH STROKE
+ 0x015A, //LATIN CAPITAL LETTER S WITH ACUTE
+ 0x016A, //LATIN CAPITAL LETTER U WITH MACRON
+ 0x00DC, //LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x017B, //LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ 0x017D, //LATIN CAPITAL LETTER Z WITH CARON
+ 0x00DF, //LATIN SMALL LETTER SHARP S
+ 0x0105, //LATIN SMALL LETTER A WITH OGONEK
+ 0x012F, //LATIN SMALL LETTER I WITH OGONEK
+ 0x0101, //LATIN SMALL LETTER A WITH MACRON
+ 0x0107, //LATIN SMALL LETTER C WITH ACUTE
+ 0x00E4, //LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00E5, //LATIN SMALL LETTER A WITH RING ABOVE
+ 0x0119, //LATIN SMALL LETTER E WITH OGONEK
+ 0x0113, //LATIN SMALL LETTER E WITH MACRON
+ 0x010D, //LATIN SMALL LETTER C WITH CARON
+ 0x00E9, //LATIN SMALL LETTER E WITH ACUTE
+ 0x017A, //LATIN SMALL LETTER Z WITH ACUTE
+ 0x0117, //LATIN SMALL LETTER E WITH DOT ABOVE
+ 0x0123, //LATIN SMALL LETTER G WITH CEDILLA
+ 0x0137, //LATIN SMALL LETTER K WITH CEDILLA
+ 0x012B, //LATIN SMALL LETTER I WITH MACRON
+ 0x013C, //LATIN SMALL LETTER L WITH CEDILLA
+ 0x0161, //LATIN SMALL LETTER S WITH CARON
+ 0x0144, //LATIN SMALL LETTER N WITH ACUTE
+ 0x0146, //LATIN SMALL LETTER N WITH CEDILLA
+ 0x00F3, //LATIN SMALL LETTER O WITH ACUTE
+ 0x014D, //LATIN SMALL LETTER O WITH MACRON
+ 0x00F5, //LATIN SMALL LETTER O WITH TILDE
+ 0x00F6, //LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //DIVISION SIGN
+ 0x0173, //LATIN SMALL LETTER U WITH OGONEK
+ 0x0142, //LATIN SMALL LETTER L WITH STROKE
+ 0x015B, //LATIN SMALL LETTER S WITH ACUTE
+ 0x016B, //LATIN SMALL LETTER U WITH MACRON
+ 0x00FC, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0x017C, //LATIN SMALL LETTER Z WITH DOT ABOVE
+ 0x017E, //LATIN SMALL LETTER Z WITH CARON
+ 0x02D9, //DOT ABOVE
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp1258.go b/vendor/github.com/denisenkom/go-mssqldb/cp1258.go
new file mode 100644
index 000000000..4e1f8ac94
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp1258.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp1258 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0xFFFD, //UNDEFINED
+ 0x201A, //SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0x2020, //DAGGER
+ 0x2021, //DOUBLE DAGGER
+ 0x02C6, //MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //PER MILLE SIGN
+ 0xFFFD, //UNDEFINED
+ 0x2039, //SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x0152, //LATIN CAPITAL LIGATURE OE
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0x02DC, //SMALL TILDE
+ 0x2122, //TRADE MARK SIGN
+ 0xFFFD, //UNDEFINED
+ 0x203A, //SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x0153, //LATIN SMALL LIGATURE OE
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x0178, //LATIN CAPITAL LETTER Y WITH DIAERESIS
+ 0x00A0, //NO-BREAK SPACE
+ 0x00A1, //INVERTED EXCLAMATION MARK
+ 0x00A2, //CENT SIGN
+ 0x00A3, //POUND SIGN
+ 0x00A4, //CURRENCY SIGN
+ 0x00A5, //YEN SIGN
+ 0x00A6, //BROKEN BAR
+ 0x00A7, //SECTION SIGN
+ 0x00A8, //DIAERESIS
+ 0x00A9, //COPYRIGHT SIGN
+ 0x00AA, //FEMININE ORDINAL INDICATOR
+ 0x00AB, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //NOT SIGN
+ 0x00AD, //SOFT HYPHEN
+ 0x00AE, //REGISTERED SIGN
+ 0x00AF, //MACRON
+ 0x00B0, //DEGREE SIGN
+ 0x00B1, //PLUS-MINUS SIGN
+ 0x00B2, //SUPERSCRIPT TWO
+ 0x00B3, //SUPERSCRIPT THREE
+ 0x00B4, //ACUTE ACCENT
+ 0x00B5, //MICRO SIGN
+ 0x00B6, //PILCROW SIGN
+ 0x00B7, //MIDDLE DOT
+ 0x00B8, //CEDILLA
+ 0x00B9, //SUPERSCRIPT ONE
+ 0x00BA, //MASCULINE ORDINAL INDICATOR
+ 0x00BB, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //VULGAR FRACTION ONE QUARTER
+ 0x00BD, //VULGAR FRACTION ONE HALF
+ 0x00BE, //VULGAR FRACTION THREE QUARTERS
+ 0x00BF, //INVERTED QUESTION MARK
+ 0x00C0, //LATIN CAPITAL LETTER A WITH GRAVE
+ 0x00C1, //LATIN CAPITAL LETTER A WITH ACUTE
+ 0x00C2, //LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x0102, //LATIN CAPITAL LETTER A WITH BREVE
+ 0x00C4, //LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00C5, //LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x00C6, //LATIN CAPITAL LETTER AE
+ 0x00C7, //LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x00C8, //LATIN CAPITAL LETTER E WITH GRAVE
+ 0x00C9, //LATIN CAPITAL LETTER E WITH ACUTE
+ 0x00CA, //LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ 0x00CB, //LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x0300, //COMBINING GRAVE ACCENT
+ 0x00CD, //LATIN CAPITAL LETTER I WITH ACUTE
+ 0x00CE, //LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x00CF, //LATIN CAPITAL LETTER I WITH DIAERESIS
+ 0x0110, //LATIN CAPITAL LETTER D WITH STROKE
+ 0x00D1, //LATIN CAPITAL LETTER N WITH TILDE
+ 0x0309, //COMBINING HOOK ABOVE
+ 0x00D3, //LATIN CAPITAL LETTER O WITH ACUTE
+ 0x00D4, //LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x01A0, //LATIN CAPITAL LETTER O WITH HORN
+ 0x00D6, //LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //MULTIPLICATION SIGN
+ 0x00D8, //LATIN CAPITAL LETTER O WITH STROKE
+ 0x00D9, //LATIN CAPITAL LETTER U WITH GRAVE
+ 0x00DA, //LATIN CAPITAL LETTER U WITH ACUTE
+ 0x00DB, //LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ 0x00DC, //LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x01AF, //LATIN CAPITAL LETTER U WITH HORN
+ 0x0303, //COMBINING TILDE
+ 0x00DF, //LATIN SMALL LETTER SHARP S
+ 0x00E0, //LATIN SMALL LETTER A WITH GRAVE
+ 0x00E1, //LATIN SMALL LETTER A WITH ACUTE
+ 0x00E2, //LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x0103, //LATIN SMALL LETTER A WITH BREVE
+ 0x00E4, //LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00E5, //LATIN SMALL LETTER A WITH RING ABOVE
+ 0x00E6, //LATIN SMALL LETTER AE
+ 0x00E7, //LATIN SMALL LETTER C WITH CEDILLA
+ 0x00E8, //LATIN SMALL LETTER E WITH GRAVE
+ 0x00E9, //LATIN SMALL LETTER E WITH ACUTE
+ 0x00EA, //LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00EB, //LATIN SMALL LETTER E WITH DIAERESIS
+ 0x0301, //COMBINING ACUTE ACCENT
+ 0x00ED, //LATIN SMALL LETTER I WITH ACUTE
+ 0x00EE, //LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00EF, //LATIN SMALL LETTER I WITH DIAERESIS
+ 0x0111, //LATIN SMALL LETTER D WITH STROKE
+ 0x00F1, //LATIN SMALL LETTER N WITH TILDE
+ 0x0323, //COMBINING DOT BELOW
+ 0x00F3, //LATIN SMALL LETTER O WITH ACUTE
+ 0x00F4, //LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x01A1, //LATIN SMALL LETTER O WITH HORN
+ 0x00F6, //LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //DIVISION SIGN
+ 0x00F8, //LATIN SMALL LETTER O WITH STROKE
+ 0x00F9, //LATIN SMALL LETTER U WITH GRAVE
+ 0x00FA, //LATIN SMALL LETTER U WITH ACUTE
+ 0x00FB, //LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00FC, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0x01B0, //LATIN SMALL LETTER U WITH HORN
+ 0x20AB, //DONG SIGN
+ 0x00FF, //LATIN SMALL LETTER Y WITH DIAERESIS
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp437.go b/vendor/github.com/denisenkom/go-mssqldb/cp437.go
new file mode 100644
index 000000000..f47f8ecc7
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp437.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp437 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000a, //LINE FEED
+ 0x000b, //VERTICAL TABULATION
+ 0x000c, //FORM FEED
+ 0x000d, //CARRIAGE RETURN
+ 0x000e, //SHIFT OUT
+ 0x000f, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001a, //SUBSTITUTE
+ 0x001b, //ESCAPE
+ 0x001c, //FILE SEPARATOR
+ 0x001d, //GROUP SEPARATOR
+ 0x001e, //RECORD SEPARATOR
+ 0x001f, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002a, //ASTERISK
+ 0x002b, //PLUS SIGN
+ 0x002c, //COMMA
+ 0x002d, //HYPHEN-MINUS
+ 0x002e, //FULL STOP
+ 0x002f, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003a, //COLON
+ 0x003b, //SEMICOLON
+ 0x003c, //LESS-THAN SIGN
+ 0x003d, //EQUALS SIGN
+ 0x003e, //GREATER-THAN SIGN
+ 0x003f, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004a, //LATIN CAPITAL LETTER J
+ 0x004b, //LATIN CAPITAL LETTER K
+ 0x004c, //LATIN CAPITAL LETTER L
+ 0x004d, //LATIN CAPITAL LETTER M
+ 0x004e, //LATIN CAPITAL LETTER N
+ 0x004f, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005a, //LATIN CAPITAL LETTER Z
+ 0x005b, //LEFT SQUARE BRACKET
+ 0x005c, //REVERSE SOLIDUS
+ 0x005d, //RIGHT SQUARE BRACKET
+ 0x005e, //CIRCUMFLEX ACCENT
+ 0x005f, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006a, //LATIN SMALL LETTER J
+ 0x006b, //LATIN SMALL LETTER K
+ 0x006c, //LATIN SMALL LETTER L
+ 0x006d, //LATIN SMALL LETTER M
+ 0x006e, //LATIN SMALL LETTER N
+ 0x006f, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007a, //LATIN SMALL LETTER Z
+ 0x007b, //LEFT CURLY BRACKET
+ 0x007c, //VERTICAL LINE
+ 0x007d, //RIGHT CURLY BRACKET
+ 0x007e, //TILDE
+ 0x007f, //DELETE
+ 0x00c7, //LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x00fc, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0x00e9, //LATIN SMALL LETTER E WITH ACUTE
+ 0x00e2, //LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x00e4, //LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00e0, //LATIN SMALL LETTER A WITH GRAVE
+ 0x00e5, //LATIN SMALL LETTER A WITH RING ABOVE
+ 0x00e7, //LATIN SMALL LETTER C WITH CEDILLA
+ 0x00ea, //LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00eb, //LATIN SMALL LETTER E WITH DIAERESIS
+ 0x00e8, //LATIN SMALL LETTER E WITH GRAVE
+ 0x00ef, //LATIN SMALL LETTER I WITH DIAERESIS
+ 0x00ee, //LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00ec, //LATIN SMALL LETTER I WITH GRAVE
+ 0x00c4, //LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00c5, //LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x00c9, //LATIN CAPITAL LETTER E WITH ACUTE
+ 0x00e6, //LATIN SMALL LIGATURE AE
+ 0x00c6, //LATIN CAPITAL LIGATURE AE
+ 0x00f4, //LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x00f6, //LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00f2, //LATIN SMALL LETTER O WITH GRAVE
+ 0x00fb, //LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00f9, //LATIN SMALL LETTER U WITH GRAVE
+ 0x00ff, //LATIN SMALL LETTER Y WITH DIAERESIS
+ 0x00d6, //LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00dc, //LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x00a2, //CENT SIGN
+ 0x00a3, //POUND SIGN
+ 0x00a5, //YEN SIGN
+ 0x20a7, //PESETA SIGN
+ 0x0192, //LATIN SMALL LETTER F WITH HOOK
+ 0x00e1, //LATIN SMALL LETTER A WITH ACUTE
+ 0x00ed, //LATIN SMALL LETTER I WITH ACUTE
+ 0x00f3, //LATIN SMALL LETTER O WITH ACUTE
+ 0x00fa, //LATIN SMALL LETTER U WITH ACUTE
+ 0x00f1, //LATIN SMALL LETTER N WITH TILDE
+ 0x00d1, //LATIN CAPITAL LETTER N WITH TILDE
+ 0x00aa, //FEMININE ORDINAL INDICATOR
+ 0x00ba, //MASCULINE ORDINAL INDICATOR
+ 0x00bf, //INVERTED QUESTION MARK
+ 0x2310, //REVERSED NOT SIGN
+ 0x00ac, //NOT SIGN
+ 0x00bd, //VULGAR FRACTION ONE HALF
+ 0x00bc, //VULGAR FRACTION ONE QUARTER
+ 0x00a1, //INVERTED EXCLAMATION MARK
+ 0x00ab, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00bb, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x2591, //LIGHT SHADE
+ 0x2592, //MEDIUM SHADE
+ 0x2593, //DARK SHADE
+ 0x2502, //BOX DRAWINGS LIGHT VERTICAL
+ 0x2524, //BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ 0x2561, //BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ 0x2562, //BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+ 0x2556, //BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+ 0x2555, //BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+ 0x2563, //BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+ 0x2551, //BOX DRAWINGS DOUBLE VERTICAL
+ 0x2557, //BOX DRAWINGS DOUBLE DOWN AND LEFT
+ 0x255d, //BOX DRAWINGS DOUBLE UP AND LEFT
+ 0x255c, //BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+ 0x255b, //BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+ 0x2510, //BOX DRAWINGS LIGHT DOWN AND LEFT
+ 0x2514, //BOX DRAWINGS LIGHT UP AND RIGHT
+ 0x2534, //BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ 0x252c, //BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ 0x251c, //BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ 0x2500, //BOX DRAWINGS LIGHT HORIZONTAL
+ 0x253c, //BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ 0x255e, //BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ 0x255f, //BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+ 0x255a, //BOX DRAWINGS DOUBLE UP AND RIGHT
+ 0x2554, //BOX DRAWINGS DOUBLE DOWN AND RIGHT
+ 0x2569, //BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+ 0x2566, //BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+ 0x2560, //BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+ 0x2550, //BOX DRAWINGS DOUBLE HORIZONTAL
+ 0x256c, //BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+ 0x2567, //BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+ 0x2568, //BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+ 0x2564, //BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+ 0x2565, //BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+ 0x2559, //BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+ 0x2558, //BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+ 0x2552, //BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+ 0x2553, //BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+ 0x256b, //BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+ 0x256a, //BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ 0x2518, //BOX DRAWINGS LIGHT UP AND LEFT
+ 0x250c, //BOX DRAWINGS LIGHT DOWN AND RIGHT
+ 0x2588, //FULL BLOCK
+ 0x2584, //LOWER HALF BLOCK
+ 0x258c, //LEFT HALF BLOCK
+ 0x2590, //RIGHT HALF BLOCK
+ 0x2580, //UPPER HALF BLOCK
+ 0x03b1, //GREEK SMALL LETTER ALPHA
+ 0x00df, //LATIN SMALL LETTER SHARP S
+ 0x0393, //GREEK CAPITAL LETTER GAMMA
+ 0x03c0, //GREEK SMALL LETTER PI
+ 0x03a3, //GREEK CAPITAL LETTER SIGMA
+ 0x03c3, //GREEK SMALL LETTER SIGMA
+ 0x00b5, //MICRO SIGN
+ 0x03c4, //GREEK SMALL LETTER TAU
+ 0x03a6, //GREEK CAPITAL LETTER PHI
+ 0x0398, //GREEK CAPITAL LETTER THETA
+ 0x03a9, //GREEK CAPITAL LETTER OMEGA
+ 0x03b4, //GREEK SMALL LETTER DELTA
+ 0x221e, //INFINITY
+ 0x03c6, //GREEK SMALL LETTER PHI
+ 0x03b5, //GREEK SMALL LETTER EPSILON
+ 0x2229, //INTERSECTION
+ 0x2261, //IDENTICAL TO
+ 0x00b1, //PLUS-MINUS SIGN
+ 0x2265, //GREATER-THAN OR EQUAL TO
+ 0x2264, //LESS-THAN OR EQUAL TO
+ 0x2320, //TOP HALF INTEGRAL
+ 0x2321, //BOTTOM HALF INTEGRAL
+ 0x00f7, //DIVISION SIGN
+ 0x2248, //ALMOST EQUAL TO
+ 0x00b0, //DEGREE SIGN
+ 0x2219, //BULLET OPERATOR
+ 0x00b7, //MIDDLE DOT
+ 0x221a, //SQUARE ROOT
+ 0x207f, //SUPERSCRIPT LATIN SMALL LETTER N
+ 0x00b2, //SUPERSCRIPT TWO
+ 0x25a0, //BLACK SQUARE
+ 0x00a0, //NO-BREAK SPACE
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp850.go b/vendor/github.com/denisenkom/go-mssqldb/cp850.go
new file mode 100644
index 000000000..e6b3d1690
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp850.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp850 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000a, //LINE FEED
+ 0x000b, //VERTICAL TABULATION
+ 0x000c, //FORM FEED
+ 0x000d, //CARRIAGE RETURN
+ 0x000e, //SHIFT OUT
+ 0x000f, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001a, //SUBSTITUTE
+ 0x001b, //ESCAPE
+ 0x001c, //FILE SEPARATOR
+ 0x001d, //GROUP SEPARATOR
+ 0x001e, //RECORD SEPARATOR
+ 0x001f, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002a, //ASTERISK
+ 0x002b, //PLUS SIGN
+ 0x002c, //COMMA
+ 0x002d, //HYPHEN-MINUS
+ 0x002e, //FULL STOP
+ 0x002f, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003a, //COLON
+ 0x003b, //SEMICOLON
+ 0x003c, //LESS-THAN SIGN
+ 0x003d, //EQUALS SIGN
+ 0x003e, //GREATER-THAN SIGN
+ 0x003f, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004a, //LATIN CAPITAL LETTER J
+ 0x004b, //LATIN CAPITAL LETTER K
+ 0x004c, //LATIN CAPITAL LETTER L
+ 0x004d, //LATIN CAPITAL LETTER M
+ 0x004e, //LATIN CAPITAL LETTER N
+ 0x004f, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005a, //LATIN CAPITAL LETTER Z
+ 0x005b, //LEFT SQUARE BRACKET
+ 0x005c, //REVERSE SOLIDUS
+ 0x005d, //RIGHT SQUARE BRACKET
+ 0x005e, //CIRCUMFLEX ACCENT
+ 0x005f, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006a, //LATIN SMALL LETTER J
+ 0x006b, //LATIN SMALL LETTER K
+ 0x006c, //LATIN SMALL LETTER L
+ 0x006d, //LATIN SMALL LETTER M
+ 0x006e, //LATIN SMALL LETTER N
+ 0x006f, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007a, //LATIN SMALL LETTER Z
+ 0x007b, //LEFT CURLY BRACKET
+ 0x007c, //VERTICAL LINE
+ 0x007d, //RIGHT CURLY BRACKET
+ 0x007e, //TILDE
+ 0x007f, //DELETE
+ 0x00c7, //LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x00fc, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0x00e9, //LATIN SMALL LETTER E WITH ACUTE
+ 0x00e2, //LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x00e4, //LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00e0, //LATIN SMALL LETTER A WITH GRAVE
+ 0x00e5, //LATIN SMALL LETTER A WITH RING ABOVE
+ 0x00e7, //LATIN SMALL LETTER C WITH CEDILLA
+ 0x00ea, //LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00eb, //LATIN SMALL LETTER E WITH DIAERESIS
+ 0x00e8, //LATIN SMALL LETTER E WITH GRAVE
+ 0x00ef, //LATIN SMALL LETTER I WITH DIAERESIS
+ 0x00ee, //LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00ec, //LATIN SMALL LETTER I WITH GRAVE
+ 0x00c4, //LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00c5, //LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x00c9, //LATIN CAPITAL LETTER E WITH ACUTE
+ 0x00e6, //LATIN SMALL LIGATURE AE
+ 0x00c6, //LATIN CAPITAL LIGATURE AE
+ 0x00f4, //LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x00f6, //LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00f2, //LATIN SMALL LETTER O WITH GRAVE
+ 0x00fb, //LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00f9, //LATIN SMALL LETTER U WITH GRAVE
+ 0x00ff, //LATIN SMALL LETTER Y WITH DIAERESIS
+ 0x00d6, //LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00dc, //LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x00f8, //LATIN SMALL LETTER O WITH STROKE
+ 0x00a3, //POUND SIGN
+ 0x00d8, //LATIN CAPITAL LETTER O WITH STROKE
+ 0x00d7, //MULTIPLICATION SIGN
+ 0x0192, //LATIN SMALL LETTER F WITH HOOK
+ 0x00e1, //LATIN SMALL LETTER A WITH ACUTE
+ 0x00ed, //LATIN SMALL LETTER I WITH ACUTE
+ 0x00f3, //LATIN SMALL LETTER O WITH ACUTE
+ 0x00fa, //LATIN SMALL LETTER U WITH ACUTE
+ 0x00f1, //LATIN SMALL LETTER N WITH TILDE
+ 0x00d1, //LATIN CAPITAL LETTER N WITH TILDE
+ 0x00aa, //FEMININE ORDINAL INDICATOR
+ 0x00ba, //MASCULINE ORDINAL INDICATOR
+ 0x00bf, //INVERTED QUESTION MARK
+ 0x00ae, //REGISTERED SIGN
+ 0x00ac, //NOT SIGN
+ 0x00bd, //VULGAR FRACTION ONE HALF
+ 0x00bc, //VULGAR FRACTION ONE QUARTER
+ 0x00a1, //INVERTED EXCLAMATION MARK
+ 0x00ab, //LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00bb, //RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x2591, //LIGHT SHADE
+ 0x2592, //MEDIUM SHADE
+ 0x2593, //DARK SHADE
+ 0x2502, //BOX DRAWINGS LIGHT VERTICAL
+ 0x2524, //BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ 0x00c1, //LATIN CAPITAL LETTER A WITH ACUTE
+ 0x00c2, //LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x00c0, //LATIN CAPITAL LETTER A WITH GRAVE
+ 0x00a9, //COPYRIGHT SIGN
+ 0x2563, //BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+ 0x2551, //BOX DRAWINGS DOUBLE VERTICAL
+ 0x2557, //BOX DRAWINGS DOUBLE DOWN AND LEFT
+ 0x255d, //BOX DRAWINGS DOUBLE UP AND LEFT
+ 0x00a2, //CENT SIGN
+ 0x00a5, //YEN SIGN
+ 0x2510, //BOX DRAWINGS LIGHT DOWN AND LEFT
+ 0x2514, //BOX DRAWINGS LIGHT UP AND RIGHT
+ 0x2534, //BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ 0x252c, //BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ 0x251c, //BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ 0x2500, //BOX DRAWINGS LIGHT HORIZONTAL
+ 0x253c, //BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ 0x00e3, //LATIN SMALL LETTER A WITH TILDE
+ 0x00c3, //LATIN CAPITAL LETTER A WITH TILDE
+ 0x255a, //BOX DRAWINGS DOUBLE UP AND RIGHT
+ 0x2554, //BOX DRAWINGS DOUBLE DOWN AND RIGHT
+ 0x2569, //BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+ 0x2566, //BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+ 0x2560, //BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+ 0x2550, //BOX DRAWINGS DOUBLE HORIZONTAL
+ 0x256c, //BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+ 0x00a4, //CURRENCY SIGN
+ 0x00f0, //LATIN SMALL LETTER ETH
+ 0x00d0, //LATIN CAPITAL LETTER ETH
+ 0x00ca, //LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ 0x00cb, //LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x00c8, //LATIN CAPITAL LETTER E WITH GRAVE
+ 0x0131, //LATIN SMALL LETTER DOTLESS I
+ 0x00cd, //LATIN CAPITAL LETTER I WITH ACUTE
+ 0x00ce, //LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x00cf, //LATIN CAPITAL LETTER I WITH DIAERESIS
+ 0x2518, //BOX DRAWINGS LIGHT UP AND LEFT
+ 0x250c, //BOX DRAWINGS LIGHT DOWN AND RIGHT
+ 0x2588, //FULL BLOCK
+ 0x2584, //LOWER HALF BLOCK
+ 0x00a6, //BROKEN BAR
+ 0x00cc, //LATIN CAPITAL LETTER I WITH GRAVE
+ 0x2580, //UPPER HALF BLOCK
+ 0x00d3, //LATIN CAPITAL LETTER O WITH ACUTE
+ 0x00df, //LATIN SMALL LETTER SHARP S
+ 0x00d4, //LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x00d2, //LATIN CAPITAL LETTER O WITH GRAVE
+ 0x00f5, //LATIN SMALL LETTER O WITH TILDE
+ 0x00d5, //LATIN CAPITAL LETTER O WITH TILDE
+ 0x00b5, //MICRO SIGN
+ 0x00fe, //LATIN SMALL LETTER THORN
+ 0x00de, //LATIN CAPITAL LETTER THORN
+ 0x00da, //LATIN CAPITAL LETTER U WITH ACUTE
+ 0x00db, //LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ 0x00d9, //LATIN CAPITAL LETTER U WITH GRAVE
+ 0x00fd, //LATIN SMALL LETTER Y WITH ACUTE
+ 0x00dd, //LATIN CAPITAL LETTER Y WITH ACUTE
+ 0x00af, //MACRON
+ 0x00b4, //ACUTE ACCENT
+ 0x00ad, //SOFT HYPHEN
+ 0x00b1, //PLUS-MINUS SIGN
+ 0x2017, //DOUBLE LOW LINE
+ 0x00be, //VULGAR FRACTION THREE QUARTERS
+ 0x00b6, //PILCROW SIGN
+ 0x00a7, //SECTION SIGN
+ 0x00f7, //DIVISION SIGN
+ 0x00b8, //CEDILLA
+ 0x00b0, //DEGREE SIGN
+ 0x00a8, //DIAERESIS
+ 0x00b7, //MIDDLE DOT
+ 0x00b9, //SUPERSCRIPT ONE
+ 0x00b3, //SUPERSCRIPT THREE
+ 0x00b2, //SUPERSCRIPT TWO
+ 0x25a0, //BLACK SQUARE
+ 0x00a0, //NO-BREAK SPACE
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp874.go b/vendor/github.com/denisenkom/go-mssqldb/cp874.go
new file mode 100644
index 000000000..9d691a1a5
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp874.go
@@ -0,0 +1,262 @@
+package mssql
+
+var cp874 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x2026, //HORIZONTAL ELLIPSIS
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //BULLET
+ 0x2013, //EN DASH
+ 0x2014, //EM DASH
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x00A0, //NO-BREAK SPACE
+ 0x0E01, //THAI CHARACTER KO KAI
+ 0x0E02, //THAI CHARACTER KHO KHAI
+ 0x0E03, //THAI CHARACTER KHO KHUAT
+ 0x0E04, //THAI CHARACTER KHO KHWAI
+ 0x0E05, //THAI CHARACTER KHO KHON
+ 0x0E06, //THAI CHARACTER KHO RAKHANG
+ 0x0E07, //THAI CHARACTER NGO NGU
+ 0x0E08, //THAI CHARACTER CHO CHAN
+ 0x0E09, //THAI CHARACTER CHO CHING
+ 0x0E0A, //THAI CHARACTER CHO CHANG
+ 0x0E0B, //THAI CHARACTER SO SO
+ 0x0E0C, //THAI CHARACTER CHO CHOE
+ 0x0E0D, //THAI CHARACTER YO YING
+ 0x0E0E, //THAI CHARACTER DO CHADA
+ 0x0E0F, //THAI CHARACTER TO PATAK
+ 0x0E10, //THAI CHARACTER THO THAN
+ 0x0E11, //THAI CHARACTER THO NANGMONTHO
+ 0x0E12, //THAI CHARACTER THO PHUTHAO
+ 0x0E13, //THAI CHARACTER NO NEN
+ 0x0E14, //THAI CHARACTER DO DEK
+ 0x0E15, //THAI CHARACTER TO TAO
+ 0x0E16, //THAI CHARACTER THO THUNG
+ 0x0E17, //THAI CHARACTER THO THAHAN
+ 0x0E18, //THAI CHARACTER THO THONG
+ 0x0E19, //THAI CHARACTER NO NU
+ 0x0E1A, //THAI CHARACTER BO BAIMAI
+ 0x0E1B, //THAI CHARACTER PO PLA
+ 0x0E1C, //THAI CHARACTER PHO PHUNG
+ 0x0E1D, //THAI CHARACTER FO FA
+ 0x0E1E, //THAI CHARACTER PHO PHAN
+ 0x0E1F, //THAI CHARACTER FO FAN
+ 0x0E20, //THAI CHARACTER PHO SAMPHAO
+ 0x0E21, //THAI CHARACTER MO MA
+ 0x0E22, //THAI CHARACTER YO YAK
+ 0x0E23, //THAI CHARACTER RO RUA
+ 0x0E24, //THAI CHARACTER RU
+ 0x0E25, //THAI CHARACTER LO LING
+ 0x0E26, //THAI CHARACTER LU
+ 0x0E27, //THAI CHARACTER WO WAEN
+ 0x0E28, //THAI CHARACTER SO SALA
+ 0x0E29, //THAI CHARACTER SO RUSI
+ 0x0E2A, //THAI CHARACTER SO SUA
+ 0x0E2B, //THAI CHARACTER HO HIP
+ 0x0E2C, //THAI CHARACTER LO CHULA
+ 0x0E2D, //THAI CHARACTER O ANG
+ 0x0E2E, //THAI CHARACTER HO NOKHUK
+ 0x0E2F, //THAI CHARACTER PAIYANNOI
+ 0x0E30, //THAI CHARACTER SARA A
+ 0x0E31, //THAI CHARACTER MAI HAN-AKAT
+ 0x0E32, //THAI CHARACTER SARA AA
+ 0x0E33, //THAI CHARACTER SARA AM
+ 0x0E34, //THAI CHARACTER SARA I
+ 0x0E35, //THAI CHARACTER SARA II
+ 0x0E36, //THAI CHARACTER SARA UE
+ 0x0E37, //THAI CHARACTER SARA UEE
+ 0x0E38, //THAI CHARACTER SARA U
+ 0x0E39, //THAI CHARACTER SARA UU
+ 0x0E3A, //THAI CHARACTER PHINTHU
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0x0E3F, //THAI CURRENCY SYMBOL BAHT
+ 0x0E40, //THAI CHARACTER SARA E
+ 0x0E41, //THAI CHARACTER SARA AE
+ 0x0E42, //THAI CHARACTER SARA O
+ 0x0E43, //THAI CHARACTER SARA AI MAIMUAN
+ 0x0E44, //THAI CHARACTER SARA AI MAIMALAI
+ 0x0E45, //THAI CHARACTER LAKKHANGYAO
+ 0x0E46, //THAI CHARACTER MAIYAMOK
+ 0x0E47, //THAI CHARACTER MAITAIKHU
+ 0x0E48, //THAI CHARACTER MAI EK
+ 0x0E49, //THAI CHARACTER MAI THO
+ 0x0E4A, //THAI CHARACTER MAI TRI
+ 0x0E4B, //THAI CHARACTER MAI CHATTAWA
+ 0x0E4C, //THAI CHARACTER THANTHAKHAT
+ 0x0E4D, //THAI CHARACTER NIKHAHIT
+ 0x0E4E, //THAI CHARACTER YAMAKKAN
+ 0x0E4F, //THAI CHARACTER FONGMAN
+ 0x0E50, //THAI DIGIT ZERO
+ 0x0E51, //THAI DIGIT ONE
+ 0x0E52, //THAI DIGIT TWO
+ 0x0E53, //THAI DIGIT THREE
+ 0x0E54, //THAI DIGIT FOUR
+ 0x0E55, //THAI DIGIT FIVE
+ 0x0E56, //THAI DIGIT SIX
+ 0x0E57, //THAI DIGIT SEVEN
+ 0x0E58, //THAI DIGIT EIGHT
+ 0x0E59, //THAI DIGIT NINE
+ 0x0E5A, //THAI CHARACTER ANGKHANKHU
+ 0x0E5B, //THAI CHARACTER KHOMUT
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp932.go b/vendor/github.com/denisenkom/go-mssqldb/cp932.go
new file mode 100644
index 000000000..980c55d81
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp932.go
@@ -0,0 +1,7988 @@
+package mssql
+
+var cp932 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0xFFFD, //UNDEFINED
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ 0xFFFD, //UNDEFINED
+ 0xFF61, //HALFWIDTH IDEOGRAPHIC FULL STOP
+ 0xFF62, //HALFWIDTH LEFT CORNER BRACKET
+ 0xFF63, //HALFWIDTH RIGHT CORNER BRACKET
+ 0xFF64, //HALFWIDTH IDEOGRAPHIC COMMA
+ 0xFF65, //HALFWIDTH KATAKANA MIDDLE DOT
+ 0xFF66, //HALFWIDTH KATAKANA LETTER WO
+ 0xFF67, //HALFWIDTH KATAKANA LETTER SMALL A
+ 0xFF68, //HALFWIDTH KATAKANA LETTER SMALL I
+ 0xFF69, //HALFWIDTH KATAKANA LETTER SMALL U
+ 0xFF6A, //HALFWIDTH KATAKANA LETTER SMALL E
+ 0xFF6B, //HALFWIDTH KATAKANA LETTER SMALL O
+ 0xFF6C, //HALFWIDTH KATAKANA LETTER SMALL YA
+ 0xFF6D, //HALFWIDTH KATAKANA LETTER SMALL YU
+ 0xFF6E, //HALFWIDTH KATAKANA LETTER SMALL YO
+ 0xFF6F, //HALFWIDTH KATAKANA LETTER SMALL TU
+ 0xFF70, //HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ 0xFF71, //HALFWIDTH KATAKANA LETTER A
+ 0xFF72, //HALFWIDTH KATAKANA LETTER I
+ 0xFF73, //HALFWIDTH KATAKANA LETTER U
+ 0xFF74, //HALFWIDTH KATAKANA LETTER E
+ 0xFF75, //HALFWIDTH KATAKANA LETTER O
+ 0xFF76, //HALFWIDTH KATAKANA LETTER KA
+ 0xFF77, //HALFWIDTH KATAKANA LETTER KI
+ 0xFF78, //HALFWIDTH KATAKANA LETTER KU
+ 0xFF79, //HALFWIDTH KATAKANA LETTER KE
+ 0xFF7A, //HALFWIDTH KATAKANA LETTER KO
+ 0xFF7B, //HALFWIDTH KATAKANA LETTER SA
+ 0xFF7C, //HALFWIDTH KATAKANA LETTER SI
+ 0xFF7D, //HALFWIDTH KATAKANA LETTER SU
+ 0xFF7E, //HALFWIDTH KATAKANA LETTER SE
+ 0xFF7F, //HALFWIDTH KATAKANA LETTER SO
+ 0xFF80, //HALFWIDTH KATAKANA LETTER TA
+ 0xFF81, //HALFWIDTH KATAKANA LETTER TI
+ 0xFF82, //HALFWIDTH KATAKANA LETTER TU
+ 0xFF83, //HALFWIDTH KATAKANA LETTER TE
+ 0xFF84, //HALFWIDTH KATAKANA LETTER TO
+ 0xFF85, //HALFWIDTH KATAKANA LETTER NA
+ 0xFF86, //HALFWIDTH KATAKANA LETTER NI
+ 0xFF87, //HALFWIDTH KATAKANA LETTER NU
+ 0xFF88, //HALFWIDTH KATAKANA LETTER NE
+ 0xFF89, //HALFWIDTH KATAKANA LETTER NO
+ 0xFF8A, //HALFWIDTH KATAKANA LETTER HA
+ 0xFF8B, //HALFWIDTH KATAKANA LETTER HI
+ 0xFF8C, //HALFWIDTH KATAKANA LETTER HU
+ 0xFF8D, //HALFWIDTH KATAKANA LETTER HE
+ 0xFF8E, //HALFWIDTH KATAKANA LETTER HO
+ 0xFF8F, //HALFWIDTH KATAKANA LETTER MA
+ 0xFF90, //HALFWIDTH KATAKANA LETTER MI
+ 0xFF91, //HALFWIDTH KATAKANA LETTER MU
+ 0xFF92, //HALFWIDTH KATAKANA LETTER ME
+ 0xFF93, //HALFWIDTH KATAKANA LETTER MO
+ 0xFF94, //HALFWIDTH KATAKANA LETTER YA
+ 0xFF95, //HALFWIDTH KATAKANA LETTER YU
+ 0xFF96, //HALFWIDTH KATAKANA LETTER YO
+ 0xFF97, //HALFWIDTH KATAKANA LETTER RA
+ 0xFF98, //HALFWIDTH KATAKANA LETTER RI
+ 0xFF99, //HALFWIDTH KATAKANA LETTER RU
+ 0xFF9A, //HALFWIDTH KATAKANA LETTER RE
+ 0xFF9B, //HALFWIDTH KATAKANA LETTER RO
+ 0xFF9C, //HALFWIDTH KATAKANA LETTER WA
+ 0xFF9D, //HALFWIDTH KATAKANA LETTER N
+ 0xFF9E, //HALFWIDTH KATAKANA VOICED SOUND MARK
+ 0xFF9F, //HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ 0xFFFD, //UNDEFINED
+ },
+ db: map[int]rune{
+ 0x8140: 0x3000, //IDEOGRAPHIC SPACE
+ 0x8141: 0x3001, //IDEOGRAPHIC COMMA
+ 0x8142: 0x3002, //IDEOGRAPHIC FULL STOP
+ 0x8143: 0xFF0C, //FULLWIDTH COMMA
+ 0x8144: 0xFF0E, //FULLWIDTH FULL STOP
+ 0x8145: 0x30FB, //KATAKANA MIDDLE DOT
+ 0x8146: 0xFF1A, //FULLWIDTH COLON
+ 0x8147: 0xFF1B, //FULLWIDTH SEMICOLON
+ 0x8148: 0xFF1F, //FULLWIDTH QUESTION MARK
+ 0x8149: 0xFF01, //FULLWIDTH EXCLAMATION MARK
+ 0x814A: 0x309B, //KATAKANA-HIRAGANA VOICED SOUND MARK
+ 0x814B: 0x309C, //KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ 0x814C: 0x00B4, //ACUTE ACCENT
+ 0x814D: 0xFF40, //FULLWIDTH GRAVE ACCENT
+ 0x814E: 0x00A8, //DIAERESIS
+ 0x814F: 0xFF3E, //FULLWIDTH CIRCUMFLEX ACCENT
+ 0x8150: 0xFFE3, //FULLWIDTH MACRON
+ 0x8151: 0xFF3F, //FULLWIDTH LOW LINE
+ 0x8152: 0x30FD, //KATAKANA ITERATION MARK
+ 0x8153: 0x30FE, //KATAKANA VOICED ITERATION MARK
+ 0x8154: 0x309D, //HIRAGANA ITERATION MARK
+ 0x8155: 0x309E, //HIRAGANA VOICED ITERATION MARK
+ 0x8156: 0x3003, //DITTO MARK
+ 0x8157: 0x4EDD, //CJK UNIFIED IDEOGRAPH
+ 0x8158: 0x3005, //IDEOGRAPHIC ITERATION MARK
+ 0x8159: 0x3006, //IDEOGRAPHIC CLOSING MARK
+ 0x815A: 0x3007, //IDEOGRAPHIC NUMBER ZERO
+ 0x815B: 0x30FC, //KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ 0x815C: 0x2015, //HORIZONTAL BAR
+ 0x815D: 0x2010, //HYPHEN
+ 0x815E: 0xFF0F, //FULLWIDTH SOLIDUS
+ 0x815F: 0xFF3C, //FULLWIDTH REVERSE SOLIDUS
+ 0x8160: 0xFF5E, //FULLWIDTH TILDE
+ 0x8161: 0x2225, //PARALLEL TO
+ 0x8162: 0xFF5C, //FULLWIDTH VERTICAL LINE
+ 0x8163: 0x2026, //HORIZONTAL ELLIPSIS
+ 0x8164: 0x2025, //TWO DOT LEADER
+ 0x8165: 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0x8166: 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0x8167: 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0x8168: 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0x8169: 0xFF08, //FULLWIDTH LEFT PARENTHESIS
+ 0x816A: 0xFF09, //FULLWIDTH RIGHT PARENTHESIS
+ 0x816B: 0x3014, //LEFT TORTOISE SHELL BRACKET
+ 0x816C: 0x3015, //RIGHT TORTOISE SHELL BRACKET
+ 0x816D: 0xFF3B, //FULLWIDTH LEFT SQUARE BRACKET
+ 0x816E: 0xFF3D, //FULLWIDTH RIGHT SQUARE BRACKET
+ 0x816F: 0xFF5B, //FULLWIDTH LEFT CURLY BRACKET
+ 0x8170: 0xFF5D, //FULLWIDTH RIGHT CURLY BRACKET
+ 0x8171: 0x3008, //LEFT ANGLE BRACKET
+ 0x8172: 0x3009, //RIGHT ANGLE BRACKET
+ 0x8173: 0x300A, //LEFT DOUBLE ANGLE BRACKET
+ 0x8174: 0x300B, //RIGHT DOUBLE ANGLE BRACKET
+ 0x8175: 0x300C, //LEFT CORNER BRACKET
+ 0x8176: 0x300D, //RIGHT CORNER BRACKET
+ 0x8177: 0x300E, //LEFT WHITE CORNER BRACKET
+ 0x8178: 0x300F, //RIGHT WHITE CORNER BRACKET
+ 0x8179: 0x3010, //LEFT BLACK LENTICULAR BRACKET
+ 0x817A: 0x3011, //RIGHT BLACK LENTICULAR BRACKET
+ 0x817B: 0xFF0B, //FULLWIDTH PLUS SIGN
+ 0x817C: 0xFF0D, //FULLWIDTH HYPHEN-MINUS
+ 0x817D: 0x00B1, //PLUS-MINUS SIGN
+ 0x817E: 0x00D7, //MULTIPLICATION SIGN
+ 0x8180: 0x00F7, //DIVISION SIGN
+ 0x8181: 0xFF1D, //FULLWIDTH EQUALS SIGN
+ 0x8182: 0x2260, //NOT EQUAL TO
+ 0x8183: 0xFF1C, //FULLWIDTH LESS-THAN SIGN
+ 0x8184: 0xFF1E, //FULLWIDTH GREATER-THAN SIGN
+ 0x8185: 0x2266, //LESS-THAN OVER EQUAL TO
+ 0x8186: 0x2267, //GREATER-THAN OVER EQUAL TO
+ 0x8187: 0x221E, //INFINITY
+ 0x8188: 0x2234, //THEREFORE
+ 0x8189: 0x2642, //MALE SIGN
+ 0x818A: 0x2640, //FEMALE SIGN
+ 0x818B: 0x00B0, //DEGREE SIGN
+ 0x818C: 0x2032, //PRIME
+ 0x818D: 0x2033, //DOUBLE PRIME
+ 0x818E: 0x2103, //DEGREE CELSIUS
+ 0x818F: 0xFFE5, //FULLWIDTH YEN SIGN
+ 0x8190: 0xFF04, //FULLWIDTH DOLLAR SIGN
+ 0x8191: 0xFFE0, //FULLWIDTH CENT SIGN
+ 0x8192: 0xFFE1, //FULLWIDTH POUND SIGN
+ 0x8193: 0xFF05, //FULLWIDTH PERCENT SIGN
+ 0x8194: 0xFF03, //FULLWIDTH NUMBER SIGN
+ 0x8195: 0xFF06, //FULLWIDTH AMPERSAND
+ 0x8196: 0xFF0A, //FULLWIDTH ASTERISK
+ 0x8197: 0xFF20, //FULLWIDTH COMMERCIAL AT
+ 0x8198: 0x00A7, //SECTION SIGN
+ 0x8199: 0x2606, //WHITE STAR
+ 0x819A: 0x2605, //BLACK STAR
+ 0x819B: 0x25CB, //WHITE CIRCLE
+ 0x819C: 0x25CF, //BLACK CIRCLE
+ 0x819D: 0x25CE, //BULLSEYE
+ 0x819E: 0x25C7, //WHITE DIAMOND
+ 0x819F: 0x25C6, //BLACK DIAMOND
+ 0x81A0: 0x25A1, //WHITE SQUARE
+ 0x81A1: 0x25A0, //BLACK SQUARE
+ 0x81A2: 0x25B3, //WHITE UP-POINTING TRIANGLE
+ 0x81A3: 0x25B2, //BLACK UP-POINTING TRIANGLE
+ 0x81A4: 0x25BD, //WHITE DOWN-POINTING TRIANGLE
+ 0x81A5: 0x25BC, //BLACK DOWN-POINTING TRIANGLE
+ 0x81A6: 0x203B, //REFERENCE MARK
+ 0x81A7: 0x3012, //POSTAL MARK
+ 0x81A8: 0x2192, //RIGHTWARDS ARROW
+ 0x81A9: 0x2190, //LEFTWARDS ARROW
+ 0x81AA: 0x2191, //UPWARDS ARROW
+ 0x81AB: 0x2193, //DOWNWARDS ARROW
+ 0x81AC: 0x3013, //GETA MARK
+ 0x81B8: 0x2208, //ELEMENT OF
+ 0x81B9: 0x220B, //CONTAINS AS MEMBER
+ 0x81BA: 0x2286, //SUBSET OF OR EQUAL TO
+ 0x81BB: 0x2287, //SUPERSET OF OR EQUAL TO
+ 0x81BC: 0x2282, //SUBSET OF
+ 0x81BD: 0x2283, //SUPERSET OF
+ 0x81BE: 0x222A, //UNION
+ 0x81BF: 0x2229, //INTERSECTION
+ 0x81C8: 0x2227, //LOGICAL AND
+ 0x81C9: 0x2228, //LOGICAL OR
+ 0x81CA: 0xFFE2, //FULLWIDTH NOT SIGN
+ 0x81CB: 0x21D2, //RIGHTWARDS DOUBLE ARROW
+ 0x81CC: 0x21D4, //LEFT RIGHT DOUBLE ARROW
+ 0x81CD: 0x2200, //FOR ALL
+ 0x81CE: 0x2203, //THERE EXISTS
+ 0x81DA: 0x2220, //ANGLE
+ 0x81DB: 0x22A5, //UP TACK
+ 0x81DC: 0x2312, //ARC
+ 0x81DD: 0x2202, //PARTIAL DIFFERENTIAL
+ 0x81DE: 0x2207, //NABLA
+ 0x81DF: 0x2261, //IDENTICAL TO
+ 0x81E0: 0x2252, //APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ 0x81E1: 0x226A, //MUCH LESS-THAN
+ 0x81E2: 0x226B, //MUCH GREATER-THAN
+ 0x81E3: 0x221A, //SQUARE ROOT
+ 0x81E4: 0x223D, //REVERSED TILDE
+ 0x81E5: 0x221D, //PROPORTIONAL TO
+ 0x81E6: 0x2235, //BECAUSE
+ 0x81E7: 0x222B, //INTEGRAL
+ 0x81E8: 0x222C, //DOUBLE INTEGRAL
+ 0x81F0: 0x212B, //ANGSTROM SIGN
+ 0x81F1: 0x2030, //PER MILLE SIGN
+ 0x81F2: 0x266F, //MUSIC SHARP SIGN
+ 0x81F3: 0x266D, //MUSIC FLAT SIGN
+ 0x81F4: 0x266A, //EIGHTH NOTE
+ 0x81F5: 0x2020, //DAGGER
+ 0x81F6: 0x2021, //DOUBLE DAGGER
+ 0x81F7: 0x00B6, //PILCROW SIGN
+ 0x81FC: 0x25EF, //LARGE CIRCLE
+ 0x824F: 0xFF10, //FULLWIDTH DIGIT ZERO
+ 0x8250: 0xFF11, //FULLWIDTH DIGIT ONE
+ 0x8251: 0xFF12, //FULLWIDTH DIGIT TWO
+ 0x8252: 0xFF13, //FULLWIDTH DIGIT THREE
+ 0x8253: 0xFF14, //FULLWIDTH DIGIT FOUR
+ 0x8254: 0xFF15, //FULLWIDTH DIGIT FIVE
+ 0x8255: 0xFF16, //FULLWIDTH DIGIT SIX
+ 0x8256: 0xFF17, //FULLWIDTH DIGIT SEVEN
+ 0x8257: 0xFF18, //FULLWIDTH DIGIT EIGHT
+ 0x8258: 0xFF19, //FULLWIDTH DIGIT NINE
+ 0x8260: 0xFF21, //FULLWIDTH LATIN CAPITAL LETTER A
+ 0x8261: 0xFF22, //FULLWIDTH LATIN CAPITAL LETTER B
+ 0x8262: 0xFF23, //FULLWIDTH LATIN CAPITAL LETTER C
+ 0x8263: 0xFF24, //FULLWIDTH LATIN CAPITAL LETTER D
+ 0x8264: 0xFF25, //FULLWIDTH LATIN CAPITAL LETTER E
+ 0x8265: 0xFF26, //FULLWIDTH LATIN CAPITAL LETTER F
+ 0x8266: 0xFF27, //FULLWIDTH LATIN CAPITAL LETTER G
+ 0x8267: 0xFF28, //FULLWIDTH LATIN CAPITAL LETTER H
+ 0x8268: 0xFF29, //FULLWIDTH LATIN CAPITAL LETTER I
+ 0x8269: 0xFF2A, //FULLWIDTH LATIN CAPITAL LETTER J
+ 0x826A: 0xFF2B, //FULLWIDTH LATIN CAPITAL LETTER K
+ 0x826B: 0xFF2C, //FULLWIDTH LATIN CAPITAL LETTER L
+ 0x826C: 0xFF2D, //FULLWIDTH LATIN CAPITAL LETTER M
+ 0x826D: 0xFF2E, //FULLWIDTH LATIN CAPITAL LETTER N
+ 0x826E: 0xFF2F, //FULLWIDTH LATIN CAPITAL LETTER O
+ 0x826F: 0xFF30, //FULLWIDTH LATIN CAPITAL LETTER P
+ 0x8270: 0xFF31, //FULLWIDTH LATIN CAPITAL LETTER Q
+ 0x8271: 0xFF32, //FULLWIDTH LATIN CAPITAL LETTER R
+ 0x8272: 0xFF33, //FULLWIDTH LATIN CAPITAL LETTER S
+ 0x8273: 0xFF34, //FULLWIDTH LATIN CAPITAL LETTER T
+ 0x8274: 0xFF35, //FULLWIDTH LATIN CAPITAL LETTER U
+ 0x8275: 0xFF36, //FULLWIDTH LATIN CAPITAL LETTER V
+ 0x8276: 0xFF37, //FULLWIDTH LATIN CAPITAL LETTER W
+ 0x8277: 0xFF38, //FULLWIDTH LATIN CAPITAL LETTER X
+ 0x8278: 0xFF39, //FULLWIDTH LATIN CAPITAL LETTER Y
+ 0x8279: 0xFF3A, //FULLWIDTH LATIN CAPITAL LETTER Z
+ 0x8281: 0xFF41, //FULLWIDTH LATIN SMALL LETTER A
+ 0x8282: 0xFF42, //FULLWIDTH LATIN SMALL LETTER B
+ 0x8283: 0xFF43, //FULLWIDTH LATIN SMALL LETTER C
+ 0x8284: 0xFF44, //FULLWIDTH LATIN SMALL LETTER D
+ 0x8285: 0xFF45, //FULLWIDTH LATIN SMALL LETTER E
+ 0x8286: 0xFF46, //FULLWIDTH LATIN SMALL LETTER F
+ 0x8287: 0xFF47, //FULLWIDTH LATIN SMALL LETTER G
+ 0x8288: 0xFF48, //FULLWIDTH LATIN SMALL LETTER H
+ 0x8289: 0xFF49, //FULLWIDTH LATIN SMALL LETTER I
+ 0x828A: 0xFF4A, //FULLWIDTH LATIN SMALL LETTER J
+ 0x828B: 0xFF4B, //FULLWIDTH LATIN SMALL LETTER K
+ 0x828C: 0xFF4C, //FULLWIDTH LATIN SMALL LETTER L
+ 0x828D: 0xFF4D, //FULLWIDTH LATIN SMALL LETTER M
+ 0x828E: 0xFF4E, //FULLWIDTH LATIN SMALL LETTER N
+ 0x828F: 0xFF4F, //FULLWIDTH LATIN SMALL LETTER O
+ 0x8290: 0xFF50, //FULLWIDTH LATIN SMALL LETTER P
+ 0x8291: 0xFF51, //FULLWIDTH LATIN SMALL LETTER Q
+ 0x8292: 0xFF52, //FULLWIDTH LATIN SMALL LETTER R
+ 0x8293: 0xFF53, //FULLWIDTH LATIN SMALL LETTER S
+ 0x8294: 0xFF54, //FULLWIDTH LATIN SMALL LETTER T
+ 0x8295: 0xFF55, //FULLWIDTH LATIN SMALL LETTER U
+ 0x8296: 0xFF56, //FULLWIDTH LATIN SMALL LETTER V
+ 0x8297: 0xFF57, //FULLWIDTH LATIN SMALL LETTER W
+ 0x8298: 0xFF58, //FULLWIDTH LATIN SMALL LETTER X
+ 0x8299: 0xFF59, //FULLWIDTH LATIN SMALL LETTER Y
+ 0x829A: 0xFF5A, //FULLWIDTH LATIN SMALL LETTER Z
+ 0x829F: 0x3041, //HIRAGANA LETTER SMALL A
+ 0x82A0: 0x3042, //HIRAGANA LETTER A
+ 0x82A1: 0x3043, //HIRAGANA LETTER SMALL I
+ 0x82A2: 0x3044, //HIRAGANA LETTER I
+ 0x82A3: 0x3045, //HIRAGANA LETTER SMALL U
+ 0x82A4: 0x3046, //HIRAGANA LETTER U
+ 0x82A5: 0x3047, //HIRAGANA LETTER SMALL E
+ 0x82A6: 0x3048, //HIRAGANA LETTER E
+ 0x82A7: 0x3049, //HIRAGANA LETTER SMALL O
+ 0x82A8: 0x304A, //HIRAGANA LETTER O
+ 0x82A9: 0x304B, //HIRAGANA LETTER KA
+ 0x82AA: 0x304C, //HIRAGANA LETTER GA
+ 0x82AB: 0x304D, //HIRAGANA LETTER KI
+ 0x82AC: 0x304E, //HIRAGANA LETTER GI
+ 0x82AD: 0x304F, //HIRAGANA LETTER KU
+ 0x82AE: 0x3050, //HIRAGANA LETTER GU
+ 0x82AF: 0x3051, //HIRAGANA LETTER KE
+ 0x82B0: 0x3052, //HIRAGANA LETTER GE
+ 0x82B1: 0x3053, //HIRAGANA LETTER KO
+ 0x82B2: 0x3054, //HIRAGANA LETTER GO
+ 0x82B3: 0x3055, //HIRAGANA LETTER SA
+ 0x82B4: 0x3056, //HIRAGANA LETTER ZA
+ 0x82B5: 0x3057, //HIRAGANA LETTER SI
+ 0x82B6: 0x3058, //HIRAGANA LETTER ZI
+ 0x82B7: 0x3059, //HIRAGANA LETTER SU
+ 0x82B8: 0x305A, //HIRAGANA LETTER ZU
+ 0x82B9: 0x305B, //HIRAGANA LETTER SE
+ 0x82BA: 0x305C, //HIRAGANA LETTER ZE
+ 0x82BB: 0x305D, //HIRAGANA LETTER SO
+ 0x82BC: 0x305E, //HIRAGANA LETTER ZO
+ 0x82BD: 0x305F, //HIRAGANA LETTER TA
+ 0x82BE: 0x3060, //HIRAGANA LETTER DA
+ 0x82BF: 0x3061, //HIRAGANA LETTER TI
+ 0x82C0: 0x3062, //HIRAGANA LETTER DI
+ 0x82C1: 0x3063, //HIRAGANA LETTER SMALL TU
+ 0x82C2: 0x3064, //HIRAGANA LETTER TU
+ 0x82C3: 0x3065, //HIRAGANA LETTER DU
+ 0x82C4: 0x3066, //HIRAGANA LETTER TE
+ 0x82C5: 0x3067, //HIRAGANA LETTER DE
+ 0x82C6: 0x3068, //HIRAGANA LETTER TO
+ 0x82C7: 0x3069, //HIRAGANA LETTER DO
+ 0x82C8: 0x306A, //HIRAGANA LETTER NA
+ 0x82C9: 0x306B, //HIRAGANA LETTER NI
+ 0x82CA: 0x306C, //HIRAGANA LETTER NU
+ 0x82CB: 0x306D, //HIRAGANA LETTER NE
+ 0x82CC: 0x306E, //HIRAGANA LETTER NO
+ 0x82CD: 0x306F, //HIRAGANA LETTER HA
+ 0x82CE: 0x3070, //HIRAGANA LETTER BA
+ 0x82CF: 0x3071, //HIRAGANA LETTER PA
+ 0x82D0: 0x3072, //HIRAGANA LETTER HI
+ 0x82D1: 0x3073, //HIRAGANA LETTER BI
+ 0x82D2: 0x3074, //HIRAGANA LETTER PI
+ 0x82D3: 0x3075, //HIRAGANA LETTER HU
+ 0x82D4: 0x3076, //HIRAGANA LETTER BU
+ 0x82D5: 0x3077, //HIRAGANA LETTER PU
+ 0x82D6: 0x3078, //HIRAGANA LETTER HE
+ 0x82D7: 0x3079, //HIRAGANA LETTER BE
+ 0x82D8: 0x307A, //HIRAGANA LETTER PE
+ 0x82D9: 0x307B, //HIRAGANA LETTER HO
+ 0x82DA: 0x307C, //HIRAGANA LETTER BO
+ 0x82DB: 0x307D, //HIRAGANA LETTER PO
+ 0x82DC: 0x307E, //HIRAGANA LETTER MA
+ 0x82DD: 0x307F, //HIRAGANA LETTER MI
+ 0x82DE: 0x3080, //HIRAGANA LETTER MU
+ 0x82DF: 0x3081, //HIRAGANA LETTER ME
+ 0x82E0: 0x3082, //HIRAGANA LETTER MO
+ 0x82E1: 0x3083, //HIRAGANA LETTER SMALL YA
+ 0x82E2: 0x3084, //HIRAGANA LETTER YA
+ 0x82E3: 0x3085, //HIRAGANA LETTER SMALL YU
+ 0x82E4: 0x3086, //HIRAGANA LETTER YU
+ 0x82E5: 0x3087, //HIRAGANA LETTER SMALL YO
+ 0x82E6: 0x3088, //HIRAGANA LETTER YO
+ 0x82E7: 0x3089, //HIRAGANA LETTER RA
+ 0x82E8: 0x308A, //HIRAGANA LETTER RI
+ 0x82E9: 0x308B, //HIRAGANA LETTER RU
+ 0x82EA: 0x308C, //HIRAGANA LETTER RE
+ 0x82EB: 0x308D, //HIRAGANA LETTER RO
+ 0x82EC: 0x308E, //HIRAGANA LETTER SMALL WA
+ 0x82ED: 0x308F, //HIRAGANA LETTER WA
+ 0x82EE: 0x3090, //HIRAGANA LETTER WI
+ 0x82EF: 0x3091, //HIRAGANA LETTER WE
+ 0x82F0: 0x3092, //HIRAGANA LETTER WO
+ 0x82F1: 0x3093, //HIRAGANA LETTER N
+ 0x8340: 0x30A1, //KATAKANA LETTER SMALL A
+ 0x8341: 0x30A2, //KATAKANA LETTER A
+ 0x8342: 0x30A3, //KATAKANA LETTER SMALL I
+ 0x8343: 0x30A4, //KATAKANA LETTER I
+ 0x8344: 0x30A5, //KATAKANA LETTER SMALL U
+ 0x8345: 0x30A6, //KATAKANA LETTER U
+ 0x8346: 0x30A7, //KATAKANA LETTER SMALL E
+ 0x8347: 0x30A8, //KATAKANA LETTER E
+ 0x8348: 0x30A9, //KATAKANA LETTER SMALL O
+ 0x8349: 0x30AA, //KATAKANA LETTER O
+ 0x834A: 0x30AB, //KATAKANA LETTER KA
+ 0x834B: 0x30AC, //KATAKANA LETTER GA
+ 0x834C: 0x30AD, //KATAKANA LETTER KI
+ 0x834D: 0x30AE, //KATAKANA LETTER GI
+ 0x834E: 0x30AF, //KATAKANA LETTER KU
+ 0x834F: 0x30B0, //KATAKANA LETTER GU
+ 0x8350: 0x30B1, //KATAKANA LETTER KE
+ 0x8351: 0x30B2, //KATAKANA LETTER GE
+ 0x8352: 0x30B3, //KATAKANA LETTER KO
+ 0x8353: 0x30B4, //KATAKANA LETTER GO
+ 0x8354: 0x30B5, //KATAKANA LETTER SA
+ 0x8355: 0x30B6, //KATAKANA LETTER ZA
+ 0x8356: 0x30B7, //KATAKANA LETTER SI
+ 0x8357: 0x30B8, //KATAKANA LETTER ZI
+ 0x8358: 0x30B9, //KATAKANA LETTER SU
+ 0x8359: 0x30BA, //KATAKANA LETTER ZU
+ 0x835A: 0x30BB, //KATAKANA LETTER SE
+ 0x835B: 0x30BC, //KATAKANA LETTER ZE
+ 0x835C: 0x30BD, //KATAKANA LETTER SO
+ 0x835D: 0x30BE, //KATAKANA LETTER ZO
+ 0x835E: 0x30BF, //KATAKANA LETTER TA
+ 0x835F: 0x30C0, //KATAKANA LETTER DA
+ 0x8360: 0x30C1, //KATAKANA LETTER TI
+ 0x8361: 0x30C2, //KATAKANA LETTER DI
+ 0x8362: 0x30C3, //KATAKANA LETTER SMALL TU
+ 0x8363: 0x30C4, //KATAKANA LETTER TU
+ 0x8364: 0x30C5, //KATAKANA LETTER DU
+ 0x8365: 0x30C6, //KATAKANA LETTER TE
+ 0x8366: 0x30C7, //KATAKANA LETTER DE
+ 0x8367: 0x30C8, //KATAKANA LETTER TO
+ 0x8368: 0x30C9, //KATAKANA LETTER DO
+ 0x8369: 0x30CA, //KATAKANA LETTER NA
+ 0x836A: 0x30CB, //KATAKANA LETTER NI
+ 0x836B: 0x30CC, //KATAKANA LETTER NU
+ 0x836C: 0x30CD, //KATAKANA LETTER NE
+ 0x836D: 0x30CE, //KATAKANA LETTER NO
+ 0x836E: 0x30CF, //KATAKANA LETTER HA
+ 0x836F: 0x30D0, //KATAKANA LETTER BA
+ 0x8370: 0x30D1, //KATAKANA LETTER PA
+ 0x8371: 0x30D2, //KATAKANA LETTER HI
+ 0x8372: 0x30D3, //KATAKANA LETTER BI
+ 0x8373: 0x30D4, //KATAKANA LETTER PI
+ 0x8374: 0x30D5, //KATAKANA LETTER HU
+ 0x8375: 0x30D6, //KATAKANA LETTER BU
+ 0x8376: 0x30D7, //KATAKANA LETTER PU
+ 0x8377: 0x30D8, //KATAKANA LETTER HE
+ 0x8378: 0x30D9, //KATAKANA LETTER BE
+ 0x8379: 0x30DA, //KATAKANA LETTER PE
+ 0x837A: 0x30DB, //KATAKANA LETTER HO
+ 0x837B: 0x30DC, //KATAKANA LETTER BO
+ 0x837C: 0x30DD, //KATAKANA LETTER PO
+ 0x837D: 0x30DE, //KATAKANA LETTER MA
+ 0x837E: 0x30DF, //KATAKANA LETTER MI
+ 0x8380: 0x30E0, //KATAKANA LETTER MU
+ 0x8381: 0x30E1, //KATAKANA LETTER ME
+ 0x8382: 0x30E2, //KATAKANA LETTER MO
+ 0x8383: 0x30E3, //KATAKANA LETTER SMALL YA
+ 0x8384: 0x30E4, //KATAKANA LETTER YA
+ 0x8385: 0x30E5, //KATAKANA LETTER SMALL YU
+ 0x8386: 0x30E6, //KATAKANA LETTER YU
+ 0x8387: 0x30E7, //KATAKANA LETTER SMALL YO
+ 0x8388: 0x30E8, //KATAKANA LETTER YO
+ 0x8389: 0x30E9, //KATAKANA LETTER RA
+ 0x838A: 0x30EA, //KATAKANA LETTER RI
+ 0x838B: 0x30EB, //KATAKANA LETTER RU
+ 0x838C: 0x30EC, //KATAKANA LETTER RE
+ 0x838D: 0x30ED, //KATAKANA LETTER RO
+ 0x838E: 0x30EE, //KATAKANA LETTER SMALL WA
+ 0x838F: 0x30EF, //KATAKANA LETTER WA
+ 0x8390: 0x30F0, //KATAKANA LETTER WI
+ 0x8391: 0x30F1, //KATAKANA LETTER WE
+ 0x8392: 0x30F2, //KATAKANA LETTER WO
+ 0x8393: 0x30F3, //KATAKANA LETTER N
+ 0x8394: 0x30F4, //KATAKANA LETTER VU
+ 0x8395: 0x30F5, //KATAKANA LETTER SMALL KA
+ 0x8396: 0x30F6, //KATAKANA LETTER SMALL KE
+ 0x839F: 0x0391, //GREEK CAPITAL LETTER ALPHA
+ 0x83A0: 0x0392, //GREEK CAPITAL LETTER BETA
+ 0x83A1: 0x0393, //GREEK CAPITAL LETTER GAMMA
+ 0x83A2: 0x0394, //GREEK CAPITAL LETTER DELTA
+ 0x83A3: 0x0395, //GREEK CAPITAL LETTER EPSILON
+ 0x83A4: 0x0396, //GREEK CAPITAL LETTER ZETA
+ 0x83A5: 0x0397, //GREEK CAPITAL LETTER ETA
+ 0x83A6: 0x0398, //GREEK CAPITAL LETTER THETA
+ 0x83A7: 0x0399, //GREEK CAPITAL LETTER IOTA
+ 0x83A8: 0x039A, //GREEK CAPITAL LETTER KAPPA
+ 0x83A9: 0x039B, //GREEK CAPITAL LETTER LAMDA
+ 0x83AA: 0x039C, //GREEK CAPITAL LETTER MU
+ 0x83AB: 0x039D, //GREEK CAPITAL LETTER NU
+ 0x83AC: 0x039E, //GREEK CAPITAL LETTER XI
+ 0x83AD: 0x039F, //GREEK CAPITAL LETTER OMICRON
+ 0x83AE: 0x03A0, //GREEK CAPITAL LETTER PI
+ 0x83AF: 0x03A1, //GREEK CAPITAL LETTER RHO
+ 0x83B0: 0x03A3, //GREEK CAPITAL LETTER SIGMA
+ 0x83B1: 0x03A4, //GREEK CAPITAL LETTER TAU
+ 0x83B2: 0x03A5, //GREEK CAPITAL LETTER UPSILON
+ 0x83B3: 0x03A6, //GREEK CAPITAL LETTER PHI
+ 0x83B4: 0x03A7, //GREEK CAPITAL LETTER CHI
+ 0x83B5: 0x03A8, //GREEK CAPITAL LETTER PSI
+ 0x83B6: 0x03A9, //GREEK CAPITAL LETTER OMEGA
+ 0x83BF: 0x03B1, //GREEK SMALL LETTER ALPHA
+ 0x83C0: 0x03B2, //GREEK SMALL LETTER BETA
+ 0x83C1: 0x03B3, //GREEK SMALL LETTER GAMMA
+ 0x83C2: 0x03B4, //GREEK SMALL LETTER DELTA
+ 0x83C3: 0x03B5, //GREEK SMALL LETTER EPSILON
+ 0x83C4: 0x03B6, //GREEK SMALL LETTER ZETA
+ 0x83C5: 0x03B7, //GREEK SMALL LETTER ETA
+ 0x83C6: 0x03B8, //GREEK SMALL LETTER THETA
+ 0x83C7: 0x03B9, //GREEK SMALL LETTER IOTA
+ 0x83C8: 0x03BA, //GREEK SMALL LETTER KAPPA
+ 0x83C9: 0x03BB, //GREEK SMALL LETTER LAMDA
+ 0x83CA: 0x03BC, //GREEK SMALL LETTER MU
+ 0x83CB: 0x03BD, //GREEK SMALL LETTER NU
+ 0x83CC: 0x03BE, //GREEK SMALL LETTER XI
+ 0x83CD: 0x03BF, //GREEK SMALL LETTER OMICRON
+ 0x83CE: 0x03C0, //GREEK SMALL LETTER PI
+ 0x83CF: 0x03C1, //GREEK SMALL LETTER RHO
+ 0x83D0: 0x03C3, //GREEK SMALL LETTER SIGMA
+ 0x83D1: 0x03C4, //GREEK SMALL LETTER TAU
+ 0x83D2: 0x03C5, //GREEK SMALL LETTER UPSILON
+ 0x83D3: 0x03C6, //GREEK SMALL LETTER PHI
+ 0x83D4: 0x03C7, //GREEK SMALL LETTER CHI
+ 0x83D5: 0x03C8, //GREEK SMALL LETTER PSI
+ 0x83D6: 0x03C9, //GREEK SMALL LETTER OMEGA
+ 0x8440: 0x0410, //CYRILLIC CAPITAL LETTER A
+ 0x8441: 0x0411, //CYRILLIC CAPITAL LETTER BE
+ 0x8442: 0x0412, //CYRILLIC CAPITAL LETTER VE
+ 0x8443: 0x0413, //CYRILLIC CAPITAL LETTER GHE
+ 0x8444: 0x0414, //CYRILLIC CAPITAL LETTER DE
+ 0x8445: 0x0415, //CYRILLIC CAPITAL LETTER IE
+ 0x8446: 0x0401, //CYRILLIC CAPITAL LETTER IO
+ 0x8447: 0x0416, //CYRILLIC CAPITAL LETTER ZHE
+ 0x8448: 0x0417, //CYRILLIC CAPITAL LETTER ZE
+ 0x8449: 0x0418, //CYRILLIC CAPITAL LETTER I
+ 0x844A: 0x0419, //CYRILLIC CAPITAL LETTER SHORT I
+ 0x844B: 0x041A, //CYRILLIC CAPITAL LETTER KA
+ 0x844C: 0x041B, //CYRILLIC CAPITAL LETTER EL
+ 0x844D: 0x041C, //CYRILLIC CAPITAL LETTER EM
+ 0x844E: 0x041D, //CYRILLIC CAPITAL LETTER EN
+ 0x844F: 0x041E, //CYRILLIC CAPITAL LETTER O
+ 0x8450: 0x041F, //CYRILLIC CAPITAL LETTER PE
+ 0x8451: 0x0420, //CYRILLIC CAPITAL LETTER ER
+ 0x8452: 0x0421, //CYRILLIC CAPITAL LETTER ES
+ 0x8453: 0x0422, //CYRILLIC CAPITAL LETTER TE
+ 0x8454: 0x0423, //CYRILLIC CAPITAL LETTER U
+ 0x8455: 0x0424, //CYRILLIC CAPITAL LETTER EF
+ 0x8456: 0x0425, //CYRILLIC CAPITAL LETTER HA
+ 0x8457: 0x0426, //CYRILLIC CAPITAL LETTER TSE
+ 0x8458: 0x0427, //CYRILLIC CAPITAL LETTER CHE
+ 0x8459: 0x0428, //CYRILLIC CAPITAL LETTER SHA
+ 0x845A: 0x0429, //CYRILLIC CAPITAL LETTER SHCHA
+ 0x845B: 0x042A, //CYRILLIC CAPITAL LETTER HARD SIGN
+ 0x845C: 0x042B, //CYRILLIC CAPITAL LETTER YERU
+ 0x845D: 0x042C, //CYRILLIC CAPITAL LETTER SOFT SIGN
+ 0x845E: 0x042D, //CYRILLIC CAPITAL LETTER E
+ 0x845F: 0x042E, //CYRILLIC CAPITAL LETTER YU
+ 0x8460: 0x042F, //CYRILLIC CAPITAL LETTER YA
+ 0x8470: 0x0430, //CYRILLIC SMALL LETTER A
+ 0x8471: 0x0431, //CYRILLIC SMALL LETTER BE
+ 0x8472: 0x0432, //CYRILLIC SMALL LETTER VE
+ 0x8473: 0x0433, //CYRILLIC SMALL LETTER GHE
+ 0x8474: 0x0434, //CYRILLIC SMALL LETTER DE
+ 0x8475: 0x0435, //CYRILLIC SMALL LETTER IE
+ 0x8476: 0x0451, //CYRILLIC SMALL LETTER IO
+ 0x8477: 0x0436, //CYRILLIC SMALL LETTER ZHE
+ 0x8478: 0x0437, //CYRILLIC SMALL LETTER ZE
+ 0x8479: 0x0438, //CYRILLIC SMALL LETTER I
+ 0x847A: 0x0439, //CYRILLIC SMALL LETTER SHORT I
+ 0x847B: 0x043A, //CYRILLIC SMALL LETTER KA
+ 0x847C: 0x043B, //CYRILLIC SMALL LETTER EL
+ 0x847D: 0x043C, //CYRILLIC SMALL LETTER EM
+ 0x847E: 0x043D, //CYRILLIC SMALL LETTER EN
+ 0x8480: 0x043E, //CYRILLIC SMALL LETTER O
+ 0x8481: 0x043F, //CYRILLIC SMALL LETTER PE
+ 0x8482: 0x0440, //CYRILLIC SMALL LETTER ER
+ 0x8483: 0x0441, //CYRILLIC SMALL LETTER ES
+ 0x8484: 0x0442, //CYRILLIC SMALL LETTER TE
+ 0x8485: 0x0443, //CYRILLIC SMALL LETTER U
+ 0x8486: 0x0444, //CYRILLIC SMALL LETTER EF
+ 0x8487: 0x0445, //CYRILLIC SMALL LETTER HA
+ 0x8488: 0x0446, //CYRILLIC SMALL LETTER TSE
+ 0x8489: 0x0447, //CYRILLIC SMALL LETTER CHE
+ 0x848A: 0x0448, //CYRILLIC SMALL LETTER SHA
+ 0x848B: 0x0449, //CYRILLIC SMALL LETTER SHCHA
+ 0x848C: 0x044A, //CYRILLIC SMALL LETTER HARD SIGN
+ 0x848D: 0x044B, //CYRILLIC SMALL LETTER YERU
+ 0x848E: 0x044C, //CYRILLIC SMALL LETTER SOFT SIGN
+ 0x848F: 0x044D, //CYRILLIC SMALL LETTER E
+ 0x8490: 0x044E, //CYRILLIC SMALL LETTER YU
+ 0x8491: 0x044F, //CYRILLIC SMALL LETTER YA
+ 0x849F: 0x2500, //BOX DRAWINGS LIGHT HORIZONTAL
+ 0x84A0: 0x2502, //BOX DRAWINGS LIGHT VERTICAL
+ 0x84A1: 0x250C, //BOX DRAWINGS LIGHT DOWN AND RIGHT
+ 0x84A2: 0x2510, //BOX DRAWINGS LIGHT DOWN AND LEFT
+ 0x84A3: 0x2518, //BOX DRAWINGS LIGHT UP AND LEFT
+ 0x84A4: 0x2514, //BOX DRAWINGS LIGHT UP AND RIGHT
+ 0x84A5: 0x251C, //BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ 0x84A6: 0x252C, //BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ 0x84A7: 0x2524, //BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ 0x84A8: 0x2534, //BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ 0x84A9: 0x253C, //BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ 0x84AA: 0x2501, //BOX DRAWINGS HEAVY HORIZONTAL
+ 0x84AB: 0x2503, //BOX DRAWINGS HEAVY VERTICAL
+ 0x84AC: 0x250F, //BOX DRAWINGS HEAVY DOWN AND RIGHT
+ 0x84AD: 0x2513, //BOX DRAWINGS HEAVY DOWN AND LEFT
+ 0x84AE: 0x251B, //BOX DRAWINGS HEAVY UP AND LEFT
+ 0x84AF: 0x2517, //BOX DRAWINGS HEAVY UP AND RIGHT
+ 0x84B0: 0x2523, //BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ 0x84B1: 0x2533, //BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ 0x84B2: 0x252B, //BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ 0x84B3: 0x253B, //BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ 0x84B4: 0x254B, //BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ 0x84B5: 0x2520, //BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ 0x84B6: 0x252F, //BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ 0x84B7: 0x2528, //BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ 0x84B8: 0x2537, //BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ 0x84B9: 0x253F, //BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ 0x84BA: 0x251D, //BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ 0x84BB: 0x2530, //BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ 0x84BC: 0x2525, //BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ 0x84BD: 0x2538, //BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ 0x84BE: 0x2542, //BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ 0x8740: 0x2460, //CIRCLED DIGIT ONE
+ 0x8741: 0x2461, //CIRCLED DIGIT TWO
+ 0x8742: 0x2462, //CIRCLED DIGIT THREE
+ 0x8743: 0x2463, //CIRCLED DIGIT FOUR
+ 0x8744: 0x2464, //CIRCLED DIGIT FIVE
+ 0x8745: 0x2465, //CIRCLED DIGIT SIX
+ 0x8746: 0x2466, //CIRCLED DIGIT SEVEN
+ 0x8747: 0x2467, //CIRCLED DIGIT EIGHT
+ 0x8748: 0x2468, //CIRCLED DIGIT NINE
+ 0x8749: 0x2469, //CIRCLED NUMBER TEN
+ 0x874A: 0x246A, //CIRCLED NUMBER ELEVEN
+ 0x874B: 0x246B, //CIRCLED NUMBER TWELVE
+ 0x874C: 0x246C, //CIRCLED NUMBER THIRTEEN
+ 0x874D: 0x246D, //CIRCLED NUMBER FOURTEEN
+ 0x874E: 0x246E, //CIRCLED NUMBER FIFTEEN
+ 0x874F: 0x246F, //CIRCLED NUMBER SIXTEEN
+ 0x8750: 0x2470, //CIRCLED NUMBER SEVENTEEN
+ 0x8751: 0x2471, //CIRCLED NUMBER EIGHTEEN
+ 0x8752: 0x2472, //CIRCLED NUMBER NINETEEN
+ 0x8753: 0x2473, //CIRCLED NUMBER TWENTY
+ 0x8754: 0x2160, //ROMAN NUMERAL ONE
+ 0x8755: 0x2161, //ROMAN NUMERAL TWO
+ 0x8756: 0x2162, //ROMAN NUMERAL THREE
+ 0x8757: 0x2163, //ROMAN NUMERAL FOUR
+ 0x8758: 0x2164, //ROMAN NUMERAL FIVE
+ 0x8759: 0x2165, //ROMAN NUMERAL SIX
+ 0x875A: 0x2166, //ROMAN NUMERAL SEVEN
+ 0x875B: 0x2167, //ROMAN NUMERAL EIGHT
+ 0x875C: 0x2168, //ROMAN NUMERAL NINE
+ 0x875D: 0x2169, //ROMAN NUMERAL TEN
+ 0x875F: 0x3349, //SQUARE MIRI
+ 0x8760: 0x3314, //SQUARE KIRO
+ 0x8761: 0x3322, //SQUARE SENTI
+ 0x8762: 0x334D, //SQUARE MEETORU
+ 0x8763: 0x3318, //SQUARE GURAMU
+ 0x8764: 0x3327, //SQUARE TON
+ 0x8765: 0x3303, //SQUARE AARU
+ 0x8766: 0x3336, //SQUARE HEKUTAARU
+ 0x8767: 0x3351, //SQUARE RITTORU
+ 0x8768: 0x3357, //SQUARE WATTO
+ 0x8769: 0x330D, //SQUARE KARORII
+ 0x876A: 0x3326, //SQUARE DORU
+ 0x876B: 0x3323, //SQUARE SENTO
+ 0x876C: 0x332B, //SQUARE PAASENTO
+ 0x876D: 0x334A, //SQUARE MIRIBAARU
+ 0x876E: 0x333B, //SQUARE PEEZI
+ 0x876F: 0x339C, //SQUARE MM
+ 0x8770: 0x339D, //SQUARE CM
+ 0x8771: 0x339E, //SQUARE KM
+ 0x8772: 0x338E, //SQUARE MG
+ 0x8773: 0x338F, //SQUARE KG
+ 0x8774: 0x33C4, //SQUARE CC
+ 0x8775: 0x33A1, //SQUARE M SQUARED
+ 0x877E: 0x337B, //SQUARE ERA NAME HEISEI
+ 0x8780: 0x301D, //REVERSED DOUBLE PRIME QUOTATION MARK
+ 0x8781: 0x301F, //LOW DOUBLE PRIME QUOTATION MARK
+ 0x8782: 0x2116, //NUMERO SIGN
+ 0x8783: 0x33CD, //SQUARE KK
+ 0x8784: 0x2121, //TELEPHONE SIGN
+ 0x8785: 0x32A4, //CIRCLED IDEOGRAPH HIGH
+ 0x8786: 0x32A5, //CIRCLED IDEOGRAPH CENTRE
+ 0x8787: 0x32A6, //CIRCLED IDEOGRAPH LOW
+ 0x8788: 0x32A7, //CIRCLED IDEOGRAPH LEFT
+ 0x8789: 0x32A8, //CIRCLED IDEOGRAPH RIGHT
+ 0x878A: 0x3231, //PARENTHESIZED IDEOGRAPH STOCK
+ 0x878B: 0x3232, //PARENTHESIZED IDEOGRAPH HAVE
+ 0x878C: 0x3239, //PARENTHESIZED IDEOGRAPH REPRESENT
+ 0x878D: 0x337E, //SQUARE ERA NAME MEIZI
+ 0x878E: 0x337D, //SQUARE ERA NAME TAISYOU
+ 0x878F: 0x337C, //SQUARE ERA NAME SYOUWA
+ 0x8790: 0x2252, //APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ 0x8791: 0x2261, //IDENTICAL TO
+ 0x8792: 0x222B, //INTEGRAL
+ 0x8793: 0x222E, //CONTOUR INTEGRAL
+ 0x8794: 0x2211, //N-ARY SUMMATION
+ 0x8795: 0x221A, //SQUARE ROOT
+ 0x8796: 0x22A5, //UP TACK
+ 0x8797: 0x2220, //ANGLE
+ 0x8798: 0x221F, //RIGHT ANGLE
+ 0x8799: 0x22BF, //RIGHT TRIANGLE
+ 0x879A: 0x2235, //BECAUSE
+ 0x879B: 0x2229, //INTERSECTION
+ 0x879C: 0x222A, //UNION
+ 0x889F: 0x4E9C, //CJK UNIFIED IDEOGRAPH
+ 0x88A0: 0x5516, //CJK UNIFIED IDEOGRAPH
+ 0x88A1: 0x5A03, //CJK UNIFIED IDEOGRAPH
+ 0x88A2: 0x963F, //CJK UNIFIED IDEOGRAPH
+ 0x88A3: 0x54C0, //CJK UNIFIED IDEOGRAPH
+ 0x88A4: 0x611B, //CJK UNIFIED IDEOGRAPH
+ 0x88A5: 0x6328, //CJK UNIFIED IDEOGRAPH
+ 0x88A6: 0x59F6, //CJK UNIFIED IDEOGRAPH
+ 0x88A7: 0x9022, //CJK UNIFIED IDEOGRAPH
+ 0x88A8: 0x8475, //CJK UNIFIED IDEOGRAPH
+ 0x88A9: 0x831C, //CJK UNIFIED IDEOGRAPH
+ 0x88AA: 0x7A50, //CJK UNIFIED IDEOGRAPH
+ 0x88AB: 0x60AA, //CJK UNIFIED IDEOGRAPH
+ 0x88AC: 0x63E1, //CJK UNIFIED IDEOGRAPH
+ 0x88AD: 0x6E25, //CJK UNIFIED IDEOGRAPH
+ 0x88AE: 0x65ED, //CJK UNIFIED IDEOGRAPH
+ 0x88AF: 0x8466, //CJK UNIFIED IDEOGRAPH
+ 0x88B0: 0x82A6, //CJK UNIFIED IDEOGRAPH
+ 0x88B1: 0x9BF5, //CJK UNIFIED IDEOGRAPH
+ 0x88B2: 0x6893, //CJK UNIFIED IDEOGRAPH
+ 0x88B3: 0x5727, //CJK UNIFIED IDEOGRAPH
+ 0x88B4: 0x65A1, //CJK UNIFIED IDEOGRAPH
+ 0x88B5: 0x6271, //CJK UNIFIED IDEOGRAPH
+ 0x88B6: 0x5B9B, //CJK UNIFIED IDEOGRAPH
+ 0x88B7: 0x59D0, //CJK UNIFIED IDEOGRAPH
+ 0x88B8: 0x867B, //CJK UNIFIED IDEOGRAPH
+ 0x88B9: 0x98F4, //CJK UNIFIED IDEOGRAPH
+ 0x88BA: 0x7D62, //CJK UNIFIED IDEOGRAPH
+ 0x88BB: 0x7DBE, //CJK UNIFIED IDEOGRAPH
+ 0x88BC: 0x9B8E, //CJK UNIFIED IDEOGRAPH
+ 0x88BD: 0x6216, //CJK UNIFIED IDEOGRAPH
+ 0x88BE: 0x7C9F, //CJK UNIFIED IDEOGRAPH
+ 0x88BF: 0x88B7, //CJK UNIFIED IDEOGRAPH
+ 0x88C0: 0x5B89, //CJK UNIFIED IDEOGRAPH
+ 0x88C1: 0x5EB5, //CJK UNIFIED IDEOGRAPH
+ 0x88C2: 0x6309, //CJK UNIFIED IDEOGRAPH
+ 0x88C3: 0x6697, //CJK UNIFIED IDEOGRAPH
+ 0x88C4: 0x6848, //CJK UNIFIED IDEOGRAPH
+ 0x88C5: 0x95C7, //CJK UNIFIED IDEOGRAPH
+ 0x88C6: 0x978D, //CJK UNIFIED IDEOGRAPH
+ 0x88C7: 0x674F, //CJK UNIFIED IDEOGRAPH
+ 0x88C8: 0x4EE5, //CJK UNIFIED IDEOGRAPH
+ 0x88C9: 0x4F0A, //CJK UNIFIED IDEOGRAPH
+ 0x88CA: 0x4F4D, //CJK UNIFIED IDEOGRAPH
+ 0x88CB: 0x4F9D, //CJK UNIFIED IDEOGRAPH
+ 0x88CC: 0x5049, //CJK UNIFIED IDEOGRAPH
+ 0x88CD: 0x56F2, //CJK UNIFIED IDEOGRAPH
+ 0x88CE: 0x5937, //CJK UNIFIED IDEOGRAPH
+ 0x88CF: 0x59D4, //CJK UNIFIED IDEOGRAPH
+ 0x88D0: 0x5A01, //CJK UNIFIED IDEOGRAPH
+ 0x88D1: 0x5C09, //CJK UNIFIED IDEOGRAPH
+ 0x88D2: 0x60DF, //CJK UNIFIED IDEOGRAPH
+ 0x88D3: 0x610F, //CJK UNIFIED IDEOGRAPH
+ 0x88D4: 0x6170, //CJK UNIFIED IDEOGRAPH
+ 0x88D5: 0x6613, //CJK UNIFIED IDEOGRAPH
+ 0x88D6: 0x6905, //CJK UNIFIED IDEOGRAPH
+ 0x88D7: 0x70BA, //CJK UNIFIED IDEOGRAPH
+ 0x88D8: 0x754F, //CJK UNIFIED IDEOGRAPH
+ 0x88D9: 0x7570, //CJK UNIFIED IDEOGRAPH
+ 0x88DA: 0x79FB, //CJK UNIFIED IDEOGRAPH
+ 0x88DB: 0x7DAD, //CJK UNIFIED IDEOGRAPH
+ 0x88DC: 0x7DEF, //CJK UNIFIED IDEOGRAPH
+ 0x88DD: 0x80C3, //CJK UNIFIED IDEOGRAPH
+ 0x88DE: 0x840E, //CJK UNIFIED IDEOGRAPH
+ 0x88DF: 0x8863, //CJK UNIFIED IDEOGRAPH
+ 0x88E0: 0x8B02, //CJK UNIFIED IDEOGRAPH
+ 0x88E1: 0x9055, //CJK UNIFIED IDEOGRAPH
+ 0x88E2: 0x907A, //CJK UNIFIED IDEOGRAPH
+ 0x88E3: 0x533B, //CJK UNIFIED IDEOGRAPH
+ 0x88E4: 0x4E95, //CJK UNIFIED IDEOGRAPH
+ 0x88E5: 0x4EA5, //CJK UNIFIED IDEOGRAPH
+ 0x88E6: 0x57DF, //CJK UNIFIED IDEOGRAPH
+ 0x88E7: 0x80B2, //CJK UNIFIED IDEOGRAPH
+ 0x88E8: 0x90C1, //CJK UNIFIED IDEOGRAPH
+ 0x88E9: 0x78EF, //CJK UNIFIED IDEOGRAPH
+ 0x88EA: 0x4E00, //CJK UNIFIED IDEOGRAPH
+ 0x88EB: 0x58F1, //CJK UNIFIED IDEOGRAPH
+ 0x88EC: 0x6EA2, //CJK UNIFIED IDEOGRAPH
+ 0x88ED: 0x9038, //CJK UNIFIED IDEOGRAPH
+ 0x88EE: 0x7A32, //CJK UNIFIED IDEOGRAPH
+ 0x88EF: 0x8328, //CJK UNIFIED IDEOGRAPH
+ 0x88F0: 0x828B, //CJK UNIFIED IDEOGRAPH
+ 0x88F1: 0x9C2F, //CJK UNIFIED IDEOGRAPH
+ 0x88F2: 0x5141, //CJK UNIFIED IDEOGRAPH
+ 0x88F3: 0x5370, //CJK UNIFIED IDEOGRAPH
+ 0x88F4: 0x54BD, //CJK UNIFIED IDEOGRAPH
+ 0x88F5: 0x54E1, //CJK UNIFIED IDEOGRAPH
+ 0x88F6: 0x56E0, //CJK UNIFIED IDEOGRAPH
+ 0x88F7: 0x59FB, //CJK UNIFIED IDEOGRAPH
+ 0x88F8: 0x5F15, //CJK UNIFIED IDEOGRAPH
+ 0x88F9: 0x98F2, //CJK UNIFIED IDEOGRAPH
+ 0x88FA: 0x6DEB, //CJK UNIFIED IDEOGRAPH
+ 0x88FB: 0x80E4, //CJK UNIFIED IDEOGRAPH
+ 0x88FC: 0x852D, //CJK UNIFIED IDEOGRAPH
+ 0x8940: 0x9662, //CJK UNIFIED IDEOGRAPH
+ 0x8941: 0x9670, //CJK UNIFIED IDEOGRAPH
+ 0x8942: 0x96A0, //CJK UNIFIED IDEOGRAPH
+ 0x8943: 0x97FB, //CJK UNIFIED IDEOGRAPH
+ 0x8944: 0x540B, //CJK UNIFIED IDEOGRAPH
+ 0x8945: 0x53F3, //CJK UNIFIED IDEOGRAPH
+ 0x8946: 0x5B87, //CJK UNIFIED IDEOGRAPH
+ 0x8947: 0x70CF, //CJK UNIFIED IDEOGRAPH
+ 0x8948: 0x7FBD, //CJK UNIFIED IDEOGRAPH
+ 0x8949: 0x8FC2, //CJK UNIFIED IDEOGRAPH
+ 0x894A: 0x96E8, //CJK UNIFIED IDEOGRAPH
+ 0x894B: 0x536F, //CJK UNIFIED IDEOGRAPH
+ 0x894C: 0x9D5C, //CJK UNIFIED IDEOGRAPH
+ 0x894D: 0x7ABA, //CJK UNIFIED IDEOGRAPH
+ 0x894E: 0x4E11, //CJK UNIFIED IDEOGRAPH
+ 0x894F: 0x7893, //CJK UNIFIED IDEOGRAPH
+ 0x8950: 0x81FC, //CJK UNIFIED IDEOGRAPH
+ 0x8951: 0x6E26, //CJK UNIFIED IDEOGRAPH
+ 0x8952: 0x5618, //CJK UNIFIED IDEOGRAPH
+ 0x8953: 0x5504, //CJK UNIFIED IDEOGRAPH
+ 0x8954: 0x6B1D, //CJK UNIFIED IDEOGRAPH
+ 0x8955: 0x851A, //CJK UNIFIED IDEOGRAPH
+ 0x8956: 0x9C3B, //CJK UNIFIED IDEOGRAPH
+ 0x8957: 0x59E5, //CJK UNIFIED IDEOGRAPH
+ 0x8958: 0x53A9, //CJK UNIFIED IDEOGRAPH
+ 0x8959: 0x6D66, //CJK UNIFIED IDEOGRAPH
+ 0x895A: 0x74DC, //CJK UNIFIED IDEOGRAPH
+ 0x895B: 0x958F, //CJK UNIFIED IDEOGRAPH
+ 0x895C: 0x5642, //CJK UNIFIED IDEOGRAPH
+ 0x895D: 0x4E91, //CJK UNIFIED IDEOGRAPH
+ 0x895E: 0x904B, //CJK UNIFIED IDEOGRAPH
+ 0x895F: 0x96F2, //CJK UNIFIED IDEOGRAPH
+ 0x8960: 0x834F, //CJK UNIFIED IDEOGRAPH
+ 0x8961: 0x990C, //CJK UNIFIED IDEOGRAPH
+ 0x8962: 0x53E1, //CJK UNIFIED IDEOGRAPH
+ 0x8963: 0x55B6, //CJK UNIFIED IDEOGRAPH
+ 0x8964: 0x5B30, //CJK UNIFIED IDEOGRAPH
+ 0x8965: 0x5F71, //CJK UNIFIED IDEOGRAPH
+ 0x8966: 0x6620, //CJK UNIFIED IDEOGRAPH
+ 0x8967: 0x66F3, //CJK UNIFIED IDEOGRAPH
+ 0x8968: 0x6804, //CJK UNIFIED IDEOGRAPH
+ 0x8969: 0x6C38, //CJK UNIFIED IDEOGRAPH
+ 0x896A: 0x6CF3, //CJK UNIFIED IDEOGRAPH
+ 0x896B: 0x6D29, //CJK UNIFIED IDEOGRAPH
+ 0x896C: 0x745B, //CJK UNIFIED IDEOGRAPH
+ 0x896D: 0x76C8, //CJK UNIFIED IDEOGRAPH
+ 0x896E: 0x7A4E, //CJK UNIFIED IDEOGRAPH
+ 0x896F: 0x9834, //CJK UNIFIED IDEOGRAPH
+ 0x8970: 0x82F1, //CJK UNIFIED IDEOGRAPH
+ 0x8971: 0x885B, //CJK UNIFIED IDEOGRAPH
+ 0x8972: 0x8A60, //CJK UNIFIED IDEOGRAPH
+ 0x8973: 0x92ED, //CJK UNIFIED IDEOGRAPH
+ 0x8974: 0x6DB2, //CJK UNIFIED IDEOGRAPH
+ 0x8975: 0x75AB, //CJK UNIFIED IDEOGRAPH
+ 0x8976: 0x76CA, //CJK UNIFIED IDEOGRAPH
+ 0x8977: 0x99C5, //CJK UNIFIED IDEOGRAPH
+ 0x8978: 0x60A6, //CJK UNIFIED IDEOGRAPH
+ 0x8979: 0x8B01, //CJK UNIFIED IDEOGRAPH
+ 0x897A: 0x8D8A, //CJK UNIFIED IDEOGRAPH
+ 0x897B: 0x95B2, //CJK UNIFIED IDEOGRAPH
+ 0x897C: 0x698E, //CJK UNIFIED IDEOGRAPH
+ 0x897D: 0x53AD, //CJK UNIFIED IDEOGRAPH
+ 0x897E: 0x5186, //CJK UNIFIED IDEOGRAPH
+ 0x8980: 0x5712, //CJK UNIFIED IDEOGRAPH
+ 0x8981: 0x5830, //CJK UNIFIED IDEOGRAPH
+ 0x8982: 0x5944, //CJK UNIFIED IDEOGRAPH
+ 0x8983: 0x5BB4, //CJK UNIFIED IDEOGRAPH
+ 0x8984: 0x5EF6, //CJK UNIFIED IDEOGRAPH
+ 0x8985: 0x6028, //CJK UNIFIED IDEOGRAPH
+ 0x8986: 0x63A9, //CJK UNIFIED IDEOGRAPH
+ 0x8987: 0x63F4, //CJK UNIFIED IDEOGRAPH
+ 0x8988: 0x6CBF, //CJK UNIFIED IDEOGRAPH
+ 0x8989: 0x6F14, //CJK UNIFIED IDEOGRAPH
+ 0x898A: 0x708E, //CJK UNIFIED IDEOGRAPH
+ 0x898B: 0x7114, //CJK UNIFIED IDEOGRAPH
+ 0x898C: 0x7159, //CJK UNIFIED IDEOGRAPH
+ 0x898D: 0x71D5, //CJK UNIFIED IDEOGRAPH
+ 0x898E: 0x733F, //CJK UNIFIED IDEOGRAPH
+ 0x898F: 0x7E01, //CJK UNIFIED IDEOGRAPH
+ 0x8990: 0x8276, //CJK UNIFIED IDEOGRAPH
+ 0x8991: 0x82D1, //CJK UNIFIED IDEOGRAPH
+ 0x8992: 0x8597, //CJK UNIFIED IDEOGRAPH
+ 0x8993: 0x9060, //CJK UNIFIED IDEOGRAPH
+ 0x8994: 0x925B, //CJK UNIFIED IDEOGRAPH
+ 0x8995: 0x9D1B, //CJK UNIFIED IDEOGRAPH
+ 0x8996: 0x5869, //CJK UNIFIED IDEOGRAPH
+ 0x8997: 0x65BC, //CJK UNIFIED IDEOGRAPH
+ 0x8998: 0x6C5A, //CJK UNIFIED IDEOGRAPH
+ 0x8999: 0x7525, //CJK UNIFIED IDEOGRAPH
+ 0x899A: 0x51F9, //CJK UNIFIED IDEOGRAPH
+ 0x899B: 0x592E, //CJK UNIFIED IDEOGRAPH
+ 0x899C: 0x5965, //CJK UNIFIED IDEOGRAPH
+ 0x899D: 0x5F80, //CJK UNIFIED IDEOGRAPH
+ 0x899E: 0x5FDC, //CJK UNIFIED IDEOGRAPH
+ 0x899F: 0x62BC, //CJK UNIFIED IDEOGRAPH
+ 0x89A0: 0x65FA, //CJK UNIFIED IDEOGRAPH
+ 0x89A1: 0x6A2A, //CJK UNIFIED IDEOGRAPH
+ 0x89A2: 0x6B27, //CJK UNIFIED IDEOGRAPH
+ 0x89A3: 0x6BB4, //CJK UNIFIED IDEOGRAPH
+ 0x89A4: 0x738B, //CJK UNIFIED IDEOGRAPH
+ 0x89A5: 0x7FC1, //CJK UNIFIED IDEOGRAPH
+ 0x89A6: 0x8956, //CJK UNIFIED IDEOGRAPH
+ 0x89A7: 0x9D2C, //CJK UNIFIED IDEOGRAPH
+ 0x89A8: 0x9D0E, //CJK UNIFIED IDEOGRAPH
+ 0x89A9: 0x9EC4, //CJK UNIFIED IDEOGRAPH
+ 0x89AA: 0x5CA1, //CJK UNIFIED IDEOGRAPH
+ 0x89AB: 0x6C96, //CJK UNIFIED IDEOGRAPH
+ 0x89AC: 0x837B, //CJK UNIFIED IDEOGRAPH
+ 0x89AD: 0x5104, //CJK UNIFIED IDEOGRAPH
+ 0x89AE: 0x5C4B, //CJK UNIFIED IDEOGRAPH
+ 0x89AF: 0x61B6, //CJK UNIFIED IDEOGRAPH
+ 0x89B0: 0x81C6, //CJK UNIFIED IDEOGRAPH
+ 0x89B1: 0x6876, //CJK UNIFIED IDEOGRAPH
+ 0x89B2: 0x7261, //CJK UNIFIED IDEOGRAPH
+ 0x89B3: 0x4E59, //CJK UNIFIED IDEOGRAPH
+ 0x89B4: 0x4FFA, //CJK UNIFIED IDEOGRAPH
+ 0x89B5: 0x5378, //CJK UNIFIED IDEOGRAPH
+ 0x89B6: 0x6069, //CJK UNIFIED IDEOGRAPH
+ 0x89B7: 0x6E29, //CJK UNIFIED IDEOGRAPH
+ 0x89B8: 0x7A4F, //CJK UNIFIED IDEOGRAPH
+ 0x89B9: 0x97F3, //CJK UNIFIED IDEOGRAPH
+ 0x89BA: 0x4E0B, //CJK UNIFIED IDEOGRAPH
+ 0x89BB: 0x5316, //CJK UNIFIED IDEOGRAPH
+ 0x89BC: 0x4EEE, //CJK UNIFIED IDEOGRAPH
+ 0x89BD: 0x4F55, //CJK UNIFIED IDEOGRAPH
+ 0x89BE: 0x4F3D, //CJK UNIFIED IDEOGRAPH
+ 0x89BF: 0x4FA1, //CJK UNIFIED IDEOGRAPH
+ 0x89C0: 0x4F73, //CJK UNIFIED IDEOGRAPH
+ 0x89C1: 0x52A0, //CJK UNIFIED IDEOGRAPH
+ 0x89C2: 0x53EF, //CJK UNIFIED IDEOGRAPH
+ 0x89C3: 0x5609, //CJK UNIFIED IDEOGRAPH
+ 0x89C4: 0x590F, //CJK UNIFIED IDEOGRAPH
+ 0x89C5: 0x5AC1, //CJK UNIFIED IDEOGRAPH
+ 0x89C6: 0x5BB6, //CJK UNIFIED IDEOGRAPH
+ 0x89C7: 0x5BE1, //CJK UNIFIED IDEOGRAPH
+ 0x89C8: 0x79D1, //CJK UNIFIED IDEOGRAPH
+ 0x89C9: 0x6687, //CJK UNIFIED IDEOGRAPH
+ 0x89CA: 0x679C, //CJK UNIFIED IDEOGRAPH
+ 0x89CB: 0x67B6, //CJK UNIFIED IDEOGRAPH
+ 0x89CC: 0x6B4C, //CJK UNIFIED IDEOGRAPH
+ 0x89CD: 0x6CB3, //CJK UNIFIED IDEOGRAPH
+ 0x89CE: 0x706B, //CJK UNIFIED IDEOGRAPH
+ 0x89CF: 0x73C2, //CJK UNIFIED IDEOGRAPH
+ 0x89D0: 0x798D, //CJK UNIFIED IDEOGRAPH
+ 0x89D1: 0x79BE, //CJK UNIFIED IDEOGRAPH
+ 0x89D2: 0x7A3C, //CJK UNIFIED IDEOGRAPH
+ 0x89D3: 0x7B87, //CJK UNIFIED IDEOGRAPH
+ 0x89D4: 0x82B1, //CJK UNIFIED IDEOGRAPH
+ 0x89D5: 0x82DB, //CJK UNIFIED IDEOGRAPH
+ 0x89D6: 0x8304, //CJK UNIFIED IDEOGRAPH
+ 0x89D7: 0x8377, //CJK UNIFIED IDEOGRAPH
+ 0x89D8: 0x83EF, //CJK UNIFIED IDEOGRAPH
+ 0x89D9: 0x83D3, //CJK UNIFIED IDEOGRAPH
+ 0x89DA: 0x8766, //CJK UNIFIED IDEOGRAPH
+ 0x89DB: 0x8AB2, //CJK UNIFIED IDEOGRAPH
+ 0x89DC: 0x5629, //CJK UNIFIED IDEOGRAPH
+ 0x89DD: 0x8CA8, //CJK UNIFIED IDEOGRAPH
+ 0x89DE: 0x8FE6, //CJK UNIFIED IDEOGRAPH
+ 0x89DF: 0x904E, //CJK UNIFIED IDEOGRAPH
+ 0x89E0: 0x971E, //CJK UNIFIED IDEOGRAPH
+ 0x89E1: 0x868A, //CJK UNIFIED IDEOGRAPH
+ 0x89E2: 0x4FC4, //CJK UNIFIED IDEOGRAPH
+ 0x89E3: 0x5CE8, //CJK UNIFIED IDEOGRAPH
+ 0x89E4: 0x6211, //CJK UNIFIED IDEOGRAPH
+ 0x89E5: 0x7259, //CJK UNIFIED IDEOGRAPH
+ 0x89E6: 0x753B, //CJK UNIFIED IDEOGRAPH
+ 0x89E7: 0x81E5, //CJK UNIFIED IDEOGRAPH
+ 0x89E8: 0x82BD, //CJK UNIFIED IDEOGRAPH
+ 0x89E9: 0x86FE, //CJK UNIFIED IDEOGRAPH
+ 0x89EA: 0x8CC0, //CJK UNIFIED IDEOGRAPH
+ 0x89EB: 0x96C5, //CJK UNIFIED IDEOGRAPH
+ 0x89EC: 0x9913, //CJK UNIFIED IDEOGRAPH
+ 0x89ED: 0x99D5, //CJK UNIFIED IDEOGRAPH
+ 0x89EE: 0x4ECB, //CJK UNIFIED IDEOGRAPH
+ 0x89EF: 0x4F1A, //CJK UNIFIED IDEOGRAPH
+ 0x89F0: 0x89E3, //CJK UNIFIED IDEOGRAPH
+ 0x89F1: 0x56DE, //CJK UNIFIED IDEOGRAPH
+ 0x89F2: 0x584A, //CJK UNIFIED IDEOGRAPH
+ 0x89F3: 0x58CA, //CJK UNIFIED IDEOGRAPH
+ 0x89F4: 0x5EFB, //CJK UNIFIED IDEOGRAPH
+ 0x89F5: 0x5FEB, //CJK UNIFIED IDEOGRAPH
+ 0x89F6: 0x602A, //CJK UNIFIED IDEOGRAPH
+ 0x89F7: 0x6094, //CJK UNIFIED IDEOGRAPH
+ 0x89F8: 0x6062, //CJK UNIFIED IDEOGRAPH
+ 0x89F9: 0x61D0, //CJK UNIFIED IDEOGRAPH
+ 0x89FA: 0x6212, //CJK UNIFIED IDEOGRAPH
+ 0x89FB: 0x62D0, //CJK UNIFIED IDEOGRAPH
+ 0x89FC: 0x6539, //CJK UNIFIED IDEOGRAPH
+ 0x8A40: 0x9B41, //CJK UNIFIED IDEOGRAPH
+ 0x8A41: 0x6666, //CJK UNIFIED IDEOGRAPH
+ 0x8A42: 0x68B0, //CJK UNIFIED IDEOGRAPH
+ 0x8A43: 0x6D77, //CJK UNIFIED IDEOGRAPH
+ 0x8A44: 0x7070, //CJK UNIFIED IDEOGRAPH
+ 0x8A45: 0x754C, //CJK UNIFIED IDEOGRAPH
+ 0x8A46: 0x7686, //CJK UNIFIED IDEOGRAPH
+ 0x8A47: 0x7D75, //CJK UNIFIED IDEOGRAPH
+ 0x8A48: 0x82A5, //CJK UNIFIED IDEOGRAPH
+ 0x8A49: 0x87F9, //CJK UNIFIED IDEOGRAPH
+ 0x8A4A: 0x958B, //CJK UNIFIED IDEOGRAPH
+ 0x8A4B: 0x968E, //CJK UNIFIED IDEOGRAPH
+ 0x8A4C: 0x8C9D, //CJK UNIFIED IDEOGRAPH
+ 0x8A4D: 0x51F1, //CJK UNIFIED IDEOGRAPH
+ 0x8A4E: 0x52BE, //CJK UNIFIED IDEOGRAPH
+ 0x8A4F: 0x5916, //CJK UNIFIED IDEOGRAPH
+ 0x8A50: 0x54B3, //CJK UNIFIED IDEOGRAPH
+ 0x8A51: 0x5BB3, //CJK UNIFIED IDEOGRAPH
+ 0x8A52: 0x5D16, //CJK UNIFIED IDEOGRAPH
+ 0x8A53: 0x6168, //CJK UNIFIED IDEOGRAPH
+ 0x8A54: 0x6982, //CJK UNIFIED IDEOGRAPH
+ 0x8A55: 0x6DAF, //CJK UNIFIED IDEOGRAPH
+ 0x8A56: 0x788D, //CJK UNIFIED IDEOGRAPH
+ 0x8A57: 0x84CB, //CJK UNIFIED IDEOGRAPH
+ 0x8A58: 0x8857, //CJK UNIFIED IDEOGRAPH
+ 0x8A59: 0x8A72, //CJK UNIFIED IDEOGRAPH
+ 0x8A5A: 0x93A7, //CJK UNIFIED IDEOGRAPH
+ 0x8A5B: 0x9AB8, //CJK UNIFIED IDEOGRAPH
+ 0x8A5C: 0x6D6C, //CJK UNIFIED IDEOGRAPH
+ 0x8A5D: 0x99A8, //CJK UNIFIED IDEOGRAPH
+ 0x8A5E: 0x86D9, //CJK UNIFIED IDEOGRAPH
+ 0x8A5F: 0x57A3, //CJK UNIFIED IDEOGRAPH
+ 0x8A60: 0x67FF, //CJK UNIFIED IDEOGRAPH
+ 0x8A61: 0x86CE, //CJK UNIFIED IDEOGRAPH
+ 0x8A62: 0x920E, //CJK UNIFIED IDEOGRAPH
+ 0x8A63: 0x5283, //CJK UNIFIED IDEOGRAPH
+ 0x8A64: 0x5687, //CJK UNIFIED IDEOGRAPH
+ 0x8A65: 0x5404, //CJK UNIFIED IDEOGRAPH
+ 0x8A66: 0x5ED3, //CJK UNIFIED IDEOGRAPH
+ 0x8A67: 0x62E1, //CJK UNIFIED IDEOGRAPH
+ 0x8A68: 0x64B9, //CJK UNIFIED IDEOGRAPH
+ 0x8A69: 0x683C, //CJK UNIFIED IDEOGRAPH
+ 0x8A6A: 0x6838, //CJK UNIFIED IDEOGRAPH
+ 0x8A6B: 0x6BBB, //CJK UNIFIED IDEOGRAPH
+ 0x8A6C: 0x7372, //CJK UNIFIED IDEOGRAPH
+ 0x8A6D: 0x78BA, //CJK UNIFIED IDEOGRAPH
+ 0x8A6E: 0x7A6B, //CJK UNIFIED IDEOGRAPH
+ 0x8A6F: 0x899A, //CJK UNIFIED IDEOGRAPH
+ 0x8A70: 0x89D2, //CJK UNIFIED IDEOGRAPH
+ 0x8A71: 0x8D6B, //CJK UNIFIED IDEOGRAPH
+ 0x8A72: 0x8F03, //CJK UNIFIED IDEOGRAPH
+ 0x8A73: 0x90ED, //CJK UNIFIED IDEOGRAPH
+ 0x8A74: 0x95A3, //CJK UNIFIED IDEOGRAPH
+ 0x8A75: 0x9694, //CJK UNIFIED IDEOGRAPH
+ 0x8A76: 0x9769, //CJK UNIFIED IDEOGRAPH
+ 0x8A77: 0x5B66, //CJK UNIFIED IDEOGRAPH
+ 0x8A78: 0x5CB3, //CJK UNIFIED IDEOGRAPH
+ 0x8A79: 0x697D, //CJK UNIFIED IDEOGRAPH
+ 0x8A7A: 0x984D, //CJK UNIFIED IDEOGRAPH
+ 0x8A7B: 0x984E, //CJK UNIFIED IDEOGRAPH
+ 0x8A7C: 0x639B, //CJK UNIFIED IDEOGRAPH
+ 0x8A7D: 0x7B20, //CJK UNIFIED IDEOGRAPH
+ 0x8A7E: 0x6A2B, //CJK UNIFIED IDEOGRAPH
+ 0x8A80: 0x6A7F, //CJK UNIFIED IDEOGRAPH
+ 0x8A81: 0x68B6, //CJK UNIFIED IDEOGRAPH
+ 0x8A82: 0x9C0D, //CJK UNIFIED IDEOGRAPH
+ 0x8A83: 0x6F5F, //CJK UNIFIED IDEOGRAPH
+ 0x8A84: 0x5272, //CJK UNIFIED IDEOGRAPH
+ 0x8A85: 0x559D, //CJK UNIFIED IDEOGRAPH
+ 0x8A86: 0x6070, //CJK UNIFIED IDEOGRAPH
+ 0x8A87: 0x62EC, //CJK UNIFIED IDEOGRAPH
+ 0x8A88: 0x6D3B, //CJK UNIFIED IDEOGRAPH
+ 0x8A89: 0x6E07, //CJK UNIFIED IDEOGRAPH
+ 0x8A8A: 0x6ED1, //CJK UNIFIED IDEOGRAPH
+ 0x8A8B: 0x845B, //CJK UNIFIED IDEOGRAPH
+ 0x8A8C: 0x8910, //CJK UNIFIED IDEOGRAPH
+ 0x8A8D: 0x8F44, //CJK UNIFIED IDEOGRAPH
+ 0x8A8E: 0x4E14, //CJK UNIFIED IDEOGRAPH
+ 0x8A8F: 0x9C39, //CJK UNIFIED IDEOGRAPH
+ 0x8A90: 0x53F6, //CJK UNIFIED IDEOGRAPH
+ 0x8A91: 0x691B, //CJK UNIFIED IDEOGRAPH
+ 0x8A92: 0x6A3A, //CJK UNIFIED IDEOGRAPH
+ 0x8A93: 0x9784, //CJK UNIFIED IDEOGRAPH
+ 0x8A94: 0x682A, //CJK UNIFIED IDEOGRAPH
+ 0x8A95: 0x515C, //CJK UNIFIED IDEOGRAPH
+ 0x8A96: 0x7AC3, //CJK UNIFIED IDEOGRAPH
+ 0x8A97: 0x84B2, //CJK UNIFIED IDEOGRAPH
+ 0x8A98: 0x91DC, //CJK UNIFIED IDEOGRAPH
+ 0x8A99: 0x938C, //CJK UNIFIED IDEOGRAPH
+ 0x8A9A: 0x565B, //CJK UNIFIED IDEOGRAPH
+ 0x8A9B: 0x9D28, //CJK UNIFIED IDEOGRAPH
+ 0x8A9C: 0x6822, //CJK UNIFIED IDEOGRAPH
+ 0x8A9D: 0x8305, //CJK UNIFIED IDEOGRAPH
+ 0x8A9E: 0x8431, //CJK UNIFIED IDEOGRAPH
+ 0x8A9F: 0x7CA5, //CJK UNIFIED IDEOGRAPH
+ 0x8AA0: 0x5208, //CJK UNIFIED IDEOGRAPH
+ 0x8AA1: 0x82C5, //CJK UNIFIED IDEOGRAPH
+ 0x8AA2: 0x74E6, //CJK UNIFIED IDEOGRAPH
+ 0x8AA3: 0x4E7E, //CJK UNIFIED IDEOGRAPH
+ 0x8AA4: 0x4F83, //CJK UNIFIED IDEOGRAPH
+ 0x8AA5: 0x51A0, //CJK UNIFIED IDEOGRAPH
+ 0x8AA6: 0x5BD2, //CJK UNIFIED IDEOGRAPH
+ 0x8AA7: 0x520A, //CJK UNIFIED IDEOGRAPH
+ 0x8AA8: 0x52D8, //CJK UNIFIED IDEOGRAPH
+ 0x8AA9: 0x52E7, //CJK UNIFIED IDEOGRAPH
+ 0x8AAA: 0x5DFB, //CJK UNIFIED IDEOGRAPH
+ 0x8AAB: 0x559A, //CJK UNIFIED IDEOGRAPH
+ 0x8AAC: 0x582A, //CJK UNIFIED IDEOGRAPH
+ 0x8AAD: 0x59E6, //CJK UNIFIED IDEOGRAPH
+ 0x8AAE: 0x5B8C, //CJK UNIFIED IDEOGRAPH
+ 0x8AAF: 0x5B98, //CJK UNIFIED IDEOGRAPH
+ 0x8AB0: 0x5BDB, //CJK UNIFIED IDEOGRAPH
+ 0x8AB1: 0x5E72, //CJK UNIFIED IDEOGRAPH
+ 0x8AB2: 0x5E79, //CJK UNIFIED IDEOGRAPH
+ 0x8AB3: 0x60A3, //CJK UNIFIED IDEOGRAPH
+ 0x8AB4: 0x611F, //CJK UNIFIED IDEOGRAPH
+ 0x8AB5: 0x6163, //CJK UNIFIED IDEOGRAPH
+ 0x8AB6: 0x61BE, //CJK UNIFIED IDEOGRAPH
+ 0x8AB7: 0x63DB, //CJK UNIFIED IDEOGRAPH
+ 0x8AB8: 0x6562, //CJK UNIFIED IDEOGRAPH
+ 0x8AB9: 0x67D1, //CJK UNIFIED IDEOGRAPH
+ 0x8ABA: 0x6853, //CJK UNIFIED IDEOGRAPH
+ 0x8ABB: 0x68FA, //CJK UNIFIED IDEOGRAPH
+ 0x8ABC: 0x6B3E, //CJK UNIFIED IDEOGRAPH
+ 0x8ABD: 0x6B53, //CJK UNIFIED IDEOGRAPH
+ 0x8ABE: 0x6C57, //CJK UNIFIED IDEOGRAPH
+ 0x8ABF: 0x6F22, //CJK UNIFIED IDEOGRAPH
+ 0x8AC0: 0x6F97, //CJK UNIFIED IDEOGRAPH
+ 0x8AC1: 0x6F45, //CJK UNIFIED IDEOGRAPH
+ 0x8AC2: 0x74B0, //CJK UNIFIED IDEOGRAPH
+ 0x8AC3: 0x7518, //CJK UNIFIED IDEOGRAPH
+ 0x8AC4: 0x76E3, //CJK UNIFIED IDEOGRAPH
+ 0x8AC5: 0x770B, //CJK UNIFIED IDEOGRAPH
+ 0x8AC6: 0x7AFF, //CJK UNIFIED IDEOGRAPH
+ 0x8AC7: 0x7BA1, //CJK UNIFIED IDEOGRAPH
+ 0x8AC8: 0x7C21, //CJK UNIFIED IDEOGRAPH
+ 0x8AC9: 0x7DE9, //CJK UNIFIED IDEOGRAPH
+ 0x8ACA: 0x7F36, //CJK UNIFIED IDEOGRAPH
+ 0x8ACB: 0x7FF0, //CJK UNIFIED IDEOGRAPH
+ 0x8ACC: 0x809D, //CJK UNIFIED IDEOGRAPH
+ 0x8ACD: 0x8266, //CJK UNIFIED IDEOGRAPH
+ 0x8ACE: 0x839E, //CJK UNIFIED IDEOGRAPH
+ 0x8ACF: 0x89B3, //CJK UNIFIED IDEOGRAPH
+ 0x8AD0: 0x8ACC, //CJK UNIFIED IDEOGRAPH
+ 0x8AD1: 0x8CAB, //CJK UNIFIED IDEOGRAPH
+ 0x8AD2: 0x9084, //CJK UNIFIED IDEOGRAPH
+ 0x8AD3: 0x9451, //CJK UNIFIED IDEOGRAPH
+ 0x8AD4: 0x9593, //CJK UNIFIED IDEOGRAPH
+ 0x8AD5: 0x9591, //CJK UNIFIED IDEOGRAPH
+ 0x8AD6: 0x95A2, //CJK UNIFIED IDEOGRAPH
+ 0x8AD7: 0x9665, //CJK UNIFIED IDEOGRAPH
+ 0x8AD8: 0x97D3, //CJK UNIFIED IDEOGRAPH
+ 0x8AD9: 0x9928, //CJK UNIFIED IDEOGRAPH
+ 0x8ADA: 0x8218, //CJK UNIFIED IDEOGRAPH
+ 0x8ADB: 0x4E38, //CJK UNIFIED IDEOGRAPH
+ 0x8ADC: 0x542B, //CJK UNIFIED IDEOGRAPH
+ 0x8ADD: 0x5CB8, //CJK UNIFIED IDEOGRAPH
+ 0x8ADE: 0x5DCC, //CJK UNIFIED IDEOGRAPH
+ 0x8ADF: 0x73A9, //CJK UNIFIED IDEOGRAPH
+ 0x8AE0: 0x764C, //CJK UNIFIED IDEOGRAPH
+ 0x8AE1: 0x773C, //CJK UNIFIED IDEOGRAPH
+ 0x8AE2: 0x5CA9, //CJK UNIFIED IDEOGRAPH
+ 0x8AE3: 0x7FEB, //CJK UNIFIED IDEOGRAPH
+ 0x8AE4: 0x8D0B, //CJK UNIFIED IDEOGRAPH
+ 0x8AE5: 0x96C1, //CJK UNIFIED IDEOGRAPH
+ 0x8AE6: 0x9811, //CJK UNIFIED IDEOGRAPH
+ 0x8AE7: 0x9854, //CJK UNIFIED IDEOGRAPH
+ 0x8AE8: 0x9858, //CJK UNIFIED IDEOGRAPH
+ 0x8AE9: 0x4F01, //CJK UNIFIED IDEOGRAPH
+ 0x8AEA: 0x4F0E, //CJK UNIFIED IDEOGRAPH
+ 0x8AEB: 0x5371, //CJK UNIFIED IDEOGRAPH
+ 0x8AEC: 0x559C, //CJK UNIFIED IDEOGRAPH
+ 0x8AED: 0x5668, //CJK UNIFIED IDEOGRAPH
+ 0x8AEE: 0x57FA, //CJK UNIFIED IDEOGRAPH
+ 0x8AEF: 0x5947, //CJK UNIFIED IDEOGRAPH
+ 0x8AF0: 0x5B09, //CJK UNIFIED IDEOGRAPH
+ 0x8AF1: 0x5BC4, //CJK UNIFIED IDEOGRAPH
+ 0x8AF2: 0x5C90, //CJK UNIFIED IDEOGRAPH
+ 0x8AF3: 0x5E0C, //CJK UNIFIED IDEOGRAPH
+ 0x8AF4: 0x5E7E, //CJK UNIFIED IDEOGRAPH
+ 0x8AF5: 0x5FCC, //CJK UNIFIED IDEOGRAPH
+ 0x8AF6: 0x63EE, //CJK UNIFIED IDEOGRAPH
+ 0x8AF7: 0x673A, //CJK UNIFIED IDEOGRAPH
+ 0x8AF8: 0x65D7, //CJK UNIFIED IDEOGRAPH
+ 0x8AF9: 0x65E2, //CJK UNIFIED IDEOGRAPH
+ 0x8AFA: 0x671F, //CJK UNIFIED IDEOGRAPH
+ 0x8AFB: 0x68CB, //CJK UNIFIED IDEOGRAPH
+ 0x8AFC: 0x68C4, //CJK UNIFIED IDEOGRAPH
+ 0x8B40: 0x6A5F, //CJK UNIFIED IDEOGRAPH
+ 0x8B41: 0x5E30, //CJK UNIFIED IDEOGRAPH
+ 0x8B42: 0x6BC5, //CJK UNIFIED IDEOGRAPH
+ 0x8B43: 0x6C17, //CJK UNIFIED IDEOGRAPH
+ 0x8B44: 0x6C7D, //CJK UNIFIED IDEOGRAPH
+ 0x8B45: 0x757F, //CJK UNIFIED IDEOGRAPH
+ 0x8B46: 0x7948, //CJK UNIFIED IDEOGRAPH
+ 0x8B47: 0x5B63, //CJK UNIFIED IDEOGRAPH
+ 0x8B48: 0x7A00, //CJK UNIFIED IDEOGRAPH
+ 0x8B49: 0x7D00, //CJK UNIFIED IDEOGRAPH
+ 0x8B4A: 0x5FBD, //CJK UNIFIED IDEOGRAPH
+ 0x8B4B: 0x898F, //CJK UNIFIED IDEOGRAPH
+ 0x8B4C: 0x8A18, //CJK UNIFIED IDEOGRAPH
+ 0x8B4D: 0x8CB4, //CJK UNIFIED IDEOGRAPH
+ 0x8B4E: 0x8D77, //CJK UNIFIED IDEOGRAPH
+ 0x8B4F: 0x8ECC, //CJK UNIFIED IDEOGRAPH
+ 0x8B50: 0x8F1D, //CJK UNIFIED IDEOGRAPH
+ 0x8B51: 0x98E2, //CJK UNIFIED IDEOGRAPH
+ 0x8B52: 0x9A0E, //CJK UNIFIED IDEOGRAPH
+ 0x8B53: 0x9B3C, //CJK UNIFIED IDEOGRAPH
+ 0x8B54: 0x4E80, //CJK UNIFIED IDEOGRAPH
+ 0x8B55: 0x507D, //CJK UNIFIED IDEOGRAPH
+ 0x8B56: 0x5100, //CJK UNIFIED IDEOGRAPH
+ 0x8B57: 0x5993, //CJK UNIFIED IDEOGRAPH
+ 0x8B58: 0x5B9C, //CJK UNIFIED IDEOGRAPH
+ 0x8B59: 0x622F, //CJK UNIFIED IDEOGRAPH
+ 0x8B5A: 0x6280, //CJK UNIFIED IDEOGRAPH
+ 0x8B5B: 0x64EC, //CJK UNIFIED IDEOGRAPH
+ 0x8B5C: 0x6B3A, //CJK UNIFIED IDEOGRAPH
+ 0x8B5D: 0x72A0, //CJK UNIFIED IDEOGRAPH
+ 0x8B5E: 0x7591, //CJK UNIFIED IDEOGRAPH
+ 0x8B5F: 0x7947, //CJK UNIFIED IDEOGRAPH
+ 0x8B60: 0x7FA9, //CJK UNIFIED IDEOGRAPH
+ 0x8B61: 0x87FB, //CJK UNIFIED IDEOGRAPH
+ 0x8B62: 0x8ABC, //CJK UNIFIED IDEOGRAPH
+ 0x8B63: 0x8B70, //CJK UNIFIED IDEOGRAPH
+ 0x8B64: 0x63AC, //CJK UNIFIED IDEOGRAPH
+ 0x8B65: 0x83CA, //CJK UNIFIED IDEOGRAPH
+ 0x8B66: 0x97A0, //CJK UNIFIED IDEOGRAPH
+ 0x8B67: 0x5409, //CJK UNIFIED IDEOGRAPH
+ 0x8B68: 0x5403, //CJK UNIFIED IDEOGRAPH
+ 0x8B69: 0x55AB, //CJK UNIFIED IDEOGRAPH
+ 0x8B6A: 0x6854, //CJK UNIFIED IDEOGRAPH
+ 0x8B6B: 0x6A58, //CJK UNIFIED IDEOGRAPH
+ 0x8B6C: 0x8A70, //CJK UNIFIED IDEOGRAPH
+ 0x8B6D: 0x7827, //CJK UNIFIED IDEOGRAPH
+ 0x8B6E: 0x6775, //CJK UNIFIED IDEOGRAPH
+ 0x8B6F: 0x9ECD, //CJK UNIFIED IDEOGRAPH
+ 0x8B70: 0x5374, //CJK UNIFIED IDEOGRAPH
+ 0x8B71: 0x5BA2, //CJK UNIFIED IDEOGRAPH
+ 0x8B72: 0x811A, //CJK UNIFIED IDEOGRAPH
+ 0x8B73: 0x8650, //CJK UNIFIED IDEOGRAPH
+ 0x8B74: 0x9006, //CJK UNIFIED IDEOGRAPH
+ 0x8B75: 0x4E18, //CJK UNIFIED IDEOGRAPH
+ 0x8B76: 0x4E45, //CJK UNIFIED IDEOGRAPH
+ 0x8B77: 0x4EC7, //CJK UNIFIED IDEOGRAPH
+ 0x8B78: 0x4F11, //CJK UNIFIED IDEOGRAPH
+ 0x8B79: 0x53CA, //CJK UNIFIED IDEOGRAPH
+ 0x8B7A: 0x5438, //CJK UNIFIED IDEOGRAPH
+ 0x8B7B: 0x5BAE, //CJK UNIFIED IDEOGRAPH
+ 0x8B7C: 0x5F13, //CJK UNIFIED IDEOGRAPH
+ 0x8B7D: 0x6025, //CJK UNIFIED IDEOGRAPH
+ 0x8B7E: 0x6551, //CJK UNIFIED IDEOGRAPH
+ 0x8B80: 0x673D, //CJK UNIFIED IDEOGRAPH
+ 0x8B81: 0x6C42, //CJK UNIFIED IDEOGRAPH
+ 0x8B82: 0x6C72, //CJK UNIFIED IDEOGRAPH
+ 0x8B83: 0x6CE3, //CJK UNIFIED IDEOGRAPH
+ 0x8B84: 0x7078, //CJK UNIFIED IDEOGRAPH
+ 0x8B85: 0x7403, //CJK UNIFIED IDEOGRAPH
+ 0x8B86: 0x7A76, //CJK UNIFIED IDEOGRAPH
+ 0x8B87: 0x7AAE, //CJK UNIFIED IDEOGRAPH
+ 0x8B88: 0x7B08, //CJK UNIFIED IDEOGRAPH
+ 0x8B89: 0x7D1A, //CJK UNIFIED IDEOGRAPH
+ 0x8B8A: 0x7CFE, //CJK UNIFIED IDEOGRAPH
+ 0x8B8B: 0x7D66, //CJK UNIFIED IDEOGRAPH
+ 0x8B8C: 0x65E7, //CJK UNIFIED IDEOGRAPH
+ 0x8B8D: 0x725B, //CJK UNIFIED IDEOGRAPH
+ 0x8B8E: 0x53BB, //CJK UNIFIED IDEOGRAPH
+ 0x8B8F: 0x5C45, //CJK UNIFIED IDEOGRAPH
+ 0x8B90: 0x5DE8, //CJK UNIFIED IDEOGRAPH
+ 0x8B91: 0x62D2, //CJK UNIFIED IDEOGRAPH
+ 0x8B92: 0x62E0, //CJK UNIFIED IDEOGRAPH
+ 0x8B93: 0x6319, //CJK UNIFIED IDEOGRAPH
+ 0x8B94: 0x6E20, //CJK UNIFIED IDEOGRAPH
+ 0x8B95: 0x865A, //CJK UNIFIED IDEOGRAPH
+ 0x8B96: 0x8A31, //CJK UNIFIED IDEOGRAPH
+ 0x8B97: 0x8DDD, //CJK UNIFIED IDEOGRAPH
+ 0x8B98: 0x92F8, //CJK UNIFIED IDEOGRAPH
+ 0x8B99: 0x6F01, //CJK UNIFIED IDEOGRAPH
+ 0x8B9A: 0x79A6, //CJK UNIFIED IDEOGRAPH
+ 0x8B9B: 0x9B5A, //CJK UNIFIED IDEOGRAPH
+ 0x8B9C: 0x4EA8, //CJK UNIFIED IDEOGRAPH
+ 0x8B9D: 0x4EAB, //CJK UNIFIED IDEOGRAPH
+ 0x8B9E: 0x4EAC, //CJK UNIFIED IDEOGRAPH
+ 0x8B9F: 0x4F9B, //CJK UNIFIED IDEOGRAPH
+ 0x8BA0: 0x4FA0, //CJK UNIFIED IDEOGRAPH
+ 0x8BA1: 0x50D1, //CJK UNIFIED IDEOGRAPH
+ 0x8BA2: 0x5147, //CJK UNIFIED IDEOGRAPH
+ 0x8BA3: 0x7AF6, //CJK UNIFIED IDEOGRAPH
+ 0x8BA4: 0x5171, //CJK UNIFIED IDEOGRAPH
+ 0x8BA5: 0x51F6, //CJK UNIFIED IDEOGRAPH
+ 0x8BA6: 0x5354, //CJK UNIFIED IDEOGRAPH
+ 0x8BA7: 0x5321, //CJK UNIFIED IDEOGRAPH
+ 0x8BA8: 0x537F, //CJK UNIFIED IDEOGRAPH
+ 0x8BA9: 0x53EB, //CJK UNIFIED IDEOGRAPH
+ 0x8BAA: 0x55AC, //CJK UNIFIED IDEOGRAPH
+ 0x8BAB: 0x5883, //CJK UNIFIED IDEOGRAPH
+ 0x8BAC: 0x5CE1, //CJK UNIFIED IDEOGRAPH
+ 0x8BAD: 0x5F37, //CJK UNIFIED IDEOGRAPH
+ 0x8BAE: 0x5F4A, //CJK UNIFIED IDEOGRAPH
+ 0x8BAF: 0x602F, //CJK UNIFIED IDEOGRAPH
+ 0x8BB0: 0x6050, //CJK UNIFIED IDEOGRAPH
+ 0x8BB1: 0x606D, //CJK UNIFIED IDEOGRAPH
+ 0x8BB2: 0x631F, //CJK UNIFIED IDEOGRAPH
+ 0x8BB3: 0x6559, //CJK UNIFIED IDEOGRAPH
+ 0x8BB4: 0x6A4B, //CJK UNIFIED IDEOGRAPH
+ 0x8BB5: 0x6CC1, //CJK UNIFIED IDEOGRAPH
+ 0x8BB6: 0x72C2, //CJK UNIFIED IDEOGRAPH
+ 0x8BB7: 0x72ED, //CJK UNIFIED IDEOGRAPH
+ 0x8BB8: 0x77EF, //CJK UNIFIED IDEOGRAPH
+ 0x8BB9: 0x80F8, //CJK UNIFIED IDEOGRAPH
+ 0x8BBA: 0x8105, //CJK UNIFIED IDEOGRAPH
+ 0x8BBB: 0x8208, //CJK UNIFIED IDEOGRAPH
+ 0x8BBC: 0x854E, //CJK UNIFIED IDEOGRAPH
+ 0x8BBD: 0x90F7, //CJK UNIFIED IDEOGRAPH
+ 0x8BBE: 0x93E1, //CJK UNIFIED IDEOGRAPH
+ 0x8BBF: 0x97FF, //CJK UNIFIED IDEOGRAPH
+ 0x8BC0: 0x9957, //CJK UNIFIED IDEOGRAPH
+ 0x8BC1: 0x9A5A, //CJK UNIFIED IDEOGRAPH
+ 0x8BC2: 0x4EF0, //CJK UNIFIED IDEOGRAPH
+ 0x8BC3: 0x51DD, //CJK UNIFIED IDEOGRAPH
+ 0x8BC4: 0x5C2D, //CJK UNIFIED IDEOGRAPH
+ 0x8BC5: 0x6681, //CJK UNIFIED IDEOGRAPH
+ 0x8BC6: 0x696D, //CJK UNIFIED IDEOGRAPH
+ 0x8BC7: 0x5C40, //CJK UNIFIED IDEOGRAPH
+ 0x8BC8: 0x66F2, //CJK UNIFIED IDEOGRAPH
+ 0x8BC9: 0x6975, //CJK UNIFIED IDEOGRAPH
+ 0x8BCA: 0x7389, //CJK UNIFIED IDEOGRAPH
+ 0x8BCB: 0x6850, //CJK UNIFIED IDEOGRAPH
+ 0x8BCC: 0x7C81, //CJK UNIFIED IDEOGRAPH
+ 0x8BCD: 0x50C5, //CJK UNIFIED IDEOGRAPH
+ 0x8BCE: 0x52E4, //CJK UNIFIED IDEOGRAPH
+ 0x8BCF: 0x5747, //CJK UNIFIED IDEOGRAPH
+ 0x8BD0: 0x5DFE, //CJK UNIFIED IDEOGRAPH
+ 0x8BD1: 0x9326, //CJK UNIFIED IDEOGRAPH
+ 0x8BD2: 0x65A4, //CJK UNIFIED IDEOGRAPH
+ 0x8BD3: 0x6B23, //CJK UNIFIED IDEOGRAPH
+ 0x8BD4: 0x6B3D, //CJK UNIFIED IDEOGRAPH
+ 0x8BD5: 0x7434, //CJK UNIFIED IDEOGRAPH
+ 0x8BD6: 0x7981, //CJK UNIFIED IDEOGRAPH
+ 0x8BD7: 0x79BD, //CJK UNIFIED IDEOGRAPH
+ 0x8BD8: 0x7B4B, //CJK UNIFIED IDEOGRAPH
+ 0x8BD9: 0x7DCA, //CJK UNIFIED IDEOGRAPH
+ 0x8BDA: 0x82B9, //CJK UNIFIED IDEOGRAPH
+ 0x8BDB: 0x83CC, //CJK UNIFIED IDEOGRAPH
+ 0x8BDC: 0x887F, //CJK UNIFIED IDEOGRAPH
+ 0x8BDD: 0x895F, //CJK UNIFIED IDEOGRAPH
+ 0x8BDE: 0x8B39, //CJK UNIFIED IDEOGRAPH
+ 0x8BDF: 0x8FD1, //CJK UNIFIED IDEOGRAPH
+ 0x8BE0: 0x91D1, //CJK UNIFIED IDEOGRAPH
+ 0x8BE1: 0x541F, //CJK UNIFIED IDEOGRAPH
+ 0x8BE2: 0x9280, //CJK UNIFIED IDEOGRAPH
+ 0x8BE3: 0x4E5D, //CJK UNIFIED IDEOGRAPH
+ 0x8BE4: 0x5036, //CJK UNIFIED IDEOGRAPH
+ 0x8BE5: 0x53E5, //CJK UNIFIED IDEOGRAPH
+ 0x8BE6: 0x533A, //CJK UNIFIED IDEOGRAPH
+ 0x8BE7: 0x72D7, //CJK UNIFIED IDEOGRAPH
+ 0x8BE8: 0x7396, //CJK UNIFIED IDEOGRAPH
+ 0x8BE9: 0x77E9, //CJK UNIFIED IDEOGRAPH
+ 0x8BEA: 0x82E6, //CJK UNIFIED IDEOGRAPH
+ 0x8BEB: 0x8EAF, //CJK UNIFIED IDEOGRAPH
+ 0x8BEC: 0x99C6, //CJK UNIFIED IDEOGRAPH
+ 0x8BED: 0x99C8, //CJK UNIFIED IDEOGRAPH
+ 0x8BEE: 0x99D2, //CJK UNIFIED IDEOGRAPH
+ 0x8BEF: 0x5177, //CJK UNIFIED IDEOGRAPH
+ 0x8BF0: 0x611A, //CJK UNIFIED IDEOGRAPH
+ 0x8BF1: 0x865E, //CJK UNIFIED IDEOGRAPH
+ 0x8BF2: 0x55B0, //CJK UNIFIED IDEOGRAPH
+ 0x8BF3: 0x7A7A, //CJK UNIFIED IDEOGRAPH
+ 0x8BF4: 0x5076, //CJK UNIFIED IDEOGRAPH
+ 0x8BF5: 0x5BD3, //CJK UNIFIED IDEOGRAPH
+ 0x8BF6: 0x9047, //CJK UNIFIED IDEOGRAPH
+ 0x8BF7: 0x9685, //CJK UNIFIED IDEOGRAPH
+ 0x8BF8: 0x4E32, //CJK UNIFIED IDEOGRAPH
+ 0x8BF9: 0x6ADB, //CJK UNIFIED IDEOGRAPH
+ 0x8BFA: 0x91E7, //CJK UNIFIED IDEOGRAPH
+ 0x8BFB: 0x5C51, //CJK UNIFIED IDEOGRAPH
+ 0x8BFC: 0x5C48, //CJK UNIFIED IDEOGRAPH
+ 0x8C40: 0x6398, //CJK UNIFIED IDEOGRAPH
+ 0x8C41: 0x7A9F, //CJK UNIFIED IDEOGRAPH
+ 0x8C42: 0x6C93, //CJK UNIFIED IDEOGRAPH
+ 0x8C43: 0x9774, //CJK UNIFIED IDEOGRAPH
+ 0x8C44: 0x8F61, //CJK UNIFIED IDEOGRAPH
+ 0x8C45: 0x7AAA, //CJK UNIFIED IDEOGRAPH
+ 0x8C46: 0x718A, //CJK UNIFIED IDEOGRAPH
+ 0x8C47: 0x9688, //CJK UNIFIED IDEOGRAPH
+ 0x8C48: 0x7C82, //CJK UNIFIED IDEOGRAPH
+ 0x8C49: 0x6817, //CJK UNIFIED IDEOGRAPH
+ 0x8C4A: 0x7E70, //CJK UNIFIED IDEOGRAPH
+ 0x8C4B: 0x6851, //CJK UNIFIED IDEOGRAPH
+ 0x8C4C: 0x936C, //CJK UNIFIED IDEOGRAPH
+ 0x8C4D: 0x52F2, //CJK UNIFIED IDEOGRAPH
+ 0x8C4E: 0x541B, //CJK UNIFIED IDEOGRAPH
+ 0x8C4F: 0x85AB, //CJK UNIFIED IDEOGRAPH
+ 0x8C50: 0x8A13, //CJK UNIFIED IDEOGRAPH
+ 0x8C51: 0x7FA4, //CJK UNIFIED IDEOGRAPH
+ 0x8C52: 0x8ECD, //CJK UNIFIED IDEOGRAPH
+ 0x8C53: 0x90E1, //CJK UNIFIED IDEOGRAPH
+ 0x8C54: 0x5366, //CJK UNIFIED IDEOGRAPH
+ 0x8C55: 0x8888, //CJK UNIFIED IDEOGRAPH
+ 0x8C56: 0x7941, //CJK UNIFIED IDEOGRAPH
+ 0x8C57: 0x4FC2, //CJK UNIFIED IDEOGRAPH
+ 0x8C58: 0x50BE, //CJK UNIFIED IDEOGRAPH
+ 0x8C59: 0x5211, //CJK UNIFIED IDEOGRAPH
+ 0x8C5A: 0x5144, //CJK UNIFIED IDEOGRAPH
+ 0x8C5B: 0x5553, //CJK UNIFIED IDEOGRAPH
+ 0x8C5C: 0x572D, //CJK UNIFIED IDEOGRAPH
+ 0x8C5D: 0x73EA, //CJK UNIFIED IDEOGRAPH
+ 0x8C5E: 0x578B, //CJK UNIFIED IDEOGRAPH
+ 0x8C5F: 0x5951, //CJK UNIFIED IDEOGRAPH
+ 0x8C60: 0x5F62, //CJK UNIFIED IDEOGRAPH
+ 0x8C61: 0x5F84, //CJK UNIFIED IDEOGRAPH
+ 0x8C62: 0x6075, //CJK UNIFIED IDEOGRAPH
+ 0x8C63: 0x6176, //CJK UNIFIED IDEOGRAPH
+ 0x8C64: 0x6167, //CJK UNIFIED IDEOGRAPH
+ 0x8C65: 0x61A9, //CJK UNIFIED IDEOGRAPH
+ 0x8C66: 0x63B2, //CJK UNIFIED IDEOGRAPH
+ 0x8C67: 0x643A, //CJK UNIFIED IDEOGRAPH
+ 0x8C68: 0x656C, //CJK UNIFIED IDEOGRAPH
+ 0x8C69: 0x666F, //CJK UNIFIED IDEOGRAPH
+ 0x8C6A: 0x6842, //CJK UNIFIED IDEOGRAPH
+ 0x8C6B: 0x6E13, //CJK UNIFIED IDEOGRAPH
+ 0x8C6C: 0x7566, //CJK UNIFIED IDEOGRAPH
+ 0x8C6D: 0x7A3D, //CJK UNIFIED IDEOGRAPH
+ 0x8C6E: 0x7CFB, //CJK UNIFIED IDEOGRAPH
+ 0x8C6F: 0x7D4C, //CJK UNIFIED IDEOGRAPH
+ 0x8C70: 0x7D99, //CJK UNIFIED IDEOGRAPH
+ 0x8C71: 0x7E4B, //CJK UNIFIED IDEOGRAPH
+ 0x8C72: 0x7F6B, //CJK UNIFIED IDEOGRAPH
+ 0x8C73: 0x830E, //CJK UNIFIED IDEOGRAPH
+ 0x8C74: 0x834A, //CJK UNIFIED IDEOGRAPH
+ 0x8C75: 0x86CD, //CJK UNIFIED IDEOGRAPH
+ 0x8C76: 0x8A08, //CJK UNIFIED IDEOGRAPH
+ 0x8C77: 0x8A63, //CJK UNIFIED IDEOGRAPH
+ 0x8C78: 0x8B66, //CJK UNIFIED IDEOGRAPH
+ 0x8C79: 0x8EFD, //CJK UNIFIED IDEOGRAPH
+ 0x8C7A: 0x981A, //CJK UNIFIED IDEOGRAPH
+ 0x8C7B: 0x9D8F, //CJK UNIFIED IDEOGRAPH
+ 0x8C7C: 0x82B8, //CJK UNIFIED IDEOGRAPH
+ 0x8C7D: 0x8FCE, //CJK UNIFIED IDEOGRAPH
+ 0x8C7E: 0x9BE8, //CJK UNIFIED IDEOGRAPH
+ 0x8C80: 0x5287, //CJK UNIFIED IDEOGRAPH
+ 0x8C81: 0x621F, //CJK UNIFIED IDEOGRAPH
+ 0x8C82: 0x6483, //CJK UNIFIED IDEOGRAPH
+ 0x8C83: 0x6FC0, //CJK UNIFIED IDEOGRAPH
+ 0x8C84: 0x9699, //CJK UNIFIED IDEOGRAPH
+ 0x8C85: 0x6841, //CJK UNIFIED IDEOGRAPH
+ 0x8C86: 0x5091, //CJK UNIFIED IDEOGRAPH
+ 0x8C87: 0x6B20, //CJK UNIFIED IDEOGRAPH
+ 0x8C88: 0x6C7A, //CJK UNIFIED IDEOGRAPH
+ 0x8C89: 0x6F54, //CJK UNIFIED IDEOGRAPH
+ 0x8C8A: 0x7A74, //CJK UNIFIED IDEOGRAPH
+ 0x8C8B: 0x7D50, //CJK UNIFIED IDEOGRAPH
+ 0x8C8C: 0x8840, //CJK UNIFIED IDEOGRAPH
+ 0x8C8D: 0x8A23, //CJK UNIFIED IDEOGRAPH
+ 0x8C8E: 0x6708, //CJK UNIFIED IDEOGRAPH
+ 0x8C8F: 0x4EF6, //CJK UNIFIED IDEOGRAPH
+ 0x8C90: 0x5039, //CJK UNIFIED IDEOGRAPH
+ 0x8C91: 0x5026, //CJK UNIFIED IDEOGRAPH
+ 0x8C92: 0x5065, //CJK UNIFIED IDEOGRAPH
+ 0x8C93: 0x517C, //CJK UNIFIED IDEOGRAPH
+ 0x8C94: 0x5238, //CJK UNIFIED IDEOGRAPH
+ 0x8C95: 0x5263, //CJK UNIFIED IDEOGRAPH
+ 0x8C96: 0x55A7, //CJK UNIFIED IDEOGRAPH
+ 0x8C97: 0x570F, //CJK UNIFIED IDEOGRAPH
+ 0x8C98: 0x5805, //CJK UNIFIED IDEOGRAPH
+ 0x8C99: 0x5ACC, //CJK UNIFIED IDEOGRAPH
+ 0x8C9A: 0x5EFA, //CJK UNIFIED IDEOGRAPH
+ 0x8C9B: 0x61B2, //CJK UNIFIED IDEOGRAPH
+ 0x8C9C: 0x61F8, //CJK UNIFIED IDEOGRAPH
+ 0x8C9D: 0x62F3, //CJK UNIFIED IDEOGRAPH
+ 0x8C9E: 0x6372, //CJK UNIFIED IDEOGRAPH
+ 0x8C9F: 0x691C, //CJK UNIFIED IDEOGRAPH
+ 0x8CA0: 0x6A29, //CJK UNIFIED IDEOGRAPH
+ 0x8CA1: 0x727D, //CJK UNIFIED IDEOGRAPH
+ 0x8CA2: 0x72AC, //CJK UNIFIED IDEOGRAPH
+ 0x8CA3: 0x732E, //CJK UNIFIED IDEOGRAPH
+ 0x8CA4: 0x7814, //CJK UNIFIED IDEOGRAPH
+ 0x8CA5: 0x786F, //CJK UNIFIED IDEOGRAPH
+ 0x8CA6: 0x7D79, //CJK UNIFIED IDEOGRAPH
+ 0x8CA7: 0x770C, //CJK UNIFIED IDEOGRAPH
+ 0x8CA8: 0x80A9, //CJK UNIFIED IDEOGRAPH
+ 0x8CA9: 0x898B, //CJK UNIFIED IDEOGRAPH
+ 0x8CAA: 0x8B19, //CJK UNIFIED IDEOGRAPH
+ 0x8CAB: 0x8CE2, //CJK UNIFIED IDEOGRAPH
+ 0x8CAC: 0x8ED2, //CJK UNIFIED IDEOGRAPH
+ 0x8CAD: 0x9063, //CJK UNIFIED IDEOGRAPH
+ 0x8CAE: 0x9375, //CJK UNIFIED IDEOGRAPH
+ 0x8CAF: 0x967A, //CJK UNIFIED IDEOGRAPH
+ 0x8CB0: 0x9855, //CJK UNIFIED IDEOGRAPH
+ 0x8CB1: 0x9A13, //CJK UNIFIED IDEOGRAPH
+ 0x8CB2: 0x9E78, //CJK UNIFIED IDEOGRAPH
+ 0x8CB3: 0x5143, //CJK UNIFIED IDEOGRAPH
+ 0x8CB4: 0x539F, //CJK UNIFIED IDEOGRAPH
+ 0x8CB5: 0x53B3, //CJK UNIFIED IDEOGRAPH
+ 0x8CB6: 0x5E7B, //CJK UNIFIED IDEOGRAPH
+ 0x8CB7: 0x5F26, //CJK UNIFIED IDEOGRAPH
+ 0x8CB8: 0x6E1B, //CJK UNIFIED IDEOGRAPH
+ 0x8CB9: 0x6E90, //CJK UNIFIED IDEOGRAPH
+ 0x8CBA: 0x7384, //CJK UNIFIED IDEOGRAPH
+ 0x8CBB: 0x73FE, //CJK UNIFIED IDEOGRAPH
+ 0x8CBC: 0x7D43, //CJK UNIFIED IDEOGRAPH
+ 0x8CBD: 0x8237, //CJK UNIFIED IDEOGRAPH
+ 0x8CBE: 0x8A00, //CJK UNIFIED IDEOGRAPH
+ 0x8CBF: 0x8AFA, //CJK UNIFIED IDEOGRAPH
+ 0x8CC0: 0x9650, //CJK UNIFIED IDEOGRAPH
+ 0x8CC1: 0x4E4E, //CJK UNIFIED IDEOGRAPH
+ 0x8CC2: 0x500B, //CJK UNIFIED IDEOGRAPH
+ 0x8CC3: 0x53E4, //CJK UNIFIED IDEOGRAPH
+ 0x8CC4: 0x547C, //CJK UNIFIED IDEOGRAPH
+ 0x8CC5: 0x56FA, //CJK UNIFIED IDEOGRAPH
+ 0x8CC6: 0x59D1, //CJK UNIFIED IDEOGRAPH
+ 0x8CC7: 0x5B64, //CJK UNIFIED IDEOGRAPH
+ 0x8CC8: 0x5DF1, //CJK UNIFIED IDEOGRAPH
+ 0x8CC9: 0x5EAB, //CJK UNIFIED IDEOGRAPH
+ 0x8CCA: 0x5F27, //CJK UNIFIED IDEOGRAPH
+ 0x8CCB: 0x6238, //CJK UNIFIED IDEOGRAPH
+ 0x8CCC: 0x6545, //CJK UNIFIED IDEOGRAPH
+ 0x8CCD: 0x67AF, //CJK UNIFIED IDEOGRAPH
+ 0x8CCE: 0x6E56, //CJK UNIFIED IDEOGRAPH
+ 0x8CCF: 0x72D0, //CJK UNIFIED IDEOGRAPH
+ 0x8CD0: 0x7CCA, //CJK UNIFIED IDEOGRAPH
+ 0x8CD1: 0x88B4, //CJK UNIFIED IDEOGRAPH
+ 0x8CD2: 0x80A1, //CJK UNIFIED IDEOGRAPH
+ 0x8CD3: 0x80E1, //CJK UNIFIED IDEOGRAPH
+ 0x8CD4: 0x83F0, //CJK UNIFIED IDEOGRAPH
+ 0x8CD5: 0x864E, //CJK UNIFIED IDEOGRAPH
+ 0x8CD6: 0x8A87, //CJK UNIFIED IDEOGRAPH
+ 0x8CD7: 0x8DE8, //CJK UNIFIED IDEOGRAPH
+ 0x8CD8: 0x9237, //CJK UNIFIED IDEOGRAPH
+ 0x8CD9: 0x96C7, //CJK UNIFIED IDEOGRAPH
+ 0x8CDA: 0x9867, //CJK UNIFIED IDEOGRAPH
+ 0x8CDB: 0x9F13, //CJK UNIFIED IDEOGRAPH
+ 0x8CDC: 0x4E94, //CJK UNIFIED IDEOGRAPH
+ 0x8CDD: 0x4E92, //CJK UNIFIED IDEOGRAPH
+ 0x8CDE: 0x4F0D, //CJK UNIFIED IDEOGRAPH
+ 0x8CDF: 0x5348, //CJK UNIFIED IDEOGRAPH
+ 0x8CE0: 0x5449, //CJK UNIFIED IDEOGRAPH
+ 0x8CE1: 0x543E, //CJK UNIFIED IDEOGRAPH
+ 0x8CE2: 0x5A2F, //CJK UNIFIED IDEOGRAPH
+ 0x8CE3: 0x5F8C, //CJK UNIFIED IDEOGRAPH
+ 0x8CE4: 0x5FA1, //CJK UNIFIED IDEOGRAPH
+ 0x8CE5: 0x609F, //CJK UNIFIED IDEOGRAPH
+ 0x8CE6: 0x68A7, //CJK UNIFIED IDEOGRAPH
+ 0x8CE7: 0x6A8E, //CJK UNIFIED IDEOGRAPH
+ 0x8CE8: 0x745A, //CJK UNIFIED IDEOGRAPH
+ 0x8CE9: 0x7881, //CJK UNIFIED IDEOGRAPH
+ 0x8CEA: 0x8A9E, //CJK UNIFIED IDEOGRAPH
+ 0x8CEB: 0x8AA4, //CJK UNIFIED IDEOGRAPH
+ 0x8CEC: 0x8B77, //CJK UNIFIED IDEOGRAPH
+ 0x8CED: 0x9190, //CJK UNIFIED IDEOGRAPH
+ 0x8CEE: 0x4E5E, //CJK UNIFIED IDEOGRAPH
+ 0x8CEF: 0x9BC9, //CJK UNIFIED IDEOGRAPH
+ 0x8CF0: 0x4EA4, //CJK UNIFIED IDEOGRAPH
+ 0x8CF1: 0x4F7C, //CJK UNIFIED IDEOGRAPH
+ 0x8CF2: 0x4FAF, //CJK UNIFIED IDEOGRAPH
+ 0x8CF3: 0x5019, //CJK UNIFIED IDEOGRAPH
+ 0x8CF4: 0x5016, //CJK UNIFIED IDEOGRAPH
+ 0x8CF5: 0x5149, //CJK UNIFIED IDEOGRAPH
+ 0x8CF6: 0x516C, //CJK UNIFIED IDEOGRAPH
+ 0x8CF7: 0x529F, //CJK UNIFIED IDEOGRAPH
+ 0x8CF8: 0x52B9, //CJK UNIFIED IDEOGRAPH
+ 0x8CF9: 0x52FE, //CJK UNIFIED IDEOGRAPH
+ 0x8CFA: 0x539A, //CJK UNIFIED IDEOGRAPH
+ 0x8CFB: 0x53E3, //CJK UNIFIED IDEOGRAPH
+ 0x8CFC: 0x5411, //CJK UNIFIED IDEOGRAPH
+ 0x8D40: 0x540E, //CJK UNIFIED IDEOGRAPH
+ 0x8D41: 0x5589, //CJK UNIFIED IDEOGRAPH
+ 0x8D42: 0x5751, //CJK UNIFIED IDEOGRAPH
+ 0x8D43: 0x57A2, //CJK UNIFIED IDEOGRAPH
+ 0x8D44: 0x597D, //CJK UNIFIED IDEOGRAPH
+ 0x8D45: 0x5B54, //CJK UNIFIED IDEOGRAPH
+ 0x8D46: 0x5B5D, //CJK UNIFIED IDEOGRAPH
+ 0x8D47: 0x5B8F, //CJK UNIFIED IDEOGRAPH
+ 0x8D48: 0x5DE5, //CJK UNIFIED IDEOGRAPH
+ 0x8D49: 0x5DE7, //CJK UNIFIED IDEOGRAPH
+ 0x8D4A: 0x5DF7, //CJK UNIFIED IDEOGRAPH
+ 0x8D4B: 0x5E78, //CJK UNIFIED IDEOGRAPH
+ 0x8D4C: 0x5E83, //CJK UNIFIED IDEOGRAPH
+ 0x8D4D: 0x5E9A, //CJK UNIFIED IDEOGRAPH
+ 0x8D4E: 0x5EB7, //CJK UNIFIED IDEOGRAPH
+ 0x8D4F: 0x5F18, //CJK UNIFIED IDEOGRAPH
+ 0x8D50: 0x6052, //CJK UNIFIED IDEOGRAPH
+ 0x8D51: 0x614C, //CJK UNIFIED IDEOGRAPH
+ 0x8D52: 0x6297, //CJK UNIFIED IDEOGRAPH
+ 0x8D53: 0x62D8, //CJK UNIFIED IDEOGRAPH
+ 0x8D54: 0x63A7, //CJK UNIFIED IDEOGRAPH
+ 0x8D55: 0x653B, //CJK UNIFIED IDEOGRAPH
+ 0x8D56: 0x6602, //CJK UNIFIED IDEOGRAPH
+ 0x8D57: 0x6643, //CJK UNIFIED IDEOGRAPH
+ 0x8D58: 0x66F4, //CJK UNIFIED IDEOGRAPH
+ 0x8D59: 0x676D, //CJK UNIFIED IDEOGRAPH
+ 0x8D5A: 0x6821, //CJK UNIFIED IDEOGRAPH
+ 0x8D5B: 0x6897, //CJK UNIFIED IDEOGRAPH
+ 0x8D5C: 0x69CB, //CJK UNIFIED IDEOGRAPH
+ 0x8D5D: 0x6C5F, //CJK UNIFIED IDEOGRAPH
+ 0x8D5E: 0x6D2A, //CJK UNIFIED IDEOGRAPH
+ 0x8D5F: 0x6D69, //CJK UNIFIED IDEOGRAPH
+ 0x8D60: 0x6E2F, //CJK UNIFIED IDEOGRAPH
+ 0x8D61: 0x6E9D, //CJK UNIFIED IDEOGRAPH
+ 0x8D62: 0x7532, //CJK UNIFIED IDEOGRAPH
+ 0x8D63: 0x7687, //CJK UNIFIED IDEOGRAPH
+ 0x8D64: 0x786C, //CJK UNIFIED IDEOGRAPH
+ 0x8D65: 0x7A3F, //CJK UNIFIED IDEOGRAPH
+ 0x8D66: 0x7CE0, //CJK UNIFIED IDEOGRAPH
+ 0x8D67: 0x7D05, //CJK UNIFIED IDEOGRAPH
+ 0x8D68: 0x7D18, //CJK UNIFIED IDEOGRAPH
+ 0x8D69: 0x7D5E, //CJK UNIFIED IDEOGRAPH
+ 0x8D6A: 0x7DB1, //CJK UNIFIED IDEOGRAPH
+ 0x8D6B: 0x8015, //CJK UNIFIED IDEOGRAPH
+ 0x8D6C: 0x8003, //CJK UNIFIED IDEOGRAPH
+ 0x8D6D: 0x80AF, //CJK UNIFIED IDEOGRAPH
+ 0x8D6E: 0x80B1, //CJK UNIFIED IDEOGRAPH
+ 0x8D6F: 0x8154, //CJK UNIFIED IDEOGRAPH
+ 0x8D70: 0x818F, //CJK UNIFIED IDEOGRAPH
+ 0x8D71: 0x822A, //CJK UNIFIED IDEOGRAPH
+ 0x8D72: 0x8352, //CJK UNIFIED IDEOGRAPH
+ 0x8D73: 0x884C, //CJK UNIFIED IDEOGRAPH
+ 0x8D74: 0x8861, //CJK UNIFIED IDEOGRAPH
+ 0x8D75: 0x8B1B, //CJK UNIFIED IDEOGRAPH
+ 0x8D76: 0x8CA2, //CJK UNIFIED IDEOGRAPH
+ 0x8D77: 0x8CFC, //CJK UNIFIED IDEOGRAPH
+ 0x8D78: 0x90CA, //CJK UNIFIED IDEOGRAPH
+ 0x8D79: 0x9175, //CJK UNIFIED IDEOGRAPH
+ 0x8D7A: 0x9271, //CJK UNIFIED IDEOGRAPH
+ 0x8D7B: 0x783F, //CJK UNIFIED IDEOGRAPH
+ 0x8D7C: 0x92FC, //CJK UNIFIED IDEOGRAPH
+ 0x8D7D: 0x95A4, //CJK UNIFIED IDEOGRAPH
+ 0x8D7E: 0x964D, //CJK UNIFIED IDEOGRAPH
+ 0x8D80: 0x9805, //CJK UNIFIED IDEOGRAPH
+ 0x8D81: 0x9999, //CJK UNIFIED IDEOGRAPH
+ 0x8D82: 0x9AD8, //CJK UNIFIED IDEOGRAPH
+ 0x8D83: 0x9D3B, //CJK UNIFIED IDEOGRAPH
+ 0x8D84: 0x525B, //CJK UNIFIED IDEOGRAPH
+ 0x8D85: 0x52AB, //CJK UNIFIED IDEOGRAPH
+ 0x8D86: 0x53F7, //CJK UNIFIED IDEOGRAPH
+ 0x8D87: 0x5408, //CJK UNIFIED IDEOGRAPH
+ 0x8D88: 0x58D5, //CJK UNIFIED IDEOGRAPH
+ 0x8D89: 0x62F7, //CJK UNIFIED IDEOGRAPH
+ 0x8D8A: 0x6FE0, //CJK UNIFIED IDEOGRAPH
+ 0x8D8B: 0x8C6A, //CJK UNIFIED IDEOGRAPH
+ 0x8D8C: 0x8F5F, //CJK UNIFIED IDEOGRAPH
+ 0x8D8D: 0x9EB9, //CJK UNIFIED IDEOGRAPH
+ 0x8D8E: 0x514B, //CJK UNIFIED IDEOGRAPH
+ 0x8D8F: 0x523B, //CJK UNIFIED IDEOGRAPH
+ 0x8D90: 0x544A, //CJK UNIFIED IDEOGRAPH
+ 0x8D91: 0x56FD, //CJK UNIFIED IDEOGRAPH
+ 0x8D92: 0x7A40, //CJK UNIFIED IDEOGRAPH
+ 0x8D93: 0x9177, //CJK UNIFIED IDEOGRAPH
+ 0x8D94: 0x9D60, //CJK UNIFIED IDEOGRAPH
+ 0x8D95: 0x9ED2, //CJK UNIFIED IDEOGRAPH
+ 0x8D96: 0x7344, //CJK UNIFIED IDEOGRAPH
+ 0x8D97: 0x6F09, //CJK UNIFIED IDEOGRAPH
+ 0x8D98: 0x8170, //CJK UNIFIED IDEOGRAPH
+ 0x8D99: 0x7511, //CJK UNIFIED IDEOGRAPH
+ 0x8D9A: 0x5FFD, //CJK UNIFIED IDEOGRAPH
+ 0x8D9B: 0x60DA, //CJK UNIFIED IDEOGRAPH
+ 0x8D9C: 0x9AA8, //CJK UNIFIED IDEOGRAPH
+ 0x8D9D: 0x72DB, //CJK UNIFIED IDEOGRAPH
+ 0x8D9E: 0x8FBC, //CJK UNIFIED IDEOGRAPH
+ 0x8D9F: 0x6B64, //CJK UNIFIED IDEOGRAPH
+ 0x8DA0: 0x9803, //CJK UNIFIED IDEOGRAPH
+ 0x8DA1: 0x4ECA, //CJK UNIFIED IDEOGRAPH
+ 0x8DA2: 0x56F0, //CJK UNIFIED IDEOGRAPH
+ 0x8DA3: 0x5764, //CJK UNIFIED IDEOGRAPH
+ 0x8DA4: 0x58BE, //CJK UNIFIED IDEOGRAPH
+ 0x8DA5: 0x5A5A, //CJK UNIFIED IDEOGRAPH
+ 0x8DA6: 0x6068, //CJK UNIFIED IDEOGRAPH
+ 0x8DA7: 0x61C7, //CJK UNIFIED IDEOGRAPH
+ 0x8DA8: 0x660F, //CJK UNIFIED IDEOGRAPH
+ 0x8DA9: 0x6606, //CJK UNIFIED IDEOGRAPH
+ 0x8DAA: 0x6839, //CJK UNIFIED IDEOGRAPH
+ 0x8DAB: 0x68B1, //CJK UNIFIED IDEOGRAPH
+ 0x8DAC: 0x6DF7, //CJK UNIFIED IDEOGRAPH
+ 0x8DAD: 0x75D5, //CJK UNIFIED IDEOGRAPH
+ 0x8DAE: 0x7D3A, //CJK UNIFIED IDEOGRAPH
+ 0x8DAF: 0x826E, //CJK UNIFIED IDEOGRAPH
+ 0x8DB0: 0x9B42, //CJK UNIFIED IDEOGRAPH
+ 0x8DB1: 0x4E9B, //CJK UNIFIED IDEOGRAPH
+ 0x8DB2: 0x4F50, //CJK UNIFIED IDEOGRAPH
+ 0x8DB3: 0x53C9, //CJK UNIFIED IDEOGRAPH
+ 0x8DB4: 0x5506, //CJK UNIFIED IDEOGRAPH
+ 0x8DB5: 0x5D6F, //CJK UNIFIED IDEOGRAPH
+ 0x8DB6: 0x5DE6, //CJK UNIFIED IDEOGRAPH
+ 0x8DB7: 0x5DEE, //CJK UNIFIED IDEOGRAPH
+ 0x8DB8: 0x67FB, //CJK UNIFIED IDEOGRAPH
+ 0x8DB9: 0x6C99, //CJK UNIFIED IDEOGRAPH
+ 0x8DBA: 0x7473, //CJK UNIFIED IDEOGRAPH
+ 0x8DBB: 0x7802, //CJK UNIFIED IDEOGRAPH
+ 0x8DBC: 0x8A50, //CJK UNIFIED IDEOGRAPH
+ 0x8DBD: 0x9396, //CJK UNIFIED IDEOGRAPH
+ 0x8DBE: 0x88DF, //CJK UNIFIED IDEOGRAPH
+ 0x8DBF: 0x5750, //CJK UNIFIED IDEOGRAPH
+ 0x8DC0: 0x5EA7, //CJK UNIFIED IDEOGRAPH
+ 0x8DC1: 0x632B, //CJK UNIFIED IDEOGRAPH
+ 0x8DC2: 0x50B5, //CJK UNIFIED IDEOGRAPH
+ 0x8DC3: 0x50AC, //CJK UNIFIED IDEOGRAPH
+ 0x8DC4: 0x518D, //CJK UNIFIED IDEOGRAPH
+ 0x8DC5: 0x6700, //CJK UNIFIED IDEOGRAPH
+ 0x8DC6: 0x54C9, //CJK UNIFIED IDEOGRAPH
+ 0x8DC7: 0x585E, //CJK UNIFIED IDEOGRAPH
+ 0x8DC8: 0x59BB, //CJK UNIFIED IDEOGRAPH
+ 0x8DC9: 0x5BB0, //CJK UNIFIED IDEOGRAPH
+ 0x8DCA: 0x5F69, //CJK UNIFIED IDEOGRAPH
+ 0x8DCB: 0x624D, //CJK UNIFIED IDEOGRAPH
+ 0x8DCC: 0x63A1, //CJK UNIFIED IDEOGRAPH
+ 0x8DCD: 0x683D, //CJK UNIFIED IDEOGRAPH
+ 0x8DCE: 0x6B73, //CJK UNIFIED IDEOGRAPH
+ 0x8DCF: 0x6E08, //CJK UNIFIED IDEOGRAPH
+ 0x8DD0: 0x707D, //CJK UNIFIED IDEOGRAPH
+ 0x8DD1: 0x91C7, //CJK UNIFIED IDEOGRAPH
+ 0x8DD2: 0x7280, //CJK UNIFIED IDEOGRAPH
+ 0x8DD3: 0x7815, //CJK UNIFIED IDEOGRAPH
+ 0x8DD4: 0x7826, //CJK UNIFIED IDEOGRAPH
+ 0x8DD5: 0x796D, //CJK UNIFIED IDEOGRAPH
+ 0x8DD6: 0x658E, //CJK UNIFIED IDEOGRAPH
+ 0x8DD7: 0x7D30, //CJK UNIFIED IDEOGRAPH
+ 0x8DD8: 0x83DC, //CJK UNIFIED IDEOGRAPH
+ 0x8DD9: 0x88C1, //CJK UNIFIED IDEOGRAPH
+ 0x8DDA: 0x8F09, //CJK UNIFIED IDEOGRAPH
+ 0x8DDB: 0x969B, //CJK UNIFIED IDEOGRAPH
+ 0x8DDC: 0x5264, //CJK UNIFIED IDEOGRAPH
+ 0x8DDD: 0x5728, //CJK UNIFIED IDEOGRAPH
+ 0x8DDE: 0x6750, //CJK UNIFIED IDEOGRAPH
+ 0x8DDF: 0x7F6A, //CJK UNIFIED IDEOGRAPH
+ 0x8DE0: 0x8CA1, //CJK UNIFIED IDEOGRAPH
+ 0x8DE1: 0x51B4, //CJK UNIFIED IDEOGRAPH
+ 0x8DE2: 0x5742, //CJK UNIFIED IDEOGRAPH
+ 0x8DE3: 0x962A, //CJK UNIFIED IDEOGRAPH
+ 0x8DE4: 0x583A, //CJK UNIFIED IDEOGRAPH
+ 0x8DE5: 0x698A, //CJK UNIFIED IDEOGRAPH
+ 0x8DE6: 0x80B4, //CJK UNIFIED IDEOGRAPH
+ 0x8DE7: 0x54B2, //CJK UNIFIED IDEOGRAPH
+ 0x8DE8: 0x5D0E, //CJK UNIFIED IDEOGRAPH
+ 0x8DE9: 0x57FC, //CJK UNIFIED IDEOGRAPH
+ 0x8DEA: 0x7895, //CJK UNIFIED IDEOGRAPH
+ 0x8DEB: 0x9DFA, //CJK UNIFIED IDEOGRAPH
+ 0x8DEC: 0x4F5C, //CJK UNIFIED IDEOGRAPH
+ 0x8DED: 0x524A, //CJK UNIFIED IDEOGRAPH
+ 0x8DEE: 0x548B, //CJK UNIFIED IDEOGRAPH
+ 0x8DEF: 0x643E, //CJK UNIFIED IDEOGRAPH
+ 0x8DF0: 0x6628, //CJK UNIFIED IDEOGRAPH
+ 0x8DF1: 0x6714, //CJK UNIFIED IDEOGRAPH
+ 0x8DF2: 0x67F5, //CJK UNIFIED IDEOGRAPH
+ 0x8DF3: 0x7A84, //CJK UNIFIED IDEOGRAPH
+ 0x8DF4: 0x7B56, //CJK UNIFIED IDEOGRAPH
+ 0x8DF5: 0x7D22, //CJK UNIFIED IDEOGRAPH
+ 0x8DF6: 0x932F, //CJK UNIFIED IDEOGRAPH
+ 0x8DF7: 0x685C, //CJK UNIFIED IDEOGRAPH
+ 0x8DF8: 0x9BAD, //CJK UNIFIED IDEOGRAPH
+ 0x8DF9: 0x7B39, //CJK UNIFIED IDEOGRAPH
+ 0x8DFA: 0x5319, //CJK UNIFIED IDEOGRAPH
+ 0x8DFB: 0x518A, //CJK UNIFIED IDEOGRAPH
+ 0x8DFC: 0x5237, //CJK UNIFIED IDEOGRAPH
+ 0x8E40: 0x5BDF, //CJK UNIFIED IDEOGRAPH
+ 0x8E41: 0x62F6, //CJK UNIFIED IDEOGRAPH
+ 0x8E42: 0x64AE, //CJK UNIFIED IDEOGRAPH
+ 0x8E43: 0x64E6, //CJK UNIFIED IDEOGRAPH
+ 0x8E44: 0x672D, //CJK UNIFIED IDEOGRAPH
+ 0x8E45: 0x6BBA, //CJK UNIFIED IDEOGRAPH
+ 0x8E46: 0x85A9, //CJK UNIFIED IDEOGRAPH
+ 0x8E47: 0x96D1, //CJK UNIFIED IDEOGRAPH
+ 0x8E48: 0x7690, //CJK UNIFIED IDEOGRAPH
+ 0x8E49: 0x9BD6, //CJK UNIFIED IDEOGRAPH
+ 0x8E4A: 0x634C, //CJK UNIFIED IDEOGRAPH
+ 0x8E4B: 0x9306, //CJK UNIFIED IDEOGRAPH
+ 0x8E4C: 0x9BAB, //CJK UNIFIED IDEOGRAPH
+ 0x8E4D: 0x76BF, //CJK UNIFIED IDEOGRAPH
+ 0x8E4E: 0x6652, //CJK UNIFIED IDEOGRAPH
+ 0x8E4F: 0x4E09, //CJK UNIFIED IDEOGRAPH
+ 0x8E50: 0x5098, //CJK UNIFIED IDEOGRAPH
+ 0x8E51: 0x53C2, //CJK UNIFIED IDEOGRAPH
+ 0x8E52: 0x5C71, //CJK UNIFIED IDEOGRAPH
+ 0x8E53: 0x60E8, //CJK UNIFIED IDEOGRAPH
+ 0x8E54: 0x6492, //CJK UNIFIED IDEOGRAPH
+ 0x8E55: 0x6563, //CJK UNIFIED IDEOGRAPH
+ 0x8E56: 0x685F, //CJK UNIFIED IDEOGRAPH
+ 0x8E57: 0x71E6, //CJK UNIFIED IDEOGRAPH
+ 0x8E58: 0x73CA, //CJK UNIFIED IDEOGRAPH
+ 0x8E59: 0x7523, //CJK UNIFIED IDEOGRAPH
+ 0x8E5A: 0x7B97, //CJK UNIFIED IDEOGRAPH
+ 0x8E5B: 0x7E82, //CJK UNIFIED IDEOGRAPH
+ 0x8E5C: 0x8695, //CJK UNIFIED IDEOGRAPH
+ 0x8E5D: 0x8B83, //CJK UNIFIED IDEOGRAPH
+ 0x8E5E: 0x8CDB, //CJK UNIFIED IDEOGRAPH
+ 0x8E5F: 0x9178, //CJK UNIFIED IDEOGRAPH
+ 0x8E60: 0x9910, //CJK UNIFIED IDEOGRAPH
+ 0x8E61: 0x65AC, //CJK UNIFIED IDEOGRAPH
+ 0x8E62: 0x66AB, //CJK UNIFIED IDEOGRAPH
+ 0x8E63: 0x6B8B, //CJK UNIFIED IDEOGRAPH
+ 0x8E64: 0x4ED5, //CJK UNIFIED IDEOGRAPH
+ 0x8E65: 0x4ED4, //CJK UNIFIED IDEOGRAPH
+ 0x8E66: 0x4F3A, //CJK UNIFIED IDEOGRAPH
+ 0x8E67: 0x4F7F, //CJK UNIFIED IDEOGRAPH
+ 0x8E68: 0x523A, //CJK UNIFIED IDEOGRAPH
+ 0x8E69: 0x53F8, //CJK UNIFIED IDEOGRAPH
+ 0x8E6A: 0x53F2, //CJK UNIFIED IDEOGRAPH
+ 0x8E6B: 0x55E3, //CJK UNIFIED IDEOGRAPH
+ 0x8E6C: 0x56DB, //CJK UNIFIED IDEOGRAPH
+ 0x8E6D: 0x58EB, //CJK UNIFIED IDEOGRAPH
+ 0x8E6E: 0x59CB, //CJK UNIFIED IDEOGRAPH
+ 0x8E6F: 0x59C9, //CJK UNIFIED IDEOGRAPH
+ 0x8E70: 0x59FF, //CJK UNIFIED IDEOGRAPH
+ 0x8E71: 0x5B50, //CJK UNIFIED IDEOGRAPH
+ 0x8E72: 0x5C4D, //CJK UNIFIED IDEOGRAPH
+ 0x8E73: 0x5E02, //CJK UNIFIED IDEOGRAPH
+ 0x8E74: 0x5E2B, //CJK UNIFIED IDEOGRAPH
+ 0x8E75: 0x5FD7, //CJK UNIFIED IDEOGRAPH
+ 0x8E76: 0x601D, //CJK UNIFIED IDEOGRAPH
+ 0x8E77: 0x6307, //CJK UNIFIED IDEOGRAPH
+ 0x8E78: 0x652F, //CJK UNIFIED IDEOGRAPH
+ 0x8E79: 0x5B5C, //CJK UNIFIED IDEOGRAPH
+ 0x8E7A: 0x65AF, //CJK UNIFIED IDEOGRAPH
+ 0x8E7B: 0x65BD, //CJK UNIFIED IDEOGRAPH
+ 0x8E7C: 0x65E8, //CJK UNIFIED IDEOGRAPH
+ 0x8E7D: 0x679D, //CJK UNIFIED IDEOGRAPH
+ 0x8E7E: 0x6B62, //CJK UNIFIED IDEOGRAPH
+ 0x8E80: 0x6B7B, //CJK UNIFIED IDEOGRAPH
+ 0x8E81: 0x6C0F, //CJK UNIFIED IDEOGRAPH
+ 0x8E82: 0x7345, //CJK UNIFIED IDEOGRAPH
+ 0x8E83: 0x7949, //CJK UNIFIED IDEOGRAPH
+ 0x8E84: 0x79C1, //CJK UNIFIED IDEOGRAPH
+ 0x8E85: 0x7CF8, //CJK UNIFIED IDEOGRAPH
+ 0x8E86: 0x7D19, //CJK UNIFIED IDEOGRAPH
+ 0x8E87: 0x7D2B, //CJK UNIFIED IDEOGRAPH
+ 0x8E88: 0x80A2, //CJK UNIFIED IDEOGRAPH
+ 0x8E89: 0x8102, //CJK UNIFIED IDEOGRAPH
+ 0x8E8A: 0x81F3, //CJK UNIFIED IDEOGRAPH
+ 0x8E8B: 0x8996, //CJK UNIFIED IDEOGRAPH
+ 0x8E8C: 0x8A5E, //CJK UNIFIED IDEOGRAPH
+ 0x8E8D: 0x8A69, //CJK UNIFIED IDEOGRAPH
+ 0x8E8E: 0x8A66, //CJK UNIFIED IDEOGRAPH
+ 0x8E8F: 0x8A8C, //CJK UNIFIED IDEOGRAPH
+ 0x8E90: 0x8AEE, //CJK UNIFIED IDEOGRAPH
+ 0x8E91: 0x8CC7, //CJK UNIFIED IDEOGRAPH
+ 0x8E92: 0x8CDC, //CJK UNIFIED IDEOGRAPH
+ 0x8E93: 0x96CC, //CJK UNIFIED IDEOGRAPH
+ 0x8E94: 0x98FC, //CJK UNIFIED IDEOGRAPH
+ 0x8E95: 0x6B6F, //CJK UNIFIED IDEOGRAPH
+ 0x8E96: 0x4E8B, //CJK UNIFIED IDEOGRAPH
+ 0x8E97: 0x4F3C, //CJK UNIFIED IDEOGRAPH
+ 0x8E98: 0x4F8D, //CJK UNIFIED IDEOGRAPH
+ 0x8E99: 0x5150, //CJK UNIFIED IDEOGRAPH
+ 0x8E9A: 0x5B57, //CJK UNIFIED IDEOGRAPH
+ 0x8E9B: 0x5BFA, //CJK UNIFIED IDEOGRAPH
+ 0x8E9C: 0x6148, //CJK UNIFIED IDEOGRAPH
+ 0x8E9D: 0x6301, //CJK UNIFIED IDEOGRAPH
+ 0x8E9E: 0x6642, //CJK UNIFIED IDEOGRAPH
+ 0x8E9F: 0x6B21, //CJK UNIFIED IDEOGRAPH
+ 0x8EA0: 0x6ECB, //CJK UNIFIED IDEOGRAPH
+ 0x8EA1: 0x6CBB, //CJK UNIFIED IDEOGRAPH
+ 0x8EA2: 0x723E, //CJK UNIFIED IDEOGRAPH
+ 0x8EA3: 0x74BD, //CJK UNIFIED IDEOGRAPH
+ 0x8EA4: 0x75D4, //CJK UNIFIED IDEOGRAPH
+ 0x8EA5: 0x78C1, //CJK UNIFIED IDEOGRAPH
+ 0x8EA6: 0x793A, //CJK UNIFIED IDEOGRAPH
+ 0x8EA7: 0x800C, //CJK UNIFIED IDEOGRAPH
+ 0x8EA8: 0x8033, //CJK UNIFIED IDEOGRAPH
+ 0x8EA9: 0x81EA, //CJK UNIFIED IDEOGRAPH
+ 0x8EAA: 0x8494, //CJK UNIFIED IDEOGRAPH
+ 0x8EAB: 0x8F9E, //CJK UNIFIED IDEOGRAPH
+ 0x8EAC: 0x6C50, //CJK UNIFIED IDEOGRAPH
+ 0x8EAD: 0x9E7F, //CJK UNIFIED IDEOGRAPH
+ 0x8EAE: 0x5F0F, //CJK UNIFIED IDEOGRAPH
+ 0x8EAF: 0x8B58, //CJK UNIFIED IDEOGRAPH
+ 0x8EB0: 0x9D2B, //CJK UNIFIED IDEOGRAPH
+ 0x8EB1: 0x7AFA, //CJK UNIFIED IDEOGRAPH
+ 0x8EB2: 0x8EF8, //CJK UNIFIED IDEOGRAPH
+ 0x8EB3: 0x5B8D, //CJK UNIFIED IDEOGRAPH
+ 0x8EB4: 0x96EB, //CJK UNIFIED IDEOGRAPH
+ 0x8EB5: 0x4E03, //CJK UNIFIED IDEOGRAPH
+ 0x8EB6: 0x53F1, //CJK UNIFIED IDEOGRAPH
+ 0x8EB7: 0x57F7, //CJK UNIFIED IDEOGRAPH
+ 0x8EB8: 0x5931, //CJK UNIFIED IDEOGRAPH
+ 0x8EB9: 0x5AC9, //CJK UNIFIED IDEOGRAPH
+ 0x8EBA: 0x5BA4, //CJK UNIFIED IDEOGRAPH
+ 0x8EBB: 0x6089, //CJK UNIFIED IDEOGRAPH
+ 0x8EBC: 0x6E7F, //CJK UNIFIED IDEOGRAPH
+ 0x8EBD: 0x6F06, //CJK UNIFIED IDEOGRAPH
+ 0x8EBE: 0x75BE, //CJK UNIFIED IDEOGRAPH
+ 0x8EBF: 0x8CEA, //CJK UNIFIED IDEOGRAPH
+ 0x8EC0: 0x5B9F, //CJK UNIFIED IDEOGRAPH
+ 0x8EC1: 0x8500, //CJK UNIFIED IDEOGRAPH
+ 0x8EC2: 0x7BE0, //CJK UNIFIED IDEOGRAPH
+ 0x8EC3: 0x5072, //CJK UNIFIED IDEOGRAPH
+ 0x8EC4: 0x67F4, //CJK UNIFIED IDEOGRAPH
+ 0x8EC5: 0x829D, //CJK UNIFIED IDEOGRAPH
+ 0x8EC6: 0x5C61, //CJK UNIFIED IDEOGRAPH
+ 0x8EC7: 0x854A, //CJK UNIFIED IDEOGRAPH
+ 0x8EC8: 0x7E1E, //CJK UNIFIED IDEOGRAPH
+ 0x8EC9: 0x820E, //CJK UNIFIED IDEOGRAPH
+ 0x8ECA: 0x5199, //CJK UNIFIED IDEOGRAPH
+ 0x8ECB: 0x5C04, //CJK UNIFIED IDEOGRAPH
+ 0x8ECC: 0x6368, //CJK UNIFIED IDEOGRAPH
+ 0x8ECD: 0x8D66, //CJK UNIFIED IDEOGRAPH
+ 0x8ECE: 0x659C, //CJK UNIFIED IDEOGRAPH
+ 0x8ECF: 0x716E, //CJK UNIFIED IDEOGRAPH
+ 0x8ED0: 0x793E, //CJK UNIFIED IDEOGRAPH
+ 0x8ED1: 0x7D17, //CJK UNIFIED IDEOGRAPH
+ 0x8ED2: 0x8005, //CJK UNIFIED IDEOGRAPH
+ 0x8ED3: 0x8B1D, //CJK UNIFIED IDEOGRAPH
+ 0x8ED4: 0x8ECA, //CJK UNIFIED IDEOGRAPH
+ 0x8ED5: 0x906E, //CJK UNIFIED IDEOGRAPH
+ 0x8ED6: 0x86C7, //CJK UNIFIED IDEOGRAPH
+ 0x8ED7: 0x90AA, //CJK UNIFIED IDEOGRAPH
+ 0x8ED8: 0x501F, //CJK UNIFIED IDEOGRAPH
+ 0x8ED9: 0x52FA, //CJK UNIFIED IDEOGRAPH
+ 0x8EDA: 0x5C3A, //CJK UNIFIED IDEOGRAPH
+ 0x8EDB: 0x6753, //CJK UNIFIED IDEOGRAPH
+ 0x8EDC: 0x707C, //CJK UNIFIED IDEOGRAPH
+ 0x8EDD: 0x7235, //CJK UNIFIED IDEOGRAPH
+ 0x8EDE: 0x914C, //CJK UNIFIED IDEOGRAPH
+ 0x8EDF: 0x91C8, //CJK UNIFIED IDEOGRAPH
+ 0x8EE0: 0x932B, //CJK UNIFIED IDEOGRAPH
+ 0x8EE1: 0x82E5, //CJK UNIFIED IDEOGRAPH
+ 0x8EE2: 0x5BC2, //CJK UNIFIED IDEOGRAPH
+ 0x8EE3: 0x5F31, //CJK UNIFIED IDEOGRAPH
+ 0x8EE4: 0x60F9, //CJK UNIFIED IDEOGRAPH
+ 0x8EE5: 0x4E3B, //CJK UNIFIED IDEOGRAPH
+ 0x8EE6: 0x53D6, //CJK UNIFIED IDEOGRAPH
+ 0x8EE7: 0x5B88, //CJK UNIFIED IDEOGRAPH
+ 0x8EE8: 0x624B, //CJK UNIFIED IDEOGRAPH
+ 0x8EE9: 0x6731, //CJK UNIFIED IDEOGRAPH
+ 0x8EEA: 0x6B8A, //CJK UNIFIED IDEOGRAPH
+ 0x8EEB: 0x72E9, //CJK UNIFIED IDEOGRAPH
+ 0x8EEC: 0x73E0, //CJK UNIFIED IDEOGRAPH
+ 0x8EED: 0x7A2E, //CJK UNIFIED IDEOGRAPH
+ 0x8EEE: 0x816B, //CJK UNIFIED IDEOGRAPH
+ 0x8EEF: 0x8DA3, //CJK UNIFIED IDEOGRAPH
+ 0x8EF0: 0x9152, //CJK UNIFIED IDEOGRAPH
+ 0x8EF1: 0x9996, //CJK UNIFIED IDEOGRAPH
+ 0x8EF2: 0x5112, //CJK UNIFIED IDEOGRAPH
+ 0x8EF3: 0x53D7, //CJK UNIFIED IDEOGRAPH
+ 0x8EF4: 0x546A, //CJK UNIFIED IDEOGRAPH
+ 0x8EF5: 0x5BFF, //CJK UNIFIED IDEOGRAPH
+ 0x8EF6: 0x6388, //CJK UNIFIED IDEOGRAPH
+ 0x8EF7: 0x6A39, //CJK UNIFIED IDEOGRAPH
+ 0x8EF8: 0x7DAC, //CJK UNIFIED IDEOGRAPH
+ 0x8EF9: 0x9700, //CJK UNIFIED IDEOGRAPH
+ 0x8EFA: 0x56DA, //CJK UNIFIED IDEOGRAPH
+ 0x8EFB: 0x53CE, //CJK UNIFIED IDEOGRAPH
+ 0x8EFC: 0x5468, //CJK UNIFIED IDEOGRAPH
+ 0x8F40: 0x5B97, //CJK UNIFIED IDEOGRAPH
+ 0x8F41: 0x5C31, //CJK UNIFIED IDEOGRAPH
+ 0x8F42: 0x5DDE, //CJK UNIFIED IDEOGRAPH
+ 0x8F43: 0x4FEE, //CJK UNIFIED IDEOGRAPH
+ 0x8F44: 0x6101, //CJK UNIFIED IDEOGRAPH
+ 0x8F45: 0x62FE, //CJK UNIFIED IDEOGRAPH
+ 0x8F46: 0x6D32, //CJK UNIFIED IDEOGRAPH
+ 0x8F47: 0x79C0, //CJK UNIFIED IDEOGRAPH
+ 0x8F48: 0x79CB, //CJK UNIFIED IDEOGRAPH
+ 0x8F49: 0x7D42, //CJK UNIFIED IDEOGRAPH
+ 0x8F4A: 0x7E4D, //CJK UNIFIED IDEOGRAPH
+ 0x8F4B: 0x7FD2, //CJK UNIFIED IDEOGRAPH
+ 0x8F4C: 0x81ED, //CJK UNIFIED IDEOGRAPH
+ 0x8F4D: 0x821F, //CJK UNIFIED IDEOGRAPH
+ 0x8F4E: 0x8490, //CJK UNIFIED IDEOGRAPH
+ 0x8F4F: 0x8846, //CJK UNIFIED IDEOGRAPH
+ 0x8F50: 0x8972, //CJK UNIFIED IDEOGRAPH
+ 0x8F51: 0x8B90, //CJK UNIFIED IDEOGRAPH
+ 0x8F52: 0x8E74, //CJK UNIFIED IDEOGRAPH
+ 0x8F53: 0x8F2F, //CJK UNIFIED IDEOGRAPH
+ 0x8F54: 0x9031, //CJK UNIFIED IDEOGRAPH
+ 0x8F55: 0x914B, //CJK UNIFIED IDEOGRAPH
+ 0x8F56: 0x916C, //CJK UNIFIED IDEOGRAPH
+ 0x8F57: 0x96C6, //CJK UNIFIED IDEOGRAPH
+ 0x8F58: 0x919C, //CJK UNIFIED IDEOGRAPH
+ 0x8F59: 0x4EC0, //CJK UNIFIED IDEOGRAPH
+ 0x8F5A: 0x4F4F, //CJK UNIFIED IDEOGRAPH
+ 0x8F5B: 0x5145, //CJK UNIFIED IDEOGRAPH
+ 0x8F5C: 0x5341, //CJK UNIFIED IDEOGRAPH
+ 0x8F5D: 0x5F93, //CJK UNIFIED IDEOGRAPH
+ 0x8F5E: 0x620E, //CJK UNIFIED IDEOGRAPH
+ 0x8F5F: 0x67D4, //CJK UNIFIED IDEOGRAPH
+ 0x8F60: 0x6C41, //CJK UNIFIED IDEOGRAPH
+ 0x8F61: 0x6E0B, //CJK UNIFIED IDEOGRAPH
+ 0x8F62: 0x7363, //CJK UNIFIED IDEOGRAPH
+ 0x8F63: 0x7E26, //CJK UNIFIED IDEOGRAPH
+ 0x8F64: 0x91CD, //CJK UNIFIED IDEOGRAPH
+ 0x8F65: 0x9283, //CJK UNIFIED IDEOGRAPH
+ 0x8F66: 0x53D4, //CJK UNIFIED IDEOGRAPH
+ 0x8F67: 0x5919, //CJK UNIFIED IDEOGRAPH
+ 0x8F68: 0x5BBF, //CJK UNIFIED IDEOGRAPH
+ 0x8F69: 0x6DD1, //CJK UNIFIED IDEOGRAPH
+ 0x8F6A: 0x795D, //CJK UNIFIED IDEOGRAPH
+ 0x8F6B: 0x7E2E, //CJK UNIFIED IDEOGRAPH
+ 0x8F6C: 0x7C9B, //CJK UNIFIED IDEOGRAPH
+ 0x8F6D: 0x587E, //CJK UNIFIED IDEOGRAPH
+ 0x8F6E: 0x719F, //CJK UNIFIED IDEOGRAPH
+ 0x8F6F: 0x51FA, //CJK UNIFIED IDEOGRAPH
+ 0x8F70: 0x8853, //CJK UNIFIED IDEOGRAPH
+ 0x8F71: 0x8FF0, //CJK UNIFIED IDEOGRAPH
+ 0x8F72: 0x4FCA, //CJK UNIFIED IDEOGRAPH
+ 0x8F73: 0x5CFB, //CJK UNIFIED IDEOGRAPH
+ 0x8F74: 0x6625, //CJK UNIFIED IDEOGRAPH
+ 0x8F75: 0x77AC, //CJK UNIFIED IDEOGRAPH
+ 0x8F76: 0x7AE3, //CJK UNIFIED IDEOGRAPH
+ 0x8F77: 0x821C, //CJK UNIFIED IDEOGRAPH
+ 0x8F78: 0x99FF, //CJK UNIFIED IDEOGRAPH
+ 0x8F79: 0x51C6, //CJK UNIFIED IDEOGRAPH
+ 0x8F7A: 0x5FAA, //CJK UNIFIED IDEOGRAPH
+ 0x8F7B: 0x65EC, //CJK UNIFIED IDEOGRAPH
+ 0x8F7C: 0x696F, //CJK UNIFIED IDEOGRAPH
+ 0x8F7D: 0x6B89, //CJK UNIFIED IDEOGRAPH
+ 0x8F7E: 0x6DF3, //CJK UNIFIED IDEOGRAPH
+ 0x8F80: 0x6E96, //CJK UNIFIED IDEOGRAPH
+ 0x8F81: 0x6F64, //CJK UNIFIED IDEOGRAPH
+ 0x8F82: 0x76FE, //CJK UNIFIED IDEOGRAPH
+ 0x8F83: 0x7D14, //CJK UNIFIED IDEOGRAPH
+ 0x8F84: 0x5DE1, //CJK UNIFIED IDEOGRAPH
+ 0x8F85: 0x9075, //CJK UNIFIED IDEOGRAPH
+ 0x8F86: 0x9187, //CJK UNIFIED IDEOGRAPH
+ 0x8F87: 0x9806, //CJK UNIFIED IDEOGRAPH
+ 0x8F88: 0x51E6, //CJK UNIFIED IDEOGRAPH
+ 0x8F89: 0x521D, //CJK UNIFIED IDEOGRAPH
+ 0x8F8A: 0x6240, //CJK UNIFIED IDEOGRAPH
+ 0x8F8B: 0x6691, //CJK UNIFIED IDEOGRAPH
+ 0x8F8C: 0x66D9, //CJK UNIFIED IDEOGRAPH
+ 0x8F8D: 0x6E1A, //CJK UNIFIED IDEOGRAPH
+ 0x8F8E: 0x5EB6, //CJK UNIFIED IDEOGRAPH
+ 0x8F8F: 0x7DD2, //CJK UNIFIED IDEOGRAPH
+ 0x8F90: 0x7F72, //CJK UNIFIED IDEOGRAPH
+ 0x8F91: 0x66F8, //CJK UNIFIED IDEOGRAPH
+ 0x8F92: 0x85AF, //CJK UNIFIED IDEOGRAPH
+ 0x8F93: 0x85F7, //CJK UNIFIED IDEOGRAPH
+ 0x8F94: 0x8AF8, //CJK UNIFIED IDEOGRAPH
+ 0x8F95: 0x52A9, //CJK UNIFIED IDEOGRAPH
+ 0x8F96: 0x53D9, //CJK UNIFIED IDEOGRAPH
+ 0x8F97: 0x5973, //CJK UNIFIED IDEOGRAPH
+ 0x8F98: 0x5E8F, //CJK UNIFIED IDEOGRAPH
+ 0x8F99: 0x5F90, //CJK UNIFIED IDEOGRAPH
+ 0x8F9A: 0x6055, //CJK UNIFIED IDEOGRAPH
+ 0x8F9B: 0x92E4, //CJK UNIFIED IDEOGRAPH
+ 0x8F9C: 0x9664, //CJK UNIFIED IDEOGRAPH
+ 0x8F9D: 0x50B7, //CJK UNIFIED IDEOGRAPH
+ 0x8F9E: 0x511F, //CJK UNIFIED IDEOGRAPH
+ 0x8F9F: 0x52DD, //CJK UNIFIED IDEOGRAPH
+ 0x8FA0: 0x5320, //CJK UNIFIED IDEOGRAPH
+ 0x8FA1: 0x5347, //CJK UNIFIED IDEOGRAPH
+ 0x8FA2: 0x53EC, //CJK UNIFIED IDEOGRAPH
+ 0x8FA3: 0x54E8, //CJK UNIFIED IDEOGRAPH
+ 0x8FA4: 0x5546, //CJK UNIFIED IDEOGRAPH
+ 0x8FA5: 0x5531, //CJK UNIFIED IDEOGRAPH
+ 0x8FA6: 0x5617, //CJK UNIFIED IDEOGRAPH
+ 0x8FA7: 0x5968, //CJK UNIFIED IDEOGRAPH
+ 0x8FA8: 0x59BE, //CJK UNIFIED IDEOGRAPH
+ 0x8FA9: 0x5A3C, //CJK UNIFIED IDEOGRAPH
+ 0x8FAA: 0x5BB5, //CJK UNIFIED IDEOGRAPH
+ 0x8FAB: 0x5C06, //CJK UNIFIED IDEOGRAPH
+ 0x8FAC: 0x5C0F, //CJK UNIFIED IDEOGRAPH
+ 0x8FAD: 0x5C11, //CJK UNIFIED IDEOGRAPH
+ 0x8FAE: 0x5C1A, //CJK UNIFIED IDEOGRAPH
+ 0x8FAF: 0x5E84, //CJK UNIFIED IDEOGRAPH
+ 0x8FB0: 0x5E8A, //CJK UNIFIED IDEOGRAPH
+ 0x8FB1: 0x5EE0, //CJK UNIFIED IDEOGRAPH
+ 0x8FB2: 0x5F70, //CJK UNIFIED IDEOGRAPH
+ 0x8FB3: 0x627F, //CJK UNIFIED IDEOGRAPH
+ 0x8FB4: 0x6284, //CJK UNIFIED IDEOGRAPH
+ 0x8FB5: 0x62DB, //CJK UNIFIED IDEOGRAPH
+ 0x8FB6: 0x638C, //CJK UNIFIED IDEOGRAPH
+ 0x8FB7: 0x6377, //CJK UNIFIED IDEOGRAPH
+ 0x8FB8: 0x6607, //CJK UNIFIED IDEOGRAPH
+ 0x8FB9: 0x660C, //CJK UNIFIED IDEOGRAPH
+ 0x8FBA: 0x662D, //CJK UNIFIED IDEOGRAPH
+ 0x8FBB: 0x6676, //CJK UNIFIED IDEOGRAPH
+ 0x8FBC: 0x677E, //CJK UNIFIED IDEOGRAPH
+ 0x8FBD: 0x68A2, //CJK UNIFIED IDEOGRAPH
+ 0x8FBE: 0x6A1F, //CJK UNIFIED IDEOGRAPH
+ 0x8FBF: 0x6A35, //CJK UNIFIED IDEOGRAPH
+ 0x8FC0: 0x6CBC, //CJK UNIFIED IDEOGRAPH
+ 0x8FC1: 0x6D88, //CJK UNIFIED IDEOGRAPH
+ 0x8FC2: 0x6E09, //CJK UNIFIED IDEOGRAPH
+ 0x8FC3: 0x6E58, //CJK UNIFIED IDEOGRAPH
+ 0x8FC4: 0x713C, //CJK UNIFIED IDEOGRAPH
+ 0x8FC5: 0x7126, //CJK UNIFIED IDEOGRAPH
+ 0x8FC6: 0x7167, //CJK UNIFIED IDEOGRAPH
+ 0x8FC7: 0x75C7, //CJK UNIFIED IDEOGRAPH
+ 0x8FC8: 0x7701, //CJK UNIFIED IDEOGRAPH
+ 0x8FC9: 0x785D, //CJK UNIFIED IDEOGRAPH
+ 0x8FCA: 0x7901, //CJK UNIFIED IDEOGRAPH
+ 0x8FCB: 0x7965, //CJK UNIFIED IDEOGRAPH
+ 0x8FCC: 0x79F0, //CJK UNIFIED IDEOGRAPH
+ 0x8FCD: 0x7AE0, //CJK UNIFIED IDEOGRAPH
+ 0x8FCE: 0x7B11, //CJK UNIFIED IDEOGRAPH
+ 0x8FCF: 0x7CA7, //CJK UNIFIED IDEOGRAPH
+ 0x8FD0: 0x7D39, //CJK UNIFIED IDEOGRAPH
+ 0x8FD1: 0x8096, //CJK UNIFIED IDEOGRAPH
+ 0x8FD2: 0x83D6, //CJK UNIFIED IDEOGRAPH
+ 0x8FD3: 0x848B, //CJK UNIFIED IDEOGRAPH
+ 0x8FD4: 0x8549, //CJK UNIFIED IDEOGRAPH
+ 0x8FD5: 0x885D, //CJK UNIFIED IDEOGRAPH
+ 0x8FD6: 0x88F3, //CJK UNIFIED IDEOGRAPH
+ 0x8FD7: 0x8A1F, //CJK UNIFIED IDEOGRAPH
+ 0x8FD8: 0x8A3C, //CJK UNIFIED IDEOGRAPH
+ 0x8FD9: 0x8A54, //CJK UNIFIED IDEOGRAPH
+ 0x8FDA: 0x8A73, //CJK UNIFIED IDEOGRAPH
+ 0x8FDB: 0x8C61, //CJK UNIFIED IDEOGRAPH
+ 0x8FDC: 0x8CDE, //CJK UNIFIED IDEOGRAPH
+ 0x8FDD: 0x91A4, //CJK UNIFIED IDEOGRAPH
+ 0x8FDE: 0x9266, //CJK UNIFIED IDEOGRAPH
+ 0x8FDF: 0x937E, //CJK UNIFIED IDEOGRAPH
+ 0x8FE0: 0x9418, //CJK UNIFIED IDEOGRAPH
+ 0x8FE1: 0x969C, //CJK UNIFIED IDEOGRAPH
+ 0x8FE2: 0x9798, //CJK UNIFIED IDEOGRAPH
+ 0x8FE3: 0x4E0A, //CJK UNIFIED IDEOGRAPH
+ 0x8FE4: 0x4E08, //CJK UNIFIED IDEOGRAPH
+ 0x8FE5: 0x4E1E, //CJK UNIFIED IDEOGRAPH
+ 0x8FE6: 0x4E57, //CJK UNIFIED IDEOGRAPH
+ 0x8FE7: 0x5197, //CJK UNIFIED IDEOGRAPH
+ 0x8FE8: 0x5270, //CJK UNIFIED IDEOGRAPH
+ 0x8FE9: 0x57CE, //CJK UNIFIED IDEOGRAPH
+ 0x8FEA: 0x5834, //CJK UNIFIED IDEOGRAPH
+ 0x8FEB: 0x58CC, //CJK UNIFIED IDEOGRAPH
+ 0x8FEC: 0x5B22, //CJK UNIFIED IDEOGRAPH
+ 0x8FED: 0x5E38, //CJK UNIFIED IDEOGRAPH
+ 0x8FEE: 0x60C5, //CJK UNIFIED IDEOGRAPH
+ 0x8FEF: 0x64FE, //CJK UNIFIED IDEOGRAPH
+ 0x8FF0: 0x6761, //CJK UNIFIED IDEOGRAPH
+ 0x8FF1: 0x6756, //CJK UNIFIED IDEOGRAPH
+ 0x8FF2: 0x6D44, //CJK UNIFIED IDEOGRAPH
+ 0x8FF3: 0x72B6, //CJK UNIFIED IDEOGRAPH
+ 0x8FF4: 0x7573, //CJK UNIFIED IDEOGRAPH
+ 0x8FF5: 0x7A63, //CJK UNIFIED IDEOGRAPH
+ 0x8FF6: 0x84B8, //CJK UNIFIED IDEOGRAPH
+ 0x8FF7: 0x8B72, //CJK UNIFIED IDEOGRAPH
+ 0x8FF8: 0x91B8, //CJK UNIFIED IDEOGRAPH
+ 0x8FF9: 0x9320, //CJK UNIFIED IDEOGRAPH
+ 0x8FFA: 0x5631, //CJK UNIFIED IDEOGRAPH
+ 0x8FFB: 0x57F4, //CJK UNIFIED IDEOGRAPH
+ 0x8FFC: 0x98FE, //CJK UNIFIED IDEOGRAPH
+ 0x9040: 0x62ED, //CJK UNIFIED IDEOGRAPH
+ 0x9041: 0x690D, //CJK UNIFIED IDEOGRAPH
+ 0x9042: 0x6B96, //CJK UNIFIED IDEOGRAPH
+ 0x9043: 0x71ED, //CJK UNIFIED IDEOGRAPH
+ 0x9044: 0x7E54, //CJK UNIFIED IDEOGRAPH
+ 0x9045: 0x8077, //CJK UNIFIED IDEOGRAPH
+ 0x9046: 0x8272, //CJK UNIFIED IDEOGRAPH
+ 0x9047: 0x89E6, //CJK UNIFIED IDEOGRAPH
+ 0x9048: 0x98DF, //CJK UNIFIED IDEOGRAPH
+ 0x9049: 0x8755, //CJK UNIFIED IDEOGRAPH
+ 0x904A: 0x8FB1, //CJK UNIFIED IDEOGRAPH
+ 0x904B: 0x5C3B, //CJK UNIFIED IDEOGRAPH
+ 0x904C: 0x4F38, //CJK UNIFIED IDEOGRAPH
+ 0x904D: 0x4FE1, //CJK UNIFIED IDEOGRAPH
+ 0x904E: 0x4FB5, //CJK UNIFIED IDEOGRAPH
+ 0x904F: 0x5507, //CJK UNIFIED IDEOGRAPH
+ 0x9050: 0x5A20, //CJK UNIFIED IDEOGRAPH
+ 0x9051: 0x5BDD, //CJK UNIFIED IDEOGRAPH
+ 0x9052: 0x5BE9, //CJK UNIFIED IDEOGRAPH
+ 0x9053: 0x5FC3, //CJK UNIFIED IDEOGRAPH
+ 0x9054: 0x614E, //CJK UNIFIED IDEOGRAPH
+ 0x9055: 0x632F, //CJK UNIFIED IDEOGRAPH
+ 0x9056: 0x65B0, //CJK UNIFIED IDEOGRAPH
+ 0x9057: 0x664B, //CJK UNIFIED IDEOGRAPH
+ 0x9058: 0x68EE, //CJK UNIFIED IDEOGRAPH
+ 0x9059: 0x699B, //CJK UNIFIED IDEOGRAPH
+ 0x905A: 0x6D78, //CJK UNIFIED IDEOGRAPH
+ 0x905B: 0x6DF1, //CJK UNIFIED IDEOGRAPH
+ 0x905C: 0x7533, //CJK UNIFIED IDEOGRAPH
+ 0x905D: 0x75B9, //CJK UNIFIED IDEOGRAPH
+ 0x905E: 0x771F, //CJK UNIFIED IDEOGRAPH
+ 0x905F: 0x795E, //CJK UNIFIED IDEOGRAPH
+ 0x9060: 0x79E6, //CJK UNIFIED IDEOGRAPH
+ 0x9061: 0x7D33, //CJK UNIFIED IDEOGRAPH
+ 0x9062: 0x81E3, //CJK UNIFIED IDEOGRAPH
+ 0x9063: 0x82AF, //CJK UNIFIED IDEOGRAPH
+ 0x9064: 0x85AA, //CJK UNIFIED IDEOGRAPH
+ 0x9065: 0x89AA, //CJK UNIFIED IDEOGRAPH
+ 0x9066: 0x8A3A, //CJK UNIFIED IDEOGRAPH
+ 0x9067: 0x8EAB, //CJK UNIFIED IDEOGRAPH
+ 0x9068: 0x8F9B, //CJK UNIFIED IDEOGRAPH
+ 0x9069: 0x9032, //CJK UNIFIED IDEOGRAPH
+ 0x906A: 0x91DD, //CJK UNIFIED IDEOGRAPH
+ 0x906B: 0x9707, //CJK UNIFIED IDEOGRAPH
+ 0x906C: 0x4EBA, //CJK UNIFIED IDEOGRAPH
+ 0x906D: 0x4EC1, //CJK UNIFIED IDEOGRAPH
+ 0x906E: 0x5203, //CJK UNIFIED IDEOGRAPH
+ 0x906F: 0x5875, //CJK UNIFIED IDEOGRAPH
+ 0x9070: 0x58EC, //CJK UNIFIED IDEOGRAPH
+ 0x9071: 0x5C0B, //CJK UNIFIED IDEOGRAPH
+ 0x9072: 0x751A, //CJK UNIFIED IDEOGRAPH
+ 0x9073: 0x5C3D, //CJK UNIFIED IDEOGRAPH
+ 0x9074: 0x814E, //CJK UNIFIED IDEOGRAPH
+ 0x9075: 0x8A0A, //CJK UNIFIED IDEOGRAPH
+ 0x9076: 0x8FC5, //CJK UNIFIED IDEOGRAPH
+ 0x9077: 0x9663, //CJK UNIFIED IDEOGRAPH
+ 0x9078: 0x976D, //CJK UNIFIED IDEOGRAPH
+ 0x9079: 0x7B25, //CJK UNIFIED IDEOGRAPH
+ 0x907A: 0x8ACF, //CJK UNIFIED IDEOGRAPH
+ 0x907B: 0x9808, //CJK UNIFIED IDEOGRAPH
+ 0x907C: 0x9162, //CJK UNIFIED IDEOGRAPH
+ 0x907D: 0x56F3, //CJK UNIFIED IDEOGRAPH
+ 0x907E: 0x53A8, //CJK UNIFIED IDEOGRAPH
+ 0x9080: 0x9017, //CJK UNIFIED IDEOGRAPH
+ 0x9081: 0x5439, //CJK UNIFIED IDEOGRAPH
+ 0x9082: 0x5782, //CJK UNIFIED IDEOGRAPH
+ 0x9083: 0x5E25, //CJK UNIFIED IDEOGRAPH
+ 0x9084: 0x63A8, //CJK UNIFIED IDEOGRAPH
+ 0x9085: 0x6C34, //CJK UNIFIED IDEOGRAPH
+ 0x9086: 0x708A, //CJK UNIFIED IDEOGRAPH
+ 0x9087: 0x7761, //CJK UNIFIED IDEOGRAPH
+ 0x9088: 0x7C8B, //CJK UNIFIED IDEOGRAPH
+ 0x9089: 0x7FE0, //CJK UNIFIED IDEOGRAPH
+ 0x908A: 0x8870, //CJK UNIFIED IDEOGRAPH
+ 0x908B: 0x9042, //CJK UNIFIED IDEOGRAPH
+ 0x908C: 0x9154, //CJK UNIFIED IDEOGRAPH
+ 0x908D: 0x9310, //CJK UNIFIED IDEOGRAPH
+ 0x908E: 0x9318, //CJK UNIFIED IDEOGRAPH
+ 0x908F: 0x968F, //CJK UNIFIED IDEOGRAPH
+ 0x9090: 0x745E, //CJK UNIFIED IDEOGRAPH
+ 0x9091: 0x9AC4, //CJK UNIFIED IDEOGRAPH
+ 0x9092: 0x5D07, //CJK UNIFIED IDEOGRAPH
+ 0x9093: 0x5D69, //CJK UNIFIED IDEOGRAPH
+ 0x9094: 0x6570, //CJK UNIFIED IDEOGRAPH
+ 0x9095: 0x67A2, //CJK UNIFIED IDEOGRAPH
+ 0x9096: 0x8DA8, //CJK UNIFIED IDEOGRAPH
+ 0x9097: 0x96DB, //CJK UNIFIED IDEOGRAPH
+ 0x9098: 0x636E, //CJK UNIFIED IDEOGRAPH
+ 0x9099: 0x6749, //CJK UNIFIED IDEOGRAPH
+ 0x909A: 0x6919, //CJK UNIFIED IDEOGRAPH
+ 0x909B: 0x83C5, //CJK UNIFIED IDEOGRAPH
+ 0x909C: 0x9817, //CJK UNIFIED IDEOGRAPH
+ 0x909D: 0x96C0, //CJK UNIFIED IDEOGRAPH
+ 0x909E: 0x88FE, //CJK UNIFIED IDEOGRAPH
+ 0x909F: 0x6F84, //CJK UNIFIED IDEOGRAPH
+ 0x90A0: 0x647A, //CJK UNIFIED IDEOGRAPH
+ 0x90A1: 0x5BF8, //CJK UNIFIED IDEOGRAPH
+ 0x90A2: 0x4E16, //CJK UNIFIED IDEOGRAPH
+ 0x90A3: 0x702C, //CJK UNIFIED IDEOGRAPH
+ 0x90A4: 0x755D, //CJK UNIFIED IDEOGRAPH
+ 0x90A5: 0x662F, //CJK UNIFIED IDEOGRAPH
+ 0x90A6: 0x51C4, //CJK UNIFIED IDEOGRAPH
+ 0x90A7: 0x5236, //CJK UNIFIED IDEOGRAPH
+ 0x90A8: 0x52E2, //CJK UNIFIED IDEOGRAPH
+ 0x90A9: 0x59D3, //CJK UNIFIED IDEOGRAPH
+ 0x90AA: 0x5F81, //CJK UNIFIED IDEOGRAPH
+ 0x90AB: 0x6027, //CJK UNIFIED IDEOGRAPH
+ 0x90AC: 0x6210, //CJK UNIFIED IDEOGRAPH
+ 0x90AD: 0x653F, //CJK UNIFIED IDEOGRAPH
+ 0x90AE: 0x6574, //CJK UNIFIED IDEOGRAPH
+ 0x90AF: 0x661F, //CJK UNIFIED IDEOGRAPH
+ 0x90B0: 0x6674, //CJK UNIFIED IDEOGRAPH
+ 0x90B1: 0x68F2, //CJK UNIFIED IDEOGRAPH
+ 0x90B2: 0x6816, //CJK UNIFIED IDEOGRAPH
+ 0x90B3: 0x6B63, //CJK UNIFIED IDEOGRAPH
+ 0x90B4: 0x6E05, //CJK UNIFIED IDEOGRAPH
+ 0x90B5: 0x7272, //CJK UNIFIED IDEOGRAPH
+ 0x90B6: 0x751F, //CJK UNIFIED IDEOGRAPH
+ 0x90B7: 0x76DB, //CJK UNIFIED IDEOGRAPH
+ 0x90B8: 0x7CBE, //CJK UNIFIED IDEOGRAPH
+ 0x90B9: 0x8056, //CJK UNIFIED IDEOGRAPH
+ 0x90BA: 0x58F0, //CJK UNIFIED IDEOGRAPH
+ 0x90BB: 0x88FD, //CJK UNIFIED IDEOGRAPH
+ 0x90BC: 0x897F, //CJK UNIFIED IDEOGRAPH
+ 0x90BD: 0x8AA0, //CJK UNIFIED IDEOGRAPH
+ 0x90BE: 0x8A93, //CJK UNIFIED IDEOGRAPH
+ 0x90BF: 0x8ACB, //CJK UNIFIED IDEOGRAPH
+ 0x90C0: 0x901D, //CJK UNIFIED IDEOGRAPH
+ 0x90C1: 0x9192, //CJK UNIFIED IDEOGRAPH
+ 0x90C2: 0x9752, //CJK UNIFIED IDEOGRAPH
+ 0x90C3: 0x9759, //CJK UNIFIED IDEOGRAPH
+ 0x90C4: 0x6589, //CJK UNIFIED IDEOGRAPH
+ 0x90C5: 0x7A0E, //CJK UNIFIED IDEOGRAPH
+ 0x90C6: 0x8106, //CJK UNIFIED IDEOGRAPH
+ 0x90C7: 0x96BB, //CJK UNIFIED IDEOGRAPH
+ 0x90C8: 0x5E2D, //CJK UNIFIED IDEOGRAPH
+ 0x90C9: 0x60DC, //CJK UNIFIED IDEOGRAPH
+ 0x90CA: 0x621A, //CJK UNIFIED IDEOGRAPH
+ 0x90CB: 0x65A5, //CJK UNIFIED IDEOGRAPH
+ 0x90CC: 0x6614, //CJK UNIFIED IDEOGRAPH
+ 0x90CD: 0x6790, //CJK UNIFIED IDEOGRAPH
+ 0x90CE: 0x77F3, //CJK UNIFIED IDEOGRAPH
+ 0x90CF: 0x7A4D, //CJK UNIFIED IDEOGRAPH
+ 0x90D0: 0x7C4D, //CJK UNIFIED IDEOGRAPH
+ 0x90D1: 0x7E3E, //CJK UNIFIED IDEOGRAPH
+ 0x90D2: 0x810A, //CJK UNIFIED IDEOGRAPH
+ 0x90D3: 0x8CAC, //CJK UNIFIED IDEOGRAPH
+ 0x90D4: 0x8D64, //CJK UNIFIED IDEOGRAPH
+ 0x90D5: 0x8DE1, //CJK UNIFIED IDEOGRAPH
+ 0x90D6: 0x8E5F, //CJK UNIFIED IDEOGRAPH
+ 0x90D7: 0x78A9, //CJK UNIFIED IDEOGRAPH
+ 0x90D8: 0x5207, //CJK UNIFIED IDEOGRAPH
+ 0x90D9: 0x62D9, //CJK UNIFIED IDEOGRAPH
+ 0x90DA: 0x63A5, //CJK UNIFIED IDEOGRAPH
+ 0x90DB: 0x6442, //CJK UNIFIED IDEOGRAPH
+ 0x90DC: 0x6298, //CJK UNIFIED IDEOGRAPH
+ 0x90DD: 0x8A2D, //CJK UNIFIED IDEOGRAPH
+ 0x90DE: 0x7A83, //CJK UNIFIED IDEOGRAPH
+ 0x90DF: 0x7BC0, //CJK UNIFIED IDEOGRAPH
+ 0x90E0: 0x8AAC, //CJK UNIFIED IDEOGRAPH
+ 0x90E1: 0x96EA, //CJK UNIFIED IDEOGRAPH
+ 0x90E2: 0x7D76, //CJK UNIFIED IDEOGRAPH
+ 0x90E3: 0x820C, //CJK UNIFIED IDEOGRAPH
+ 0x90E4: 0x8749, //CJK UNIFIED IDEOGRAPH
+ 0x90E5: 0x4ED9, //CJK UNIFIED IDEOGRAPH
+ 0x90E6: 0x5148, //CJK UNIFIED IDEOGRAPH
+ 0x90E7: 0x5343, //CJK UNIFIED IDEOGRAPH
+ 0x90E8: 0x5360, //CJK UNIFIED IDEOGRAPH
+ 0x90E9: 0x5BA3, //CJK UNIFIED IDEOGRAPH
+ 0x90EA: 0x5C02, //CJK UNIFIED IDEOGRAPH
+ 0x90EB: 0x5C16, //CJK UNIFIED IDEOGRAPH
+ 0x90EC: 0x5DDD, //CJK UNIFIED IDEOGRAPH
+ 0x90ED: 0x6226, //CJK UNIFIED IDEOGRAPH
+ 0x90EE: 0x6247, //CJK UNIFIED IDEOGRAPH
+ 0x90EF: 0x64B0, //CJK UNIFIED IDEOGRAPH
+ 0x90F0: 0x6813, //CJK UNIFIED IDEOGRAPH
+ 0x90F1: 0x6834, //CJK UNIFIED IDEOGRAPH
+ 0x90F2: 0x6CC9, //CJK UNIFIED IDEOGRAPH
+ 0x90F3: 0x6D45, //CJK UNIFIED IDEOGRAPH
+ 0x90F4: 0x6D17, //CJK UNIFIED IDEOGRAPH
+ 0x90F5: 0x67D3, //CJK UNIFIED IDEOGRAPH
+ 0x90F6: 0x6F5C, //CJK UNIFIED IDEOGRAPH
+ 0x90F7: 0x714E, //CJK UNIFIED IDEOGRAPH
+ 0x90F8: 0x717D, //CJK UNIFIED IDEOGRAPH
+ 0x90F9: 0x65CB, //CJK UNIFIED IDEOGRAPH
+ 0x90FA: 0x7A7F, //CJK UNIFIED IDEOGRAPH
+ 0x90FB: 0x7BAD, //CJK UNIFIED IDEOGRAPH
+ 0x90FC: 0x7DDA, //CJK UNIFIED IDEOGRAPH
+ 0x9140: 0x7E4A, //CJK UNIFIED IDEOGRAPH
+ 0x9141: 0x7FA8, //CJK UNIFIED IDEOGRAPH
+ 0x9142: 0x817A, //CJK UNIFIED IDEOGRAPH
+ 0x9143: 0x821B, //CJK UNIFIED IDEOGRAPH
+ 0x9144: 0x8239, //CJK UNIFIED IDEOGRAPH
+ 0x9145: 0x85A6, //CJK UNIFIED IDEOGRAPH
+ 0x9146: 0x8A6E, //CJK UNIFIED IDEOGRAPH
+ 0x9147: 0x8CCE, //CJK UNIFIED IDEOGRAPH
+ 0x9148: 0x8DF5, //CJK UNIFIED IDEOGRAPH
+ 0x9149: 0x9078, //CJK UNIFIED IDEOGRAPH
+ 0x914A: 0x9077, //CJK UNIFIED IDEOGRAPH
+ 0x914B: 0x92AD, //CJK UNIFIED IDEOGRAPH
+ 0x914C: 0x9291, //CJK UNIFIED IDEOGRAPH
+ 0x914D: 0x9583, //CJK UNIFIED IDEOGRAPH
+ 0x914E: 0x9BAE, //CJK UNIFIED IDEOGRAPH
+ 0x914F: 0x524D, //CJK UNIFIED IDEOGRAPH
+ 0x9150: 0x5584, //CJK UNIFIED IDEOGRAPH
+ 0x9151: 0x6F38, //CJK UNIFIED IDEOGRAPH
+ 0x9152: 0x7136, //CJK UNIFIED IDEOGRAPH
+ 0x9153: 0x5168, //CJK UNIFIED IDEOGRAPH
+ 0x9154: 0x7985, //CJK UNIFIED IDEOGRAPH
+ 0x9155: 0x7E55, //CJK UNIFIED IDEOGRAPH
+ 0x9156: 0x81B3, //CJK UNIFIED IDEOGRAPH
+ 0x9157: 0x7CCE, //CJK UNIFIED IDEOGRAPH
+ 0x9158: 0x564C, //CJK UNIFIED IDEOGRAPH
+ 0x9159: 0x5851, //CJK UNIFIED IDEOGRAPH
+ 0x915A: 0x5CA8, //CJK UNIFIED IDEOGRAPH
+ 0x915B: 0x63AA, //CJK UNIFIED IDEOGRAPH
+ 0x915C: 0x66FE, //CJK UNIFIED IDEOGRAPH
+ 0x915D: 0x66FD, //CJK UNIFIED IDEOGRAPH
+ 0x915E: 0x695A, //CJK UNIFIED IDEOGRAPH
+ 0x915F: 0x72D9, //CJK UNIFIED IDEOGRAPH
+ 0x9160: 0x758F, //CJK UNIFIED IDEOGRAPH
+ 0x9161: 0x758E, //CJK UNIFIED IDEOGRAPH
+ 0x9162: 0x790E, //CJK UNIFIED IDEOGRAPH
+ 0x9163: 0x7956, //CJK UNIFIED IDEOGRAPH
+ 0x9164: 0x79DF, //CJK UNIFIED IDEOGRAPH
+ 0x9165: 0x7C97, //CJK UNIFIED IDEOGRAPH
+ 0x9166: 0x7D20, //CJK UNIFIED IDEOGRAPH
+ 0x9167: 0x7D44, //CJK UNIFIED IDEOGRAPH
+ 0x9168: 0x8607, //CJK UNIFIED IDEOGRAPH
+ 0x9169: 0x8A34, //CJK UNIFIED IDEOGRAPH
+ 0x916A: 0x963B, //CJK UNIFIED IDEOGRAPH
+ 0x916B: 0x9061, //CJK UNIFIED IDEOGRAPH
+ 0x916C: 0x9F20, //CJK UNIFIED IDEOGRAPH
+ 0x916D: 0x50E7, //CJK UNIFIED IDEOGRAPH
+ 0x916E: 0x5275, //CJK UNIFIED IDEOGRAPH
+ 0x916F: 0x53CC, //CJK UNIFIED IDEOGRAPH
+ 0x9170: 0x53E2, //CJK UNIFIED IDEOGRAPH
+ 0x9171: 0x5009, //CJK UNIFIED IDEOGRAPH
+ 0x9172: 0x55AA, //CJK UNIFIED IDEOGRAPH
+ 0x9173: 0x58EE, //CJK UNIFIED IDEOGRAPH
+ 0x9174: 0x594F, //CJK UNIFIED IDEOGRAPH
+ 0x9175: 0x723D, //CJK UNIFIED IDEOGRAPH
+ 0x9176: 0x5B8B, //CJK UNIFIED IDEOGRAPH
+ 0x9177: 0x5C64, //CJK UNIFIED IDEOGRAPH
+ 0x9178: 0x531D, //CJK UNIFIED IDEOGRAPH
+ 0x9179: 0x60E3, //CJK UNIFIED IDEOGRAPH
+ 0x917A: 0x60F3, //CJK UNIFIED IDEOGRAPH
+ 0x917B: 0x635C, //CJK UNIFIED IDEOGRAPH
+ 0x917C: 0x6383, //CJK UNIFIED IDEOGRAPH
+ 0x917D: 0x633F, //CJK UNIFIED IDEOGRAPH
+ 0x917E: 0x63BB, //CJK UNIFIED IDEOGRAPH
+ 0x9180: 0x64CD, //CJK UNIFIED IDEOGRAPH
+ 0x9181: 0x65E9, //CJK UNIFIED IDEOGRAPH
+ 0x9182: 0x66F9, //CJK UNIFIED IDEOGRAPH
+ 0x9183: 0x5DE3, //CJK UNIFIED IDEOGRAPH
+ 0x9184: 0x69CD, //CJK UNIFIED IDEOGRAPH
+ 0x9185: 0x69FD, //CJK UNIFIED IDEOGRAPH
+ 0x9186: 0x6F15, //CJK UNIFIED IDEOGRAPH
+ 0x9187: 0x71E5, //CJK UNIFIED IDEOGRAPH
+ 0x9188: 0x4E89, //CJK UNIFIED IDEOGRAPH
+ 0x9189: 0x75E9, //CJK UNIFIED IDEOGRAPH
+ 0x918A: 0x76F8, //CJK UNIFIED IDEOGRAPH
+ 0x918B: 0x7A93, //CJK UNIFIED IDEOGRAPH
+ 0x918C: 0x7CDF, //CJK UNIFIED IDEOGRAPH
+ 0x918D: 0x7DCF, //CJK UNIFIED IDEOGRAPH
+ 0x918E: 0x7D9C, //CJK UNIFIED IDEOGRAPH
+ 0x918F: 0x8061, //CJK UNIFIED IDEOGRAPH
+ 0x9190: 0x8349, //CJK UNIFIED IDEOGRAPH
+ 0x9191: 0x8358, //CJK UNIFIED IDEOGRAPH
+ 0x9192: 0x846C, //CJK UNIFIED IDEOGRAPH
+ 0x9193: 0x84BC, //CJK UNIFIED IDEOGRAPH
+ 0x9194: 0x85FB, //CJK UNIFIED IDEOGRAPH
+ 0x9195: 0x88C5, //CJK UNIFIED IDEOGRAPH
+ 0x9196: 0x8D70, //CJK UNIFIED IDEOGRAPH
+ 0x9197: 0x9001, //CJK UNIFIED IDEOGRAPH
+ 0x9198: 0x906D, //CJK UNIFIED IDEOGRAPH
+ 0x9199: 0x9397, //CJK UNIFIED IDEOGRAPH
+ 0x919A: 0x971C, //CJK UNIFIED IDEOGRAPH
+ 0x919B: 0x9A12, //CJK UNIFIED IDEOGRAPH
+ 0x919C: 0x50CF, //CJK UNIFIED IDEOGRAPH
+ 0x919D: 0x5897, //CJK UNIFIED IDEOGRAPH
+ 0x919E: 0x618E, //CJK UNIFIED IDEOGRAPH
+ 0x919F: 0x81D3, //CJK UNIFIED IDEOGRAPH
+ 0x91A0: 0x8535, //CJK UNIFIED IDEOGRAPH
+ 0x91A1: 0x8D08, //CJK UNIFIED IDEOGRAPH
+ 0x91A2: 0x9020, //CJK UNIFIED IDEOGRAPH
+ 0x91A3: 0x4FC3, //CJK UNIFIED IDEOGRAPH
+ 0x91A4: 0x5074, //CJK UNIFIED IDEOGRAPH
+ 0x91A5: 0x5247, //CJK UNIFIED IDEOGRAPH
+ 0x91A6: 0x5373, //CJK UNIFIED IDEOGRAPH
+ 0x91A7: 0x606F, //CJK UNIFIED IDEOGRAPH
+ 0x91A8: 0x6349, //CJK UNIFIED IDEOGRAPH
+ 0x91A9: 0x675F, //CJK UNIFIED IDEOGRAPH
+ 0x91AA: 0x6E2C, //CJK UNIFIED IDEOGRAPH
+ 0x91AB: 0x8DB3, //CJK UNIFIED IDEOGRAPH
+ 0x91AC: 0x901F, //CJK UNIFIED IDEOGRAPH
+ 0x91AD: 0x4FD7, //CJK UNIFIED IDEOGRAPH
+ 0x91AE: 0x5C5E, //CJK UNIFIED IDEOGRAPH
+ 0x91AF: 0x8CCA, //CJK UNIFIED IDEOGRAPH
+ 0x91B0: 0x65CF, //CJK UNIFIED IDEOGRAPH
+ 0x91B1: 0x7D9A, //CJK UNIFIED IDEOGRAPH
+ 0x91B2: 0x5352, //CJK UNIFIED IDEOGRAPH
+ 0x91B3: 0x8896, //CJK UNIFIED IDEOGRAPH
+ 0x91B4: 0x5176, //CJK UNIFIED IDEOGRAPH
+ 0x91B5: 0x63C3, //CJK UNIFIED IDEOGRAPH
+ 0x91B6: 0x5B58, //CJK UNIFIED IDEOGRAPH
+ 0x91B7: 0x5B6B, //CJK UNIFIED IDEOGRAPH
+ 0x91B8: 0x5C0A, //CJK UNIFIED IDEOGRAPH
+ 0x91B9: 0x640D, //CJK UNIFIED IDEOGRAPH
+ 0x91BA: 0x6751, //CJK UNIFIED IDEOGRAPH
+ 0x91BB: 0x905C, //CJK UNIFIED IDEOGRAPH
+ 0x91BC: 0x4ED6, //CJK UNIFIED IDEOGRAPH
+ 0x91BD: 0x591A, //CJK UNIFIED IDEOGRAPH
+ 0x91BE: 0x592A, //CJK UNIFIED IDEOGRAPH
+ 0x91BF: 0x6C70, //CJK UNIFIED IDEOGRAPH
+ 0x91C0: 0x8A51, //CJK UNIFIED IDEOGRAPH
+ 0x91C1: 0x553E, //CJK UNIFIED IDEOGRAPH
+ 0x91C2: 0x5815, //CJK UNIFIED IDEOGRAPH
+ 0x91C3: 0x59A5, //CJK UNIFIED IDEOGRAPH
+ 0x91C4: 0x60F0, //CJK UNIFIED IDEOGRAPH
+ 0x91C5: 0x6253, //CJK UNIFIED IDEOGRAPH
+ 0x91C6: 0x67C1, //CJK UNIFIED IDEOGRAPH
+ 0x91C7: 0x8235, //CJK UNIFIED IDEOGRAPH
+ 0x91C8: 0x6955, //CJK UNIFIED IDEOGRAPH
+ 0x91C9: 0x9640, //CJK UNIFIED IDEOGRAPH
+ 0x91CA: 0x99C4, //CJK UNIFIED IDEOGRAPH
+ 0x91CB: 0x9A28, //CJK UNIFIED IDEOGRAPH
+ 0x91CC: 0x4F53, //CJK UNIFIED IDEOGRAPH
+ 0x91CD: 0x5806, //CJK UNIFIED IDEOGRAPH
+ 0x91CE: 0x5BFE, //CJK UNIFIED IDEOGRAPH
+ 0x91CF: 0x8010, //CJK UNIFIED IDEOGRAPH
+ 0x91D0: 0x5CB1, //CJK UNIFIED IDEOGRAPH
+ 0x91D1: 0x5E2F, //CJK UNIFIED IDEOGRAPH
+ 0x91D2: 0x5F85, //CJK UNIFIED IDEOGRAPH
+ 0x91D3: 0x6020, //CJK UNIFIED IDEOGRAPH
+ 0x91D4: 0x614B, //CJK UNIFIED IDEOGRAPH
+ 0x91D5: 0x6234, //CJK UNIFIED IDEOGRAPH
+ 0x91D6: 0x66FF, //CJK UNIFIED IDEOGRAPH
+ 0x91D7: 0x6CF0, //CJK UNIFIED IDEOGRAPH
+ 0x91D8: 0x6EDE, //CJK UNIFIED IDEOGRAPH
+ 0x91D9: 0x80CE, //CJK UNIFIED IDEOGRAPH
+ 0x91DA: 0x817F, //CJK UNIFIED IDEOGRAPH
+ 0x91DB: 0x82D4, //CJK UNIFIED IDEOGRAPH
+ 0x91DC: 0x888B, //CJK UNIFIED IDEOGRAPH
+ 0x91DD: 0x8CB8, //CJK UNIFIED IDEOGRAPH
+ 0x91DE: 0x9000, //CJK UNIFIED IDEOGRAPH
+ 0x91DF: 0x902E, //CJK UNIFIED IDEOGRAPH
+ 0x91E0: 0x968A, //CJK UNIFIED IDEOGRAPH
+ 0x91E1: 0x9EDB, //CJK UNIFIED IDEOGRAPH
+ 0x91E2: 0x9BDB, //CJK UNIFIED IDEOGRAPH
+ 0x91E3: 0x4EE3, //CJK UNIFIED IDEOGRAPH
+ 0x91E4: 0x53F0, //CJK UNIFIED IDEOGRAPH
+ 0x91E5: 0x5927, //CJK UNIFIED IDEOGRAPH
+ 0x91E6: 0x7B2C, //CJK UNIFIED IDEOGRAPH
+ 0x91E7: 0x918D, //CJK UNIFIED IDEOGRAPH
+ 0x91E8: 0x984C, //CJK UNIFIED IDEOGRAPH
+ 0x91E9: 0x9DF9, //CJK UNIFIED IDEOGRAPH
+ 0x91EA: 0x6EDD, //CJK UNIFIED IDEOGRAPH
+ 0x91EB: 0x7027, //CJK UNIFIED IDEOGRAPH
+ 0x91EC: 0x5353, //CJK UNIFIED IDEOGRAPH
+ 0x91ED: 0x5544, //CJK UNIFIED IDEOGRAPH
+ 0x91EE: 0x5B85, //CJK UNIFIED IDEOGRAPH
+ 0x91EF: 0x6258, //CJK UNIFIED IDEOGRAPH
+ 0x91F0: 0x629E, //CJK UNIFIED IDEOGRAPH
+ 0x91F1: 0x62D3, //CJK UNIFIED IDEOGRAPH
+ 0x91F2: 0x6CA2, //CJK UNIFIED IDEOGRAPH
+ 0x91F3: 0x6FEF, //CJK UNIFIED IDEOGRAPH
+ 0x91F4: 0x7422, //CJK UNIFIED IDEOGRAPH
+ 0x91F5: 0x8A17, //CJK UNIFIED IDEOGRAPH
+ 0x91F6: 0x9438, //CJK UNIFIED IDEOGRAPH
+ 0x91F7: 0x6FC1, //CJK UNIFIED IDEOGRAPH
+ 0x91F8: 0x8AFE, //CJK UNIFIED IDEOGRAPH
+ 0x91F9: 0x8338, //CJK UNIFIED IDEOGRAPH
+ 0x91FA: 0x51E7, //CJK UNIFIED IDEOGRAPH
+ 0x91FB: 0x86F8, //CJK UNIFIED IDEOGRAPH
+ 0x91FC: 0x53EA, //CJK UNIFIED IDEOGRAPH
+ 0x9240: 0x53E9, //CJK UNIFIED IDEOGRAPH
+ 0x9241: 0x4F46, //CJK UNIFIED IDEOGRAPH
+ 0x9242: 0x9054, //CJK UNIFIED IDEOGRAPH
+ 0x9243: 0x8FB0, //CJK UNIFIED IDEOGRAPH
+ 0x9244: 0x596A, //CJK UNIFIED IDEOGRAPH
+ 0x9245: 0x8131, //CJK UNIFIED IDEOGRAPH
+ 0x9246: 0x5DFD, //CJK UNIFIED IDEOGRAPH
+ 0x9247: 0x7AEA, //CJK UNIFIED IDEOGRAPH
+ 0x9248: 0x8FBF, //CJK UNIFIED IDEOGRAPH
+ 0x9249: 0x68DA, //CJK UNIFIED IDEOGRAPH
+ 0x924A: 0x8C37, //CJK UNIFIED IDEOGRAPH
+ 0x924B: 0x72F8, //CJK UNIFIED IDEOGRAPH
+ 0x924C: 0x9C48, //CJK UNIFIED IDEOGRAPH
+ 0x924D: 0x6A3D, //CJK UNIFIED IDEOGRAPH
+ 0x924E: 0x8AB0, //CJK UNIFIED IDEOGRAPH
+ 0x924F: 0x4E39, //CJK UNIFIED IDEOGRAPH
+ 0x9250: 0x5358, //CJK UNIFIED IDEOGRAPH
+ 0x9251: 0x5606, //CJK UNIFIED IDEOGRAPH
+ 0x9252: 0x5766, //CJK UNIFIED IDEOGRAPH
+ 0x9253: 0x62C5, //CJK UNIFIED IDEOGRAPH
+ 0x9254: 0x63A2, //CJK UNIFIED IDEOGRAPH
+ 0x9255: 0x65E6, //CJK UNIFIED IDEOGRAPH
+ 0x9256: 0x6B4E, //CJK UNIFIED IDEOGRAPH
+ 0x9257: 0x6DE1, //CJK UNIFIED IDEOGRAPH
+ 0x9258: 0x6E5B, //CJK UNIFIED IDEOGRAPH
+ 0x9259: 0x70AD, //CJK UNIFIED IDEOGRAPH
+ 0x925A: 0x77ED, //CJK UNIFIED IDEOGRAPH
+ 0x925B: 0x7AEF, //CJK UNIFIED IDEOGRAPH
+ 0x925C: 0x7BAA, //CJK UNIFIED IDEOGRAPH
+ 0x925D: 0x7DBB, //CJK UNIFIED IDEOGRAPH
+ 0x925E: 0x803D, //CJK UNIFIED IDEOGRAPH
+ 0x925F: 0x80C6, //CJK UNIFIED IDEOGRAPH
+ 0x9260: 0x86CB, //CJK UNIFIED IDEOGRAPH
+ 0x9261: 0x8A95, //CJK UNIFIED IDEOGRAPH
+ 0x9262: 0x935B, //CJK UNIFIED IDEOGRAPH
+ 0x9263: 0x56E3, //CJK UNIFIED IDEOGRAPH
+ 0x9264: 0x58C7, //CJK UNIFIED IDEOGRAPH
+ 0x9265: 0x5F3E, //CJK UNIFIED IDEOGRAPH
+ 0x9266: 0x65AD, //CJK UNIFIED IDEOGRAPH
+ 0x9267: 0x6696, //CJK UNIFIED IDEOGRAPH
+ 0x9268: 0x6A80, //CJK UNIFIED IDEOGRAPH
+ 0x9269: 0x6BB5, //CJK UNIFIED IDEOGRAPH
+ 0x926A: 0x7537, //CJK UNIFIED IDEOGRAPH
+ 0x926B: 0x8AC7, //CJK UNIFIED IDEOGRAPH
+ 0x926C: 0x5024, //CJK UNIFIED IDEOGRAPH
+ 0x926D: 0x77E5, //CJK UNIFIED IDEOGRAPH
+ 0x926E: 0x5730, //CJK UNIFIED IDEOGRAPH
+ 0x926F: 0x5F1B, //CJK UNIFIED IDEOGRAPH
+ 0x9270: 0x6065, //CJK UNIFIED IDEOGRAPH
+ 0x9271: 0x667A, //CJK UNIFIED IDEOGRAPH
+ 0x9272: 0x6C60, //CJK UNIFIED IDEOGRAPH
+ 0x9273: 0x75F4, //CJK UNIFIED IDEOGRAPH
+ 0x9274: 0x7A1A, //CJK UNIFIED IDEOGRAPH
+ 0x9275: 0x7F6E, //CJK UNIFIED IDEOGRAPH
+ 0x9276: 0x81F4, //CJK UNIFIED IDEOGRAPH
+ 0x9277: 0x8718, //CJK UNIFIED IDEOGRAPH
+ 0x9278: 0x9045, //CJK UNIFIED IDEOGRAPH
+ 0x9279: 0x99B3, //CJK UNIFIED IDEOGRAPH
+ 0x927A: 0x7BC9, //CJK UNIFIED IDEOGRAPH
+ 0x927B: 0x755C, //CJK UNIFIED IDEOGRAPH
+ 0x927C: 0x7AF9, //CJK UNIFIED IDEOGRAPH
+ 0x927D: 0x7B51, //CJK UNIFIED IDEOGRAPH
+ 0x927E: 0x84C4, //CJK UNIFIED IDEOGRAPH
+ 0x9280: 0x9010, //CJK UNIFIED IDEOGRAPH
+ 0x9281: 0x79E9, //CJK UNIFIED IDEOGRAPH
+ 0x9282: 0x7A92, //CJK UNIFIED IDEOGRAPH
+ 0x9283: 0x8336, //CJK UNIFIED IDEOGRAPH
+ 0x9284: 0x5AE1, //CJK UNIFIED IDEOGRAPH
+ 0x9285: 0x7740, //CJK UNIFIED IDEOGRAPH
+ 0x9286: 0x4E2D, //CJK UNIFIED IDEOGRAPH
+ 0x9287: 0x4EF2, //CJK UNIFIED IDEOGRAPH
+ 0x9288: 0x5B99, //CJK UNIFIED IDEOGRAPH
+ 0x9289: 0x5FE0, //CJK UNIFIED IDEOGRAPH
+ 0x928A: 0x62BD, //CJK UNIFIED IDEOGRAPH
+ 0x928B: 0x663C, //CJK UNIFIED IDEOGRAPH
+ 0x928C: 0x67F1, //CJK UNIFIED IDEOGRAPH
+ 0x928D: 0x6CE8, //CJK UNIFIED IDEOGRAPH
+ 0x928E: 0x866B, //CJK UNIFIED IDEOGRAPH
+ 0x928F: 0x8877, //CJK UNIFIED IDEOGRAPH
+ 0x9290: 0x8A3B, //CJK UNIFIED IDEOGRAPH
+ 0x9291: 0x914E, //CJK UNIFIED IDEOGRAPH
+ 0x9292: 0x92F3, //CJK UNIFIED IDEOGRAPH
+ 0x9293: 0x99D0, //CJK UNIFIED IDEOGRAPH
+ 0x9294: 0x6A17, //CJK UNIFIED IDEOGRAPH
+ 0x9295: 0x7026, //CJK UNIFIED IDEOGRAPH
+ 0x9296: 0x732A, //CJK UNIFIED IDEOGRAPH
+ 0x9297: 0x82E7, //CJK UNIFIED IDEOGRAPH
+ 0x9298: 0x8457, //CJK UNIFIED IDEOGRAPH
+ 0x9299: 0x8CAF, //CJK UNIFIED IDEOGRAPH
+ 0x929A: 0x4E01, //CJK UNIFIED IDEOGRAPH
+ 0x929B: 0x5146, //CJK UNIFIED IDEOGRAPH
+ 0x929C: 0x51CB, //CJK UNIFIED IDEOGRAPH
+ 0x929D: 0x558B, //CJK UNIFIED IDEOGRAPH
+ 0x929E: 0x5BF5, //CJK UNIFIED IDEOGRAPH
+ 0x929F: 0x5E16, //CJK UNIFIED IDEOGRAPH
+ 0x92A0: 0x5E33, //CJK UNIFIED IDEOGRAPH
+ 0x92A1: 0x5E81, //CJK UNIFIED IDEOGRAPH
+ 0x92A2: 0x5F14, //CJK UNIFIED IDEOGRAPH
+ 0x92A3: 0x5F35, //CJK UNIFIED IDEOGRAPH
+ 0x92A4: 0x5F6B, //CJK UNIFIED IDEOGRAPH
+ 0x92A5: 0x5FB4, //CJK UNIFIED IDEOGRAPH
+ 0x92A6: 0x61F2, //CJK UNIFIED IDEOGRAPH
+ 0x92A7: 0x6311, //CJK UNIFIED IDEOGRAPH
+ 0x92A8: 0x66A2, //CJK UNIFIED IDEOGRAPH
+ 0x92A9: 0x671D, //CJK UNIFIED IDEOGRAPH
+ 0x92AA: 0x6F6E, //CJK UNIFIED IDEOGRAPH
+ 0x92AB: 0x7252, //CJK UNIFIED IDEOGRAPH
+ 0x92AC: 0x753A, //CJK UNIFIED IDEOGRAPH
+ 0x92AD: 0x773A, //CJK UNIFIED IDEOGRAPH
+ 0x92AE: 0x8074, //CJK UNIFIED IDEOGRAPH
+ 0x92AF: 0x8139, //CJK UNIFIED IDEOGRAPH
+ 0x92B0: 0x8178, //CJK UNIFIED IDEOGRAPH
+ 0x92B1: 0x8776, //CJK UNIFIED IDEOGRAPH
+ 0x92B2: 0x8ABF, //CJK UNIFIED IDEOGRAPH
+ 0x92B3: 0x8ADC, //CJK UNIFIED IDEOGRAPH
+ 0x92B4: 0x8D85, //CJK UNIFIED IDEOGRAPH
+ 0x92B5: 0x8DF3, //CJK UNIFIED IDEOGRAPH
+ 0x92B6: 0x929A, //CJK UNIFIED IDEOGRAPH
+ 0x92B7: 0x9577, //CJK UNIFIED IDEOGRAPH
+ 0x92B8: 0x9802, //CJK UNIFIED IDEOGRAPH
+ 0x92B9: 0x9CE5, //CJK UNIFIED IDEOGRAPH
+ 0x92BA: 0x52C5, //CJK UNIFIED IDEOGRAPH
+ 0x92BB: 0x6357, //CJK UNIFIED IDEOGRAPH
+ 0x92BC: 0x76F4, //CJK UNIFIED IDEOGRAPH
+ 0x92BD: 0x6715, //CJK UNIFIED IDEOGRAPH
+ 0x92BE: 0x6C88, //CJK UNIFIED IDEOGRAPH
+ 0x92BF: 0x73CD, //CJK UNIFIED IDEOGRAPH
+ 0x92C0: 0x8CC3, //CJK UNIFIED IDEOGRAPH
+ 0x92C1: 0x93AE, //CJK UNIFIED IDEOGRAPH
+ 0x92C2: 0x9673, //CJK UNIFIED IDEOGRAPH
+ 0x92C3: 0x6D25, //CJK UNIFIED IDEOGRAPH
+ 0x92C4: 0x589C, //CJK UNIFIED IDEOGRAPH
+ 0x92C5: 0x690E, //CJK UNIFIED IDEOGRAPH
+ 0x92C6: 0x69CC, //CJK UNIFIED IDEOGRAPH
+ 0x92C7: 0x8FFD, //CJK UNIFIED IDEOGRAPH
+ 0x92C8: 0x939A, //CJK UNIFIED IDEOGRAPH
+ 0x92C9: 0x75DB, //CJK UNIFIED IDEOGRAPH
+ 0x92CA: 0x901A, //CJK UNIFIED IDEOGRAPH
+ 0x92CB: 0x585A, //CJK UNIFIED IDEOGRAPH
+ 0x92CC: 0x6802, //CJK UNIFIED IDEOGRAPH
+ 0x92CD: 0x63B4, //CJK UNIFIED IDEOGRAPH
+ 0x92CE: 0x69FB, //CJK UNIFIED IDEOGRAPH
+ 0x92CF: 0x4F43, //CJK UNIFIED IDEOGRAPH
+ 0x92D0: 0x6F2C, //CJK UNIFIED IDEOGRAPH
+ 0x92D1: 0x67D8, //CJK UNIFIED IDEOGRAPH
+ 0x92D2: 0x8FBB, //CJK UNIFIED IDEOGRAPH
+ 0x92D3: 0x8526, //CJK UNIFIED IDEOGRAPH
+ 0x92D4: 0x7DB4, //CJK UNIFIED IDEOGRAPH
+ 0x92D5: 0x9354, //CJK UNIFIED IDEOGRAPH
+ 0x92D6: 0x693F, //CJK UNIFIED IDEOGRAPH
+ 0x92D7: 0x6F70, //CJK UNIFIED IDEOGRAPH
+ 0x92D8: 0x576A, //CJK UNIFIED IDEOGRAPH
+ 0x92D9: 0x58F7, //CJK UNIFIED IDEOGRAPH
+ 0x92DA: 0x5B2C, //CJK UNIFIED IDEOGRAPH
+ 0x92DB: 0x7D2C, //CJK UNIFIED IDEOGRAPH
+ 0x92DC: 0x722A, //CJK UNIFIED IDEOGRAPH
+ 0x92DD: 0x540A, //CJK UNIFIED IDEOGRAPH
+ 0x92DE: 0x91E3, //CJK UNIFIED IDEOGRAPH
+ 0x92DF: 0x9DB4, //CJK UNIFIED IDEOGRAPH
+ 0x92E0: 0x4EAD, //CJK UNIFIED IDEOGRAPH
+ 0x92E1: 0x4F4E, //CJK UNIFIED IDEOGRAPH
+ 0x92E2: 0x505C, //CJK UNIFIED IDEOGRAPH
+ 0x92E3: 0x5075, //CJK UNIFIED IDEOGRAPH
+ 0x92E4: 0x5243, //CJK UNIFIED IDEOGRAPH
+ 0x92E5: 0x8C9E, //CJK UNIFIED IDEOGRAPH
+ 0x92E6: 0x5448, //CJK UNIFIED IDEOGRAPH
+ 0x92E7: 0x5824, //CJK UNIFIED IDEOGRAPH
+ 0x92E8: 0x5B9A, //CJK UNIFIED IDEOGRAPH
+ 0x92E9: 0x5E1D, //CJK UNIFIED IDEOGRAPH
+ 0x92EA: 0x5E95, //CJK UNIFIED IDEOGRAPH
+ 0x92EB: 0x5EAD, //CJK UNIFIED IDEOGRAPH
+ 0x92EC: 0x5EF7, //CJK UNIFIED IDEOGRAPH
+ 0x92ED: 0x5F1F, //CJK UNIFIED IDEOGRAPH
+ 0x92EE: 0x608C, //CJK UNIFIED IDEOGRAPH
+ 0x92EF: 0x62B5, //CJK UNIFIED IDEOGRAPH
+ 0x92F0: 0x633A, //CJK UNIFIED IDEOGRAPH
+ 0x92F1: 0x63D0, //CJK UNIFIED IDEOGRAPH
+ 0x92F2: 0x68AF, //CJK UNIFIED IDEOGRAPH
+ 0x92F3: 0x6C40, //CJK UNIFIED IDEOGRAPH
+ 0x92F4: 0x7887, //CJK UNIFIED IDEOGRAPH
+ 0x92F5: 0x798E, //CJK UNIFIED IDEOGRAPH
+ 0x92F6: 0x7A0B, //CJK UNIFIED IDEOGRAPH
+ 0x92F7: 0x7DE0, //CJK UNIFIED IDEOGRAPH
+ 0x92F8: 0x8247, //CJK UNIFIED IDEOGRAPH
+ 0x92F9: 0x8A02, //CJK UNIFIED IDEOGRAPH
+ 0x92FA: 0x8AE6, //CJK UNIFIED IDEOGRAPH
+ 0x92FB: 0x8E44, //CJK UNIFIED IDEOGRAPH
+ 0x92FC: 0x9013, //CJK UNIFIED IDEOGRAPH
+ 0x9340: 0x90B8, //CJK UNIFIED IDEOGRAPH
+ 0x9341: 0x912D, //CJK UNIFIED IDEOGRAPH
+ 0x9342: 0x91D8, //CJK UNIFIED IDEOGRAPH
+ 0x9343: 0x9F0E, //CJK UNIFIED IDEOGRAPH
+ 0x9344: 0x6CE5, //CJK UNIFIED IDEOGRAPH
+ 0x9345: 0x6458, //CJK UNIFIED IDEOGRAPH
+ 0x9346: 0x64E2, //CJK UNIFIED IDEOGRAPH
+ 0x9347: 0x6575, //CJK UNIFIED IDEOGRAPH
+ 0x9348: 0x6EF4, //CJK UNIFIED IDEOGRAPH
+ 0x9349: 0x7684, //CJK UNIFIED IDEOGRAPH
+ 0x934A: 0x7B1B, //CJK UNIFIED IDEOGRAPH
+ 0x934B: 0x9069, //CJK UNIFIED IDEOGRAPH
+ 0x934C: 0x93D1, //CJK UNIFIED IDEOGRAPH
+ 0x934D: 0x6EBA, //CJK UNIFIED IDEOGRAPH
+ 0x934E: 0x54F2, //CJK UNIFIED IDEOGRAPH
+ 0x934F: 0x5FB9, //CJK UNIFIED IDEOGRAPH
+ 0x9350: 0x64A4, //CJK UNIFIED IDEOGRAPH
+ 0x9351: 0x8F4D, //CJK UNIFIED IDEOGRAPH
+ 0x9352: 0x8FED, //CJK UNIFIED IDEOGRAPH
+ 0x9353: 0x9244, //CJK UNIFIED IDEOGRAPH
+ 0x9354: 0x5178, //CJK UNIFIED IDEOGRAPH
+ 0x9355: 0x586B, //CJK UNIFIED IDEOGRAPH
+ 0x9356: 0x5929, //CJK UNIFIED IDEOGRAPH
+ 0x9357: 0x5C55, //CJK UNIFIED IDEOGRAPH
+ 0x9358: 0x5E97, //CJK UNIFIED IDEOGRAPH
+ 0x9359: 0x6DFB, //CJK UNIFIED IDEOGRAPH
+ 0x935A: 0x7E8F, //CJK UNIFIED IDEOGRAPH
+ 0x935B: 0x751C, //CJK UNIFIED IDEOGRAPH
+ 0x935C: 0x8CBC, //CJK UNIFIED IDEOGRAPH
+ 0x935D: 0x8EE2, //CJK UNIFIED IDEOGRAPH
+ 0x935E: 0x985B, //CJK UNIFIED IDEOGRAPH
+ 0x935F: 0x70B9, //CJK UNIFIED IDEOGRAPH
+ 0x9360: 0x4F1D, //CJK UNIFIED IDEOGRAPH
+ 0x9361: 0x6BBF, //CJK UNIFIED IDEOGRAPH
+ 0x9362: 0x6FB1, //CJK UNIFIED IDEOGRAPH
+ 0x9363: 0x7530, //CJK UNIFIED IDEOGRAPH
+ 0x9364: 0x96FB, //CJK UNIFIED IDEOGRAPH
+ 0x9365: 0x514E, //CJK UNIFIED IDEOGRAPH
+ 0x9366: 0x5410, //CJK UNIFIED IDEOGRAPH
+ 0x9367: 0x5835, //CJK UNIFIED IDEOGRAPH
+ 0x9368: 0x5857, //CJK UNIFIED IDEOGRAPH
+ 0x9369: 0x59AC, //CJK UNIFIED IDEOGRAPH
+ 0x936A: 0x5C60, //CJK UNIFIED IDEOGRAPH
+ 0x936B: 0x5F92, //CJK UNIFIED IDEOGRAPH
+ 0x936C: 0x6597, //CJK UNIFIED IDEOGRAPH
+ 0x936D: 0x675C, //CJK UNIFIED IDEOGRAPH
+ 0x936E: 0x6E21, //CJK UNIFIED IDEOGRAPH
+ 0x936F: 0x767B, //CJK UNIFIED IDEOGRAPH
+ 0x9370: 0x83DF, //CJK UNIFIED IDEOGRAPH
+ 0x9371: 0x8CED, //CJK UNIFIED IDEOGRAPH
+ 0x9372: 0x9014, //CJK UNIFIED IDEOGRAPH
+ 0x9373: 0x90FD, //CJK UNIFIED IDEOGRAPH
+ 0x9374: 0x934D, //CJK UNIFIED IDEOGRAPH
+ 0x9375: 0x7825, //CJK UNIFIED IDEOGRAPH
+ 0x9376: 0x783A, //CJK UNIFIED IDEOGRAPH
+ 0x9377: 0x52AA, //CJK UNIFIED IDEOGRAPH
+ 0x9378: 0x5EA6, //CJK UNIFIED IDEOGRAPH
+ 0x9379: 0x571F, //CJK UNIFIED IDEOGRAPH
+ 0x937A: 0x5974, //CJK UNIFIED IDEOGRAPH
+ 0x937B: 0x6012, //CJK UNIFIED IDEOGRAPH
+ 0x937C: 0x5012, //CJK UNIFIED IDEOGRAPH
+ 0x937D: 0x515A, //CJK UNIFIED IDEOGRAPH
+ 0x937E: 0x51AC, //CJK UNIFIED IDEOGRAPH
+ 0x9380: 0x51CD, //CJK UNIFIED IDEOGRAPH
+ 0x9381: 0x5200, //CJK UNIFIED IDEOGRAPH
+ 0x9382: 0x5510, //CJK UNIFIED IDEOGRAPH
+ 0x9383: 0x5854, //CJK UNIFIED IDEOGRAPH
+ 0x9384: 0x5858, //CJK UNIFIED IDEOGRAPH
+ 0x9385: 0x5957, //CJK UNIFIED IDEOGRAPH
+ 0x9386: 0x5B95, //CJK UNIFIED IDEOGRAPH
+ 0x9387: 0x5CF6, //CJK UNIFIED IDEOGRAPH
+ 0x9388: 0x5D8B, //CJK UNIFIED IDEOGRAPH
+ 0x9389: 0x60BC, //CJK UNIFIED IDEOGRAPH
+ 0x938A: 0x6295, //CJK UNIFIED IDEOGRAPH
+ 0x938B: 0x642D, //CJK UNIFIED IDEOGRAPH
+ 0x938C: 0x6771, //CJK UNIFIED IDEOGRAPH
+ 0x938D: 0x6843, //CJK UNIFIED IDEOGRAPH
+ 0x938E: 0x68BC, //CJK UNIFIED IDEOGRAPH
+ 0x938F: 0x68DF, //CJK UNIFIED IDEOGRAPH
+ 0x9390: 0x76D7, //CJK UNIFIED IDEOGRAPH
+ 0x9391: 0x6DD8, //CJK UNIFIED IDEOGRAPH
+ 0x9392: 0x6E6F, //CJK UNIFIED IDEOGRAPH
+ 0x9393: 0x6D9B, //CJK UNIFIED IDEOGRAPH
+ 0x9394: 0x706F, //CJK UNIFIED IDEOGRAPH
+ 0x9395: 0x71C8, //CJK UNIFIED IDEOGRAPH
+ 0x9396: 0x5F53, //CJK UNIFIED IDEOGRAPH
+ 0x9397: 0x75D8, //CJK UNIFIED IDEOGRAPH
+ 0x9398: 0x7977, //CJK UNIFIED IDEOGRAPH
+ 0x9399: 0x7B49, //CJK UNIFIED IDEOGRAPH
+ 0x939A: 0x7B54, //CJK UNIFIED IDEOGRAPH
+ 0x939B: 0x7B52, //CJK UNIFIED IDEOGRAPH
+ 0x939C: 0x7CD6, //CJK UNIFIED IDEOGRAPH
+ 0x939D: 0x7D71, //CJK UNIFIED IDEOGRAPH
+ 0x939E: 0x5230, //CJK UNIFIED IDEOGRAPH
+ 0x939F: 0x8463, //CJK UNIFIED IDEOGRAPH
+ 0x93A0: 0x8569, //CJK UNIFIED IDEOGRAPH
+ 0x93A1: 0x85E4, //CJK UNIFIED IDEOGRAPH
+ 0x93A2: 0x8A0E, //CJK UNIFIED IDEOGRAPH
+ 0x93A3: 0x8B04, //CJK UNIFIED IDEOGRAPH
+ 0x93A4: 0x8C46, //CJK UNIFIED IDEOGRAPH
+ 0x93A5: 0x8E0F, //CJK UNIFIED IDEOGRAPH
+ 0x93A6: 0x9003, //CJK UNIFIED IDEOGRAPH
+ 0x93A7: 0x900F, //CJK UNIFIED IDEOGRAPH
+ 0x93A8: 0x9419, //CJK UNIFIED IDEOGRAPH
+ 0x93A9: 0x9676, //CJK UNIFIED IDEOGRAPH
+ 0x93AA: 0x982D, //CJK UNIFIED IDEOGRAPH
+ 0x93AB: 0x9A30, //CJK UNIFIED IDEOGRAPH
+ 0x93AC: 0x95D8, //CJK UNIFIED IDEOGRAPH
+ 0x93AD: 0x50CD, //CJK UNIFIED IDEOGRAPH
+ 0x93AE: 0x52D5, //CJK UNIFIED IDEOGRAPH
+ 0x93AF: 0x540C, //CJK UNIFIED IDEOGRAPH
+ 0x93B0: 0x5802, //CJK UNIFIED IDEOGRAPH
+ 0x93B1: 0x5C0E, //CJK UNIFIED IDEOGRAPH
+ 0x93B2: 0x61A7, //CJK UNIFIED IDEOGRAPH
+ 0x93B3: 0x649E, //CJK UNIFIED IDEOGRAPH
+ 0x93B4: 0x6D1E, //CJK UNIFIED IDEOGRAPH
+ 0x93B5: 0x77B3, //CJK UNIFIED IDEOGRAPH
+ 0x93B6: 0x7AE5, //CJK UNIFIED IDEOGRAPH
+ 0x93B7: 0x80F4, //CJK UNIFIED IDEOGRAPH
+ 0x93B8: 0x8404, //CJK UNIFIED IDEOGRAPH
+ 0x93B9: 0x9053, //CJK UNIFIED IDEOGRAPH
+ 0x93BA: 0x9285, //CJK UNIFIED IDEOGRAPH
+ 0x93BB: 0x5CE0, //CJK UNIFIED IDEOGRAPH
+ 0x93BC: 0x9D07, //CJK UNIFIED IDEOGRAPH
+ 0x93BD: 0x533F, //CJK UNIFIED IDEOGRAPH
+ 0x93BE: 0x5F97, //CJK UNIFIED IDEOGRAPH
+ 0x93BF: 0x5FB3, //CJK UNIFIED IDEOGRAPH
+ 0x93C0: 0x6D9C, //CJK UNIFIED IDEOGRAPH
+ 0x93C1: 0x7279, //CJK UNIFIED IDEOGRAPH
+ 0x93C2: 0x7763, //CJK UNIFIED IDEOGRAPH
+ 0x93C3: 0x79BF, //CJK UNIFIED IDEOGRAPH
+ 0x93C4: 0x7BE4, //CJK UNIFIED IDEOGRAPH
+ 0x93C5: 0x6BD2, //CJK UNIFIED IDEOGRAPH
+ 0x93C6: 0x72EC, //CJK UNIFIED IDEOGRAPH
+ 0x93C7: 0x8AAD, //CJK UNIFIED IDEOGRAPH
+ 0x93C8: 0x6803, //CJK UNIFIED IDEOGRAPH
+ 0x93C9: 0x6A61, //CJK UNIFIED IDEOGRAPH
+ 0x93CA: 0x51F8, //CJK UNIFIED IDEOGRAPH
+ 0x93CB: 0x7A81, //CJK UNIFIED IDEOGRAPH
+ 0x93CC: 0x6934, //CJK UNIFIED IDEOGRAPH
+ 0x93CD: 0x5C4A, //CJK UNIFIED IDEOGRAPH
+ 0x93CE: 0x9CF6, //CJK UNIFIED IDEOGRAPH
+ 0x93CF: 0x82EB, //CJK UNIFIED IDEOGRAPH
+ 0x93D0: 0x5BC5, //CJK UNIFIED IDEOGRAPH
+ 0x93D1: 0x9149, //CJK UNIFIED IDEOGRAPH
+ 0x93D2: 0x701E, //CJK UNIFIED IDEOGRAPH
+ 0x93D3: 0x5678, //CJK UNIFIED IDEOGRAPH
+ 0x93D4: 0x5C6F, //CJK UNIFIED IDEOGRAPH
+ 0x93D5: 0x60C7, //CJK UNIFIED IDEOGRAPH
+ 0x93D6: 0x6566, //CJK UNIFIED IDEOGRAPH
+ 0x93D7: 0x6C8C, //CJK UNIFIED IDEOGRAPH
+ 0x93D8: 0x8C5A, //CJK UNIFIED IDEOGRAPH
+ 0x93D9: 0x9041, //CJK UNIFIED IDEOGRAPH
+ 0x93DA: 0x9813, //CJK UNIFIED IDEOGRAPH
+ 0x93DB: 0x5451, //CJK UNIFIED IDEOGRAPH
+ 0x93DC: 0x66C7, //CJK UNIFIED IDEOGRAPH
+ 0x93DD: 0x920D, //CJK UNIFIED IDEOGRAPH
+ 0x93DE: 0x5948, //CJK UNIFIED IDEOGRAPH
+ 0x93DF: 0x90A3, //CJK UNIFIED IDEOGRAPH
+ 0x93E0: 0x5185, //CJK UNIFIED IDEOGRAPH
+ 0x93E1: 0x4E4D, //CJK UNIFIED IDEOGRAPH
+ 0x93E2: 0x51EA, //CJK UNIFIED IDEOGRAPH
+ 0x93E3: 0x8599, //CJK UNIFIED IDEOGRAPH
+ 0x93E4: 0x8B0E, //CJK UNIFIED IDEOGRAPH
+ 0x93E5: 0x7058, //CJK UNIFIED IDEOGRAPH
+ 0x93E6: 0x637A, //CJK UNIFIED IDEOGRAPH
+ 0x93E7: 0x934B, //CJK UNIFIED IDEOGRAPH
+ 0x93E8: 0x6962, //CJK UNIFIED IDEOGRAPH
+ 0x93E9: 0x99B4, //CJK UNIFIED IDEOGRAPH
+ 0x93EA: 0x7E04, //CJK UNIFIED IDEOGRAPH
+ 0x93EB: 0x7577, //CJK UNIFIED IDEOGRAPH
+ 0x93EC: 0x5357, //CJK UNIFIED IDEOGRAPH
+ 0x93ED: 0x6960, //CJK UNIFIED IDEOGRAPH
+ 0x93EE: 0x8EDF, //CJK UNIFIED IDEOGRAPH
+ 0x93EF: 0x96E3, //CJK UNIFIED IDEOGRAPH
+ 0x93F0: 0x6C5D, //CJK UNIFIED IDEOGRAPH
+ 0x93F1: 0x4E8C, //CJK UNIFIED IDEOGRAPH
+ 0x93F2: 0x5C3C, //CJK UNIFIED IDEOGRAPH
+ 0x93F3: 0x5F10, //CJK UNIFIED IDEOGRAPH
+ 0x93F4: 0x8FE9, //CJK UNIFIED IDEOGRAPH
+ 0x93F5: 0x5302, //CJK UNIFIED IDEOGRAPH
+ 0x93F6: 0x8CD1, //CJK UNIFIED IDEOGRAPH
+ 0x93F7: 0x8089, //CJK UNIFIED IDEOGRAPH
+ 0x93F8: 0x8679, //CJK UNIFIED IDEOGRAPH
+ 0x93F9: 0x5EFF, //CJK UNIFIED IDEOGRAPH
+ 0x93FA: 0x65E5, //CJK UNIFIED IDEOGRAPH
+ 0x93FB: 0x4E73, //CJK UNIFIED IDEOGRAPH
+ 0x93FC: 0x5165, //CJK UNIFIED IDEOGRAPH
+ 0x9440: 0x5982, //CJK UNIFIED IDEOGRAPH
+ 0x9441: 0x5C3F, //CJK UNIFIED IDEOGRAPH
+ 0x9442: 0x97EE, //CJK UNIFIED IDEOGRAPH
+ 0x9443: 0x4EFB, //CJK UNIFIED IDEOGRAPH
+ 0x9444: 0x598A, //CJK UNIFIED IDEOGRAPH
+ 0x9445: 0x5FCD, //CJK UNIFIED IDEOGRAPH
+ 0x9446: 0x8A8D, //CJK UNIFIED IDEOGRAPH
+ 0x9447: 0x6FE1, //CJK UNIFIED IDEOGRAPH
+ 0x9448: 0x79B0, //CJK UNIFIED IDEOGRAPH
+ 0x9449: 0x7962, //CJK UNIFIED IDEOGRAPH
+ 0x944A: 0x5BE7, //CJK UNIFIED IDEOGRAPH
+ 0x944B: 0x8471, //CJK UNIFIED IDEOGRAPH
+ 0x944C: 0x732B, //CJK UNIFIED IDEOGRAPH
+ 0x944D: 0x71B1, //CJK UNIFIED IDEOGRAPH
+ 0x944E: 0x5E74, //CJK UNIFIED IDEOGRAPH
+ 0x944F: 0x5FF5, //CJK UNIFIED IDEOGRAPH
+ 0x9450: 0x637B, //CJK UNIFIED IDEOGRAPH
+ 0x9451: 0x649A, //CJK UNIFIED IDEOGRAPH
+ 0x9452: 0x71C3, //CJK UNIFIED IDEOGRAPH
+ 0x9453: 0x7C98, //CJK UNIFIED IDEOGRAPH
+ 0x9454: 0x4E43, //CJK UNIFIED IDEOGRAPH
+ 0x9455: 0x5EFC, //CJK UNIFIED IDEOGRAPH
+ 0x9456: 0x4E4B, //CJK UNIFIED IDEOGRAPH
+ 0x9457: 0x57DC, //CJK UNIFIED IDEOGRAPH
+ 0x9458: 0x56A2, //CJK UNIFIED IDEOGRAPH
+ 0x9459: 0x60A9, //CJK UNIFIED IDEOGRAPH
+ 0x945A: 0x6FC3, //CJK UNIFIED IDEOGRAPH
+ 0x945B: 0x7D0D, //CJK UNIFIED IDEOGRAPH
+ 0x945C: 0x80FD, //CJK UNIFIED IDEOGRAPH
+ 0x945D: 0x8133, //CJK UNIFIED IDEOGRAPH
+ 0x945E: 0x81BF, //CJK UNIFIED IDEOGRAPH
+ 0x945F: 0x8FB2, //CJK UNIFIED IDEOGRAPH
+ 0x9460: 0x8997, //CJK UNIFIED IDEOGRAPH
+ 0x9461: 0x86A4, //CJK UNIFIED IDEOGRAPH
+ 0x9462: 0x5DF4, //CJK UNIFIED IDEOGRAPH
+ 0x9463: 0x628A, //CJK UNIFIED IDEOGRAPH
+ 0x9464: 0x64AD, //CJK UNIFIED IDEOGRAPH
+ 0x9465: 0x8987, //CJK UNIFIED IDEOGRAPH
+ 0x9466: 0x6777, //CJK UNIFIED IDEOGRAPH
+ 0x9467: 0x6CE2, //CJK UNIFIED IDEOGRAPH
+ 0x9468: 0x6D3E, //CJK UNIFIED IDEOGRAPH
+ 0x9469: 0x7436, //CJK UNIFIED IDEOGRAPH
+ 0x946A: 0x7834, //CJK UNIFIED IDEOGRAPH
+ 0x946B: 0x5A46, //CJK UNIFIED IDEOGRAPH
+ 0x946C: 0x7F75, //CJK UNIFIED IDEOGRAPH
+ 0x946D: 0x82AD, //CJK UNIFIED IDEOGRAPH
+ 0x946E: 0x99AC, //CJK UNIFIED IDEOGRAPH
+ 0x946F: 0x4FF3, //CJK UNIFIED IDEOGRAPH
+ 0x9470: 0x5EC3, //CJK UNIFIED IDEOGRAPH
+ 0x9471: 0x62DD, //CJK UNIFIED IDEOGRAPH
+ 0x9472: 0x6392, //CJK UNIFIED IDEOGRAPH
+ 0x9473: 0x6557, //CJK UNIFIED IDEOGRAPH
+ 0x9474: 0x676F, //CJK UNIFIED IDEOGRAPH
+ 0x9475: 0x76C3, //CJK UNIFIED IDEOGRAPH
+ 0x9476: 0x724C, //CJK UNIFIED IDEOGRAPH
+ 0x9477: 0x80CC, //CJK UNIFIED IDEOGRAPH
+ 0x9478: 0x80BA, //CJK UNIFIED IDEOGRAPH
+ 0x9479: 0x8F29, //CJK UNIFIED IDEOGRAPH
+ 0x947A: 0x914D, //CJK UNIFIED IDEOGRAPH
+ 0x947B: 0x500D, //CJK UNIFIED IDEOGRAPH
+ 0x947C: 0x57F9, //CJK UNIFIED IDEOGRAPH
+ 0x947D: 0x5A92, //CJK UNIFIED IDEOGRAPH
+ 0x947E: 0x6885, //CJK UNIFIED IDEOGRAPH
+ 0x9480: 0x6973, //CJK UNIFIED IDEOGRAPH
+ 0x9481: 0x7164, //CJK UNIFIED IDEOGRAPH
+ 0x9482: 0x72FD, //CJK UNIFIED IDEOGRAPH
+ 0x9483: 0x8CB7, //CJK UNIFIED IDEOGRAPH
+ 0x9484: 0x58F2, //CJK UNIFIED IDEOGRAPH
+ 0x9485: 0x8CE0, //CJK UNIFIED IDEOGRAPH
+ 0x9486: 0x966A, //CJK UNIFIED IDEOGRAPH
+ 0x9487: 0x9019, //CJK UNIFIED IDEOGRAPH
+ 0x9488: 0x877F, //CJK UNIFIED IDEOGRAPH
+ 0x9489: 0x79E4, //CJK UNIFIED IDEOGRAPH
+ 0x948A: 0x77E7, //CJK UNIFIED IDEOGRAPH
+ 0x948B: 0x8429, //CJK UNIFIED IDEOGRAPH
+ 0x948C: 0x4F2F, //CJK UNIFIED IDEOGRAPH
+ 0x948D: 0x5265, //CJK UNIFIED IDEOGRAPH
+ 0x948E: 0x535A, //CJK UNIFIED IDEOGRAPH
+ 0x948F: 0x62CD, //CJK UNIFIED IDEOGRAPH
+ 0x9490: 0x67CF, //CJK UNIFIED IDEOGRAPH
+ 0x9491: 0x6CCA, //CJK UNIFIED IDEOGRAPH
+ 0x9492: 0x767D, //CJK UNIFIED IDEOGRAPH
+ 0x9493: 0x7B94, //CJK UNIFIED IDEOGRAPH
+ 0x9494: 0x7C95, //CJK UNIFIED IDEOGRAPH
+ 0x9495: 0x8236, //CJK UNIFIED IDEOGRAPH
+ 0x9496: 0x8584, //CJK UNIFIED IDEOGRAPH
+ 0x9497: 0x8FEB, //CJK UNIFIED IDEOGRAPH
+ 0x9498: 0x66DD, //CJK UNIFIED IDEOGRAPH
+ 0x9499: 0x6F20, //CJK UNIFIED IDEOGRAPH
+ 0x949A: 0x7206, //CJK UNIFIED IDEOGRAPH
+ 0x949B: 0x7E1B, //CJK UNIFIED IDEOGRAPH
+ 0x949C: 0x83AB, //CJK UNIFIED IDEOGRAPH
+ 0x949D: 0x99C1, //CJK UNIFIED IDEOGRAPH
+ 0x949E: 0x9EA6, //CJK UNIFIED IDEOGRAPH
+ 0x949F: 0x51FD, //CJK UNIFIED IDEOGRAPH
+ 0x94A0: 0x7BB1, //CJK UNIFIED IDEOGRAPH
+ 0x94A1: 0x7872, //CJK UNIFIED IDEOGRAPH
+ 0x94A2: 0x7BB8, //CJK UNIFIED IDEOGRAPH
+ 0x94A3: 0x8087, //CJK UNIFIED IDEOGRAPH
+ 0x94A4: 0x7B48, //CJK UNIFIED IDEOGRAPH
+ 0x94A5: 0x6AE8, //CJK UNIFIED IDEOGRAPH
+ 0x94A6: 0x5E61, //CJK UNIFIED IDEOGRAPH
+ 0x94A7: 0x808C, //CJK UNIFIED IDEOGRAPH
+ 0x94A8: 0x7551, //CJK UNIFIED IDEOGRAPH
+ 0x94A9: 0x7560, //CJK UNIFIED IDEOGRAPH
+ 0x94AA: 0x516B, //CJK UNIFIED IDEOGRAPH
+ 0x94AB: 0x9262, //CJK UNIFIED IDEOGRAPH
+ 0x94AC: 0x6E8C, //CJK UNIFIED IDEOGRAPH
+ 0x94AD: 0x767A, //CJK UNIFIED IDEOGRAPH
+ 0x94AE: 0x9197, //CJK UNIFIED IDEOGRAPH
+ 0x94AF: 0x9AEA, //CJK UNIFIED IDEOGRAPH
+ 0x94B0: 0x4F10, //CJK UNIFIED IDEOGRAPH
+ 0x94B1: 0x7F70, //CJK UNIFIED IDEOGRAPH
+ 0x94B2: 0x629C, //CJK UNIFIED IDEOGRAPH
+ 0x94B3: 0x7B4F, //CJK UNIFIED IDEOGRAPH
+ 0x94B4: 0x95A5, //CJK UNIFIED IDEOGRAPH
+ 0x94B5: 0x9CE9, //CJK UNIFIED IDEOGRAPH
+ 0x94B6: 0x567A, //CJK UNIFIED IDEOGRAPH
+ 0x94B7: 0x5859, //CJK UNIFIED IDEOGRAPH
+ 0x94B8: 0x86E4, //CJK UNIFIED IDEOGRAPH
+ 0x94B9: 0x96BC, //CJK UNIFIED IDEOGRAPH
+ 0x94BA: 0x4F34, //CJK UNIFIED IDEOGRAPH
+ 0x94BB: 0x5224, //CJK UNIFIED IDEOGRAPH
+ 0x94BC: 0x534A, //CJK UNIFIED IDEOGRAPH
+ 0x94BD: 0x53CD, //CJK UNIFIED IDEOGRAPH
+ 0x94BE: 0x53DB, //CJK UNIFIED IDEOGRAPH
+ 0x94BF: 0x5E06, //CJK UNIFIED IDEOGRAPH
+ 0x94C0: 0x642C, //CJK UNIFIED IDEOGRAPH
+ 0x94C1: 0x6591, //CJK UNIFIED IDEOGRAPH
+ 0x94C2: 0x677F, //CJK UNIFIED IDEOGRAPH
+ 0x94C3: 0x6C3E, //CJK UNIFIED IDEOGRAPH
+ 0x94C4: 0x6C4E, //CJK UNIFIED IDEOGRAPH
+ 0x94C5: 0x7248, //CJK UNIFIED IDEOGRAPH
+ 0x94C6: 0x72AF, //CJK UNIFIED IDEOGRAPH
+ 0x94C7: 0x73ED, //CJK UNIFIED IDEOGRAPH
+ 0x94C8: 0x7554, //CJK UNIFIED IDEOGRAPH
+ 0x94C9: 0x7E41, //CJK UNIFIED IDEOGRAPH
+ 0x94CA: 0x822C, //CJK UNIFIED IDEOGRAPH
+ 0x94CB: 0x85E9, //CJK UNIFIED IDEOGRAPH
+ 0x94CC: 0x8CA9, //CJK UNIFIED IDEOGRAPH
+ 0x94CD: 0x7BC4, //CJK UNIFIED IDEOGRAPH
+ 0x94CE: 0x91C6, //CJK UNIFIED IDEOGRAPH
+ 0x94CF: 0x7169, //CJK UNIFIED IDEOGRAPH
+ 0x94D0: 0x9812, //CJK UNIFIED IDEOGRAPH
+ 0x94D1: 0x98EF, //CJK UNIFIED IDEOGRAPH
+ 0x94D2: 0x633D, //CJK UNIFIED IDEOGRAPH
+ 0x94D3: 0x6669, //CJK UNIFIED IDEOGRAPH
+ 0x94D4: 0x756A, //CJK UNIFIED IDEOGRAPH
+ 0x94D5: 0x76E4, //CJK UNIFIED IDEOGRAPH
+ 0x94D6: 0x78D0, //CJK UNIFIED IDEOGRAPH
+ 0x94D7: 0x8543, //CJK UNIFIED IDEOGRAPH
+ 0x94D8: 0x86EE, //CJK UNIFIED IDEOGRAPH
+ 0x94D9: 0x532A, //CJK UNIFIED IDEOGRAPH
+ 0x94DA: 0x5351, //CJK UNIFIED IDEOGRAPH
+ 0x94DB: 0x5426, //CJK UNIFIED IDEOGRAPH
+ 0x94DC: 0x5983, //CJK UNIFIED IDEOGRAPH
+ 0x94DD: 0x5E87, //CJK UNIFIED IDEOGRAPH
+ 0x94DE: 0x5F7C, //CJK UNIFIED IDEOGRAPH
+ 0x94DF: 0x60B2, //CJK UNIFIED IDEOGRAPH
+ 0x94E0: 0x6249, //CJK UNIFIED IDEOGRAPH
+ 0x94E1: 0x6279, //CJK UNIFIED IDEOGRAPH
+ 0x94E2: 0x62AB, //CJK UNIFIED IDEOGRAPH
+ 0x94E3: 0x6590, //CJK UNIFIED IDEOGRAPH
+ 0x94E4: 0x6BD4, //CJK UNIFIED IDEOGRAPH
+ 0x94E5: 0x6CCC, //CJK UNIFIED IDEOGRAPH
+ 0x94E6: 0x75B2, //CJK UNIFIED IDEOGRAPH
+ 0x94E7: 0x76AE, //CJK UNIFIED IDEOGRAPH
+ 0x94E8: 0x7891, //CJK UNIFIED IDEOGRAPH
+ 0x94E9: 0x79D8, //CJK UNIFIED IDEOGRAPH
+ 0x94EA: 0x7DCB, //CJK UNIFIED IDEOGRAPH
+ 0x94EB: 0x7F77, //CJK UNIFIED IDEOGRAPH
+ 0x94EC: 0x80A5, //CJK UNIFIED IDEOGRAPH
+ 0x94ED: 0x88AB, //CJK UNIFIED IDEOGRAPH
+ 0x94EE: 0x8AB9, //CJK UNIFIED IDEOGRAPH
+ 0x94EF: 0x8CBB, //CJK UNIFIED IDEOGRAPH
+ 0x94F0: 0x907F, //CJK UNIFIED IDEOGRAPH
+ 0x94F1: 0x975E, //CJK UNIFIED IDEOGRAPH
+ 0x94F2: 0x98DB, //CJK UNIFIED IDEOGRAPH
+ 0x94F3: 0x6A0B, //CJK UNIFIED IDEOGRAPH
+ 0x94F4: 0x7C38, //CJK UNIFIED IDEOGRAPH
+ 0x94F5: 0x5099, //CJK UNIFIED IDEOGRAPH
+ 0x94F6: 0x5C3E, //CJK UNIFIED IDEOGRAPH
+ 0x94F7: 0x5FAE, //CJK UNIFIED IDEOGRAPH
+ 0x94F8: 0x6787, //CJK UNIFIED IDEOGRAPH
+ 0x94F9: 0x6BD8, //CJK UNIFIED IDEOGRAPH
+ 0x94FA: 0x7435, //CJK UNIFIED IDEOGRAPH
+ 0x94FB: 0x7709, //CJK UNIFIED IDEOGRAPH
+ 0x94FC: 0x7F8E, //CJK UNIFIED IDEOGRAPH
+ 0x9540: 0x9F3B, //CJK UNIFIED IDEOGRAPH
+ 0x9541: 0x67CA, //CJK UNIFIED IDEOGRAPH
+ 0x9542: 0x7A17, //CJK UNIFIED IDEOGRAPH
+ 0x9543: 0x5339, //CJK UNIFIED IDEOGRAPH
+ 0x9544: 0x758B, //CJK UNIFIED IDEOGRAPH
+ 0x9545: 0x9AED, //CJK UNIFIED IDEOGRAPH
+ 0x9546: 0x5F66, //CJK UNIFIED IDEOGRAPH
+ 0x9547: 0x819D, //CJK UNIFIED IDEOGRAPH
+ 0x9548: 0x83F1, //CJK UNIFIED IDEOGRAPH
+ 0x9549: 0x8098, //CJK UNIFIED IDEOGRAPH
+ 0x954A: 0x5F3C, //CJK UNIFIED IDEOGRAPH
+ 0x954B: 0x5FC5, //CJK UNIFIED IDEOGRAPH
+ 0x954C: 0x7562, //CJK UNIFIED IDEOGRAPH
+ 0x954D: 0x7B46, //CJK UNIFIED IDEOGRAPH
+ 0x954E: 0x903C, //CJK UNIFIED IDEOGRAPH
+ 0x954F: 0x6867, //CJK UNIFIED IDEOGRAPH
+ 0x9550: 0x59EB, //CJK UNIFIED IDEOGRAPH
+ 0x9551: 0x5A9B, //CJK UNIFIED IDEOGRAPH
+ 0x9552: 0x7D10, //CJK UNIFIED IDEOGRAPH
+ 0x9553: 0x767E, //CJK UNIFIED IDEOGRAPH
+ 0x9554: 0x8B2C, //CJK UNIFIED IDEOGRAPH
+ 0x9555: 0x4FF5, //CJK UNIFIED IDEOGRAPH
+ 0x9556: 0x5F6A, //CJK UNIFIED IDEOGRAPH
+ 0x9557: 0x6A19, //CJK UNIFIED IDEOGRAPH
+ 0x9558: 0x6C37, //CJK UNIFIED IDEOGRAPH
+ 0x9559: 0x6F02, //CJK UNIFIED IDEOGRAPH
+ 0x955A: 0x74E2, //CJK UNIFIED IDEOGRAPH
+ 0x955B: 0x7968, //CJK UNIFIED IDEOGRAPH
+ 0x955C: 0x8868, //CJK UNIFIED IDEOGRAPH
+ 0x955D: 0x8A55, //CJK UNIFIED IDEOGRAPH
+ 0x955E: 0x8C79, //CJK UNIFIED IDEOGRAPH
+ 0x955F: 0x5EDF, //CJK UNIFIED IDEOGRAPH
+ 0x9560: 0x63CF, //CJK UNIFIED IDEOGRAPH
+ 0x9561: 0x75C5, //CJK UNIFIED IDEOGRAPH
+ 0x9562: 0x79D2, //CJK UNIFIED IDEOGRAPH
+ 0x9563: 0x82D7, //CJK UNIFIED IDEOGRAPH
+ 0x9564: 0x9328, //CJK UNIFIED IDEOGRAPH
+ 0x9565: 0x92F2, //CJK UNIFIED IDEOGRAPH
+ 0x9566: 0x849C, //CJK UNIFIED IDEOGRAPH
+ 0x9567: 0x86ED, //CJK UNIFIED IDEOGRAPH
+ 0x9568: 0x9C2D, //CJK UNIFIED IDEOGRAPH
+ 0x9569: 0x54C1, //CJK UNIFIED IDEOGRAPH
+ 0x956A: 0x5F6C, //CJK UNIFIED IDEOGRAPH
+ 0x956B: 0x658C, //CJK UNIFIED IDEOGRAPH
+ 0x956C: 0x6D5C, //CJK UNIFIED IDEOGRAPH
+ 0x956D: 0x7015, //CJK UNIFIED IDEOGRAPH
+ 0x956E: 0x8CA7, //CJK UNIFIED IDEOGRAPH
+ 0x956F: 0x8CD3, //CJK UNIFIED IDEOGRAPH
+ 0x9570: 0x983B, //CJK UNIFIED IDEOGRAPH
+ 0x9571: 0x654F, //CJK UNIFIED IDEOGRAPH
+ 0x9572: 0x74F6, //CJK UNIFIED IDEOGRAPH
+ 0x9573: 0x4E0D, //CJK UNIFIED IDEOGRAPH
+ 0x9574: 0x4ED8, //CJK UNIFIED IDEOGRAPH
+ 0x9575: 0x57E0, //CJK UNIFIED IDEOGRAPH
+ 0x9576: 0x592B, //CJK UNIFIED IDEOGRAPH
+ 0x9577: 0x5A66, //CJK UNIFIED IDEOGRAPH
+ 0x9578: 0x5BCC, //CJK UNIFIED IDEOGRAPH
+ 0x9579: 0x51A8, //CJK UNIFIED IDEOGRAPH
+ 0x957A: 0x5E03, //CJK UNIFIED IDEOGRAPH
+ 0x957B: 0x5E9C, //CJK UNIFIED IDEOGRAPH
+ 0x957C: 0x6016, //CJK UNIFIED IDEOGRAPH
+ 0x957D: 0x6276, //CJK UNIFIED IDEOGRAPH
+ 0x957E: 0x6577, //CJK UNIFIED IDEOGRAPH
+ 0x9580: 0x65A7, //CJK UNIFIED IDEOGRAPH
+ 0x9581: 0x666E, //CJK UNIFIED IDEOGRAPH
+ 0x9582: 0x6D6E, //CJK UNIFIED IDEOGRAPH
+ 0x9583: 0x7236, //CJK UNIFIED IDEOGRAPH
+ 0x9584: 0x7B26, //CJK UNIFIED IDEOGRAPH
+ 0x9585: 0x8150, //CJK UNIFIED IDEOGRAPH
+ 0x9586: 0x819A, //CJK UNIFIED IDEOGRAPH
+ 0x9587: 0x8299, //CJK UNIFIED IDEOGRAPH
+ 0x9588: 0x8B5C, //CJK UNIFIED IDEOGRAPH
+ 0x9589: 0x8CA0, //CJK UNIFIED IDEOGRAPH
+ 0x958A: 0x8CE6, //CJK UNIFIED IDEOGRAPH
+ 0x958B: 0x8D74, //CJK UNIFIED IDEOGRAPH
+ 0x958C: 0x961C, //CJK UNIFIED IDEOGRAPH
+ 0x958D: 0x9644, //CJK UNIFIED IDEOGRAPH
+ 0x958E: 0x4FAE, //CJK UNIFIED IDEOGRAPH
+ 0x958F: 0x64AB, //CJK UNIFIED IDEOGRAPH
+ 0x9590: 0x6B66, //CJK UNIFIED IDEOGRAPH
+ 0x9591: 0x821E, //CJK UNIFIED IDEOGRAPH
+ 0x9592: 0x8461, //CJK UNIFIED IDEOGRAPH
+ 0x9593: 0x856A, //CJK UNIFIED IDEOGRAPH
+ 0x9594: 0x90E8, //CJK UNIFIED IDEOGRAPH
+ 0x9595: 0x5C01, //CJK UNIFIED IDEOGRAPH
+ 0x9596: 0x6953, //CJK UNIFIED IDEOGRAPH
+ 0x9597: 0x98A8, //CJK UNIFIED IDEOGRAPH
+ 0x9598: 0x847A, //CJK UNIFIED IDEOGRAPH
+ 0x9599: 0x8557, //CJK UNIFIED IDEOGRAPH
+ 0x959A: 0x4F0F, //CJK UNIFIED IDEOGRAPH
+ 0x959B: 0x526F, //CJK UNIFIED IDEOGRAPH
+ 0x959C: 0x5FA9, //CJK UNIFIED IDEOGRAPH
+ 0x959D: 0x5E45, //CJK UNIFIED IDEOGRAPH
+ 0x959E: 0x670D, //CJK UNIFIED IDEOGRAPH
+ 0x959F: 0x798F, //CJK UNIFIED IDEOGRAPH
+ 0x95A0: 0x8179, //CJK UNIFIED IDEOGRAPH
+ 0x95A1: 0x8907, //CJK UNIFIED IDEOGRAPH
+ 0x95A2: 0x8986, //CJK UNIFIED IDEOGRAPH
+ 0x95A3: 0x6DF5, //CJK UNIFIED IDEOGRAPH
+ 0x95A4: 0x5F17, //CJK UNIFIED IDEOGRAPH
+ 0x95A5: 0x6255, //CJK UNIFIED IDEOGRAPH
+ 0x95A6: 0x6CB8, //CJK UNIFIED IDEOGRAPH
+ 0x95A7: 0x4ECF, //CJK UNIFIED IDEOGRAPH
+ 0x95A8: 0x7269, //CJK UNIFIED IDEOGRAPH
+ 0x95A9: 0x9B92, //CJK UNIFIED IDEOGRAPH
+ 0x95AA: 0x5206, //CJK UNIFIED IDEOGRAPH
+ 0x95AB: 0x543B, //CJK UNIFIED IDEOGRAPH
+ 0x95AC: 0x5674, //CJK UNIFIED IDEOGRAPH
+ 0x95AD: 0x58B3, //CJK UNIFIED IDEOGRAPH
+ 0x95AE: 0x61A4, //CJK UNIFIED IDEOGRAPH
+ 0x95AF: 0x626E, //CJK UNIFIED IDEOGRAPH
+ 0x95B0: 0x711A, //CJK UNIFIED IDEOGRAPH
+ 0x95B1: 0x596E, //CJK UNIFIED IDEOGRAPH
+ 0x95B2: 0x7C89, //CJK UNIFIED IDEOGRAPH
+ 0x95B3: 0x7CDE, //CJK UNIFIED IDEOGRAPH
+ 0x95B4: 0x7D1B, //CJK UNIFIED IDEOGRAPH
+ 0x95B5: 0x96F0, //CJK UNIFIED IDEOGRAPH
+ 0x95B6: 0x6587, //CJK UNIFIED IDEOGRAPH
+ 0x95B7: 0x805E, //CJK UNIFIED IDEOGRAPH
+ 0x95B8: 0x4E19, //CJK UNIFIED IDEOGRAPH
+ 0x95B9: 0x4F75, //CJK UNIFIED IDEOGRAPH
+ 0x95BA: 0x5175, //CJK UNIFIED IDEOGRAPH
+ 0x95BB: 0x5840, //CJK UNIFIED IDEOGRAPH
+ 0x95BC: 0x5E63, //CJK UNIFIED IDEOGRAPH
+ 0x95BD: 0x5E73, //CJK UNIFIED IDEOGRAPH
+ 0x95BE: 0x5F0A, //CJK UNIFIED IDEOGRAPH
+ 0x95BF: 0x67C4, //CJK UNIFIED IDEOGRAPH
+ 0x95C0: 0x4E26, //CJK UNIFIED IDEOGRAPH
+ 0x95C1: 0x853D, //CJK UNIFIED IDEOGRAPH
+ 0x95C2: 0x9589, //CJK UNIFIED IDEOGRAPH
+ 0x95C3: 0x965B, //CJK UNIFIED IDEOGRAPH
+ 0x95C4: 0x7C73, //CJK UNIFIED IDEOGRAPH
+ 0x95C5: 0x9801, //CJK UNIFIED IDEOGRAPH
+ 0x95C6: 0x50FB, //CJK UNIFIED IDEOGRAPH
+ 0x95C7: 0x58C1, //CJK UNIFIED IDEOGRAPH
+ 0x95C8: 0x7656, //CJK UNIFIED IDEOGRAPH
+ 0x95C9: 0x78A7, //CJK UNIFIED IDEOGRAPH
+ 0x95CA: 0x5225, //CJK UNIFIED IDEOGRAPH
+ 0x95CB: 0x77A5, //CJK UNIFIED IDEOGRAPH
+ 0x95CC: 0x8511, //CJK UNIFIED IDEOGRAPH
+ 0x95CD: 0x7B86, //CJK UNIFIED IDEOGRAPH
+ 0x95CE: 0x504F, //CJK UNIFIED IDEOGRAPH
+ 0x95CF: 0x5909, //CJK UNIFIED IDEOGRAPH
+ 0x95D0: 0x7247, //CJK UNIFIED IDEOGRAPH
+ 0x95D1: 0x7BC7, //CJK UNIFIED IDEOGRAPH
+ 0x95D2: 0x7DE8, //CJK UNIFIED IDEOGRAPH
+ 0x95D3: 0x8FBA, //CJK UNIFIED IDEOGRAPH
+ 0x95D4: 0x8FD4, //CJK UNIFIED IDEOGRAPH
+ 0x95D5: 0x904D, //CJK UNIFIED IDEOGRAPH
+ 0x95D6: 0x4FBF, //CJK UNIFIED IDEOGRAPH
+ 0x95D7: 0x52C9, //CJK UNIFIED IDEOGRAPH
+ 0x95D8: 0x5A29, //CJK UNIFIED IDEOGRAPH
+ 0x95D9: 0x5F01, //CJK UNIFIED IDEOGRAPH
+ 0x95DA: 0x97AD, //CJK UNIFIED IDEOGRAPH
+ 0x95DB: 0x4FDD, //CJK UNIFIED IDEOGRAPH
+ 0x95DC: 0x8217, //CJK UNIFIED IDEOGRAPH
+ 0x95DD: 0x92EA, //CJK UNIFIED IDEOGRAPH
+ 0x95DE: 0x5703, //CJK UNIFIED IDEOGRAPH
+ 0x95DF: 0x6355, //CJK UNIFIED IDEOGRAPH
+ 0x95E0: 0x6B69, //CJK UNIFIED IDEOGRAPH
+ 0x95E1: 0x752B, //CJK UNIFIED IDEOGRAPH
+ 0x95E2: 0x88DC, //CJK UNIFIED IDEOGRAPH
+ 0x95E3: 0x8F14, //CJK UNIFIED IDEOGRAPH
+ 0x95E4: 0x7A42, //CJK UNIFIED IDEOGRAPH
+ 0x95E5: 0x52DF, //CJK UNIFIED IDEOGRAPH
+ 0x95E6: 0x5893, //CJK UNIFIED IDEOGRAPH
+ 0x95E7: 0x6155, //CJK UNIFIED IDEOGRAPH
+ 0x95E8: 0x620A, //CJK UNIFIED IDEOGRAPH
+ 0x95E9: 0x66AE, //CJK UNIFIED IDEOGRAPH
+ 0x95EA: 0x6BCD, //CJK UNIFIED IDEOGRAPH
+ 0x95EB: 0x7C3F, //CJK UNIFIED IDEOGRAPH
+ 0x95EC: 0x83E9, //CJK UNIFIED IDEOGRAPH
+ 0x95ED: 0x5023, //CJK UNIFIED IDEOGRAPH
+ 0x95EE: 0x4FF8, //CJK UNIFIED IDEOGRAPH
+ 0x95EF: 0x5305, //CJK UNIFIED IDEOGRAPH
+ 0x95F0: 0x5446, //CJK UNIFIED IDEOGRAPH
+ 0x95F1: 0x5831, //CJK UNIFIED IDEOGRAPH
+ 0x95F2: 0x5949, //CJK UNIFIED IDEOGRAPH
+ 0x95F3: 0x5B9D, //CJK UNIFIED IDEOGRAPH
+ 0x95F4: 0x5CF0, //CJK UNIFIED IDEOGRAPH
+ 0x95F5: 0x5CEF, //CJK UNIFIED IDEOGRAPH
+ 0x95F6: 0x5D29, //CJK UNIFIED IDEOGRAPH
+ 0x95F7: 0x5E96, //CJK UNIFIED IDEOGRAPH
+ 0x95F8: 0x62B1, //CJK UNIFIED IDEOGRAPH
+ 0x95F9: 0x6367, //CJK UNIFIED IDEOGRAPH
+ 0x95FA: 0x653E, //CJK UNIFIED IDEOGRAPH
+ 0x95FB: 0x65B9, //CJK UNIFIED IDEOGRAPH
+ 0x95FC: 0x670B, //CJK UNIFIED IDEOGRAPH
+ 0x9640: 0x6CD5, //CJK UNIFIED IDEOGRAPH
+ 0x9641: 0x6CE1, //CJK UNIFIED IDEOGRAPH
+ 0x9642: 0x70F9, //CJK UNIFIED IDEOGRAPH
+ 0x9643: 0x7832, //CJK UNIFIED IDEOGRAPH
+ 0x9644: 0x7E2B, //CJK UNIFIED IDEOGRAPH
+ 0x9645: 0x80DE, //CJK UNIFIED IDEOGRAPH
+ 0x9646: 0x82B3, //CJK UNIFIED IDEOGRAPH
+ 0x9647: 0x840C, //CJK UNIFIED IDEOGRAPH
+ 0x9648: 0x84EC, //CJK UNIFIED IDEOGRAPH
+ 0x9649: 0x8702, //CJK UNIFIED IDEOGRAPH
+ 0x964A: 0x8912, //CJK UNIFIED IDEOGRAPH
+ 0x964B: 0x8A2A, //CJK UNIFIED IDEOGRAPH
+ 0x964C: 0x8C4A, //CJK UNIFIED IDEOGRAPH
+ 0x964D: 0x90A6, //CJK UNIFIED IDEOGRAPH
+ 0x964E: 0x92D2, //CJK UNIFIED IDEOGRAPH
+ 0x964F: 0x98FD, //CJK UNIFIED IDEOGRAPH
+ 0x9650: 0x9CF3, //CJK UNIFIED IDEOGRAPH
+ 0x9651: 0x9D6C, //CJK UNIFIED IDEOGRAPH
+ 0x9652: 0x4E4F, //CJK UNIFIED IDEOGRAPH
+ 0x9653: 0x4EA1, //CJK UNIFIED IDEOGRAPH
+ 0x9654: 0x508D, //CJK UNIFIED IDEOGRAPH
+ 0x9655: 0x5256, //CJK UNIFIED IDEOGRAPH
+ 0x9656: 0x574A, //CJK UNIFIED IDEOGRAPH
+ 0x9657: 0x59A8, //CJK UNIFIED IDEOGRAPH
+ 0x9658: 0x5E3D, //CJK UNIFIED IDEOGRAPH
+ 0x9659: 0x5FD8, //CJK UNIFIED IDEOGRAPH
+ 0x965A: 0x5FD9, //CJK UNIFIED IDEOGRAPH
+ 0x965B: 0x623F, //CJK UNIFIED IDEOGRAPH
+ 0x965C: 0x66B4, //CJK UNIFIED IDEOGRAPH
+ 0x965D: 0x671B, //CJK UNIFIED IDEOGRAPH
+ 0x965E: 0x67D0, //CJK UNIFIED IDEOGRAPH
+ 0x965F: 0x68D2, //CJK UNIFIED IDEOGRAPH
+ 0x9660: 0x5192, //CJK UNIFIED IDEOGRAPH
+ 0x9661: 0x7D21, //CJK UNIFIED IDEOGRAPH
+ 0x9662: 0x80AA, //CJK UNIFIED IDEOGRAPH
+ 0x9663: 0x81A8, //CJK UNIFIED IDEOGRAPH
+ 0x9664: 0x8B00, //CJK UNIFIED IDEOGRAPH
+ 0x9665: 0x8C8C, //CJK UNIFIED IDEOGRAPH
+ 0x9666: 0x8CBF, //CJK UNIFIED IDEOGRAPH
+ 0x9667: 0x927E, //CJK UNIFIED IDEOGRAPH
+ 0x9668: 0x9632, //CJK UNIFIED IDEOGRAPH
+ 0x9669: 0x5420, //CJK UNIFIED IDEOGRAPH
+ 0x966A: 0x982C, //CJK UNIFIED IDEOGRAPH
+ 0x966B: 0x5317, //CJK UNIFIED IDEOGRAPH
+ 0x966C: 0x50D5, //CJK UNIFIED IDEOGRAPH
+ 0x966D: 0x535C, //CJK UNIFIED IDEOGRAPH
+ 0x966E: 0x58A8, //CJK UNIFIED IDEOGRAPH
+ 0x966F: 0x64B2, //CJK UNIFIED IDEOGRAPH
+ 0x9670: 0x6734, //CJK UNIFIED IDEOGRAPH
+ 0x9671: 0x7267, //CJK UNIFIED IDEOGRAPH
+ 0x9672: 0x7766, //CJK UNIFIED IDEOGRAPH
+ 0x9673: 0x7A46, //CJK UNIFIED IDEOGRAPH
+ 0x9674: 0x91E6, //CJK UNIFIED IDEOGRAPH
+ 0x9675: 0x52C3, //CJK UNIFIED IDEOGRAPH
+ 0x9676: 0x6CA1, //CJK UNIFIED IDEOGRAPH
+ 0x9677: 0x6B86, //CJK UNIFIED IDEOGRAPH
+ 0x9678: 0x5800, //CJK UNIFIED IDEOGRAPH
+ 0x9679: 0x5E4C, //CJK UNIFIED IDEOGRAPH
+ 0x967A: 0x5954, //CJK UNIFIED IDEOGRAPH
+ 0x967B: 0x672C, //CJK UNIFIED IDEOGRAPH
+ 0x967C: 0x7FFB, //CJK UNIFIED IDEOGRAPH
+ 0x967D: 0x51E1, //CJK UNIFIED IDEOGRAPH
+ 0x967E: 0x76C6, //CJK UNIFIED IDEOGRAPH
+ 0x9680: 0x6469, //CJK UNIFIED IDEOGRAPH
+ 0x9681: 0x78E8, //CJK UNIFIED IDEOGRAPH
+ 0x9682: 0x9B54, //CJK UNIFIED IDEOGRAPH
+ 0x9683: 0x9EBB, //CJK UNIFIED IDEOGRAPH
+ 0x9684: 0x57CB, //CJK UNIFIED IDEOGRAPH
+ 0x9685: 0x59B9, //CJK UNIFIED IDEOGRAPH
+ 0x9686: 0x6627, //CJK UNIFIED IDEOGRAPH
+ 0x9687: 0x679A, //CJK UNIFIED IDEOGRAPH
+ 0x9688: 0x6BCE, //CJK UNIFIED IDEOGRAPH
+ 0x9689: 0x54E9, //CJK UNIFIED IDEOGRAPH
+ 0x968A: 0x69D9, //CJK UNIFIED IDEOGRAPH
+ 0x968B: 0x5E55, //CJK UNIFIED IDEOGRAPH
+ 0x968C: 0x819C, //CJK UNIFIED IDEOGRAPH
+ 0x968D: 0x6795, //CJK UNIFIED IDEOGRAPH
+ 0x968E: 0x9BAA, //CJK UNIFIED IDEOGRAPH
+ 0x968F: 0x67FE, //CJK UNIFIED IDEOGRAPH
+ 0x9690: 0x9C52, //CJK UNIFIED IDEOGRAPH
+ 0x9691: 0x685D, //CJK UNIFIED IDEOGRAPH
+ 0x9692: 0x4EA6, //CJK UNIFIED IDEOGRAPH
+ 0x9693: 0x4FE3, //CJK UNIFIED IDEOGRAPH
+ 0x9694: 0x53C8, //CJK UNIFIED IDEOGRAPH
+ 0x9695: 0x62B9, //CJK UNIFIED IDEOGRAPH
+ 0x9696: 0x672B, //CJK UNIFIED IDEOGRAPH
+ 0x9697: 0x6CAB, //CJK UNIFIED IDEOGRAPH
+ 0x9698: 0x8FC4, //CJK UNIFIED IDEOGRAPH
+ 0x9699: 0x4FAD, //CJK UNIFIED IDEOGRAPH
+ 0x969A: 0x7E6D, //CJK UNIFIED IDEOGRAPH
+ 0x969B: 0x9EBF, //CJK UNIFIED IDEOGRAPH
+ 0x969C: 0x4E07, //CJK UNIFIED IDEOGRAPH
+ 0x969D: 0x6162, //CJK UNIFIED IDEOGRAPH
+ 0x969E: 0x6E80, //CJK UNIFIED IDEOGRAPH
+ 0x969F: 0x6F2B, //CJK UNIFIED IDEOGRAPH
+ 0x96A0: 0x8513, //CJK UNIFIED IDEOGRAPH
+ 0x96A1: 0x5473, //CJK UNIFIED IDEOGRAPH
+ 0x96A2: 0x672A, //CJK UNIFIED IDEOGRAPH
+ 0x96A3: 0x9B45, //CJK UNIFIED IDEOGRAPH
+ 0x96A4: 0x5DF3, //CJK UNIFIED IDEOGRAPH
+ 0x96A5: 0x7B95, //CJK UNIFIED IDEOGRAPH
+ 0x96A6: 0x5CAC, //CJK UNIFIED IDEOGRAPH
+ 0x96A7: 0x5BC6, //CJK UNIFIED IDEOGRAPH
+ 0x96A8: 0x871C, //CJK UNIFIED IDEOGRAPH
+ 0x96A9: 0x6E4A, //CJK UNIFIED IDEOGRAPH
+ 0x96AA: 0x84D1, //CJK UNIFIED IDEOGRAPH
+ 0x96AB: 0x7A14, //CJK UNIFIED IDEOGRAPH
+ 0x96AC: 0x8108, //CJK UNIFIED IDEOGRAPH
+ 0x96AD: 0x5999, //CJK UNIFIED IDEOGRAPH
+ 0x96AE: 0x7C8D, //CJK UNIFIED IDEOGRAPH
+ 0x96AF: 0x6C11, //CJK UNIFIED IDEOGRAPH
+ 0x96B0: 0x7720, //CJK UNIFIED IDEOGRAPH
+ 0x96B1: 0x52D9, //CJK UNIFIED IDEOGRAPH
+ 0x96B2: 0x5922, //CJK UNIFIED IDEOGRAPH
+ 0x96B3: 0x7121, //CJK UNIFIED IDEOGRAPH
+ 0x96B4: 0x725F, //CJK UNIFIED IDEOGRAPH
+ 0x96B5: 0x77DB, //CJK UNIFIED IDEOGRAPH
+ 0x96B6: 0x9727, //CJK UNIFIED IDEOGRAPH
+ 0x96B7: 0x9D61, //CJK UNIFIED IDEOGRAPH
+ 0x96B8: 0x690B, //CJK UNIFIED IDEOGRAPH
+ 0x96B9: 0x5A7F, //CJK UNIFIED IDEOGRAPH
+ 0x96BA: 0x5A18, //CJK UNIFIED IDEOGRAPH
+ 0x96BB: 0x51A5, //CJK UNIFIED IDEOGRAPH
+ 0x96BC: 0x540D, //CJK UNIFIED IDEOGRAPH
+ 0x96BD: 0x547D, //CJK UNIFIED IDEOGRAPH
+ 0x96BE: 0x660E, //CJK UNIFIED IDEOGRAPH
+ 0x96BF: 0x76DF, //CJK UNIFIED IDEOGRAPH
+ 0x96C0: 0x8FF7, //CJK UNIFIED IDEOGRAPH
+ 0x96C1: 0x9298, //CJK UNIFIED IDEOGRAPH
+ 0x96C2: 0x9CF4, //CJK UNIFIED IDEOGRAPH
+ 0x96C3: 0x59EA, //CJK UNIFIED IDEOGRAPH
+ 0x96C4: 0x725D, //CJK UNIFIED IDEOGRAPH
+ 0x96C5: 0x6EC5, //CJK UNIFIED IDEOGRAPH
+ 0x96C6: 0x514D, //CJK UNIFIED IDEOGRAPH
+ 0x96C7: 0x68C9, //CJK UNIFIED IDEOGRAPH
+ 0x96C8: 0x7DBF, //CJK UNIFIED IDEOGRAPH
+ 0x96C9: 0x7DEC, //CJK UNIFIED IDEOGRAPH
+ 0x96CA: 0x9762, //CJK UNIFIED IDEOGRAPH
+ 0x96CB: 0x9EBA, //CJK UNIFIED IDEOGRAPH
+ 0x96CC: 0x6478, //CJK UNIFIED IDEOGRAPH
+ 0x96CD: 0x6A21, //CJK UNIFIED IDEOGRAPH
+ 0x96CE: 0x8302, //CJK UNIFIED IDEOGRAPH
+ 0x96CF: 0x5984, //CJK UNIFIED IDEOGRAPH
+ 0x96D0: 0x5B5F, //CJK UNIFIED IDEOGRAPH
+ 0x96D1: 0x6BDB, //CJK UNIFIED IDEOGRAPH
+ 0x96D2: 0x731B, //CJK UNIFIED IDEOGRAPH
+ 0x96D3: 0x76F2, //CJK UNIFIED IDEOGRAPH
+ 0x96D4: 0x7DB2, //CJK UNIFIED IDEOGRAPH
+ 0x96D5: 0x8017, //CJK UNIFIED IDEOGRAPH
+ 0x96D6: 0x8499, //CJK UNIFIED IDEOGRAPH
+ 0x96D7: 0x5132, //CJK UNIFIED IDEOGRAPH
+ 0x96D8: 0x6728, //CJK UNIFIED IDEOGRAPH
+ 0x96D9: 0x9ED9, //CJK UNIFIED IDEOGRAPH
+ 0x96DA: 0x76EE, //CJK UNIFIED IDEOGRAPH
+ 0x96DB: 0x6762, //CJK UNIFIED IDEOGRAPH
+ 0x96DC: 0x52FF, //CJK UNIFIED IDEOGRAPH
+ 0x96DD: 0x9905, //CJK UNIFIED IDEOGRAPH
+ 0x96DE: 0x5C24, //CJK UNIFIED IDEOGRAPH
+ 0x96DF: 0x623B, //CJK UNIFIED IDEOGRAPH
+ 0x96E0: 0x7C7E, //CJK UNIFIED IDEOGRAPH
+ 0x96E1: 0x8CB0, //CJK UNIFIED IDEOGRAPH
+ 0x96E2: 0x554F, //CJK UNIFIED IDEOGRAPH
+ 0x96E3: 0x60B6, //CJK UNIFIED IDEOGRAPH
+ 0x96E4: 0x7D0B, //CJK UNIFIED IDEOGRAPH
+ 0x96E5: 0x9580, //CJK UNIFIED IDEOGRAPH
+ 0x96E6: 0x5301, //CJK UNIFIED IDEOGRAPH
+ 0x96E7: 0x4E5F, //CJK UNIFIED IDEOGRAPH
+ 0x96E8: 0x51B6, //CJK UNIFIED IDEOGRAPH
+ 0x96E9: 0x591C, //CJK UNIFIED IDEOGRAPH
+ 0x96EA: 0x723A, //CJK UNIFIED IDEOGRAPH
+ 0x96EB: 0x8036, //CJK UNIFIED IDEOGRAPH
+ 0x96EC: 0x91CE, //CJK UNIFIED IDEOGRAPH
+ 0x96ED: 0x5F25, //CJK UNIFIED IDEOGRAPH
+ 0x96EE: 0x77E2, //CJK UNIFIED IDEOGRAPH
+ 0x96EF: 0x5384, //CJK UNIFIED IDEOGRAPH
+ 0x96F0: 0x5F79, //CJK UNIFIED IDEOGRAPH
+ 0x96F1: 0x7D04, //CJK UNIFIED IDEOGRAPH
+ 0x96F2: 0x85AC, //CJK UNIFIED IDEOGRAPH
+ 0x96F3: 0x8A33, //CJK UNIFIED IDEOGRAPH
+ 0x96F4: 0x8E8D, //CJK UNIFIED IDEOGRAPH
+ 0x96F5: 0x9756, //CJK UNIFIED IDEOGRAPH
+ 0x96F6: 0x67F3, //CJK UNIFIED IDEOGRAPH
+ 0x96F7: 0x85AE, //CJK UNIFIED IDEOGRAPH
+ 0x96F8: 0x9453, //CJK UNIFIED IDEOGRAPH
+ 0x96F9: 0x6109, //CJK UNIFIED IDEOGRAPH
+ 0x96FA: 0x6108, //CJK UNIFIED IDEOGRAPH
+ 0x96FB: 0x6CB9, //CJK UNIFIED IDEOGRAPH
+ 0x96FC: 0x7652, //CJK UNIFIED IDEOGRAPH
+ 0x9740: 0x8AED, //CJK UNIFIED IDEOGRAPH
+ 0x9741: 0x8F38, //CJK UNIFIED IDEOGRAPH
+ 0x9742: 0x552F, //CJK UNIFIED IDEOGRAPH
+ 0x9743: 0x4F51, //CJK UNIFIED IDEOGRAPH
+ 0x9744: 0x512A, //CJK UNIFIED IDEOGRAPH
+ 0x9745: 0x52C7, //CJK UNIFIED IDEOGRAPH
+ 0x9746: 0x53CB, //CJK UNIFIED IDEOGRAPH
+ 0x9747: 0x5BA5, //CJK UNIFIED IDEOGRAPH
+ 0x9748: 0x5E7D, //CJK UNIFIED IDEOGRAPH
+ 0x9749: 0x60A0, //CJK UNIFIED IDEOGRAPH
+ 0x974A: 0x6182, //CJK UNIFIED IDEOGRAPH
+ 0x974B: 0x63D6, //CJK UNIFIED IDEOGRAPH
+ 0x974C: 0x6709, //CJK UNIFIED IDEOGRAPH
+ 0x974D: 0x67DA, //CJK UNIFIED IDEOGRAPH
+ 0x974E: 0x6E67, //CJK UNIFIED IDEOGRAPH
+ 0x974F: 0x6D8C, //CJK UNIFIED IDEOGRAPH
+ 0x9750: 0x7336, //CJK UNIFIED IDEOGRAPH
+ 0x9751: 0x7337, //CJK UNIFIED IDEOGRAPH
+ 0x9752: 0x7531, //CJK UNIFIED IDEOGRAPH
+ 0x9753: 0x7950, //CJK UNIFIED IDEOGRAPH
+ 0x9754: 0x88D5, //CJK UNIFIED IDEOGRAPH
+ 0x9755: 0x8A98, //CJK UNIFIED IDEOGRAPH
+ 0x9756: 0x904A, //CJK UNIFIED IDEOGRAPH
+ 0x9757: 0x9091, //CJK UNIFIED IDEOGRAPH
+ 0x9758: 0x90F5, //CJK UNIFIED IDEOGRAPH
+ 0x9759: 0x96C4, //CJK UNIFIED IDEOGRAPH
+ 0x975A: 0x878D, //CJK UNIFIED IDEOGRAPH
+ 0x975B: 0x5915, //CJK UNIFIED IDEOGRAPH
+ 0x975C: 0x4E88, //CJK UNIFIED IDEOGRAPH
+ 0x975D: 0x4F59, //CJK UNIFIED IDEOGRAPH
+ 0x975E: 0x4E0E, //CJK UNIFIED IDEOGRAPH
+ 0x975F: 0x8A89, //CJK UNIFIED IDEOGRAPH
+ 0x9760: 0x8F3F, //CJK UNIFIED IDEOGRAPH
+ 0x9761: 0x9810, //CJK UNIFIED IDEOGRAPH
+ 0x9762: 0x50AD, //CJK UNIFIED IDEOGRAPH
+ 0x9763: 0x5E7C, //CJK UNIFIED IDEOGRAPH
+ 0x9764: 0x5996, //CJK UNIFIED IDEOGRAPH
+ 0x9765: 0x5BB9, //CJK UNIFIED IDEOGRAPH
+ 0x9766: 0x5EB8, //CJK UNIFIED IDEOGRAPH
+ 0x9767: 0x63DA, //CJK UNIFIED IDEOGRAPH
+ 0x9768: 0x63FA, //CJK UNIFIED IDEOGRAPH
+ 0x9769: 0x64C1, //CJK UNIFIED IDEOGRAPH
+ 0x976A: 0x66DC, //CJK UNIFIED IDEOGRAPH
+ 0x976B: 0x694A, //CJK UNIFIED IDEOGRAPH
+ 0x976C: 0x69D8, //CJK UNIFIED IDEOGRAPH
+ 0x976D: 0x6D0B, //CJK UNIFIED IDEOGRAPH
+ 0x976E: 0x6EB6, //CJK UNIFIED IDEOGRAPH
+ 0x976F: 0x7194, //CJK UNIFIED IDEOGRAPH
+ 0x9770: 0x7528, //CJK UNIFIED IDEOGRAPH
+ 0x9771: 0x7AAF, //CJK UNIFIED IDEOGRAPH
+ 0x9772: 0x7F8A, //CJK UNIFIED IDEOGRAPH
+ 0x9773: 0x8000, //CJK UNIFIED IDEOGRAPH
+ 0x9774: 0x8449, //CJK UNIFIED IDEOGRAPH
+ 0x9775: 0x84C9, //CJK UNIFIED IDEOGRAPH
+ 0x9776: 0x8981, //CJK UNIFIED IDEOGRAPH
+ 0x9777: 0x8B21, //CJK UNIFIED IDEOGRAPH
+ 0x9778: 0x8E0A, //CJK UNIFIED IDEOGRAPH
+ 0x9779: 0x9065, //CJK UNIFIED IDEOGRAPH
+ 0x977A: 0x967D, //CJK UNIFIED IDEOGRAPH
+ 0x977B: 0x990A, //CJK UNIFIED IDEOGRAPH
+ 0x977C: 0x617E, //CJK UNIFIED IDEOGRAPH
+ 0x977D: 0x6291, //CJK UNIFIED IDEOGRAPH
+ 0x977E: 0x6B32, //CJK UNIFIED IDEOGRAPH
+ 0x9780: 0x6C83, //CJK UNIFIED IDEOGRAPH
+ 0x9781: 0x6D74, //CJK UNIFIED IDEOGRAPH
+ 0x9782: 0x7FCC, //CJK UNIFIED IDEOGRAPH
+ 0x9783: 0x7FFC, //CJK UNIFIED IDEOGRAPH
+ 0x9784: 0x6DC0, //CJK UNIFIED IDEOGRAPH
+ 0x9785: 0x7F85, //CJK UNIFIED IDEOGRAPH
+ 0x9786: 0x87BA, //CJK UNIFIED IDEOGRAPH
+ 0x9787: 0x88F8, //CJK UNIFIED IDEOGRAPH
+ 0x9788: 0x6765, //CJK UNIFIED IDEOGRAPH
+ 0x9789: 0x83B1, //CJK UNIFIED IDEOGRAPH
+ 0x978A: 0x983C, //CJK UNIFIED IDEOGRAPH
+ 0x978B: 0x96F7, //CJK UNIFIED IDEOGRAPH
+ 0x978C: 0x6D1B, //CJK UNIFIED IDEOGRAPH
+ 0x978D: 0x7D61, //CJK UNIFIED IDEOGRAPH
+ 0x978E: 0x843D, //CJK UNIFIED IDEOGRAPH
+ 0x978F: 0x916A, //CJK UNIFIED IDEOGRAPH
+ 0x9790: 0x4E71, //CJK UNIFIED IDEOGRAPH
+ 0x9791: 0x5375, //CJK UNIFIED IDEOGRAPH
+ 0x9792: 0x5D50, //CJK UNIFIED IDEOGRAPH
+ 0x9793: 0x6B04, //CJK UNIFIED IDEOGRAPH
+ 0x9794: 0x6FEB, //CJK UNIFIED IDEOGRAPH
+ 0x9795: 0x85CD, //CJK UNIFIED IDEOGRAPH
+ 0x9796: 0x862D, //CJK UNIFIED IDEOGRAPH
+ 0x9797: 0x89A7, //CJK UNIFIED IDEOGRAPH
+ 0x9798: 0x5229, //CJK UNIFIED IDEOGRAPH
+ 0x9799: 0x540F, //CJK UNIFIED IDEOGRAPH
+ 0x979A: 0x5C65, //CJK UNIFIED IDEOGRAPH
+ 0x979B: 0x674E, //CJK UNIFIED IDEOGRAPH
+ 0x979C: 0x68A8, //CJK UNIFIED IDEOGRAPH
+ 0x979D: 0x7406, //CJK UNIFIED IDEOGRAPH
+ 0x979E: 0x7483, //CJK UNIFIED IDEOGRAPH
+ 0x979F: 0x75E2, //CJK UNIFIED IDEOGRAPH
+ 0x97A0: 0x88CF, //CJK UNIFIED IDEOGRAPH
+ 0x97A1: 0x88E1, //CJK UNIFIED IDEOGRAPH
+ 0x97A2: 0x91CC, //CJK UNIFIED IDEOGRAPH
+ 0x97A3: 0x96E2, //CJK UNIFIED IDEOGRAPH
+ 0x97A4: 0x9678, //CJK UNIFIED IDEOGRAPH
+ 0x97A5: 0x5F8B, //CJK UNIFIED IDEOGRAPH
+ 0x97A6: 0x7387, //CJK UNIFIED IDEOGRAPH
+ 0x97A7: 0x7ACB, //CJK UNIFIED IDEOGRAPH
+ 0x97A8: 0x844E, //CJK UNIFIED IDEOGRAPH
+ 0x97A9: 0x63A0, //CJK UNIFIED IDEOGRAPH
+ 0x97AA: 0x7565, //CJK UNIFIED IDEOGRAPH
+ 0x97AB: 0x5289, //CJK UNIFIED IDEOGRAPH
+ 0x97AC: 0x6D41, //CJK UNIFIED IDEOGRAPH
+ 0x97AD: 0x6E9C, //CJK UNIFIED IDEOGRAPH
+ 0x97AE: 0x7409, //CJK UNIFIED IDEOGRAPH
+ 0x97AF: 0x7559, //CJK UNIFIED IDEOGRAPH
+ 0x97B0: 0x786B, //CJK UNIFIED IDEOGRAPH
+ 0x97B1: 0x7C92, //CJK UNIFIED IDEOGRAPH
+ 0x97B2: 0x9686, //CJK UNIFIED IDEOGRAPH
+ 0x97B3: 0x7ADC, //CJK UNIFIED IDEOGRAPH
+ 0x97B4: 0x9F8D, //CJK UNIFIED IDEOGRAPH
+ 0x97B5: 0x4FB6, //CJK UNIFIED IDEOGRAPH
+ 0x97B6: 0x616E, //CJK UNIFIED IDEOGRAPH
+ 0x97B7: 0x65C5, //CJK UNIFIED IDEOGRAPH
+ 0x97B8: 0x865C, //CJK UNIFIED IDEOGRAPH
+ 0x97B9: 0x4E86, //CJK UNIFIED IDEOGRAPH
+ 0x97BA: 0x4EAE, //CJK UNIFIED IDEOGRAPH
+ 0x97BB: 0x50DA, //CJK UNIFIED IDEOGRAPH
+ 0x97BC: 0x4E21, //CJK UNIFIED IDEOGRAPH
+ 0x97BD: 0x51CC, //CJK UNIFIED IDEOGRAPH
+ 0x97BE: 0x5BEE, //CJK UNIFIED IDEOGRAPH
+ 0x97BF: 0x6599, //CJK UNIFIED IDEOGRAPH
+ 0x97C0: 0x6881, //CJK UNIFIED IDEOGRAPH
+ 0x97C1: 0x6DBC, //CJK UNIFIED IDEOGRAPH
+ 0x97C2: 0x731F, //CJK UNIFIED IDEOGRAPH
+ 0x97C3: 0x7642, //CJK UNIFIED IDEOGRAPH
+ 0x97C4: 0x77AD, //CJK UNIFIED IDEOGRAPH
+ 0x97C5: 0x7A1C, //CJK UNIFIED IDEOGRAPH
+ 0x97C6: 0x7CE7, //CJK UNIFIED IDEOGRAPH
+ 0x97C7: 0x826F, //CJK UNIFIED IDEOGRAPH
+ 0x97C8: 0x8AD2, //CJK UNIFIED IDEOGRAPH
+ 0x97C9: 0x907C, //CJK UNIFIED IDEOGRAPH
+ 0x97CA: 0x91CF, //CJK UNIFIED IDEOGRAPH
+ 0x97CB: 0x9675, //CJK UNIFIED IDEOGRAPH
+ 0x97CC: 0x9818, //CJK UNIFIED IDEOGRAPH
+ 0x97CD: 0x529B, //CJK UNIFIED IDEOGRAPH
+ 0x97CE: 0x7DD1, //CJK UNIFIED IDEOGRAPH
+ 0x97CF: 0x502B, //CJK UNIFIED IDEOGRAPH
+ 0x97D0: 0x5398, //CJK UNIFIED IDEOGRAPH
+ 0x97D1: 0x6797, //CJK UNIFIED IDEOGRAPH
+ 0x97D2: 0x6DCB, //CJK UNIFIED IDEOGRAPH
+ 0x97D3: 0x71D0, //CJK UNIFIED IDEOGRAPH
+ 0x97D4: 0x7433, //CJK UNIFIED IDEOGRAPH
+ 0x97D5: 0x81E8, //CJK UNIFIED IDEOGRAPH
+ 0x97D6: 0x8F2A, //CJK UNIFIED IDEOGRAPH
+ 0x97D7: 0x96A3, //CJK UNIFIED IDEOGRAPH
+ 0x97D8: 0x9C57, //CJK UNIFIED IDEOGRAPH
+ 0x97D9: 0x9E9F, //CJK UNIFIED IDEOGRAPH
+ 0x97DA: 0x7460, //CJK UNIFIED IDEOGRAPH
+ 0x97DB: 0x5841, //CJK UNIFIED IDEOGRAPH
+ 0x97DC: 0x6D99, //CJK UNIFIED IDEOGRAPH
+ 0x97DD: 0x7D2F, //CJK UNIFIED IDEOGRAPH
+ 0x97DE: 0x985E, //CJK UNIFIED IDEOGRAPH
+ 0x97DF: 0x4EE4, //CJK UNIFIED IDEOGRAPH
+ 0x97E0: 0x4F36, //CJK UNIFIED IDEOGRAPH
+ 0x97E1: 0x4F8B, //CJK UNIFIED IDEOGRAPH
+ 0x97E2: 0x51B7, //CJK UNIFIED IDEOGRAPH
+ 0x97E3: 0x52B1, //CJK UNIFIED IDEOGRAPH
+ 0x97E4: 0x5DBA, //CJK UNIFIED IDEOGRAPH
+ 0x97E5: 0x601C, //CJK UNIFIED IDEOGRAPH
+ 0x97E6: 0x73B2, //CJK UNIFIED IDEOGRAPH
+ 0x97E7: 0x793C, //CJK UNIFIED IDEOGRAPH
+ 0x97E8: 0x82D3, //CJK UNIFIED IDEOGRAPH
+ 0x97E9: 0x9234, //CJK UNIFIED IDEOGRAPH
+ 0x97EA: 0x96B7, //CJK UNIFIED IDEOGRAPH
+ 0x97EB: 0x96F6, //CJK UNIFIED IDEOGRAPH
+ 0x97EC: 0x970A, //CJK UNIFIED IDEOGRAPH
+ 0x97ED: 0x9E97, //CJK UNIFIED IDEOGRAPH
+ 0x97EE: 0x9F62, //CJK UNIFIED IDEOGRAPH
+ 0x97EF: 0x66A6, //CJK UNIFIED IDEOGRAPH
+ 0x97F0: 0x6B74, //CJK UNIFIED IDEOGRAPH
+ 0x97F1: 0x5217, //CJK UNIFIED IDEOGRAPH
+ 0x97F2: 0x52A3, //CJK UNIFIED IDEOGRAPH
+ 0x97F3: 0x70C8, //CJK UNIFIED IDEOGRAPH
+ 0x97F4: 0x88C2, //CJK UNIFIED IDEOGRAPH
+ 0x97F5: 0x5EC9, //CJK UNIFIED IDEOGRAPH
+ 0x97F6: 0x604B, //CJK UNIFIED IDEOGRAPH
+ 0x97F7: 0x6190, //CJK UNIFIED IDEOGRAPH
+ 0x97F8: 0x6F23, //CJK UNIFIED IDEOGRAPH
+ 0x97F9: 0x7149, //CJK UNIFIED IDEOGRAPH
+ 0x97FA: 0x7C3E, //CJK UNIFIED IDEOGRAPH
+ 0x97FB: 0x7DF4, //CJK UNIFIED IDEOGRAPH
+ 0x97FC: 0x806F, //CJK UNIFIED IDEOGRAPH
+ 0x9840: 0x84EE, //CJK UNIFIED IDEOGRAPH
+ 0x9841: 0x9023, //CJK UNIFIED IDEOGRAPH
+ 0x9842: 0x932C, //CJK UNIFIED IDEOGRAPH
+ 0x9843: 0x5442, //CJK UNIFIED IDEOGRAPH
+ 0x9844: 0x9B6F, //CJK UNIFIED IDEOGRAPH
+ 0x9845: 0x6AD3, //CJK UNIFIED IDEOGRAPH
+ 0x9846: 0x7089, //CJK UNIFIED IDEOGRAPH
+ 0x9847: 0x8CC2, //CJK UNIFIED IDEOGRAPH
+ 0x9848: 0x8DEF, //CJK UNIFIED IDEOGRAPH
+ 0x9849: 0x9732, //CJK UNIFIED IDEOGRAPH
+ 0x984A: 0x52B4, //CJK UNIFIED IDEOGRAPH
+ 0x984B: 0x5A41, //CJK UNIFIED IDEOGRAPH
+ 0x984C: 0x5ECA, //CJK UNIFIED IDEOGRAPH
+ 0x984D: 0x5F04, //CJK UNIFIED IDEOGRAPH
+ 0x984E: 0x6717, //CJK UNIFIED IDEOGRAPH
+ 0x984F: 0x697C, //CJK UNIFIED IDEOGRAPH
+ 0x9850: 0x6994, //CJK UNIFIED IDEOGRAPH
+ 0x9851: 0x6D6A, //CJK UNIFIED IDEOGRAPH
+ 0x9852: 0x6F0F, //CJK UNIFIED IDEOGRAPH
+ 0x9853: 0x7262, //CJK UNIFIED IDEOGRAPH
+ 0x9854: 0x72FC, //CJK UNIFIED IDEOGRAPH
+ 0x9855: 0x7BED, //CJK UNIFIED IDEOGRAPH
+ 0x9856: 0x8001, //CJK UNIFIED IDEOGRAPH
+ 0x9857: 0x807E, //CJK UNIFIED IDEOGRAPH
+ 0x9858: 0x874B, //CJK UNIFIED IDEOGRAPH
+ 0x9859: 0x90CE, //CJK UNIFIED IDEOGRAPH
+ 0x985A: 0x516D, //CJK UNIFIED IDEOGRAPH
+ 0x985B: 0x9E93, //CJK UNIFIED IDEOGRAPH
+ 0x985C: 0x7984, //CJK UNIFIED IDEOGRAPH
+ 0x985D: 0x808B, //CJK UNIFIED IDEOGRAPH
+ 0x985E: 0x9332, //CJK UNIFIED IDEOGRAPH
+ 0x985F: 0x8AD6, //CJK UNIFIED IDEOGRAPH
+ 0x9860: 0x502D, //CJK UNIFIED IDEOGRAPH
+ 0x9861: 0x548C, //CJK UNIFIED IDEOGRAPH
+ 0x9862: 0x8A71, //CJK UNIFIED IDEOGRAPH
+ 0x9863: 0x6B6A, //CJK UNIFIED IDEOGRAPH
+ 0x9864: 0x8CC4, //CJK UNIFIED IDEOGRAPH
+ 0x9865: 0x8107, //CJK UNIFIED IDEOGRAPH
+ 0x9866: 0x60D1, //CJK UNIFIED IDEOGRAPH
+ 0x9867: 0x67A0, //CJK UNIFIED IDEOGRAPH
+ 0x9868: 0x9DF2, //CJK UNIFIED IDEOGRAPH
+ 0x9869: 0x4E99, //CJK UNIFIED IDEOGRAPH
+ 0x986A: 0x4E98, //CJK UNIFIED IDEOGRAPH
+ 0x986B: 0x9C10, //CJK UNIFIED IDEOGRAPH
+ 0x986C: 0x8A6B, //CJK UNIFIED IDEOGRAPH
+ 0x986D: 0x85C1, //CJK UNIFIED IDEOGRAPH
+ 0x986E: 0x8568, //CJK UNIFIED IDEOGRAPH
+ 0x986F: 0x6900, //CJK UNIFIED IDEOGRAPH
+ 0x9870: 0x6E7E, //CJK UNIFIED IDEOGRAPH
+ 0x9871: 0x7897, //CJK UNIFIED IDEOGRAPH
+ 0x9872: 0x8155, //CJK UNIFIED IDEOGRAPH
+ 0x989F: 0x5F0C, //CJK UNIFIED IDEOGRAPH
+ 0x98A0: 0x4E10, //CJK UNIFIED IDEOGRAPH
+ 0x98A1: 0x4E15, //CJK UNIFIED IDEOGRAPH
+ 0x98A2: 0x4E2A, //CJK UNIFIED IDEOGRAPH
+ 0x98A3: 0x4E31, //CJK UNIFIED IDEOGRAPH
+ 0x98A4: 0x4E36, //CJK UNIFIED IDEOGRAPH
+ 0x98A5: 0x4E3C, //CJK UNIFIED IDEOGRAPH
+ 0x98A6: 0x4E3F, //CJK UNIFIED IDEOGRAPH
+ 0x98A7: 0x4E42, //CJK UNIFIED IDEOGRAPH
+ 0x98A8: 0x4E56, //CJK UNIFIED IDEOGRAPH
+ 0x98A9: 0x4E58, //CJK UNIFIED IDEOGRAPH
+ 0x98AA: 0x4E82, //CJK UNIFIED IDEOGRAPH
+ 0x98AB: 0x4E85, //CJK UNIFIED IDEOGRAPH
+ 0x98AC: 0x8C6B, //CJK UNIFIED IDEOGRAPH
+ 0x98AD: 0x4E8A, //CJK UNIFIED IDEOGRAPH
+ 0x98AE: 0x8212, //CJK UNIFIED IDEOGRAPH
+ 0x98AF: 0x5F0D, //CJK UNIFIED IDEOGRAPH
+ 0x98B0: 0x4E8E, //CJK UNIFIED IDEOGRAPH
+ 0x98B1: 0x4E9E, //CJK UNIFIED IDEOGRAPH
+ 0x98B2: 0x4E9F, //CJK UNIFIED IDEOGRAPH
+ 0x98B3: 0x4EA0, //CJK UNIFIED IDEOGRAPH
+ 0x98B4: 0x4EA2, //CJK UNIFIED IDEOGRAPH
+ 0x98B5: 0x4EB0, //CJK UNIFIED IDEOGRAPH
+ 0x98B6: 0x4EB3, //CJK UNIFIED IDEOGRAPH
+ 0x98B7: 0x4EB6, //CJK UNIFIED IDEOGRAPH
+ 0x98B8: 0x4ECE, //CJK UNIFIED IDEOGRAPH
+ 0x98B9: 0x4ECD, //CJK UNIFIED IDEOGRAPH
+ 0x98BA: 0x4EC4, //CJK UNIFIED IDEOGRAPH
+ 0x98BB: 0x4EC6, //CJK UNIFIED IDEOGRAPH
+ 0x98BC: 0x4EC2, //CJK UNIFIED IDEOGRAPH
+ 0x98BD: 0x4ED7, //CJK UNIFIED IDEOGRAPH
+ 0x98BE: 0x4EDE, //CJK UNIFIED IDEOGRAPH
+ 0x98BF: 0x4EED, //CJK UNIFIED IDEOGRAPH
+ 0x98C0: 0x4EDF, //CJK UNIFIED IDEOGRAPH
+ 0x98C1: 0x4EF7, //CJK UNIFIED IDEOGRAPH
+ 0x98C2: 0x4F09, //CJK UNIFIED IDEOGRAPH
+ 0x98C3: 0x4F5A, //CJK UNIFIED IDEOGRAPH
+ 0x98C4: 0x4F30, //CJK UNIFIED IDEOGRAPH
+ 0x98C5: 0x4F5B, //CJK UNIFIED IDEOGRAPH
+ 0x98C6: 0x4F5D, //CJK UNIFIED IDEOGRAPH
+ 0x98C7: 0x4F57, //CJK UNIFIED IDEOGRAPH
+ 0x98C8: 0x4F47, //CJK UNIFIED IDEOGRAPH
+ 0x98C9: 0x4F76, //CJK UNIFIED IDEOGRAPH
+ 0x98CA: 0x4F88, //CJK UNIFIED IDEOGRAPH
+ 0x98CB: 0x4F8F, //CJK UNIFIED IDEOGRAPH
+ 0x98CC: 0x4F98, //CJK UNIFIED IDEOGRAPH
+ 0x98CD: 0x4F7B, //CJK UNIFIED IDEOGRAPH
+ 0x98CE: 0x4F69, //CJK UNIFIED IDEOGRAPH
+ 0x98CF: 0x4F70, //CJK UNIFIED IDEOGRAPH
+ 0x98D0: 0x4F91, //CJK UNIFIED IDEOGRAPH
+ 0x98D1: 0x4F6F, //CJK UNIFIED IDEOGRAPH
+ 0x98D2: 0x4F86, //CJK UNIFIED IDEOGRAPH
+ 0x98D3: 0x4F96, //CJK UNIFIED IDEOGRAPH
+ 0x98D4: 0x5118, //CJK UNIFIED IDEOGRAPH
+ 0x98D5: 0x4FD4, //CJK UNIFIED IDEOGRAPH
+ 0x98D6: 0x4FDF, //CJK UNIFIED IDEOGRAPH
+ 0x98D7: 0x4FCE, //CJK UNIFIED IDEOGRAPH
+ 0x98D8: 0x4FD8, //CJK UNIFIED IDEOGRAPH
+ 0x98D9: 0x4FDB, //CJK UNIFIED IDEOGRAPH
+ 0x98DA: 0x4FD1, //CJK UNIFIED IDEOGRAPH
+ 0x98DB: 0x4FDA, //CJK UNIFIED IDEOGRAPH
+ 0x98DC: 0x4FD0, //CJK UNIFIED IDEOGRAPH
+ 0x98DD: 0x4FE4, //CJK UNIFIED IDEOGRAPH
+ 0x98DE: 0x4FE5, //CJK UNIFIED IDEOGRAPH
+ 0x98DF: 0x501A, //CJK UNIFIED IDEOGRAPH
+ 0x98E0: 0x5028, //CJK UNIFIED IDEOGRAPH
+ 0x98E1: 0x5014, //CJK UNIFIED IDEOGRAPH
+ 0x98E2: 0x502A, //CJK UNIFIED IDEOGRAPH
+ 0x98E3: 0x5025, //CJK UNIFIED IDEOGRAPH
+ 0x98E4: 0x5005, //CJK UNIFIED IDEOGRAPH
+ 0x98E5: 0x4F1C, //CJK UNIFIED IDEOGRAPH
+ 0x98E6: 0x4FF6, //CJK UNIFIED IDEOGRAPH
+ 0x98E7: 0x5021, //CJK UNIFIED IDEOGRAPH
+ 0x98E8: 0x5029, //CJK UNIFIED IDEOGRAPH
+ 0x98E9: 0x502C, //CJK UNIFIED IDEOGRAPH
+ 0x98EA: 0x4FFE, //CJK UNIFIED IDEOGRAPH
+ 0x98EB: 0x4FEF, //CJK UNIFIED IDEOGRAPH
+ 0x98EC: 0x5011, //CJK UNIFIED IDEOGRAPH
+ 0x98ED: 0x5006, //CJK UNIFIED IDEOGRAPH
+ 0x98EE: 0x5043, //CJK UNIFIED IDEOGRAPH
+ 0x98EF: 0x5047, //CJK UNIFIED IDEOGRAPH
+ 0x98F0: 0x6703, //CJK UNIFIED IDEOGRAPH
+ 0x98F1: 0x5055, //CJK UNIFIED IDEOGRAPH
+ 0x98F2: 0x5050, //CJK UNIFIED IDEOGRAPH
+ 0x98F3: 0x5048, //CJK UNIFIED IDEOGRAPH
+ 0x98F4: 0x505A, //CJK UNIFIED IDEOGRAPH
+ 0x98F5: 0x5056, //CJK UNIFIED IDEOGRAPH
+ 0x98F6: 0x506C, //CJK UNIFIED IDEOGRAPH
+ 0x98F7: 0x5078, //CJK UNIFIED IDEOGRAPH
+ 0x98F8: 0x5080, //CJK UNIFIED IDEOGRAPH
+ 0x98F9: 0x509A, //CJK UNIFIED IDEOGRAPH
+ 0x98FA: 0x5085, //CJK UNIFIED IDEOGRAPH
+ 0x98FB: 0x50B4, //CJK UNIFIED IDEOGRAPH
+ 0x98FC: 0x50B2, //CJK UNIFIED IDEOGRAPH
+ 0x9940: 0x50C9, //CJK UNIFIED IDEOGRAPH
+ 0x9941: 0x50CA, //CJK UNIFIED IDEOGRAPH
+ 0x9942: 0x50B3, //CJK UNIFIED IDEOGRAPH
+ 0x9943: 0x50C2, //CJK UNIFIED IDEOGRAPH
+ 0x9944: 0x50D6, //CJK UNIFIED IDEOGRAPH
+ 0x9945: 0x50DE, //CJK UNIFIED IDEOGRAPH
+ 0x9946: 0x50E5, //CJK UNIFIED IDEOGRAPH
+ 0x9947: 0x50ED, //CJK UNIFIED IDEOGRAPH
+ 0x9948: 0x50E3, //CJK UNIFIED IDEOGRAPH
+ 0x9949: 0x50EE, //CJK UNIFIED IDEOGRAPH
+ 0x994A: 0x50F9, //CJK UNIFIED IDEOGRAPH
+ 0x994B: 0x50F5, //CJK UNIFIED IDEOGRAPH
+ 0x994C: 0x5109, //CJK UNIFIED IDEOGRAPH
+ 0x994D: 0x5101, //CJK UNIFIED IDEOGRAPH
+ 0x994E: 0x5102, //CJK UNIFIED IDEOGRAPH
+ 0x994F: 0x5116, //CJK UNIFIED IDEOGRAPH
+ 0x9950: 0x5115, //CJK UNIFIED IDEOGRAPH
+ 0x9951: 0x5114, //CJK UNIFIED IDEOGRAPH
+ 0x9952: 0x511A, //CJK UNIFIED IDEOGRAPH
+ 0x9953: 0x5121, //CJK UNIFIED IDEOGRAPH
+ 0x9954: 0x513A, //CJK UNIFIED IDEOGRAPH
+ 0x9955: 0x5137, //CJK UNIFIED IDEOGRAPH
+ 0x9956: 0x513C, //CJK UNIFIED IDEOGRAPH
+ 0x9957: 0x513B, //CJK UNIFIED IDEOGRAPH
+ 0x9958: 0x513F, //CJK UNIFIED IDEOGRAPH
+ 0x9959: 0x5140, //CJK UNIFIED IDEOGRAPH
+ 0x995A: 0x5152, //CJK UNIFIED IDEOGRAPH
+ 0x995B: 0x514C, //CJK UNIFIED IDEOGRAPH
+ 0x995C: 0x5154, //CJK UNIFIED IDEOGRAPH
+ 0x995D: 0x5162, //CJK UNIFIED IDEOGRAPH
+ 0x995E: 0x7AF8, //CJK UNIFIED IDEOGRAPH
+ 0x995F: 0x5169, //CJK UNIFIED IDEOGRAPH
+ 0x9960: 0x516A, //CJK UNIFIED IDEOGRAPH
+ 0x9961: 0x516E, //CJK UNIFIED IDEOGRAPH
+ 0x9962: 0x5180, //CJK UNIFIED IDEOGRAPH
+ 0x9963: 0x5182, //CJK UNIFIED IDEOGRAPH
+ 0x9964: 0x56D8, //CJK UNIFIED IDEOGRAPH
+ 0x9965: 0x518C, //CJK UNIFIED IDEOGRAPH
+ 0x9966: 0x5189, //CJK UNIFIED IDEOGRAPH
+ 0x9967: 0x518F, //CJK UNIFIED IDEOGRAPH
+ 0x9968: 0x5191, //CJK UNIFIED IDEOGRAPH
+ 0x9969: 0x5193, //CJK UNIFIED IDEOGRAPH
+ 0x996A: 0x5195, //CJK UNIFIED IDEOGRAPH
+ 0x996B: 0x5196, //CJK UNIFIED IDEOGRAPH
+ 0x996C: 0x51A4, //CJK UNIFIED IDEOGRAPH
+ 0x996D: 0x51A6, //CJK UNIFIED IDEOGRAPH
+ 0x996E: 0x51A2, //CJK UNIFIED IDEOGRAPH
+ 0x996F: 0x51A9, //CJK UNIFIED IDEOGRAPH
+ 0x9970: 0x51AA, //CJK UNIFIED IDEOGRAPH
+ 0x9971: 0x51AB, //CJK UNIFIED IDEOGRAPH
+ 0x9972: 0x51B3, //CJK UNIFIED IDEOGRAPH
+ 0x9973: 0x51B1, //CJK UNIFIED IDEOGRAPH
+ 0x9974: 0x51B2, //CJK UNIFIED IDEOGRAPH
+ 0x9975: 0x51B0, //CJK UNIFIED IDEOGRAPH
+ 0x9976: 0x51B5, //CJK UNIFIED IDEOGRAPH
+ 0x9977: 0x51BD, //CJK UNIFIED IDEOGRAPH
+ 0x9978: 0x51C5, //CJK UNIFIED IDEOGRAPH
+ 0x9979: 0x51C9, //CJK UNIFIED IDEOGRAPH
+ 0x997A: 0x51DB, //CJK UNIFIED IDEOGRAPH
+ 0x997B: 0x51E0, //CJK UNIFIED IDEOGRAPH
+ 0x997C: 0x8655, //CJK UNIFIED IDEOGRAPH
+ 0x997D: 0x51E9, //CJK UNIFIED IDEOGRAPH
+ 0x997E: 0x51ED, //CJK UNIFIED IDEOGRAPH
+ 0x9980: 0x51F0, //CJK UNIFIED IDEOGRAPH
+ 0x9981: 0x51F5, //CJK UNIFIED IDEOGRAPH
+ 0x9982: 0x51FE, //CJK UNIFIED IDEOGRAPH
+ 0x9983: 0x5204, //CJK UNIFIED IDEOGRAPH
+ 0x9984: 0x520B, //CJK UNIFIED IDEOGRAPH
+ 0x9985: 0x5214, //CJK UNIFIED IDEOGRAPH
+ 0x9986: 0x520E, //CJK UNIFIED IDEOGRAPH
+ 0x9987: 0x5227, //CJK UNIFIED IDEOGRAPH
+ 0x9988: 0x522A, //CJK UNIFIED IDEOGRAPH
+ 0x9989: 0x522E, //CJK UNIFIED IDEOGRAPH
+ 0x998A: 0x5233, //CJK UNIFIED IDEOGRAPH
+ 0x998B: 0x5239, //CJK UNIFIED IDEOGRAPH
+ 0x998C: 0x524F, //CJK UNIFIED IDEOGRAPH
+ 0x998D: 0x5244, //CJK UNIFIED IDEOGRAPH
+ 0x998E: 0x524B, //CJK UNIFIED IDEOGRAPH
+ 0x998F: 0x524C, //CJK UNIFIED IDEOGRAPH
+ 0x9990: 0x525E, //CJK UNIFIED IDEOGRAPH
+ 0x9991: 0x5254, //CJK UNIFIED IDEOGRAPH
+ 0x9992: 0x526A, //CJK UNIFIED IDEOGRAPH
+ 0x9993: 0x5274, //CJK UNIFIED IDEOGRAPH
+ 0x9994: 0x5269, //CJK UNIFIED IDEOGRAPH
+ 0x9995: 0x5273, //CJK UNIFIED IDEOGRAPH
+ 0x9996: 0x527F, //CJK UNIFIED IDEOGRAPH
+ 0x9997: 0x527D, //CJK UNIFIED IDEOGRAPH
+ 0x9998: 0x528D, //CJK UNIFIED IDEOGRAPH
+ 0x9999: 0x5294, //CJK UNIFIED IDEOGRAPH
+ 0x999A: 0x5292, //CJK UNIFIED IDEOGRAPH
+ 0x999B: 0x5271, //CJK UNIFIED IDEOGRAPH
+ 0x999C: 0x5288, //CJK UNIFIED IDEOGRAPH
+ 0x999D: 0x5291, //CJK UNIFIED IDEOGRAPH
+ 0x999E: 0x8FA8, //CJK UNIFIED IDEOGRAPH
+ 0x999F: 0x8FA7, //CJK UNIFIED IDEOGRAPH
+ 0x99A0: 0x52AC, //CJK UNIFIED IDEOGRAPH
+ 0x99A1: 0x52AD, //CJK UNIFIED IDEOGRAPH
+ 0x99A2: 0x52BC, //CJK UNIFIED IDEOGRAPH
+ 0x99A3: 0x52B5, //CJK UNIFIED IDEOGRAPH
+ 0x99A4: 0x52C1, //CJK UNIFIED IDEOGRAPH
+ 0x99A5: 0x52CD, //CJK UNIFIED IDEOGRAPH
+ 0x99A6: 0x52D7, //CJK UNIFIED IDEOGRAPH
+ 0x99A7: 0x52DE, //CJK UNIFIED IDEOGRAPH
+ 0x99A8: 0x52E3, //CJK UNIFIED IDEOGRAPH
+ 0x99A9: 0x52E6, //CJK UNIFIED IDEOGRAPH
+ 0x99AA: 0x98ED, //CJK UNIFIED IDEOGRAPH
+ 0x99AB: 0x52E0, //CJK UNIFIED IDEOGRAPH
+ 0x99AC: 0x52F3, //CJK UNIFIED IDEOGRAPH
+ 0x99AD: 0x52F5, //CJK UNIFIED IDEOGRAPH
+ 0x99AE: 0x52F8, //CJK UNIFIED IDEOGRAPH
+ 0x99AF: 0x52F9, //CJK UNIFIED IDEOGRAPH
+ 0x99B0: 0x5306, //CJK UNIFIED IDEOGRAPH
+ 0x99B1: 0x5308, //CJK UNIFIED IDEOGRAPH
+ 0x99B2: 0x7538, //CJK UNIFIED IDEOGRAPH
+ 0x99B3: 0x530D, //CJK UNIFIED IDEOGRAPH
+ 0x99B4: 0x5310, //CJK UNIFIED IDEOGRAPH
+ 0x99B5: 0x530F, //CJK UNIFIED IDEOGRAPH
+ 0x99B6: 0x5315, //CJK UNIFIED IDEOGRAPH
+ 0x99B7: 0x531A, //CJK UNIFIED IDEOGRAPH
+ 0x99B8: 0x5323, //CJK UNIFIED IDEOGRAPH
+ 0x99B9: 0x532F, //CJK UNIFIED IDEOGRAPH
+ 0x99BA: 0x5331, //CJK UNIFIED IDEOGRAPH
+ 0x99BB: 0x5333, //CJK UNIFIED IDEOGRAPH
+ 0x99BC: 0x5338, //CJK UNIFIED IDEOGRAPH
+ 0x99BD: 0x5340, //CJK UNIFIED IDEOGRAPH
+ 0x99BE: 0x5346, //CJK UNIFIED IDEOGRAPH
+ 0x99BF: 0x5345, //CJK UNIFIED IDEOGRAPH
+ 0x99C0: 0x4E17, //CJK UNIFIED IDEOGRAPH
+ 0x99C1: 0x5349, //CJK UNIFIED IDEOGRAPH
+ 0x99C2: 0x534D, //CJK UNIFIED IDEOGRAPH
+ 0x99C3: 0x51D6, //CJK UNIFIED IDEOGRAPH
+ 0x99C4: 0x535E, //CJK UNIFIED IDEOGRAPH
+ 0x99C5: 0x5369, //CJK UNIFIED IDEOGRAPH
+ 0x99C6: 0x536E, //CJK UNIFIED IDEOGRAPH
+ 0x99C7: 0x5918, //CJK UNIFIED IDEOGRAPH
+ 0x99C8: 0x537B, //CJK UNIFIED IDEOGRAPH
+ 0x99C9: 0x5377, //CJK UNIFIED IDEOGRAPH
+ 0x99CA: 0x5382, //CJK UNIFIED IDEOGRAPH
+ 0x99CB: 0x5396, //CJK UNIFIED IDEOGRAPH
+ 0x99CC: 0x53A0, //CJK UNIFIED IDEOGRAPH
+ 0x99CD: 0x53A6, //CJK UNIFIED IDEOGRAPH
+ 0x99CE: 0x53A5, //CJK UNIFIED IDEOGRAPH
+ 0x99CF: 0x53AE, //CJK UNIFIED IDEOGRAPH
+ 0x99D0: 0x53B0, //CJK UNIFIED IDEOGRAPH
+ 0x99D1: 0x53B6, //CJK UNIFIED IDEOGRAPH
+ 0x99D2: 0x53C3, //CJK UNIFIED IDEOGRAPH
+ 0x99D3: 0x7C12, //CJK UNIFIED IDEOGRAPH
+ 0x99D4: 0x96D9, //CJK UNIFIED IDEOGRAPH
+ 0x99D5: 0x53DF, //CJK UNIFIED IDEOGRAPH
+ 0x99D6: 0x66FC, //CJK UNIFIED IDEOGRAPH
+ 0x99D7: 0x71EE, //CJK UNIFIED IDEOGRAPH
+ 0x99D8: 0x53EE, //CJK UNIFIED IDEOGRAPH
+ 0x99D9: 0x53E8, //CJK UNIFIED IDEOGRAPH
+ 0x99DA: 0x53ED, //CJK UNIFIED IDEOGRAPH
+ 0x99DB: 0x53FA, //CJK UNIFIED IDEOGRAPH
+ 0x99DC: 0x5401, //CJK UNIFIED IDEOGRAPH
+ 0x99DD: 0x543D, //CJK UNIFIED IDEOGRAPH
+ 0x99DE: 0x5440, //CJK UNIFIED IDEOGRAPH
+ 0x99DF: 0x542C, //CJK UNIFIED IDEOGRAPH
+ 0x99E0: 0x542D, //CJK UNIFIED IDEOGRAPH
+ 0x99E1: 0x543C, //CJK UNIFIED IDEOGRAPH
+ 0x99E2: 0x542E, //CJK UNIFIED IDEOGRAPH
+ 0x99E3: 0x5436, //CJK UNIFIED IDEOGRAPH
+ 0x99E4: 0x5429, //CJK UNIFIED IDEOGRAPH
+ 0x99E5: 0x541D, //CJK UNIFIED IDEOGRAPH
+ 0x99E6: 0x544E, //CJK UNIFIED IDEOGRAPH
+ 0x99E7: 0x548F, //CJK UNIFIED IDEOGRAPH
+ 0x99E8: 0x5475, //CJK UNIFIED IDEOGRAPH
+ 0x99E9: 0x548E, //CJK UNIFIED IDEOGRAPH
+ 0x99EA: 0x545F, //CJK UNIFIED IDEOGRAPH
+ 0x99EB: 0x5471, //CJK UNIFIED IDEOGRAPH
+ 0x99EC: 0x5477, //CJK UNIFIED IDEOGRAPH
+ 0x99ED: 0x5470, //CJK UNIFIED IDEOGRAPH
+ 0x99EE: 0x5492, //CJK UNIFIED IDEOGRAPH
+ 0x99EF: 0x547B, //CJK UNIFIED IDEOGRAPH
+ 0x99F0: 0x5480, //CJK UNIFIED IDEOGRAPH
+ 0x99F1: 0x5476, //CJK UNIFIED IDEOGRAPH
+ 0x99F2: 0x5484, //CJK UNIFIED IDEOGRAPH
+ 0x99F3: 0x5490, //CJK UNIFIED IDEOGRAPH
+ 0x99F4: 0x5486, //CJK UNIFIED IDEOGRAPH
+ 0x99F5: 0x54C7, //CJK UNIFIED IDEOGRAPH
+ 0x99F6: 0x54A2, //CJK UNIFIED IDEOGRAPH
+ 0x99F7: 0x54B8, //CJK UNIFIED IDEOGRAPH
+ 0x99F8: 0x54A5, //CJK UNIFIED IDEOGRAPH
+ 0x99F9: 0x54AC, //CJK UNIFIED IDEOGRAPH
+ 0x99FA: 0x54C4, //CJK UNIFIED IDEOGRAPH
+ 0x99FB: 0x54C8, //CJK UNIFIED IDEOGRAPH
+ 0x99FC: 0x54A8, //CJK UNIFIED IDEOGRAPH
+ 0x9A40: 0x54AB, //CJK UNIFIED IDEOGRAPH
+ 0x9A41: 0x54C2, //CJK UNIFIED IDEOGRAPH
+ 0x9A42: 0x54A4, //CJK UNIFIED IDEOGRAPH
+ 0x9A43: 0x54BE, //CJK UNIFIED IDEOGRAPH
+ 0x9A44: 0x54BC, //CJK UNIFIED IDEOGRAPH
+ 0x9A45: 0x54D8, //CJK UNIFIED IDEOGRAPH
+ 0x9A46: 0x54E5, //CJK UNIFIED IDEOGRAPH
+ 0x9A47: 0x54E6, //CJK UNIFIED IDEOGRAPH
+ 0x9A48: 0x550F, //CJK UNIFIED IDEOGRAPH
+ 0x9A49: 0x5514, //CJK UNIFIED IDEOGRAPH
+ 0x9A4A: 0x54FD, //CJK UNIFIED IDEOGRAPH
+ 0x9A4B: 0x54EE, //CJK UNIFIED IDEOGRAPH
+ 0x9A4C: 0x54ED, //CJK UNIFIED IDEOGRAPH
+ 0x9A4D: 0x54FA, //CJK UNIFIED IDEOGRAPH
+ 0x9A4E: 0x54E2, //CJK UNIFIED IDEOGRAPH
+ 0x9A4F: 0x5539, //CJK UNIFIED IDEOGRAPH
+ 0x9A50: 0x5540, //CJK UNIFIED IDEOGRAPH
+ 0x9A51: 0x5563, //CJK UNIFIED IDEOGRAPH
+ 0x9A52: 0x554C, //CJK UNIFIED IDEOGRAPH
+ 0x9A53: 0x552E, //CJK UNIFIED IDEOGRAPH
+ 0x9A54: 0x555C, //CJK UNIFIED IDEOGRAPH
+ 0x9A55: 0x5545, //CJK UNIFIED IDEOGRAPH
+ 0x9A56: 0x5556, //CJK UNIFIED IDEOGRAPH
+ 0x9A57: 0x5557, //CJK UNIFIED IDEOGRAPH
+ 0x9A58: 0x5538, //CJK UNIFIED IDEOGRAPH
+ 0x9A59: 0x5533, //CJK UNIFIED IDEOGRAPH
+ 0x9A5A: 0x555D, //CJK UNIFIED IDEOGRAPH
+ 0x9A5B: 0x5599, //CJK UNIFIED IDEOGRAPH
+ 0x9A5C: 0x5580, //CJK UNIFIED IDEOGRAPH
+ 0x9A5D: 0x54AF, //CJK UNIFIED IDEOGRAPH
+ 0x9A5E: 0x558A, //CJK UNIFIED IDEOGRAPH
+ 0x9A5F: 0x559F, //CJK UNIFIED IDEOGRAPH
+ 0x9A60: 0x557B, //CJK UNIFIED IDEOGRAPH
+ 0x9A61: 0x557E, //CJK UNIFIED IDEOGRAPH
+ 0x9A62: 0x5598, //CJK UNIFIED IDEOGRAPH
+ 0x9A63: 0x559E, //CJK UNIFIED IDEOGRAPH
+ 0x9A64: 0x55AE, //CJK UNIFIED IDEOGRAPH
+ 0x9A65: 0x557C, //CJK UNIFIED IDEOGRAPH
+ 0x9A66: 0x5583, //CJK UNIFIED IDEOGRAPH
+ 0x9A67: 0x55A9, //CJK UNIFIED IDEOGRAPH
+ 0x9A68: 0x5587, //CJK UNIFIED IDEOGRAPH
+ 0x9A69: 0x55A8, //CJK UNIFIED IDEOGRAPH
+ 0x9A6A: 0x55DA, //CJK UNIFIED IDEOGRAPH
+ 0x9A6B: 0x55C5, //CJK UNIFIED IDEOGRAPH
+ 0x9A6C: 0x55DF, //CJK UNIFIED IDEOGRAPH
+ 0x9A6D: 0x55C4, //CJK UNIFIED IDEOGRAPH
+ 0x9A6E: 0x55DC, //CJK UNIFIED IDEOGRAPH
+ 0x9A6F: 0x55E4, //CJK UNIFIED IDEOGRAPH
+ 0x9A70: 0x55D4, //CJK UNIFIED IDEOGRAPH
+ 0x9A71: 0x5614, //CJK UNIFIED IDEOGRAPH
+ 0x9A72: 0x55F7, //CJK UNIFIED IDEOGRAPH
+ 0x9A73: 0x5616, //CJK UNIFIED IDEOGRAPH
+ 0x9A74: 0x55FE, //CJK UNIFIED IDEOGRAPH
+ 0x9A75: 0x55FD, //CJK UNIFIED IDEOGRAPH
+ 0x9A76: 0x561B, //CJK UNIFIED IDEOGRAPH
+ 0x9A77: 0x55F9, //CJK UNIFIED IDEOGRAPH
+ 0x9A78: 0x564E, //CJK UNIFIED IDEOGRAPH
+ 0x9A79: 0x5650, //CJK UNIFIED IDEOGRAPH
+ 0x9A7A: 0x71DF, //CJK UNIFIED IDEOGRAPH
+ 0x9A7B: 0x5634, //CJK UNIFIED IDEOGRAPH
+ 0x9A7C: 0x5636, //CJK UNIFIED IDEOGRAPH
+ 0x9A7D: 0x5632, //CJK UNIFIED IDEOGRAPH
+ 0x9A7E: 0x5638, //CJK UNIFIED IDEOGRAPH
+ 0x9A80: 0x566B, //CJK UNIFIED IDEOGRAPH
+ 0x9A81: 0x5664, //CJK UNIFIED IDEOGRAPH
+ 0x9A82: 0x562F, //CJK UNIFIED IDEOGRAPH
+ 0x9A83: 0x566C, //CJK UNIFIED IDEOGRAPH
+ 0x9A84: 0x566A, //CJK UNIFIED IDEOGRAPH
+ 0x9A85: 0x5686, //CJK UNIFIED IDEOGRAPH
+ 0x9A86: 0x5680, //CJK UNIFIED IDEOGRAPH
+ 0x9A87: 0x568A, //CJK UNIFIED IDEOGRAPH
+ 0x9A88: 0x56A0, //CJK UNIFIED IDEOGRAPH
+ 0x9A89: 0x5694, //CJK UNIFIED IDEOGRAPH
+ 0x9A8A: 0x568F, //CJK UNIFIED IDEOGRAPH
+ 0x9A8B: 0x56A5, //CJK UNIFIED IDEOGRAPH
+ 0x9A8C: 0x56AE, //CJK UNIFIED IDEOGRAPH
+ 0x9A8D: 0x56B6, //CJK UNIFIED IDEOGRAPH
+ 0x9A8E: 0x56B4, //CJK UNIFIED IDEOGRAPH
+ 0x9A8F: 0x56C2, //CJK UNIFIED IDEOGRAPH
+ 0x9A90: 0x56BC, //CJK UNIFIED IDEOGRAPH
+ 0x9A91: 0x56C1, //CJK UNIFIED IDEOGRAPH
+ 0x9A92: 0x56C3, //CJK UNIFIED IDEOGRAPH
+ 0x9A93: 0x56C0, //CJK UNIFIED IDEOGRAPH
+ 0x9A94: 0x56C8, //CJK UNIFIED IDEOGRAPH
+ 0x9A95: 0x56CE, //CJK UNIFIED IDEOGRAPH
+ 0x9A96: 0x56D1, //CJK UNIFIED IDEOGRAPH
+ 0x9A97: 0x56D3, //CJK UNIFIED IDEOGRAPH
+ 0x9A98: 0x56D7, //CJK UNIFIED IDEOGRAPH
+ 0x9A99: 0x56EE, //CJK UNIFIED IDEOGRAPH
+ 0x9A9A: 0x56F9, //CJK UNIFIED IDEOGRAPH
+ 0x9A9B: 0x5700, //CJK UNIFIED IDEOGRAPH
+ 0x9A9C: 0x56FF, //CJK UNIFIED IDEOGRAPH
+ 0x9A9D: 0x5704, //CJK UNIFIED IDEOGRAPH
+ 0x9A9E: 0x5709, //CJK UNIFIED IDEOGRAPH
+ 0x9A9F: 0x5708, //CJK UNIFIED IDEOGRAPH
+ 0x9AA0: 0x570B, //CJK UNIFIED IDEOGRAPH
+ 0x9AA1: 0x570D, //CJK UNIFIED IDEOGRAPH
+ 0x9AA2: 0x5713, //CJK UNIFIED IDEOGRAPH
+ 0x9AA3: 0x5718, //CJK UNIFIED IDEOGRAPH
+ 0x9AA4: 0x5716, //CJK UNIFIED IDEOGRAPH
+ 0x9AA5: 0x55C7, //CJK UNIFIED IDEOGRAPH
+ 0x9AA6: 0x571C, //CJK UNIFIED IDEOGRAPH
+ 0x9AA7: 0x5726, //CJK UNIFIED IDEOGRAPH
+ 0x9AA8: 0x5737, //CJK UNIFIED IDEOGRAPH
+ 0x9AA9: 0x5738, //CJK UNIFIED IDEOGRAPH
+ 0x9AAA: 0x574E, //CJK UNIFIED IDEOGRAPH
+ 0x9AAB: 0x573B, //CJK UNIFIED IDEOGRAPH
+ 0x9AAC: 0x5740, //CJK UNIFIED IDEOGRAPH
+ 0x9AAD: 0x574F, //CJK UNIFIED IDEOGRAPH
+ 0x9AAE: 0x5769, //CJK UNIFIED IDEOGRAPH
+ 0x9AAF: 0x57C0, //CJK UNIFIED IDEOGRAPH
+ 0x9AB0: 0x5788, //CJK UNIFIED IDEOGRAPH
+ 0x9AB1: 0x5761, //CJK UNIFIED IDEOGRAPH
+ 0x9AB2: 0x577F, //CJK UNIFIED IDEOGRAPH
+ 0x9AB3: 0x5789, //CJK UNIFIED IDEOGRAPH
+ 0x9AB4: 0x5793, //CJK UNIFIED IDEOGRAPH
+ 0x9AB5: 0x57A0, //CJK UNIFIED IDEOGRAPH
+ 0x9AB6: 0x57B3, //CJK UNIFIED IDEOGRAPH
+ 0x9AB7: 0x57A4, //CJK UNIFIED IDEOGRAPH
+ 0x9AB8: 0x57AA, //CJK UNIFIED IDEOGRAPH
+ 0x9AB9: 0x57B0, //CJK UNIFIED IDEOGRAPH
+ 0x9ABA: 0x57C3, //CJK UNIFIED IDEOGRAPH
+ 0x9ABB: 0x57C6, //CJK UNIFIED IDEOGRAPH
+ 0x9ABC: 0x57D4, //CJK UNIFIED IDEOGRAPH
+ 0x9ABD: 0x57D2, //CJK UNIFIED IDEOGRAPH
+ 0x9ABE: 0x57D3, //CJK UNIFIED IDEOGRAPH
+ 0x9ABF: 0x580A, //CJK UNIFIED IDEOGRAPH
+ 0x9AC0: 0x57D6, //CJK UNIFIED IDEOGRAPH
+ 0x9AC1: 0x57E3, //CJK UNIFIED IDEOGRAPH
+ 0x9AC2: 0x580B, //CJK UNIFIED IDEOGRAPH
+ 0x9AC3: 0x5819, //CJK UNIFIED IDEOGRAPH
+ 0x9AC4: 0x581D, //CJK UNIFIED IDEOGRAPH
+ 0x9AC5: 0x5872, //CJK UNIFIED IDEOGRAPH
+ 0x9AC6: 0x5821, //CJK UNIFIED IDEOGRAPH
+ 0x9AC7: 0x5862, //CJK UNIFIED IDEOGRAPH
+ 0x9AC8: 0x584B, //CJK UNIFIED IDEOGRAPH
+ 0x9AC9: 0x5870, //CJK UNIFIED IDEOGRAPH
+ 0x9ACA: 0x6BC0, //CJK UNIFIED IDEOGRAPH
+ 0x9ACB: 0x5852, //CJK UNIFIED IDEOGRAPH
+ 0x9ACC: 0x583D, //CJK UNIFIED IDEOGRAPH
+ 0x9ACD: 0x5879, //CJK UNIFIED IDEOGRAPH
+ 0x9ACE: 0x5885, //CJK UNIFIED IDEOGRAPH
+ 0x9ACF: 0x58B9, //CJK UNIFIED IDEOGRAPH
+ 0x9AD0: 0x589F, //CJK UNIFIED IDEOGRAPH
+ 0x9AD1: 0x58AB, //CJK UNIFIED IDEOGRAPH
+ 0x9AD2: 0x58BA, //CJK UNIFIED IDEOGRAPH
+ 0x9AD3: 0x58DE, //CJK UNIFIED IDEOGRAPH
+ 0x9AD4: 0x58BB, //CJK UNIFIED IDEOGRAPH
+ 0x9AD5: 0x58B8, //CJK UNIFIED IDEOGRAPH
+ 0x9AD6: 0x58AE, //CJK UNIFIED IDEOGRAPH
+ 0x9AD7: 0x58C5, //CJK UNIFIED IDEOGRAPH
+ 0x9AD8: 0x58D3, //CJK UNIFIED IDEOGRAPH
+ 0x9AD9: 0x58D1, //CJK UNIFIED IDEOGRAPH
+ 0x9ADA: 0x58D7, //CJK UNIFIED IDEOGRAPH
+ 0x9ADB: 0x58D9, //CJK UNIFIED IDEOGRAPH
+ 0x9ADC: 0x58D8, //CJK UNIFIED IDEOGRAPH
+ 0x9ADD: 0x58E5, //CJK UNIFIED IDEOGRAPH
+ 0x9ADE: 0x58DC, //CJK UNIFIED IDEOGRAPH
+ 0x9ADF: 0x58E4, //CJK UNIFIED IDEOGRAPH
+ 0x9AE0: 0x58DF, //CJK UNIFIED IDEOGRAPH
+ 0x9AE1: 0x58EF, //CJK UNIFIED IDEOGRAPH
+ 0x9AE2: 0x58FA, //CJK UNIFIED IDEOGRAPH
+ 0x9AE3: 0x58F9, //CJK UNIFIED IDEOGRAPH
+ 0x9AE4: 0x58FB, //CJK UNIFIED IDEOGRAPH
+ 0x9AE5: 0x58FC, //CJK UNIFIED IDEOGRAPH
+ 0x9AE6: 0x58FD, //CJK UNIFIED IDEOGRAPH
+ 0x9AE7: 0x5902, //CJK UNIFIED IDEOGRAPH
+ 0x9AE8: 0x590A, //CJK UNIFIED IDEOGRAPH
+ 0x9AE9: 0x5910, //CJK UNIFIED IDEOGRAPH
+ 0x9AEA: 0x591B, //CJK UNIFIED IDEOGRAPH
+ 0x9AEB: 0x68A6, //CJK UNIFIED IDEOGRAPH
+ 0x9AEC: 0x5925, //CJK UNIFIED IDEOGRAPH
+ 0x9AED: 0x592C, //CJK UNIFIED IDEOGRAPH
+ 0x9AEE: 0x592D, //CJK UNIFIED IDEOGRAPH
+ 0x9AEF: 0x5932, //CJK UNIFIED IDEOGRAPH
+ 0x9AF0: 0x5938, //CJK UNIFIED IDEOGRAPH
+ 0x9AF1: 0x593E, //CJK UNIFIED IDEOGRAPH
+ 0x9AF2: 0x7AD2, //CJK UNIFIED IDEOGRAPH
+ 0x9AF3: 0x5955, //CJK UNIFIED IDEOGRAPH
+ 0x9AF4: 0x5950, //CJK UNIFIED IDEOGRAPH
+ 0x9AF5: 0x594E, //CJK UNIFIED IDEOGRAPH
+ 0x9AF6: 0x595A, //CJK UNIFIED IDEOGRAPH
+ 0x9AF7: 0x5958, //CJK UNIFIED IDEOGRAPH
+ 0x9AF8: 0x5962, //CJK UNIFIED IDEOGRAPH
+ 0x9AF9: 0x5960, //CJK UNIFIED IDEOGRAPH
+ 0x9AFA: 0x5967, //CJK UNIFIED IDEOGRAPH
+ 0x9AFB: 0x596C, //CJK UNIFIED IDEOGRAPH
+ 0x9AFC: 0x5969, //CJK UNIFIED IDEOGRAPH
+ 0x9B40: 0x5978, //CJK UNIFIED IDEOGRAPH
+ 0x9B41: 0x5981, //CJK UNIFIED IDEOGRAPH
+ 0x9B42: 0x599D, //CJK UNIFIED IDEOGRAPH
+ 0x9B43: 0x4F5E, //CJK UNIFIED IDEOGRAPH
+ 0x9B44: 0x4FAB, //CJK UNIFIED IDEOGRAPH
+ 0x9B45: 0x59A3, //CJK UNIFIED IDEOGRAPH
+ 0x9B46: 0x59B2, //CJK UNIFIED IDEOGRAPH
+ 0x9B47: 0x59C6, //CJK UNIFIED IDEOGRAPH
+ 0x9B48: 0x59E8, //CJK UNIFIED IDEOGRAPH
+ 0x9B49: 0x59DC, //CJK UNIFIED IDEOGRAPH
+ 0x9B4A: 0x598D, //CJK UNIFIED IDEOGRAPH
+ 0x9B4B: 0x59D9, //CJK UNIFIED IDEOGRAPH
+ 0x9B4C: 0x59DA, //CJK UNIFIED IDEOGRAPH
+ 0x9B4D: 0x5A25, //CJK UNIFIED IDEOGRAPH
+ 0x9B4E: 0x5A1F, //CJK UNIFIED IDEOGRAPH
+ 0x9B4F: 0x5A11, //CJK UNIFIED IDEOGRAPH
+ 0x9B50: 0x5A1C, //CJK UNIFIED IDEOGRAPH
+ 0x9B51: 0x5A09, //CJK UNIFIED IDEOGRAPH
+ 0x9B52: 0x5A1A, //CJK UNIFIED IDEOGRAPH
+ 0x9B53: 0x5A40, //CJK UNIFIED IDEOGRAPH
+ 0x9B54: 0x5A6C, //CJK UNIFIED IDEOGRAPH
+ 0x9B55: 0x5A49, //CJK UNIFIED IDEOGRAPH
+ 0x9B56: 0x5A35, //CJK UNIFIED IDEOGRAPH
+ 0x9B57: 0x5A36, //CJK UNIFIED IDEOGRAPH
+ 0x9B58: 0x5A62, //CJK UNIFIED IDEOGRAPH
+ 0x9B59: 0x5A6A, //CJK UNIFIED IDEOGRAPH
+ 0x9B5A: 0x5A9A, //CJK UNIFIED IDEOGRAPH
+ 0x9B5B: 0x5ABC, //CJK UNIFIED IDEOGRAPH
+ 0x9B5C: 0x5ABE, //CJK UNIFIED IDEOGRAPH
+ 0x9B5D: 0x5ACB, //CJK UNIFIED IDEOGRAPH
+ 0x9B5E: 0x5AC2, //CJK UNIFIED IDEOGRAPH
+ 0x9B5F: 0x5ABD, //CJK UNIFIED IDEOGRAPH
+ 0x9B60: 0x5AE3, //CJK UNIFIED IDEOGRAPH
+ 0x9B61: 0x5AD7, //CJK UNIFIED IDEOGRAPH
+ 0x9B62: 0x5AE6, //CJK UNIFIED IDEOGRAPH
+ 0x9B63: 0x5AE9, //CJK UNIFIED IDEOGRAPH
+ 0x9B64: 0x5AD6, //CJK UNIFIED IDEOGRAPH
+ 0x9B65: 0x5AFA, //CJK UNIFIED IDEOGRAPH
+ 0x9B66: 0x5AFB, //CJK UNIFIED IDEOGRAPH
+ 0x9B67: 0x5B0C, //CJK UNIFIED IDEOGRAPH
+ 0x9B68: 0x5B0B, //CJK UNIFIED IDEOGRAPH
+ 0x9B69: 0x5B16, //CJK UNIFIED IDEOGRAPH
+ 0x9B6A: 0x5B32, //CJK UNIFIED IDEOGRAPH
+ 0x9B6B: 0x5AD0, //CJK UNIFIED IDEOGRAPH
+ 0x9B6C: 0x5B2A, //CJK UNIFIED IDEOGRAPH
+ 0x9B6D: 0x5B36, //CJK UNIFIED IDEOGRAPH
+ 0x9B6E: 0x5B3E, //CJK UNIFIED IDEOGRAPH
+ 0x9B6F: 0x5B43, //CJK UNIFIED IDEOGRAPH
+ 0x9B70: 0x5B45, //CJK UNIFIED IDEOGRAPH
+ 0x9B71: 0x5B40, //CJK UNIFIED IDEOGRAPH
+ 0x9B72: 0x5B51, //CJK UNIFIED IDEOGRAPH
+ 0x9B73: 0x5B55, //CJK UNIFIED IDEOGRAPH
+ 0x9B74: 0x5B5A, //CJK UNIFIED IDEOGRAPH
+ 0x9B75: 0x5B5B, //CJK UNIFIED IDEOGRAPH
+ 0x9B76: 0x5B65, //CJK UNIFIED IDEOGRAPH
+ 0x9B77: 0x5B69, //CJK UNIFIED IDEOGRAPH
+ 0x9B78: 0x5B70, //CJK UNIFIED IDEOGRAPH
+ 0x9B79: 0x5B73, //CJK UNIFIED IDEOGRAPH
+ 0x9B7A: 0x5B75, //CJK UNIFIED IDEOGRAPH
+ 0x9B7B: 0x5B78, //CJK UNIFIED IDEOGRAPH
+ 0x9B7C: 0x6588, //CJK UNIFIED IDEOGRAPH
+ 0x9B7D: 0x5B7A, //CJK UNIFIED IDEOGRAPH
+ 0x9B7E: 0x5B80, //CJK UNIFIED IDEOGRAPH
+ 0x9B80: 0x5B83, //CJK UNIFIED IDEOGRAPH
+ 0x9B81: 0x5BA6, //CJK UNIFIED IDEOGRAPH
+ 0x9B82: 0x5BB8, //CJK UNIFIED IDEOGRAPH
+ 0x9B83: 0x5BC3, //CJK UNIFIED IDEOGRAPH
+ 0x9B84: 0x5BC7, //CJK UNIFIED IDEOGRAPH
+ 0x9B85: 0x5BC9, //CJK UNIFIED IDEOGRAPH
+ 0x9B86: 0x5BD4, //CJK UNIFIED IDEOGRAPH
+ 0x9B87: 0x5BD0, //CJK UNIFIED IDEOGRAPH
+ 0x9B88: 0x5BE4, //CJK UNIFIED IDEOGRAPH
+ 0x9B89: 0x5BE6, //CJK UNIFIED IDEOGRAPH
+ 0x9B8A: 0x5BE2, //CJK UNIFIED IDEOGRAPH
+ 0x9B8B: 0x5BDE, //CJK UNIFIED IDEOGRAPH
+ 0x9B8C: 0x5BE5, //CJK UNIFIED IDEOGRAPH
+ 0x9B8D: 0x5BEB, //CJK UNIFIED IDEOGRAPH
+ 0x9B8E: 0x5BF0, //CJK UNIFIED IDEOGRAPH
+ 0x9B8F: 0x5BF6, //CJK UNIFIED IDEOGRAPH
+ 0x9B90: 0x5BF3, //CJK UNIFIED IDEOGRAPH
+ 0x9B91: 0x5C05, //CJK UNIFIED IDEOGRAPH
+ 0x9B92: 0x5C07, //CJK UNIFIED IDEOGRAPH
+ 0x9B93: 0x5C08, //CJK UNIFIED IDEOGRAPH
+ 0x9B94: 0x5C0D, //CJK UNIFIED IDEOGRAPH
+ 0x9B95: 0x5C13, //CJK UNIFIED IDEOGRAPH
+ 0x9B96: 0x5C20, //CJK UNIFIED IDEOGRAPH
+ 0x9B97: 0x5C22, //CJK UNIFIED IDEOGRAPH
+ 0x9B98: 0x5C28, //CJK UNIFIED IDEOGRAPH
+ 0x9B99: 0x5C38, //CJK UNIFIED IDEOGRAPH
+ 0x9B9A: 0x5C39, //CJK UNIFIED IDEOGRAPH
+ 0x9B9B: 0x5C41, //CJK UNIFIED IDEOGRAPH
+ 0x9B9C: 0x5C46, //CJK UNIFIED IDEOGRAPH
+ 0x9B9D: 0x5C4E, //CJK UNIFIED IDEOGRAPH
+ 0x9B9E: 0x5C53, //CJK UNIFIED IDEOGRAPH
+ 0x9B9F: 0x5C50, //CJK UNIFIED IDEOGRAPH
+ 0x9BA0: 0x5C4F, //CJK UNIFIED IDEOGRAPH
+ 0x9BA1: 0x5B71, //CJK UNIFIED IDEOGRAPH
+ 0x9BA2: 0x5C6C, //CJK UNIFIED IDEOGRAPH
+ 0x9BA3: 0x5C6E, //CJK UNIFIED IDEOGRAPH
+ 0x9BA4: 0x4E62, //CJK UNIFIED IDEOGRAPH
+ 0x9BA5: 0x5C76, //CJK UNIFIED IDEOGRAPH
+ 0x9BA6: 0x5C79, //CJK UNIFIED IDEOGRAPH
+ 0x9BA7: 0x5C8C, //CJK UNIFIED IDEOGRAPH
+ 0x9BA8: 0x5C91, //CJK UNIFIED IDEOGRAPH
+ 0x9BA9: 0x5C94, //CJK UNIFIED IDEOGRAPH
+ 0x9BAA: 0x599B, //CJK UNIFIED IDEOGRAPH
+ 0x9BAB: 0x5CAB, //CJK UNIFIED IDEOGRAPH
+ 0x9BAC: 0x5CBB, //CJK UNIFIED IDEOGRAPH
+ 0x9BAD: 0x5CB6, //CJK UNIFIED IDEOGRAPH
+ 0x9BAE: 0x5CBC, //CJK UNIFIED IDEOGRAPH
+ 0x9BAF: 0x5CB7, //CJK UNIFIED IDEOGRAPH
+ 0x9BB0: 0x5CC5, //CJK UNIFIED IDEOGRAPH
+ 0x9BB1: 0x5CBE, //CJK UNIFIED IDEOGRAPH
+ 0x9BB2: 0x5CC7, //CJK UNIFIED IDEOGRAPH
+ 0x9BB3: 0x5CD9, //CJK UNIFIED IDEOGRAPH
+ 0x9BB4: 0x5CE9, //CJK UNIFIED IDEOGRAPH
+ 0x9BB5: 0x5CFD, //CJK UNIFIED IDEOGRAPH
+ 0x9BB6: 0x5CFA, //CJK UNIFIED IDEOGRAPH
+ 0x9BB7: 0x5CED, //CJK UNIFIED IDEOGRAPH
+ 0x9BB8: 0x5D8C, //CJK UNIFIED IDEOGRAPH
+ 0x9BB9: 0x5CEA, //CJK UNIFIED IDEOGRAPH
+ 0x9BBA: 0x5D0B, //CJK UNIFIED IDEOGRAPH
+ 0x9BBB: 0x5D15, //CJK UNIFIED IDEOGRAPH
+ 0x9BBC: 0x5D17, //CJK UNIFIED IDEOGRAPH
+ 0x9BBD: 0x5D5C, //CJK UNIFIED IDEOGRAPH
+ 0x9BBE: 0x5D1F, //CJK UNIFIED IDEOGRAPH
+ 0x9BBF: 0x5D1B, //CJK UNIFIED IDEOGRAPH
+ 0x9BC0: 0x5D11, //CJK UNIFIED IDEOGRAPH
+ 0x9BC1: 0x5D14, //CJK UNIFIED IDEOGRAPH
+ 0x9BC2: 0x5D22, //CJK UNIFIED IDEOGRAPH
+ 0x9BC3: 0x5D1A, //CJK UNIFIED IDEOGRAPH
+ 0x9BC4: 0x5D19, //CJK UNIFIED IDEOGRAPH
+ 0x9BC5: 0x5D18, //CJK UNIFIED IDEOGRAPH
+ 0x9BC6: 0x5D4C, //CJK UNIFIED IDEOGRAPH
+ 0x9BC7: 0x5D52, //CJK UNIFIED IDEOGRAPH
+ 0x9BC8: 0x5D4E, //CJK UNIFIED IDEOGRAPH
+ 0x9BC9: 0x5D4B, //CJK UNIFIED IDEOGRAPH
+ 0x9BCA: 0x5D6C, //CJK UNIFIED IDEOGRAPH
+ 0x9BCB: 0x5D73, //CJK UNIFIED IDEOGRAPH
+ 0x9BCC: 0x5D76, //CJK UNIFIED IDEOGRAPH
+ 0x9BCD: 0x5D87, //CJK UNIFIED IDEOGRAPH
+ 0x9BCE: 0x5D84, //CJK UNIFIED IDEOGRAPH
+ 0x9BCF: 0x5D82, //CJK UNIFIED IDEOGRAPH
+ 0x9BD0: 0x5DA2, //CJK UNIFIED IDEOGRAPH
+ 0x9BD1: 0x5D9D, //CJK UNIFIED IDEOGRAPH
+ 0x9BD2: 0x5DAC, //CJK UNIFIED IDEOGRAPH
+ 0x9BD3: 0x5DAE, //CJK UNIFIED IDEOGRAPH
+ 0x9BD4: 0x5DBD, //CJK UNIFIED IDEOGRAPH
+ 0x9BD5: 0x5D90, //CJK UNIFIED IDEOGRAPH
+ 0x9BD6: 0x5DB7, //CJK UNIFIED IDEOGRAPH
+ 0x9BD7: 0x5DBC, //CJK UNIFIED IDEOGRAPH
+ 0x9BD8: 0x5DC9, //CJK UNIFIED IDEOGRAPH
+ 0x9BD9: 0x5DCD, //CJK UNIFIED IDEOGRAPH
+ 0x9BDA: 0x5DD3, //CJK UNIFIED IDEOGRAPH
+ 0x9BDB: 0x5DD2, //CJK UNIFIED IDEOGRAPH
+ 0x9BDC: 0x5DD6, //CJK UNIFIED IDEOGRAPH
+ 0x9BDD: 0x5DDB, //CJK UNIFIED IDEOGRAPH
+ 0x9BDE: 0x5DEB, //CJK UNIFIED IDEOGRAPH
+ 0x9BDF: 0x5DF2, //CJK UNIFIED IDEOGRAPH
+ 0x9BE0: 0x5DF5, //CJK UNIFIED IDEOGRAPH
+ 0x9BE1: 0x5E0B, //CJK UNIFIED IDEOGRAPH
+ 0x9BE2: 0x5E1A, //CJK UNIFIED IDEOGRAPH
+ 0x9BE3: 0x5E19, //CJK UNIFIED IDEOGRAPH
+ 0x9BE4: 0x5E11, //CJK UNIFIED IDEOGRAPH
+ 0x9BE5: 0x5E1B, //CJK UNIFIED IDEOGRAPH
+ 0x9BE6: 0x5E36, //CJK UNIFIED IDEOGRAPH
+ 0x9BE7: 0x5E37, //CJK UNIFIED IDEOGRAPH
+ 0x9BE8: 0x5E44, //CJK UNIFIED IDEOGRAPH
+ 0x9BE9: 0x5E43, //CJK UNIFIED IDEOGRAPH
+ 0x9BEA: 0x5E40, //CJK UNIFIED IDEOGRAPH
+ 0x9BEB: 0x5E4E, //CJK UNIFIED IDEOGRAPH
+ 0x9BEC: 0x5E57, //CJK UNIFIED IDEOGRAPH
+ 0x9BED: 0x5E54, //CJK UNIFIED IDEOGRAPH
+ 0x9BEE: 0x5E5F, //CJK UNIFIED IDEOGRAPH
+ 0x9BEF: 0x5E62, //CJK UNIFIED IDEOGRAPH
+ 0x9BF0: 0x5E64, //CJK UNIFIED IDEOGRAPH
+ 0x9BF1: 0x5E47, //CJK UNIFIED IDEOGRAPH
+ 0x9BF2: 0x5E75, //CJK UNIFIED IDEOGRAPH
+ 0x9BF3: 0x5E76, //CJK UNIFIED IDEOGRAPH
+ 0x9BF4: 0x5E7A, //CJK UNIFIED IDEOGRAPH
+ 0x9BF5: 0x9EBC, //CJK UNIFIED IDEOGRAPH
+ 0x9BF6: 0x5E7F, //CJK UNIFIED IDEOGRAPH
+ 0x9BF7: 0x5EA0, //CJK UNIFIED IDEOGRAPH
+ 0x9BF8: 0x5EC1, //CJK UNIFIED IDEOGRAPH
+ 0x9BF9: 0x5EC2, //CJK UNIFIED IDEOGRAPH
+ 0x9BFA: 0x5EC8, //CJK UNIFIED IDEOGRAPH
+ 0x9BFB: 0x5ED0, //CJK UNIFIED IDEOGRAPH
+ 0x9BFC: 0x5ECF, //CJK UNIFIED IDEOGRAPH
+ 0x9C40: 0x5ED6, //CJK UNIFIED IDEOGRAPH
+ 0x9C41: 0x5EE3, //CJK UNIFIED IDEOGRAPH
+ 0x9C42: 0x5EDD, //CJK UNIFIED IDEOGRAPH
+ 0x9C43: 0x5EDA, //CJK UNIFIED IDEOGRAPH
+ 0x9C44: 0x5EDB, //CJK UNIFIED IDEOGRAPH
+ 0x9C45: 0x5EE2, //CJK UNIFIED IDEOGRAPH
+ 0x9C46: 0x5EE1, //CJK UNIFIED IDEOGRAPH
+ 0x9C47: 0x5EE8, //CJK UNIFIED IDEOGRAPH
+ 0x9C48: 0x5EE9, //CJK UNIFIED IDEOGRAPH
+ 0x9C49: 0x5EEC, //CJK UNIFIED IDEOGRAPH
+ 0x9C4A: 0x5EF1, //CJK UNIFIED IDEOGRAPH
+ 0x9C4B: 0x5EF3, //CJK UNIFIED IDEOGRAPH
+ 0x9C4C: 0x5EF0, //CJK UNIFIED IDEOGRAPH
+ 0x9C4D: 0x5EF4, //CJK UNIFIED IDEOGRAPH
+ 0x9C4E: 0x5EF8, //CJK UNIFIED IDEOGRAPH
+ 0x9C4F: 0x5EFE, //CJK UNIFIED IDEOGRAPH
+ 0x9C50: 0x5F03, //CJK UNIFIED IDEOGRAPH
+ 0x9C51: 0x5F09, //CJK UNIFIED IDEOGRAPH
+ 0x9C52: 0x5F5D, //CJK UNIFIED IDEOGRAPH
+ 0x9C53: 0x5F5C, //CJK UNIFIED IDEOGRAPH
+ 0x9C54: 0x5F0B, //CJK UNIFIED IDEOGRAPH
+ 0x9C55: 0x5F11, //CJK UNIFIED IDEOGRAPH
+ 0x9C56: 0x5F16, //CJK UNIFIED IDEOGRAPH
+ 0x9C57: 0x5F29, //CJK UNIFIED IDEOGRAPH
+ 0x9C58: 0x5F2D, //CJK UNIFIED IDEOGRAPH
+ 0x9C59: 0x5F38, //CJK UNIFIED IDEOGRAPH
+ 0x9C5A: 0x5F41, //CJK UNIFIED IDEOGRAPH
+ 0x9C5B: 0x5F48, //CJK UNIFIED IDEOGRAPH
+ 0x9C5C: 0x5F4C, //CJK UNIFIED IDEOGRAPH
+ 0x9C5D: 0x5F4E, //CJK UNIFIED IDEOGRAPH
+ 0x9C5E: 0x5F2F, //CJK UNIFIED IDEOGRAPH
+ 0x9C5F: 0x5F51, //CJK UNIFIED IDEOGRAPH
+ 0x9C60: 0x5F56, //CJK UNIFIED IDEOGRAPH
+ 0x9C61: 0x5F57, //CJK UNIFIED IDEOGRAPH
+ 0x9C62: 0x5F59, //CJK UNIFIED IDEOGRAPH
+ 0x9C63: 0x5F61, //CJK UNIFIED IDEOGRAPH
+ 0x9C64: 0x5F6D, //CJK UNIFIED IDEOGRAPH
+ 0x9C65: 0x5F73, //CJK UNIFIED IDEOGRAPH
+ 0x9C66: 0x5F77, //CJK UNIFIED IDEOGRAPH
+ 0x9C67: 0x5F83, //CJK UNIFIED IDEOGRAPH
+ 0x9C68: 0x5F82, //CJK UNIFIED IDEOGRAPH
+ 0x9C69: 0x5F7F, //CJK UNIFIED IDEOGRAPH
+ 0x9C6A: 0x5F8A, //CJK UNIFIED IDEOGRAPH
+ 0x9C6B: 0x5F88, //CJK UNIFIED IDEOGRAPH
+ 0x9C6C: 0x5F91, //CJK UNIFIED IDEOGRAPH
+ 0x9C6D: 0x5F87, //CJK UNIFIED IDEOGRAPH
+ 0x9C6E: 0x5F9E, //CJK UNIFIED IDEOGRAPH
+ 0x9C6F: 0x5F99, //CJK UNIFIED IDEOGRAPH
+ 0x9C70: 0x5F98, //CJK UNIFIED IDEOGRAPH
+ 0x9C71: 0x5FA0, //CJK UNIFIED IDEOGRAPH
+ 0x9C72: 0x5FA8, //CJK UNIFIED IDEOGRAPH
+ 0x9C73: 0x5FAD, //CJK UNIFIED IDEOGRAPH
+ 0x9C74: 0x5FBC, //CJK UNIFIED IDEOGRAPH
+ 0x9C75: 0x5FD6, //CJK UNIFIED IDEOGRAPH
+ 0x9C76: 0x5FFB, //CJK UNIFIED IDEOGRAPH
+ 0x9C77: 0x5FE4, //CJK UNIFIED IDEOGRAPH
+ 0x9C78: 0x5FF8, //CJK UNIFIED IDEOGRAPH
+ 0x9C79: 0x5FF1, //CJK UNIFIED IDEOGRAPH
+ 0x9C7A: 0x5FDD, //CJK UNIFIED IDEOGRAPH
+ 0x9C7B: 0x60B3, //CJK UNIFIED IDEOGRAPH
+ 0x9C7C: 0x5FFF, //CJK UNIFIED IDEOGRAPH
+ 0x9C7D: 0x6021, //CJK UNIFIED IDEOGRAPH
+ 0x9C7E: 0x6060, //CJK UNIFIED IDEOGRAPH
+ 0x9C80: 0x6019, //CJK UNIFIED IDEOGRAPH
+ 0x9C81: 0x6010, //CJK UNIFIED IDEOGRAPH
+ 0x9C82: 0x6029, //CJK UNIFIED IDEOGRAPH
+ 0x9C83: 0x600E, //CJK UNIFIED IDEOGRAPH
+ 0x9C84: 0x6031, //CJK UNIFIED IDEOGRAPH
+ 0x9C85: 0x601B, //CJK UNIFIED IDEOGRAPH
+ 0x9C86: 0x6015, //CJK UNIFIED IDEOGRAPH
+ 0x9C87: 0x602B, //CJK UNIFIED IDEOGRAPH
+ 0x9C88: 0x6026, //CJK UNIFIED IDEOGRAPH
+ 0x9C89: 0x600F, //CJK UNIFIED IDEOGRAPH
+ 0x9C8A: 0x603A, //CJK UNIFIED IDEOGRAPH
+ 0x9C8B: 0x605A, //CJK UNIFIED IDEOGRAPH
+ 0x9C8C: 0x6041, //CJK UNIFIED IDEOGRAPH
+ 0x9C8D: 0x606A, //CJK UNIFIED IDEOGRAPH
+ 0x9C8E: 0x6077, //CJK UNIFIED IDEOGRAPH
+ 0x9C8F: 0x605F, //CJK UNIFIED IDEOGRAPH
+ 0x9C90: 0x604A, //CJK UNIFIED IDEOGRAPH
+ 0x9C91: 0x6046, //CJK UNIFIED IDEOGRAPH
+ 0x9C92: 0x604D, //CJK UNIFIED IDEOGRAPH
+ 0x9C93: 0x6063, //CJK UNIFIED IDEOGRAPH
+ 0x9C94: 0x6043, //CJK UNIFIED IDEOGRAPH
+ 0x9C95: 0x6064, //CJK UNIFIED IDEOGRAPH
+ 0x9C96: 0x6042, //CJK UNIFIED IDEOGRAPH
+ 0x9C97: 0x606C, //CJK UNIFIED IDEOGRAPH
+ 0x9C98: 0x606B, //CJK UNIFIED IDEOGRAPH
+ 0x9C99: 0x6059, //CJK UNIFIED IDEOGRAPH
+ 0x9C9A: 0x6081, //CJK UNIFIED IDEOGRAPH
+ 0x9C9B: 0x608D, //CJK UNIFIED IDEOGRAPH
+ 0x9C9C: 0x60E7, //CJK UNIFIED IDEOGRAPH
+ 0x9C9D: 0x6083, //CJK UNIFIED IDEOGRAPH
+ 0x9C9E: 0x609A, //CJK UNIFIED IDEOGRAPH
+ 0x9C9F: 0x6084, //CJK UNIFIED IDEOGRAPH
+ 0x9CA0: 0x609B, //CJK UNIFIED IDEOGRAPH
+ 0x9CA1: 0x6096, //CJK UNIFIED IDEOGRAPH
+ 0x9CA2: 0x6097, //CJK UNIFIED IDEOGRAPH
+ 0x9CA3: 0x6092, //CJK UNIFIED IDEOGRAPH
+ 0x9CA4: 0x60A7, //CJK UNIFIED IDEOGRAPH
+ 0x9CA5: 0x608B, //CJK UNIFIED IDEOGRAPH
+ 0x9CA6: 0x60E1, //CJK UNIFIED IDEOGRAPH
+ 0x9CA7: 0x60B8, //CJK UNIFIED IDEOGRAPH
+ 0x9CA8: 0x60E0, //CJK UNIFIED IDEOGRAPH
+ 0x9CA9: 0x60D3, //CJK UNIFIED IDEOGRAPH
+ 0x9CAA: 0x60B4, //CJK UNIFIED IDEOGRAPH
+ 0x9CAB: 0x5FF0, //CJK UNIFIED IDEOGRAPH
+ 0x9CAC: 0x60BD, //CJK UNIFIED IDEOGRAPH
+ 0x9CAD: 0x60C6, //CJK UNIFIED IDEOGRAPH
+ 0x9CAE: 0x60B5, //CJK UNIFIED IDEOGRAPH
+ 0x9CAF: 0x60D8, //CJK UNIFIED IDEOGRAPH
+ 0x9CB0: 0x614D, //CJK UNIFIED IDEOGRAPH
+ 0x9CB1: 0x6115, //CJK UNIFIED IDEOGRAPH
+ 0x9CB2: 0x6106, //CJK UNIFIED IDEOGRAPH
+ 0x9CB3: 0x60F6, //CJK UNIFIED IDEOGRAPH
+ 0x9CB4: 0x60F7, //CJK UNIFIED IDEOGRAPH
+ 0x9CB5: 0x6100, //CJK UNIFIED IDEOGRAPH
+ 0x9CB6: 0x60F4, //CJK UNIFIED IDEOGRAPH
+ 0x9CB7: 0x60FA, //CJK UNIFIED IDEOGRAPH
+ 0x9CB8: 0x6103, //CJK UNIFIED IDEOGRAPH
+ 0x9CB9: 0x6121, //CJK UNIFIED IDEOGRAPH
+ 0x9CBA: 0x60FB, //CJK UNIFIED IDEOGRAPH
+ 0x9CBB: 0x60F1, //CJK UNIFIED IDEOGRAPH
+ 0x9CBC: 0x610D, //CJK UNIFIED IDEOGRAPH
+ 0x9CBD: 0x610E, //CJK UNIFIED IDEOGRAPH
+ 0x9CBE: 0x6147, //CJK UNIFIED IDEOGRAPH
+ 0x9CBF: 0x613E, //CJK UNIFIED IDEOGRAPH
+ 0x9CC0: 0x6128, //CJK UNIFIED IDEOGRAPH
+ 0x9CC1: 0x6127, //CJK UNIFIED IDEOGRAPH
+ 0x9CC2: 0x614A, //CJK UNIFIED IDEOGRAPH
+ 0x9CC3: 0x613F, //CJK UNIFIED IDEOGRAPH
+ 0x9CC4: 0x613C, //CJK UNIFIED IDEOGRAPH
+ 0x9CC5: 0x612C, //CJK UNIFIED IDEOGRAPH
+ 0x9CC6: 0x6134, //CJK UNIFIED IDEOGRAPH
+ 0x9CC7: 0x613D, //CJK UNIFIED IDEOGRAPH
+ 0x9CC8: 0x6142, //CJK UNIFIED IDEOGRAPH
+ 0x9CC9: 0x6144, //CJK UNIFIED IDEOGRAPH
+ 0x9CCA: 0x6173, //CJK UNIFIED IDEOGRAPH
+ 0x9CCB: 0x6177, //CJK UNIFIED IDEOGRAPH
+ 0x9CCC: 0x6158, //CJK UNIFIED IDEOGRAPH
+ 0x9CCD: 0x6159, //CJK UNIFIED IDEOGRAPH
+ 0x9CCE: 0x615A, //CJK UNIFIED IDEOGRAPH
+ 0x9CCF: 0x616B, //CJK UNIFIED IDEOGRAPH
+ 0x9CD0: 0x6174, //CJK UNIFIED IDEOGRAPH
+ 0x9CD1: 0x616F, //CJK UNIFIED IDEOGRAPH
+ 0x9CD2: 0x6165, //CJK UNIFIED IDEOGRAPH
+ 0x9CD3: 0x6171, //CJK UNIFIED IDEOGRAPH
+ 0x9CD4: 0x615F, //CJK UNIFIED IDEOGRAPH
+ 0x9CD5: 0x615D, //CJK UNIFIED IDEOGRAPH
+ 0x9CD6: 0x6153, //CJK UNIFIED IDEOGRAPH
+ 0x9CD7: 0x6175, //CJK UNIFIED IDEOGRAPH
+ 0x9CD8: 0x6199, //CJK UNIFIED IDEOGRAPH
+ 0x9CD9: 0x6196, //CJK UNIFIED IDEOGRAPH
+ 0x9CDA: 0x6187, //CJK UNIFIED IDEOGRAPH
+ 0x9CDB: 0x61AC, //CJK UNIFIED IDEOGRAPH
+ 0x9CDC: 0x6194, //CJK UNIFIED IDEOGRAPH
+ 0x9CDD: 0x619A, //CJK UNIFIED IDEOGRAPH
+ 0x9CDE: 0x618A, //CJK UNIFIED IDEOGRAPH
+ 0x9CDF: 0x6191, //CJK UNIFIED IDEOGRAPH
+ 0x9CE0: 0x61AB, //CJK UNIFIED IDEOGRAPH
+ 0x9CE1: 0x61AE, //CJK UNIFIED IDEOGRAPH
+ 0x9CE2: 0x61CC, //CJK UNIFIED IDEOGRAPH
+ 0x9CE3: 0x61CA, //CJK UNIFIED IDEOGRAPH
+ 0x9CE4: 0x61C9, //CJK UNIFIED IDEOGRAPH
+ 0x9CE5: 0x61F7, //CJK UNIFIED IDEOGRAPH
+ 0x9CE6: 0x61C8, //CJK UNIFIED IDEOGRAPH
+ 0x9CE7: 0x61C3, //CJK UNIFIED IDEOGRAPH
+ 0x9CE8: 0x61C6, //CJK UNIFIED IDEOGRAPH
+ 0x9CE9: 0x61BA, //CJK UNIFIED IDEOGRAPH
+ 0x9CEA: 0x61CB, //CJK UNIFIED IDEOGRAPH
+ 0x9CEB: 0x7F79, //CJK UNIFIED IDEOGRAPH
+ 0x9CEC: 0x61CD, //CJK UNIFIED IDEOGRAPH
+ 0x9CED: 0x61E6, //CJK UNIFIED IDEOGRAPH
+ 0x9CEE: 0x61E3, //CJK UNIFIED IDEOGRAPH
+ 0x9CEF: 0x61F6, //CJK UNIFIED IDEOGRAPH
+ 0x9CF0: 0x61FA, //CJK UNIFIED IDEOGRAPH
+ 0x9CF1: 0x61F4, //CJK UNIFIED IDEOGRAPH
+ 0x9CF2: 0x61FF, //CJK UNIFIED IDEOGRAPH
+ 0x9CF3: 0x61FD, //CJK UNIFIED IDEOGRAPH
+ 0x9CF4: 0x61FC, //CJK UNIFIED IDEOGRAPH
+ 0x9CF5: 0x61FE, //CJK UNIFIED IDEOGRAPH
+ 0x9CF6: 0x6200, //CJK UNIFIED IDEOGRAPH
+ 0x9CF7: 0x6208, //CJK UNIFIED IDEOGRAPH
+ 0x9CF8: 0x6209, //CJK UNIFIED IDEOGRAPH
+ 0x9CF9: 0x620D, //CJK UNIFIED IDEOGRAPH
+ 0x9CFA: 0x620C, //CJK UNIFIED IDEOGRAPH
+ 0x9CFB: 0x6214, //CJK UNIFIED IDEOGRAPH
+ 0x9CFC: 0x621B, //CJK UNIFIED IDEOGRAPH
+ 0x9D40: 0x621E, //CJK UNIFIED IDEOGRAPH
+ 0x9D41: 0x6221, //CJK UNIFIED IDEOGRAPH
+ 0x9D42: 0x622A, //CJK UNIFIED IDEOGRAPH
+ 0x9D43: 0x622E, //CJK UNIFIED IDEOGRAPH
+ 0x9D44: 0x6230, //CJK UNIFIED IDEOGRAPH
+ 0x9D45: 0x6232, //CJK UNIFIED IDEOGRAPH
+ 0x9D46: 0x6233, //CJK UNIFIED IDEOGRAPH
+ 0x9D47: 0x6241, //CJK UNIFIED IDEOGRAPH
+ 0x9D48: 0x624E, //CJK UNIFIED IDEOGRAPH
+ 0x9D49: 0x625E, //CJK UNIFIED IDEOGRAPH
+ 0x9D4A: 0x6263, //CJK UNIFIED IDEOGRAPH
+ 0x9D4B: 0x625B, //CJK UNIFIED IDEOGRAPH
+ 0x9D4C: 0x6260, //CJK UNIFIED IDEOGRAPH
+ 0x9D4D: 0x6268, //CJK UNIFIED IDEOGRAPH
+ 0x9D4E: 0x627C, //CJK UNIFIED IDEOGRAPH
+ 0x9D4F: 0x6282, //CJK UNIFIED IDEOGRAPH
+ 0x9D50: 0x6289, //CJK UNIFIED IDEOGRAPH
+ 0x9D51: 0x627E, //CJK UNIFIED IDEOGRAPH
+ 0x9D52: 0x6292, //CJK UNIFIED IDEOGRAPH
+ 0x9D53: 0x6293, //CJK UNIFIED IDEOGRAPH
+ 0x9D54: 0x6296, //CJK UNIFIED IDEOGRAPH
+ 0x9D55: 0x62D4, //CJK UNIFIED IDEOGRAPH
+ 0x9D56: 0x6283, //CJK UNIFIED IDEOGRAPH
+ 0x9D57: 0x6294, //CJK UNIFIED IDEOGRAPH
+ 0x9D58: 0x62D7, //CJK UNIFIED IDEOGRAPH
+ 0x9D59: 0x62D1, //CJK UNIFIED IDEOGRAPH
+ 0x9D5A: 0x62BB, //CJK UNIFIED IDEOGRAPH
+ 0x9D5B: 0x62CF, //CJK UNIFIED IDEOGRAPH
+ 0x9D5C: 0x62FF, //CJK UNIFIED IDEOGRAPH
+ 0x9D5D: 0x62C6, //CJK UNIFIED IDEOGRAPH
+ 0x9D5E: 0x64D4, //CJK UNIFIED IDEOGRAPH
+ 0x9D5F: 0x62C8, //CJK UNIFIED IDEOGRAPH
+ 0x9D60: 0x62DC, //CJK UNIFIED IDEOGRAPH
+ 0x9D61: 0x62CC, //CJK UNIFIED IDEOGRAPH
+ 0x9D62: 0x62CA, //CJK UNIFIED IDEOGRAPH
+ 0x9D63: 0x62C2, //CJK UNIFIED IDEOGRAPH
+ 0x9D64: 0x62C7, //CJK UNIFIED IDEOGRAPH
+ 0x9D65: 0x629B, //CJK UNIFIED IDEOGRAPH
+ 0x9D66: 0x62C9, //CJK UNIFIED IDEOGRAPH
+ 0x9D67: 0x630C, //CJK UNIFIED IDEOGRAPH
+ 0x9D68: 0x62EE, //CJK UNIFIED IDEOGRAPH
+ 0x9D69: 0x62F1, //CJK UNIFIED IDEOGRAPH
+ 0x9D6A: 0x6327, //CJK UNIFIED IDEOGRAPH
+ 0x9D6B: 0x6302, //CJK UNIFIED IDEOGRAPH
+ 0x9D6C: 0x6308, //CJK UNIFIED IDEOGRAPH
+ 0x9D6D: 0x62EF, //CJK UNIFIED IDEOGRAPH
+ 0x9D6E: 0x62F5, //CJK UNIFIED IDEOGRAPH
+ 0x9D6F: 0x6350, //CJK UNIFIED IDEOGRAPH
+ 0x9D70: 0x633E, //CJK UNIFIED IDEOGRAPH
+ 0x9D71: 0x634D, //CJK UNIFIED IDEOGRAPH
+ 0x9D72: 0x641C, //CJK UNIFIED IDEOGRAPH
+ 0x9D73: 0x634F, //CJK UNIFIED IDEOGRAPH
+ 0x9D74: 0x6396, //CJK UNIFIED IDEOGRAPH
+ 0x9D75: 0x638E, //CJK UNIFIED IDEOGRAPH
+ 0x9D76: 0x6380, //CJK UNIFIED IDEOGRAPH
+ 0x9D77: 0x63AB, //CJK UNIFIED IDEOGRAPH
+ 0x9D78: 0x6376, //CJK UNIFIED IDEOGRAPH
+ 0x9D79: 0x63A3, //CJK UNIFIED IDEOGRAPH
+ 0x9D7A: 0x638F, //CJK UNIFIED IDEOGRAPH
+ 0x9D7B: 0x6389, //CJK UNIFIED IDEOGRAPH
+ 0x9D7C: 0x639F, //CJK UNIFIED IDEOGRAPH
+ 0x9D7D: 0x63B5, //CJK UNIFIED IDEOGRAPH
+ 0x9D7E: 0x636B, //CJK UNIFIED IDEOGRAPH
+ 0x9D80: 0x6369, //CJK UNIFIED IDEOGRAPH
+ 0x9D81: 0x63BE, //CJK UNIFIED IDEOGRAPH
+ 0x9D82: 0x63E9, //CJK UNIFIED IDEOGRAPH
+ 0x9D83: 0x63C0, //CJK UNIFIED IDEOGRAPH
+ 0x9D84: 0x63C6, //CJK UNIFIED IDEOGRAPH
+ 0x9D85: 0x63E3, //CJK UNIFIED IDEOGRAPH
+ 0x9D86: 0x63C9, //CJK UNIFIED IDEOGRAPH
+ 0x9D87: 0x63D2, //CJK UNIFIED IDEOGRAPH
+ 0x9D88: 0x63F6, //CJK UNIFIED IDEOGRAPH
+ 0x9D89: 0x63C4, //CJK UNIFIED IDEOGRAPH
+ 0x9D8A: 0x6416, //CJK UNIFIED IDEOGRAPH
+ 0x9D8B: 0x6434, //CJK UNIFIED IDEOGRAPH
+ 0x9D8C: 0x6406, //CJK UNIFIED IDEOGRAPH
+ 0x9D8D: 0x6413, //CJK UNIFIED IDEOGRAPH
+ 0x9D8E: 0x6426, //CJK UNIFIED IDEOGRAPH
+ 0x9D8F: 0x6436, //CJK UNIFIED IDEOGRAPH
+ 0x9D90: 0x651D, //CJK UNIFIED IDEOGRAPH
+ 0x9D91: 0x6417, //CJK UNIFIED IDEOGRAPH
+ 0x9D92: 0x6428, //CJK UNIFIED IDEOGRAPH
+ 0x9D93: 0x640F, //CJK UNIFIED IDEOGRAPH
+ 0x9D94: 0x6467, //CJK UNIFIED IDEOGRAPH
+ 0x9D95: 0x646F, //CJK UNIFIED IDEOGRAPH
+ 0x9D96: 0x6476, //CJK UNIFIED IDEOGRAPH
+ 0x9D97: 0x644E, //CJK UNIFIED IDEOGRAPH
+ 0x9D98: 0x652A, //CJK UNIFIED IDEOGRAPH
+ 0x9D99: 0x6495, //CJK UNIFIED IDEOGRAPH
+ 0x9D9A: 0x6493, //CJK UNIFIED IDEOGRAPH
+ 0x9D9B: 0x64A5, //CJK UNIFIED IDEOGRAPH
+ 0x9D9C: 0x64A9, //CJK UNIFIED IDEOGRAPH
+ 0x9D9D: 0x6488, //CJK UNIFIED IDEOGRAPH
+ 0x9D9E: 0x64BC, //CJK UNIFIED IDEOGRAPH
+ 0x9D9F: 0x64DA, //CJK UNIFIED IDEOGRAPH
+ 0x9DA0: 0x64D2, //CJK UNIFIED IDEOGRAPH
+ 0x9DA1: 0x64C5, //CJK UNIFIED IDEOGRAPH
+ 0x9DA2: 0x64C7, //CJK UNIFIED IDEOGRAPH
+ 0x9DA3: 0x64BB, //CJK UNIFIED IDEOGRAPH
+ 0x9DA4: 0x64D8, //CJK UNIFIED IDEOGRAPH
+ 0x9DA5: 0x64C2, //CJK UNIFIED IDEOGRAPH
+ 0x9DA6: 0x64F1, //CJK UNIFIED IDEOGRAPH
+ 0x9DA7: 0x64E7, //CJK UNIFIED IDEOGRAPH
+ 0x9DA8: 0x8209, //CJK UNIFIED IDEOGRAPH
+ 0x9DA9: 0x64E0, //CJK UNIFIED IDEOGRAPH
+ 0x9DAA: 0x64E1, //CJK UNIFIED IDEOGRAPH
+ 0x9DAB: 0x62AC, //CJK UNIFIED IDEOGRAPH
+ 0x9DAC: 0x64E3, //CJK UNIFIED IDEOGRAPH
+ 0x9DAD: 0x64EF, //CJK UNIFIED IDEOGRAPH
+ 0x9DAE: 0x652C, //CJK UNIFIED IDEOGRAPH
+ 0x9DAF: 0x64F6, //CJK UNIFIED IDEOGRAPH
+ 0x9DB0: 0x64F4, //CJK UNIFIED IDEOGRAPH
+ 0x9DB1: 0x64F2, //CJK UNIFIED IDEOGRAPH
+ 0x9DB2: 0x64FA, //CJK UNIFIED IDEOGRAPH
+ 0x9DB3: 0x6500, //CJK UNIFIED IDEOGRAPH
+ 0x9DB4: 0x64FD, //CJK UNIFIED IDEOGRAPH
+ 0x9DB5: 0x6518, //CJK UNIFIED IDEOGRAPH
+ 0x9DB6: 0x651C, //CJK UNIFIED IDEOGRAPH
+ 0x9DB7: 0x6505, //CJK UNIFIED IDEOGRAPH
+ 0x9DB8: 0x6524, //CJK UNIFIED IDEOGRAPH
+ 0x9DB9: 0x6523, //CJK UNIFIED IDEOGRAPH
+ 0x9DBA: 0x652B, //CJK UNIFIED IDEOGRAPH
+ 0x9DBB: 0x6534, //CJK UNIFIED IDEOGRAPH
+ 0x9DBC: 0x6535, //CJK UNIFIED IDEOGRAPH
+ 0x9DBD: 0x6537, //CJK UNIFIED IDEOGRAPH
+ 0x9DBE: 0x6536, //CJK UNIFIED IDEOGRAPH
+ 0x9DBF: 0x6538, //CJK UNIFIED IDEOGRAPH
+ 0x9DC0: 0x754B, //CJK UNIFIED IDEOGRAPH
+ 0x9DC1: 0x6548, //CJK UNIFIED IDEOGRAPH
+ 0x9DC2: 0x6556, //CJK UNIFIED IDEOGRAPH
+ 0x9DC3: 0x6555, //CJK UNIFIED IDEOGRAPH
+ 0x9DC4: 0x654D, //CJK UNIFIED IDEOGRAPH
+ 0x9DC5: 0x6558, //CJK UNIFIED IDEOGRAPH
+ 0x9DC6: 0x655E, //CJK UNIFIED IDEOGRAPH
+ 0x9DC7: 0x655D, //CJK UNIFIED IDEOGRAPH
+ 0x9DC8: 0x6572, //CJK UNIFIED IDEOGRAPH
+ 0x9DC9: 0x6578, //CJK UNIFIED IDEOGRAPH
+ 0x9DCA: 0x6582, //CJK UNIFIED IDEOGRAPH
+ 0x9DCB: 0x6583, //CJK UNIFIED IDEOGRAPH
+ 0x9DCC: 0x8B8A, //CJK UNIFIED IDEOGRAPH
+ 0x9DCD: 0x659B, //CJK UNIFIED IDEOGRAPH
+ 0x9DCE: 0x659F, //CJK UNIFIED IDEOGRAPH
+ 0x9DCF: 0x65AB, //CJK UNIFIED IDEOGRAPH
+ 0x9DD0: 0x65B7, //CJK UNIFIED IDEOGRAPH
+ 0x9DD1: 0x65C3, //CJK UNIFIED IDEOGRAPH
+ 0x9DD2: 0x65C6, //CJK UNIFIED IDEOGRAPH
+ 0x9DD3: 0x65C1, //CJK UNIFIED IDEOGRAPH
+ 0x9DD4: 0x65C4, //CJK UNIFIED IDEOGRAPH
+ 0x9DD5: 0x65CC, //CJK UNIFIED IDEOGRAPH
+ 0x9DD6: 0x65D2, //CJK UNIFIED IDEOGRAPH
+ 0x9DD7: 0x65DB, //CJK UNIFIED IDEOGRAPH
+ 0x9DD8: 0x65D9, //CJK UNIFIED IDEOGRAPH
+ 0x9DD9: 0x65E0, //CJK UNIFIED IDEOGRAPH
+ 0x9DDA: 0x65E1, //CJK UNIFIED IDEOGRAPH
+ 0x9DDB: 0x65F1, //CJK UNIFIED IDEOGRAPH
+ 0x9DDC: 0x6772, //CJK UNIFIED IDEOGRAPH
+ 0x9DDD: 0x660A, //CJK UNIFIED IDEOGRAPH
+ 0x9DDE: 0x6603, //CJK UNIFIED IDEOGRAPH
+ 0x9DDF: 0x65FB, //CJK UNIFIED IDEOGRAPH
+ 0x9DE0: 0x6773, //CJK UNIFIED IDEOGRAPH
+ 0x9DE1: 0x6635, //CJK UNIFIED IDEOGRAPH
+ 0x9DE2: 0x6636, //CJK UNIFIED IDEOGRAPH
+ 0x9DE3: 0x6634, //CJK UNIFIED IDEOGRAPH
+ 0x9DE4: 0x661C, //CJK UNIFIED IDEOGRAPH
+ 0x9DE5: 0x664F, //CJK UNIFIED IDEOGRAPH
+ 0x9DE6: 0x6644, //CJK UNIFIED IDEOGRAPH
+ 0x9DE7: 0x6649, //CJK UNIFIED IDEOGRAPH
+ 0x9DE8: 0x6641, //CJK UNIFIED IDEOGRAPH
+ 0x9DE9: 0x665E, //CJK UNIFIED IDEOGRAPH
+ 0x9DEA: 0x665D, //CJK UNIFIED IDEOGRAPH
+ 0x9DEB: 0x6664, //CJK UNIFIED IDEOGRAPH
+ 0x9DEC: 0x6667, //CJK UNIFIED IDEOGRAPH
+ 0x9DED: 0x6668, //CJK UNIFIED IDEOGRAPH
+ 0x9DEE: 0x665F, //CJK UNIFIED IDEOGRAPH
+ 0x9DEF: 0x6662, //CJK UNIFIED IDEOGRAPH
+ 0x9DF0: 0x6670, //CJK UNIFIED IDEOGRAPH
+ 0x9DF1: 0x6683, //CJK UNIFIED IDEOGRAPH
+ 0x9DF2: 0x6688, //CJK UNIFIED IDEOGRAPH
+ 0x9DF3: 0x668E, //CJK UNIFIED IDEOGRAPH
+ 0x9DF4: 0x6689, //CJK UNIFIED IDEOGRAPH
+ 0x9DF5: 0x6684, //CJK UNIFIED IDEOGRAPH
+ 0x9DF6: 0x6698, //CJK UNIFIED IDEOGRAPH
+ 0x9DF7: 0x669D, //CJK UNIFIED IDEOGRAPH
+ 0x9DF8: 0x66C1, //CJK UNIFIED IDEOGRAPH
+ 0x9DF9: 0x66B9, //CJK UNIFIED IDEOGRAPH
+ 0x9DFA: 0x66C9, //CJK UNIFIED IDEOGRAPH
+ 0x9DFB: 0x66BE, //CJK UNIFIED IDEOGRAPH
+ 0x9DFC: 0x66BC, //CJK UNIFIED IDEOGRAPH
+ 0x9E40: 0x66C4, //CJK UNIFIED IDEOGRAPH
+ 0x9E41: 0x66B8, //CJK UNIFIED IDEOGRAPH
+ 0x9E42: 0x66D6, //CJK UNIFIED IDEOGRAPH
+ 0x9E43: 0x66DA, //CJK UNIFIED IDEOGRAPH
+ 0x9E44: 0x66E0, //CJK UNIFIED IDEOGRAPH
+ 0x9E45: 0x663F, //CJK UNIFIED IDEOGRAPH
+ 0x9E46: 0x66E6, //CJK UNIFIED IDEOGRAPH
+ 0x9E47: 0x66E9, //CJK UNIFIED IDEOGRAPH
+ 0x9E48: 0x66F0, //CJK UNIFIED IDEOGRAPH
+ 0x9E49: 0x66F5, //CJK UNIFIED IDEOGRAPH
+ 0x9E4A: 0x66F7, //CJK UNIFIED IDEOGRAPH
+ 0x9E4B: 0x670F, //CJK UNIFIED IDEOGRAPH
+ 0x9E4C: 0x6716, //CJK UNIFIED IDEOGRAPH
+ 0x9E4D: 0x671E, //CJK UNIFIED IDEOGRAPH
+ 0x9E4E: 0x6726, //CJK UNIFIED IDEOGRAPH
+ 0x9E4F: 0x6727, //CJK UNIFIED IDEOGRAPH
+ 0x9E50: 0x9738, //CJK UNIFIED IDEOGRAPH
+ 0x9E51: 0x672E, //CJK UNIFIED IDEOGRAPH
+ 0x9E52: 0x673F, //CJK UNIFIED IDEOGRAPH
+ 0x9E53: 0x6736, //CJK UNIFIED IDEOGRAPH
+ 0x9E54: 0x6741, //CJK UNIFIED IDEOGRAPH
+ 0x9E55: 0x6738, //CJK UNIFIED IDEOGRAPH
+ 0x9E56: 0x6737, //CJK UNIFIED IDEOGRAPH
+ 0x9E57: 0x6746, //CJK UNIFIED IDEOGRAPH
+ 0x9E58: 0x675E, //CJK UNIFIED IDEOGRAPH
+ 0x9E59: 0x6760, //CJK UNIFIED IDEOGRAPH
+ 0x9E5A: 0x6759, //CJK UNIFIED IDEOGRAPH
+ 0x9E5B: 0x6763, //CJK UNIFIED IDEOGRAPH
+ 0x9E5C: 0x6764, //CJK UNIFIED IDEOGRAPH
+ 0x9E5D: 0x6789, //CJK UNIFIED IDEOGRAPH
+ 0x9E5E: 0x6770, //CJK UNIFIED IDEOGRAPH
+ 0x9E5F: 0x67A9, //CJK UNIFIED IDEOGRAPH
+ 0x9E60: 0x677C, //CJK UNIFIED IDEOGRAPH
+ 0x9E61: 0x676A, //CJK UNIFIED IDEOGRAPH
+ 0x9E62: 0x678C, //CJK UNIFIED IDEOGRAPH
+ 0x9E63: 0x678B, //CJK UNIFIED IDEOGRAPH
+ 0x9E64: 0x67A6, //CJK UNIFIED IDEOGRAPH
+ 0x9E65: 0x67A1, //CJK UNIFIED IDEOGRAPH
+ 0x9E66: 0x6785, //CJK UNIFIED IDEOGRAPH
+ 0x9E67: 0x67B7, //CJK UNIFIED IDEOGRAPH
+ 0x9E68: 0x67EF, //CJK UNIFIED IDEOGRAPH
+ 0x9E69: 0x67B4, //CJK UNIFIED IDEOGRAPH
+ 0x9E6A: 0x67EC, //CJK UNIFIED IDEOGRAPH
+ 0x9E6B: 0x67B3, //CJK UNIFIED IDEOGRAPH
+ 0x9E6C: 0x67E9, //CJK UNIFIED IDEOGRAPH
+ 0x9E6D: 0x67B8, //CJK UNIFIED IDEOGRAPH
+ 0x9E6E: 0x67E4, //CJK UNIFIED IDEOGRAPH
+ 0x9E6F: 0x67DE, //CJK UNIFIED IDEOGRAPH
+ 0x9E70: 0x67DD, //CJK UNIFIED IDEOGRAPH
+ 0x9E71: 0x67E2, //CJK UNIFIED IDEOGRAPH
+ 0x9E72: 0x67EE, //CJK UNIFIED IDEOGRAPH
+ 0x9E73: 0x67B9, //CJK UNIFIED IDEOGRAPH
+ 0x9E74: 0x67CE, //CJK UNIFIED IDEOGRAPH
+ 0x9E75: 0x67C6, //CJK UNIFIED IDEOGRAPH
+ 0x9E76: 0x67E7, //CJK UNIFIED IDEOGRAPH
+ 0x9E77: 0x6A9C, //CJK UNIFIED IDEOGRAPH
+ 0x9E78: 0x681E, //CJK UNIFIED IDEOGRAPH
+ 0x9E79: 0x6846, //CJK UNIFIED IDEOGRAPH
+ 0x9E7A: 0x6829, //CJK UNIFIED IDEOGRAPH
+ 0x9E7B: 0x6840, //CJK UNIFIED IDEOGRAPH
+ 0x9E7C: 0x684D, //CJK UNIFIED IDEOGRAPH
+ 0x9E7D: 0x6832, //CJK UNIFIED IDEOGRAPH
+ 0x9E7E: 0x684E, //CJK UNIFIED IDEOGRAPH
+ 0x9E80: 0x68B3, //CJK UNIFIED IDEOGRAPH
+ 0x9E81: 0x682B, //CJK UNIFIED IDEOGRAPH
+ 0x9E82: 0x6859, //CJK UNIFIED IDEOGRAPH
+ 0x9E83: 0x6863, //CJK UNIFIED IDEOGRAPH
+ 0x9E84: 0x6877, //CJK UNIFIED IDEOGRAPH
+ 0x9E85: 0x687F, //CJK UNIFIED IDEOGRAPH
+ 0x9E86: 0x689F, //CJK UNIFIED IDEOGRAPH
+ 0x9E87: 0x688F, //CJK UNIFIED IDEOGRAPH
+ 0x9E88: 0x68AD, //CJK UNIFIED IDEOGRAPH
+ 0x9E89: 0x6894, //CJK UNIFIED IDEOGRAPH
+ 0x9E8A: 0x689D, //CJK UNIFIED IDEOGRAPH
+ 0x9E8B: 0x689B, //CJK UNIFIED IDEOGRAPH
+ 0x9E8C: 0x6883, //CJK UNIFIED IDEOGRAPH
+ 0x9E8D: 0x6AAE, //CJK UNIFIED IDEOGRAPH
+ 0x9E8E: 0x68B9, //CJK UNIFIED IDEOGRAPH
+ 0x9E8F: 0x6874, //CJK UNIFIED IDEOGRAPH
+ 0x9E90: 0x68B5, //CJK UNIFIED IDEOGRAPH
+ 0x9E91: 0x68A0, //CJK UNIFIED IDEOGRAPH
+ 0x9E92: 0x68BA, //CJK UNIFIED IDEOGRAPH
+ 0x9E93: 0x690F, //CJK UNIFIED IDEOGRAPH
+ 0x9E94: 0x688D, //CJK UNIFIED IDEOGRAPH
+ 0x9E95: 0x687E, //CJK UNIFIED IDEOGRAPH
+ 0x9E96: 0x6901, //CJK UNIFIED IDEOGRAPH
+ 0x9E97: 0x68CA, //CJK UNIFIED IDEOGRAPH
+ 0x9E98: 0x6908, //CJK UNIFIED IDEOGRAPH
+ 0x9E99: 0x68D8, //CJK UNIFIED IDEOGRAPH
+ 0x9E9A: 0x6922, //CJK UNIFIED IDEOGRAPH
+ 0x9E9B: 0x6926, //CJK UNIFIED IDEOGRAPH
+ 0x9E9C: 0x68E1, //CJK UNIFIED IDEOGRAPH
+ 0x9E9D: 0x690C, //CJK UNIFIED IDEOGRAPH
+ 0x9E9E: 0x68CD, //CJK UNIFIED IDEOGRAPH
+ 0x9E9F: 0x68D4, //CJK UNIFIED IDEOGRAPH
+ 0x9EA0: 0x68E7, //CJK UNIFIED IDEOGRAPH
+ 0x9EA1: 0x68D5, //CJK UNIFIED IDEOGRAPH
+ 0x9EA2: 0x6936, //CJK UNIFIED IDEOGRAPH
+ 0x9EA3: 0x6912, //CJK UNIFIED IDEOGRAPH
+ 0x9EA4: 0x6904, //CJK UNIFIED IDEOGRAPH
+ 0x9EA5: 0x68D7, //CJK UNIFIED IDEOGRAPH
+ 0x9EA6: 0x68E3, //CJK UNIFIED IDEOGRAPH
+ 0x9EA7: 0x6925, //CJK UNIFIED IDEOGRAPH
+ 0x9EA8: 0x68F9, //CJK UNIFIED IDEOGRAPH
+ 0x9EA9: 0x68E0, //CJK UNIFIED IDEOGRAPH
+ 0x9EAA: 0x68EF, //CJK UNIFIED IDEOGRAPH
+ 0x9EAB: 0x6928, //CJK UNIFIED IDEOGRAPH
+ 0x9EAC: 0x692A, //CJK UNIFIED IDEOGRAPH
+ 0x9EAD: 0x691A, //CJK UNIFIED IDEOGRAPH
+ 0x9EAE: 0x6923, //CJK UNIFIED IDEOGRAPH
+ 0x9EAF: 0x6921, //CJK UNIFIED IDEOGRAPH
+ 0x9EB0: 0x68C6, //CJK UNIFIED IDEOGRAPH
+ 0x9EB1: 0x6979, //CJK UNIFIED IDEOGRAPH
+ 0x9EB2: 0x6977, //CJK UNIFIED IDEOGRAPH
+ 0x9EB3: 0x695C, //CJK UNIFIED IDEOGRAPH
+ 0x9EB4: 0x6978, //CJK UNIFIED IDEOGRAPH
+ 0x9EB5: 0x696B, //CJK UNIFIED IDEOGRAPH
+ 0x9EB6: 0x6954, //CJK UNIFIED IDEOGRAPH
+ 0x9EB7: 0x697E, //CJK UNIFIED IDEOGRAPH
+ 0x9EB8: 0x696E, //CJK UNIFIED IDEOGRAPH
+ 0x9EB9: 0x6939, //CJK UNIFIED IDEOGRAPH
+ 0x9EBA: 0x6974, //CJK UNIFIED IDEOGRAPH
+ 0x9EBB: 0x693D, //CJK UNIFIED IDEOGRAPH
+ 0x9EBC: 0x6959, //CJK UNIFIED IDEOGRAPH
+ 0x9EBD: 0x6930, //CJK UNIFIED IDEOGRAPH
+ 0x9EBE: 0x6961, //CJK UNIFIED IDEOGRAPH
+ 0x9EBF: 0x695E, //CJK UNIFIED IDEOGRAPH
+ 0x9EC0: 0x695D, //CJK UNIFIED IDEOGRAPH
+ 0x9EC1: 0x6981, //CJK UNIFIED IDEOGRAPH
+ 0x9EC2: 0x696A, //CJK UNIFIED IDEOGRAPH
+ 0x9EC3: 0x69B2, //CJK UNIFIED IDEOGRAPH
+ 0x9EC4: 0x69AE, //CJK UNIFIED IDEOGRAPH
+ 0x9EC5: 0x69D0, //CJK UNIFIED IDEOGRAPH
+ 0x9EC6: 0x69BF, //CJK UNIFIED IDEOGRAPH
+ 0x9EC7: 0x69C1, //CJK UNIFIED IDEOGRAPH
+ 0x9EC8: 0x69D3, //CJK UNIFIED IDEOGRAPH
+ 0x9EC9: 0x69BE, //CJK UNIFIED IDEOGRAPH
+ 0x9ECA: 0x69CE, //CJK UNIFIED IDEOGRAPH
+ 0x9ECB: 0x5BE8, //CJK UNIFIED IDEOGRAPH
+ 0x9ECC: 0x69CA, //CJK UNIFIED IDEOGRAPH
+ 0x9ECD: 0x69DD, //CJK UNIFIED IDEOGRAPH
+ 0x9ECE: 0x69BB, //CJK UNIFIED IDEOGRAPH
+ 0x9ECF: 0x69C3, //CJK UNIFIED IDEOGRAPH
+ 0x9ED0: 0x69A7, //CJK UNIFIED IDEOGRAPH
+ 0x9ED1: 0x6A2E, //CJK UNIFIED IDEOGRAPH
+ 0x9ED2: 0x6991, //CJK UNIFIED IDEOGRAPH
+ 0x9ED3: 0x69A0, //CJK UNIFIED IDEOGRAPH
+ 0x9ED4: 0x699C, //CJK UNIFIED IDEOGRAPH
+ 0x9ED5: 0x6995, //CJK UNIFIED IDEOGRAPH
+ 0x9ED6: 0x69B4, //CJK UNIFIED IDEOGRAPH
+ 0x9ED7: 0x69DE, //CJK UNIFIED IDEOGRAPH
+ 0x9ED8: 0x69E8, //CJK UNIFIED IDEOGRAPH
+ 0x9ED9: 0x6A02, //CJK UNIFIED IDEOGRAPH
+ 0x9EDA: 0x6A1B, //CJK UNIFIED IDEOGRAPH
+ 0x9EDB: 0x69FF, //CJK UNIFIED IDEOGRAPH
+ 0x9EDC: 0x6B0A, //CJK UNIFIED IDEOGRAPH
+ 0x9EDD: 0x69F9, //CJK UNIFIED IDEOGRAPH
+ 0x9EDE: 0x69F2, //CJK UNIFIED IDEOGRAPH
+ 0x9EDF: 0x69E7, //CJK UNIFIED IDEOGRAPH
+ 0x9EE0: 0x6A05, //CJK UNIFIED IDEOGRAPH
+ 0x9EE1: 0x69B1, //CJK UNIFIED IDEOGRAPH
+ 0x9EE2: 0x6A1E, //CJK UNIFIED IDEOGRAPH
+ 0x9EE3: 0x69ED, //CJK UNIFIED IDEOGRAPH
+ 0x9EE4: 0x6A14, //CJK UNIFIED IDEOGRAPH
+ 0x9EE5: 0x69EB, //CJK UNIFIED IDEOGRAPH
+ 0x9EE6: 0x6A0A, //CJK UNIFIED IDEOGRAPH
+ 0x9EE7: 0x6A12, //CJK UNIFIED IDEOGRAPH
+ 0x9EE8: 0x6AC1, //CJK UNIFIED IDEOGRAPH
+ 0x9EE9: 0x6A23, //CJK UNIFIED IDEOGRAPH
+ 0x9EEA: 0x6A13, //CJK UNIFIED IDEOGRAPH
+ 0x9EEB: 0x6A44, //CJK UNIFIED IDEOGRAPH
+ 0x9EEC: 0x6A0C, //CJK UNIFIED IDEOGRAPH
+ 0x9EED: 0x6A72, //CJK UNIFIED IDEOGRAPH
+ 0x9EEE: 0x6A36, //CJK UNIFIED IDEOGRAPH
+ 0x9EEF: 0x6A78, //CJK UNIFIED IDEOGRAPH
+ 0x9EF0: 0x6A47, //CJK UNIFIED IDEOGRAPH
+ 0x9EF1: 0x6A62, //CJK UNIFIED IDEOGRAPH
+ 0x9EF2: 0x6A59, //CJK UNIFIED IDEOGRAPH
+ 0x9EF3: 0x6A66, //CJK UNIFIED IDEOGRAPH
+ 0x9EF4: 0x6A48, //CJK UNIFIED IDEOGRAPH
+ 0x9EF5: 0x6A38, //CJK UNIFIED IDEOGRAPH
+ 0x9EF6: 0x6A22, //CJK UNIFIED IDEOGRAPH
+ 0x9EF7: 0x6A90, //CJK UNIFIED IDEOGRAPH
+ 0x9EF8: 0x6A8D, //CJK UNIFIED IDEOGRAPH
+ 0x9EF9: 0x6AA0, //CJK UNIFIED IDEOGRAPH
+ 0x9EFA: 0x6A84, //CJK UNIFIED IDEOGRAPH
+ 0x9EFB: 0x6AA2, //CJK UNIFIED IDEOGRAPH
+ 0x9EFC: 0x6AA3, //CJK UNIFIED IDEOGRAPH
+ 0x9F40: 0x6A97, //CJK UNIFIED IDEOGRAPH
+ 0x9F41: 0x8617, //CJK UNIFIED IDEOGRAPH
+ 0x9F42: 0x6ABB, //CJK UNIFIED IDEOGRAPH
+ 0x9F43: 0x6AC3, //CJK UNIFIED IDEOGRAPH
+ 0x9F44: 0x6AC2, //CJK UNIFIED IDEOGRAPH
+ 0x9F45: 0x6AB8, //CJK UNIFIED IDEOGRAPH
+ 0x9F46: 0x6AB3, //CJK UNIFIED IDEOGRAPH
+ 0x9F47: 0x6AAC, //CJK UNIFIED IDEOGRAPH
+ 0x9F48: 0x6ADE, //CJK UNIFIED IDEOGRAPH
+ 0x9F49: 0x6AD1, //CJK UNIFIED IDEOGRAPH
+ 0x9F4A: 0x6ADF, //CJK UNIFIED IDEOGRAPH
+ 0x9F4B: 0x6AAA, //CJK UNIFIED IDEOGRAPH
+ 0x9F4C: 0x6ADA, //CJK UNIFIED IDEOGRAPH
+ 0x9F4D: 0x6AEA, //CJK UNIFIED IDEOGRAPH
+ 0x9F4E: 0x6AFB, //CJK UNIFIED IDEOGRAPH
+ 0x9F4F: 0x6B05, //CJK UNIFIED IDEOGRAPH
+ 0x9F50: 0x8616, //CJK UNIFIED IDEOGRAPH
+ 0x9F51: 0x6AFA, //CJK UNIFIED IDEOGRAPH
+ 0x9F52: 0x6B12, //CJK UNIFIED IDEOGRAPH
+ 0x9F53: 0x6B16, //CJK UNIFIED IDEOGRAPH
+ 0x9F54: 0x9B31, //CJK UNIFIED IDEOGRAPH
+ 0x9F55: 0x6B1F, //CJK UNIFIED IDEOGRAPH
+ 0x9F56: 0x6B38, //CJK UNIFIED IDEOGRAPH
+ 0x9F57: 0x6B37, //CJK UNIFIED IDEOGRAPH
+ 0x9F58: 0x76DC, //CJK UNIFIED IDEOGRAPH
+ 0x9F59: 0x6B39, //CJK UNIFIED IDEOGRAPH
+ 0x9F5A: 0x98EE, //CJK UNIFIED IDEOGRAPH
+ 0x9F5B: 0x6B47, //CJK UNIFIED IDEOGRAPH
+ 0x9F5C: 0x6B43, //CJK UNIFIED IDEOGRAPH
+ 0x9F5D: 0x6B49, //CJK UNIFIED IDEOGRAPH
+ 0x9F5E: 0x6B50, //CJK UNIFIED IDEOGRAPH
+ 0x9F5F: 0x6B59, //CJK UNIFIED IDEOGRAPH
+ 0x9F60: 0x6B54, //CJK UNIFIED IDEOGRAPH
+ 0x9F61: 0x6B5B, //CJK UNIFIED IDEOGRAPH
+ 0x9F62: 0x6B5F, //CJK UNIFIED IDEOGRAPH
+ 0x9F63: 0x6B61, //CJK UNIFIED IDEOGRAPH
+ 0x9F64: 0x6B78, //CJK UNIFIED IDEOGRAPH
+ 0x9F65: 0x6B79, //CJK UNIFIED IDEOGRAPH
+ 0x9F66: 0x6B7F, //CJK UNIFIED IDEOGRAPH
+ 0x9F67: 0x6B80, //CJK UNIFIED IDEOGRAPH
+ 0x9F68: 0x6B84, //CJK UNIFIED IDEOGRAPH
+ 0x9F69: 0x6B83, //CJK UNIFIED IDEOGRAPH
+ 0x9F6A: 0x6B8D, //CJK UNIFIED IDEOGRAPH
+ 0x9F6B: 0x6B98, //CJK UNIFIED IDEOGRAPH
+ 0x9F6C: 0x6B95, //CJK UNIFIED IDEOGRAPH
+ 0x9F6D: 0x6B9E, //CJK UNIFIED IDEOGRAPH
+ 0x9F6E: 0x6BA4, //CJK UNIFIED IDEOGRAPH
+ 0x9F6F: 0x6BAA, //CJK UNIFIED IDEOGRAPH
+ 0x9F70: 0x6BAB, //CJK UNIFIED IDEOGRAPH
+ 0x9F71: 0x6BAF, //CJK UNIFIED IDEOGRAPH
+ 0x9F72: 0x6BB2, //CJK UNIFIED IDEOGRAPH
+ 0x9F73: 0x6BB1, //CJK UNIFIED IDEOGRAPH
+ 0x9F74: 0x6BB3, //CJK UNIFIED IDEOGRAPH
+ 0x9F75: 0x6BB7, //CJK UNIFIED IDEOGRAPH
+ 0x9F76: 0x6BBC, //CJK UNIFIED IDEOGRAPH
+ 0x9F77: 0x6BC6, //CJK UNIFIED IDEOGRAPH
+ 0x9F78: 0x6BCB, //CJK UNIFIED IDEOGRAPH
+ 0x9F79: 0x6BD3, //CJK UNIFIED IDEOGRAPH
+ 0x9F7A: 0x6BDF, //CJK UNIFIED IDEOGRAPH
+ 0x9F7B: 0x6BEC, //CJK UNIFIED IDEOGRAPH
+ 0x9F7C: 0x6BEB, //CJK UNIFIED IDEOGRAPH
+ 0x9F7D: 0x6BF3, //CJK UNIFIED IDEOGRAPH
+ 0x9F7E: 0x6BEF, //CJK UNIFIED IDEOGRAPH
+ 0x9F80: 0x9EBE, //CJK UNIFIED IDEOGRAPH
+ 0x9F81: 0x6C08, //CJK UNIFIED IDEOGRAPH
+ 0x9F82: 0x6C13, //CJK UNIFIED IDEOGRAPH
+ 0x9F83: 0x6C14, //CJK UNIFIED IDEOGRAPH
+ 0x9F84: 0x6C1B, //CJK UNIFIED IDEOGRAPH
+ 0x9F85: 0x6C24, //CJK UNIFIED IDEOGRAPH
+ 0x9F86: 0x6C23, //CJK UNIFIED IDEOGRAPH
+ 0x9F87: 0x6C5E, //CJK UNIFIED IDEOGRAPH
+ 0x9F88: 0x6C55, //CJK UNIFIED IDEOGRAPH
+ 0x9F89: 0x6C62, //CJK UNIFIED IDEOGRAPH
+ 0x9F8A: 0x6C6A, //CJK UNIFIED IDEOGRAPH
+ 0x9F8B: 0x6C82, //CJK UNIFIED IDEOGRAPH
+ 0x9F8C: 0x6C8D, //CJK UNIFIED IDEOGRAPH
+ 0x9F8D: 0x6C9A, //CJK UNIFIED IDEOGRAPH
+ 0x9F8E: 0x6C81, //CJK UNIFIED IDEOGRAPH
+ 0x9F8F: 0x6C9B, //CJK UNIFIED IDEOGRAPH
+ 0x9F90: 0x6C7E, //CJK UNIFIED IDEOGRAPH
+ 0x9F91: 0x6C68, //CJK UNIFIED IDEOGRAPH
+ 0x9F92: 0x6C73, //CJK UNIFIED IDEOGRAPH
+ 0x9F93: 0x6C92, //CJK UNIFIED IDEOGRAPH
+ 0x9F94: 0x6C90, //CJK UNIFIED IDEOGRAPH
+ 0x9F95: 0x6CC4, //CJK UNIFIED IDEOGRAPH
+ 0x9F96: 0x6CF1, //CJK UNIFIED IDEOGRAPH
+ 0x9F97: 0x6CD3, //CJK UNIFIED IDEOGRAPH
+ 0x9F98: 0x6CBD, //CJK UNIFIED IDEOGRAPH
+ 0x9F99: 0x6CD7, //CJK UNIFIED IDEOGRAPH
+ 0x9F9A: 0x6CC5, //CJK UNIFIED IDEOGRAPH
+ 0x9F9B: 0x6CDD, //CJK UNIFIED IDEOGRAPH
+ 0x9F9C: 0x6CAE, //CJK UNIFIED IDEOGRAPH
+ 0x9F9D: 0x6CB1, //CJK UNIFIED IDEOGRAPH
+ 0x9F9E: 0x6CBE, //CJK UNIFIED IDEOGRAPH
+ 0x9F9F: 0x6CBA, //CJK UNIFIED IDEOGRAPH
+ 0x9FA0: 0x6CDB, //CJK UNIFIED IDEOGRAPH
+ 0x9FA1: 0x6CEF, //CJK UNIFIED IDEOGRAPH
+ 0x9FA2: 0x6CD9, //CJK UNIFIED IDEOGRAPH
+ 0x9FA3: 0x6CEA, //CJK UNIFIED IDEOGRAPH
+ 0x9FA4: 0x6D1F, //CJK UNIFIED IDEOGRAPH
+ 0x9FA5: 0x884D, //CJK UNIFIED IDEOGRAPH
+ 0x9FA6: 0x6D36, //CJK UNIFIED IDEOGRAPH
+ 0x9FA7: 0x6D2B, //CJK UNIFIED IDEOGRAPH
+ 0x9FA8: 0x6D3D, //CJK UNIFIED IDEOGRAPH
+ 0x9FA9: 0x6D38, //CJK UNIFIED IDEOGRAPH
+ 0x9FAA: 0x6D19, //CJK UNIFIED IDEOGRAPH
+ 0x9FAB: 0x6D35, //CJK UNIFIED IDEOGRAPH
+ 0x9FAC: 0x6D33, //CJK UNIFIED IDEOGRAPH
+ 0x9FAD: 0x6D12, //CJK UNIFIED IDEOGRAPH
+ 0x9FAE: 0x6D0C, //CJK UNIFIED IDEOGRAPH
+ 0x9FAF: 0x6D63, //CJK UNIFIED IDEOGRAPH
+ 0x9FB0: 0x6D93, //CJK UNIFIED IDEOGRAPH
+ 0x9FB1: 0x6D64, //CJK UNIFIED IDEOGRAPH
+ 0x9FB2: 0x6D5A, //CJK UNIFIED IDEOGRAPH
+ 0x9FB3: 0x6D79, //CJK UNIFIED IDEOGRAPH
+ 0x9FB4: 0x6D59, //CJK UNIFIED IDEOGRAPH
+ 0x9FB5: 0x6D8E, //CJK UNIFIED IDEOGRAPH
+ 0x9FB6: 0x6D95, //CJK UNIFIED IDEOGRAPH
+ 0x9FB7: 0x6FE4, //CJK UNIFIED IDEOGRAPH
+ 0x9FB8: 0x6D85, //CJK UNIFIED IDEOGRAPH
+ 0x9FB9: 0x6DF9, //CJK UNIFIED IDEOGRAPH
+ 0x9FBA: 0x6E15, //CJK UNIFIED IDEOGRAPH
+ 0x9FBB: 0x6E0A, //CJK UNIFIED IDEOGRAPH
+ 0x9FBC: 0x6DB5, //CJK UNIFIED IDEOGRAPH
+ 0x9FBD: 0x6DC7, //CJK UNIFIED IDEOGRAPH
+ 0x9FBE: 0x6DE6, //CJK UNIFIED IDEOGRAPH
+ 0x9FBF: 0x6DB8, //CJK UNIFIED IDEOGRAPH
+ 0x9FC0: 0x6DC6, //CJK UNIFIED IDEOGRAPH
+ 0x9FC1: 0x6DEC, //CJK UNIFIED IDEOGRAPH
+ 0x9FC2: 0x6DDE, //CJK UNIFIED IDEOGRAPH
+ 0x9FC3: 0x6DCC, //CJK UNIFIED IDEOGRAPH
+ 0x9FC4: 0x6DE8, //CJK UNIFIED IDEOGRAPH
+ 0x9FC5: 0x6DD2, //CJK UNIFIED IDEOGRAPH
+ 0x9FC6: 0x6DC5, //CJK UNIFIED IDEOGRAPH
+ 0x9FC7: 0x6DFA, //CJK UNIFIED IDEOGRAPH
+ 0x9FC8: 0x6DD9, //CJK UNIFIED IDEOGRAPH
+ 0x9FC9: 0x6DE4, //CJK UNIFIED IDEOGRAPH
+ 0x9FCA: 0x6DD5, //CJK UNIFIED IDEOGRAPH
+ 0x9FCB: 0x6DEA, //CJK UNIFIED IDEOGRAPH
+ 0x9FCC: 0x6DEE, //CJK UNIFIED IDEOGRAPH
+ 0x9FCD: 0x6E2D, //CJK UNIFIED IDEOGRAPH
+ 0x9FCE: 0x6E6E, //CJK UNIFIED IDEOGRAPH
+ 0x9FCF: 0x6E2E, //CJK UNIFIED IDEOGRAPH
+ 0x9FD0: 0x6E19, //CJK UNIFIED IDEOGRAPH
+ 0x9FD1: 0x6E72, //CJK UNIFIED IDEOGRAPH
+ 0x9FD2: 0x6E5F, //CJK UNIFIED IDEOGRAPH
+ 0x9FD3: 0x6E3E, //CJK UNIFIED IDEOGRAPH
+ 0x9FD4: 0x6E23, //CJK UNIFIED IDEOGRAPH
+ 0x9FD5: 0x6E6B, //CJK UNIFIED IDEOGRAPH
+ 0x9FD6: 0x6E2B, //CJK UNIFIED IDEOGRAPH
+ 0x9FD7: 0x6E76, //CJK UNIFIED IDEOGRAPH
+ 0x9FD8: 0x6E4D, //CJK UNIFIED IDEOGRAPH
+ 0x9FD9: 0x6E1F, //CJK UNIFIED IDEOGRAPH
+ 0x9FDA: 0x6E43, //CJK UNIFIED IDEOGRAPH
+ 0x9FDB: 0x6E3A, //CJK UNIFIED IDEOGRAPH
+ 0x9FDC: 0x6E4E, //CJK UNIFIED IDEOGRAPH
+ 0x9FDD: 0x6E24, //CJK UNIFIED IDEOGRAPH
+ 0x9FDE: 0x6EFF, //CJK UNIFIED IDEOGRAPH
+ 0x9FDF: 0x6E1D, //CJK UNIFIED IDEOGRAPH
+ 0x9FE0: 0x6E38, //CJK UNIFIED IDEOGRAPH
+ 0x9FE1: 0x6E82, //CJK UNIFIED IDEOGRAPH
+ 0x9FE2: 0x6EAA, //CJK UNIFIED IDEOGRAPH
+ 0x9FE3: 0x6E98, //CJK UNIFIED IDEOGRAPH
+ 0x9FE4: 0x6EC9, //CJK UNIFIED IDEOGRAPH
+ 0x9FE5: 0x6EB7, //CJK UNIFIED IDEOGRAPH
+ 0x9FE6: 0x6ED3, //CJK UNIFIED IDEOGRAPH
+ 0x9FE7: 0x6EBD, //CJK UNIFIED IDEOGRAPH
+ 0x9FE8: 0x6EAF, //CJK UNIFIED IDEOGRAPH
+ 0x9FE9: 0x6EC4, //CJK UNIFIED IDEOGRAPH
+ 0x9FEA: 0x6EB2, //CJK UNIFIED IDEOGRAPH
+ 0x9FEB: 0x6ED4, //CJK UNIFIED IDEOGRAPH
+ 0x9FEC: 0x6ED5, //CJK UNIFIED IDEOGRAPH
+ 0x9FED: 0x6E8F, //CJK UNIFIED IDEOGRAPH
+ 0x9FEE: 0x6EA5, //CJK UNIFIED IDEOGRAPH
+ 0x9FEF: 0x6EC2, //CJK UNIFIED IDEOGRAPH
+ 0x9FF0: 0x6E9F, //CJK UNIFIED IDEOGRAPH
+ 0x9FF1: 0x6F41, //CJK UNIFIED IDEOGRAPH
+ 0x9FF2: 0x6F11, //CJK UNIFIED IDEOGRAPH
+ 0x9FF3: 0x704C, //CJK UNIFIED IDEOGRAPH
+ 0x9FF4: 0x6EEC, //CJK UNIFIED IDEOGRAPH
+ 0x9FF5: 0x6EF8, //CJK UNIFIED IDEOGRAPH
+ 0x9FF6: 0x6EFE, //CJK UNIFIED IDEOGRAPH
+ 0x9FF7: 0x6F3F, //CJK UNIFIED IDEOGRAPH
+ 0x9FF8: 0x6EF2, //CJK UNIFIED IDEOGRAPH
+ 0x9FF9: 0x6F31, //CJK UNIFIED IDEOGRAPH
+ 0x9FFA: 0x6EEF, //CJK UNIFIED IDEOGRAPH
+ 0x9FFB: 0x6F32, //CJK UNIFIED IDEOGRAPH
+ 0x9FFC: 0x6ECC, //CJK UNIFIED IDEOGRAPH
+ 0xE040: 0x6F3E, //CJK UNIFIED IDEOGRAPH
+ 0xE041: 0x6F13, //CJK UNIFIED IDEOGRAPH
+ 0xE042: 0x6EF7, //CJK UNIFIED IDEOGRAPH
+ 0xE043: 0x6F86, //CJK UNIFIED IDEOGRAPH
+ 0xE044: 0x6F7A, //CJK UNIFIED IDEOGRAPH
+ 0xE045: 0x6F78, //CJK UNIFIED IDEOGRAPH
+ 0xE046: 0x6F81, //CJK UNIFIED IDEOGRAPH
+ 0xE047: 0x6F80, //CJK UNIFIED IDEOGRAPH
+ 0xE048: 0x6F6F, //CJK UNIFIED IDEOGRAPH
+ 0xE049: 0x6F5B, //CJK UNIFIED IDEOGRAPH
+ 0xE04A: 0x6FF3, //CJK UNIFIED IDEOGRAPH
+ 0xE04B: 0x6F6D, //CJK UNIFIED IDEOGRAPH
+ 0xE04C: 0x6F82, //CJK UNIFIED IDEOGRAPH
+ 0xE04D: 0x6F7C, //CJK UNIFIED IDEOGRAPH
+ 0xE04E: 0x6F58, //CJK UNIFIED IDEOGRAPH
+ 0xE04F: 0x6F8E, //CJK UNIFIED IDEOGRAPH
+ 0xE050: 0x6F91, //CJK UNIFIED IDEOGRAPH
+ 0xE051: 0x6FC2, //CJK UNIFIED IDEOGRAPH
+ 0xE052: 0x6F66, //CJK UNIFIED IDEOGRAPH
+ 0xE053: 0x6FB3, //CJK UNIFIED IDEOGRAPH
+ 0xE054: 0x6FA3, //CJK UNIFIED IDEOGRAPH
+ 0xE055: 0x6FA1, //CJK UNIFIED IDEOGRAPH
+ 0xE056: 0x6FA4, //CJK UNIFIED IDEOGRAPH
+ 0xE057: 0x6FB9, //CJK UNIFIED IDEOGRAPH
+ 0xE058: 0x6FC6, //CJK UNIFIED IDEOGRAPH
+ 0xE059: 0x6FAA, //CJK UNIFIED IDEOGRAPH
+ 0xE05A: 0x6FDF, //CJK UNIFIED IDEOGRAPH
+ 0xE05B: 0x6FD5, //CJK UNIFIED IDEOGRAPH
+ 0xE05C: 0x6FEC, //CJK UNIFIED IDEOGRAPH
+ 0xE05D: 0x6FD4, //CJK UNIFIED IDEOGRAPH
+ 0xE05E: 0x6FD8, //CJK UNIFIED IDEOGRAPH
+ 0xE05F: 0x6FF1, //CJK UNIFIED IDEOGRAPH
+ 0xE060: 0x6FEE, //CJK UNIFIED IDEOGRAPH
+ 0xE061: 0x6FDB, //CJK UNIFIED IDEOGRAPH
+ 0xE062: 0x7009, //CJK UNIFIED IDEOGRAPH
+ 0xE063: 0x700B, //CJK UNIFIED IDEOGRAPH
+ 0xE064: 0x6FFA, //CJK UNIFIED IDEOGRAPH
+ 0xE065: 0x7011, //CJK UNIFIED IDEOGRAPH
+ 0xE066: 0x7001, //CJK UNIFIED IDEOGRAPH
+ 0xE067: 0x700F, //CJK UNIFIED IDEOGRAPH
+ 0xE068: 0x6FFE, //CJK UNIFIED IDEOGRAPH
+ 0xE069: 0x701B, //CJK UNIFIED IDEOGRAPH
+ 0xE06A: 0x701A, //CJK UNIFIED IDEOGRAPH
+ 0xE06B: 0x6F74, //CJK UNIFIED IDEOGRAPH
+ 0xE06C: 0x701D, //CJK UNIFIED IDEOGRAPH
+ 0xE06D: 0x7018, //CJK UNIFIED IDEOGRAPH
+ 0xE06E: 0x701F, //CJK UNIFIED IDEOGRAPH
+ 0xE06F: 0x7030, //CJK UNIFIED IDEOGRAPH
+ 0xE070: 0x703E, //CJK UNIFIED IDEOGRAPH
+ 0xE071: 0x7032, //CJK UNIFIED IDEOGRAPH
+ 0xE072: 0x7051, //CJK UNIFIED IDEOGRAPH
+ 0xE073: 0x7063, //CJK UNIFIED IDEOGRAPH
+ 0xE074: 0x7099, //CJK UNIFIED IDEOGRAPH
+ 0xE075: 0x7092, //CJK UNIFIED IDEOGRAPH
+ 0xE076: 0x70AF, //CJK UNIFIED IDEOGRAPH
+ 0xE077: 0x70F1, //CJK UNIFIED IDEOGRAPH
+ 0xE078: 0x70AC, //CJK UNIFIED IDEOGRAPH
+ 0xE079: 0x70B8, //CJK UNIFIED IDEOGRAPH
+ 0xE07A: 0x70B3, //CJK UNIFIED IDEOGRAPH
+ 0xE07B: 0x70AE, //CJK UNIFIED IDEOGRAPH
+ 0xE07C: 0x70DF, //CJK UNIFIED IDEOGRAPH
+ 0xE07D: 0x70CB, //CJK UNIFIED IDEOGRAPH
+ 0xE07E: 0x70DD, //CJK UNIFIED IDEOGRAPH
+ 0xE080: 0x70D9, //CJK UNIFIED IDEOGRAPH
+ 0xE081: 0x7109, //CJK UNIFIED IDEOGRAPH
+ 0xE082: 0x70FD, //CJK UNIFIED IDEOGRAPH
+ 0xE083: 0x711C, //CJK UNIFIED IDEOGRAPH
+ 0xE084: 0x7119, //CJK UNIFIED IDEOGRAPH
+ 0xE085: 0x7165, //CJK UNIFIED IDEOGRAPH
+ 0xE086: 0x7155, //CJK UNIFIED IDEOGRAPH
+ 0xE087: 0x7188, //CJK UNIFIED IDEOGRAPH
+ 0xE088: 0x7166, //CJK UNIFIED IDEOGRAPH
+ 0xE089: 0x7162, //CJK UNIFIED IDEOGRAPH
+ 0xE08A: 0x714C, //CJK UNIFIED IDEOGRAPH
+ 0xE08B: 0x7156, //CJK UNIFIED IDEOGRAPH
+ 0xE08C: 0x716C, //CJK UNIFIED IDEOGRAPH
+ 0xE08D: 0x718F, //CJK UNIFIED IDEOGRAPH
+ 0xE08E: 0x71FB, //CJK UNIFIED IDEOGRAPH
+ 0xE08F: 0x7184, //CJK UNIFIED IDEOGRAPH
+ 0xE090: 0x7195, //CJK UNIFIED IDEOGRAPH
+ 0xE091: 0x71A8, //CJK UNIFIED IDEOGRAPH
+ 0xE092: 0x71AC, //CJK UNIFIED IDEOGRAPH
+ 0xE093: 0x71D7, //CJK UNIFIED IDEOGRAPH
+ 0xE094: 0x71B9, //CJK UNIFIED IDEOGRAPH
+ 0xE095: 0x71BE, //CJK UNIFIED IDEOGRAPH
+ 0xE096: 0x71D2, //CJK UNIFIED IDEOGRAPH
+ 0xE097: 0x71C9, //CJK UNIFIED IDEOGRAPH
+ 0xE098: 0x71D4, //CJK UNIFIED IDEOGRAPH
+ 0xE099: 0x71CE, //CJK UNIFIED IDEOGRAPH
+ 0xE09A: 0x71E0, //CJK UNIFIED IDEOGRAPH
+ 0xE09B: 0x71EC, //CJK UNIFIED IDEOGRAPH
+ 0xE09C: 0x71E7, //CJK UNIFIED IDEOGRAPH
+ 0xE09D: 0x71F5, //CJK UNIFIED IDEOGRAPH
+ 0xE09E: 0x71FC, //CJK UNIFIED IDEOGRAPH
+ 0xE09F: 0x71F9, //CJK UNIFIED IDEOGRAPH
+ 0xE0A0: 0x71FF, //CJK UNIFIED IDEOGRAPH
+ 0xE0A1: 0x720D, //CJK UNIFIED IDEOGRAPH
+ 0xE0A2: 0x7210, //CJK UNIFIED IDEOGRAPH
+ 0xE0A3: 0x721B, //CJK UNIFIED IDEOGRAPH
+ 0xE0A4: 0x7228, //CJK UNIFIED IDEOGRAPH
+ 0xE0A5: 0x722D, //CJK UNIFIED IDEOGRAPH
+ 0xE0A6: 0x722C, //CJK UNIFIED IDEOGRAPH
+ 0xE0A7: 0x7230, //CJK UNIFIED IDEOGRAPH
+ 0xE0A8: 0x7232, //CJK UNIFIED IDEOGRAPH
+ 0xE0A9: 0x723B, //CJK UNIFIED IDEOGRAPH
+ 0xE0AA: 0x723C, //CJK UNIFIED IDEOGRAPH
+ 0xE0AB: 0x723F, //CJK UNIFIED IDEOGRAPH
+ 0xE0AC: 0x7240, //CJK UNIFIED IDEOGRAPH
+ 0xE0AD: 0x7246, //CJK UNIFIED IDEOGRAPH
+ 0xE0AE: 0x724B, //CJK UNIFIED IDEOGRAPH
+ 0xE0AF: 0x7258, //CJK UNIFIED IDEOGRAPH
+ 0xE0B0: 0x7274, //CJK UNIFIED IDEOGRAPH
+ 0xE0B1: 0x727E, //CJK UNIFIED IDEOGRAPH
+ 0xE0B2: 0x7282, //CJK UNIFIED IDEOGRAPH
+ 0xE0B3: 0x7281, //CJK UNIFIED IDEOGRAPH
+ 0xE0B4: 0x7287, //CJK UNIFIED IDEOGRAPH
+ 0xE0B5: 0x7292, //CJK UNIFIED IDEOGRAPH
+ 0xE0B6: 0x7296, //CJK UNIFIED IDEOGRAPH
+ 0xE0B7: 0x72A2, //CJK UNIFIED IDEOGRAPH
+ 0xE0B8: 0x72A7, //CJK UNIFIED IDEOGRAPH
+ 0xE0B9: 0x72B9, //CJK UNIFIED IDEOGRAPH
+ 0xE0BA: 0x72B2, //CJK UNIFIED IDEOGRAPH
+ 0xE0BB: 0x72C3, //CJK UNIFIED IDEOGRAPH
+ 0xE0BC: 0x72C6, //CJK UNIFIED IDEOGRAPH
+ 0xE0BD: 0x72C4, //CJK UNIFIED IDEOGRAPH
+ 0xE0BE: 0x72CE, //CJK UNIFIED IDEOGRAPH
+ 0xE0BF: 0x72D2, //CJK UNIFIED IDEOGRAPH
+ 0xE0C0: 0x72E2, //CJK UNIFIED IDEOGRAPH
+ 0xE0C1: 0x72E0, //CJK UNIFIED IDEOGRAPH
+ 0xE0C2: 0x72E1, //CJK UNIFIED IDEOGRAPH
+ 0xE0C3: 0x72F9, //CJK UNIFIED IDEOGRAPH
+ 0xE0C4: 0x72F7, //CJK UNIFIED IDEOGRAPH
+ 0xE0C5: 0x500F, //CJK UNIFIED IDEOGRAPH
+ 0xE0C6: 0x7317, //CJK UNIFIED IDEOGRAPH
+ 0xE0C7: 0x730A, //CJK UNIFIED IDEOGRAPH
+ 0xE0C8: 0x731C, //CJK UNIFIED IDEOGRAPH
+ 0xE0C9: 0x7316, //CJK UNIFIED IDEOGRAPH
+ 0xE0CA: 0x731D, //CJK UNIFIED IDEOGRAPH
+ 0xE0CB: 0x7334, //CJK UNIFIED IDEOGRAPH
+ 0xE0CC: 0x732F, //CJK UNIFIED IDEOGRAPH
+ 0xE0CD: 0x7329, //CJK UNIFIED IDEOGRAPH
+ 0xE0CE: 0x7325, //CJK UNIFIED IDEOGRAPH
+ 0xE0CF: 0x733E, //CJK UNIFIED IDEOGRAPH
+ 0xE0D0: 0x734E, //CJK UNIFIED IDEOGRAPH
+ 0xE0D1: 0x734F, //CJK UNIFIED IDEOGRAPH
+ 0xE0D2: 0x9ED8, //CJK UNIFIED IDEOGRAPH
+ 0xE0D3: 0x7357, //CJK UNIFIED IDEOGRAPH
+ 0xE0D4: 0x736A, //CJK UNIFIED IDEOGRAPH
+ 0xE0D5: 0x7368, //CJK UNIFIED IDEOGRAPH
+ 0xE0D6: 0x7370, //CJK UNIFIED IDEOGRAPH
+ 0xE0D7: 0x7378, //CJK UNIFIED IDEOGRAPH
+ 0xE0D8: 0x7375, //CJK UNIFIED IDEOGRAPH
+ 0xE0D9: 0x737B, //CJK UNIFIED IDEOGRAPH
+ 0xE0DA: 0x737A, //CJK UNIFIED IDEOGRAPH
+ 0xE0DB: 0x73C8, //CJK UNIFIED IDEOGRAPH
+ 0xE0DC: 0x73B3, //CJK UNIFIED IDEOGRAPH
+ 0xE0DD: 0x73CE, //CJK UNIFIED IDEOGRAPH
+ 0xE0DE: 0x73BB, //CJK UNIFIED IDEOGRAPH
+ 0xE0DF: 0x73C0, //CJK UNIFIED IDEOGRAPH
+ 0xE0E0: 0x73E5, //CJK UNIFIED IDEOGRAPH
+ 0xE0E1: 0x73EE, //CJK UNIFIED IDEOGRAPH
+ 0xE0E2: 0x73DE, //CJK UNIFIED IDEOGRAPH
+ 0xE0E3: 0x74A2, //CJK UNIFIED IDEOGRAPH
+ 0xE0E4: 0x7405, //CJK UNIFIED IDEOGRAPH
+ 0xE0E5: 0x746F, //CJK UNIFIED IDEOGRAPH
+ 0xE0E6: 0x7425, //CJK UNIFIED IDEOGRAPH
+ 0xE0E7: 0x73F8, //CJK UNIFIED IDEOGRAPH
+ 0xE0E8: 0x7432, //CJK UNIFIED IDEOGRAPH
+ 0xE0E9: 0x743A, //CJK UNIFIED IDEOGRAPH
+ 0xE0EA: 0x7455, //CJK UNIFIED IDEOGRAPH
+ 0xE0EB: 0x743F, //CJK UNIFIED IDEOGRAPH
+ 0xE0EC: 0x745F, //CJK UNIFIED IDEOGRAPH
+ 0xE0ED: 0x7459, //CJK UNIFIED IDEOGRAPH
+ 0xE0EE: 0x7441, //CJK UNIFIED IDEOGRAPH
+ 0xE0EF: 0x745C, //CJK UNIFIED IDEOGRAPH
+ 0xE0F0: 0x7469, //CJK UNIFIED IDEOGRAPH
+ 0xE0F1: 0x7470, //CJK UNIFIED IDEOGRAPH
+ 0xE0F2: 0x7463, //CJK UNIFIED IDEOGRAPH
+ 0xE0F3: 0x746A, //CJK UNIFIED IDEOGRAPH
+ 0xE0F4: 0x7476, //CJK UNIFIED IDEOGRAPH
+ 0xE0F5: 0x747E, //CJK UNIFIED IDEOGRAPH
+ 0xE0F6: 0x748B, //CJK UNIFIED IDEOGRAPH
+ 0xE0F7: 0x749E, //CJK UNIFIED IDEOGRAPH
+ 0xE0F8: 0x74A7, //CJK UNIFIED IDEOGRAPH
+ 0xE0F9: 0x74CA, //CJK UNIFIED IDEOGRAPH
+ 0xE0FA: 0x74CF, //CJK UNIFIED IDEOGRAPH
+ 0xE0FB: 0x74D4, //CJK UNIFIED IDEOGRAPH
+ 0xE0FC: 0x73F1, //CJK UNIFIED IDEOGRAPH
+ 0xE140: 0x74E0, //CJK UNIFIED IDEOGRAPH
+ 0xE141: 0x74E3, //CJK UNIFIED IDEOGRAPH
+ 0xE142: 0x74E7, //CJK UNIFIED IDEOGRAPH
+ 0xE143: 0x74E9, //CJK UNIFIED IDEOGRAPH
+ 0xE144: 0x74EE, //CJK UNIFIED IDEOGRAPH
+ 0xE145: 0x74F2, //CJK UNIFIED IDEOGRAPH
+ 0xE146: 0x74F0, //CJK UNIFIED IDEOGRAPH
+ 0xE147: 0x74F1, //CJK UNIFIED IDEOGRAPH
+ 0xE148: 0x74F8, //CJK UNIFIED IDEOGRAPH
+ 0xE149: 0x74F7, //CJK UNIFIED IDEOGRAPH
+ 0xE14A: 0x7504, //CJK UNIFIED IDEOGRAPH
+ 0xE14B: 0x7503, //CJK UNIFIED IDEOGRAPH
+ 0xE14C: 0x7505, //CJK UNIFIED IDEOGRAPH
+ 0xE14D: 0x750C, //CJK UNIFIED IDEOGRAPH
+ 0xE14E: 0x750E, //CJK UNIFIED IDEOGRAPH
+ 0xE14F: 0x750D, //CJK UNIFIED IDEOGRAPH
+ 0xE150: 0x7515, //CJK UNIFIED IDEOGRAPH
+ 0xE151: 0x7513, //CJK UNIFIED IDEOGRAPH
+ 0xE152: 0x751E, //CJK UNIFIED IDEOGRAPH
+ 0xE153: 0x7526, //CJK UNIFIED IDEOGRAPH
+ 0xE154: 0x752C, //CJK UNIFIED IDEOGRAPH
+ 0xE155: 0x753C, //CJK UNIFIED IDEOGRAPH
+ 0xE156: 0x7544, //CJK UNIFIED IDEOGRAPH
+ 0xE157: 0x754D, //CJK UNIFIED IDEOGRAPH
+ 0xE158: 0x754A, //CJK UNIFIED IDEOGRAPH
+ 0xE159: 0x7549, //CJK UNIFIED IDEOGRAPH
+ 0xE15A: 0x755B, //CJK UNIFIED IDEOGRAPH
+ 0xE15B: 0x7546, //CJK UNIFIED IDEOGRAPH
+ 0xE15C: 0x755A, //CJK UNIFIED IDEOGRAPH
+ 0xE15D: 0x7569, //CJK UNIFIED IDEOGRAPH
+ 0xE15E: 0x7564, //CJK UNIFIED IDEOGRAPH
+ 0xE15F: 0x7567, //CJK UNIFIED IDEOGRAPH
+ 0xE160: 0x756B, //CJK UNIFIED IDEOGRAPH
+ 0xE161: 0x756D, //CJK UNIFIED IDEOGRAPH
+ 0xE162: 0x7578, //CJK UNIFIED IDEOGRAPH
+ 0xE163: 0x7576, //CJK UNIFIED IDEOGRAPH
+ 0xE164: 0x7586, //CJK UNIFIED IDEOGRAPH
+ 0xE165: 0x7587, //CJK UNIFIED IDEOGRAPH
+ 0xE166: 0x7574, //CJK UNIFIED IDEOGRAPH
+ 0xE167: 0x758A, //CJK UNIFIED IDEOGRAPH
+ 0xE168: 0x7589, //CJK UNIFIED IDEOGRAPH
+ 0xE169: 0x7582, //CJK UNIFIED IDEOGRAPH
+ 0xE16A: 0x7594, //CJK UNIFIED IDEOGRAPH
+ 0xE16B: 0x759A, //CJK UNIFIED IDEOGRAPH
+ 0xE16C: 0x759D, //CJK UNIFIED IDEOGRAPH
+ 0xE16D: 0x75A5, //CJK UNIFIED IDEOGRAPH
+ 0xE16E: 0x75A3, //CJK UNIFIED IDEOGRAPH
+ 0xE16F: 0x75C2, //CJK UNIFIED IDEOGRAPH
+ 0xE170: 0x75B3, //CJK UNIFIED IDEOGRAPH
+ 0xE171: 0x75C3, //CJK UNIFIED IDEOGRAPH
+ 0xE172: 0x75B5, //CJK UNIFIED IDEOGRAPH
+ 0xE173: 0x75BD, //CJK UNIFIED IDEOGRAPH
+ 0xE174: 0x75B8, //CJK UNIFIED IDEOGRAPH
+ 0xE175: 0x75BC, //CJK UNIFIED IDEOGRAPH
+ 0xE176: 0x75B1, //CJK UNIFIED IDEOGRAPH
+ 0xE177: 0x75CD, //CJK UNIFIED IDEOGRAPH
+ 0xE178: 0x75CA, //CJK UNIFIED IDEOGRAPH
+ 0xE179: 0x75D2, //CJK UNIFIED IDEOGRAPH
+ 0xE17A: 0x75D9, //CJK UNIFIED IDEOGRAPH
+ 0xE17B: 0x75E3, //CJK UNIFIED IDEOGRAPH
+ 0xE17C: 0x75DE, //CJK UNIFIED IDEOGRAPH
+ 0xE17D: 0x75FE, //CJK UNIFIED IDEOGRAPH
+ 0xE17E: 0x75FF, //CJK UNIFIED IDEOGRAPH
+ 0xE180: 0x75FC, //CJK UNIFIED IDEOGRAPH
+ 0xE181: 0x7601, //CJK UNIFIED IDEOGRAPH
+ 0xE182: 0x75F0, //CJK UNIFIED IDEOGRAPH
+ 0xE183: 0x75FA, //CJK UNIFIED IDEOGRAPH
+ 0xE184: 0x75F2, //CJK UNIFIED IDEOGRAPH
+ 0xE185: 0x75F3, //CJK UNIFIED IDEOGRAPH
+ 0xE186: 0x760B, //CJK UNIFIED IDEOGRAPH
+ 0xE187: 0x760D, //CJK UNIFIED IDEOGRAPH
+ 0xE188: 0x7609, //CJK UNIFIED IDEOGRAPH
+ 0xE189: 0x761F, //CJK UNIFIED IDEOGRAPH
+ 0xE18A: 0x7627, //CJK UNIFIED IDEOGRAPH
+ 0xE18B: 0x7620, //CJK UNIFIED IDEOGRAPH
+ 0xE18C: 0x7621, //CJK UNIFIED IDEOGRAPH
+ 0xE18D: 0x7622, //CJK UNIFIED IDEOGRAPH
+ 0xE18E: 0x7624, //CJK UNIFIED IDEOGRAPH
+ 0xE18F: 0x7634, //CJK UNIFIED IDEOGRAPH
+ 0xE190: 0x7630, //CJK UNIFIED IDEOGRAPH
+ 0xE191: 0x763B, //CJK UNIFIED IDEOGRAPH
+ 0xE192: 0x7647, //CJK UNIFIED IDEOGRAPH
+ 0xE193: 0x7648, //CJK UNIFIED IDEOGRAPH
+ 0xE194: 0x7646, //CJK UNIFIED IDEOGRAPH
+ 0xE195: 0x765C, //CJK UNIFIED IDEOGRAPH
+ 0xE196: 0x7658, //CJK UNIFIED IDEOGRAPH
+ 0xE197: 0x7661, //CJK UNIFIED IDEOGRAPH
+ 0xE198: 0x7662, //CJK UNIFIED IDEOGRAPH
+ 0xE199: 0x7668, //CJK UNIFIED IDEOGRAPH
+ 0xE19A: 0x7669, //CJK UNIFIED IDEOGRAPH
+ 0xE19B: 0x766A, //CJK UNIFIED IDEOGRAPH
+ 0xE19C: 0x7667, //CJK UNIFIED IDEOGRAPH
+ 0xE19D: 0x766C, //CJK UNIFIED IDEOGRAPH
+ 0xE19E: 0x7670, //CJK UNIFIED IDEOGRAPH
+ 0xE19F: 0x7672, //CJK UNIFIED IDEOGRAPH
+ 0xE1A0: 0x7676, //CJK UNIFIED IDEOGRAPH
+ 0xE1A1: 0x7678, //CJK UNIFIED IDEOGRAPH
+ 0xE1A2: 0x767C, //CJK UNIFIED IDEOGRAPH
+ 0xE1A3: 0x7680, //CJK UNIFIED IDEOGRAPH
+ 0xE1A4: 0x7683, //CJK UNIFIED IDEOGRAPH
+ 0xE1A5: 0x7688, //CJK UNIFIED IDEOGRAPH
+ 0xE1A6: 0x768B, //CJK UNIFIED IDEOGRAPH
+ 0xE1A7: 0x768E, //CJK UNIFIED IDEOGRAPH
+ 0xE1A8: 0x7696, //CJK UNIFIED IDEOGRAPH
+ 0xE1A9: 0x7693, //CJK UNIFIED IDEOGRAPH
+ 0xE1AA: 0x7699, //CJK UNIFIED IDEOGRAPH
+ 0xE1AB: 0x769A, //CJK UNIFIED IDEOGRAPH
+ 0xE1AC: 0x76B0, //CJK UNIFIED IDEOGRAPH
+ 0xE1AD: 0x76B4, //CJK UNIFIED IDEOGRAPH
+ 0xE1AE: 0x76B8, //CJK UNIFIED IDEOGRAPH
+ 0xE1AF: 0x76B9, //CJK UNIFIED IDEOGRAPH
+ 0xE1B0: 0x76BA, //CJK UNIFIED IDEOGRAPH
+ 0xE1B1: 0x76C2, //CJK UNIFIED IDEOGRAPH
+ 0xE1B2: 0x76CD, //CJK UNIFIED IDEOGRAPH
+ 0xE1B3: 0x76D6, //CJK UNIFIED IDEOGRAPH
+ 0xE1B4: 0x76D2, //CJK UNIFIED IDEOGRAPH
+ 0xE1B5: 0x76DE, //CJK UNIFIED IDEOGRAPH
+ 0xE1B6: 0x76E1, //CJK UNIFIED IDEOGRAPH
+ 0xE1B7: 0x76E5, //CJK UNIFIED IDEOGRAPH
+ 0xE1B8: 0x76E7, //CJK UNIFIED IDEOGRAPH
+ 0xE1B9: 0x76EA, //CJK UNIFIED IDEOGRAPH
+ 0xE1BA: 0x862F, //CJK UNIFIED IDEOGRAPH
+ 0xE1BB: 0x76FB, //CJK UNIFIED IDEOGRAPH
+ 0xE1BC: 0x7708, //CJK UNIFIED IDEOGRAPH
+ 0xE1BD: 0x7707, //CJK UNIFIED IDEOGRAPH
+ 0xE1BE: 0x7704, //CJK UNIFIED IDEOGRAPH
+ 0xE1BF: 0x7729, //CJK UNIFIED IDEOGRAPH
+ 0xE1C0: 0x7724, //CJK UNIFIED IDEOGRAPH
+ 0xE1C1: 0x771E, //CJK UNIFIED IDEOGRAPH
+ 0xE1C2: 0x7725, //CJK UNIFIED IDEOGRAPH
+ 0xE1C3: 0x7726, //CJK UNIFIED IDEOGRAPH
+ 0xE1C4: 0x771B, //CJK UNIFIED IDEOGRAPH
+ 0xE1C5: 0x7737, //CJK UNIFIED IDEOGRAPH
+ 0xE1C6: 0x7738, //CJK UNIFIED IDEOGRAPH
+ 0xE1C7: 0x7747, //CJK UNIFIED IDEOGRAPH
+ 0xE1C8: 0x775A, //CJK UNIFIED IDEOGRAPH
+ 0xE1C9: 0x7768, //CJK UNIFIED IDEOGRAPH
+ 0xE1CA: 0x776B, //CJK UNIFIED IDEOGRAPH
+ 0xE1CB: 0x775B, //CJK UNIFIED IDEOGRAPH
+ 0xE1CC: 0x7765, //CJK UNIFIED IDEOGRAPH
+ 0xE1CD: 0x777F, //CJK UNIFIED IDEOGRAPH
+ 0xE1CE: 0x777E, //CJK UNIFIED IDEOGRAPH
+ 0xE1CF: 0x7779, //CJK UNIFIED IDEOGRAPH
+ 0xE1D0: 0x778E, //CJK UNIFIED IDEOGRAPH
+ 0xE1D1: 0x778B, //CJK UNIFIED IDEOGRAPH
+ 0xE1D2: 0x7791, //CJK UNIFIED IDEOGRAPH
+ 0xE1D3: 0x77A0, //CJK UNIFIED IDEOGRAPH
+ 0xE1D4: 0x779E, //CJK UNIFIED IDEOGRAPH
+ 0xE1D5: 0x77B0, //CJK UNIFIED IDEOGRAPH
+ 0xE1D6: 0x77B6, //CJK UNIFIED IDEOGRAPH
+ 0xE1D7: 0x77B9, //CJK UNIFIED IDEOGRAPH
+ 0xE1D8: 0x77BF, //CJK UNIFIED IDEOGRAPH
+ 0xE1D9: 0x77BC, //CJK UNIFIED IDEOGRAPH
+ 0xE1DA: 0x77BD, //CJK UNIFIED IDEOGRAPH
+ 0xE1DB: 0x77BB, //CJK UNIFIED IDEOGRAPH
+ 0xE1DC: 0x77C7, //CJK UNIFIED IDEOGRAPH
+ 0xE1DD: 0x77CD, //CJK UNIFIED IDEOGRAPH
+ 0xE1DE: 0x77D7, //CJK UNIFIED IDEOGRAPH
+ 0xE1DF: 0x77DA, //CJK UNIFIED IDEOGRAPH
+ 0xE1E0: 0x77DC, //CJK UNIFIED IDEOGRAPH
+ 0xE1E1: 0x77E3, //CJK UNIFIED IDEOGRAPH
+ 0xE1E2: 0x77EE, //CJK UNIFIED IDEOGRAPH
+ 0xE1E3: 0x77FC, //CJK UNIFIED IDEOGRAPH
+ 0xE1E4: 0x780C, //CJK UNIFIED IDEOGRAPH
+ 0xE1E5: 0x7812, //CJK UNIFIED IDEOGRAPH
+ 0xE1E6: 0x7926, //CJK UNIFIED IDEOGRAPH
+ 0xE1E7: 0x7820, //CJK UNIFIED IDEOGRAPH
+ 0xE1E8: 0x792A, //CJK UNIFIED IDEOGRAPH
+ 0xE1E9: 0x7845, //CJK UNIFIED IDEOGRAPH
+ 0xE1EA: 0x788E, //CJK UNIFIED IDEOGRAPH
+ 0xE1EB: 0x7874, //CJK UNIFIED IDEOGRAPH
+ 0xE1EC: 0x7886, //CJK UNIFIED IDEOGRAPH
+ 0xE1ED: 0x787C, //CJK UNIFIED IDEOGRAPH
+ 0xE1EE: 0x789A, //CJK UNIFIED IDEOGRAPH
+ 0xE1EF: 0x788C, //CJK UNIFIED IDEOGRAPH
+ 0xE1F0: 0x78A3, //CJK UNIFIED IDEOGRAPH
+ 0xE1F1: 0x78B5, //CJK UNIFIED IDEOGRAPH
+ 0xE1F2: 0x78AA, //CJK UNIFIED IDEOGRAPH
+ 0xE1F3: 0x78AF, //CJK UNIFIED IDEOGRAPH
+ 0xE1F4: 0x78D1, //CJK UNIFIED IDEOGRAPH
+ 0xE1F5: 0x78C6, //CJK UNIFIED IDEOGRAPH
+ 0xE1F6: 0x78CB, //CJK UNIFIED IDEOGRAPH
+ 0xE1F7: 0x78D4, //CJK UNIFIED IDEOGRAPH
+ 0xE1F8: 0x78BE, //CJK UNIFIED IDEOGRAPH
+ 0xE1F9: 0x78BC, //CJK UNIFIED IDEOGRAPH
+ 0xE1FA: 0x78C5, //CJK UNIFIED IDEOGRAPH
+ 0xE1FB: 0x78CA, //CJK UNIFIED IDEOGRAPH
+ 0xE1FC: 0x78EC, //CJK UNIFIED IDEOGRAPH
+ 0xE240: 0x78E7, //CJK UNIFIED IDEOGRAPH
+ 0xE241: 0x78DA, //CJK UNIFIED IDEOGRAPH
+ 0xE242: 0x78FD, //CJK UNIFIED IDEOGRAPH
+ 0xE243: 0x78F4, //CJK UNIFIED IDEOGRAPH
+ 0xE244: 0x7907, //CJK UNIFIED IDEOGRAPH
+ 0xE245: 0x7912, //CJK UNIFIED IDEOGRAPH
+ 0xE246: 0x7911, //CJK UNIFIED IDEOGRAPH
+ 0xE247: 0x7919, //CJK UNIFIED IDEOGRAPH
+ 0xE248: 0x792C, //CJK UNIFIED IDEOGRAPH
+ 0xE249: 0x792B, //CJK UNIFIED IDEOGRAPH
+ 0xE24A: 0x7940, //CJK UNIFIED IDEOGRAPH
+ 0xE24B: 0x7960, //CJK UNIFIED IDEOGRAPH
+ 0xE24C: 0x7957, //CJK UNIFIED IDEOGRAPH
+ 0xE24D: 0x795F, //CJK UNIFIED IDEOGRAPH
+ 0xE24E: 0x795A, //CJK UNIFIED IDEOGRAPH
+ 0xE24F: 0x7955, //CJK UNIFIED IDEOGRAPH
+ 0xE250: 0x7953, //CJK UNIFIED IDEOGRAPH
+ 0xE251: 0x797A, //CJK UNIFIED IDEOGRAPH
+ 0xE252: 0x797F, //CJK UNIFIED IDEOGRAPH
+ 0xE253: 0x798A, //CJK UNIFIED IDEOGRAPH
+ 0xE254: 0x799D, //CJK UNIFIED IDEOGRAPH
+ 0xE255: 0x79A7, //CJK UNIFIED IDEOGRAPH
+ 0xE256: 0x9F4B, //CJK UNIFIED IDEOGRAPH
+ 0xE257: 0x79AA, //CJK UNIFIED IDEOGRAPH
+ 0xE258: 0x79AE, //CJK UNIFIED IDEOGRAPH
+ 0xE259: 0x79B3, //CJK UNIFIED IDEOGRAPH
+ 0xE25A: 0x79B9, //CJK UNIFIED IDEOGRAPH
+ 0xE25B: 0x79BA, //CJK UNIFIED IDEOGRAPH
+ 0xE25C: 0x79C9, //CJK UNIFIED IDEOGRAPH
+ 0xE25D: 0x79D5, //CJK UNIFIED IDEOGRAPH
+ 0xE25E: 0x79E7, //CJK UNIFIED IDEOGRAPH
+ 0xE25F: 0x79EC, //CJK UNIFIED IDEOGRAPH
+ 0xE260: 0x79E1, //CJK UNIFIED IDEOGRAPH
+ 0xE261: 0x79E3, //CJK UNIFIED IDEOGRAPH
+ 0xE262: 0x7A08, //CJK UNIFIED IDEOGRAPH
+ 0xE263: 0x7A0D, //CJK UNIFIED IDEOGRAPH
+ 0xE264: 0x7A18, //CJK UNIFIED IDEOGRAPH
+ 0xE265: 0x7A19, //CJK UNIFIED IDEOGRAPH
+ 0xE266: 0x7A20, //CJK UNIFIED IDEOGRAPH
+ 0xE267: 0x7A1F, //CJK UNIFIED IDEOGRAPH
+ 0xE268: 0x7980, //CJK UNIFIED IDEOGRAPH
+ 0xE269: 0x7A31, //CJK UNIFIED IDEOGRAPH
+ 0xE26A: 0x7A3B, //CJK UNIFIED IDEOGRAPH
+ 0xE26B: 0x7A3E, //CJK UNIFIED IDEOGRAPH
+ 0xE26C: 0x7A37, //CJK UNIFIED IDEOGRAPH
+ 0xE26D: 0x7A43, //CJK UNIFIED IDEOGRAPH
+ 0xE26E: 0x7A57, //CJK UNIFIED IDEOGRAPH
+ 0xE26F: 0x7A49, //CJK UNIFIED IDEOGRAPH
+ 0xE270: 0x7A61, //CJK UNIFIED IDEOGRAPH
+ 0xE271: 0x7A62, //CJK UNIFIED IDEOGRAPH
+ 0xE272: 0x7A69, //CJK UNIFIED IDEOGRAPH
+ 0xE273: 0x9F9D, //CJK UNIFIED IDEOGRAPH
+ 0xE274: 0x7A70, //CJK UNIFIED IDEOGRAPH
+ 0xE275: 0x7A79, //CJK UNIFIED IDEOGRAPH
+ 0xE276: 0x7A7D, //CJK UNIFIED IDEOGRAPH
+ 0xE277: 0x7A88, //CJK UNIFIED IDEOGRAPH
+ 0xE278: 0x7A97, //CJK UNIFIED IDEOGRAPH
+ 0xE279: 0x7A95, //CJK UNIFIED IDEOGRAPH
+ 0xE27A: 0x7A98, //CJK UNIFIED IDEOGRAPH
+ 0xE27B: 0x7A96, //CJK UNIFIED IDEOGRAPH
+ 0xE27C: 0x7AA9, //CJK UNIFIED IDEOGRAPH
+ 0xE27D: 0x7AC8, //CJK UNIFIED IDEOGRAPH
+ 0xE27E: 0x7AB0, //CJK UNIFIED IDEOGRAPH
+ 0xE280: 0x7AB6, //CJK UNIFIED IDEOGRAPH
+ 0xE281: 0x7AC5, //CJK UNIFIED IDEOGRAPH
+ 0xE282: 0x7AC4, //CJK UNIFIED IDEOGRAPH
+ 0xE283: 0x7ABF, //CJK UNIFIED IDEOGRAPH
+ 0xE284: 0x9083, //CJK UNIFIED IDEOGRAPH
+ 0xE285: 0x7AC7, //CJK UNIFIED IDEOGRAPH
+ 0xE286: 0x7ACA, //CJK UNIFIED IDEOGRAPH
+ 0xE287: 0x7ACD, //CJK UNIFIED IDEOGRAPH
+ 0xE288: 0x7ACF, //CJK UNIFIED IDEOGRAPH
+ 0xE289: 0x7AD5, //CJK UNIFIED IDEOGRAPH
+ 0xE28A: 0x7AD3, //CJK UNIFIED IDEOGRAPH
+ 0xE28B: 0x7AD9, //CJK UNIFIED IDEOGRAPH
+ 0xE28C: 0x7ADA, //CJK UNIFIED IDEOGRAPH
+ 0xE28D: 0x7ADD, //CJK UNIFIED IDEOGRAPH
+ 0xE28E: 0x7AE1, //CJK UNIFIED IDEOGRAPH
+ 0xE28F: 0x7AE2, //CJK UNIFIED IDEOGRAPH
+ 0xE290: 0x7AE6, //CJK UNIFIED IDEOGRAPH
+ 0xE291: 0x7AED, //CJK UNIFIED IDEOGRAPH
+ 0xE292: 0x7AF0, //CJK UNIFIED IDEOGRAPH
+ 0xE293: 0x7B02, //CJK UNIFIED IDEOGRAPH
+ 0xE294: 0x7B0F, //CJK UNIFIED IDEOGRAPH
+ 0xE295: 0x7B0A, //CJK UNIFIED IDEOGRAPH
+ 0xE296: 0x7B06, //CJK UNIFIED IDEOGRAPH
+ 0xE297: 0x7B33, //CJK UNIFIED IDEOGRAPH
+ 0xE298: 0x7B18, //CJK UNIFIED IDEOGRAPH
+ 0xE299: 0x7B19, //CJK UNIFIED IDEOGRAPH
+ 0xE29A: 0x7B1E, //CJK UNIFIED IDEOGRAPH
+ 0xE29B: 0x7B35, //CJK UNIFIED IDEOGRAPH
+ 0xE29C: 0x7B28, //CJK UNIFIED IDEOGRAPH
+ 0xE29D: 0x7B36, //CJK UNIFIED IDEOGRAPH
+ 0xE29E: 0x7B50, //CJK UNIFIED IDEOGRAPH
+ 0xE29F: 0x7B7A, //CJK UNIFIED IDEOGRAPH
+ 0xE2A0: 0x7B04, //CJK UNIFIED IDEOGRAPH
+ 0xE2A1: 0x7B4D, //CJK UNIFIED IDEOGRAPH
+ 0xE2A2: 0x7B0B, //CJK UNIFIED IDEOGRAPH
+ 0xE2A3: 0x7B4C, //CJK UNIFIED IDEOGRAPH
+ 0xE2A4: 0x7B45, //CJK UNIFIED IDEOGRAPH
+ 0xE2A5: 0x7B75, //CJK UNIFIED IDEOGRAPH
+ 0xE2A6: 0x7B65, //CJK UNIFIED IDEOGRAPH
+ 0xE2A7: 0x7B74, //CJK UNIFIED IDEOGRAPH
+ 0xE2A8: 0x7B67, //CJK UNIFIED IDEOGRAPH
+ 0xE2A9: 0x7B70, //CJK UNIFIED IDEOGRAPH
+ 0xE2AA: 0x7B71, //CJK UNIFIED IDEOGRAPH
+ 0xE2AB: 0x7B6C, //CJK UNIFIED IDEOGRAPH
+ 0xE2AC: 0x7B6E, //CJK UNIFIED IDEOGRAPH
+ 0xE2AD: 0x7B9D, //CJK UNIFIED IDEOGRAPH
+ 0xE2AE: 0x7B98, //CJK UNIFIED IDEOGRAPH
+ 0xE2AF: 0x7B9F, //CJK UNIFIED IDEOGRAPH
+ 0xE2B0: 0x7B8D, //CJK UNIFIED IDEOGRAPH
+ 0xE2B1: 0x7B9C, //CJK UNIFIED IDEOGRAPH
+ 0xE2B2: 0x7B9A, //CJK UNIFIED IDEOGRAPH
+ 0xE2B3: 0x7B8B, //CJK UNIFIED IDEOGRAPH
+ 0xE2B4: 0x7B92, //CJK UNIFIED IDEOGRAPH
+ 0xE2B5: 0x7B8F, //CJK UNIFIED IDEOGRAPH
+ 0xE2B6: 0x7B5D, //CJK UNIFIED IDEOGRAPH
+ 0xE2B7: 0x7B99, //CJK UNIFIED IDEOGRAPH
+ 0xE2B8: 0x7BCB, //CJK UNIFIED IDEOGRAPH
+ 0xE2B9: 0x7BC1, //CJK UNIFIED IDEOGRAPH
+ 0xE2BA: 0x7BCC, //CJK UNIFIED IDEOGRAPH
+ 0xE2BB: 0x7BCF, //CJK UNIFIED IDEOGRAPH
+ 0xE2BC: 0x7BB4, //CJK UNIFIED IDEOGRAPH
+ 0xE2BD: 0x7BC6, //CJK UNIFIED IDEOGRAPH
+ 0xE2BE: 0x7BDD, //CJK UNIFIED IDEOGRAPH
+ 0xE2BF: 0x7BE9, //CJK UNIFIED IDEOGRAPH
+ 0xE2C0: 0x7C11, //CJK UNIFIED IDEOGRAPH
+ 0xE2C1: 0x7C14, //CJK UNIFIED IDEOGRAPH
+ 0xE2C2: 0x7BE6, //CJK UNIFIED IDEOGRAPH
+ 0xE2C3: 0x7BE5, //CJK UNIFIED IDEOGRAPH
+ 0xE2C4: 0x7C60, //CJK UNIFIED IDEOGRAPH
+ 0xE2C5: 0x7C00, //CJK UNIFIED IDEOGRAPH
+ 0xE2C6: 0x7C07, //CJK UNIFIED IDEOGRAPH
+ 0xE2C7: 0x7C13, //CJK UNIFIED IDEOGRAPH
+ 0xE2C8: 0x7BF3, //CJK UNIFIED IDEOGRAPH
+ 0xE2C9: 0x7BF7, //CJK UNIFIED IDEOGRAPH
+ 0xE2CA: 0x7C17, //CJK UNIFIED IDEOGRAPH
+ 0xE2CB: 0x7C0D, //CJK UNIFIED IDEOGRAPH
+ 0xE2CC: 0x7BF6, //CJK UNIFIED IDEOGRAPH
+ 0xE2CD: 0x7C23, //CJK UNIFIED IDEOGRAPH
+ 0xE2CE: 0x7C27, //CJK UNIFIED IDEOGRAPH
+ 0xE2CF: 0x7C2A, //CJK UNIFIED IDEOGRAPH
+ 0xE2D0: 0x7C1F, //CJK UNIFIED IDEOGRAPH
+ 0xE2D1: 0x7C37, //CJK UNIFIED IDEOGRAPH
+ 0xE2D2: 0x7C2B, //CJK UNIFIED IDEOGRAPH
+ 0xE2D3: 0x7C3D, //CJK UNIFIED IDEOGRAPH
+ 0xE2D4: 0x7C4C, //CJK UNIFIED IDEOGRAPH
+ 0xE2D5: 0x7C43, //CJK UNIFIED IDEOGRAPH
+ 0xE2D6: 0x7C54, //CJK UNIFIED IDEOGRAPH
+ 0xE2D7: 0x7C4F, //CJK UNIFIED IDEOGRAPH
+ 0xE2D8: 0x7C40, //CJK UNIFIED IDEOGRAPH
+ 0xE2D9: 0x7C50, //CJK UNIFIED IDEOGRAPH
+ 0xE2DA: 0x7C58, //CJK UNIFIED IDEOGRAPH
+ 0xE2DB: 0x7C5F, //CJK UNIFIED IDEOGRAPH
+ 0xE2DC: 0x7C64, //CJK UNIFIED IDEOGRAPH
+ 0xE2DD: 0x7C56, //CJK UNIFIED IDEOGRAPH
+ 0xE2DE: 0x7C65, //CJK UNIFIED IDEOGRAPH
+ 0xE2DF: 0x7C6C, //CJK UNIFIED IDEOGRAPH
+ 0xE2E0: 0x7C75, //CJK UNIFIED IDEOGRAPH
+ 0xE2E1: 0x7C83, //CJK UNIFIED IDEOGRAPH
+ 0xE2E2: 0x7C90, //CJK UNIFIED IDEOGRAPH
+ 0xE2E3: 0x7CA4, //CJK UNIFIED IDEOGRAPH
+ 0xE2E4: 0x7CAD, //CJK UNIFIED IDEOGRAPH
+ 0xE2E5: 0x7CA2, //CJK UNIFIED IDEOGRAPH
+ 0xE2E6: 0x7CAB, //CJK UNIFIED IDEOGRAPH
+ 0xE2E7: 0x7CA1, //CJK UNIFIED IDEOGRAPH
+ 0xE2E8: 0x7CA8, //CJK UNIFIED IDEOGRAPH
+ 0xE2E9: 0x7CB3, //CJK UNIFIED IDEOGRAPH
+ 0xE2EA: 0x7CB2, //CJK UNIFIED IDEOGRAPH
+ 0xE2EB: 0x7CB1, //CJK UNIFIED IDEOGRAPH
+ 0xE2EC: 0x7CAE, //CJK UNIFIED IDEOGRAPH
+ 0xE2ED: 0x7CB9, //CJK UNIFIED IDEOGRAPH
+ 0xE2EE: 0x7CBD, //CJK UNIFIED IDEOGRAPH
+ 0xE2EF: 0x7CC0, //CJK UNIFIED IDEOGRAPH
+ 0xE2F0: 0x7CC5, //CJK UNIFIED IDEOGRAPH
+ 0xE2F1: 0x7CC2, //CJK UNIFIED IDEOGRAPH
+ 0xE2F2: 0x7CD8, //CJK UNIFIED IDEOGRAPH
+ 0xE2F3: 0x7CD2, //CJK UNIFIED IDEOGRAPH
+ 0xE2F4: 0x7CDC, //CJK UNIFIED IDEOGRAPH
+ 0xE2F5: 0x7CE2, //CJK UNIFIED IDEOGRAPH
+ 0xE2F6: 0x9B3B, //CJK UNIFIED IDEOGRAPH
+ 0xE2F7: 0x7CEF, //CJK UNIFIED IDEOGRAPH
+ 0xE2F8: 0x7CF2, //CJK UNIFIED IDEOGRAPH
+ 0xE2F9: 0x7CF4, //CJK UNIFIED IDEOGRAPH
+ 0xE2FA: 0x7CF6, //CJK UNIFIED IDEOGRAPH
+ 0xE2FB: 0x7CFA, //CJK UNIFIED IDEOGRAPH
+ 0xE2FC: 0x7D06, //CJK UNIFIED IDEOGRAPH
+ 0xE340: 0x7D02, //CJK UNIFIED IDEOGRAPH
+ 0xE341: 0x7D1C, //CJK UNIFIED IDEOGRAPH
+ 0xE342: 0x7D15, //CJK UNIFIED IDEOGRAPH
+ 0xE343: 0x7D0A, //CJK UNIFIED IDEOGRAPH
+ 0xE344: 0x7D45, //CJK UNIFIED IDEOGRAPH
+ 0xE345: 0x7D4B, //CJK UNIFIED IDEOGRAPH
+ 0xE346: 0x7D2E, //CJK UNIFIED IDEOGRAPH
+ 0xE347: 0x7D32, //CJK UNIFIED IDEOGRAPH
+ 0xE348: 0x7D3F, //CJK UNIFIED IDEOGRAPH
+ 0xE349: 0x7D35, //CJK UNIFIED IDEOGRAPH
+ 0xE34A: 0x7D46, //CJK UNIFIED IDEOGRAPH
+ 0xE34B: 0x7D73, //CJK UNIFIED IDEOGRAPH
+ 0xE34C: 0x7D56, //CJK UNIFIED IDEOGRAPH
+ 0xE34D: 0x7D4E, //CJK UNIFIED IDEOGRAPH
+ 0xE34E: 0x7D72, //CJK UNIFIED IDEOGRAPH
+ 0xE34F: 0x7D68, //CJK UNIFIED IDEOGRAPH
+ 0xE350: 0x7D6E, //CJK UNIFIED IDEOGRAPH
+ 0xE351: 0x7D4F, //CJK UNIFIED IDEOGRAPH
+ 0xE352: 0x7D63, //CJK UNIFIED IDEOGRAPH
+ 0xE353: 0x7D93, //CJK UNIFIED IDEOGRAPH
+ 0xE354: 0x7D89, //CJK UNIFIED IDEOGRAPH
+ 0xE355: 0x7D5B, //CJK UNIFIED IDEOGRAPH
+ 0xE356: 0x7D8F, //CJK UNIFIED IDEOGRAPH
+ 0xE357: 0x7D7D, //CJK UNIFIED IDEOGRAPH
+ 0xE358: 0x7D9B, //CJK UNIFIED IDEOGRAPH
+ 0xE359: 0x7DBA, //CJK UNIFIED IDEOGRAPH
+ 0xE35A: 0x7DAE, //CJK UNIFIED IDEOGRAPH
+ 0xE35B: 0x7DA3, //CJK UNIFIED IDEOGRAPH
+ 0xE35C: 0x7DB5, //CJK UNIFIED IDEOGRAPH
+ 0xE35D: 0x7DC7, //CJK UNIFIED IDEOGRAPH
+ 0xE35E: 0x7DBD, //CJK UNIFIED IDEOGRAPH
+ 0xE35F: 0x7DAB, //CJK UNIFIED IDEOGRAPH
+ 0xE360: 0x7E3D, //CJK UNIFIED IDEOGRAPH
+ 0xE361: 0x7DA2, //CJK UNIFIED IDEOGRAPH
+ 0xE362: 0x7DAF, //CJK UNIFIED IDEOGRAPH
+ 0xE363: 0x7DDC, //CJK UNIFIED IDEOGRAPH
+ 0xE364: 0x7DB8, //CJK UNIFIED IDEOGRAPH
+ 0xE365: 0x7D9F, //CJK UNIFIED IDEOGRAPH
+ 0xE366: 0x7DB0, //CJK UNIFIED IDEOGRAPH
+ 0xE367: 0x7DD8, //CJK UNIFIED IDEOGRAPH
+ 0xE368: 0x7DDD, //CJK UNIFIED IDEOGRAPH
+ 0xE369: 0x7DE4, //CJK UNIFIED IDEOGRAPH
+ 0xE36A: 0x7DDE, //CJK UNIFIED IDEOGRAPH
+ 0xE36B: 0x7DFB, //CJK UNIFIED IDEOGRAPH
+ 0xE36C: 0x7DF2, //CJK UNIFIED IDEOGRAPH
+ 0xE36D: 0x7DE1, //CJK UNIFIED IDEOGRAPH
+ 0xE36E: 0x7E05, //CJK UNIFIED IDEOGRAPH
+ 0xE36F: 0x7E0A, //CJK UNIFIED IDEOGRAPH
+ 0xE370: 0x7E23, //CJK UNIFIED IDEOGRAPH
+ 0xE371: 0x7E21, //CJK UNIFIED IDEOGRAPH
+ 0xE372: 0x7E12, //CJK UNIFIED IDEOGRAPH
+ 0xE373: 0x7E31, //CJK UNIFIED IDEOGRAPH
+ 0xE374: 0x7E1F, //CJK UNIFIED IDEOGRAPH
+ 0xE375: 0x7E09, //CJK UNIFIED IDEOGRAPH
+ 0xE376: 0x7E0B, //CJK UNIFIED IDEOGRAPH
+ 0xE377: 0x7E22, //CJK UNIFIED IDEOGRAPH
+ 0xE378: 0x7E46, //CJK UNIFIED IDEOGRAPH
+ 0xE379: 0x7E66, //CJK UNIFIED IDEOGRAPH
+ 0xE37A: 0x7E3B, //CJK UNIFIED IDEOGRAPH
+ 0xE37B: 0x7E35, //CJK UNIFIED IDEOGRAPH
+ 0xE37C: 0x7E39, //CJK UNIFIED IDEOGRAPH
+ 0xE37D: 0x7E43, //CJK UNIFIED IDEOGRAPH
+ 0xE37E: 0x7E37, //CJK UNIFIED IDEOGRAPH
+ 0xE380: 0x7E32, //CJK UNIFIED IDEOGRAPH
+ 0xE381: 0x7E3A, //CJK UNIFIED IDEOGRAPH
+ 0xE382: 0x7E67, //CJK UNIFIED IDEOGRAPH
+ 0xE383: 0x7E5D, //CJK UNIFIED IDEOGRAPH
+ 0xE384: 0x7E56, //CJK UNIFIED IDEOGRAPH
+ 0xE385: 0x7E5E, //CJK UNIFIED IDEOGRAPH
+ 0xE386: 0x7E59, //CJK UNIFIED IDEOGRAPH
+ 0xE387: 0x7E5A, //CJK UNIFIED IDEOGRAPH
+ 0xE388: 0x7E79, //CJK UNIFIED IDEOGRAPH
+ 0xE389: 0x7E6A, //CJK UNIFIED IDEOGRAPH
+ 0xE38A: 0x7E69, //CJK UNIFIED IDEOGRAPH
+ 0xE38B: 0x7E7C, //CJK UNIFIED IDEOGRAPH
+ 0xE38C: 0x7E7B, //CJK UNIFIED IDEOGRAPH
+ 0xE38D: 0x7E83, //CJK UNIFIED IDEOGRAPH
+ 0xE38E: 0x7DD5, //CJK UNIFIED IDEOGRAPH
+ 0xE38F: 0x7E7D, //CJK UNIFIED IDEOGRAPH
+ 0xE390: 0x8FAE, //CJK UNIFIED IDEOGRAPH
+ 0xE391: 0x7E7F, //CJK UNIFIED IDEOGRAPH
+ 0xE392: 0x7E88, //CJK UNIFIED IDEOGRAPH
+ 0xE393: 0x7E89, //CJK UNIFIED IDEOGRAPH
+ 0xE394: 0x7E8C, //CJK UNIFIED IDEOGRAPH
+ 0xE395: 0x7E92, //CJK UNIFIED IDEOGRAPH
+ 0xE396: 0x7E90, //CJK UNIFIED IDEOGRAPH
+ 0xE397: 0x7E93, //CJK UNIFIED IDEOGRAPH
+ 0xE398: 0x7E94, //CJK UNIFIED IDEOGRAPH
+ 0xE399: 0x7E96, //CJK UNIFIED IDEOGRAPH
+ 0xE39A: 0x7E8E, //CJK UNIFIED IDEOGRAPH
+ 0xE39B: 0x7E9B, //CJK UNIFIED IDEOGRAPH
+ 0xE39C: 0x7E9C, //CJK UNIFIED IDEOGRAPH
+ 0xE39D: 0x7F38, //CJK UNIFIED IDEOGRAPH
+ 0xE39E: 0x7F3A, //CJK UNIFIED IDEOGRAPH
+ 0xE39F: 0x7F45, //CJK UNIFIED IDEOGRAPH
+ 0xE3A0: 0x7F4C, //CJK UNIFIED IDEOGRAPH
+ 0xE3A1: 0x7F4D, //CJK UNIFIED IDEOGRAPH
+ 0xE3A2: 0x7F4E, //CJK UNIFIED IDEOGRAPH
+ 0xE3A3: 0x7F50, //CJK UNIFIED IDEOGRAPH
+ 0xE3A4: 0x7F51, //CJK UNIFIED IDEOGRAPH
+ 0xE3A5: 0x7F55, //CJK UNIFIED IDEOGRAPH
+ 0xE3A6: 0x7F54, //CJK UNIFIED IDEOGRAPH
+ 0xE3A7: 0x7F58, //CJK UNIFIED IDEOGRAPH
+ 0xE3A8: 0x7F5F, //CJK UNIFIED IDEOGRAPH
+ 0xE3A9: 0x7F60, //CJK UNIFIED IDEOGRAPH
+ 0xE3AA: 0x7F68, //CJK UNIFIED IDEOGRAPH
+ 0xE3AB: 0x7F69, //CJK UNIFIED IDEOGRAPH
+ 0xE3AC: 0x7F67, //CJK UNIFIED IDEOGRAPH
+ 0xE3AD: 0x7F78, //CJK UNIFIED IDEOGRAPH
+ 0xE3AE: 0x7F82, //CJK UNIFIED IDEOGRAPH
+ 0xE3AF: 0x7F86, //CJK UNIFIED IDEOGRAPH
+ 0xE3B0: 0x7F83, //CJK UNIFIED IDEOGRAPH
+ 0xE3B1: 0x7F88, //CJK UNIFIED IDEOGRAPH
+ 0xE3B2: 0x7F87, //CJK UNIFIED IDEOGRAPH
+ 0xE3B3: 0x7F8C, //CJK UNIFIED IDEOGRAPH
+ 0xE3B4: 0x7F94, //CJK UNIFIED IDEOGRAPH
+ 0xE3B5: 0x7F9E, //CJK UNIFIED IDEOGRAPH
+ 0xE3B6: 0x7F9D, //CJK UNIFIED IDEOGRAPH
+ 0xE3B7: 0x7F9A, //CJK UNIFIED IDEOGRAPH
+ 0xE3B8: 0x7FA3, //CJK UNIFIED IDEOGRAPH
+ 0xE3B9: 0x7FAF, //CJK UNIFIED IDEOGRAPH
+ 0xE3BA: 0x7FB2, //CJK UNIFIED IDEOGRAPH
+ 0xE3BB: 0x7FB9, //CJK UNIFIED IDEOGRAPH
+ 0xE3BC: 0x7FAE, //CJK UNIFIED IDEOGRAPH
+ 0xE3BD: 0x7FB6, //CJK UNIFIED IDEOGRAPH
+ 0xE3BE: 0x7FB8, //CJK UNIFIED IDEOGRAPH
+ 0xE3BF: 0x8B71, //CJK UNIFIED IDEOGRAPH
+ 0xE3C0: 0x7FC5, //CJK UNIFIED IDEOGRAPH
+ 0xE3C1: 0x7FC6, //CJK UNIFIED IDEOGRAPH
+ 0xE3C2: 0x7FCA, //CJK UNIFIED IDEOGRAPH
+ 0xE3C3: 0x7FD5, //CJK UNIFIED IDEOGRAPH
+ 0xE3C4: 0x7FD4, //CJK UNIFIED IDEOGRAPH
+ 0xE3C5: 0x7FE1, //CJK UNIFIED IDEOGRAPH
+ 0xE3C6: 0x7FE6, //CJK UNIFIED IDEOGRAPH
+ 0xE3C7: 0x7FE9, //CJK UNIFIED IDEOGRAPH
+ 0xE3C8: 0x7FF3, //CJK UNIFIED IDEOGRAPH
+ 0xE3C9: 0x7FF9, //CJK UNIFIED IDEOGRAPH
+ 0xE3CA: 0x98DC, //CJK UNIFIED IDEOGRAPH
+ 0xE3CB: 0x8006, //CJK UNIFIED IDEOGRAPH
+ 0xE3CC: 0x8004, //CJK UNIFIED IDEOGRAPH
+ 0xE3CD: 0x800B, //CJK UNIFIED IDEOGRAPH
+ 0xE3CE: 0x8012, //CJK UNIFIED IDEOGRAPH
+ 0xE3CF: 0x8018, //CJK UNIFIED IDEOGRAPH
+ 0xE3D0: 0x8019, //CJK UNIFIED IDEOGRAPH
+ 0xE3D1: 0x801C, //CJK UNIFIED IDEOGRAPH
+ 0xE3D2: 0x8021, //CJK UNIFIED IDEOGRAPH
+ 0xE3D3: 0x8028, //CJK UNIFIED IDEOGRAPH
+ 0xE3D4: 0x803F, //CJK UNIFIED IDEOGRAPH
+ 0xE3D5: 0x803B, //CJK UNIFIED IDEOGRAPH
+ 0xE3D6: 0x804A, //CJK UNIFIED IDEOGRAPH
+ 0xE3D7: 0x8046, //CJK UNIFIED IDEOGRAPH
+ 0xE3D8: 0x8052, //CJK UNIFIED IDEOGRAPH
+ 0xE3D9: 0x8058, //CJK UNIFIED IDEOGRAPH
+ 0xE3DA: 0x805A, //CJK UNIFIED IDEOGRAPH
+ 0xE3DB: 0x805F, //CJK UNIFIED IDEOGRAPH
+ 0xE3DC: 0x8062, //CJK UNIFIED IDEOGRAPH
+ 0xE3DD: 0x8068, //CJK UNIFIED IDEOGRAPH
+ 0xE3DE: 0x8073, //CJK UNIFIED IDEOGRAPH
+ 0xE3DF: 0x8072, //CJK UNIFIED IDEOGRAPH
+ 0xE3E0: 0x8070, //CJK UNIFIED IDEOGRAPH
+ 0xE3E1: 0x8076, //CJK UNIFIED IDEOGRAPH
+ 0xE3E2: 0x8079, //CJK UNIFIED IDEOGRAPH
+ 0xE3E3: 0x807D, //CJK UNIFIED IDEOGRAPH
+ 0xE3E4: 0x807F, //CJK UNIFIED IDEOGRAPH
+ 0xE3E5: 0x8084, //CJK UNIFIED IDEOGRAPH
+ 0xE3E6: 0x8086, //CJK UNIFIED IDEOGRAPH
+ 0xE3E7: 0x8085, //CJK UNIFIED IDEOGRAPH
+ 0xE3E8: 0x809B, //CJK UNIFIED IDEOGRAPH
+ 0xE3E9: 0x8093, //CJK UNIFIED IDEOGRAPH
+ 0xE3EA: 0x809A, //CJK UNIFIED IDEOGRAPH
+ 0xE3EB: 0x80AD, //CJK UNIFIED IDEOGRAPH
+ 0xE3EC: 0x5190, //CJK UNIFIED IDEOGRAPH
+ 0xE3ED: 0x80AC, //CJK UNIFIED IDEOGRAPH
+ 0xE3EE: 0x80DB, //CJK UNIFIED IDEOGRAPH
+ 0xE3EF: 0x80E5, //CJK UNIFIED IDEOGRAPH
+ 0xE3F0: 0x80D9, //CJK UNIFIED IDEOGRAPH
+ 0xE3F1: 0x80DD, //CJK UNIFIED IDEOGRAPH
+ 0xE3F2: 0x80C4, //CJK UNIFIED IDEOGRAPH
+ 0xE3F3: 0x80DA, //CJK UNIFIED IDEOGRAPH
+ 0xE3F4: 0x80D6, //CJK UNIFIED IDEOGRAPH
+ 0xE3F5: 0x8109, //CJK UNIFIED IDEOGRAPH
+ 0xE3F6: 0x80EF, //CJK UNIFIED IDEOGRAPH
+ 0xE3F7: 0x80F1, //CJK UNIFIED IDEOGRAPH
+ 0xE3F8: 0x811B, //CJK UNIFIED IDEOGRAPH
+ 0xE3F9: 0x8129, //CJK UNIFIED IDEOGRAPH
+ 0xE3FA: 0x8123, //CJK UNIFIED IDEOGRAPH
+ 0xE3FB: 0x812F, //CJK UNIFIED IDEOGRAPH
+ 0xE3FC: 0x814B, //CJK UNIFIED IDEOGRAPH
+ 0xE440: 0x968B, //CJK UNIFIED IDEOGRAPH
+ 0xE441: 0x8146, //CJK UNIFIED IDEOGRAPH
+ 0xE442: 0x813E, //CJK UNIFIED IDEOGRAPH
+ 0xE443: 0x8153, //CJK UNIFIED IDEOGRAPH
+ 0xE444: 0x8151, //CJK UNIFIED IDEOGRAPH
+ 0xE445: 0x80FC, //CJK UNIFIED IDEOGRAPH
+ 0xE446: 0x8171, //CJK UNIFIED IDEOGRAPH
+ 0xE447: 0x816E, //CJK UNIFIED IDEOGRAPH
+ 0xE448: 0x8165, //CJK UNIFIED IDEOGRAPH
+ 0xE449: 0x8166, //CJK UNIFIED IDEOGRAPH
+ 0xE44A: 0x8174, //CJK UNIFIED IDEOGRAPH
+ 0xE44B: 0x8183, //CJK UNIFIED IDEOGRAPH
+ 0xE44C: 0x8188, //CJK UNIFIED IDEOGRAPH
+ 0xE44D: 0x818A, //CJK UNIFIED IDEOGRAPH
+ 0xE44E: 0x8180, //CJK UNIFIED IDEOGRAPH
+ 0xE44F: 0x8182, //CJK UNIFIED IDEOGRAPH
+ 0xE450: 0x81A0, //CJK UNIFIED IDEOGRAPH
+ 0xE451: 0x8195, //CJK UNIFIED IDEOGRAPH
+ 0xE452: 0x81A4, //CJK UNIFIED IDEOGRAPH
+ 0xE453: 0x81A3, //CJK UNIFIED IDEOGRAPH
+ 0xE454: 0x815F, //CJK UNIFIED IDEOGRAPH
+ 0xE455: 0x8193, //CJK UNIFIED IDEOGRAPH
+ 0xE456: 0x81A9, //CJK UNIFIED IDEOGRAPH
+ 0xE457: 0x81B0, //CJK UNIFIED IDEOGRAPH
+ 0xE458: 0x81B5, //CJK UNIFIED IDEOGRAPH
+ 0xE459: 0x81BE, //CJK UNIFIED IDEOGRAPH
+ 0xE45A: 0x81B8, //CJK UNIFIED IDEOGRAPH
+ 0xE45B: 0x81BD, //CJK UNIFIED IDEOGRAPH
+ 0xE45C: 0x81C0, //CJK UNIFIED IDEOGRAPH
+ 0xE45D: 0x81C2, //CJK UNIFIED IDEOGRAPH
+ 0xE45E: 0x81BA, //CJK UNIFIED IDEOGRAPH
+ 0xE45F: 0x81C9, //CJK UNIFIED IDEOGRAPH
+ 0xE460: 0x81CD, //CJK UNIFIED IDEOGRAPH
+ 0xE461: 0x81D1, //CJK UNIFIED IDEOGRAPH
+ 0xE462: 0x81D9, //CJK UNIFIED IDEOGRAPH
+ 0xE463: 0x81D8, //CJK UNIFIED IDEOGRAPH
+ 0xE464: 0x81C8, //CJK UNIFIED IDEOGRAPH
+ 0xE465: 0x81DA, //CJK UNIFIED IDEOGRAPH
+ 0xE466: 0x81DF, //CJK UNIFIED IDEOGRAPH
+ 0xE467: 0x81E0, //CJK UNIFIED IDEOGRAPH
+ 0xE468: 0x81E7, //CJK UNIFIED IDEOGRAPH
+ 0xE469: 0x81FA, //CJK UNIFIED IDEOGRAPH
+ 0xE46A: 0x81FB, //CJK UNIFIED IDEOGRAPH
+ 0xE46B: 0x81FE, //CJK UNIFIED IDEOGRAPH
+ 0xE46C: 0x8201, //CJK UNIFIED IDEOGRAPH
+ 0xE46D: 0x8202, //CJK UNIFIED IDEOGRAPH
+ 0xE46E: 0x8205, //CJK UNIFIED IDEOGRAPH
+ 0xE46F: 0x8207, //CJK UNIFIED IDEOGRAPH
+ 0xE470: 0x820A, //CJK UNIFIED IDEOGRAPH
+ 0xE471: 0x820D, //CJK UNIFIED IDEOGRAPH
+ 0xE472: 0x8210, //CJK UNIFIED IDEOGRAPH
+ 0xE473: 0x8216, //CJK UNIFIED IDEOGRAPH
+ 0xE474: 0x8229, //CJK UNIFIED IDEOGRAPH
+ 0xE475: 0x822B, //CJK UNIFIED IDEOGRAPH
+ 0xE476: 0x8238, //CJK UNIFIED IDEOGRAPH
+ 0xE477: 0x8233, //CJK UNIFIED IDEOGRAPH
+ 0xE478: 0x8240, //CJK UNIFIED IDEOGRAPH
+ 0xE479: 0x8259, //CJK UNIFIED IDEOGRAPH
+ 0xE47A: 0x8258, //CJK UNIFIED IDEOGRAPH
+ 0xE47B: 0x825D, //CJK UNIFIED IDEOGRAPH
+ 0xE47C: 0x825A, //CJK UNIFIED IDEOGRAPH
+ 0xE47D: 0x825F, //CJK UNIFIED IDEOGRAPH
+ 0xE47E: 0x8264, //CJK UNIFIED IDEOGRAPH
+ 0xE480: 0x8262, //CJK UNIFIED IDEOGRAPH
+ 0xE481: 0x8268, //CJK UNIFIED IDEOGRAPH
+ 0xE482: 0x826A, //CJK UNIFIED IDEOGRAPH
+ 0xE483: 0x826B, //CJK UNIFIED IDEOGRAPH
+ 0xE484: 0x822E, //CJK UNIFIED IDEOGRAPH
+ 0xE485: 0x8271, //CJK UNIFIED IDEOGRAPH
+ 0xE486: 0x8277, //CJK UNIFIED IDEOGRAPH
+ 0xE487: 0x8278, //CJK UNIFIED IDEOGRAPH
+ 0xE488: 0x827E, //CJK UNIFIED IDEOGRAPH
+ 0xE489: 0x828D, //CJK UNIFIED IDEOGRAPH
+ 0xE48A: 0x8292, //CJK UNIFIED IDEOGRAPH
+ 0xE48B: 0x82AB, //CJK UNIFIED IDEOGRAPH
+ 0xE48C: 0x829F, //CJK UNIFIED IDEOGRAPH
+ 0xE48D: 0x82BB, //CJK UNIFIED IDEOGRAPH
+ 0xE48E: 0x82AC, //CJK UNIFIED IDEOGRAPH
+ 0xE48F: 0x82E1, //CJK UNIFIED IDEOGRAPH
+ 0xE490: 0x82E3, //CJK UNIFIED IDEOGRAPH
+ 0xE491: 0x82DF, //CJK UNIFIED IDEOGRAPH
+ 0xE492: 0x82D2, //CJK UNIFIED IDEOGRAPH
+ 0xE493: 0x82F4, //CJK UNIFIED IDEOGRAPH
+ 0xE494: 0x82F3, //CJK UNIFIED IDEOGRAPH
+ 0xE495: 0x82FA, //CJK UNIFIED IDEOGRAPH
+ 0xE496: 0x8393, //CJK UNIFIED IDEOGRAPH
+ 0xE497: 0x8303, //CJK UNIFIED IDEOGRAPH
+ 0xE498: 0x82FB, //CJK UNIFIED IDEOGRAPH
+ 0xE499: 0x82F9, //CJK UNIFIED IDEOGRAPH
+ 0xE49A: 0x82DE, //CJK UNIFIED IDEOGRAPH
+ 0xE49B: 0x8306, //CJK UNIFIED IDEOGRAPH
+ 0xE49C: 0x82DC, //CJK UNIFIED IDEOGRAPH
+ 0xE49D: 0x8309, //CJK UNIFIED IDEOGRAPH
+ 0xE49E: 0x82D9, //CJK UNIFIED IDEOGRAPH
+ 0xE49F: 0x8335, //CJK UNIFIED IDEOGRAPH
+ 0xE4A0: 0x8334, //CJK UNIFIED IDEOGRAPH
+ 0xE4A1: 0x8316, //CJK UNIFIED IDEOGRAPH
+ 0xE4A2: 0x8332, //CJK UNIFIED IDEOGRAPH
+ 0xE4A3: 0x8331, //CJK UNIFIED IDEOGRAPH
+ 0xE4A4: 0x8340, //CJK UNIFIED IDEOGRAPH
+ 0xE4A5: 0x8339, //CJK UNIFIED IDEOGRAPH
+ 0xE4A6: 0x8350, //CJK UNIFIED IDEOGRAPH
+ 0xE4A7: 0x8345, //CJK UNIFIED IDEOGRAPH
+ 0xE4A8: 0x832F, //CJK UNIFIED IDEOGRAPH
+ 0xE4A9: 0x832B, //CJK UNIFIED IDEOGRAPH
+ 0xE4AA: 0x8317, //CJK UNIFIED IDEOGRAPH
+ 0xE4AB: 0x8318, //CJK UNIFIED IDEOGRAPH
+ 0xE4AC: 0x8385, //CJK UNIFIED IDEOGRAPH
+ 0xE4AD: 0x839A, //CJK UNIFIED IDEOGRAPH
+ 0xE4AE: 0x83AA, //CJK UNIFIED IDEOGRAPH
+ 0xE4AF: 0x839F, //CJK UNIFIED IDEOGRAPH
+ 0xE4B0: 0x83A2, //CJK UNIFIED IDEOGRAPH
+ 0xE4B1: 0x8396, //CJK UNIFIED IDEOGRAPH
+ 0xE4B2: 0x8323, //CJK UNIFIED IDEOGRAPH
+ 0xE4B3: 0x838E, //CJK UNIFIED IDEOGRAPH
+ 0xE4B4: 0x8387, //CJK UNIFIED IDEOGRAPH
+ 0xE4B5: 0x838A, //CJK UNIFIED IDEOGRAPH
+ 0xE4B6: 0x837C, //CJK UNIFIED IDEOGRAPH
+ 0xE4B7: 0x83B5, //CJK UNIFIED IDEOGRAPH
+ 0xE4B8: 0x8373, //CJK UNIFIED IDEOGRAPH
+ 0xE4B9: 0x8375, //CJK UNIFIED IDEOGRAPH
+ 0xE4BA: 0x83A0, //CJK UNIFIED IDEOGRAPH
+ 0xE4BB: 0x8389, //CJK UNIFIED IDEOGRAPH
+ 0xE4BC: 0x83A8, //CJK UNIFIED IDEOGRAPH
+ 0xE4BD: 0x83F4, //CJK UNIFIED IDEOGRAPH
+ 0xE4BE: 0x8413, //CJK UNIFIED IDEOGRAPH
+ 0xE4BF: 0x83EB, //CJK UNIFIED IDEOGRAPH
+ 0xE4C0: 0x83CE, //CJK UNIFIED IDEOGRAPH
+ 0xE4C1: 0x83FD, //CJK UNIFIED IDEOGRAPH
+ 0xE4C2: 0x8403, //CJK UNIFIED IDEOGRAPH
+ 0xE4C3: 0x83D8, //CJK UNIFIED IDEOGRAPH
+ 0xE4C4: 0x840B, //CJK UNIFIED IDEOGRAPH
+ 0xE4C5: 0x83C1, //CJK UNIFIED IDEOGRAPH
+ 0xE4C6: 0x83F7, //CJK UNIFIED IDEOGRAPH
+ 0xE4C7: 0x8407, //CJK UNIFIED IDEOGRAPH
+ 0xE4C8: 0x83E0, //CJK UNIFIED IDEOGRAPH
+ 0xE4C9: 0x83F2, //CJK UNIFIED IDEOGRAPH
+ 0xE4CA: 0x840D, //CJK UNIFIED IDEOGRAPH
+ 0xE4CB: 0x8422, //CJK UNIFIED IDEOGRAPH
+ 0xE4CC: 0x8420, //CJK UNIFIED IDEOGRAPH
+ 0xE4CD: 0x83BD, //CJK UNIFIED IDEOGRAPH
+ 0xE4CE: 0x8438, //CJK UNIFIED IDEOGRAPH
+ 0xE4CF: 0x8506, //CJK UNIFIED IDEOGRAPH
+ 0xE4D0: 0x83FB, //CJK UNIFIED IDEOGRAPH
+ 0xE4D1: 0x846D, //CJK UNIFIED IDEOGRAPH
+ 0xE4D2: 0x842A, //CJK UNIFIED IDEOGRAPH
+ 0xE4D3: 0x843C, //CJK UNIFIED IDEOGRAPH
+ 0xE4D4: 0x855A, //CJK UNIFIED IDEOGRAPH
+ 0xE4D5: 0x8484, //CJK UNIFIED IDEOGRAPH
+ 0xE4D6: 0x8477, //CJK UNIFIED IDEOGRAPH
+ 0xE4D7: 0x846B, //CJK UNIFIED IDEOGRAPH
+ 0xE4D8: 0x84AD, //CJK UNIFIED IDEOGRAPH
+ 0xE4D9: 0x846E, //CJK UNIFIED IDEOGRAPH
+ 0xE4DA: 0x8482, //CJK UNIFIED IDEOGRAPH
+ 0xE4DB: 0x8469, //CJK UNIFIED IDEOGRAPH
+ 0xE4DC: 0x8446, //CJK UNIFIED IDEOGRAPH
+ 0xE4DD: 0x842C, //CJK UNIFIED IDEOGRAPH
+ 0xE4DE: 0x846F, //CJK UNIFIED IDEOGRAPH
+ 0xE4DF: 0x8479, //CJK UNIFIED IDEOGRAPH
+ 0xE4E0: 0x8435, //CJK UNIFIED IDEOGRAPH
+ 0xE4E1: 0x84CA, //CJK UNIFIED IDEOGRAPH
+ 0xE4E2: 0x8462, //CJK UNIFIED IDEOGRAPH
+ 0xE4E3: 0x84B9, //CJK UNIFIED IDEOGRAPH
+ 0xE4E4: 0x84BF, //CJK UNIFIED IDEOGRAPH
+ 0xE4E5: 0x849F, //CJK UNIFIED IDEOGRAPH
+ 0xE4E6: 0x84D9, //CJK UNIFIED IDEOGRAPH
+ 0xE4E7: 0x84CD, //CJK UNIFIED IDEOGRAPH
+ 0xE4E8: 0x84BB, //CJK UNIFIED IDEOGRAPH
+ 0xE4E9: 0x84DA, //CJK UNIFIED IDEOGRAPH
+ 0xE4EA: 0x84D0, //CJK UNIFIED IDEOGRAPH
+ 0xE4EB: 0x84C1, //CJK UNIFIED IDEOGRAPH
+ 0xE4EC: 0x84C6, //CJK UNIFIED IDEOGRAPH
+ 0xE4ED: 0x84D6, //CJK UNIFIED IDEOGRAPH
+ 0xE4EE: 0x84A1, //CJK UNIFIED IDEOGRAPH
+ 0xE4EF: 0x8521, //CJK UNIFIED IDEOGRAPH
+ 0xE4F0: 0x84FF, //CJK UNIFIED IDEOGRAPH
+ 0xE4F1: 0x84F4, //CJK UNIFIED IDEOGRAPH
+ 0xE4F2: 0x8517, //CJK UNIFIED IDEOGRAPH
+ 0xE4F3: 0x8518, //CJK UNIFIED IDEOGRAPH
+ 0xE4F4: 0x852C, //CJK UNIFIED IDEOGRAPH
+ 0xE4F5: 0x851F, //CJK UNIFIED IDEOGRAPH
+ 0xE4F6: 0x8515, //CJK UNIFIED IDEOGRAPH
+ 0xE4F7: 0x8514, //CJK UNIFIED IDEOGRAPH
+ 0xE4F8: 0x84FC, //CJK UNIFIED IDEOGRAPH
+ 0xE4F9: 0x8540, //CJK UNIFIED IDEOGRAPH
+ 0xE4FA: 0x8563, //CJK UNIFIED IDEOGRAPH
+ 0xE4FB: 0x8558, //CJK UNIFIED IDEOGRAPH
+ 0xE4FC: 0x8548, //CJK UNIFIED IDEOGRAPH
+ 0xE540: 0x8541, //CJK UNIFIED IDEOGRAPH
+ 0xE541: 0x8602, //CJK UNIFIED IDEOGRAPH
+ 0xE542: 0x854B, //CJK UNIFIED IDEOGRAPH
+ 0xE543: 0x8555, //CJK UNIFIED IDEOGRAPH
+ 0xE544: 0x8580, //CJK UNIFIED IDEOGRAPH
+ 0xE545: 0x85A4, //CJK UNIFIED IDEOGRAPH
+ 0xE546: 0x8588, //CJK UNIFIED IDEOGRAPH
+ 0xE547: 0x8591, //CJK UNIFIED IDEOGRAPH
+ 0xE548: 0x858A, //CJK UNIFIED IDEOGRAPH
+ 0xE549: 0x85A8, //CJK UNIFIED IDEOGRAPH
+ 0xE54A: 0x856D, //CJK UNIFIED IDEOGRAPH
+ 0xE54B: 0x8594, //CJK UNIFIED IDEOGRAPH
+ 0xE54C: 0x859B, //CJK UNIFIED IDEOGRAPH
+ 0xE54D: 0x85EA, //CJK UNIFIED IDEOGRAPH
+ 0xE54E: 0x8587, //CJK UNIFIED IDEOGRAPH
+ 0xE54F: 0x859C, //CJK UNIFIED IDEOGRAPH
+ 0xE550: 0x8577, //CJK UNIFIED IDEOGRAPH
+ 0xE551: 0x857E, //CJK UNIFIED IDEOGRAPH
+ 0xE552: 0x8590, //CJK UNIFIED IDEOGRAPH
+ 0xE553: 0x85C9, //CJK UNIFIED IDEOGRAPH
+ 0xE554: 0x85BA, //CJK UNIFIED IDEOGRAPH
+ 0xE555: 0x85CF, //CJK UNIFIED IDEOGRAPH
+ 0xE556: 0x85B9, //CJK UNIFIED IDEOGRAPH
+ 0xE557: 0x85D0, //CJK UNIFIED IDEOGRAPH
+ 0xE558: 0x85D5, //CJK UNIFIED IDEOGRAPH
+ 0xE559: 0x85DD, //CJK UNIFIED IDEOGRAPH
+ 0xE55A: 0x85E5, //CJK UNIFIED IDEOGRAPH
+ 0xE55B: 0x85DC, //CJK UNIFIED IDEOGRAPH
+ 0xE55C: 0x85F9, //CJK UNIFIED IDEOGRAPH
+ 0xE55D: 0x860A, //CJK UNIFIED IDEOGRAPH
+ 0xE55E: 0x8613, //CJK UNIFIED IDEOGRAPH
+ 0xE55F: 0x860B, //CJK UNIFIED IDEOGRAPH
+ 0xE560: 0x85FE, //CJK UNIFIED IDEOGRAPH
+ 0xE561: 0x85FA, //CJK UNIFIED IDEOGRAPH
+ 0xE562: 0x8606, //CJK UNIFIED IDEOGRAPH
+ 0xE563: 0x8622, //CJK UNIFIED IDEOGRAPH
+ 0xE564: 0x861A, //CJK UNIFIED IDEOGRAPH
+ 0xE565: 0x8630, //CJK UNIFIED IDEOGRAPH
+ 0xE566: 0x863F, //CJK UNIFIED IDEOGRAPH
+ 0xE567: 0x864D, //CJK UNIFIED IDEOGRAPH
+ 0xE568: 0x4E55, //CJK UNIFIED IDEOGRAPH
+ 0xE569: 0x8654, //CJK UNIFIED IDEOGRAPH
+ 0xE56A: 0x865F, //CJK UNIFIED IDEOGRAPH
+ 0xE56B: 0x8667, //CJK UNIFIED IDEOGRAPH
+ 0xE56C: 0x8671, //CJK UNIFIED IDEOGRAPH
+ 0xE56D: 0x8693, //CJK UNIFIED IDEOGRAPH
+ 0xE56E: 0x86A3, //CJK UNIFIED IDEOGRAPH
+ 0xE56F: 0x86A9, //CJK UNIFIED IDEOGRAPH
+ 0xE570: 0x86AA, //CJK UNIFIED IDEOGRAPH
+ 0xE571: 0x868B, //CJK UNIFIED IDEOGRAPH
+ 0xE572: 0x868C, //CJK UNIFIED IDEOGRAPH
+ 0xE573: 0x86B6, //CJK UNIFIED IDEOGRAPH
+ 0xE574: 0x86AF, //CJK UNIFIED IDEOGRAPH
+ 0xE575: 0x86C4, //CJK UNIFIED IDEOGRAPH
+ 0xE576: 0x86C6, //CJK UNIFIED IDEOGRAPH
+ 0xE577: 0x86B0, //CJK UNIFIED IDEOGRAPH
+ 0xE578: 0x86C9, //CJK UNIFIED IDEOGRAPH
+ 0xE579: 0x8823, //CJK UNIFIED IDEOGRAPH
+ 0xE57A: 0x86AB, //CJK UNIFIED IDEOGRAPH
+ 0xE57B: 0x86D4, //CJK UNIFIED IDEOGRAPH
+ 0xE57C: 0x86DE, //CJK UNIFIED IDEOGRAPH
+ 0xE57D: 0x86E9, //CJK UNIFIED IDEOGRAPH
+ 0xE57E: 0x86EC, //CJK UNIFIED IDEOGRAPH
+ 0xE580: 0x86DF, //CJK UNIFIED IDEOGRAPH
+ 0xE581: 0x86DB, //CJK UNIFIED IDEOGRAPH
+ 0xE582: 0x86EF, //CJK UNIFIED IDEOGRAPH
+ 0xE583: 0x8712, //CJK UNIFIED IDEOGRAPH
+ 0xE584: 0x8706, //CJK UNIFIED IDEOGRAPH
+ 0xE585: 0x8708, //CJK UNIFIED IDEOGRAPH
+ 0xE586: 0x8700, //CJK UNIFIED IDEOGRAPH
+ 0xE587: 0x8703, //CJK UNIFIED IDEOGRAPH
+ 0xE588: 0x86FB, //CJK UNIFIED IDEOGRAPH
+ 0xE589: 0x8711, //CJK UNIFIED IDEOGRAPH
+ 0xE58A: 0x8709, //CJK UNIFIED IDEOGRAPH
+ 0xE58B: 0x870D, //CJK UNIFIED IDEOGRAPH
+ 0xE58C: 0x86F9, //CJK UNIFIED IDEOGRAPH
+ 0xE58D: 0x870A, //CJK UNIFIED IDEOGRAPH
+ 0xE58E: 0x8734, //CJK UNIFIED IDEOGRAPH
+ 0xE58F: 0x873F, //CJK UNIFIED IDEOGRAPH
+ 0xE590: 0x8737, //CJK UNIFIED IDEOGRAPH
+ 0xE591: 0x873B, //CJK UNIFIED IDEOGRAPH
+ 0xE592: 0x8725, //CJK UNIFIED IDEOGRAPH
+ 0xE593: 0x8729, //CJK UNIFIED IDEOGRAPH
+ 0xE594: 0x871A, //CJK UNIFIED IDEOGRAPH
+ 0xE595: 0x8760, //CJK UNIFIED IDEOGRAPH
+ 0xE596: 0x875F, //CJK UNIFIED IDEOGRAPH
+ 0xE597: 0x8778, //CJK UNIFIED IDEOGRAPH
+ 0xE598: 0x874C, //CJK UNIFIED IDEOGRAPH
+ 0xE599: 0x874E, //CJK UNIFIED IDEOGRAPH
+ 0xE59A: 0x8774, //CJK UNIFIED IDEOGRAPH
+ 0xE59B: 0x8757, //CJK UNIFIED IDEOGRAPH
+ 0xE59C: 0x8768, //CJK UNIFIED IDEOGRAPH
+ 0xE59D: 0x876E, //CJK UNIFIED IDEOGRAPH
+ 0xE59E: 0x8759, //CJK UNIFIED IDEOGRAPH
+ 0xE59F: 0x8753, //CJK UNIFIED IDEOGRAPH
+ 0xE5A0: 0x8763, //CJK UNIFIED IDEOGRAPH
+ 0xE5A1: 0x876A, //CJK UNIFIED IDEOGRAPH
+ 0xE5A2: 0x8805, //CJK UNIFIED IDEOGRAPH
+ 0xE5A3: 0x87A2, //CJK UNIFIED IDEOGRAPH
+ 0xE5A4: 0x879F, //CJK UNIFIED IDEOGRAPH
+ 0xE5A5: 0x8782, //CJK UNIFIED IDEOGRAPH
+ 0xE5A6: 0x87AF, //CJK UNIFIED IDEOGRAPH
+ 0xE5A7: 0x87CB, //CJK UNIFIED IDEOGRAPH
+ 0xE5A8: 0x87BD, //CJK UNIFIED IDEOGRAPH
+ 0xE5A9: 0x87C0, //CJK UNIFIED IDEOGRAPH
+ 0xE5AA: 0x87D0, //CJK UNIFIED IDEOGRAPH
+ 0xE5AB: 0x96D6, //CJK UNIFIED IDEOGRAPH
+ 0xE5AC: 0x87AB, //CJK UNIFIED IDEOGRAPH
+ 0xE5AD: 0x87C4, //CJK UNIFIED IDEOGRAPH
+ 0xE5AE: 0x87B3, //CJK UNIFIED IDEOGRAPH
+ 0xE5AF: 0x87C7, //CJK UNIFIED IDEOGRAPH
+ 0xE5B0: 0x87C6, //CJK UNIFIED IDEOGRAPH
+ 0xE5B1: 0x87BB, //CJK UNIFIED IDEOGRAPH
+ 0xE5B2: 0x87EF, //CJK UNIFIED IDEOGRAPH
+ 0xE5B3: 0x87F2, //CJK UNIFIED IDEOGRAPH
+ 0xE5B4: 0x87E0, //CJK UNIFIED IDEOGRAPH
+ 0xE5B5: 0x880F, //CJK UNIFIED IDEOGRAPH
+ 0xE5B6: 0x880D, //CJK UNIFIED IDEOGRAPH
+ 0xE5B7: 0x87FE, //CJK UNIFIED IDEOGRAPH
+ 0xE5B8: 0x87F6, //CJK UNIFIED IDEOGRAPH
+ 0xE5B9: 0x87F7, //CJK UNIFIED IDEOGRAPH
+ 0xE5BA: 0x880E, //CJK UNIFIED IDEOGRAPH
+ 0xE5BB: 0x87D2, //CJK UNIFIED IDEOGRAPH
+ 0xE5BC: 0x8811, //CJK UNIFIED IDEOGRAPH
+ 0xE5BD: 0x8816, //CJK UNIFIED IDEOGRAPH
+ 0xE5BE: 0x8815, //CJK UNIFIED IDEOGRAPH
+ 0xE5BF: 0x8822, //CJK UNIFIED IDEOGRAPH
+ 0xE5C0: 0x8821, //CJK UNIFIED IDEOGRAPH
+ 0xE5C1: 0x8831, //CJK UNIFIED IDEOGRAPH
+ 0xE5C2: 0x8836, //CJK UNIFIED IDEOGRAPH
+ 0xE5C3: 0x8839, //CJK UNIFIED IDEOGRAPH
+ 0xE5C4: 0x8827, //CJK UNIFIED IDEOGRAPH
+ 0xE5C5: 0x883B, //CJK UNIFIED IDEOGRAPH
+ 0xE5C6: 0x8844, //CJK UNIFIED IDEOGRAPH
+ 0xE5C7: 0x8842, //CJK UNIFIED IDEOGRAPH
+ 0xE5C8: 0x8852, //CJK UNIFIED IDEOGRAPH
+ 0xE5C9: 0x8859, //CJK UNIFIED IDEOGRAPH
+ 0xE5CA: 0x885E, //CJK UNIFIED IDEOGRAPH
+ 0xE5CB: 0x8862, //CJK UNIFIED IDEOGRAPH
+ 0xE5CC: 0x886B, //CJK UNIFIED IDEOGRAPH
+ 0xE5CD: 0x8881, //CJK UNIFIED IDEOGRAPH
+ 0xE5CE: 0x887E, //CJK UNIFIED IDEOGRAPH
+ 0xE5CF: 0x889E, //CJK UNIFIED IDEOGRAPH
+ 0xE5D0: 0x8875, //CJK UNIFIED IDEOGRAPH
+ 0xE5D1: 0x887D, //CJK UNIFIED IDEOGRAPH
+ 0xE5D2: 0x88B5, //CJK UNIFIED IDEOGRAPH
+ 0xE5D3: 0x8872, //CJK UNIFIED IDEOGRAPH
+ 0xE5D4: 0x8882, //CJK UNIFIED IDEOGRAPH
+ 0xE5D5: 0x8897, //CJK UNIFIED IDEOGRAPH
+ 0xE5D6: 0x8892, //CJK UNIFIED IDEOGRAPH
+ 0xE5D7: 0x88AE, //CJK UNIFIED IDEOGRAPH
+ 0xE5D8: 0x8899, //CJK UNIFIED IDEOGRAPH
+ 0xE5D9: 0x88A2, //CJK UNIFIED IDEOGRAPH
+ 0xE5DA: 0x888D, //CJK UNIFIED IDEOGRAPH
+ 0xE5DB: 0x88A4, //CJK UNIFIED IDEOGRAPH
+ 0xE5DC: 0x88B0, //CJK UNIFIED IDEOGRAPH
+ 0xE5DD: 0x88BF, //CJK UNIFIED IDEOGRAPH
+ 0xE5DE: 0x88B1, //CJK UNIFIED IDEOGRAPH
+ 0xE5DF: 0x88C3, //CJK UNIFIED IDEOGRAPH
+ 0xE5E0: 0x88C4, //CJK UNIFIED IDEOGRAPH
+ 0xE5E1: 0x88D4, //CJK UNIFIED IDEOGRAPH
+ 0xE5E2: 0x88D8, //CJK UNIFIED IDEOGRAPH
+ 0xE5E3: 0x88D9, //CJK UNIFIED IDEOGRAPH
+ 0xE5E4: 0x88DD, //CJK UNIFIED IDEOGRAPH
+ 0xE5E5: 0x88F9, //CJK UNIFIED IDEOGRAPH
+ 0xE5E6: 0x8902, //CJK UNIFIED IDEOGRAPH
+ 0xE5E7: 0x88FC, //CJK UNIFIED IDEOGRAPH
+ 0xE5E8: 0x88F4, //CJK UNIFIED IDEOGRAPH
+ 0xE5E9: 0x88E8, //CJK UNIFIED IDEOGRAPH
+ 0xE5EA: 0x88F2, //CJK UNIFIED IDEOGRAPH
+ 0xE5EB: 0x8904, //CJK UNIFIED IDEOGRAPH
+ 0xE5EC: 0x890C, //CJK UNIFIED IDEOGRAPH
+ 0xE5ED: 0x890A, //CJK UNIFIED IDEOGRAPH
+ 0xE5EE: 0x8913, //CJK UNIFIED IDEOGRAPH
+ 0xE5EF: 0x8943, //CJK UNIFIED IDEOGRAPH
+ 0xE5F0: 0x891E, //CJK UNIFIED IDEOGRAPH
+ 0xE5F1: 0x8925, //CJK UNIFIED IDEOGRAPH
+ 0xE5F2: 0x892A, //CJK UNIFIED IDEOGRAPH
+ 0xE5F3: 0x892B, //CJK UNIFIED IDEOGRAPH
+ 0xE5F4: 0x8941, //CJK UNIFIED IDEOGRAPH
+ 0xE5F5: 0x8944, //CJK UNIFIED IDEOGRAPH
+ 0xE5F6: 0x893B, //CJK UNIFIED IDEOGRAPH
+ 0xE5F7: 0x8936, //CJK UNIFIED IDEOGRAPH
+ 0xE5F8: 0x8938, //CJK UNIFIED IDEOGRAPH
+ 0xE5F9: 0x894C, //CJK UNIFIED IDEOGRAPH
+ 0xE5FA: 0x891D, //CJK UNIFIED IDEOGRAPH
+ 0xE5FB: 0x8960, //CJK UNIFIED IDEOGRAPH
+ 0xE5FC: 0x895E, //CJK UNIFIED IDEOGRAPH
+ 0xE640: 0x8966, //CJK UNIFIED IDEOGRAPH
+ 0xE641: 0x8964, //CJK UNIFIED IDEOGRAPH
+ 0xE642: 0x896D, //CJK UNIFIED IDEOGRAPH
+ 0xE643: 0x896A, //CJK UNIFIED IDEOGRAPH
+ 0xE644: 0x896F, //CJK UNIFIED IDEOGRAPH
+ 0xE645: 0x8974, //CJK UNIFIED IDEOGRAPH
+ 0xE646: 0x8977, //CJK UNIFIED IDEOGRAPH
+ 0xE647: 0x897E, //CJK UNIFIED IDEOGRAPH
+ 0xE648: 0x8983, //CJK UNIFIED IDEOGRAPH
+ 0xE649: 0x8988, //CJK UNIFIED IDEOGRAPH
+ 0xE64A: 0x898A, //CJK UNIFIED IDEOGRAPH
+ 0xE64B: 0x8993, //CJK UNIFIED IDEOGRAPH
+ 0xE64C: 0x8998, //CJK UNIFIED IDEOGRAPH
+ 0xE64D: 0x89A1, //CJK UNIFIED IDEOGRAPH
+ 0xE64E: 0x89A9, //CJK UNIFIED IDEOGRAPH
+ 0xE64F: 0x89A6, //CJK UNIFIED IDEOGRAPH
+ 0xE650: 0x89AC, //CJK UNIFIED IDEOGRAPH
+ 0xE651: 0x89AF, //CJK UNIFIED IDEOGRAPH
+ 0xE652: 0x89B2, //CJK UNIFIED IDEOGRAPH
+ 0xE653: 0x89BA, //CJK UNIFIED IDEOGRAPH
+ 0xE654: 0x89BD, //CJK UNIFIED IDEOGRAPH
+ 0xE655: 0x89BF, //CJK UNIFIED IDEOGRAPH
+ 0xE656: 0x89C0, //CJK UNIFIED IDEOGRAPH
+ 0xE657: 0x89DA, //CJK UNIFIED IDEOGRAPH
+ 0xE658: 0x89DC, //CJK UNIFIED IDEOGRAPH
+ 0xE659: 0x89DD, //CJK UNIFIED IDEOGRAPH
+ 0xE65A: 0x89E7, //CJK UNIFIED IDEOGRAPH
+ 0xE65B: 0x89F4, //CJK UNIFIED IDEOGRAPH
+ 0xE65C: 0x89F8, //CJK UNIFIED IDEOGRAPH
+ 0xE65D: 0x8A03, //CJK UNIFIED IDEOGRAPH
+ 0xE65E: 0x8A16, //CJK UNIFIED IDEOGRAPH
+ 0xE65F: 0x8A10, //CJK UNIFIED IDEOGRAPH
+ 0xE660: 0x8A0C, //CJK UNIFIED IDEOGRAPH
+ 0xE661: 0x8A1B, //CJK UNIFIED IDEOGRAPH
+ 0xE662: 0x8A1D, //CJK UNIFIED IDEOGRAPH
+ 0xE663: 0x8A25, //CJK UNIFIED IDEOGRAPH
+ 0xE664: 0x8A36, //CJK UNIFIED IDEOGRAPH
+ 0xE665: 0x8A41, //CJK UNIFIED IDEOGRAPH
+ 0xE666: 0x8A5B, //CJK UNIFIED IDEOGRAPH
+ 0xE667: 0x8A52, //CJK UNIFIED IDEOGRAPH
+ 0xE668: 0x8A46, //CJK UNIFIED IDEOGRAPH
+ 0xE669: 0x8A48, //CJK UNIFIED IDEOGRAPH
+ 0xE66A: 0x8A7C, //CJK UNIFIED IDEOGRAPH
+ 0xE66B: 0x8A6D, //CJK UNIFIED IDEOGRAPH
+ 0xE66C: 0x8A6C, //CJK UNIFIED IDEOGRAPH
+ 0xE66D: 0x8A62, //CJK UNIFIED IDEOGRAPH
+ 0xE66E: 0x8A85, //CJK UNIFIED IDEOGRAPH
+ 0xE66F: 0x8A82, //CJK UNIFIED IDEOGRAPH
+ 0xE670: 0x8A84, //CJK UNIFIED IDEOGRAPH
+ 0xE671: 0x8AA8, //CJK UNIFIED IDEOGRAPH
+ 0xE672: 0x8AA1, //CJK UNIFIED IDEOGRAPH
+ 0xE673: 0x8A91, //CJK UNIFIED IDEOGRAPH
+ 0xE674: 0x8AA5, //CJK UNIFIED IDEOGRAPH
+ 0xE675: 0x8AA6, //CJK UNIFIED IDEOGRAPH
+ 0xE676: 0x8A9A, //CJK UNIFIED IDEOGRAPH
+ 0xE677: 0x8AA3, //CJK UNIFIED IDEOGRAPH
+ 0xE678: 0x8AC4, //CJK UNIFIED IDEOGRAPH
+ 0xE679: 0x8ACD, //CJK UNIFIED IDEOGRAPH
+ 0xE67A: 0x8AC2, //CJK UNIFIED IDEOGRAPH
+ 0xE67B: 0x8ADA, //CJK UNIFIED IDEOGRAPH
+ 0xE67C: 0x8AEB, //CJK UNIFIED IDEOGRAPH
+ 0xE67D: 0x8AF3, //CJK UNIFIED IDEOGRAPH
+ 0xE67E: 0x8AE7, //CJK UNIFIED IDEOGRAPH
+ 0xE680: 0x8AE4, //CJK UNIFIED IDEOGRAPH
+ 0xE681: 0x8AF1, //CJK UNIFIED IDEOGRAPH
+ 0xE682: 0x8B14, //CJK UNIFIED IDEOGRAPH
+ 0xE683: 0x8AE0, //CJK UNIFIED IDEOGRAPH
+ 0xE684: 0x8AE2, //CJK UNIFIED IDEOGRAPH
+ 0xE685: 0x8AF7, //CJK UNIFIED IDEOGRAPH
+ 0xE686: 0x8ADE, //CJK UNIFIED IDEOGRAPH
+ 0xE687: 0x8ADB, //CJK UNIFIED IDEOGRAPH
+ 0xE688: 0x8B0C, //CJK UNIFIED IDEOGRAPH
+ 0xE689: 0x8B07, //CJK UNIFIED IDEOGRAPH
+ 0xE68A: 0x8B1A, //CJK UNIFIED IDEOGRAPH
+ 0xE68B: 0x8AE1, //CJK UNIFIED IDEOGRAPH
+ 0xE68C: 0x8B16, //CJK UNIFIED IDEOGRAPH
+ 0xE68D: 0x8B10, //CJK UNIFIED IDEOGRAPH
+ 0xE68E: 0x8B17, //CJK UNIFIED IDEOGRAPH
+ 0xE68F: 0x8B20, //CJK UNIFIED IDEOGRAPH
+ 0xE690: 0x8B33, //CJK UNIFIED IDEOGRAPH
+ 0xE691: 0x97AB, //CJK UNIFIED IDEOGRAPH
+ 0xE692: 0x8B26, //CJK UNIFIED IDEOGRAPH
+ 0xE693: 0x8B2B, //CJK UNIFIED IDEOGRAPH
+ 0xE694: 0x8B3E, //CJK UNIFIED IDEOGRAPH
+ 0xE695: 0x8B28, //CJK UNIFIED IDEOGRAPH
+ 0xE696: 0x8B41, //CJK UNIFIED IDEOGRAPH
+ 0xE697: 0x8B4C, //CJK UNIFIED IDEOGRAPH
+ 0xE698: 0x8B4F, //CJK UNIFIED IDEOGRAPH
+ 0xE699: 0x8B4E, //CJK UNIFIED IDEOGRAPH
+ 0xE69A: 0x8B49, //CJK UNIFIED IDEOGRAPH
+ 0xE69B: 0x8B56, //CJK UNIFIED IDEOGRAPH
+ 0xE69C: 0x8B5B, //CJK UNIFIED IDEOGRAPH
+ 0xE69D: 0x8B5A, //CJK UNIFIED IDEOGRAPH
+ 0xE69E: 0x8B6B, //CJK UNIFIED IDEOGRAPH
+ 0xE69F: 0x8B5F, //CJK UNIFIED IDEOGRAPH
+ 0xE6A0: 0x8B6C, //CJK UNIFIED IDEOGRAPH
+ 0xE6A1: 0x8B6F, //CJK UNIFIED IDEOGRAPH
+ 0xE6A2: 0x8B74, //CJK UNIFIED IDEOGRAPH
+ 0xE6A3: 0x8B7D, //CJK UNIFIED IDEOGRAPH
+ 0xE6A4: 0x8B80, //CJK UNIFIED IDEOGRAPH
+ 0xE6A5: 0x8B8C, //CJK UNIFIED IDEOGRAPH
+ 0xE6A6: 0x8B8E, //CJK UNIFIED IDEOGRAPH
+ 0xE6A7: 0x8B92, //CJK UNIFIED IDEOGRAPH
+ 0xE6A8: 0x8B93, //CJK UNIFIED IDEOGRAPH
+ 0xE6A9: 0x8B96, //CJK UNIFIED IDEOGRAPH
+ 0xE6AA: 0x8B99, //CJK UNIFIED IDEOGRAPH
+ 0xE6AB: 0x8B9A, //CJK UNIFIED IDEOGRAPH
+ 0xE6AC: 0x8C3A, //CJK UNIFIED IDEOGRAPH
+ 0xE6AD: 0x8C41, //CJK UNIFIED IDEOGRAPH
+ 0xE6AE: 0x8C3F, //CJK UNIFIED IDEOGRAPH
+ 0xE6AF: 0x8C48, //CJK UNIFIED IDEOGRAPH
+ 0xE6B0: 0x8C4C, //CJK UNIFIED IDEOGRAPH
+ 0xE6B1: 0x8C4E, //CJK UNIFIED IDEOGRAPH
+ 0xE6B2: 0x8C50, //CJK UNIFIED IDEOGRAPH
+ 0xE6B3: 0x8C55, //CJK UNIFIED IDEOGRAPH
+ 0xE6B4: 0x8C62, //CJK UNIFIED IDEOGRAPH
+ 0xE6B5: 0x8C6C, //CJK UNIFIED IDEOGRAPH
+ 0xE6B6: 0x8C78, //CJK UNIFIED IDEOGRAPH
+ 0xE6B7: 0x8C7A, //CJK UNIFIED IDEOGRAPH
+ 0xE6B8: 0x8C82, //CJK UNIFIED IDEOGRAPH
+ 0xE6B9: 0x8C89, //CJK UNIFIED IDEOGRAPH
+ 0xE6BA: 0x8C85, //CJK UNIFIED IDEOGRAPH
+ 0xE6BB: 0x8C8A, //CJK UNIFIED IDEOGRAPH
+ 0xE6BC: 0x8C8D, //CJK UNIFIED IDEOGRAPH
+ 0xE6BD: 0x8C8E, //CJK UNIFIED IDEOGRAPH
+ 0xE6BE: 0x8C94, //CJK UNIFIED IDEOGRAPH
+ 0xE6BF: 0x8C7C, //CJK UNIFIED IDEOGRAPH
+ 0xE6C0: 0x8C98, //CJK UNIFIED IDEOGRAPH
+ 0xE6C1: 0x621D, //CJK UNIFIED IDEOGRAPH
+ 0xE6C2: 0x8CAD, //CJK UNIFIED IDEOGRAPH
+ 0xE6C3: 0x8CAA, //CJK UNIFIED IDEOGRAPH
+ 0xE6C4: 0x8CBD, //CJK UNIFIED IDEOGRAPH
+ 0xE6C5: 0x8CB2, //CJK UNIFIED IDEOGRAPH
+ 0xE6C6: 0x8CB3, //CJK UNIFIED IDEOGRAPH
+ 0xE6C7: 0x8CAE, //CJK UNIFIED IDEOGRAPH
+ 0xE6C8: 0x8CB6, //CJK UNIFIED IDEOGRAPH
+ 0xE6C9: 0x8CC8, //CJK UNIFIED IDEOGRAPH
+ 0xE6CA: 0x8CC1, //CJK UNIFIED IDEOGRAPH
+ 0xE6CB: 0x8CE4, //CJK UNIFIED IDEOGRAPH
+ 0xE6CC: 0x8CE3, //CJK UNIFIED IDEOGRAPH
+ 0xE6CD: 0x8CDA, //CJK UNIFIED IDEOGRAPH
+ 0xE6CE: 0x8CFD, //CJK UNIFIED IDEOGRAPH
+ 0xE6CF: 0x8CFA, //CJK UNIFIED IDEOGRAPH
+ 0xE6D0: 0x8CFB, //CJK UNIFIED IDEOGRAPH
+ 0xE6D1: 0x8D04, //CJK UNIFIED IDEOGRAPH
+ 0xE6D2: 0x8D05, //CJK UNIFIED IDEOGRAPH
+ 0xE6D3: 0x8D0A, //CJK UNIFIED IDEOGRAPH
+ 0xE6D4: 0x8D07, //CJK UNIFIED IDEOGRAPH
+ 0xE6D5: 0x8D0F, //CJK UNIFIED IDEOGRAPH
+ 0xE6D6: 0x8D0D, //CJK UNIFIED IDEOGRAPH
+ 0xE6D7: 0x8D10, //CJK UNIFIED IDEOGRAPH
+ 0xE6D8: 0x9F4E, //CJK UNIFIED IDEOGRAPH
+ 0xE6D9: 0x8D13, //CJK UNIFIED IDEOGRAPH
+ 0xE6DA: 0x8CCD, //CJK UNIFIED IDEOGRAPH
+ 0xE6DB: 0x8D14, //CJK UNIFIED IDEOGRAPH
+ 0xE6DC: 0x8D16, //CJK UNIFIED IDEOGRAPH
+ 0xE6DD: 0x8D67, //CJK UNIFIED IDEOGRAPH
+ 0xE6DE: 0x8D6D, //CJK UNIFIED IDEOGRAPH
+ 0xE6DF: 0x8D71, //CJK UNIFIED IDEOGRAPH
+ 0xE6E0: 0x8D73, //CJK UNIFIED IDEOGRAPH
+ 0xE6E1: 0x8D81, //CJK UNIFIED IDEOGRAPH
+ 0xE6E2: 0x8D99, //CJK UNIFIED IDEOGRAPH
+ 0xE6E3: 0x8DC2, //CJK UNIFIED IDEOGRAPH
+ 0xE6E4: 0x8DBE, //CJK UNIFIED IDEOGRAPH
+ 0xE6E5: 0x8DBA, //CJK UNIFIED IDEOGRAPH
+ 0xE6E6: 0x8DCF, //CJK UNIFIED IDEOGRAPH
+ 0xE6E7: 0x8DDA, //CJK UNIFIED IDEOGRAPH
+ 0xE6E8: 0x8DD6, //CJK UNIFIED IDEOGRAPH
+ 0xE6E9: 0x8DCC, //CJK UNIFIED IDEOGRAPH
+ 0xE6EA: 0x8DDB, //CJK UNIFIED IDEOGRAPH
+ 0xE6EB: 0x8DCB, //CJK UNIFIED IDEOGRAPH
+ 0xE6EC: 0x8DEA, //CJK UNIFIED IDEOGRAPH
+ 0xE6ED: 0x8DEB, //CJK UNIFIED IDEOGRAPH
+ 0xE6EE: 0x8DDF, //CJK UNIFIED IDEOGRAPH
+ 0xE6EF: 0x8DE3, //CJK UNIFIED IDEOGRAPH
+ 0xE6F0: 0x8DFC, //CJK UNIFIED IDEOGRAPH
+ 0xE6F1: 0x8E08, //CJK UNIFIED IDEOGRAPH
+ 0xE6F2: 0x8E09, //CJK UNIFIED IDEOGRAPH
+ 0xE6F3: 0x8DFF, //CJK UNIFIED IDEOGRAPH
+ 0xE6F4: 0x8E1D, //CJK UNIFIED IDEOGRAPH
+ 0xE6F5: 0x8E1E, //CJK UNIFIED IDEOGRAPH
+ 0xE6F6: 0x8E10, //CJK UNIFIED IDEOGRAPH
+ 0xE6F7: 0x8E1F, //CJK UNIFIED IDEOGRAPH
+ 0xE6F8: 0x8E42, //CJK UNIFIED IDEOGRAPH
+ 0xE6F9: 0x8E35, //CJK UNIFIED IDEOGRAPH
+ 0xE6FA: 0x8E30, //CJK UNIFIED IDEOGRAPH
+ 0xE6FB: 0x8E34, //CJK UNIFIED IDEOGRAPH
+ 0xE6FC: 0x8E4A, //CJK UNIFIED IDEOGRAPH
+ 0xE740: 0x8E47, //CJK UNIFIED IDEOGRAPH
+ 0xE741: 0x8E49, //CJK UNIFIED IDEOGRAPH
+ 0xE742: 0x8E4C, //CJK UNIFIED IDEOGRAPH
+ 0xE743: 0x8E50, //CJK UNIFIED IDEOGRAPH
+ 0xE744: 0x8E48, //CJK UNIFIED IDEOGRAPH
+ 0xE745: 0x8E59, //CJK UNIFIED IDEOGRAPH
+ 0xE746: 0x8E64, //CJK UNIFIED IDEOGRAPH
+ 0xE747: 0x8E60, //CJK UNIFIED IDEOGRAPH
+ 0xE748: 0x8E2A, //CJK UNIFIED IDEOGRAPH
+ 0xE749: 0x8E63, //CJK UNIFIED IDEOGRAPH
+ 0xE74A: 0x8E55, //CJK UNIFIED IDEOGRAPH
+ 0xE74B: 0x8E76, //CJK UNIFIED IDEOGRAPH
+ 0xE74C: 0x8E72, //CJK UNIFIED IDEOGRAPH
+ 0xE74D: 0x8E7C, //CJK UNIFIED IDEOGRAPH
+ 0xE74E: 0x8E81, //CJK UNIFIED IDEOGRAPH
+ 0xE74F: 0x8E87, //CJK UNIFIED IDEOGRAPH
+ 0xE750: 0x8E85, //CJK UNIFIED IDEOGRAPH
+ 0xE751: 0x8E84, //CJK UNIFIED IDEOGRAPH
+ 0xE752: 0x8E8B, //CJK UNIFIED IDEOGRAPH
+ 0xE753: 0x8E8A, //CJK UNIFIED IDEOGRAPH
+ 0xE754: 0x8E93, //CJK UNIFIED IDEOGRAPH
+ 0xE755: 0x8E91, //CJK UNIFIED IDEOGRAPH
+ 0xE756: 0x8E94, //CJK UNIFIED IDEOGRAPH
+ 0xE757: 0x8E99, //CJK UNIFIED IDEOGRAPH
+ 0xE758: 0x8EAA, //CJK UNIFIED IDEOGRAPH
+ 0xE759: 0x8EA1, //CJK UNIFIED IDEOGRAPH
+ 0xE75A: 0x8EAC, //CJK UNIFIED IDEOGRAPH
+ 0xE75B: 0x8EB0, //CJK UNIFIED IDEOGRAPH
+ 0xE75C: 0x8EC6, //CJK UNIFIED IDEOGRAPH
+ 0xE75D: 0x8EB1, //CJK UNIFIED IDEOGRAPH
+ 0xE75E: 0x8EBE, //CJK UNIFIED IDEOGRAPH
+ 0xE75F: 0x8EC5, //CJK UNIFIED IDEOGRAPH
+ 0xE760: 0x8EC8, //CJK UNIFIED IDEOGRAPH
+ 0xE761: 0x8ECB, //CJK UNIFIED IDEOGRAPH
+ 0xE762: 0x8EDB, //CJK UNIFIED IDEOGRAPH
+ 0xE763: 0x8EE3, //CJK UNIFIED IDEOGRAPH
+ 0xE764: 0x8EFC, //CJK UNIFIED IDEOGRAPH
+ 0xE765: 0x8EFB, //CJK UNIFIED IDEOGRAPH
+ 0xE766: 0x8EEB, //CJK UNIFIED IDEOGRAPH
+ 0xE767: 0x8EFE, //CJK UNIFIED IDEOGRAPH
+ 0xE768: 0x8F0A, //CJK UNIFIED IDEOGRAPH
+ 0xE769: 0x8F05, //CJK UNIFIED IDEOGRAPH
+ 0xE76A: 0x8F15, //CJK UNIFIED IDEOGRAPH
+ 0xE76B: 0x8F12, //CJK UNIFIED IDEOGRAPH
+ 0xE76C: 0x8F19, //CJK UNIFIED IDEOGRAPH
+ 0xE76D: 0x8F13, //CJK UNIFIED IDEOGRAPH
+ 0xE76E: 0x8F1C, //CJK UNIFIED IDEOGRAPH
+ 0xE76F: 0x8F1F, //CJK UNIFIED IDEOGRAPH
+ 0xE770: 0x8F1B, //CJK UNIFIED IDEOGRAPH
+ 0xE771: 0x8F0C, //CJK UNIFIED IDEOGRAPH
+ 0xE772: 0x8F26, //CJK UNIFIED IDEOGRAPH
+ 0xE773: 0x8F33, //CJK UNIFIED IDEOGRAPH
+ 0xE774: 0x8F3B, //CJK UNIFIED IDEOGRAPH
+ 0xE775: 0x8F39, //CJK UNIFIED IDEOGRAPH
+ 0xE776: 0x8F45, //CJK UNIFIED IDEOGRAPH
+ 0xE777: 0x8F42, //CJK UNIFIED IDEOGRAPH
+ 0xE778: 0x8F3E, //CJK UNIFIED IDEOGRAPH
+ 0xE779: 0x8F4C, //CJK UNIFIED IDEOGRAPH
+ 0xE77A: 0x8F49, //CJK UNIFIED IDEOGRAPH
+ 0xE77B: 0x8F46, //CJK UNIFIED IDEOGRAPH
+ 0xE77C: 0x8F4E, //CJK UNIFIED IDEOGRAPH
+ 0xE77D: 0x8F57, //CJK UNIFIED IDEOGRAPH
+ 0xE77E: 0x8F5C, //CJK UNIFIED IDEOGRAPH
+ 0xE780: 0x8F62, //CJK UNIFIED IDEOGRAPH
+ 0xE781: 0x8F63, //CJK UNIFIED IDEOGRAPH
+ 0xE782: 0x8F64, //CJK UNIFIED IDEOGRAPH
+ 0xE783: 0x8F9C, //CJK UNIFIED IDEOGRAPH
+ 0xE784: 0x8F9F, //CJK UNIFIED IDEOGRAPH
+ 0xE785: 0x8FA3, //CJK UNIFIED IDEOGRAPH
+ 0xE786: 0x8FAD, //CJK UNIFIED IDEOGRAPH
+ 0xE787: 0x8FAF, //CJK UNIFIED IDEOGRAPH
+ 0xE788: 0x8FB7, //CJK UNIFIED IDEOGRAPH
+ 0xE789: 0x8FDA, //CJK UNIFIED IDEOGRAPH
+ 0xE78A: 0x8FE5, //CJK UNIFIED IDEOGRAPH
+ 0xE78B: 0x8FE2, //CJK UNIFIED IDEOGRAPH
+ 0xE78C: 0x8FEA, //CJK UNIFIED IDEOGRAPH
+ 0xE78D: 0x8FEF, //CJK UNIFIED IDEOGRAPH
+ 0xE78E: 0x9087, //CJK UNIFIED IDEOGRAPH
+ 0xE78F: 0x8FF4, //CJK UNIFIED IDEOGRAPH
+ 0xE790: 0x9005, //CJK UNIFIED IDEOGRAPH
+ 0xE791: 0x8FF9, //CJK UNIFIED IDEOGRAPH
+ 0xE792: 0x8FFA, //CJK UNIFIED IDEOGRAPH
+ 0xE793: 0x9011, //CJK UNIFIED IDEOGRAPH
+ 0xE794: 0x9015, //CJK UNIFIED IDEOGRAPH
+ 0xE795: 0x9021, //CJK UNIFIED IDEOGRAPH
+ 0xE796: 0x900D, //CJK UNIFIED IDEOGRAPH
+ 0xE797: 0x901E, //CJK UNIFIED IDEOGRAPH
+ 0xE798: 0x9016, //CJK UNIFIED IDEOGRAPH
+ 0xE799: 0x900B, //CJK UNIFIED IDEOGRAPH
+ 0xE79A: 0x9027, //CJK UNIFIED IDEOGRAPH
+ 0xE79B: 0x9036, //CJK UNIFIED IDEOGRAPH
+ 0xE79C: 0x9035, //CJK UNIFIED IDEOGRAPH
+ 0xE79D: 0x9039, //CJK UNIFIED IDEOGRAPH
+ 0xE79E: 0x8FF8, //CJK UNIFIED IDEOGRAPH
+ 0xE79F: 0x904F, //CJK UNIFIED IDEOGRAPH
+ 0xE7A0: 0x9050, //CJK UNIFIED IDEOGRAPH
+ 0xE7A1: 0x9051, //CJK UNIFIED IDEOGRAPH
+ 0xE7A2: 0x9052, //CJK UNIFIED IDEOGRAPH
+ 0xE7A3: 0x900E, //CJK UNIFIED IDEOGRAPH
+ 0xE7A4: 0x9049, //CJK UNIFIED IDEOGRAPH
+ 0xE7A5: 0x903E, //CJK UNIFIED IDEOGRAPH
+ 0xE7A6: 0x9056, //CJK UNIFIED IDEOGRAPH
+ 0xE7A7: 0x9058, //CJK UNIFIED IDEOGRAPH
+ 0xE7A8: 0x905E, //CJK UNIFIED IDEOGRAPH
+ 0xE7A9: 0x9068, //CJK UNIFIED IDEOGRAPH
+ 0xE7AA: 0x906F, //CJK UNIFIED IDEOGRAPH
+ 0xE7AB: 0x9076, //CJK UNIFIED IDEOGRAPH
+ 0xE7AC: 0x96A8, //CJK UNIFIED IDEOGRAPH
+ 0xE7AD: 0x9072, //CJK UNIFIED IDEOGRAPH
+ 0xE7AE: 0x9082, //CJK UNIFIED IDEOGRAPH
+ 0xE7AF: 0x907D, //CJK UNIFIED IDEOGRAPH
+ 0xE7B0: 0x9081, //CJK UNIFIED IDEOGRAPH
+ 0xE7B1: 0x9080, //CJK UNIFIED IDEOGRAPH
+ 0xE7B2: 0x908A, //CJK UNIFIED IDEOGRAPH
+ 0xE7B3: 0x9089, //CJK UNIFIED IDEOGRAPH
+ 0xE7B4: 0x908F, //CJK UNIFIED IDEOGRAPH
+ 0xE7B5: 0x90A8, //CJK UNIFIED IDEOGRAPH
+ 0xE7B6: 0x90AF, //CJK UNIFIED IDEOGRAPH
+ 0xE7B7: 0x90B1, //CJK UNIFIED IDEOGRAPH
+ 0xE7B8: 0x90B5, //CJK UNIFIED IDEOGRAPH
+ 0xE7B9: 0x90E2, //CJK UNIFIED IDEOGRAPH
+ 0xE7BA: 0x90E4, //CJK UNIFIED IDEOGRAPH
+ 0xE7BB: 0x6248, //CJK UNIFIED IDEOGRAPH
+ 0xE7BC: 0x90DB, //CJK UNIFIED IDEOGRAPH
+ 0xE7BD: 0x9102, //CJK UNIFIED IDEOGRAPH
+ 0xE7BE: 0x9112, //CJK UNIFIED IDEOGRAPH
+ 0xE7BF: 0x9119, //CJK UNIFIED IDEOGRAPH
+ 0xE7C0: 0x9132, //CJK UNIFIED IDEOGRAPH
+ 0xE7C1: 0x9130, //CJK UNIFIED IDEOGRAPH
+ 0xE7C2: 0x914A, //CJK UNIFIED IDEOGRAPH
+ 0xE7C3: 0x9156, //CJK UNIFIED IDEOGRAPH
+ 0xE7C4: 0x9158, //CJK UNIFIED IDEOGRAPH
+ 0xE7C5: 0x9163, //CJK UNIFIED IDEOGRAPH
+ 0xE7C6: 0x9165, //CJK UNIFIED IDEOGRAPH
+ 0xE7C7: 0x9169, //CJK UNIFIED IDEOGRAPH
+ 0xE7C8: 0x9173, //CJK UNIFIED IDEOGRAPH
+ 0xE7C9: 0x9172, //CJK UNIFIED IDEOGRAPH
+ 0xE7CA: 0x918B, //CJK UNIFIED IDEOGRAPH
+ 0xE7CB: 0x9189, //CJK UNIFIED IDEOGRAPH
+ 0xE7CC: 0x9182, //CJK UNIFIED IDEOGRAPH
+ 0xE7CD: 0x91A2, //CJK UNIFIED IDEOGRAPH
+ 0xE7CE: 0x91AB, //CJK UNIFIED IDEOGRAPH
+ 0xE7CF: 0x91AF, //CJK UNIFIED IDEOGRAPH
+ 0xE7D0: 0x91AA, //CJK UNIFIED IDEOGRAPH
+ 0xE7D1: 0x91B5, //CJK UNIFIED IDEOGRAPH
+ 0xE7D2: 0x91B4, //CJK UNIFIED IDEOGRAPH
+ 0xE7D3: 0x91BA, //CJK UNIFIED IDEOGRAPH
+ 0xE7D4: 0x91C0, //CJK UNIFIED IDEOGRAPH
+ 0xE7D5: 0x91C1, //CJK UNIFIED IDEOGRAPH
+ 0xE7D6: 0x91C9, //CJK UNIFIED IDEOGRAPH
+ 0xE7D7: 0x91CB, //CJK UNIFIED IDEOGRAPH
+ 0xE7D8: 0x91D0, //CJK UNIFIED IDEOGRAPH
+ 0xE7D9: 0x91D6, //CJK UNIFIED IDEOGRAPH
+ 0xE7DA: 0x91DF, //CJK UNIFIED IDEOGRAPH
+ 0xE7DB: 0x91E1, //CJK UNIFIED IDEOGRAPH
+ 0xE7DC: 0x91DB, //CJK UNIFIED IDEOGRAPH
+ 0xE7DD: 0x91FC, //CJK UNIFIED IDEOGRAPH
+ 0xE7DE: 0x91F5, //CJK UNIFIED IDEOGRAPH
+ 0xE7DF: 0x91F6, //CJK UNIFIED IDEOGRAPH
+ 0xE7E0: 0x921E, //CJK UNIFIED IDEOGRAPH
+ 0xE7E1: 0x91FF, //CJK UNIFIED IDEOGRAPH
+ 0xE7E2: 0x9214, //CJK UNIFIED IDEOGRAPH
+ 0xE7E3: 0x922C, //CJK UNIFIED IDEOGRAPH
+ 0xE7E4: 0x9215, //CJK UNIFIED IDEOGRAPH
+ 0xE7E5: 0x9211, //CJK UNIFIED IDEOGRAPH
+ 0xE7E6: 0x925E, //CJK UNIFIED IDEOGRAPH
+ 0xE7E7: 0x9257, //CJK UNIFIED IDEOGRAPH
+ 0xE7E8: 0x9245, //CJK UNIFIED IDEOGRAPH
+ 0xE7E9: 0x9249, //CJK UNIFIED IDEOGRAPH
+ 0xE7EA: 0x9264, //CJK UNIFIED IDEOGRAPH
+ 0xE7EB: 0x9248, //CJK UNIFIED IDEOGRAPH
+ 0xE7EC: 0x9295, //CJK UNIFIED IDEOGRAPH
+ 0xE7ED: 0x923F, //CJK UNIFIED IDEOGRAPH
+ 0xE7EE: 0x924B, //CJK UNIFIED IDEOGRAPH
+ 0xE7EF: 0x9250, //CJK UNIFIED IDEOGRAPH
+ 0xE7F0: 0x929C, //CJK UNIFIED IDEOGRAPH
+ 0xE7F1: 0x9296, //CJK UNIFIED IDEOGRAPH
+ 0xE7F2: 0x9293, //CJK UNIFIED IDEOGRAPH
+ 0xE7F3: 0x929B, //CJK UNIFIED IDEOGRAPH
+ 0xE7F4: 0x925A, //CJK UNIFIED IDEOGRAPH
+ 0xE7F5: 0x92CF, //CJK UNIFIED IDEOGRAPH
+ 0xE7F6: 0x92B9, //CJK UNIFIED IDEOGRAPH
+ 0xE7F7: 0x92B7, //CJK UNIFIED IDEOGRAPH
+ 0xE7F8: 0x92E9, //CJK UNIFIED IDEOGRAPH
+ 0xE7F9: 0x930F, //CJK UNIFIED IDEOGRAPH
+ 0xE7FA: 0x92FA, //CJK UNIFIED IDEOGRAPH
+ 0xE7FB: 0x9344, //CJK UNIFIED IDEOGRAPH
+ 0xE7FC: 0x932E, //CJK UNIFIED IDEOGRAPH
+ 0xE840: 0x9319, //CJK UNIFIED IDEOGRAPH
+ 0xE841: 0x9322, //CJK UNIFIED IDEOGRAPH
+ 0xE842: 0x931A, //CJK UNIFIED IDEOGRAPH
+ 0xE843: 0x9323, //CJK UNIFIED IDEOGRAPH
+ 0xE844: 0x933A, //CJK UNIFIED IDEOGRAPH
+ 0xE845: 0x9335, //CJK UNIFIED IDEOGRAPH
+ 0xE846: 0x933B, //CJK UNIFIED IDEOGRAPH
+ 0xE847: 0x935C, //CJK UNIFIED IDEOGRAPH
+ 0xE848: 0x9360, //CJK UNIFIED IDEOGRAPH
+ 0xE849: 0x937C, //CJK UNIFIED IDEOGRAPH
+ 0xE84A: 0x936E, //CJK UNIFIED IDEOGRAPH
+ 0xE84B: 0x9356, //CJK UNIFIED IDEOGRAPH
+ 0xE84C: 0x93B0, //CJK UNIFIED IDEOGRAPH
+ 0xE84D: 0x93AC, //CJK UNIFIED IDEOGRAPH
+ 0xE84E: 0x93AD, //CJK UNIFIED IDEOGRAPH
+ 0xE84F: 0x9394, //CJK UNIFIED IDEOGRAPH
+ 0xE850: 0x93B9, //CJK UNIFIED IDEOGRAPH
+ 0xE851: 0x93D6, //CJK UNIFIED IDEOGRAPH
+ 0xE852: 0x93D7, //CJK UNIFIED IDEOGRAPH
+ 0xE853: 0x93E8, //CJK UNIFIED IDEOGRAPH
+ 0xE854: 0x93E5, //CJK UNIFIED IDEOGRAPH
+ 0xE855: 0x93D8, //CJK UNIFIED IDEOGRAPH
+ 0xE856: 0x93C3, //CJK UNIFIED IDEOGRAPH
+ 0xE857: 0x93DD, //CJK UNIFIED IDEOGRAPH
+ 0xE858: 0x93D0, //CJK UNIFIED IDEOGRAPH
+ 0xE859: 0x93C8, //CJK UNIFIED IDEOGRAPH
+ 0xE85A: 0x93E4, //CJK UNIFIED IDEOGRAPH
+ 0xE85B: 0x941A, //CJK UNIFIED IDEOGRAPH
+ 0xE85C: 0x9414, //CJK UNIFIED IDEOGRAPH
+ 0xE85D: 0x9413, //CJK UNIFIED IDEOGRAPH
+ 0xE85E: 0x9403, //CJK UNIFIED IDEOGRAPH
+ 0xE85F: 0x9407, //CJK UNIFIED IDEOGRAPH
+ 0xE860: 0x9410, //CJK UNIFIED IDEOGRAPH
+ 0xE861: 0x9436, //CJK UNIFIED IDEOGRAPH
+ 0xE862: 0x942B, //CJK UNIFIED IDEOGRAPH
+ 0xE863: 0x9435, //CJK UNIFIED IDEOGRAPH
+ 0xE864: 0x9421, //CJK UNIFIED IDEOGRAPH
+ 0xE865: 0x943A, //CJK UNIFIED IDEOGRAPH
+ 0xE866: 0x9441, //CJK UNIFIED IDEOGRAPH
+ 0xE867: 0x9452, //CJK UNIFIED IDEOGRAPH
+ 0xE868: 0x9444, //CJK UNIFIED IDEOGRAPH
+ 0xE869: 0x945B, //CJK UNIFIED IDEOGRAPH
+ 0xE86A: 0x9460, //CJK UNIFIED IDEOGRAPH
+ 0xE86B: 0x9462, //CJK UNIFIED IDEOGRAPH
+ 0xE86C: 0x945E, //CJK UNIFIED IDEOGRAPH
+ 0xE86D: 0x946A, //CJK UNIFIED IDEOGRAPH
+ 0xE86E: 0x9229, //CJK UNIFIED IDEOGRAPH
+ 0xE86F: 0x9470, //CJK UNIFIED IDEOGRAPH
+ 0xE870: 0x9475, //CJK UNIFIED IDEOGRAPH
+ 0xE871: 0x9477, //CJK UNIFIED IDEOGRAPH
+ 0xE872: 0x947D, //CJK UNIFIED IDEOGRAPH
+ 0xE873: 0x945A, //CJK UNIFIED IDEOGRAPH
+ 0xE874: 0x947C, //CJK UNIFIED IDEOGRAPH
+ 0xE875: 0x947E, //CJK UNIFIED IDEOGRAPH
+ 0xE876: 0x9481, //CJK UNIFIED IDEOGRAPH
+ 0xE877: 0x947F, //CJK UNIFIED IDEOGRAPH
+ 0xE878: 0x9582, //CJK UNIFIED IDEOGRAPH
+ 0xE879: 0x9587, //CJK UNIFIED IDEOGRAPH
+ 0xE87A: 0x958A, //CJK UNIFIED IDEOGRAPH
+ 0xE87B: 0x9594, //CJK UNIFIED IDEOGRAPH
+ 0xE87C: 0x9596, //CJK UNIFIED IDEOGRAPH
+ 0xE87D: 0x9598, //CJK UNIFIED IDEOGRAPH
+ 0xE87E: 0x9599, //CJK UNIFIED IDEOGRAPH
+ 0xE880: 0x95A0, //CJK UNIFIED IDEOGRAPH
+ 0xE881: 0x95A8, //CJK UNIFIED IDEOGRAPH
+ 0xE882: 0x95A7, //CJK UNIFIED IDEOGRAPH
+ 0xE883: 0x95AD, //CJK UNIFIED IDEOGRAPH
+ 0xE884: 0x95BC, //CJK UNIFIED IDEOGRAPH
+ 0xE885: 0x95BB, //CJK UNIFIED IDEOGRAPH
+ 0xE886: 0x95B9, //CJK UNIFIED IDEOGRAPH
+ 0xE887: 0x95BE, //CJK UNIFIED IDEOGRAPH
+ 0xE888: 0x95CA, //CJK UNIFIED IDEOGRAPH
+ 0xE889: 0x6FF6, //CJK UNIFIED IDEOGRAPH
+ 0xE88A: 0x95C3, //CJK UNIFIED IDEOGRAPH
+ 0xE88B: 0x95CD, //CJK UNIFIED IDEOGRAPH
+ 0xE88C: 0x95CC, //CJK UNIFIED IDEOGRAPH
+ 0xE88D: 0x95D5, //CJK UNIFIED IDEOGRAPH
+ 0xE88E: 0x95D4, //CJK UNIFIED IDEOGRAPH
+ 0xE88F: 0x95D6, //CJK UNIFIED IDEOGRAPH
+ 0xE890: 0x95DC, //CJK UNIFIED IDEOGRAPH
+ 0xE891: 0x95E1, //CJK UNIFIED IDEOGRAPH
+ 0xE892: 0x95E5, //CJK UNIFIED IDEOGRAPH
+ 0xE893: 0x95E2, //CJK UNIFIED IDEOGRAPH
+ 0xE894: 0x9621, //CJK UNIFIED IDEOGRAPH
+ 0xE895: 0x9628, //CJK UNIFIED IDEOGRAPH
+ 0xE896: 0x962E, //CJK UNIFIED IDEOGRAPH
+ 0xE897: 0x962F, //CJK UNIFIED IDEOGRAPH
+ 0xE898: 0x9642, //CJK UNIFIED IDEOGRAPH
+ 0xE899: 0x964C, //CJK UNIFIED IDEOGRAPH
+ 0xE89A: 0x964F, //CJK UNIFIED IDEOGRAPH
+ 0xE89B: 0x964B, //CJK UNIFIED IDEOGRAPH
+ 0xE89C: 0x9677, //CJK UNIFIED IDEOGRAPH
+ 0xE89D: 0x965C, //CJK UNIFIED IDEOGRAPH
+ 0xE89E: 0x965E, //CJK UNIFIED IDEOGRAPH
+ 0xE89F: 0x965D, //CJK UNIFIED IDEOGRAPH
+ 0xE8A0: 0x965F, //CJK UNIFIED IDEOGRAPH
+ 0xE8A1: 0x9666, //CJK UNIFIED IDEOGRAPH
+ 0xE8A2: 0x9672, //CJK UNIFIED IDEOGRAPH
+ 0xE8A3: 0x966C, //CJK UNIFIED IDEOGRAPH
+ 0xE8A4: 0x968D, //CJK UNIFIED IDEOGRAPH
+ 0xE8A5: 0x9698, //CJK UNIFIED IDEOGRAPH
+ 0xE8A6: 0x9695, //CJK UNIFIED IDEOGRAPH
+ 0xE8A7: 0x9697, //CJK UNIFIED IDEOGRAPH
+ 0xE8A8: 0x96AA, //CJK UNIFIED IDEOGRAPH
+ 0xE8A9: 0x96A7, //CJK UNIFIED IDEOGRAPH
+ 0xE8AA: 0x96B1, //CJK UNIFIED IDEOGRAPH
+ 0xE8AB: 0x96B2, //CJK UNIFIED IDEOGRAPH
+ 0xE8AC: 0x96B0, //CJK UNIFIED IDEOGRAPH
+ 0xE8AD: 0x96B4, //CJK UNIFIED IDEOGRAPH
+ 0xE8AE: 0x96B6, //CJK UNIFIED IDEOGRAPH
+ 0xE8AF: 0x96B8, //CJK UNIFIED IDEOGRAPH
+ 0xE8B0: 0x96B9, //CJK UNIFIED IDEOGRAPH
+ 0xE8B1: 0x96CE, //CJK UNIFIED IDEOGRAPH
+ 0xE8B2: 0x96CB, //CJK UNIFIED IDEOGRAPH
+ 0xE8B3: 0x96C9, //CJK UNIFIED IDEOGRAPH
+ 0xE8B4: 0x96CD, //CJK UNIFIED IDEOGRAPH
+ 0xE8B5: 0x894D, //CJK UNIFIED IDEOGRAPH
+ 0xE8B6: 0x96DC, //CJK UNIFIED IDEOGRAPH
+ 0xE8B7: 0x970D, //CJK UNIFIED IDEOGRAPH
+ 0xE8B8: 0x96D5, //CJK UNIFIED IDEOGRAPH
+ 0xE8B9: 0x96F9, //CJK UNIFIED IDEOGRAPH
+ 0xE8BA: 0x9704, //CJK UNIFIED IDEOGRAPH
+ 0xE8BB: 0x9706, //CJK UNIFIED IDEOGRAPH
+ 0xE8BC: 0x9708, //CJK UNIFIED IDEOGRAPH
+ 0xE8BD: 0x9713, //CJK UNIFIED IDEOGRAPH
+ 0xE8BE: 0x970E, //CJK UNIFIED IDEOGRAPH
+ 0xE8BF: 0x9711, //CJK UNIFIED IDEOGRAPH
+ 0xE8C0: 0x970F, //CJK UNIFIED IDEOGRAPH
+ 0xE8C1: 0x9716, //CJK UNIFIED IDEOGRAPH
+ 0xE8C2: 0x9719, //CJK UNIFIED IDEOGRAPH
+ 0xE8C3: 0x9724, //CJK UNIFIED IDEOGRAPH
+ 0xE8C4: 0x972A, //CJK UNIFIED IDEOGRAPH
+ 0xE8C5: 0x9730, //CJK UNIFIED IDEOGRAPH
+ 0xE8C6: 0x9739, //CJK UNIFIED IDEOGRAPH
+ 0xE8C7: 0x973D, //CJK UNIFIED IDEOGRAPH
+ 0xE8C8: 0x973E, //CJK UNIFIED IDEOGRAPH
+ 0xE8C9: 0x9744, //CJK UNIFIED IDEOGRAPH
+ 0xE8CA: 0x9746, //CJK UNIFIED IDEOGRAPH
+ 0xE8CB: 0x9748, //CJK UNIFIED IDEOGRAPH
+ 0xE8CC: 0x9742, //CJK UNIFIED IDEOGRAPH
+ 0xE8CD: 0x9749, //CJK UNIFIED IDEOGRAPH
+ 0xE8CE: 0x975C, //CJK UNIFIED IDEOGRAPH
+ 0xE8CF: 0x9760, //CJK UNIFIED IDEOGRAPH
+ 0xE8D0: 0x9764, //CJK UNIFIED IDEOGRAPH
+ 0xE8D1: 0x9766, //CJK UNIFIED IDEOGRAPH
+ 0xE8D2: 0x9768, //CJK UNIFIED IDEOGRAPH
+ 0xE8D3: 0x52D2, //CJK UNIFIED IDEOGRAPH
+ 0xE8D4: 0x976B, //CJK UNIFIED IDEOGRAPH
+ 0xE8D5: 0x9771, //CJK UNIFIED IDEOGRAPH
+ 0xE8D6: 0x9779, //CJK UNIFIED IDEOGRAPH
+ 0xE8D7: 0x9785, //CJK UNIFIED IDEOGRAPH
+ 0xE8D8: 0x977C, //CJK UNIFIED IDEOGRAPH
+ 0xE8D9: 0x9781, //CJK UNIFIED IDEOGRAPH
+ 0xE8DA: 0x977A, //CJK UNIFIED IDEOGRAPH
+ 0xE8DB: 0x9786, //CJK UNIFIED IDEOGRAPH
+ 0xE8DC: 0x978B, //CJK UNIFIED IDEOGRAPH
+ 0xE8DD: 0x978F, //CJK UNIFIED IDEOGRAPH
+ 0xE8DE: 0x9790, //CJK UNIFIED IDEOGRAPH
+ 0xE8DF: 0x979C, //CJK UNIFIED IDEOGRAPH
+ 0xE8E0: 0x97A8, //CJK UNIFIED IDEOGRAPH
+ 0xE8E1: 0x97A6, //CJK UNIFIED IDEOGRAPH
+ 0xE8E2: 0x97A3, //CJK UNIFIED IDEOGRAPH
+ 0xE8E3: 0x97B3, //CJK UNIFIED IDEOGRAPH
+ 0xE8E4: 0x97B4, //CJK UNIFIED IDEOGRAPH
+ 0xE8E5: 0x97C3, //CJK UNIFIED IDEOGRAPH
+ 0xE8E6: 0x97C6, //CJK UNIFIED IDEOGRAPH
+ 0xE8E7: 0x97C8, //CJK UNIFIED IDEOGRAPH
+ 0xE8E8: 0x97CB, //CJK UNIFIED IDEOGRAPH
+ 0xE8E9: 0x97DC, //CJK UNIFIED IDEOGRAPH
+ 0xE8EA: 0x97ED, //CJK UNIFIED IDEOGRAPH
+ 0xE8EB: 0x9F4F, //CJK UNIFIED IDEOGRAPH
+ 0xE8EC: 0x97F2, //CJK UNIFIED IDEOGRAPH
+ 0xE8ED: 0x7ADF, //CJK UNIFIED IDEOGRAPH
+ 0xE8EE: 0x97F6, //CJK UNIFIED IDEOGRAPH
+ 0xE8EF: 0x97F5, //CJK UNIFIED IDEOGRAPH
+ 0xE8F0: 0x980F, //CJK UNIFIED IDEOGRAPH
+ 0xE8F1: 0x980C, //CJK UNIFIED IDEOGRAPH
+ 0xE8F2: 0x9838, //CJK UNIFIED IDEOGRAPH
+ 0xE8F3: 0x9824, //CJK UNIFIED IDEOGRAPH
+ 0xE8F4: 0x9821, //CJK UNIFIED IDEOGRAPH
+ 0xE8F5: 0x9837, //CJK UNIFIED IDEOGRAPH
+ 0xE8F6: 0x983D, //CJK UNIFIED IDEOGRAPH
+ 0xE8F7: 0x9846, //CJK UNIFIED IDEOGRAPH
+ 0xE8F8: 0x984F, //CJK UNIFIED IDEOGRAPH
+ 0xE8F9: 0x984B, //CJK UNIFIED IDEOGRAPH
+ 0xE8FA: 0x986B, //CJK UNIFIED IDEOGRAPH
+ 0xE8FB: 0x986F, //CJK UNIFIED IDEOGRAPH
+ 0xE8FC: 0x9870, //CJK UNIFIED IDEOGRAPH
+ 0xE940: 0x9871, //CJK UNIFIED IDEOGRAPH
+ 0xE941: 0x9874, //CJK UNIFIED IDEOGRAPH
+ 0xE942: 0x9873, //CJK UNIFIED IDEOGRAPH
+ 0xE943: 0x98AA, //CJK UNIFIED IDEOGRAPH
+ 0xE944: 0x98AF, //CJK UNIFIED IDEOGRAPH
+ 0xE945: 0x98B1, //CJK UNIFIED IDEOGRAPH
+ 0xE946: 0x98B6, //CJK UNIFIED IDEOGRAPH
+ 0xE947: 0x98C4, //CJK UNIFIED IDEOGRAPH
+ 0xE948: 0x98C3, //CJK UNIFIED IDEOGRAPH
+ 0xE949: 0x98C6, //CJK UNIFIED IDEOGRAPH
+ 0xE94A: 0x98E9, //CJK UNIFIED IDEOGRAPH
+ 0xE94B: 0x98EB, //CJK UNIFIED IDEOGRAPH
+ 0xE94C: 0x9903, //CJK UNIFIED IDEOGRAPH
+ 0xE94D: 0x9909, //CJK UNIFIED IDEOGRAPH
+ 0xE94E: 0x9912, //CJK UNIFIED IDEOGRAPH
+ 0xE94F: 0x9914, //CJK UNIFIED IDEOGRAPH
+ 0xE950: 0x9918, //CJK UNIFIED IDEOGRAPH
+ 0xE951: 0x9921, //CJK UNIFIED IDEOGRAPH
+ 0xE952: 0x991D, //CJK UNIFIED IDEOGRAPH
+ 0xE953: 0x991E, //CJK UNIFIED IDEOGRAPH
+ 0xE954: 0x9924, //CJK UNIFIED IDEOGRAPH
+ 0xE955: 0x9920, //CJK UNIFIED IDEOGRAPH
+ 0xE956: 0x992C, //CJK UNIFIED IDEOGRAPH
+ 0xE957: 0x992E, //CJK UNIFIED IDEOGRAPH
+ 0xE958: 0x993D, //CJK UNIFIED IDEOGRAPH
+ 0xE959: 0x993E, //CJK UNIFIED IDEOGRAPH
+ 0xE95A: 0x9942, //CJK UNIFIED IDEOGRAPH
+ 0xE95B: 0x9949, //CJK UNIFIED IDEOGRAPH
+ 0xE95C: 0x9945, //CJK UNIFIED IDEOGRAPH
+ 0xE95D: 0x9950, //CJK UNIFIED IDEOGRAPH
+ 0xE95E: 0x994B, //CJK UNIFIED IDEOGRAPH
+ 0xE95F: 0x9951, //CJK UNIFIED IDEOGRAPH
+ 0xE960: 0x9952, //CJK UNIFIED IDEOGRAPH
+ 0xE961: 0x994C, //CJK UNIFIED IDEOGRAPH
+ 0xE962: 0x9955, //CJK UNIFIED IDEOGRAPH
+ 0xE963: 0x9997, //CJK UNIFIED IDEOGRAPH
+ 0xE964: 0x9998, //CJK UNIFIED IDEOGRAPH
+ 0xE965: 0x99A5, //CJK UNIFIED IDEOGRAPH
+ 0xE966: 0x99AD, //CJK UNIFIED IDEOGRAPH
+ 0xE967: 0x99AE, //CJK UNIFIED IDEOGRAPH
+ 0xE968: 0x99BC, //CJK UNIFIED IDEOGRAPH
+ 0xE969: 0x99DF, //CJK UNIFIED IDEOGRAPH
+ 0xE96A: 0x99DB, //CJK UNIFIED IDEOGRAPH
+ 0xE96B: 0x99DD, //CJK UNIFIED IDEOGRAPH
+ 0xE96C: 0x99D8, //CJK UNIFIED IDEOGRAPH
+ 0xE96D: 0x99D1, //CJK UNIFIED IDEOGRAPH
+ 0xE96E: 0x99ED, //CJK UNIFIED IDEOGRAPH
+ 0xE96F: 0x99EE, //CJK UNIFIED IDEOGRAPH
+ 0xE970: 0x99F1, //CJK UNIFIED IDEOGRAPH
+ 0xE971: 0x99F2, //CJK UNIFIED IDEOGRAPH
+ 0xE972: 0x99FB, //CJK UNIFIED IDEOGRAPH
+ 0xE973: 0x99F8, //CJK UNIFIED IDEOGRAPH
+ 0xE974: 0x9A01, //CJK UNIFIED IDEOGRAPH
+ 0xE975: 0x9A0F, //CJK UNIFIED IDEOGRAPH
+ 0xE976: 0x9A05, //CJK UNIFIED IDEOGRAPH
+ 0xE977: 0x99E2, //CJK UNIFIED IDEOGRAPH
+ 0xE978: 0x9A19, //CJK UNIFIED IDEOGRAPH
+ 0xE979: 0x9A2B, //CJK UNIFIED IDEOGRAPH
+ 0xE97A: 0x9A37, //CJK UNIFIED IDEOGRAPH
+ 0xE97B: 0x9A45, //CJK UNIFIED IDEOGRAPH
+ 0xE97C: 0x9A42, //CJK UNIFIED IDEOGRAPH
+ 0xE97D: 0x9A40, //CJK UNIFIED IDEOGRAPH
+ 0xE97E: 0x9A43, //CJK UNIFIED IDEOGRAPH
+ 0xE980: 0x9A3E, //CJK UNIFIED IDEOGRAPH
+ 0xE981: 0x9A55, //CJK UNIFIED IDEOGRAPH
+ 0xE982: 0x9A4D, //CJK UNIFIED IDEOGRAPH
+ 0xE983: 0x9A5B, //CJK UNIFIED IDEOGRAPH
+ 0xE984: 0x9A57, //CJK UNIFIED IDEOGRAPH
+ 0xE985: 0x9A5F, //CJK UNIFIED IDEOGRAPH
+ 0xE986: 0x9A62, //CJK UNIFIED IDEOGRAPH
+ 0xE987: 0x9A65, //CJK UNIFIED IDEOGRAPH
+ 0xE988: 0x9A64, //CJK UNIFIED IDEOGRAPH
+ 0xE989: 0x9A69, //CJK UNIFIED IDEOGRAPH
+ 0xE98A: 0x9A6B, //CJK UNIFIED IDEOGRAPH
+ 0xE98B: 0x9A6A, //CJK UNIFIED IDEOGRAPH
+ 0xE98C: 0x9AAD, //CJK UNIFIED IDEOGRAPH
+ 0xE98D: 0x9AB0, //CJK UNIFIED IDEOGRAPH
+ 0xE98E: 0x9ABC, //CJK UNIFIED IDEOGRAPH
+ 0xE98F: 0x9AC0, //CJK UNIFIED IDEOGRAPH
+ 0xE990: 0x9ACF, //CJK UNIFIED IDEOGRAPH
+ 0xE991: 0x9AD1, //CJK UNIFIED IDEOGRAPH
+ 0xE992: 0x9AD3, //CJK UNIFIED IDEOGRAPH
+ 0xE993: 0x9AD4, //CJK UNIFIED IDEOGRAPH
+ 0xE994: 0x9ADE, //CJK UNIFIED IDEOGRAPH
+ 0xE995: 0x9ADF, //CJK UNIFIED IDEOGRAPH
+ 0xE996: 0x9AE2, //CJK UNIFIED IDEOGRAPH
+ 0xE997: 0x9AE3, //CJK UNIFIED IDEOGRAPH
+ 0xE998: 0x9AE6, //CJK UNIFIED IDEOGRAPH
+ 0xE999: 0x9AEF, //CJK UNIFIED IDEOGRAPH
+ 0xE99A: 0x9AEB, //CJK UNIFIED IDEOGRAPH
+ 0xE99B: 0x9AEE, //CJK UNIFIED IDEOGRAPH
+ 0xE99C: 0x9AF4, //CJK UNIFIED IDEOGRAPH
+ 0xE99D: 0x9AF1, //CJK UNIFIED IDEOGRAPH
+ 0xE99E: 0x9AF7, //CJK UNIFIED IDEOGRAPH
+ 0xE99F: 0x9AFB, //CJK UNIFIED IDEOGRAPH
+ 0xE9A0: 0x9B06, //CJK UNIFIED IDEOGRAPH
+ 0xE9A1: 0x9B18, //CJK UNIFIED IDEOGRAPH
+ 0xE9A2: 0x9B1A, //CJK UNIFIED IDEOGRAPH
+ 0xE9A3: 0x9B1F, //CJK UNIFIED IDEOGRAPH
+ 0xE9A4: 0x9B22, //CJK UNIFIED IDEOGRAPH
+ 0xE9A5: 0x9B23, //CJK UNIFIED IDEOGRAPH
+ 0xE9A6: 0x9B25, //CJK UNIFIED IDEOGRAPH
+ 0xE9A7: 0x9B27, //CJK UNIFIED IDEOGRAPH
+ 0xE9A8: 0x9B28, //CJK UNIFIED IDEOGRAPH
+ 0xE9A9: 0x9B29, //CJK UNIFIED IDEOGRAPH
+ 0xE9AA: 0x9B2A, //CJK UNIFIED IDEOGRAPH
+ 0xE9AB: 0x9B2E, //CJK UNIFIED IDEOGRAPH
+ 0xE9AC: 0x9B2F, //CJK UNIFIED IDEOGRAPH
+ 0xE9AD: 0x9B32, //CJK UNIFIED IDEOGRAPH
+ 0xE9AE: 0x9B44, //CJK UNIFIED IDEOGRAPH
+ 0xE9AF: 0x9B43, //CJK UNIFIED IDEOGRAPH
+ 0xE9B0: 0x9B4F, //CJK UNIFIED IDEOGRAPH
+ 0xE9B1: 0x9B4D, //CJK UNIFIED IDEOGRAPH
+ 0xE9B2: 0x9B4E, //CJK UNIFIED IDEOGRAPH
+ 0xE9B3: 0x9B51, //CJK UNIFIED IDEOGRAPH
+ 0xE9B4: 0x9B58, //CJK UNIFIED IDEOGRAPH
+ 0xE9B5: 0x9B74, //CJK UNIFIED IDEOGRAPH
+ 0xE9B6: 0x9B93, //CJK UNIFIED IDEOGRAPH
+ 0xE9B7: 0x9B83, //CJK UNIFIED IDEOGRAPH
+ 0xE9B8: 0x9B91, //CJK UNIFIED IDEOGRAPH
+ 0xE9B9: 0x9B96, //CJK UNIFIED IDEOGRAPH
+ 0xE9BA: 0x9B97, //CJK UNIFIED IDEOGRAPH
+ 0xE9BB: 0x9B9F, //CJK UNIFIED IDEOGRAPH
+ 0xE9BC: 0x9BA0, //CJK UNIFIED IDEOGRAPH
+ 0xE9BD: 0x9BA8, //CJK UNIFIED IDEOGRAPH
+ 0xE9BE: 0x9BB4, //CJK UNIFIED IDEOGRAPH
+ 0xE9BF: 0x9BC0, //CJK UNIFIED IDEOGRAPH
+ 0xE9C0: 0x9BCA, //CJK UNIFIED IDEOGRAPH
+ 0xE9C1: 0x9BB9, //CJK UNIFIED IDEOGRAPH
+ 0xE9C2: 0x9BC6, //CJK UNIFIED IDEOGRAPH
+ 0xE9C3: 0x9BCF, //CJK UNIFIED IDEOGRAPH
+ 0xE9C4: 0x9BD1, //CJK UNIFIED IDEOGRAPH
+ 0xE9C5: 0x9BD2, //CJK UNIFIED IDEOGRAPH
+ 0xE9C6: 0x9BE3, //CJK UNIFIED IDEOGRAPH
+ 0xE9C7: 0x9BE2, //CJK UNIFIED IDEOGRAPH
+ 0xE9C8: 0x9BE4, //CJK UNIFIED IDEOGRAPH
+ 0xE9C9: 0x9BD4, //CJK UNIFIED IDEOGRAPH
+ 0xE9CA: 0x9BE1, //CJK UNIFIED IDEOGRAPH
+ 0xE9CB: 0x9C3A, //CJK UNIFIED IDEOGRAPH
+ 0xE9CC: 0x9BF2, //CJK UNIFIED IDEOGRAPH
+ 0xE9CD: 0x9BF1, //CJK UNIFIED IDEOGRAPH
+ 0xE9CE: 0x9BF0, //CJK UNIFIED IDEOGRAPH
+ 0xE9CF: 0x9C15, //CJK UNIFIED IDEOGRAPH
+ 0xE9D0: 0x9C14, //CJK UNIFIED IDEOGRAPH
+ 0xE9D1: 0x9C09, //CJK UNIFIED IDEOGRAPH
+ 0xE9D2: 0x9C13, //CJK UNIFIED IDEOGRAPH
+ 0xE9D3: 0x9C0C, //CJK UNIFIED IDEOGRAPH
+ 0xE9D4: 0x9C06, //CJK UNIFIED IDEOGRAPH
+ 0xE9D5: 0x9C08, //CJK UNIFIED IDEOGRAPH
+ 0xE9D6: 0x9C12, //CJK UNIFIED IDEOGRAPH
+ 0xE9D7: 0x9C0A, //CJK UNIFIED IDEOGRAPH
+ 0xE9D8: 0x9C04, //CJK UNIFIED IDEOGRAPH
+ 0xE9D9: 0x9C2E, //CJK UNIFIED IDEOGRAPH
+ 0xE9DA: 0x9C1B, //CJK UNIFIED IDEOGRAPH
+ 0xE9DB: 0x9C25, //CJK UNIFIED IDEOGRAPH
+ 0xE9DC: 0x9C24, //CJK UNIFIED IDEOGRAPH
+ 0xE9DD: 0x9C21, //CJK UNIFIED IDEOGRAPH
+ 0xE9DE: 0x9C30, //CJK UNIFIED IDEOGRAPH
+ 0xE9DF: 0x9C47, //CJK UNIFIED IDEOGRAPH
+ 0xE9E0: 0x9C32, //CJK UNIFIED IDEOGRAPH
+ 0xE9E1: 0x9C46, //CJK UNIFIED IDEOGRAPH
+ 0xE9E2: 0x9C3E, //CJK UNIFIED IDEOGRAPH
+ 0xE9E3: 0x9C5A, //CJK UNIFIED IDEOGRAPH
+ 0xE9E4: 0x9C60, //CJK UNIFIED IDEOGRAPH
+ 0xE9E5: 0x9C67, //CJK UNIFIED IDEOGRAPH
+ 0xE9E6: 0x9C76, //CJK UNIFIED IDEOGRAPH
+ 0xE9E7: 0x9C78, //CJK UNIFIED IDEOGRAPH
+ 0xE9E8: 0x9CE7, //CJK UNIFIED IDEOGRAPH
+ 0xE9E9: 0x9CEC, //CJK UNIFIED IDEOGRAPH
+ 0xE9EA: 0x9CF0, //CJK UNIFIED IDEOGRAPH
+ 0xE9EB: 0x9D09, //CJK UNIFIED IDEOGRAPH
+ 0xE9EC: 0x9D08, //CJK UNIFIED IDEOGRAPH
+ 0xE9ED: 0x9CEB, //CJK UNIFIED IDEOGRAPH
+ 0xE9EE: 0x9D03, //CJK UNIFIED IDEOGRAPH
+ 0xE9EF: 0x9D06, //CJK UNIFIED IDEOGRAPH
+ 0xE9F0: 0x9D2A, //CJK UNIFIED IDEOGRAPH
+ 0xE9F1: 0x9D26, //CJK UNIFIED IDEOGRAPH
+ 0xE9F2: 0x9DAF, //CJK UNIFIED IDEOGRAPH
+ 0xE9F3: 0x9D23, //CJK UNIFIED IDEOGRAPH
+ 0xE9F4: 0x9D1F, //CJK UNIFIED IDEOGRAPH
+ 0xE9F5: 0x9D44, //CJK UNIFIED IDEOGRAPH
+ 0xE9F6: 0x9D15, //CJK UNIFIED IDEOGRAPH
+ 0xE9F7: 0x9D12, //CJK UNIFIED IDEOGRAPH
+ 0xE9F8: 0x9D41, //CJK UNIFIED IDEOGRAPH
+ 0xE9F9: 0x9D3F, //CJK UNIFIED IDEOGRAPH
+ 0xE9FA: 0x9D3E, //CJK UNIFIED IDEOGRAPH
+ 0xE9FB: 0x9D46, //CJK UNIFIED IDEOGRAPH
+ 0xE9FC: 0x9D48, //CJK UNIFIED IDEOGRAPH
+ 0xEA40: 0x9D5D, //CJK UNIFIED IDEOGRAPH
+ 0xEA41: 0x9D5E, //CJK UNIFIED IDEOGRAPH
+ 0xEA42: 0x9D64, //CJK UNIFIED IDEOGRAPH
+ 0xEA43: 0x9D51, //CJK UNIFIED IDEOGRAPH
+ 0xEA44: 0x9D50, //CJK UNIFIED IDEOGRAPH
+ 0xEA45: 0x9D59, //CJK UNIFIED IDEOGRAPH
+ 0xEA46: 0x9D72, //CJK UNIFIED IDEOGRAPH
+ 0xEA47: 0x9D89, //CJK UNIFIED IDEOGRAPH
+ 0xEA48: 0x9D87, //CJK UNIFIED IDEOGRAPH
+ 0xEA49: 0x9DAB, //CJK UNIFIED IDEOGRAPH
+ 0xEA4A: 0x9D6F, //CJK UNIFIED IDEOGRAPH
+ 0xEA4B: 0x9D7A, //CJK UNIFIED IDEOGRAPH
+ 0xEA4C: 0x9D9A, //CJK UNIFIED IDEOGRAPH
+ 0xEA4D: 0x9DA4, //CJK UNIFIED IDEOGRAPH
+ 0xEA4E: 0x9DA9, //CJK UNIFIED IDEOGRAPH
+ 0xEA4F: 0x9DB2, //CJK UNIFIED IDEOGRAPH
+ 0xEA50: 0x9DC4, //CJK UNIFIED IDEOGRAPH
+ 0xEA51: 0x9DC1, //CJK UNIFIED IDEOGRAPH
+ 0xEA52: 0x9DBB, //CJK UNIFIED IDEOGRAPH
+ 0xEA53: 0x9DB8, //CJK UNIFIED IDEOGRAPH
+ 0xEA54: 0x9DBA, //CJK UNIFIED IDEOGRAPH
+ 0xEA55: 0x9DC6, //CJK UNIFIED IDEOGRAPH
+ 0xEA56: 0x9DCF, //CJK UNIFIED IDEOGRAPH
+ 0xEA57: 0x9DC2, //CJK UNIFIED IDEOGRAPH
+ 0xEA58: 0x9DD9, //CJK UNIFIED IDEOGRAPH
+ 0xEA59: 0x9DD3, //CJK UNIFIED IDEOGRAPH
+ 0xEA5A: 0x9DF8, //CJK UNIFIED IDEOGRAPH
+ 0xEA5B: 0x9DE6, //CJK UNIFIED IDEOGRAPH
+ 0xEA5C: 0x9DED, //CJK UNIFIED IDEOGRAPH
+ 0xEA5D: 0x9DEF, //CJK UNIFIED IDEOGRAPH
+ 0xEA5E: 0x9DFD, //CJK UNIFIED IDEOGRAPH
+ 0xEA5F: 0x9E1A, //CJK UNIFIED IDEOGRAPH
+ 0xEA60: 0x9E1B, //CJK UNIFIED IDEOGRAPH
+ 0xEA61: 0x9E1E, //CJK UNIFIED IDEOGRAPH
+ 0xEA62: 0x9E75, //CJK UNIFIED IDEOGRAPH
+ 0xEA63: 0x9E79, //CJK UNIFIED IDEOGRAPH
+ 0xEA64: 0x9E7D, //CJK UNIFIED IDEOGRAPH
+ 0xEA65: 0x9E81, //CJK UNIFIED IDEOGRAPH
+ 0xEA66: 0x9E88, //CJK UNIFIED IDEOGRAPH
+ 0xEA67: 0x9E8B, //CJK UNIFIED IDEOGRAPH
+ 0xEA68: 0x9E8C, //CJK UNIFIED IDEOGRAPH
+ 0xEA69: 0x9E92, //CJK UNIFIED IDEOGRAPH
+ 0xEA6A: 0x9E95, //CJK UNIFIED IDEOGRAPH
+ 0xEA6B: 0x9E91, //CJK UNIFIED IDEOGRAPH
+ 0xEA6C: 0x9E9D, //CJK UNIFIED IDEOGRAPH
+ 0xEA6D: 0x9EA5, //CJK UNIFIED IDEOGRAPH
+ 0xEA6E: 0x9EA9, //CJK UNIFIED IDEOGRAPH
+ 0xEA6F: 0x9EB8, //CJK UNIFIED IDEOGRAPH
+ 0xEA70: 0x9EAA, //CJK UNIFIED IDEOGRAPH
+ 0xEA71: 0x9EAD, //CJK UNIFIED IDEOGRAPH
+ 0xEA72: 0x9761, //CJK UNIFIED IDEOGRAPH
+ 0xEA73: 0x9ECC, //CJK UNIFIED IDEOGRAPH
+ 0xEA74: 0x9ECE, //CJK UNIFIED IDEOGRAPH
+ 0xEA75: 0x9ECF, //CJK UNIFIED IDEOGRAPH
+ 0xEA76: 0x9ED0, //CJK UNIFIED IDEOGRAPH
+ 0xEA77: 0x9ED4, //CJK UNIFIED IDEOGRAPH
+ 0xEA78: 0x9EDC, //CJK UNIFIED IDEOGRAPH
+ 0xEA79: 0x9EDE, //CJK UNIFIED IDEOGRAPH
+ 0xEA7A: 0x9EDD, //CJK UNIFIED IDEOGRAPH
+ 0xEA7B: 0x9EE0, //CJK UNIFIED IDEOGRAPH
+ 0xEA7C: 0x9EE5, //CJK UNIFIED IDEOGRAPH
+ 0xEA7D: 0x9EE8, //CJK UNIFIED IDEOGRAPH
+ 0xEA7E: 0x9EEF, //CJK UNIFIED IDEOGRAPH
+ 0xEA80: 0x9EF4, //CJK UNIFIED IDEOGRAPH
+ 0xEA81: 0x9EF6, //CJK UNIFIED IDEOGRAPH
+ 0xEA82: 0x9EF7, //CJK UNIFIED IDEOGRAPH
+ 0xEA83: 0x9EF9, //CJK UNIFIED IDEOGRAPH
+ 0xEA84: 0x9EFB, //CJK UNIFIED IDEOGRAPH
+ 0xEA85: 0x9EFC, //CJK UNIFIED IDEOGRAPH
+ 0xEA86: 0x9EFD, //CJK UNIFIED IDEOGRAPH
+ 0xEA87: 0x9F07, //CJK UNIFIED IDEOGRAPH
+ 0xEA88: 0x9F08, //CJK UNIFIED IDEOGRAPH
+ 0xEA89: 0x76B7, //CJK UNIFIED IDEOGRAPH
+ 0xEA8A: 0x9F15, //CJK UNIFIED IDEOGRAPH
+ 0xEA8B: 0x9F21, //CJK UNIFIED IDEOGRAPH
+ 0xEA8C: 0x9F2C, //CJK UNIFIED IDEOGRAPH
+ 0xEA8D: 0x9F3E, //CJK UNIFIED IDEOGRAPH
+ 0xEA8E: 0x9F4A, //CJK UNIFIED IDEOGRAPH
+ 0xEA8F: 0x9F52, //CJK UNIFIED IDEOGRAPH
+ 0xEA90: 0x9F54, //CJK UNIFIED IDEOGRAPH
+ 0xEA91: 0x9F63, //CJK UNIFIED IDEOGRAPH
+ 0xEA92: 0x9F5F, //CJK UNIFIED IDEOGRAPH
+ 0xEA93: 0x9F60, //CJK UNIFIED IDEOGRAPH
+ 0xEA94: 0x9F61, //CJK UNIFIED IDEOGRAPH
+ 0xEA95: 0x9F66, //CJK UNIFIED IDEOGRAPH
+ 0xEA96: 0x9F67, //CJK UNIFIED IDEOGRAPH
+ 0xEA97: 0x9F6C, //CJK UNIFIED IDEOGRAPH
+ 0xEA98: 0x9F6A, //CJK UNIFIED IDEOGRAPH
+ 0xEA99: 0x9F77, //CJK UNIFIED IDEOGRAPH
+ 0xEA9A: 0x9F72, //CJK UNIFIED IDEOGRAPH
+ 0xEA9B: 0x9F76, //CJK UNIFIED IDEOGRAPH
+ 0xEA9C: 0x9F95, //CJK UNIFIED IDEOGRAPH
+ 0xEA9D: 0x9F9C, //CJK UNIFIED IDEOGRAPH
+ 0xEA9E: 0x9FA0, //CJK UNIFIED IDEOGRAPH
+ 0xEA9F: 0x582F, //CJK UNIFIED IDEOGRAPH
+ 0xEAA0: 0x69C7, //CJK UNIFIED IDEOGRAPH
+ 0xEAA1: 0x9059, //CJK UNIFIED IDEOGRAPH
+ 0xEAA2: 0x7464, //CJK UNIFIED IDEOGRAPH
+ 0xEAA3: 0x51DC, //CJK UNIFIED IDEOGRAPH
+ 0xEAA4: 0x7199, //CJK UNIFIED IDEOGRAPH
+ 0xED40: 0x7E8A, //CJK UNIFIED IDEOGRAPH
+ 0xED41: 0x891C, //CJK UNIFIED IDEOGRAPH
+ 0xED42: 0x9348, //CJK UNIFIED IDEOGRAPH
+ 0xED43: 0x9288, //CJK UNIFIED IDEOGRAPH
+ 0xED44: 0x84DC, //CJK UNIFIED IDEOGRAPH
+ 0xED45: 0x4FC9, //CJK UNIFIED IDEOGRAPH
+ 0xED46: 0x70BB, //CJK UNIFIED IDEOGRAPH
+ 0xED47: 0x6631, //CJK UNIFIED IDEOGRAPH
+ 0xED48: 0x68C8, //CJK UNIFIED IDEOGRAPH
+ 0xED49: 0x92F9, //CJK UNIFIED IDEOGRAPH
+ 0xED4A: 0x66FB, //CJK UNIFIED IDEOGRAPH
+ 0xED4B: 0x5F45, //CJK UNIFIED IDEOGRAPH
+ 0xED4C: 0x4E28, //CJK UNIFIED IDEOGRAPH
+ 0xED4D: 0x4EE1, //CJK UNIFIED IDEOGRAPH
+ 0xED4E: 0x4EFC, //CJK UNIFIED IDEOGRAPH
+ 0xED4F: 0x4F00, //CJK UNIFIED IDEOGRAPH
+ 0xED50: 0x4F03, //CJK UNIFIED IDEOGRAPH
+ 0xED51: 0x4F39, //CJK UNIFIED IDEOGRAPH
+ 0xED52: 0x4F56, //CJK UNIFIED IDEOGRAPH
+ 0xED53: 0x4F92, //CJK UNIFIED IDEOGRAPH
+ 0xED54: 0x4F8A, //CJK UNIFIED IDEOGRAPH
+ 0xED55: 0x4F9A, //CJK UNIFIED IDEOGRAPH
+ 0xED56: 0x4F94, //CJK UNIFIED IDEOGRAPH
+ 0xED57: 0x4FCD, //CJK UNIFIED IDEOGRAPH
+ 0xED58: 0x5040, //CJK UNIFIED IDEOGRAPH
+ 0xED59: 0x5022, //CJK UNIFIED IDEOGRAPH
+ 0xED5A: 0x4FFF, //CJK UNIFIED IDEOGRAPH
+ 0xED5B: 0x501E, //CJK UNIFIED IDEOGRAPH
+ 0xED5C: 0x5046, //CJK UNIFIED IDEOGRAPH
+ 0xED5D: 0x5070, //CJK UNIFIED IDEOGRAPH
+ 0xED5E: 0x5042, //CJK UNIFIED IDEOGRAPH
+ 0xED5F: 0x5094, //CJK UNIFIED IDEOGRAPH
+ 0xED60: 0x50F4, //CJK UNIFIED IDEOGRAPH
+ 0xED61: 0x50D8, //CJK UNIFIED IDEOGRAPH
+ 0xED62: 0x514A, //CJK UNIFIED IDEOGRAPH
+ 0xED63: 0x5164, //CJK UNIFIED IDEOGRAPH
+ 0xED64: 0x519D, //CJK UNIFIED IDEOGRAPH
+ 0xED65: 0x51BE, //CJK UNIFIED IDEOGRAPH
+ 0xED66: 0x51EC, //CJK UNIFIED IDEOGRAPH
+ 0xED67: 0x5215, //CJK UNIFIED IDEOGRAPH
+ 0xED68: 0x529C, //CJK UNIFIED IDEOGRAPH
+ 0xED69: 0x52A6, //CJK UNIFIED IDEOGRAPH
+ 0xED6A: 0x52C0, //CJK UNIFIED IDEOGRAPH
+ 0xED6B: 0x52DB, //CJK UNIFIED IDEOGRAPH
+ 0xED6C: 0x5300, //CJK UNIFIED IDEOGRAPH
+ 0xED6D: 0x5307, //CJK UNIFIED IDEOGRAPH
+ 0xED6E: 0x5324, //CJK UNIFIED IDEOGRAPH
+ 0xED6F: 0x5372, //CJK UNIFIED IDEOGRAPH
+ 0xED70: 0x5393, //CJK UNIFIED IDEOGRAPH
+ 0xED71: 0x53B2, //CJK UNIFIED IDEOGRAPH
+ 0xED72: 0x53DD, //CJK UNIFIED IDEOGRAPH
+ 0xED73: 0xFA0E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xED74: 0x549C, //CJK UNIFIED IDEOGRAPH
+ 0xED75: 0x548A, //CJK UNIFIED IDEOGRAPH
+ 0xED76: 0x54A9, //CJK UNIFIED IDEOGRAPH
+ 0xED77: 0x54FF, //CJK UNIFIED IDEOGRAPH
+ 0xED78: 0x5586, //CJK UNIFIED IDEOGRAPH
+ 0xED79: 0x5759, //CJK UNIFIED IDEOGRAPH
+ 0xED7A: 0x5765, //CJK UNIFIED IDEOGRAPH
+ 0xED7B: 0x57AC, //CJK UNIFIED IDEOGRAPH
+ 0xED7C: 0x57C8, //CJK UNIFIED IDEOGRAPH
+ 0xED7D: 0x57C7, //CJK UNIFIED IDEOGRAPH
+ 0xED7E: 0xFA0F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xED80: 0xFA10, //CJK COMPATIBILITY IDEOGRAPH
+ 0xED81: 0x589E, //CJK UNIFIED IDEOGRAPH
+ 0xED82: 0x58B2, //CJK UNIFIED IDEOGRAPH
+ 0xED83: 0x590B, //CJK UNIFIED IDEOGRAPH
+ 0xED84: 0x5953, //CJK UNIFIED IDEOGRAPH
+ 0xED85: 0x595B, //CJK UNIFIED IDEOGRAPH
+ 0xED86: 0x595D, //CJK UNIFIED IDEOGRAPH
+ 0xED87: 0x5963, //CJK UNIFIED IDEOGRAPH
+ 0xED88: 0x59A4, //CJK UNIFIED IDEOGRAPH
+ 0xED89: 0x59BA, //CJK UNIFIED IDEOGRAPH
+ 0xED8A: 0x5B56, //CJK UNIFIED IDEOGRAPH
+ 0xED8B: 0x5BC0, //CJK UNIFIED IDEOGRAPH
+ 0xED8C: 0x752F, //CJK UNIFIED IDEOGRAPH
+ 0xED8D: 0x5BD8, //CJK UNIFIED IDEOGRAPH
+ 0xED8E: 0x5BEC, //CJK UNIFIED IDEOGRAPH
+ 0xED8F: 0x5C1E, //CJK UNIFIED IDEOGRAPH
+ 0xED90: 0x5CA6, //CJK UNIFIED IDEOGRAPH
+ 0xED91: 0x5CBA, //CJK UNIFIED IDEOGRAPH
+ 0xED92: 0x5CF5, //CJK UNIFIED IDEOGRAPH
+ 0xED93: 0x5D27, //CJK UNIFIED IDEOGRAPH
+ 0xED94: 0x5D53, //CJK UNIFIED IDEOGRAPH
+ 0xED95: 0xFA11, //CJK COMPATIBILITY IDEOGRAPH
+ 0xED96: 0x5D42, //CJK UNIFIED IDEOGRAPH
+ 0xED97: 0x5D6D, //CJK UNIFIED IDEOGRAPH
+ 0xED98: 0x5DB8, //CJK UNIFIED IDEOGRAPH
+ 0xED99: 0x5DB9, //CJK UNIFIED IDEOGRAPH
+ 0xED9A: 0x5DD0, //CJK UNIFIED IDEOGRAPH
+ 0xED9B: 0x5F21, //CJK UNIFIED IDEOGRAPH
+ 0xED9C: 0x5F34, //CJK UNIFIED IDEOGRAPH
+ 0xED9D: 0x5F67, //CJK UNIFIED IDEOGRAPH
+ 0xED9E: 0x5FB7, //CJK UNIFIED IDEOGRAPH
+ 0xED9F: 0x5FDE, //CJK UNIFIED IDEOGRAPH
+ 0xEDA0: 0x605D, //CJK UNIFIED IDEOGRAPH
+ 0xEDA1: 0x6085, //CJK UNIFIED IDEOGRAPH
+ 0xEDA2: 0x608A, //CJK UNIFIED IDEOGRAPH
+ 0xEDA3: 0x60DE, //CJK UNIFIED IDEOGRAPH
+ 0xEDA4: 0x60D5, //CJK UNIFIED IDEOGRAPH
+ 0xEDA5: 0x6120, //CJK UNIFIED IDEOGRAPH
+ 0xEDA6: 0x60F2, //CJK UNIFIED IDEOGRAPH
+ 0xEDA7: 0x6111, //CJK UNIFIED IDEOGRAPH
+ 0xEDA8: 0x6137, //CJK UNIFIED IDEOGRAPH
+ 0xEDA9: 0x6130, //CJK UNIFIED IDEOGRAPH
+ 0xEDAA: 0x6198, //CJK UNIFIED IDEOGRAPH
+ 0xEDAB: 0x6213, //CJK UNIFIED IDEOGRAPH
+ 0xEDAC: 0x62A6, //CJK UNIFIED IDEOGRAPH
+ 0xEDAD: 0x63F5, //CJK UNIFIED IDEOGRAPH
+ 0xEDAE: 0x6460, //CJK UNIFIED IDEOGRAPH
+ 0xEDAF: 0x649D, //CJK UNIFIED IDEOGRAPH
+ 0xEDB0: 0x64CE, //CJK UNIFIED IDEOGRAPH
+ 0xEDB1: 0x654E, //CJK UNIFIED IDEOGRAPH
+ 0xEDB2: 0x6600, //CJK UNIFIED IDEOGRAPH
+ 0xEDB3: 0x6615, //CJK UNIFIED IDEOGRAPH
+ 0xEDB4: 0x663B, //CJK UNIFIED IDEOGRAPH
+ 0xEDB5: 0x6609, //CJK UNIFIED IDEOGRAPH
+ 0xEDB6: 0x662E, //CJK UNIFIED IDEOGRAPH
+ 0xEDB7: 0x661E, //CJK UNIFIED IDEOGRAPH
+ 0xEDB8: 0x6624, //CJK UNIFIED IDEOGRAPH
+ 0xEDB9: 0x6665, //CJK UNIFIED IDEOGRAPH
+ 0xEDBA: 0x6657, //CJK UNIFIED IDEOGRAPH
+ 0xEDBB: 0x6659, //CJK UNIFIED IDEOGRAPH
+ 0xEDBC: 0xFA12, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDBD: 0x6673, //CJK UNIFIED IDEOGRAPH
+ 0xEDBE: 0x6699, //CJK UNIFIED IDEOGRAPH
+ 0xEDBF: 0x66A0, //CJK UNIFIED IDEOGRAPH
+ 0xEDC0: 0x66B2, //CJK UNIFIED IDEOGRAPH
+ 0xEDC1: 0x66BF, //CJK UNIFIED IDEOGRAPH
+ 0xEDC2: 0x66FA, //CJK UNIFIED IDEOGRAPH
+ 0xEDC3: 0x670E, //CJK UNIFIED IDEOGRAPH
+ 0xEDC4: 0xF929, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDC5: 0x6766, //CJK UNIFIED IDEOGRAPH
+ 0xEDC6: 0x67BB, //CJK UNIFIED IDEOGRAPH
+ 0xEDC7: 0x6852, //CJK UNIFIED IDEOGRAPH
+ 0xEDC8: 0x67C0, //CJK UNIFIED IDEOGRAPH
+ 0xEDC9: 0x6801, //CJK UNIFIED IDEOGRAPH
+ 0xEDCA: 0x6844, //CJK UNIFIED IDEOGRAPH
+ 0xEDCB: 0x68CF, //CJK UNIFIED IDEOGRAPH
+ 0xEDCC: 0xFA13, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDCD: 0x6968, //CJK UNIFIED IDEOGRAPH
+ 0xEDCE: 0xFA14, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDCF: 0x6998, //CJK UNIFIED IDEOGRAPH
+ 0xEDD0: 0x69E2, //CJK UNIFIED IDEOGRAPH
+ 0xEDD1: 0x6A30, //CJK UNIFIED IDEOGRAPH
+ 0xEDD2: 0x6A6B, //CJK UNIFIED IDEOGRAPH
+ 0xEDD3: 0x6A46, //CJK UNIFIED IDEOGRAPH
+ 0xEDD4: 0x6A73, //CJK UNIFIED IDEOGRAPH
+ 0xEDD5: 0x6A7E, //CJK UNIFIED IDEOGRAPH
+ 0xEDD6: 0x6AE2, //CJK UNIFIED IDEOGRAPH
+ 0xEDD7: 0x6AE4, //CJK UNIFIED IDEOGRAPH
+ 0xEDD8: 0x6BD6, //CJK UNIFIED IDEOGRAPH
+ 0xEDD9: 0x6C3F, //CJK UNIFIED IDEOGRAPH
+ 0xEDDA: 0x6C5C, //CJK UNIFIED IDEOGRAPH
+ 0xEDDB: 0x6C86, //CJK UNIFIED IDEOGRAPH
+ 0xEDDC: 0x6C6F, //CJK UNIFIED IDEOGRAPH
+ 0xEDDD: 0x6CDA, //CJK UNIFIED IDEOGRAPH
+ 0xEDDE: 0x6D04, //CJK UNIFIED IDEOGRAPH
+ 0xEDDF: 0x6D87, //CJK UNIFIED IDEOGRAPH
+ 0xEDE0: 0x6D6F, //CJK UNIFIED IDEOGRAPH
+ 0xEDE1: 0x6D96, //CJK UNIFIED IDEOGRAPH
+ 0xEDE2: 0x6DAC, //CJK UNIFIED IDEOGRAPH
+ 0xEDE3: 0x6DCF, //CJK UNIFIED IDEOGRAPH
+ 0xEDE4: 0x6DF8, //CJK UNIFIED IDEOGRAPH
+ 0xEDE5: 0x6DF2, //CJK UNIFIED IDEOGRAPH
+ 0xEDE6: 0x6DFC, //CJK UNIFIED IDEOGRAPH
+ 0xEDE7: 0x6E39, //CJK UNIFIED IDEOGRAPH
+ 0xEDE8: 0x6E5C, //CJK UNIFIED IDEOGRAPH
+ 0xEDE9: 0x6E27, //CJK UNIFIED IDEOGRAPH
+ 0xEDEA: 0x6E3C, //CJK UNIFIED IDEOGRAPH
+ 0xEDEB: 0x6EBF, //CJK UNIFIED IDEOGRAPH
+ 0xEDEC: 0x6F88, //CJK UNIFIED IDEOGRAPH
+ 0xEDED: 0x6FB5, //CJK UNIFIED IDEOGRAPH
+ 0xEDEE: 0x6FF5, //CJK UNIFIED IDEOGRAPH
+ 0xEDEF: 0x7005, //CJK UNIFIED IDEOGRAPH
+ 0xEDF0: 0x7007, //CJK UNIFIED IDEOGRAPH
+ 0xEDF1: 0x7028, //CJK UNIFIED IDEOGRAPH
+ 0xEDF2: 0x7085, //CJK UNIFIED IDEOGRAPH
+ 0xEDF3: 0x70AB, //CJK UNIFIED IDEOGRAPH
+ 0xEDF4: 0x710F, //CJK UNIFIED IDEOGRAPH
+ 0xEDF5: 0x7104, //CJK UNIFIED IDEOGRAPH
+ 0xEDF6: 0x715C, //CJK UNIFIED IDEOGRAPH
+ 0xEDF7: 0x7146, //CJK UNIFIED IDEOGRAPH
+ 0xEDF8: 0x7147, //CJK UNIFIED IDEOGRAPH
+ 0xEDF9: 0xFA15, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDFA: 0x71C1, //CJK UNIFIED IDEOGRAPH
+ 0xEDFB: 0x71FE, //CJK UNIFIED IDEOGRAPH
+ 0xEDFC: 0x72B1, //CJK UNIFIED IDEOGRAPH
+ 0xEE40: 0x72BE, //CJK UNIFIED IDEOGRAPH
+ 0xEE41: 0x7324, //CJK UNIFIED IDEOGRAPH
+ 0xEE42: 0xFA16, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE43: 0x7377, //CJK UNIFIED IDEOGRAPH
+ 0xEE44: 0x73BD, //CJK UNIFIED IDEOGRAPH
+ 0xEE45: 0x73C9, //CJK UNIFIED IDEOGRAPH
+ 0xEE46: 0x73D6, //CJK UNIFIED IDEOGRAPH
+ 0xEE47: 0x73E3, //CJK UNIFIED IDEOGRAPH
+ 0xEE48: 0x73D2, //CJK UNIFIED IDEOGRAPH
+ 0xEE49: 0x7407, //CJK UNIFIED IDEOGRAPH
+ 0xEE4A: 0x73F5, //CJK UNIFIED IDEOGRAPH
+ 0xEE4B: 0x7426, //CJK UNIFIED IDEOGRAPH
+ 0xEE4C: 0x742A, //CJK UNIFIED IDEOGRAPH
+ 0xEE4D: 0x7429, //CJK UNIFIED IDEOGRAPH
+ 0xEE4E: 0x742E, //CJK UNIFIED IDEOGRAPH
+ 0xEE4F: 0x7462, //CJK UNIFIED IDEOGRAPH
+ 0xEE50: 0x7489, //CJK UNIFIED IDEOGRAPH
+ 0xEE51: 0x749F, //CJK UNIFIED IDEOGRAPH
+ 0xEE52: 0x7501, //CJK UNIFIED IDEOGRAPH
+ 0xEE53: 0x756F, //CJK UNIFIED IDEOGRAPH
+ 0xEE54: 0x7682, //CJK UNIFIED IDEOGRAPH
+ 0xEE55: 0x769C, //CJK UNIFIED IDEOGRAPH
+ 0xEE56: 0x769E, //CJK UNIFIED IDEOGRAPH
+ 0xEE57: 0x769B, //CJK UNIFIED IDEOGRAPH
+ 0xEE58: 0x76A6, //CJK UNIFIED IDEOGRAPH
+ 0xEE59: 0xFA17, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE5A: 0x7746, //CJK UNIFIED IDEOGRAPH
+ 0xEE5B: 0x52AF, //CJK UNIFIED IDEOGRAPH
+ 0xEE5C: 0x7821, //CJK UNIFIED IDEOGRAPH
+ 0xEE5D: 0x784E, //CJK UNIFIED IDEOGRAPH
+ 0xEE5E: 0x7864, //CJK UNIFIED IDEOGRAPH
+ 0xEE5F: 0x787A, //CJK UNIFIED IDEOGRAPH
+ 0xEE60: 0x7930, //CJK UNIFIED IDEOGRAPH
+ 0xEE61: 0xFA18, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE62: 0xFA19, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE63: 0xFA1A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE64: 0x7994, //CJK UNIFIED IDEOGRAPH
+ 0xEE65: 0xFA1B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE66: 0x799B, //CJK UNIFIED IDEOGRAPH
+ 0xEE67: 0x7AD1, //CJK UNIFIED IDEOGRAPH
+ 0xEE68: 0x7AE7, //CJK UNIFIED IDEOGRAPH
+ 0xEE69: 0xFA1C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE6A: 0x7AEB, //CJK UNIFIED IDEOGRAPH
+ 0xEE6B: 0x7B9E, //CJK UNIFIED IDEOGRAPH
+ 0xEE6C: 0xFA1D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE6D: 0x7D48, //CJK UNIFIED IDEOGRAPH
+ 0xEE6E: 0x7D5C, //CJK UNIFIED IDEOGRAPH
+ 0xEE6F: 0x7DB7, //CJK UNIFIED IDEOGRAPH
+ 0xEE70: 0x7DA0, //CJK UNIFIED IDEOGRAPH
+ 0xEE71: 0x7DD6, //CJK UNIFIED IDEOGRAPH
+ 0xEE72: 0x7E52, //CJK UNIFIED IDEOGRAPH
+ 0xEE73: 0x7F47, //CJK UNIFIED IDEOGRAPH
+ 0xEE74: 0x7FA1, //CJK UNIFIED IDEOGRAPH
+ 0xEE75: 0xFA1E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE76: 0x8301, //CJK UNIFIED IDEOGRAPH
+ 0xEE77: 0x8362, //CJK UNIFIED IDEOGRAPH
+ 0xEE78: 0x837F, //CJK UNIFIED IDEOGRAPH
+ 0xEE79: 0x83C7, //CJK UNIFIED IDEOGRAPH
+ 0xEE7A: 0x83F6, //CJK UNIFIED IDEOGRAPH
+ 0xEE7B: 0x8448, //CJK UNIFIED IDEOGRAPH
+ 0xEE7C: 0x84B4, //CJK UNIFIED IDEOGRAPH
+ 0xEE7D: 0x8553, //CJK UNIFIED IDEOGRAPH
+ 0xEE7E: 0x8559, //CJK UNIFIED IDEOGRAPH
+ 0xEE80: 0x856B, //CJK UNIFIED IDEOGRAPH
+ 0xEE81: 0xFA1F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE82: 0x85B0, //CJK UNIFIED IDEOGRAPH
+ 0xEE83: 0xFA20, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE84: 0xFA21, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE85: 0x8807, //CJK UNIFIED IDEOGRAPH
+ 0xEE86: 0x88F5, //CJK UNIFIED IDEOGRAPH
+ 0xEE87: 0x8A12, //CJK UNIFIED IDEOGRAPH
+ 0xEE88: 0x8A37, //CJK UNIFIED IDEOGRAPH
+ 0xEE89: 0x8A79, //CJK UNIFIED IDEOGRAPH
+ 0xEE8A: 0x8AA7, //CJK UNIFIED IDEOGRAPH
+ 0xEE8B: 0x8ABE, //CJK UNIFIED IDEOGRAPH
+ 0xEE8C: 0x8ADF, //CJK UNIFIED IDEOGRAPH
+ 0xEE8D: 0xFA22, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE8E: 0x8AF6, //CJK UNIFIED IDEOGRAPH
+ 0xEE8F: 0x8B53, //CJK UNIFIED IDEOGRAPH
+ 0xEE90: 0x8B7F, //CJK UNIFIED IDEOGRAPH
+ 0xEE91: 0x8CF0, //CJK UNIFIED IDEOGRAPH
+ 0xEE92: 0x8CF4, //CJK UNIFIED IDEOGRAPH
+ 0xEE93: 0x8D12, //CJK UNIFIED IDEOGRAPH
+ 0xEE94: 0x8D76, //CJK UNIFIED IDEOGRAPH
+ 0xEE95: 0xFA23, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE96: 0x8ECF, //CJK UNIFIED IDEOGRAPH
+ 0xEE97: 0xFA24, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE98: 0xFA25, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE99: 0x9067, //CJK UNIFIED IDEOGRAPH
+ 0xEE9A: 0x90DE, //CJK UNIFIED IDEOGRAPH
+ 0xEE9B: 0xFA26, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEE9C: 0x9115, //CJK UNIFIED IDEOGRAPH
+ 0xEE9D: 0x9127, //CJK UNIFIED IDEOGRAPH
+ 0xEE9E: 0x91DA, //CJK UNIFIED IDEOGRAPH
+ 0xEE9F: 0x91D7, //CJK UNIFIED IDEOGRAPH
+ 0xEEA0: 0x91DE, //CJK UNIFIED IDEOGRAPH
+ 0xEEA1: 0x91ED, //CJK UNIFIED IDEOGRAPH
+ 0xEEA2: 0x91EE, //CJK UNIFIED IDEOGRAPH
+ 0xEEA3: 0x91E4, //CJK UNIFIED IDEOGRAPH
+ 0xEEA4: 0x91E5, //CJK UNIFIED IDEOGRAPH
+ 0xEEA5: 0x9206, //CJK UNIFIED IDEOGRAPH
+ 0xEEA6: 0x9210, //CJK UNIFIED IDEOGRAPH
+ 0xEEA7: 0x920A, //CJK UNIFIED IDEOGRAPH
+ 0xEEA8: 0x923A, //CJK UNIFIED IDEOGRAPH
+ 0xEEA9: 0x9240, //CJK UNIFIED IDEOGRAPH
+ 0xEEAA: 0x923C, //CJK UNIFIED IDEOGRAPH
+ 0xEEAB: 0x924E, //CJK UNIFIED IDEOGRAPH
+ 0xEEAC: 0x9259, //CJK UNIFIED IDEOGRAPH
+ 0xEEAD: 0x9251, //CJK UNIFIED IDEOGRAPH
+ 0xEEAE: 0x9239, //CJK UNIFIED IDEOGRAPH
+ 0xEEAF: 0x9267, //CJK UNIFIED IDEOGRAPH
+ 0xEEB0: 0x92A7, //CJK UNIFIED IDEOGRAPH
+ 0xEEB1: 0x9277, //CJK UNIFIED IDEOGRAPH
+ 0xEEB2: 0x9278, //CJK UNIFIED IDEOGRAPH
+ 0xEEB3: 0x92E7, //CJK UNIFIED IDEOGRAPH
+ 0xEEB4: 0x92D7, //CJK UNIFIED IDEOGRAPH
+ 0xEEB5: 0x92D9, //CJK UNIFIED IDEOGRAPH
+ 0xEEB6: 0x92D0, //CJK UNIFIED IDEOGRAPH
+ 0xEEB7: 0xFA27, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEEB8: 0x92D5, //CJK UNIFIED IDEOGRAPH
+ 0xEEB9: 0x92E0, //CJK UNIFIED IDEOGRAPH
+ 0xEEBA: 0x92D3, //CJK UNIFIED IDEOGRAPH
+ 0xEEBB: 0x9325, //CJK UNIFIED IDEOGRAPH
+ 0xEEBC: 0x9321, //CJK UNIFIED IDEOGRAPH
+ 0xEEBD: 0x92FB, //CJK UNIFIED IDEOGRAPH
+ 0xEEBE: 0xFA28, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEEBF: 0x931E, //CJK UNIFIED IDEOGRAPH
+ 0xEEC0: 0x92FF, //CJK UNIFIED IDEOGRAPH
+ 0xEEC1: 0x931D, //CJK UNIFIED IDEOGRAPH
+ 0xEEC2: 0x9302, //CJK UNIFIED IDEOGRAPH
+ 0xEEC3: 0x9370, //CJK UNIFIED IDEOGRAPH
+ 0xEEC4: 0x9357, //CJK UNIFIED IDEOGRAPH
+ 0xEEC5: 0x93A4, //CJK UNIFIED IDEOGRAPH
+ 0xEEC6: 0x93C6, //CJK UNIFIED IDEOGRAPH
+ 0xEEC7: 0x93DE, //CJK UNIFIED IDEOGRAPH
+ 0xEEC8: 0x93F8, //CJK UNIFIED IDEOGRAPH
+ 0xEEC9: 0x9431, //CJK UNIFIED IDEOGRAPH
+ 0xEECA: 0x9445, //CJK UNIFIED IDEOGRAPH
+ 0xEECB: 0x9448, //CJK UNIFIED IDEOGRAPH
+ 0xEECC: 0x9592, //CJK UNIFIED IDEOGRAPH
+ 0xEECD: 0xF9DC, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEECE: 0xFA29, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEECF: 0x969D, //CJK UNIFIED IDEOGRAPH
+ 0xEED0: 0x96AF, //CJK UNIFIED IDEOGRAPH
+ 0xEED1: 0x9733, //CJK UNIFIED IDEOGRAPH
+ 0xEED2: 0x973B, //CJK UNIFIED IDEOGRAPH
+ 0xEED3: 0x9743, //CJK UNIFIED IDEOGRAPH
+ 0xEED4: 0x974D, //CJK UNIFIED IDEOGRAPH
+ 0xEED5: 0x974F, //CJK UNIFIED IDEOGRAPH
+ 0xEED6: 0x9751, //CJK UNIFIED IDEOGRAPH
+ 0xEED7: 0x9755, //CJK UNIFIED IDEOGRAPH
+ 0xEED8: 0x9857, //CJK UNIFIED IDEOGRAPH
+ 0xEED9: 0x9865, //CJK UNIFIED IDEOGRAPH
+ 0xEEDA: 0xFA2A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEEDB: 0xFA2B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEEDC: 0x9927, //CJK UNIFIED IDEOGRAPH
+ 0xEEDD: 0xFA2C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEEDE: 0x999E, //CJK UNIFIED IDEOGRAPH
+ 0xEEDF: 0x9A4E, //CJK UNIFIED IDEOGRAPH
+ 0xEEE0: 0x9AD9, //CJK UNIFIED IDEOGRAPH
+ 0xEEE1: 0x9ADC, //CJK UNIFIED IDEOGRAPH
+ 0xEEE2: 0x9B75, //CJK UNIFIED IDEOGRAPH
+ 0xEEE3: 0x9B72, //CJK UNIFIED IDEOGRAPH
+ 0xEEE4: 0x9B8F, //CJK UNIFIED IDEOGRAPH
+ 0xEEE5: 0x9BB1, //CJK UNIFIED IDEOGRAPH
+ 0xEEE6: 0x9BBB, //CJK UNIFIED IDEOGRAPH
+ 0xEEE7: 0x9C00, //CJK UNIFIED IDEOGRAPH
+ 0xEEE8: 0x9D70, //CJK UNIFIED IDEOGRAPH
+ 0xEEE9: 0x9D6B, //CJK UNIFIED IDEOGRAPH
+ 0xEEEA: 0xFA2D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEEEB: 0x9E19, //CJK UNIFIED IDEOGRAPH
+ 0xEEEC: 0x9ED1, //CJK UNIFIED IDEOGRAPH
+ 0xEEEF: 0x2170, //SMALL ROMAN NUMERAL ONE
+ 0xEEF0: 0x2171, //SMALL ROMAN NUMERAL TWO
+ 0xEEF1: 0x2172, //SMALL ROMAN NUMERAL THREE
+ 0xEEF2: 0x2173, //SMALL ROMAN NUMERAL FOUR
+ 0xEEF3: 0x2174, //SMALL ROMAN NUMERAL FIVE
+ 0xEEF4: 0x2175, //SMALL ROMAN NUMERAL SIX
+ 0xEEF5: 0x2176, //SMALL ROMAN NUMERAL SEVEN
+ 0xEEF6: 0x2177, //SMALL ROMAN NUMERAL EIGHT
+ 0xEEF7: 0x2178, //SMALL ROMAN NUMERAL NINE
+ 0xEEF8: 0x2179, //SMALL ROMAN NUMERAL TEN
+ 0xEEF9: 0xFFE2, //FULLWIDTH NOT SIGN
+ 0xEEFA: 0xFFE4, //FULLWIDTH BROKEN BAR
+ 0xEEFB: 0xFF07, //FULLWIDTH APOSTROPHE
+ 0xEEFC: 0xFF02, //FULLWIDTH QUOTATION MARK
+ 0xFA40: 0x2170, //SMALL ROMAN NUMERAL ONE
+ 0xFA41: 0x2171, //SMALL ROMAN NUMERAL TWO
+ 0xFA42: 0x2172, //SMALL ROMAN NUMERAL THREE
+ 0xFA43: 0x2173, //SMALL ROMAN NUMERAL FOUR
+ 0xFA44: 0x2174, //SMALL ROMAN NUMERAL FIVE
+ 0xFA45: 0x2175, //SMALL ROMAN NUMERAL SIX
+ 0xFA46: 0x2176, //SMALL ROMAN NUMERAL SEVEN
+ 0xFA47: 0x2177, //SMALL ROMAN NUMERAL EIGHT
+ 0xFA48: 0x2178, //SMALL ROMAN NUMERAL NINE
+ 0xFA49: 0x2179, //SMALL ROMAN NUMERAL TEN
+ 0xFA4A: 0x2160, //ROMAN NUMERAL ONE
+ 0xFA4B: 0x2161, //ROMAN NUMERAL TWO
+ 0xFA4C: 0x2162, //ROMAN NUMERAL THREE
+ 0xFA4D: 0x2163, //ROMAN NUMERAL FOUR
+ 0xFA4E: 0x2164, //ROMAN NUMERAL FIVE
+ 0xFA4F: 0x2165, //ROMAN NUMERAL SIX
+ 0xFA50: 0x2166, //ROMAN NUMERAL SEVEN
+ 0xFA51: 0x2167, //ROMAN NUMERAL EIGHT
+ 0xFA52: 0x2168, //ROMAN NUMERAL NINE
+ 0xFA53: 0x2169, //ROMAN NUMERAL TEN
+ 0xFA54: 0xFFE2, //FULLWIDTH NOT SIGN
+ 0xFA55: 0xFFE4, //FULLWIDTH BROKEN BAR
+ 0xFA56: 0xFF07, //FULLWIDTH APOSTROPHE
+ 0xFA57: 0xFF02, //FULLWIDTH QUOTATION MARK
+ 0xFA58: 0x3231, //PARENTHESIZED IDEOGRAPH STOCK
+ 0xFA59: 0x2116, //NUMERO SIGN
+ 0xFA5A: 0x2121, //TELEPHONE SIGN
+ 0xFA5B: 0x2235, //BECAUSE
+ 0xFA5C: 0x7E8A, //CJK UNIFIED IDEOGRAPH
+ 0xFA5D: 0x891C, //CJK UNIFIED IDEOGRAPH
+ 0xFA5E: 0x9348, //CJK UNIFIED IDEOGRAPH
+ 0xFA5F: 0x9288, //CJK UNIFIED IDEOGRAPH
+ 0xFA60: 0x84DC, //CJK UNIFIED IDEOGRAPH
+ 0xFA61: 0x4FC9, //CJK UNIFIED IDEOGRAPH
+ 0xFA62: 0x70BB, //CJK UNIFIED IDEOGRAPH
+ 0xFA63: 0x6631, //CJK UNIFIED IDEOGRAPH
+ 0xFA64: 0x68C8, //CJK UNIFIED IDEOGRAPH
+ 0xFA65: 0x92F9, //CJK UNIFIED IDEOGRAPH
+ 0xFA66: 0x66FB, //CJK UNIFIED IDEOGRAPH
+ 0xFA67: 0x5F45, //CJK UNIFIED IDEOGRAPH
+ 0xFA68: 0x4E28, //CJK UNIFIED IDEOGRAPH
+ 0xFA69: 0x4EE1, //CJK UNIFIED IDEOGRAPH
+ 0xFA6A: 0x4EFC, //CJK UNIFIED IDEOGRAPH
+ 0xFA6B: 0x4F00, //CJK UNIFIED IDEOGRAPH
+ 0xFA6C: 0x4F03, //CJK UNIFIED IDEOGRAPH
+ 0xFA6D: 0x4F39, //CJK UNIFIED IDEOGRAPH
+ 0xFA6E: 0x4F56, //CJK UNIFIED IDEOGRAPH
+ 0xFA6F: 0x4F92, //CJK UNIFIED IDEOGRAPH
+ 0xFA70: 0x4F8A, //CJK UNIFIED IDEOGRAPH
+ 0xFA71: 0x4F9A, //CJK UNIFIED IDEOGRAPH
+ 0xFA72: 0x4F94, //CJK UNIFIED IDEOGRAPH
+ 0xFA73: 0x4FCD, //CJK UNIFIED IDEOGRAPH
+ 0xFA74: 0x5040, //CJK UNIFIED IDEOGRAPH
+ 0xFA75: 0x5022, //CJK UNIFIED IDEOGRAPH
+ 0xFA76: 0x4FFF, //CJK UNIFIED IDEOGRAPH
+ 0xFA77: 0x501E, //CJK UNIFIED IDEOGRAPH
+ 0xFA78: 0x5046, //CJK UNIFIED IDEOGRAPH
+ 0xFA79: 0x5070, //CJK UNIFIED IDEOGRAPH
+ 0xFA7A: 0x5042, //CJK UNIFIED IDEOGRAPH
+ 0xFA7B: 0x5094, //CJK UNIFIED IDEOGRAPH
+ 0xFA7C: 0x50F4, //CJK UNIFIED IDEOGRAPH
+ 0xFA7D: 0x50D8, //CJK UNIFIED IDEOGRAPH
+ 0xFA7E: 0x514A, //CJK UNIFIED IDEOGRAPH
+ 0xFA80: 0x5164, //CJK UNIFIED IDEOGRAPH
+ 0xFA81: 0x519D, //CJK UNIFIED IDEOGRAPH
+ 0xFA82: 0x51BE, //CJK UNIFIED IDEOGRAPH
+ 0xFA83: 0x51EC, //CJK UNIFIED IDEOGRAPH
+ 0xFA84: 0x5215, //CJK UNIFIED IDEOGRAPH
+ 0xFA85: 0x529C, //CJK UNIFIED IDEOGRAPH
+ 0xFA86: 0x52A6, //CJK UNIFIED IDEOGRAPH
+ 0xFA87: 0x52C0, //CJK UNIFIED IDEOGRAPH
+ 0xFA88: 0x52DB, //CJK UNIFIED IDEOGRAPH
+ 0xFA89: 0x5300, //CJK UNIFIED IDEOGRAPH
+ 0xFA8A: 0x5307, //CJK UNIFIED IDEOGRAPH
+ 0xFA8B: 0x5324, //CJK UNIFIED IDEOGRAPH
+ 0xFA8C: 0x5372, //CJK UNIFIED IDEOGRAPH
+ 0xFA8D: 0x5393, //CJK UNIFIED IDEOGRAPH
+ 0xFA8E: 0x53B2, //CJK UNIFIED IDEOGRAPH
+ 0xFA8F: 0x53DD, //CJK UNIFIED IDEOGRAPH
+ 0xFA90: 0xFA0E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFA91: 0x549C, //CJK UNIFIED IDEOGRAPH
+ 0xFA92: 0x548A, //CJK UNIFIED IDEOGRAPH
+ 0xFA93: 0x54A9, //CJK UNIFIED IDEOGRAPH
+ 0xFA94: 0x54FF, //CJK UNIFIED IDEOGRAPH
+ 0xFA95: 0x5586, //CJK UNIFIED IDEOGRAPH
+ 0xFA96: 0x5759, //CJK UNIFIED IDEOGRAPH
+ 0xFA97: 0x5765, //CJK UNIFIED IDEOGRAPH
+ 0xFA98: 0x57AC, //CJK UNIFIED IDEOGRAPH
+ 0xFA99: 0x57C8, //CJK UNIFIED IDEOGRAPH
+ 0xFA9A: 0x57C7, //CJK UNIFIED IDEOGRAPH
+ 0xFA9B: 0xFA0F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFA9C: 0xFA10, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFA9D: 0x589E, //CJK UNIFIED IDEOGRAPH
+ 0xFA9E: 0x58B2, //CJK UNIFIED IDEOGRAPH
+ 0xFA9F: 0x590B, //CJK UNIFIED IDEOGRAPH
+ 0xFAA0: 0x5953, //CJK UNIFIED IDEOGRAPH
+ 0xFAA1: 0x595B, //CJK UNIFIED IDEOGRAPH
+ 0xFAA2: 0x595D, //CJK UNIFIED IDEOGRAPH
+ 0xFAA3: 0x5963, //CJK UNIFIED IDEOGRAPH
+ 0xFAA4: 0x59A4, //CJK UNIFIED IDEOGRAPH
+ 0xFAA5: 0x59BA, //CJK UNIFIED IDEOGRAPH
+ 0xFAA6: 0x5B56, //CJK UNIFIED IDEOGRAPH
+ 0xFAA7: 0x5BC0, //CJK UNIFIED IDEOGRAPH
+ 0xFAA8: 0x752F, //CJK UNIFIED IDEOGRAPH
+ 0xFAA9: 0x5BD8, //CJK UNIFIED IDEOGRAPH
+ 0xFAAA: 0x5BEC, //CJK UNIFIED IDEOGRAPH
+ 0xFAAB: 0x5C1E, //CJK UNIFIED IDEOGRAPH
+ 0xFAAC: 0x5CA6, //CJK UNIFIED IDEOGRAPH
+ 0xFAAD: 0x5CBA, //CJK UNIFIED IDEOGRAPH
+ 0xFAAE: 0x5CF5, //CJK UNIFIED IDEOGRAPH
+ 0xFAAF: 0x5D27, //CJK UNIFIED IDEOGRAPH
+ 0xFAB0: 0x5D53, //CJK UNIFIED IDEOGRAPH
+ 0xFAB1: 0xFA11, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFAB2: 0x5D42, //CJK UNIFIED IDEOGRAPH
+ 0xFAB3: 0x5D6D, //CJK UNIFIED IDEOGRAPH
+ 0xFAB4: 0x5DB8, //CJK UNIFIED IDEOGRAPH
+ 0xFAB5: 0x5DB9, //CJK UNIFIED IDEOGRAPH
+ 0xFAB6: 0x5DD0, //CJK UNIFIED IDEOGRAPH
+ 0xFAB7: 0x5F21, //CJK UNIFIED IDEOGRAPH
+ 0xFAB8: 0x5F34, //CJK UNIFIED IDEOGRAPH
+ 0xFAB9: 0x5F67, //CJK UNIFIED IDEOGRAPH
+ 0xFABA: 0x5FB7, //CJK UNIFIED IDEOGRAPH
+ 0xFABB: 0x5FDE, //CJK UNIFIED IDEOGRAPH
+ 0xFABC: 0x605D, //CJK UNIFIED IDEOGRAPH
+ 0xFABD: 0x6085, //CJK UNIFIED IDEOGRAPH
+ 0xFABE: 0x608A, //CJK UNIFIED IDEOGRAPH
+ 0xFABF: 0x60DE, //CJK UNIFIED IDEOGRAPH
+ 0xFAC0: 0x60D5, //CJK UNIFIED IDEOGRAPH
+ 0xFAC1: 0x6120, //CJK UNIFIED IDEOGRAPH
+ 0xFAC2: 0x60F2, //CJK UNIFIED IDEOGRAPH
+ 0xFAC3: 0x6111, //CJK UNIFIED IDEOGRAPH
+ 0xFAC4: 0x6137, //CJK UNIFIED IDEOGRAPH
+ 0xFAC5: 0x6130, //CJK UNIFIED IDEOGRAPH
+ 0xFAC6: 0x6198, //CJK UNIFIED IDEOGRAPH
+ 0xFAC7: 0x6213, //CJK UNIFIED IDEOGRAPH
+ 0xFAC8: 0x62A6, //CJK UNIFIED IDEOGRAPH
+ 0xFAC9: 0x63F5, //CJK UNIFIED IDEOGRAPH
+ 0xFACA: 0x6460, //CJK UNIFIED IDEOGRAPH
+ 0xFACB: 0x649D, //CJK UNIFIED IDEOGRAPH
+ 0xFACC: 0x64CE, //CJK UNIFIED IDEOGRAPH
+ 0xFACD: 0x654E, //CJK UNIFIED IDEOGRAPH
+ 0xFACE: 0x6600, //CJK UNIFIED IDEOGRAPH
+ 0xFACF: 0x6615, //CJK UNIFIED IDEOGRAPH
+ 0xFAD0: 0x663B, //CJK UNIFIED IDEOGRAPH
+ 0xFAD1: 0x6609, //CJK UNIFIED IDEOGRAPH
+ 0xFAD2: 0x662E, //CJK UNIFIED IDEOGRAPH
+ 0xFAD3: 0x661E, //CJK UNIFIED IDEOGRAPH
+ 0xFAD4: 0x6624, //CJK UNIFIED IDEOGRAPH
+ 0xFAD5: 0x6665, //CJK UNIFIED IDEOGRAPH
+ 0xFAD6: 0x6657, //CJK UNIFIED IDEOGRAPH
+ 0xFAD7: 0x6659, //CJK UNIFIED IDEOGRAPH
+ 0xFAD8: 0xFA12, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFAD9: 0x6673, //CJK UNIFIED IDEOGRAPH
+ 0xFADA: 0x6699, //CJK UNIFIED IDEOGRAPH
+ 0xFADB: 0x66A0, //CJK UNIFIED IDEOGRAPH
+ 0xFADC: 0x66B2, //CJK UNIFIED IDEOGRAPH
+ 0xFADD: 0x66BF, //CJK UNIFIED IDEOGRAPH
+ 0xFADE: 0x66FA, //CJK UNIFIED IDEOGRAPH
+ 0xFADF: 0x670E, //CJK UNIFIED IDEOGRAPH
+ 0xFAE0: 0xF929, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFAE1: 0x6766, //CJK UNIFIED IDEOGRAPH
+ 0xFAE2: 0x67BB, //CJK UNIFIED IDEOGRAPH
+ 0xFAE3: 0x6852, //CJK UNIFIED IDEOGRAPH
+ 0xFAE4: 0x67C0, //CJK UNIFIED IDEOGRAPH
+ 0xFAE5: 0x6801, //CJK UNIFIED IDEOGRAPH
+ 0xFAE6: 0x6844, //CJK UNIFIED IDEOGRAPH
+ 0xFAE7: 0x68CF, //CJK UNIFIED IDEOGRAPH
+ 0xFAE8: 0xFA13, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFAE9: 0x6968, //CJK UNIFIED IDEOGRAPH
+ 0xFAEA: 0xFA14, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFAEB: 0x6998, //CJK UNIFIED IDEOGRAPH
+ 0xFAEC: 0x69E2, //CJK UNIFIED IDEOGRAPH
+ 0xFAED: 0x6A30, //CJK UNIFIED IDEOGRAPH
+ 0xFAEE: 0x6A6B, //CJK UNIFIED IDEOGRAPH
+ 0xFAEF: 0x6A46, //CJK UNIFIED IDEOGRAPH
+ 0xFAF0: 0x6A73, //CJK UNIFIED IDEOGRAPH
+ 0xFAF1: 0x6A7E, //CJK UNIFIED IDEOGRAPH
+ 0xFAF2: 0x6AE2, //CJK UNIFIED IDEOGRAPH
+ 0xFAF3: 0x6AE4, //CJK UNIFIED IDEOGRAPH
+ 0xFAF4: 0x6BD6, //CJK UNIFIED IDEOGRAPH
+ 0xFAF5: 0x6C3F, //CJK UNIFIED IDEOGRAPH
+ 0xFAF6: 0x6C5C, //CJK UNIFIED IDEOGRAPH
+ 0xFAF7: 0x6C86, //CJK UNIFIED IDEOGRAPH
+ 0xFAF8: 0x6C6F, //CJK UNIFIED IDEOGRAPH
+ 0xFAF9: 0x6CDA, //CJK UNIFIED IDEOGRAPH
+ 0xFAFA: 0x6D04, //CJK UNIFIED IDEOGRAPH
+ 0xFAFB: 0x6D87, //CJK UNIFIED IDEOGRAPH
+ 0xFAFC: 0x6D6F, //CJK UNIFIED IDEOGRAPH
+ 0xFB40: 0x6D96, //CJK UNIFIED IDEOGRAPH
+ 0xFB41: 0x6DAC, //CJK UNIFIED IDEOGRAPH
+ 0xFB42: 0x6DCF, //CJK UNIFIED IDEOGRAPH
+ 0xFB43: 0x6DF8, //CJK UNIFIED IDEOGRAPH
+ 0xFB44: 0x6DF2, //CJK UNIFIED IDEOGRAPH
+ 0xFB45: 0x6DFC, //CJK UNIFIED IDEOGRAPH
+ 0xFB46: 0x6E39, //CJK UNIFIED IDEOGRAPH
+ 0xFB47: 0x6E5C, //CJK UNIFIED IDEOGRAPH
+ 0xFB48: 0x6E27, //CJK UNIFIED IDEOGRAPH
+ 0xFB49: 0x6E3C, //CJK UNIFIED IDEOGRAPH
+ 0xFB4A: 0x6EBF, //CJK UNIFIED IDEOGRAPH
+ 0xFB4B: 0x6F88, //CJK UNIFIED IDEOGRAPH
+ 0xFB4C: 0x6FB5, //CJK UNIFIED IDEOGRAPH
+ 0xFB4D: 0x6FF5, //CJK UNIFIED IDEOGRAPH
+ 0xFB4E: 0x7005, //CJK UNIFIED IDEOGRAPH
+ 0xFB4F: 0x7007, //CJK UNIFIED IDEOGRAPH
+ 0xFB50: 0x7028, //CJK UNIFIED IDEOGRAPH
+ 0xFB51: 0x7085, //CJK UNIFIED IDEOGRAPH
+ 0xFB52: 0x70AB, //CJK UNIFIED IDEOGRAPH
+ 0xFB53: 0x710F, //CJK UNIFIED IDEOGRAPH
+ 0xFB54: 0x7104, //CJK UNIFIED IDEOGRAPH
+ 0xFB55: 0x715C, //CJK UNIFIED IDEOGRAPH
+ 0xFB56: 0x7146, //CJK UNIFIED IDEOGRAPH
+ 0xFB57: 0x7147, //CJK UNIFIED IDEOGRAPH
+ 0xFB58: 0xFA15, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB59: 0x71C1, //CJK UNIFIED IDEOGRAPH
+ 0xFB5A: 0x71FE, //CJK UNIFIED IDEOGRAPH
+ 0xFB5B: 0x72B1, //CJK UNIFIED IDEOGRAPH
+ 0xFB5C: 0x72BE, //CJK UNIFIED IDEOGRAPH
+ 0xFB5D: 0x7324, //CJK UNIFIED IDEOGRAPH
+ 0xFB5E: 0xFA16, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB5F: 0x7377, //CJK UNIFIED IDEOGRAPH
+ 0xFB60: 0x73BD, //CJK UNIFIED IDEOGRAPH
+ 0xFB61: 0x73C9, //CJK UNIFIED IDEOGRAPH
+ 0xFB62: 0x73D6, //CJK UNIFIED IDEOGRAPH
+ 0xFB63: 0x73E3, //CJK UNIFIED IDEOGRAPH
+ 0xFB64: 0x73D2, //CJK UNIFIED IDEOGRAPH
+ 0xFB65: 0x7407, //CJK UNIFIED IDEOGRAPH
+ 0xFB66: 0x73F5, //CJK UNIFIED IDEOGRAPH
+ 0xFB67: 0x7426, //CJK UNIFIED IDEOGRAPH
+ 0xFB68: 0x742A, //CJK UNIFIED IDEOGRAPH
+ 0xFB69: 0x7429, //CJK UNIFIED IDEOGRAPH
+ 0xFB6A: 0x742E, //CJK UNIFIED IDEOGRAPH
+ 0xFB6B: 0x7462, //CJK UNIFIED IDEOGRAPH
+ 0xFB6C: 0x7489, //CJK UNIFIED IDEOGRAPH
+ 0xFB6D: 0x749F, //CJK UNIFIED IDEOGRAPH
+ 0xFB6E: 0x7501, //CJK UNIFIED IDEOGRAPH
+ 0xFB6F: 0x756F, //CJK UNIFIED IDEOGRAPH
+ 0xFB70: 0x7682, //CJK UNIFIED IDEOGRAPH
+ 0xFB71: 0x769C, //CJK UNIFIED IDEOGRAPH
+ 0xFB72: 0x769E, //CJK UNIFIED IDEOGRAPH
+ 0xFB73: 0x769B, //CJK UNIFIED IDEOGRAPH
+ 0xFB74: 0x76A6, //CJK UNIFIED IDEOGRAPH
+ 0xFB75: 0xFA17, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB76: 0x7746, //CJK UNIFIED IDEOGRAPH
+ 0xFB77: 0x52AF, //CJK UNIFIED IDEOGRAPH
+ 0xFB78: 0x7821, //CJK UNIFIED IDEOGRAPH
+ 0xFB79: 0x784E, //CJK UNIFIED IDEOGRAPH
+ 0xFB7A: 0x7864, //CJK UNIFIED IDEOGRAPH
+ 0xFB7B: 0x787A, //CJK UNIFIED IDEOGRAPH
+ 0xFB7C: 0x7930, //CJK UNIFIED IDEOGRAPH
+ 0xFB7D: 0xFA18, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB7E: 0xFA19, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB80: 0xFA1A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB81: 0x7994, //CJK UNIFIED IDEOGRAPH
+ 0xFB82: 0xFA1B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB83: 0x799B, //CJK UNIFIED IDEOGRAPH
+ 0xFB84: 0x7AD1, //CJK UNIFIED IDEOGRAPH
+ 0xFB85: 0x7AE7, //CJK UNIFIED IDEOGRAPH
+ 0xFB86: 0xFA1C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB87: 0x7AEB, //CJK UNIFIED IDEOGRAPH
+ 0xFB88: 0x7B9E, //CJK UNIFIED IDEOGRAPH
+ 0xFB89: 0xFA1D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB8A: 0x7D48, //CJK UNIFIED IDEOGRAPH
+ 0xFB8B: 0x7D5C, //CJK UNIFIED IDEOGRAPH
+ 0xFB8C: 0x7DB7, //CJK UNIFIED IDEOGRAPH
+ 0xFB8D: 0x7DA0, //CJK UNIFIED IDEOGRAPH
+ 0xFB8E: 0x7DD6, //CJK UNIFIED IDEOGRAPH
+ 0xFB8F: 0x7E52, //CJK UNIFIED IDEOGRAPH
+ 0xFB90: 0x7F47, //CJK UNIFIED IDEOGRAPH
+ 0xFB91: 0x7FA1, //CJK UNIFIED IDEOGRAPH
+ 0xFB92: 0xFA1E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB93: 0x8301, //CJK UNIFIED IDEOGRAPH
+ 0xFB94: 0x8362, //CJK UNIFIED IDEOGRAPH
+ 0xFB95: 0x837F, //CJK UNIFIED IDEOGRAPH
+ 0xFB96: 0x83C7, //CJK UNIFIED IDEOGRAPH
+ 0xFB97: 0x83F6, //CJK UNIFIED IDEOGRAPH
+ 0xFB98: 0x8448, //CJK UNIFIED IDEOGRAPH
+ 0xFB99: 0x84B4, //CJK UNIFIED IDEOGRAPH
+ 0xFB9A: 0x8553, //CJK UNIFIED IDEOGRAPH
+ 0xFB9B: 0x8559, //CJK UNIFIED IDEOGRAPH
+ 0xFB9C: 0x856B, //CJK UNIFIED IDEOGRAPH
+ 0xFB9D: 0xFA1F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFB9E: 0x85B0, //CJK UNIFIED IDEOGRAPH
+ 0xFB9F: 0xFA20, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBA0: 0xFA21, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBA1: 0x8807, //CJK UNIFIED IDEOGRAPH
+ 0xFBA2: 0x88F5, //CJK UNIFIED IDEOGRAPH
+ 0xFBA3: 0x8A12, //CJK UNIFIED IDEOGRAPH
+ 0xFBA4: 0x8A37, //CJK UNIFIED IDEOGRAPH
+ 0xFBA5: 0x8A79, //CJK UNIFIED IDEOGRAPH
+ 0xFBA6: 0x8AA7, //CJK UNIFIED IDEOGRAPH
+ 0xFBA7: 0x8ABE, //CJK UNIFIED IDEOGRAPH
+ 0xFBA8: 0x8ADF, //CJK UNIFIED IDEOGRAPH
+ 0xFBA9: 0xFA22, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBAA: 0x8AF6, //CJK UNIFIED IDEOGRAPH
+ 0xFBAB: 0x8B53, //CJK UNIFIED IDEOGRAPH
+ 0xFBAC: 0x8B7F, //CJK UNIFIED IDEOGRAPH
+ 0xFBAD: 0x8CF0, //CJK UNIFIED IDEOGRAPH
+ 0xFBAE: 0x8CF4, //CJK UNIFIED IDEOGRAPH
+ 0xFBAF: 0x8D12, //CJK UNIFIED IDEOGRAPH
+ 0xFBB0: 0x8D76, //CJK UNIFIED IDEOGRAPH
+ 0xFBB1: 0xFA23, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBB2: 0x8ECF, //CJK UNIFIED IDEOGRAPH
+ 0xFBB3: 0xFA24, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBB4: 0xFA25, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBB5: 0x9067, //CJK UNIFIED IDEOGRAPH
+ 0xFBB6: 0x90DE, //CJK UNIFIED IDEOGRAPH
+ 0xFBB7: 0xFA26, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBB8: 0x9115, //CJK UNIFIED IDEOGRAPH
+ 0xFBB9: 0x9127, //CJK UNIFIED IDEOGRAPH
+ 0xFBBA: 0x91DA, //CJK UNIFIED IDEOGRAPH
+ 0xFBBB: 0x91D7, //CJK UNIFIED IDEOGRAPH
+ 0xFBBC: 0x91DE, //CJK UNIFIED IDEOGRAPH
+ 0xFBBD: 0x91ED, //CJK UNIFIED IDEOGRAPH
+ 0xFBBE: 0x91EE, //CJK UNIFIED IDEOGRAPH
+ 0xFBBF: 0x91E4, //CJK UNIFIED IDEOGRAPH
+ 0xFBC0: 0x91E5, //CJK UNIFIED IDEOGRAPH
+ 0xFBC1: 0x9206, //CJK UNIFIED IDEOGRAPH
+ 0xFBC2: 0x9210, //CJK UNIFIED IDEOGRAPH
+ 0xFBC3: 0x920A, //CJK UNIFIED IDEOGRAPH
+ 0xFBC4: 0x923A, //CJK UNIFIED IDEOGRAPH
+ 0xFBC5: 0x9240, //CJK UNIFIED IDEOGRAPH
+ 0xFBC6: 0x923C, //CJK UNIFIED IDEOGRAPH
+ 0xFBC7: 0x924E, //CJK UNIFIED IDEOGRAPH
+ 0xFBC8: 0x9259, //CJK UNIFIED IDEOGRAPH
+ 0xFBC9: 0x9251, //CJK UNIFIED IDEOGRAPH
+ 0xFBCA: 0x9239, //CJK UNIFIED IDEOGRAPH
+ 0xFBCB: 0x9267, //CJK UNIFIED IDEOGRAPH
+ 0xFBCC: 0x92A7, //CJK UNIFIED IDEOGRAPH
+ 0xFBCD: 0x9277, //CJK UNIFIED IDEOGRAPH
+ 0xFBCE: 0x9278, //CJK UNIFIED IDEOGRAPH
+ 0xFBCF: 0x92E7, //CJK UNIFIED IDEOGRAPH
+ 0xFBD0: 0x92D7, //CJK UNIFIED IDEOGRAPH
+ 0xFBD1: 0x92D9, //CJK UNIFIED IDEOGRAPH
+ 0xFBD2: 0x92D0, //CJK UNIFIED IDEOGRAPH
+ 0xFBD3: 0xFA27, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBD4: 0x92D5, //CJK UNIFIED IDEOGRAPH
+ 0xFBD5: 0x92E0, //CJK UNIFIED IDEOGRAPH
+ 0xFBD6: 0x92D3, //CJK UNIFIED IDEOGRAPH
+ 0xFBD7: 0x9325, //CJK UNIFIED IDEOGRAPH
+ 0xFBD8: 0x9321, //CJK UNIFIED IDEOGRAPH
+ 0xFBD9: 0x92FB, //CJK UNIFIED IDEOGRAPH
+ 0xFBDA: 0xFA28, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBDB: 0x931E, //CJK UNIFIED IDEOGRAPH
+ 0xFBDC: 0x92FF, //CJK UNIFIED IDEOGRAPH
+ 0xFBDD: 0x931D, //CJK UNIFIED IDEOGRAPH
+ 0xFBDE: 0x9302, //CJK UNIFIED IDEOGRAPH
+ 0xFBDF: 0x9370, //CJK UNIFIED IDEOGRAPH
+ 0xFBE0: 0x9357, //CJK UNIFIED IDEOGRAPH
+ 0xFBE1: 0x93A4, //CJK UNIFIED IDEOGRAPH
+ 0xFBE2: 0x93C6, //CJK UNIFIED IDEOGRAPH
+ 0xFBE3: 0x93DE, //CJK UNIFIED IDEOGRAPH
+ 0xFBE4: 0x93F8, //CJK UNIFIED IDEOGRAPH
+ 0xFBE5: 0x9431, //CJK UNIFIED IDEOGRAPH
+ 0xFBE6: 0x9445, //CJK UNIFIED IDEOGRAPH
+ 0xFBE7: 0x9448, //CJK UNIFIED IDEOGRAPH
+ 0xFBE8: 0x9592, //CJK UNIFIED IDEOGRAPH
+ 0xFBE9: 0xF9DC, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBEA: 0xFA29, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBEB: 0x969D, //CJK UNIFIED IDEOGRAPH
+ 0xFBEC: 0x96AF, //CJK UNIFIED IDEOGRAPH
+ 0xFBED: 0x9733, //CJK UNIFIED IDEOGRAPH
+ 0xFBEE: 0x973B, //CJK UNIFIED IDEOGRAPH
+ 0xFBEF: 0x9743, //CJK UNIFIED IDEOGRAPH
+ 0xFBF0: 0x974D, //CJK UNIFIED IDEOGRAPH
+ 0xFBF1: 0x974F, //CJK UNIFIED IDEOGRAPH
+ 0xFBF2: 0x9751, //CJK UNIFIED IDEOGRAPH
+ 0xFBF3: 0x9755, //CJK UNIFIED IDEOGRAPH
+ 0xFBF4: 0x9857, //CJK UNIFIED IDEOGRAPH
+ 0xFBF5: 0x9865, //CJK UNIFIED IDEOGRAPH
+ 0xFBF6: 0xFA2A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBF7: 0xFA2B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBF8: 0x9927, //CJK UNIFIED IDEOGRAPH
+ 0xFBF9: 0xFA2C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFBFA: 0x999E, //CJK UNIFIED IDEOGRAPH
+ 0xFBFB: 0x9A4E, //CJK UNIFIED IDEOGRAPH
+ 0xFBFC: 0x9AD9, //CJK UNIFIED IDEOGRAPH
+ 0xFC40: 0x9ADC, //CJK UNIFIED IDEOGRAPH
+ 0xFC41: 0x9B75, //CJK UNIFIED IDEOGRAPH
+ 0xFC42: 0x9B72, //CJK UNIFIED IDEOGRAPH
+ 0xFC43: 0x9B8F, //CJK UNIFIED IDEOGRAPH
+ 0xFC44: 0x9BB1, //CJK UNIFIED IDEOGRAPH
+ 0xFC45: 0x9BBB, //CJK UNIFIED IDEOGRAPH
+ 0xFC46: 0x9C00, //CJK UNIFIED IDEOGRAPH
+ 0xFC47: 0x9D70, //CJK UNIFIED IDEOGRAPH
+ 0xFC48: 0x9D6B, //CJK UNIFIED IDEOGRAPH
+ 0xFC49: 0xFA2D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFC4A: 0x9E19, //CJK UNIFIED IDEOGRAPH
+ 0xFC4B: 0x9ED1, //CJK UNIFIED IDEOGRAPH
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp936.go b/vendor/github.com/denisenkom/go-mssqldb/cp936.go
new file mode 100644
index 000000000..fca5da76d
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp936.go
@@ -0,0 +1,22055 @@
+package mssql
+
+var cp936 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0x20AC, //EURO SIGN
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ 0xFFFD, //UNDEFINED
+ },
+ db: map[int]rune{
+ 0x8140: 0x4E02, //CJK UNIFIED IDEOGRAPH
+ 0x8141: 0x4E04, //CJK UNIFIED IDEOGRAPH
+ 0x8142: 0x4E05, //CJK UNIFIED IDEOGRAPH
+ 0x8143: 0x4E06, //CJK UNIFIED IDEOGRAPH
+ 0x8144: 0x4E0F, //CJK UNIFIED IDEOGRAPH
+ 0x8145: 0x4E12, //CJK UNIFIED IDEOGRAPH
+ 0x8146: 0x4E17, //CJK UNIFIED IDEOGRAPH
+ 0x8147: 0x4E1F, //CJK UNIFIED IDEOGRAPH
+ 0x8148: 0x4E20, //CJK UNIFIED IDEOGRAPH
+ 0x8149: 0x4E21, //CJK UNIFIED IDEOGRAPH
+ 0x814A: 0x4E23, //CJK UNIFIED IDEOGRAPH
+ 0x814B: 0x4E26, //CJK UNIFIED IDEOGRAPH
+ 0x814C: 0x4E29, //CJK UNIFIED IDEOGRAPH
+ 0x814D: 0x4E2E, //CJK UNIFIED IDEOGRAPH
+ 0x814E: 0x4E2F, //CJK UNIFIED IDEOGRAPH
+ 0x814F: 0x4E31, //CJK UNIFIED IDEOGRAPH
+ 0x8150: 0x4E33, //CJK UNIFIED IDEOGRAPH
+ 0x8151: 0x4E35, //CJK UNIFIED IDEOGRAPH
+ 0x8152: 0x4E37, //CJK UNIFIED IDEOGRAPH
+ 0x8153: 0x4E3C, //CJK UNIFIED IDEOGRAPH
+ 0x8154: 0x4E40, //CJK UNIFIED IDEOGRAPH
+ 0x8155: 0x4E41, //CJK UNIFIED IDEOGRAPH
+ 0x8156: 0x4E42, //CJK UNIFIED IDEOGRAPH
+ 0x8157: 0x4E44, //CJK UNIFIED IDEOGRAPH
+ 0x8158: 0x4E46, //CJK UNIFIED IDEOGRAPH
+ 0x8159: 0x4E4A, //CJK UNIFIED IDEOGRAPH
+ 0x815A: 0x4E51, //CJK UNIFIED IDEOGRAPH
+ 0x815B: 0x4E55, //CJK UNIFIED IDEOGRAPH
+ 0x815C: 0x4E57, //CJK UNIFIED IDEOGRAPH
+ 0x815D: 0x4E5A, //CJK UNIFIED IDEOGRAPH
+ 0x815E: 0x4E5B, //CJK UNIFIED IDEOGRAPH
+ 0x815F: 0x4E62, //CJK UNIFIED IDEOGRAPH
+ 0x8160: 0x4E63, //CJK UNIFIED IDEOGRAPH
+ 0x8161: 0x4E64, //CJK UNIFIED IDEOGRAPH
+ 0x8162: 0x4E65, //CJK UNIFIED IDEOGRAPH
+ 0x8163: 0x4E67, //CJK UNIFIED IDEOGRAPH
+ 0x8164: 0x4E68, //CJK UNIFIED IDEOGRAPH
+ 0x8165: 0x4E6A, //CJK UNIFIED IDEOGRAPH
+ 0x8166: 0x4E6B, //CJK UNIFIED IDEOGRAPH
+ 0x8167: 0x4E6C, //CJK UNIFIED IDEOGRAPH
+ 0x8168: 0x4E6D, //CJK UNIFIED IDEOGRAPH
+ 0x8169: 0x4E6E, //CJK UNIFIED IDEOGRAPH
+ 0x816A: 0x4E6F, //CJK UNIFIED IDEOGRAPH
+ 0x816B: 0x4E72, //CJK UNIFIED IDEOGRAPH
+ 0x816C: 0x4E74, //CJK UNIFIED IDEOGRAPH
+ 0x816D: 0x4E75, //CJK UNIFIED IDEOGRAPH
+ 0x816E: 0x4E76, //CJK UNIFIED IDEOGRAPH
+ 0x816F: 0x4E77, //CJK UNIFIED IDEOGRAPH
+ 0x8170: 0x4E78, //CJK UNIFIED IDEOGRAPH
+ 0x8171: 0x4E79, //CJK UNIFIED IDEOGRAPH
+ 0x8172: 0x4E7A, //CJK UNIFIED IDEOGRAPH
+ 0x8173: 0x4E7B, //CJK UNIFIED IDEOGRAPH
+ 0x8174: 0x4E7C, //CJK UNIFIED IDEOGRAPH
+ 0x8175: 0x4E7D, //CJK UNIFIED IDEOGRAPH
+ 0x8176: 0x4E7F, //CJK UNIFIED IDEOGRAPH
+ 0x8177: 0x4E80, //CJK UNIFIED IDEOGRAPH
+ 0x8178: 0x4E81, //CJK UNIFIED IDEOGRAPH
+ 0x8179: 0x4E82, //CJK UNIFIED IDEOGRAPH
+ 0x817A: 0x4E83, //CJK UNIFIED IDEOGRAPH
+ 0x817B: 0x4E84, //CJK UNIFIED IDEOGRAPH
+ 0x817C: 0x4E85, //CJK UNIFIED IDEOGRAPH
+ 0x817D: 0x4E87, //CJK UNIFIED IDEOGRAPH
+ 0x817E: 0x4E8A, //CJK UNIFIED IDEOGRAPH
+ 0x8180: 0x4E90, //CJK UNIFIED IDEOGRAPH
+ 0x8181: 0x4E96, //CJK UNIFIED IDEOGRAPH
+ 0x8182: 0x4E97, //CJK UNIFIED IDEOGRAPH
+ 0x8183: 0x4E99, //CJK UNIFIED IDEOGRAPH
+ 0x8184: 0x4E9C, //CJK UNIFIED IDEOGRAPH
+ 0x8185: 0x4E9D, //CJK UNIFIED IDEOGRAPH
+ 0x8186: 0x4E9E, //CJK UNIFIED IDEOGRAPH
+ 0x8187: 0x4EA3, //CJK UNIFIED IDEOGRAPH
+ 0x8188: 0x4EAA, //CJK UNIFIED IDEOGRAPH
+ 0x8189: 0x4EAF, //CJK UNIFIED IDEOGRAPH
+ 0x818A: 0x4EB0, //CJK UNIFIED IDEOGRAPH
+ 0x818B: 0x4EB1, //CJK UNIFIED IDEOGRAPH
+ 0x818C: 0x4EB4, //CJK UNIFIED IDEOGRAPH
+ 0x818D: 0x4EB6, //CJK UNIFIED IDEOGRAPH
+ 0x818E: 0x4EB7, //CJK UNIFIED IDEOGRAPH
+ 0x818F: 0x4EB8, //CJK UNIFIED IDEOGRAPH
+ 0x8190: 0x4EB9, //CJK UNIFIED IDEOGRAPH
+ 0x8191: 0x4EBC, //CJK UNIFIED IDEOGRAPH
+ 0x8192: 0x4EBD, //CJK UNIFIED IDEOGRAPH
+ 0x8193: 0x4EBE, //CJK UNIFIED IDEOGRAPH
+ 0x8194: 0x4EC8, //CJK UNIFIED IDEOGRAPH
+ 0x8195: 0x4ECC, //CJK UNIFIED IDEOGRAPH
+ 0x8196: 0x4ECF, //CJK UNIFIED IDEOGRAPH
+ 0x8197: 0x4ED0, //CJK UNIFIED IDEOGRAPH
+ 0x8198: 0x4ED2, //CJK UNIFIED IDEOGRAPH
+ 0x8199: 0x4EDA, //CJK UNIFIED IDEOGRAPH
+ 0x819A: 0x4EDB, //CJK UNIFIED IDEOGRAPH
+ 0x819B: 0x4EDC, //CJK UNIFIED IDEOGRAPH
+ 0x819C: 0x4EE0, //CJK UNIFIED IDEOGRAPH
+ 0x819D: 0x4EE2, //CJK UNIFIED IDEOGRAPH
+ 0x819E: 0x4EE6, //CJK UNIFIED IDEOGRAPH
+ 0x819F: 0x4EE7, //CJK UNIFIED IDEOGRAPH
+ 0x81A0: 0x4EE9, //CJK UNIFIED IDEOGRAPH
+ 0x81A1: 0x4EED, //CJK UNIFIED IDEOGRAPH
+ 0x81A2: 0x4EEE, //CJK UNIFIED IDEOGRAPH
+ 0x81A3: 0x4EEF, //CJK UNIFIED IDEOGRAPH
+ 0x81A4: 0x4EF1, //CJK UNIFIED IDEOGRAPH
+ 0x81A5: 0x4EF4, //CJK UNIFIED IDEOGRAPH
+ 0x81A6: 0x4EF8, //CJK UNIFIED IDEOGRAPH
+ 0x81A7: 0x4EF9, //CJK UNIFIED IDEOGRAPH
+ 0x81A8: 0x4EFA, //CJK UNIFIED IDEOGRAPH
+ 0x81A9: 0x4EFC, //CJK UNIFIED IDEOGRAPH
+ 0x81AA: 0x4EFE, //CJK UNIFIED IDEOGRAPH
+ 0x81AB: 0x4F00, //CJK UNIFIED IDEOGRAPH
+ 0x81AC: 0x4F02, //CJK UNIFIED IDEOGRAPH
+ 0x81AD: 0x4F03, //CJK UNIFIED IDEOGRAPH
+ 0x81AE: 0x4F04, //CJK UNIFIED IDEOGRAPH
+ 0x81AF: 0x4F05, //CJK UNIFIED IDEOGRAPH
+ 0x81B0: 0x4F06, //CJK UNIFIED IDEOGRAPH
+ 0x81B1: 0x4F07, //CJK UNIFIED IDEOGRAPH
+ 0x81B2: 0x4F08, //CJK UNIFIED IDEOGRAPH
+ 0x81B3: 0x4F0B, //CJK UNIFIED IDEOGRAPH
+ 0x81B4: 0x4F0C, //CJK UNIFIED IDEOGRAPH
+ 0x81B5: 0x4F12, //CJK UNIFIED IDEOGRAPH
+ 0x81B6: 0x4F13, //CJK UNIFIED IDEOGRAPH
+ 0x81B7: 0x4F14, //CJK UNIFIED IDEOGRAPH
+ 0x81B8: 0x4F15, //CJK UNIFIED IDEOGRAPH
+ 0x81B9: 0x4F16, //CJK UNIFIED IDEOGRAPH
+ 0x81BA: 0x4F1C, //CJK UNIFIED IDEOGRAPH
+ 0x81BB: 0x4F1D, //CJK UNIFIED IDEOGRAPH
+ 0x81BC: 0x4F21, //CJK UNIFIED IDEOGRAPH
+ 0x81BD: 0x4F23, //CJK UNIFIED IDEOGRAPH
+ 0x81BE: 0x4F28, //CJK UNIFIED IDEOGRAPH
+ 0x81BF: 0x4F29, //CJK UNIFIED IDEOGRAPH
+ 0x81C0: 0x4F2C, //CJK UNIFIED IDEOGRAPH
+ 0x81C1: 0x4F2D, //CJK UNIFIED IDEOGRAPH
+ 0x81C2: 0x4F2E, //CJK UNIFIED IDEOGRAPH
+ 0x81C3: 0x4F31, //CJK UNIFIED IDEOGRAPH
+ 0x81C4: 0x4F33, //CJK UNIFIED IDEOGRAPH
+ 0x81C5: 0x4F35, //CJK UNIFIED IDEOGRAPH
+ 0x81C6: 0x4F37, //CJK UNIFIED IDEOGRAPH
+ 0x81C7: 0x4F39, //CJK UNIFIED IDEOGRAPH
+ 0x81C8: 0x4F3B, //CJK UNIFIED IDEOGRAPH
+ 0x81C9: 0x4F3E, //CJK UNIFIED IDEOGRAPH
+ 0x81CA: 0x4F3F, //CJK UNIFIED IDEOGRAPH
+ 0x81CB: 0x4F40, //CJK UNIFIED IDEOGRAPH
+ 0x81CC: 0x4F41, //CJK UNIFIED IDEOGRAPH
+ 0x81CD: 0x4F42, //CJK UNIFIED IDEOGRAPH
+ 0x81CE: 0x4F44, //CJK UNIFIED IDEOGRAPH
+ 0x81CF: 0x4F45, //CJK UNIFIED IDEOGRAPH
+ 0x81D0: 0x4F47, //CJK UNIFIED IDEOGRAPH
+ 0x81D1: 0x4F48, //CJK UNIFIED IDEOGRAPH
+ 0x81D2: 0x4F49, //CJK UNIFIED IDEOGRAPH
+ 0x81D3: 0x4F4A, //CJK UNIFIED IDEOGRAPH
+ 0x81D4: 0x4F4B, //CJK UNIFIED IDEOGRAPH
+ 0x81D5: 0x4F4C, //CJK UNIFIED IDEOGRAPH
+ 0x81D6: 0x4F52, //CJK UNIFIED IDEOGRAPH
+ 0x81D7: 0x4F54, //CJK UNIFIED IDEOGRAPH
+ 0x81D8: 0x4F56, //CJK UNIFIED IDEOGRAPH
+ 0x81D9: 0x4F61, //CJK UNIFIED IDEOGRAPH
+ 0x81DA: 0x4F62, //CJK UNIFIED IDEOGRAPH
+ 0x81DB: 0x4F66, //CJK UNIFIED IDEOGRAPH
+ 0x81DC: 0x4F68, //CJK UNIFIED IDEOGRAPH
+ 0x81DD: 0x4F6A, //CJK UNIFIED IDEOGRAPH
+ 0x81DE: 0x4F6B, //CJK UNIFIED IDEOGRAPH
+ 0x81DF: 0x4F6D, //CJK UNIFIED IDEOGRAPH
+ 0x81E0: 0x4F6E, //CJK UNIFIED IDEOGRAPH
+ 0x81E1: 0x4F71, //CJK UNIFIED IDEOGRAPH
+ 0x81E2: 0x4F72, //CJK UNIFIED IDEOGRAPH
+ 0x81E3: 0x4F75, //CJK UNIFIED IDEOGRAPH
+ 0x81E4: 0x4F77, //CJK UNIFIED IDEOGRAPH
+ 0x81E5: 0x4F78, //CJK UNIFIED IDEOGRAPH
+ 0x81E6: 0x4F79, //CJK UNIFIED IDEOGRAPH
+ 0x81E7: 0x4F7A, //CJK UNIFIED IDEOGRAPH
+ 0x81E8: 0x4F7D, //CJK UNIFIED IDEOGRAPH
+ 0x81E9: 0x4F80, //CJK UNIFIED IDEOGRAPH
+ 0x81EA: 0x4F81, //CJK UNIFIED IDEOGRAPH
+ 0x81EB: 0x4F82, //CJK UNIFIED IDEOGRAPH
+ 0x81EC: 0x4F85, //CJK UNIFIED IDEOGRAPH
+ 0x81ED: 0x4F86, //CJK UNIFIED IDEOGRAPH
+ 0x81EE: 0x4F87, //CJK UNIFIED IDEOGRAPH
+ 0x81EF: 0x4F8A, //CJK UNIFIED IDEOGRAPH
+ 0x81F0: 0x4F8C, //CJK UNIFIED IDEOGRAPH
+ 0x81F1: 0x4F8E, //CJK UNIFIED IDEOGRAPH
+ 0x81F2: 0x4F90, //CJK UNIFIED IDEOGRAPH
+ 0x81F3: 0x4F92, //CJK UNIFIED IDEOGRAPH
+ 0x81F4: 0x4F93, //CJK UNIFIED IDEOGRAPH
+ 0x81F5: 0x4F95, //CJK UNIFIED IDEOGRAPH
+ 0x81F6: 0x4F96, //CJK UNIFIED IDEOGRAPH
+ 0x81F7: 0x4F98, //CJK UNIFIED IDEOGRAPH
+ 0x81F8: 0x4F99, //CJK UNIFIED IDEOGRAPH
+ 0x81F9: 0x4F9A, //CJK UNIFIED IDEOGRAPH
+ 0x81FA: 0x4F9C, //CJK UNIFIED IDEOGRAPH
+ 0x81FB: 0x4F9E, //CJK UNIFIED IDEOGRAPH
+ 0x81FC: 0x4F9F, //CJK UNIFIED IDEOGRAPH
+ 0x81FD: 0x4FA1, //CJK UNIFIED IDEOGRAPH
+ 0x81FE: 0x4FA2, //CJK UNIFIED IDEOGRAPH
+ 0x8240: 0x4FA4, //CJK UNIFIED IDEOGRAPH
+ 0x8241: 0x4FAB, //CJK UNIFIED IDEOGRAPH
+ 0x8242: 0x4FAD, //CJK UNIFIED IDEOGRAPH
+ 0x8243: 0x4FB0, //CJK UNIFIED IDEOGRAPH
+ 0x8244: 0x4FB1, //CJK UNIFIED IDEOGRAPH
+ 0x8245: 0x4FB2, //CJK UNIFIED IDEOGRAPH
+ 0x8246: 0x4FB3, //CJK UNIFIED IDEOGRAPH
+ 0x8247: 0x4FB4, //CJK UNIFIED IDEOGRAPH
+ 0x8248: 0x4FB6, //CJK UNIFIED IDEOGRAPH
+ 0x8249: 0x4FB7, //CJK UNIFIED IDEOGRAPH
+ 0x824A: 0x4FB8, //CJK UNIFIED IDEOGRAPH
+ 0x824B: 0x4FB9, //CJK UNIFIED IDEOGRAPH
+ 0x824C: 0x4FBA, //CJK UNIFIED IDEOGRAPH
+ 0x824D: 0x4FBB, //CJK UNIFIED IDEOGRAPH
+ 0x824E: 0x4FBC, //CJK UNIFIED IDEOGRAPH
+ 0x824F: 0x4FBD, //CJK UNIFIED IDEOGRAPH
+ 0x8250: 0x4FBE, //CJK UNIFIED IDEOGRAPH
+ 0x8251: 0x4FC0, //CJK UNIFIED IDEOGRAPH
+ 0x8252: 0x4FC1, //CJK UNIFIED IDEOGRAPH
+ 0x8253: 0x4FC2, //CJK UNIFIED IDEOGRAPH
+ 0x8254: 0x4FC6, //CJK UNIFIED IDEOGRAPH
+ 0x8255: 0x4FC7, //CJK UNIFIED IDEOGRAPH
+ 0x8256: 0x4FC8, //CJK UNIFIED IDEOGRAPH
+ 0x8257: 0x4FC9, //CJK UNIFIED IDEOGRAPH
+ 0x8258: 0x4FCB, //CJK UNIFIED IDEOGRAPH
+ 0x8259: 0x4FCC, //CJK UNIFIED IDEOGRAPH
+ 0x825A: 0x4FCD, //CJK UNIFIED IDEOGRAPH
+ 0x825B: 0x4FD2, //CJK UNIFIED IDEOGRAPH
+ 0x825C: 0x4FD3, //CJK UNIFIED IDEOGRAPH
+ 0x825D: 0x4FD4, //CJK UNIFIED IDEOGRAPH
+ 0x825E: 0x4FD5, //CJK UNIFIED IDEOGRAPH
+ 0x825F: 0x4FD6, //CJK UNIFIED IDEOGRAPH
+ 0x8260: 0x4FD9, //CJK UNIFIED IDEOGRAPH
+ 0x8261: 0x4FDB, //CJK UNIFIED IDEOGRAPH
+ 0x8262: 0x4FE0, //CJK UNIFIED IDEOGRAPH
+ 0x8263: 0x4FE2, //CJK UNIFIED IDEOGRAPH
+ 0x8264: 0x4FE4, //CJK UNIFIED IDEOGRAPH
+ 0x8265: 0x4FE5, //CJK UNIFIED IDEOGRAPH
+ 0x8266: 0x4FE7, //CJK UNIFIED IDEOGRAPH
+ 0x8267: 0x4FEB, //CJK UNIFIED IDEOGRAPH
+ 0x8268: 0x4FEC, //CJK UNIFIED IDEOGRAPH
+ 0x8269: 0x4FF0, //CJK UNIFIED IDEOGRAPH
+ 0x826A: 0x4FF2, //CJK UNIFIED IDEOGRAPH
+ 0x826B: 0x4FF4, //CJK UNIFIED IDEOGRAPH
+ 0x826C: 0x4FF5, //CJK UNIFIED IDEOGRAPH
+ 0x826D: 0x4FF6, //CJK UNIFIED IDEOGRAPH
+ 0x826E: 0x4FF7, //CJK UNIFIED IDEOGRAPH
+ 0x826F: 0x4FF9, //CJK UNIFIED IDEOGRAPH
+ 0x8270: 0x4FFB, //CJK UNIFIED IDEOGRAPH
+ 0x8271: 0x4FFC, //CJK UNIFIED IDEOGRAPH
+ 0x8272: 0x4FFD, //CJK UNIFIED IDEOGRAPH
+ 0x8273: 0x4FFF, //CJK UNIFIED IDEOGRAPH
+ 0x8274: 0x5000, //CJK UNIFIED IDEOGRAPH
+ 0x8275: 0x5001, //CJK UNIFIED IDEOGRAPH
+ 0x8276: 0x5002, //CJK UNIFIED IDEOGRAPH
+ 0x8277: 0x5003, //CJK UNIFIED IDEOGRAPH
+ 0x8278: 0x5004, //CJK UNIFIED IDEOGRAPH
+ 0x8279: 0x5005, //CJK UNIFIED IDEOGRAPH
+ 0x827A: 0x5006, //CJK UNIFIED IDEOGRAPH
+ 0x827B: 0x5007, //CJK UNIFIED IDEOGRAPH
+ 0x827C: 0x5008, //CJK UNIFIED IDEOGRAPH
+ 0x827D: 0x5009, //CJK UNIFIED IDEOGRAPH
+ 0x827E: 0x500A, //CJK UNIFIED IDEOGRAPH
+ 0x8280: 0x500B, //CJK UNIFIED IDEOGRAPH
+ 0x8281: 0x500E, //CJK UNIFIED IDEOGRAPH
+ 0x8282: 0x5010, //CJK UNIFIED IDEOGRAPH
+ 0x8283: 0x5011, //CJK UNIFIED IDEOGRAPH
+ 0x8284: 0x5013, //CJK UNIFIED IDEOGRAPH
+ 0x8285: 0x5015, //CJK UNIFIED IDEOGRAPH
+ 0x8286: 0x5016, //CJK UNIFIED IDEOGRAPH
+ 0x8287: 0x5017, //CJK UNIFIED IDEOGRAPH
+ 0x8288: 0x501B, //CJK UNIFIED IDEOGRAPH
+ 0x8289: 0x501D, //CJK UNIFIED IDEOGRAPH
+ 0x828A: 0x501E, //CJK UNIFIED IDEOGRAPH
+ 0x828B: 0x5020, //CJK UNIFIED IDEOGRAPH
+ 0x828C: 0x5022, //CJK UNIFIED IDEOGRAPH
+ 0x828D: 0x5023, //CJK UNIFIED IDEOGRAPH
+ 0x828E: 0x5024, //CJK UNIFIED IDEOGRAPH
+ 0x828F: 0x5027, //CJK UNIFIED IDEOGRAPH
+ 0x8290: 0x502B, //CJK UNIFIED IDEOGRAPH
+ 0x8291: 0x502F, //CJK UNIFIED IDEOGRAPH
+ 0x8292: 0x5030, //CJK UNIFIED IDEOGRAPH
+ 0x8293: 0x5031, //CJK UNIFIED IDEOGRAPH
+ 0x8294: 0x5032, //CJK UNIFIED IDEOGRAPH
+ 0x8295: 0x5033, //CJK UNIFIED IDEOGRAPH
+ 0x8296: 0x5034, //CJK UNIFIED IDEOGRAPH
+ 0x8297: 0x5035, //CJK UNIFIED IDEOGRAPH
+ 0x8298: 0x5036, //CJK UNIFIED IDEOGRAPH
+ 0x8299: 0x5037, //CJK UNIFIED IDEOGRAPH
+ 0x829A: 0x5038, //CJK UNIFIED IDEOGRAPH
+ 0x829B: 0x5039, //CJK UNIFIED IDEOGRAPH
+ 0x829C: 0x503B, //CJK UNIFIED IDEOGRAPH
+ 0x829D: 0x503D, //CJK UNIFIED IDEOGRAPH
+ 0x829E: 0x503F, //CJK UNIFIED IDEOGRAPH
+ 0x829F: 0x5040, //CJK UNIFIED IDEOGRAPH
+ 0x82A0: 0x5041, //CJK UNIFIED IDEOGRAPH
+ 0x82A1: 0x5042, //CJK UNIFIED IDEOGRAPH
+ 0x82A2: 0x5044, //CJK UNIFIED IDEOGRAPH
+ 0x82A3: 0x5045, //CJK UNIFIED IDEOGRAPH
+ 0x82A4: 0x5046, //CJK UNIFIED IDEOGRAPH
+ 0x82A5: 0x5049, //CJK UNIFIED IDEOGRAPH
+ 0x82A6: 0x504A, //CJK UNIFIED IDEOGRAPH
+ 0x82A7: 0x504B, //CJK UNIFIED IDEOGRAPH
+ 0x82A8: 0x504D, //CJK UNIFIED IDEOGRAPH
+ 0x82A9: 0x5050, //CJK UNIFIED IDEOGRAPH
+ 0x82AA: 0x5051, //CJK UNIFIED IDEOGRAPH
+ 0x82AB: 0x5052, //CJK UNIFIED IDEOGRAPH
+ 0x82AC: 0x5053, //CJK UNIFIED IDEOGRAPH
+ 0x82AD: 0x5054, //CJK UNIFIED IDEOGRAPH
+ 0x82AE: 0x5056, //CJK UNIFIED IDEOGRAPH
+ 0x82AF: 0x5057, //CJK UNIFIED IDEOGRAPH
+ 0x82B0: 0x5058, //CJK UNIFIED IDEOGRAPH
+ 0x82B1: 0x5059, //CJK UNIFIED IDEOGRAPH
+ 0x82B2: 0x505B, //CJK UNIFIED IDEOGRAPH
+ 0x82B3: 0x505D, //CJK UNIFIED IDEOGRAPH
+ 0x82B4: 0x505E, //CJK UNIFIED IDEOGRAPH
+ 0x82B5: 0x505F, //CJK UNIFIED IDEOGRAPH
+ 0x82B6: 0x5060, //CJK UNIFIED IDEOGRAPH
+ 0x82B7: 0x5061, //CJK UNIFIED IDEOGRAPH
+ 0x82B8: 0x5062, //CJK UNIFIED IDEOGRAPH
+ 0x82B9: 0x5063, //CJK UNIFIED IDEOGRAPH
+ 0x82BA: 0x5064, //CJK UNIFIED IDEOGRAPH
+ 0x82BB: 0x5066, //CJK UNIFIED IDEOGRAPH
+ 0x82BC: 0x5067, //CJK UNIFIED IDEOGRAPH
+ 0x82BD: 0x5068, //CJK UNIFIED IDEOGRAPH
+ 0x82BE: 0x5069, //CJK UNIFIED IDEOGRAPH
+ 0x82BF: 0x506A, //CJK UNIFIED IDEOGRAPH
+ 0x82C0: 0x506B, //CJK UNIFIED IDEOGRAPH
+ 0x82C1: 0x506D, //CJK UNIFIED IDEOGRAPH
+ 0x82C2: 0x506E, //CJK UNIFIED IDEOGRAPH
+ 0x82C3: 0x506F, //CJK UNIFIED IDEOGRAPH
+ 0x82C4: 0x5070, //CJK UNIFIED IDEOGRAPH
+ 0x82C5: 0x5071, //CJK UNIFIED IDEOGRAPH
+ 0x82C6: 0x5072, //CJK UNIFIED IDEOGRAPH
+ 0x82C7: 0x5073, //CJK UNIFIED IDEOGRAPH
+ 0x82C8: 0x5074, //CJK UNIFIED IDEOGRAPH
+ 0x82C9: 0x5075, //CJK UNIFIED IDEOGRAPH
+ 0x82CA: 0x5078, //CJK UNIFIED IDEOGRAPH
+ 0x82CB: 0x5079, //CJK UNIFIED IDEOGRAPH
+ 0x82CC: 0x507A, //CJK UNIFIED IDEOGRAPH
+ 0x82CD: 0x507C, //CJK UNIFIED IDEOGRAPH
+ 0x82CE: 0x507D, //CJK UNIFIED IDEOGRAPH
+ 0x82CF: 0x5081, //CJK UNIFIED IDEOGRAPH
+ 0x82D0: 0x5082, //CJK UNIFIED IDEOGRAPH
+ 0x82D1: 0x5083, //CJK UNIFIED IDEOGRAPH
+ 0x82D2: 0x5084, //CJK UNIFIED IDEOGRAPH
+ 0x82D3: 0x5086, //CJK UNIFIED IDEOGRAPH
+ 0x82D4: 0x5087, //CJK UNIFIED IDEOGRAPH
+ 0x82D5: 0x5089, //CJK UNIFIED IDEOGRAPH
+ 0x82D6: 0x508A, //CJK UNIFIED IDEOGRAPH
+ 0x82D7: 0x508B, //CJK UNIFIED IDEOGRAPH
+ 0x82D8: 0x508C, //CJK UNIFIED IDEOGRAPH
+ 0x82D9: 0x508E, //CJK UNIFIED IDEOGRAPH
+ 0x82DA: 0x508F, //CJK UNIFIED IDEOGRAPH
+ 0x82DB: 0x5090, //CJK UNIFIED IDEOGRAPH
+ 0x82DC: 0x5091, //CJK UNIFIED IDEOGRAPH
+ 0x82DD: 0x5092, //CJK UNIFIED IDEOGRAPH
+ 0x82DE: 0x5093, //CJK UNIFIED IDEOGRAPH
+ 0x82DF: 0x5094, //CJK UNIFIED IDEOGRAPH
+ 0x82E0: 0x5095, //CJK UNIFIED IDEOGRAPH
+ 0x82E1: 0x5096, //CJK UNIFIED IDEOGRAPH
+ 0x82E2: 0x5097, //CJK UNIFIED IDEOGRAPH
+ 0x82E3: 0x5098, //CJK UNIFIED IDEOGRAPH
+ 0x82E4: 0x5099, //CJK UNIFIED IDEOGRAPH
+ 0x82E5: 0x509A, //CJK UNIFIED IDEOGRAPH
+ 0x82E6: 0x509B, //CJK UNIFIED IDEOGRAPH
+ 0x82E7: 0x509C, //CJK UNIFIED IDEOGRAPH
+ 0x82E8: 0x509D, //CJK UNIFIED IDEOGRAPH
+ 0x82E9: 0x509E, //CJK UNIFIED IDEOGRAPH
+ 0x82EA: 0x509F, //CJK UNIFIED IDEOGRAPH
+ 0x82EB: 0x50A0, //CJK UNIFIED IDEOGRAPH
+ 0x82EC: 0x50A1, //CJK UNIFIED IDEOGRAPH
+ 0x82ED: 0x50A2, //CJK UNIFIED IDEOGRAPH
+ 0x82EE: 0x50A4, //CJK UNIFIED IDEOGRAPH
+ 0x82EF: 0x50A6, //CJK UNIFIED IDEOGRAPH
+ 0x82F0: 0x50AA, //CJK UNIFIED IDEOGRAPH
+ 0x82F1: 0x50AB, //CJK UNIFIED IDEOGRAPH
+ 0x82F2: 0x50AD, //CJK UNIFIED IDEOGRAPH
+ 0x82F3: 0x50AE, //CJK UNIFIED IDEOGRAPH
+ 0x82F4: 0x50AF, //CJK UNIFIED IDEOGRAPH
+ 0x82F5: 0x50B0, //CJK UNIFIED IDEOGRAPH
+ 0x82F6: 0x50B1, //CJK UNIFIED IDEOGRAPH
+ 0x82F7: 0x50B3, //CJK UNIFIED IDEOGRAPH
+ 0x82F8: 0x50B4, //CJK UNIFIED IDEOGRAPH
+ 0x82F9: 0x50B5, //CJK UNIFIED IDEOGRAPH
+ 0x82FA: 0x50B6, //CJK UNIFIED IDEOGRAPH
+ 0x82FB: 0x50B7, //CJK UNIFIED IDEOGRAPH
+ 0x82FC: 0x50B8, //CJK UNIFIED IDEOGRAPH
+ 0x82FD: 0x50B9, //CJK UNIFIED IDEOGRAPH
+ 0x82FE: 0x50BC, //CJK UNIFIED IDEOGRAPH
+ 0x8340: 0x50BD, //CJK UNIFIED IDEOGRAPH
+ 0x8341: 0x50BE, //CJK UNIFIED IDEOGRAPH
+ 0x8342: 0x50BF, //CJK UNIFIED IDEOGRAPH
+ 0x8343: 0x50C0, //CJK UNIFIED IDEOGRAPH
+ 0x8344: 0x50C1, //CJK UNIFIED IDEOGRAPH
+ 0x8345: 0x50C2, //CJK UNIFIED IDEOGRAPH
+ 0x8346: 0x50C3, //CJK UNIFIED IDEOGRAPH
+ 0x8347: 0x50C4, //CJK UNIFIED IDEOGRAPH
+ 0x8348: 0x50C5, //CJK UNIFIED IDEOGRAPH
+ 0x8349: 0x50C6, //CJK UNIFIED IDEOGRAPH
+ 0x834A: 0x50C7, //CJK UNIFIED IDEOGRAPH
+ 0x834B: 0x50C8, //CJK UNIFIED IDEOGRAPH
+ 0x834C: 0x50C9, //CJK UNIFIED IDEOGRAPH
+ 0x834D: 0x50CA, //CJK UNIFIED IDEOGRAPH
+ 0x834E: 0x50CB, //CJK UNIFIED IDEOGRAPH
+ 0x834F: 0x50CC, //CJK UNIFIED IDEOGRAPH
+ 0x8350: 0x50CD, //CJK UNIFIED IDEOGRAPH
+ 0x8351: 0x50CE, //CJK UNIFIED IDEOGRAPH
+ 0x8352: 0x50D0, //CJK UNIFIED IDEOGRAPH
+ 0x8353: 0x50D1, //CJK UNIFIED IDEOGRAPH
+ 0x8354: 0x50D2, //CJK UNIFIED IDEOGRAPH
+ 0x8355: 0x50D3, //CJK UNIFIED IDEOGRAPH
+ 0x8356: 0x50D4, //CJK UNIFIED IDEOGRAPH
+ 0x8357: 0x50D5, //CJK UNIFIED IDEOGRAPH
+ 0x8358: 0x50D7, //CJK UNIFIED IDEOGRAPH
+ 0x8359: 0x50D8, //CJK UNIFIED IDEOGRAPH
+ 0x835A: 0x50D9, //CJK UNIFIED IDEOGRAPH
+ 0x835B: 0x50DB, //CJK UNIFIED IDEOGRAPH
+ 0x835C: 0x50DC, //CJK UNIFIED IDEOGRAPH
+ 0x835D: 0x50DD, //CJK UNIFIED IDEOGRAPH
+ 0x835E: 0x50DE, //CJK UNIFIED IDEOGRAPH
+ 0x835F: 0x50DF, //CJK UNIFIED IDEOGRAPH
+ 0x8360: 0x50E0, //CJK UNIFIED IDEOGRAPH
+ 0x8361: 0x50E1, //CJK UNIFIED IDEOGRAPH
+ 0x8362: 0x50E2, //CJK UNIFIED IDEOGRAPH
+ 0x8363: 0x50E3, //CJK UNIFIED IDEOGRAPH
+ 0x8364: 0x50E4, //CJK UNIFIED IDEOGRAPH
+ 0x8365: 0x50E5, //CJK UNIFIED IDEOGRAPH
+ 0x8366: 0x50E8, //CJK UNIFIED IDEOGRAPH
+ 0x8367: 0x50E9, //CJK UNIFIED IDEOGRAPH
+ 0x8368: 0x50EA, //CJK UNIFIED IDEOGRAPH
+ 0x8369: 0x50EB, //CJK UNIFIED IDEOGRAPH
+ 0x836A: 0x50EF, //CJK UNIFIED IDEOGRAPH
+ 0x836B: 0x50F0, //CJK UNIFIED IDEOGRAPH
+ 0x836C: 0x50F1, //CJK UNIFIED IDEOGRAPH
+ 0x836D: 0x50F2, //CJK UNIFIED IDEOGRAPH
+ 0x836E: 0x50F4, //CJK UNIFIED IDEOGRAPH
+ 0x836F: 0x50F6, //CJK UNIFIED IDEOGRAPH
+ 0x8370: 0x50F7, //CJK UNIFIED IDEOGRAPH
+ 0x8371: 0x50F8, //CJK UNIFIED IDEOGRAPH
+ 0x8372: 0x50F9, //CJK UNIFIED IDEOGRAPH
+ 0x8373: 0x50FA, //CJK UNIFIED IDEOGRAPH
+ 0x8374: 0x50FC, //CJK UNIFIED IDEOGRAPH
+ 0x8375: 0x50FD, //CJK UNIFIED IDEOGRAPH
+ 0x8376: 0x50FE, //CJK UNIFIED IDEOGRAPH
+ 0x8377: 0x50FF, //CJK UNIFIED IDEOGRAPH
+ 0x8378: 0x5100, //CJK UNIFIED IDEOGRAPH
+ 0x8379: 0x5101, //CJK UNIFIED IDEOGRAPH
+ 0x837A: 0x5102, //CJK UNIFIED IDEOGRAPH
+ 0x837B: 0x5103, //CJK UNIFIED IDEOGRAPH
+ 0x837C: 0x5104, //CJK UNIFIED IDEOGRAPH
+ 0x837D: 0x5105, //CJK UNIFIED IDEOGRAPH
+ 0x837E: 0x5108, //CJK UNIFIED IDEOGRAPH
+ 0x8380: 0x5109, //CJK UNIFIED IDEOGRAPH
+ 0x8381: 0x510A, //CJK UNIFIED IDEOGRAPH
+ 0x8382: 0x510C, //CJK UNIFIED IDEOGRAPH
+ 0x8383: 0x510D, //CJK UNIFIED IDEOGRAPH
+ 0x8384: 0x510E, //CJK UNIFIED IDEOGRAPH
+ 0x8385: 0x510F, //CJK UNIFIED IDEOGRAPH
+ 0x8386: 0x5110, //CJK UNIFIED IDEOGRAPH
+ 0x8387: 0x5111, //CJK UNIFIED IDEOGRAPH
+ 0x8388: 0x5113, //CJK UNIFIED IDEOGRAPH
+ 0x8389: 0x5114, //CJK UNIFIED IDEOGRAPH
+ 0x838A: 0x5115, //CJK UNIFIED IDEOGRAPH
+ 0x838B: 0x5116, //CJK UNIFIED IDEOGRAPH
+ 0x838C: 0x5117, //CJK UNIFIED IDEOGRAPH
+ 0x838D: 0x5118, //CJK UNIFIED IDEOGRAPH
+ 0x838E: 0x5119, //CJK UNIFIED IDEOGRAPH
+ 0x838F: 0x511A, //CJK UNIFIED IDEOGRAPH
+ 0x8390: 0x511B, //CJK UNIFIED IDEOGRAPH
+ 0x8391: 0x511C, //CJK UNIFIED IDEOGRAPH
+ 0x8392: 0x511D, //CJK UNIFIED IDEOGRAPH
+ 0x8393: 0x511E, //CJK UNIFIED IDEOGRAPH
+ 0x8394: 0x511F, //CJK UNIFIED IDEOGRAPH
+ 0x8395: 0x5120, //CJK UNIFIED IDEOGRAPH
+ 0x8396: 0x5122, //CJK UNIFIED IDEOGRAPH
+ 0x8397: 0x5123, //CJK UNIFIED IDEOGRAPH
+ 0x8398: 0x5124, //CJK UNIFIED IDEOGRAPH
+ 0x8399: 0x5125, //CJK UNIFIED IDEOGRAPH
+ 0x839A: 0x5126, //CJK UNIFIED IDEOGRAPH
+ 0x839B: 0x5127, //CJK UNIFIED IDEOGRAPH
+ 0x839C: 0x5128, //CJK UNIFIED IDEOGRAPH
+ 0x839D: 0x5129, //CJK UNIFIED IDEOGRAPH
+ 0x839E: 0x512A, //CJK UNIFIED IDEOGRAPH
+ 0x839F: 0x512B, //CJK UNIFIED IDEOGRAPH
+ 0x83A0: 0x512C, //CJK UNIFIED IDEOGRAPH
+ 0x83A1: 0x512D, //CJK UNIFIED IDEOGRAPH
+ 0x83A2: 0x512E, //CJK UNIFIED IDEOGRAPH
+ 0x83A3: 0x512F, //CJK UNIFIED IDEOGRAPH
+ 0x83A4: 0x5130, //CJK UNIFIED IDEOGRAPH
+ 0x83A5: 0x5131, //CJK UNIFIED IDEOGRAPH
+ 0x83A6: 0x5132, //CJK UNIFIED IDEOGRAPH
+ 0x83A7: 0x5133, //CJK UNIFIED IDEOGRAPH
+ 0x83A8: 0x5134, //CJK UNIFIED IDEOGRAPH
+ 0x83A9: 0x5135, //CJK UNIFIED IDEOGRAPH
+ 0x83AA: 0x5136, //CJK UNIFIED IDEOGRAPH
+ 0x83AB: 0x5137, //CJK UNIFIED IDEOGRAPH
+ 0x83AC: 0x5138, //CJK UNIFIED IDEOGRAPH
+ 0x83AD: 0x5139, //CJK UNIFIED IDEOGRAPH
+ 0x83AE: 0x513A, //CJK UNIFIED IDEOGRAPH
+ 0x83AF: 0x513B, //CJK UNIFIED IDEOGRAPH
+ 0x83B0: 0x513C, //CJK UNIFIED IDEOGRAPH
+ 0x83B1: 0x513D, //CJK UNIFIED IDEOGRAPH
+ 0x83B2: 0x513E, //CJK UNIFIED IDEOGRAPH
+ 0x83B3: 0x5142, //CJK UNIFIED IDEOGRAPH
+ 0x83B4: 0x5147, //CJK UNIFIED IDEOGRAPH
+ 0x83B5: 0x514A, //CJK UNIFIED IDEOGRAPH
+ 0x83B6: 0x514C, //CJK UNIFIED IDEOGRAPH
+ 0x83B7: 0x514E, //CJK UNIFIED IDEOGRAPH
+ 0x83B8: 0x514F, //CJK UNIFIED IDEOGRAPH
+ 0x83B9: 0x5150, //CJK UNIFIED IDEOGRAPH
+ 0x83BA: 0x5152, //CJK UNIFIED IDEOGRAPH
+ 0x83BB: 0x5153, //CJK UNIFIED IDEOGRAPH
+ 0x83BC: 0x5157, //CJK UNIFIED IDEOGRAPH
+ 0x83BD: 0x5158, //CJK UNIFIED IDEOGRAPH
+ 0x83BE: 0x5159, //CJK UNIFIED IDEOGRAPH
+ 0x83BF: 0x515B, //CJK UNIFIED IDEOGRAPH
+ 0x83C0: 0x515D, //CJK UNIFIED IDEOGRAPH
+ 0x83C1: 0x515E, //CJK UNIFIED IDEOGRAPH
+ 0x83C2: 0x515F, //CJK UNIFIED IDEOGRAPH
+ 0x83C3: 0x5160, //CJK UNIFIED IDEOGRAPH
+ 0x83C4: 0x5161, //CJK UNIFIED IDEOGRAPH
+ 0x83C5: 0x5163, //CJK UNIFIED IDEOGRAPH
+ 0x83C6: 0x5164, //CJK UNIFIED IDEOGRAPH
+ 0x83C7: 0x5166, //CJK UNIFIED IDEOGRAPH
+ 0x83C8: 0x5167, //CJK UNIFIED IDEOGRAPH
+ 0x83C9: 0x5169, //CJK UNIFIED IDEOGRAPH
+ 0x83CA: 0x516A, //CJK UNIFIED IDEOGRAPH
+ 0x83CB: 0x516F, //CJK UNIFIED IDEOGRAPH
+ 0x83CC: 0x5172, //CJK UNIFIED IDEOGRAPH
+ 0x83CD: 0x517A, //CJK UNIFIED IDEOGRAPH
+ 0x83CE: 0x517E, //CJK UNIFIED IDEOGRAPH
+ 0x83CF: 0x517F, //CJK UNIFIED IDEOGRAPH
+ 0x83D0: 0x5183, //CJK UNIFIED IDEOGRAPH
+ 0x83D1: 0x5184, //CJK UNIFIED IDEOGRAPH
+ 0x83D2: 0x5186, //CJK UNIFIED IDEOGRAPH
+ 0x83D3: 0x5187, //CJK UNIFIED IDEOGRAPH
+ 0x83D4: 0x518A, //CJK UNIFIED IDEOGRAPH
+ 0x83D5: 0x518B, //CJK UNIFIED IDEOGRAPH
+ 0x83D6: 0x518E, //CJK UNIFIED IDEOGRAPH
+ 0x83D7: 0x518F, //CJK UNIFIED IDEOGRAPH
+ 0x83D8: 0x5190, //CJK UNIFIED IDEOGRAPH
+ 0x83D9: 0x5191, //CJK UNIFIED IDEOGRAPH
+ 0x83DA: 0x5193, //CJK UNIFIED IDEOGRAPH
+ 0x83DB: 0x5194, //CJK UNIFIED IDEOGRAPH
+ 0x83DC: 0x5198, //CJK UNIFIED IDEOGRAPH
+ 0x83DD: 0x519A, //CJK UNIFIED IDEOGRAPH
+ 0x83DE: 0x519D, //CJK UNIFIED IDEOGRAPH
+ 0x83DF: 0x519E, //CJK UNIFIED IDEOGRAPH
+ 0x83E0: 0x519F, //CJK UNIFIED IDEOGRAPH
+ 0x83E1: 0x51A1, //CJK UNIFIED IDEOGRAPH
+ 0x83E2: 0x51A3, //CJK UNIFIED IDEOGRAPH
+ 0x83E3: 0x51A6, //CJK UNIFIED IDEOGRAPH
+ 0x83E4: 0x51A7, //CJK UNIFIED IDEOGRAPH
+ 0x83E5: 0x51A8, //CJK UNIFIED IDEOGRAPH
+ 0x83E6: 0x51A9, //CJK UNIFIED IDEOGRAPH
+ 0x83E7: 0x51AA, //CJK UNIFIED IDEOGRAPH
+ 0x83E8: 0x51AD, //CJK UNIFIED IDEOGRAPH
+ 0x83E9: 0x51AE, //CJK UNIFIED IDEOGRAPH
+ 0x83EA: 0x51B4, //CJK UNIFIED IDEOGRAPH
+ 0x83EB: 0x51B8, //CJK UNIFIED IDEOGRAPH
+ 0x83EC: 0x51B9, //CJK UNIFIED IDEOGRAPH
+ 0x83ED: 0x51BA, //CJK UNIFIED IDEOGRAPH
+ 0x83EE: 0x51BE, //CJK UNIFIED IDEOGRAPH
+ 0x83EF: 0x51BF, //CJK UNIFIED IDEOGRAPH
+ 0x83F0: 0x51C1, //CJK UNIFIED IDEOGRAPH
+ 0x83F1: 0x51C2, //CJK UNIFIED IDEOGRAPH
+ 0x83F2: 0x51C3, //CJK UNIFIED IDEOGRAPH
+ 0x83F3: 0x51C5, //CJK UNIFIED IDEOGRAPH
+ 0x83F4: 0x51C8, //CJK UNIFIED IDEOGRAPH
+ 0x83F5: 0x51CA, //CJK UNIFIED IDEOGRAPH
+ 0x83F6: 0x51CD, //CJK UNIFIED IDEOGRAPH
+ 0x83F7: 0x51CE, //CJK UNIFIED IDEOGRAPH
+ 0x83F8: 0x51D0, //CJK UNIFIED IDEOGRAPH
+ 0x83F9: 0x51D2, //CJK UNIFIED IDEOGRAPH
+ 0x83FA: 0x51D3, //CJK UNIFIED IDEOGRAPH
+ 0x83FB: 0x51D4, //CJK UNIFIED IDEOGRAPH
+ 0x83FC: 0x51D5, //CJK UNIFIED IDEOGRAPH
+ 0x83FD: 0x51D6, //CJK UNIFIED IDEOGRAPH
+ 0x83FE: 0x51D7, //CJK UNIFIED IDEOGRAPH
+ 0x8440: 0x51D8, //CJK UNIFIED IDEOGRAPH
+ 0x8441: 0x51D9, //CJK UNIFIED IDEOGRAPH
+ 0x8442: 0x51DA, //CJK UNIFIED IDEOGRAPH
+ 0x8443: 0x51DC, //CJK UNIFIED IDEOGRAPH
+ 0x8444: 0x51DE, //CJK UNIFIED IDEOGRAPH
+ 0x8445: 0x51DF, //CJK UNIFIED IDEOGRAPH
+ 0x8446: 0x51E2, //CJK UNIFIED IDEOGRAPH
+ 0x8447: 0x51E3, //CJK UNIFIED IDEOGRAPH
+ 0x8448: 0x51E5, //CJK UNIFIED IDEOGRAPH
+ 0x8449: 0x51E6, //CJK UNIFIED IDEOGRAPH
+ 0x844A: 0x51E7, //CJK UNIFIED IDEOGRAPH
+ 0x844B: 0x51E8, //CJK UNIFIED IDEOGRAPH
+ 0x844C: 0x51E9, //CJK UNIFIED IDEOGRAPH
+ 0x844D: 0x51EA, //CJK UNIFIED IDEOGRAPH
+ 0x844E: 0x51EC, //CJK UNIFIED IDEOGRAPH
+ 0x844F: 0x51EE, //CJK UNIFIED IDEOGRAPH
+ 0x8450: 0x51F1, //CJK UNIFIED IDEOGRAPH
+ 0x8451: 0x51F2, //CJK UNIFIED IDEOGRAPH
+ 0x8452: 0x51F4, //CJK UNIFIED IDEOGRAPH
+ 0x8453: 0x51F7, //CJK UNIFIED IDEOGRAPH
+ 0x8454: 0x51FE, //CJK UNIFIED IDEOGRAPH
+ 0x8455: 0x5204, //CJK UNIFIED IDEOGRAPH
+ 0x8456: 0x5205, //CJK UNIFIED IDEOGRAPH
+ 0x8457: 0x5209, //CJK UNIFIED IDEOGRAPH
+ 0x8458: 0x520B, //CJK UNIFIED IDEOGRAPH
+ 0x8459: 0x520C, //CJK UNIFIED IDEOGRAPH
+ 0x845A: 0x520F, //CJK UNIFIED IDEOGRAPH
+ 0x845B: 0x5210, //CJK UNIFIED IDEOGRAPH
+ 0x845C: 0x5213, //CJK UNIFIED IDEOGRAPH
+ 0x845D: 0x5214, //CJK UNIFIED IDEOGRAPH
+ 0x845E: 0x5215, //CJK UNIFIED IDEOGRAPH
+ 0x845F: 0x521C, //CJK UNIFIED IDEOGRAPH
+ 0x8460: 0x521E, //CJK UNIFIED IDEOGRAPH
+ 0x8461: 0x521F, //CJK UNIFIED IDEOGRAPH
+ 0x8462: 0x5221, //CJK UNIFIED IDEOGRAPH
+ 0x8463: 0x5222, //CJK UNIFIED IDEOGRAPH
+ 0x8464: 0x5223, //CJK UNIFIED IDEOGRAPH
+ 0x8465: 0x5225, //CJK UNIFIED IDEOGRAPH
+ 0x8466: 0x5226, //CJK UNIFIED IDEOGRAPH
+ 0x8467: 0x5227, //CJK UNIFIED IDEOGRAPH
+ 0x8468: 0x522A, //CJK UNIFIED IDEOGRAPH
+ 0x8469: 0x522C, //CJK UNIFIED IDEOGRAPH
+ 0x846A: 0x522F, //CJK UNIFIED IDEOGRAPH
+ 0x846B: 0x5231, //CJK UNIFIED IDEOGRAPH
+ 0x846C: 0x5232, //CJK UNIFIED IDEOGRAPH
+ 0x846D: 0x5234, //CJK UNIFIED IDEOGRAPH
+ 0x846E: 0x5235, //CJK UNIFIED IDEOGRAPH
+ 0x846F: 0x523C, //CJK UNIFIED IDEOGRAPH
+ 0x8470: 0x523E, //CJK UNIFIED IDEOGRAPH
+ 0x8471: 0x5244, //CJK UNIFIED IDEOGRAPH
+ 0x8472: 0x5245, //CJK UNIFIED IDEOGRAPH
+ 0x8473: 0x5246, //CJK UNIFIED IDEOGRAPH
+ 0x8474: 0x5247, //CJK UNIFIED IDEOGRAPH
+ 0x8475: 0x5248, //CJK UNIFIED IDEOGRAPH
+ 0x8476: 0x5249, //CJK UNIFIED IDEOGRAPH
+ 0x8477: 0x524B, //CJK UNIFIED IDEOGRAPH
+ 0x8478: 0x524E, //CJK UNIFIED IDEOGRAPH
+ 0x8479: 0x524F, //CJK UNIFIED IDEOGRAPH
+ 0x847A: 0x5252, //CJK UNIFIED IDEOGRAPH
+ 0x847B: 0x5253, //CJK UNIFIED IDEOGRAPH
+ 0x847C: 0x5255, //CJK UNIFIED IDEOGRAPH
+ 0x847D: 0x5257, //CJK UNIFIED IDEOGRAPH
+ 0x847E: 0x5258, //CJK UNIFIED IDEOGRAPH
+ 0x8480: 0x5259, //CJK UNIFIED IDEOGRAPH
+ 0x8481: 0x525A, //CJK UNIFIED IDEOGRAPH
+ 0x8482: 0x525B, //CJK UNIFIED IDEOGRAPH
+ 0x8483: 0x525D, //CJK UNIFIED IDEOGRAPH
+ 0x8484: 0x525F, //CJK UNIFIED IDEOGRAPH
+ 0x8485: 0x5260, //CJK UNIFIED IDEOGRAPH
+ 0x8486: 0x5262, //CJK UNIFIED IDEOGRAPH
+ 0x8487: 0x5263, //CJK UNIFIED IDEOGRAPH
+ 0x8488: 0x5264, //CJK UNIFIED IDEOGRAPH
+ 0x8489: 0x5266, //CJK UNIFIED IDEOGRAPH
+ 0x848A: 0x5268, //CJK UNIFIED IDEOGRAPH
+ 0x848B: 0x526B, //CJK UNIFIED IDEOGRAPH
+ 0x848C: 0x526C, //CJK UNIFIED IDEOGRAPH
+ 0x848D: 0x526D, //CJK UNIFIED IDEOGRAPH
+ 0x848E: 0x526E, //CJK UNIFIED IDEOGRAPH
+ 0x848F: 0x5270, //CJK UNIFIED IDEOGRAPH
+ 0x8490: 0x5271, //CJK UNIFIED IDEOGRAPH
+ 0x8491: 0x5273, //CJK UNIFIED IDEOGRAPH
+ 0x8492: 0x5274, //CJK UNIFIED IDEOGRAPH
+ 0x8493: 0x5275, //CJK UNIFIED IDEOGRAPH
+ 0x8494: 0x5276, //CJK UNIFIED IDEOGRAPH
+ 0x8495: 0x5277, //CJK UNIFIED IDEOGRAPH
+ 0x8496: 0x5278, //CJK UNIFIED IDEOGRAPH
+ 0x8497: 0x5279, //CJK UNIFIED IDEOGRAPH
+ 0x8498: 0x527A, //CJK UNIFIED IDEOGRAPH
+ 0x8499: 0x527B, //CJK UNIFIED IDEOGRAPH
+ 0x849A: 0x527C, //CJK UNIFIED IDEOGRAPH
+ 0x849B: 0x527E, //CJK UNIFIED IDEOGRAPH
+ 0x849C: 0x5280, //CJK UNIFIED IDEOGRAPH
+ 0x849D: 0x5283, //CJK UNIFIED IDEOGRAPH
+ 0x849E: 0x5284, //CJK UNIFIED IDEOGRAPH
+ 0x849F: 0x5285, //CJK UNIFIED IDEOGRAPH
+ 0x84A0: 0x5286, //CJK UNIFIED IDEOGRAPH
+ 0x84A1: 0x5287, //CJK UNIFIED IDEOGRAPH
+ 0x84A2: 0x5289, //CJK UNIFIED IDEOGRAPH
+ 0x84A3: 0x528A, //CJK UNIFIED IDEOGRAPH
+ 0x84A4: 0x528B, //CJK UNIFIED IDEOGRAPH
+ 0x84A5: 0x528C, //CJK UNIFIED IDEOGRAPH
+ 0x84A6: 0x528D, //CJK UNIFIED IDEOGRAPH
+ 0x84A7: 0x528E, //CJK UNIFIED IDEOGRAPH
+ 0x84A8: 0x528F, //CJK UNIFIED IDEOGRAPH
+ 0x84A9: 0x5291, //CJK UNIFIED IDEOGRAPH
+ 0x84AA: 0x5292, //CJK UNIFIED IDEOGRAPH
+ 0x84AB: 0x5294, //CJK UNIFIED IDEOGRAPH
+ 0x84AC: 0x5295, //CJK UNIFIED IDEOGRAPH
+ 0x84AD: 0x5296, //CJK UNIFIED IDEOGRAPH
+ 0x84AE: 0x5297, //CJK UNIFIED IDEOGRAPH
+ 0x84AF: 0x5298, //CJK UNIFIED IDEOGRAPH
+ 0x84B0: 0x5299, //CJK UNIFIED IDEOGRAPH
+ 0x84B1: 0x529A, //CJK UNIFIED IDEOGRAPH
+ 0x84B2: 0x529C, //CJK UNIFIED IDEOGRAPH
+ 0x84B3: 0x52A4, //CJK UNIFIED IDEOGRAPH
+ 0x84B4: 0x52A5, //CJK UNIFIED IDEOGRAPH
+ 0x84B5: 0x52A6, //CJK UNIFIED IDEOGRAPH
+ 0x84B6: 0x52A7, //CJK UNIFIED IDEOGRAPH
+ 0x84B7: 0x52AE, //CJK UNIFIED IDEOGRAPH
+ 0x84B8: 0x52AF, //CJK UNIFIED IDEOGRAPH
+ 0x84B9: 0x52B0, //CJK UNIFIED IDEOGRAPH
+ 0x84BA: 0x52B4, //CJK UNIFIED IDEOGRAPH
+ 0x84BB: 0x52B5, //CJK UNIFIED IDEOGRAPH
+ 0x84BC: 0x52B6, //CJK UNIFIED IDEOGRAPH
+ 0x84BD: 0x52B7, //CJK UNIFIED IDEOGRAPH
+ 0x84BE: 0x52B8, //CJK UNIFIED IDEOGRAPH
+ 0x84BF: 0x52B9, //CJK UNIFIED IDEOGRAPH
+ 0x84C0: 0x52BA, //CJK UNIFIED IDEOGRAPH
+ 0x84C1: 0x52BB, //CJK UNIFIED IDEOGRAPH
+ 0x84C2: 0x52BC, //CJK UNIFIED IDEOGRAPH
+ 0x84C3: 0x52BD, //CJK UNIFIED IDEOGRAPH
+ 0x84C4: 0x52C0, //CJK UNIFIED IDEOGRAPH
+ 0x84C5: 0x52C1, //CJK UNIFIED IDEOGRAPH
+ 0x84C6: 0x52C2, //CJK UNIFIED IDEOGRAPH
+ 0x84C7: 0x52C4, //CJK UNIFIED IDEOGRAPH
+ 0x84C8: 0x52C5, //CJK UNIFIED IDEOGRAPH
+ 0x84C9: 0x52C6, //CJK UNIFIED IDEOGRAPH
+ 0x84CA: 0x52C8, //CJK UNIFIED IDEOGRAPH
+ 0x84CB: 0x52CA, //CJK UNIFIED IDEOGRAPH
+ 0x84CC: 0x52CC, //CJK UNIFIED IDEOGRAPH
+ 0x84CD: 0x52CD, //CJK UNIFIED IDEOGRAPH
+ 0x84CE: 0x52CE, //CJK UNIFIED IDEOGRAPH
+ 0x84CF: 0x52CF, //CJK UNIFIED IDEOGRAPH
+ 0x84D0: 0x52D1, //CJK UNIFIED IDEOGRAPH
+ 0x84D1: 0x52D3, //CJK UNIFIED IDEOGRAPH
+ 0x84D2: 0x52D4, //CJK UNIFIED IDEOGRAPH
+ 0x84D3: 0x52D5, //CJK UNIFIED IDEOGRAPH
+ 0x84D4: 0x52D7, //CJK UNIFIED IDEOGRAPH
+ 0x84D5: 0x52D9, //CJK UNIFIED IDEOGRAPH
+ 0x84D6: 0x52DA, //CJK UNIFIED IDEOGRAPH
+ 0x84D7: 0x52DB, //CJK UNIFIED IDEOGRAPH
+ 0x84D8: 0x52DC, //CJK UNIFIED IDEOGRAPH
+ 0x84D9: 0x52DD, //CJK UNIFIED IDEOGRAPH
+ 0x84DA: 0x52DE, //CJK UNIFIED IDEOGRAPH
+ 0x84DB: 0x52E0, //CJK UNIFIED IDEOGRAPH
+ 0x84DC: 0x52E1, //CJK UNIFIED IDEOGRAPH
+ 0x84DD: 0x52E2, //CJK UNIFIED IDEOGRAPH
+ 0x84DE: 0x52E3, //CJK UNIFIED IDEOGRAPH
+ 0x84DF: 0x52E5, //CJK UNIFIED IDEOGRAPH
+ 0x84E0: 0x52E6, //CJK UNIFIED IDEOGRAPH
+ 0x84E1: 0x52E7, //CJK UNIFIED IDEOGRAPH
+ 0x84E2: 0x52E8, //CJK UNIFIED IDEOGRAPH
+ 0x84E3: 0x52E9, //CJK UNIFIED IDEOGRAPH
+ 0x84E4: 0x52EA, //CJK UNIFIED IDEOGRAPH
+ 0x84E5: 0x52EB, //CJK UNIFIED IDEOGRAPH
+ 0x84E6: 0x52EC, //CJK UNIFIED IDEOGRAPH
+ 0x84E7: 0x52ED, //CJK UNIFIED IDEOGRAPH
+ 0x84E8: 0x52EE, //CJK UNIFIED IDEOGRAPH
+ 0x84E9: 0x52EF, //CJK UNIFIED IDEOGRAPH
+ 0x84EA: 0x52F1, //CJK UNIFIED IDEOGRAPH
+ 0x84EB: 0x52F2, //CJK UNIFIED IDEOGRAPH
+ 0x84EC: 0x52F3, //CJK UNIFIED IDEOGRAPH
+ 0x84ED: 0x52F4, //CJK UNIFIED IDEOGRAPH
+ 0x84EE: 0x52F5, //CJK UNIFIED IDEOGRAPH
+ 0x84EF: 0x52F6, //CJK UNIFIED IDEOGRAPH
+ 0x84F0: 0x52F7, //CJK UNIFIED IDEOGRAPH
+ 0x84F1: 0x52F8, //CJK UNIFIED IDEOGRAPH
+ 0x84F2: 0x52FB, //CJK UNIFIED IDEOGRAPH
+ 0x84F3: 0x52FC, //CJK UNIFIED IDEOGRAPH
+ 0x84F4: 0x52FD, //CJK UNIFIED IDEOGRAPH
+ 0x84F5: 0x5301, //CJK UNIFIED IDEOGRAPH
+ 0x84F6: 0x5302, //CJK UNIFIED IDEOGRAPH
+ 0x84F7: 0x5303, //CJK UNIFIED IDEOGRAPH
+ 0x84F8: 0x5304, //CJK UNIFIED IDEOGRAPH
+ 0x84F9: 0x5307, //CJK UNIFIED IDEOGRAPH
+ 0x84FA: 0x5309, //CJK UNIFIED IDEOGRAPH
+ 0x84FB: 0x530A, //CJK UNIFIED IDEOGRAPH
+ 0x84FC: 0x530B, //CJK UNIFIED IDEOGRAPH
+ 0x84FD: 0x530C, //CJK UNIFIED IDEOGRAPH
+ 0x84FE: 0x530E, //CJK UNIFIED IDEOGRAPH
+ 0x8540: 0x5311, //CJK UNIFIED IDEOGRAPH
+ 0x8541: 0x5312, //CJK UNIFIED IDEOGRAPH
+ 0x8542: 0x5313, //CJK UNIFIED IDEOGRAPH
+ 0x8543: 0x5314, //CJK UNIFIED IDEOGRAPH
+ 0x8544: 0x5318, //CJK UNIFIED IDEOGRAPH
+ 0x8545: 0x531B, //CJK UNIFIED IDEOGRAPH
+ 0x8546: 0x531C, //CJK UNIFIED IDEOGRAPH
+ 0x8547: 0x531E, //CJK UNIFIED IDEOGRAPH
+ 0x8548: 0x531F, //CJK UNIFIED IDEOGRAPH
+ 0x8549: 0x5322, //CJK UNIFIED IDEOGRAPH
+ 0x854A: 0x5324, //CJK UNIFIED IDEOGRAPH
+ 0x854B: 0x5325, //CJK UNIFIED IDEOGRAPH
+ 0x854C: 0x5327, //CJK UNIFIED IDEOGRAPH
+ 0x854D: 0x5328, //CJK UNIFIED IDEOGRAPH
+ 0x854E: 0x5329, //CJK UNIFIED IDEOGRAPH
+ 0x854F: 0x532B, //CJK UNIFIED IDEOGRAPH
+ 0x8550: 0x532C, //CJK UNIFIED IDEOGRAPH
+ 0x8551: 0x532D, //CJK UNIFIED IDEOGRAPH
+ 0x8552: 0x532F, //CJK UNIFIED IDEOGRAPH
+ 0x8553: 0x5330, //CJK UNIFIED IDEOGRAPH
+ 0x8554: 0x5331, //CJK UNIFIED IDEOGRAPH
+ 0x8555: 0x5332, //CJK UNIFIED IDEOGRAPH
+ 0x8556: 0x5333, //CJK UNIFIED IDEOGRAPH
+ 0x8557: 0x5334, //CJK UNIFIED IDEOGRAPH
+ 0x8558: 0x5335, //CJK UNIFIED IDEOGRAPH
+ 0x8559: 0x5336, //CJK UNIFIED IDEOGRAPH
+ 0x855A: 0x5337, //CJK UNIFIED IDEOGRAPH
+ 0x855B: 0x5338, //CJK UNIFIED IDEOGRAPH
+ 0x855C: 0x533C, //CJK UNIFIED IDEOGRAPH
+ 0x855D: 0x533D, //CJK UNIFIED IDEOGRAPH
+ 0x855E: 0x5340, //CJK UNIFIED IDEOGRAPH
+ 0x855F: 0x5342, //CJK UNIFIED IDEOGRAPH
+ 0x8560: 0x5344, //CJK UNIFIED IDEOGRAPH
+ 0x8561: 0x5346, //CJK UNIFIED IDEOGRAPH
+ 0x8562: 0x534B, //CJK UNIFIED IDEOGRAPH
+ 0x8563: 0x534C, //CJK UNIFIED IDEOGRAPH
+ 0x8564: 0x534D, //CJK UNIFIED IDEOGRAPH
+ 0x8565: 0x5350, //CJK UNIFIED IDEOGRAPH
+ 0x8566: 0x5354, //CJK UNIFIED IDEOGRAPH
+ 0x8567: 0x5358, //CJK UNIFIED IDEOGRAPH
+ 0x8568: 0x5359, //CJK UNIFIED IDEOGRAPH
+ 0x8569: 0x535B, //CJK UNIFIED IDEOGRAPH
+ 0x856A: 0x535D, //CJK UNIFIED IDEOGRAPH
+ 0x856B: 0x5365, //CJK UNIFIED IDEOGRAPH
+ 0x856C: 0x5368, //CJK UNIFIED IDEOGRAPH
+ 0x856D: 0x536A, //CJK UNIFIED IDEOGRAPH
+ 0x856E: 0x536C, //CJK UNIFIED IDEOGRAPH
+ 0x856F: 0x536D, //CJK UNIFIED IDEOGRAPH
+ 0x8570: 0x5372, //CJK UNIFIED IDEOGRAPH
+ 0x8571: 0x5376, //CJK UNIFIED IDEOGRAPH
+ 0x8572: 0x5379, //CJK UNIFIED IDEOGRAPH
+ 0x8573: 0x537B, //CJK UNIFIED IDEOGRAPH
+ 0x8574: 0x537C, //CJK UNIFIED IDEOGRAPH
+ 0x8575: 0x537D, //CJK UNIFIED IDEOGRAPH
+ 0x8576: 0x537E, //CJK UNIFIED IDEOGRAPH
+ 0x8577: 0x5380, //CJK UNIFIED IDEOGRAPH
+ 0x8578: 0x5381, //CJK UNIFIED IDEOGRAPH
+ 0x8579: 0x5383, //CJK UNIFIED IDEOGRAPH
+ 0x857A: 0x5387, //CJK UNIFIED IDEOGRAPH
+ 0x857B: 0x5388, //CJK UNIFIED IDEOGRAPH
+ 0x857C: 0x538A, //CJK UNIFIED IDEOGRAPH
+ 0x857D: 0x538E, //CJK UNIFIED IDEOGRAPH
+ 0x857E: 0x538F, //CJK UNIFIED IDEOGRAPH
+ 0x8580: 0x5390, //CJK UNIFIED IDEOGRAPH
+ 0x8581: 0x5391, //CJK UNIFIED IDEOGRAPH
+ 0x8582: 0x5392, //CJK UNIFIED IDEOGRAPH
+ 0x8583: 0x5393, //CJK UNIFIED IDEOGRAPH
+ 0x8584: 0x5394, //CJK UNIFIED IDEOGRAPH
+ 0x8585: 0x5396, //CJK UNIFIED IDEOGRAPH
+ 0x8586: 0x5397, //CJK UNIFIED IDEOGRAPH
+ 0x8587: 0x5399, //CJK UNIFIED IDEOGRAPH
+ 0x8588: 0x539B, //CJK UNIFIED IDEOGRAPH
+ 0x8589: 0x539C, //CJK UNIFIED IDEOGRAPH
+ 0x858A: 0x539E, //CJK UNIFIED IDEOGRAPH
+ 0x858B: 0x53A0, //CJK UNIFIED IDEOGRAPH
+ 0x858C: 0x53A1, //CJK UNIFIED IDEOGRAPH
+ 0x858D: 0x53A4, //CJK UNIFIED IDEOGRAPH
+ 0x858E: 0x53A7, //CJK UNIFIED IDEOGRAPH
+ 0x858F: 0x53AA, //CJK UNIFIED IDEOGRAPH
+ 0x8590: 0x53AB, //CJK UNIFIED IDEOGRAPH
+ 0x8591: 0x53AC, //CJK UNIFIED IDEOGRAPH
+ 0x8592: 0x53AD, //CJK UNIFIED IDEOGRAPH
+ 0x8593: 0x53AF, //CJK UNIFIED IDEOGRAPH
+ 0x8594: 0x53B0, //CJK UNIFIED IDEOGRAPH
+ 0x8595: 0x53B1, //CJK UNIFIED IDEOGRAPH
+ 0x8596: 0x53B2, //CJK UNIFIED IDEOGRAPH
+ 0x8597: 0x53B3, //CJK UNIFIED IDEOGRAPH
+ 0x8598: 0x53B4, //CJK UNIFIED IDEOGRAPH
+ 0x8599: 0x53B5, //CJK UNIFIED IDEOGRAPH
+ 0x859A: 0x53B7, //CJK UNIFIED IDEOGRAPH
+ 0x859B: 0x53B8, //CJK UNIFIED IDEOGRAPH
+ 0x859C: 0x53B9, //CJK UNIFIED IDEOGRAPH
+ 0x859D: 0x53BA, //CJK UNIFIED IDEOGRAPH
+ 0x859E: 0x53BC, //CJK UNIFIED IDEOGRAPH
+ 0x859F: 0x53BD, //CJK UNIFIED IDEOGRAPH
+ 0x85A0: 0x53BE, //CJK UNIFIED IDEOGRAPH
+ 0x85A1: 0x53C0, //CJK UNIFIED IDEOGRAPH
+ 0x85A2: 0x53C3, //CJK UNIFIED IDEOGRAPH
+ 0x85A3: 0x53C4, //CJK UNIFIED IDEOGRAPH
+ 0x85A4: 0x53C5, //CJK UNIFIED IDEOGRAPH
+ 0x85A5: 0x53C6, //CJK UNIFIED IDEOGRAPH
+ 0x85A6: 0x53C7, //CJK UNIFIED IDEOGRAPH
+ 0x85A7: 0x53CE, //CJK UNIFIED IDEOGRAPH
+ 0x85A8: 0x53CF, //CJK UNIFIED IDEOGRAPH
+ 0x85A9: 0x53D0, //CJK UNIFIED IDEOGRAPH
+ 0x85AA: 0x53D2, //CJK UNIFIED IDEOGRAPH
+ 0x85AB: 0x53D3, //CJK UNIFIED IDEOGRAPH
+ 0x85AC: 0x53D5, //CJK UNIFIED IDEOGRAPH
+ 0x85AD: 0x53DA, //CJK UNIFIED IDEOGRAPH
+ 0x85AE: 0x53DC, //CJK UNIFIED IDEOGRAPH
+ 0x85AF: 0x53DD, //CJK UNIFIED IDEOGRAPH
+ 0x85B0: 0x53DE, //CJK UNIFIED IDEOGRAPH
+ 0x85B1: 0x53E1, //CJK UNIFIED IDEOGRAPH
+ 0x85B2: 0x53E2, //CJK UNIFIED IDEOGRAPH
+ 0x85B3: 0x53E7, //CJK UNIFIED IDEOGRAPH
+ 0x85B4: 0x53F4, //CJK UNIFIED IDEOGRAPH
+ 0x85B5: 0x53FA, //CJK UNIFIED IDEOGRAPH
+ 0x85B6: 0x53FE, //CJK UNIFIED IDEOGRAPH
+ 0x85B7: 0x53FF, //CJK UNIFIED IDEOGRAPH
+ 0x85B8: 0x5400, //CJK UNIFIED IDEOGRAPH
+ 0x85B9: 0x5402, //CJK UNIFIED IDEOGRAPH
+ 0x85BA: 0x5405, //CJK UNIFIED IDEOGRAPH
+ 0x85BB: 0x5407, //CJK UNIFIED IDEOGRAPH
+ 0x85BC: 0x540B, //CJK UNIFIED IDEOGRAPH
+ 0x85BD: 0x5414, //CJK UNIFIED IDEOGRAPH
+ 0x85BE: 0x5418, //CJK UNIFIED IDEOGRAPH
+ 0x85BF: 0x5419, //CJK UNIFIED IDEOGRAPH
+ 0x85C0: 0x541A, //CJK UNIFIED IDEOGRAPH
+ 0x85C1: 0x541C, //CJK UNIFIED IDEOGRAPH
+ 0x85C2: 0x5422, //CJK UNIFIED IDEOGRAPH
+ 0x85C3: 0x5424, //CJK UNIFIED IDEOGRAPH
+ 0x85C4: 0x5425, //CJK UNIFIED IDEOGRAPH
+ 0x85C5: 0x542A, //CJK UNIFIED IDEOGRAPH
+ 0x85C6: 0x5430, //CJK UNIFIED IDEOGRAPH
+ 0x85C7: 0x5433, //CJK UNIFIED IDEOGRAPH
+ 0x85C8: 0x5436, //CJK UNIFIED IDEOGRAPH
+ 0x85C9: 0x5437, //CJK UNIFIED IDEOGRAPH
+ 0x85CA: 0x543A, //CJK UNIFIED IDEOGRAPH
+ 0x85CB: 0x543D, //CJK UNIFIED IDEOGRAPH
+ 0x85CC: 0x543F, //CJK UNIFIED IDEOGRAPH
+ 0x85CD: 0x5441, //CJK UNIFIED IDEOGRAPH
+ 0x85CE: 0x5442, //CJK UNIFIED IDEOGRAPH
+ 0x85CF: 0x5444, //CJK UNIFIED IDEOGRAPH
+ 0x85D0: 0x5445, //CJK UNIFIED IDEOGRAPH
+ 0x85D1: 0x5447, //CJK UNIFIED IDEOGRAPH
+ 0x85D2: 0x5449, //CJK UNIFIED IDEOGRAPH
+ 0x85D3: 0x544C, //CJK UNIFIED IDEOGRAPH
+ 0x85D4: 0x544D, //CJK UNIFIED IDEOGRAPH
+ 0x85D5: 0x544E, //CJK UNIFIED IDEOGRAPH
+ 0x85D6: 0x544F, //CJK UNIFIED IDEOGRAPH
+ 0x85D7: 0x5451, //CJK UNIFIED IDEOGRAPH
+ 0x85D8: 0x545A, //CJK UNIFIED IDEOGRAPH
+ 0x85D9: 0x545D, //CJK UNIFIED IDEOGRAPH
+ 0x85DA: 0x545E, //CJK UNIFIED IDEOGRAPH
+ 0x85DB: 0x545F, //CJK UNIFIED IDEOGRAPH
+ 0x85DC: 0x5460, //CJK UNIFIED IDEOGRAPH
+ 0x85DD: 0x5461, //CJK UNIFIED IDEOGRAPH
+ 0x85DE: 0x5463, //CJK UNIFIED IDEOGRAPH
+ 0x85DF: 0x5465, //CJK UNIFIED IDEOGRAPH
+ 0x85E0: 0x5467, //CJK UNIFIED IDEOGRAPH
+ 0x85E1: 0x5469, //CJK UNIFIED IDEOGRAPH
+ 0x85E2: 0x546A, //CJK UNIFIED IDEOGRAPH
+ 0x85E3: 0x546B, //CJK UNIFIED IDEOGRAPH
+ 0x85E4: 0x546C, //CJK UNIFIED IDEOGRAPH
+ 0x85E5: 0x546D, //CJK UNIFIED IDEOGRAPH
+ 0x85E6: 0x546E, //CJK UNIFIED IDEOGRAPH
+ 0x85E7: 0x546F, //CJK UNIFIED IDEOGRAPH
+ 0x85E8: 0x5470, //CJK UNIFIED IDEOGRAPH
+ 0x85E9: 0x5474, //CJK UNIFIED IDEOGRAPH
+ 0x85EA: 0x5479, //CJK UNIFIED IDEOGRAPH
+ 0x85EB: 0x547A, //CJK UNIFIED IDEOGRAPH
+ 0x85EC: 0x547E, //CJK UNIFIED IDEOGRAPH
+ 0x85ED: 0x547F, //CJK UNIFIED IDEOGRAPH
+ 0x85EE: 0x5481, //CJK UNIFIED IDEOGRAPH
+ 0x85EF: 0x5483, //CJK UNIFIED IDEOGRAPH
+ 0x85F0: 0x5485, //CJK UNIFIED IDEOGRAPH
+ 0x85F1: 0x5487, //CJK UNIFIED IDEOGRAPH
+ 0x85F2: 0x5488, //CJK UNIFIED IDEOGRAPH
+ 0x85F3: 0x5489, //CJK UNIFIED IDEOGRAPH
+ 0x85F4: 0x548A, //CJK UNIFIED IDEOGRAPH
+ 0x85F5: 0x548D, //CJK UNIFIED IDEOGRAPH
+ 0x85F6: 0x5491, //CJK UNIFIED IDEOGRAPH
+ 0x85F7: 0x5493, //CJK UNIFIED IDEOGRAPH
+ 0x85F8: 0x5497, //CJK UNIFIED IDEOGRAPH
+ 0x85F9: 0x5498, //CJK UNIFIED IDEOGRAPH
+ 0x85FA: 0x549C, //CJK UNIFIED IDEOGRAPH
+ 0x85FB: 0x549E, //CJK UNIFIED IDEOGRAPH
+ 0x85FC: 0x549F, //CJK UNIFIED IDEOGRAPH
+ 0x85FD: 0x54A0, //CJK UNIFIED IDEOGRAPH
+ 0x85FE: 0x54A1, //CJK UNIFIED IDEOGRAPH
+ 0x8640: 0x54A2, //CJK UNIFIED IDEOGRAPH
+ 0x8641: 0x54A5, //CJK UNIFIED IDEOGRAPH
+ 0x8642: 0x54AE, //CJK UNIFIED IDEOGRAPH
+ 0x8643: 0x54B0, //CJK UNIFIED IDEOGRAPH
+ 0x8644: 0x54B2, //CJK UNIFIED IDEOGRAPH
+ 0x8645: 0x54B5, //CJK UNIFIED IDEOGRAPH
+ 0x8646: 0x54B6, //CJK UNIFIED IDEOGRAPH
+ 0x8647: 0x54B7, //CJK UNIFIED IDEOGRAPH
+ 0x8648: 0x54B9, //CJK UNIFIED IDEOGRAPH
+ 0x8649: 0x54BA, //CJK UNIFIED IDEOGRAPH
+ 0x864A: 0x54BC, //CJK UNIFIED IDEOGRAPH
+ 0x864B: 0x54BE, //CJK UNIFIED IDEOGRAPH
+ 0x864C: 0x54C3, //CJK UNIFIED IDEOGRAPH
+ 0x864D: 0x54C5, //CJK UNIFIED IDEOGRAPH
+ 0x864E: 0x54CA, //CJK UNIFIED IDEOGRAPH
+ 0x864F: 0x54CB, //CJK UNIFIED IDEOGRAPH
+ 0x8650: 0x54D6, //CJK UNIFIED IDEOGRAPH
+ 0x8651: 0x54D8, //CJK UNIFIED IDEOGRAPH
+ 0x8652: 0x54DB, //CJK UNIFIED IDEOGRAPH
+ 0x8653: 0x54E0, //CJK UNIFIED IDEOGRAPH
+ 0x8654: 0x54E1, //CJK UNIFIED IDEOGRAPH
+ 0x8655: 0x54E2, //CJK UNIFIED IDEOGRAPH
+ 0x8656: 0x54E3, //CJK UNIFIED IDEOGRAPH
+ 0x8657: 0x54E4, //CJK UNIFIED IDEOGRAPH
+ 0x8658: 0x54EB, //CJK UNIFIED IDEOGRAPH
+ 0x8659: 0x54EC, //CJK UNIFIED IDEOGRAPH
+ 0x865A: 0x54EF, //CJK UNIFIED IDEOGRAPH
+ 0x865B: 0x54F0, //CJK UNIFIED IDEOGRAPH
+ 0x865C: 0x54F1, //CJK UNIFIED IDEOGRAPH
+ 0x865D: 0x54F4, //CJK UNIFIED IDEOGRAPH
+ 0x865E: 0x54F5, //CJK UNIFIED IDEOGRAPH
+ 0x865F: 0x54F6, //CJK UNIFIED IDEOGRAPH
+ 0x8660: 0x54F7, //CJK UNIFIED IDEOGRAPH
+ 0x8661: 0x54F8, //CJK UNIFIED IDEOGRAPH
+ 0x8662: 0x54F9, //CJK UNIFIED IDEOGRAPH
+ 0x8663: 0x54FB, //CJK UNIFIED IDEOGRAPH
+ 0x8664: 0x54FE, //CJK UNIFIED IDEOGRAPH
+ 0x8665: 0x5500, //CJK UNIFIED IDEOGRAPH
+ 0x8666: 0x5502, //CJK UNIFIED IDEOGRAPH
+ 0x8667: 0x5503, //CJK UNIFIED IDEOGRAPH
+ 0x8668: 0x5504, //CJK UNIFIED IDEOGRAPH
+ 0x8669: 0x5505, //CJK UNIFIED IDEOGRAPH
+ 0x866A: 0x5508, //CJK UNIFIED IDEOGRAPH
+ 0x866B: 0x550A, //CJK UNIFIED IDEOGRAPH
+ 0x866C: 0x550B, //CJK UNIFIED IDEOGRAPH
+ 0x866D: 0x550C, //CJK UNIFIED IDEOGRAPH
+ 0x866E: 0x550D, //CJK UNIFIED IDEOGRAPH
+ 0x866F: 0x550E, //CJK UNIFIED IDEOGRAPH
+ 0x8670: 0x5512, //CJK UNIFIED IDEOGRAPH
+ 0x8671: 0x5513, //CJK UNIFIED IDEOGRAPH
+ 0x8672: 0x5515, //CJK UNIFIED IDEOGRAPH
+ 0x8673: 0x5516, //CJK UNIFIED IDEOGRAPH
+ 0x8674: 0x5517, //CJK UNIFIED IDEOGRAPH
+ 0x8675: 0x5518, //CJK UNIFIED IDEOGRAPH
+ 0x8676: 0x5519, //CJK UNIFIED IDEOGRAPH
+ 0x8677: 0x551A, //CJK UNIFIED IDEOGRAPH
+ 0x8678: 0x551C, //CJK UNIFIED IDEOGRAPH
+ 0x8679: 0x551D, //CJK UNIFIED IDEOGRAPH
+ 0x867A: 0x551E, //CJK UNIFIED IDEOGRAPH
+ 0x867B: 0x551F, //CJK UNIFIED IDEOGRAPH
+ 0x867C: 0x5521, //CJK UNIFIED IDEOGRAPH
+ 0x867D: 0x5525, //CJK UNIFIED IDEOGRAPH
+ 0x867E: 0x5526, //CJK UNIFIED IDEOGRAPH
+ 0x8680: 0x5528, //CJK UNIFIED IDEOGRAPH
+ 0x8681: 0x5529, //CJK UNIFIED IDEOGRAPH
+ 0x8682: 0x552B, //CJK UNIFIED IDEOGRAPH
+ 0x8683: 0x552D, //CJK UNIFIED IDEOGRAPH
+ 0x8684: 0x5532, //CJK UNIFIED IDEOGRAPH
+ 0x8685: 0x5534, //CJK UNIFIED IDEOGRAPH
+ 0x8686: 0x5535, //CJK UNIFIED IDEOGRAPH
+ 0x8687: 0x5536, //CJK UNIFIED IDEOGRAPH
+ 0x8688: 0x5538, //CJK UNIFIED IDEOGRAPH
+ 0x8689: 0x5539, //CJK UNIFIED IDEOGRAPH
+ 0x868A: 0x553A, //CJK UNIFIED IDEOGRAPH
+ 0x868B: 0x553B, //CJK UNIFIED IDEOGRAPH
+ 0x868C: 0x553D, //CJK UNIFIED IDEOGRAPH
+ 0x868D: 0x5540, //CJK UNIFIED IDEOGRAPH
+ 0x868E: 0x5542, //CJK UNIFIED IDEOGRAPH
+ 0x868F: 0x5545, //CJK UNIFIED IDEOGRAPH
+ 0x8690: 0x5547, //CJK UNIFIED IDEOGRAPH
+ 0x8691: 0x5548, //CJK UNIFIED IDEOGRAPH
+ 0x8692: 0x554B, //CJK UNIFIED IDEOGRAPH
+ 0x8693: 0x554C, //CJK UNIFIED IDEOGRAPH
+ 0x8694: 0x554D, //CJK UNIFIED IDEOGRAPH
+ 0x8695: 0x554E, //CJK UNIFIED IDEOGRAPH
+ 0x8696: 0x554F, //CJK UNIFIED IDEOGRAPH
+ 0x8697: 0x5551, //CJK UNIFIED IDEOGRAPH
+ 0x8698: 0x5552, //CJK UNIFIED IDEOGRAPH
+ 0x8699: 0x5553, //CJK UNIFIED IDEOGRAPH
+ 0x869A: 0x5554, //CJK UNIFIED IDEOGRAPH
+ 0x869B: 0x5557, //CJK UNIFIED IDEOGRAPH
+ 0x869C: 0x5558, //CJK UNIFIED IDEOGRAPH
+ 0x869D: 0x5559, //CJK UNIFIED IDEOGRAPH
+ 0x869E: 0x555A, //CJK UNIFIED IDEOGRAPH
+ 0x869F: 0x555B, //CJK UNIFIED IDEOGRAPH
+ 0x86A0: 0x555D, //CJK UNIFIED IDEOGRAPH
+ 0x86A1: 0x555E, //CJK UNIFIED IDEOGRAPH
+ 0x86A2: 0x555F, //CJK UNIFIED IDEOGRAPH
+ 0x86A3: 0x5560, //CJK UNIFIED IDEOGRAPH
+ 0x86A4: 0x5562, //CJK UNIFIED IDEOGRAPH
+ 0x86A5: 0x5563, //CJK UNIFIED IDEOGRAPH
+ 0x86A6: 0x5568, //CJK UNIFIED IDEOGRAPH
+ 0x86A7: 0x5569, //CJK UNIFIED IDEOGRAPH
+ 0x86A8: 0x556B, //CJK UNIFIED IDEOGRAPH
+ 0x86A9: 0x556F, //CJK UNIFIED IDEOGRAPH
+ 0x86AA: 0x5570, //CJK UNIFIED IDEOGRAPH
+ 0x86AB: 0x5571, //CJK UNIFIED IDEOGRAPH
+ 0x86AC: 0x5572, //CJK UNIFIED IDEOGRAPH
+ 0x86AD: 0x5573, //CJK UNIFIED IDEOGRAPH
+ 0x86AE: 0x5574, //CJK UNIFIED IDEOGRAPH
+ 0x86AF: 0x5579, //CJK UNIFIED IDEOGRAPH
+ 0x86B0: 0x557A, //CJK UNIFIED IDEOGRAPH
+ 0x86B1: 0x557D, //CJK UNIFIED IDEOGRAPH
+ 0x86B2: 0x557F, //CJK UNIFIED IDEOGRAPH
+ 0x86B3: 0x5585, //CJK UNIFIED IDEOGRAPH
+ 0x86B4: 0x5586, //CJK UNIFIED IDEOGRAPH
+ 0x86B5: 0x558C, //CJK UNIFIED IDEOGRAPH
+ 0x86B6: 0x558D, //CJK UNIFIED IDEOGRAPH
+ 0x86B7: 0x558E, //CJK UNIFIED IDEOGRAPH
+ 0x86B8: 0x5590, //CJK UNIFIED IDEOGRAPH
+ 0x86B9: 0x5592, //CJK UNIFIED IDEOGRAPH
+ 0x86BA: 0x5593, //CJK UNIFIED IDEOGRAPH
+ 0x86BB: 0x5595, //CJK UNIFIED IDEOGRAPH
+ 0x86BC: 0x5596, //CJK UNIFIED IDEOGRAPH
+ 0x86BD: 0x5597, //CJK UNIFIED IDEOGRAPH
+ 0x86BE: 0x559A, //CJK UNIFIED IDEOGRAPH
+ 0x86BF: 0x559B, //CJK UNIFIED IDEOGRAPH
+ 0x86C0: 0x559E, //CJK UNIFIED IDEOGRAPH
+ 0x86C1: 0x55A0, //CJK UNIFIED IDEOGRAPH
+ 0x86C2: 0x55A1, //CJK UNIFIED IDEOGRAPH
+ 0x86C3: 0x55A2, //CJK UNIFIED IDEOGRAPH
+ 0x86C4: 0x55A3, //CJK UNIFIED IDEOGRAPH
+ 0x86C5: 0x55A4, //CJK UNIFIED IDEOGRAPH
+ 0x86C6: 0x55A5, //CJK UNIFIED IDEOGRAPH
+ 0x86C7: 0x55A6, //CJK UNIFIED IDEOGRAPH
+ 0x86C8: 0x55A8, //CJK UNIFIED IDEOGRAPH
+ 0x86C9: 0x55A9, //CJK UNIFIED IDEOGRAPH
+ 0x86CA: 0x55AA, //CJK UNIFIED IDEOGRAPH
+ 0x86CB: 0x55AB, //CJK UNIFIED IDEOGRAPH
+ 0x86CC: 0x55AC, //CJK UNIFIED IDEOGRAPH
+ 0x86CD: 0x55AD, //CJK UNIFIED IDEOGRAPH
+ 0x86CE: 0x55AE, //CJK UNIFIED IDEOGRAPH
+ 0x86CF: 0x55AF, //CJK UNIFIED IDEOGRAPH
+ 0x86D0: 0x55B0, //CJK UNIFIED IDEOGRAPH
+ 0x86D1: 0x55B2, //CJK UNIFIED IDEOGRAPH
+ 0x86D2: 0x55B4, //CJK UNIFIED IDEOGRAPH
+ 0x86D3: 0x55B6, //CJK UNIFIED IDEOGRAPH
+ 0x86D4: 0x55B8, //CJK UNIFIED IDEOGRAPH
+ 0x86D5: 0x55BA, //CJK UNIFIED IDEOGRAPH
+ 0x86D6: 0x55BC, //CJK UNIFIED IDEOGRAPH
+ 0x86D7: 0x55BF, //CJK UNIFIED IDEOGRAPH
+ 0x86D8: 0x55C0, //CJK UNIFIED IDEOGRAPH
+ 0x86D9: 0x55C1, //CJK UNIFIED IDEOGRAPH
+ 0x86DA: 0x55C2, //CJK UNIFIED IDEOGRAPH
+ 0x86DB: 0x55C3, //CJK UNIFIED IDEOGRAPH
+ 0x86DC: 0x55C6, //CJK UNIFIED IDEOGRAPH
+ 0x86DD: 0x55C7, //CJK UNIFIED IDEOGRAPH
+ 0x86DE: 0x55C8, //CJK UNIFIED IDEOGRAPH
+ 0x86DF: 0x55CA, //CJK UNIFIED IDEOGRAPH
+ 0x86E0: 0x55CB, //CJK UNIFIED IDEOGRAPH
+ 0x86E1: 0x55CE, //CJK UNIFIED IDEOGRAPH
+ 0x86E2: 0x55CF, //CJK UNIFIED IDEOGRAPH
+ 0x86E3: 0x55D0, //CJK UNIFIED IDEOGRAPH
+ 0x86E4: 0x55D5, //CJK UNIFIED IDEOGRAPH
+ 0x86E5: 0x55D7, //CJK UNIFIED IDEOGRAPH
+ 0x86E6: 0x55D8, //CJK UNIFIED IDEOGRAPH
+ 0x86E7: 0x55D9, //CJK UNIFIED IDEOGRAPH
+ 0x86E8: 0x55DA, //CJK UNIFIED IDEOGRAPH
+ 0x86E9: 0x55DB, //CJK UNIFIED IDEOGRAPH
+ 0x86EA: 0x55DE, //CJK UNIFIED IDEOGRAPH
+ 0x86EB: 0x55E0, //CJK UNIFIED IDEOGRAPH
+ 0x86EC: 0x55E2, //CJK UNIFIED IDEOGRAPH
+ 0x86ED: 0x55E7, //CJK UNIFIED IDEOGRAPH
+ 0x86EE: 0x55E9, //CJK UNIFIED IDEOGRAPH
+ 0x86EF: 0x55ED, //CJK UNIFIED IDEOGRAPH
+ 0x86F0: 0x55EE, //CJK UNIFIED IDEOGRAPH
+ 0x86F1: 0x55F0, //CJK UNIFIED IDEOGRAPH
+ 0x86F2: 0x55F1, //CJK UNIFIED IDEOGRAPH
+ 0x86F3: 0x55F4, //CJK UNIFIED IDEOGRAPH
+ 0x86F4: 0x55F6, //CJK UNIFIED IDEOGRAPH
+ 0x86F5: 0x55F8, //CJK UNIFIED IDEOGRAPH
+ 0x86F6: 0x55F9, //CJK UNIFIED IDEOGRAPH
+ 0x86F7: 0x55FA, //CJK UNIFIED IDEOGRAPH
+ 0x86F8: 0x55FB, //CJK UNIFIED IDEOGRAPH
+ 0x86F9: 0x55FC, //CJK UNIFIED IDEOGRAPH
+ 0x86FA: 0x55FF, //CJK UNIFIED IDEOGRAPH
+ 0x86FB: 0x5602, //CJK UNIFIED IDEOGRAPH
+ 0x86FC: 0x5603, //CJK UNIFIED IDEOGRAPH
+ 0x86FD: 0x5604, //CJK UNIFIED IDEOGRAPH
+ 0x86FE: 0x5605, //CJK UNIFIED IDEOGRAPH
+ 0x8740: 0x5606, //CJK UNIFIED IDEOGRAPH
+ 0x8741: 0x5607, //CJK UNIFIED IDEOGRAPH
+ 0x8742: 0x560A, //CJK UNIFIED IDEOGRAPH
+ 0x8743: 0x560B, //CJK UNIFIED IDEOGRAPH
+ 0x8744: 0x560D, //CJK UNIFIED IDEOGRAPH
+ 0x8745: 0x5610, //CJK UNIFIED IDEOGRAPH
+ 0x8746: 0x5611, //CJK UNIFIED IDEOGRAPH
+ 0x8747: 0x5612, //CJK UNIFIED IDEOGRAPH
+ 0x8748: 0x5613, //CJK UNIFIED IDEOGRAPH
+ 0x8749: 0x5614, //CJK UNIFIED IDEOGRAPH
+ 0x874A: 0x5615, //CJK UNIFIED IDEOGRAPH
+ 0x874B: 0x5616, //CJK UNIFIED IDEOGRAPH
+ 0x874C: 0x5617, //CJK UNIFIED IDEOGRAPH
+ 0x874D: 0x5619, //CJK UNIFIED IDEOGRAPH
+ 0x874E: 0x561A, //CJK UNIFIED IDEOGRAPH
+ 0x874F: 0x561C, //CJK UNIFIED IDEOGRAPH
+ 0x8750: 0x561D, //CJK UNIFIED IDEOGRAPH
+ 0x8751: 0x5620, //CJK UNIFIED IDEOGRAPH
+ 0x8752: 0x5621, //CJK UNIFIED IDEOGRAPH
+ 0x8753: 0x5622, //CJK UNIFIED IDEOGRAPH
+ 0x8754: 0x5625, //CJK UNIFIED IDEOGRAPH
+ 0x8755: 0x5626, //CJK UNIFIED IDEOGRAPH
+ 0x8756: 0x5628, //CJK UNIFIED IDEOGRAPH
+ 0x8757: 0x5629, //CJK UNIFIED IDEOGRAPH
+ 0x8758: 0x562A, //CJK UNIFIED IDEOGRAPH
+ 0x8759: 0x562B, //CJK UNIFIED IDEOGRAPH
+ 0x875A: 0x562E, //CJK UNIFIED IDEOGRAPH
+ 0x875B: 0x562F, //CJK UNIFIED IDEOGRAPH
+ 0x875C: 0x5630, //CJK UNIFIED IDEOGRAPH
+ 0x875D: 0x5633, //CJK UNIFIED IDEOGRAPH
+ 0x875E: 0x5635, //CJK UNIFIED IDEOGRAPH
+ 0x875F: 0x5637, //CJK UNIFIED IDEOGRAPH
+ 0x8760: 0x5638, //CJK UNIFIED IDEOGRAPH
+ 0x8761: 0x563A, //CJK UNIFIED IDEOGRAPH
+ 0x8762: 0x563C, //CJK UNIFIED IDEOGRAPH
+ 0x8763: 0x563D, //CJK UNIFIED IDEOGRAPH
+ 0x8764: 0x563E, //CJK UNIFIED IDEOGRAPH
+ 0x8765: 0x5640, //CJK UNIFIED IDEOGRAPH
+ 0x8766: 0x5641, //CJK UNIFIED IDEOGRAPH
+ 0x8767: 0x5642, //CJK UNIFIED IDEOGRAPH
+ 0x8768: 0x5643, //CJK UNIFIED IDEOGRAPH
+ 0x8769: 0x5644, //CJK UNIFIED IDEOGRAPH
+ 0x876A: 0x5645, //CJK UNIFIED IDEOGRAPH
+ 0x876B: 0x5646, //CJK UNIFIED IDEOGRAPH
+ 0x876C: 0x5647, //CJK UNIFIED IDEOGRAPH
+ 0x876D: 0x5648, //CJK UNIFIED IDEOGRAPH
+ 0x876E: 0x5649, //CJK UNIFIED IDEOGRAPH
+ 0x876F: 0x564A, //CJK UNIFIED IDEOGRAPH
+ 0x8770: 0x564B, //CJK UNIFIED IDEOGRAPH
+ 0x8771: 0x564F, //CJK UNIFIED IDEOGRAPH
+ 0x8772: 0x5650, //CJK UNIFIED IDEOGRAPH
+ 0x8773: 0x5651, //CJK UNIFIED IDEOGRAPH
+ 0x8774: 0x5652, //CJK UNIFIED IDEOGRAPH
+ 0x8775: 0x5653, //CJK UNIFIED IDEOGRAPH
+ 0x8776: 0x5655, //CJK UNIFIED IDEOGRAPH
+ 0x8777: 0x5656, //CJK UNIFIED IDEOGRAPH
+ 0x8778: 0x565A, //CJK UNIFIED IDEOGRAPH
+ 0x8779: 0x565B, //CJK UNIFIED IDEOGRAPH
+ 0x877A: 0x565D, //CJK UNIFIED IDEOGRAPH
+ 0x877B: 0x565E, //CJK UNIFIED IDEOGRAPH
+ 0x877C: 0x565F, //CJK UNIFIED IDEOGRAPH
+ 0x877D: 0x5660, //CJK UNIFIED IDEOGRAPH
+ 0x877E: 0x5661, //CJK UNIFIED IDEOGRAPH
+ 0x8780: 0x5663, //CJK UNIFIED IDEOGRAPH
+ 0x8781: 0x5665, //CJK UNIFIED IDEOGRAPH
+ 0x8782: 0x5666, //CJK UNIFIED IDEOGRAPH
+ 0x8783: 0x5667, //CJK UNIFIED IDEOGRAPH
+ 0x8784: 0x566D, //CJK UNIFIED IDEOGRAPH
+ 0x8785: 0x566E, //CJK UNIFIED IDEOGRAPH
+ 0x8786: 0x566F, //CJK UNIFIED IDEOGRAPH
+ 0x8787: 0x5670, //CJK UNIFIED IDEOGRAPH
+ 0x8788: 0x5672, //CJK UNIFIED IDEOGRAPH
+ 0x8789: 0x5673, //CJK UNIFIED IDEOGRAPH
+ 0x878A: 0x5674, //CJK UNIFIED IDEOGRAPH
+ 0x878B: 0x5675, //CJK UNIFIED IDEOGRAPH
+ 0x878C: 0x5677, //CJK UNIFIED IDEOGRAPH
+ 0x878D: 0x5678, //CJK UNIFIED IDEOGRAPH
+ 0x878E: 0x5679, //CJK UNIFIED IDEOGRAPH
+ 0x878F: 0x567A, //CJK UNIFIED IDEOGRAPH
+ 0x8790: 0x567D, //CJK UNIFIED IDEOGRAPH
+ 0x8791: 0x567E, //CJK UNIFIED IDEOGRAPH
+ 0x8792: 0x567F, //CJK UNIFIED IDEOGRAPH
+ 0x8793: 0x5680, //CJK UNIFIED IDEOGRAPH
+ 0x8794: 0x5681, //CJK UNIFIED IDEOGRAPH
+ 0x8795: 0x5682, //CJK UNIFIED IDEOGRAPH
+ 0x8796: 0x5683, //CJK UNIFIED IDEOGRAPH
+ 0x8797: 0x5684, //CJK UNIFIED IDEOGRAPH
+ 0x8798: 0x5687, //CJK UNIFIED IDEOGRAPH
+ 0x8799: 0x5688, //CJK UNIFIED IDEOGRAPH
+ 0x879A: 0x5689, //CJK UNIFIED IDEOGRAPH
+ 0x879B: 0x568A, //CJK UNIFIED IDEOGRAPH
+ 0x879C: 0x568B, //CJK UNIFIED IDEOGRAPH
+ 0x879D: 0x568C, //CJK UNIFIED IDEOGRAPH
+ 0x879E: 0x568D, //CJK UNIFIED IDEOGRAPH
+ 0x879F: 0x5690, //CJK UNIFIED IDEOGRAPH
+ 0x87A0: 0x5691, //CJK UNIFIED IDEOGRAPH
+ 0x87A1: 0x5692, //CJK UNIFIED IDEOGRAPH
+ 0x87A2: 0x5694, //CJK UNIFIED IDEOGRAPH
+ 0x87A3: 0x5695, //CJK UNIFIED IDEOGRAPH
+ 0x87A4: 0x5696, //CJK UNIFIED IDEOGRAPH
+ 0x87A5: 0x5697, //CJK UNIFIED IDEOGRAPH
+ 0x87A6: 0x5698, //CJK UNIFIED IDEOGRAPH
+ 0x87A7: 0x5699, //CJK UNIFIED IDEOGRAPH
+ 0x87A8: 0x569A, //CJK UNIFIED IDEOGRAPH
+ 0x87A9: 0x569B, //CJK UNIFIED IDEOGRAPH
+ 0x87AA: 0x569C, //CJK UNIFIED IDEOGRAPH
+ 0x87AB: 0x569D, //CJK UNIFIED IDEOGRAPH
+ 0x87AC: 0x569E, //CJK UNIFIED IDEOGRAPH
+ 0x87AD: 0x569F, //CJK UNIFIED IDEOGRAPH
+ 0x87AE: 0x56A0, //CJK UNIFIED IDEOGRAPH
+ 0x87AF: 0x56A1, //CJK UNIFIED IDEOGRAPH
+ 0x87B0: 0x56A2, //CJK UNIFIED IDEOGRAPH
+ 0x87B1: 0x56A4, //CJK UNIFIED IDEOGRAPH
+ 0x87B2: 0x56A5, //CJK UNIFIED IDEOGRAPH
+ 0x87B3: 0x56A6, //CJK UNIFIED IDEOGRAPH
+ 0x87B4: 0x56A7, //CJK UNIFIED IDEOGRAPH
+ 0x87B5: 0x56A8, //CJK UNIFIED IDEOGRAPH
+ 0x87B6: 0x56A9, //CJK UNIFIED IDEOGRAPH
+ 0x87B7: 0x56AA, //CJK UNIFIED IDEOGRAPH
+ 0x87B8: 0x56AB, //CJK UNIFIED IDEOGRAPH
+ 0x87B9: 0x56AC, //CJK UNIFIED IDEOGRAPH
+ 0x87BA: 0x56AD, //CJK UNIFIED IDEOGRAPH
+ 0x87BB: 0x56AE, //CJK UNIFIED IDEOGRAPH
+ 0x87BC: 0x56B0, //CJK UNIFIED IDEOGRAPH
+ 0x87BD: 0x56B1, //CJK UNIFIED IDEOGRAPH
+ 0x87BE: 0x56B2, //CJK UNIFIED IDEOGRAPH
+ 0x87BF: 0x56B3, //CJK UNIFIED IDEOGRAPH
+ 0x87C0: 0x56B4, //CJK UNIFIED IDEOGRAPH
+ 0x87C1: 0x56B5, //CJK UNIFIED IDEOGRAPH
+ 0x87C2: 0x56B6, //CJK UNIFIED IDEOGRAPH
+ 0x87C3: 0x56B8, //CJK UNIFIED IDEOGRAPH
+ 0x87C4: 0x56B9, //CJK UNIFIED IDEOGRAPH
+ 0x87C5: 0x56BA, //CJK UNIFIED IDEOGRAPH
+ 0x87C6: 0x56BB, //CJK UNIFIED IDEOGRAPH
+ 0x87C7: 0x56BD, //CJK UNIFIED IDEOGRAPH
+ 0x87C8: 0x56BE, //CJK UNIFIED IDEOGRAPH
+ 0x87C9: 0x56BF, //CJK UNIFIED IDEOGRAPH
+ 0x87CA: 0x56C0, //CJK UNIFIED IDEOGRAPH
+ 0x87CB: 0x56C1, //CJK UNIFIED IDEOGRAPH
+ 0x87CC: 0x56C2, //CJK UNIFIED IDEOGRAPH
+ 0x87CD: 0x56C3, //CJK UNIFIED IDEOGRAPH
+ 0x87CE: 0x56C4, //CJK UNIFIED IDEOGRAPH
+ 0x87CF: 0x56C5, //CJK UNIFIED IDEOGRAPH
+ 0x87D0: 0x56C6, //CJK UNIFIED IDEOGRAPH
+ 0x87D1: 0x56C7, //CJK UNIFIED IDEOGRAPH
+ 0x87D2: 0x56C8, //CJK UNIFIED IDEOGRAPH
+ 0x87D3: 0x56C9, //CJK UNIFIED IDEOGRAPH
+ 0x87D4: 0x56CB, //CJK UNIFIED IDEOGRAPH
+ 0x87D5: 0x56CC, //CJK UNIFIED IDEOGRAPH
+ 0x87D6: 0x56CD, //CJK UNIFIED IDEOGRAPH
+ 0x87D7: 0x56CE, //CJK UNIFIED IDEOGRAPH
+ 0x87D8: 0x56CF, //CJK UNIFIED IDEOGRAPH
+ 0x87D9: 0x56D0, //CJK UNIFIED IDEOGRAPH
+ 0x87DA: 0x56D1, //CJK UNIFIED IDEOGRAPH
+ 0x87DB: 0x56D2, //CJK UNIFIED IDEOGRAPH
+ 0x87DC: 0x56D3, //CJK UNIFIED IDEOGRAPH
+ 0x87DD: 0x56D5, //CJK UNIFIED IDEOGRAPH
+ 0x87DE: 0x56D6, //CJK UNIFIED IDEOGRAPH
+ 0x87DF: 0x56D8, //CJK UNIFIED IDEOGRAPH
+ 0x87E0: 0x56D9, //CJK UNIFIED IDEOGRAPH
+ 0x87E1: 0x56DC, //CJK UNIFIED IDEOGRAPH
+ 0x87E2: 0x56E3, //CJK UNIFIED IDEOGRAPH
+ 0x87E3: 0x56E5, //CJK UNIFIED IDEOGRAPH
+ 0x87E4: 0x56E6, //CJK UNIFIED IDEOGRAPH
+ 0x87E5: 0x56E7, //CJK UNIFIED IDEOGRAPH
+ 0x87E6: 0x56E8, //CJK UNIFIED IDEOGRAPH
+ 0x87E7: 0x56E9, //CJK UNIFIED IDEOGRAPH
+ 0x87E8: 0x56EA, //CJK UNIFIED IDEOGRAPH
+ 0x87E9: 0x56EC, //CJK UNIFIED IDEOGRAPH
+ 0x87EA: 0x56EE, //CJK UNIFIED IDEOGRAPH
+ 0x87EB: 0x56EF, //CJK UNIFIED IDEOGRAPH
+ 0x87EC: 0x56F2, //CJK UNIFIED IDEOGRAPH
+ 0x87ED: 0x56F3, //CJK UNIFIED IDEOGRAPH
+ 0x87EE: 0x56F6, //CJK UNIFIED IDEOGRAPH
+ 0x87EF: 0x56F7, //CJK UNIFIED IDEOGRAPH
+ 0x87F0: 0x56F8, //CJK UNIFIED IDEOGRAPH
+ 0x87F1: 0x56FB, //CJK UNIFIED IDEOGRAPH
+ 0x87F2: 0x56FC, //CJK UNIFIED IDEOGRAPH
+ 0x87F3: 0x5700, //CJK UNIFIED IDEOGRAPH
+ 0x87F4: 0x5701, //CJK UNIFIED IDEOGRAPH
+ 0x87F5: 0x5702, //CJK UNIFIED IDEOGRAPH
+ 0x87F6: 0x5705, //CJK UNIFIED IDEOGRAPH
+ 0x87F7: 0x5707, //CJK UNIFIED IDEOGRAPH
+ 0x87F8: 0x570B, //CJK UNIFIED IDEOGRAPH
+ 0x87F9: 0x570C, //CJK UNIFIED IDEOGRAPH
+ 0x87FA: 0x570D, //CJK UNIFIED IDEOGRAPH
+ 0x87FB: 0x570E, //CJK UNIFIED IDEOGRAPH
+ 0x87FC: 0x570F, //CJK UNIFIED IDEOGRAPH
+ 0x87FD: 0x5710, //CJK UNIFIED IDEOGRAPH
+ 0x87FE: 0x5711, //CJK UNIFIED IDEOGRAPH
+ 0x8840: 0x5712, //CJK UNIFIED IDEOGRAPH
+ 0x8841: 0x5713, //CJK UNIFIED IDEOGRAPH
+ 0x8842: 0x5714, //CJK UNIFIED IDEOGRAPH
+ 0x8843: 0x5715, //CJK UNIFIED IDEOGRAPH
+ 0x8844: 0x5716, //CJK UNIFIED IDEOGRAPH
+ 0x8845: 0x5717, //CJK UNIFIED IDEOGRAPH
+ 0x8846: 0x5718, //CJK UNIFIED IDEOGRAPH
+ 0x8847: 0x5719, //CJK UNIFIED IDEOGRAPH
+ 0x8848: 0x571A, //CJK UNIFIED IDEOGRAPH
+ 0x8849: 0x571B, //CJK UNIFIED IDEOGRAPH
+ 0x884A: 0x571D, //CJK UNIFIED IDEOGRAPH
+ 0x884B: 0x571E, //CJK UNIFIED IDEOGRAPH
+ 0x884C: 0x5720, //CJK UNIFIED IDEOGRAPH
+ 0x884D: 0x5721, //CJK UNIFIED IDEOGRAPH
+ 0x884E: 0x5722, //CJK UNIFIED IDEOGRAPH
+ 0x884F: 0x5724, //CJK UNIFIED IDEOGRAPH
+ 0x8850: 0x5725, //CJK UNIFIED IDEOGRAPH
+ 0x8851: 0x5726, //CJK UNIFIED IDEOGRAPH
+ 0x8852: 0x5727, //CJK UNIFIED IDEOGRAPH
+ 0x8853: 0x572B, //CJK UNIFIED IDEOGRAPH
+ 0x8854: 0x5731, //CJK UNIFIED IDEOGRAPH
+ 0x8855: 0x5732, //CJK UNIFIED IDEOGRAPH
+ 0x8856: 0x5734, //CJK UNIFIED IDEOGRAPH
+ 0x8857: 0x5735, //CJK UNIFIED IDEOGRAPH
+ 0x8858: 0x5736, //CJK UNIFIED IDEOGRAPH
+ 0x8859: 0x5737, //CJK UNIFIED IDEOGRAPH
+ 0x885A: 0x5738, //CJK UNIFIED IDEOGRAPH
+ 0x885B: 0x573C, //CJK UNIFIED IDEOGRAPH
+ 0x885C: 0x573D, //CJK UNIFIED IDEOGRAPH
+ 0x885D: 0x573F, //CJK UNIFIED IDEOGRAPH
+ 0x885E: 0x5741, //CJK UNIFIED IDEOGRAPH
+ 0x885F: 0x5743, //CJK UNIFIED IDEOGRAPH
+ 0x8860: 0x5744, //CJK UNIFIED IDEOGRAPH
+ 0x8861: 0x5745, //CJK UNIFIED IDEOGRAPH
+ 0x8862: 0x5746, //CJK UNIFIED IDEOGRAPH
+ 0x8863: 0x5748, //CJK UNIFIED IDEOGRAPH
+ 0x8864: 0x5749, //CJK UNIFIED IDEOGRAPH
+ 0x8865: 0x574B, //CJK UNIFIED IDEOGRAPH
+ 0x8866: 0x5752, //CJK UNIFIED IDEOGRAPH
+ 0x8867: 0x5753, //CJK UNIFIED IDEOGRAPH
+ 0x8868: 0x5754, //CJK UNIFIED IDEOGRAPH
+ 0x8869: 0x5755, //CJK UNIFIED IDEOGRAPH
+ 0x886A: 0x5756, //CJK UNIFIED IDEOGRAPH
+ 0x886B: 0x5758, //CJK UNIFIED IDEOGRAPH
+ 0x886C: 0x5759, //CJK UNIFIED IDEOGRAPH
+ 0x886D: 0x5762, //CJK UNIFIED IDEOGRAPH
+ 0x886E: 0x5763, //CJK UNIFIED IDEOGRAPH
+ 0x886F: 0x5765, //CJK UNIFIED IDEOGRAPH
+ 0x8870: 0x5767, //CJK UNIFIED IDEOGRAPH
+ 0x8871: 0x576C, //CJK UNIFIED IDEOGRAPH
+ 0x8872: 0x576E, //CJK UNIFIED IDEOGRAPH
+ 0x8873: 0x5770, //CJK UNIFIED IDEOGRAPH
+ 0x8874: 0x5771, //CJK UNIFIED IDEOGRAPH
+ 0x8875: 0x5772, //CJK UNIFIED IDEOGRAPH
+ 0x8876: 0x5774, //CJK UNIFIED IDEOGRAPH
+ 0x8877: 0x5775, //CJK UNIFIED IDEOGRAPH
+ 0x8878: 0x5778, //CJK UNIFIED IDEOGRAPH
+ 0x8879: 0x5779, //CJK UNIFIED IDEOGRAPH
+ 0x887A: 0x577A, //CJK UNIFIED IDEOGRAPH
+ 0x887B: 0x577D, //CJK UNIFIED IDEOGRAPH
+ 0x887C: 0x577E, //CJK UNIFIED IDEOGRAPH
+ 0x887D: 0x577F, //CJK UNIFIED IDEOGRAPH
+ 0x887E: 0x5780, //CJK UNIFIED IDEOGRAPH
+ 0x8880: 0x5781, //CJK UNIFIED IDEOGRAPH
+ 0x8881: 0x5787, //CJK UNIFIED IDEOGRAPH
+ 0x8882: 0x5788, //CJK UNIFIED IDEOGRAPH
+ 0x8883: 0x5789, //CJK UNIFIED IDEOGRAPH
+ 0x8884: 0x578A, //CJK UNIFIED IDEOGRAPH
+ 0x8885: 0x578D, //CJK UNIFIED IDEOGRAPH
+ 0x8886: 0x578E, //CJK UNIFIED IDEOGRAPH
+ 0x8887: 0x578F, //CJK UNIFIED IDEOGRAPH
+ 0x8888: 0x5790, //CJK UNIFIED IDEOGRAPH
+ 0x8889: 0x5791, //CJK UNIFIED IDEOGRAPH
+ 0x888A: 0x5794, //CJK UNIFIED IDEOGRAPH
+ 0x888B: 0x5795, //CJK UNIFIED IDEOGRAPH
+ 0x888C: 0x5796, //CJK UNIFIED IDEOGRAPH
+ 0x888D: 0x5797, //CJK UNIFIED IDEOGRAPH
+ 0x888E: 0x5798, //CJK UNIFIED IDEOGRAPH
+ 0x888F: 0x5799, //CJK UNIFIED IDEOGRAPH
+ 0x8890: 0x579A, //CJK UNIFIED IDEOGRAPH
+ 0x8891: 0x579C, //CJK UNIFIED IDEOGRAPH
+ 0x8892: 0x579D, //CJK UNIFIED IDEOGRAPH
+ 0x8893: 0x579E, //CJK UNIFIED IDEOGRAPH
+ 0x8894: 0x579F, //CJK UNIFIED IDEOGRAPH
+ 0x8895: 0x57A5, //CJK UNIFIED IDEOGRAPH
+ 0x8896: 0x57A8, //CJK UNIFIED IDEOGRAPH
+ 0x8897: 0x57AA, //CJK UNIFIED IDEOGRAPH
+ 0x8898: 0x57AC, //CJK UNIFIED IDEOGRAPH
+ 0x8899: 0x57AF, //CJK UNIFIED IDEOGRAPH
+ 0x889A: 0x57B0, //CJK UNIFIED IDEOGRAPH
+ 0x889B: 0x57B1, //CJK UNIFIED IDEOGRAPH
+ 0x889C: 0x57B3, //CJK UNIFIED IDEOGRAPH
+ 0x889D: 0x57B5, //CJK UNIFIED IDEOGRAPH
+ 0x889E: 0x57B6, //CJK UNIFIED IDEOGRAPH
+ 0x889F: 0x57B7, //CJK UNIFIED IDEOGRAPH
+ 0x88A0: 0x57B9, //CJK UNIFIED IDEOGRAPH
+ 0x88A1: 0x57BA, //CJK UNIFIED IDEOGRAPH
+ 0x88A2: 0x57BB, //CJK UNIFIED IDEOGRAPH
+ 0x88A3: 0x57BC, //CJK UNIFIED IDEOGRAPH
+ 0x88A4: 0x57BD, //CJK UNIFIED IDEOGRAPH
+ 0x88A5: 0x57BE, //CJK UNIFIED IDEOGRAPH
+ 0x88A6: 0x57BF, //CJK UNIFIED IDEOGRAPH
+ 0x88A7: 0x57C0, //CJK UNIFIED IDEOGRAPH
+ 0x88A8: 0x57C1, //CJK UNIFIED IDEOGRAPH
+ 0x88A9: 0x57C4, //CJK UNIFIED IDEOGRAPH
+ 0x88AA: 0x57C5, //CJK UNIFIED IDEOGRAPH
+ 0x88AB: 0x57C6, //CJK UNIFIED IDEOGRAPH
+ 0x88AC: 0x57C7, //CJK UNIFIED IDEOGRAPH
+ 0x88AD: 0x57C8, //CJK UNIFIED IDEOGRAPH
+ 0x88AE: 0x57C9, //CJK UNIFIED IDEOGRAPH
+ 0x88AF: 0x57CA, //CJK UNIFIED IDEOGRAPH
+ 0x88B0: 0x57CC, //CJK UNIFIED IDEOGRAPH
+ 0x88B1: 0x57CD, //CJK UNIFIED IDEOGRAPH
+ 0x88B2: 0x57D0, //CJK UNIFIED IDEOGRAPH
+ 0x88B3: 0x57D1, //CJK UNIFIED IDEOGRAPH
+ 0x88B4: 0x57D3, //CJK UNIFIED IDEOGRAPH
+ 0x88B5: 0x57D6, //CJK UNIFIED IDEOGRAPH
+ 0x88B6: 0x57D7, //CJK UNIFIED IDEOGRAPH
+ 0x88B7: 0x57DB, //CJK UNIFIED IDEOGRAPH
+ 0x88B8: 0x57DC, //CJK UNIFIED IDEOGRAPH
+ 0x88B9: 0x57DE, //CJK UNIFIED IDEOGRAPH
+ 0x88BA: 0x57E1, //CJK UNIFIED IDEOGRAPH
+ 0x88BB: 0x57E2, //CJK UNIFIED IDEOGRAPH
+ 0x88BC: 0x57E3, //CJK UNIFIED IDEOGRAPH
+ 0x88BD: 0x57E5, //CJK UNIFIED IDEOGRAPH
+ 0x88BE: 0x57E6, //CJK UNIFIED IDEOGRAPH
+ 0x88BF: 0x57E7, //CJK UNIFIED IDEOGRAPH
+ 0x88C0: 0x57E8, //CJK UNIFIED IDEOGRAPH
+ 0x88C1: 0x57E9, //CJK UNIFIED IDEOGRAPH
+ 0x88C2: 0x57EA, //CJK UNIFIED IDEOGRAPH
+ 0x88C3: 0x57EB, //CJK UNIFIED IDEOGRAPH
+ 0x88C4: 0x57EC, //CJK UNIFIED IDEOGRAPH
+ 0x88C5: 0x57EE, //CJK UNIFIED IDEOGRAPH
+ 0x88C6: 0x57F0, //CJK UNIFIED IDEOGRAPH
+ 0x88C7: 0x57F1, //CJK UNIFIED IDEOGRAPH
+ 0x88C8: 0x57F2, //CJK UNIFIED IDEOGRAPH
+ 0x88C9: 0x57F3, //CJK UNIFIED IDEOGRAPH
+ 0x88CA: 0x57F5, //CJK UNIFIED IDEOGRAPH
+ 0x88CB: 0x57F6, //CJK UNIFIED IDEOGRAPH
+ 0x88CC: 0x57F7, //CJK UNIFIED IDEOGRAPH
+ 0x88CD: 0x57FB, //CJK UNIFIED IDEOGRAPH
+ 0x88CE: 0x57FC, //CJK UNIFIED IDEOGRAPH
+ 0x88CF: 0x57FE, //CJK UNIFIED IDEOGRAPH
+ 0x88D0: 0x57FF, //CJK UNIFIED IDEOGRAPH
+ 0x88D1: 0x5801, //CJK UNIFIED IDEOGRAPH
+ 0x88D2: 0x5803, //CJK UNIFIED IDEOGRAPH
+ 0x88D3: 0x5804, //CJK UNIFIED IDEOGRAPH
+ 0x88D4: 0x5805, //CJK UNIFIED IDEOGRAPH
+ 0x88D5: 0x5808, //CJK UNIFIED IDEOGRAPH
+ 0x88D6: 0x5809, //CJK UNIFIED IDEOGRAPH
+ 0x88D7: 0x580A, //CJK UNIFIED IDEOGRAPH
+ 0x88D8: 0x580C, //CJK UNIFIED IDEOGRAPH
+ 0x88D9: 0x580E, //CJK UNIFIED IDEOGRAPH
+ 0x88DA: 0x580F, //CJK UNIFIED IDEOGRAPH
+ 0x88DB: 0x5810, //CJK UNIFIED IDEOGRAPH
+ 0x88DC: 0x5812, //CJK UNIFIED IDEOGRAPH
+ 0x88DD: 0x5813, //CJK UNIFIED IDEOGRAPH
+ 0x88DE: 0x5814, //CJK UNIFIED IDEOGRAPH
+ 0x88DF: 0x5816, //CJK UNIFIED IDEOGRAPH
+ 0x88E0: 0x5817, //CJK UNIFIED IDEOGRAPH
+ 0x88E1: 0x5818, //CJK UNIFIED IDEOGRAPH
+ 0x88E2: 0x581A, //CJK UNIFIED IDEOGRAPH
+ 0x88E3: 0x581B, //CJK UNIFIED IDEOGRAPH
+ 0x88E4: 0x581C, //CJK UNIFIED IDEOGRAPH
+ 0x88E5: 0x581D, //CJK UNIFIED IDEOGRAPH
+ 0x88E6: 0x581F, //CJK UNIFIED IDEOGRAPH
+ 0x88E7: 0x5822, //CJK UNIFIED IDEOGRAPH
+ 0x88E8: 0x5823, //CJK UNIFIED IDEOGRAPH
+ 0x88E9: 0x5825, //CJK UNIFIED IDEOGRAPH
+ 0x88EA: 0x5826, //CJK UNIFIED IDEOGRAPH
+ 0x88EB: 0x5827, //CJK UNIFIED IDEOGRAPH
+ 0x88EC: 0x5828, //CJK UNIFIED IDEOGRAPH
+ 0x88ED: 0x5829, //CJK UNIFIED IDEOGRAPH
+ 0x88EE: 0x582B, //CJK UNIFIED IDEOGRAPH
+ 0x88EF: 0x582C, //CJK UNIFIED IDEOGRAPH
+ 0x88F0: 0x582D, //CJK UNIFIED IDEOGRAPH
+ 0x88F1: 0x582E, //CJK UNIFIED IDEOGRAPH
+ 0x88F2: 0x582F, //CJK UNIFIED IDEOGRAPH
+ 0x88F3: 0x5831, //CJK UNIFIED IDEOGRAPH
+ 0x88F4: 0x5832, //CJK UNIFIED IDEOGRAPH
+ 0x88F5: 0x5833, //CJK UNIFIED IDEOGRAPH
+ 0x88F6: 0x5834, //CJK UNIFIED IDEOGRAPH
+ 0x88F7: 0x5836, //CJK UNIFIED IDEOGRAPH
+ 0x88F8: 0x5837, //CJK UNIFIED IDEOGRAPH
+ 0x88F9: 0x5838, //CJK UNIFIED IDEOGRAPH
+ 0x88FA: 0x5839, //CJK UNIFIED IDEOGRAPH
+ 0x88FB: 0x583A, //CJK UNIFIED IDEOGRAPH
+ 0x88FC: 0x583B, //CJK UNIFIED IDEOGRAPH
+ 0x88FD: 0x583C, //CJK UNIFIED IDEOGRAPH
+ 0x88FE: 0x583D, //CJK UNIFIED IDEOGRAPH
+ 0x8940: 0x583E, //CJK UNIFIED IDEOGRAPH
+ 0x8941: 0x583F, //CJK UNIFIED IDEOGRAPH
+ 0x8942: 0x5840, //CJK UNIFIED IDEOGRAPH
+ 0x8943: 0x5841, //CJK UNIFIED IDEOGRAPH
+ 0x8944: 0x5842, //CJK UNIFIED IDEOGRAPH
+ 0x8945: 0x5843, //CJK UNIFIED IDEOGRAPH
+ 0x8946: 0x5845, //CJK UNIFIED IDEOGRAPH
+ 0x8947: 0x5846, //CJK UNIFIED IDEOGRAPH
+ 0x8948: 0x5847, //CJK UNIFIED IDEOGRAPH
+ 0x8949: 0x5848, //CJK UNIFIED IDEOGRAPH
+ 0x894A: 0x5849, //CJK UNIFIED IDEOGRAPH
+ 0x894B: 0x584A, //CJK UNIFIED IDEOGRAPH
+ 0x894C: 0x584B, //CJK UNIFIED IDEOGRAPH
+ 0x894D: 0x584E, //CJK UNIFIED IDEOGRAPH
+ 0x894E: 0x584F, //CJK UNIFIED IDEOGRAPH
+ 0x894F: 0x5850, //CJK UNIFIED IDEOGRAPH
+ 0x8950: 0x5852, //CJK UNIFIED IDEOGRAPH
+ 0x8951: 0x5853, //CJK UNIFIED IDEOGRAPH
+ 0x8952: 0x5855, //CJK UNIFIED IDEOGRAPH
+ 0x8953: 0x5856, //CJK UNIFIED IDEOGRAPH
+ 0x8954: 0x5857, //CJK UNIFIED IDEOGRAPH
+ 0x8955: 0x5859, //CJK UNIFIED IDEOGRAPH
+ 0x8956: 0x585A, //CJK UNIFIED IDEOGRAPH
+ 0x8957: 0x585B, //CJK UNIFIED IDEOGRAPH
+ 0x8958: 0x585C, //CJK UNIFIED IDEOGRAPH
+ 0x8959: 0x585D, //CJK UNIFIED IDEOGRAPH
+ 0x895A: 0x585F, //CJK UNIFIED IDEOGRAPH
+ 0x895B: 0x5860, //CJK UNIFIED IDEOGRAPH
+ 0x895C: 0x5861, //CJK UNIFIED IDEOGRAPH
+ 0x895D: 0x5862, //CJK UNIFIED IDEOGRAPH
+ 0x895E: 0x5863, //CJK UNIFIED IDEOGRAPH
+ 0x895F: 0x5864, //CJK UNIFIED IDEOGRAPH
+ 0x8960: 0x5866, //CJK UNIFIED IDEOGRAPH
+ 0x8961: 0x5867, //CJK UNIFIED IDEOGRAPH
+ 0x8962: 0x5868, //CJK UNIFIED IDEOGRAPH
+ 0x8963: 0x5869, //CJK UNIFIED IDEOGRAPH
+ 0x8964: 0x586A, //CJK UNIFIED IDEOGRAPH
+ 0x8965: 0x586D, //CJK UNIFIED IDEOGRAPH
+ 0x8966: 0x586E, //CJK UNIFIED IDEOGRAPH
+ 0x8967: 0x586F, //CJK UNIFIED IDEOGRAPH
+ 0x8968: 0x5870, //CJK UNIFIED IDEOGRAPH
+ 0x8969: 0x5871, //CJK UNIFIED IDEOGRAPH
+ 0x896A: 0x5872, //CJK UNIFIED IDEOGRAPH
+ 0x896B: 0x5873, //CJK UNIFIED IDEOGRAPH
+ 0x896C: 0x5874, //CJK UNIFIED IDEOGRAPH
+ 0x896D: 0x5875, //CJK UNIFIED IDEOGRAPH
+ 0x896E: 0x5876, //CJK UNIFIED IDEOGRAPH
+ 0x896F: 0x5877, //CJK UNIFIED IDEOGRAPH
+ 0x8970: 0x5878, //CJK UNIFIED IDEOGRAPH
+ 0x8971: 0x5879, //CJK UNIFIED IDEOGRAPH
+ 0x8972: 0x587A, //CJK UNIFIED IDEOGRAPH
+ 0x8973: 0x587B, //CJK UNIFIED IDEOGRAPH
+ 0x8974: 0x587C, //CJK UNIFIED IDEOGRAPH
+ 0x8975: 0x587D, //CJK UNIFIED IDEOGRAPH
+ 0x8976: 0x587F, //CJK UNIFIED IDEOGRAPH
+ 0x8977: 0x5882, //CJK UNIFIED IDEOGRAPH
+ 0x8978: 0x5884, //CJK UNIFIED IDEOGRAPH
+ 0x8979: 0x5886, //CJK UNIFIED IDEOGRAPH
+ 0x897A: 0x5887, //CJK UNIFIED IDEOGRAPH
+ 0x897B: 0x5888, //CJK UNIFIED IDEOGRAPH
+ 0x897C: 0x588A, //CJK UNIFIED IDEOGRAPH
+ 0x897D: 0x588B, //CJK UNIFIED IDEOGRAPH
+ 0x897E: 0x588C, //CJK UNIFIED IDEOGRAPH
+ 0x8980: 0x588D, //CJK UNIFIED IDEOGRAPH
+ 0x8981: 0x588E, //CJK UNIFIED IDEOGRAPH
+ 0x8982: 0x588F, //CJK UNIFIED IDEOGRAPH
+ 0x8983: 0x5890, //CJK UNIFIED IDEOGRAPH
+ 0x8984: 0x5891, //CJK UNIFIED IDEOGRAPH
+ 0x8985: 0x5894, //CJK UNIFIED IDEOGRAPH
+ 0x8986: 0x5895, //CJK UNIFIED IDEOGRAPH
+ 0x8987: 0x5896, //CJK UNIFIED IDEOGRAPH
+ 0x8988: 0x5897, //CJK UNIFIED IDEOGRAPH
+ 0x8989: 0x5898, //CJK UNIFIED IDEOGRAPH
+ 0x898A: 0x589B, //CJK UNIFIED IDEOGRAPH
+ 0x898B: 0x589C, //CJK UNIFIED IDEOGRAPH
+ 0x898C: 0x589D, //CJK UNIFIED IDEOGRAPH
+ 0x898D: 0x58A0, //CJK UNIFIED IDEOGRAPH
+ 0x898E: 0x58A1, //CJK UNIFIED IDEOGRAPH
+ 0x898F: 0x58A2, //CJK UNIFIED IDEOGRAPH
+ 0x8990: 0x58A3, //CJK UNIFIED IDEOGRAPH
+ 0x8991: 0x58A4, //CJK UNIFIED IDEOGRAPH
+ 0x8992: 0x58A5, //CJK UNIFIED IDEOGRAPH
+ 0x8993: 0x58A6, //CJK UNIFIED IDEOGRAPH
+ 0x8994: 0x58A7, //CJK UNIFIED IDEOGRAPH
+ 0x8995: 0x58AA, //CJK UNIFIED IDEOGRAPH
+ 0x8996: 0x58AB, //CJK UNIFIED IDEOGRAPH
+ 0x8997: 0x58AC, //CJK UNIFIED IDEOGRAPH
+ 0x8998: 0x58AD, //CJK UNIFIED IDEOGRAPH
+ 0x8999: 0x58AE, //CJK UNIFIED IDEOGRAPH
+ 0x899A: 0x58AF, //CJK UNIFIED IDEOGRAPH
+ 0x899B: 0x58B0, //CJK UNIFIED IDEOGRAPH
+ 0x899C: 0x58B1, //CJK UNIFIED IDEOGRAPH
+ 0x899D: 0x58B2, //CJK UNIFIED IDEOGRAPH
+ 0x899E: 0x58B3, //CJK UNIFIED IDEOGRAPH
+ 0x899F: 0x58B4, //CJK UNIFIED IDEOGRAPH
+ 0x89A0: 0x58B5, //CJK UNIFIED IDEOGRAPH
+ 0x89A1: 0x58B6, //CJK UNIFIED IDEOGRAPH
+ 0x89A2: 0x58B7, //CJK UNIFIED IDEOGRAPH
+ 0x89A3: 0x58B8, //CJK UNIFIED IDEOGRAPH
+ 0x89A4: 0x58B9, //CJK UNIFIED IDEOGRAPH
+ 0x89A5: 0x58BA, //CJK UNIFIED IDEOGRAPH
+ 0x89A6: 0x58BB, //CJK UNIFIED IDEOGRAPH
+ 0x89A7: 0x58BD, //CJK UNIFIED IDEOGRAPH
+ 0x89A8: 0x58BE, //CJK UNIFIED IDEOGRAPH
+ 0x89A9: 0x58BF, //CJK UNIFIED IDEOGRAPH
+ 0x89AA: 0x58C0, //CJK UNIFIED IDEOGRAPH
+ 0x89AB: 0x58C2, //CJK UNIFIED IDEOGRAPH
+ 0x89AC: 0x58C3, //CJK UNIFIED IDEOGRAPH
+ 0x89AD: 0x58C4, //CJK UNIFIED IDEOGRAPH
+ 0x89AE: 0x58C6, //CJK UNIFIED IDEOGRAPH
+ 0x89AF: 0x58C7, //CJK UNIFIED IDEOGRAPH
+ 0x89B0: 0x58C8, //CJK UNIFIED IDEOGRAPH
+ 0x89B1: 0x58C9, //CJK UNIFIED IDEOGRAPH
+ 0x89B2: 0x58CA, //CJK UNIFIED IDEOGRAPH
+ 0x89B3: 0x58CB, //CJK UNIFIED IDEOGRAPH
+ 0x89B4: 0x58CC, //CJK UNIFIED IDEOGRAPH
+ 0x89B5: 0x58CD, //CJK UNIFIED IDEOGRAPH
+ 0x89B6: 0x58CE, //CJK UNIFIED IDEOGRAPH
+ 0x89B7: 0x58CF, //CJK UNIFIED IDEOGRAPH
+ 0x89B8: 0x58D0, //CJK UNIFIED IDEOGRAPH
+ 0x89B9: 0x58D2, //CJK UNIFIED IDEOGRAPH
+ 0x89BA: 0x58D3, //CJK UNIFIED IDEOGRAPH
+ 0x89BB: 0x58D4, //CJK UNIFIED IDEOGRAPH
+ 0x89BC: 0x58D6, //CJK UNIFIED IDEOGRAPH
+ 0x89BD: 0x58D7, //CJK UNIFIED IDEOGRAPH
+ 0x89BE: 0x58D8, //CJK UNIFIED IDEOGRAPH
+ 0x89BF: 0x58D9, //CJK UNIFIED IDEOGRAPH
+ 0x89C0: 0x58DA, //CJK UNIFIED IDEOGRAPH
+ 0x89C1: 0x58DB, //CJK UNIFIED IDEOGRAPH
+ 0x89C2: 0x58DC, //CJK UNIFIED IDEOGRAPH
+ 0x89C3: 0x58DD, //CJK UNIFIED IDEOGRAPH
+ 0x89C4: 0x58DE, //CJK UNIFIED IDEOGRAPH
+ 0x89C5: 0x58DF, //CJK UNIFIED IDEOGRAPH
+ 0x89C6: 0x58E0, //CJK UNIFIED IDEOGRAPH
+ 0x89C7: 0x58E1, //CJK UNIFIED IDEOGRAPH
+ 0x89C8: 0x58E2, //CJK UNIFIED IDEOGRAPH
+ 0x89C9: 0x58E3, //CJK UNIFIED IDEOGRAPH
+ 0x89CA: 0x58E5, //CJK UNIFIED IDEOGRAPH
+ 0x89CB: 0x58E6, //CJK UNIFIED IDEOGRAPH
+ 0x89CC: 0x58E7, //CJK UNIFIED IDEOGRAPH
+ 0x89CD: 0x58E8, //CJK UNIFIED IDEOGRAPH
+ 0x89CE: 0x58E9, //CJK UNIFIED IDEOGRAPH
+ 0x89CF: 0x58EA, //CJK UNIFIED IDEOGRAPH
+ 0x89D0: 0x58ED, //CJK UNIFIED IDEOGRAPH
+ 0x89D1: 0x58EF, //CJK UNIFIED IDEOGRAPH
+ 0x89D2: 0x58F1, //CJK UNIFIED IDEOGRAPH
+ 0x89D3: 0x58F2, //CJK UNIFIED IDEOGRAPH
+ 0x89D4: 0x58F4, //CJK UNIFIED IDEOGRAPH
+ 0x89D5: 0x58F5, //CJK UNIFIED IDEOGRAPH
+ 0x89D6: 0x58F7, //CJK UNIFIED IDEOGRAPH
+ 0x89D7: 0x58F8, //CJK UNIFIED IDEOGRAPH
+ 0x89D8: 0x58FA, //CJK UNIFIED IDEOGRAPH
+ 0x89D9: 0x58FB, //CJK UNIFIED IDEOGRAPH
+ 0x89DA: 0x58FC, //CJK UNIFIED IDEOGRAPH
+ 0x89DB: 0x58FD, //CJK UNIFIED IDEOGRAPH
+ 0x89DC: 0x58FE, //CJK UNIFIED IDEOGRAPH
+ 0x89DD: 0x58FF, //CJK UNIFIED IDEOGRAPH
+ 0x89DE: 0x5900, //CJK UNIFIED IDEOGRAPH
+ 0x89DF: 0x5901, //CJK UNIFIED IDEOGRAPH
+ 0x89E0: 0x5903, //CJK UNIFIED IDEOGRAPH
+ 0x89E1: 0x5905, //CJK UNIFIED IDEOGRAPH
+ 0x89E2: 0x5906, //CJK UNIFIED IDEOGRAPH
+ 0x89E3: 0x5908, //CJK UNIFIED IDEOGRAPH
+ 0x89E4: 0x5909, //CJK UNIFIED IDEOGRAPH
+ 0x89E5: 0x590A, //CJK UNIFIED IDEOGRAPH
+ 0x89E6: 0x590B, //CJK UNIFIED IDEOGRAPH
+ 0x89E7: 0x590C, //CJK UNIFIED IDEOGRAPH
+ 0x89E8: 0x590E, //CJK UNIFIED IDEOGRAPH
+ 0x89E9: 0x5910, //CJK UNIFIED IDEOGRAPH
+ 0x89EA: 0x5911, //CJK UNIFIED IDEOGRAPH
+ 0x89EB: 0x5912, //CJK UNIFIED IDEOGRAPH
+ 0x89EC: 0x5913, //CJK UNIFIED IDEOGRAPH
+ 0x89ED: 0x5917, //CJK UNIFIED IDEOGRAPH
+ 0x89EE: 0x5918, //CJK UNIFIED IDEOGRAPH
+ 0x89EF: 0x591B, //CJK UNIFIED IDEOGRAPH
+ 0x89F0: 0x591D, //CJK UNIFIED IDEOGRAPH
+ 0x89F1: 0x591E, //CJK UNIFIED IDEOGRAPH
+ 0x89F2: 0x5920, //CJK UNIFIED IDEOGRAPH
+ 0x89F3: 0x5921, //CJK UNIFIED IDEOGRAPH
+ 0x89F4: 0x5922, //CJK UNIFIED IDEOGRAPH
+ 0x89F5: 0x5923, //CJK UNIFIED IDEOGRAPH
+ 0x89F6: 0x5926, //CJK UNIFIED IDEOGRAPH
+ 0x89F7: 0x5928, //CJK UNIFIED IDEOGRAPH
+ 0x89F8: 0x592C, //CJK UNIFIED IDEOGRAPH
+ 0x89F9: 0x5930, //CJK UNIFIED IDEOGRAPH
+ 0x89FA: 0x5932, //CJK UNIFIED IDEOGRAPH
+ 0x89FB: 0x5933, //CJK UNIFIED IDEOGRAPH
+ 0x89FC: 0x5935, //CJK UNIFIED IDEOGRAPH
+ 0x89FD: 0x5936, //CJK UNIFIED IDEOGRAPH
+ 0x89FE: 0x593B, //CJK UNIFIED IDEOGRAPH
+ 0x8A40: 0x593D, //CJK UNIFIED IDEOGRAPH
+ 0x8A41: 0x593E, //CJK UNIFIED IDEOGRAPH
+ 0x8A42: 0x593F, //CJK UNIFIED IDEOGRAPH
+ 0x8A43: 0x5940, //CJK UNIFIED IDEOGRAPH
+ 0x8A44: 0x5943, //CJK UNIFIED IDEOGRAPH
+ 0x8A45: 0x5945, //CJK UNIFIED IDEOGRAPH
+ 0x8A46: 0x5946, //CJK UNIFIED IDEOGRAPH
+ 0x8A47: 0x594A, //CJK UNIFIED IDEOGRAPH
+ 0x8A48: 0x594C, //CJK UNIFIED IDEOGRAPH
+ 0x8A49: 0x594D, //CJK UNIFIED IDEOGRAPH
+ 0x8A4A: 0x5950, //CJK UNIFIED IDEOGRAPH
+ 0x8A4B: 0x5952, //CJK UNIFIED IDEOGRAPH
+ 0x8A4C: 0x5953, //CJK UNIFIED IDEOGRAPH
+ 0x8A4D: 0x5959, //CJK UNIFIED IDEOGRAPH
+ 0x8A4E: 0x595B, //CJK UNIFIED IDEOGRAPH
+ 0x8A4F: 0x595C, //CJK UNIFIED IDEOGRAPH
+ 0x8A50: 0x595D, //CJK UNIFIED IDEOGRAPH
+ 0x8A51: 0x595E, //CJK UNIFIED IDEOGRAPH
+ 0x8A52: 0x595F, //CJK UNIFIED IDEOGRAPH
+ 0x8A53: 0x5961, //CJK UNIFIED IDEOGRAPH
+ 0x8A54: 0x5963, //CJK UNIFIED IDEOGRAPH
+ 0x8A55: 0x5964, //CJK UNIFIED IDEOGRAPH
+ 0x8A56: 0x5966, //CJK UNIFIED IDEOGRAPH
+ 0x8A57: 0x5967, //CJK UNIFIED IDEOGRAPH
+ 0x8A58: 0x5968, //CJK UNIFIED IDEOGRAPH
+ 0x8A59: 0x5969, //CJK UNIFIED IDEOGRAPH
+ 0x8A5A: 0x596A, //CJK UNIFIED IDEOGRAPH
+ 0x8A5B: 0x596B, //CJK UNIFIED IDEOGRAPH
+ 0x8A5C: 0x596C, //CJK UNIFIED IDEOGRAPH
+ 0x8A5D: 0x596D, //CJK UNIFIED IDEOGRAPH
+ 0x8A5E: 0x596E, //CJK UNIFIED IDEOGRAPH
+ 0x8A5F: 0x596F, //CJK UNIFIED IDEOGRAPH
+ 0x8A60: 0x5970, //CJK UNIFIED IDEOGRAPH
+ 0x8A61: 0x5971, //CJK UNIFIED IDEOGRAPH
+ 0x8A62: 0x5972, //CJK UNIFIED IDEOGRAPH
+ 0x8A63: 0x5975, //CJK UNIFIED IDEOGRAPH
+ 0x8A64: 0x5977, //CJK UNIFIED IDEOGRAPH
+ 0x8A65: 0x597A, //CJK UNIFIED IDEOGRAPH
+ 0x8A66: 0x597B, //CJK UNIFIED IDEOGRAPH
+ 0x8A67: 0x597C, //CJK UNIFIED IDEOGRAPH
+ 0x8A68: 0x597E, //CJK UNIFIED IDEOGRAPH
+ 0x8A69: 0x597F, //CJK UNIFIED IDEOGRAPH
+ 0x8A6A: 0x5980, //CJK UNIFIED IDEOGRAPH
+ 0x8A6B: 0x5985, //CJK UNIFIED IDEOGRAPH
+ 0x8A6C: 0x5989, //CJK UNIFIED IDEOGRAPH
+ 0x8A6D: 0x598B, //CJK UNIFIED IDEOGRAPH
+ 0x8A6E: 0x598C, //CJK UNIFIED IDEOGRAPH
+ 0x8A6F: 0x598E, //CJK UNIFIED IDEOGRAPH
+ 0x8A70: 0x598F, //CJK UNIFIED IDEOGRAPH
+ 0x8A71: 0x5990, //CJK UNIFIED IDEOGRAPH
+ 0x8A72: 0x5991, //CJK UNIFIED IDEOGRAPH
+ 0x8A73: 0x5994, //CJK UNIFIED IDEOGRAPH
+ 0x8A74: 0x5995, //CJK UNIFIED IDEOGRAPH
+ 0x8A75: 0x5998, //CJK UNIFIED IDEOGRAPH
+ 0x8A76: 0x599A, //CJK UNIFIED IDEOGRAPH
+ 0x8A77: 0x599B, //CJK UNIFIED IDEOGRAPH
+ 0x8A78: 0x599C, //CJK UNIFIED IDEOGRAPH
+ 0x8A79: 0x599D, //CJK UNIFIED IDEOGRAPH
+ 0x8A7A: 0x599F, //CJK UNIFIED IDEOGRAPH
+ 0x8A7B: 0x59A0, //CJK UNIFIED IDEOGRAPH
+ 0x8A7C: 0x59A1, //CJK UNIFIED IDEOGRAPH
+ 0x8A7D: 0x59A2, //CJK UNIFIED IDEOGRAPH
+ 0x8A7E: 0x59A6, //CJK UNIFIED IDEOGRAPH
+ 0x8A80: 0x59A7, //CJK UNIFIED IDEOGRAPH
+ 0x8A81: 0x59AC, //CJK UNIFIED IDEOGRAPH
+ 0x8A82: 0x59AD, //CJK UNIFIED IDEOGRAPH
+ 0x8A83: 0x59B0, //CJK UNIFIED IDEOGRAPH
+ 0x8A84: 0x59B1, //CJK UNIFIED IDEOGRAPH
+ 0x8A85: 0x59B3, //CJK UNIFIED IDEOGRAPH
+ 0x8A86: 0x59B4, //CJK UNIFIED IDEOGRAPH
+ 0x8A87: 0x59B5, //CJK UNIFIED IDEOGRAPH
+ 0x8A88: 0x59B6, //CJK UNIFIED IDEOGRAPH
+ 0x8A89: 0x59B7, //CJK UNIFIED IDEOGRAPH
+ 0x8A8A: 0x59B8, //CJK UNIFIED IDEOGRAPH
+ 0x8A8B: 0x59BA, //CJK UNIFIED IDEOGRAPH
+ 0x8A8C: 0x59BC, //CJK UNIFIED IDEOGRAPH
+ 0x8A8D: 0x59BD, //CJK UNIFIED IDEOGRAPH
+ 0x8A8E: 0x59BF, //CJK UNIFIED IDEOGRAPH
+ 0x8A8F: 0x59C0, //CJK UNIFIED IDEOGRAPH
+ 0x8A90: 0x59C1, //CJK UNIFIED IDEOGRAPH
+ 0x8A91: 0x59C2, //CJK UNIFIED IDEOGRAPH
+ 0x8A92: 0x59C3, //CJK UNIFIED IDEOGRAPH
+ 0x8A93: 0x59C4, //CJK UNIFIED IDEOGRAPH
+ 0x8A94: 0x59C5, //CJK UNIFIED IDEOGRAPH
+ 0x8A95: 0x59C7, //CJK UNIFIED IDEOGRAPH
+ 0x8A96: 0x59C8, //CJK UNIFIED IDEOGRAPH
+ 0x8A97: 0x59C9, //CJK UNIFIED IDEOGRAPH
+ 0x8A98: 0x59CC, //CJK UNIFIED IDEOGRAPH
+ 0x8A99: 0x59CD, //CJK UNIFIED IDEOGRAPH
+ 0x8A9A: 0x59CE, //CJK UNIFIED IDEOGRAPH
+ 0x8A9B: 0x59CF, //CJK UNIFIED IDEOGRAPH
+ 0x8A9C: 0x59D5, //CJK UNIFIED IDEOGRAPH
+ 0x8A9D: 0x59D6, //CJK UNIFIED IDEOGRAPH
+ 0x8A9E: 0x59D9, //CJK UNIFIED IDEOGRAPH
+ 0x8A9F: 0x59DB, //CJK UNIFIED IDEOGRAPH
+ 0x8AA0: 0x59DE, //CJK UNIFIED IDEOGRAPH
+ 0x8AA1: 0x59DF, //CJK UNIFIED IDEOGRAPH
+ 0x8AA2: 0x59E0, //CJK UNIFIED IDEOGRAPH
+ 0x8AA3: 0x59E1, //CJK UNIFIED IDEOGRAPH
+ 0x8AA4: 0x59E2, //CJK UNIFIED IDEOGRAPH
+ 0x8AA5: 0x59E4, //CJK UNIFIED IDEOGRAPH
+ 0x8AA6: 0x59E6, //CJK UNIFIED IDEOGRAPH
+ 0x8AA7: 0x59E7, //CJK UNIFIED IDEOGRAPH
+ 0x8AA8: 0x59E9, //CJK UNIFIED IDEOGRAPH
+ 0x8AA9: 0x59EA, //CJK UNIFIED IDEOGRAPH
+ 0x8AAA: 0x59EB, //CJK UNIFIED IDEOGRAPH
+ 0x8AAB: 0x59ED, //CJK UNIFIED IDEOGRAPH
+ 0x8AAC: 0x59EE, //CJK UNIFIED IDEOGRAPH
+ 0x8AAD: 0x59EF, //CJK UNIFIED IDEOGRAPH
+ 0x8AAE: 0x59F0, //CJK UNIFIED IDEOGRAPH
+ 0x8AAF: 0x59F1, //CJK UNIFIED IDEOGRAPH
+ 0x8AB0: 0x59F2, //CJK UNIFIED IDEOGRAPH
+ 0x8AB1: 0x59F3, //CJK UNIFIED IDEOGRAPH
+ 0x8AB2: 0x59F4, //CJK UNIFIED IDEOGRAPH
+ 0x8AB3: 0x59F5, //CJK UNIFIED IDEOGRAPH
+ 0x8AB4: 0x59F6, //CJK UNIFIED IDEOGRAPH
+ 0x8AB5: 0x59F7, //CJK UNIFIED IDEOGRAPH
+ 0x8AB6: 0x59F8, //CJK UNIFIED IDEOGRAPH
+ 0x8AB7: 0x59FA, //CJK UNIFIED IDEOGRAPH
+ 0x8AB8: 0x59FC, //CJK UNIFIED IDEOGRAPH
+ 0x8AB9: 0x59FD, //CJK UNIFIED IDEOGRAPH
+ 0x8ABA: 0x59FE, //CJK UNIFIED IDEOGRAPH
+ 0x8ABB: 0x5A00, //CJK UNIFIED IDEOGRAPH
+ 0x8ABC: 0x5A02, //CJK UNIFIED IDEOGRAPH
+ 0x8ABD: 0x5A0A, //CJK UNIFIED IDEOGRAPH
+ 0x8ABE: 0x5A0B, //CJK UNIFIED IDEOGRAPH
+ 0x8ABF: 0x5A0D, //CJK UNIFIED IDEOGRAPH
+ 0x8AC0: 0x5A0E, //CJK UNIFIED IDEOGRAPH
+ 0x8AC1: 0x5A0F, //CJK UNIFIED IDEOGRAPH
+ 0x8AC2: 0x5A10, //CJK UNIFIED IDEOGRAPH
+ 0x8AC3: 0x5A12, //CJK UNIFIED IDEOGRAPH
+ 0x8AC4: 0x5A14, //CJK UNIFIED IDEOGRAPH
+ 0x8AC5: 0x5A15, //CJK UNIFIED IDEOGRAPH
+ 0x8AC6: 0x5A16, //CJK UNIFIED IDEOGRAPH
+ 0x8AC7: 0x5A17, //CJK UNIFIED IDEOGRAPH
+ 0x8AC8: 0x5A19, //CJK UNIFIED IDEOGRAPH
+ 0x8AC9: 0x5A1A, //CJK UNIFIED IDEOGRAPH
+ 0x8ACA: 0x5A1B, //CJK UNIFIED IDEOGRAPH
+ 0x8ACB: 0x5A1D, //CJK UNIFIED IDEOGRAPH
+ 0x8ACC: 0x5A1E, //CJK UNIFIED IDEOGRAPH
+ 0x8ACD: 0x5A21, //CJK UNIFIED IDEOGRAPH
+ 0x8ACE: 0x5A22, //CJK UNIFIED IDEOGRAPH
+ 0x8ACF: 0x5A24, //CJK UNIFIED IDEOGRAPH
+ 0x8AD0: 0x5A26, //CJK UNIFIED IDEOGRAPH
+ 0x8AD1: 0x5A27, //CJK UNIFIED IDEOGRAPH
+ 0x8AD2: 0x5A28, //CJK UNIFIED IDEOGRAPH
+ 0x8AD3: 0x5A2A, //CJK UNIFIED IDEOGRAPH
+ 0x8AD4: 0x5A2B, //CJK UNIFIED IDEOGRAPH
+ 0x8AD5: 0x5A2C, //CJK UNIFIED IDEOGRAPH
+ 0x8AD6: 0x5A2D, //CJK UNIFIED IDEOGRAPH
+ 0x8AD7: 0x5A2E, //CJK UNIFIED IDEOGRAPH
+ 0x8AD8: 0x5A2F, //CJK UNIFIED IDEOGRAPH
+ 0x8AD9: 0x5A30, //CJK UNIFIED IDEOGRAPH
+ 0x8ADA: 0x5A33, //CJK UNIFIED IDEOGRAPH
+ 0x8ADB: 0x5A35, //CJK UNIFIED IDEOGRAPH
+ 0x8ADC: 0x5A37, //CJK UNIFIED IDEOGRAPH
+ 0x8ADD: 0x5A38, //CJK UNIFIED IDEOGRAPH
+ 0x8ADE: 0x5A39, //CJK UNIFIED IDEOGRAPH
+ 0x8ADF: 0x5A3A, //CJK UNIFIED IDEOGRAPH
+ 0x8AE0: 0x5A3B, //CJK UNIFIED IDEOGRAPH
+ 0x8AE1: 0x5A3D, //CJK UNIFIED IDEOGRAPH
+ 0x8AE2: 0x5A3E, //CJK UNIFIED IDEOGRAPH
+ 0x8AE3: 0x5A3F, //CJK UNIFIED IDEOGRAPH
+ 0x8AE4: 0x5A41, //CJK UNIFIED IDEOGRAPH
+ 0x8AE5: 0x5A42, //CJK UNIFIED IDEOGRAPH
+ 0x8AE6: 0x5A43, //CJK UNIFIED IDEOGRAPH
+ 0x8AE7: 0x5A44, //CJK UNIFIED IDEOGRAPH
+ 0x8AE8: 0x5A45, //CJK UNIFIED IDEOGRAPH
+ 0x8AE9: 0x5A47, //CJK UNIFIED IDEOGRAPH
+ 0x8AEA: 0x5A48, //CJK UNIFIED IDEOGRAPH
+ 0x8AEB: 0x5A4B, //CJK UNIFIED IDEOGRAPH
+ 0x8AEC: 0x5A4C, //CJK UNIFIED IDEOGRAPH
+ 0x8AED: 0x5A4D, //CJK UNIFIED IDEOGRAPH
+ 0x8AEE: 0x5A4E, //CJK UNIFIED IDEOGRAPH
+ 0x8AEF: 0x5A4F, //CJK UNIFIED IDEOGRAPH
+ 0x8AF0: 0x5A50, //CJK UNIFIED IDEOGRAPH
+ 0x8AF1: 0x5A51, //CJK UNIFIED IDEOGRAPH
+ 0x8AF2: 0x5A52, //CJK UNIFIED IDEOGRAPH
+ 0x8AF3: 0x5A53, //CJK UNIFIED IDEOGRAPH
+ 0x8AF4: 0x5A54, //CJK UNIFIED IDEOGRAPH
+ 0x8AF5: 0x5A56, //CJK UNIFIED IDEOGRAPH
+ 0x8AF6: 0x5A57, //CJK UNIFIED IDEOGRAPH
+ 0x8AF7: 0x5A58, //CJK UNIFIED IDEOGRAPH
+ 0x8AF8: 0x5A59, //CJK UNIFIED IDEOGRAPH
+ 0x8AF9: 0x5A5B, //CJK UNIFIED IDEOGRAPH
+ 0x8AFA: 0x5A5C, //CJK UNIFIED IDEOGRAPH
+ 0x8AFB: 0x5A5D, //CJK UNIFIED IDEOGRAPH
+ 0x8AFC: 0x5A5E, //CJK UNIFIED IDEOGRAPH
+ 0x8AFD: 0x5A5F, //CJK UNIFIED IDEOGRAPH
+ 0x8AFE: 0x5A60, //CJK UNIFIED IDEOGRAPH
+ 0x8B40: 0x5A61, //CJK UNIFIED IDEOGRAPH
+ 0x8B41: 0x5A63, //CJK UNIFIED IDEOGRAPH
+ 0x8B42: 0x5A64, //CJK UNIFIED IDEOGRAPH
+ 0x8B43: 0x5A65, //CJK UNIFIED IDEOGRAPH
+ 0x8B44: 0x5A66, //CJK UNIFIED IDEOGRAPH
+ 0x8B45: 0x5A68, //CJK UNIFIED IDEOGRAPH
+ 0x8B46: 0x5A69, //CJK UNIFIED IDEOGRAPH
+ 0x8B47: 0x5A6B, //CJK UNIFIED IDEOGRAPH
+ 0x8B48: 0x5A6C, //CJK UNIFIED IDEOGRAPH
+ 0x8B49: 0x5A6D, //CJK UNIFIED IDEOGRAPH
+ 0x8B4A: 0x5A6E, //CJK UNIFIED IDEOGRAPH
+ 0x8B4B: 0x5A6F, //CJK UNIFIED IDEOGRAPH
+ 0x8B4C: 0x5A70, //CJK UNIFIED IDEOGRAPH
+ 0x8B4D: 0x5A71, //CJK UNIFIED IDEOGRAPH
+ 0x8B4E: 0x5A72, //CJK UNIFIED IDEOGRAPH
+ 0x8B4F: 0x5A73, //CJK UNIFIED IDEOGRAPH
+ 0x8B50: 0x5A78, //CJK UNIFIED IDEOGRAPH
+ 0x8B51: 0x5A79, //CJK UNIFIED IDEOGRAPH
+ 0x8B52: 0x5A7B, //CJK UNIFIED IDEOGRAPH
+ 0x8B53: 0x5A7C, //CJK UNIFIED IDEOGRAPH
+ 0x8B54: 0x5A7D, //CJK UNIFIED IDEOGRAPH
+ 0x8B55: 0x5A7E, //CJK UNIFIED IDEOGRAPH
+ 0x8B56: 0x5A80, //CJK UNIFIED IDEOGRAPH
+ 0x8B57: 0x5A81, //CJK UNIFIED IDEOGRAPH
+ 0x8B58: 0x5A82, //CJK UNIFIED IDEOGRAPH
+ 0x8B59: 0x5A83, //CJK UNIFIED IDEOGRAPH
+ 0x8B5A: 0x5A84, //CJK UNIFIED IDEOGRAPH
+ 0x8B5B: 0x5A85, //CJK UNIFIED IDEOGRAPH
+ 0x8B5C: 0x5A86, //CJK UNIFIED IDEOGRAPH
+ 0x8B5D: 0x5A87, //CJK UNIFIED IDEOGRAPH
+ 0x8B5E: 0x5A88, //CJK UNIFIED IDEOGRAPH
+ 0x8B5F: 0x5A89, //CJK UNIFIED IDEOGRAPH
+ 0x8B60: 0x5A8A, //CJK UNIFIED IDEOGRAPH
+ 0x8B61: 0x5A8B, //CJK UNIFIED IDEOGRAPH
+ 0x8B62: 0x5A8C, //CJK UNIFIED IDEOGRAPH
+ 0x8B63: 0x5A8D, //CJK UNIFIED IDEOGRAPH
+ 0x8B64: 0x5A8E, //CJK UNIFIED IDEOGRAPH
+ 0x8B65: 0x5A8F, //CJK UNIFIED IDEOGRAPH
+ 0x8B66: 0x5A90, //CJK UNIFIED IDEOGRAPH
+ 0x8B67: 0x5A91, //CJK UNIFIED IDEOGRAPH
+ 0x8B68: 0x5A93, //CJK UNIFIED IDEOGRAPH
+ 0x8B69: 0x5A94, //CJK UNIFIED IDEOGRAPH
+ 0x8B6A: 0x5A95, //CJK UNIFIED IDEOGRAPH
+ 0x8B6B: 0x5A96, //CJK UNIFIED IDEOGRAPH
+ 0x8B6C: 0x5A97, //CJK UNIFIED IDEOGRAPH
+ 0x8B6D: 0x5A98, //CJK UNIFIED IDEOGRAPH
+ 0x8B6E: 0x5A99, //CJK UNIFIED IDEOGRAPH
+ 0x8B6F: 0x5A9C, //CJK UNIFIED IDEOGRAPH
+ 0x8B70: 0x5A9D, //CJK UNIFIED IDEOGRAPH
+ 0x8B71: 0x5A9E, //CJK UNIFIED IDEOGRAPH
+ 0x8B72: 0x5A9F, //CJK UNIFIED IDEOGRAPH
+ 0x8B73: 0x5AA0, //CJK UNIFIED IDEOGRAPH
+ 0x8B74: 0x5AA1, //CJK UNIFIED IDEOGRAPH
+ 0x8B75: 0x5AA2, //CJK UNIFIED IDEOGRAPH
+ 0x8B76: 0x5AA3, //CJK UNIFIED IDEOGRAPH
+ 0x8B77: 0x5AA4, //CJK UNIFIED IDEOGRAPH
+ 0x8B78: 0x5AA5, //CJK UNIFIED IDEOGRAPH
+ 0x8B79: 0x5AA6, //CJK UNIFIED IDEOGRAPH
+ 0x8B7A: 0x5AA7, //CJK UNIFIED IDEOGRAPH
+ 0x8B7B: 0x5AA8, //CJK UNIFIED IDEOGRAPH
+ 0x8B7C: 0x5AA9, //CJK UNIFIED IDEOGRAPH
+ 0x8B7D: 0x5AAB, //CJK UNIFIED IDEOGRAPH
+ 0x8B7E: 0x5AAC, //CJK UNIFIED IDEOGRAPH
+ 0x8B80: 0x5AAD, //CJK UNIFIED IDEOGRAPH
+ 0x8B81: 0x5AAE, //CJK UNIFIED IDEOGRAPH
+ 0x8B82: 0x5AAF, //CJK UNIFIED IDEOGRAPH
+ 0x8B83: 0x5AB0, //CJK UNIFIED IDEOGRAPH
+ 0x8B84: 0x5AB1, //CJK UNIFIED IDEOGRAPH
+ 0x8B85: 0x5AB4, //CJK UNIFIED IDEOGRAPH
+ 0x8B86: 0x5AB6, //CJK UNIFIED IDEOGRAPH
+ 0x8B87: 0x5AB7, //CJK UNIFIED IDEOGRAPH
+ 0x8B88: 0x5AB9, //CJK UNIFIED IDEOGRAPH
+ 0x8B89: 0x5ABA, //CJK UNIFIED IDEOGRAPH
+ 0x8B8A: 0x5ABB, //CJK UNIFIED IDEOGRAPH
+ 0x8B8B: 0x5ABC, //CJK UNIFIED IDEOGRAPH
+ 0x8B8C: 0x5ABD, //CJK UNIFIED IDEOGRAPH
+ 0x8B8D: 0x5ABF, //CJK UNIFIED IDEOGRAPH
+ 0x8B8E: 0x5AC0, //CJK UNIFIED IDEOGRAPH
+ 0x8B8F: 0x5AC3, //CJK UNIFIED IDEOGRAPH
+ 0x8B90: 0x5AC4, //CJK UNIFIED IDEOGRAPH
+ 0x8B91: 0x5AC5, //CJK UNIFIED IDEOGRAPH
+ 0x8B92: 0x5AC6, //CJK UNIFIED IDEOGRAPH
+ 0x8B93: 0x5AC7, //CJK UNIFIED IDEOGRAPH
+ 0x8B94: 0x5AC8, //CJK UNIFIED IDEOGRAPH
+ 0x8B95: 0x5ACA, //CJK UNIFIED IDEOGRAPH
+ 0x8B96: 0x5ACB, //CJK UNIFIED IDEOGRAPH
+ 0x8B97: 0x5ACD, //CJK UNIFIED IDEOGRAPH
+ 0x8B98: 0x5ACE, //CJK UNIFIED IDEOGRAPH
+ 0x8B99: 0x5ACF, //CJK UNIFIED IDEOGRAPH
+ 0x8B9A: 0x5AD0, //CJK UNIFIED IDEOGRAPH
+ 0x8B9B: 0x5AD1, //CJK UNIFIED IDEOGRAPH
+ 0x8B9C: 0x5AD3, //CJK UNIFIED IDEOGRAPH
+ 0x8B9D: 0x5AD5, //CJK UNIFIED IDEOGRAPH
+ 0x8B9E: 0x5AD7, //CJK UNIFIED IDEOGRAPH
+ 0x8B9F: 0x5AD9, //CJK UNIFIED IDEOGRAPH
+ 0x8BA0: 0x5ADA, //CJK UNIFIED IDEOGRAPH
+ 0x8BA1: 0x5ADB, //CJK UNIFIED IDEOGRAPH
+ 0x8BA2: 0x5ADD, //CJK UNIFIED IDEOGRAPH
+ 0x8BA3: 0x5ADE, //CJK UNIFIED IDEOGRAPH
+ 0x8BA4: 0x5ADF, //CJK UNIFIED IDEOGRAPH
+ 0x8BA5: 0x5AE2, //CJK UNIFIED IDEOGRAPH
+ 0x8BA6: 0x5AE4, //CJK UNIFIED IDEOGRAPH
+ 0x8BA7: 0x5AE5, //CJK UNIFIED IDEOGRAPH
+ 0x8BA8: 0x5AE7, //CJK UNIFIED IDEOGRAPH
+ 0x8BA9: 0x5AE8, //CJK UNIFIED IDEOGRAPH
+ 0x8BAA: 0x5AEA, //CJK UNIFIED IDEOGRAPH
+ 0x8BAB: 0x5AEC, //CJK UNIFIED IDEOGRAPH
+ 0x8BAC: 0x5AED, //CJK UNIFIED IDEOGRAPH
+ 0x8BAD: 0x5AEE, //CJK UNIFIED IDEOGRAPH
+ 0x8BAE: 0x5AEF, //CJK UNIFIED IDEOGRAPH
+ 0x8BAF: 0x5AF0, //CJK UNIFIED IDEOGRAPH
+ 0x8BB0: 0x5AF2, //CJK UNIFIED IDEOGRAPH
+ 0x8BB1: 0x5AF3, //CJK UNIFIED IDEOGRAPH
+ 0x8BB2: 0x5AF4, //CJK UNIFIED IDEOGRAPH
+ 0x8BB3: 0x5AF5, //CJK UNIFIED IDEOGRAPH
+ 0x8BB4: 0x5AF6, //CJK UNIFIED IDEOGRAPH
+ 0x8BB5: 0x5AF7, //CJK UNIFIED IDEOGRAPH
+ 0x8BB6: 0x5AF8, //CJK UNIFIED IDEOGRAPH
+ 0x8BB7: 0x5AF9, //CJK UNIFIED IDEOGRAPH
+ 0x8BB8: 0x5AFA, //CJK UNIFIED IDEOGRAPH
+ 0x8BB9: 0x5AFB, //CJK UNIFIED IDEOGRAPH
+ 0x8BBA: 0x5AFC, //CJK UNIFIED IDEOGRAPH
+ 0x8BBB: 0x5AFD, //CJK UNIFIED IDEOGRAPH
+ 0x8BBC: 0x5AFE, //CJK UNIFIED IDEOGRAPH
+ 0x8BBD: 0x5AFF, //CJK UNIFIED IDEOGRAPH
+ 0x8BBE: 0x5B00, //CJK UNIFIED IDEOGRAPH
+ 0x8BBF: 0x5B01, //CJK UNIFIED IDEOGRAPH
+ 0x8BC0: 0x5B02, //CJK UNIFIED IDEOGRAPH
+ 0x8BC1: 0x5B03, //CJK UNIFIED IDEOGRAPH
+ 0x8BC2: 0x5B04, //CJK UNIFIED IDEOGRAPH
+ 0x8BC3: 0x5B05, //CJK UNIFIED IDEOGRAPH
+ 0x8BC4: 0x5B06, //CJK UNIFIED IDEOGRAPH
+ 0x8BC5: 0x5B07, //CJK UNIFIED IDEOGRAPH
+ 0x8BC6: 0x5B08, //CJK UNIFIED IDEOGRAPH
+ 0x8BC7: 0x5B0A, //CJK UNIFIED IDEOGRAPH
+ 0x8BC8: 0x5B0B, //CJK UNIFIED IDEOGRAPH
+ 0x8BC9: 0x5B0C, //CJK UNIFIED IDEOGRAPH
+ 0x8BCA: 0x5B0D, //CJK UNIFIED IDEOGRAPH
+ 0x8BCB: 0x5B0E, //CJK UNIFIED IDEOGRAPH
+ 0x8BCC: 0x5B0F, //CJK UNIFIED IDEOGRAPH
+ 0x8BCD: 0x5B10, //CJK UNIFIED IDEOGRAPH
+ 0x8BCE: 0x5B11, //CJK UNIFIED IDEOGRAPH
+ 0x8BCF: 0x5B12, //CJK UNIFIED IDEOGRAPH
+ 0x8BD0: 0x5B13, //CJK UNIFIED IDEOGRAPH
+ 0x8BD1: 0x5B14, //CJK UNIFIED IDEOGRAPH
+ 0x8BD2: 0x5B15, //CJK UNIFIED IDEOGRAPH
+ 0x8BD3: 0x5B18, //CJK UNIFIED IDEOGRAPH
+ 0x8BD4: 0x5B19, //CJK UNIFIED IDEOGRAPH
+ 0x8BD5: 0x5B1A, //CJK UNIFIED IDEOGRAPH
+ 0x8BD6: 0x5B1B, //CJK UNIFIED IDEOGRAPH
+ 0x8BD7: 0x5B1C, //CJK UNIFIED IDEOGRAPH
+ 0x8BD8: 0x5B1D, //CJK UNIFIED IDEOGRAPH
+ 0x8BD9: 0x5B1E, //CJK UNIFIED IDEOGRAPH
+ 0x8BDA: 0x5B1F, //CJK UNIFIED IDEOGRAPH
+ 0x8BDB: 0x5B20, //CJK UNIFIED IDEOGRAPH
+ 0x8BDC: 0x5B21, //CJK UNIFIED IDEOGRAPH
+ 0x8BDD: 0x5B22, //CJK UNIFIED IDEOGRAPH
+ 0x8BDE: 0x5B23, //CJK UNIFIED IDEOGRAPH
+ 0x8BDF: 0x5B24, //CJK UNIFIED IDEOGRAPH
+ 0x8BE0: 0x5B25, //CJK UNIFIED IDEOGRAPH
+ 0x8BE1: 0x5B26, //CJK UNIFIED IDEOGRAPH
+ 0x8BE2: 0x5B27, //CJK UNIFIED IDEOGRAPH
+ 0x8BE3: 0x5B28, //CJK UNIFIED IDEOGRAPH
+ 0x8BE4: 0x5B29, //CJK UNIFIED IDEOGRAPH
+ 0x8BE5: 0x5B2A, //CJK UNIFIED IDEOGRAPH
+ 0x8BE6: 0x5B2B, //CJK UNIFIED IDEOGRAPH
+ 0x8BE7: 0x5B2C, //CJK UNIFIED IDEOGRAPH
+ 0x8BE8: 0x5B2D, //CJK UNIFIED IDEOGRAPH
+ 0x8BE9: 0x5B2E, //CJK UNIFIED IDEOGRAPH
+ 0x8BEA: 0x5B2F, //CJK UNIFIED IDEOGRAPH
+ 0x8BEB: 0x5B30, //CJK UNIFIED IDEOGRAPH
+ 0x8BEC: 0x5B31, //CJK UNIFIED IDEOGRAPH
+ 0x8BED: 0x5B33, //CJK UNIFIED IDEOGRAPH
+ 0x8BEE: 0x5B35, //CJK UNIFIED IDEOGRAPH
+ 0x8BEF: 0x5B36, //CJK UNIFIED IDEOGRAPH
+ 0x8BF0: 0x5B38, //CJK UNIFIED IDEOGRAPH
+ 0x8BF1: 0x5B39, //CJK UNIFIED IDEOGRAPH
+ 0x8BF2: 0x5B3A, //CJK UNIFIED IDEOGRAPH
+ 0x8BF3: 0x5B3B, //CJK UNIFIED IDEOGRAPH
+ 0x8BF4: 0x5B3C, //CJK UNIFIED IDEOGRAPH
+ 0x8BF5: 0x5B3D, //CJK UNIFIED IDEOGRAPH
+ 0x8BF6: 0x5B3E, //CJK UNIFIED IDEOGRAPH
+ 0x8BF7: 0x5B3F, //CJK UNIFIED IDEOGRAPH
+ 0x8BF8: 0x5B41, //CJK UNIFIED IDEOGRAPH
+ 0x8BF9: 0x5B42, //CJK UNIFIED IDEOGRAPH
+ 0x8BFA: 0x5B43, //CJK UNIFIED IDEOGRAPH
+ 0x8BFB: 0x5B44, //CJK UNIFIED IDEOGRAPH
+ 0x8BFC: 0x5B45, //CJK UNIFIED IDEOGRAPH
+ 0x8BFD: 0x5B46, //CJK UNIFIED IDEOGRAPH
+ 0x8BFE: 0x5B47, //CJK UNIFIED IDEOGRAPH
+ 0x8C40: 0x5B48, //CJK UNIFIED IDEOGRAPH
+ 0x8C41: 0x5B49, //CJK UNIFIED IDEOGRAPH
+ 0x8C42: 0x5B4A, //CJK UNIFIED IDEOGRAPH
+ 0x8C43: 0x5B4B, //CJK UNIFIED IDEOGRAPH
+ 0x8C44: 0x5B4C, //CJK UNIFIED IDEOGRAPH
+ 0x8C45: 0x5B4D, //CJK UNIFIED IDEOGRAPH
+ 0x8C46: 0x5B4E, //CJK UNIFIED IDEOGRAPH
+ 0x8C47: 0x5B4F, //CJK UNIFIED IDEOGRAPH
+ 0x8C48: 0x5B52, //CJK UNIFIED IDEOGRAPH
+ 0x8C49: 0x5B56, //CJK UNIFIED IDEOGRAPH
+ 0x8C4A: 0x5B5E, //CJK UNIFIED IDEOGRAPH
+ 0x8C4B: 0x5B60, //CJK UNIFIED IDEOGRAPH
+ 0x8C4C: 0x5B61, //CJK UNIFIED IDEOGRAPH
+ 0x8C4D: 0x5B67, //CJK UNIFIED IDEOGRAPH
+ 0x8C4E: 0x5B68, //CJK UNIFIED IDEOGRAPH
+ 0x8C4F: 0x5B6B, //CJK UNIFIED IDEOGRAPH
+ 0x8C50: 0x5B6D, //CJK UNIFIED IDEOGRAPH
+ 0x8C51: 0x5B6E, //CJK UNIFIED IDEOGRAPH
+ 0x8C52: 0x5B6F, //CJK UNIFIED IDEOGRAPH
+ 0x8C53: 0x5B72, //CJK UNIFIED IDEOGRAPH
+ 0x8C54: 0x5B74, //CJK UNIFIED IDEOGRAPH
+ 0x8C55: 0x5B76, //CJK UNIFIED IDEOGRAPH
+ 0x8C56: 0x5B77, //CJK UNIFIED IDEOGRAPH
+ 0x8C57: 0x5B78, //CJK UNIFIED IDEOGRAPH
+ 0x8C58: 0x5B79, //CJK UNIFIED IDEOGRAPH
+ 0x8C59: 0x5B7B, //CJK UNIFIED IDEOGRAPH
+ 0x8C5A: 0x5B7C, //CJK UNIFIED IDEOGRAPH
+ 0x8C5B: 0x5B7E, //CJK UNIFIED IDEOGRAPH
+ 0x8C5C: 0x5B7F, //CJK UNIFIED IDEOGRAPH
+ 0x8C5D: 0x5B82, //CJK UNIFIED IDEOGRAPH
+ 0x8C5E: 0x5B86, //CJK UNIFIED IDEOGRAPH
+ 0x8C5F: 0x5B8A, //CJK UNIFIED IDEOGRAPH
+ 0x8C60: 0x5B8D, //CJK UNIFIED IDEOGRAPH
+ 0x8C61: 0x5B8E, //CJK UNIFIED IDEOGRAPH
+ 0x8C62: 0x5B90, //CJK UNIFIED IDEOGRAPH
+ 0x8C63: 0x5B91, //CJK UNIFIED IDEOGRAPH
+ 0x8C64: 0x5B92, //CJK UNIFIED IDEOGRAPH
+ 0x8C65: 0x5B94, //CJK UNIFIED IDEOGRAPH
+ 0x8C66: 0x5B96, //CJK UNIFIED IDEOGRAPH
+ 0x8C67: 0x5B9F, //CJK UNIFIED IDEOGRAPH
+ 0x8C68: 0x5BA7, //CJK UNIFIED IDEOGRAPH
+ 0x8C69: 0x5BA8, //CJK UNIFIED IDEOGRAPH
+ 0x8C6A: 0x5BA9, //CJK UNIFIED IDEOGRAPH
+ 0x8C6B: 0x5BAC, //CJK UNIFIED IDEOGRAPH
+ 0x8C6C: 0x5BAD, //CJK UNIFIED IDEOGRAPH
+ 0x8C6D: 0x5BAE, //CJK UNIFIED IDEOGRAPH
+ 0x8C6E: 0x5BAF, //CJK UNIFIED IDEOGRAPH
+ 0x8C6F: 0x5BB1, //CJK UNIFIED IDEOGRAPH
+ 0x8C70: 0x5BB2, //CJK UNIFIED IDEOGRAPH
+ 0x8C71: 0x5BB7, //CJK UNIFIED IDEOGRAPH
+ 0x8C72: 0x5BBA, //CJK UNIFIED IDEOGRAPH
+ 0x8C73: 0x5BBB, //CJK UNIFIED IDEOGRAPH
+ 0x8C74: 0x5BBC, //CJK UNIFIED IDEOGRAPH
+ 0x8C75: 0x5BC0, //CJK UNIFIED IDEOGRAPH
+ 0x8C76: 0x5BC1, //CJK UNIFIED IDEOGRAPH
+ 0x8C77: 0x5BC3, //CJK UNIFIED IDEOGRAPH
+ 0x8C78: 0x5BC8, //CJK UNIFIED IDEOGRAPH
+ 0x8C79: 0x5BC9, //CJK UNIFIED IDEOGRAPH
+ 0x8C7A: 0x5BCA, //CJK UNIFIED IDEOGRAPH
+ 0x8C7B: 0x5BCB, //CJK UNIFIED IDEOGRAPH
+ 0x8C7C: 0x5BCD, //CJK UNIFIED IDEOGRAPH
+ 0x8C7D: 0x5BCE, //CJK UNIFIED IDEOGRAPH
+ 0x8C7E: 0x5BCF, //CJK UNIFIED IDEOGRAPH
+ 0x8C80: 0x5BD1, //CJK UNIFIED IDEOGRAPH
+ 0x8C81: 0x5BD4, //CJK UNIFIED IDEOGRAPH
+ 0x8C82: 0x5BD5, //CJK UNIFIED IDEOGRAPH
+ 0x8C83: 0x5BD6, //CJK UNIFIED IDEOGRAPH
+ 0x8C84: 0x5BD7, //CJK UNIFIED IDEOGRAPH
+ 0x8C85: 0x5BD8, //CJK UNIFIED IDEOGRAPH
+ 0x8C86: 0x5BD9, //CJK UNIFIED IDEOGRAPH
+ 0x8C87: 0x5BDA, //CJK UNIFIED IDEOGRAPH
+ 0x8C88: 0x5BDB, //CJK UNIFIED IDEOGRAPH
+ 0x8C89: 0x5BDC, //CJK UNIFIED IDEOGRAPH
+ 0x8C8A: 0x5BE0, //CJK UNIFIED IDEOGRAPH
+ 0x8C8B: 0x5BE2, //CJK UNIFIED IDEOGRAPH
+ 0x8C8C: 0x5BE3, //CJK UNIFIED IDEOGRAPH
+ 0x8C8D: 0x5BE6, //CJK UNIFIED IDEOGRAPH
+ 0x8C8E: 0x5BE7, //CJK UNIFIED IDEOGRAPH
+ 0x8C8F: 0x5BE9, //CJK UNIFIED IDEOGRAPH
+ 0x8C90: 0x5BEA, //CJK UNIFIED IDEOGRAPH
+ 0x8C91: 0x5BEB, //CJK UNIFIED IDEOGRAPH
+ 0x8C92: 0x5BEC, //CJK UNIFIED IDEOGRAPH
+ 0x8C93: 0x5BED, //CJK UNIFIED IDEOGRAPH
+ 0x8C94: 0x5BEF, //CJK UNIFIED IDEOGRAPH
+ 0x8C95: 0x5BF1, //CJK UNIFIED IDEOGRAPH
+ 0x8C96: 0x5BF2, //CJK UNIFIED IDEOGRAPH
+ 0x8C97: 0x5BF3, //CJK UNIFIED IDEOGRAPH
+ 0x8C98: 0x5BF4, //CJK UNIFIED IDEOGRAPH
+ 0x8C99: 0x5BF5, //CJK UNIFIED IDEOGRAPH
+ 0x8C9A: 0x5BF6, //CJK UNIFIED IDEOGRAPH
+ 0x8C9B: 0x5BF7, //CJK UNIFIED IDEOGRAPH
+ 0x8C9C: 0x5BFD, //CJK UNIFIED IDEOGRAPH
+ 0x8C9D: 0x5BFE, //CJK UNIFIED IDEOGRAPH
+ 0x8C9E: 0x5C00, //CJK UNIFIED IDEOGRAPH
+ 0x8C9F: 0x5C02, //CJK UNIFIED IDEOGRAPH
+ 0x8CA0: 0x5C03, //CJK UNIFIED IDEOGRAPH
+ 0x8CA1: 0x5C05, //CJK UNIFIED IDEOGRAPH
+ 0x8CA2: 0x5C07, //CJK UNIFIED IDEOGRAPH
+ 0x8CA3: 0x5C08, //CJK UNIFIED IDEOGRAPH
+ 0x8CA4: 0x5C0B, //CJK UNIFIED IDEOGRAPH
+ 0x8CA5: 0x5C0C, //CJK UNIFIED IDEOGRAPH
+ 0x8CA6: 0x5C0D, //CJK UNIFIED IDEOGRAPH
+ 0x8CA7: 0x5C0E, //CJK UNIFIED IDEOGRAPH
+ 0x8CA8: 0x5C10, //CJK UNIFIED IDEOGRAPH
+ 0x8CA9: 0x5C12, //CJK UNIFIED IDEOGRAPH
+ 0x8CAA: 0x5C13, //CJK UNIFIED IDEOGRAPH
+ 0x8CAB: 0x5C17, //CJK UNIFIED IDEOGRAPH
+ 0x8CAC: 0x5C19, //CJK UNIFIED IDEOGRAPH
+ 0x8CAD: 0x5C1B, //CJK UNIFIED IDEOGRAPH
+ 0x8CAE: 0x5C1E, //CJK UNIFIED IDEOGRAPH
+ 0x8CAF: 0x5C1F, //CJK UNIFIED IDEOGRAPH
+ 0x8CB0: 0x5C20, //CJK UNIFIED IDEOGRAPH
+ 0x8CB1: 0x5C21, //CJK UNIFIED IDEOGRAPH
+ 0x8CB2: 0x5C23, //CJK UNIFIED IDEOGRAPH
+ 0x8CB3: 0x5C26, //CJK UNIFIED IDEOGRAPH
+ 0x8CB4: 0x5C28, //CJK UNIFIED IDEOGRAPH
+ 0x8CB5: 0x5C29, //CJK UNIFIED IDEOGRAPH
+ 0x8CB6: 0x5C2A, //CJK UNIFIED IDEOGRAPH
+ 0x8CB7: 0x5C2B, //CJK UNIFIED IDEOGRAPH
+ 0x8CB8: 0x5C2D, //CJK UNIFIED IDEOGRAPH
+ 0x8CB9: 0x5C2E, //CJK UNIFIED IDEOGRAPH
+ 0x8CBA: 0x5C2F, //CJK UNIFIED IDEOGRAPH
+ 0x8CBB: 0x5C30, //CJK UNIFIED IDEOGRAPH
+ 0x8CBC: 0x5C32, //CJK UNIFIED IDEOGRAPH
+ 0x8CBD: 0x5C33, //CJK UNIFIED IDEOGRAPH
+ 0x8CBE: 0x5C35, //CJK UNIFIED IDEOGRAPH
+ 0x8CBF: 0x5C36, //CJK UNIFIED IDEOGRAPH
+ 0x8CC0: 0x5C37, //CJK UNIFIED IDEOGRAPH
+ 0x8CC1: 0x5C43, //CJK UNIFIED IDEOGRAPH
+ 0x8CC2: 0x5C44, //CJK UNIFIED IDEOGRAPH
+ 0x8CC3: 0x5C46, //CJK UNIFIED IDEOGRAPH
+ 0x8CC4: 0x5C47, //CJK UNIFIED IDEOGRAPH
+ 0x8CC5: 0x5C4C, //CJK UNIFIED IDEOGRAPH
+ 0x8CC6: 0x5C4D, //CJK UNIFIED IDEOGRAPH
+ 0x8CC7: 0x5C52, //CJK UNIFIED IDEOGRAPH
+ 0x8CC8: 0x5C53, //CJK UNIFIED IDEOGRAPH
+ 0x8CC9: 0x5C54, //CJK UNIFIED IDEOGRAPH
+ 0x8CCA: 0x5C56, //CJK UNIFIED IDEOGRAPH
+ 0x8CCB: 0x5C57, //CJK UNIFIED IDEOGRAPH
+ 0x8CCC: 0x5C58, //CJK UNIFIED IDEOGRAPH
+ 0x8CCD: 0x5C5A, //CJK UNIFIED IDEOGRAPH
+ 0x8CCE: 0x5C5B, //CJK UNIFIED IDEOGRAPH
+ 0x8CCF: 0x5C5C, //CJK UNIFIED IDEOGRAPH
+ 0x8CD0: 0x5C5D, //CJK UNIFIED IDEOGRAPH
+ 0x8CD1: 0x5C5F, //CJK UNIFIED IDEOGRAPH
+ 0x8CD2: 0x5C62, //CJK UNIFIED IDEOGRAPH
+ 0x8CD3: 0x5C64, //CJK UNIFIED IDEOGRAPH
+ 0x8CD4: 0x5C67, //CJK UNIFIED IDEOGRAPH
+ 0x8CD5: 0x5C68, //CJK UNIFIED IDEOGRAPH
+ 0x8CD6: 0x5C69, //CJK UNIFIED IDEOGRAPH
+ 0x8CD7: 0x5C6A, //CJK UNIFIED IDEOGRAPH
+ 0x8CD8: 0x5C6B, //CJK UNIFIED IDEOGRAPH
+ 0x8CD9: 0x5C6C, //CJK UNIFIED IDEOGRAPH
+ 0x8CDA: 0x5C6D, //CJK UNIFIED IDEOGRAPH
+ 0x8CDB: 0x5C70, //CJK UNIFIED IDEOGRAPH
+ 0x8CDC: 0x5C72, //CJK UNIFIED IDEOGRAPH
+ 0x8CDD: 0x5C73, //CJK UNIFIED IDEOGRAPH
+ 0x8CDE: 0x5C74, //CJK UNIFIED IDEOGRAPH
+ 0x8CDF: 0x5C75, //CJK UNIFIED IDEOGRAPH
+ 0x8CE0: 0x5C76, //CJK UNIFIED IDEOGRAPH
+ 0x8CE1: 0x5C77, //CJK UNIFIED IDEOGRAPH
+ 0x8CE2: 0x5C78, //CJK UNIFIED IDEOGRAPH
+ 0x8CE3: 0x5C7B, //CJK UNIFIED IDEOGRAPH
+ 0x8CE4: 0x5C7C, //CJK UNIFIED IDEOGRAPH
+ 0x8CE5: 0x5C7D, //CJK UNIFIED IDEOGRAPH
+ 0x8CE6: 0x5C7E, //CJK UNIFIED IDEOGRAPH
+ 0x8CE7: 0x5C80, //CJK UNIFIED IDEOGRAPH
+ 0x8CE8: 0x5C83, //CJK UNIFIED IDEOGRAPH
+ 0x8CE9: 0x5C84, //CJK UNIFIED IDEOGRAPH
+ 0x8CEA: 0x5C85, //CJK UNIFIED IDEOGRAPH
+ 0x8CEB: 0x5C86, //CJK UNIFIED IDEOGRAPH
+ 0x8CEC: 0x5C87, //CJK UNIFIED IDEOGRAPH
+ 0x8CED: 0x5C89, //CJK UNIFIED IDEOGRAPH
+ 0x8CEE: 0x5C8A, //CJK UNIFIED IDEOGRAPH
+ 0x8CEF: 0x5C8B, //CJK UNIFIED IDEOGRAPH
+ 0x8CF0: 0x5C8E, //CJK UNIFIED IDEOGRAPH
+ 0x8CF1: 0x5C8F, //CJK UNIFIED IDEOGRAPH
+ 0x8CF2: 0x5C92, //CJK UNIFIED IDEOGRAPH
+ 0x8CF3: 0x5C93, //CJK UNIFIED IDEOGRAPH
+ 0x8CF4: 0x5C95, //CJK UNIFIED IDEOGRAPH
+ 0x8CF5: 0x5C9D, //CJK UNIFIED IDEOGRAPH
+ 0x8CF6: 0x5C9E, //CJK UNIFIED IDEOGRAPH
+ 0x8CF7: 0x5C9F, //CJK UNIFIED IDEOGRAPH
+ 0x8CF8: 0x5CA0, //CJK UNIFIED IDEOGRAPH
+ 0x8CF9: 0x5CA1, //CJK UNIFIED IDEOGRAPH
+ 0x8CFA: 0x5CA4, //CJK UNIFIED IDEOGRAPH
+ 0x8CFB: 0x5CA5, //CJK UNIFIED IDEOGRAPH
+ 0x8CFC: 0x5CA6, //CJK UNIFIED IDEOGRAPH
+ 0x8CFD: 0x5CA7, //CJK UNIFIED IDEOGRAPH
+ 0x8CFE: 0x5CA8, //CJK UNIFIED IDEOGRAPH
+ 0x8D40: 0x5CAA, //CJK UNIFIED IDEOGRAPH
+ 0x8D41: 0x5CAE, //CJK UNIFIED IDEOGRAPH
+ 0x8D42: 0x5CAF, //CJK UNIFIED IDEOGRAPH
+ 0x8D43: 0x5CB0, //CJK UNIFIED IDEOGRAPH
+ 0x8D44: 0x5CB2, //CJK UNIFIED IDEOGRAPH
+ 0x8D45: 0x5CB4, //CJK UNIFIED IDEOGRAPH
+ 0x8D46: 0x5CB6, //CJK UNIFIED IDEOGRAPH
+ 0x8D47: 0x5CB9, //CJK UNIFIED IDEOGRAPH
+ 0x8D48: 0x5CBA, //CJK UNIFIED IDEOGRAPH
+ 0x8D49: 0x5CBB, //CJK UNIFIED IDEOGRAPH
+ 0x8D4A: 0x5CBC, //CJK UNIFIED IDEOGRAPH
+ 0x8D4B: 0x5CBE, //CJK UNIFIED IDEOGRAPH
+ 0x8D4C: 0x5CC0, //CJK UNIFIED IDEOGRAPH
+ 0x8D4D: 0x5CC2, //CJK UNIFIED IDEOGRAPH
+ 0x8D4E: 0x5CC3, //CJK UNIFIED IDEOGRAPH
+ 0x8D4F: 0x5CC5, //CJK UNIFIED IDEOGRAPH
+ 0x8D50: 0x5CC6, //CJK UNIFIED IDEOGRAPH
+ 0x8D51: 0x5CC7, //CJK UNIFIED IDEOGRAPH
+ 0x8D52: 0x5CC8, //CJK UNIFIED IDEOGRAPH
+ 0x8D53: 0x5CC9, //CJK UNIFIED IDEOGRAPH
+ 0x8D54: 0x5CCA, //CJK UNIFIED IDEOGRAPH
+ 0x8D55: 0x5CCC, //CJK UNIFIED IDEOGRAPH
+ 0x8D56: 0x5CCD, //CJK UNIFIED IDEOGRAPH
+ 0x8D57: 0x5CCE, //CJK UNIFIED IDEOGRAPH
+ 0x8D58: 0x5CCF, //CJK UNIFIED IDEOGRAPH
+ 0x8D59: 0x5CD0, //CJK UNIFIED IDEOGRAPH
+ 0x8D5A: 0x5CD1, //CJK UNIFIED IDEOGRAPH
+ 0x8D5B: 0x5CD3, //CJK UNIFIED IDEOGRAPH
+ 0x8D5C: 0x5CD4, //CJK UNIFIED IDEOGRAPH
+ 0x8D5D: 0x5CD5, //CJK UNIFIED IDEOGRAPH
+ 0x8D5E: 0x5CD6, //CJK UNIFIED IDEOGRAPH
+ 0x8D5F: 0x5CD7, //CJK UNIFIED IDEOGRAPH
+ 0x8D60: 0x5CD8, //CJK UNIFIED IDEOGRAPH
+ 0x8D61: 0x5CDA, //CJK UNIFIED IDEOGRAPH
+ 0x8D62: 0x5CDB, //CJK UNIFIED IDEOGRAPH
+ 0x8D63: 0x5CDC, //CJK UNIFIED IDEOGRAPH
+ 0x8D64: 0x5CDD, //CJK UNIFIED IDEOGRAPH
+ 0x8D65: 0x5CDE, //CJK UNIFIED IDEOGRAPH
+ 0x8D66: 0x5CDF, //CJK UNIFIED IDEOGRAPH
+ 0x8D67: 0x5CE0, //CJK UNIFIED IDEOGRAPH
+ 0x8D68: 0x5CE2, //CJK UNIFIED IDEOGRAPH
+ 0x8D69: 0x5CE3, //CJK UNIFIED IDEOGRAPH
+ 0x8D6A: 0x5CE7, //CJK UNIFIED IDEOGRAPH
+ 0x8D6B: 0x5CE9, //CJK UNIFIED IDEOGRAPH
+ 0x8D6C: 0x5CEB, //CJK UNIFIED IDEOGRAPH
+ 0x8D6D: 0x5CEC, //CJK UNIFIED IDEOGRAPH
+ 0x8D6E: 0x5CEE, //CJK UNIFIED IDEOGRAPH
+ 0x8D6F: 0x5CEF, //CJK UNIFIED IDEOGRAPH
+ 0x8D70: 0x5CF1, //CJK UNIFIED IDEOGRAPH
+ 0x8D71: 0x5CF2, //CJK UNIFIED IDEOGRAPH
+ 0x8D72: 0x5CF3, //CJK UNIFIED IDEOGRAPH
+ 0x8D73: 0x5CF4, //CJK UNIFIED IDEOGRAPH
+ 0x8D74: 0x5CF5, //CJK UNIFIED IDEOGRAPH
+ 0x8D75: 0x5CF6, //CJK UNIFIED IDEOGRAPH
+ 0x8D76: 0x5CF7, //CJK UNIFIED IDEOGRAPH
+ 0x8D77: 0x5CF8, //CJK UNIFIED IDEOGRAPH
+ 0x8D78: 0x5CF9, //CJK UNIFIED IDEOGRAPH
+ 0x8D79: 0x5CFA, //CJK UNIFIED IDEOGRAPH
+ 0x8D7A: 0x5CFC, //CJK UNIFIED IDEOGRAPH
+ 0x8D7B: 0x5CFD, //CJK UNIFIED IDEOGRAPH
+ 0x8D7C: 0x5CFE, //CJK UNIFIED IDEOGRAPH
+ 0x8D7D: 0x5CFF, //CJK UNIFIED IDEOGRAPH
+ 0x8D7E: 0x5D00, //CJK UNIFIED IDEOGRAPH
+ 0x8D80: 0x5D01, //CJK UNIFIED IDEOGRAPH
+ 0x8D81: 0x5D04, //CJK UNIFIED IDEOGRAPH
+ 0x8D82: 0x5D05, //CJK UNIFIED IDEOGRAPH
+ 0x8D83: 0x5D08, //CJK UNIFIED IDEOGRAPH
+ 0x8D84: 0x5D09, //CJK UNIFIED IDEOGRAPH
+ 0x8D85: 0x5D0A, //CJK UNIFIED IDEOGRAPH
+ 0x8D86: 0x5D0B, //CJK UNIFIED IDEOGRAPH
+ 0x8D87: 0x5D0C, //CJK UNIFIED IDEOGRAPH
+ 0x8D88: 0x5D0D, //CJK UNIFIED IDEOGRAPH
+ 0x8D89: 0x5D0F, //CJK UNIFIED IDEOGRAPH
+ 0x8D8A: 0x5D10, //CJK UNIFIED IDEOGRAPH
+ 0x8D8B: 0x5D11, //CJK UNIFIED IDEOGRAPH
+ 0x8D8C: 0x5D12, //CJK UNIFIED IDEOGRAPH
+ 0x8D8D: 0x5D13, //CJK UNIFIED IDEOGRAPH
+ 0x8D8E: 0x5D15, //CJK UNIFIED IDEOGRAPH
+ 0x8D8F: 0x5D17, //CJK UNIFIED IDEOGRAPH
+ 0x8D90: 0x5D18, //CJK UNIFIED IDEOGRAPH
+ 0x8D91: 0x5D19, //CJK UNIFIED IDEOGRAPH
+ 0x8D92: 0x5D1A, //CJK UNIFIED IDEOGRAPH
+ 0x8D93: 0x5D1C, //CJK UNIFIED IDEOGRAPH
+ 0x8D94: 0x5D1D, //CJK UNIFIED IDEOGRAPH
+ 0x8D95: 0x5D1F, //CJK UNIFIED IDEOGRAPH
+ 0x8D96: 0x5D20, //CJK UNIFIED IDEOGRAPH
+ 0x8D97: 0x5D21, //CJK UNIFIED IDEOGRAPH
+ 0x8D98: 0x5D22, //CJK UNIFIED IDEOGRAPH
+ 0x8D99: 0x5D23, //CJK UNIFIED IDEOGRAPH
+ 0x8D9A: 0x5D25, //CJK UNIFIED IDEOGRAPH
+ 0x8D9B: 0x5D28, //CJK UNIFIED IDEOGRAPH
+ 0x8D9C: 0x5D2A, //CJK UNIFIED IDEOGRAPH
+ 0x8D9D: 0x5D2B, //CJK UNIFIED IDEOGRAPH
+ 0x8D9E: 0x5D2C, //CJK UNIFIED IDEOGRAPH
+ 0x8D9F: 0x5D2F, //CJK UNIFIED IDEOGRAPH
+ 0x8DA0: 0x5D30, //CJK UNIFIED IDEOGRAPH
+ 0x8DA1: 0x5D31, //CJK UNIFIED IDEOGRAPH
+ 0x8DA2: 0x5D32, //CJK UNIFIED IDEOGRAPH
+ 0x8DA3: 0x5D33, //CJK UNIFIED IDEOGRAPH
+ 0x8DA4: 0x5D35, //CJK UNIFIED IDEOGRAPH
+ 0x8DA5: 0x5D36, //CJK UNIFIED IDEOGRAPH
+ 0x8DA6: 0x5D37, //CJK UNIFIED IDEOGRAPH
+ 0x8DA7: 0x5D38, //CJK UNIFIED IDEOGRAPH
+ 0x8DA8: 0x5D39, //CJK UNIFIED IDEOGRAPH
+ 0x8DA9: 0x5D3A, //CJK UNIFIED IDEOGRAPH
+ 0x8DAA: 0x5D3B, //CJK UNIFIED IDEOGRAPH
+ 0x8DAB: 0x5D3C, //CJK UNIFIED IDEOGRAPH
+ 0x8DAC: 0x5D3F, //CJK UNIFIED IDEOGRAPH
+ 0x8DAD: 0x5D40, //CJK UNIFIED IDEOGRAPH
+ 0x8DAE: 0x5D41, //CJK UNIFIED IDEOGRAPH
+ 0x8DAF: 0x5D42, //CJK UNIFIED IDEOGRAPH
+ 0x8DB0: 0x5D43, //CJK UNIFIED IDEOGRAPH
+ 0x8DB1: 0x5D44, //CJK UNIFIED IDEOGRAPH
+ 0x8DB2: 0x5D45, //CJK UNIFIED IDEOGRAPH
+ 0x8DB3: 0x5D46, //CJK UNIFIED IDEOGRAPH
+ 0x8DB4: 0x5D48, //CJK UNIFIED IDEOGRAPH
+ 0x8DB5: 0x5D49, //CJK UNIFIED IDEOGRAPH
+ 0x8DB6: 0x5D4D, //CJK UNIFIED IDEOGRAPH
+ 0x8DB7: 0x5D4E, //CJK UNIFIED IDEOGRAPH
+ 0x8DB8: 0x5D4F, //CJK UNIFIED IDEOGRAPH
+ 0x8DB9: 0x5D50, //CJK UNIFIED IDEOGRAPH
+ 0x8DBA: 0x5D51, //CJK UNIFIED IDEOGRAPH
+ 0x8DBB: 0x5D52, //CJK UNIFIED IDEOGRAPH
+ 0x8DBC: 0x5D53, //CJK UNIFIED IDEOGRAPH
+ 0x8DBD: 0x5D54, //CJK UNIFIED IDEOGRAPH
+ 0x8DBE: 0x5D55, //CJK UNIFIED IDEOGRAPH
+ 0x8DBF: 0x5D56, //CJK UNIFIED IDEOGRAPH
+ 0x8DC0: 0x5D57, //CJK UNIFIED IDEOGRAPH
+ 0x8DC1: 0x5D59, //CJK UNIFIED IDEOGRAPH
+ 0x8DC2: 0x5D5A, //CJK UNIFIED IDEOGRAPH
+ 0x8DC3: 0x5D5C, //CJK UNIFIED IDEOGRAPH
+ 0x8DC4: 0x5D5E, //CJK UNIFIED IDEOGRAPH
+ 0x8DC5: 0x5D5F, //CJK UNIFIED IDEOGRAPH
+ 0x8DC6: 0x5D60, //CJK UNIFIED IDEOGRAPH
+ 0x8DC7: 0x5D61, //CJK UNIFIED IDEOGRAPH
+ 0x8DC8: 0x5D62, //CJK UNIFIED IDEOGRAPH
+ 0x8DC9: 0x5D63, //CJK UNIFIED IDEOGRAPH
+ 0x8DCA: 0x5D64, //CJK UNIFIED IDEOGRAPH
+ 0x8DCB: 0x5D65, //CJK UNIFIED IDEOGRAPH
+ 0x8DCC: 0x5D66, //CJK UNIFIED IDEOGRAPH
+ 0x8DCD: 0x5D67, //CJK UNIFIED IDEOGRAPH
+ 0x8DCE: 0x5D68, //CJK UNIFIED IDEOGRAPH
+ 0x8DCF: 0x5D6A, //CJK UNIFIED IDEOGRAPH
+ 0x8DD0: 0x5D6D, //CJK UNIFIED IDEOGRAPH
+ 0x8DD1: 0x5D6E, //CJK UNIFIED IDEOGRAPH
+ 0x8DD2: 0x5D70, //CJK UNIFIED IDEOGRAPH
+ 0x8DD3: 0x5D71, //CJK UNIFIED IDEOGRAPH
+ 0x8DD4: 0x5D72, //CJK UNIFIED IDEOGRAPH
+ 0x8DD5: 0x5D73, //CJK UNIFIED IDEOGRAPH
+ 0x8DD6: 0x5D75, //CJK UNIFIED IDEOGRAPH
+ 0x8DD7: 0x5D76, //CJK UNIFIED IDEOGRAPH
+ 0x8DD8: 0x5D77, //CJK UNIFIED IDEOGRAPH
+ 0x8DD9: 0x5D78, //CJK UNIFIED IDEOGRAPH
+ 0x8DDA: 0x5D79, //CJK UNIFIED IDEOGRAPH
+ 0x8DDB: 0x5D7A, //CJK UNIFIED IDEOGRAPH
+ 0x8DDC: 0x5D7B, //CJK UNIFIED IDEOGRAPH
+ 0x8DDD: 0x5D7C, //CJK UNIFIED IDEOGRAPH
+ 0x8DDE: 0x5D7D, //CJK UNIFIED IDEOGRAPH
+ 0x8DDF: 0x5D7E, //CJK UNIFIED IDEOGRAPH
+ 0x8DE0: 0x5D7F, //CJK UNIFIED IDEOGRAPH
+ 0x8DE1: 0x5D80, //CJK UNIFIED IDEOGRAPH
+ 0x8DE2: 0x5D81, //CJK UNIFIED IDEOGRAPH
+ 0x8DE3: 0x5D83, //CJK UNIFIED IDEOGRAPH
+ 0x8DE4: 0x5D84, //CJK UNIFIED IDEOGRAPH
+ 0x8DE5: 0x5D85, //CJK UNIFIED IDEOGRAPH
+ 0x8DE6: 0x5D86, //CJK UNIFIED IDEOGRAPH
+ 0x8DE7: 0x5D87, //CJK UNIFIED IDEOGRAPH
+ 0x8DE8: 0x5D88, //CJK UNIFIED IDEOGRAPH
+ 0x8DE9: 0x5D89, //CJK UNIFIED IDEOGRAPH
+ 0x8DEA: 0x5D8A, //CJK UNIFIED IDEOGRAPH
+ 0x8DEB: 0x5D8B, //CJK UNIFIED IDEOGRAPH
+ 0x8DEC: 0x5D8C, //CJK UNIFIED IDEOGRAPH
+ 0x8DED: 0x5D8D, //CJK UNIFIED IDEOGRAPH
+ 0x8DEE: 0x5D8E, //CJK UNIFIED IDEOGRAPH
+ 0x8DEF: 0x5D8F, //CJK UNIFIED IDEOGRAPH
+ 0x8DF0: 0x5D90, //CJK UNIFIED IDEOGRAPH
+ 0x8DF1: 0x5D91, //CJK UNIFIED IDEOGRAPH
+ 0x8DF2: 0x5D92, //CJK UNIFIED IDEOGRAPH
+ 0x8DF3: 0x5D93, //CJK UNIFIED IDEOGRAPH
+ 0x8DF4: 0x5D94, //CJK UNIFIED IDEOGRAPH
+ 0x8DF5: 0x5D95, //CJK UNIFIED IDEOGRAPH
+ 0x8DF6: 0x5D96, //CJK UNIFIED IDEOGRAPH
+ 0x8DF7: 0x5D97, //CJK UNIFIED IDEOGRAPH
+ 0x8DF8: 0x5D98, //CJK UNIFIED IDEOGRAPH
+ 0x8DF9: 0x5D9A, //CJK UNIFIED IDEOGRAPH
+ 0x8DFA: 0x5D9B, //CJK UNIFIED IDEOGRAPH
+ 0x8DFB: 0x5D9C, //CJK UNIFIED IDEOGRAPH
+ 0x8DFC: 0x5D9E, //CJK UNIFIED IDEOGRAPH
+ 0x8DFD: 0x5D9F, //CJK UNIFIED IDEOGRAPH
+ 0x8DFE: 0x5DA0, //CJK UNIFIED IDEOGRAPH
+ 0x8E40: 0x5DA1, //CJK UNIFIED IDEOGRAPH
+ 0x8E41: 0x5DA2, //CJK UNIFIED IDEOGRAPH
+ 0x8E42: 0x5DA3, //CJK UNIFIED IDEOGRAPH
+ 0x8E43: 0x5DA4, //CJK UNIFIED IDEOGRAPH
+ 0x8E44: 0x5DA5, //CJK UNIFIED IDEOGRAPH
+ 0x8E45: 0x5DA6, //CJK UNIFIED IDEOGRAPH
+ 0x8E46: 0x5DA7, //CJK UNIFIED IDEOGRAPH
+ 0x8E47: 0x5DA8, //CJK UNIFIED IDEOGRAPH
+ 0x8E48: 0x5DA9, //CJK UNIFIED IDEOGRAPH
+ 0x8E49: 0x5DAA, //CJK UNIFIED IDEOGRAPH
+ 0x8E4A: 0x5DAB, //CJK UNIFIED IDEOGRAPH
+ 0x8E4B: 0x5DAC, //CJK UNIFIED IDEOGRAPH
+ 0x8E4C: 0x5DAD, //CJK UNIFIED IDEOGRAPH
+ 0x8E4D: 0x5DAE, //CJK UNIFIED IDEOGRAPH
+ 0x8E4E: 0x5DAF, //CJK UNIFIED IDEOGRAPH
+ 0x8E4F: 0x5DB0, //CJK UNIFIED IDEOGRAPH
+ 0x8E50: 0x5DB1, //CJK UNIFIED IDEOGRAPH
+ 0x8E51: 0x5DB2, //CJK UNIFIED IDEOGRAPH
+ 0x8E52: 0x5DB3, //CJK UNIFIED IDEOGRAPH
+ 0x8E53: 0x5DB4, //CJK UNIFIED IDEOGRAPH
+ 0x8E54: 0x5DB5, //CJK UNIFIED IDEOGRAPH
+ 0x8E55: 0x5DB6, //CJK UNIFIED IDEOGRAPH
+ 0x8E56: 0x5DB8, //CJK UNIFIED IDEOGRAPH
+ 0x8E57: 0x5DB9, //CJK UNIFIED IDEOGRAPH
+ 0x8E58: 0x5DBA, //CJK UNIFIED IDEOGRAPH
+ 0x8E59: 0x5DBB, //CJK UNIFIED IDEOGRAPH
+ 0x8E5A: 0x5DBC, //CJK UNIFIED IDEOGRAPH
+ 0x8E5B: 0x5DBD, //CJK UNIFIED IDEOGRAPH
+ 0x8E5C: 0x5DBE, //CJK UNIFIED IDEOGRAPH
+ 0x8E5D: 0x5DBF, //CJK UNIFIED IDEOGRAPH
+ 0x8E5E: 0x5DC0, //CJK UNIFIED IDEOGRAPH
+ 0x8E5F: 0x5DC1, //CJK UNIFIED IDEOGRAPH
+ 0x8E60: 0x5DC2, //CJK UNIFIED IDEOGRAPH
+ 0x8E61: 0x5DC3, //CJK UNIFIED IDEOGRAPH
+ 0x8E62: 0x5DC4, //CJK UNIFIED IDEOGRAPH
+ 0x8E63: 0x5DC6, //CJK UNIFIED IDEOGRAPH
+ 0x8E64: 0x5DC7, //CJK UNIFIED IDEOGRAPH
+ 0x8E65: 0x5DC8, //CJK UNIFIED IDEOGRAPH
+ 0x8E66: 0x5DC9, //CJK UNIFIED IDEOGRAPH
+ 0x8E67: 0x5DCA, //CJK UNIFIED IDEOGRAPH
+ 0x8E68: 0x5DCB, //CJK UNIFIED IDEOGRAPH
+ 0x8E69: 0x5DCC, //CJK UNIFIED IDEOGRAPH
+ 0x8E6A: 0x5DCE, //CJK UNIFIED IDEOGRAPH
+ 0x8E6B: 0x5DCF, //CJK UNIFIED IDEOGRAPH
+ 0x8E6C: 0x5DD0, //CJK UNIFIED IDEOGRAPH
+ 0x8E6D: 0x5DD1, //CJK UNIFIED IDEOGRAPH
+ 0x8E6E: 0x5DD2, //CJK UNIFIED IDEOGRAPH
+ 0x8E6F: 0x5DD3, //CJK UNIFIED IDEOGRAPH
+ 0x8E70: 0x5DD4, //CJK UNIFIED IDEOGRAPH
+ 0x8E71: 0x5DD5, //CJK UNIFIED IDEOGRAPH
+ 0x8E72: 0x5DD6, //CJK UNIFIED IDEOGRAPH
+ 0x8E73: 0x5DD7, //CJK UNIFIED IDEOGRAPH
+ 0x8E74: 0x5DD8, //CJK UNIFIED IDEOGRAPH
+ 0x8E75: 0x5DD9, //CJK UNIFIED IDEOGRAPH
+ 0x8E76: 0x5DDA, //CJK UNIFIED IDEOGRAPH
+ 0x8E77: 0x5DDC, //CJK UNIFIED IDEOGRAPH
+ 0x8E78: 0x5DDF, //CJK UNIFIED IDEOGRAPH
+ 0x8E79: 0x5DE0, //CJK UNIFIED IDEOGRAPH
+ 0x8E7A: 0x5DE3, //CJK UNIFIED IDEOGRAPH
+ 0x8E7B: 0x5DE4, //CJK UNIFIED IDEOGRAPH
+ 0x8E7C: 0x5DEA, //CJK UNIFIED IDEOGRAPH
+ 0x8E7D: 0x5DEC, //CJK UNIFIED IDEOGRAPH
+ 0x8E7E: 0x5DED, //CJK UNIFIED IDEOGRAPH
+ 0x8E80: 0x5DF0, //CJK UNIFIED IDEOGRAPH
+ 0x8E81: 0x5DF5, //CJK UNIFIED IDEOGRAPH
+ 0x8E82: 0x5DF6, //CJK UNIFIED IDEOGRAPH
+ 0x8E83: 0x5DF8, //CJK UNIFIED IDEOGRAPH
+ 0x8E84: 0x5DF9, //CJK UNIFIED IDEOGRAPH
+ 0x8E85: 0x5DFA, //CJK UNIFIED IDEOGRAPH
+ 0x8E86: 0x5DFB, //CJK UNIFIED IDEOGRAPH
+ 0x8E87: 0x5DFC, //CJK UNIFIED IDEOGRAPH
+ 0x8E88: 0x5DFF, //CJK UNIFIED IDEOGRAPH
+ 0x8E89: 0x5E00, //CJK UNIFIED IDEOGRAPH
+ 0x8E8A: 0x5E04, //CJK UNIFIED IDEOGRAPH
+ 0x8E8B: 0x5E07, //CJK UNIFIED IDEOGRAPH
+ 0x8E8C: 0x5E09, //CJK UNIFIED IDEOGRAPH
+ 0x8E8D: 0x5E0A, //CJK UNIFIED IDEOGRAPH
+ 0x8E8E: 0x5E0B, //CJK UNIFIED IDEOGRAPH
+ 0x8E8F: 0x5E0D, //CJK UNIFIED IDEOGRAPH
+ 0x8E90: 0x5E0E, //CJK UNIFIED IDEOGRAPH
+ 0x8E91: 0x5E12, //CJK UNIFIED IDEOGRAPH
+ 0x8E92: 0x5E13, //CJK UNIFIED IDEOGRAPH
+ 0x8E93: 0x5E17, //CJK UNIFIED IDEOGRAPH
+ 0x8E94: 0x5E1E, //CJK UNIFIED IDEOGRAPH
+ 0x8E95: 0x5E1F, //CJK UNIFIED IDEOGRAPH
+ 0x8E96: 0x5E20, //CJK UNIFIED IDEOGRAPH
+ 0x8E97: 0x5E21, //CJK UNIFIED IDEOGRAPH
+ 0x8E98: 0x5E22, //CJK UNIFIED IDEOGRAPH
+ 0x8E99: 0x5E23, //CJK UNIFIED IDEOGRAPH
+ 0x8E9A: 0x5E24, //CJK UNIFIED IDEOGRAPH
+ 0x8E9B: 0x5E25, //CJK UNIFIED IDEOGRAPH
+ 0x8E9C: 0x5E28, //CJK UNIFIED IDEOGRAPH
+ 0x8E9D: 0x5E29, //CJK UNIFIED IDEOGRAPH
+ 0x8E9E: 0x5E2A, //CJK UNIFIED IDEOGRAPH
+ 0x8E9F: 0x5E2B, //CJK UNIFIED IDEOGRAPH
+ 0x8EA0: 0x5E2C, //CJK UNIFIED IDEOGRAPH
+ 0x8EA1: 0x5E2F, //CJK UNIFIED IDEOGRAPH
+ 0x8EA2: 0x5E30, //CJK UNIFIED IDEOGRAPH
+ 0x8EA3: 0x5E32, //CJK UNIFIED IDEOGRAPH
+ 0x8EA4: 0x5E33, //CJK UNIFIED IDEOGRAPH
+ 0x8EA5: 0x5E34, //CJK UNIFIED IDEOGRAPH
+ 0x8EA6: 0x5E35, //CJK UNIFIED IDEOGRAPH
+ 0x8EA7: 0x5E36, //CJK UNIFIED IDEOGRAPH
+ 0x8EA8: 0x5E39, //CJK UNIFIED IDEOGRAPH
+ 0x8EA9: 0x5E3A, //CJK UNIFIED IDEOGRAPH
+ 0x8EAA: 0x5E3E, //CJK UNIFIED IDEOGRAPH
+ 0x8EAB: 0x5E3F, //CJK UNIFIED IDEOGRAPH
+ 0x8EAC: 0x5E40, //CJK UNIFIED IDEOGRAPH
+ 0x8EAD: 0x5E41, //CJK UNIFIED IDEOGRAPH
+ 0x8EAE: 0x5E43, //CJK UNIFIED IDEOGRAPH
+ 0x8EAF: 0x5E46, //CJK UNIFIED IDEOGRAPH
+ 0x8EB0: 0x5E47, //CJK UNIFIED IDEOGRAPH
+ 0x8EB1: 0x5E48, //CJK UNIFIED IDEOGRAPH
+ 0x8EB2: 0x5E49, //CJK UNIFIED IDEOGRAPH
+ 0x8EB3: 0x5E4A, //CJK UNIFIED IDEOGRAPH
+ 0x8EB4: 0x5E4B, //CJK UNIFIED IDEOGRAPH
+ 0x8EB5: 0x5E4D, //CJK UNIFIED IDEOGRAPH
+ 0x8EB6: 0x5E4E, //CJK UNIFIED IDEOGRAPH
+ 0x8EB7: 0x5E4F, //CJK UNIFIED IDEOGRAPH
+ 0x8EB8: 0x5E50, //CJK UNIFIED IDEOGRAPH
+ 0x8EB9: 0x5E51, //CJK UNIFIED IDEOGRAPH
+ 0x8EBA: 0x5E52, //CJK UNIFIED IDEOGRAPH
+ 0x8EBB: 0x5E53, //CJK UNIFIED IDEOGRAPH
+ 0x8EBC: 0x5E56, //CJK UNIFIED IDEOGRAPH
+ 0x8EBD: 0x5E57, //CJK UNIFIED IDEOGRAPH
+ 0x8EBE: 0x5E58, //CJK UNIFIED IDEOGRAPH
+ 0x8EBF: 0x5E59, //CJK UNIFIED IDEOGRAPH
+ 0x8EC0: 0x5E5A, //CJK UNIFIED IDEOGRAPH
+ 0x8EC1: 0x5E5C, //CJK UNIFIED IDEOGRAPH
+ 0x8EC2: 0x5E5D, //CJK UNIFIED IDEOGRAPH
+ 0x8EC3: 0x5E5F, //CJK UNIFIED IDEOGRAPH
+ 0x8EC4: 0x5E60, //CJK UNIFIED IDEOGRAPH
+ 0x8EC5: 0x5E63, //CJK UNIFIED IDEOGRAPH
+ 0x8EC6: 0x5E64, //CJK UNIFIED IDEOGRAPH
+ 0x8EC7: 0x5E65, //CJK UNIFIED IDEOGRAPH
+ 0x8EC8: 0x5E66, //CJK UNIFIED IDEOGRAPH
+ 0x8EC9: 0x5E67, //CJK UNIFIED IDEOGRAPH
+ 0x8ECA: 0x5E68, //CJK UNIFIED IDEOGRAPH
+ 0x8ECB: 0x5E69, //CJK UNIFIED IDEOGRAPH
+ 0x8ECC: 0x5E6A, //CJK UNIFIED IDEOGRAPH
+ 0x8ECD: 0x5E6B, //CJK UNIFIED IDEOGRAPH
+ 0x8ECE: 0x5E6C, //CJK UNIFIED IDEOGRAPH
+ 0x8ECF: 0x5E6D, //CJK UNIFIED IDEOGRAPH
+ 0x8ED0: 0x5E6E, //CJK UNIFIED IDEOGRAPH
+ 0x8ED1: 0x5E6F, //CJK UNIFIED IDEOGRAPH
+ 0x8ED2: 0x5E70, //CJK UNIFIED IDEOGRAPH
+ 0x8ED3: 0x5E71, //CJK UNIFIED IDEOGRAPH
+ 0x8ED4: 0x5E75, //CJK UNIFIED IDEOGRAPH
+ 0x8ED5: 0x5E77, //CJK UNIFIED IDEOGRAPH
+ 0x8ED6: 0x5E79, //CJK UNIFIED IDEOGRAPH
+ 0x8ED7: 0x5E7E, //CJK UNIFIED IDEOGRAPH
+ 0x8ED8: 0x5E81, //CJK UNIFIED IDEOGRAPH
+ 0x8ED9: 0x5E82, //CJK UNIFIED IDEOGRAPH
+ 0x8EDA: 0x5E83, //CJK UNIFIED IDEOGRAPH
+ 0x8EDB: 0x5E85, //CJK UNIFIED IDEOGRAPH
+ 0x8EDC: 0x5E88, //CJK UNIFIED IDEOGRAPH
+ 0x8EDD: 0x5E89, //CJK UNIFIED IDEOGRAPH
+ 0x8EDE: 0x5E8C, //CJK UNIFIED IDEOGRAPH
+ 0x8EDF: 0x5E8D, //CJK UNIFIED IDEOGRAPH
+ 0x8EE0: 0x5E8E, //CJK UNIFIED IDEOGRAPH
+ 0x8EE1: 0x5E92, //CJK UNIFIED IDEOGRAPH
+ 0x8EE2: 0x5E98, //CJK UNIFIED IDEOGRAPH
+ 0x8EE3: 0x5E9B, //CJK UNIFIED IDEOGRAPH
+ 0x8EE4: 0x5E9D, //CJK UNIFIED IDEOGRAPH
+ 0x8EE5: 0x5EA1, //CJK UNIFIED IDEOGRAPH
+ 0x8EE6: 0x5EA2, //CJK UNIFIED IDEOGRAPH
+ 0x8EE7: 0x5EA3, //CJK UNIFIED IDEOGRAPH
+ 0x8EE8: 0x5EA4, //CJK UNIFIED IDEOGRAPH
+ 0x8EE9: 0x5EA8, //CJK UNIFIED IDEOGRAPH
+ 0x8EEA: 0x5EA9, //CJK UNIFIED IDEOGRAPH
+ 0x8EEB: 0x5EAA, //CJK UNIFIED IDEOGRAPH
+ 0x8EEC: 0x5EAB, //CJK UNIFIED IDEOGRAPH
+ 0x8EED: 0x5EAC, //CJK UNIFIED IDEOGRAPH
+ 0x8EEE: 0x5EAE, //CJK UNIFIED IDEOGRAPH
+ 0x8EEF: 0x5EAF, //CJK UNIFIED IDEOGRAPH
+ 0x8EF0: 0x5EB0, //CJK UNIFIED IDEOGRAPH
+ 0x8EF1: 0x5EB1, //CJK UNIFIED IDEOGRAPH
+ 0x8EF2: 0x5EB2, //CJK UNIFIED IDEOGRAPH
+ 0x8EF3: 0x5EB4, //CJK UNIFIED IDEOGRAPH
+ 0x8EF4: 0x5EBA, //CJK UNIFIED IDEOGRAPH
+ 0x8EF5: 0x5EBB, //CJK UNIFIED IDEOGRAPH
+ 0x8EF6: 0x5EBC, //CJK UNIFIED IDEOGRAPH
+ 0x8EF7: 0x5EBD, //CJK UNIFIED IDEOGRAPH
+ 0x8EF8: 0x5EBF, //CJK UNIFIED IDEOGRAPH
+ 0x8EF9: 0x5EC0, //CJK UNIFIED IDEOGRAPH
+ 0x8EFA: 0x5EC1, //CJK UNIFIED IDEOGRAPH
+ 0x8EFB: 0x5EC2, //CJK UNIFIED IDEOGRAPH
+ 0x8EFC: 0x5EC3, //CJK UNIFIED IDEOGRAPH
+ 0x8EFD: 0x5EC4, //CJK UNIFIED IDEOGRAPH
+ 0x8EFE: 0x5EC5, //CJK UNIFIED IDEOGRAPH
+ 0x8F40: 0x5EC6, //CJK UNIFIED IDEOGRAPH
+ 0x8F41: 0x5EC7, //CJK UNIFIED IDEOGRAPH
+ 0x8F42: 0x5EC8, //CJK UNIFIED IDEOGRAPH
+ 0x8F43: 0x5ECB, //CJK UNIFIED IDEOGRAPH
+ 0x8F44: 0x5ECC, //CJK UNIFIED IDEOGRAPH
+ 0x8F45: 0x5ECD, //CJK UNIFIED IDEOGRAPH
+ 0x8F46: 0x5ECE, //CJK UNIFIED IDEOGRAPH
+ 0x8F47: 0x5ECF, //CJK UNIFIED IDEOGRAPH
+ 0x8F48: 0x5ED0, //CJK UNIFIED IDEOGRAPH
+ 0x8F49: 0x5ED4, //CJK UNIFIED IDEOGRAPH
+ 0x8F4A: 0x5ED5, //CJK UNIFIED IDEOGRAPH
+ 0x8F4B: 0x5ED7, //CJK UNIFIED IDEOGRAPH
+ 0x8F4C: 0x5ED8, //CJK UNIFIED IDEOGRAPH
+ 0x8F4D: 0x5ED9, //CJK UNIFIED IDEOGRAPH
+ 0x8F4E: 0x5EDA, //CJK UNIFIED IDEOGRAPH
+ 0x8F4F: 0x5EDC, //CJK UNIFIED IDEOGRAPH
+ 0x8F50: 0x5EDD, //CJK UNIFIED IDEOGRAPH
+ 0x8F51: 0x5EDE, //CJK UNIFIED IDEOGRAPH
+ 0x8F52: 0x5EDF, //CJK UNIFIED IDEOGRAPH
+ 0x8F53: 0x5EE0, //CJK UNIFIED IDEOGRAPH
+ 0x8F54: 0x5EE1, //CJK UNIFIED IDEOGRAPH
+ 0x8F55: 0x5EE2, //CJK UNIFIED IDEOGRAPH
+ 0x8F56: 0x5EE3, //CJK UNIFIED IDEOGRAPH
+ 0x8F57: 0x5EE4, //CJK UNIFIED IDEOGRAPH
+ 0x8F58: 0x5EE5, //CJK UNIFIED IDEOGRAPH
+ 0x8F59: 0x5EE6, //CJK UNIFIED IDEOGRAPH
+ 0x8F5A: 0x5EE7, //CJK UNIFIED IDEOGRAPH
+ 0x8F5B: 0x5EE9, //CJK UNIFIED IDEOGRAPH
+ 0x8F5C: 0x5EEB, //CJK UNIFIED IDEOGRAPH
+ 0x8F5D: 0x5EEC, //CJK UNIFIED IDEOGRAPH
+ 0x8F5E: 0x5EED, //CJK UNIFIED IDEOGRAPH
+ 0x8F5F: 0x5EEE, //CJK UNIFIED IDEOGRAPH
+ 0x8F60: 0x5EEF, //CJK UNIFIED IDEOGRAPH
+ 0x8F61: 0x5EF0, //CJK UNIFIED IDEOGRAPH
+ 0x8F62: 0x5EF1, //CJK UNIFIED IDEOGRAPH
+ 0x8F63: 0x5EF2, //CJK UNIFIED IDEOGRAPH
+ 0x8F64: 0x5EF3, //CJK UNIFIED IDEOGRAPH
+ 0x8F65: 0x5EF5, //CJK UNIFIED IDEOGRAPH
+ 0x8F66: 0x5EF8, //CJK UNIFIED IDEOGRAPH
+ 0x8F67: 0x5EF9, //CJK UNIFIED IDEOGRAPH
+ 0x8F68: 0x5EFB, //CJK UNIFIED IDEOGRAPH
+ 0x8F69: 0x5EFC, //CJK UNIFIED IDEOGRAPH
+ 0x8F6A: 0x5EFD, //CJK UNIFIED IDEOGRAPH
+ 0x8F6B: 0x5F05, //CJK UNIFIED IDEOGRAPH
+ 0x8F6C: 0x5F06, //CJK UNIFIED IDEOGRAPH
+ 0x8F6D: 0x5F07, //CJK UNIFIED IDEOGRAPH
+ 0x8F6E: 0x5F09, //CJK UNIFIED IDEOGRAPH
+ 0x8F6F: 0x5F0C, //CJK UNIFIED IDEOGRAPH
+ 0x8F70: 0x5F0D, //CJK UNIFIED IDEOGRAPH
+ 0x8F71: 0x5F0E, //CJK UNIFIED IDEOGRAPH
+ 0x8F72: 0x5F10, //CJK UNIFIED IDEOGRAPH
+ 0x8F73: 0x5F12, //CJK UNIFIED IDEOGRAPH
+ 0x8F74: 0x5F14, //CJK UNIFIED IDEOGRAPH
+ 0x8F75: 0x5F16, //CJK UNIFIED IDEOGRAPH
+ 0x8F76: 0x5F19, //CJK UNIFIED IDEOGRAPH
+ 0x8F77: 0x5F1A, //CJK UNIFIED IDEOGRAPH
+ 0x8F78: 0x5F1C, //CJK UNIFIED IDEOGRAPH
+ 0x8F79: 0x5F1D, //CJK UNIFIED IDEOGRAPH
+ 0x8F7A: 0x5F1E, //CJK UNIFIED IDEOGRAPH
+ 0x8F7B: 0x5F21, //CJK UNIFIED IDEOGRAPH
+ 0x8F7C: 0x5F22, //CJK UNIFIED IDEOGRAPH
+ 0x8F7D: 0x5F23, //CJK UNIFIED IDEOGRAPH
+ 0x8F7E: 0x5F24, //CJK UNIFIED IDEOGRAPH
+ 0x8F80: 0x5F28, //CJK UNIFIED IDEOGRAPH
+ 0x8F81: 0x5F2B, //CJK UNIFIED IDEOGRAPH
+ 0x8F82: 0x5F2C, //CJK UNIFIED IDEOGRAPH
+ 0x8F83: 0x5F2E, //CJK UNIFIED IDEOGRAPH
+ 0x8F84: 0x5F30, //CJK UNIFIED IDEOGRAPH
+ 0x8F85: 0x5F32, //CJK UNIFIED IDEOGRAPH
+ 0x8F86: 0x5F33, //CJK UNIFIED IDEOGRAPH
+ 0x8F87: 0x5F34, //CJK UNIFIED IDEOGRAPH
+ 0x8F88: 0x5F35, //CJK UNIFIED IDEOGRAPH
+ 0x8F89: 0x5F36, //CJK UNIFIED IDEOGRAPH
+ 0x8F8A: 0x5F37, //CJK UNIFIED IDEOGRAPH
+ 0x8F8B: 0x5F38, //CJK UNIFIED IDEOGRAPH
+ 0x8F8C: 0x5F3B, //CJK UNIFIED IDEOGRAPH
+ 0x8F8D: 0x5F3D, //CJK UNIFIED IDEOGRAPH
+ 0x8F8E: 0x5F3E, //CJK UNIFIED IDEOGRAPH
+ 0x8F8F: 0x5F3F, //CJK UNIFIED IDEOGRAPH
+ 0x8F90: 0x5F41, //CJK UNIFIED IDEOGRAPH
+ 0x8F91: 0x5F42, //CJK UNIFIED IDEOGRAPH
+ 0x8F92: 0x5F43, //CJK UNIFIED IDEOGRAPH
+ 0x8F93: 0x5F44, //CJK UNIFIED IDEOGRAPH
+ 0x8F94: 0x5F45, //CJK UNIFIED IDEOGRAPH
+ 0x8F95: 0x5F46, //CJK UNIFIED IDEOGRAPH
+ 0x8F96: 0x5F47, //CJK UNIFIED IDEOGRAPH
+ 0x8F97: 0x5F48, //CJK UNIFIED IDEOGRAPH
+ 0x8F98: 0x5F49, //CJK UNIFIED IDEOGRAPH
+ 0x8F99: 0x5F4A, //CJK UNIFIED IDEOGRAPH
+ 0x8F9A: 0x5F4B, //CJK UNIFIED IDEOGRAPH
+ 0x8F9B: 0x5F4C, //CJK UNIFIED IDEOGRAPH
+ 0x8F9C: 0x5F4D, //CJK UNIFIED IDEOGRAPH
+ 0x8F9D: 0x5F4E, //CJK UNIFIED IDEOGRAPH
+ 0x8F9E: 0x5F4F, //CJK UNIFIED IDEOGRAPH
+ 0x8F9F: 0x5F51, //CJK UNIFIED IDEOGRAPH
+ 0x8FA0: 0x5F54, //CJK UNIFIED IDEOGRAPH
+ 0x8FA1: 0x5F59, //CJK UNIFIED IDEOGRAPH
+ 0x8FA2: 0x5F5A, //CJK UNIFIED IDEOGRAPH
+ 0x8FA3: 0x5F5B, //CJK UNIFIED IDEOGRAPH
+ 0x8FA4: 0x5F5C, //CJK UNIFIED IDEOGRAPH
+ 0x8FA5: 0x5F5E, //CJK UNIFIED IDEOGRAPH
+ 0x8FA6: 0x5F5F, //CJK UNIFIED IDEOGRAPH
+ 0x8FA7: 0x5F60, //CJK UNIFIED IDEOGRAPH
+ 0x8FA8: 0x5F63, //CJK UNIFIED IDEOGRAPH
+ 0x8FA9: 0x5F65, //CJK UNIFIED IDEOGRAPH
+ 0x8FAA: 0x5F67, //CJK UNIFIED IDEOGRAPH
+ 0x8FAB: 0x5F68, //CJK UNIFIED IDEOGRAPH
+ 0x8FAC: 0x5F6B, //CJK UNIFIED IDEOGRAPH
+ 0x8FAD: 0x5F6E, //CJK UNIFIED IDEOGRAPH
+ 0x8FAE: 0x5F6F, //CJK UNIFIED IDEOGRAPH
+ 0x8FAF: 0x5F72, //CJK UNIFIED IDEOGRAPH
+ 0x8FB0: 0x5F74, //CJK UNIFIED IDEOGRAPH
+ 0x8FB1: 0x5F75, //CJK UNIFIED IDEOGRAPH
+ 0x8FB2: 0x5F76, //CJK UNIFIED IDEOGRAPH
+ 0x8FB3: 0x5F78, //CJK UNIFIED IDEOGRAPH
+ 0x8FB4: 0x5F7A, //CJK UNIFIED IDEOGRAPH
+ 0x8FB5: 0x5F7D, //CJK UNIFIED IDEOGRAPH
+ 0x8FB6: 0x5F7E, //CJK UNIFIED IDEOGRAPH
+ 0x8FB7: 0x5F7F, //CJK UNIFIED IDEOGRAPH
+ 0x8FB8: 0x5F83, //CJK UNIFIED IDEOGRAPH
+ 0x8FB9: 0x5F86, //CJK UNIFIED IDEOGRAPH
+ 0x8FBA: 0x5F8D, //CJK UNIFIED IDEOGRAPH
+ 0x8FBB: 0x5F8E, //CJK UNIFIED IDEOGRAPH
+ 0x8FBC: 0x5F8F, //CJK UNIFIED IDEOGRAPH
+ 0x8FBD: 0x5F91, //CJK UNIFIED IDEOGRAPH
+ 0x8FBE: 0x5F93, //CJK UNIFIED IDEOGRAPH
+ 0x8FBF: 0x5F94, //CJK UNIFIED IDEOGRAPH
+ 0x8FC0: 0x5F96, //CJK UNIFIED IDEOGRAPH
+ 0x8FC1: 0x5F9A, //CJK UNIFIED IDEOGRAPH
+ 0x8FC2: 0x5F9B, //CJK UNIFIED IDEOGRAPH
+ 0x8FC3: 0x5F9D, //CJK UNIFIED IDEOGRAPH
+ 0x8FC4: 0x5F9E, //CJK UNIFIED IDEOGRAPH
+ 0x8FC5: 0x5F9F, //CJK UNIFIED IDEOGRAPH
+ 0x8FC6: 0x5FA0, //CJK UNIFIED IDEOGRAPH
+ 0x8FC7: 0x5FA2, //CJK UNIFIED IDEOGRAPH
+ 0x8FC8: 0x5FA3, //CJK UNIFIED IDEOGRAPH
+ 0x8FC9: 0x5FA4, //CJK UNIFIED IDEOGRAPH
+ 0x8FCA: 0x5FA5, //CJK UNIFIED IDEOGRAPH
+ 0x8FCB: 0x5FA6, //CJK UNIFIED IDEOGRAPH
+ 0x8FCC: 0x5FA7, //CJK UNIFIED IDEOGRAPH
+ 0x8FCD: 0x5FA9, //CJK UNIFIED IDEOGRAPH
+ 0x8FCE: 0x5FAB, //CJK UNIFIED IDEOGRAPH
+ 0x8FCF: 0x5FAC, //CJK UNIFIED IDEOGRAPH
+ 0x8FD0: 0x5FAF, //CJK UNIFIED IDEOGRAPH
+ 0x8FD1: 0x5FB0, //CJK UNIFIED IDEOGRAPH
+ 0x8FD2: 0x5FB1, //CJK UNIFIED IDEOGRAPH
+ 0x8FD3: 0x5FB2, //CJK UNIFIED IDEOGRAPH
+ 0x8FD4: 0x5FB3, //CJK UNIFIED IDEOGRAPH
+ 0x8FD5: 0x5FB4, //CJK UNIFIED IDEOGRAPH
+ 0x8FD6: 0x5FB6, //CJK UNIFIED IDEOGRAPH
+ 0x8FD7: 0x5FB8, //CJK UNIFIED IDEOGRAPH
+ 0x8FD8: 0x5FB9, //CJK UNIFIED IDEOGRAPH
+ 0x8FD9: 0x5FBA, //CJK UNIFIED IDEOGRAPH
+ 0x8FDA: 0x5FBB, //CJK UNIFIED IDEOGRAPH
+ 0x8FDB: 0x5FBE, //CJK UNIFIED IDEOGRAPH
+ 0x8FDC: 0x5FBF, //CJK UNIFIED IDEOGRAPH
+ 0x8FDD: 0x5FC0, //CJK UNIFIED IDEOGRAPH
+ 0x8FDE: 0x5FC1, //CJK UNIFIED IDEOGRAPH
+ 0x8FDF: 0x5FC2, //CJK UNIFIED IDEOGRAPH
+ 0x8FE0: 0x5FC7, //CJK UNIFIED IDEOGRAPH
+ 0x8FE1: 0x5FC8, //CJK UNIFIED IDEOGRAPH
+ 0x8FE2: 0x5FCA, //CJK UNIFIED IDEOGRAPH
+ 0x8FE3: 0x5FCB, //CJK UNIFIED IDEOGRAPH
+ 0x8FE4: 0x5FCE, //CJK UNIFIED IDEOGRAPH
+ 0x8FE5: 0x5FD3, //CJK UNIFIED IDEOGRAPH
+ 0x8FE6: 0x5FD4, //CJK UNIFIED IDEOGRAPH
+ 0x8FE7: 0x5FD5, //CJK UNIFIED IDEOGRAPH
+ 0x8FE8: 0x5FDA, //CJK UNIFIED IDEOGRAPH
+ 0x8FE9: 0x5FDB, //CJK UNIFIED IDEOGRAPH
+ 0x8FEA: 0x5FDC, //CJK UNIFIED IDEOGRAPH
+ 0x8FEB: 0x5FDE, //CJK UNIFIED IDEOGRAPH
+ 0x8FEC: 0x5FDF, //CJK UNIFIED IDEOGRAPH
+ 0x8FED: 0x5FE2, //CJK UNIFIED IDEOGRAPH
+ 0x8FEE: 0x5FE3, //CJK UNIFIED IDEOGRAPH
+ 0x8FEF: 0x5FE5, //CJK UNIFIED IDEOGRAPH
+ 0x8FF0: 0x5FE6, //CJK UNIFIED IDEOGRAPH
+ 0x8FF1: 0x5FE8, //CJK UNIFIED IDEOGRAPH
+ 0x8FF2: 0x5FE9, //CJK UNIFIED IDEOGRAPH
+ 0x8FF3: 0x5FEC, //CJK UNIFIED IDEOGRAPH
+ 0x8FF4: 0x5FEF, //CJK UNIFIED IDEOGRAPH
+ 0x8FF5: 0x5FF0, //CJK UNIFIED IDEOGRAPH
+ 0x8FF6: 0x5FF2, //CJK UNIFIED IDEOGRAPH
+ 0x8FF7: 0x5FF3, //CJK UNIFIED IDEOGRAPH
+ 0x8FF8: 0x5FF4, //CJK UNIFIED IDEOGRAPH
+ 0x8FF9: 0x5FF6, //CJK UNIFIED IDEOGRAPH
+ 0x8FFA: 0x5FF7, //CJK UNIFIED IDEOGRAPH
+ 0x8FFB: 0x5FF9, //CJK UNIFIED IDEOGRAPH
+ 0x8FFC: 0x5FFA, //CJK UNIFIED IDEOGRAPH
+ 0x8FFD: 0x5FFC, //CJK UNIFIED IDEOGRAPH
+ 0x8FFE: 0x6007, //CJK UNIFIED IDEOGRAPH
+ 0x9040: 0x6008, //CJK UNIFIED IDEOGRAPH
+ 0x9041: 0x6009, //CJK UNIFIED IDEOGRAPH
+ 0x9042: 0x600B, //CJK UNIFIED IDEOGRAPH
+ 0x9043: 0x600C, //CJK UNIFIED IDEOGRAPH
+ 0x9044: 0x6010, //CJK UNIFIED IDEOGRAPH
+ 0x9045: 0x6011, //CJK UNIFIED IDEOGRAPH
+ 0x9046: 0x6013, //CJK UNIFIED IDEOGRAPH
+ 0x9047: 0x6017, //CJK UNIFIED IDEOGRAPH
+ 0x9048: 0x6018, //CJK UNIFIED IDEOGRAPH
+ 0x9049: 0x601A, //CJK UNIFIED IDEOGRAPH
+ 0x904A: 0x601E, //CJK UNIFIED IDEOGRAPH
+ 0x904B: 0x601F, //CJK UNIFIED IDEOGRAPH
+ 0x904C: 0x6022, //CJK UNIFIED IDEOGRAPH
+ 0x904D: 0x6023, //CJK UNIFIED IDEOGRAPH
+ 0x904E: 0x6024, //CJK UNIFIED IDEOGRAPH
+ 0x904F: 0x602C, //CJK UNIFIED IDEOGRAPH
+ 0x9050: 0x602D, //CJK UNIFIED IDEOGRAPH
+ 0x9051: 0x602E, //CJK UNIFIED IDEOGRAPH
+ 0x9052: 0x6030, //CJK UNIFIED IDEOGRAPH
+ 0x9053: 0x6031, //CJK UNIFIED IDEOGRAPH
+ 0x9054: 0x6032, //CJK UNIFIED IDEOGRAPH
+ 0x9055: 0x6033, //CJK UNIFIED IDEOGRAPH
+ 0x9056: 0x6034, //CJK UNIFIED IDEOGRAPH
+ 0x9057: 0x6036, //CJK UNIFIED IDEOGRAPH
+ 0x9058: 0x6037, //CJK UNIFIED IDEOGRAPH
+ 0x9059: 0x6038, //CJK UNIFIED IDEOGRAPH
+ 0x905A: 0x6039, //CJK UNIFIED IDEOGRAPH
+ 0x905B: 0x603A, //CJK UNIFIED IDEOGRAPH
+ 0x905C: 0x603D, //CJK UNIFIED IDEOGRAPH
+ 0x905D: 0x603E, //CJK UNIFIED IDEOGRAPH
+ 0x905E: 0x6040, //CJK UNIFIED IDEOGRAPH
+ 0x905F: 0x6044, //CJK UNIFIED IDEOGRAPH
+ 0x9060: 0x6045, //CJK UNIFIED IDEOGRAPH
+ 0x9061: 0x6046, //CJK UNIFIED IDEOGRAPH
+ 0x9062: 0x6047, //CJK UNIFIED IDEOGRAPH
+ 0x9063: 0x6048, //CJK UNIFIED IDEOGRAPH
+ 0x9064: 0x6049, //CJK UNIFIED IDEOGRAPH
+ 0x9065: 0x604A, //CJK UNIFIED IDEOGRAPH
+ 0x9066: 0x604C, //CJK UNIFIED IDEOGRAPH
+ 0x9067: 0x604E, //CJK UNIFIED IDEOGRAPH
+ 0x9068: 0x604F, //CJK UNIFIED IDEOGRAPH
+ 0x9069: 0x6051, //CJK UNIFIED IDEOGRAPH
+ 0x906A: 0x6053, //CJK UNIFIED IDEOGRAPH
+ 0x906B: 0x6054, //CJK UNIFIED IDEOGRAPH
+ 0x906C: 0x6056, //CJK UNIFIED IDEOGRAPH
+ 0x906D: 0x6057, //CJK UNIFIED IDEOGRAPH
+ 0x906E: 0x6058, //CJK UNIFIED IDEOGRAPH
+ 0x906F: 0x605B, //CJK UNIFIED IDEOGRAPH
+ 0x9070: 0x605C, //CJK UNIFIED IDEOGRAPH
+ 0x9071: 0x605E, //CJK UNIFIED IDEOGRAPH
+ 0x9072: 0x605F, //CJK UNIFIED IDEOGRAPH
+ 0x9073: 0x6060, //CJK UNIFIED IDEOGRAPH
+ 0x9074: 0x6061, //CJK UNIFIED IDEOGRAPH
+ 0x9075: 0x6065, //CJK UNIFIED IDEOGRAPH
+ 0x9076: 0x6066, //CJK UNIFIED IDEOGRAPH
+ 0x9077: 0x606E, //CJK UNIFIED IDEOGRAPH
+ 0x9078: 0x6071, //CJK UNIFIED IDEOGRAPH
+ 0x9079: 0x6072, //CJK UNIFIED IDEOGRAPH
+ 0x907A: 0x6074, //CJK UNIFIED IDEOGRAPH
+ 0x907B: 0x6075, //CJK UNIFIED IDEOGRAPH
+ 0x907C: 0x6077, //CJK UNIFIED IDEOGRAPH
+ 0x907D: 0x607E, //CJK UNIFIED IDEOGRAPH
+ 0x907E: 0x6080, //CJK UNIFIED IDEOGRAPH
+ 0x9080: 0x6081, //CJK UNIFIED IDEOGRAPH
+ 0x9081: 0x6082, //CJK UNIFIED IDEOGRAPH
+ 0x9082: 0x6085, //CJK UNIFIED IDEOGRAPH
+ 0x9083: 0x6086, //CJK UNIFIED IDEOGRAPH
+ 0x9084: 0x6087, //CJK UNIFIED IDEOGRAPH
+ 0x9085: 0x6088, //CJK UNIFIED IDEOGRAPH
+ 0x9086: 0x608A, //CJK UNIFIED IDEOGRAPH
+ 0x9087: 0x608B, //CJK UNIFIED IDEOGRAPH
+ 0x9088: 0x608E, //CJK UNIFIED IDEOGRAPH
+ 0x9089: 0x608F, //CJK UNIFIED IDEOGRAPH
+ 0x908A: 0x6090, //CJK UNIFIED IDEOGRAPH
+ 0x908B: 0x6091, //CJK UNIFIED IDEOGRAPH
+ 0x908C: 0x6093, //CJK UNIFIED IDEOGRAPH
+ 0x908D: 0x6095, //CJK UNIFIED IDEOGRAPH
+ 0x908E: 0x6097, //CJK UNIFIED IDEOGRAPH
+ 0x908F: 0x6098, //CJK UNIFIED IDEOGRAPH
+ 0x9090: 0x6099, //CJK UNIFIED IDEOGRAPH
+ 0x9091: 0x609C, //CJK UNIFIED IDEOGRAPH
+ 0x9092: 0x609E, //CJK UNIFIED IDEOGRAPH
+ 0x9093: 0x60A1, //CJK UNIFIED IDEOGRAPH
+ 0x9094: 0x60A2, //CJK UNIFIED IDEOGRAPH
+ 0x9095: 0x60A4, //CJK UNIFIED IDEOGRAPH
+ 0x9096: 0x60A5, //CJK UNIFIED IDEOGRAPH
+ 0x9097: 0x60A7, //CJK UNIFIED IDEOGRAPH
+ 0x9098: 0x60A9, //CJK UNIFIED IDEOGRAPH
+ 0x9099: 0x60AA, //CJK UNIFIED IDEOGRAPH
+ 0x909A: 0x60AE, //CJK UNIFIED IDEOGRAPH
+ 0x909B: 0x60B0, //CJK UNIFIED IDEOGRAPH
+ 0x909C: 0x60B3, //CJK UNIFIED IDEOGRAPH
+ 0x909D: 0x60B5, //CJK UNIFIED IDEOGRAPH
+ 0x909E: 0x60B6, //CJK UNIFIED IDEOGRAPH
+ 0x909F: 0x60B7, //CJK UNIFIED IDEOGRAPH
+ 0x90A0: 0x60B9, //CJK UNIFIED IDEOGRAPH
+ 0x90A1: 0x60BA, //CJK UNIFIED IDEOGRAPH
+ 0x90A2: 0x60BD, //CJK UNIFIED IDEOGRAPH
+ 0x90A3: 0x60BE, //CJK UNIFIED IDEOGRAPH
+ 0x90A4: 0x60BF, //CJK UNIFIED IDEOGRAPH
+ 0x90A5: 0x60C0, //CJK UNIFIED IDEOGRAPH
+ 0x90A6: 0x60C1, //CJK UNIFIED IDEOGRAPH
+ 0x90A7: 0x60C2, //CJK UNIFIED IDEOGRAPH
+ 0x90A8: 0x60C3, //CJK UNIFIED IDEOGRAPH
+ 0x90A9: 0x60C4, //CJK UNIFIED IDEOGRAPH
+ 0x90AA: 0x60C7, //CJK UNIFIED IDEOGRAPH
+ 0x90AB: 0x60C8, //CJK UNIFIED IDEOGRAPH
+ 0x90AC: 0x60C9, //CJK UNIFIED IDEOGRAPH
+ 0x90AD: 0x60CC, //CJK UNIFIED IDEOGRAPH
+ 0x90AE: 0x60CD, //CJK UNIFIED IDEOGRAPH
+ 0x90AF: 0x60CE, //CJK UNIFIED IDEOGRAPH
+ 0x90B0: 0x60CF, //CJK UNIFIED IDEOGRAPH
+ 0x90B1: 0x60D0, //CJK UNIFIED IDEOGRAPH
+ 0x90B2: 0x60D2, //CJK UNIFIED IDEOGRAPH
+ 0x90B3: 0x60D3, //CJK UNIFIED IDEOGRAPH
+ 0x90B4: 0x60D4, //CJK UNIFIED IDEOGRAPH
+ 0x90B5: 0x60D6, //CJK UNIFIED IDEOGRAPH
+ 0x90B6: 0x60D7, //CJK UNIFIED IDEOGRAPH
+ 0x90B7: 0x60D9, //CJK UNIFIED IDEOGRAPH
+ 0x90B8: 0x60DB, //CJK UNIFIED IDEOGRAPH
+ 0x90B9: 0x60DE, //CJK UNIFIED IDEOGRAPH
+ 0x90BA: 0x60E1, //CJK UNIFIED IDEOGRAPH
+ 0x90BB: 0x60E2, //CJK UNIFIED IDEOGRAPH
+ 0x90BC: 0x60E3, //CJK UNIFIED IDEOGRAPH
+ 0x90BD: 0x60E4, //CJK UNIFIED IDEOGRAPH
+ 0x90BE: 0x60E5, //CJK UNIFIED IDEOGRAPH
+ 0x90BF: 0x60EA, //CJK UNIFIED IDEOGRAPH
+ 0x90C0: 0x60F1, //CJK UNIFIED IDEOGRAPH
+ 0x90C1: 0x60F2, //CJK UNIFIED IDEOGRAPH
+ 0x90C2: 0x60F5, //CJK UNIFIED IDEOGRAPH
+ 0x90C3: 0x60F7, //CJK UNIFIED IDEOGRAPH
+ 0x90C4: 0x60F8, //CJK UNIFIED IDEOGRAPH
+ 0x90C5: 0x60FB, //CJK UNIFIED IDEOGRAPH
+ 0x90C6: 0x60FC, //CJK UNIFIED IDEOGRAPH
+ 0x90C7: 0x60FD, //CJK UNIFIED IDEOGRAPH
+ 0x90C8: 0x60FE, //CJK UNIFIED IDEOGRAPH
+ 0x90C9: 0x60FF, //CJK UNIFIED IDEOGRAPH
+ 0x90CA: 0x6102, //CJK UNIFIED IDEOGRAPH
+ 0x90CB: 0x6103, //CJK UNIFIED IDEOGRAPH
+ 0x90CC: 0x6104, //CJK UNIFIED IDEOGRAPH
+ 0x90CD: 0x6105, //CJK UNIFIED IDEOGRAPH
+ 0x90CE: 0x6107, //CJK UNIFIED IDEOGRAPH
+ 0x90CF: 0x610A, //CJK UNIFIED IDEOGRAPH
+ 0x90D0: 0x610B, //CJK UNIFIED IDEOGRAPH
+ 0x90D1: 0x610C, //CJK UNIFIED IDEOGRAPH
+ 0x90D2: 0x6110, //CJK UNIFIED IDEOGRAPH
+ 0x90D3: 0x6111, //CJK UNIFIED IDEOGRAPH
+ 0x90D4: 0x6112, //CJK UNIFIED IDEOGRAPH
+ 0x90D5: 0x6113, //CJK UNIFIED IDEOGRAPH
+ 0x90D6: 0x6114, //CJK UNIFIED IDEOGRAPH
+ 0x90D7: 0x6116, //CJK UNIFIED IDEOGRAPH
+ 0x90D8: 0x6117, //CJK UNIFIED IDEOGRAPH
+ 0x90D9: 0x6118, //CJK UNIFIED IDEOGRAPH
+ 0x90DA: 0x6119, //CJK UNIFIED IDEOGRAPH
+ 0x90DB: 0x611B, //CJK UNIFIED IDEOGRAPH
+ 0x90DC: 0x611C, //CJK UNIFIED IDEOGRAPH
+ 0x90DD: 0x611D, //CJK UNIFIED IDEOGRAPH
+ 0x90DE: 0x611E, //CJK UNIFIED IDEOGRAPH
+ 0x90DF: 0x6121, //CJK UNIFIED IDEOGRAPH
+ 0x90E0: 0x6122, //CJK UNIFIED IDEOGRAPH
+ 0x90E1: 0x6125, //CJK UNIFIED IDEOGRAPH
+ 0x90E2: 0x6128, //CJK UNIFIED IDEOGRAPH
+ 0x90E3: 0x6129, //CJK UNIFIED IDEOGRAPH
+ 0x90E4: 0x612A, //CJK UNIFIED IDEOGRAPH
+ 0x90E5: 0x612C, //CJK UNIFIED IDEOGRAPH
+ 0x90E6: 0x612D, //CJK UNIFIED IDEOGRAPH
+ 0x90E7: 0x612E, //CJK UNIFIED IDEOGRAPH
+ 0x90E8: 0x612F, //CJK UNIFIED IDEOGRAPH
+ 0x90E9: 0x6130, //CJK UNIFIED IDEOGRAPH
+ 0x90EA: 0x6131, //CJK UNIFIED IDEOGRAPH
+ 0x90EB: 0x6132, //CJK UNIFIED IDEOGRAPH
+ 0x90EC: 0x6133, //CJK UNIFIED IDEOGRAPH
+ 0x90ED: 0x6134, //CJK UNIFIED IDEOGRAPH
+ 0x90EE: 0x6135, //CJK UNIFIED IDEOGRAPH
+ 0x90EF: 0x6136, //CJK UNIFIED IDEOGRAPH
+ 0x90F0: 0x6137, //CJK UNIFIED IDEOGRAPH
+ 0x90F1: 0x6138, //CJK UNIFIED IDEOGRAPH
+ 0x90F2: 0x6139, //CJK UNIFIED IDEOGRAPH
+ 0x90F3: 0x613A, //CJK UNIFIED IDEOGRAPH
+ 0x90F4: 0x613B, //CJK UNIFIED IDEOGRAPH
+ 0x90F5: 0x613C, //CJK UNIFIED IDEOGRAPH
+ 0x90F6: 0x613D, //CJK UNIFIED IDEOGRAPH
+ 0x90F7: 0x613E, //CJK UNIFIED IDEOGRAPH
+ 0x90F8: 0x6140, //CJK UNIFIED IDEOGRAPH
+ 0x90F9: 0x6141, //CJK UNIFIED IDEOGRAPH
+ 0x90FA: 0x6142, //CJK UNIFIED IDEOGRAPH
+ 0x90FB: 0x6143, //CJK UNIFIED IDEOGRAPH
+ 0x90FC: 0x6144, //CJK UNIFIED IDEOGRAPH
+ 0x90FD: 0x6145, //CJK UNIFIED IDEOGRAPH
+ 0x90FE: 0x6146, //CJK UNIFIED IDEOGRAPH
+ 0x9140: 0x6147, //CJK UNIFIED IDEOGRAPH
+ 0x9141: 0x6149, //CJK UNIFIED IDEOGRAPH
+ 0x9142: 0x614B, //CJK UNIFIED IDEOGRAPH
+ 0x9143: 0x614D, //CJK UNIFIED IDEOGRAPH
+ 0x9144: 0x614F, //CJK UNIFIED IDEOGRAPH
+ 0x9145: 0x6150, //CJK UNIFIED IDEOGRAPH
+ 0x9146: 0x6152, //CJK UNIFIED IDEOGRAPH
+ 0x9147: 0x6153, //CJK UNIFIED IDEOGRAPH
+ 0x9148: 0x6154, //CJK UNIFIED IDEOGRAPH
+ 0x9149: 0x6156, //CJK UNIFIED IDEOGRAPH
+ 0x914A: 0x6157, //CJK UNIFIED IDEOGRAPH
+ 0x914B: 0x6158, //CJK UNIFIED IDEOGRAPH
+ 0x914C: 0x6159, //CJK UNIFIED IDEOGRAPH
+ 0x914D: 0x615A, //CJK UNIFIED IDEOGRAPH
+ 0x914E: 0x615B, //CJK UNIFIED IDEOGRAPH
+ 0x914F: 0x615C, //CJK UNIFIED IDEOGRAPH
+ 0x9150: 0x615E, //CJK UNIFIED IDEOGRAPH
+ 0x9151: 0x615F, //CJK UNIFIED IDEOGRAPH
+ 0x9152: 0x6160, //CJK UNIFIED IDEOGRAPH
+ 0x9153: 0x6161, //CJK UNIFIED IDEOGRAPH
+ 0x9154: 0x6163, //CJK UNIFIED IDEOGRAPH
+ 0x9155: 0x6164, //CJK UNIFIED IDEOGRAPH
+ 0x9156: 0x6165, //CJK UNIFIED IDEOGRAPH
+ 0x9157: 0x6166, //CJK UNIFIED IDEOGRAPH
+ 0x9158: 0x6169, //CJK UNIFIED IDEOGRAPH
+ 0x9159: 0x616A, //CJK UNIFIED IDEOGRAPH
+ 0x915A: 0x616B, //CJK UNIFIED IDEOGRAPH
+ 0x915B: 0x616C, //CJK UNIFIED IDEOGRAPH
+ 0x915C: 0x616D, //CJK UNIFIED IDEOGRAPH
+ 0x915D: 0x616E, //CJK UNIFIED IDEOGRAPH
+ 0x915E: 0x616F, //CJK UNIFIED IDEOGRAPH
+ 0x915F: 0x6171, //CJK UNIFIED IDEOGRAPH
+ 0x9160: 0x6172, //CJK UNIFIED IDEOGRAPH
+ 0x9161: 0x6173, //CJK UNIFIED IDEOGRAPH
+ 0x9162: 0x6174, //CJK UNIFIED IDEOGRAPH
+ 0x9163: 0x6176, //CJK UNIFIED IDEOGRAPH
+ 0x9164: 0x6178, //CJK UNIFIED IDEOGRAPH
+ 0x9165: 0x6179, //CJK UNIFIED IDEOGRAPH
+ 0x9166: 0x617A, //CJK UNIFIED IDEOGRAPH
+ 0x9167: 0x617B, //CJK UNIFIED IDEOGRAPH
+ 0x9168: 0x617C, //CJK UNIFIED IDEOGRAPH
+ 0x9169: 0x617D, //CJK UNIFIED IDEOGRAPH
+ 0x916A: 0x617E, //CJK UNIFIED IDEOGRAPH
+ 0x916B: 0x617F, //CJK UNIFIED IDEOGRAPH
+ 0x916C: 0x6180, //CJK UNIFIED IDEOGRAPH
+ 0x916D: 0x6181, //CJK UNIFIED IDEOGRAPH
+ 0x916E: 0x6182, //CJK UNIFIED IDEOGRAPH
+ 0x916F: 0x6183, //CJK UNIFIED IDEOGRAPH
+ 0x9170: 0x6184, //CJK UNIFIED IDEOGRAPH
+ 0x9171: 0x6185, //CJK UNIFIED IDEOGRAPH
+ 0x9172: 0x6186, //CJK UNIFIED IDEOGRAPH
+ 0x9173: 0x6187, //CJK UNIFIED IDEOGRAPH
+ 0x9174: 0x6188, //CJK UNIFIED IDEOGRAPH
+ 0x9175: 0x6189, //CJK UNIFIED IDEOGRAPH
+ 0x9176: 0x618A, //CJK UNIFIED IDEOGRAPH
+ 0x9177: 0x618C, //CJK UNIFIED IDEOGRAPH
+ 0x9178: 0x618D, //CJK UNIFIED IDEOGRAPH
+ 0x9179: 0x618F, //CJK UNIFIED IDEOGRAPH
+ 0x917A: 0x6190, //CJK UNIFIED IDEOGRAPH
+ 0x917B: 0x6191, //CJK UNIFIED IDEOGRAPH
+ 0x917C: 0x6192, //CJK UNIFIED IDEOGRAPH
+ 0x917D: 0x6193, //CJK UNIFIED IDEOGRAPH
+ 0x917E: 0x6195, //CJK UNIFIED IDEOGRAPH
+ 0x9180: 0x6196, //CJK UNIFIED IDEOGRAPH
+ 0x9181: 0x6197, //CJK UNIFIED IDEOGRAPH
+ 0x9182: 0x6198, //CJK UNIFIED IDEOGRAPH
+ 0x9183: 0x6199, //CJK UNIFIED IDEOGRAPH
+ 0x9184: 0x619A, //CJK UNIFIED IDEOGRAPH
+ 0x9185: 0x619B, //CJK UNIFIED IDEOGRAPH
+ 0x9186: 0x619C, //CJK UNIFIED IDEOGRAPH
+ 0x9187: 0x619E, //CJK UNIFIED IDEOGRAPH
+ 0x9188: 0x619F, //CJK UNIFIED IDEOGRAPH
+ 0x9189: 0x61A0, //CJK UNIFIED IDEOGRAPH
+ 0x918A: 0x61A1, //CJK UNIFIED IDEOGRAPH
+ 0x918B: 0x61A2, //CJK UNIFIED IDEOGRAPH
+ 0x918C: 0x61A3, //CJK UNIFIED IDEOGRAPH
+ 0x918D: 0x61A4, //CJK UNIFIED IDEOGRAPH
+ 0x918E: 0x61A5, //CJK UNIFIED IDEOGRAPH
+ 0x918F: 0x61A6, //CJK UNIFIED IDEOGRAPH
+ 0x9190: 0x61AA, //CJK UNIFIED IDEOGRAPH
+ 0x9191: 0x61AB, //CJK UNIFIED IDEOGRAPH
+ 0x9192: 0x61AD, //CJK UNIFIED IDEOGRAPH
+ 0x9193: 0x61AE, //CJK UNIFIED IDEOGRAPH
+ 0x9194: 0x61AF, //CJK UNIFIED IDEOGRAPH
+ 0x9195: 0x61B0, //CJK UNIFIED IDEOGRAPH
+ 0x9196: 0x61B1, //CJK UNIFIED IDEOGRAPH
+ 0x9197: 0x61B2, //CJK UNIFIED IDEOGRAPH
+ 0x9198: 0x61B3, //CJK UNIFIED IDEOGRAPH
+ 0x9199: 0x61B4, //CJK UNIFIED IDEOGRAPH
+ 0x919A: 0x61B5, //CJK UNIFIED IDEOGRAPH
+ 0x919B: 0x61B6, //CJK UNIFIED IDEOGRAPH
+ 0x919C: 0x61B8, //CJK UNIFIED IDEOGRAPH
+ 0x919D: 0x61B9, //CJK UNIFIED IDEOGRAPH
+ 0x919E: 0x61BA, //CJK UNIFIED IDEOGRAPH
+ 0x919F: 0x61BB, //CJK UNIFIED IDEOGRAPH
+ 0x91A0: 0x61BC, //CJK UNIFIED IDEOGRAPH
+ 0x91A1: 0x61BD, //CJK UNIFIED IDEOGRAPH
+ 0x91A2: 0x61BF, //CJK UNIFIED IDEOGRAPH
+ 0x91A3: 0x61C0, //CJK UNIFIED IDEOGRAPH
+ 0x91A4: 0x61C1, //CJK UNIFIED IDEOGRAPH
+ 0x91A5: 0x61C3, //CJK UNIFIED IDEOGRAPH
+ 0x91A6: 0x61C4, //CJK UNIFIED IDEOGRAPH
+ 0x91A7: 0x61C5, //CJK UNIFIED IDEOGRAPH
+ 0x91A8: 0x61C6, //CJK UNIFIED IDEOGRAPH
+ 0x91A9: 0x61C7, //CJK UNIFIED IDEOGRAPH
+ 0x91AA: 0x61C9, //CJK UNIFIED IDEOGRAPH
+ 0x91AB: 0x61CC, //CJK UNIFIED IDEOGRAPH
+ 0x91AC: 0x61CD, //CJK UNIFIED IDEOGRAPH
+ 0x91AD: 0x61CE, //CJK UNIFIED IDEOGRAPH
+ 0x91AE: 0x61CF, //CJK UNIFIED IDEOGRAPH
+ 0x91AF: 0x61D0, //CJK UNIFIED IDEOGRAPH
+ 0x91B0: 0x61D3, //CJK UNIFIED IDEOGRAPH
+ 0x91B1: 0x61D5, //CJK UNIFIED IDEOGRAPH
+ 0x91B2: 0x61D6, //CJK UNIFIED IDEOGRAPH
+ 0x91B3: 0x61D7, //CJK UNIFIED IDEOGRAPH
+ 0x91B4: 0x61D8, //CJK UNIFIED IDEOGRAPH
+ 0x91B5: 0x61D9, //CJK UNIFIED IDEOGRAPH
+ 0x91B6: 0x61DA, //CJK UNIFIED IDEOGRAPH
+ 0x91B7: 0x61DB, //CJK UNIFIED IDEOGRAPH
+ 0x91B8: 0x61DC, //CJK UNIFIED IDEOGRAPH
+ 0x91B9: 0x61DD, //CJK UNIFIED IDEOGRAPH
+ 0x91BA: 0x61DE, //CJK UNIFIED IDEOGRAPH
+ 0x91BB: 0x61DF, //CJK UNIFIED IDEOGRAPH
+ 0x91BC: 0x61E0, //CJK UNIFIED IDEOGRAPH
+ 0x91BD: 0x61E1, //CJK UNIFIED IDEOGRAPH
+ 0x91BE: 0x61E2, //CJK UNIFIED IDEOGRAPH
+ 0x91BF: 0x61E3, //CJK UNIFIED IDEOGRAPH
+ 0x91C0: 0x61E4, //CJK UNIFIED IDEOGRAPH
+ 0x91C1: 0x61E5, //CJK UNIFIED IDEOGRAPH
+ 0x91C2: 0x61E7, //CJK UNIFIED IDEOGRAPH
+ 0x91C3: 0x61E8, //CJK UNIFIED IDEOGRAPH
+ 0x91C4: 0x61E9, //CJK UNIFIED IDEOGRAPH
+ 0x91C5: 0x61EA, //CJK UNIFIED IDEOGRAPH
+ 0x91C6: 0x61EB, //CJK UNIFIED IDEOGRAPH
+ 0x91C7: 0x61EC, //CJK UNIFIED IDEOGRAPH
+ 0x91C8: 0x61ED, //CJK UNIFIED IDEOGRAPH
+ 0x91C9: 0x61EE, //CJK UNIFIED IDEOGRAPH
+ 0x91CA: 0x61EF, //CJK UNIFIED IDEOGRAPH
+ 0x91CB: 0x61F0, //CJK UNIFIED IDEOGRAPH
+ 0x91CC: 0x61F1, //CJK UNIFIED IDEOGRAPH
+ 0x91CD: 0x61F2, //CJK UNIFIED IDEOGRAPH
+ 0x91CE: 0x61F3, //CJK UNIFIED IDEOGRAPH
+ 0x91CF: 0x61F4, //CJK UNIFIED IDEOGRAPH
+ 0x91D0: 0x61F6, //CJK UNIFIED IDEOGRAPH
+ 0x91D1: 0x61F7, //CJK UNIFIED IDEOGRAPH
+ 0x91D2: 0x61F8, //CJK UNIFIED IDEOGRAPH
+ 0x91D3: 0x61F9, //CJK UNIFIED IDEOGRAPH
+ 0x91D4: 0x61FA, //CJK UNIFIED IDEOGRAPH
+ 0x91D5: 0x61FB, //CJK UNIFIED IDEOGRAPH
+ 0x91D6: 0x61FC, //CJK UNIFIED IDEOGRAPH
+ 0x91D7: 0x61FD, //CJK UNIFIED IDEOGRAPH
+ 0x91D8: 0x61FE, //CJK UNIFIED IDEOGRAPH
+ 0x91D9: 0x6200, //CJK UNIFIED IDEOGRAPH
+ 0x91DA: 0x6201, //CJK UNIFIED IDEOGRAPH
+ 0x91DB: 0x6202, //CJK UNIFIED IDEOGRAPH
+ 0x91DC: 0x6203, //CJK UNIFIED IDEOGRAPH
+ 0x91DD: 0x6204, //CJK UNIFIED IDEOGRAPH
+ 0x91DE: 0x6205, //CJK UNIFIED IDEOGRAPH
+ 0x91DF: 0x6207, //CJK UNIFIED IDEOGRAPH
+ 0x91E0: 0x6209, //CJK UNIFIED IDEOGRAPH
+ 0x91E1: 0x6213, //CJK UNIFIED IDEOGRAPH
+ 0x91E2: 0x6214, //CJK UNIFIED IDEOGRAPH
+ 0x91E3: 0x6219, //CJK UNIFIED IDEOGRAPH
+ 0x91E4: 0x621C, //CJK UNIFIED IDEOGRAPH
+ 0x91E5: 0x621D, //CJK UNIFIED IDEOGRAPH
+ 0x91E6: 0x621E, //CJK UNIFIED IDEOGRAPH
+ 0x91E7: 0x6220, //CJK UNIFIED IDEOGRAPH
+ 0x91E8: 0x6223, //CJK UNIFIED IDEOGRAPH
+ 0x91E9: 0x6226, //CJK UNIFIED IDEOGRAPH
+ 0x91EA: 0x6227, //CJK UNIFIED IDEOGRAPH
+ 0x91EB: 0x6228, //CJK UNIFIED IDEOGRAPH
+ 0x91EC: 0x6229, //CJK UNIFIED IDEOGRAPH
+ 0x91ED: 0x622B, //CJK UNIFIED IDEOGRAPH
+ 0x91EE: 0x622D, //CJK UNIFIED IDEOGRAPH
+ 0x91EF: 0x622F, //CJK UNIFIED IDEOGRAPH
+ 0x91F0: 0x6230, //CJK UNIFIED IDEOGRAPH
+ 0x91F1: 0x6231, //CJK UNIFIED IDEOGRAPH
+ 0x91F2: 0x6232, //CJK UNIFIED IDEOGRAPH
+ 0x91F3: 0x6235, //CJK UNIFIED IDEOGRAPH
+ 0x91F4: 0x6236, //CJK UNIFIED IDEOGRAPH
+ 0x91F5: 0x6238, //CJK UNIFIED IDEOGRAPH
+ 0x91F6: 0x6239, //CJK UNIFIED IDEOGRAPH
+ 0x91F7: 0x623A, //CJK UNIFIED IDEOGRAPH
+ 0x91F8: 0x623B, //CJK UNIFIED IDEOGRAPH
+ 0x91F9: 0x623C, //CJK UNIFIED IDEOGRAPH
+ 0x91FA: 0x6242, //CJK UNIFIED IDEOGRAPH
+ 0x91FB: 0x6244, //CJK UNIFIED IDEOGRAPH
+ 0x91FC: 0x6245, //CJK UNIFIED IDEOGRAPH
+ 0x91FD: 0x6246, //CJK UNIFIED IDEOGRAPH
+ 0x91FE: 0x624A, //CJK UNIFIED IDEOGRAPH
+ 0x9240: 0x624F, //CJK UNIFIED IDEOGRAPH
+ 0x9241: 0x6250, //CJK UNIFIED IDEOGRAPH
+ 0x9242: 0x6255, //CJK UNIFIED IDEOGRAPH
+ 0x9243: 0x6256, //CJK UNIFIED IDEOGRAPH
+ 0x9244: 0x6257, //CJK UNIFIED IDEOGRAPH
+ 0x9245: 0x6259, //CJK UNIFIED IDEOGRAPH
+ 0x9246: 0x625A, //CJK UNIFIED IDEOGRAPH
+ 0x9247: 0x625C, //CJK UNIFIED IDEOGRAPH
+ 0x9248: 0x625D, //CJK UNIFIED IDEOGRAPH
+ 0x9249: 0x625E, //CJK UNIFIED IDEOGRAPH
+ 0x924A: 0x625F, //CJK UNIFIED IDEOGRAPH
+ 0x924B: 0x6260, //CJK UNIFIED IDEOGRAPH
+ 0x924C: 0x6261, //CJK UNIFIED IDEOGRAPH
+ 0x924D: 0x6262, //CJK UNIFIED IDEOGRAPH
+ 0x924E: 0x6264, //CJK UNIFIED IDEOGRAPH
+ 0x924F: 0x6265, //CJK UNIFIED IDEOGRAPH
+ 0x9250: 0x6268, //CJK UNIFIED IDEOGRAPH
+ 0x9251: 0x6271, //CJK UNIFIED IDEOGRAPH
+ 0x9252: 0x6272, //CJK UNIFIED IDEOGRAPH
+ 0x9253: 0x6274, //CJK UNIFIED IDEOGRAPH
+ 0x9254: 0x6275, //CJK UNIFIED IDEOGRAPH
+ 0x9255: 0x6277, //CJK UNIFIED IDEOGRAPH
+ 0x9256: 0x6278, //CJK UNIFIED IDEOGRAPH
+ 0x9257: 0x627A, //CJK UNIFIED IDEOGRAPH
+ 0x9258: 0x627B, //CJK UNIFIED IDEOGRAPH
+ 0x9259: 0x627D, //CJK UNIFIED IDEOGRAPH
+ 0x925A: 0x6281, //CJK UNIFIED IDEOGRAPH
+ 0x925B: 0x6282, //CJK UNIFIED IDEOGRAPH
+ 0x925C: 0x6283, //CJK UNIFIED IDEOGRAPH
+ 0x925D: 0x6285, //CJK UNIFIED IDEOGRAPH
+ 0x925E: 0x6286, //CJK UNIFIED IDEOGRAPH
+ 0x925F: 0x6287, //CJK UNIFIED IDEOGRAPH
+ 0x9260: 0x6288, //CJK UNIFIED IDEOGRAPH
+ 0x9261: 0x628B, //CJK UNIFIED IDEOGRAPH
+ 0x9262: 0x628C, //CJK UNIFIED IDEOGRAPH
+ 0x9263: 0x628D, //CJK UNIFIED IDEOGRAPH
+ 0x9264: 0x628E, //CJK UNIFIED IDEOGRAPH
+ 0x9265: 0x628F, //CJK UNIFIED IDEOGRAPH
+ 0x9266: 0x6290, //CJK UNIFIED IDEOGRAPH
+ 0x9267: 0x6294, //CJK UNIFIED IDEOGRAPH
+ 0x9268: 0x6299, //CJK UNIFIED IDEOGRAPH
+ 0x9269: 0x629C, //CJK UNIFIED IDEOGRAPH
+ 0x926A: 0x629D, //CJK UNIFIED IDEOGRAPH
+ 0x926B: 0x629E, //CJK UNIFIED IDEOGRAPH
+ 0x926C: 0x62A3, //CJK UNIFIED IDEOGRAPH
+ 0x926D: 0x62A6, //CJK UNIFIED IDEOGRAPH
+ 0x926E: 0x62A7, //CJK UNIFIED IDEOGRAPH
+ 0x926F: 0x62A9, //CJK UNIFIED IDEOGRAPH
+ 0x9270: 0x62AA, //CJK UNIFIED IDEOGRAPH
+ 0x9271: 0x62AD, //CJK UNIFIED IDEOGRAPH
+ 0x9272: 0x62AE, //CJK UNIFIED IDEOGRAPH
+ 0x9273: 0x62AF, //CJK UNIFIED IDEOGRAPH
+ 0x9274: 0x62B0, //CJK UNIFIED IDEOGRAPH
+ 0x9275: 0x62B2, //CJK UNIFIED IDEOGRAPH
+ 0x9276: 0x62B3, //CJK UNIFIED IDEOGRAPH
+ 0x9277: 0x62B4, //CJK UNIFIED IDEOGRAPH
+ 0x9278: 0x62B6, //CJK UNIFIED IDEOGRAPH
+ 0x9279: 0x62B7, //CJK UNIFIED IDEOGRAPH
+ 0x927A: 0x62B8, //CJK UNIFIED IDEOGRAPH
+ 0x927B: 0x62BA, //CJK UNIFIED IDEOGRAPH
+ 0x927C: 0x62BE, //CJK UNIFIED IDEOGRAPH
+ 0x927D: 0x62C0, //CJK UNIFIED IDEOGRAPH
+ 0x927E: 0x62C1, //CJK UNIFIED IDEOGRAPH
+ 0x9280: 0x62C3, //CJK UNIFIED IDEOGRAPH
+ 0x9281: 0x62CB, //CJK UNIFIED IDEOGRAPH
+ 0x9282: 0x62CF, //CJK UNIFIED IDEOGRAPH
+ 0x9283: 0x62D1, //CJK UNIFIED IDEOGRAPH
+ 0x9284: 0x62D5, //CJK UNIFIED IDEOGRAPH
+ 0x9285: 0x62DD, //CJK UNIFIED IDEOGRAPH
+ 0x9286: 0x62DE, //CJK UNIFIED IDEOGRAPH
+ 0x9287: 0x62E0, //CJK UNIFIED IDEOGRAPH
+ 0x9288: 0x62E1, //CJK UNIFIED IDEOGRAPH
+ 0x9289: 0x62E4, //CJK UNIFIED IDEOGRAPH
+ 0x928A: 0x62EA, //CJK UNIFIED IDEOGRAPH
+ 0x928B: 0x62EB, //CJK UNIFIED IDEOGRAPH
+ 0x928C: 0x62F0, //CJK UNIFIED IDEOGRAPH
+ 0x928D: 0x62F2, //CJK UNIFIED IDEOGRAPH
+ 0x928E: 0x62F5, //CJK UNIFIED IDEOGRAPH
+ 0x928F: 0x62F8, //CJK UNIFIED IDEOGRAPH
+ 0x9290: 0x62F9, //CJK UNIFIED IDEOGRAPH
+ 0x9291: 0x62FA, //CJK UNIFIED IDEOGRAPH
+ 0x9292: 0x62FB, //CJK UNIFIED IDEOGRAPH
+ 0x9293: 0x6300, //CJK UNIFIED IDEOGRAPH
+ 0x9294: 0x6303, //CJK UNIFIED IDEOGRAPH
+ 0x9295: 0x6304, //CJK UNIFIED IDEOGRAPH
+ 0x9296: 0x6305, //CJK UNIFIED IDEOGRAPH
+ 0x9297: 0x6306, //CJK UNIFIED IDEOGRAPH
+ 0x9298: 0x630A, //CJK UNIFIED IDEOGRAPH
+ 0x9299: 0x630B, //CJK UNIFIED IDEOGRAPH
+ 0x929A: 0x630C, //CJK UNIFIED IDEOGRAPH
+ 0x929B: 0x630D, //CJK UNIFIED IDEOGRAPH
+ 0x929C: 0x630F, //CJK UNIFIED IDEOGRAPH
+ 0x929D: 0x6310, //CJK UNIFIED IDEOGRAPH
+ 0x929E: 0x6312, //CJK UNIFIED IDEOGRAPH
+ 0x929F: 0x6313, //CJK UNIFIED IDEOGRAPH
+ 0x92A0: 0x6314, //CJK UNIFIED IDEOGRAPH
+ 0x92A1: 0x6315, //CJK UNIFIED IDEOGRAPH
+ 0x92A2: 0x6317, //CJK UNIFIED IDEOGRAPH
+ 0x92A3: 0x6318, //CJK UNIFIED IDEOGRAPH
+ 0x92A4: 0x6319, //CJK UNIFIED IDEOGRAPH
+ 0x92A5: 0x631C, //CJK UNIFIED IDEOGRAPH
+ 0x92A6: 0x6326, //CJK UNIFIED IDEOGRAPH
+ 0x92A7: 0x6327, //CJK UNIFIED IDEOGRAPH
+ 0x92A8: 0x6329, //CJK UNIFIED IDEOGRAPH
+ 0x92A9: 0x632C, //CJK UNIFIED IDEOGRAPH
+ 0x92AA: 0x632D, //CJK UNIFIED IDEOGRAPH
+ 0x92AB: 0x632E, //CJK UNIFIED IDEOGRAPH
+ 0x92AC: 0x6330, //CJK UNIFIED IDEOGRAPH
+ 0x92AD: 0x6331, //CJK UNIFIED IDEOGRAPH
+ 0x92AE: 0x6333, //CJK UNIFIED IDEOGRAPH
+ 0x92AF: 0x6334, //CJK UNIFIED IDEOGRAPH
+ 0x92B0: 0x6335, //CJK UNIFIED IDEOGRAPH
+ 0x92B1: 0x6336, //CJK UNIFIED IDEOGRAPH
+ 0x92B2: 0x6337, //CJK UNIFIED IDEOGRAPH
+ 0x92B3: 0x6338, //CJK UNIFIED IDEOGRAPH
+ 0x92B4: 0x633B, //CJK UNIFIED IDEOGRAPH
+ 0x92B5: 0x633C, //CJK UNIFIED IDEOGRAPH
+ 0x92B6: 0x633E, //CJK UNIFIED IDEOGRAPH
+ 0x92B7: 0x633F, //CJK UNIFIED IDEOGRAPH
+ 0x92B8: 0x6340, //CJK UNIFIED IDEOGRAPH
+ 0x92B9: 0x6341, //CJK UNIFIED IDEOGRAPH
+ 0x92BA: 0x6344, //CJK UNIFIED IDEOGRAPH
+ 0x92BB: 0x6347, //CJK UNIFIED IDEOGRAPH
+ 0x92BC: 0x6348, //CJK UNIFIED IDEOGRAPH
+ 0x92BD: 0x634A, //CJK UNIFIED IDEOGRAPH
+ 0x92BE: 0x6351, //CJK UNIFIED IDEOGRAPH
+ 0x92BF: 0x6352, //CJK UNIFIED IDEOGRAPH
+ 0x92C0: 0x6353, //CJK UNIFIED IDEOGRAPH
+ 0x92C1: 0x6354, //CJK UNIFIED IDEOGRAPH
+ 0x92C2: 0x6356, //CJK UNIFIED IDEOGRAPH
+ 0x92C3: 0x6357, //CJK UNIFIED IDEOGRAPH
+ 0x92C4: 0x6358, //CJK UNIFIED IDEOGRAPH
+ 0x92C5: 0x6359, //CJK UNIFIED IDEOGRAPH
+ 0x92C6: 0x635A, //CJK UNIFIED IDEOGRAPH
+ 0x92C7: 0x635B, //CJK UNIFIED IDEOGRAPH
+ 0x92C8: 0x635C, //CJK UNIFIED IDEOGRAPH
+ 0x92C9: 0x635D, //CJK UNIFIED IDEOGRAPH
+ 0x92CA: 0x6360, //CJK UNIFIED IDEOGRAPH
+ 0x92CB: 0x6364, //CJK UNIFIED IDEOGRAPH
+ 0x92CC: 0x6365, //CJK UNIFIED IDEOGRAPH
+ 0x92CD: 0x6366, //CJK UNIFIED IDEOGRAPH
+ 0x92CE: 0x6368, //CJK UNIFIED IDEOGRAPH
+ 0x92CF: 0x636A, //CJK UNIFIED IDEOGRAPH
+ 0x92D0: 0x636B, //CJK UNIFIED IDEOGRAPH
+ 0x92D1: 0x636C, //CJK UNIFIED IDEOGRAPH
+ 0x92D2: 0x636F, //CJK UNIFIED IDEOGRAPH
+ 0x92D3: 0x6370, //CJK UNIFIED IDEOGRAPH
+ 0x92D4: 0x6372, //CJK UNIFIED IDEOGRAPH
+ 0x92D5: 0x6373, //CJK UNIFIED IDEOGRAPH
+ 0x92D6: 0x6374, //CJK UNIFIED IDEOGRAPH
+ 0x92D7: 0x6375, //CJK UNIFIED IDEOGRAPH
+ 0x92D8: 0x6378, //CJK UNIFIED IDEOGRAPH
+ 0x92D9: 0x6379, //CJK UNIFIED IDEOGRAPH
+ 0x92DA: 0x637C, //CJK UNIFIED IDEOGRAPH
+ 0x92DB: 0x637D, //CJK UNIFIED IDEOGRAPH
+ 0x92DC: 0x637E, //CJK UNIFIED IDEOGRAPH
+ 0x92DD: 0x637F, //CJK UNIFIED IDEOGRAPH
+ 0x92DE: 0x6381, //CJK UNIFIED IDEOGRAPH
+ 0x92DF: 0x6383, //CJK UNIFIED IDEOGRAPH
+ 0x92E0: 0x6384, //CJK UNIFIED IDEOGRAPH
+ 0x92E1: 0x6385, //CJK UNIFIED IDEOGRAPH
+ 0x92E2: 0x6386, //CJK UNIFIED IDEOGRAPH
+ 0x92E3: 0x638B, //CJK UNIFIED IDEOGRAPH
+ 0x92E4: 0x638D, //CJK UNIFIED IDEOGRAPH
+ 0x92E5: 0x6391, //CJK UNIFIED IDEOGRAPH
+ 0x92E6: 0x6393, //CJK UNIFIED IDEOGRAPH
+ 0x92E7: 0x6394, //CJK UNIFIED IDEOGRAPH
+ 0x92E8: 0x6395, //CJK UNIFIED IDEOGRAPH
+ 0x92E9: 0x6397, //CJK UNIFIED IDEOGRAPH
+ 0x92EA: 0x6399, //CJK UNIFIED IDEOGRAPH
+ 0x92EB: 0x639A, //CJK UNIFIED IDEOGRAPH
+ 0x92EC: 0x639B, //CJK UNIFIED IDEOGRAPH
+ 0x92ED: 0x639C, //CJK UNIFIED IDEOGRAPH
+ 0x92EE: 0x639D, //CJK UNIFIED IDEOGRAPH
+ 0x92EF: 0x639E, //CJK UNIFIED IDEOGRAPH
+ 0x92F0: 0x639F, //CJK UNIFIED IDEOGRAPH
+ 0x92F1: 0x63A1, //CJK UNIFIED IDEOGRAPH
+ 0x92F2: 0x63A4, //CJK UNIFIED IDEOGRAPH
+ 0x92F3: 0x63A6, //CJK UNIFIED IDEOGRAPH
+ 0x92F4: 0x63AB, //CJK UNIFIED IDEOGRAPH
+ 0x92F5: 0x63AF, //CJK UNIFIED IDEOGRAPH
+ 0x92F6: 0x63B1, //CJK UNIFIED IDEOGRAPH
+ 0x92F7: 0x63B2, //CJK UNIFIED IDEOGRAPH
+ 0x92F8: 0x63B5, //CJK UNIFIED IDEOGRAPH
+ 0x92F9: 0x63B6, //CJK UNIFIED IDEOGRAPH
+ 0x92FA: 0x63B9, //CJK UNIFIED IDEOGRAPH
+ 0x92FB: 0x63BB, //CJK UNIFIED IDEOGRAPH
+ 0x92FC: 0x63BD, //CJK UNIFIED IDEOGRAPH
+ 0x92FD: 0x63BF, //CJK UNIFIED IDEOGRAPH
+ 0x92FE: 0x63C0, //CJK UNIFIED IDEOGRAPH
+ 0x9340: 0x63C1, //CJK UNIFIED IDEOGRAPH
+ 0x9341: 0x63C2, //CJK UNIFIED IDEOGRAPH
+ 0x9342: 0x63C3, //CJK UNIFIED IDEOGRAPH
+ 0x9343: 0x63C5, //CJK UNIFIED IDEOGRAPH
+ 0x9344: 0x63C7, //CJK UNIFIED IDEOGRAPH
+ 0x9345: 0x63C8, //CJK UNIFIED IDEOGRAPH
+ 0x9346: 0x63CA, //CJK UNIFIED IDEOGRAPH
+ 0x9347: 0x63CB, //CJK UNIFIED IDEOGRAPH
+ 0x9348: 0x63CC, //CJK UNIFIED IDEOGRAPH
+ 0x9349: 0x63D1, //CJK UNIFIED IDEOGRAPH
+ 0x934A: 0x63D3, //CJK UNIFIED IDEOGRAPH
+ 0x934B: 0x63D4, //CJK UNIFIED IDEOGRAPH
+ 0x934C: 0x63D5, //CJK UNIFIED IDEOGRAPH
+ 0x934D: 0x63D7, //CJK UNIFIED IDEOGRAPH
+ 0x934E: 0x63D8, //CJK UNIFIED IDEOGRAPH
+ 0x934F: 0x63D9, //CJK UNIFIED IDEOGRAPH
+ 0x9350: 0x63DA, //CJK UNIFIED IDEOGRAPH
+ 0x9351: 0x63DB, //CJK UNIFIED IDEOGRAPH
+ 0x9352: 0x63DC, //CJK UNIFIED IDEOGRAPH
+ 0x9353: 0x63DD, //CJK UNIFIED IDEOGRAPH
+ 0x9354: 0x63DF, //CJK UNIFIED IDEOGRAPH
+ 0x9355: 0x63E2, //CJK UNIFIED IDEOGRAPH
+ 0x9356: 0x63E4, //CJK UNIFIED IDEOGRAPH
+ 0x9357: 0x63E5, //CJK UNIFIED IDEOGRAPH
+ 0x9358: 0x63E6, //CJK UNIFIED IDEOGRAPH
+ 0x9359: 0x63E7, //CJK UNIFIED IDEOGRAPH
+ 0x935A: 0x63E8, //CJK UNIFIED IDEOGRAPH
+ 0x935B: 0x63EB, //CJK UNIFIED IDEOGRAPH
+ 0x935C: 0x63EC, //CJK UNIFIED IDEOGRAPH
+ 0x935D: 0x63EE, //CJK UNIFIED IDEOGRAPH
+ 0x935E: 0x63EF, //CJK UNIFIED IDEOGRAPH
+ 0x935F: 0x63F0, //CJK UNIFIED IDEOGRAPH
+ 0x9360: 0x63F1, //CJK UNIFIED IDEOGRAPH
+ 0x9361: 0x63F3, //CJK UNIFIED IDEOGRAPH
+ 0x9362: 0x63F5, //CJK UNIFIED IDEOGRAPH
+ 0x9363: 0x63F7, //CJK UNIFIED IDEOGRAPH
+ 0x9364: 0x63F9, //CJK UNIFIED IDEOGRAPH
+ 0x9365: 0x63FA, //CJK UNIFIED IDEOGRAPH
+ 0x9366: 0x63FB, //CJK UNIFIED IDEOGRAPH
+ 0x9367: 0x63FC, //CJK UNIFIED IDEOGRAPH
+ 0x9368: 0x63FE, //CJK UNIFIED IDEOGRAPH
+ 0x9369: 0x6403, //CJK UNIFIED IDEOGRAPH
+ 0x936A: 0x6404, //CJK UNIFIED IDEOGRAPH
+ 0x936B: 0x6406, //CJK UNIFIED IDEOGRAPH
+ 0x936C: 0x6407, //CJK UNIFIED IDEOGRAPH
+ 0x936D: 0x6408, //CJK UNIFIED IDEOGRAPH
+ 0x936E: 0x6409, //CJK UNIFIED IDEOGRAPH
+ 0x936F: 0x640A, //CJK UNIFIED IDEOGRAPH
+ 0x9370: 0x640D, //CJK UNIFIED IDEOGRAPH
+ 0x9371: 0x640E, //CJK UNIFIED IDEOGRAPH
+ 0x9372: 0x6411, //CJK UNIFIED IDEOGRAPH
+ 0x9373: 0x6412, //CJK UNIFIED IDEOGRAPH
+ 0x9374: 0x6415, //CJK UNIFIED IDEOGRAPH
+ 0x9375: 0x6416, //CJK UNIFIED IDEOGRAPH
+ 0x9376: 0x6417, //CJK UNIFIED IDEOGRAPH
+ 0x9377: 0x6418, //CJK UNIFIED IDEOGRAPH
+ 0x9378: 0x6419, //CJK UNIFIED IDEOGRAPH
+ 0x9379: 0x641A, //CJK UNIFIED IDEOGRAPH
+ 0x937A: 0x641D, //CJK UNIFIED IDEOGRAPH
+ 0x937B: 0x641F, //CJK UNIFIED IDEOGRAPH
+ 0x937C: 0x6422, //CJK UNIFIED IDEOGRAPH
+ 0x937D: 0x6423, //CJK UNIFIED IDEOGRAPH
+ 0x937E: 0x6424, //CJK UNIFIED IDEOGRAPH
+ 0x9380: 0x6425, //CJK UNIFIED IDEOGRAPH
+ 0x9381: 0x6427, //CJK UNIFIED IDEOGRAPH
+ 0x9382: 0x6428, //CJK UNIFIED IDEOGRAPH
+ 0x9383: 0x6429, //CJK UNIFIED IDEOGRAPH
+ 0x9384: 0x642B, //CJK UNIFIED IDEOGRAPH
+ 0x9385: 0x642E, //CJK UNIFIED IDEOGRAPH
+ 0x9386: 0x642F, //CJK UNIFIED IDEOGRAPH
+ 0x9387: 0x6430, //CJK UNIFIED IDEOGRAPH
+ 0x9388: 0x6431, //CJK UNIFIED IDEOGRAPH
+ 0x9389: 0x6432, //CJK UNIFIED IDEOGRAPH
+ 0x938A: 0x6433, //CJK UNIFIED IDEOGRAPH
+ 0x938B: 0x6435, //CJK UNIFIED IDEOGRAPH
+ 0x938C: 0x6436, //CJK UNIFIED IDEOGRAPH
+ 0x938D: 0x6437, //CJK UNIFIED IDEOGRAPH
+ 0x938E: 0x6438, //CJK UNIFIED IDEOGRAPH
+ 0x938F: 0x6439, //CJK UNIFIED IDEOGRAPH
+ 0x9390: 0x643B, //CJK UNIFIED IDEOGRAPH
+ 0x9391: 0x643C, //CJK UNIFIED IDEOGRAPH
+ 0x9392: 0x643E, //CJK UNIFIED IDEOGRAPH
+ 0x9393: 0x6440, //CJK UNIFIED IDEOGRAPH
+ 0x9394: 0x6442, //CJK UNIFIED IDEOGRAPH
+ 0x9395: 0x6443, //CJK UNIFIED IDEOGRAPH
+ 0x9396: 0x6449, //CJK UNIFIED IDEOGRAPH
+ 0x9397: 0x644B, //CJK UNIFIED IDEOGRAPH
+ 0x9398: 0x644C, //CJK UNIFIED IDEOGRAPH
+ 0x9399: 0x644D, //CJK UNIFIED IDEOGRAPH
+ 0x939A: 0x644E, //CJK UNIFIED IDEOGRAPH
+ 0x939B: 0x644F, //CJK UNIFIED IDEOGRAPH
+ 0x939C: 0x6450, //CJK UNIFIED IDEOGRAPH
+ 0x939D: 0x6451, //CJK UNIFIED IDEOGRAPH
+ 0x939E: 0x6453, //CJK UNIFIED IDEOGRAPH
+ 0x939F: 0x6455, //CJK UNIFIED IDEOGRAPH
+ 0x93A0: 0x6456, //CJK UNIFIED IDEOGRAPH
+ 0x93A1: 0x6457, //CJK UNIFIED IDEOGRAPH
+ 0x93A2: 0x6459, //CJK UNIFIED IDEOGRAPH
+ 0x93A3: 0x645A, //CJK UNIFIED IDEOGRAPH
+ 0x93A4: 0x645B, //CJK UNIFIED IDEOGRAPH
+ 0x93A5: 0x645C, //CJK UNIFIED IDEOGRAPH
+ 0x93A6: 0x645D, //CJK UNIFIED IDEOGRAPH
+ 0x93A7: 0x645F, //CJK UNIFIED IDEOGRAPH
+ 0x93A8: 0x6460, //CJK UNIFIED IDEOGRAPH
+ 0x93A9: 0x6461, //CJK UNIFIED IDEOGRAPH
+ 0x93AA: 0x6462, //CJK UNIFIED IDEOGRAPH
+ 0x93AB: 0x6463, //CJK UNIFIED IDEOGRAPH
+ 0x93AC: 0x6464, //CJK UNIFIED IDEOGRAPH
+ 0x93AD: 0x6465, //CJK UNIFIED IDEOGRAPH
+ 0x93AE: 0x6466, //CJK UNIFIED IDEOGRAPH
+ 0x93AF: 0x6468, //CJK UNIFIED IDEOGRAPH
+ 0x93B0: 0x646A, //CJK UNIFIED IDEOGRAPH
+ 0x93B1: 0x646B, //CJK UNIFIED IDEOGRAPH
+ 0x93B2: 0x646C, //CJK UNIFIED IDEOGRAPH
+ 0x93B3: 0x646E, //CJK UNIFIED IDEOGRAPH
+ 0x93B4: 0x646F, //CJK UNIFIED IDEOGRAPH
+ 0x93B5: 0x6470, //CJK UNIFIED IDEOGRAPH
+ 0x93B6: 0x6471, //CJK UNIFIED IDEOGRAPH
+ 0x93B7: 0x6472, //CJK UNIFIED IDEOGRAPH
+ 0x93B8: 0x6473, //CJK UNIFIED IDEOGRAPH
+ 0x93B9: 0x6474, //CJK UNIFIED IDEOGRAPH
+ 0x93BA: 0x6475, //CJK UNIFIED IDEOGRAPH
+ 0x93BB: 0x6476, //CJK UNIFIED IDEOGRAPH
+ 0x93BC: 0x6477, //CJK UNIFIED IDEOGRAPH
+ 0x93BD: 0x647B, //CJK UNIFIED IDEOGRAPH
+ 0x93BE: 0x647C, //CJK UNIFIED IDEOGRAPH
+ 0x93BF: 0x647D, //CJK UNIFIED IDEOGRAPH
+ 0x93C0: 0x647E, //CJK UNIFIED IDEOGRAPH
+ 0x93C1: 0x647F, //CJK UNIFIED IDEOGRAPH
+ 0x93C2: 0x6480, //CJK UNIFIED IDEOGRAPH
+ 0x93C3: 0x6481, //CJK UNIFIED IDEOGRAPH
+ 0x93C4: 0x6483, //CJK UNIFIED IDEOGRAPH
+ 0x93C5: 0x6486, //CJK UNIFIED IDEOGRAPH
+ 0x93C6: 0x6488, //CJK UNIFIED IDEOGRAPH
+ 0x93C7: 0x6489, //CJK UNIFIED IDEOGRAPH
+ 0x93C8: 0x648A, //CJK UNIFIED IDEOGRAPH
+ 0x93C9: 0x648B, //CJK UNIFIED IDEOGRAPH
+ 0x93CA: 0x648C, //CJK UNIFIED IDEOGRAPH
+ 0x93CB: 0x648D, //CJK UNIFIED IDEOGRAPH
+ 0x93CC: 0x648E, //CJK UNIFIED IDEOGRAPH
+ 0x93CD: 0x648F, //CJK UNIFIED IDEOGRAPH
+ 0x93CE: 0x6490, //CJK UNIFIED IDEOGRAPH
+ 0x93CF: 0x6493, //CJK UNIFIED IDEOGRAPH
+ 0x93D0: 0x6494, //CJK UNIFIED IDEOGRAPH
+ 0x93D1: 0x6497, //CJK UNIFIED IDEOGRAPH
+ 0x93D2: 0x6498, //CJK UNIFIED IDEOGRAPH
+ 0x93D3: 0x649A, //CJK UNIFIED IDEOGRAPH
+ 0x93D4: 0x649B, //CJK UNIFIED IDEOGRAPH
+ 0x93D5: 0x649C, //CJK UNIFIED IDEOGRAPH
+ 0x93D6: 0x649D, //CJK UNIFIED IDEOGRAPH
+ 0x93D7: 0x649F, //CJK UNIFIED IDEOGRAPH
+ 0x93D8: 0x64A0, //CJK UNIFIED IDEOGRAPH
+ 0x93D9: 0x64A1, //CJK UNIFIED IDEOGRAPH
+ 0x93DA: 0x64A2, //CJK UNIFIED IDEOGRAPH
+ 0x93DB: 0x64A3, //CJK UNIFIED IDEOGRAPH
+ 0x93DC: 0x64A5, //CJK UNIFIED IDEOGRAPH
+ 0x93DD: 0x64A6, //CJK UNIFIED IDEOGRAPH
+ 0x93DE: 0x64A7, //CJK UNIFIED IDEOGRAPH
+ 0x93DF: 0x64A8, //CJK UNIFIED IDEOGRAPH
+ 0x93E0: 0x64AA, //CJK UNIFIED IDEOGRAPH
+ 0x93E1: 0x64AB, //CJK UNIFIED IDEOGRAPH
+ 0x93E2: 0x64AF, //CJK UNIFIED IDEOGRAPH
+ 0x93E3: 0x64B1, //CJK UNIFIED IDEOGRAPH
+ 0x93E4: 0x64B2, //CJK UNIFIED IDEOGRAPH
+ 0x93E5: 0x64B3, //CJK UNIFIED IDEOGRAPH
+ 0x93E6: 0x64B4, //CJK UNIFIED IDEOGRAPH
+ 0x93E7: 0x64B6, //CJK UNIFIED IDEOGRAPH
+ 0x93E8: 0x64B9, //CJK UNIFIED IDEOGRAPH
+ 0x93E9: 0x64BB, //CJK UNIFIED IDEOGRAPH
+ 0x93EA: 0x64BD, //CJK UNIFIED IDEOGRAPH
+ 0x93EB: 0x64BE, //CJK UNIFIED IDEOGRAPH
+ 0x93EC: 0x64BF, //CJK UNIFIED IDEOGRAPH
+ 0x93ED: 0x64C1, //CJK UNIFIED IDEOGRAPH
+ 0x93EE: 0x64C3, //CJK UNIFIED IDEOGRAPH
+ 0x93EF: 0x64C4, //CJK UNIFIED IDEOGRAPH
+ 0x93F0: 0x64C6, //CJK UNIFIED IDEOGRAPH
+ 0x93F1: 0x64C7, //CJK UNIFIED IDEOGRAPH
+ 0x93F2: 0x64C8, //CJK UNIFIED IDEOGRAPH
+ 0x93F3: 0x64C9, //CJK UNIFIED IDEOGRAPH
+ 0x93F4: 0x64CA, //CJK UNIFIED IDEOGRAPH
+ 0x93F5: 0x64CB, //CJK UNIFIED IDEOGRAPH
+ 0x93F6: 0x64CC, //CJK UNIFIED IDEOGRAPH
+ 0x93F7: 0x64CF, //CJK UNIFIED IDEOGRAPH
+ 0x93F8: 0x64D1, //CJK UNIFIED IDEOGRAPH
+ 0x93F9: 0x64D3, //CJK UNIFIED IDEOGRAPH
+ 0x93FA: 0x64D4, //CJK UNIFIED IDEOGRAPH
+ 0x93FB: 0x64D5, //CJK UNIFIED IDEOGRAPH
+ 0x93FC: 0x64D6, //CJK UNIFIED IDEOGRAPH
+ 0x93FD: 0x64D9, //CJK UNIFIED IDEOGRAPH
+ 0x93FE: 0x64DA, //CJK UNIFIED IDEOGRAPH
+ 0x9440: 0x64DB, //CJK UNIFIED IDEOGRAPH
+ 0x9441: 0x64DC, //CJK UNIFIED IDEOGRAPH
+ 0x9442: 0x64DD, //CJK UNIFIED IDEOGRAPH
+ 0x9443: 0x64DF, //CJK UNIFIED IDEOGRAPH
+ 0x9444: 0x64E0, //CJK UNIFIED IDEOGRAPH
+ 0x9445: 0x64E1, //CJK UNIFIED IDEOGRAPH
+ 0x9446: 0x64E3, //CJK UNIFIED IDEOGRAPH
+ 0x9447: 0x64E5, //CJK UNIFIED IDEOGRAPH
+ 0x9448: 0x64E7, //CJK UNIFIED IDEOGRAPH
+ 0x9449: 0x64E8, //CJK UNIFIED IDEOGRAPH
+ 0x944A: 0x64E9, //CJK UNIFIED IDEOGRAPH
+ 0x944B: 0x64EA, //CJK UNIFIED IDEOGRAPH
+ 0x944C: 0x64EB, //CJK UNIFIED IDEOGRAPH
+ 0x944D: 0x64EC, //CJK UNIFIED IDEOGRAPH
+ 0x944E: 0x64ED, //CJK UNIFIED IDEOGRAPH
+ 0x944F: 0x64EE, //CJK UNIFIED IDEOGRAPH
+ 0x9450: 0x64EF, //CJK UNIFIED IDEOGRAPH
+ 0x9451: 0x64F0, //CJK UNIFIED IDEOGRAPH
+ 0x9452: 0x64F1, //CJK UNIFIED IDEOGRAPH
+ 0x9453: 0x64F2, //CJK UNIFIED IDEOGRAPH
+ 0x9454: 0x64F3, //CJK UNIFIED IDEOGRAPH
+ 0x9455: 0x64F4, //CJK UNIFIED IDEOGRAPH
+ 0x9456: 0x64F5, //CJK UNIFIED IDEOGRAPH
+ 0x9457: 0x64F6, //CJK UNIFIED IDEOGRAPH
+ 0x9458: 0x64F7, //CJK UNIFIED IDEOGRAPH
+ 0x9459: 0x64F8, //CJK UNIFIED IDEOGRAPH
+ 0x945A: 0x64F9, //CJK UNIFIED IDEOGRAPH
+ 0x945B: 0x64FA, //CJK UNIFIED IDEOGRAPH
+ 0x945C: 0x64FB, //CJK UNIFIED IDEOGRAPH
+ 0x945D: 0x64FC, //CJK UNIFIED IDEOGRAPH
+ 0x945E: 0x64FD, //CJK UNIFIED IDEOGRAPH
+ 0x945F: 0x64FE, //CJK UNIFIED IDEOGRAPH
+ 0x9460: 0x64FF, //CJK UNIFIED IDEOGRAPH
+ 0x9461: 0x6501, //CJK UNIFIED IDEOGRAPH
+ 0x9462: 0x6502, //CJK UNIFIED IDEOGRAPH
+ 0x9463: 0x6503, //CJK UNIFIED IDEOGRAPH
+ 0x9464: 0x6504, //CJK UNIFIED IDEOGRAPH
+ 0x9465: 0x6505, //CJK UNIFIED IDEOGRAPH
+ 0x9466: 0x6506, //CJK UNIFIED IDEOGRAPH
+ 0x9467: 0x6507, //CJK UNIFIED IDEOGRAPH
+ 0x9468: 0x6508, //CJK UNIFIED IDEOGRAPH
+ 0x9469: 0x650A, //CJK UNIFIED IDEOGRAPH
+ 0x946A: 0x650B, //CJK UNIFIED IDEOGRAPH
+ 0x946B: 0x650C, //CJK UNIFIED IDEOGRAPH
+ 0x946C: 0x650D, //CJK UNIFIED IDEOGRAPH
+ 0x946D: 0x650E, //CJK UNIFIED IDEOGRAPH
+ 0x946E: 0x650F, //CJK UNIFIED IDEOGRAPH
+ 0x946F: 0x6510, //CJK UNIFIED IDEOGRAPH
+ 0x9470: 0x6511, //CJK UNIFIED IDEOGRAPH
+ 0x9471: 0x6513, //CJK UNIFIED IDEOGRAPH
+ 0x9472: 0x6514, //CJK UNIFIED IDEOGRAPH
+ 0x9473: 0x6515, //CJK UNIFIED IDEOGRAPH
+ 0x9474: 0x6516, //CJK UNIFIED IDEOGRAPH
+ 0x9475: 0x6517, //CJK UNIFIED IDEOGRAPH
+ 0x9476: 0x6519, //CJK UNIFIED IDEOGRAPH
+ 0x9477: 0x651A, //CJK UNIFIED IDEOGRAPH
+ 0x9478: 0x651B, //CJK UNIFIED IDEOGRAPH
+ 0x9479: 0x651C, //CJK UNIFIED IDEOGRAPH
+ 0x947A: 0x651D, //CJK UNIFIED IDEOGRAPH
+ 0x947B: 0x651E, //CJK UNIFIED IDEOGRAPH
+ 0x947C: 0x651F, //CJK UNIFIED IDEOGRAPH
+ 0x947D: 0x6520, //CJK UNIFIED IDEOGRAPH
+ 0x947E: 0x6521, //CJK UNIFIED IDEOGRAPH
+ 0x9480: 0x6522, //CJK UNIFIED IDEOGRAPH
+ 0x9481: 0x6523, //CJK UNIFIED IDEOGRAPH
+ 0x9482: 0x6524, //CJK UNIFIED IDEOGRAPH
+ 0x9483: 0x6526, //CJK UNIFIED IDEOGRAPH
+ 0x9484: 0x6527, //CJK UNIFIED IDEOGRAPH
+ 0x9485: 0x6528, //CJK UNIFIED IDEOGRAPH
+ 0x9486: 0x6529, //CJK UNIFIED IDEOGRAPH
+ 0x9487: 0x652A, //CJK UNIFIED IDEOGRAPH
+ 0x9488: 0x652C, //CJK UNIFIED IDEOGRAPH
+ 0x9489: 0x652D, //CJK UNIFIED IDEOGRAPH
+ 0x948A: 0x6530, //CJK UNIFIED IDEOGRAPH
+ 0x948B: 0x6531, //CJK UNIFIED IDEOGRAPH
+ 0x948C: 0x6532, //CJK UNIFIED IDEOGRAPH
+ 0x948D: 0x6533, //CJK UNIFIED IDEOGRAPH
+ 0x948E: 0x6537, //CJK UNIFIED IDEOGRAPH
+ 0x948F: 0x653A, //CJK UNIFIED IDEOGRAPH
+ 0x9490: 0x653C, //CJK UNIFIED IDEOGRAPH
+ 0x9491: 0x653D, //CJK UNIFIED IDEOGRAPH
+ 0x9492: 0x6540, //CJK UNIFIED IDEOGRAPH
+ 0x9493: 0x6541, //CJK UNIFIED IDEOGRAPH
+ 0x9494: 0x6542, //CJK UNIFIED IDEOGRAPH
+ 0x9495: 0x6543, //CJK UNIFIED IDEOGRAPH
+ 0x9496: 0x6544, //CJK UNIFIED IDEOGRAPH
+ 0x9497: 0x6546, //CJK UNIFIED IDEOGRAPH
+ 0x9498: 0x6547, //CJK UNIFIED IDEOGRAPH
+ 0x9499: 0x654A, //CJK UNIFIED IDEOGRAPH
+ 0x949A: 0x654B, //CJK UNIFIED IDEOGRAPH
+ 0x949B: 0x654D, //CJK UNIFIED IDEOGRAPH
+ 0x949C: 0x654E, //CJK UNIFIED IDEOGRAPH
+ 0x949D: 0x6550, //CJK UNIFIED IDEOGRAPH
+ 0x949E: 0x6552, //CJK UNIFIED IDEOGRAPH
+ 0x949F: 0x6553, //CJK UNIFIED IDEOGRAPH
+ 0x94A0: 0x6554, //CJK UNIFIED IDEOGRAPH
+ 0x94A1: 0x6557, //CJK UNIFIED IDEOGRAPH
+ 0x94A2: 0x6558, //CJK UNIFIED IDEOGRAPH
+ 0x94A3: 0x655A, //CJK UNIFIED IDEOGRAPH
+ 0x94A4: 0x655C, //CJK UNIFIED IDEOGRAPH
+ 0x94A5: 0x655F, //CJK UNIFIED IDEOGRAPH
+ 0x94A6: 0x6560, //CJK UNIFIED IDEOGRAPH
+ 0x94A7: 0x6561, //CJK UNIFIED IDEOGRAPH
+ 0x94A8: 0x6564, //CJK UNIFIED IDEOGRAPH
+ 0x94A9: 0x6565, //CJK UNIFIED IDEOGRAPH
+ 0x94AA: 0x6567, //CJK UNIFIED IDEOGRAPH
+ 0x94AB: 0x6568, //CJK UNIFIED IDEOGRAPH
+ 0x94AC: 0x6569, //CJK UNIFIED IDEOGRAPH
+ 0x94AD: 0x656A, //CJK UNIFIED IDEOGRAPH
+ 0x94AE: 0x656D, //CJK UNIFIED IDEOGRAPH
+ 0x94AF: 0x656E, //CJK UNIFIED IDEOGRAPH
+ 0x94B0: 0x656F, //CJK UNIFIED IDEOGRAPH
+ 0x94B1: 0x6571, //CJK UNIFIED IDEOGRAPH
+ 0x94B2: 0x6573, //CJK UNIFIED IDEOGRAPH
+ 0x94B3: 0x6575, //CJK UNIFIED IDEOGRAPH
+ 0x94B4: 0x6576, //CJK UNIFIED IDEOGRAPH
+ 0x94B5: 0x6578, //CJK UNIFIED IDEOGRAPH
+ 0x94B6: 0x6579, //CJK UNIFIED IDEOGRAPH
+ 0x94B7: 0x657A, //CJK UNIFIED IDEOGRAPH
+ 0x94B8: 0x657B, //CJK UNIFIED IDEOGRAPH
+ 0x94B9: 0x657C, //CJK UNIFIED IDEOGRAPH
+ 0x94BA: 0x657D, //CJK UNIFIED IDEOGRAPH
+ 0x94BB: 0x657E, //CJK UNIFIED IDEOGRAPH
+ 0x94BC: 0x657F, //CJK UNIFIED IDEOGRAPH
+ 0x94BD: 0x6580, //CJK UNIFIED IDEOGRAPH
+ 0x94BE: 0x6581, //CJK UNIFIED IDEOGRAPH
+ 0x94BF: 0x6582, //CJK UNIFIED IDEOGRAPH
+ 0x94C0: 0x6583, //CJK UNIFIED IDEOGRAPH
+ 0x94C1: 0x6584, //CJK UNIFIED IDEOGRAPH
+ 0x94C2: 0x6585, //CJK UNIFIED IDEOGRAPH
+ 0x94C3: 0x6586, //CJK UNIFIED IDEOGRAPH
+ 0x94C4: 0x6588, //CJK UNIFIED IDEOGRAPH
+ 0x94C5: 0x6589, //CJK UNIFIED IDEOGRAPH
+ 0x94C6: 0x658A, //CJK UNIFIED IDEOGRAPH
+ 0x94C7: 0x658D, //CJK UNIFIED IDEOGRAPH
+ 0x94C8: 0x658E, //CJK UNIFIED IDEOGRAPH
+ 0x94C9: 0x658F, //CJK UNIFIED IDEOGRAPH
+ 0x94CA: 0x6592, //CJK UNIFIED IDEOGRAPH
+ 0x94CB: 0x6594, //CJK UNIFIED IDEOGRAPH
+ 0x94CC: 0x6595, //CJK UNIFIED IDEOGRAPH
+ 0x94CD: 0x6596, //CJK UNIFIED IDEOGRAPH
+ 0x94CE: 0x6598, //CJK UNIFIED IDEOGRAPH
+ 0x94CF: 0x659A, //CJK UNIFIED IDEOGRAPH
+ 0x94D0: 0x659D, //CJK UNIFIED IDEOGRAPH
+ 0x94D1: 0x659E, //CJK UNIFIED IDEOGRAPH
+ 0x94D2: 0x65A0, //CJK UNIFIED IDEOGRAPH
+ 0x94D3: 0x65A2, //CJK UNIFIED IDEOGRAPH
+ 0x94D4: 0x65A3, //CJK UNIFIED IDEOGRAPH
+ 0x94D5: 0x65A6, //CJK UNIFIED IDEOGRAPH
+ 0x94D6: 0x65A8, //CJK UNIFIED IDEOGRAPH
+ 0x94D7: 0x65AA, //CJK UNIFIED IDEOGRAPH
+ 0x94D8: 0x65AC, //CJK UNIFIED IDEOGRAPH
+ 0x94D9: 0x65AE, //CJK UNIFIED IDEOGRAPH
+ 0x94DA: 0x65B1, //CJK UNIFIED IDEOGRAPH
+ 0x94DB: 0x65B2, //CJK UNIFIED IDEOGRAPH
+ 0x94DC: 0x65B3, //CJK UNIFIED IDEOGRAPH
+ 0x94DD: 0x65B4, //CJK UNIFIED IDEOGRAPH
+ 0x94DE: 0x65B5, //CJK UNIFIED IDEOGRAPH
+ 0x94DF: 0x65B6, //CJK UNIFIED IDEOGRAPH
+ 0x94E0: 0x65B7, //CJK UNIFIED IDEOGRAPH
+ 0x94E1: 0x65B8, //CJK UNIFIED IDEOGRAPH
+ 0x94E2: 0x65BA, //CJK UNIFIED IDEOGRAPH
+ 0x94E3: 0x65BB, //CJK UNIFIED IDEOGRAPH
+ 0x94E4: 0x65BE, //CJK UNIFIED IDEOGRAPH
+ 0x94E5: 0x65BF, //CJK UNIFIED IDEOGRAPH
+ 0x94E6: 0x65C0, //CJK UNIFIED IDEOGRAPH
+ 0x94E7: 0x65C2, //CJK UNIFIED IDEOGRAPH
+ 0x94E8: 0x65C7, //CJK UNIFIED IDEOGRAPH
+ 0x94E9: 0x65C8, //CJK UNIFIED IDEOGRAPH
+ 0x94EA: 0x65C9, //CJK UNIFIED IDEOGRAPH
+ 0x94EB: 0x65CA, //CJK UNIFIED IDEOGRAPH
+ 0x94EC: 0x65CD, //CJK UNIFIED IDEOGRAPH
+ 0x94ED: 0x65D0, //CJK UNIFIED IDEOGRAPH
+ 0x94EE: 0x65D1, //CJK UNIFIED IDEOGRAPH
+ 0x94EF: 0x65D3, //CJK UNIFIED IDEOGRAPH
+ 0x94F0: 0x65D4, //CJK UNIFIED IDEOGRAPH
+ 0x94F1: 0x65D5, //CJK UNIFIED IDEOGRAPH
+ 0x94F2: 0x65D8, //CJK UNIFIED IDEOGRAPH
+ 0x94F3: 0x65D9, //CJK UNIFIED IDEOGRAPH
+ 0x94F4: 0x65DA, //CJK UNIFIED IDEOGRAPH
+ 0x94F5: 0x65DB, //CJK UNIFIED IDEOGRAPH
+ 0x94F6: 0x65DC, //CJK UNIFIED IDEOGRAPH
+ 0x94F7: 0x65DD, //CJK UNIFIED IDEOGRAPH
+ 0x94F8: 0x65DE, //CJK UNIFIED IDEOGRAPH
+ 0x94F9: 0x65DF, //CJK UNIFIED IDEOGRAPH
+ 0x94FA: 0x65E1, //CJK UNIFIED IDEOGRAPH
+ 0x94FB: 0x65E3, //CJK UNIFIED IDEOGRAPH
+ 0x94FC: 0x65E4, //CJK UNIFIED IDEOGRAPH
+ 0x94FD: 0x65EA, //CJK UNIFIED IDEOGRAPH
+ 0x94FE: 0x65EB, //CJK UNIFIED IDEOGRAPH
+ 0x9540: 0x65F2, //CJK UNIFIED IDEOGRAPH
+ 0x9541: 0x65F3, //CJK UNIFIED IDEOGRAPH
+ 0x9542: 0x65F4, //CJK UNIFIED IDEOGRAPH
+ 0x9543: 0x65F5, //CJK UNIFIED IDEOGRAPH
+ 0x9544: 0x65F8, //CJK UNIFIED IDEOGRAPH
+ 0x9545: 0x65F9, //CJK UNIFIED IDEOGRAPH
+ 0x9546: 0x65FB, //CJK UNIFIED IDEOGRAPH
+ 0x9547: 0x65FC, //CJK UNIFIED IDEOGRAPH
+ 0x9548: 0x65FD, //CJK UNIFIED IDEOGRAPH
+ 0x9549: 0x65FE, //CJK UNIFIED IDEOGRAPH
+ 0x954A: 0x65FF, //CJK UNIFIED IDEOGRAPH
+ 0x954B: 0x6601, //CJK UNIFIED IDEOGRAPH
+ 0x954C: 0x6604, //CJK UNIFIED IDEOGRAPH
+ 0x954D: 0x6605, //CJK UNIFIED IDEOGRAPH
+ 0x954E: 0x6607, //CJK UNIFIED IDEOGRAPH
+ 0x954F: 0x6608, //CJK UNIFIED IDEOGRAPH
+ 0x9550: 0x6609, //CJK UNIFIED IDEOGRAPH
+ 0x9551: 0x660B, //CJK UNIFIED IDEOGRAPH
+ 0x9552: 0x660D, //CJK UNIFIED IDEOGRAPH
+ 0x9553: 0x6610, //CJK UNIFIED IDEOGRAPH
+ 0x9554: 0x6611, //CJK UNIFIED IDEOGRAPH
+ 0x9555: 0x6612, //CJK UNIFIED IDEOGRAPH
+ 0x9556: 0x6616, //CJK UNIFIED IDEOGRAPH
+ 0x9557: 0x6617, //CJK UNIFIED IDEOGRAPH
+ 0x9558: 0x6618, //CJK UNIFIED IDEOGRAPH
+ 0x9559: 0x661A, //CJK UNIFIED IDEOGRAPH
+ 0x955A: 0x661B, //CJK UNIFIED IDEOGRAPH
+ 0x955B: 0x661C, //CJK UNIFIED IDEOGRAPH
+ 0x955C: 0x661E, //CJK UNIFIED IDEOGRAPH
+ 0x955D: 0x6621, //CJK UNIFIED IDEOGRAPH
+ 0x955E: 0x6622, //CJK UNIFIED IDEOGRAPH
+ 0x955F: 0x6623, //CJK UNIFIED IDEOGRAPH
+ 0x9560: 0x6624, //CJK UNIFIED IDEOGRAPH
+ 0x9561: 0x6626, //CJK UNIFIED IDEOGRAPH
+ 0x9562: 0x6629, //CJK UNIFIED IDEOGRAPH
+ 0x9563: 0x662A, //CJK UNIFIED IDEOGRAPH
+ 0x9564: 0x662B, //CJK UNIFIED IDEOGRAPH
+ 0x9565: 0x662C, //CJK UNIFIED IDEOGRAPH
+ 0x9566: 0x662E, //CJK UNIFIED IDEOGRAPH
+ 0x9567: 0x6630, //CJK UNIFIED IDEOGRAPH
+ 0x9568: 0x6632, //CJK UNIFIED IDEOGRAPH
+ 0x9569: 0x6633, //CJK UNIFIED IDEOGRAPH
+ 0x956A: 0x6637, //CJK UNIFIED IDEOGRAPH
+ 0x956B: 0x6638, //CJK UNIFIED IDEOGRAPH
+ 0x956C: 0x6639, //CJK UNIFIED IDEOGRAPH
+ 0x956D: 0x663A, //CJK UNIFIED IDEOGRAPH
+ 0x956E: 0x663B, //CJK UNIFIED IDEOGRAPH
+ 0x956F: 0x663D, //CJK UNIFIED IDEOGRAPH
+ 0x9570: 0x663F, //CJK UNIFIED IDEOGRAPH
+ 0x9571: 0x6640, //CJK UNIFIED IDEOGRAPH
+ 0x9572: 0x6642, //CJK UNIFIED IDEOGRAPH
+ 0x9573: 0x6644, //CJK UNIFIED IDEOGRAPH
+ 0x9574: 0x6645, //CJK UNIFIED IDEOGRAPH
+ 0x9575: 0x6646, //CJK UNIFIED IDEOGRAPH
+ 0x9576: 0x6647, //CJK UNIFIED IDEOGRAPH
+ 0x9577: 0x6648, //CJK UNIFIED IDEOGRAPH
+ 0x9578: 0x6649, //CJK UNIFIED IDEOGRAPH
+ 0x9579: 0x664A, //CJK UNIFIED IDEOGRAPH
+ 0x957A: 0x664D, //CJK UNIFIED IDEOGRAPH
+ 0x957B: 0x664E, //CJK UNIFIED IDEOGRAPH
+ 0x957C: 0x6650, //CJK UNIFIED IDEOGRAPH
+ 0x957D: 0x6651, //CJK UNIFIED IDEOGRAPH
+ 0x957E: 0x6658, //CJK UNIFIED IDEOGRAPH
+ 0x9580: 0x6659, //CJK UNIFIED IDEOGRAPH
+ 0x9581: 0x665B, //CJK UNIFIED IDEOGRAPH
+ 0x9582: 0x665C, //CJK UNIFIED IDEOGRAPH
+ 0x9583: 0x665D, //CJK UNIFIED IDEOGRAPH
+ 0x9584: 0x665E, //CJK UNIFIED IDEOGRAPH
+ 0x9585: 0x6660, //CJK UNIFIED IDEOGRAPH
+ 0x9586: 0x6662, //CJK UNIFIED IDEOGRAPH
+ 0x9587: 0x6663, //CJK UNIFIED IDEOGRAPH
+ 0x9588: 0x6665, //CJK UNIFIED IDEOGRAPH
+ 0x9589: 0x6667, //CJK UNIFIED IDEOGRAPH
+ 0x958A: 0x6669, //CJK UNIFIED IDEOGRAPH
+ 0x958B: 0x666A, //CJK UNIFIED IDEOGRAPH
+ 0x958C: 0x666B, //CJK UNIFIED IDEOGRAPH
+ 0x958D: 0x666C, //CJK UNIFIED IDEOGRAPH
+ 0x958E: 0x666D, //CJK UNIFIED IDEOGRAPH
+ 0x958F: 0x6671, //CJK UNIFIED IDEOGRAPH
+ 0x9590: 0x6672, //CJK UNIFIED IDEOGRAPH
+ 0x9591: 0x6673, //CJK UNIFIED IDEOGRAPH
+ 0x9592: 0x6675, //CJK UNIFIED IDEOGRAPH
+ 0x9593: 0x6678, //CJK UNIFIED IDEOGRAPH
+ 0x9594: 0x6679, //CJK UNIFIED IDEOGRAPH
+ 0x9595: 0x667B, //CJK UNIFIED IDEOGRAPH
+ 0x9596: 0x667C, //CJK UNIFIED IDEOGRAPH
+ 0x9597: 0x667D, //CJK UNIFIED IDEOGRAPH
+ 0x9598: 0x667F, //CJK UNIFIED IDEOGRAPH
+ 0x9599: 0x6680, //CJK UNIFIED IDEOGRAPH
+ 0x959A: 0x6681, //CJK UNIFIED IDEOGRAPH
+ 0x959B: 0x6683, //CJK UNIFIED IDEOGRAPH
+ 0x959C: 0x6685, //CJK UNIFIED IDEOGRAPH
+ 0x959D: 0x6686, //CJK UNIFIED IDEOGRAPH
+ 0x959E: 0x6688, //CJK UNIFIED IDEOGRAPH
+ 0x959F: 0x6689, //CJK UNIFIED IDEOGRAPH
+ 0x95A0: 0x668A, //CJK UNIFIED IDEOGRAPH
+ 0x95A1: 0x668B, //CJK UNIFIED IDEOGRAPH
+ 0x95A2: 0x668D, //CJK UNIFIED IDEOGRAPH
+ 0x95A3: 0x668E, //CJK UNIFIED IDEOGRAPH
+ 0x95A4: 0x668F, //CJK UNIFIED IDEOGRAPH
+ 0x95A5: 0x6690, //CJK UNIFIED IDEOGRAPH
+ 0x95A6: 0x6692, //CJK UNIFIED IDEOGRAPH
+ 0x95A7: 0x6693, //CJK UNIFIED IDEOGRAPH
+ 0x95A8: 0x6694, //CJK UNIFIED IDEOGRAPH
+ 0x95A9: 0x6695, //CJK UNIFIED IDEOGRAPH
+ 0x95AA: 0x6698, //CJK UNIFIED IDEOGRAPH
+ 0x95AB: 0x6699, //CJK UNIFIED IDEOGRAPH
+ 0x95AC: 0x669A, //CJK UNIFIED IDEOGRAPH
+ 0x95AD: 0x669B, //CJK UNIFIED IDEOGRAPH
+ 0x95AE: 0x669C, //CJK UNIFIED IDEOGRAPH
+ 0x95AF: 0x669E, //CJK UNIFIED IDEOGRAPH
+ 0x95B0: 0x669F, //CJK UNIFIED IDEOGRAPH
+ 0x95B1: 0x66A0, //CJK UNIFIED IDEOGRAPH
+ 0x95B2: 0x66A1, //CJK UNIFIED IDEOGRAPH
+ 0x95B3: 0x66A2, //CJK UNIFIED IDEOGRAPH
+ 0x95B4: 0x66A3, //CJK UNIFIED IDEOGRAPH
+ 0x95B5: 0x66A4, //CJK UNIFIED IDEOGRAPH
+ 0x95B6: 0x66A5, //CJK UNIFIED IDEOGRAPH
+ 0x95B7: 0x66A6, //CJK UNIFIED IDEOGRAPH
+ 0x95B8: 0x66A9, //CJK UNIFIED IDEOGRAPH
+ 0x95B9: 0x66AA, //CJK UNIFIED IDEOGRAPH
+ 0x95BA: 0x66AB, //CJK UNIFIED IDEOGRAPH
+ 0x95BB: 0x66AC, //CJK UNIFIED IDEOGRAPH
+ 0x95BC: 0x66AD, //CJK UNIFIED IDEOGRAPH
+ 0x95BD: 0x66AF, //CJK UNIFIED IDEOGRAPH
+ 0x95BE: 0x66B0, //CJK UNIFIED IDEOGRAPH
+ 0x95BF: 0x66B1, //CJK UNIFIED IDEOGRAPH
+ 0x95C0: 0x66B2, //CJK UNIFIED IDEOGRAPH
+ 0x95C1: 0x66B3, //CJK UNIFIED IDEOGRAPH
+ 0x95C2: 0x66B5, //CJK UNIFIED IDEOGRAPH
+ 0x95C3: 0x66B6, //CJK UNIFIED IDEOGRAPH
+ 0x95C4: 0x66B7, //CJK UNIFIED IDEOGRAPH
+ 0x95C5: 0x66B8, //CJK UNIFIED IDEOGRAPH
+ 0x95C6: 0x66BA, //CJK UNIFIED IDEOGRAPH
+ 0x95C7: 0x66BB, //CJK UNIFIED IDEOGRAPH
+ 0x95C8: 0x66BC, //CJK UNIFIED IDEOGRAPH
+ 0x95C9: 0x66BD, //CJK UNIFIED IDEOGRAPH
+ 0x95CA: 0x66BF, //CJK UNIFIED IDEOGRAPH
+ 0x95CB: 0x66C0, //CJK UNIFIED IDEOGRAPH
+ 0x95CC: 0x66C1, //CJK UNIFIED IDEOGRAPH
+ 0x95CD: 0x66C2, //CJK UNIFIED IDEOGRAPH
+ 0x95CE: 0x66C3, //CJK UNIFIED IDEOGRAPH
+ 0x95CF: 0x66C4, //CJK UNIFIED IDEOGRAPH
+ 0x95D0: 0x66C5, //CJK UNIFIED IDEOGRAPH
+ 0x95D1: 0x66C6, //CJK UNIFIED IDEOGRAPH
+ 0x95D2: 0x66C7, //CJK UNIFIED IDEOGRAPH
+ 0x95D3: 0x66C8, //CJK UNIFIED IDEOGRAPH
+ 0x95D4: 0x66C9, //CJK UNIFIED IDEOGRAPH
+ 0x95D5: 0x66CA, //CJK UNIFIED IDEOGRAPH
+ 0x95D6: 0x66CB, //CJK UNIFIED IDEOGRAPH
+ 0x95D7: 0x66CC, //CJK UNIFIED IDEOGRAPH
+ 0x95D8: 0x66CD, //CJK UNIFIED IDEOGRAPH
+ 0x95D9: 0x66CE, //CJK UNIFIED IDEOGRAPH
+ 0x95DA: 0x66CF, //CJK UNIFIED IDEOGRAPH
+ 0x95DB: 0x66D0, //CJK UNIFIED IDEOGRAPH
+ 0x95DC: 0x66D1, //CJK UNIFIED IDEOGRAPH
+ 0x95DD: 0x66D2, //CJK UNIFIED IDEOGRAPH
+ 0x95DE: 0x66D3, //CJK UNIFIED IDEOGRAPH
+ 0x95DF: 0x66D4, //CJK UNIFIED IDEOGRAPH
+ 0x95E0: 0x66D5, //CJK UNIFIED IDEOGRAPH
+ 0x95E1: 0x66D6, //CJK UNIFIED IDEOGRAPH
+ 0x95E2: 0x66D7, //CJK UNIFIED IDEOGRAPH
+ 0x95E3: 0x66D8, //CJK UNIFIED IDEOGRAPH
+ 0x95E4: 0x66DA, //CJK UNIFIED IDEOGRAPH
+ 0x95E5: 0x66DE, //CJK UNIFIED IDEOGRAPH
+ 0x95E6: 0x66DF, //CJK UNIFIED IDEOGRAPH
+ 0x95E7: 0x66E0, //CJK UNIFIED IDEOGRAPH
+ 0x95E8: 0x66E1, //CJK UNIFIED IDEOGRAPH
+ 0x95E9: 0x66E2, //CJK UNIFIED IDEOGRAPH
+ 0x95EA: 0x66E3, //CJK UNIFIED IDEOGRAPH
+ 0x95EB: 0x66E4, //CJK UNIFIED IDEOGRAPH
+ 0x95EC: 0x66E5, //CJK UNIFIED IDEOGRAPH
+ 0x95ED: 0x66E7, //CJK UNIFIED IDEOGRAPH
+ 0x95EE: 0x66E8, //CJK UNIFIED IDEOGRAPH
+ 0x95EF: 0x66EA, //CJK UNIFIED IDEOGRAPH
+ 0x95F0: 0x66EB, //CJK UNIFIED IDEOGRAPH
+ 0x95F1: 0x66EC, //CJK UNIFIED IDEOGRAPH
+ 0x95F2: 0x66ED, //CJK UNIFIED IDEOGRAPH
+ 0x95F3: 0x66EE, //CJK UNIFIED IDEOGRAPH
+ 0x95F4: 0x66EF, //CJK UNIFIED IDEOGRAPH
+ 0x95F5: 0x66F1, //CJK UNIFIED IDEOGRAPH
+ 0x95F6: 0x66F5, //CJK UNIFIED IDEOGRAPH
+ 0x95F7: 0x66F6, //CJK UNIFIED IDEOGRAPH
+ 0x95F8: 0x66F8, //CJK UNIFIED IDEOGRAPH
+ 0x95F9: 0x66FA, //CJK UNIFIED IDEOGRAPH
+ 0x95FA: 0x66FB, //CJK UNIFIED IDEOGRAPH
+ 0x95FB: 0x66FD, //CJK UNIFIED IDEOGRAPH
+ 0x95FC: 0x6701, //CJK UNIFIED IDEOGRAPH
+ 0x95FD: 0x6702, //CJK UNIFIED IDEOGRAPH
+ 0x95FE: 0x6703, //CJK UNIFIED IDEOGRAPH
+ 0x9640: 0x6704, //CJK UNIFIED IDEOGRAPH
+ 0x9641: 0x6705, //CJK UNIFIED IDEOGRAPH
+ 0x9642: 0x6706, //CJK UNIFIED IDEOGRAPH
+ 0x9643: 0x6707, //CJK UNIFIED IDEOGRAPH
+ 0x9644: 0x670C, //CJK UNIFIED IDEOGRAPH
+ 0x9645: 0x670E, //CJK UNIFIED IDEOGRAPH
+ 0x9646: 0x670F, //CJK UNIFIED IDEOGRAPH
+ 0x9647: 0x6711, //CJK UNIFIED IDEOGRAPH
+ 0x9648: 0x6712, //CJK UNIFIED IDEOGRAPH
+ 0x9649: 0x6713, //CJK UNIFIED IDEOGRAPH
+ 0x964A: 0x6716, //CJK UNIFIED IDEOGRAPH
+ 0x964B: 0x6718, //CJK UNIFIED IDEOGRAPH
+ 0x964C: 0x6719, //CJK UNIFIED IDEOGRAPH
+ 0x964D: 0x671A, //CJK UNIFIED IDEOGRAPH
+ 0x964E: 0x671C, //CJK UNIFIED IDEOGRAPH
+ 0x964F: 0x671E, //CJK UNIFIED IDEOGRAPH
+ 0x9650: 0x6720, //CJK UNIFIED IDEOGRAPH
+ 0x9651: 0x6721, //CJK UNIFIED IDEOGRAPH
+ 0x9652: 0x6722, //CJK UNIFIED IDEOGRAPH
+ 0x9653: 0x6723, //CJK UNIFIED IDEOGRAPH
+ 0x9654: 0x6724, //CJK UNIFIED IDEOGRAPH
+ 0x9655: 0x6725, //CJK UNIFIED IDEOGRAPH
+ 0x9656: 0x6727, //CJK UNIFIED IDEOGRAPH
+ 0x9657: 0x6729, //CJK UNIFIED IDEOGRAPH
+ 0x9658: 0x672E, //CJK UNIFIED IDEOGRAPH
+ 0x9659: 0x6730, //CJK UNIFIED IDEOGRAPH
+ 0x965A: 0x6732, //CJK UNIFIED IDEOGRAPH
+ 0x965B: 0x6733, //CJK UNIFIED IDEOGRAPH
+ 0x965C: 0x6736, //CJK UNIFIED IDEOGRAPH
+ 0x965D: 0x6737, //CJK UNIFIED IDEOGRAPH
+ 0x965E: 0x6738, //CJK UNIFIED IDEOGRAPH
+ 0x965F: 0x6739, //CJK UNIFIED IDEOGRAPH
+ 0x9660: 0x673B, //CJK UNIFIED IDEOGRAPH
+ 0x9661: 0x673C, //CJK UNIFIED IDEOGRAPH
+ 0x9662: 0x673E, //CJK UNIFIED IDEOGRAPH
+ 0x9663: 0x673F, //CJK UNIFIED IDEOGRAPH
+ 0x9664: 0x6741, //CJK UNIFIED IDEOGRAPH
+ 0x9665: 0x6744, //CJK UNIFIED IDEOGRAPH
+ 0x9666: 0x6745, //CJK UNIFIED IDEOGRAPH
+ 0x9667: 0x6747, //CJK UNIFIED IDEOGRAPH
+ 0x9668: 0x674A, //CJK UNIFIED IDEOGRAPH
+ 0x9669: 0x674B, //CJK UNIFIED IDEOGRAPH
+ 0x966A: 0x674D, //CJK UNIFIED IDEOGRAPH
+ 0x966B: 0x6752, //CJK UNIFIED IDEOGRAPH
+ 0x966C: 0x6754, //CJK UNIFIED IDEOGRAPH
+ 0x966D: 0x6755, //CJK UNIFIED IDEOGRAPH
+ 0x966E: 0x6757, //CJK UNIFIED IDEOGRAPH
+ 0x966F: 0x6758, //CJK UNIFIED IDEOGRAPH
+ 0x9670: 0x6759, //CJK UNIFIED IDEOGRAPH
+ 0x9671: 0x675A, //CJK UNIFIED IDEOGRAPH
+ 0x9672: 0x675B, //CJK UNIFIED IDEOGRAPH
+ 0x9673: 0x675D, //CJK UNIFIED IDEOGRAPH
+ 0x9674: 0x6762, //CJK UNIFIED IDEOGRAPH
+ 0x9675: 0x6763, //CJK UNIFIED IDEOGRAPH
+ 0x9676: 0x6764, //CJK UNIFIED IDEOGRAPH
+ 0x9677: 0x6766, //CJK UNIFIED IDEOGRAPH
+ 0x9678: 0x6767, //CJK UNIFIED IDEOGRAPH
+ 0x9679: 0x676B, //CJK UNIFIED IDEOGRAPH
+ 0x967A: 0x676C, //CJK UNIFIED IDEOGRAPH
+ 0x967B: 0x676E, //CJK UNIFIED IDEOGRAPH
+ 0x967C: 0x6771, //CJK UNIFIED IDEOGRAPH
+ 0x967D: 0x6774, //CJK UNIFIED IDEOGRAPH
+ 0x967E: 0x6776, //CJK UNIFIED IDEOGRAPH
+ 0x9680: 0x6778, //CJK UNIFIED IDEOGRAPH
+ 0x9681: 0x6779, //CJK UNIFIED IDEOGRAPH
+ 0x9682: 0x677A, //CJK UNIFIED IDEOGRAPH
+ 0x9683: 0x677B, //CJK UNIFIED IDEOGRAPH
+ 0x9684: 0x677D, //CJK UNIFIED IDEOGRAPH
+ 0x9685: 0x6780, //CJK UNIFIED IDEOGRAPH
+ 0x9686: 0x6782, //CJK UNIFIED IDEOGRAPH
+ 0x9687: 0x6783, //CJK UNIFIED IDEOGRAPH
+ 0x9688: 0x6785, //CJK UNIFIED IDEOGRAPH
+ 0x9689: 0x6786, //CJK UNIFIED IDEOGRAPH
+ 0x968A: 0x6788, //CJK UNIFIED IDEOGRAPH
+ 0x968B: 0x678A, //CJK UNIFIED IDEOGRAPH
+ 0x968C: 0x678C, //CJK UNIFIED IDEOGRAPH
+ 0x968D: 0x678D, //CJK UNIFIED IDEOGRAPH
+ 0x968E: 0x678E, //CJK UNIFIED IDEOGRAPH
+ 0x968F: 0x678F, //CJK UNIFIED IDEOGRAPH
+ 0x9690: 0x6791, //CJK UNIFIED IDEOGRAPH
+ 0x9691: 0x6792, //CJK UNIFIED IDEOGRAPH
+ 0x9692: 0x6793, //CJK UNIFIED IDEOGRAPH
+ 0x9693: 0x6794, //CJK UNIFIED IDEOGRAPH
+ 0x9694: 0x6796, //CJK UNIFIED IDEOGRAPH
+ 0x9695: 0x6799, //CJK UNIFIED IDEOGRAPH
+ 0x9696: 0x679B, //CJK UNIFIED IDEOGRAPH
+ 0x9697: 0x679F, //CJK UNIFIED IDEOGRAPH
+ 0x9698: 0x67A0, //CJK UNIFIED IDEOGRAPH
+ 0x9699: 0x67A1, //CJK UNIFIED IDEOGRAPH
+ 0x969A: 0x67A4, //CJK UNIFIED IDEOGRAPH
+ 0x969B: 0x67A6, //CJK UNIFIED IDEOGRAPH
+ 0x969C: 0x67A9, //CJK UNIFIED IDEOGRAPH
+ 0x969D: 0x67AC, //CJK UNIFIED IDEOGRAPH
+ 0x969E: 0x67AE, //CJK UNIFIED IDEOGRAPH
+ 0x969F: 0x67B1, //CJK UNIFIED IDEOGRAPH
+ 0x96A0: 0x67B2, //CJK UNIFIED IDEOGRAPH
+ 0x96A1: 0x67B4, //CJK UNIFIED IDEOGRAPH
+ 0x96A2: 0x67B9, //CJK UNIFIED IDEOGRAPH
+ 0x96A3: 0x67BA, //CJK UNIFIED IDEOGRAPH
+ 0x96A4: 0x67BB, //CJK UNIFIED IDEOGRAPH
+ 0x96A5: 0x67BC, //CJK UNIFIED IDEOGRAPH
+ 0x96A6: 0x67BD, //CJK UNIFIED IDEOGRAPH
+ 0x96A7: 0x67BE, //CJK UNIFIED IDEOGRAPH
+ 0x96A8: 0x67BF, //CJK UNIFIED IDEOGRAPH
+ 0x96A9: 0x67C0, //CJK UNIFIED IDEOGRAPH
+ 0x96AA: 0x67C2, //CJK UNIFIED IDEOGRAPH
+ 0x96AB: 0x67C5, //CJK UNIFIED IDEOGRAPH
+ 0x96AC: 0x67C6, //CJK UNIFIED IDEOGRAPH
+ 0x96AD: 0x67C7, //CJK UNIFIED IDEOGRAPH
+ 0x96AE: 0x67C8, //CJK UNIFIED IDEOGRAPH
+ 0x96AF: 0x67C9, //CJK UNIFIED IDEOGRAPH
+ 0x96B0: 0x67CA, //CJK UNIFIED IDEOGRAPH
+ 0x96B1: 0x67CB, //CJK UNIFIED IDEOGRAPH
+ 0x96B2: 0x67CC, //CJK UNIFIED IDEOGRAPH
+ 0x96B3: 0x67CD, //CJK UNIFIED IDEOGRAPH
+ 0x96B4: 0x67CE, //CJK UNIFIED IDEOGRAPH
+ 0x96B5: 0x67D5, //CJK UNIFIED IDEOGRAPH
+ 0x96B6: 0x67D6, //CJK UNIFIED IDEOGRAPH
+ 0x96B7: 0x67D7, //CJK UNIFIED IDEOGRAPH
+ 0x96B8: 0x67DB, //CJK UNIFIED IDEOGRAPH
+ 0x96B9: 0x67DF, //CJK UNIFIED IDEOGRAPH
+ 0x96BA: 0x67E1, //CJK UNIFIED IDEOGRAPH
+ 0x96BB: 0x67E3, //CJK UNIFIED IDEOGRAPH
+ 0x96BC: 0x67E4, //CJK UNIFIED IDEOGRAPH
+ 0x96BD: 0x67E6, //CJK UNIFIED IDEOGRAPH
+ 0x96BE: 0x67E7, //CJK UNIFIED IDEOGRAPH
+ 0x96BF: 0x67E8, //CJK UNIFIED IDEOGRAPH
+ 0x96C0: 0x67EA, //CJK UNIFIED IDEOGRAPH
+ 0x96C1: 0x67EB, //CJK UNIFIED IDEOGRAPH
+ 0x96C2: 0x67ED, //CJK UNIFIED IDEOGRAPH
+ 0x96C3: 0x67EE, //CJK UNIFIED IDEOGRAPH
+ 0x96C4: 0x67F2, //CJK UNIFIED IDEOGRAPH
+ 0x96C5: 0x67F5, //CJK UNIFIED IDEOGRAPH
+ 0x96C6: 0x67F6, //CJK UNIFIED IDEOGRAPH
+ 0x96C7: 0x67F7, //CJK UNIFIED IDEOGRAPH
+ 0x96C8: 0x67F8, //CJK UNIFIED IDEOGRAPH
+ 0x96C9: 0x67F9, //CJK UNIFIED IDEOGRAPH
+ 0x96CA: 0x67FA, //CJK UNIFIED IDEOGRAPH
+ 0x96CB: 0x67FB, //CJK UNIFIED IDEOGRAPH
+ 0x96CC: 0x67FC, //CJK UNIFIED IDEOGRAPH
+ 0x96CD: 0x67FE, //CJK UNIFIED IDEOGRAPH
+ 0x96CE: 0x6801, //CJK UNIFIED IDEOGRAPH
+ 0x96CF: 0x6802, //CJK UNIFIED IDEOGRAPH
+ 0x96D0: 0x6803, //CJK UNIFIED IDEOGRAPH
+ 0x96D1: 0x6804, //CJK UNIFIED IDEOGRAPH
+ 0x96D2: 0x6806, //CJK UNIFIED IDEOGRAPH
+ 0x96D3: 0x680D, //CJK UNIFIED IDEOGRAPH
+ 0x96D4: 0x6810, //CJK UNIFIED IDEOGRAPH
+ 0x96D5: 0x6812, //CJK UNIFIED IDEOGRAPH
+ 0x96D6: 0x6814, //CJK UNIFIED IDEOGRAPH
+ 0x96D7: 0x6815, //CJK UNIFIED IDEOGRAPH
+ 0x96D8: 0x6818, //CJK UNIFIED IDEOGRAPH
+ 0x96D9: 0x6819, //CJK UNIFIED IDEOGRAPH
+ 0x96DA: 0x681A, //CJK UNIFIED IDEOGRAPH
+ 0x96DB: 0x681B, //CJK UNIFIED IDEOGRAPH
+ 0x96DC: 0x681C, //CJK UNIFIED IDEOGRAPH
+ 0x96DD: 0x681E, //CJK UNIFIED IDEOGRAPH
+ 0x96DE: 0x681F, //CJK UNIFIED IDEOGRAPH
+ 0x96DF: 0x6820, //CJK UNIFIED IDEOGRAPH
+ 0x96E0: 0x6822, //CJK UNIFIED IDEOGRAPH
+ 0x96E1: 0x6823, //CJK UNIFIED IDEOGRAPH
+ 0x96E2: 0x6824, //CJK UNIFIED IDEOGRAPH
+ 0x96E3: 0x6825, //CJK UNIFIED IDEOGRAPH
+ 0x96E4: 0x6826, //CJK UNIFIED IDEOGRAPH
+ 0x96E5: 0x6827, //CJK UNIFIED IDEOGRAPH
+ 0x96E6: 0x6828, //CJK UNIFIED IDEOGRAPH
+ 0x96E7: 0x682B, //CJK UNIFIED IDEOGRAPH
+ 0x96E8: 0x682C, //CJK UNIFIED IDEOGRAPH
+ 0x96E9: 0x682D, //CJK UNIFIED IDEOGRAPH
+ 0x96EA: 0x682E, //CJK UNIFIED IDEOGRAPH
+ 0x96EB: 0x682F, //CJK UNIFIED IDEOGRAPH
+ 0x96EC: 0x6830, //CJK UNIFIED IDEOGRAPH
+ 0x96ED: 0x6831, //CJK UNIFIED IDEOGRAPH
+ 0x96EE: 0x6834, //CJK UNIFIED IDEOGRAPH
+ 0x96EF: 0x6835, //CJK UNIFIED IDEOGRAPH
+ 0x96F0: 0x6836, //CJK UNIFIED IDEOGRAPH
+ 0x96F1: 0x683A, //CJK UNIFIED IDEOGRAPH
+ 0x96F2: 0x683B, //CJK UNIFIED IDEOGRAPH
+ 0x96F3: 0x683F, //CJK UNIFIED IDEOGRAPH
+ 0x96F4: 0x6847, //CJK UNIFIED IDEOGRAPH
+ 0x96F5: 0x684B, //CJK UNIFIED IDEOGRAPH
+ 0x96F6: 0x684D, //CJK UNIFIED IDEOGRAPH
+ 0x96F7: 0x684F, //CJK UNIFIED IDEOGRAPH
+ 0x96F8: 0x6852, //CJK UNIFIED IDEOGRAPH
+ 0x96F9: 0x6856, //CJK UNIFIED IDEOGRAPH
+ 0x96FA: 0x6857, //CJK UNIFIED IDEOGRAPH
+ 0x96FB: 0x6858, //CJK UNIFIED IDEOGRAPH
+ 0x96FC: 0x6859, //CJK UNIFIED IDEOGRAPH
+ 0x96FD: 0x685A, //CJK UNIFIED IDEOGRAPH
+ 0x96FE: 0x685B, //CJK UNIFIED IDEOGRAPH
+ 0x9740: 0x685C, //CJK UNIFIED IDEOGRAPH
+ 0x9741: 0x685D, //CJK UNIFIED IDEOGRAPH
+ 0x9742: 0x685E, //CJK UNIFIED IDEOGRAPH
+ 0x9743: 0x685F, //CJK UNIFIED IDEOGRAPH
+ 0x9744: 0x686A, //CJK UNIFIED IDEOGRAPH
+ 0x9745: 0x686C, //CJK UNIFIED IDEOGRAPH
+ 0x9746: 0x686D, //CJK UNIFIED IDEOGRAPH
+ 0x9747: 0x686E, //CJK UNIFIED IDEOGRAPH
+ 0x9748: 0x686F, //CJK UNIFIED IDEOGRAPH
+ 0x9749: 0x6870, //CJK UNIFIED IDEOGRAPH
+ 0x974A: 0x6871, //CJK UNIFIED IDEOGRAPH
+ 0x974B: 0x6872, //CJK UNIFIED IDEOGRAPH
+ 0x974C: 0x6873, //CJK UNIFIED IDEOGRAPH
+ 0x974D: 0x6875, //CJK UNIFIED IDEOGRAPH
+ 0x974E: 0x6878, //CJK UNIFIED IDEOGRAPH
+ 0x974F: 0x6879, //CJK UNIFIED IDEOGRAPH
+ 0x9750: 0x687A, //CJK UNIFIED IDEOGRAPH
+ 0x9751: 0x687B, //CJK UNIFIED IDEOGRAPH
+ 0x9752: 0x687C, //CJK UNIFIED IDEOGRAPH
+ 0x9753: 0x687D, //CJK UNIFIED IDEOGRAPH
+ 0x9754: 0x687E, //CJK UNIFIED IDEOGRAPH
+ 0x9755: 0x687F, //CJK UNIFIED IDEOGRAPH
+ 0x9756: 0x6880, //CJK UNIFIED IDEOGRAPH
+ 0x9757: 0x6882, //CJK UNIFIED IDEOGRAPH
+ 0x9758: 0x6884, //CJK UNIFIED IDEOGRAPH
+ 0x9759: 0x6887, //CJK UNIFIED IDEOGRAPH
+ 0x975A: 0x6888, //CJK UNIFIED IDEOGRAPH
+ 0x975B: 0x6889, //CJK UNIFIED IDEOGRAPH
+ 0x975C: 0x688A, //CJK UNIFIED IDEOGRAPH
+ 0x975D: 0x688B, //CJK UNIFIED IDEOGRAPH
+ 0x975E: 0x688C, //CJK UNIFIED IDEOGRAPH
+ 0x975F: 0x688D, //CJK UNIFIED IDEOGRAPH
+ 0x9760: 0x688E, //CJK UNIFIED IDEOGRAPH
+ 0x9761: 0x6890, //CJK UNIFIED IDEOGRAPH
+ 0x9762: 0x6891, //CJK UNIFIED IDEOGRAPH
+ 0x9763: 0x6892, //CJK UNIFIED IDEOGRAPH
+ 0x9764: 0x6894, //CJK UNIFIED IDEOGRAPH
+ 0x9765: 0x6895, //CJK UNIFIED IDEOGRAPH
+ 0x9766: 0x6896, //CJK UNIFIED IDEOGRAPH
+ 0x9767: 0x6898, //CJK UNIFIED IDEOGRAPH
+ 0x9768: 0x6899, //CJK UNIFIED IDEOGRAPH
+ 0x9769: 0x689A, //CJK UNIFIED IDEOGRAPH
+ 0x976A: 0x689B, //CJK UNIFIED IDEOGRAPH
+ 0x976B: 0x689C, //CJK UNIFIED IDEOGRAPH
+ 0x976C: 0x689D, //CJK UNIFIED IDEOGRAPH
+ 0x976D: 0x689E, //CJK UNIFIED IDEOGRAPH
+ 0x976E: 0x689F, //CJK UNIFIED IDEOGRAPH
+ 0x976F: 0x68A0, //CJK UNIFIED IDEOGRAPH
+ 0x9770: 0x68A1, //CJK UNIFIED IDEOGRAPH
+ 0x9771: 0x68A3, //CJK UNIFIED IDEOGRAPH
+ 0x9772: 0x68A4, //CJK UNIFIED IDEOGRAPH
+ 0x9773: 0x68A5, //CJK UNIFIED IDEOGRAPH
+ 0x9774: 0x68A9, //CJK UNIFIED IDEOGRAPH
+ 0x9775: 0x68AA, //CJK UNIFIED IDEOGRAPH
+ 0x9776: 0x68AB, //CJK UNIFIED IDEOGRAPH
+ 0x9777: 0x68AC, //CJK UNIFIED IDEOGRAPH
+ 0x9778: 0x68AE, //CJK UNIFIED IDEOGRAPH
+ 0x9779: 0x68B1, //CJK UNIFIED IDEOGRAPH
+ 0x977A: 0x68B2, //CJK UNIFIED IDEOGRAPH
+ 0x977B: 0x68B4, //CJK UNIFIED IDEOGRAPH
+ 0x977C: 0x68B6, //CJK UNIFIED IDEOGRAPH
+ 0x977D: 0x68B7, //CJK UNIFIED IDEOGRAPH
+ 0x977E: 0x68B8, //CJK UNIFIED IDEOGRAPH
+ 0x9780: 0x68B9, //CJK UNIFIED IDEOGRAPH
+ 0x9781: 0x68BA, //CJK UNIFIED IDEOGRAPH
+ 0x9782: 0x68BB, //CJK UNIFIED IDEOGRAPH
+ 0x9783: 0x68BC, //CJK UNIFIED IDEOGRAPH
+ 0x9784: 0x68BD, //CJK UNIFIED IDEOGRAPH
+ 0x9785: 0x68BE, //CJK UNIFIED IDEOGRAPH
+ 0x9786: 0x68BF, //CJK UNIFIED IDEOGRAPH
+ 0x9787: 0x68C1, //CJK UNIFIED IDEOGRAPH
+ 0x9788: 0x68C3, //CJK UNIFIED IDEOGRAPH
+ 0x9789: 0x68C4, //CJK UNIFIED IDEOGRAPH
+ 0x978A: 0x68C5, //CJK UNIFIED IDEOGRAPH
+ 0x978B: 0x68C6, //CJK UNIFIED IDEOGRAPH
+ 0x978C: 0x68C7, //CJK UNIFIED IDEOGRAPH
+ 0x978D: 0x68C8, //CJK UNIFIED IDEOGRAPH
+ 0x978E: 0x68CA, //CJK UNIFIED IDEOGRAPH
+ 0x978F: 0x68CC, //CJK UNIFIED IDEOGRAPH
+ 0x9790: 0x68CE, //CJK UNIFIED IDEOGRAPH
+ 0x9791: 0x68CF, //CJK UNIFIED IDEOGRAPH
+ 0x9792: 0x68D0, //CJK UNIFIED IDEOGRAPH
+ 0x9793: 0x68D1, //CJK UNIFIED IDEOGRAPH
+ 0x9794: 0x68D3, //CJK UNIFIED IDEOGRAPH
+ 0x9795: 0x68D4, //CJK UNIFIED IDEOGRAPH
+ 0x9796: 0x68D6, //CJK UNIFIED IDEOGRAPH
+ 0x9797: 0x68D7, //CJK UNIFIED IDEOGRAPH
+ 0x9798: 0x68D9, //CJK UNIFIED IDEOGRAPH
+ 0x9799: 0x68DB, //CJK UNIFIED IDEOGRAPH
+ 0x979A: 0x68DC, //CJK UNIFIED IDEOGRAPH
+ 0x979B: 0x68DD, //CJK UNIFIED IDEOGRAPH
+ 0x979C: 0x68DE, //CJK UNIFIED IDEOGRAPH
+ 0x979D: 0x68DF, //CJK UNIFIED IDEOGRAPH
+ 0x979E: 0x68E1, //CJK UNIFIED IDEOGRAPH
+ 0x979F: 0x68E2, //CJK UNIFIED IDEOGRAPH
+ 0x97A0: 0x68E4, //CJK UNIFIED IDEOGRAPH
+ 0x97A1: 0x68E5, //CJK UNIFIED IDEOGRAPH
+ 0x97A2: 0x68E6, //CJK UNIFIED IDEOGRAPH
+ 0x97A3: 0x68E7, //CJK UNIFIED IDEOGRAPH
+ 0x97A4: 0x68E8, //CJK UNIFIED IDEOGRAPH
+ 0x97A5: 0x68E9, //CJK UNIFIED IDEOGRAPH
+ 0x97A6: 0x68EA, //CJK UNIFIED IDEOGRAPH
+ 0x97A7: 0x68EB, //CJK UNIFIED IDEOGRAPH
+ 0x97A8: 0x68EC, //CJK UNIFIED IDEOGRAPH
+ 0x97A9: 0x68ED, //CJK UNIFIED IDEOGRAPH
+ 0x97AA: 0x68EF, //CJK UNIFIED IDEOGRAPH
+ 0x97AB: 0x68F2, //CJK UNIFIED IDEOGRAPH
+ 0x97AC: 0x68F3, //CJK UNIFIED IDEOGRAPH
+ 0x97AD: 0x68F4, //CJK UNIFIED IDEOGRAPH
+ 0x97AE: 0x68F6, //CJK UNIFIED IDEOGRAPH
+ 0x97AF: 0x68F7, //CJK UNIFIED IDEOGRAPH
+ 0x97B0: 0x68F8, //CJK UNIFIED IDEOGRAPH
+ 0x97B1: 0x68FB, //CJK UNIFIED IDEOGRAPH
+ 0x97B2: 0x68FD, //CJK UNIFIED IDEOGRAPH
+ 0x97B3: 0x68FE, //CJK UNIFIED IDEOGRAPH
+ 0x97B4: 0x68FF, //CJK UNIFIED IDEOGRAPH
+ 0x97B5: 0x6900, //CJK UNIFIED IDEOGRAPH
+ 0x97B6: 0x6902, //CJK UNIFIED IDEOGRAPH
+ 0x97B7: 0x6903, //CJK UNIFIED IDEOGRAPH
+ 0x97B8: 0x6904, //CJK UNIFIED IDEOGRAPH
+ 0x97B9: 0x6906, //CJK UNIFIED IDEOGRAPH
+ 0x97BA: 0x6907, //CJK UNIFIED IDEOGRAPH
+ 0x97BB: 0x6908, //CJK UNIFIED IDEOGRAPH
+ 0x97BC: 0x6909, //CJK UNIFIED IDEOGRAPH
+ 0x97BD: 0x690A, //CJK UNIFIED IDEOGRAPH
+ 0x97BE: 0x690C, //CJK UNIFIED IDEOGRAPH
+ 0x97BF: 0x690F, //CJK UNIFIED IDEOGRAPH
+ 0x97C0: 0x6911, //CJK UNIFIED IDEOGRAPH
+ 0x97C1: 0x6913, //CJK UNIFIED IDEOGRAPH
+ 0x97C2: 0x6914, //CJK UNIFIED IDEOGRAPH
+ 0x97C3: 0x6915, //CJK UNIFIED IDEOGRAPH
+ 0x97C4: 0x6916, //CJK UNIFIED IDEOGRAPH
+ 0x97C5: 0x6917, //CJK UNIFIED IDEOGRAPH
+ 0x97C6: 0x6918, //CJK UNIFIED IDEOGRAPH
+ 0x97C7: 0x6919, //CJK UNIFIED IDEOGRAPH
+ 0x97C8: 0x691A, //CJK UNIFIED IDEOGRAPH
+ 0x97C9: 0x691B, //CJK UNIFIED IDEOGRAPH
+ 0x97CA: 0x691C, //CJK UNIFIED IDEOGRAPH
+ 0x97CB: 0x691D, //CJK UNIFIED IDEOGRAPH
+ 0x97CC: 0x691E, //CJK UNIFIED IDEOGRAPH
+ 0x97CD: 0x6921, //CJK UNIFIED IDEOGRAPH
+ 0x97CE: 0x6922, //CJK UNIFIED IDEOGRAPH
+ 0x97CF: 0x6923, //CJK UNIFIED IDEOGRAPH
+ 0x97D0: 0x6925, //CJK UNIFIED IDEOGRAPH
+ 0x97D1: 0x6926, //CJK UNIFIED IDEOGRAPH
+ 0x97D2: 0x6927, //CJK UNIFIED IDEOGRAPH
+ 0x97D3: 0x6928, //CJK UNIFIED IDEOGRAPH
+ 0x97D4: 0x6929, //CJK UNIFIED IDEOGRAPH
+ 0x97D5: 0x692A, //CJK UNIFIED IDEOGRAPH
+ 0x97D6: 0x692B, //CJK UNIFIED IDEOGRAPH
+ 0x97D7: 0x692C, //CJK UNIFIED IDEOGRAPH
+ 0x97D8: 0x692E, //CJK UNIFIED IDEOGRAPH
+ 0x97D9: 0x692F, //CJK UNIFIED IDEOGRAPH
+ 0x97DA: 0x6931, //CJK UNIFIED IDEOGRAPH
+ 0x97DB: 0x6932, //CJK UNIFIED IDEOGRAPH
+ 0x97DC: 0x6933, //CJK UNIFIED IDEOGRAPH
+ 0x97DD: 0x6935, //CJK UNIFIED IDEOGRAPH
+ 0x97DE: 0x6936, //CJK UNIFIED IDEOGRAPH
+ 0x97DF: 0x6937, //CJK UNIFIED IDEOGRAPH
+ 0x97E0: 0x6938, //CJK UNIFIED IDEOGRAPH
+ 0x97E1: 0x693A, //CJK UNIFIED IDEOGRAPH
+ 0x97E2: 0x693B, //CJK UNIFIED IDEOGRAPH
+ 0x97E3: 0x693C, //CJK UNIFIED IDEOGRAPH
+ 0x97E4: 0x693E, //CJK UNIFIED IDEOGRAPH
+ 0x97E5: 0x6940, //CJK UNIFIED IDEOGRAPH
+ 0x97E6: 0x6941, //CJK UNIFIED IDEOGRAPH
+ 0x97E7: 0x6943, //CJK UNIFIED IDEOGRAPH
+ 0x97E8: 0x6944, //CJK UNIFIED IDEOGRAPH
+ 0x97E9: 0x6945, //CJK UNIFIED IDEOGRAPH
+ 0x97EA: 0x6946, //CJK UNIFIED IDEOGRAPH
+ 0x97EB: 0x6947, //CJK UNIFIED IDEOGRAPH
+ 0x97EC: 0x6948, //CJK UNIFIED IDEOGRAPH
+ 0x97ED: 0x6949, //CJK UNIFIED IDEOGRAPH
+ 0x97EE: 0x694A, //CJK UNIFIED IDEOGRAPH
+ 0x97EF: 0x694B, //CJK UNIFIED IDEOGRAPH
+ 0x97F0: 0x694C, //CJK UNIFIED IDEOGRAPH
+ 0x97F1: 0x694D, //CJK UNIFIED IDEOGRAPH
+ 0x97F2: 0x694E, //CJK UNIFIED IDEOGRAPH
+ 0x97F3: 0x694F, //CJK UNIFIED IDEOGRAPH
+ 0x97F4: 0x6950, //CJK UNIFIED IDEOGRAPH
+ 0x97F5: 0x6951, //CJK UNIFIED IDEOGRAPH
+ 0x97F6: 0x6952, //CJK UNIFIED IDEOGRAPH
+ 0x97F7: 0x6953, //CJK UNIFIED IDEOGRAPH
+ 0x97F8: 0x6955, //CJK UNIFIED IDEOGRAPH
+ 0x97F9: 0x6956, //CJK UNIFIED IDEOGRAPH
+ 0x97FA: 0x6958, //CJK UNIFIED IDEOGRAPH
+ 0x97FB: 0x6959, //CJK UNIFIED IDEOGRAPH
+ 0x97FC: 0x695B, //CJK UNIFIED IDEOGRAPH
+ 0x97FD: 0x695C, //CJK UNIFIED IDEOGRAPH
+ 0x97FE: 0x695F, //CJK UNIFIED IDEOGRAPH
+ 0x9840: 0x6961, //CJK UNIFIED IDEOGRAPH
+ 0x9841: 0x6962, //CJK UNIFIED IDEOGRAPH
+ 0x9842: 0x6964, //CJK UNIFIED IDEOGRAPH
+ 0x9843: 0x6965, //CJK UNIFIED IDEOGRAPH
+ 0x9844: 0x6967, //CJK UNIFIED IDEOGRAPH
+ 0x9845: 0x6968, //CJK UNIFIED IDEOGRAPH
+ 0x9846: 0x6969, //CJK UNIFIED IDEOGRAPH
+ 0x9847: 0x696A, //CJK UNIFIED IDEOGRAPH
+ 0x9848: 0x696C, //CJK UNIFIED IDEOGRAPH
+ 0x9849: 0x696D, //CJK UNIFIED IDEOGRAPH
+ 0x984A: 0x696F, //CJK UNIFIED IDEOGRAPH
+ 0x984B: 0x6970, //CJK UNIFIED IDEOGRAPH
+ 0x984C: 0x6972, //CJK UNIFIED IDEOGRAPH
+ 0x984D: 0x6973, //CJK UNIFIED IDEOGRAPH
+ 0x984E: 0x6974, //CJK UNIFIED IDEOGRAPH
+ 0x984F: 0x6975, //CJK UNIFIED IDEOGRAPH
+ 0x9850: 0x6976, //CJK UNIFIED IDEOGRAPH
+ 0x9851: 0x697A, //CJK UNIFIED IDEOGRAPH
+ 0x9852: 0x697B, //CJK UNIFIED IDEOGRAPH
+ 0x9853: 0x697D, //CJK UNIFIED IDEOGRAPH
+ 0x9854: 0x697E, //CJK UNIFIED IDEOGRAPH
+ 0x9855: 0x697F, //CJK UNIFIED IDEOGRAPH
+ 0x9856: 0x6981, //CJK UNIFIED IDEOGRAPH
+ 0x9857: 0x6983, //CJK UNIFIED IDEOGRAPH
+ 0x9858: 0x6985, //CJK UNIFIED IDEOGRAPH
+ 0x9859: 0x698A, //CJK UNIFIED IDEOGRAPH
+ 0x985A: 0x698B, //CJK UNIFIED IDEOGRAPH
+ 0x985B: 0x698C, //CJK UNIFIED IDEOGRAPH
+ 0x985C: 0x698E, //CJK UNIFIED IDEOGRAPH
+ 0x985D: 0x698F, //CJK UNIFIED IDEOGRAPH
+ 0x985E: 0x6990, //CJK UNIFIED IDEOGRAPH
+ 0x985F: 0x6991, //CJK UNIFIED IDEOGRAPH
+ 0x9860: 0x6992, //CJK UNIFIED IDEOGRAPH
+ 0x9861: 0x6993, //CJK UNIFIED IDEOGRAPH
+ 0x9862: 0x6996, //CJK UNIFIED IDEOGRAPH
+ 0x9863: 0x6997, //CJK UNIFIED IDEOGRAPH
+ 0x9864: 0x6999, //CJK UNIFIED IDEOGRAPH
+ 0x9865: 0x699A, //CJK UNIFIED IDEOGRAPH
+ 0x9866: 0x699D, //CJK UNIFIED IDEOGRAPH
+ 0x9867: 0x699E, //CJK UNIFIED IDEOGRAPH
+ 0x9868: 0x699F, //CJK UNIFIED IDEOGRAPH
+ 0x9869: 0x69A0, //CJK UNIFIED IDEOGRAPH
+ 0x986A: 0x69A1, //CJK UNIFIED IDEOGRAPH
+ 0x986B: 0x69A2, //CJK UNIFIED IDEOGRAPH
+ 0x986C: 0x69A3, //CJK UNIFIED IDEOGRAPH
+ 0x986D: 0x69A4, //CJK UNIFIED IDEOGRAPH
+ 0x986E: 0x69A5, //CJK UNIFIED IDEOGRAPH
+ 0x986F: 0x69A6, //CJK UNIFIED IDEOGRAPH
+ 0x9870: 0x69A9, //CJK UNIFIED IDEOGRAPH
+ 0x9871: 0x69AA, //CJK UNIFIED IDEOGRAPH
+ 0x9872: 0x69AC, //CJK UNIFIED IDEOGRAPH
+ 0x9873: 0x69AE, //CJK UNIFIED IDEOGRAPH
+ 0x9874: 0x69AF, //CJK UNIFIED IDEOGRAPH
+ 0x9875: 0x69B0, //CJK UNIFIED IDEOGRAPH
+ 0x9876: 0x69B2, //CJK UNIFIED IDEOGRAPH
+ 0x9877: 0x69B3, //CJK UNIFIED IDEOGRAPH
+ 0x9878: 0x69B5, //CJK UNIFIED IDEOGRAPH
+ 0x9879: 0x69B6, //CJK UNIFIED IDEOGRAPH
+ 0x987A: 0x69B8, //CJK UNIFIED IDEOGRAPH
+ 0x987B: 0x69B9, //CJK UNIFIED IDEOGRAPH
+ 0x987C: 0x69BA, //CJK UNIFIED IDEOGRAPH
+ 0x987D: 0x69BC, //CJK UNIFIED IDEOGRAPH
+ 0x987E: 0x69BD, //CJK UNIFIED IDEOGRAPH
+ 0x9880: 0x69BE, //CJK UNIFIED IDEOGRAPH
+ 0x9881: 0x69BF, //CJK UNIFIED IDEOGRAPH
+ 0x9882: 0x69C0, //CJK UNIFIED IDEOGRAPH
+ 0x9883: 0x69C2, //CJK UNIFIED IDEOGRAPH
+ 0x9884: 0x69C3, //CJK UNIFIED IDEOGRAPH
+ 0x9885: 0x69C4, //CJK UNIFIED IDEOGRAPH
+ 0x9886: 0x69C5, //CJK UNIFIED IDEOGRAPH
+ 0x9887: 0x69C6, //CJK UNIFIED IDEOGRAPH
+ 0x9888: 0x69C7, //CJK UNIFIED IDEOGRAPH
+ 0x9889: 0x69C8, //CJK UNIFIED IDEOGRAPH
+ 0x988A: 0x69C9, //CJK UNIFIED IDEOGRAPH
+ 0x988B: 0x69CB, //CJK UNIFIED IDEOGRAPH
+ 0x988C: 0x69CD, //CJK UNIFIED IDEOGRAPH
+ 0x988D: 0x69CF, //CJK UNIFIED IDEOGRAPH
+ 0x988E: 0x69D1, //CJK UNIFIED IDEOGRAPH
+ 0x988F: 0x69D2, //CJK UNIFIED IDEOGRAPH
+ 0x9890: 0x69D3, //CJK UNIFIED IDEOGRAPH
+ 0x9891: 0x69D5, //CJK UNIFIED IDEOGRAPH
+ 0x9892: 0x69D6, //CJK UNIFIED IDEOGRAPH
+ 0x9893: 0x69D7, //CJK UNIFIED IDEOGRAPH
+ 0x9894: 0x69D8, //CJK UNIFIED IDEOGRAPH
+ 0x9895: 0x69D9, //CJK UNIFIED IDEOGRAPH
+ 0x9896: 0x69DA, //CJK UNIFIED IDEOGRAPH
+ 0x9897: 0x69DC, //CJK UNIFIED IDEOGRAPH
+ 0x9898: 0x69DD, //CJK UNIFIED IDEOGRAPH
+ 0x9899: 0x69DE, //CJK UNIFIED IDEOGRAPH
+ 0x989A: 0x69E1, //CJK UNIFIED IDEOGRAPH
+ 0x989B: 0x69E2, //CJK UNIFIED IDEOGRAPH
+ 0x989C: 0x69E3, //CJK UNIFIED IDEOGRAPH
+ 0x989D: 0x69E4, //CJK UNIFIED IDEOGRAPH
+ 0x989E: 0x69E5, //CJK UNIFIED IDEOGRAPH
+ 0x989F: 0x69E6, //CJK UNIFIED IDEOGRAPH
+ 0x98A0: 0x69E7, //CJK UNIFIED IDEOGRAPH
+ 0x98A1: 0x69E8, //CJK UNIFIED IDEOGRAPH
+ 0x98A2: 0x69E9, //CJK UNIFIED IDEOGRAPH
+ 0x98A3: 0x69EA, //CJK UNIFIED IDEOGRAPH
+ 0x98A4: 0x69EB, //CJK UNIFIED IDEOGRAPH
+ 0x98A5: 0x69EC, //CJK UNIFIED IDEOGRAPH
+ 0x98A6: 0x69EE, //CJK UNIFIED IDEOGRAPH
+ 0x98A7: 0x69EF, //CJK UNIFIED IDEOGRAPH
+ 0x98A8: 0x69F0, //CJK UNIFIED IDEOGRAPH
+ 0x98A9: 0x69F1, //CJK UNIFIED IDEOGRAPH
+ 0x98AA: 0x69F3, //CJK UNIFIED IDEOGRAPH
+ 0x98AB: 0x69F4, //CJK UNIFIED IDEOGRAPH
+ 0x98AC: 0x69F5, //CJK UNIFIED IDEOGRAPH
+ 0x98AD: 0x69F6, //CJK UNIFIED IDEOGRAPH
+ 0x98AE: 0x69F7, //CJK UNIFIED IDEOGRAPH
+ 0x98AF: 0x69F8, //CJK UNIFIED IDEOGRAPH
+ 0x98B0: 0x69F9, //CJK UNIFIED IDEOGRAPH
+ 0x98B1: 0x69FA, //CJK UNIFIED IDEOGRAPH
+ 0x98B2: 0x69FB, //CJK UNIFIED IDEOGRAPH
+ 0x98B3: 0x69FC, //CJK UNIFIED IDEOGRAPH
+ 0x98B4: 0x69FE, //CJK UNIFIED IDEOGRAPH
+ 0x98B5: 0x6A00, //CJK UNIFIED IDEOGRAPH
+ 0x98B6: 0x6A01, //CJK UNIFIED IDEOGRAPH
+ 0x98B7: 0x6A02, //CJK UNIFIED IDEOGRAPH
+ 0x98B8: 0x6A03, //CJK UNIFIED IDEOGRAPH
+ 0x98B9: 0x6A04, //CJK UNIFIED IDEOGRAPH
+ 0x98BA: 0x6A05, //CJK UNIFIED IDEOGRAPH
+ 0x98BB: 0x6A06, //CJK UNIFIED IDEOGRAPH
+ 0x98BC: 0x6A07, //CJK UNIFIED IDEOGRAPH
+ 0x98BD: 0x6A08, //CJK UNIFIED IDEOGRAPH
+ 0x98BE: 0x6A09, //CJK UNIFIED IDEOGRAPH
+ 0x98BF: 0x6A0B, //CJK UNIFIED IDEOGRAPH
+ 0x98C0: 0x6A0C, //CJK UNIFIED IDEOGRAPH
+ 0x98C1: 0x6A0D, //CJK UNIFIED IDEOGRAPH
+ 0x98C2: 0x6A0E, //CJK UNIFIED IDEOGRAPH
+ 0x98C3: 0x6A0F, //CJK UNIFIED IDEOGRAPH
+ 0x98C4: 0x6A10, //CJK UNIFIED IDEOGRAPH
+ 0x98C5: 0x6A11, //CJK UNIFIED IDEOGRAPH
+ 0x98C6: 0x6A12, //CJK UNIFIED IDEOGRAPH
+ 0x98C7: 0x6A13, //CJK UNIFIED IDEOGRAPH
+ 0x98C8: 0x6A14, //CJK UNIFIED IDEOGRAPH
+ 0x98C9: 0x6A15, //CJK UNIFIED IDEOGRAPH
+ 0x98CA: 0x6A16, //CJK UNIFIED IDEOGRAPH
+ 0x98CB: 0x6A19, //CJK UNIFIED IDEOGRAPH
+ 0x98CC: 0x6A1A, //CJK UNIFIED IDEOGRAPH
+ 0x98CD: 0x6A1B, //CJK UNIFIED IDEOGRAPH
+ 0x98CE: 0x6A1C, //CJK UNIFIED IDEOGRAPH
+ 0x98CF: 0x6A1D, //CJK UNIFIED IDEOGRAPH
+ 0x98D0: 0x6A1E, //CJK UNIFIED IDEOGRAPH
+ 0x98D1: 0x6A20, //CJK UNIFIED IDEOGRAPH
+ 0x98D2: 0x6A22, //CJK UNIFIED IDEOGRAPH
+ 0x98D3: 0x6A23, //CJK UNIFIED IDEOGRAPH
+ 0x98D4: 0x6A24, //CJK UNIFIED IDEOGRAPH
+ 0x98D5: 0x6A25, //CJK UNIFIED IDEOGRAPH
+ 0x98D6: 0x6A26, //CJK UNIFIED IDEOGRAPH
+ 0x98D7: 0x6A27, //CJK UNIFIED IDEOGRAPH
+ 0x98D8: 0x6A29, //CJK UNIFIED IDEOGRAPH
+ 0x98D9: 0x6A2B, //CJK UNIFIED IDEOGRAPH
+ 0x98DA: 0x6A2C, //CJK UNIFIED IDEOGRAPH
+ 0x98DB: 0x6A2D, //CJK UNIFIED IDEOGRAPH
+ 0x98DC: 0x6A2E, //CJK UNIFIED IDEOGRAPH
+ 0x98DD: 0x6A30, //CJK UNIFIED IDEOGRAPH
+ 0x98DE: 0x6A32, //CJK UNIFIED IDEOGRAPH
+ 0x98DF: 0x6A33, //CJK UNIFIED IDEOGRAPH
+ 0x98E0: 0x6A34, //CJK UNIFIED IDEOGRAPH
+ 0x98E1: 0x6A36, //CJK UNIFIED IDEOGRAPH
+ 0x98E2: 0x6A37, //CJK UNIFIED IDEOGRAPH
+ 0x98E3: 0x6A38, //CJK UNIFIED IDEOGRAPH
+ 0x98E4: 0x6A39, //CJK UNIFIED IDEOGRAPH
+ 0x98E5: 0x6A3A, //CJK UNIFIED IDEOGRAPH
+ 0x98E6: 0x6A3B, //CJK UNIFIED IDEOGRAPH
+ 0x98E7: 0x6A3C, //CJK UNIFIED IDEOGRAPH
+ 0x98E8: 0x6A3F, //CJK UNIFIED IDEOGRAPH
+ 0x98E9: 0x6A40, //CJK UNIFIED IDEOGRAPH
+ 0x98EA: 0x6A41, //CJK UNIFIED IDEOGRAPH
+ 0x98EB: 0x6A42, //CJK UNIFIED IDEOGRAPH
+ 0x98EC: 0x6A43, //CJK UNIFIED IDEOGRAPH
+ 0x98ED: 0x6A45, //CJK UNIFIED IDEOGRAPH
+ 0x98EE: 0x6A46, //CJK UNIFIED IDEOGRAPH
+ 0x98EF: 0x6A48, //CJK UNIFIED IDEOGRAPH
+ 0x98F0: 0x6A49, //CJK UNIFIED IDEOGRAPH
+ 0x98F1: 0x6A4A, //CJK UNIFIED IDEOGRAPH
+ 0x98F2: 0x6A4B, //CJK UNIFIED IDEOGRAPH
+ 0x98F3: 0x6A4C, //CJK UNIFIED IDEOGRAPH
+ 0x98F4: 0x6A4D, //CJK UNIFIED IDEOGRAPH
+ 0x98F5: 0x6A4E, //CJK UNIFIED IDEOGRAPH
+ 0x98F6: 0x6A4F, //CJK UNIFIED IDEOGRAPH
+ 0x98F7: 0x6A51, //CJK UNIFIED IDEOGRAPH
+ 0x98F8: 0x6A52, //CJK UNIFIED IDEOGRAPH
+ 0x98F9: 0x6A53, //CJK UNIFIED IDEOGRAPH
+ 0x98FA: 0x6A54, //CJK UNIFIED IDEOGRAPH
+ 0x98FB: 0x6A55, //CJK UNIFIED IDEOGRAPH
+ 0x98FC: 0x6A56, //CJK UNIFIED IDEOGRAPH
+ 0x98FD: 0x6A57, //CJK UNIFIED IDEOGRAPH
+ 0x98FE: 0x6A5A, //CJK UNIFIED IDEOGRAPH
+ 0x9940: 0x6A5C, //CJK UNIFIED IDEOGRAPH
+ 0x9941: 0x6A5D, //CJK UNIFIED IDEOGRAPH
+ 0x9942: 0x6A5E, //CJK UNIFIED IDEOGRAPH
+ 0x9943: 0x6A5F, //CJK UNIFIED IDEOGRAPH
+ 0x9944: 0x6A60, //CJK UNIFIED IDEOGRAPH
+ 0x9945: 0x6A62, //CJK UNIFIED IDEOGRAPH
+ 0x9946: 0x6A63, //CJK UNIFIED IDEOGRAPH
+ 0x9947: 0x6A64, //CJK UNIFIED IDEOGRAPH
+ 0x9948: 0x6A66, //CJK UNIFIED IDEOGRAPH
+ 0x9949: 0x6A67, //CJK UNIFIED IDEOGRAPH
+ 0x994A: 0x6A68, //CJK UNIFIED IDEOGRAPH
+ 0x994B: 0x6A69, //CJK UNIFIED IDEOGRAPH
+ 0x994C: 0x6A6A, //CJK UNIFIED IDEOGRAPH
+ 0x994D: 0x6A6B, //CJK UNIFIED IDEOGRAPH
+ 0x994E: 0x6A6C, //CJK UNIFIED IDEOGRAPH
+ 0x994F: 0x6A6D, //CJK UNIFIED IDEOGRAPH
+ 0x9950: 0x6A6E, //CJK UNIFIED IDEOGRAPH
+ 0x9951: 0x6A6F, //CJK UNIFIED IDEOGRAPH
+ 0x9952: 0x6A70, //CJK UNIFIED IDEOGRAPH
+ 0x9953: 0x6A72, //CJK UNIFIED IDEOGRAPH
+ 0x9954: 0x6A73, //CJK UNIFIED IDEOGRAPH
+ 0x9955: 0x6A74, //CJK UNIFIED IDEOGRAPH
+ 0x9956: 0x6A75, //CJK UNIFIED IDEOGRAPH
+ 0x9957: 0x6A76, //CJK UNIFIED IDEOGRAPH
+ 0x9958: 0x6A77, //CJK UNIFIED IDEOGRAPH
+ 0x9959: 0x6A78, //CJK UNIFIED IDEOGRAPH
+ 0x995A: 0x6A7A, //CJK UNIFIED IDEOGRAPH
+ 0x995B: 0x6A7B, //CJK UNIFIED IDEOGRAPH
+ 0x995C: 0x6A7D, //CJK UNIFIED IDEOGRAPH
+ 0x995D: 0x6A7E, //CJK UNIFIED IDEOGRAPH
+ 0x995E: 0x6A7F, //CJK UNIFIED IDEOGRAPH
+ 0x995F: 0x6A81, //CJK UNIFIED IDEOGRAPH
+ 0x9960: 0x6A82, //CJK UNIFIED IDEOGRAPH
+ 0x9961: 0x6A83, //CJK UNIFIED IDEOGRAPH
+ 0x9962: 0x6A85, //CJK UNIFIED IDEOGRAPH
+ 0x9963: 0x6A86, //CJK UNIFIED IDEOGRAPH
+ 0x9964: 0x6A87, //CJK UNIFIED IDEOGRAPH
+ 0x9965: 0x6A88, //CJK UNIFIED IDEOGRAPH
+ 0x9966: 0x6A89, //CJK UNIFIED IDEOGRAPH
+ 0x9967: 0x6A8A, //CJK UNIFIED IDEOGRAPH
+ 0x9968: 0x6A8B, //CJK UNIFIED IDEOGRAPH
+ 0x9969: 0x6A8C, //CJK UNIFIED IDEOGRAPH
+ 0x996A: 0x6A8D, //CJK UNIFIED IDEOGRAPH
+ 0x996B: 0x6A8F, //CJK UNIFIED IDEOGRAPH
+ 0x996C: 0x6A92, //CJK UNIFIED IDEOGRAPH
+ 0x996D: 0x6A93, //CJK UNIFIED IDEOGRAPH
+ 0x996E: 0x6A94, //CJK UNIFIED IDEOGRAPH
+ 0x996F: 0x6A95, //CJK UNIFIED IDEOGRAPH
+ 0x9970: 0x6A96, //CJK UNIFIED IDEOGRAPH
+ 0x9971: 0x6A98, //CJK UNIFIED IDEOGRAPH
+ 0x9972: 0x6A99, //CJK UNIFIED IDEOGRAPH
+ 0x9973: 0x6A9A, //CJK UNIFIED IDEOGRAPH
+ 0x9974: 0x6A9B, //CJK UNIFIED IDEOGRAPH
+ 0x9975: 0x6A9C, //CJK UNIFIED IDEOGRAPH
+ 0x9976: 0x6A9D, //CJK UNIFIED IDEOGRAPH
+ 0x9977: 0x6A9E, //CJK UNIFIED IDEOGRAPH
+ 0x9978: 0x6A9F, //CJK UNIFIED IDEOGRAPH
+ 0x9979: 0x6AA1, //CJK UNIFIED IDEOGRAPH
+ 0x997A: 0x6AA2, //CJK UNIFIED IDEOGRAPH
+ 0x997B: 0x6AA3, //CJK UNIFIED IDEOGRAPH
+ 0x997C: 0x6AA4, //CJK UNIFIED IDEOGRAPH
+ 0x997D: 0x6AA5, //CJK UNIFIED IDEOGRAPH
+ 0x997E: 0x6AA6, //CJK UNIFIED IDEOGRAPH
+ 0x9980: 0x6AA7, //CJK UNIFIED IDEOGRAPH
+ 0x9981: 0x6AA8, //CJK UNIFIED IDEOGRAPH
+ 0x9982: 0x6AAA, //CJK UNIFIED IDEOGRAPH
+ 0x9983: 0x6AAD, //CJK UNIFIED IDEOGRAPH
+ 0x9984: 0x6AAE, //CJK UNIFIED IDEOGRAPH
+ 0x9985: 0x6AAF, //CJK UNIFIED IDEOGRAPH
+ 0x9986: 0x6AB0, //CJK UNIFIED IDEOGRAPH
+ 0x9987: 0x6AB1, //CJK UNIFIED IDEOGRAPH
+ 0x9988: 0x6AB2, //CJK UNIFIED IDEOGRAPH
+ 0x9989: 0x6AB3, //CJK UNIFIED IDEOGRAPH
+ 0x998A: 0x6AB4, //CJK UNIFIED IDEOGRAPH
+ 0x998B: 0x6AB5, //CJK UNIFIED IDEOGRAPH
+ 0x998C: 0x6AB6, //CJK UNIFIED IDEOGRAPH
+ 0x998D: 0x6AB7, //CJK UNIFIED IDEOGRAPH
+ 0x998E: 0x6AB8, //CJK UNIFIED IDEOGRAPH
+ 0x998F: 0x6AB9, //CJK UNIFIED IDEOGRAPH
+ 0x9990: 0x6ABA, //CJK UNIFIED IDEOGRAPH
+ 0x9991: 0x6ABB, //CJK UNIFIED IDEOGRAPH
+ 0x9992: 0x6ABC, //CJK UNIFIED IDEOGRAPH
+ 0x9993: 0x6ABD, //CJK UNIFIED IDEOGRAPH
+ 0x9994: 0x6ABE, //CJK UNIFIED IDEOGRAPH
+ 0x9995: 0x6ABF, //CJK UNIFIED IDEOGRAPH
+ 0x9996: 0x6AC0, //CJK UNIFIED IDEOGRAPH
+ 0x9997: 0x6AC1, //CJK UNIFIED IDEOGRAPH
+ 0x9998: 0x6AC2, //CJK UNIFIED IDEOGRAPH
+ 0x9999: 0x6AC3, //CJK UNIFIED IDEOGRAPH
+ 0x999A: 0x6AC4, //CJK UNIFIED IDEOGRAPH
+ 0x999B: 0x6AC5, //CJK UNIFIED IDEOGRAPH
+ 0x999C: 0x6AC6, //CJK UNIFIED IDEOGRAPH
+ 0x999D: 0x6AC7, //CJK UNIFIED IDEOGRAPH
+ 0x999E: 0x6AC8, //CJK UNIFIED IDEOGRAPH
+ 0x999F: 0x6AC9, //CJK UNIFIED IDEOGRAPH
+ 0x99A0: 0x6ACA, //CJK UNIFIED IDEOGRAPH
+ 0x99A1: 0x6ACB, //CJK UNIFIED IDEOGRAPH
+ 0x99A2: 0x6ACC, //CJK UNIFIED IDEOGRAPH
+ 0x99A3: 0x6ACD, //CJK UNIFIED IDEOGRAPH
+ 0x99A4: 0x6ACE, //CJK UNIFIED IDEOGRAPH
+ 0x99A5: 0x6ACF, //CJK UNIFIED IDEOGRAPH
+ 0x99A6: 0x6AD0, //CJK UNIFIED IDEOGRAPH
+ 0x99A7: 0x6AD1, //CJK UNIFIED IDEOGRAPH
+ 0x99A8: 0x6AD2, //CJK UNIFIED IDEOGRAPH
+ 0x99A9: 0x6AD3, //CJK UNIFIED IDEOGRAPH
+ 0x99AA: 0x6AD4, //CJK UNIFIED IDEOGRAPH
+ 0x99AB: 0x6AD5, //CJK UNIFIED IDEOGRAPH
+ 0x99AC: 0x6AD6, //CJK UNIFIED IDEOGRAPH
+ 0x99AD: 0x6AD7, //CJK UNIFIED IDEOGRAPH
+ 0x99AE: 0x6AD8, //CJK UNIFIED IDEOGRAPH
+ 0x99AF: 0x6AD9, //CJK UNIFIED IDEOGRAPH
+ 0x99B0: 0x6ADA, //CJK UNIFIED IDEOGRAPH
+ 0x99B1: 0x6ADB, //CJK UNIFIED IDEOGRAPH
+ 0x99B2: 0x6ADC, //CJK UNIFIED IDEOGRAPH
+ 0x99B3: 0x6ADD, //CJK UNIFIED IDEOGRAPH
+ 0x99B4: 0x6ADE, //CJK UNIFIED IDEOGRAPH
+ 0x99B5: 0x6ADF, //CJK UNIFIED IDEOGRAPH
+ 0x99B6: 0x6AE0, //CJK UNIFIED IDEOGRAPH
+ 0x99B7: 0x6AE1, //CJK UNIFIED IDEOGRAPH
+ 0x99B8: 0x6AE2, //CJK UNIFIED IDEOGRAPH
+ 0x99B9: 0x6AE3, //CJK UNIFIED IDEOGRAPH
+ 0x99BA: 0x6AE4, //CJK UNIFIED IDEOGRAPH
+ 0x99BB: 0x6AE5, //CJK UNIFIED IDEOGRAPH
+ 0x99BC: 0x6AE6, //CJK UNIFIED IDEOGRAPH
+ 0x99BD: 0x6AE7, //CJK UNIFIED IDEOGRAPH
+ 0x99BE: 0x6AE8, //CJK UNIFIED IDEOGRAPH
+ 0x99BF: 0x6AE9, //CJK UNIFIED IDEOGRAPH
+ 0x99C0: 0x6AEA, //CJK UNIFIED IDEOGRAPH
+ 0x99C1: 0x6AEB, //CJK UNIFIED IDEOGRAPH
+ 0x99C2: 0x6AEC, //CJK UNIFIED IDEOGRAPH
+ 0x99C3: 0x6AED, //CJK UNIFIED IDEOGRAPH
+ 0x99C4: 0x6AEE, //CJK UNIFIED IDEOGRAPH
+ 0x99C5: 0x6AEF, //CJK UNIFIED IDEOGRAPH
+ 0x99C6: 0x6AF0, //CJK UNIFIED IDEOGRAPH
+ 0x99C7: 0x6AF1, //CJK UNIFIED IDEOGRAPH
+ 0x99C8: 0x6AF2, //CJK UNIFIED IDEOGRAPH
+ 0x99C9: 0x6AF3, //CJK UNIFIED IDEOGRAPH
+ 0x99CA: 0x6AF4, //CJK UNIFIED IDEOGRAPH
+ 0x99CB: 0x6AF5, //CJK UNIFIED IDEOGRAPH
+ 0x99CC: 0x6AF6, //CJK UNIFIED IDEOGRAPH
+ 0x99CD: 0x6AF7, //CJK UNIFIED IDEOGRAPH
+ 0x99CE: 0x6AF8, //CJK UNIFIED IDEOGRAPH
+ 0x99CF: 0x6AF9, //CJK UNIFIED IDEOGRAPH
+ 0x99D0: 0x6AFA, //CJK UNIFIED IDEOGRAPH
+ 0x99D1: 0x6AFB, //CJK UNIFIED IDEOGRAPH
+ 0x99D2: 0x6AFC, //CJK UNIFIED IDEOGRAPH
+ 0x99D3: 0x6AFD, //CJK UNIFIED IDEOGRAPH
+ 0x99D4: 0x6AFE, //CJK UNIFIED IDEOGRAPH
+ 0x99D5: 0x6AFF, //CJK UNIFIED IDEOGRAPH
+ 0x99D6: 0x6B00, //CJK UNIFIED IDEOGRAPH
+ 0x99D7: 0x6B01, //CJK UNIFIED IDEOGRAPH
+ 0x99D8: 0x6B02, //CJK UNIFIED IDEOGRAPH
+ 0x99D9: 0x6B03, //CJK UNIFIED IDEOGRAPH
+ 0x99DA: 0x6B04, //CJK UNIFIED IDEOGRAPH
+ 0x99DB: 0x6B05, //CJK UNIFIED IDEOGRAPH
+ 0x99DC: 0x6B06, //CJK UNIFIED IDEOGRAPH
+ 0x99DD: 0x6B07, //CJK UNIFIED IDEOGRAPH
+ 0x99DE: 0x6B08, //CJK UNIFIED IDEOGRAPH
+ 0x99DF: 0x6B09, //CJK UNIFIED IDEOGRAPH
+ 0x99E0: 0x6B0A, //CJK UNIFIED IDEOGRAPH
+ 0x99E1: 0x6B0B, //CJK UNIFIED IDEOGRAPH
+ 0x99E2: 0x6B0C, //CJK UNIFIED IDEOGRAPH
+ 0x99E3: 0x6B0D, //CJK UNIFIED IDEOGRAPH
+ 0x99E4: 0x6B0E, //CJK UNIFIED IDEOGRAPH
+ 0x99E5: 0x6B0F, //CJK UNIFIED IDEOGRAPH
+ 0x99E6: 0x6B10, //CJK UNIFIED IDEOGRAPH
+ 0x99E7: 0x6B11, //CJK UNIFIED IDEOGRAPH
+ 0x99E8: 0x6B12, //CJK UNIFIED IDEOGRAPH
+ 0x99E9: 0x6B13, //CJK UNIFIED IDEOGRAPH
+ 0x99EA: 0x6B14, //CJK UNIFIED IDEOGRAPH
+ 0x99EB: 0x6B15, //CJK UNIFIED IDEOGRAPH
+ 0x99EC: 0x6B16, //CJK UNIFIED IDEOGRAPH
+ 0x99ED: 0x6B17, //CJK UNIFIED IDEOGRAPH
+ 0x99EE: 0x6B18, //CJK UNIFIED IDEOGRAPH
+ 0x99EF: 0x6B19, //CJK UNIFIED IDEOGRAPH
+ 0x99F0: 0x6B1A, //CJK UNIFIED IDEOGRAPH
+ 0x99F1: 0x6B1B, //CJK UNIFIED IDEOGRAPH
+ 0x99F2: 0x6B1C, //CJK UNIFIED IDEOGRAPH
+ 0x99F3: 0x6B1D, //CJK UNIFIED IDEOGRAPH
+ 0x99F4: 0x6B1E, //CJK UNIFIED IDEOGRAPH
+ 0x99F5: 0x6B1F, //CJK UNIFIED IDEOGRAPH
+ 0x99F6: 0x6B25, //CJK UNIFIED IDEOGRAPH
+ 0x99F7: 0x6B26, //CJK UNIFIED IDEOGRAPH
+ 0x99F8: 0x6B28, //CJK UNIFIED IDEOGRAPH
+ 0x99F9: 0x6B29, //CJK UNIFIED IDEOGRAPH
+ 0x99FA: 0x6B2A, //CJK UNIFIED IDEOGRAPH
+ 0x99FB: 0x6B2B, //CJK UNIFIED IDEOGRAPH
+ 0x99FC: 0x6B2C, //CJK UNIFIED IDEOGRAPH
+ 0x99FD: 0x6B2D, //CJK UNIFIED IDEOGRAPH
+ 0x99FE: 0x6B2E, //CJK UNIFIED IDEOGRAPH
+ 0x9A40: 0x6B2F, //CJK UNIFIED IDEOGRAPH
+ 0x9A41: 0x6B30, //CJK UNIFIED IDEOGRAPH
+ 0x9A42: 0x6B31, //CJK UNIFIED IDEOGRAPH
+ 0x9A43: 0x6B33, //CJK UNIFIED IDEOGRAPH
+ 0x9A44: 0x6B34, //CJK UNIFIED IDEOGRAPH
+ 0x9A45: 0x6B35, //CJK UNIFIED IDEOGRAPH
+ 0x9A46: 0x6B36, //CJK UNIFIED IDEOGRAPH
+ 0x9A47: 0x6B38, //CJK UNIFIED IDEOGRAPH
+ 0x9A48: 0x6B3B, //CJK UNIFIED IDEOGRAPH
+ 0x9A49: 0x6B3C, //CJK UNIFIED IDEOGRAPH
+ 0x9A4A: 0x6B3D, //CJK UNIFIED IDEOGRAPH
+ 0x9A4B: 0x6B3F, //CJK UNIFIED IDEOGRAPH
+ 0x9A4C: 0x6B40, //CJK UNIFIED IDEOGRAPH
+ 0x9A4D: 0x6B41, //CJK UNIFIED IDEOGRAPH
+ 0x9A4E: 0x6B42, //CJK UNIFIED IDEOGRAPH
+ 0x9A4F: 0x6B44, //CJK UNIFIED IDEOGRAPH
+ 0x9A50: 0x6B45, //CJK UNIFIED IDEOGRAPH
+ 0x9A51: 0x6B48, //CJK UNIFIED IDEOGRAPH
+ 0x9A52: 0x6B4A, //CJK UNIFIED IDEOGRAPH
+ 0x9A53: 0x6B4B, //CJK UNIFIED IDEOGRAPH
+ 0x9A54: 0x6B4D, //CJK UNIFIED IDEOGRAPH
+ 0x9A55: 0x6B4E, //CJK UNIFIED IDEOGRAPH
+ 0x9A56: 0x6B4F, //CJK UNIFIED IDEOGRAPH
+ 0x9A57: 0x6B50, //CJK UNIFIED IDEOGRAPH
+ 0x9A58: 0x6B51, //CJK UNIFIED IDEOGRAPH
+ 0x9A59: 0x6B52, //CJK UNIFIED IDEOGRAPH
+ 0x9A5A: 0x6B53, //CJK UNIFIED IDEOGRAPH
+ 0x9A5B: 0x6B54, //CJK UNIFIED IDEOGRAPH
+ 0x9A5C: 0x6B55, //CJK UNIFIED IDEOGRAPH
+ 0x9A5D: 0x6B56, //CJK UNIFIED IDEOGRAPH
+ 0x9A5E: 0x6B57, //CJK UNIFIED IDEOGRAPH
+ 0x9A5F: 0x6B58, //CJK UNIFIED IDEOGRAPH
+ 0x9A60: 0x6B5A, //CJK UNIFIED IDEOGRAPH
+ 0x9A61: 0x6B5B, //CJK UNIFIED IDEOGRAPH
+ 0x9A62: 0x6B5C, //CJK UNIFIED IDEOGRAPH
+ 0x9A63: 0x6B5D, //CJK UNIFIED IDEOGRAPH
+ 0x9A64: 0x6B5E, //CJK UNIFIED IDEOGRAPH
+ 0x9A65: 0x6B5F, //CJK UNIFIED IDEOGRAPH
+ 0x9A66: 0x6B60, //CJK UNIFIED IDEOGRAPH
+ 0x9A67: 0x6B61, //CJK UNIFIED IDEOGRAPH
+ 0x9A68: 0x6B68, //CJK UNIFIED IDEOGRAPH
+ 0x9A69: 0x6B69, //CJK UNIFIED IDEOGRAPH
+ 0x9A6A: 0x6B6B, //CJK UNIFIED IDEOGRAPH
+ 0x9A6B: 0x6B6C, //CJK UNIFIED IDEOGRAPH
+ 0x9A6C: 0x6B6D, //CJK UNIFIED IDEOGRAPH
+ 0x9A6D: 0x6B6E, //CJK UNIFIED IDEOGRAPH
+ 0x9A6E: 0x6B6F, //CJK UNIFIED IDEOGRAPH
+ 0x9A6F: 0x6B70, //CJK UNIFIED IDEOGRAPH
+ 0x9A70: 0x6B71, //CJK UNIFIED IDEOGRAPH
+ 0x9A71: 0x6B72, //CJK UNIFIED IDEOGRAPH
+ 0x9A72: 0x6B73, //CJK UNIFIED IDEOGRAPH
+ 0x9A73: 0x6B74, //CJK UNIFIED IDEOGRAPH
+ 0x9A74: 0x6B75, //CJK UNIFIED IDEOGRAPH
+ 0x9A75: 0x6B76, //CJK UNIFIED IDEOGRAPH
+ 0x9A76: 0x6B77, //CJK UNIFIED IDEOGRAPH
+ 0x9A77: 0x6B78, //CJK UNIFIED IDEOGRAPH
+ 0x9A78: 0x6B7A, //CJK UNIFIED IDEOGRAPH
+ 0x9A79: 0x6B7D, //CJK UNIFIED IDEOGRAPH
+ 0x9A7A: 0x6B7E, //CJK UNIFIED IDEOGRAPH
+ 0x9A7B: 0x6B7F, //CJK UNIFIED IDEOGRAPH
+ 0x9A7C: 0x6B80, //CJK UNIFIED IDEOGRAPH
+ 0x9A7D: 0x6B85, //CJK UNIFIED IDEOGRAPH
+ 0x9A7E: 0x6B88, //CJK UNIFIED IDEOGRAPH
+ 0x9A80: 0x6B8C, //CJK UNIFIED IDEOGRAPH
+ 0x9A81: 0x6B8E, //CJK UNIFIED IDEOGRAPH
+ 0x9A82: 0x6B8F, //CJK UNIFIED IDEOGRAPH
+ 0x9A83: 0x6B90, //CJK UNIFIED IDEOGRAPH
+ 0x9A84: 0x6B91, //CJK UNIFIED IDEOGRAPH
+ 0x9A85: 0x6B94, //CJK UNIFIED IDEOGRAPH
+ 0x9A86: 0x6B95, //CJK UNIFIED IDEOGRAPH
+ 0x9A87: 0x6B97, //CJK UNIFIED IDEOGRAPH
+ 0x9A88: 0x6B98, //CJK UNIFIED IDEOGRAPH
+ 0x9A89: 0x6B99, //CJK UNIFIED IDEOGRAPH
+ 0x9A8A: 0x6B9C, //CJK UNIFIED IDEOGRAPH
+ 0x9A8B: 0x6B9D, //CJK UNIFIED IDEOGRAPH
+ 0x9A8C: 0x6B9E, //CJK UNIFIED IDEOGRAPH
+ 0x9A8D: 0x6B9F, //CJK UNIFIED IDEOGRAPH
+ 0x9A8E: 0x6BA0, //CJK UNIFIED IDEOGRAPH
+ 0x9A8F: 0x6BA2, //CJK UNIFIED IDEOGRAPH
+ 0x9A90: 0x6BA3, //CJK UNIFIED IDEOGRAPH
+ 0x9A91: 0x6BA4, //CJK UNIFIED IDEOGRAPH
+ 0x9A92: 0x6BA5, //CJK UNIFIED IDEOGRAPH
+ 0x9A93: 0x6BA6, //CJK UNIFIED IDEOGRAPH
+ 0x9A94: 0x6BA7, //CJK UNIFIED IDEOGRAPH
+ 0x9A95: 0x6BA8, //CJK UNIFIED IDEOGRAPH
+ 0x9A96: 0x6BA9, //CJK UNIFIED IDEOGRAPH
+ 0x9A97: 0x6BAB, //CJK UNIFIED IDEOGRAPH
+ 0x9A98: 0x6BAC, //CJK UNIFIED IDEOGRAPH
+ 0x9A99: 0x6BAD, //CJK UNIFIED IDEOGRAPH
+ 0x9A9A: 0x6BAE, //CJK UNIFIED IDEOGRAPH
+ 0x9A9B: 0x6BAF, //CJK UNIFIED IDEOGRAPH
+ 0x9A9C: 0x6BB0, //CJK UNIFIED IDEOGRAPH
+ 0x9A9D: 0x6BB1, //CJK UNIFIED IDEOGRAPH
+ 0x9A9E: 0x6BB2, //CJK UNIFIED IDEOGRAPH
+ 0x9A9F: 0x6BB6, //CJK UNIFIED IDEOGRAPH
+ 0x9AA0: 0x6BB8, //CJK UNIFIED IDEOGRAPH
+ 0x9AA1: 0x6BB9, //CJK UNIFIED IDEOGRAPH
+ 0x9AA2: 0x6BBA, //CJK UNIFIED IDEOGRAPH
+ 0x9AA3: 0x6BBB, //CJK UNIFIED IDEOGRAPH
+ 0x9AA4: 0x6BBC, //CJK UNIFIED IDEOGRAPH
+ 0x9AA5: 0x6BBD, //CJK UNIFIED IDEOGRAPH
+ 0x9AA6: 0x6BBE, //CJK UNIFIED IDEOGRAPH
+ 0x9AA7: 0x6BC0, //CJK UNIFIED IDEOGRAPH
+ 0x9AA8: 0x6BC3, //CJK UNIFIED IDEOGRAPH
+ 0x9AA9: 0x6BC4, //CJK UNIFIED IDEOGRAPH
+ 0x9AAA: 0x6BC6, //CJK UNIFIED IDEOGRAPH
+ 0x9AAB: 0x6BC7, //CJK UNIFIED IDEOGRAPH
+ 0x9AAC: 0x6BC8, //CJK UNIFIED IDEOGRAPH
+ 0x9AAD: 0x6BC9, //CJK UNIFIED IDEOGRAPH
+ 0x9AAE: 0x6BCA, //CJK UNIFIED IDEOGRAPH
+ 0x9AAF: 0x6BCC, //CJK UNIFIED IDEOGRAPH
+ 0x9AB0: 0x6BCE, //CJK UNIFIED IDEOGRAPH
+ 0x9AB1: 0x6BD0, //CJK UNIFIED IDEOGRAPH
+ 0x9AB2: 0x6BD1, //CJK UNIFIED IDEOGRAPH
+ 0x9AB3: 0x6BD8, //CJK UNIFIED IDEOGRAPH
+ 0x9AB4: 0x6BDA, //CJK UNIFIED IDEOGRAPH
+ 0x9AB5: 0x6BDC, //CJK UNIFIED IDEOGRAPH
+ 0x9AB6: 0x6BDD, //CJK UNIFIED IDEOGRAPH
+ 0x9AB7: 0x6BDE, //CJK UNIFIED IDEOGRAPH
+ 0x9AB8: 0x6BDF, //CJK UNIFIED IDEOGRAPH
+ 0x9AB9: 0x6BE0, //CJK UNIFIED IDEOGRAPH
+ 0x9ABA: 0x6BE2, //CJK UNIFIED IDEOGRAPH
+ 0x9ABB: 0x6BE3, //CJK UNIFIED IDEOGRAPH
+ 0x9ABC: 0x6BE4, //CJK UNIFIED IDEOGRAPH
+ 0x9ABD: 0x6BE5, //CJK UNIFIED IDEOGRAPH
+ 0x9ABE: 0x6BE6, //CJK UNIFIED IDEOGRAPH
+ 0x9ABF: 0x6BE7, //CJK UNIFIED IDEOGRAPH
+ 0x9AC0: 0x6BE8, //CJK UNIFIED IDEOGRAPH
+ 0x9AC1: 0x6BE9, //CJK UNIFIED IDEOGRAPH
+ 0x9AC2: 0x6BEC, //CJK UNIFIED IDEOGRAPH
+ 0x9AC3: 0x6BED, //CJK UNIFIED IDEOGRAPH
+ 0x9AC4: 0x6BEE, //CJK UNIFIED IDEOGRAPH
+ 0x9AC5: 0x6BF0, //CJK UNIFIED IDEOGRAPH
+ 0x9AC6: 0x6BF1, //CJK UNIFIED IDEOGRAPH
+ 0x9AC7: 0x6BF2, //CJK UNIFIED IDEOGRAPH
+ 0x9AC8: 0x6BF4, //CJK UNIFIED IDEOGRAPH
+ 0x9AC9: 0x6BF6, //CJK UNIFIED IDEOGRAPH
+ 0x9ACA: 0x6BF7, //CJK UNIFIED IDEOGRAPH
+ 0x9ACB: 0x6BF8, //CJK UNIFIED IDEOGRAPH
+ 0x9ACC: 0x6BFA, //CJK UNIFIED IDEOGRAPH
+ 0x9ACD: 0x6BFB, //CJK UNIFIED IDEOGRAPH
+ 0x9ACE: 0x6BFC, //CJK UNIFIED IDEOGRAPH
+ 0x9ACF: 0x6BFE, //CJK UNIFIED IDEOGRAPH
+ 0x9AD0: 0x6BFF, //CJK UNIFIED IDEOGRAPH
+ 0x9AD1: 0x6C00, //CJK UNIFIED IDEOGRAPH
+ 0x9AD2: 0x6C01, //CJK UNIFIED IDEOGRAPH
+ 0x9AD3: 0x6C02, //CJK UNIFIED IDEOGRAPH
+ 0x9AD4: 0x6C03, //CJK UNIFIED IDEOGRAPH
+ 0x9AD5: 0x6C04, //CJK UNIFIED IDEOGRAPH
+ 0x9AD6: 0x6C08, //CJK UNIFIED IDEOGRAPH
+ 0x9AD7: 0x6C09, //CJK UNIFIED IDEOGRAPH
+ 0x9AD8: 0x6C0A, //CJK UNIFIED IDEOGRAPH
+ 0x9AD9: 0x6C0B, //CJK UNIFIED IDEOGRAPH
+ 0x9ADA: 0x6C0C, //CJK UNIFIED IDEOGRAPH
+ 0x9ADB: 0x6C0E, //CJK UNIFIED IDEOGRAPH
+ 0x9ADC: 0x6C12, //CJK UNIFIED IDEOGRAPH
+ 0x9ADD: 0x6C17, //CJK UNIFIED IDEOGRAPH
+ 0x9ADE: 0x6C1C, //CJK UNIFIED IDEOGRAPH
+ 0x9ADF: 0x6C1D, //CJK UNIFIED IDEOGRAPH
+ 0x9AE0: 0x6C1E, //CJK UNIFIED IDEOGRAPH
+ 0x9AE1: 0x6C20, //CJK UNIFIED IDEOGRAPH
+ 0x9AE2: 0x6C23, //CJK UNIFIED IDEOGRAPH
+ 0x9AE3: 0x6C25, //CJK UNIFIED IDEOGRAPH
+ 0x9AE4: 0x6C2B, //CJK UNIFIED IDEOGRAPH
+ 0x9AE5: 0x6C2C, //CJK UNIFIED IDEOGRAPH
+ 0x9AE6: 0x6C2D, //CJK UNIFIED IDEOGRAPH
+ 0x9AE7: 0x6C31, //CJK UNIFIED IDEOGRAPH
+ 0x9AE8: 0x6C33, //CJK UNIFIED IDEOGRAPH
+ 0x9AE9: 0x6C36, //CJK UNIFIED IDEOGRAPH
+ 0x9AEA: 0x6C37, //CJK UNIFIED IDEOGRAPH
+ 0x9AEB: 0x6C39, //CJK UNIFIED IDEOGRAPH
+ 0x9AEC: 0x6C3A, //CJK UNIFIED IDEOGRAPH
+ 0x9AED: 0x6C3B, //CJK UNIFIED IDEOGRAPH
+ 0x9AEE: 0x6C3C, //CJK UNIFIED IDEOGRAPH
+ 0x9AEF: 0x6C3E, //CJK UNIFIED IDEOGRAPH
+ 0x9AF0: 0x6C3F, //CJK UNIFIED IDEOGRAPH
+ 0x9AF1: 0x6C43, //CJK UNIFIED IDEOGRAPH
+ 0x9AF2: 0x6C44, //CJK UNIFIED IDEOGRAPH
+ 0x9AF3: 0x6C45, //CJK UNIFIED IDEOGRAPH
+ 0x9AF4: 0x6C48, //CJK UNIFIED IDEOGRAPH
+ 0x9AF5: 0x6C4B, //CJK UNIFIED IDEOGRAPH
+ 0x9AF6: 0x6C4C, //CJK UNIFIED IDEOGRAPH
+ 0x9AF7: 0x6C4D, //CJK UNIFIED IDEOGRAPH
+ 0x9AF8: 0x6C4E, //CJK UNIFIED IDEOGRAPH
+ 0x9AF9: 0x6C4F, //CJK UNIFIED IDEOGRAPH
+ 0x9AFA: 0x6C51, //CJK UNIFIED IDEOGRAPH
+ 0x9AFB: 0x6C52, //CJK UNIFIED IDEOGRAPH
+ 0x9AFC: 0x6C53, //CJK UNIFIED IDEOGRAPH
+ 0x9AFD: 0x6C56, //CJK UNIFIED IDEOGRAPH
+ 0x9AFE: 0x6C58, //CJK UNIFIED IDEOGRAPH
+ 0x9B40: 0x6C59, //CJK UNIFIED IDEOGRAPH
+ 0x9B41: 0x6C5A, //CJK UNIFIED IDEOGRAPH
+ 0x9B42: 0x6C62, //CJK UNIFIED IDEOGRAPH
+ 0x9B43: 0x6C63, //CJK UNIFIED IDEOGRAPH
+ 0x9B44: 0x6C65, //CJK UNIFIED IDEOGRAPH
+ 0x9B45: 0x6C66, //CJK UNIFIED IDEOGRAPH
+ 0x9B46: 0x6C67, //CJK UNIFIED IDEOGRAPH
+ 0x9B47: 0x6C6B, //CJK UNIFIED IDEOGRAPH
+ 0x9B48: 0x6C6C, //CJK UNIFIED IDEOGRAPH
+ 0x9B49: 0x6C6D, //CJK UNIFIED IDEOGRAPH
+ 0x9B4A: 0x6C6E, //CJK UNIFIED IDEOGRAPH
+ 0x9B4B: 0x6C6F, //CJK UNIFIED IDEOGRAPH
+ 0x9B4C: 0x6C71, //CJK UNIFIED IDEOGRAPH
+ 0x9B4D: 0x6C73, //CJK UNIFIED IDEOGRAPH
+ 0x9B4E: 0x6C75, //CJK UNIFIED IDEOGRAPH
+ 0x9B4F: 0x6C77, //CJK UNIFIED IDEOGRAPH
+ 0x9B50: 0x6C78, //CJK UNIFIED IDEOGRAPH
+ 0x9B51: 0x6C7A, //CJK UNIFIED IDEOGRAPH
+ 0x9B52: 0x6C7B, //CJK UNIFIED IDEOGRAPH
+ 0x9B53: 0x6C7C, //CJK UNIFIED IDEOGRAPH
+ 0x9B54: 0x6C7F, //CJK UNIFIED IDEOGRAPH
+ 0x9B55: 0x6C80, //CJK UNIFIED IDEOGRAPH
+ 0x9B56: 0x6C84, //CJK UNIFIED IDEOGRAPH
+ 0x9B57: 0x6C87, //CJK UNIFIED IDEOGRAPH
+ 0x9B58: 0x6C8A, //CJK UNIFIED IDEOGRAPH
+ 0x9B59: 0x6C8B, //CJK UNIFIED IDEOGRAPH
+ 0x9B5A: 0x6C8D, //CJK UNIFIED IDEOGRAPH
+ 0x9B5B: 0x6C8E, //CJK UNIFIED IDEOGRAPH
+ 0x9B5C: 0x6C91, //CJK UNIFIED IDEOGRAPH
+ 0x9B5D: 0x6C92, //CJK UNIFIED IDEOGRAPH
+ 0x9B5E: 0x6C95, //CJK UNIFIED IDEOGRAPH
+ 0x9B5F: 0x6C96, //CJK UNIFIED IDEOGRAPH
+ 0x9B60: 0x6C97, //CJK UNIFIED IDEOGRAPH
+ 0x9B61: 0x6C98, //CJK UNIFIED IDEOGRAPH
+ 0x9B62: 0x6C9A, //CJK UNIFIED IDEOGRAPH
+ 0x9B63: 0x6C9C, //CJK UNIFIED IDEOGRAPH
+ 0x9B64: 0x6C9D, //CJK UNIFIED IDEOGRAPH
+ 0x9B65: 0x6C9E, //CJK UNIFIED IDEOGRAPH
+ 0x9B66: 0x6CA0, //CJK UNIFIED IDEOGRAPH
+ 0x9B67: 0x6CA2, //CJK UNIFIED IDEOGRAPH
+ 0x9B68: 0x6CA8, //CJK UNIFIED IDEOGRAPH
+ 0x9B69: 0x6CAC, //CJK UNIFIED IDEOGRAPH
+ 0x9B6A: 0x6CAF, //CJK UNIFIED IDEOGRAPH
+ 0x9B6B: 0x6CB0, //CJK UNIFIED IDEOGRAPH
+ 0x9B6C: 0x6CB4, //CJK UNIFIED IDEOGRAPH
+ 0x9B6D: 0x6CB5, //CJK UNIFIED IDEOGRAPH
+ 0x9B6E: 0x6CB6, //CJK UNIFIED IDEOGRAPH
+ 0x9B6F: 0x6CB7, //CJK UNIFIED IDEOGRAPH
+ 0x9B70: 0x6CBA, //CJK UNIFIED IDEOGRAPH
+ 0x9B71: 0x6CC0, //CJK UNIFIED IDEOGRAPH
+ 0x9B72: 0x6CC1, //CJK UNIFIED IDEOGRAPH
+ 0x9B73: 0x6CC2, //CJK UNIFIED IDEOGRAPH
+ 0x9B74: 0x6CC3, //CJK UNIFIED IDEOGRAPH
+ 0x9B75: 0x6CC6, //CJK UNIFIED IDEOGRAPH
+ 0x9B76: 0x6CC7, //CJK UNIFIED IDEOGRAPH
+ 0x9B77: 0x6CC8, //CJK UNIFIED IDEOGRAPH
+ 0x9B78: 0x6CCB, //CJK UNIFIED IDEOGRAPH
+ 0x9B79: 0x6CCD, //CJK UNIFIED IDEOGRAPH
+ 0x9B7A: 0x6CCE, //CJK UNIFIED IDEOGRAPH
+ 0x9B7B: 0x6CCF, //CJK UNIFIED IDEOGRAPH
+ 0x9B7C: 0x6CD1, //CJK UNIFIED IDEOGRAPH
+ 0x9B7D: 0x6CD2, //CJK UNIFIED IDEOGRAPH
+ 0x9B7E: 0x6CD8, //CJK UNIFIED IDEOGRAPH
+ 0x9B80: 0x6CD9, //CJK UNIFIED IDEOGRAPH
+ 0x9B81: 0x6CDA, //CJK UNIFIED IDEOGRAPH
+ 0x9B82: 0x6CDC, //CJK UNIFIED IDEOGRAPH
+ 0x9B83: 0x6CDD, //CJK UNIFIED IDEOGRAPH
+ 0x9B84: 0x6CDF, //CJK UNIFIED IDEOGRAPH
+ 0x9B85: 0x6CE4, //CJK UNIFIED IDEOGRAPH
+ 0x9B86: 0x6CE6, //CJK UNIFIED IDEOGRAPH
+ 0x9B87: 0x6CE7, //CJK UNIFIED IDEOGRAPH
+ 0x9B88: 0x6CE9, //CJK UNIFIED IDEOGRAPH
+ 0x9B89: 0x6CEC, //CJK UNIFIED IDEOGRAPH
+ 0x9B8A: 0x6CED, //CJK UNIFIED IDEOGRAPH
+ 0x9B8B: 0x6CF2, //CJK UNIFIED IDEOGRAPH
+ 0x9B8C: 0x6CF4, //CJK UNIFIED IDEOGRAPH
+ 0x9B8D: 0x6CF9, //CJK UNIFIED IDEOGRAPH
+ 0x9B8E: 0x6CFF, //CJK UNIFIED IDEOGRAPH
+ 0x9B8F: 0x6D00, //CJK UNIFIED IDEOGRAPH
+ 0x9B90: 0x6D02, //CJK UNIFIED IDEOGRAPH
+ 0x9B91: 0x6D03, //CJK UNIFIED IDEOGRAPH
+ 0x9B92: 0x6D05, //CJK UNIFIED IDEOGRAPH
+ 0x9B93: 0x6D06, //CJK UNIFIED IDEOGRAPH
+ 0x9B94: 0x6D08, //CJK UNIFIED IDEOGRAPH
+ 0x9B95: 0x6D09, //CJK UNIFIED IDEOGRAPH
+ 0x9B96: 0x6D0A, //CJK UNIFIED IDEOGRAPH
+ 0x9B97: 0x6D0D, //CJK UNIFIED IDEOGRAPH
+ 0x9B98: 0x6D0F, //CJK UNIFIED IDEOGRAPH
+ 0x9B99: 0x6D10, //CJK UNIFIED IDEOGRAPH
+ 0x9B9A: 0x6D11, //CJK UNIFIED IDEOGRAPH
+ 0x9B9B: 0x6D13, //CJK UNIFIED IDEOGRAPH
+ 0x9B9C: 0x6D14, //CJK UNIFIED IDEOGRAPH
+ 0x9B9D: 0x6D15, //CJK UNIFIED IDEOGRAPH
+ 0x9B9E: 0x6D16, //CJK UNIFIED IDEOGRAPH
+ 0x9B9F: 0x6D18, //CJK UNIFIED IDEOGRAPH
+ 0x9BA0: 0x6D1C, //CJK UNIFIED IDEOGRAPH
+ 0x9BA1: 0x6D1D, //CJK UNIFIED IDEOGRAPH
+ 0x9BA2: 0x6D1F, //CJK UNIFIED IDEOGRAPH
+ 0x9BA3: 0x6D20, //CJK UNIFIED IDEOGRAPH
+ 0x9BA4: 0x6D21, //CJK UNIFIED IDEOGRAPH
+ 0x9BA5: 0x6D22, //CJK UNIFIED IDEOGRAPH
+ 0x9BA6: 0x6D23, //CJK UNIFIED IDEOGRAPH
+ 0x9BA7: 0x6D24, //CJK UNIFIED IDEOGRAPH
+ 0x9BA8: 0x6D26, //CJK UNIFIED IDEOGRAPH
+ 0x9BA9: 0x6D28, //CJK UNIFIED IDEOGRAPH
+ 0x9BAA: 0x6D29, //CJK UNIFIED IDEOGRAPH
+ 0x9BAB: 0x6D2C, //CJK UNIFIED IDEOGRAPH
+ 0x9BAC: 0x6D2D, //CJK UNIFIED IDEOGRAPH
+ 0x9BAD: 0x6D2F, //CJK UNIFIED IDEOGRAPH
+ 0x9BAE: 0x6D30, //CJK UNIFIED IDEOGRAPH
+ 0x9BAF: 0x6D34, //CJK UNIFIED IDEOGRAPH
+ 0x9BB0: 0x6D36, //CJK UNIFIED IDEOGRAPH
+ 0x9BB1: 0x6D37, //CJK UNIFIED IDEOGRAPH
+ 0x9BB2: 0x6D38, //CJK UNIFIED IDEOGRAPH
+ 0x9BB3: 0x6D3A, //CJK UNIFIED IDEOGRAPH
+ 0x9BB4: 0x6D3F, //CJK UNIFIED IDEOGRAPH
+ 0x9BB5: 0x6D40, //CJK UNIFIED IDEOGRAPH
+ 0x9BB6: 0x6D42, //CJK UNIFIED IDEOGRAPH
+ 0x9BB7: 0x6D44, //CJK UNIFIED IDEOGRAPH
+ 0x9BB8: 0x6D49, //CJK UNIFIED IDEOGRAPH
+ 0x9BB9: 0x6D4C, //CJK UNIFIED IDEOGRAPH
+ 0x9BBA: 0x6D50, //CJK UNIFIED IDEOGRAPH
+ 0x9BBB: 0x6D55, //CJK UNIFIED IDEOGRAPH
+ 0x9BBC: 0x6D56, //CJK UNIFIED IDEOGRAPH
+ 0x9BBD: 0x6D57, //CJK UNIFIED IDEOGRAPH
+ 0x9BBE: 0x6D58, //CJK UNIFIED IDEOGRAPH
+ 0x9BBF: 0x6D5B, //CJK UNIFIED IDEOGRAPH
+ 0x9BC0: 0x6D5D, //CJK UNIFIED IDEOGRAPH
+ 0x9BC1: 0x6D5F, //CJK UNIFIED IDEOGRAPH
+ 0x9BC2: 0x6D61, //CJK UNIFIED IDEOGRAPH
+ 0x9BC3: 0x6D62, //CJK UNIFIED IDEOGRAPH
+ 0x9BC4: 0x6D64, //CJK UNIFIED IDEOGRAPH
+ 0x9BC5: 0x6D65, //CJK UNIFIED IDEOGRAPH
+ 0x9BC6: 0x6D67, //CJK UNIFIED IDEOGRAPH
+ 0x9BC7: 0x6D68, //CJK UNIFIED IDEOGRAPH
+ 0x9BC8: 0x6D6B, //CJK UNIFIED IDEOGRAPH
+ 0x9BC9: 0x6D6C, //CJK UNIFIED IDEOGRAPH
+ 0x9BCA: 0x6D6D, //CJK UNIFIED IDEOGRAPH
+ 0x9BCB: 0x6D70, //CJK UNIFIED IDEOGRAPH
+ 0x9BCC: 0x6D71, //CJK UNIFIED IDEOGRAPH
+ 0x9BCD: 0x6D72, //CJK UNIFIED IDEOGRAPH
+ 0x9BCE: 0x6D73, //CJK UNIFIED IDEOGRAPH
+ 0x9BCF: 0x6D75, //CJK UNIFIED IDEOGRAPH
+ 0x9BD0: 0x6D76, //CJK UNIFIED IDEOGRAPH
+ 0x9BD1: 0x6D79, //CJK UNIFIED IDEOGRAPH
+ 0x9BD2: 0x6D7A, //CJK UNIFIED IDEOGRAPH
+ 0x9BD3: 0x6D7B, //CJK UNIFIED IDEOGRAPH
+ 0x9BD4: 0x6D7D, //CJK UNIFIED IDEOGRAPH
+ 0x9BD5: 0x6D7E, //CJK UNIFIED IDEOGRAPH
+ 0x9BD6: 0x6D7F, //CJK UNIFIED IDEOGRAPH
+ 0x9BD7: 0x6D80, //CJK UNIFIED IDEOGRAPH
+ 0x9BD8: 0x6D81, //CJK UNIFIED IDEOGRAPH
+ 0x9BD9: 0x6D83, //CJK UNIFIED IDEOGRAPH
+ 0x9BDA: 0x6D84, //CJK UNIFIED IDEOGRAPH
+ 0x9BDB: 0x6D86, //CJK UNIFIED IDEOGRAPH
+ 0x9BDC: 0x6D87, //CJK UNIFIED IDEOGRAPH
+ 0x9BDD: 0x6D8A, //CJK UNIFIED IDEOGRAPH
+ 0x9BDE: 0x6D8B, //CJK UNIFIED IDEOGRAPH
+ 0x9BDF: 0x6D8D, //CJK UNIFIED IDEOGRAPH
+ 0x9BE0: 0x6D8F, //CJK UNIFIED IDEOGRAPH
+ 0x9BE1: 0x6D90, //CJK UNIFIED IDEOGRAPH
+ 0x9BE2: 0x6D92, //CJK UNIFIED IDEOGRAPH
+ 0x9BE3: 0x6D96, //CJK UNIFIED IDEOGRAPH
+ 0x9BE4: 0x6D97, //CJK UNIFIED IDEOGRAPH
+ 0x9BE5: 0x6D98, //CJK UNIFIED IDEOGRAPH
+ 0x9BE6: 0x6D99, //CJK UNIFIED IDEOGRAPH
+ 0x9BE7: 0x6D9A, //CJK UNIFIED IDEOGRAPH
+ 0x9BE8: 0x6D9C, //CJK UNIFIED IDEOGRAPH
+ 0x9BE9: 0x6DA2, //CJK UNIFIED IDEOGRAPH
+ 0x9BEA: 0x6DA5, //CJK UNIFIED IDEOGRAPH
+ 0x9BEB: 0x6DAC, //CJK UNIFIED IDEOGRAPH
+ 0x9BEC: 0x6DAD, //CJK UNIFIED IDEOGRAPH
+ 0x9BED: 0x6DB0, //CJK UNIFIED IDEOGRAPH
+ 0x9BEE: 0x6DB1, //CJK UNIFIED IDEOGRAPH
+ 0x9BEF: 0x6DB3, //CJK UNIFIED IDEOGRAPH
+ 0x9BF0: 0x6DB4, //CJK UNIFIED IDEOGRAPH
+ 0x9BF1: 0x6DB6, //CJK UNIFIED IDEOGRAPH
+ 0x9BF2: 0x6DB7, //CJK UNIFIED IDEOGRAPH
+ 0x9BF3: 0x6DB9, //CJK UNIFIED IDEOGRAPH
+ 0x9BF4: 0x6DBA, //CJK UNIFIED IDEOGRAPH
+ 0x9BF5: 0x6DBB, //CJK UNIFIED IDEOGRAPH
+ 0x9BF6: 0x6DBC, //CJK UNIFIED IDEOGRAPH
+ 0x9BF7: 0x6DBD, //CJK UNIFIED IDEOGRAPH
+ 0x9BF8: 0x6DBE, //CJK UNIFIED IDEOGRAPH
+ 0x9BF9: 0x6DC1, //CJK UNIFIED IDEOGRAPH
+ 0x9BFA: 0x6DC2, //CJK UNIFIED IDEOGRAPH
+ 0x9BFB: 0x6DC3, //CJK UNIFIED IDEOGRAPH
+ 0x9BFC: 0x6DC8, //CJK UNIFIED IDEOGRAPH
+ 0x9BFD: 0x6DC9, //CJK UNIFIED IDEOGRAPH
+ 0x9BFE: 0x6DCA, //CJK UNIFIED IDEOGRAPH
+ 0x9C40: 0x6DCD, //CJK UNIFIED IDEOGRAPH
+ 0x9C41: 0x6DCE, //CJK UNIFIED IDEOGRAPH
+ 0x9C42: 0x6DCF, //CJK UNIFIED IDEOGRAPH
+ 0x9C43: 0x6DD0, //CJK UNIFIED IDEOGRAPH
+ 0x9C44: 0x6DD2, //CJK UNIFIED IDEOGRAPH
+ 0x9C45: 0x6DD3, //CJK UNIFIED IDEOGRAPH
+ 0x9C46: 0x6DD4, //CJK UNIFIED IDEOGRAPH
+ 0x9C47: 0x6DD5, //CJK UNIFIED IDEOGRAPH
+ 0x9C48: 0x6DD7, //CJK UNIFIED IDEOGRAPH
+ 0x9C49: 0x6DDA, //CJK UNIFIED IDEOGRAPH
+ 0x9C4A: 0x6DDB, //CJK UNIFIED IDEOGRAPH
+ 0x9C4B: 0x6DDC, //CJK UNIFIED IDEOGRAPH
+ 0x9C4C: 0x6DDF, //CJK UNIFIED IDEOGRAPH
+ 0x9C4D: 0x6DE2, //CJK UNIFIED IDEOGRAPH
+ 0x9C4E: 0x6DE3, //CJK UNIFIED IDEOGRAPH
+ 0x9C4F: 0x6DE5, //CJK UNIFIED IDEOGRAPH
+ 0x9C50: 0x6DE7, //CJK UNIFIED IDEOGRAPH
+ 0x9C51: 0x6DE8, //CJK UNIFIED IDEOGRAPH
+ 0x9C52: 0x6DE9, //CJK UNIFIED IDEOGRAPH
+ 0x9C53: 0x6DEA, //CJK UNIFIED IDEOGRAPH
+ 0x9C54: 0x6DED, //CJK UNIFIED IDEOGRAPH
+ 0x9C55: 0x6DEF, //CJK UNIFIED IDEOGRAPH
+ 0x9C56: 0x6DF0, //CJK UNIFIED IDEOGRAPH
+ 0x9C57: 0x6DF2, //CJK UNIFIED IDEOGRAPH
+ 0x9C58: 0x6DF4, //CJK UNIFIED IDEOGRAPH
+ 0x9C59: 0x6DF5, //CJK UNIFIED IDEOGRAPH
+ 0x9C5A: 0x6DF6, //CJK UNIFIED IDEOGRAPH
+ 0x9C5B: 0x6DF8, //CJK UNIFIED IDEOGRAPH
+ 0x9C5C: 0x6DFA, //CJK UNIFIED IDEOGRAPH
+ 0x9C5D: 0x6DFD, //CJK UNIFIED IDEOGRAPH
+ 0x9C5E: 0x6DFE, //CJK UNIFIED IDEOGRAPH
+ 0x9C5F: 0x6DFF, //CJK UNIFIED IDEOGRAPH
+ 0x9C60: 0x6E00, //CJK UNIFIED IDEOGRAPH
+ 0x9C61: 0x6E01, //CJK UNIFIED IDEOGRAPH
+ 0x9C62: 0x6E02, //CJK UNIFIED IDEOGRAPH
+ 0x9C63: 0x6E03, //CJK UNIFIED IDEOGRAPH
+ 0x9C64: 0x6E04, //CJK UNIFIED IDEOGRAPH
+ 0x9C65: 0x6E06, //CJK UNIFIED IDEOGRAPH
+ 0x9C66: 0x6E07, //CJK UNIFIED IDEOGRAPH
+ 0x9C67: 0x6E08, //CJK UNIFIED IDEOGRAPH
+ 0x9C68: 0x6E09, //CJK UNIFIED IDEOGRAPH
+ 0x9C69: 0x6E0B, //CJK UNIFIED IDEOGRAPH
+ 0x9C6A: 0x6E0F, //CJK UNIFIED IDEOGRAPH
+ 0x9C6B: 0x6E12, //CJK UNIFIED IDEOGRAPH
+ 0x9C6C: 0x6E13, //CJK UNIFIED IDEOGRAPH
+ 0x9C6D: 0x6E15, //CJK UNIFIED IDEOGRAPH
+ 0x9C6E: 0x6E18, //CJK UNIFIED IDEOGRAPH
+ 0x9C6F: 0x6E19, //CJK UNIFIED IDEOGRAPH
+ 0x9C70: 0x6E1B, //CJK UNIFIED IDEOGRAPH
+ 0x9C71: 0x6E1C, //CJK UNIFIED IDEOGRAPH
+ 0x9C72: 0x6E1E, //CJK UNIFIED IDEOGRAPH
+ 0x9C73: 0x6E1F, //CJK UNIFIED IDEOGRAPH
+ 0x9C74: 0x6E22, //CJK UNIFIED IDEOGRAPH
+ 0x9C75: 0x6E26, //CJK UNIFIED IDEOGRAPH
+ 0x9C76: 0x6E27, //CJK UNIFIED IDEOGRAPH
+ 0x9C77: 0x6E28, //CJK UNIFIED IDEOGRAPH
+ 0x9C78: 0x6E2A, //CJK UNIFIED IDEOGRAPH
+ 0x9C79: 0x6E2C, //CJK UNIFIED IDEOGRAPH
+ 0x9C7A: 0x6E2E, //CJK UNIFIED IDEOGRAPH
+ 0x9C7B: 0x6E30, //CJK UNIFIED IDEOGRAPH
+ 0x9C7C: 0x6E31, //CJK UNIFIED IDEOGRAPH
+ 0x9C7D: 0x6E33, //CJK UNIFIED IDEOGRAPH
+ 0x9C7E: 0x6E35, //CJK UNIFIED IDEOGRAPH
+ 0x9C80: 0x6E36, //CJK UNIFIED IDEOGRAPH
+ 0x9C81: 0x6E37, //CJK UNIFIED IDEOGRAPH
+ 0x9C82: 0x6E39, //CJK UNIFIED IDEOGRAPH
+ 0x9C83: 0x6E3B, //CJK UNIFIED IDEOGRAPH
+ 0x9C84: 0x6E3C, //CJK UNIFIED IDEOGRAPH
+ 0x9C85: 0x6E3D, //CJK UNIFIED IDEOGRAPH
+ 0x9C86: 0x6E3E, //CJK UNIFIED IDEOGRAPH
+ 0x9C87: 0x6E3F, //CJK UNIFIED IDEOGRAPH
+ 0x9C88: 0x6E40, //CJK UNIFIED IDEOGRAPH
+ 0x9C89: 0x6E41, //CJK UNIFIED IDEOGRAPH
+ 0x9C8A: 0x6E42, //CJK UNIFIED IDEOGRAPH
+ 0x9C8B: 0x6E45, //CJK UNIFIED IDEOGRAPH
+ 0x9C8C: 0x6E46, //CJK UNIFIED IDEOGRAPH
+ 0x9C8D: 0x6E47, //CJK UNIFIED IDEOGRAPH
+ 0x9C8E: 0x6E48, //CJK UNIFIED IDEOGRAPH
+ 0x9C8F: 0x6E49, //CJK UNIFIED IDEOGRAPH
+ 0x9C90: 0x6E4A, //CJK UNIFIED IDEOGRAPH
+ 0x9C91: 0x6E4B, //CJK UNIFIED IDEOGRAPH
+ 0x9C92: 0x6E4C, //CJK UNIFIED IDEOGRAPH
+ 0x9C93: 0x6E4F, //CJK UNIFIED IDEOGRAPH
+ 0x9C94: 0x6E50, //CJK UNIFIED IDEOGRAPH
+ 0x9C95: 0x6E51, //CJK UNIFIED IDEOGRAPH
+ 0x9C96: 0x6E52, //CJK UNIFIED IDEOGRAPH
+ 0x9C97: 0x6E55, //CJK UNIFIED IDEOGRAPH
+ 0x9C98: 0x6E57, //CJK UNIFIED IDEOGRAPH
+ 0x9C99: 0x6E59, //CJK UNIFIED IDEOGRAPH
+ 0x9C9A: 0x6E5A, //CJK UNIFIED IDEOGRAPH
+ 0x9C9B: 0x6E5C, //CJK UNIFIED IDEOGRAPH
+ 0x9C9C: 0x6E5D, //CJK UNIFIED IDEOGRAPH
+ 0x9C9D: 0x6E5E, //CJK UNIFIED IDEOGRAPH
+ 0x9C9E: 0x6E60, //CJK UNIFIED IDEOGRAPH
+ 0x9C9F: 0x6E61, //CJK UNIFIED IDEOGRAPH
+ 0x9CA0: 0x6E62, //CJK UNIFIED IDEOGRAPH
+ 0x9CA1: 0x6E63, //CJK UNIFIED IDEOGRAPH
+ 0x9CA2: 0x6E64, //CJK UNIFIED IDEOGRAPH
+ 0x9CA3: 0x6E65, //CJK UNIFIED IDEOGRAPH
+ 0x9CA4: 0x6E66, //CJK UNIFIED IDEOGRAPH
+ 0x9CA5: 0x6E67, //CJK UNIFIED IDEOGRAPH
+ 0x9CA6: 0x6E68, //CJK UNIFIED IDEOGRAPH
+ 0x9CA7: 0x6E69, //CJK UNIFIED IDEOGRAPH
+ 0x9CA8: 0x6E6A, //CJK UNIFIED IDEOGRAPH
+ 0x9CA9: 0x6E6C, //CJK UNIFIED IDEOGRAPH
+ 0x9CAA: 0x6E6D, //CJK UNIFIED IDEOGRAPH
+ 0x9CAB: 0x6E6F, //CJK UNIFIED IDEOGRAPH
+ 0x9CAC: 0x6E70, //CJK UNIFIED IDEOGRAPH
+ 0x9CAD: 0x6E71, //CJK UNIFIED IDEOGRAPH
+ 0x9CAE: 0x6E72, //CJK UNIFIED IDEOGRAPH
+ 0x9CAF: 0x6E73, //CJK UNIFIED IDEOGRAPH
+ 0x9CB0: 0x6E74, //CJK UNIFIED IDEOGRAPH
+ 0x9CB1: 0x6E75, //CJK UNIFIED IDEOGRAPH
+ 0x9CB2: 0x6E76, //CJK UNIFIED IDEOGRAPH
+ 0x9CB3: 0x6E77, //CJK UNIFIED IDEOGRAPH
+ 0x9CB4: 0x6E78, //CJK UNIFIED IDEOGRAPH
+ 0x9CB5: 0x6E79, //CJK UNIFIED IDEOGRAPH
+ 0x9CB6: 0x6E7A, //CJK UNIFIED IDEOGRAPH
+ 0x9CB7: 0x6E7B, //CJK UNIFIED IDEOGRAPH
+ 0x9CB8: 0x6E7C, //CJK UNIFIED IDEOGRAPH
+ 0x9CB9: 0x6E7D, //CJK UNIFIED IDEOGRAPH
+ 0x9CBA: 0x6E80, //CJK UNIFIED IDEOGRAPH
+ 0x9CBB: 0x6E81, //CJK UNIFIED IDEOGRAPH
+ 0x9CBC: 0x6E82, //CJK UNIFIED IDEOGRAPH
+ 0x9CBD: 0x6E84, //CJK UNIFIED IDEOGRAPH
+ 0x9CBE: 0x6E87, //CJK UNIFIED IDEOGRAPH
+ 0x9CBF: 0x6E88, //CJK UNIFIED IDEOGRAPH
+ 0x9CC0: 0x6E8A, //CJK UNIFIED IDEOGRAPH
+ 0x9CC1: 0x6E8B, //CJK UNIFIED IDEOGRAPH
+ 0x9CC2: 0x6E8C, //CJK UNIFIED IDEOGRAPH
+ 0x9CC3: 0x6E8D, //CJK UNIFIED IDEOGRAPH
+ 0x9CC4: 0x6E8E, //CJK UNIFIED IDEOGRAPH
+ 0x9CC5: 0x6E91, //CJK UNIFIED IDEOGRAPH
+ 0x9CC6: 0x6E92, //CJK UNIFIED IDEOGRAPH
+ 0x9CC7: 0x6E93, //CJK UNIFIED IDEOGRAPH
+ 0x9CC8: 0x6E94, //CJK UNIFIED IDEOGRAPH
+ 0x9CC9: 0x6E95, //CJK UNIFIED IDEOGRAPH
+ 0x9CCA: 0x6E96, //CJK UNIFIED IDEOGRAPH
+ 0x9CCB: 0x6E97, //CJK UNIFIED IDEOGRAPH
+ 0x9CCC: 0x6E99, //CJK UNIFIED IDEOGRAPH
+ 0x9CCD: 0x6E9A, //CJK UNIFIED IDEOGRAPH
+ 0x9CCE: 0x6E9B, //CJK UNIFIED IDEOGRAPH
+ 0x9CCF: 0x6E9D, //CJK UNIFIED IDEOGRAPH
+ 0x9CD0: 0x6E9E, //CJK UNIFIED IDEOGRAPH
+ 0x9CD1: 0x6EA0, //CJK UNIFIED IDEOGRAPH
+ 0x9CD2: 0x6EA1, //CJK UNIFIED IDEOGRAPH
+ 0x9CD3: 0x6EA3, //CJK UNIFIED IDEOGRAPH
+ 0x9CD4: 0x6EA4, //CJK UNIFIED IDEOGRAPH
+ 0x9CD5: 0x6EA6, //CJK UNIFIED IDEOGRAPH
+ 0x9CD6: 0x6EA8, //CJK UNIFIED IDEOGRAPH
+ 0x9CD7: 0x6EA9, //CJK UNIFIED IDEOGRAPH
+ 0x9CD8: 0x6EAB, //CJK UNIFIED IDEOGRAPH
+ 0x9CD9: 0x6EAC, //CJK UNIFIED IDEOGRAPH
+ 0x9CDA: 0x6EAD, //CJK UNIFIED IDEOGRAPH
+ 0x9CDB: 0x6EAE, //CJK UNIFIED IDEOGRAPH
+ 0x9CDC: 0x6EB0, //CJK UNIFIED IDEOGRAPH
+ 0x9CDD: 0x6EB3, //CJK UNIFIED IDEOGRAPH
+ 0x9CDE: 0x6EB5, //CJK UNIFIED IDEOGRAPH
+ 0x9CDF: 0x6EB8, //CJK UNIFIED IDEOGRAPH
+ 0x9CE0: 0x6EB9, //CJK UNIFIED IDEOGRAPH
+ 0x9CE1: 0x6EBC, //CJK UNIFIED IDEOGRAPH
+ 0x9CE2: 0x6EBE, //CJK UNIFIED IDEOGRAPH
+ 0x9CE3: 0x6EBF, //CJK UNIFIED IDEOGRAPH
+ 0x9CE4: 0x6EC0, //CJK UNIFIED IDEOGRAPH
+ 0x9CE5: 0x6EC3, //CJK UNIFIED IDEOGRAPH
+ 0x9CE6: 0x6EC4, //CJK UNIFIED IDEOGRAPH
+ 0x9CE7: 0x6EC5, //CJK UNIFIED IDEOGRAPH
+ 0x9CE8: 0x6EC6, //CJK UNIFIED IDEOGRAPH
+ 0x9CE9: 0x6EC8, //CJK UNIFIED IDEOGRAPH
+ 0x9CEA: 0x6EC9, //CJK UNIFIED IDEOGRAPH
+ 0x9CEB: 0x6ECA, //CJK UNIFIED IDEOGRAPH
+ 0x9CEC: 0x6ECC, //CJK UNIFIED IDEOGRAPH
+ 0x9CED: 0x6ECD, //CJK UNIFIED IDEOGRAPH
+ 0x9CEE: 0x6ECE, //CJK UNIFIED IDEOGRAPH
+ 0x9CEF: 0x6ED0, //CJK UNIFIED IDEOGRAPH
+ 0x9CF0: 0x6ED2, //CJK UNIFIED IDEOGRAPH
+ 0x9CF1: 0x6ED6, //CJK UNIFIED IDEOGRAPH
+ 0x9CF2: 0x6ED8, //CJK UNIFIED IDEOGRAPH
+ 0x9CF3: 0x6ED9, //CJK UNIFIED IDEOGRAPH
+ 0x9CF4: 0x6EDB, //CJK UNIFIED IDEOGRAPH
+ 0x9CF5: 0x6EDC, //CJK UNIFIED IDEOGRAPH
+ 0x9CF6: 0x6EDD, //CJK UNIFIED IDEOGRAPH
+ 0x9CF7: 0x6EE3, //CJK UNIFIED IDEOGRAPH
+ 0x9CF8: 0x6EE7, //CJK UNIFIED IDEOGRAPH
+ 0x9CF9: 0x6EEA, //CJK UNIFIED IDEOGRAPH
+ 0x9CFA: 0x6EEB, //CJK UNIFIED IDEOGRAPH
+ 0x9CFB: 0x6EEC, //CJK UNIFIED IDEOGRAPH
+ 0x9CFC: 0x6EED, //CJK UNIFIED IDEOGRAPH
+ 0x9CFD: 0x6EEE, //CJK UNIFIED IDEOGRAPH
+ 0x9CFE: 0x6EEF, //CJK UNIFIED IDEOGRAPH
+ 0x9D40: 0x6EF0, //CJK UNIFIED IDEOGRAPH
+ 0x9D41: 0x6EF1, //CJK UNIFIED IDEOGRAPH
+ 0x9D42: 0x6EF2, //CJK UNIFIED IDEOGRAPH
+ 0x9D43: 0x6EF3, //CJK UNIFIED IDEOGRAPH
+ 0x9D44: 0x6EF5, //CJK UNIFIED IDEOGRAPH
+ 0x9D45: 0x6EF6, //CJK UNIFIED IDEOGRAPH
+ 0x9D46: 0x6EF7, //CJK UNIFIED IDEOGRAPH
+ 0x9D47: 0x6EF8, //CJK UNIFIED IDEOGRAPH
+ 0x9D48: 0x6EFA, //CJK UNIFIED IDEOGRAPH
+ 0x9D49: 0x6EFB, //CJK UNIFIED IDEOGRAPH
+ 0x9D4A: 0x6EFC, //CJK UNIFIED IDEOGRAPH
+ 0x9D4B: 0x6EFD, //CJK UNIFIED IDEOGRAPH
+ 0x9D4C: 0x6EFE, //CJK UNIFIED IDEOGRAPH
+ 0x9D4D: 0x6EFF, //CJK UNIFIED IDEOGRAPH
+ 0x9D4E: 0x6F00, //CJK UNIFIED IDEOGRAPH
+ 0x9D4F: 0x6F01, //CJK UNIFIED IDEOGRAPH
+ 0x9D50: 0x6F03, //CJK UNIFIED IDEOGRAPH
+ 0x9D51: 0x6F04, //CJK UNIFIED IDEOGRAPH
+ 0x9D52: 0x6F05, //CJK UNIFIED IDEOGRAPH
+ 0x9D53: 0x6F07, //CJK UNIFIED IDEOGRAPH
+ 0x9D54: 0x6F08, //CJK UNIFIED IDEOGRAPH
+ 0x9D55: 0x6F0A, //CJK UNIFIED IDEOGRAPH
+ 0x9D56: 0x6F0B, //CJK UNIFIED IDEOGRAPH
+ 0x9D57: 0x6F0C, //CJK UNIFIED IDEOGRAPH
+ 0x9D58: 0x6F0D, //CJK UNIFIED IDEOGRAPH
+ 0x9D59: 0x6F0E, //CJK UNIFIED IDEOGRAPH
+ 0x9D5A: 0x6F10, //CJK UNIFIED IDEOGRAPH
+ 0x9D5B: 0x6F11, //CJK UNIFIED IDEOGRAPH
+ 0x9D5C: 0x6F12, //CJK UNIFIED IDEOGRAPH
+ 0x9D5D: 0x6F16, //CJK UNIFIED IDEOGRAPH
+ 0x9D5E: 0x6F17, //CJK UNIFIED IDEOGRAPH
+ 0x9D5F: 0x6F18, //CJK UNIFIED IDEOGRAPH
+ 0x9D60: 0x6F19, //CJK UNIFIED IDEOGRAPH
+ 0x9D61: 0x6F1A, //CJK UNIFIED IDEOGRAPH
+ 0x9D62: 0x6F1B, //CJK UNIFIED IDEOGRAPH
+ 0x9D63: 0x6F1C, //CJK UNIFIED IDEOGRAPH
+ 0x9D64: 0x6F1D, //CJK UNIFIED IDEOGRAPH
+ 0x9D65: 0x6F1E, //CJK UNIFIED IDEOGRAPH
+ 0x9D66: 0x6F1F, //CJK UNIFIED IDEOGRAPH
+ 0x9D67: 0x6F21, //CJK UNIFIED IDEOGRAPH
+ 0x9D68: 0x6F22, //CJK UNIFIED IDEOGRAPH
+ 0x9D69: 0x6F23, //CJK UNIFIED IDEOGRAPH
+ 0x9D6A: 0x6F25, //CJK UNIFIED IDEOGRAPH
+ 0x9D6B: 0x6F26, //CJK UNIFIED IDEOGRAPH
+ 0x9D6C: 0x6F27, //CJK UNIFIED IDEOGRAPH
+ 0x9D6D: 0x6F28, //CJK UNIFIED IDEOGRAPH
+ 0x9D6E: 0x6F2C, //CJK UNIFIED IDEOGRAPH
+ 0x9D6F: 0x6F2E, //CJK UNIFIED IDEOGRAPH
+ 0x9D70: 0x6F30, //CJK UNIFIED IDEOGRAPH
+ 0x9D71: 0x6F32, //CJK UNIFIED IDEOGRAPH
+ 0x9D72: 0x6F34, //CJK UNIFIED IDEOGRAPH
+ 0x9D73: 0x6F35, //CJK UNIFIED IDEOGRAPH
+ 0x9D74: 0x6F37, //CJK UNIFIED IDEOGRAPH
+ 0x9D75: 0x6F38, //CJK UNIFIED IDEOGRAPH
+ 0x9D76: 0x6F39, //CJK UNIFIED IDEOGRAPH
+ 0x9D77: 0x6F3A, //CJK UNIFIED IDEOGRAPH
+ 0x9D78: 0x6F3B, //CJK UNIFIED IDEOGRAPH
+ 0x9D79: 0x6F3C, //CJK UNIFIED IDEOGRAPH
+ 0x9D7A: 0x6F3D, //CJK UNIFIED IDEOGRAPH
+ 0x9D7B: 0x6F3F, //CJK UNIFIED IDEOGRAPH
+ 0x9D7C: 0x6F40, //CJK UNIFIED IDEOGRAPH
+ 0x9D7D: 0x6F41, //CJK UNIFIED IDEOGRAPH
+ 0x9D7E: 0x6F42, //CJK UNIFIED IDEOGRAPH
+ 0x9D80: 0x6F43, //CJK UNIFIED IDEOGRAPH
+ 0x9D81: 0x6F44, //CJK UNIFIED IDEOGRAPH
+ 0x9D82: 0x6F45, //CJK UNIFIED IDEOGRAPH
+ 0x9D83: 0x6F48, //CJK UNIFIED IDEOGRAPH
+ 0x9D84: 0x6F49, //CJK UNIFIED IDEOGRAPH
+ 0x9D85: 0x6F4A, //CJK UNIFIED IDEOGRAPH
+ 0x9D86: 0x6F4C, //CJK UNIFIED IDEOGRAPH
+ 0x9D87: 0x6F4E, //CJK UNIFIED IDEOGRAPH
+ 0x9D88: 0x6F4F, //CJK UNIFIED IDEOGRAPH
+ 0x9D89: 0x6F50, //CJK UNIFIED IDEOGRAPH
+ 0x9D8A: 0x6F51, //CJK UNIFIED IDEOGRAPH
+ 0x9D8B: 0x6F52, //CJK UNIFIED IDEOGRAPH
+ 0x9D8C: 0x6F53, //CJK UNIFIED IDEOGRAPH
+ 0x9D8D: 0x6F54, //CJK UNIFIED IDEOGRAPH
+ 0x9D8E: 0x6F55, //CJK UNIFIED IDEOGRAPH
+ 0x9D8F: 0x6F56, //CJK UNIFIED IDEOGRAPH
+ 0x9D90: 0x6F57, //CJK UNIFIED IDEOGRAPH
+ 0x9D91: 0x6F59, //CJK UNIFIED IDEOGRAPH
+ 0x9D92: 0x6F5A, //CJK UNIFIED IDEOGRAPH
+ 0x9D93: 0x6F5B, //CJK UNIFIED IDEOGRAPH
+ 0x9D94: 0x6F5D, //CJK UNIFIED IDEOGRAPH
+ 0x9D95: 0x6F5F, //CJK UNIFIED IDEOGRAPH
+ 0x9D96: 0x6F60, //CJK UNIFIED IDEOGRAPH
+ 0x9D97: 0x6F61, //CJK UNIFIED IDEOGRAPH
+ 0x9D98: 0x6F63, //CJK UNIFIED IDEOGRAPH
+ 0x9D99: 0x6F64, //CJK UNIFIED IDEOGRAPH
+ 0x9D9A: 0x6F65, //CJK UNIFIED IDEOGRAPH
+ 0x9D9B: 0x6F67, //CJK UNIFIED IDEOGRAPH
+ 0x9D9C: 0x6F68, //CJK UNIFIED IDEOGRAPH
+ 0x9D9D: 0x6F69, //CJK UNIFIED IDEOGRAPH
+ 0x9D9E: 0x6F6A, //CJK UNIFIED IDEOGRAPH
+ 0x9D9F: 0x6F6B, //CJK UNIFIED IDEOGRAPH
+ 0x9DA0: 0x6F6C, //CJK UNIFIED IDEOGRAPH
+ 0x9DA1: 0x6F6F, //CJK UNIFIED IDEOGRAPH
+ 0x9DA2: 0x6F70, //CJK UNIFIED IDEOGRAPH
+ 0x9DA3: 0x6F71, //CJK UNIFIED IDEOGRAPH
+ 0x9DA4: 0x6F73, //CJK UNIFIED IDEOGRAPH
+ 0x9DA5: 0x6F75, //CJK UNIFIED IDEOGRAPH
+ 0x9DA6: 0x6F76, //CJK UNIFIED IDEOGRAPH
+ 0x9DA7: 0x6F77, //CJK UNIFIED IDEOGRAPH
+ 0x9DA8: 0x6F79, //CJK UNIFIED IDEOGRAPH
+ 0x9DA9: 0x6F7B, //CJK UNIFIED IDEOGRAPH
+ 0x9DAA: 0x6F7D, //CJK UNIFIED IDEOGRAPH
+ 0x9DAB: 0x6F7E, //CJK UNIFIED IDEOGRAPH
+ 0x9DAC: 0x6F7F, //CJK UNIFIED IDEOGRAPH
+ 0x9DAD: 0x6F80, //CJK UNIFIED IDEOGRAPH
+ 0x9DAE: 0x6F81, //CJK UNIFIED IDEOGRAPH
+ 0x9DAF: 0x6F82, //CJK UNIFIED IDEOGRAPH
+ 0x9DB0: 0x6F83, //CJK UNIFIED IDEOGRAPH
+ 0x9DB1: 0x6F85, //CJK UNIFIED IDEOGRAPH
+ 0x9DB2: 0x6F86, //CJK UNIFIED IDEOGRAPH
+ 0x9DB3: 0x6F87, //CJK UNIFIED IDEOGRAPH
+ 0x9DB4: 0x6F8A, //CJK UNIFIED IDEOGRAPH
+ 0x9DB5: 0x6F8B, //CJK UNIFIED IDEOGRAPH
+ 0x9DB6: 0x6F8F, //CJK UNIFIED IDEOGRAPH
+ 0x9DB7: 0x6F90, //CJK UNIFIED IDEOGRAPH
+ 0x9DB8: 0x6F91, //CJK UNIFIED IDEOGRAPH
+ 0x9DB9: 0x6F92, //CJK UNIFIED IDEOGRAPH
+ 0x9DBA: 0x6F93, //CJK UNIFIED IDEOGRAPH
+ 0x9DBB: 0x6F94, //CJK UNIFIED IDEOGRAPH
+ 0x9DBC: 0x6F95, //CJK UNIFIED IDEOGRAPH
+ 0x9DBD: 0x6F96, //CJK UNIFIED IDEOGRAPH
+ 0x9DBE: 0x6F97, //CJK UNIFIED IDEOGRAPH
+ 0x9DBF: 0x6F98, //CJK UNIFIED IDEOGRAPH
+ 0x9DC0: 0x6F99, //CJK UNIFIED IDEOGRAPH
+ 0x9DC1: 0x6F9A, //CJK UNIFIED IDEOGRAPH
+ 0x9DC2: 0x6F9B, //CJK UNIFIED IDEOGRAPH
+ 0x9DC3: 0x6F9D, //CJK UNIFIED IDEOGRAPH
+ 0x9DC4: 0x6F9E, //CJK UNIFIED IDEOGRAPH
+ 0x9DC5: 0x6F9F, //CJK UNIFIED IDEOGRAPH
+ 0x9DC6: 0x6FA0, //CJK UNIFIED IDEOGRAPH
+ 0x9DC7: 0x6FA2, //CJK UNIFIED IDEOGRAPH
+ 0x9DC8: 0x6FA3, //CJK UNIFIED IDEOGRAPH
+ 0x9DC9: 0x6FA4, //CJK UNIFIED IDEOGRAPH
+ 0x9DCA: 0x6FA5, //CJK UNIFIED IDEOGRAPH
+ 0x9DCB: 0x6FA6, //CJK UNIFIED IDEOGRAPH
+ 0x9DCC: 0x6FA8, //CJK UNIFIED IDEOGRAPH
+ 0x9DCD: 0x6FA9, //CJK UNIFIED IDEOGRAPH
+ 0x9DCE: 0x6FAA, //CJK UNIFIED IDEOGRAPH
+ 0x9DCF: 0x6FAB, //CJK UNIFIED IDEOGRAPH
+ 0x9DD0: 0x6FAC, //CJK UNIFIED IDEOGRAPH
+ 0x9DD1: 0x6FAD, //CJK UNIFIED IDEOGRAPH
+ 0x9DD2: 0x6FAE, //CJK UNIFIED IDEOGRAPH
+ 0x9DD3: 0x6FAF, //CJK UNIFIED IDEOGRAPH
+ 0x9DD4: 0x6FB0, //CJK UNIFIED IDEOGRAPH
+ 0x9DD5: 0x6FB1, //CJK UNIFIED IDEOGRAPH
+ 0x9DD6: 0x6FB2, //CJK UNIFIED IDEOGRAPH
+ 0x9DD7: 0x6FB4, //CJK UNIFIED IDEOGRAPH
+ 0x9DD8: 0x6FB5, //CJK UNIFIED IDEOGRAPH
+ 0x9DD9: 0x6FB7, //CJK UNIFIED IDEOGRAPH
+ 0x9DDA: 0x6FB8, //CJK UNIFIED IDEOGRAPH
+ 0x9DDB: 0x6FBA, //CJK UNIFIED IDEOGRAPH
+ 0x9DDC: 0x6FBB, //CJK UNIFIED IDEOGRAPH
+ 0x9DDD: 0x6FBC, //CJK UNIFIED IDEOGRAPH
+ 0x9DDE: 0x6FBD, //CJK UNIFIED IDEOGRAPH
+ 0x9DDF: 0x6FBE, //CJK UNIFIED IDEOGRAPH
+ 0x9DE0: 0x6FBF, //CJK UNIFIED IDEOGRAPH
+ 0x9DE1: 0x6FC1, //CJK UNIFIED IDEOGRAPH
+ 0x9DE2: 0x6FC3, //CJK UNIFIED IDEOGRAPH
+ 0x9DE3: 0x6FC4, //CJK UNIFIED IDEOGRAPH
+ 0x9DE4: 0x6FC5, //CJK UNIFIED IDEOGRAPH
+ 0x9DE5: 0x6FC6, //CJK UNIFIED IDEOGRAPH
+ 0x9DE6: 0x6FC7, //CJK UNIFIED IDEOGRAPH
+ 0x9DE7: 0x6FC8, //CJK UNIFIED IDEOGRAPH
+ 0x9DE8: 0x6FCA, //CJK UNIFIED IDEOGRAPH
+ 0x9DE9: 0x6FCB, //CJK UNIFIED IDEOGRAPH
+ 0x9DEA: 0x6FCC, //CJK UNIFIED IDEOGRAPH
+ 0x9DEB: 0x6FCD, //CJK UNIFIED IDEOGRAPH
+ 0x9DEC: 0x6FCE, //CJK UNIFIED IDEOGRAPH
+ 0x9DED: 0x6FCF, //CJK UNIFIED IDEOGRAPH
+ 0x9DEE: 0x6FD0, //CJK UNIFIED IDEOGRAPH
+ 0x9DEF: 0x6FD3, //CJK UNIFIED IDEOGRAPH
+ 0x9DF0: 0x6FD4, //CJK UNIFIED IDEOGRAPH
+ 0x9DF1: 0x6FD5, //CJK UNIFIED IDEOGRAPH
+ 0x9DF2: 0x6FD6, //CJK UNIFIED IDEOGRAPH
+ 0x9DF3: 0x6FD7, //CJK UNIFIED IDEOGRAPH
+ 0x9DF4: 0x6FD8, //CJK UNIFIED IDEOGRAPH
+ 0x9DF5: 0x6FD9, //CJK UNIFIED IDEOGRAPH
+ 0x9DF6: 0x6FDA, //CJK UNIFIED IDEOGRAPH
+ 0x9DF7: 0x6FDB, //CJK UNIFIED IDEOGRAPH
+ 0x9DF8: 0x6FDC, //CJK UNIFIED IDEOGRAPH
+ 0x9DF9: 0x6FDD, //CJK UNIFIED IDEOGRAPH
+ 0x9DFA: 0x6FDF, //CJK UNIFIED IDEOGRAPH
+ 0x9DFB: 0x6FE2, //CJK UNIFIED IDEOGRAPH
+ 0x9DFC: 0x6FE3, //CJK UNIFIED IDEOGRAPH
+ 0x9DFD: 0x6FE4, //CJK UNIFIED IDEOGRAPH
+ 0x9DFE: 0x6FE5, //CJK UNIFIED IDEOGRAPH
+ 0x9E40: 0x6FE6, //CJK UNIFIED IDEOGRAPH
+ 0x9E41: 0x6FE7, //CJK UNIFIED IDEOGRAPH
+ 0x9E42: 0x6FE8, //CJK UNIFIED IDEOGRAPH
+ 0x9E43: 0x6FE9, //CJK UNIFIED IDEOGRAPH
+ 0x9E44: 0x6FEA, //CJK UNIFIED IDEOGRAPH
+ 0x9E45: 0x6FEB, //CJK UNIFIED IDEOGRAPH
+ 0x9E46: 0x6FEC, //CJK UNIFIED IDEOGRAPH
+ 0x9E47: 0x6FED, //CJK UNIFIED IDEOGRAPH
+ 0x9E48: 0x6FF0, //CJK UNIFIED IDEOGRAPH
+ 0x9E49: 0x6FF1, //CJK UNIFIED IDEOGRAPH
+ 0x9E4A: 0x6FF2, //CJK UNIFIED IDEOGRAPH
+ 0x9E4B: 0x6FF3, //CJK UNIFIED IDEOGRAPH
+ 0x9E4C: 0x6FF4, //CJK UNIFIED IDEOGRAPH
+ 0x9E4D: 0x6FF5, //CJK UNIFIED IDEOGRAPH
+ 0x9E4E: 0x6FF6, //CJK UNIFIED IDEOGRAPH
+ 0x9E4F: 0x6FF7, //CJK UNIFIED IDEOGRAPH
+ 0x9E50: 0x6FF8, //CJK UNIFIED IDEOGRAPH
+ 0x9E51: 0x6FF9, //CJK UNIFIED IDEOGRAPH
+ 0x9E52: 0x6FFA, //CJK UNIFIED IDEOGRAPH
+ 0x9E53: 0x6FFB, //CJK UNIFIED IDEOGRAPH
+ 0x9E54: 0x6FFC, //CJK UNIFIED IDEOGRAPH
+ 0x9E55: 0x6FFD, //CJK UNIFIED IDEOGRAPH
+ 0x9E56: 0x6FFE, //CJK UNIFIED IDEOGRAPH
+ 0x9E57: 0x6FFF, //CJK UNIFIED IDEOGRAPH
+ 0x9E58: 0x7000, //CJK UNIFIED IDEOGRAPH
+ 0x9E59: 0x7001, //CJK UNIFIED IDEOGRAPH
+ 0x9E5A: 0x7002, //CJK UNIFIED IDEOGRAPH
+ 0x9E5B: 0x7003, //CJK UNIFIED IDEOGRAPH
+ 0x9E5C: 0x7004, //CJK UNIFIED IDEOGRAPH
+ 0x9E5D: 0x7005, //CJK UNIFIED IDEOGRAPH
+ 0x9E5E: 0x7006, //CJK UNIFIED IDEOGRAPH
+ 0x9E5F: 0x7007, //CJK UNIFIED IDEOGRAPH
+ 0x9E60: 0x7008, //CJK UNIFIED IDEOGRAPH
+ 0x9E61: 0x7009, //CJK UNIFIED IDEOGRAPH
+ 0x9E62: 0x700A, //CJK UNIFIED IDEOGRAPH
+ 0x9E63: 0x700B, //CJK UNIFIED IDEOGRAPH
+ 0x9E64: 0x700C, //CJK UNIFIED IDEOGRAPH
+ 0x9E65: 0x700D, //CJK UNIFIED IDEOGRAPH
+ 0x9E66: 0x700E, //CJK UNIFIED IDEOGRAPH
+ 0x9E67: 0x700F, //CJK UNIFIED IDEOGRAPH
+ 0x9E68: 0x7010, //CJK UNIFIED IDEOGRAPH
+ 0x9E69: 0x7012, //CJK UNIFIED IDEOGRAPH
+ 0x9E6A: 0x7013, //CJK UNIFIED IDEOGRAPH
+ 0x9E6B: 0x7014, //CJK UNIFIED IDEOGRAPH
+ 0x9E6C: 0x7015, //CJK UNIFIED IDEOGRAPH
+ 0x9E6D: 0x7016, //CJK UNIFIED IDEOGRAPH
+ 0x9E6E: 0x7017, //CJK UNIFIED IDEOGRAPH
+ 0x9E6F: 0x7018, //CJK UNIFIED IDEOGRAPH
+ 0x9E70: 0x7019, //CJK UNIFIED IDEOGRAPH
+ 0x9E71: 0x701C, //CJK UNIFIED IDEOGRAPH
+ 0x9E72: 0x701D, //CJK UNIFIED IDEOGRAPH
+ 0x9E73: 0x701E, //CJK UNIFIED IDEOGRAPH
+ 0x9E74: 0x701F, //CJK UNIFIED IDEOGRAPH
+ 0x9E75: 0x7020, //CJK UNIFIED IDEOGRAPH
+ 0x9E76: 0x7021, //CJK UNIFIED IDEOGRAPH
+ 0x9E77: 0x7022, //CJK UNIFIED IDEOGRAPH
+ 0x9E78: 0x7024, //CJK UNIFIED IDEOGRAPH
+ 0x9E79: 0x7025, //CJK UNIFIED IDEOGRAPH
+ 0x9E7A: 0x7026, //CJK UNIFIED IDEOGRAPH
+ 0x9E7B: 0x7027, //CJK UNIFIED IDEOGRAPH
+ 0x9E7C: 0x7028, //CJK UNIFIED IDEOGRAPH
+ 0x9E7D: 0x7029, //CJK UNIFIED IDEOGRAPH
+ 0x9E7E: 0x702A, //CJK UNIFIED IDEOGRAPH
+ 0x9E80: 0x702B, //CJK UNIFIED IDEOGRAPH
+ 0x9E81: 0x702C, //CJK UNIFIED IDEOGRAPH
+ 0x9E82: 0x702D, //CJK UNIFIED IDEOGRAPH
+ 0x9E83: 0x702E, //CJK UNIFIED IDEOGRAPH
+ 0x9E84: 0x702F, //CJK UNIFIED IDEOGRAPH
+ 0x9E85: 0x7030, //CJK UNIFIED IDEOGRAPH
+ 0x9E86: 0x7031, //CJK UNIFIED IDEOGRAPH
+ 0x9E87: 0x7032, //CJK UNIFIED IDEOGRAPH
+ 0x9E88: 0x7033, //CJK UNIFIED IDEOGRAPH
+ 0x9E89: 0x7034, //CJK UNIFIED IDEOGRAPH
+ 0x9E8A: 0x7036, //CJK UNIFIED IDEOGRAPH
+ 0x9E8B: 0x7037, //CJK UNIFIED IDEOGRAPH
+ 0x9E8C: 0x7038, //CJK UNIFIED IDEOGRAPH
+ 0x9E8D: 0x703A, //CJK UNIFIED IDEOGRAPH
+ 0x9E8E: 0x703B, //CJK UNIFIED IDEOGRAPH
+ 0x9E8F: 0x703C, //CJK UNIFIED IDEOGRAPH
+ 0x9E90: 0x703D, //CJK UNIFIED IDEOGRAPH
+ 0x9E91: 0x703E, //CJK UNIFIED IDEOGRAPH
+ 0x9E92: 0x703F, //CJK UNIFIED IDEOGRAPH
+ 0x9E93: 0x7040, //CJK UNIFIED IDEOGRAPH
+ 0x9E94: 0x7041, //CJK UNIFIED IDEOGRAPH
+ 0x9E95: 0x7042, //CJK UNIFIED IDEOGRAPH
+ 0x9E96: 0x7043, //CJK UNIFIED IDEOGRAPH
+ 0x9E97: 0x7044, //CJK UNIFIED IDEOGRAPH
+ 0x9E98: 0x7045, //CJK UNIFIED IDEOGRAPH
+ 0x9E99: 0x7046, //CJK UNIFIED IDEOGRAPH
+ 0x9E9A: 0x7047, //CJK UNIFIED IDEOGRAPH
+ 0x9E9B: 0x7048, //CJK UNIFIED IDEOGRAPH
+ 0x9E9C: 0x7049, //CJK UNIFIED IDEOGRAPH
+ 0x9E9D: 0x704A, //CJK UNIFIED IDEOGRAPH
+ 0x9E9E: 0x704B, //CJK UNIFIED IDEOGRAPH
+ 0x9E9F: 0x704D, //CJK UNIFIED IDEOGRAPH
+ 0x9EA0: 0x704E, //CJK UNIFIED IDEOGRAPH
+ 0x9EA1: 0x7050, //CJK UNIFIED IDEOGRAPH
+ 0x9EA2: 0x7051, //CJK UNIFIED IDEOGRAPH
+ 0x9EA3: 0x7052, //CJK UNIFIED IDEOGRAPH
+ 0x9EA4: 0x7053, //CJK UNIFIED IDEOGRAPH
+ 0x9EA5: 0x7054, //CJK UNIFIED IDEOGRAPH
+ 0x9EA6: 0x7055, //CJK UNIFIED IDEOGRAPH
+ 0x9EA7: 0x7056, //CJK UNIFIED IDEOGRAPH
+ 0x9EA8: 0x7057, //CJK UNIFIED IDEOGRAPH
+ 0x9EA9: 0x7058, //CJK UNIFIED IDEOGRAPH
+ 0x9EAA: 0x7059, //CJK UNIFIED IDEOGRAPH
+ 0x9EAB: 0x705A, //CJK UNIFIED IDEOGRAPH
+ 0x9EAC: 0x705B, //CJK UNIFIED IDEOGRAPH
+ 0x9EAD: 0x705C, //CJK UNIFIED IDEOGRAPH
+ 0x9EAE: 0x705D, //CJK UNIFIED IDEOGRAPH
+ 0x9EAF: 0x705F, //CJK UNIFIED IDEOGRAPH
+ 0x9EB0: 0x7060, //CJK UNIFIED IDEOGRAPH
+ 0x9EB1: 0x7061, //CJK UNIFIED IDEOGRAPH
+ 0x9EB2: 0x7062, //CJK UNIFIED IDEOGRAPH
+ 0x9EB3: 0x7063, //CJK UNIFIED IDEOGRAPH
+ 0x9EB4: 0x7064, //CJK UNIFIED IDEOGRAPH
+ 0x9EB5: 0x7065, //CJK UNIFIED IDEOGRAPH
+ 0x9EB6: 0x7066, //CJK UNIFIED IDEOGRAPH
+ 0x9EB7: 0x7067, //CJK UNIFIED IDEOGRAPH
+ 0x9EB8: 0x7068, //CJK UNIFIED IDEOGRAPH
+ 0x9EB9: 0x7069, //CJK UNIFIED IDEOGRAPH
+ 0x9EBA: 0x706A, //CJK UNIFIED IDEOGRAPH
+ 0x9EBB: 0x706E, //CJK UNIFIED IDEOGRAPH
+ 0x9EBC: 0x7071, //CJK UNIFIED IDEOGRAPH
+ 0x9EBD: 0x7072, //CJK UNIFIED IDEOGRAPH
+ 0x9EBE: 0x7073, //CJK UNIFIED IDEOGRAPH
+ 0x9EBF: 0x7074, //CJK UNIFIED IDEOGRAPH
+ 0x9EC0: 0x7077, //CJK UNIFIED IDEOGRAPH
+ 0x9EC1: 0x7079, //CJK UNIFIED IDEOGRAPH
+ 0x9EC2: 0x707A, //CJK UNIFIED IDEOGRAPH
+ 0x9EC3: 0x707B, //CJK UNIFIED IDEOGRAPH
+ 0x9EC4: 0x707D, //CJK UNIFIED IDEOGRAPH
+ 0x9EC5: 0x7081, //CJK UNIFIED IDEOGRAPH
+ 0x9EC6: 0x7082, //CJK UNIFIED IDEOGRAPH
+ 0x9EC7: 0x7083, //CJK UNIFIED IDEOGRAPH
+ 0x9EC8: 0x7084, //CJK UNIFIED IDEOGRAPH
+ 0x9EC9: 0x7086, //CJK UNIFIED IDEOGRAPH
+ 0x9ECA: 0x7087, //CJK UNIFIED IDEOGRAPH
+ 0x9ECB: 0x7088, //CJK UNIFIED IDEOGRAPH
+ 0x9ECC: 0x708B, //CJK UNIFIED IDEOGRAPH
+ 0x9ECD: 0x708C, //CJK UNIFIED IDEOGRAPH
+ 0x9ECE: 0x708D, //CJK UNIFIED IDEOGRAPH
+ 0x9ECF: 0x708F, //CJK UNIFIED IDEOGRAPH
+ 0x9ED0: 0x7090, //CJK UNIFIED IDEOGRAPH
+ 0x9ED1: 0x7091, //CJK UNIFIED IDEOGRAPH
+ 0x9ED2: 0x7093, //CJK UNIFIED IDEOGRAPH
+ 0x9ED3: 0x7097, //CJK UNIFIED IDEOGRAPH
+ 0x9ED4: 0x7098, //CJK UNIFIED IDEOGRAPH
+ 0x9ED5: 0x709A, //CJK UNIFIED IDEOGRAPH
+ 0x9ED6: 0x709B, //CJK UNIFIED IDEOGRAPH
+ 0x9ED7: 0x709E, //CJK UNIFIED IDEOGRAPH
+ 0x9ED8: 0x709F, //CJK UNIFIED IDEOGRAPH
+ 0x9ED9: 0x70A0, //CJK UNIFIED IDEOGRAPH
+ 0x9EDA: 0x70A1, //CJK UNIFIED IDEOGRAPH
+ 0x9EDB: 0x70A2, //CJK UNIFIED IDEOGRAPH
+ 0x9EDC: 0x70A3, //CJK UNIFIED IDEOGRAPH
+ 0x9EDD: 0x70A4, //CJK UNIFIED IDEOGRAPH
+ 0x9EDE: 0x70A5, //CJK UNIFIED IDEOGRAPH
+ 0x9EDF: 0x70A6, //CJK UNIFIED IDEOGRAPH
+ 0x9EE0: 0x70A7, //CJK UNIFIED IDEOGRAPH
+ 0x9EE1: 0x70A8, //CJK UNIFIED IDEOGRAPH
+ 0x9EE2: 0x70A9, //CJK UNIFIED IDEOGRAPH
+ 0x9EE3: 0x70AA, //CJK UNIFIED IDEOGRAPH
+ 0x9EE4: 0x70B0, //CJK UNIFIED IDEOGRAPH
+ 0x9EE5: 0x70B2, //CJK UNIFIED IDEOGRAPH
+ 0x9EE6: 0x70B4, //CJK UNIFIED IDEOGRAPH
+ 0x9EE7: 0x70B5, //CJK UNIFIED IDEOGRAPH
+ 0x9EE8: 0x70B6, //CJK UNIFIED IDEOGRAPH
+ 0x9EE9: 0x70BA, //CJK UNIFIED IDEOGRAPH
+ 0x9EEA: 0x70BE, //CJK UNIFIED IDEOGRAPH
+ 0x9EEB: 0x70BF, //CJK UNIFIED IDEOGRAPH
+ 0x9EEC: 0x70C4, //CJK UNIFIED IDEOGRAPH
+ 0x9EED: 0x70C5, //CJK UNIFIED IDEOGRAPH
+ 0x9EEE: 0x70C6, //CJK UNIFIED IDEOGRAPH
+ 0x9EEF: 0x70C7, //CJK UNIFIED IDEOGRAPH
+ 0x9EF0: 0x70C9, //CJK UNIFIED IDEOGRAPH
+ 0x9EF1: 0x70CB, //CJK UNIFIED IDEOGRAPH
+ 0x9EF2: 0x70CC, //CJK UNIFIED IDEOGRAPH
+ 0x9EF3: 0x70CD, //CJK UNIFIED IDEOGRAPH
+ 0x9EF4: 0x70CE, //CJK UNIFIED IDEOGRAPH
+ 0x9EF5: 0x70CF, //CJK UNIFIED IDEOGRAPH
+ 0x9EF6: 0x70D0, //CJK UNIFIED IDEOGRAPH
+ 0x9EF7: 0x70D1, //CJK UNIFIED IDEOGRAPH
+ 0x9EF8: 0x70D2, //CJK UNIFIED IDEOGRAPH
+ 0x9EF9: 0x70D3, //CJK UNIFIED IDEOGRAPH
+ 0x9EFA: 0x70D4, //CJK UNIFIED IDEOGRAPH
+ 0x9EFB: 0x70D5, //CJK UNIFIED IDEOGRAPH
+ 0x9EFC: 0x70D6, //CJK UNIFIED IDEOGRAPH
+ 0x9EFD: 0x70D7, //CJK UNIFIED IDEOGRAPH
+ 0x9EFE: 0x70DA, //CJK UNIFIED IDEOGRAPH
+ 0x9F40: 0x70DC, //CJK UNIFIED IDEOGRAPH
+ 0x9F41: 0x70DD, //CJK UNIFIED IDEOGRAPH
+ 0x9F42: 0x70DE, //CJK UNIFIED IDEOGRAPH
+ 0x9F43: 0x70E0, //CJK UNIFIED IDEOGRAPH
+ 0x9F44: 0x70E1, //CJK UNIFIED IDEOGRAPH
+ 0x9F45: 0x70E2, //CJK UNIFIED IDEOGRAPH
+ 0x9F46: 0x70E3, //CJK UNIFIED IDEOGRAPH
+ 0x9F47: 0x70E5, //CJK UNIFIED IDEOGRAPH
+ 0x9F48: 0x70EA, //CJK UNIFIED IDEOGRAPH
+ 0x9F49: 0x70EE, //CJK UNIFIED IDEOGRAPH
+ 0x9F4A: 0x70F0, //CJK UNIFIED IDEOGRAPH
+ 0x9F4B: 0x70F1, //CJK UNIFIED IDEOGRAPH
+ 0x9F4C: 0x70F2, //CJK UNIFIED IDEOGRAPH
+ 0x9F4D: 0x70F3, //CJK UNIFIED IDEOGRAPH
+ 0x9F4E: 0x70F4, //CJK UNIFIED IDEOGRAPH
+ 0x9F4F: 0x70F5, //CJK UNIFIED IDEOGRAPH
+ 0x9F50: 0x70F6, //CJK UNIFIED IDEOGRAPH
+ 0x9F51: 0x70F8, //CJK UNIFIED IDEOGRAPH
+ 0x9F52: 0x70FA, //CJK UNIFIED IDEOGRAPH
+ 0x9F53: 0x70FB, //CJK UNIFIED IDEOGRAPH
+ 0x9F54: 0x70FC, //CJK UNIFIED IDEOGRAPH
+ 0x9F55: 0x70FE, //CJK UNIFIED IDEOGRAPH
+ 0x9F56: 0x70FF, //CJK UNIFIED IDEOGRAPH
+ 0x9F57: 0x7100, //CJK UNIFIED IDEOGRAPH
+ 0x9F58: 0x7101, //CJK UNIFIED IDEOGRAPH
+ 0x9F59: 0x7102, //CJK UNIFIED IDEOGRAPH
+ 0x9F5A: 0x7103, //CJK UNIFIED IDEOGRAPH
+ 0x9F5B: 0x7104, //CJK UNIFIED IDEOGRAPH
+ 0x9F5C: 0x7105, //CJK UNIFIED IDEOGRAPH
+ 0x9F5D: 0x7106, //CJK UNIFIED IDEOGRAPH
+ 0x9F5E: 0x7107, //CJK UNIFIED IDEOGRAPH
+ 0x9F5F: 0x7108, //CJK UNIFIED IDEOGRAPH
+ 0x9F60: 0x710B, //CJK UNIFIED IDEOGRAPH
+ 0x9F61: 0x710C, //CJK UNIFIED IDEOGRAPH
+ 0x9F62: 0x710D, //CJK UNIFIED IDEOGRAPH
+ 0x9F63: 0x710E, //CJK UNIFIED IDEOGRAPH
+ 0x9F64: 0x710F, //CJK UNIFIED IDEOGRAPH
+ 0x9F65: 0x7111, //CJK UNIFIED IDEOGRAPH
+ 0x9F66: 0x7112, //CJK UNIFIED IDEOGRAPH
+ 0x9F67: 0x7114, //CJK UNIFIED IDEOGRAPH
+ 0x9F68: 0x7117, //CJK UNIFIED IDEOGRAPH
+ 0x9F69: 0x711B, //CJK UNIFIED IDEOGRAPH
+ 0x9F6A: 0x711C, //CJK UNIFIED IDEOGRAPH
+ 0x9F6B: 0x711D, //CJK UNIFIED IDEOGRAPH
+ 0x9F6C: 0x711E, //CJK UNIFIED IDEOGRAPH
+ 0x9F6D: 0x711F, //CJK UNIFIED IDEOGRAPH
+ 0x9F6E: 0x7120, //CJK UNIFIED IDEOGRAPH
+ 0x9F6F: 0x7121, //CJK UNIFIED IDEOGRAPH
+ 0x9F70: 0x7122, //CJK UNIFIED IDEOGRAPH
+ 0x9F71: 0x7123, //CJK UNIFIED IDEOGRAPH
+ 0x9F72: 0x7124, //CJK UNIFIED IDEOGRAPH
+ 0x9F73: 0x7125, //CJK UNIFIED IDEOGRAPH
+ 0x9F74: 0x7127, //CJK UNIFIED IDEOGRAPH
+ 0x9F75: 0x7128, //CJK UNIFIED IDEOGRAPH
+ 0x9F76: 0x7129, //CJK UNIFIED IDEOGRAPH
+ 0x9F77: 0x712A, //CJK UNIFIED IDEOGRAPH
+ 0x9F78: 0x712B, //CJK UNIFIED IDEOGRAPH
+ 0x9F79: 0x712C, //CJK UNIFIED IDEOGRAPH
+ 0x9F7A: 0x712D, //CJK UNIFIED IDEOGRAPH
+ 0x9F7B: 0x712E, //CJK UNIFIED IDEOGRAPH
+ 0x9F7C: 0x7132, //CJK UNIFIED IDEOGRAPH
+ 0x9F7D: 0x7133, //CJK UNIFIED IDEOGRAPH
+ 0x9F7E: 0x7134, //CJK UNIFIED IDEOGRAPH
+ 0x9F80: 0x7135, //CJK UNIFIED IDEOGRAPH
+ 0x9F81: 0x7137, //CJK UNIFIED IDEOGRAPH
+ 0x9F82: 0x7138, //CJK UNIFIED IDEOGRAPH
+ 0x9F83: 0x7139, //CJK UNIFIED IDEOGRAPH
+ 0x9F84: 0x713A, //CJK UNIFIED IDEOGRAPH
+ 0x9F85: 0x713B, //CJK UNIFIED IDEOGRAPH
+ 0x9F86: 0x713C, //CJK UNIFIED IDEOGRAPH
+ 0x9F87: 0x713D, //CJK UNIFIED IDEOGRAPH
+ 0x9F88: 0x713E, //CJK UNIFIED IDEOGRAPH
+ 0x9F89: 0x713F, //CJK UNIFIED IDEOGRAPH
+ 0x9F8A: 0x7140, //CJK UNIFIED IDEOGRAPH
+ 0x9F8B: 0x7141, //CJK UNIFIED IDEOGRAPH
+ 0x9F8C: 0x7142, //CJK UNIFIED IDEOGRAPH
+ 0x9F8D: 0x7143, //CJK UNIFIED IDEOGRAPH
+ 0x9F8E: 0x7144, //CJK UNIFIED IDEOGRAPH
+ 0x9F8F: 0x7146, //CJK UNIFIED IDEOGRAPH
+ 0x9F90: 0x7147, //CJK UNIFIED IDEOGRAPH
+ 0x9F91: 0x7148, //CJK UNIFIED IDEOGRAPH
+ 0x9F92: 0x7149, //CJK UNIFIED IDEOGRAPH
+ 0x9F93: 0x714B, //CJK UNIFIED IDEOGRAPH
+ 0x9F94: 0x714D, //CJK UNIFIED IDEOGRAPH
+ 0x9F95: 0x714F, //CJK UNIFIED IDEOGRAPH
+ 0x9F96: 0x7150, //CJK UNIFIED IDEOGRAPH
+ 0x9F97: 0x7151, //CJK UNIFIED IDEOGRAPH
+ 0x9F98: 0x7152, //CJK UNIFIED IDEOGRAPH
+ 0x9F99: 0x7153, //CJK UNIFIED IDEOGRAPH
+ 0x9F9A: 0x7154, //CJK UNIFIED IDEOGRAPH
+ 0x9F9B: 0x7155, //CJK UNIFIED IDEOGRAPH
+ 0x9F9C: 0x7156, //CJK UNIFIED IDEOGRAPH
+ 0x9F9D: 0x7157, //CJK UNIFIED IDEOGRAPH
+ 0x9F9E: 0x7158, //CJK UNIFIED IDEOGRAPH
+ 0x9F9F: 0x7159, //CJK UNIFIED IDEOGRAPH
+ 0x9FA0: 0x715A, //CJK UNIFIED IDEOGRAPH
+ 0x9FA1: 0x715B, //CJK UNIFIED IDEOGRAPH
+ 0x9FA2: 0x715D, //CJK UNIFIED IDEOGRAPH
+ 0x9FA3: 0x715F, //CJK UNIFIED IDEOGRAPH
+ 0x9FA4: 0x7160, //CJK UNIFIED IDEOGRAPH
+ 0x9FA5: 0x7161, //CJK UNIFIED IDEOGRAPH
+ 0x9FA6: 0x7162, //CJK UNIFIED IDEOGRAPH
+ 0x9FA7: 0x7163, //CJK UNIFIED IDEOGRAPH
+ 0x9FA8: 0x7165, //CJK UNIFIED IDEOGRAPH
+ 0x9FA9: 0x7169, //CJK UNIFIED IDEOGRAPH
+ 0x9FAA: 0x716A, //CJK UNIFIED IDEOGRAPH
+ 0x9FAB: 0x716B, //CJK UNIFIED IDEOGRAPH
+ 0x9FAC: 0x716C, //CJK UNIFIED IDEOGRAPH
+ 0x9FAD: 0x716D, //CJK UNIFIED IDEOGRAPH
+ 0x9FAE: 0x716F, //CJK UNIFIED IDEOGRAPH
+ 0x9FAF: 0x7170, //CJK UNIFIED IDEOGRAPH
+ 0x9FB0: 0x7171, //CJK UNIFIED IDEOGRAPH
+ 0x9FB1: 0x7174, //CJK UNIFIED IDEOGRAPH
+ 0x9FB2: 0x7175, //CJK UNIFIED IDEOGRAPH
+ 0x9FB3: 0x7176, //CJK UNIFIED IDEOGRAPH
+ 0x9FB4: 0x7177, //CJK UNIFIED IDEOGRAPH
+ 0x9FB5: 0x7179, //CJK UNIFIED IDEOGRAPH
+ 0x9FB6: 0x717B, //CJK UNIFIED IDEOGRAPH
+ 0x9FB7: 0x717C, //CJK UNIFIED IDEOGRAPH
+ 0x9FB8: 0x717E, //CJK UNIFIED IDEOGRAPH
+ 0x9FB9: 0x717F, //CJK UNIFIED IDEOGRAPH
+ 0x9FBA: 0x7180, //CJK UNIFIED IDEOGRAPH
+ 0x9FBB: 0x7181, //CJK UNIFIED IDEOGRAPH
+ 0x9FBC: 0x7182, //CJK UNIFIED IDEOGRAPH
+ 0x9FBD: 0x7183, //CJK UNIFIED IDEOGRAPH
+ 0x9FBE: 0x7185, //CJK UNIFIED IDEOGRAPH
+ 0x9FBF: 0x7186, //CJK UNIFIED IDEOGRAPH
+ 0x9FC0: 0x7187, //CJK UNIFIED IDEOGRAPH
+ 0x9FC1: 0x7188, //CJK UNIFIED IDEOGRAPH
+ 0x9FC2: 0x7189, //CJK UNIFIED IDEOGRAPH
+ 0x9FC3: 0x718B, //CJK UNIFIED IDEOGRAPH
+ 0x9FC4: 0x718C, //CJK UNIFIED IDEOGRAPH
+ 0x9FC5: 0x718D, //CJK UNIFIED IDEOGRAPH
+ 0x9FC6: 0x718E, //CJK UNIFIED IDEOGRAPH
+ 0x9FC7: 0x7190, //CJK UNIFIED IDEOGRAPH
+ 0x9FC8: 0x7191, //CJK UNIFIED IDEOGRAPH
+ 0x9FC9: 0x7192, //CJK UNIFIED IDEOGRAPH
+ 0x9FCA: 0x7193, //CJK UNIFIED IDEOGRAPH
+ 0x9FCB: 0x7195, //CJK UNIFIED IDEOGRAPH
+ 0x9FCC: 0x7196, //CJK UNIFIED IDEOGRAPH
+ 0x9FCD: 0x7197, //CJK UNIFIED IDEOGRAPH
+ 0x9FCE: 0x719A, //CJK UNIFIED IDEOGRAPH
+ 0x9FCF: 0x719B, //CJK UNIFIED IDEOGRAPH
+ 0x9FD0: 0x719C, //CJK UNIFIED IDEOGRAPH
+ 0x9FD1: 0x719D, //CJK UNIFIED IDEOGRAPH
+ 0x9FD2: 0x719E, //CJK UNIFIED IDEOGRAPH
+ 0x9FD3: 0x71A1, //CJK UNIFIED IDEOGRAPH
+ 0x9FD4: 0x71A2, //CJK UNIFIED IDEOGRAPH
+ 0x9FD5: 0x71A3, //CJK UNIFIED IDEOGRAPH
+ 0x9FD6: 0x71A4, //CJK UNIFIED IDEOGRAPH
+ 0x9FD7: 0x71A5, //CJK UNIFIED IDEOGRAPH
+ 0x9FD8: 0x71A6, //CJK UNIFIED IDEOGRAPH
+ 0x9FD9: 0x71A7, //CJK UNIFIED IDEOGRAPH
+ 0x9FDA: 0x71A9, //CJK UNIFIED IDEOGRAPH
+ 0x9FDB: 0x71AA, //CJK UNIFIED IDEOGRAPH
+ 0x9FDC: 0x71AB, //CJK UNIFIED IDEOGRAPH
+ 0x9FDD: 0x71AD, //CJK UNIFIED IDEOGRAPH
+ 0x9FDE: 0x71AE, //CJK UNIFIED IDEOGRAPH
+ 0x9FDF: 0x71AF, //CJK UNIFIED IDEOGRAPH
+ 0x9FE0: 0x71B0, //CJK UNIFIED IDEOGRAPH
+ 0x9FE1: 0x71B1, //CJK UNIFIED IDEOGRAPH
+ 0x9FE2: 0x71B2, //CJK UNIFIED IDEOGRAPH
+ 0x9FE3: 0x71B4, //CJK UNIFIED IDEOGRAPH
+ 0x9FE4: 0x71B6, //CJK UNIFIED IDEOGRAPH
+ 0x9FE5: 0x71B7, //CJK UNIFIED IDEOGRAPH
+ 0x9FE6: 0x71B8, //CJK UNIFIED IDEOGRAPH
+ 0x9FE7: 0x71BA, //CJK UNIFIED IDEOGRAPH
+ 0x9FE8: 0x71BB, //CJK UNIFIED IDEOGRAPH
+ 0x9FE9: 0x71BC, //CJK UNIFIED IDEOGRAPH
+ 0x9FEA: 0x71BD, //CJK UNIFIED IDEOGRAPH
+ 0x9FEB: 0x71BE, //CJK UNIFIED IDEOGRAPH
+ 0x9FEC: 0x71BF, //CJK UNIFIED IDEOGRAPH
+ 0x9FED: 0x71C0, //CJK UNIFIED IDEOGRAPH
+ 0x9FEE: 0x71C1, //CJK UNIFIED IDEOGRAPH
+ 0x9FEF: 0x71C2, //CJK UNIFIED IDEOGRAPH
+ 0x9FF0: 0x71C4, //CJK UNIFIED IDEOGRAPH
+ 0x9FF1: 0x71C5, //CJK UNIFIED IDEOGRAPH
+ 0x9FF2: 0x71C6, //CJK UNIFIED IDEOGRAPH
+ 0x9FF3: 0x71C7, //CJK UNIFIED IDEOGRAPH
+ 0x9FF4: 0x71C8, //CJK UNIFIED IDEOGRAPH
+ 0x9FF5: 0x71C9, //CJK UNIFIED IDEOGRAPH
+ 0x9FF6: 0x71CA, //CJK UNIFIED IDEOGRAPH
+ 0x9FF7: 0x71CB, //CJK UNIFIED IDEOGRAPH
+ 0x9FF8: 0x71CC, //CJK UNIFIED IDEOGRAPH
+ 0x9FF9: 0x71CD, //CJK UNIFIED IDEOGRAPH
+ 0x9FFA: 0x71CF, //CJK UNIFIED IDEOGRAPH
+ 0x9FFB: 0x71D0, //CJK UNIFIED IDEOGRAPH
+ 0x9FFC: 0x71D1, //CJK UNIFIED IDEOGRAPH
+ 0x9FFD: 0x71D2, //CJK UNIFIED IDEOGRAPH
+ 0x9FFE: 0x71D3, //CJK UNIFIED IDEOGRAPH
+ 0xA040: 0x71D6, //CJK UNIFIED IDEOGRAPH
+ 0xA041: 0x71D7, //CJK UNIFIED IDEOGRAPH
+ 0xA042: 0x71D8, //CJK UNIFIED IDEOGRAPH
+ 0xA043: 0x71D9, //CJK UNIFIED IDEOGRAPH
+ 0xA044: 0x71DA, //CJK UNIFIED IDEOGRAPH
+ 0xA045: 0x71DB, //CJK UNIFIED IDEOGRAPH
+ 0xA046: 0x71DC, //CJK UNIFIED IDEOGRAPH
+ 0xA047: 0x71DD, //CJK UNIFIED IDEOGRAPH
+ 0xA048: 0x71DE, //CJK UNIFIED IDEOGRAPH
+ 0xA049: 0x71DF, //CJK UNIFIED IDEOGRAPH
+ 0xA04A: 0x71E1, //CJK UNIFIED IDEOGRAPH
+ 0xA04B: 0x71E2, //CJK UNIFIED IDEOGRAPH
+ 0xA04C: 0x71E3, //CJK UNIFIED IDEOGRAPH
+ 0xA04D: 0x71E4, //CJK UNIFIED IDEOGRAPH
+ 0xA04E: 0x71E6, //CJK UNIFIED IDEOGRAPH
+ 0xA04F: 0x71E8, //CJK UNIFIED IDEOGRAPH
+ 0xA050: 0x71E9, //CJK UNIFIED IDEOGRAPH
+ 0xA051: 0x71EA, //CJK UNIFIED IDEOGRAPH
+ 0xA052: 0x71EB, //CJK UNIFIED IDEOGRAPH
+ 0xA053: 0x71EC, //CJK UNIFIED IDEOGRAPH
+ 0xA054: 0x71ED, //CJK UNIFIED IDEOGRAPH
+ 0xA055: 0x71EF, //CJK UNIFIED IDEOGRAPH
+ 0xA056: 0x71F0, //CJK UNIFIED IDEOGRAPH
+ 0xA057: 0x71F1, //CJK UNIFIED IDEOGRAPH
+ 0xA058: 0x71F2, //CJK UNIFIED IDEOGRAPH
+ 0xA059: 0x71F3, //CJK UNIFIED IDEOGRAPH
+ 0xA05A: 0x71F4, //CJK UNIFIED IDEOGRAPH
+ 0xA05B: 0x71F5, //CJK UNIFIED IDEOGRAPH
+ 0xA05C: 0x71F6, //CJK UNIFIED IDEOGRAPH
+ 0xA05D: 0x71F7, //CJK UNIFIED IDEOGRAPH
+ 0xA05E: 0x71F8, //CJK UNIFIED IDEOGRAPH
+ 0xA05F: 0x71FA, //CJK UNIFIED IDEOGRAPH
+ 0xA060: 0x71FB, //CJK UNIFIED IDEOGRAPH
+ 0xA061: 0x71FC, //CJK UNIFIED IDEOGRAPH
+ 0xA062: 0x71FD, //CJK UNIFIED IDEOGRAPH
+ 0xA063: 0x71FE, //CJK UNIFIED IDEOGRAPH
+ 0xA064: 0x71FF, //CJK UNIFIED IDEOGRAPH
+ 0xA065: 0x7200, //CJK UNIFIED IDEOGRAPH
+ 0xA066: 0x7201, //CJK UNIFIED IDEOGRAPH
+ 0xA067: 0x7202, //CJK UNIFIED IDEOGRAPH
+ 0xA068: 0x7203, //CJK UNIFIED IDEOGRAPH
+ 0xA069: 0x7204, //CJK UNIFIED IDEOGRAPH
+ 0xA06A: 0x7205, //CJK UNIFIED IDEOGRAPH
+ 0xA06B: 0x7207, //CJK UNIFIED IDEOGRAPH
+ 0xA06C: 0x7208, //CJK UNIFIED IDEOGRAPH
+ 0xA06D: 0x7209, //CJK UNIFIED IDEOGRAPH
+ 0xA06E: 0x720A, //CJK UNIFIED IDEOGRAPH
+ 0xA06F: 0x720B, //CJK UNIFIED IDEOGRAPH
+ 0xA070: 0x720C, //CJK UNIFIED IDEOGRAPH
+ 0xA071: 0x720D, //CJK UNIFIED IDEOGRAPH
+ 0xA072: 0x720E, //CJK UNIFIED IDEOGRAPH
+ 0xA073: 0x720F, //CJK UNIFIED IDEOGRAPH
+ 0xA074: 0x7210, //CJK UNIFIED IDEOGRAPH
+ 0xA075: 0x7211, //CJK UNIFIED IDEOGRAPH
+ 0xA076: 0x7212, //CJK UNIFIED IDEOGRAPH
+ 0xA077: 0x7213, //CJK UNIFIED IDEOGRAPH
+ 0xA078: 0x7214, //CJK UNIFIED IDEOGRAPH
+ 0xA079: 0x7215, //CJK UNIFIED IDEOGRAPH
+ 0xA07A: 0x7216, //CJK UNIFIED IDEOGRAPH
+ 0xA07B: 0x7217, //CJK UNIFIED IDEOGRAPH
+ 0xA07C: 0x7218, //CJK UNIFIED IDEOGRAPH
+ 0xA07D: 0x7219, //CJK UNIFIED IDEOGRAPH
+ 0xA07E: 0x721A, //CJK UNIFIED IDEOGRAPH
+ 0xA080: 0x721B, //CJK UNIFIED IDEOGRAPH
+ 0xA081: 0x721C, //CJK UNIFIED IDEOGRAPH
+ 0xA082: 0x721E, //CJK UNIFIED IDEOGRAPH
+ 0xA083: 0x721F, //CJK UNIFIED IDEOGRAPH
+ 0xA084: 0x7220, //CJK UNIFIED IDEOGRAPH
+ 0xA085: 0x7221, //CJK UNIFIED IDEOGRAPH
+ 0xA086: 0x7222, //CJK UNIFIED IDEOGRAPH
+ 0xA087: 0x7223, //CJK UNIFIED IDEOGRAPH
+ 0xA088: 0x7224, //CJK UNIFIED IDEOGRAPH
+ 0xA089: 0x7225, //CJK UNIFIED IDEOGRAPH
+ 0xA08A: 0x7226, //CJK UNIFIED IDEOGRAPH
+ 0xA08B: 0x7227, //CJK UNIFIED IDEOGRAPH
+ 0xA08C: 0x7229, //CJK UNIFIED IDEOGRAPH
+ 0xA08D: 0x722B, //CJK UNIFIED IDEOGRAPH
+ 0xA08E: 0x722D, //CJK UNIFIED IDEOGRAPH
+ 0xA08F: 0x722E, //CJK UNIFIED IDEOGRAPH
+ 0xA090: 0x722F, //CJK UNIFIED IDEOGRAPH
+ 0xA091: 0x7232, //CJK UNIFIED IDEOGRAPH
+ 0xA092: 0x7233, //CJK UNIFIED IDEOGRAPH
+ 0xA093: 0x7234, //CJK UNIFIED IDEOGRAPH
+ 0xA094: 0x723A, //CJK UNIFIED IDEOGRAPH
+ 0xA095: 0x723C, //CJK UNIFIED IDEOGRAPH
+ 0xA096: 0x723E, //CJK UNIFIED IDEOGRAPH
+ 0xA097: 0x7240, //CJK UNIFIED IDEOGRAPH
+ 0xA098: 0x7241, //CJK UNIFIED IDEOGRAPH
+ 0xA099: 0x7242, //CJK UNIFIED IDEOGRAPH
+ 0xA09A: 0x7243, //CJK UNIFIED IDEOGRAPH
+ 0xA09B: 0x7244, //CJK UNIFIED IDEOGRAPH
+ 0xA09C: 0x7245, //CJK UNIFIED IDEOGRAPH
+ 0xA09D: 0x7246, //CJK UNIFIED IDEOGRAPH
+ 0xA09E: 0x7249, //CJK UNIFIED IDEOGRAPH
+ 0xA09F: 0x724A, //CJK UNIFIED IDEOGRAPH
+ 0xA0A0: 0x724B, //CJK UNIFIED IDEOGRAPH
+ 0xA0A1: 0x724E, //CJK UNIFIED IDEOGRAPH
+ 0xA0A2: 0x724F, //CJK UNIFIED IDEOGRAPH
+ 0xA0A3: 0x7250, //CJK UNIFIED IDEOGRAPH
+ 0xA0A4: 0x7251, //CJK UNIFIED IDEOGRAPH
+ 0xA0A5: 0x7253, //CJK UNIFIED IDEOGRAPH
+ 0xA0A6: 0x7254, //CJK UNIFIED IDEOGRAPH
+ 0xA0A7: 0x7255, //CJK UNIFIED IDEOGRAPH
+ 0xA0A8: 0x7257, //CJK UNIFIED IDEOGRAPH
+ 0xA0A9: 0x7258, //CJK UNIFIED IDEOGRAPH
+ 0xA0AA: 0x725A, //CJK UNIFIED IDEOGRAPH
+ 0xA0AB: 0x725C, //CJK UNIFIED IDEOGRAPH
+ 0xA0AC: 0x725E, //CJK UNIFIED IDEOGRAPH
+ 0xA0AD: 0x7260, //CJK UNIFIED IDEOGRAPH
+ 0xA0AE: 0x7263, //CJK UNIFIED IDEOGRAPH
+ 0xA0AF: 0x7264, //CJK UNIFIED IDEOGRAPH
+ 0xA0B0: 0x7265, //CJK UNIFIED IDEOGRAPH
+ 0xA0B1: 0x7268, //CJK UNIFIED IDEOGRAPH
+ 0xA0B2: 0x726A, //CJK UNIFIED IDEOGRAPH
+ 0xA0B3: 0x726B, //CJK UNIFIED IDEOGRAPH
+ 0xA0B4: 0x726C, //CJK UNIFIED IDEOGRAPH
+ 0xA0B5: 0x726D, //CJK UNIFIED IDEOGRAPH
+ 0xA0B6: 0x7270, //CJK UNIFIED IDEOGRAPH
+ 0xA0B7: 0x7271, //CJK UNIFIED IDEOGRAPH
+ 0xA0B8: 0x7273, //CJK UNIFIED IDEOGRAPH
+ 0xA0B9: 0x7274, //CJK UNIFIED IDEOGRAPH
+ 0xA0BA: 0x7276, //CJK UNIFIED IDEOGRAPH
+ 0xA0BB: 0x7277, //CJK UNIFIED IDEOGRAPH
+ 0xA0BC: 0x7278, //CJK UNIFIED IDEOGRAPH
+ 0xA0BD: 0x727B, //CJK UNIFIED IDEOGRAPH
+ 0xA0BE: 0x727C, //CJK UNIFIED IDEOGRAPH
+ 0xA0BF: 0x727D, //CJK UNIFIED IDEOGRAPH
+ 0xA0C0: 0x7282, //CJK UNIFIED IDEOGRAPH
+ 0xA0C1: 0x7283, //CJK UNIFIED IDEOGRAPH
+ 0xA0C2: 0x7285, //CJK UNIFIED IDEOGRAPH
+ 0xA0C3: 0x7286, //CJK UNIFIED IDEOGRAPH
+ 0xA0C4: 0x7287, //CJK UNIFIED IDEOGRAPH
+ 0xA0C5: 0x7288, //CJK UNIFIED IDEOGRAPH
+ 0xA0C6: 0x7289, //CJK UNIFIED IDEOGRAPH
+ 0xA0C7: 0x728C, //CJK UNIFIED IDEOGRAPH
+ 0xA0C8: 0x728E, //CJK UNIFIED IDEOGRAPH
+ 0xA0C9: 0x7290, //CJK UNIFIED IDEOGRAPH
+ 0xA0CA: 0x7291, //CJK UNIFIED IDEOGRAPH
+ 0xA0CB: 0x7293, //CJK UNIFIED IDEOGRAPH
+ 0xA0CC: 0x7294, //CJK UNIFIED IDEOGRAPH
+ 0xA0CD: 0x7295, //CJK UNIFIED IDEOGRAPH
+ 0xA0CE: 0x7296, //CJK UNIFIED IDEOGRAPH
+ 0xA0CF: 0x7297, //CJK UNIFIED IDEOGRAPH
+ 0xA0D0: 0x7298, //CJK UNIFIED IDEOGRAPH
+ 0xA0D1: 0x7299, //CJK UNIFIED IDEOGRAPH
+ 0xA0D2: 0x729A, //CJK UNIFIED IDEOGRAPH
+ 0xA0D3: 0x729B, //CJK UNIFIED IDEOGRAPH
+ 0xA0D4: 0x729C, //CJK UNIFIED IDEOGRAPH
+ 0xA0D5: 0x729D, //CJK UNIFIED IDEOGRAPH
+ 0xA0D6: 0x729E, //CJK UNIFIED IDEOGRAPH
+ 0xA0D7: 0x72A0, //CJK UNIFIED IDEOGRAPH
+ 0xA0D8: 0x72A1, //CJK UNIFIED IDEOGRAPH
+ 0xA0D9: 0x72A2, //CJK UNIFIED IDEOGRAPH
+ 0xA0DA: 0x72A3, //CJK UNIFIED IDEOGRAPH
+ 0xA0DB: 0x72A4, //CJK UNIFIED IDEOGRAPH
+ 0xA0DC: 0x72A5, //CJK UNIFIED IDEOGRAPH
+ 0xA0DD: 0x72A6, //CJK UNIFIED IDEOGRAPH
+ 0xA0DE: 0x72A7, //CJK UNIFIED IDEOGRAPH
+ 0xA0DF: 0x72A8, //CJK UNIFIED IDEOGRAPH
+ 0xA0E0: 0x72A9, //CJK UNIFIED IDEOGRAPH
+ 0xA0E1: 0x72AA, //CJK UNIFIED IDEOGRAPH
+ 0xA0E2: 0x72AB, //CJK UNIFIED IDEOGRAPH
+ 0xA0E3: 0x72AE, //CJK UNIFIED IDEOGRAPH
+ 0xA0E4: 0x72B1, //CJK UNIFIED IDEOGRAPH
+ 0xA0E5: 0x72B2, //CJK UNIFIED IDEOGRAPH
+ 0xA0E6: 0x72B3, //CJK UNIFIED IDEOGRAPH
+ 0xA0E7: 0x72B5, //CJK UNIFIED IDEOGRAPH
+ 0xA0E8: 0x72BA, //CJK UNIFIED IDEOGRAPH
+ 0xA0E9: 0x72BB, //CJK UNIFIED IDEOGRAPH
+ 0xA0EA: 0x72BC, //CJK UNIFIED IDEOGRAPH
+ 0xA0EB: 0x72BD, //CJK UNIFIED IDEOGRAPH
+ 0xA0EC: 0x72BE, //CJK UNIFIED IDEOGRAPH
+ 0xA0ED: 0x72BF, //CJK UNIFIED IDEOGRAPH
+ 0xA0EE: 0x72C0, //CJK UNIFIED IDEOGRAPH
+ 0xA0EF: 0x72C5, //CJK UNIFIED IDEOGRAPH
+ 0xA0F0: 0x72C6, //CJK UNIFIED IDEOGRAPH
+ 0xA0F1: 0x72C7, //CJK UNIFIED IDEOGRAPH
+ 0xA0F2: 0x72C9, //CJK UNIFIED IDEOGRAPH
+ 0xA0F3: 0x72CA, //CJK UNIFIED IDEOGRAPH
+ 0xA0F4: 0x72CB, //CJK UNIFIED IDEOGRAPH
+ 0xA0F5: 0x72CC, //CJK UNIFIED IDEOGRAPH
+ 0xA0F6: 0x72CF, //CJK UNIFIED IDEOGRAPH
+ 0xA0F7: 0x72D1, //CJK UNIFIED IDEOGRAPH
+ 0xA0F8: 0x72D3, //CJK UNIFIED IDEOGRAPH
+ 0xA0F9: 0x72D4, //CJK UNIFIED IDEOGRAPH
+ 0xA0FA: 0x72D5, //CJK UNIFIED IDEOGRAPH
+ 0xA0FB: 0x72D6, //CJK UNIFIED IDEOGRAPH
+ 0xA0FC: 0x72D8, //CJK UNIFIED IDEOGRAPH
+ 0xA0FD: 0x72DA, //CJK UNIFIED IDEOGRAPH
+ 0xA0FE: 0x72DB, //CJK UNIFIED IDEOGRAPH
+ 0xA1A1: 0x3000, //IDEOGRAPHIC SPACE
+ 0xA1A2: 0x3001, //IDEOGRAPHIC COMMA
+ 0xA1A3: 0x3002, //IDEOGRAPHIC FULL STOP
+ 0xA1A4: 0x00B7, //MIDDLE DOT
+ 0xA1A5: 0x02C9, //MODIFIER LETTER MACRON
+ 0xA1A6: 0x02C7, //CARON
+ 0xA1A7: 0x00A8, //DIAERESIS
+ 0xA1A8: 0x3003, //DITTO MARK
+ 0xA1A9: 0x3005, //IDEOGRAPHIC ITERATION MARK
+ 0xA1AA: 0x2014, //EM DASH
+ 0xA1AB: 0xFF5E, //FULLWIDTH TILDE
+ 0xA1AC: 0x2016, //DOUBLE VERTICAL LINE
+ 0xA1AD: 0x2026, //HORIZONTAL ELLIPSIS
+ 0xA1AE: 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0xA1AF: 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0xA1B0: 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0xA1B1: 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0xA1B2: 0x3014, //LEFT TORTOISE SHELL BRACKET
+ 0xA1B3: 0x3015, //RIGHT TORTOISE SHELL BRACKET
+ 0xA1B4: 0x3008, //LEFT ANGLE BRACKET
+ 0xA1B5: 0x3009, //RIGHT ANGLE BRACKET
+ 0xA1B6: 0x300A, //LEFT DOUBLE ANGLE BRACKET
+ 0xA1B7: 0x300B, //RIGHT DOUBLE ANGLE BRACKET
+ 0xA1B8: 0x300C, //LEFT CORNER BRACKET
+ 0xA1B9: 0x300D, //RIGHT CORNER BRACKET
+ 0xA1BA: 0x300E, //LEFT WHITE CORNER BRACKET
+ 0xA1BB: 0x300F, //RIGHT WHITE CORNER BRACKET
+ 0xA1BC: 0x3016, //LEFT WHITE LENTICULAR BRACKET
+ 0xA1BD: 0x3017, //RIGHT WHITE LENTICULAR BRACKET
+ 0xA1BE: 0x3010, //LEFT BLACK LENTICULAR BRACKET
+ 0xA1BF: 0x3011, //RIGHT BLACK LENTICULAR BRACKET
+ 0xA1C0: 0x00B1, //PLUS-MINUS SIGN
+ 0xA1C1: 0x00D7, //MULTIPLICATION SIGN
+ 0xA1C2: 0x00F7, //DIVISION SIGN
+ 0xA1C3: 0x2236, //RATIO
+ 0xA1C4: 0x2227, //LOGICAL AND
+ 0xA1C5: 0x2228, //LOGICAL OR
+ 0xA1C6: 0x2211, //N-ARY SUMMATION
+ 0xA1C7: 0x220F, //N-ARY PRODUCT
+ 0xA1C8: 0x222A, //UNION
+ 0xA1C9: 0x2229, //INTERSECTION
+ 0xA1CA: 0x2208, //ELEMENT OF
+ 0xA1CB: 0x2237, //PROPORTION
+ 0xA1CC: 0x221A, //SQUARE ROOT
+ 0xA1CD: 0x22A5, //UP TACK
+ 0xA1CE: 0x2225, //PARALLEL TO
+ 0xA1CF: 0x2220, //ANGLE
+ 0xA1D0: 0x2312, //ARC
+ 0xA1D1: 0x2299, //CIRCLED DOT OPERATOR
+ 0xA1D2: 0x222B, //INTEGRAL
+ 0xA1D3: 0x222E, //CONTOUR INTEGRAL
+ 0xA1D4: 0x2261, //IDENTICAL TO
+ 0xA1D5: 0x224C, //ALL EQUAL TO
+ 0xA1D6: 0x2248, //ALMOST EQUAL TO
+ 0xA1D7: 0x223D, //REVERSED TILDE
+ 0xA1D8: 0x221D, //PROPORTIONAL TO
+ 0xA1D9: 0x2260, //NOT EQUAL TO
+ 0xA1DA: 0x226E, //NOT LESS-THAN
+ 0xA1DB: 0x226F, //NOT GREATER-THAN
+ 0xA1DC: 0x2264, //LESS-THAN OR EQUAL TO
+ 0xA1DD: 0x2265, //GREATER-THAN OR EQUAL TO
+ 0xA1DE: 0x221E, //INFINITY
+ 0xA1DF: 0x2235, //BECAUSE
+ 0xA1E0: 0x2234, //THEREFORE
+ 0xA1E1: 0x2642, //MALE SIGN
+ 0xA1E2: 0x2640, //FEMALE SIGN
+ 0xA1E3: 0x00B0, //DEGREE SIGN
+ 0xA1E4: 0x2032, //PRIME
+ 0xA1E5: 0x2033, //DOUBLE PRIME
+ 0xA1E6: 0x2103, //DEGREE CELSIUS
+ 0xA1E7: 0xFF04, //FULLWIDTH DOLLAR SIGN
+ 0xA1E8: 0x00A4, //CURRENCY SIGN
+ 0xA1E9: 0xFFE0, //FULLWIDTH CENT SIGN
+ 0xA1EA: 0xFFE1, //FULLWIDTH POUND SIGN
+ 0xA1EB: 0x2030, //PER MILLE SIGN
+ 0xA1EC: 0x00A7, //SECTION SIGN
+ 0xA1ED: 0x2116, //NUMERO SIGN
+ 0xA1EE: 0x2606, //WHITE STAR
+ 0xA1EF: 0x2605, //BLACK STAR
+ 0xA1F0: 0x25CB, //WHITE CIRCLE
+ 0xA1F1: 0x25CF, //BLACK CIRCLE
+ 0xA1F2: 0x25CE, //BULLSEYE
+ 0xA1F3: 0x25C7, //WHITE DIAMOND
+ 0xA1F4: 0x25C6, //BLACK DIAMOND
+ 0xA1F5: 0x25A1, //WHITE SQUARE
+ 0xA1F6: 0x25A0, //BLACK SQUARE
+ 0xA1F7: 0x25B3, //WHITE UP-POINTING TRIANGLE
+ 0xA1F8: 0x25B2, //BLACK UP-POINTING TRIANGLE
+ 0xA1F9: 0x203B, //REFERENCE MARK
+ 0xA1FA: 0x2192, //RIGHTWARDS ARROW
+ 0xA1FB: 0x2190, //LEFTWARDS ARROW
+ 0xA1FC: 0x2191, //UPWARDS ARROW
+ 0xA1FD: 0x2193, //DOWNWARDS ARROW
+ 0xA1FE: 0x3013, //GETA MARK
+ 0xA2A1: 0x2170, //SMALL ROMAN NUMERAL ONE
+ 0xA2A2: 0x2171, //SMALL ROMAN NUMERAL TWO
+ 0xA2A3: 0x2172, //SMALL ROMAN NUMERAL THREE
+ 0xA2A4: 0x2173, //SMALL ROMAN NUMERAL FOUR
+ 0xA2A5: 0x2174, //SMALL ROMAN NUMERAL FIVE
+ 0xA2A6: 0x2175, //SMALL ROMAN NUMERAL SIX
+ 0xA2A7: 0x2176, //SMALL ROMAN NUMERAL SEVEN
+ 0xA2A8: 0x2177, //SMALL ROMAN NUMERAL EIGHT
+ 0xA2A9: 0x2178, //SMALL ROMAN NUMERAL NINE
+ 0xA2AA: 0x2179, //SMALL ROMAN NUMERAL TEN
+ 0xA2B1: 0x2488, //DIGIT ONE FULL STOP
+ 0xA2B2: 0x2489, //DIGIT TWO FULL STOP
+ 0xA2B3: 0x248A, //DIGIT THREE FULL STOP
+ 0xA2B4: 0x248B, //DIGIT FOUR FULL STOP
+ 0xA2B5: 0x248C, //DIGIT FIVE FULL STOP
+ 0xA2B6: 0x248D, //DIGIT SIX FULL STOP
+ 0xA2B7: 0x248E, //DIGIT SEVEN FULL STOP
+ 0xA2B8: 0x248F, //DIGIT EIGHT FULL STOP
+ 0xA2B9: 0x2490, //DIGIT NINE FULL STOP
+ 0xA2BA: 0x2491, //NUMBER TEN FULL STOP
+ 0xA2BB: 0x2492, //NUMBER ELEVEN FULL STOP
+ 0xA2BC: 0x2493, //NUMBER TWELVE FULL STOP
+ 0xA2BD: 0x2494, //NUMBER THIRTEEN FULL STOP
+ 0xA2BE: 0x2495, //NUMBER FOURTEEN FULL STOP
+ 0xA2BF: 0x2496, //NUMBER FIFTEEN FULL STOP
+ 0xA2C0: 0x2497, //NUMBER SIXTEEN FULL STOP
+ 0xA2C1: 0x2498, //NUMBER SEVENTEEN FULL STOP
+ 0xA2C2: 0x2499, //NUMBER EIGHTEEN FULL STOP
+ 0xA2C3: 0x249A, //NUMBER NINETEEN FULL STOP
+ 0xA2C4: 0x249B, //NUMBER TWENTY FULL STOP
+ 0xA2C5: 0x2474, //PARENTHESIZED DIGIT ONE
+ 0xA2C6: 0x2475, //PARENTHESIZED DIGIT TWO
+ 0xA2C7: 0x2476, //PARENTHESIZED DIGIT THREE
+ 0xA2C8: 0x2477, //PARENTHESIZED DIGIT FOUR
+ 0xA2C9: 0x2478, //PARENTHESIZED DIGIT FIVE
+ 0xA2CA: 0x2479, //PARENTHESIZED DIGIT SIX
+ 0xA2CB: 0x247A, //PARENTHESIZED DIGIT SEVEN
+ 0xA2CC: 0x247B, //PARENTHESIZED DIGIT EIGHT
+ 0xA2CD: 0x247C, //PARENTHESIZED DIGIT NINE
+ 0xA2CE: 0x247D, //PARENTHESIZED NUMBER TEN
+ 0xA2CF: 0x247E, //PARENTHESIZED NUMBER ELEVEN
+ 0xA2D0: 0x247F, //PARENTHESIZED NUMBER TWELVE
+ 0xA2D1: 0x2480, //PARENTHESIZED NUMBER THIRTEEN
+ 0xA2D2: 0x2481, //PARENTHESIZED NUMBER FOURTEEN
+ 0xA2D3: 0x2482, //PARENTHESIZED NUMBER FIFTEEN
+ 0xA2D4: 0x2483, //PARENTHESIZED NUMBER SIXTEEN
+ 0xA2D5: 0x2484, //PARENTHESIZED NUMBER SEVENTEEN
+ 0xA2D6: 0x2485, //PARENTHESIZED NUMBER EIGHTEEN
+ 0xA2D7: 0x2486, //PARENTHESIZED NUMBER NINETEEN
+ 0xA2D8: 0x2487, //PARENTHESIZED NUMBER TWENTY
+ 0xA2D9: 0x2460, //CIRCLED DIGIT ONE
+ 0xA2DA: 0x2461, //CIRCLED DIGIT TWO
+ 0xA2DB: 0x2462, //CIRCLED DIGIT THREE
+ 0xA2DC: 0x2463, //CIRCLED DIGIT FOUR
+ 0xA2DD: 0x2464, //CIRCLED DIGIT FIVE
+ 0xA2DE: 0x2465, //CIRCLED DIGIT SIX
+ 0xA2DF: 0x2466, //CIRCLED DIGIT SEVEN
+ 0xA2E0: 0x2467, //CIRCLED DIGIT EIGHT
+ 0xA2E1: 0x2468, //CIRCLED DIGIT NINE
+ 0xA2E2: 0x2469, //CIRCLED NUMBER TEN
+ 0xA2E5: 0x3220, //PARENTHESIZED IDEOGRAPH ONE
+ 0xA2E6: 0x3221, //PARENTHESIZED IDEOGRAPH TWO
+ 0xA2E7: 0x3222, //PARENTHESIZED IDEOGRAPH THREE
+ 0xA2E8: 0x3223, //PARENTHESIZED IDEOGRAPH FOUR
+ 0xA2E9: 0x3224, //PARENTHESIZED IDEOGRAPH FIVE
+ 0xA2EA: 0x3225, //PARENTHESIZED IDEOGRAPH SIX
+ 0xA2EB: 0x3226, //PARENTHESIZED IDEOGRAPH SEVEN
+ 0xA2EC: 0x3227, //PARENTHESIZED IDEOGRAPH EIGHT
+ 0xA2ED: 0x3228, //PARENTHESIZED IDEOGRAPH NINE
+ 0xA2EE: 0x3229, //PARENTHESIZED IDEOGRAPH TEN
+ 0xA2F1: 0x2160, //ROMAN NUMERAL ONE
+ 0xA2F2: 0x2161, //ROMAN NUMERAL TWO
+ 0xA2F3: 0x2162, //ROMAN NUMERAL THREE
+ 0xA2F4: 0x2163, //ROMAN NUMERAL FOUR
+ 0xA2F5: 0x2164, //ROMAN NUMERAL FIVE
+ 0xA2F6: 0x2165, //ROMAN NUMERAL SIX
+ 0xA2F7: 0x2166, //ROMAN NUMERAL SEVEN
+ 0xA2F8: 0x2167, //ROMAN NUMERAL EIGHT
+ 0xA2F9: 0x2168, //ROMAN NUMERAL NINE
+ 0xA2FA: 0x2169, //ROMAN NUMERAL TEN
+ 0xA2FB: 0x216A, //ROMAN NUMERAL ELEVEN
+ 0xA2FC: 0x216B, //ROMAN NUMERAL TWELVE
+ 0xA3A1: 0xFF01, //FULLWIDTH EXCLAMATION MARK
+ 0xA3A2: 0xFF02, //FULLWIDTH QUOTATION MARK
+ 0xA3A3: 0xFF03, //FULLWIDTH NUMBER SIGN
+ 0xA3A4: 0xFFE5, //FULLWIDTH YEN SIGN
+ 0xA3A5: 0xFF05, //FULLWIDTH PERCENT SIGN
+ 0xA3A6: 0xFF06, //FULLWIDTH AMPERSAND
+ 0xA3A7: 0xFF07, //FULLWIDTH APOSTROPHE
+ 0xA3A8: 0xFF08, //FULLWIDTH LEFT PARENTHESIS
+ 0xA3A9: 0xFF09, //FULLWIDTH RIGHT PARENTHESIS
+ 0xA3AA: 0xFF0A, //FULLWIDTH ASTERISK
+ 0xA3AB: 0xFF0B, //FULLWIDTH PLUS SIGN
+ 0xA3AC: 0xFF0C, //FULLWIDTH COMMA
+ 0xA3AD: 0xFF0D, //FULLWIDTH HYPHEN-MINUS
+ 0xA3AE: 0xFF0E, //FULLWIDTH FULL STOP
+ 0xA3AF: 0xFF0F, //FULLWIDTH SOLIDUS
+ 0xA3B0: 0xFF10, //FULLWIDTH DIGIT ZERO
+ 0xA3B1: 0xFF11, //FULLWIDTH DIGIT ONE
+ 0xA3B2: 0xFF12, //FULLWIDTH DIGIT TWO
+ 0xA3B3: 0xFF13, //FULLWIDTH DIGIT THREE
+ 0xA3B4: 0xFF14, //FULLWIDTH DIGIT FOUR
+ 0xA3B5: 0xFF15, //FULLWIDTH DIGIT FIVE
+ 0xA3B6: 0xFF16, //FULLWIDTH DIGIT SIX
+ 0xA3B7: 0xFF17, //FULLWIDTH DIGIT SEVEN
+ 0xA3B8: 0xFF18, //FULLWIDTH DIGIT EIGHT
+ 0xA3B9: 0xFF19, //FULLWIDTH DIGIT NINE
+ 0xA3BA: 0xFF1A, //FULLWIDTH COLON
+ 0xA3BB: 0xFF1B, //FULLWIDTH SEMICOLON
+ 0xA3BC: 0xFF1C, //FULLWIDTH LESS-THAN SIGN
+ 0xA3BD: 0xFF1D, //FULLWIDTH EQUALS SIGN
+ 0xA3BE: 0xFF1E, //FULLWIDTH GREATER-THAN SIGN
+ 0xA3BF: 0xFF1F, //FULLWIDTH QUESTION MARK
+ 0xA3C0: 0xFF20, //FULLWIDTH COMMERCIAL AT
+ 0xA3C1: 0xFF21, //FULLWIDTH LATIN CAPITAL LETTER A
+ 0xA3C2: 0xFF22, //FULLWIDTH LATIN CAPITAL LETTER B
+ 0xA3C3: 0xFF23, //FULLWIDTH LATIN CAPITAL LETTER C
+ 0xA3C4: 0xFF24, //FULLWIDTH LATIN CAPITAL LETTER D
+ 0xA3C5: 0xFF25, //FULLWIDTH LATIN CAPITAL LETTER E
+ 0xA3C6: 0xFF26, //FULLWIDTH LATIN CAPITAL LETTER F
+ 0xA3C7: 0xFF27, //FULLWIDTH LATIN CAPITAL LETTER G
+ 0xA3C8: 0xFF28, //FULLWIDTH LATIN CAPITAL LETTER H
+ 0xA3C9: 0xFF29, //FULLWIDTH LATIN CAPITAL LETTER I
+ 0xA3CA: 0xFF2A, //FULLWIDTH LATIN CAPITAL LETTER J
+ 0xA3CB: 0xFF2B, //FULLWIDTH LATIN CAPITAL LETTER K
+ 0xA3CC: 0xFF2C, //FULLWIDTH LATIN CAPITAL LETTER L
+ 0xA3CD: 0xFF2D, //FULLWIDTH LATIN CAPITAL LETTER M
+ 0xA3CE: 0xFF2E, //FULLWIDTH LATIN CAPITAL LETTER N
+ 0xA3CF: 0xFF2F, //FULLWIDTH LATIN CAPITAL LETTER O
+ 0xA3D0: 0xFF30, //FULLWIDTH LATIN CAPITAL LETTER P
+ 0xA3D1: 0xFF31, //FULLWIDTH LATIN CAPITAL LETTER Q
+ 0xA3D2: 0xFF32, //FULLWIDTH LATIN CAPITAL LETTER R
+ 0xA3D3: 0xFF33, //FULLWIDTH LATIN CAPITAL LETTER S
+ 0xA3D4: 0xFF34, //FULLWIDTH LATIN CAPITAL LETTER T
+ 0xA3D5: 0xFF35, //FULLWIDTH LATIN CAPITAL LETTER U
+ 0xA3D6: 0xFF36, //FULLWIDTH LATIN CAPITAL LETTER V
+ 0xA3D7: 0xFF37, //FULLWIDTH LATIN CAPITAL LETTER W
+ 0xA3D8: 0xFF38, //FULLWIDTH LATIN CAPITAL LETTER X
+ 0xA3D9: 0xFF39, //FULLWIDTH LATIN CAPITAL LETTER Y
+ 0xA3DA: 0xFF3A, //FULLWIDTH LATIN CAPITAL LETTER Z
+ 0xA3DB: 0xFF3B, //FULLWIDTH LEFT SQUARE BRACKET
+ 0xA3DC: 0xFF3C, //FULLWIDTH REVERSE SOLIDUS
+ 0xA3DD: 0xFF3D, //FULLWIDTH RIGHT SQUARE BRACKET
+ 0xA3DE: 0xFF3E, //FULLWIDTH CIRCUMFLEX ACCENT
+ 0xA3DF: 0xFF3F, //FULLWIDTH LOW LINE
+ 0xA3E0: 0xFF40, //FULLWIDTH GRAVE ACCENT
+ 0xA3E1: 0xFF41, //FULLWIDTH LATIN SMALL LETTER A
+ 0xA3E2: 0xFF42, //FULLWIDTH LATIN SMALL LETTER B
+ 0xA3E3: 0xFF43, //FULLWIDTH LATIN SMALL LETTER C
+ 0xA3E4: 0xFF44, //FULLWIDTH LATIN SMALL LETTER D
+ 0xA3E5: 0xFF45, //FULLWIDTH LATIN SMALL LETTER E
+ 0xA3E6: 0xFF46, //FULLWIDTH LATIN SMALL LETTER F
+ 0xA3E7: 0xFF47, //FULLWIDTH LATIN SMALL LETTER G
+ 0xA3E8: 0xFF48, //FULLWIDTH LATIN SMALL LETTER H
+ 0xA3E9: 0xFF49, //FULLWIDTH LATIN SMALL LETTER I
+ 0xA3EA: 0xFF4A, //FULLWIDTH LATIN SMALL LETTER J
+ 0xA3EB: 0xFF4B, //FULLWIDTH LATIN SMALL LETTER K
+ 0xA3EC: 0xFF4C, //FULLWIDTH LATIN SMALL LETTER L
+ 0xA3ED: 0xFF4D, //FULLWIDTH LATIN SMALL LETTER M
+ 0xA3EE: 0xFF4E, //FULLWIDTH LATIN SMALL LETTER N
+ 0xA3EF: 0xFF4F, //FULLWIDTH LATIN SMALL LETTER O
+ 0xA3F0: 0xFF50, //FULLWIDTH LATIN SMALL LETTER P
+ 0xA3F1: 0xFF51, //FULLWIDTH LATIN SMALL LETTER Q
+ 0xA3F2: 0xFF52, //FULLWIDTH LATIN SMALL LETTER R
+ 0xA3F3: 0xFF53, //FULLWIDTH LATIN SMALL LETTER S
+ 0xA3F4: 0xFF54, //FULLWIDTH LATIN SMALL LETTER T
+ 0xA3F5: 0xFF55, //FULLWIDTH LATIN SMALL LETTER U
+ 0xA3F6: 0xFF56, //FULLWIDTH LATIN SMALL LETTER V
+ 0xA3F7: 0xFF57, //FULLWIDTH LATIN SMALL LETTER W
+ 0xA3F8: 0xFF58, //FULLWIDTH LATIN SMALL LETTER X
+ 0xA3F9: 0xFF59, //FULLWIDTH LATIN SMALL LETTER Y
+ 0xA3FA: 0xFF5A, //FULLWIDTH LATIN SMALL LETTER Z
+ 0xA3FB: 0xFF5B, //FULLWIDTH LEFT CURLY BRACKET
+ 0xA3FC: 0xFF5C, //FULLWIDTH VERTICAL LINE
+ 0xA3FD: 0xFF5D, //FULLWIDTH RIGHT CURLY BRACKET
+ 0xA3FE: 0xFFE3, //FULLWIDTH MACRON
+ 0xA4A1: 0x3041, //HIRAGANA LETTER SMALL A
+ 0xA4A2: 0x3042, //HIRAGANA LETTER A
+ 0xA4A3: 0x3043, //HIRAGANA LETTER SMALL I
+ 0xA4A4: 0x3044, //HIRAGANA LETTER I
+ 0xA4A5: 0x3045, //HIRAGANA LETTER SMALL U
+ 0xA4A6: 0x3046, //HIRAGANA LETTER U
+ 0xA4A7: 0x3047, //HIRAGANA LETTER SMALL E
+ 0xA4A8: 0x3048, //HIRAGANA LETTER E
+ 0xA4A9: 0x3049, //HIRAGANA LETTER SMALL O
+ 0xA4AA: 0x304A, //HIRAGANA LETTER O
+ 0xA4AB: 0x304B, //HIRAGANA LETTER KA
+ 0xA4AC: 0x304C, //HIRAGANA LETTER GA
+ 0xA4AD: 0x304D, //HIRAGANA LETTER KI
+ 0xA4AE: 0x304E, //HIRAGANA LETTER GI
+ 0xA4AF: 0x304F, //HIRAGANA LETTER KU
+ 0xA4B0: 0x3050, //HIRAGANA LETTER GU
+ 0xA4B1: 0x3051, //HIRAGANA LETTER KE
+ 0xA4B2: 0x3052, //HIRAGANA LETTER GE
+ 0xA4B3: 0x3053, //HIRAGANA LETTER KO
+ 0xA4B4: 0x3054, //HIRAGANA LETTER GO
+ 0xA4B5: 0x3055, //HIRAGANA LETTER SA
+ 0xA4B6: 0x3056, //HIRAGANA LETTER ZA
+ 0xA4B7: 0x3057, //HIRAGANA LETTER SI
+ 0xA4B8: 0x3058, //HIRAGANA LETTER ZI
+ 0xA4B9: 0x3059, //HIRAGANA LETTER SU
+ 0xA4BA: 0x305A, //HIRAGANA LETTER ZU
+ 0xA4BB: 0x305B, //HIRAGANA LETTER SE
+ 0xA4BC: 0x305C, //HIRAGANA LETTER ZE
+ 0xA4BD: 0x305D, //HIRAGANA LETTER SO
+ 0xA4BE: 0x305E, //HIRAGANA LETTER ZO
+ 0xA4BF: 0x305F, //HIRAGANA LETTER TA
+ 0xA4C0: 0x3060, //HIRAGANA LETTER DA
+ 0xA4C1: 0x3061, //HIRAGANA LETTER TI
+ 0xA4C2: 0x3062, //HIRAGANA LETTER DI
+ 0xA4C3: 0x3063, //HIRAGANA LETTER SMALL TU
+ 0xA4C4: 0x3064, //HIRAGANA LETTER TU
+ 0xA4C5: 0x3065, //HIRAGANA LETTER DU
+ 0xA4C6: 0x3066, //HIRAGANA LETTER TE
+ 0xA4C7: 0x3067, //HIRAGANA LETTER DE
+ 0xA4C8: 0x3068, //HIRAGANA LETTER TO
+ 0xA4C9: 0x3069, //HIRAGANA LETTER DO
+ 0xA4CA: 0x306A, //HIRAGANA LETTER NA
+ 0xA4CB: 0x306B, //HIRAGANA LETTER NI
+ 0xA4CC: 0x306C, //HIRAGANA LETTER NU
+ 0xA4CD: 0x306D, //HIRAGANA LETTER NE
+ 0xA4CE: 0x306E, //HIRAGANA LETTER NO
+ 0xA4CF: 0x306F, //HIRAGANA LETTER HA
+ 0xA4D0: 0x3070, //HIRAGANA LETTER BA
+ 0xA4D1: 0x3071, //HIRAGANA LETTER PA
+ 0xA4D2: 0x3072, //HIRAGANA LETTER HI
+ 0xA4D3: 0x3073, //HIRAGANA LETTER BI
+ 0xA4D4: 0x3074, //HIRAGANA LETTER PI
+ 0xA4D5: 0x3075, //HIRAGANA LETTER HU
+ 0xA4D6: 0x3076, //HIRAGANA LETTER BU
+ 0xA4D7: 0x3077, //HIRAGANA LETTER PU
+ 0xA4D8: 0x3078, //HIRAGANA LETTER HE
+ 0xA4D9: 0x3079, //HIRAGANA LETTER BE
+ 0xA4DA: 0x307A, //HIRAGANA LETTER PE
+ 0xA4DB: 0x307B, //HIRAGANA LETTER HO
+ 0xA4DC: 0x307C, //HIRAGANA LETTER BO
+ 0xA4DD: 0x307D, //HIRAGANA LETTER PO
+ 0xA4DE: 0x307E, //HIRAGANA LETTER MA
+ 0xA4DF: 0x307F, //HIRAGANA LETTER MI
+ 0xA4E0: 0x3080, //HIRAGANA LETTER MU
+ 0xA4E1: 0x3081, //HIRAGANA LETTER ME
+ 0xA4E2: 0x3082, //HIRAGANA LETTER MO
+ 0xA4E3: 0x3083, //HIRAGANA LETTER SMALL YA
+ 0xA4E4: 0x3084, //HIRAGANA LETTER YA
+ 0xA4E5: 0x3085, //HIRAGANA LETTER SMALL YU
+ 0xA4E6: 0x3086, //HIRAGANA LETTER YU
+ 0xA4E7: 0x3087, //HIRAGANA LETTER SMALL YO
+ 0xA4E8: 0x3088, //HIRAGANA LETTER YO
+ 0xA4E9: 0x3089, //HIRAGANA LETTER RA
+ 0xA4EA: 0x308A, //HIRAGANA LETTER RI
+ 0xA4EB: 0x308B, //HIRAGANA LETTER RU
+ 0xA4EC: 0x308C, //HIRAGANA LETTER RE
+ 0xA4ED: 0x308D, //HIRAGANA LETTER RO
+ 0xA4EE: 0x308E, //HIRAGANA LETTER SMALL WA
+ 0xA4EF: 0x308F, //HIRAGANA LETTER WA
+ 0xA4F0: 0x3090, //HIRAGANA LETTER WI
+ 0xA4F1: 0x3091, //HIRAGANA LETTER WE
+ 0xA4F2: 0x3092, //HIRAGANA LETTER WO
+ 0xA4F3: 0x3093, //HIRAGANA LETTER N
+ 0xA5A1: 0x30A1, //KATAKANA LETTER SMALL A
+ 0xA5A2: 0x30A2, //KATAKANA LETTER A
+ 0xA5A3: 0x30A3, //KATAKANA LETTER SMALL I
+ 0xA5A4: 0x30A4, //KATAKANA LETTER I
+ 0xA5A5: 0x30A5, //KATAKANA LETTER SMALL U
+ 0xA5A6: 0x30A6, //KATAKANA LETTER U
+ 0xA5A7: 0x30A7, //KATAKANA LETTER SMALL E
+ 0xA5A8: 0x30A8, //KATAKANA LETTER E
+ 0xA5A9: 0x30A9, //KATAKANA LETTER SMALL O
+ 0xA5AA: 0x30AA, //KATAKANA LETTER O
+ 0xA5AB: 0x30AB, //KATAKANA LETTER KA
+ 0xA5AC: 0x30AC, //KATAKANA LETTER GA
+ 0xA5AD: 0x30AD, //KATAKANA LETTER KI
+ 0xA5AE: 0x30AE, //KATAKANA LETTER GI
+ 0xA5AF: 0x30AF, //KATAKANA LETTER KU
+ 0xA5B0: 0x30B0, //KATAKANA LETTER GU
+ 0xA5B1: 0x30B1, //KATAKANA LETTER KE
+ 0xA5B2: 0x30B2, //KATAKANA LETTER GE
+ 0xA5B3: 0x30B3, //KATAKANA LETTER KO
+ 0xA5B4: 0x30B4, //KATAKANA LETTER GO
+ 0xA5B5: 0x30B5, //KATAKANA LETTER SA
+ 0xA5B6: 0x30B6, //KATAKANA LETTER ZA
+ 0xA5B7: 0x30B7, //KATAKANA LETTER SI
+ 0xA5B8: 0x30B8, //KATAKANA LETTER ZI
+ 0xA5B9: 0x30B9, //KATAKANA LETTER SU
+ 0xA5BA: 0x30BA, //KATAKANA LETTER ZU
+ 0xA5BB: 0x30BB, //KATAKANA LETTER SE
+ 0xA5BC: 0x30BC, //KATAKANA LETTER ZE
+ 0xA5BD: 0x30BD, //KATAKANA LETTER SO
+ 0xA5BE: 0x30BE, //KATAKANA LETTER ZO
+ 0xA5BF: 0x30BF, //KATAKANA LETTER TA
+ 0xA5C0: 0x30C0, //KATAKANA LETTER DA
+ 0xA5C1: 0x30C1, //KATAKANA LETTER TI
+ 0xA5C2: 0x30C2, //KATAKANA LETTER DI
+ 0xA5C3: 0x30C3, //KATAKANA LETTER SMALL TU
+ 0xA5C4: 0x30C4, //KATAKANA LETTER TU
+ 0xA5C5: 0x30C5, //KATAKANA LETTER DU
+ 0xA5C6: 0x30C6, //KATAKANA LETTER TE
+ 0xA5C7: 0x30C7, //KATAKANA LETTER DE
+ 0xA5C8: 0x30C8, //KATAKANA LETTER TO
+ 0xA5C9: 0x30C9, //KATAKANA LETTER DO
+ 0xA5CA: 0x30CA, //KATAKANA LETTER NA
+ 0xA5CB: 0x30CB, //KATAKANA LETTER NI
+ 0xA5CC: 0x30CC, //KATAKANA LETTER NU
+ 0xA5CD: 0x30CD, //KATAKANA LETTER NE
+ 0xA5CE: 0x30CE, //KATAKANA LETTER NO
+ 0xA5CF: 0x30CF, //KATAKANA LETTER HA
+ 0xA5D0: 0x30D0, //KATAKANA LETTER BA
+ 0xA5D1: 0x30D1, //KATAKANA LETTER PA
+ 0xA5D2: 0x30D2, //KATAKANA LETTER HI
+ 0xA5D3: 0x30D3, //KATAKANA LETTER BI
+ 0xA5D4: 0x30D4, //KATAKANA LETTER PI
+ 0xA5D5: 0x30D5, //KATAKANA LETTER HU
+ 0xA5D6: 0x30D6, //KATAKANA LETTER BU
+ 0xA5D7: 0x30D7, //KATAKANA LETTER PU
+ 0xA5D8: 0x30D8, //KATAKANA LETTER HE
+ 0xA5D9: 0x30D9, //KATAKANA LETTER BE
+ 0xA5DA: 0x30DA, //KATAKANA LETTER PE
+ 0xA5DB: 0x30DB, //KATAKANA LETTER HO
+ 0xA5DC: 0x30DC, //KATAKANA LETTER BO
+ 0xA5DD: 0x30DD, //KATAKANA LETTER PO
+ 0xA5DE: 0x30DE, //KATAKANA LETTER MA
+ 0xA5DF: 0x30DF, //KATAKANA LETTER MI
+ 0xA5E0: 0x30E0, //KATAKANA LETTER MU
+ 0xA5E1: 0x30E1, //KATAKANA LETTER ME
+ 0xA5E2: 0x30E2, //KATAKANA LETTER MO
+ 0xA5E3: 0x30E3, //KATAKANA LETTER SMALL YA
+ 0xA5E4: 0x30E4, //KATAKANA LETTER YA
+ 0xA5E5: 0x30E5, //KATAKANA LETTER SMALL YU
+ 0xA5E6: 0x30E6, //KATAKANA LETTER YU
+ 0xA5E7: 0x30E7, //KATAKANA LETTER SMALL YO
+ 0xA5E8: 0x30E8, //KATAKANA LETTER YO
+ 0xA5E9: 0x30E9, //KATAKANA LETTER RA
+ 0xA5EA: 0x30EA, //KATAKANA LETTER RI
+ 0xA5EB: 0x30EB, //KATAKANA LETTER RU
+ 0xA5EC: 0x30EC, //KATAKANA LETTER RE
+ 0xA5ED: 0x30ED, //KATAKANA LETTER RO
+ 0xA5EE: 0x30EE, //KATAKANA LETTER SMALL WA
+ 0xA5EF: 0x30EF, //KATAKANA LETTER WA
+ 0xA5F0: 0x30F0, //KATAKANA LETTER WI
+ 0xA5F1: 0x30F1, //KATAKANA LETTER WE
+ 0xA5F2: 0x30F2, //KATAKANA LETTER WO
+ 0xA5F3: 0x30F3, //KATAKANA LETTER N
+ 0xA5F4: 0x30F4, //KATAKANA LETTER VU
+ 0xA5F5: 0x30F5, //KATAKANA LETTER SMALL KA
+ 0xA5F6: 0x30F6, //KATAKANA LETTER SMALL KE
+ 0xA6A1: 0x0391, //GREEK CAPITAL LETTER ALPHA
+ 0xA6A2: 0x0392, //GREEK CAPITAL LETTER BETA
+ 0xA6A3: 0x0393, //GREEK CAPITAL LETTER GAMMA
+ 0xA6A4: 0x0394, //GREEK CAPITAL LETTER DELTA
+ 0xA6A5: 0x0395, //GREEK CAPITAL LETTER EPSILON
+ 0xA6A6: 0x0396, //GREEK CAPITAL LETTER ZETA
+ 0xA6A7: 0x0397, //GREEK CAPITAL LETTER ETA
+ 0xA6A8: 0x0398, //GREEK CAPITAL LETTER THETA
+ 0xA6A9: 0x0399, //GREEK CAPITAL LETTER IOTA
+ 0xA6AA: 0x039A, //GREEK CAPITAL LETTER KAPPA
+ 0xA6AB: 0x039B, //GREEK CAPITAL LETTER LAMDA
+ 0xA6AC: 0x039C, //GREEK CAPITAL LETTER MU
+ 0xA6AD: 0x039D, //GREEK CAPITAL LETTER NU
+ 0xA6AE: 0x039E, //GREEK CAPITAL LETTER XI
+ 0xA6AF: 0x039F, //GREEK CAPITAL LETTER OMICRON
+ 0xA6B0: 0x03A0, //GREEK CAPITAL LETTER PI
+ 0xA6B1: 0x03A1, //GREEK CAPITAL LETTER RHO
+ 0xA6B2: 0x03A3, //GREEK CAPITAL LETTER SIGMA
+ 0xA6B3: 0x03A4, //GREEK CAPITAL LETTER TAU
+ 0xA6B4: 0x03A5, //GREEK CAPITAL LETTER UPSILON
+ 0xA6B5: 0x03A6, //GREEK CAPITAL LETTER PHI
+ 0xA6B6: 0x03A7, //GREEK CAPITAL LETTER CHI
+ 0xA6B7: 0x03A8, //GREEK CAPITAL LETTER PSI
+ 0xA6B8: 0x03A9, //GREEK CAPITAL LETTER OMEGA
+ 0xA6C1: 0x03B1, //GREEK SMALL LETTER ALPHA
+ 0xA6C2: 0x03B2, //GREEK SMALL LETTER BETA
+ 0xA6C3: 0x03B3, //GREEK SMALL LETTER GAMMA
+ 0xA6C4: 0x03B4, //GREEK SMALL LETTER DELTA
+ 0xA6C5: 0x03B5, //GREEK SMALL LETTER EPSILON
+ 0xA6C6: 0x03B6, //GREEK SMALL LETTER ZETA
+ 0xA6C7: 0x03B7, //GREEK SMALL LETTER ETA
+ 0xA6C8: 0x03B8, //GREEK SMALL LETTER THETA
+ 0xA6C9: 0x03B9, //GREEK SMALL LETTER IOTA
+ 0xA6CA: 0x03BA, //GREEK SMALL LETTER KAPPA
+ 0xA6CB: 0x03BB, //GREEK SMALL LETTER LAMDA
+ 0xA6CC: 0x03BC, //GREEK SMALL LETTER MU
+ 0xA6CD: 0x03BD, //GREEK SMALL LETTER NU
+ 0xA6CE: 0x03BE, //GREEK SMALL LETTER XI
+ 0xA6CF: 0x03BF, //GREEK SMALL LETTER OMICRON
+ 0xA6D0: 0x03C0, //GREEK SMALL LETTER PI
+ 0xA6D1: 0x03C1, //GREEK SMALL LETTER RHO
+ 0xA6D2: 0x03C3, //GREEK SMALL LETTER SIGMA
+ 0xA6D3: 0x03C4, //GREEK SMALL LETTER TAU
+ 0xA6D4: 0x03C5, //GREEK SMALL LETTER UPSILON
+ 0xA6D5: 0x03C6, //GREEK SMALL LETTER PHI
+ 0xA6D6: 0x03C7, //GREEK SMALL LETTER CHI
+ 0xA6D7: 0x03C8, //GREEK SMALL LETTER PSI
+ 0xA6D8: 0x03C9, //GREEK SMALL LETTER OMEGA
+ 0xA6E0: 0xFE35, //PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+ 0xA6E1: 0xFE36, //PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+ 0xA6E2: 0xFE39, //PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+ 0xA6E3: 0xFE3A, //PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+ 0xA6E4: 0xFE3F, //PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+ 0xA6E5: 0xFE40, //PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+ 0xA6E6: 0xFE3D, //PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+ 0xA6E7: 0xFE3E, //PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+ 0xA6E8: 0xFE41, //PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+ 0xA6E9: 0xFE42, //PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+ 0xA6EA: 0xFE43, //PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+ 0xA6EB: 0xFE44, //PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+ 0xA6EE: 0xFE3B, //PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+ 0xA6EF: 0xFE3C, //PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+ 0xA6F0: 0xFE37, //PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+ 0xA6F1: 0xFE38, //PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+ 0xA6F2: 0xFE31, //PRESENTATION FORM FOR VERTICAL EM DASH
+ 0xA6F4: 0xFE33, //PRESENTATION FORM FOR VERTICAL LOW LINE
+ 0xA6F5: 0xFE34, //PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+ 0xA7A1: 0x0410, //CYRILLIC CAPITAL LETTER A
+ 0xA7A2: 0x0411, //CYRILLIC CAPITAL LETTER BE
+ 0xA7A3: 0x0412, //CYRILLIC CAPITAL LETTER VE
+ 0xA7A4: 0x0413, //CYRILLIC CAPITAL LETTER GHE
+ 0xA7A5: 0x0414, //CYRILLIC CAPITAL LETTER DE
+ 0xA7A6: 0x0415, //CYRILLIC CAPITAL LETTER IE
+ 0xA7A7: 0x0401, //CYRILLIC CAPITAL LETTER IO
+ 0xA7A8: 0x0416, //CYRILLIC CAPITAL LETTER ZHE
+ 0xA7A9: 0x0417, //CYRILLIC CAPITAL LETTER ZE
+ 0xA7AA: 0x0418, //CYRILLIC CAPITAL LETTER I
+ 0xA7AB: 0x0419, //CYRILLIC CAPITAL LETTER SHORT I
+ 0xA7AC: 0x041A, //CYRILLIC CAPITAL LETTER KA
+ 0xA7AD: 0x041B, //CYRILLIC CAPITAL LETTER EL
+ 0xA7AE: 0x041C, //CYRILLIC CAPITAL LETTER EM
+ 0xA7AF: 0x041D, //CYRILLIC CAPITAL LETTER EN
+ 0xA7B0: 0x041E, //CYRILLIC CAPITAL LETTER O
+ 0xA7B1: 0x041F, //CYRILLIC CAPITAL LETTER PE
+ 0xA7B2: 0x0420, //CYRILLIC CAPITAL LETTER ER
+ 0xA7B3: 0x0421, //CYRILLIC CAPITAL LETTER ES
+ 0xA7B4: 0x0422, //CYRILLIC CAPITAL LETTER TE
+ 0xA7B5: 0x0423, //CYRILLIC CAPITAL LETTER U
+ 0xA7B6: 0x0424, //CYRILLIC CAPITAL LETTER EF
+ 0xA7B7: 0x0425, //CYRILLIC CAPITAL LETTER HA
+ 0xA7B8: 0x0426, //CYRILLIC CAPITAL LETTER TSE
+ 0xA7B9: 0x0427, //CYRILLIC CAPITAL LETTER CHE
+ 0xA7BA: 0x0428, //CYRILLIC CAPITAL LETTER SHA
+ 0xA7BB: 0x0429, //CYRILLIC CAPITAL LETTER SHCHA
+ 0xA7BC: 0x042A, //CYRILLIC CAPITAL LETTER HARD SIGN
+ 0xA7BD: 0x042B, //CYRILLIC CAPITAL LETTER YERU
+ 0xA7BE: 0x042C, //CYRILLIC CAPITAL LETTER SOFT SIGN
+ 0xA7BF: 0x042D, //CYRILLIC CAPITAL LETTER E
+ 0xA7C0: 0x042E, //CYRILLIC CAPITAL LETTER YU
+ 0xA7C1: 0x042F, //CYRILLIC CAPITAL LETTER YA
+ 0xA7D1: 0x0430, //CYRILLIC SMALL LETTER A
+ 0xA7D2: 0x0431, //CYRILLIC SMALL LETTER BE
+ 0xA7D3: 0x0432, //CYRILLIC SMALL LETTER VE
+ 0xA7D4: 0x0433, //CYRILLIC SMALL LETTER GHE
+ 0xA7D5: 0x0434, //CYRILLIC SMALL LETTER DE
+ 0xA7D6: 0x0435, //CYRILLIC SMALL LETTER IE
+ 0xA7D7: 0x0451, //CYRILLIC SMALL LETTER IO
+ 0xA7D8: 0x0436, //CYRILLIC SMALL LETTER ZHE
+ 0xA7D9: 0x0437, //CYRILLIC SMALL LETTER ZE
+ 0xA7DA: 0x0438, //CYRILLIC SMALL LETTER I
+ 0xA7DB: 0x0439, //CYRILLIC SMALL LETTER SHORT I
+ 0xA7DC: 0x043A, //CYRILLIC SMALL LETTER KA
+ 0xA7DD: 0x043B, //CYRILLIC SMALL LETTER EL
+ 0xA7DE: 0x043C, //CYRILLIC SMALL LETTER EM
+ 0xA7DF: 0x043D, //CYRILLIC SMALL LETTER EN
+ 0xA7E0: 0x043E, //CYRILLIC SMALL LETTER O
+ 0xA7E1: 0x043F, //CYRILLIC SMALL LETTER PE
+ 0xA7E2: 0x0440, //CYRILLIC SMALL LETTER ER
+ 0xA7E3: 0x0441, //CYRILLIC SMALL LETTER ES
+ 0xA7E4: 0x0442, //CYRILLIC SMALL LETTER TE
+ 0xA7E5: 0x0443, //CYRILLIC SMALL LETTER U
+ 0xA7E6: 0x0444, //CYRILLIC SMALL LETTER EF
+ 0xA7E7: 0x0445, //CYRILLIC SMALL LETTER HA
+ 0xA7E8: 0x0446, //CYRILLIC SMALL LETTER TSE
+ 0xA7E9: 0x0447, //CYRILLIC SMALL LETTER CHE
+ 0xA7EA: 0x0448, //CYRILLIC SMALL LETTER SHA
+ 0xA7EB: 0x0449, //CYRILLIC SMALL LETTER SHCHA
+ 0xA7EC: 0x044A, //CYRILLIC SMALL LETTER HARD SIGN
+ 0xA7ED: 0x044B, //CYRILLIC SMALL LETTER YERU
+ 0xA7EE: 0x044C, //CYRILLIC SMALL LETTER SOFT SIGN
+ 0xA7EF: 0x044D, //CYRILLIC SMALL LETTER E
+ 0xA7F0: 0x044E, //CYRILLIC SMALL LETTER YU
+ 0xA7F1: 0x044F, //CYRILLIC SMALL LETTER YA
+ 0xA840: 0x02CA, //MODIFIER LETTER ACUTE ACCENT
+ 0xA841: 0x02CB, //MODIFIER LETTER GRAVE ACCENT
+ 0xA842: 0x02D9, //DOT ABOVE
+ 0xA843: 0x2013, //EN DASH
+ 0xA844: 0x2015, //HORIZONTAL BAR
+ 0xA845: 0x2025, //TWO DOT LEADER
+ 0xA846: 0x2035, //REVERSED PRIME
+ 0xA847: 0x2105, //CARE OF
+ 0xA848: 0x2109, //DEGREE FAHRENHEIT
+ 0xA849: 0x2196, //NORTH WEST ARROW
+ 0xA84A: 0x2197, //NORTH EAST ARROW
+ 0xA84B: 0x2198, //SOUTH EAST ARROW
+ 0xA84C: 0x2199, //SOUTH WEST ARROW
+ 0xA84D: 0x2215, //DIVISION SLASH
+ 0xA84E: 0x221F, //RIGHT ANGLE
+ 0xA84F: 0x2223, //DIVIDES
+ 0xA850: 0x2252, //APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ 0xA851: 0x2266, //LESS-THAN OVER EQUAL TO
+ 0xA852: 0x2267, //GREATER-THAN OVER EQUAL TO
+ 0xA853: 0x22BF, //RIGHT TRIANGLE
+ 0xA854: 0x2550, //BOX DRAWINGS DOUBLE HORIZONTAL
+ 0xA855: 0x2551, //BOX DRAWINGS DOUBLE VERTICAL
+ 0xA856: 0x2552, //BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+ 0xA857: 0x2553, //BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+ 0xA858: 0x2554, //BOX DRAWINGS DOUBLE DOWN AND RIGHT
+ 0xA859: 0x2555, //BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+ 0xA85A: 0x2556, //BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+ 0xA85B: 0x2557, //BOX DRAWINGS DOUBLE DOWN AND LEFT
+ 0xA85C: 0x2558, //BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+ 0xA85D: 0x2559, //BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+ 0xA85E: 0x255A, //BOX DRAWINGS DOUBLE UP AND RIGHT
+ 0xA85F: 0x255B, //BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+ 0xA860: 0x255C, //BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+ 0xA861: 0x255D, //BOX DRAWINGS DOUBLE UP AND LEFT
+ 0xA862: 0x255E, //BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ 0xA863: 0x255F, //BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+ 0xA864: 0x2560, //BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+ 0xA865: 0x2561, //BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ 0xA866: 0x2562, //BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+ 0xA867: 0x2563, //BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+ 0xA868: 0x2564, //BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+ 0xA869: 0x2565, //BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+ 0xA86A: 0x2566, //BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+ 0xA86B: 0x2567, //BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+ 0xA86C: 0x2568, //BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+ 0xA86D: 0x2569, //BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+ 0xA86E: 0x256A, //BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ 0xA86F: 0x256B, //BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+ 0xA870: 0x256C, //BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+ 0xA871: 0x256D, //BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+ 0xA872: 0x256E, //BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+ 0xA873: 0x256F, //BOX DRAWINGS LIGHT ARC UP AND LEFT
+ 0xA874: 0x2570, //BOX DRAWINGS LIGHT ARC UP AND RIGHT
+ 0xA875: 0x2571, //BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+ 0xA876: 0x2572, //BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+ 0xA877: 0x2573, //BOX DRAWINGS LIGHT DIAGONAL CROSS
+ 0xA878: 0x2581, //LOWER ONE EIGHTH BLOCK
+ 0xA879: 0x2582, //LOWER ONE QUARTER BLOCK
+ 0xA87A: 0x2583, //LOWER THREE EIGHTHS BLOCK
+ 0xA87B: 0x2584, //LOWER HALF BLOCK
+ 0xA87C: 0x2585, //LOWER FIVE EIGHTHS BLOCK
+ 0xA87D: 0x2586, //LOWER THREE QUARTERS BLOCK
+ 0xA87E: 0x2587, //LOWER SEVEN EIGHTHS BLOCK
+ 0xA880: 0x2588, //FULL BLOCK
+ 0xA881: 0x2589, //LEFT SEVEN EIGHTHS BLOCK
+ 0xA882: 0x258A, //LEFT THREE QUARTERS BLOCK
+ 0xA883: 0x258B, //LEFT FIVE EIGHTHS BLOCK
+ 0xA884: 0x258C, //LEFT HALF BLOCK
+ 0xA885: 0x258D, //LEFT THREE EIGHTHS BLOCK
+ 0xA886: 0x258E, //LEFT ONE QUARTER BLOCK
+ 0xA887: 0x258F, //LEFT ONE EIGHTH BLOCK
+ 0xA888: 0x2593, //DARK SHADE
+ 0xA889: 0x2594, //UPPER ONE EIGHTH BLOCK
+ 0xA88A: 0x2595, //RIGHT ONE EIGHTH BLOCK
+ 0xA88B: 0x25BC, //BLACK DOWN-POINTING TRIANGLE
+ 0xA88C: 0x25BD, //WHITE DOWN-POINTING TRIANGLE
+ 0xA88D: 0x25E2, //BLACK LOWER RIGHT TRIANGLE
+ 0xA88E: 0x25E3, //BLACK LOWER LEFT TRIANGLE
+ 0xA88F: 0x25E4, //BLACK UPPER LEFT TRIANGLE
+ 0xA890: 0x25E5, //BLACK UPPER RIGHT TRIANGLE
+ 0xA891: 0x2609, //SUN
+ 0xA892: 0x2295, //CIRCLED PLUS
+ 0xA893: 0x3012, //POSTAL MARK
+ 0xA894: 0x301D, //REVERSED DOUBLE PRIME QUOTATION MARK
+ 0xA895: 0x301E, //DOUBLE PRIME QUOTATION MARK
+ 0xA8A1: 0x0101, //LATIN SMALL LETTER A WITH MACRON
+ 0xA8A2: 0x00E1, //LATIN SMALL LETTER A WITH ACUTE
+ 0xA8A3: 0x01CE, //LATIN SMALL LETTER A WITH CARON
+ 0xA8A4: 0x00E0, //LATIN SMALL LETTER A WITH GRAVE
+ 0xA8A5: 0x0113, //LATIN SMALL LETTER E WITH MACRON
+ 0xA8A6: 0x00E9, //LATIN SMALL LETTER E WITH ACUTE
+ 0xA8A7: 0x011B, //LATIN SMALL LETTER E WITH CARON
+ 0xA8A8: 0x00E8, //LATIN SMALL LETTER E WITH GRAVE
+ 0xA8A9: 0x012B, //LATIN SMALL LETTER I WITH MACRON
+ 0xA8AA: 0x00ED, //LATIN SMALL LETTER I WITH ACUTE
+ 0xA8AB: 0x01D0, //LATIN SMALL LETTER I WITH CARON
+ 0xA8AC: 0x00EC, //LATIN SMALL LETTER I WITH GRAVE
+ 0xA8AD: 0x014D, //LATIN SMALL LETTER O WITH MACRON
+ 0xA8AE: 0x00F3, //LATIN SMALL LETTER O WITH ACUTE
+ 0xA8AF: 0x01D2, //LATIN SMALL LETTER O WITH CARON
+ 0xA8B0: 0x00F2, //LATIN SMALL LETTER O WITH GRAVE
+ 0xA8B1: 0x016B, //LATIN SMALL LETTER U WITH MACRON
+ 0xA8B2: 0x00FA, //LATIN SMALL LETTER U WITH ACUTE
+ 0xA8B3: 0x01D4, //LATIN SMALL LETTER U WITH CARON
+ 0xA8B4: 0x00F9, //LATIN SMALL LETTER U WITH GRAVE
+ 0xA8B5: 0x01D6, //LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+ 0xA8B6: 0x01D8, //LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+ 0xA8B7: 0x01DA, //LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+ 0xA8B8: 0x01DC, //LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+ 0xA8B9: 0x00FC, //LATIN SMALL LETTER U WITH DIAERESIS
+ 0xA8BA: 0x00EA, //LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0xA8BB: 0x0251, //LATIN SMALL LETTER ALPHA
+ 0xA8BD: 0x0144, //LATIN SMALL LETTER N WITH ACUTE
+ 0xA8BE: 0x0148, //LATIN SMALL LETTER N WITH CARON
+ 0xA8C0: 0x0261, //LATIN SMALL LETTER SCRIPT G
+ 0xA8C5: 0x3105, //BOPOMOFO LETTER B
+ 0xA8C6: 0x3106, //BOPOMOFO LETTER P
+ 0xA8C7: 0x3107, //BOPOMOFO LETTER M
+ 0xA8C8: 0x3108, //BOPOMOFO LETTER F
+ 0xA8C9: 0x3109, //BOPOMOFO LETTER D
+ 0xA8CA: 0x310A, //BOPOMOFO LETTER T
+ 0xA8CB: 0x310B, //BOPOMOFO LETTER N
+ 0xA8CC: 0x310C, //BOPOMOFO LETTER L
+ 0xA8CD: 0x310D, //BOPOMOFO LETTER G
+ 0xA8CE: 0x310E, //BOPOMOFO LETTER K
+ 0xA8CF: 0x310F, //BOPOMOFO LETTER H
+ 0xA8D0: 0x3110, //BOPOMOFO LETTER J
+ 0xA8D1: 0x3111, //BOPOMOFO LETTER Q
+ 0xA8D2: 0x3112, //BOPOMOFO LETTER X
+ 0xA8D3: 0x3113, //BOPOMOFO LETTER ZH
+ 0xA8D4: 0x3114, //BOPOMOFO LETTER CH
+ 0xA8D5: 0x3115, //BOPOMOFO LETTER SH
+ 0xA8D6: 0x3116, //BOPOMOFO LETTER R
+ 0xA8D7: 0x3117, //BOPOMOFO LETTER Z
+ 0xA8D8: 0x3118, //BOPOMOFO LETTER C
+ 0xA8D9: 0x3119, //BOPOMOFO LETTER S
+ 0xA8DA: 0x311A, //BOPOMOFO LETTER A
+ 0xA8DB: 0x311B, //BOPOMOFO LETTER O
+ 0xA8DC: 0x311C, //BOPOMOFO LETTER E
+ 0xA8DD: 0x311D, //BOPOMOFO LETTER EH
+ 0xA8DE: 0x311E, //BOPOMOFO LETTER AI
+ 0xA8DF: 0x311F, //BOPOMOFO LETTER EI
+ 0xA8E0: 0x3120, //BOPOMOFO LETTER AU
+ 0xA8E1: 0x3121, //BOPOMOFO LETTER OU
+ 0xA8E2: 0x3122, //BOPOMOFO LETTER AN
+ 0xA8E3: 0x3123, //BOPOMOFO LETTER EN
+ 0xA8E4: 0x3124, //BOPOMOFO LETTER ANG
+ 0xA8E5: 0x3125, //BOPOMOFO LETTER ENG
+ 0xA8E6: 0x3126, //BOPOMOFO LETTER ER
+ 0xA8E7: 0x3127, //BOPOMOFO LETTER I
+ 0xA8E8: 0x3128, //BOPOMOFO LETTER U
+ 0xA8E9: 0x3129, //BOPOMOFO LETTER IU
+ 0xA940: 0x3021, //HANGZHOU NUMERAL ONE
+ 0xA941: 0x3022, //HANGZHOU NUMERAL TWO
+ 0xA942: 0x3023, //HANGZHOU NUMERAL THREE
+ 0xA943: 0x3024, //HANGZHOU NUMERAL FOUR
+ 0xA944: 0x3025, //HANGZHOU NUMERAL FIVE
+ 0xA945: 0x3026, //HANGZHOU NUMERAL SIX
+ 0xA946: 0x3027, //HANGZHOU NUMERAL SEVEN
+ 0xA947: 0x3028, //HANGZHOU NUMERAL EIGHT
+ 0xA948: 0x3029, //HANGZHOU NUMERAL NINE
+ 0xA949: 0x32A3, //CIRCLED IDEOGRAPH CORRECT
+ 0xA94A: 0x338E, //SQUARE MG
+ 0xA94B: 0x338F, //SQUARE KG
+ 0xA94C: 0x339C, //SQUARE MM
+ 0xA94D: 0x339D, //SQUARE CM
+ 0xA94E: 0x339E, //SQUARE KM
+ 0xA94F: 0x33A1, //SQUARE M SQUARED
+ 0xA950: 0x33C4, //SQUARE CC
+ 0xA951: 0x33CE, //SQUARE KM CAPITAL
+ 0xA952: 0x33D1, //SQUARE LN
+ 0xA953: 0x33D2, //SQUARE LOG
+ 0xA954: 0x33D5, //SQUARE MIL
+ 0xA955: 0xFE30, //PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+ 0xA956: 0xFFE2, //FULLWIDTH NOT SIGN
+ 0xA957: 0xFFE4, //FULLWIDTH BROKEN BAR
+ 0xA959: 0x2121, //TELEPHONE SIGN
+ 0xA95A: 0x3231, //PARENTHESIZED IDEOGRAPH STOCK
+ 0xA95C: 0x2010, //HYPHEN
+ 0xA960: 0x30FC, //KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ 0xA961: 0x309B, //KATAKANA-HIRAGANA VOICED SOUND MARK
+ 0xA962: 0x309C, //KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ 0xA963: 0x30FD, //KATAKANA ITERATION MARK
+ 0xA964: 0x30FE, //KATAKANA VOICED ITERATION MARK
+ 0xA965: 0x3006, //IDEOGRAPHIC CLOSING MARK
+ 0xA966: 0x309D, //HIRAGANA ITERATION MARK
+ 0xA967: 0x309E, //HIRAGANA VOICED ITERATION MARK
+ 0xA968: 0xFE49, //DASHED OVERLINE
+ 0xA969: 0xFE4A, //CENTRELINE OVERLINE
+ 0xA96A: 0xFE4B, //WAVY OVERLINE
+ 0xA96B: 0xFE4C, //DOUBLE WAVY OVERLINE
+ 0xA96C: 0xFE4D, //DASHED LOW LINE
+ 0xA96D: 0xFE4E, //CENTRELINE LOW LINE
+ 0xA96E: 0xFE4F, //WAVY LOW LINE
+ 0xA96F: 0xFE50, //SMALL COMMA
+ 0xA970: 0xFE51, //SMALL IDEOGRAPHIC COMMA
+ 0xA971: 0xFE52, //SMALL FULL STOP
+ 0xA972: 0xFE54, //SMALL SEMICOLON
+ 0xA973: 0xFE55, //SMALL COLON
+ 0xA974: 0xFE56, //SMALL QUESTION MARK
+ 0xA975: 0xFE57, //SMALL EXCLAMATION MARK
+ 0xA976: 0xFE59, //SMALL LEFT PARENTHESIS
+ 0xA977: 0xFE5A, //SMALL RIGHT PARENTHESIS
+ 0xA978: 0xFE5B, //SMALL LEFT CURLY BRACKET
+ 0xA979: 0xFE5C, //SMALL RIGHT CURLY BRACKET
+ 0xA97A: 0xFE5D, //SMALL LEFT TORTOISE SHELL BRACKET
+ 0xA97B: 0xFE5E, //SMALL RIGHT TORTOISE SHELL BRACKET
+ 0xA97C: 0xFE5F, //SMALL NUMBER SIGN
+ 0xA97D: 0xFE60, //SMALL AMPERSAND
+ 0xA97E: 0xFE61, //SMALL ASTERISK
+ 0xA980: 0xFE62, //SMALL PLUS SIGN
+ 0xA981: 0xFE63, //SMALL HYPHEN-MINUS
+ 0xA982: 0xFE64, //SMALL LESS-THAN SIGN
+ 0xA983: 0xFE65, //SMALL GREATER-THAN SIGN
+ 0xA984: 0xFE66, //SMALL EQUALS SIGN
+ 0xA985: 0xFE68, //SMALL REVERSE SOLIDUS
+ 0xA986: 0xFE69, //SMALL DOLLAR SIGN
+ 0xA987: 0xFE6A, //SMALL PERCENT SIGN
+ 0xA988: 0xFE6B, //SMALL COMMERCIAL AT
+ 0xA996: 0x3007, //IDEOGRAPHIC NUMBER ZERO
+ 0xA9A4: 0x2500, //BOX DRAWINGS LIGHT HORIZONTAL
+ 0xA9A5: 0x2501, //BOX DRAWINGS HEAVY HORIZONTAL
+ 0xA9A6: 0x2502, //BOX DRAWINGS LIGHT VERTICAL
+ 0xA9A7: 0x2503, //BOX DRAWINGS HEAVY VERTICAL
+ 0xA9A8: 0x2504, //BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+ 0xA9A9: 0x2505, //BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+ 0xA9AA: 0x2506, //BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+ 0xA9AB: 0x2507, //BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+ 0xA9AC: 0x2508, //BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+ 0xA9AD: 0x2509, //BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+ 0xA9AE: 0x250A, //BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+ 0xA9AF: 0x250B, //BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+ 0xA9B0: 0x250C, //BOX DRAWINGS LIGHT DOWN AND RIGHT
+ 0xA9B1: 0x250D, //BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+ 0xA9B2: 0x250E, //BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+ 0xA9B3: 0x250F, //BOX DRAWINGS HEAVY DOWN AND RIGHT
+ 0xA9B4: 0x2510, //BOX DRAWINGS LIGHT DOWN AND LEFT
+ 0xA9B5: 0x2511, //BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+ 0xA9B6: 0x2512, //BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+ 0xA9B7: 0x2513, //BOX DRAWINGS HEAVY DOWN AND LEFT
+ 0xA9B8: 0x2514, //BOX DRAWINGS LIGHT UP AND RIGHT
+ 0xA9B9: 0x2515, //BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+ 0xA9BA: 0x2516, //BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+ 0xA9BB: 0x2517, //BOX DRAWINGS HEAVY UP AND RIGHT
+ 0xA9BC: 0x2518, //BOX DRAWINGS LIGHT UP AND LEFT
+ 0xA9BD: 0x2519, //BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+ 0xA9BE: 0x251A, //BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+ 0xA9BF: 0x251B, //BOX DRAWINGS HEAVY UP AND LEFT
+ 0xA9C0: 0x251C, //BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ 0xA9C1: 0x251D, //BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ 0xA9C2: 0x251E, //BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+ 0xA9C3: 0x251F, //BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+ 0xA9C4: 0x2520, //BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ 0xA9C5: 0x2521, //BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+ 0xA9C6: 0x2522, //BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+ 0xA9C7: 0x2523, //BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ 0xA9C8: 0x2524, //BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ 0xA9C9: 0x2525, //BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ 0xA9CA: 0x2526, //BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+ 0xA9CB: 0x2527, //BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+ 0xA9CC: 0x2528, //BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ 0xA9CD: 0x2529, //BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+ 0xA9CE: 0x252A, //BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+ 0xA9CF: 0x252B, //BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ 0xA9D0: 0x252C, //BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ 0xA9D1: 0x252D, //BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+ 0xA9D2: 0x252E, //BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+ 0xA9D3: 0x252F, //BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ 0xA9D4: 0x2530, //BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ 0xA9D5: 0x2531, //BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+ 0xA9D6: 0x2532, //BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+ 0xA9D7: 0x2533, //BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ 0xA9D8: 0x2534, //BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ 0xA9D9: 0x2535, //BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+ 0xA9DA: 0x2536, //BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+ 0xA9DB: 0x2537, //BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ 0xA9DC: 0x2538, //BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ 0xA9DD: 0x2539, //BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+ 0xA9DE: 0x253A, //BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+ 0xA9DF: 0x253B, //BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ 0xA9E0: 0x253C, //BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ 0xA9E1: 0x253D, //BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+ 0xA9E2: 0x253E, //BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+ 0xA9E3: 0x253F, //BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ 0xA9E4: 0x2540, //BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+ 0xA9E5: 0x2541, //BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+ 0xA9E6: 0x2542, //BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ 0xA9E7: 0x2543, //BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+ 0xA9E8: 0x2544, //BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+ 0xA9E9: 0x2545, //BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+ 0xA9EA: 0x2546, //BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+ 0xA9EB: 0x2547, //BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+ 0xA9EC: 0x2548, //BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+ 0xA9ED: 0x2549, //BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+ 0xA9EE: 0x254A, //BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+ 0xA9EF: 0x254B, //BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ 0xAA40: 0x72DC, //CJK UNIFIED IDEOGRAPH
+ 0xAA41: 0x72DD, //CJK UNIFIED IDEOGRAPH
+ 0xAA42: 0x72DF, //CJK UNIFIED IDEOGRAPH
+ 0xAA43: 0x72E2, //CJK UNIFIED IDEOGRAPH
+ 0xAA44: 0x72E3, //CJK UNIFIED IDEOGRAPH
+ 0xAA45: 0x72E4, //CJK UNIFIED IDEOGRAPH
+ 0xAA46: 0x72E5, //CJK UNIFIED IDEOGRAPH
+ 0xAA47: 0x72E6, //CJK UNIFIED IDEOGRAPH
+ 0xAA48: 0x72E7, //CJK UNIFIED IDEOGRAPH
+ 0xAA49: 0x72EA, //CJK UNIFIED IDEOGRAPH
+ 0xAA4A: 0x72EB, //CJK UNIFIED IDEOGRAPH
+ 0xAA4B: 0x72F5, //CJK UNIFIED IDEOGRAPH
+ 0xAA4C: 0x72F6, //CJK UNIFIED IDEOGRAPH
+ 0xAA4D: 0x72F9, //CJK UNIFIED IDEOGRAPH
+ 0xAA4E: 0x72FD, //CJK UNIFIED IDEOGRAPH
+ 0xAA4F: 0x72FE, //CJK UNIFIED IDEOGRAPH
+ 0xAA50: 0x72FF, //CJK UNIFIED IDEOGRAPH
+ 0xAA51: 0x7300, //CJK UNIFIED IDEOGRAPH
+ 0xAA52: 0x7302, //CJK UNIFIED IDEOGRAPH
+ 0xAA53: 0x7304, //CJK UNIFIED IDEOGRAPH
+ 0xAA54: 0x7305, //CJK UNIFIED IDEOGRAPH
+ 0xAA55: 0x7306, //CJK UNIFIED IDEOGRAPH
+ 0xAA56: 0x7307, //CJK UNIFIED IDEOGRAPH
+ 0xAA57: 0x7308, //CJK UNIFIED IDEOGRAPH
+ 0xAA58: 0x7309, //CJK UNIFIED IDEOGRAPH
+ 0xAA59: 0x730B, //CJK UNIFIED IDEOGRAPH
+ 0xAA5A: 0x730C, //CJK UNIFIED IDEOGRAPH
+ 0xAA5B: 0x730D, //CJK UNIFIED IDEOGRAPH
+ 0xAA5C: 0x730F, //CJK UNIFIED IDEOGRAPH
+ 0xAA5D: 0x7310, //CJK UNIFIED IDEOGRAPH
+ 0xAA5E: 0x7311, //CJK UNIFIED IDEOGRAPH
+ 0xAA5F: 0x7312, //CJK UNIFIED IDEOGRAPH
+ 0xAA60: 0x7314, //CJK UNIFIED IDEOGRAPH
+ 0xAA61: 0x7318, //CJK UNIFIED IDEOGRAPH
+ 0xAA62: 0x7319, //CJK UNIFIED IDEOGRAPH
+ 0xAA63: 0x731A, //CJK UNIFIED IDEOGRAPH
+ 0xAA64: 0x731F, //CJK UNIFIED IDEOGRAPH
+ 0xAA65: 0x7320, //CJK UNIFIED IDEOGRAPH
+ 0xAA66: 0x7323, //CJK UNIFIED IDEOGRAPH
+ 0xAA67: 0x7324, //CJK UNIFIED IDEOGRAPH
+ 0xAA68: 0x7326, //CJK UNIFIED IDEOGRAPH
+ 0xAA69: 0x7327, //CJK UNIFIED IDEOGRAPH
+ 0xAA6A: 0x7328, //CJK UNIFIED IDEOGRAPH
+ 0xAA6B: 0x732D, //CJK UNIFIED IDEOGRAPH
+ 0xAA6C: 0x732F, //CJK UNIFIED IDEOGRAPH
+ 0xAA6D: 0x7330, //CJK UNIFIED IDEOGRAPH
+ 0xAA6E: 0x7332, //CJK UNIFIED IDEOGRAPH
+ 0xAA6F: 0x7333, //CJK UNIFIED IDEOGRAPH
+ 0xAA70: 0x7335, //CJK UNIFIED IDEOGRAPH
+ 0xAA71: 0x7336, //CJK UNIFIED IDEOGRAPH
+ 0xAA72: 0x733A, //CJK UNIFIED IDEOGRAPH
+ 0xAA73: 0x733B, //CJK UNIFIED IDEOGRAPH
+ 0xAA74: 0x733C, //CJK UNIFIED IDEOGRAPH
+ 0xAA75: 0x733D, //CJK UNIFIED IDEOGRAPH
+ 0xAA76: 0x7340, //CJK UNIFIED IDEOGRAPH
+ 0xAA77: 0x7341, //CJK UNIFIED IDEOGRAPH
+ 0xAA78: 0x7342, //CJK UNIFIED IDEOGRAPH
+ 0xAA79: 0x7343, //CJK UNIFIED IDEOGRAPH
+ 0xAA7A: 0x7344, //CJK UNIFIED IDEOGRAPH
+ 0xAA7B: 0x7345, //CJK UNIFIED IDEOGRAPH
+ 0xAA7C: 0x7346, //CJK UNIFIED IDEOGRAPH
+ 0xAA7D: 0x7347, //CJK UNIFIED IDEOGRAPH
+ 0xAA7E: 0x7348, //CJK UNIFIED IDEOGRAPH
+ 0xAA80: 0x7349, //CJK UNIFIED IDEOGRAPH
+ 0xAA81: 0x734A, //CJK UNIFIED IDEOGRAPH
+ 0xAA82: 0x734B, //CJK UNIFIED IDEOGRAPH
+ 0xAA83: 0x734C, //CJK UNIFIED IDEOGRAPH
+ 0xAA84: 0x734E, //CJK UNIFIED IDEOGRAPH
+ 0xAA85: 0x734F, //CJK UNIFIED IDEOGRAPH
+ 0xAA86: 0x7351, //CJK UNIFIED IDEOGRAPH
+ 0xAA87: 0x7353, //CJK UNIFIED IDEOGRAPH
+ 0xAA88: 0x7354, //CJK UNIFIED IDEOGRAPH
+ 0xAA89: 0x7355, //CJK UNIFIED IDEOGRAPH
+ 0xAA8A: 0x7356, //CJK UNIFIED IDEOGRAPH
+ 0xAA8B: 0x7358, //CJK UNIFIED IDEOGRAPH
+ 0xAA8C: 0x7359, //CJK UNIFIED IDEOGRAPH
+ 0xAA8D: 0x735A, //CJK UNIFIED IDEOGRAPH
+ 0xAA8E: 0x735B, //CJK UNIFIED IDEOGRAPH
+ 0xAA8F: 0x735C, //CJK UNIFIED IDEOGRAPH
+ 0xAA90: 0x735D, //CJK UNIFIED IDEOGRAPH
+ 0xAA91: 0x735E, //CJK UNIFIED IDEOGRAPH
+ 0xAA92: 0x735F, //CJK UNIFIED IDEOGRAPH
+ 0xAA93: 0x7361, //CJK UNIFIED IDEOGRAPH
+ 0xAA94: 0x7362, //CJK UNIFIED IDEOGRAPH
+ 0xAA95: 0x7363, //CJK UNIFIED IDEOGRAPH
+ 0xAA96: 0x7364, //CJK UNIFIED IDEOGRAPH
+ 0xAA97: 0x7365, //CJK UNIFIED IDEOGRAPH
+ 0xAA98: 0x7366, //CJK UNIFIED IDEOGRAPH
+ 0xAA99: 0x7367, //CJK UNIFIED IDEOGRAPH
+ 0xAA9A: 0x7368, //CJK UNIFIED IDEOGRAPH
+ 0xAA9B: 0x7369, //CJK UNIFIED IDEOGRAPH
+ 0xAA9C: 0x736A, //CJK UNIFIED IDEOGRAPH
+ 0xAA9D: 0x736B, //CJK UNIFIED IDEOGRAPH
+ 0xAA9E: 0x736E, //CJK UNIFIED IDEOGRAPH
+ 0xAA9F: 0x7370, //CJK UNIFIED IDEOGRAPH
+ 0xAAA0: 0x7371, //CJK UNIFIED IDEOGRAPH
+ 0xAB40: 0x7372, //CJK UNIFIED IDEOGRAPH
+ 0xAB41: 0x7373, //CJK UNIFIED IDEOGRAPH
+ 0xAB42: 0x7374, //CJK UNIFIED IDEOGRAPH
+ 0xAB43: 0x7375, //CJK UNIFIED IDEOGRAPH
+ 0xAB44: 0x7376, //CJK UNIFIED IDEOGRAPH
+ 0xAB45: 0x7377, //CJK UNIFIED IDEOGRAPH
+ 0xAB46: 0x7378, //CJK UNIFIED IDEOGRAPH
+ 0xAB47: 0x7379, //CJK UNIFIED IDEOGRAPH
+ 0xAB48: 0x737A, //CJK UNIFIED IDEOGRAPH
+ 0xAB49: 0x737B, //CJK UNIFIED IDEOGRAPH
+ 0xAB4A: 0x737C, //CJK UNIFIED IDEOGRAPH
+ 0xAB4B: 0x737D, //CJK UNIFIED IDEOGRAPH
+ 0xAB4C: 0x737F, //CJK UNIFIED IDEOGRAPH
+ 0xAB4D: 0x7380, //CJK UNIFIED IDEOGRAPH
+ 0xAB4E: 0x7381, //CJK UNIFIED IDEOGRAPH
+ 0xAB4F: 0x7382, //CJK UNIFIED IDEOGRAPH
+ 0xAB50: 0x7383, //CJK UNIFIED IDEOGRAPH
+ 0xAB51: 0x7385, //CJK UNIFIED IDEOGRAPH
+ 0xAB52: 0x7386, //CJK UNIFIED IDEOGRAPH
+ 0xAB53: 0x7388, //CJK UNIFIED IDEOGRAPH
+ 0xAB54: 0x738A, //CJK UNIFIED IDEOGRAPH
+ 0xAB55: 0x738C, //CJK UNIFIED IDEOGRAPH
+ 0xAB56: 0x738D, //CJK UNIFIED IDEOGRAPH
+ 0xAB57: 0x738F, //CJK UNIFIED IDEOGRAPH
+ 0xAB58: 0x7390, //CJK UNIFIED IDEOGRAPH
+ 0xAB59: 0x7392, //CJK UNIFIED IDEOGRAPH
+ 0xAB5A: 0x7393, //CJK UNIFIED IDEOGRAPH
+ 0xAB5B: 0x7394, //CJK UNIFIED IDEOGRAPH
+ 0xAB5C: 0x7395, //CJK UNIFIED IDEOGRAPH
+ 0xAB5D: 0x7397, //CJK UNIFIED IDEOGRAPH
+ 0xAB5E: 0x7398, //CJK UNIFIED IDEOGRAPH
+ 0xAB5F: 0x7399, //CJK UNIFIED IDEOGRAPH
+ 0xAB60: 0x739A, //CJK UNIFIED IDEOGRAPH
+ 0xAB61: 0x739C, //CJK UNIFIED IDEOGRAPH
+ 0xAB62: 0x739D, //CJK UNIFIED IDEOGRAPH
+ 0xAB63: 0x739E, //CJK UNIFIED IDEOGRAPH
+ 0xAB64: 0x73A0, //CJK UNIFIED IDEOGRAPH
+ 0xAB65: 0x73A1, //CJK UNIFIED IDEOGRAPH
+ 0xAB66: 0x73A3, //CJK UNIFIED IDEOGRAPH
+ 0xAB67: 0x73A4, //CJK UNIFIED IDEOGRAPH
+ 0xAB68: 0x73A5, //CJK UNIFIED IDEOGRAPH
+ 0xAB69: 0x73A6, //CJK UNIFIED IDEOGRAPH
+ 0xAB6A: 0x73A7, //CJK UNIFIED IDEOGRAPH
+ 0xAB6B: 0x73A8, //CJK UNIFIED IDEOGRAPH
+ 0xAB6C: 0x73AA, //CJK UNIFIED IDEOGRAPH
+ 0xAB6D: 0x73AC, //CJK UNIFIED IDEOGRAPH
+ 0xAB6E: 0x73AD, //CJK UNIFIED IDEOGRAPH
+ 0xAB6F: 0x73B1, //CJK UNIFIED IDEOGRAPH
+ 0xAB70: 0x73B4, //CJK UNIFIED IDEOGRAPH
+ 0xAB71: 0x73B5, //CJK UNIFIED IDEOGRAPH
+ 0xAB72: 0x73B6, //CJK UNIFIED IDEOGRAPH
+ 0xAB73: 0x73B8, //CJK UNIFIED IDEOGRAPH
+ 0xAB74: 0x73B9, //CJK UNIFIED IDEOGRAPH
+ 0xAB75: 0x73BC, //CJK UNIFIED IDEOGRAPH
+ 0xAB76: 0x73BD, //CJK UNIFIED IDEOGRAPH
+ 0xAB77: 0x73BE, //CJK UNIFIED IDEOGRAPH
+ 0xAB78: 0x73BF, //CJK UNIFIED IDEOGRAPH
+ 0xAB79: 0x73C1, //CJK UNIFIED IDEOGRAPH
+ 0xAB7A: 0x73C3, //CJK UNIFIED IDEOGRAPH
+ 0xAB7B: 0x73C4, //CJK UNIFIED IDEOGRAPH
+ 0xAB7C: 0x73C5, //CJK UNIFIED IDEOGRAPH
+ 0xAB7D: 0x73C6, //CJK UNIFIED IDEOGRAPH
+ 0xAB7E: 0x73C7, //CJK UNIFIED IDEOGRAPH
+ 0xAB80: 0x73CB, //CJK UNIFIED IDEOGRAPH
+ 0xAB81: 0x73CC, //CJK UNIFIED IDEOGRAPH
+ 0xAB82: 0x73CE, //CJK UNIFIED IDEOGRAPH
+ 0xAB83: 0x73D2, //CJK UNIFIED IDEOGRAPH
+ 0xAB84: 0x73D3, //CJK UNIFIED IDEOGRAPH
+ 0xAB85: 0x73D4, //CJK UNIFIED IDEOGRAPH
+ 0xAB86: 0x73D5, //CJK UNIFIED IDEOGRAPH
+ 0xAB87: 0x73D6, //CJK UNIFIED IDEOGRAPH
+ 0xAB88: 0x73D7, //CJK UNIFIED IDEOGRAPH
+ 0xAB89: 0x73D8, //CJK UNIFIED IDEOGRAPH
+ 0xAB8A: 0x73DA, //CJK UNIFIED IDEOGRAPH
+ 0xAB8B: 0x73DB, //CJK UNIFIED IDEOGRAPH
+ 0xAB8C: 0x73DC, //CJK UNIFIED IDEOGRAPH
+ 0xAB8D: 0x73DD, //CJK UNIFIED IDEOGRAPH
+ 0xAB8E: 0x73DF, //CJK UNIFIED IDEOGRAPH
+ 0xAB8F: 0x73E1, //CJK UNIFIED IDEOGRAPH
+ 0xAB90: 0x73E2, //CJK UNIFIED IDEOGRAPH
+ 0xAB91: 0x73E3, //CJK UNIFIED IDEOGRAPH
+ 0xAB92: 0x73E4, //CJK UNIFIED IDEOGRAPH
+ 0xAB93: 0x73E6, //CJK UNIFIED IDEOGRAPH
+ 0xAB94: 0x73E8, //CJK UNIFIED IDEOGRAPH
+ 0xAB95: 0x73EA, //CJK UNIFIED IDEOGRAPH
+ 0xAB96: 0x73EB, //CJK UNIFIED IDEOGRAPH
+ 0xAB97: 0x73EC, //CJK UNIFIED IDEOGRAPH
+ 0xAB98: 0x73EE, //CJK UNIFIED IDEOGRAPH
+ 0xAB99: 0x73EF, //CJK UNIFIED IDEOGRAPH
+ 0xAB9A: 0x73F0, //CJK UNIFIED IDEOGRAPH
+ 0xAB9B: 0x73F1, //CJK UNIFIED IDEOGRAPH
+ 0xAB9C: 0x73F3, //CJK UNIFIED IDEOGRAPH
+ 0xAB9D: 0x73F4, //CJK UNIFIED IDEOGRAPH
+ 0xAB9E: 0x73F5, //CJK UNIFIED IDEOGRAPH
+ 0xAB9F: 0x73F6, //CJK UNIFIED IDEOGRAPH
+ 0xABA0: 0x73F7, //CJK UNIFIED IDEOGRAPH
+ 0xAC40: 0x73F8, //CJK UNIFIED IDEOGRAPH
+ 0xAC41: 0x73F9, //CJK UNIFIED IDEOGRAPH
+ 0xAC42: 0x73FA, //CJK UNIFIED IDEOGRAPH
+ 0xAC43: 0x73FB, //CJK UNIFIED IDEOGRAPH
+ 0xAC44: 0x73FC, //CJK UNIFIED IDEOGRAPH
+ 0xAC45: 0x73FD, //CJK UNIFIED IDEOGRAPH
+ 0xAC46: 0x73FE, //CJK UNIFIED IDEOGRAPH
+ 0xAC47: 0x73FF, //CJK UNIFIED IDEOGRAPH
+ 0xAC48: 0x7400, //CJK UNIFIED IDEOGRAPH
+ 0xAC49: 0x7401, //CJK UNIFIED IDEOGRAPH
+ 0xAC4A: 0x7402, //CJK UNIFIED IDEOGRAPH
+ 0xAC4B: 0x7404, //CJK UNIFIED IDEOGRAPH
+ 0xAC4C: 0x7407, //CJK UNIFIED IDEOGRAPH
+ 0xAC4D: 0x7408, //CJK UNIFIED IDEOGRAPH
+ 0xAC4E: 0x740B, //CJK UNIFIED IDEOGRAPH
+ 0xAC4F: 0x740C, //CJK UNIFIED IDEOGRAPH
+ 0xAC50: 0x740D, //CJK UNIFIED IDEOGRAPH
+ 0xAC51: 0x740E, //CJK UNIFIED IDEOGRAPH
+ 0xAC52: 0x7411, //CJK UNIFIED IDEOGRAPH
+ 0xAC53: 0x7412, //CJK UNIFIED IDEOGRAPH
+ 0xAC54: 0x7413, //CJK UNIFIED IDEOGRAPH
+ 0xAC55: 0x7414, //CJK UNIFIED IDEOGRAPH
+ 0xAC56: 0x7415, //CJK UNIFIED IDEOGRAPH
+ 0xAC57: 0x7416, //CJK UNIFIED IDEOGRAPH
+ 0xAC58: 0x7417, //CJK UNIFIED IDEOGRAPH
+ 0xAC59: 0x7418, //CJK UNIFIED IDEOGRAPH
+ 0xAC5A: 0x7419, //CJK UNIFIED IDEOGRAPH
+ 0xAC5B: 0x741C, //CJK UNIFIED IDEOGRAPH
+ 0xAC5C: 0x741D, //CJK UNIFIED IDEOGRAPH
+ 0xAC5D: 0x741E, //CJK UNIFIED IDEOGRAPH
+ 0xAC5E: 0x741F, //CJK UNIFIED IDEOGRAPH
+ 0xAC5F: 0x7420, //CJK UNIFIED IDEOGRAPH
+ 0xAC60: 0x7421, //CJK UNIFIED IDEOGRAPH
+ 0xAC61: 0x7423, //CJK UNIFIED IDEOGRAPH
+ 0xAC62: 0x7424, //CJK UNIFIED IDEOGRAPH
+ 0xAC63: 0x7427, //CJK UNIFIED IDEOGRAPH
+ 0xAC64: 0x7429, //CJK UNIFIED IDEOGRAPH
+ 0xAC65: 0x742B, //CJK UNIFIED IDEOGRAPH
+ 0xAC66: 0x742D, //CJK UNIFIED IDEOGRAPH
+ 0xAC67: 0x742F, //CJK UNIFIED IDEOGRAPH
+ 0xAC68: 0x7431, //CJK UNIFIED IDEOGRAPH
+ 0xAC69: 0x7432, //CJK UNIFIED IDEOGRAPH
+ 0xAC6A: 0x7437, //CJK UNIFIED IDEOGRAPH
+ 0xAC6B: 0x7438, //CJK UNIFIED IDEOGRAPH
+ 0xAC6C: 0x7439, //CJK UNIFIED IDEOGRAPH
+ 0xAC6D: 0x743A, //CJK UNIFIED IDEOGRAPH
+ 0xAC6E: 0x743B, //CJK UNIFIED IDEOGRAPH
+ 0xAC6F: 0x743D, //CJK UNIFIED IDEOGRAPH
+ 0xAC70: 0x743E, //CJK UNIFIED IDEOGRAPH
+ 0xAC71: 0x743F, //CJK UNIFIED IDEOGRAPH
+ 0xAC72: 0x7440, //CJK UNIFIED IDEOGRAPH
+ 0xAC73: 0x7442, //CJK UNIFIED IDEOGRAPH
+ 0xAC74: 0x7443, //CJK UNIFIED IDEOGRAPH
+ 0xAC75: 0x7444, //CJK UNIFIED IDEOGRAPH
+ 0xAC76: 0x7445, //CJK UNIFIED IDEOGRAPH
+ 0xAC77: 0x7446, //CJK UNIFIED IDEOGRAPH
+ 0xAC78: 0x7447, //CJK UNIFIED IDEOGRAPH
+ 0xAC79: 0x7448, //CJK UNIFIED IDEOGRAPH
+ 0xAC7A: 0x7449, //CJK UNIFIED IDEOGRAPH
+ 0xAC7B: 0x744A, //CJK UNIFIED IDEOGRAPH
+ 0xAC7C: 0x744B, //CJK UNIFIED IDEOGRAPH
+ 0xAC7D: 0x744C, //CJK UNIFIED IDEOGRAPH
+ 0xAC7E: 0x744D, //CJK UNIFIED IDEOGRAPH
+ 0xAC80: 0x744E, //CJK UNIFIED IDEOGRAPH
+ 0xAC81: 0x744F, //CJK UNIFIED IDEOGRAPH
+ 0xAC82: 0x7450, //CJK UNIFIED IDEOGRAPH
+ 0xAC83: 0x7451, //CJK UNIFIED IDEOGRAPH
+ 0xAC84: 0x7452, //CJK UNIFIED IDEOGRAPH
+ 0xAC85: 0x7453, //CJK UNIFIED IDEOGRAPH
+ 0xAC86: 0x7454, //CJK UNIFIED IDEOGRAPH
+ 0xAC87: 0x7456, //CJK UNIFIED IDEOGRAPH
+ 0xAC88: 0x7458, //CJK UNIFIED IDEOGRAPH
+ 0xAC89: 0x745D, //CJK UNIFIED IDEOGRAPH
+ 0xAC8A: 0x7460, //CJK UNIFIED IDEOGRAPH
+ 0xAC8B: 0x7461, //CJK UNIFIED IDEOGRAPH
+ 0xAC8C: 0x7462, //CJK UNIFIED IDEOGRAPH
+ 0xAC8D: 0x7463, //CJK UNIFIED IDEOGRAPH
+ 0xAC8E: 0x7464, //CJK UNIFIED IDEOGRAPH
+ 0xAC8F: 0x7465, //CJK UNIFIED IDEOGRAPH
+ 0xAC90: 0x7466, //CJK UNIFIED IDEOGRAPH
+ 0xAC91: 0x7467, //CJK UNIFIED IDEOGRAPH
+ 0xAC92: 0x7468, //CJK UNIFIED IDEOGRAPH
+ 0xAC93: 0x7469, //CJK UNIFIED IDEOGRAPH
+ 0xAC94: 0x746A, //CJK UNIFIED IDEOGRAPH
+ 0xAC95: 0x746B, //CJK UNIFIED IDEOGRAPH
+ 0xAC96: 0x746C, //CJK UNIFIED IDEOGRAPH
+ 0xAC97: 0x746E, //CJK UNIFIED IDEOGRAPH
+ 0xAC98: 0x746F, //CJK UNIFIED IDEOGRAPH
+ 0xAC99: 0x7471, //CJK UNIFIED IDEOGRAPH
+ 0xAC9A: 0x7472, //CJK UNIFIED IDEOGRAPH
+ 0xAC9B: 0x7473, //CJK UNIFIED IDEOGRAPH
+ 0xAC9C: 0x7474, //CJK UNIFIED IDEOGRAPH
+ 0xAC9D: 0x7475, //CJK UNIFIED IDEOGRAPH
+ 0xAC9E: 0x7478, //CJK UNIFIED IDEOGRAPH
+ 0xAC9F: 0x7479, //CJK UNIFIED IDEOGRAPH
+ 0xACA0: 0x747A, //CJK UNIFIED IDEOGRAPH
+ 0xAD40: 0x747B, //CJK UNIFIED IDEOGRAPH
+ 0xAD41: 0x747C, //CJK UNIFIED IDEOGRAPH
+ 0xAD42: 0x747D, //CJK UNIFIED IDEOGRAPH
+ 0xAD43: 0x747F, //CJK UNIFIED IDEOGRAPH
+ 0xAD44: 0x7482, //CJK UNIFIED IDEOGRAPH
+ 0xAD45: 0x7484, //CJK UNIFIED IDEOGRAPH
+ 0xAD46: 0x7485, //CJK UNIFIED IDEOGRAPH
+ 0xAD47: 0x7486, //CJK UNIFIED IDEOGRAPH
+ 0xAD48: 0x7488, //CJK UNIFIED IDEOGRAPH
+ 0xAD49: 0x7489, //CJK UNIFIED IDEOGRAPH
+ 0xAD4A: 0x748A, //CJK UNIFIED IDEOGRAPH
+ 0xAD4B: 0x748C, //CJK UNIFIED IDEOGRAPH
+ 0xAD4C: 0x748D, //CJK UNIFIED IDEOGRAPH
+ 0xAD4D: 0x748F, //CJK UNIFIED IDEOGRAPH
+ 0xAD4E: 0x7491, //CJK UNIFIED IDEOGRAPH
+ 0xAD4F: 0x7492, //CJK UNIFIED IDEOGRAPH
+ 0xAD50: 0x7493, //CJK UNIFIED IDEOGRAPH
+ 0xAD51: 0x7494, //CJK UNIFIED IDEOGRAPH
+ 0xAD52: 0x7495, //CJK UNIFIED IDEOGRAPH
+ 0xAD53: 0x7496, //CJK UNIFIED IDEOGRAPH
+ 0xAD54: 0x7497, //CJK UNIFIED IDEOGRAPH
+ 0xAD55: 0x7498, //CJK UNIFIED IDEOGRAPH
+ 0xAD56: 0x7499, //CJK UNIFIED IDEOGRAPH
+ 0xAD57: 0x749A, //CJK UNIFIED IDEOGRAPH
+ 0xAD58: 0x749B, //CJK UNIFIED IDEOGRAPH
+ 0xAD59: 0x749D, //CJK UNIFIED IDEOGRAPH
+ 0xAD5A: 0x749F, //CJK UNIFIED IDEOGRAPH
+ 0xAD5B: 0x74A0, //CJK UNIFIED IDEOGRAPH
+ 0xAD5C: 0x74A1, //CJK UNIFIED IDEOGRAPH
+ 0xAD5D: 0x74A2, //CJK UNIFIED IDEOGRAPH
+ 0xAD5E: 0x74A3, //CJK UNIFIED IDEOGRAPH
+ 0xAD5F: 0x74A4, //CJK UNIFIED IDEOGRAPH
+ 0xAD60: 0x74A5, //CJK UNIFIED IDEOGRAPH
+ 0xAD61: 0x74A6, //CJK UNIFIED IDEOGRAPH
+ 0xAD62: 0x74AA, //CJK UNIFIED IDEOGRAPH
+ 0xAD63: 0x74AB, //CJK UNIFIED IDEOGRAPH
+ 0xAD64: 0x74AC, //CJK UNIFIED IDEOGRAPH
+ 0xAD65: 0x74AD, //CJK UNIFIED IDEOGRAPH
+ 0xAD66: 0x74AE, //CJK UNIFIED IDEOGRAPH
+ 0xAD67: 0x74AF, //CJK UNIFIED IDEOGRAPH
+ 0xAD68: 0x74B0, //CJK UNIFIED IDEOGRAPH
+ 0xAD69: 0x74B1, //CJK UNIFIED IDEOGRAPH
+ 0xAD6A: 0x74B2, //CJK UNIFIED IDEOGRAPH
+ 0xAD6B: 0x74B3, //CJK UNIFIED IDEOGRAPH
+ 0xAD6C: 0x74B4, //CJK UNIFIED IDEOGRAPH
+ 0xAD6D: 0x74B5, //CJK UNIFIED IDEOGRAPH
+ 0xAD6E: 0x74B6, //CJK UNIFIED IDEOGRAPH
+ 0xAD6F: 0x74B7, //CJK UNIFIED IDEOGRAPH
+ 0xAD70: 0x74B8, //CJK UNIFIED IDEOGRAPH
+ 0xAD71: 0x74B9, //CJK UNIFIED IDEOGRAPH
+ 0xAD72: 0x74BB, //CJK UNIFIED IDEOGRAPH
+ 0xAD73: 0x74BC, //CJK UNIFIED IDEOGRAPH
+ 0xAD74: 0x74BD, //CJK UNIFIED IDEOGRAPH
+ 0xAD75: 0x74BE, //CJK UNIFIED IDEOGRAPH
+ 0xAD76: 0x74BF, //CJK UNIFIED IDEOGRAPH
+ 0xAD77: 0x74C0, //CJK UNIFIED IDEOGRAPH
+ 0xAD78: 0x74C1, //CJK UNIFIED IDEOGRAPH
+ 0xAD79: 0x74C2, //CJK UNIFIED IDEOGRAPH
+ 0xAD7A: 0x74C3, //CJK UNIFIED IDEOGRAPH
+ 0xAD7B: 0x74C4, //CJK UNIFIED IDEOGRAPH
+ 0xAD7C: 0x74C5, //CJK UNIFIED IDEOGRAPH
+ 0xAD7D: 0x74C6, //CJK UNIFIED IDEOGRAPH
+ 0xAD7E: 0x74C7, //CJK UNIFIED IDEOGRAPH
+ 0xAD80: 0x74C8, //CJK UNIFIED IDEOGRAPH
+ 0xAD81: 0x74C9, //CJK UNIFIED IDEOGRAPH
+ 0xAD82: 0x74CA, //CJK UNIFIED IDEOGRAPH
+ 0xAD83: 0x74CB, //CJK UNIFIED IDEOGRAPH
+ 0xAD84: 0x74CC, //CJK UNIFIED IDEOGRAPH
+ 0xAD85: 0x74CD, //CJK UNIFIED IDEOGRAPH
+ 0xAD86: 0x74CE, //CJK UNIFIED IDEOGRAPH
+ 0xAD87: 0x74CF, //CJK UNIFIED IDEOGRAPH
+ 0xAD88: 0x74D0, //CJK UNIFIED IDEOGRAPH
+ 0xAD89: 0x74D1, //CJK UNIFIED IDEOGRAPH
+ 0xAD8A: 0x74D3, //CJK UNIFIED IDEOGRAPH
+ 0xAD8B: 0x74D4, //CJK UNIFIED IDEOGRAPH
+ 0xAD8C: 0x74D5, //CJK UNIFIED IDEOGRAPH
+ 0xAD8D: 0x74D6, //CJK UNIFIED IDEOGRAPH
+ 0xAD8E: 0x74D7, //CJK UNIFIED IDEOGRAPH
+ 0xAD8F: 0x74D8, //CJK UNIFIED IDEOGRAPH
+ 0xAD90: 0x74D9, //CJK UNIFIED IDEOGRAPH
+ 0xAD91: 0x74DA, //CJK UNIFIED IDEOGRAPH
+ 0xAD92: 0x74DB, //CJK UNIFIED IDEOGRAPH
+ 0xAD93: 0x74DD, //CJK UNIFIED IDEOGRAPH
+ 0xAD94: 0x74DF, //CJK UNIFIED IDEOGRAPH
+ 0xAD95: 0x74E1, //CJK UNIFIED IDEOGRAPH
+ 0xAD96: 0x74E5, //CJK UNIFIED IDEOGRAPH
+ 0xAD97: 0x74E7, //CJK UNIFIED IDEOGRAPH
+ 0xAD98: 0x74E8, //CJK UNIFIED IDEOGRAPH
+ 0xAD99: 0x74E9, //CJK UNIFIED IDEOGRAPH
+ 0xAD9A: 0x74EA, //CJK UNIFIED IDEOGRAPH
+ 0xAD9B: 0x74EB, //CJK UNIFIED IDEOGRAPH
+ 0xAD9C: 0x74EC, //CJK UNIFIED IDEOGRAPH
+ 0xAD9D: 0x74ED, //CJK UNIFIED IDEOGRAPH
+ 0xAD9E: 0x74F0, //CJK UNIFIED IDEOGRAPH
+ 0xAD9F: 0x74F1, //CJK UNIFIED IDEOGRAPH
+ 0xADA0: 0x74F2, //CJK UNIFIED IDEOGRAPH
+ 0xAE40: 0x74F3, //CJK UNIFIED IDEOGRAPH
+ 0xAE41: 0x74F5, //CJK UNIFIED IDEOGRAPH
+ 0xAE42: 0x74F8, //CJK UNIFIED IDEOGRAPH
+ 0xAE43: 0x74F9, //CJK UNIFIED IDEOGRAPH
+ 0xAE44: 0x74FA, //CJK UNIFIED IDEOGRAPH
+ 0xAE45: 0x74FB, //CJK UNIFIED IDEOGRAPH
+ 0xAE46: 0x74FC, //CJK UNIFIED IDEOGRAPH
+ 0xAE47: 0x74FD, //CJK UNIFIED IDEOGRAPH
+ 0xAE48: 0x74FE, //CJK UNIFIED IDEOGRAPH
+ 0xAE49: 0x7500, //CJK UNIFIED IDEOGRAPH
+ 0xAE4A: 0x7501, //CJK UNIFIED IDEOGRAPH
+ 0xAE4B: 0x7502, //CJK UNIFIED IDEOGRAPH
+ 0xAE4C: 0x7503, //CJK UNIFIED IDEOGRAPH
+ 0xAE4D: 0x7505, //CJK UNIFIED IDEOGRAPH
+ 0xAE4E: 0x7506, //CJK UNIFIED IDEOGRAPH
+ 0xAE4F: 0x7507, //CJK UNIFIED IDEOGRAPH
+ 0xAE50: 0x7508, //CJK UNIFIED IDEOGRAPH
+ 0xAE51: 0x7509, //CJK UNIFIED IDEOGRAPH
+ 0xAE52: 0x750A, //CJK UNIFIED IDEOGRAPH
+ 0xAE53: 0x750B, //CJK UNIFIED IDEOGRAPH
+ 0xAE54: 0x750C, //CJK UNIFIED IDEOGRAPH
+ 0xAE55: 0x750E, //CJK UNIFIED IDEOGRAPH
+ 0xAE56: 0x7510, //CJK UNIFIED IDEOGRAPH
+ 0xAE57: 0x7512, //CJK UNIFIED IDEOGRAPH
+ 0xAE58: 0x7514, //CJK UNIFIED IDEOGRAPH
+ 0xAE59: 0x7515, //CJK UNIFIED IDEOGRAPH
+ 0xAE5A: 0x7516, //CJK UNIFIED IDEOGRAPH
+ 0xAE5B: 0x7517, //CJK UNIFIED IDEOGRAPH
+ 0xAE5C: 0x751B, //CJK UNIFIED IDEOGRAPH
+ 0xAE5D: 0x751D, //CJK UNIFIED IDEOGRAPH
+ 0xAE5E: 0x751E, //CJK UNIFIED IDEOGRAPH
+ 0xAE5F: 0x7520, //CJK UNIFIED IDEOGRAPH
+ 0xAE60: 0x7521, //CJK UNIFIED IDEOGRAPH
+ 0xAE61: 0x7522, //CJK UNIFIED IDEOGRAPH
+ 0xAE62: 0x7523, //CJK UNIFIED IDEOGRAPH
+ 0xAE63: 0x7524, //CJK UNIFIED IDEOGRAPH
+ 0xAE64: 0x7526, //CJK UNIFIED IDEOGRAPH
+ 0xAE65: 0x7527, //CJK UNIFIED IDEOGRAPH
+ 0xAE66: 0x752A, //CJK UNIFIED IDEOGRAPH
+ 0xAE67: 0x752E, //CJK UNIFIED IDEOGRAPH
+ 0xAE68: 0x7534, //CJK UNIFIED IDEOGRAPH
+ 0xAE69: 0x7536, //CJK UNIFIED IDEOGRAPH
+ 0xAE6A: 0x7539, //CJK UNIFIED IDEOGRAPH
+ 0xAE6B: 0x753C, //CJK UNIFIED IDEOGRAPH
+ 0xAE6C: 0x753D, //CJK UNIFIED IDEOGRAPH
+ 0xAE6D: 0x753F, //CJK UNIFIED IDEOGRAPH
+ 0xAE6E: 0x7541, //CJK UNIFIED IDEOGRAPH
+ 0xAE6F: 0x7542, //CJK UNIFIED IDEOGRAPH
+ 0xAE70: 0x7543, //CJK UNIFIED IDEOGRAPH
+ 0xAE71: 0x7544, //CJK UNIFIED IDEOGRAPH
+ 0xAE72: 0x7546, //CJK UNIFIED IDEOGRAPH
+ 0xAE73: 0x7547, //CJK UNIFIED IDEOGRAPH
+ 0xAE74: 0x7549, //CJK UNIFIED IDEOGRAPH
+ 0xAE75: 0x754A, //CJK UNIFIED IDEOGRAPH
+ 0xAE76: 0x754D, //CJK UNIFIED IDEOGRAPH
+ 0xAE77: 0x7550, //CJK UNIFIED IDEOGRAPH
+ 0xAE78: 0x7551, //CJK UNIFIED IDEOGRAPH
+ 0xAE79: 0x7552, //CJK UNIFIED IDEOGRAPH
+ 0xAE7A: 0x7553, //CJK UNIFIED IDEOGRAPH
+ 0xAE7B: 0x7555, //CJK UNIFIED IDEOGRAPH
+ 0xAE7C: 0x7556, //CJK UNIFIED IDEOGRAPH
+ 0xAE7D: 0x7557, //CJK UNIFIED IDEOGRAPH
+ 0xAE7E: 0x7558, //CJK UNIFIED IDEOGRAPH
+ 0xAE80: 0x755D, //CJK UNIFIED IDEOGRAPH
+ 0xAE81: 0x755E, //CJK UNIFIED IDEOGRAPH
+ 0xAE82: 0x755F, //CJK UNIFIED IDEOGRAPH
+ 0xAE83: 0x7560, //CJK UNIFIED IDEOGRAPH
+ 0xAE84: 0x7561, //CJK UNIFIED IDEOGRAPH
+ 0xAE85: 0x7562, //CJK UNIFIED IDEOGRAPH
+ 0xAE86: 0x7563, //CJK UNIFIED IDEOGRAPH
+ 0xAE87: 0x7564, //CJK UNIFIED IDEOGRAPH
+ 0xAE88: 0x7567, //CJK UNIFIED IDEOGRAPH
+ 0xAE89: 0x7568, //CJK UNIFIED IDEOGRAPH
+ 0xAE8A: 0x7569, //CJK UNIFIED IDEOGRAPH
+ 0xAE8B: 0x756B, //CJK UNIFIED IDEOGRAPH
+ 0xAE8C: 0x756C, //CJK UNIFIED IDEOGRAPH
+ 0xAE8D: 0x756D, //CJK UNIFIED IDEOGRAPH
+ 0xAE8E: 0x756E, //CJK UNIFIED IDEOGRAPH
+ 0xAE8F: 0x756F, //CJK UNIFIED IDEOGRAPH
+ 0xAE90: 0x7570, //CJK UNIFIED IDEOGRAPH
+ 0xAE91: 0x7571, //CJK UNIFIED IDEOGRAPH
+ 0xAE92: 0x7573, //CJK UNIFIED IDEOGRAPH
+ 0xAE93: 0x7575, //CJK UNIFIED IDEOGRAPH
+ 0xAE94: 0x7576, //CJK UNIFIED IDEOGRAPH
+ 0xAE95: 0x7577, //CJK UNIFIED IDEOGRAPH
+ 0xAE96: 0x757A, //CJK UNIFIED IDEOGRAPH
+ 0xAE97: 0x757B, //CJK UNIFIED IDEOGRAPH
+ 0xAE98: 0x757C, //CJK UNIFIED IDEOGRAPH
+ 0xAE99: 0x757D, //CJK UNIFIED IDEOGRAPH
+ 0xAE9A: 0x757E, //CJK UNIFIED IDEOGRAPH
+ 0xAE9B: 0x7580, //CJK UNIFIED IDEOGRAPH
+ 0xAE9C: 0x7581, //CJK UNIFIED IDEOGRAPH
+ 0xAE9D: 0x7582, //CJK UNIFIED IDEOGRAPH
+ 0xAE9E: 0x7584, //CJK UNIFIED IDEOGRAPH
+ 0xAE9F: 0x7585, //CJK UNIFIED IDEOGRAPH
+ 0xAEA0: 0x7587, //CJK UNIFIED IDEOGRAPH
+ 0xAF40: 0x7588, //CJK UNIFIED IDEOGRAPH
+ 0xAF41: 0x7589, //CJK UNIFIED IDEOGRAPH
+ 0xAF42: 0x758A, //CJK UNIFIED IDEOGRAPH
+ 0xAF43: 0x758C, //CJK UNIFIED IDEOGRAPH
+ 0xAF44: 0x758D, //CJK UNIFIED IDEOGRAPH
+ 0xAF45: 0x758E, //CJK UNIFIED IDEOGRAPH
+ 0xAF46: 0x7590, //CJK UNIFIED IDEOGRAPH
+ 0xAF47: 0x7593, //CJK UNIFIED IDEOGRAPH
+ 0xAF48: 0x7595, //CJK UNIFIED IDEOGRAPH
+ 0xAF49: 0x7598, //CJK UNIFIED IDEOGRAPH
+ 0xAF4A: 0x759B, //CJK UNIFIED IDEOGRAPH
+ 0xAF4B: 0x759C, //CJK UNIFIED IDEOGRAPH
+ 0xAF4C: 0x759E, //CJK UNIFIED IDEOGRAPH
+ 0xAF4D: 0x75A2, //CJK UNIFIED IDEOGRAPH
+ 0xAF4E: 0x75A6, //CJK UNIFIED IDEOGRAPH
+ 0xAF4F: 0x75A7, //CJK UNIFIED IDEOGRAPH
+ 0xAF50: 0x75A8, //CJK UNIFIED IDEOGRAPH
+ 0xAF51: 0x75A9, //CJK UNIFIED IDEOGRAPH
+ 0xAF52: 0x75AA, //CJK UNIFIED IDEOGRAPH
+ 0xAF53: 0x75AD, //CJK UNIFIED IDEOGRAPH
+ 0xAF54: 0x75B6, //CJK UNIFIED IDEOGRAPH
+ 0xAF55: 0x75B7, //CJK UNIFIED IDEOGRAPH
+ 0xAF56: 0x75BA, //CJK UNIFIED IDEOGRAPH
+ 0xAF57: 0x75BB, //CJK UNIFIED IDEOGRAPH
+ 0xAF58: 0x75BF, //CJK UNIFIED IDEOGRAPH
+ 0xAF59: 0x75C0, //CJK UNIFIED IDEOGRAPH
+ 0xAF5A: 0x75C1, //CJK UNIFIED IDEOGRAPH
+ 0xAF5B: 0x75C6, //CJK UNIFIED IDEOGRAPH
+ 0xAF5C: 0x75CB, //CJK UNIFIED IDEOGRAPH
+ 0xAF5D: 0x75CC, //CJK UNIFIED IDEOGRAPH
+ 0xAF5E: 0x75CE, //CJK UNIFIED IDEOGRAPH
+ 0xAF5F: 0x75CF, //CJK UNIFIED IDEOGRAPH
+ 0xAF60: 0x75D0, //CJK UNIFIED IDEOGRAPH
+ 0xAF61: 0x75D1, //CJK UNIFIED IDEOGRAPH
+ 0xAF62: 0x75D3, //CJK UNIFIED IDEOGRAPH
+ 0xAF63: 0x75D7, //CJK UNIFIED IDEOGRAPH
+ 0xAF64: 0x75D9, //CJK UNIFIED IDEOGRAPH
+ 0xAF65: 0x75DA, //CJK UNIFIED IDEOGRAPH
+ 0xAF66: 0x75DC, //CJK UNIFIED IDEOGRAPH
+ 0xAF67: 0x75DD, //CJK UNIFIED IDEOGRAPH
+ 0xAF68: 0x75DF, //CJK UNIFIED IDEOGRAPH
+ 0xAF69: 0x75E0, //CJK UNIFIED IDEOGRAPH
+ 0xAF6A: 0x75E1, //CJK UNIFIED IDEOGRAPH
+ 0xAF6B: 0x75E5, //CJK UNIFIED IDEOGRAPH
+ 0xAF6C: 0x75E9, //CJK UNIFIED IDEOGRAPH
+ 0xAF6D: 0x75EC, //CJK UNIFIED IDEOGRAPH
+ 0xAF6E: 0x75ED, //CJK UNIFIED IDEOGRAPH
+ 0xAF6F: 0x75EE, //CJK UNIFIED IDEOGRAPH
+ 0xAF70: 0x75EF, //CJK UNIFIED IDEOGRAPH
+ 0xAF71: 0x75F2, //CJK UNIFIED IDEOGRAPH
+ 0xAF72: 0x75F3, //CJK UNIFIED IDEOGRAPH
+ 0xAF73: 0x75F5, //CJK UNIFIED IDEOGRAPH
+ 0xAF74: 0x75F6, //CJK UNIFIED IDEOGRAPH
+ 0xAF75: 0x75F7, //CJK UNIFIED IDEOGRAPH
+ 0xAF76: 0x75F8, //CJK UNIFIED IDEOGRAPH
+ 0xAF77: 0x75FA, //CJK UNIFIED IDEOGRAPH
+ 0xAF78: 0x75FB, //CJK UNIFIED IDEOGRAPH
+ 0xAF79: 0x75FD, //CJK UNIFIED IDEOGRAPH
+ 0xAF7A: 0x75FE, //CJK UNIFIED IDEOGRAPH
+ 0xAF7B: 0x7602, //CJK UNIFIED IDEOGRAPH
+ 0xAF7C: 0x7604, //CJK UNIFIED IDEOGRAPH
+ 0xAF7D: 0x7606, //CJK UNIFIED IDEOGRAPH
+ 0xAF7E: 0x7607, //CJK UNIFIED IDEOGRAPH
+ 0xAF80: 0x7608, //CJK UNIFIED IDEOGRAPH
+ 0xAF81: 0x7609, //CJK UNIFIED IDEOGRAPH
+ 0xAF82: 0x760B, //CJK UNIFIED IDEOGRAPH
+ 0xAF83: 0x760D, //CJK UNIFIED IDEOGRAPH
+ 0xAF84: 0x760E, //CJK UNIFIED IDEOGRAPH
+ 0xAF85: 0x760F, //CJK UNIFIED IDEOGRAPH
+ 0xAF86: 0x7611, //CJK UNIFIED IDEOGRAPH
+ 0xAF87: 0x7612, //CJK UNIFIED IDEOGRAPH
+ 0xAF88: 0x7613, //CJK UNIFIED IDEOGRAPH
+ 0xAF89: 0x7614, //CJK UNIFIED IDEOGRAPH
+ 0xAF8A: 0x7616, //CJK UNIFIED IDEOGRAPH
+ 0xAF8B: 0x761A, //CJK UNIFIED IDEOGRAPH
+ 0xAF8C: 0x761C, //CJK UNIFIED IDEOGRAPH
+ 0xAF8D: 0x761D, //CJK UNIFIED IDEOGRAPH
+ 0xAF8E: 0x761E, //CJK UNIFIED IDEOGRAPH
+ 0xAF8F: 0x7621, //CJK UNIFIED IDEOGRAPH
+ 0xAF90: 0x7623, //CJK UNIFIED IDEOGRAPH
+ 0xAF91: 0x7627, //CJK UNIFIED IDEOGRAPH
+ 0xAF92: 0x7628, //CJK UNIFIED IDEOGRAPH
+ 0xAF93: 0x762C, //CJK UNIFIED IDEOGRAPH
+ 0xAF94: 0x762E, //CJK UNIFIED IDEOGRAPH
+ 0xAF95: 0x762F, //CJK UNIFIED IDEOGRAPH
+ 0xAF96: 0x7631, //CJK UNIFIED IDEOGRAPH
+ 0xAF97: 0x7632, //CJK UNIFIED IDEOGRAPH
+ 0xAF98: 0x7636, //CJK UNIFIED IDEOGRAPH
+ 0xAF99: 0x7637, //CJK UNIFIED IDEOGRAPH
+ 0xAF9A: 0x7639, //CJK UNIFIED IDEOGRAPH
+ 0xAF9B: 0x763A, //CJK UNIFIED IDEOGRAPH
+ 0xAF9C: 0x763B, //CJK UNIFIED IDEOGRAPH
+ 0xAF9D: 0x763D, //CJK UNIFIED IDEOGRAPH
+ 0xAF9E: 0x7641, //CJK UNIFIED IDEOGRAPH
+ 0xAF9F: 0x7642, //CJK UNIFIED IDEOGRAPH
+ 0xAFA0: 0x7644, //CJK UNIFIED IDEOGRAPH
+ 0xB040: 0x7645, //CJK UNIFIED IDEOGRAPH
+ 0xB041: 0x7646, //CJK UNIFIED IDEOGRAPH
+ 0xB042: 0x7647, //CJK UNIFIED IDEOGRAPH
+ 0xB043: 0x7648, //CJK UNIFIED IDEOGRAPH
+ 0xB044: 0x7649, //CJK UNIFIED IDEOGRAPH
+ 0xB045: 0x764A, //CJK UNIFIED IDEOGRAPH
+ 0xB046: 0x764B, //CJK UNIFIED IDEOGRAPH
+ 0xB047: 0x764E, //CJK UNIFIED IDEOGRAPH
+ 0xB048: 0x764F, //CJK UNIFIED IDEOGRAPH
+ 0xB049: 0x7650, //CJK UNIFIED IDEOGRAPH
+ 0xB04A: 0x7651, //CJK UNIFIED IDEOGRAPH
+ 0xB04B: 0x7652, //CJK UNIFIED IDEOGRAPH
+ 0xB04C: 0x7653, //CJK UNIFIED IDEOGRAPH
+ 0xB04D: 0x7655, //CJK UNIFIED IDEOGRAPH
+ 0xB04E: 0x7657, //CJK UNIFIED IDEOGRAPH
+ 0xB04F: 0x7658, //CJK UNIFIED IDEOGRAPH
+ 0xB050: 0x7659, //CJK UNIFIED IDEOGRAPH
+ 0xB051: 0x765A, //CJK UNIFIED IDEOGRAPH
+ 0xB052: 0x765B, //CJK UNIFIED IDEOGRAPH
+ 0xB053: 0x765D, //CJK UNIFIED IDEOGRAPH
+ 0xB054: 0x765F, //CJK UNIFIED IDEOGRAPH
+ 0xB055: 0x7660, //CJK UNIFIED IDEOGRAPH
+ 0xB056: 0x7661, //CJK UNIFIED IDEOGRAPH
+ 0xB057: 0x7662, //CJK UNIFIED IDEOGRAPH
+ 0xB058: 0x7664, //CJK UNIFIED IDEOGRAPH
+ 0xB059: 0x7665, //CJK UNIFIED IDEOGRAPH
+ 0xB05A: 0x7666, //CJK UNIFIED IDEOGRAPH
+ 0xB05B: 0x7667, //CJK UNIFIED IDEOGRAPH
+ 0xB05C: 0x7668, //CJK UNIFIED IDEOGRAPH
+ 0xB05D: 0x7669, //CJK UNIFIED IDEOGRAPH
+ 0xB05E: 0x766A, //CJK UNIFIED IDEOGRAPH
+ 0xB05F: 0x766C, //CJK UNIFIED IDEOGRAPH
+ 0xB060: 0x766D, //CJK UNIFIED IDEOGRAPH
+ 0xB061: 0x766E, //CJK UNIFIED IDEOGRAPH
+ 0xB062: 0x7670, //CJK UNIFIED IDEOGRAPH
+ 0xB063: 0x7671, //CJK UNIFIED IDEOGRAPH
+ 0xB064: 0x7672, //CJK UNIFIED IDEOGRAPH
+ 0xB065: 0x7673, //CJK UNIFIED IDEOGRAPH
+ 0xB066: 0x7674, //CJK UNIFIED IDEOGRAPH
+ 0xB067: 0x7675, //CJK UNIFIED IDEOGRAPH
+ 0xB068: 0x7676, //CJK UNIFIED IDEOGRAPH
+ 0xB069: 0x7677, //CJK UNIFIED IDEOGRAPH
+ 0xB06A: 0x7679, //CJK UNIFIED IDEOGRAPH
+ 0xB06B: 0x767A, //CJK UNIFIED IDEOGRAPH
+ 0xB06C: 0x767C, //CJK UNIFIED IDEOGRAPH
+ 0xB06D: 0x767F, //CJK UNIFIED IDEOGRAPH
+ 0xB06E: 0x7680, //CJK UNIFIED IDEOGRAPH
+ 0xB06F: 0x7681, //CJK UNIFIED IDEOGRAPH
+ 0xB070: 0x7683, //CJK UNIFIED IDEOGRAPH
+ 0xB071: 0x7685, //CJK UNIFIED IDEOGRAPH
+ 0xB072: 0x7689, //CJK UNIFIED IDEOGRAPH
+ 0xB073: 0x768A, //CJK UNIFIED IDEOGRAPH
+ 0xB074: 0x768C, //CJK UNIFIED IDEOGRAPH
+ 0xB075: 0x768D, //CJK UNIFIED IDEOGRAPH
+ 0xB076: 0x768F, //CJK UNIFIED IDEOGRAPH
+ 0xB077: 0x7690, //CJK UNIFIED IDEOGRAPH
+ 0xB078: 0x7692, //CJK UNIFIED IDEOGRAPH
+ 0xB079: 0x7694, //CJK UNIFIED IDEOGRAPH
+ 0xB07A: 0x7695, //CJK UNIFIED IDEOGRAPH
+ 0xB07B: 0x7697, //CJK UNIFIED IDEOGRAPH
+ 0xB07C: 0x7698, //CJK UNIFIED IDEOGRAPH
+ 0xB07D: 0x769A, //CJK UNIFIED IDEOGRAPH
+ 0xB07E: 0x769B, //CJK UNIFIED IDEOGRAPH
+ 0xB080: 0x769C, //CJK UNIFIED IDEOGRAPH
+ 0xB081: 0x769D, //CJK UNIFIED IDEOGRAPH
+ 0xB082: 0x769E, //CJK UNIFIED IDEOGRAPH
+ 0xB083: 0x769F, //CJK UNIFIED IDEOGRAPH
+ 0xB084: 0x76A0, //CJK UNIFIED IDEOGRAPH
+ 0xB085: 0x76A1, //CJK UNIFIED IDEOGRAPH
+ 0xB086: 0x76A2, //CJK UNIFIED IDEOGRAPH
+ 0xB087: 0x76A3, //CJK UNIFIED IDEOGRAPH
+ 0xB088: 0x76A5, //CJK UNIFIED IDEOGRAPH
+ 0xB089: 0x76A6, //CJK UNIFIED IDEOGRAPH
+ 0xB08A: 0x76A7, //CJK UNIFIED IDEOGRAPH
+ 0xB08B: 0x76A8, //CJK UNIFIED IDEOGRAPH
+ 0xB08C: 0x76A9, //CJK UNIFIED IDEOGRAPH
+ 0xB08D: 0x76AA, //CJK UNIFIED IDEOGRAPH
+ 0xB08E: 0x76AB, //CJK UNIFIED IDEOGRAPH
+ 0xB08F: 0x76AC, //CJK UNIFIED IDEOGRAPH
+ 0xB090: 0x76AD, //CJK UNIFIED IDEOGRAPH
+ 0xB091: 0x76AF, //CJK UNIFIED IDEOGRAPH
+ 0xB092: 0x76B0, //CJK UNIFIED IDEOGRAPH
+ 0xB093: 0x76B3, //CJK UNIFIED IDEOGRAPH
+ 0xB094: 0x76B5, //CJK UNIFIED IDEOGRAPH
+ 0xB095: 0x76B6, //CJK UNIFIED IDEOGRAPH
+ 0xB096: 0x76B7, //CJK UNIFIED IDEOGRAPH
+ 0xB097: 0x76B8, //CJK UNIFIED IDEOGRAPH
+ 0xB098: 0x76B9, //CJK UNIFIED IDEOGRAPH
+ 0xB099: 0x76BA, //CJK UNIFIED IDEOGRAPH
+ 0xB09A: 0x76BB, //CJK UNIFIED IDEOGRAPH
+ 0xB09B: 0x76BC, //CJK UNIFIED IDEOGRAPH
+ 0xB09C: 0x76BD, //CJK UNIFIED IDEOGRAPH
+ 0xB09D: 0x76BE, //CJK UNIFIED IDEOGRAPH
+ 0xB09E: 0x76C0, //CJK UNIFIED IDEOGRAPH
+ 0xB09F: 0x76C1, //CJK UNIFIED IDEOGRAPH
+ 0xB0A0: 0x76C3, //CJK UNIFIED IDEOGRAPH
+ 0xB0A1: 0x554A, //CJK UNIFIED IDEOGRAPH
+ 0xB0A2: 0x963F, //CJK UNIFIED IDEOGRAPH
+ 0xB0A3: 0x57C3, //CJK UNIFIED IDEOGRAPH
+ 0xB0A4: 0x6328, //CJK UNIFIED IDEOGRAPH
+ 0xB0A5: 0x54CE, //CJK UNIFIED IDEOGRAPH
+ 0xB0A6: 0x5509, //CJK UNIFIED IDEOGRAPH
+ 0xB0A7: 0x54C0, //CJK UNIFIED IDEOGRAPH
+ 0xB0A8: 0x7691, //CJK UNIFIED IDEOGRAPH
+ 0xB0A9: 0x764C, //CJK UNIFIED IDEOGRAPH
+ 0xB0AA: 0x853C, //CJK UNIFIED IDEOGRAPH
+ 0xB0AB: 0x77EE, //CJK UNIFIED IDEOGRAPH
+ 0xB0AC: 0x827E, //CJK UNIFIED IDEOGRAPH
+ 0xB0AD: 0x788D, //CJK UNIFIED IDEOGRAPH
+ 0xB0AE: 0x7231, //CJK UNIFIED IDEOGRAPH
+ 0xB0AF: 0x9698, //CJK UNIFIED IDEOGRAPH
+ 0xB0B0: 0x978D, //CJK UNIFIED IDEOGRAPH
+ 0xB0B1: 0x6C28, //CJK UNIFIED IDEOGRAPH
+ 0xB0B2: 0x5B89, //CJK UNIFIED IDEOGRAPH
+ 0xB0B3: 0x4FFA, //CJK UNIFIED IDEOGRAPH
+ 0xB0B4: 0x6309, //CJK UNIFIED IDEOGRAPH
+ 0xB0B5: 0x6697, //CJK UNIFIED IDEOGRAPH
+ 0xB0B6: 0x5CB8, //CJK UNIFIED IDEOGRAPH
+ 0xB0B7: 0x80FA, //CJK UNIFIED IDEOGRAPH
+ 0xB0B8: 0x6848, //CJK UNIFIED IDEOGRAPH
+ 0xB0B9: 0x80AE, //CJK UNIFIED IDEOGRAPH
+ 0xB0BA: 0x6602, //CJK UNIFIED IDEOGRAPH
+ 0xB0BB: 0x76CE, //CJK UNIFIED IDEOGRAPH
+ 0xB0BC: 0x51F9, //CJK UNIFIED IDEOGRAPH
+ 0xB0BD: 0x6556, //CJK UNIFIED IDEOGRAPH
+ 0xB0BE: 0x71AC, //CJK UNIFIED IDEOGRAPH
+ 0xB0BF: 0x7FF1, //CJK UNIFIED IDEOGRAPH
+ 0xB0C0: 0x8884, //CJK UNIFIED IDEOGRAPH
+ 0xB0C1: 0x50B2, //CJK UNIFIED IDEOGRAPH
+ 0xB0C2: 0x5965, //CJK UNIFIED IDEOGRAPH
+ 0xB0C3: 0x61CA, //CJK UNIFIED IDEOGRAPH
+ 0xB0C4: 0x6FB3, //CJK UNIFIED IDEOGRAPH
+ 0xB0C5: 0x82AD, //CJK UNIFIED IDEOGRAPH
+ 0xB0C6: 0x634C, //CJK UNIFIED IDEOGRAPH
+ 0xB0C7: 0x6252, //CJK UNIFIED IDEOGRAPH
+ 0xB0C8: 0x53ED, //CJK UNIFIED IDEOGRAPH
+ 0xB0C9: 0x5427, //CJK UNIFIED IDEOGRAPH
+ 0xB0CA: 0x7B06, //CJK UNIFIED IDEOGRAPH
+ 0xB0CB: 0x516B, //CJK UNIFIED IDEOGRAPH
+ 0xB0CC: 0x75A4, //CJK UNIFIED IDEOGRAPH
+ 0xB0CD: 0x5DF4, //CJK UNIFIED IDEOGRAPH
+ 0xB0CE: 0x62D4, //CJK UNIFIED IDEOGRAPH
+ 0xB0CF: 0x8DCB, //CJK UNIFIED IDEOGRAPH
+ 0xB0D0: 0x9776, //CJK UNIFIED IDEOGRAPH
+ 0xB0D1: 0x628A, //CJK UNIFIED IDEOGRAPH
+ 0xB0D2: 0x8019, //CJK UNIFIED IDEOGRAPH
+ 0xB0D3: 0x575D, //CJK UNIFIED IDEOGRAPH
+ 0xB0D4: 0x9738, //CJK UNIFIED IDEOGRAPH
+ 0xB0D5: 0x7F62, //CJK UNIFIED IDEOGRAPH
+ 0xB0D6: 0x7238, //CJK UNIFIED IDEOGRAPH
+ 0xB0D7: 0x767D, //CJK UNIFIED IDEOGRAPH
+ 0xB0D8: 0x67CF, //CJK UNIFIED IDEOGRAPH
+ 0xB0D9: 0x767E, //CJK UNIFIED IDEOGRAPH
+ 0xB0DA: 0x6446, //CJK UNIFIED IDEOGRAPH
+ 0xB0DB: 0x4F70, //CJK UNIFIED IDEOGRAPH
+ 0xB0DC: 0x8D25, //CJK UNIFIED IDEOGRAPH
+ 0xB0DD: 0x62DC, //CJK UNIFIED IDEOGRAPH
+ 0xB0DE: 0x7A17, //CJK UNIFIED IDEOGRAPH
+ 0xB0DF: 0x6591, //CJK UNIFIED IDEOGRAPH
+ 0xB0E0: 0x73ED, //CJK UNIFIED IDEOGRAPH
+ 0xB0E1: 0x642C, //CJK UNIFIED IDEOGRAPH
+ 0xB0E2: 0x6273, //CJK UNIFIED IDEOGRAPH
+ 0xB0E3: 0x822C, //CJK UNIFIED IDEOGRAPH
+ 0xB0E4: 0x9881, //CJK UNIFIED IDEOGRAPH
+ 0xB0E5: 0x677F, //CJK UNIFIED IDEOGRAPH
+ 0xB0E6: 0x7248, //CJK UNIFIED IDEOGRAPH
+ 0xB0E7: 0x626E, //CJK UNIFIED IDEOGRAPH
+ 0xB0E8: 0x62CC, //CJK UNIFIED IDEOGRAPH
+ 0xB0E9: 0x4F34, //CJK UNIFIED IDEOGRAPH
+ 0xB0EA: 0x74E3, //CJK UNIFIED IDEOGRAPH
+ 0xB0EB: 0x534A, //CJK UNIFIED IDEOGRAPH
+ 0xB0EC: 0x529E, //CJK UNIFIED IDEOGRAPH
+ 0xB0ED: 0x7ECA, //CJK UNIFIED IDEOGRAPH
+ 0xB0EE: 0x90A6, //CJK UNIFIED IDEOGRAPH
+ 0xB0EF: 0x5E2E, //CJK UNIFIED IDEOGRAPH
+ 0xB0F0: 0x6886, //CJK UNIFIED IDEOGRAPH
+ 0xB0F1: 0x699C, //CJK UNIFIED IDEOGRAPH
+ 0xB0F2: 0x8180, //CJK UNIFIED IDEOGRAPH
+ 0xB0F3: 0x7ED1, //CJK UNIFIED IDEOGRAPH
+ 0xB0F4: 0x68D2, //CJK UNIFIED IDEOGRAPH
+ 0xB0F5: 0x78C5, //CJK UNIFIED IDEOGRAPH
+ 0xB0F6: 0x868C, //CJK UNIFIED IDEOGRAPH
+ 0xB0F7: 0x9551, //CJK UNIFIED IDEOGRAPH
+ 0xB0F8: 0x508D, //CJK UNIFIED IDEOGRAPH
+ 0xB0F9: 0x8C24, //CJK UNIFIED IDEOGRAPH
+ 0xB0FA: 0x82DE, //CJK UNIFIED IDEOGRAPH
+ 0xB0FB: 0x80DE, //CJK UNIFIED IDEOGRAPH
+ 0xB0FC: 0x5305, //CJK UNIFIED IDEOGRAPH
+ 0xB0FD: 0x8912, //CJK UNIFIED IDEOGRAPH
+ 0xB0FE: 0x5265, //CJK UNIFIED IDEOGRAPH
+ 0xB140: 0x76C4, //CJK UNIFIED IDEOGRAPH
+ 0xB141: 0x76C7, //CJK UNIFIED IDEOGRAPH
+ 0xB142: 0x76C9, //CJK UNIFIED IDEOGRAPH
+ 0xB143: 0x76CB, //CJK UNIFIED IDEOGRAPH
+ 0xB144: 0x76CC, //CJK UNIFIED IDEOGRAPH
+ 0xB145: 0x76D3, //CJK UNIFIED IDEOGRAPH
+ 0xB146: 0x76D5, //CJK UNIFIED IDEOGRAPH
+ 0xB147: 0x76D9, //CJK UNIFIED IDEOGRAPH
+ 0xB148: 0x76DA, //CJK UNIFIED IDEOGRAPH
+ 0xB149: 0x76DC, //CJK UNIFIED IDEOGRAPH
+ 0xB14A: 0x76DD, //CJK UNIFIED IDEOGRAPH
+ 0xB14B: 0x76DE, //CJK UNIFIED IDEOGRAPH
+ 0xB14C: 0x76E0, //CJK UNIFIED IDEOGRAPH
+ 0xB14D: 0x76E1, //CJK UNIFIED IDEOGRAPH
+ 0xB14E: 0x76E2, //CJK UNIFIED IDEOGRAPH
+ 0xB14F: 0x76E3, //CJK UNIFIED IDEOGRAPH
+ 0xB150: 0x76E4, //CJK UNIFIED IDEOGRAPH
+ 0xB151: 0x76E6, //CJK UNIFIED IDEOGRAPH
+ 0xB152: 0x76E7, //CJK UNIFIED IDEOGRAPH
+ 0xB153: 0x76E8, //CJK UNIFIED IDEOGRAPH
+ 0xB154: 0x76E9, //CJK UNIFIED IDEOGRAPH
+ 0xB155: 0x76EA, //CJK UNIFIED IDEOGRAPH
+ 0xB156: 0x76EB, //CJK UNIFIED IDEOGRAPH
+ 0xB157: 0x76EC, //CJK UNIFIED IDEOGRAPH
+ 0xB158: 0x76ED, //CJK UNIFIED IDEOGRAPH
+ 0xB159: 0x76F0, //CJK UNIFIED IDEOGRAPH
+ 0xB15A: 0x76F3, //CJK UNIFIED IDEOGRAPH
+ 0xB15B: 0x76F5, //CJK UNIFIED IDEOGRAPH
+ 0xB15C: 0x76F6, //CJK UNIFIED IDEOGRAPH
+ 0xB15D: 0x76F7, //CJK UNIFIED IDEOGRAPH
+ 0xB15E: 0x76FA, //CJK UNIFIED IDEOGRAPH
+ 0xB15F: 0x76FB, //CJK UNIFIED IDEOGRAPH
+ 0xB160: 0x76FD, //CJK UNIFIED IDEOGRAPH
+ 0xB161: 0x76FF, //CJK UNIFIED IDEOGRAPH
+ 0xB162: 0x7700, //CJK UNIFIED IDEOGRAPH
+ 0xB163: 0x7702, //CJK UNIFIED IDEOGRAPH
+ 0xB164: 0x7703, //CJK UNIFIED IDEOGRAPH
+ 0xB165: 0x7705, //CJK UNIFIED IDEOGRAPH
+ 0xB166: 0x7706, //CJK UNIFIED IDEOGRAPH
+ 0xB167: 0x770A, //CJK UNIFIED IDEOGRAPH
+ 0xB168: 0x770C, //CJK UNIFIED IDEOGRAPH
+ 0xB169: 0x770E, //CJK UNIFIED IDEOGRAPH
+ 0xB16A: 0x770F, //CJK UNIFIED IDEOGRAPH
+ 0xB16B: 0x7710, //CJK UNIFIED IDEOGRAPH
+ 0xB16C: 0x7711, //CJK UNIFIED IDEOGRAPH
+ 0xB16D: 0x7712, //CJK UNIFIED IDEOGRAPH
+ 0xB16E: 0x7713, //CJK UNIFIED IDEOGRAPH
+ 0xB16F: 0x7714, //CJK UNIFIED IDEOGRAPH
+ 0xB170: 0x7715, //CJK UNIFIED IDEOGRAPH
+ 0xB171: 0x7716, //CJK UNIFIED IDEOGRAPH
+ 0xB172: 0x7717, //CJK UNIFIED IDEOGRAPH
+ 0xB173: 0x7718, //CJK UNIFIED IDEOGRAPH
+ 0xB174: 0x771B, //CJK UNIFIED IDEOGRAPH
+ 0xB175: 0x771C, //CJK UNIFIED IDEOGRAPH
+ 0xB176: 0x771D, //CJK UNIFIED IDEOGRAPH
+ 0xB177: 0x771E, //CJK UNIFIED IDEOGRAPH
+ 0xB178: 0x7721, //CJK UNIFIED IDEOGRAPH
+ 0xB179: 0x7723, //CJK UNIFIED IDEOGRAPH
+ 0xB17A: 0x7724, //CJK UNIFIED IDEOGRAPH
+ 0xB17B: 0x7725, //CJK UNIFIED IDEOGRAPH
+ 0xB17C: 0x7727, //CJK UNIFIED IDEOGRAPH
+ 0xB17D: 0x772A, //CJK UNIFIED IDEOGRAPH
+ 0xB17E: 0x772B, //CJK UNIFIED IDEOGRAPH
+ 0xB180: 0x772C, //CJK UNIFIED IDEOGRAPH
+ 0xB181: 0x772E, //CJK UNIFIED IDEOGRAPH
+ 0xB182: 0x7730, //CJK UNIFIED IDEOGRAPH
+ 0xB183: 0x7731, //CJK UNIFIED IDEOGRAPH
+ 0xB184: 0x7732, //CJK UNIFIED IDEOGRAPH
+ 0xB185: 0x7733, //CJK UNIFIED IDEOGRAPH
+ 0xB186: 0x7734, //CJK UNIFIED IDEOGRAPH
+ 0xB187: 0x7739, //CJK UNIFIED IDEOGRAPH
+ 0xB188: 0x773B, //CJK UNIFIED IDEOGRAPH
+ 0xB189: 0x773D, //CJK UNIFIED IDEOGRAPH
+ 0xB18A: 0x773E, //CJK UNIFIED IDEOGRAPH
+ 0xB18B: 0x773F, //CJK UNIFIED IDEOGRAPH
+ 0xB18C: 0x7742, //CJK UNIFIED IDEOGRAPH
+ 0xB18D: 0x7744, //CJK UNIFIED IDEOGRAPH
+ 0xB18E: 0x7745, //CJK UNIFIED IDEOGRAPH
+ 0xB18F: 0x7746, //CJK UNIFIED IDEOGRAPH
+ 0xB190: 0x7748, //CJK UNIFIED IDEOGRAPH
+ 0xB191: 0x7749, //CJK UNIFIED IDEOGRAPH
+ 0xB192: 0x774A, //CJK UNIFIED IDEOGRAPH
+ 0xB193: 0x774B, //CJK UNIFIED IDEOGRAPH
+ 0xB194: 0x774C, //CJK UNIFIED IDEOGRAPH
+ 0xB195: 0x774D, //CJK UNIFIED IDEOGRAPH
+ 0xB196: 0x774E, //CJK UNIFIED IDEOGRAPH
+ 0xB197: 0x774F, //CJK UNIFIED IDEOGRAPH
+ 0xB198: 0x7752, //CJK UNIFIED IDEOGRAPH
+ 0xB199: 0x7753, //CJK UNIFIED IDEOGRAPH
+ 0xB19A: 0x7754, //CJK UNIFIED IDEOGRAPH
+ 0xB19B: 0x7755, //CJK UNIFIED IDEOGRAPH
+ 0xB19C: 0x7756, //CJK UNIFIED IDEOGRAPH
+ 0xB19D: 0x7757, //CJK UNIFIED IDEOGRAPH
+ 0xB19E: 0x7758, //CJK UNIFIED IDEOGRAPH
+ 0xB19F: 0x7759, //CJK UNIFIED IDEOGRAPH
+ 0xB1A0: 0x775C, //CJK UNIFIED IDEOGRAPH
+ 0xB1A1: 0x8584, //CJK UNIFIED IDEOGRAPH
+ 0xB1A2: 0x96F9, //CJK UNIFIED IDEOGRAPH
+ 0xB1A3: 0x4FDD, //CJK UNIFIED IDEOGRAPH
+ 0xB1A4: 0x5821, //CJK UNIFIED IDEOGRAPH
+ 0xB1A5: 0x9971, //CJK UNIFIED IDEOGRAPH
+ 0xB1A6: 0x5B9D, //CJK UNIFIED IDEOGRAPH
+ 0xB1A7: 0x62B1, //CJK UNIFIED IDEOGRAPH
+ 0xB1A8: 0x62A5, //CJK UNIFIED IDEOGRAPH
+ 0xB1A9: 0x66B4, //CJK UNIFIED IDEOGRAPH
+ 0xB1AA: 0x8C79, //CJK UNIFIED IDEOGRAPH
+ 0xB1AB: 0x9C8D, //CJK UNIFIED IDEOGRAPH
+ 0xB1AC: 0x7206, //CJK UNIFIED IDEOGRAPH
+ 0xB1AD: 0x676F, //CJK UNIFIED IDEOGRAPH
+ 0xB1AE: 0x7891, //CJK UNIFIED IDEOGRAPH
+ 0xB1AF: 0x60B2, //CJK UNIFIED IDEOGRAPH
+ 0xB1B0: 0x5351, //CJK UNIFIED IDEOGRAPH
+ 0xB1B1: 0x5317, //CJK UNIFIED IDEOGRAPH
+ 0xB1B2: 0x8F88, //CJK UNIFIED IDEOGRAPH
+ 0xB1B3: 0x80CC, //CJK UNIFIED IDEOGRAPH
+ 0xB1B4: 0x8D1D, //CJK UNIFIED IDEOGRAPH
+ 0xB1B5: 0x94A1, //CJK UNIFIED IDEOGRAPH
+ 0xB1B6: 0x500D, //CJK UNIFIED IDEOGRAPH
+ 0xB1B7: 0x72C8, //CJK UNIFIED IDEOGRAPH
+ 0xB1B8: 0x5907, //CJK UNIFIED IDEOGRAPH
+ 0xB1B9: 0x60EB, //CJK UNIFIED IDEOGRAPH
+ 0xB1BA: 0x7119, //CJK UNIFIED IDEOGRAPH
+ 0xB1BB: 0x88AB, //CJK UNIFIED IDEOGRAPH
+ 0xB1BC: 0x5954, //CJK UNIFIED IDEOGRAPH
+ 0xB1BD: 0x82EF, //CJK UNIFIED IDEOGRAPH
+ 0xB1BE: 0x672C, //CJK UNIFIED IDEOGRAPH
+ 0xB1BF: 0x7B28, //CJK UNIFIED IDEOGRAPH
+ 0xB1C0: 0x5D29, //CJK UNIFIED IDEOGRAPH
+ 0xB1C1: 0x7EF7, //CJK UNIFIED IDEOGRAPH
+ 0xB1C2: 0x752D, //CJK UNIFIED IDEOGRAPH
+ 0xB1C3: 0x6CF5, //CJK UNIFIED IDEOGRAPH
+ 0xB1C4: 0x8E66, //CJK UNIFIED IDEOGRAPH
+ 0xB1C5: 0x8FF8, //CJK UNIFIED IDEOGRAPH
+ 0xB1C6: 0x903C, //CJK UNIFIED IDEOGRAPH
+ 0xB1C7: 0x9F3B, //CJK UNIFIED IDEOGRAPH
+ 0xB1C8: 0x6BD4, //CJK UNIFIED IDEOGRAPH
+ 0xB1C9: 0x9119, //CJK UNIFIED IDEOGRAPH
+ 0xB1CA: 0x7B14, //CJK UNIFIED IDEOGRAPH
+ 0xB1CB: 0x5F7C, //CJK UNIFIED IDEOGRAPH
+ 0xB1CC: 0x78A7, //CJK UNIFIED IDEOGRAPH
+ 0xB1CD: 0x84D6, //CJK UNIFIED IDEOGRAPH
+ 0xB1CE: 0x853D, //CJK UNIFIED IDEOGRAPH
+ 0xB1CF: 0x6BD5, //CJK UNIFIED IDEOGRAPH
+ 0xB1D0: 0x6BD9, //CJK UNIFIED IDEOGRAPH
+ 0xB1D1: 0x6BD6, //CJK UNIFIED IDEOGRAPH
+ 0xB1D2: 0x5E01, //CJK UNIFIED IDEOGRAPH
+ 0xB1D3: 0x5E87, //CJK UNIFIED IDEOGRAPH
+ 0xB1D4: 0x75F9, //CJK UNIFIED IDEOGRAPH
+ 0xB1D5: 0x95ED, //CJK UNIFIED IDEOGRAPH
+ 0xB1D6: 0x655D, //CJK UNIFIED IDEOGRAPH
+ 0xB1D7: 0x5F0A, //CJK UNIFIED IDEOGRAPH
+ 0xB1D8: 0x5FC5, //CJK UNIFIED IDEOGRAPH
+ 0xB1D9: 0x8F9F, //CJK UNIFIED IDEOGRAPH
+ 0xB1DA: 0x58C1, //CJK UNIFIED IDEOGRAPH
+ 0xB1DB: 0x81C2, //CJK UNIFIED IDEOGRAPH
+ 0xB1DC: 0x907F, //CJK UNIFIED IDEOGRAPH
+ 0xB1DD: 0x965B, //CJK UNIFIED IDEOGRAPH
+ 0xB1DE: 0x97AD, //CJK UNIFIED IDEOGRAPH
+ 0xB1DF: 0x8FB9, //CJK UNIFIED IDEOGRAPH
+ 0xB1E0: 0x7F16, //CJK UNIFIED IDEOGRAPH
+ 0xB1E1: 0x8D2C, //CJK UNIFIED IDEOGRAPH
+ 0xB1E2: 0x6241, //CJK UNIFIED IDEOGRAPH
+ 0xB1E3: 0x4FBF, //CJK UNIFIED IDEOGRAPH
+ 0xB1E4: 0x53D8, //CJK UNIFIED IDEOGRAPH
+ 0xB1E5: 0x535E, //CJK UNIFIED IDEOGRAPH
+ 0xB1E6: 0x8FA8, //CJK UNIFIED IDEOGRAPH
+ 0xB1E7: 0x8FA9, //CJK UNIFIED IDEOGRAPH
+ 0xB1E8: 0x8FAB, //CJK UNIFIED IDEOGRAPH
+ 0xB1E9: 0x904D, //CJK UNIFIED IDEOGRAPH
+ 0xB1EA: 0x6807, //CJK UNIFIED IDEOGRAPH
+ 0xB1EB: 0x5F6A, //CJK UNIFIED IDEOGRAPH
+ 0xB1EC: 0x8198, //CJK UNIFIED IDEOGRAPH
+ 0xB1ED: 0x8868, //CJK UNIFIED IDEOGRAPH
+ 0xB1EE: 0x9CD6, //CJK UNIFIED IDEOGRAPH
+ 0xB1EF: 0x618B, //CJK UNIFIED IDEOGRAPH
+ 0xB1F0: 0x522B, //CJK UNIFIED IDEOGRAPH
+ 0xB1F1: 0x762A, //CJK UNIFIED IDEOGRAPH
+ 0xB1F2: 0x5F6C, //CJK UNIFIED IDEOGRAPH
+ 0xB1F3: 0x658C, //CJK UNIFIED IDEOGRAPH
+ 0xB1F4: 0x6FD2, //CJK UNIFIED IDEOGRAPH
+ 0xB1F5: 0x6EE8, //CJK UNIFIED IDEOGRAPH
+ 0xB1F6: 0x5BBE, //CJK UNIFIED IDEOGRAPH
+ 0xB1F7: 0x6448, //CJK UNIFIED IDEOGRAPH
+ 0xB1F8: 0x5175, //CJK UNIFIED IDEOGRAPH
+ 0xB1F9: 0x51B0, //CJK UNIFIED IDEOGRAPH
+ 0xB1FA: 0x67C4, //CJK UNIFIED IDEOGRAPH
+ 0xB1FB: 0x4E19, //CJK UNIFIED IDEOGRAPH
+ 0xB1FC: 0x79C9, //CJK UNIFIED IDEOGRAPH
+ 0xB1FD: 0x997C, //CJK UNIFIED IDEOGRAPH
+ 0xB1FE: 0x70B3, //CJK UNIFIED IDEOGRAPH
+ 0xB240: 0x775D, //CJK UNIFIED IDEOGRAPH
+ 0xB241: 0x775E, //CJK UNIFIED IDEOGRAPH
+ 0xB242: 0x775F, //CJK UNIFIED IDEOGRAPH
+ 0xB243: 0x7760, //CJK UNIFIED IDEOGRAPH
+ 0xB244: 0x7764, //CJK UNIFIED IDEOGRAPH
+ 0xB245: 0x7767, //CJK UNIFIED IDEOGRAPH
+ 0xB246: 0x7769, //CJK UNIFIED IDEOGRAPH
+ 0xB247: 0x776A, //CJK UNIFIED IDEOGRAPH
+ 0xB248: 0x776D, //CJK UNIFIED IDEOGRAPH
+ 0xB249: 0x776E, //CJK UNIFIED IDEOGRAPH
+ 0xB24A: 0x776F, //CJK UNIFIED IDEOGRAPH
+ 0xB24B: 0x7770, //CJK UNIFIED IDEOGRAPH
+ 0xB24C: 0x7771, //CJK UNIFIED IDEOGRAPH
+ 0xB24D: 0x7772, //CJK UNIFIED IDEOGRAPH
+ 0xB24E: 0x7773, //CJK UNIFIED IDEOGRAPH
+ 0xB24F: 0x7774, //CJK UNIFIED IDEOGRAPH
+ 0xB250: 0x7775, //CJK UNIFIED IDEOGRAPH
+ 0xB251: 0x7776, //CJK UNIFIED IDEOGRAPH
+ 0xB252: 0x7777, //CJK UNIFIED IDEOGRAPH
+ 0xB253: 0x7778, //CJK UNIFIED IDEOGRAPH
+ 0xB254: 0x777A, //CJK UNIFIED IDEOGRAPH
+ 0xB255: 0x777B, //CJK UNIFIED IDEOGRAPH
+ 0xB256: 0x777C, //CJK UNIFIED IDEOGRAPH
+ 0xB257: 0x7781, //CJK UNIFIED IDEOGRAPH
+ 0xB258: 0x7782, //CJK UNIFIED IDEOGRAPH
+ 0xB259: 0x7783, //CJK UNIFIED IDEOGRAPH
+ 0xB25A: 0x7786, //CJK UNIFIED IDEOGRAPH
+ 0xB25B: 0x7787, //CJK UNIFIED IDEOGRAPH
+ 0xB25C: 0x7788, //CJK UNIFIED IDEOGRAPH
+ 0xB25D: 0x7789, //CJK UNIFIED IDEOGRAPH
+ 0xB25E: 0x778A, //CJK UNIFIED IDEOGRAPH
+ 0xB25F: 0x778B, //CJK UNIFIED IDEOGRAPH
+ 0xB260: 0x778F, //CJK UNIFIED IDEOGRAPH
+ 0xB261: 0x7790, //CJK UNIFIED IDEOGRAPH
+ 0xB262: 0x7793, //CJK UNIFIED IDEOGRAPH
+ 0xB263: 0x7794, //CJK UNIFIED IDEOGRAPH
+ 0xB264: 0x7795, //CJK UNIFIED IDEOGRAPH
+ 0xB265: 0x7796, //CJK UNIFIED IDEOGRAPH
+ 0xB266: 0x7797, //CJK UNIFIED IDEOGRAPH
+ 0xB267: 0x7798, //CJK UNIFIED IDEOGRAPH
+ 0xB268: 0x7799, //CJK UNIFIED IDEOGRAPH
+ 0xB269: 0x779A, //CJK UNIFIED IDEOGRAPH
+ 0xB26A: 0x779B, //CJK UNIFIED IDEOGRAPH
+ 0xB26B: 0x779C, //CJK UNIFIED IDEOGRAPH
+ 0xB26C: 0x779D, //CJK UNIFIED IDEOGRAPH
+ 0xB26D: 0x779E, //CJK UNIFIED IDEOGRAPH
+ 0xB26E: 0x77A1, //CJK UNIFIED IDEOGRAPH
+ 0xB26F: 0x77A3, //CJK UNIFIED IDEOGRAPH
+ 0xB270: 0x77A4, //CJK UNIFIED IDEOGRAPH
+ 0xB271: 0x77A6, //CJK UNIFIED IDEOGRAPH
+ 0xB272: 0x77A8, //CJK UNIFIED IDEOGRAPH
+ 0xB273: 0x77AB, //CJK UNIFIED IDEOGRAPH
+ 0xB274: 0x77AD, //CJK UNIFIED IDEOGRAPH
+ 0xB275: 0x77AE, //CJK UNIFIED IDEOGRAPH
+ 0xB276: 0x77AF, //CJK UNIFIED IDEOGRAPH
+ 0xB277: 0x77B1, //CJK UNIFIED IDEOGRAPH
+ 0xB278: 0x77B2, //CJK UNIFIED IDEOGRAPH
+ 0xB279: 0x77B4, //CJK UNIFIED IDEOGRAPH
+ 0xB27A: 0x77B6, //CJK UNIFIED IDEOGRAPH
+ 0xB27B: 0x77B7, //CJK UNIFIED IDEOGRAPH
+ 0xB27C: 0x77B8, //CJK UNIFIED IDEOGRAPH
+ 0xB27D: 0x77B9, //CJK UNIFIED IDEOGRAPH
+ 0xB27E: 0x77BA, //CJK UNIFIED IDEOGRAPH
+ 0xB280: 0x77BC, //CJK UNIFIED IDEOGRAPH
+ 0xB281: 0x77BE, //CJK UNIFIED IDEOGRAPH
+ 0xB282: 0x77C0, //CJK UNIFIED IDEOGRAPH
+ 0xB283: 0x77C1, //CJK UNIFIED IDEOGRAPH
+ 0xB284: 0x77C2, //CJK UNIFIED IDEOGRAPH
+ 0xB285: 0x77C3, //CJK UNIFIED IDEOGRAPH
+ 0xB286: 0x77C4, //CJK UNIFIED IDEOGRAPH
+ 0xB287: 0x77C5, //CJK UNIFIED IDEOGRAPH
+ 0xB288: 0x77C6, //CJK UNIFIED IDEOGRAPH
+ 0xB289: 0x77C7, //CJK UNIFIED IDEOGRAPH
+ 0xB28A: 0x77C8, //CJK UNIFIED IDEOGRAPH
+ 0xB28B: 0x77C9, //CJK UNIFIED IDEOGRAPH
+ 0xB28C: 0x77CA, //CJK UNIFIED IDEOGRAPH
+ 0xB28D: 0x77CB, //CJK UNIFIED IDEOGRAPH
+ 0xB28E: 0x77CC, //CJK UNIFIED IDEOGRAPH
+ 0xB28F: 0x77CE, //CJK UNIFIED IDEOGRAPH
+ 0xB290: 0x77CF, //CJK UNIFIED IDEOGRAPH
+ 0xB291: 0x77D0, //CJK UNIFIED IDEOGRAPH
+ 0xB292: 0x77D1, //CJK UNIFIED IDEOGRAPH
+ 0xB293: 0x77D2, //CJK UNIFIED IDEOGRAPH
+ 0xB294: 0x77D3, //CJK UNIFIED IDEOGRAPH
+ 0xB295: 0x77D4, //CJK UNIFIED IDEOGRAPH
+ 0xB296: 0x77D5, //CJK UNIFIED IDEOGRAPH
+ 0xB297: 0x77D6, //CJK UNIFIED IDEOGRAPH
+ 0xB298: 0x77D8, //CJK UNIFIED IDEOGRAPH
+ 0xB299: 0x77D9, //CJK UNIFIED IDEOGRAPH
+ 0xB29A: 0x77DA, //CJK UNIFIED IDEOGRAPH
+ 0xB29B: 0x77DD, //CJK UNIFIED IDEOGRAPH
+ 0xB29C: 0x77DE, //CJK UNIFIED IDEOGRAPH
+ 0xB29D: 0x77DF, //CJK UNIFIED IDEOGRAPH
+ 0xB29E: 0x77E0, //CJK UNIFIED IDEOGRAPH
+ 0xB29F: 0x77E1, //CJK UNIFIED IDEOGRAPH
+ 0xB2A0: 0x77E4, //CJK UNIFIED IDEOGRAPH
+ 0xB2A1: 0x75C5, //CJK UNIFIED IDEOGRAPH
+ 0xB2A2: 0x5E76, //CJK UNIFIED IDEOGRAPH
+ 0xB2A3: 0x73BB, //CJK UNIFIED IDEOGRAPH
+ 0xB2A4: 0x83E0, //CJK UNIFIED IDEOGRAPH
+ 0xB2A5: 0x64AD, //CJK UNIFIED IDEOGRAPH
+ 0xB2A6: 0x62E8, //CJK UNIFIED IDEOGRAPH
+ 0xB2A7: 0x94B5, //CJK UNIFIED IDEOGRAPH
+ 0xB2A8: 0x6CE2, //CJK UNIFIED IDEOGRAPH
+ 0xB2A9: 0x535A, //CJK UNIFIED IDEOGRAPH
+ 0xB2AA: 0x52C3, //CJK UNIFIED IDEOGRAPH
+ 0xB2AB: 0x640F, //CJK UNIFIED IDEOGRAPH
+ 0xB2AC: 0x94C2, //CJK UNIFIED IDEOGRAPH
+ 0xB2AD: 0x7B94, //CJK UNIFIED IDEOGRAPH
+ 0xB2AE: 0x4F2F, //CJK UNIFIED IDEOGRAPH
+ 0xB2AF: 0x5E1B, //CJK UNIFIED IDEOGRAPH
+ 0xB2B0: 0x8236, //CJK UNIFIED IDEOGRAPH
+ 0xB2B1: 0x8116, //CJK UNIFIED IDEOGRAPH
+ 0xB2B2: 0x818A, //CJK UNIFIED IDEOGRAPH
+ 0xB2B3: 0x6E24, //CJK UNIFIED IDEOGRAPH
+ 0xB2B4: 0x6CCA, //CJK UNIFIED IDEOGRAPH
+ 0xB2B5: 0x9A73, //CJK UNIFIED IDEOGRAPH
+ 0xB2B6: 0x6355, //CJK UNIFIED IDEOGRAPH
+ 0xB2B7: 0x535C, //CJK UNIFIED IDEOGRAPH
+ 0xB2B8: 0x54FA, //CJK UNIFIED IDEOGRAPH
+ 0xB2B9: 0x8865, //CJK UNIFIED IDEOGRAPH
+ 0xB2BA: 0x57E0, //CJK UNIFIED IDEOGRAPH
+ 0xB2BB: 0x4E0D, //CJK UNIFIED IDEOGRAPH
+ 0xB2BC: 0x5E03, //CJK UNIFIED IDEOGRAPH
+ 0xB2BD: 0x6B65, //CJK UNIFIED IDEOGRAPH
+ 0xB2BE: 0x7C3F, //CJK UNIFIED IDEOGRAPH
+ 0xB2BF: 0x90E8, //CJK UNIFIED IDEOGRAPH
+ 0xB2C0: 0x6016, //CJK UNIFIED IDEOGRAPH
+ 0xB2C1: 0x64E6, //CJK UNIFIED IDEOGRAPH
+ 0xB2C2: 0x731C, //CJK UNIFIED IDEOGRAPH
+ 0xB2C3: 0x88C1, //CJK UNIFIED IDEOGRAPH
+ 0xB2C4: 0x6750, //CJK UNIFIED IDEOGRAPH
+ 0xB2C5: 0x624D, //CJK UNIFIED IDEOGRAPH
+ 0xB2C6: 0x8D22, //CJK UNIFIED IDEOGRAPH
+ 0xB2C7: 0x776C, //CJK UNIFIED IDEOGRAPH
+ 0xB2C8: 0x8E29, //CJK UNIFIED IDEOGRAPH
+ 0xB2C9: 0x91C7, //CJK UNIFIED IDEOGRAPH
+ 0xB2CA: 0x5F69, //CJK UNIFIED IDEOGRAPH
+ 0xB2CB: 0x83DC, //CJK UNIFIED IDEOGRAPH
+ 0xB2CC: 0x8521, //CJK UNIFIED IDEOGRAPH
+ 0xB2CD: 0x9910, //CJK UNIFIED IDEOGRAPH
+ 0xB2CE: 0x53C2, //CJK UNIFIED IDEOGRAPH
+ 0xB2CF: 0x8695, //CJK UNIFIED IDEOGRAPH
+ 0xB2D0: 0x6B8B, //CJK UNIFIED IDEOGRAPH
+ 0xB2D1: 0x60ED, //CJK UNIFIED IDEOGRAPH
+ 0xB2D2: 0x60E8, //CJK UNIFIED IDEOGRAPH
+ 0xB2D3: 0x707F, //CJK UNIFIED IDEOGRAPH
+ 0xB2D4: 0x82CD, //CJK UNIFIED IDEOGRAPH
+ 0xB2D5: 0x8231, //CJK UNIFIED IDEOGRAPH
+ 0xB2D6: 0x4ED3, //CJK UNIFIED IDEOGRAPH
+ 0xB2D7: 0x6CA7, //CJK UNIFIED IDEOGRAPH
+ 0xB2D8: 0x85CF, //CJK UNIFIED IDEOGRAPH
+ 0xB2D9: 0x64CD, //CJK UNIFIED IDEOGRAPH
+ 0xB2DA: 0x7CD9, //CJK UNIFIED IDEOGRAPH
+ 0xB2DB: 0x69FD, //CJK UNIFIED IDEOGRAPH
+ 0xB2DC: 0x66F9, //CJK UNIFIED IDEOGRAPH
+ 0xB2DD: 0x8349, //CJK UNIFIED IDEOGRAPH
+ 0xB2DE: 0x5395, //CJK UNIFIED IDEOGRAPH
+ 0xB2DF: 0x7B56, //CJK UNIFIED IDEOGRAPH
+ 0xB2E0: 0x4FA7, //CJK UNIFIED IDEOGRAPH
+ 0xB2E1: 0x518C, //CJK UNIFIED IDEOGRAPH
+ 0xB2E2: 0x6D4B, //CJK UNIFIED IDEOGRAPH
+ 0xB2E3: 0x5C42, //CJK UNIFIED IDEOGRAPH
+ 0xB2E4: 0x8E6D, //CJK UNIFIED IDEOGRAPH
+ 0xB2E5: 0x63D2, //CJK UNIFIED IDEOGRAPH
+ 0xB2E6: 0x53C9, //CJK UNIFIED IDEOGRAPH
+ 0xB2E7: 0x832C, //CJK UNIFIED IDEOGRAPH
+ 0xB2E8: 0x8336, //CJK UNIFIED IDEOGRAPH
+ 0xB2E9: 0x67E5, //CJK UNIFIED IDEOGRAPH
+ 0xB2EA: 0x78B4, //CJK UNIFIED IDEOGRAPH
+ 0xB2EB: 0x643D, //CJK UNIFIED IDEOGRAPH
+ 0xB2EC: 0x5BDF, //CJK UNIFIED IDEOGRAPH
+ 0xB2ED: 0x5C94, //CJK UNIFIED IDEOGRAPH
+ 0xB2EE: 0x5DEE, //CJK UNIFIED IDEOGRAPH
+ 0xB2EF: 0x8BE7, //CJK UNIFIED IDEOGRAPH
+ 0xB2F0: 0x62C6, //CJK UNIFIED IDEOGRAPH
+ 0xB2F1: 0x67F4, //CJK UNIFIED IDEOGRAPH
+ 0xB2F2: 0x8C7A, //CJK UNIFIED IDEOGRAPH
+ 0xB2F3: 0x6400, //CJK UNIFIED IDEOGRAPH
+ 0xB2F4: 0x63BA, //CJK UNIFIED IDEOGRAPH
+ 0xB2F5: 0x8749, //CJK UNIFIED IDEOGRAPH
+ 0xB2F6: 0x998B, //CJK UNIFIED IDEOGRAPH
+ 0xB2F7: 0x8C17, //CJK UNIFIED IDEOGRAPH
+ 0xB2F8: 0x7F20, //CJK UNIFIED IDEOGRAPH
+ 0xB2F9: 0x94F2, //CJK UNIFIED IDEOGRAPH
+ 0xB2FA: 0x4EA7, //CJK UNIFIED IDEOGRAPH
+ 0xB2FB: 0x9610, //CJK UNIFIED IDEOGRAPH
+ 0xB2FC: 0x98A4, //CJK UNIFIED IDEOGRAPH
+ 0xB2FD: 0x660C, //CJK UNIFIED IDEOGRAPH
+ 0xB2FE: 0x7316, //CJK UNIFIED IDEOGRAPH
+ 0xB340: 0x77E6, //CJK UNIFIED IDEOGRAPH
+ 0xB341: 0x77E8, //CJK UNIFIED IDEOGRAPH
+ 0xB342: 0x77EA, //CJK UNIFIED IDEOGRAPH
+ 0xB343: 0x77EF, //CJK UNIFIED IDEOGRAPH
+ 0xB344: 0x77F0, //CJK UNIFIED IDEOGRAPH
+ 0xB345: 0x77F1, //CJK UNIFIED IDEOGRAPH
+ 0xB346: 0x77F2, //CJK UNIFIED IDEOGRAPH
+ 0xB347: 0x77F4, //CJK UNIFIED IDEOGRAPH
+ 0xB348: 0x77F5, //CJK UNIFIED IDEOGRAPH
+ 0xB349: 0x77F7, //CJK UNIFIED IDEOGRAPH
+ 0xB34A: 0x77F9, //CJK UNIFIED IDEOGRAPH
+ 0xB34B: 0x77FA, //CJK UNIFIED IDEOGRAPH
+ 0xB34C: 0x77FB, //CJK UNIFIED IDEOGRAPH
+ 0xB34D: 0x77FC, //CJK UNIFIED IDEOGRAPH
+ 0xB34E: 0x7803, //CJK UNIFIED IDEOGRAPH
+ 0xB34F: 0x7804, //CJK UNIFIED IDEOGRAPH
+ 0xB350: 0x7805, //CJK UNIFIED IDEOGRAPH
+ 0xB351: 0x7806, //CJK UNIFIED IDEOGRAPH
+ 0xB352: 0x7807, //CJK UNIFIED IDEOGRAPH
+ 0xB353: 0x7808, //CJK UNIFIED IDEOGRAPH
+ 0xB354: 0x780A, //CJK UNIFIED IDEOGRAPH
+ 0xB355: 0x780B, //CJK UNIFIED IDEOGRAPH
+ 0xB356: 0x780E, //CJK UNIFIED IDEOGRAPH
+ 0xB357: 0x780F, //CJK UNIFIED IDEOGRAPH
+ 0xB358: 0x7810, //CJK UNIFIED IDEOGRAPH
+ 0xB359: 0x7813, //CJK UNIFIED IDEOGRAPH
+ 0xB35A: 0x7815, //CJK UNIFIED IDEOGRAPH
+ 0xB35B: 0x7819, //CJK UNIFIED IDEOGRAPH
+ 0xB35C: 0x781B, //CJK UNIFIED IDEOGRAPH
+ 0xB35D: 0x781E, //CJK UNIFIED IDEOGRAPH
+ 0xB35E: 0x7820, //CJK UNIFIED IDEOGRAPH
+ 0xB35F: 0x7821, //CJK UNIFIED IDEOGRAPH
+ 0xB360: 0x7822, //CJK UNIFIED IDEOGRAPH
+ 0xB361: 0x7824, //CJK UNIFIED IDEOGRAPH
+ 0xB362: 0x7828, //CJK UNIFIED IDEOGRAPH
+ 0xB363: 0x782A, //CJK UNIFIED IDEOGRAPH
+ 0xB364: 0x782B, //CJK UNIFIED IDEOGRAPH
+ 0xB365: 0x782E, //CJK UNIFIED IDEOGRAPH
+ 0xB366: 0x782F, //CJK UNIFIED IDEOGRAPH
+ 0xB367: 0x7831, //CJK UNIFIED IDEOGRAPH
+ 0xB368: 0x7832, //CJK UNIFIED IDEOGRAPH
+ 0xB369: 0x7833, //CJK UNIFIED IDEOGRAPH
+ 0xB36A: 0x7835, //CJK UNIFIED IDEOGRAPH
+ 0xB36B: 0x7836, //CJK UNIFIED IDEOGRAPH
+ 0xB36C: 0x783D, //CJK UNIFIED IDEOGRAPH
+ 0xB36D: 0x783F, //CJK UNIFIED IDEOGRAPH
+ 0xB36E: 0x7841, //CJK UNIFIED IDEOGRAPH
+ 0xB36F: 0x7842, //CJK UNIFIED IDEOGRAPH
+ 0xB370: 0x7843, //CJK UNIFIED IDEOGRAPH
+ 0xB371: 0x7844, //CJK UNIFIED IDEOGRAPH
+ 0xB372: 0x7846, //CJK UNIFIED IDEOGRAPH
+ 0xB373: 0x7848, //CJK UNIFIED IDEOGRAPH
+ 0xB374: 0x7849, //CJK UNIFIED IDEOGRAPH
+ 0xB375: 0x784A, //CJK UNIFIED IDEOGRAPH
+ 0xB376: 0x784B, //CJK UNIFIED IDEOGRAPH
+ 0xB377: 0x784D, //CJK UNIFIED IDEOGRAPH
+ 0xB378: 0x784F, //CJK UNIFIED IDEOGRAPH
+ 0xB379: 0x7851, //CJK UNIFIED IDEOGRAPH
+ 0xB37A: 0x7853, //CJK UNIFIED IDEOGRAPH
+ 0xB37B: 0x7854, //CJK UNIFIED IDEOGRAPH
+ 0xB37C: 0x7858, //CJK UNIFIED IDEOGRAPH
+ 0xB37D: 0x7859, //CJK UNIFIED IDEOGRAPH
+ 0xB37E: 0x785A, //CJK UNIFIED IDEOGRAPH
+ 0xB380: 0x785B, //CJK UNIFIED IDEOGRAPH
+ 0xB381: 0x785C, //CJK UNIFIED IDEOGRAPH
+ 0xB382: 0x785E, //CJK UNIFIED IDEOGRAPH
+ 0xB383: 0x785F, //CJK UNIFIED IDEOGRAPH
+ 0xB384: 0x7860, //CJK UNIFIED IDEOGRAPH
+ 0xB385: 0x7861, //CJK UNIFIED IDEOGRAPH
+ 0xB386: 0x7862, //CJK UNIFIED IDEOGRAPH
+ 0xB387: 0x7863, //CJK UNIFIED IDEOGRAPH
+ 0xB388: 0x7864, //CJK UNIFIED IDEOGRAPH
+ 0xB389: 0x7865, //CJK UNIFIED IDEOGRAPH
+ 0xB38A: 0x7866, //CJK UNIFIED IDEOGRAPH
+ 0xB38B: 0x7867, //CJK UNIFIED IDEOGRAPH
+ 0xB38C: 0x7868, //CJK UNIFIED IDEOGRAPH
+ 0xB38D: 0x7869, //CJK UNIFIED IDEOGRAPH
+ 0xB38E: 0x786F, //CJK UNIFIED IDEOGRAPH
+ 0xB38F: 0x7870, //CJK UNIFIED IDEOGRAPH
+ 0xB390: 0x7871, //CJK UNIFIED IDEOGRAPH
+ 0xB391: 0x7872, //CJK UNIFIED IDEOGRAPH
+ 0xB392: 0x7873, //CJK UNIFIED IDEOGRAPH
+ 0xB393: 0x7874, //CJK UNIFIED IDEOGRAPH
+ 0xB394: 0x7875, //CJK UNIFIED IDEOGRAPH
+ 0xB395: 0x7876, //CJK UNIFIED IDEOGRAPH
+ 0xB396: 0x7878, //CJK UNIFIED IDEOGRAPH
+ 0xB397: 0x7879, //CJK UNIFIED IDEOGRAPH
+ 0xB398: 0x787A, //CJK UNIFIED IDEOGRAPH
+ 0xB399: 0x787B, //CJK UNIFIED IDEOGRAPH
+ 0xB39A: 0x787D, //CJK UNIFIED IDEOGRAPH
+ 0xB39B: 0x787E, //CJK UNIFIED IDEOGRAPH
+ 0xB39C: 0x787F, //CJK UNIFIED IDEOGRAPH
+ 0xB39D: 0x7880, //CJK UNIFIED IDEOGRAPH
+ 0xB39E: 0x7881, //CJK UNIFIED IDEOGRAPH
+ 0xB39F: 0x7882, //CJK UNIFIED IDEOGRAPH
+ 0xB3A0: 0x7883, //CJK UNIFIED IDEOGRAPH
+ 0xB3A1: 0x573A, //CJK UNIFIED IDEOGRAPH
+ 0xB3A2: 0x5C1D, //CJK UNIFIED IDEOGRAPH
+ 0xB3A3: 0x5E38, //CJK UNIFIED IDEOGRAPH
+ 0xB3A4: 0x957F, //CJK UNIFIED IDEOGRAPH
+ 0xB3A5: 0x507F, //CJK UNIFIED IDEOGRAPH
+ 0xB3A6: 0x80A0, //CJK UNIFIED IDEOGRAPH
+ 0xB3A7: 0x5382, //CJK UNIFIED IDEOGRAPH
+ 0xB3A8: 0x655E, //CJK UNIFIED IDEOGRAPH
+ 0xB3A9: 0x7545, //CJK UNIFIED IDEOGRAPH
+ 0xB3AA: 0x5531, //CJK UNIFIED IDEOGRAPH
+ 0xB3AB: 0x5021, //CJK UNIFIED IDEOGRAPH
+ 0xB3AC: 0x8D85, //CJK UNIFIED IDEOGRAPH
+ 0xB3AD: 0x6284, //CJK UNIFIED IDEOGRAPH
+ 0xB3AE: 0x949E, //CJK UNIFIED IDEOGRAPH
+ 0xB3AF: 0x671D, //CJK UNIFIED IDEOGRAPH
+ 0xB3B0: 0x5632, //CJK UNIFIED IDEOGRAPH
+ 0xB3B1: 0x6F6E, //CJK UNIFIED IDEOGRAPH
+ 0xB3B2: 0x5DE2, //CJK UNIFIED IDEOGRAPH
+ 0xB3B3: 0x5435, //CJK UNIFIED IDEOGRAPH
+ 0xB3B4: 0x7092, //CJK UNIFIED IDEOGRAPH
+ 0xB3B5: 0x8F66, //CJK UNIFIED IDEOGRAPH
+ 0xB3B6: 0x626F, //CJK UNIFIED IDEOGRAPH
+ 0xB3B7: 0x64A4, //CJK UNIFIED IDEOGRAPH
+ 0xB3B8: 0x63A3, //CJK UNIFIED IDEOGRAPH
+ 0xB3B9: 0x5F7B, //CJK UNIFIED IDEOGRAPH
+ 0xB3BA: 0x6F88, //CJK UNIFIED IDEOGRAPH
+ 0xB3BB: 0x90F4, //CJK UNIFIED IDEOGRAPH
+ 0xB3BC: 0x81E3, //CJK UNIFIED IDEOGRAPH
+ 0xB3BD: 0x8FB0, //CJK UNIFIED IDEOGRAPH
+ 0xB3BE: 0x5C18, //CJK UNIFIED IDEOGRAPH
+ 0xB3BF: 0x6668, //CJK UNIFIED IDEOGRAPH
+ 0xB3C0: 0x5FF1, //CJK UNIFIED IDEOGRAPH
+ 0xB3C1: 0x6C89, //CJK UNIFIED IDEOGRAPH
+ 0xB3C2: 0x9648, //CJK UNIFIED IDEOGRAPH
+ 0xB3C3: 0x8D81, //CJK UNIFIED IDEOGRAPH
+ 0xB3C4: 0x886C, //CJK UNIFIED IDEOGRAPH
+ 0xB3C5: 0x6491, //CJK UNIFIED IDEOGRAPH
+ 0xB3C6: 0x79F0, //CJK UNIFIED IDEOGRAPH
+ 0xB3C7: 0x57CE, //CJK UNIFIED IDEOGRAPH
+ 0xB3C8: 0x6A59, //CJK UNIFIED IDEOGRAPH
+ 0xB3C9: 0x6210, //CJK UNIFIED IDEOGRAPH
+ 0xB3CA: 0x5448, //CJK UNIFIED IDEOGRAPH
+ 0xB3CB: 0x4E58, //CJK UNIFIED IDEOGRAPH
+ 0xB3CC: 0x7A0B, //CJK UNIFIED IDEOGRAPH
+ 0xB3CD: 0x60E9, //CJK UNIFIED IDEOGRAPH
+ 0xB3CE: 0x6F84, //CJK UNIFIED IDEOGRAPH
+ 0xB3CF: 0x8BDA, //CJK UNIFIED IDEOGRAPH
+ 0xB3D0: 0x627F, //CJK UNIFIED IDEOGRAPH
+ 0xB3D1: 0x901E, //CJK UNIFIED IDEOGRAPH
+ 0xB3D2: 0x9A8B, //CJK UNIFIED IDEOGRAPH
+ 0xB3D3: 0x79E4, //CJK UNIFIED IDEOGRAPH
+ 0xB3D4: 0x5403, //CJK UNIFIED IDEOGRAPH
+ 0xB3D5: 0x75F4, //CJK UNIFIED IDEOGRAPH
+ 0xB3D6: 0x6301, //CJK UNIFIED IDEOGRAPH
+ 0xB3D7: 0x5319, //CJK UNIFIED IDEOGRAPH
+ 0xB3D8: 0x6C60, //CJK UNIFIED IDEOGRAPH
+ 0xB3D9: 0x8FDF, //CJK UNIFIED IDEOGRAPH
+ 0xB3DA: 0x5F1B, //CJK UNIFIED IDEOGRAPH
+ 0xB3DB: 0x9A70, //CJK UNIFIED IDEOGRAPH
+ 0xB3DC: 0x803B, //CJK UNIFIED IDEOGRAPH
+ 0xB3DD: 0x9F7F, //CJK UNIFIED IDEOGRAPH
+ 0xB3DE: 0x4F88, //CJK UNIFIED IDEOGRAPH
+ 0xB3DF: 0x5C3A, //CJK UNIFIED IDEOGRAPH
+ 0xB3E0: 0x8D64, //CJK UNIFIED IDEOGRAPH
+ 0xB3E1: 0x7FC5, //CJK UNIFIED IDEOGRAPH
+ 0xB3E2: 0x65A5, //CJK UNIFIED IDEOGRAPH
+ 0xB3E3: 0x70BD, //CJK UNIFIED IDEOGRAPH
+ 0xB3E4: 0x5145, //CJK UNIFIED IDEOGRAPH
+ 0xB3E5: 0x51B2, //CJK UNIFIED IDEOGRAPH
+ 0xB3E6: 0x866B, //CJK UNIFIED IDEOGRAPH
+ 0xB3E7: 0x5D07, //CJK UNIFIED IDEOGRAPH
+ 0xB3E8: 0x5BA0, //CJK UNIFIED IDEOGRAPH
+ 0xB3E9: 0x62BD, //CJK UNIFIED IDEOGRAPH
+ 0xB3EA: 0x916C, //CJK UNIFIED IDEOGRAPH
+ 0xB3EB: 0x7574, //CJK UNIFIED IDEOGRAPH
+ 0xB3EC: 0x8E0C, //CJK UNIFIED IDEOGRAPH
+ 0xB3ED: 0x7A20, //CJK UNIFIED IDEOGRAPH
+ 0xB3EE: 0x6101, //CJK UNIFIED IDEOGRAPH
+ 0xB3EF: 0x7B79, //CJK UNIFIED IDEOGRAPH
+ 0xB3F0: 0x4EC7, //CJK UNIFIED IDEOGRAPH
+ 0xB3F1: 0x7EF8, //CJK UNIFIED IDEOGRAPH
+ 0xB3F2: 0x7785, //CJK UNIFIED IDEOGRAPH
+ 0xB3F3: 0x4E11, //CJK UNIFIED IDEOGRAPH
+ 0xB3F4: 0x81ED, //CJK UNIFIED IDEOGRAPH
+ 0xB3F5: 0x521D, //CJK UNIFIED IDEOGRAPH
+ 0xB3F6: 0x51FA, //CJK UNIFIED IDEOGRAPH
+ 0xB3F7: 0x6A71, //CJK UNIFIED IDEOGRAPH
+ 0xB3F8: 0x53A8, //CJK UNIFIED IDEOGRAPH
+ 0xB3F9: 0x8E87, //CJK UNIFIED IDEOGRAPH
+ 0xB3FA: 0x9504, //CJK UNIFIED IDEOGRAPH
+ 0xB3FB: 0x96CF, //CJK UNIFIED IDEOGRAPH
+ 0xB3FC: 0x6EC1, //CJK UNIFIED IDEOGRAPH
+ 0xB3FD: 0x9664, //CJK UNIFIED IDEOGRAPH
+ 0xB3FE: 0x695A, //CJK UNIFIED IDEOGRAPH
+ 0xB440: 0x7884, //CJK UNIFIED IDEOGRAPH
+ 0xB441: 0x7885, //CJK UNIFIED IDEOGRAPH
+ 0xB442: 0x7886, //CJK UNIFIED IDEOGRAPH
+ 0xB443: 0x7888, //CJK UNIFIED IDEOGRAPH
+ 0xB444: 0x788A, //CJK UNIFIED IDEOGRAPH
+ 0xB445: 0x788B, //CJK UNIFIED IDEOGRAPH
+ 0xB446: 0x788F, //CJK UNIFIED IDEOGRAPH
+ 0xB447: 0x7890, //CJK UNIFIED IDEOGRAPH
+ 0xB448: 0x7892, //CJK UNIFIED IDEOGRAPH
+ 0xB449: 0x7894, //CJK UNIFIED IDEOGRAPH
+ 0xB44A: 0x7895, //CJK UNIFIED IDEOGRAPH
+ 0xB44B: 0x7896, //CJK UNIFIED IDEOGRAPH
+ 0xB44C: 0x7899, //CJK UNIFIED IDEOGRAPH
+ 0xB44D: 0x789D, //CJK UNIFIED IDEOGRAPH
+ 0xB44E: 0x789E, //CJK UNIFIED IDEOGRAPH
+ 0xB44F: 0x78A0, //CJK UNIFIED IDEOGRAPH
+ 0xB450: 0x78A2, //CJK UNIFIED IDEOGRAPH
+ 0xB451: 0x78A4, //CJK UNIFIED IDEOGRAPH
+ 0xB452: 0x78A6, //CJK UNIFIED IDEOGRAPH
+ 0xB453: 0x78A8, //CJK UNIFIED IDEOGRAPH
+ 0xB454: 0x78A9, //CJK UNIFIED IDEOGRAPH
+ 0xB455: 0x78AA, //CJK UNIFIED IDEOGRAPH
+ 0xB456: 0x78AB, //CJK UNIFIED IDEOGRAPH
+ 0xB457: 0x78AC, //CJK UNIFIED IDEOGRAPH
+ 0xB458: 0x78AD, //CJK UNIFIED IDEOGRAPH
+ 0xB459: 0x78AE, //CJK UNIFIED IDEOGRAPH
+ 0xB45A: 0x78AF, //CJK UNIFIED IDEOGRAPH
+ 0xB45B: 0x78B5, //CJK UNIFIED IDEOGRAPH
+ 0xB45C: 0x78B6, //CJK UNIFIED IDEOGRAPH
+ 0xB45D: 0x78B7, //CJK UNIFIED IDEOGRAPH
+ 0xB45E: 0x78B8, //CJK UNIFIED IDEOGRAPH
+ 0xB45F: 0x78BA, //CJK UNIFIED IDEOGRAPH
+ 0xB460: 0x78BB, //CJK UNIFIED IDEOGRAPH
+ 0xB461: 0x78BC, //CJK UNIFIED IDEOGRAPH
+ 0xB462: 0x78BD, //CJK UNIFIED IDEOGRAPH
+ 0xB463: 0x78BF, //CJK UNIFIED IDEOGRAPH
+ 0xB464: 0x78C0, //CJK UNIFIED IDEOGRAPH
+ 0xB465: 0x78C2, //CJK UNIFIED IDEOGRAPH
+ 0xB466: 0x78C3, //CJK UNIFIED IDEOGRAPH
+ 0xB467: 0x78C4, //CJK UNIFIED IDEOGRAPH
+ 0xB468: 0x78C6, //CJK UNIFIED IDEOGRAPH
+ 0xB469: 0x78C7, //CJK UNIFIED IDEOGRAPH
+ 0xB46A: 0x78C8, //CJK UNIFIED IDEOGRAPH
+ 0xB46B: 0x78CC, //CJK UNIFIED IDEOGRAPH
+ 0xB46C: 0x78CD, //CJK UNIFIED IDEOGRAPH
+ 0xB46D: 0x78CE, //CJK UNIFIED IDEOGRAPH
+ 0xB46E: 0x78CF, //CJK UNIFIED IDEOGRAPH
+ 0xB46F: 0x78D1, //CJK UNIFIED IDEOGRAPH
+ 0xB470: 0x78D2, //CJK UNIFIED IDEOGRAPH
+ 0xB471: 0x78D3, //CJK UNIFIED IDEOGRAPH
+ 0xB472: 0x78D6, //CJK UNIFIED IDEOGRAPH
+ 0xB473: 0x78D7, //CJK UNIFIED IDEOGRAPH
+ 0xB474: 0x78D8, //CJK UNIFIED IDEOGRAPH
+ 0xB475: 0x78DA, //CJK UNIFIED IDEOGRAPH
+ 0xB476: 0x78DB, //CJK UNIFIED IDEOGRAPH
+ 0xB477: 0x78DC, //CJK UNIFIED IDEOGRAPH
+ 0xB478: 0x78DD, //CJK UNIFIED IDEOGRAPH
+ 0xB479: 0x78DE, //CJK UNIFIED IDEOGRAPH
+ 0xB47A: 0x78DF, //CJK UNIFIED IDEOGRAPH
+ 0xB47B: 0x78E0, //CJK UNIFIED IDEOGRAPH
+ 0xB47C: 0x78E1, //CJK UNIFIED IDEOGRAPH
+ 0xB47D: 0x78E2, //CJK UNIFIED IDEOGRAPH
+ 0xB47E: 0x78E3, //CJK UNIFIED IDEOGRAPH
+ 0xB480: 0x78E4, //CJK UNIFIED IDEOGRAPH
+ 0xB481: 0x78E5, //CJK UNIFIED IDEOGRAPH
+ 0xB482: 0x78E6, //CJK UNIFIED IDEOGRAPH
+ 0xB483: 0x78E7, //CJK UNIFIED IDEOGRAPH
+ 0xB484: 0x78E9, //CJK UNIFIED IDEOGRAPH
+ 0xB485: 0x78EA, //CJK UNIFIED IDEOGRAPH
+ 0xB486: 0x78EB, //CJK UNIFIED IDEOGRAPH
+ 0xB487: 0x78ED, //CJK UNIFIED IDEOGRAPH
+ 0xB488: 0x78EE, //CJK UNIFIED IDEOGRAPH
+ 0xB489: 0x78EF, //CJK UNIFIED IDEOGRAPH
+ 0xB48A: 0x78F0, //CJK UNIFIED IDEOGRAPH
+ 0xB48B: 0x78F1, //CJK UNIFIED IDEOGRAPH
+ 0xB48C: 0x78F3, //CJK UNIFIED IDEOGRAPH
+ 0xB48D: 0x78F5, //CJK UNIFIED IDEOGRAPH
+ 0xB48E: 0x78F6, //CJK UNIFIED IDEOGRAPH
+ 0xB48F: 0x78F8, //CJK UNIFIED IDEOGRAPH
+ 0xB490: 0x78F9, //CJK UNIFIED IDEOGRAPH
+ 0xB491: 0x78FB, //CJK UNIFIED IDEOGRAPH
+ 0xB492: 0x78FC, //CJK UNIFIED IDEOGRAPH
+ 0xB493: 0x78FD, //CJK UNIFIED IDEOGRAPH
+ 0xB494: 0x78FE, //CJK UNIFIED IDEOGRAPH
+ 0xB495: 0x78FF, //CJK UNIFIED IDEOGRAPH
+ 0xB496: 0x7900, //CJK UNIFIED IDEOGRAPH
+ 0xB497: 0x7902, //CJK UNIFIED IDEOGRAPH
+ 0xB498: 0x7903, //CJK UNIFIED IDEOGRAPH
+ 0xB499: 0x7904, //CJK UNIFIED IDEOGRAPH
+ 0xB49A: 0x7906, //CJK UNIFIED IDEOGRAPH
+ 0xB49B: 0x7907, //CJK UNIFIED IDEOGRAPH
+ 0xB49C: 0x7908, //CJK UNIFIED IDEOGRAPH
+ 0xB49D: 0x7909, //CJK UNIFIED IDEOGRAPH
+ 0xB49E: 0x790A, //CJK UNIFIED IDEOGRAPH
+ 0xB49F: 0x790B, //CJK UNIFIED IDEOGRAPH
+ 0xB4A0: 0x790C, //CJK UNIFIED IDEOGRAPH
+ 0xB4A1: 0x7840, //CJK UNIFIED IDEOGRAPH
+ 0xB4A2: 0x50A8, //CJK UNIFIED IDEOGRAPH
+ 0xB4A3: 0x77D7, //CJK UNIFIED IDEOGRAPH
+ 0xB4A4: 0x6410, //CJK UNIFIED IDEOGRAPH
+ 0xB4A5: 0x89E6, //CJK UNIFIED IDEOGRAPH
+ 0xB4A6: 0x5904, //CJK UNIFIED IDEOGRAPH
+ 0xB4A7: 0x63E3, //CJK UNIFIED IDEOGRAPH
+ 0xB4A8: 0x5DDD, //CJK UNIFIED IDEOGRAPH
+ 0xB4A9: 0x7A7F, //CJK UNIFIED IDEOGRAPH
+ 0xB4AA: 0x693D, //CJK UNIFIED IDEOGRAPH
+ 0xB4AB: 0x4F20, //CJK UNIFIED IDEOGRAPH
+ 0xB4AC: 0x8239, //CJK UNIFIED IDEOGRAPH
+ 0xB4AD: 0x5598, //CJK UNIFIED IDEOGRAPH
+ 0xB4AE: 0x4E32, //CJK UNIFIED IDEOGRAPH
+ 0xB4AF: 0x75AE, //CJK UNIFIED IDEOGRAPH
+ 0xB4B0: 0x7A97, //CJK UNIFIED IDEOGRAPH
+ 0xB4B1: 0x5E62, //CJK UNIFIED IDEOGRAPH
+ 0xB4B2: 0x5E8A, //CJK UNIFIED IDEOGRAPH
+ 0xB4B3: 0x95EF, //CJK UNIFIED IDEOGRAPH
+ 0xB4B4: 0x521B, //CJK UNIFIED IDEOGRAPH
+ 0xB4B5: 0x5439, //CJK UNIFIED IDEOGRAPH
+ 0xB4B6: 0x708A, //CJK UNIFIED IDEOGRAPH
+ 0xB4B7: 0x6376, //CJK UNIFIED IDEOGRAPH
+ 0xB4B8: 0x9524, //CJK UNIFIED IDEOGRAPH
+ 0xB4B9: 0x5782, //CJK UNIFIED IDEOGRAPH
+ 0xB4BA: 0x6625, //CJK UNIFIED IDEOGRAPH
+ 0xB4BB: 0x693F, //CJK UNIFIED IDEOGRAPH
+ 0xB4BC: 0x9187, //CJK UNIFIED IDEOGRAPH
+ 0xB4BD: 0x5507, //CJK UNIFIED IDEOGRAPH
+ 0xB4BE: 0x6DF3, //CJK UNIFIED IDEOGRAPH
+ 0xB4BF: 0x7EAF, //CJK UNIFIED IDEOGRAPH
+ 0xB4C0: 0x8822, //CJK UNIFIED IDEOGRAPH
+ 0xB4C1: 0x6233, //CJK UNIFIED IDEOGRAPH
+ 0xB4C2: 0x7EF0, //CJK UNIFIED IDEOGRAPH
+ 0xB4C3: 0x75B5, //CJK UNIFIED IDEOGRAPH
+ 0xB4C4: 0x8328, //CJK UNIFIED IDEOGRAPH
+ 0xB4C5: 0x78C1, //CJK UNIFIED IDEOGRAPH
+ 0xB4C6: 0x96CC, //CJK UNIFIED IDEOGRAPH
+ 0xB4C7: 0x8F9E, //CJK UNIFIED IDEOGRAPH
+ 0xB4C8: 0x6148, //CJK UNIFIED IDEOGRAPH
+ 0xB4C9: 0x74F7, //CJK UNIFIED IDEOGRAPH
+ 0xB4CA: 0x8BCD, //CJK UNIFIED IDEOGRAPH
+ 0xB4CB: 0x6B64, //CJK UNIFIED IDEOGRAPH
+ 0xB4CC: 0x523A, //CJK UNIFIED IDEOGRAPH
+ 0xB4CD: 0x8D50, //CJK UNIFIED IDEOGRAPH
+ 0xB4CE: 0x6B21, //CJK UNIFIED IDEOGRAPH
+ 0xB4CF: 0x806A, //CJK UNIFIED IDEOGRAPH
+ 0xB4D0: 0x8471, //CJK UNIFIED IDEOGRAPH
+ 0xB4D1: 0x56F1, //CJK UNIFIED IDEOGRAPH
+ 0xB4D2: 0x5306, //CJK UNIFIED IDEOGRAPH
+ 0xB4D3: 0x4ECE, //CJK UNIFIED IDEOGRAPH
+ 0xB4D4: 0x4E1B, //CJK UNIFIED IDEOGRAPH
+ 0xB4D5: 0x51D1, //CJK UNIFIED IDEOGRAPH
+ 0xB4D6: 0x7C97, //CJK UNIFIED IDEOGRAPH
+ 0xB4D7: 0x918B, //CJK UNIFIED IDEOGRAPH
+ 0xB4D8: 0x7C07, //CJK UNIFIED IDEOGRAPH
+ 0xB4D9: 0x4FC3, //CJK UNIFIED IDEOGRAPH
+ 0xB4DA: 0x8E7F, //CJK UNIFIED IDEOGRAPH
+ 0xB4DB: 0x7BE1, //CJK UNIFIED IDEOGRAPH
+ 0xB4DC: 0x7A9C, //CJK UNIFIED IDEOGRAPH
+ 0xB4DD: 0x6467, //CJK UNIFIED IDEOGRAPH
+ 0xB4DE: 0x5D14, //CJK UNIFIED IDEOGRAPH
+ 0xB4DF: 0x50AC, //CJK UNIFIED IDEOGRAPH
+ 0xB4E0: 0x8106, //CJK UNIFIED IDEOGRAPH
+ 0xB4E1: 0x7601, //CJK UNIFIED IDEOGRAPH
+ 0xB4E2: 0x7CB9, //CJK UNIFIED IDEOGRAPH
+ 0xB4E3: 0x6DEC, //CJK UNIFIED IDEOGRAPH
+ 0xB4E4: 0x7FE0, //CJK UNIFIED IDEOGRAPH
+ 0xB4E5: 0x6751, //CJK UNIFIED IDEOGRAPH
+ 0xB4E6: 0x5B58, //CJK UNIFIED IDEOGRAPH
+ 0xB4E7: 0x5BF8, //CJK UNIFIED IDEOGRAPH
+ 0xB4E8: 0x78CB, //CJK UNIFIED IDEOGRAPH
+ 0xB4E9: 0x64AE, //CJK UNIFIED IDEOGRAPH
+ 0xB4EA: 0x6413, //CJK UNIFIED IDEOGRAPH
+ 0xB4EB: 0x63AA, //CJK UNIFIED IDEOGRAPH
+ 0xB4EC: 0x632B, //CJK UNIFIED IDEOGRAPH
+ 0xB4ED: 0x9519, //CJK UNIFIED IDEOGRAPH
+ 0xB4EE: 0x642D, //CJK UNIFIED IDEOGRAPH
+ 0xB4EF: 0x8FBE, //CJK UNIFIED IDEOGRAPH
+ 0xB4F0: 0x7B54, //CJK UNIFIED IDEOGRAPH
+ 0xB4F1: 0x7629, //CJK UNIFIED IDEOGRAPH
+ 0xB4F2: 0x6253, //CJK UNIFIED IDEOGRAPH
+ 0xB4F3: 0x5927, //CJK UNIFIED IDEOGRAPH
+ 0xB4F4: 0x5446, //CJK UNIFIED IDEOGRAPH
+ 0xB4F5: 0x6B79, //CJK UNIFIED IDEOGRAPH
+ 0xB4F6: 0x50A3, //CJK UNIFIED IDEOGRAPH
+ 0xB4F7: 0x6234, //CJK UNIFIED IDEOGRAPH
+ 0xB4F8: 0x5E26, //CJK UNIFIED IDEOGRAPH
+ 0xB4F9: 0x6B86, //CJK UNIFIED IDEOGRAPH
+ 0xB4FA: 0x4EE3, //CJK UNIFIED IDEOGRAPH
+ 0xB4FB: 0x8D37, //CJK UNIFIED IDEOGRAPH
+ 0xB4FC: 0x888B, //CJK UNIFIED IDEOGRAPH
+ 0xB4FD: 0x5F85, //CJK UNIFIED IDEOGRAPH
+ 0xB4FE: 0x902E, //CJK UNIFIED IDEOGRAPH
+ 0xB540: 0x790D, //CJK UNIFIED IDEOGRAPH
+ 0xB541: 0x790E, //CJK UNIFIED IDEOGRAPH
+ 0xB542: 0x790F, //CJK UNIFIED IDEOGRAPH
+ 0xB543: 0x7910, //CJK UNIFIED IDEOGRAPH
+ 0xB544: 0x7911, //CJK UNIFIED IDEOGRAPH
+ 0xB545: 0x7912, //CJK UNIFIED IDEOGRAPH
+ 0xB546: 0x7914, //CJK UNIFIED IDEOGRAPH
+ 0xB547: 0x7915, //CJK UNIFIED IDEOGRAPH
+ 0xB548: 0x7916, //CJK UNIFIED IDEOGRAPH
+ 0xB549: 0x7917, //CJK UNIFIED IDEOGRAPH
+ 0xB54A: 0x7918, //CJK UNIFIED IDEOGRAPH
+ 0xB54B: 0x7919, //CJK UNIFIED IDEOGRAPH
+ 0xB54C: 0x791A, //CJK UNIFIED IDEOGRAPH
+ 0xB54D: 0x791B, //CJK UNIFIED IDEOGRAPH
+ 0xB54E: 0x791C, //CJK UNIFIED IDEOGRAPH
+ 0xB54F: 0x791D, //CJK UNIFIED IDEOGRAPH
+ 0xB550: 0x791F, //CJK UNIFIED IDEOGRAPH
+ 0xB551: 0x7920, //CJK UNIFIED IDEOGRAPH
+ 0xB552: 0x7921, //CJK UNIFIED IDEOGRAPH
+ 0xB553: 0x7922, //CJK UNIFIED IDEOGRAPH
+ 0xB554: 0x7923, //CJK UNIFIED IDEOGRAPH
+ 0xB555: 0x7925, //CJK UNIFIED IDEOGRAPH
+ 0xB556: 0x7926, //CJK UNIFIED IDEOGRAPH
+ 0xB557: 0x7927, //CJK UNIFIED IDEOGRAPH
+ 0xB558: 0x7928, //CJK UNIFIED IDEOGRAPH
+ 0xB559: 0x7929, //CJK UNIFIED IDEOGRAPH
+ 0xB55A: 0x792A, //CJK UNIFIED IDEOGRAPH
+ 0xB55B: 0x792B, //CJK UNIFIED IDEOGRAPH
+ 0xB55C: 0x792C, //CJK UNIFIED IDEOGRAPH
+ 0xB55D: 0x792D, //CJK UNIFIED IDEOGRAPH
+ 0xB55E: 0x792E, //CJK UNIFIED IDEOGRAPH
+ 0xB55F: 0x792F, //CJK UNIFIED IDEOGRAPH
+ 0xB560: 0x7930, //CJK UNIFIED IDEOGRAPH
+ 0xB561: 0x7931, //CJK UNIFIED IDEOGRAPH
+ 0xB562: 0x7932, //CJK UNIFIED IDEOGRAPH
+ 0xB563: 0x7933, //CJK UNIFIED IDEOGRAPH
+ 0xB564: 0x7935, //CJK UNIFIED IDEOGRAPH
+ 0xB565: 0x7936, //CJK UNIFIED IDEOGRAPH
+ 0xB566: 0x7937, //CJK UNIFIED IDEOGRAPH
+ 0xB567: 0x7938, //CJK UNIFIED IDEOGRAPH
+ 0xB568: 0x7939, //CJK UNIFIED IDEOGRAPH
+ 0xB569: 0x793D, //CJK UNIFIED IDEOGRAPH
+ 0xB56A: 0x793F, //CJK UNIFIED IDEOGRAPH
+ 0xB56B: 0x7942, //CJK UNIFIED IDEOGRAPH
+ 0xB56C: 0x7943, //CJK UNIFIED IDEOGRAPH
+ 0xB56D: 0x7944, //CJK UNIFIED IDEOGRAPH
+ 0xB56E: 0x7945, //CJK UNIFIED IDEOGRAPH
+ 0xB56F: 0x7947, //CJK UNIFIED IDEOGRAPH
+ 0xB570: 0x794A, //CJK UNIFIED IDEOGRAPH
+ 0xB571: 0x794B, //CJK UNIFIED IDEOGRAPH
+ 0xB572: 0x794C, //CJK UNIFIED IDEOGRAPH
+ 0xB573: 0x794D, //CJK UNIFIED IDEOGRAPH
+ 0xB574: 0x794E, //CJK UNIFIED IDEOGRAPH
+ 0xB575: 0x794F, //CJK UNIFIED IDEOGRAPH
+ 0xB576: 0x7950, //CJK UNIFIED IDEOGRAPH
+ 0xB577: 0x7951, //CJK UNIFIED IDEOGRAPH
+ 0xB578: 0x7952, //CJK UNIFIED IDEOGRAPH
+ 0xB579: 0x7954, //CJK UNIFIED IDEOGRAPH
+ 0xB57A: 0x7955, //CJK UNIFIED IDEOGRAPH
+ 0xB57B: 0x7958, //CJK UNIFIED IDEOGRAPH
+ 0xB57C: 0x7959, //CJK UNIFIED IDEOGRAPH
+ 0xB57D: 0x7961, //CJK UNIFIED IDEOGRAPH
+ 0xB57E: 0x7963, //CJK UNIFIED IDEOGRAPH
+ 0xB580: 0x7964, //CJK UNIFIED IDEOGRAPH
+ 0xB581: 0x7966, //CJK UNIFIED IDEOGRAPH
+ 0xB582: 0x7969, //CJK UNIFIED IDEOGRAPH
+ 0xB583: 0x796A, //CJK UNIFIED IDEOGRAPH
+ 0xB584: 0x796B, //CJK UNIFIED IDEOGRAPH
+ 0xB585: 0x796C, //CJK UNIFIED IDEOGRAPH
+ 0xB586: 0x796E, //CJK UNIFIED IDEOGRAPH
+ 0xB587: 0x7970, //CJK UNIFIED IDEOGRAPH
+ 0xB588: 0x7971, //CJK UNIFIED IDEOGRAPH
+ 0xB589: 0x7972, //CJK UNIFIED IDEOGRAPH
+ 0xB58A: 0x7973, //CJK UNIFIED IDEOGRAPH
+ 0xB58B: 0x7974, //CJK UNIFIED IDEOGRAPH
+ 0xB58C: 0x7975, //CJK UNIFIED IDEOGRAPH
+ 0xB58D: 0x7976, //CJK UNIFIED IDEOGRAPH
+ 0xB58E: 0x7979, //CJK UNIFIED IDEOGRAPH
+ 0xB58F: 0x797B, //CJK UNIFIED IDEOGRAPH
+ 0xB590: 0x797C, //CJK UNIFIED IDEOGRAPH
+ 0xB591: 0x797D, //CJK UNIFIED IDEOGRAPH
+ 0xB592: 0x797E, //CJK UNIFIED IDEOGRAPH
+ 0xB593: 0x797F, //CJK UNIFIED IDEOGRAPH
+ 0xB594: 0x7982, //CJK UNIFIED IDEOGRAPH
+ 0xB595: 0x7983, //CJK UNIFIED IDEOGRAPH
+ 0xB596: 0x7986, //CJK UNIFIED IDEOGRAPH
+ 0xB597: 0x7987, //CJK UNIFIED IDEOGRAPH
+ 0xB598: 0x7988, //CJK UNIFIED IDEOGRAPH
+ 0xB599: 0x7989, //CJK UNIFIED IDEOGRAPH
+ 0xB59A: 0x798B, //CJK UNIFIED IDEOGRAPH
+ 0xB59B: 0x798C, //CJK UNIFIED IDEOGRAPH
+ 0xB59C: 0x798D, //CJK UNIFIED IDEOGRAPH
+ 0xB59D: 0x798E, //CJK UNIFIED IDEOGRAPH
+ 0xB59E: 0x7990, //CJK UNIFIED IDEOGRAPH
+ 0xB59F: 0x7991, //CJK UNIFIED IDEOGRAPH
+ 0xB5A0: 0x7992, //CJK UNIFIED IDEOGRAPH
+ 0xB5A1: 0x6020, //CJK UNIFIED IDEOGRAPH
+ 0xB5A2: 0x803D, //CJK UNIFIED IDEOGRAPH
+ 0xB5A3: 0x62C5, //CJK UNIFIED IDEOGRAPH
+ 0xB5A4: 0x4E39, //CJK UNIFIED IDEOGRAPH
+ 0xB5A5: 0x5355, //CJK UNIFIED IDEOGRAPH
+ 0xB5A6: 0x90F8, //CJK UNIFIED IDEOGRAPH
+ 0xB5A7: 0x63B8, //CJK UNIFIED IDEOGRAPH
+ 0xB5A8: 0x80C6, //CJK UNIFIED IDEOGRAPH
+ 0xB5A9: 0x65E6, //CJK UNIFIED IDEOGRAPH
+ 0xB5AA: 0x6C2E, //CJK UNIFIED IDEOGRAPH
+ 0xB5AB: 0x4F46, //CJK UNIFIED IDEOGRAPH
+ 0xB5AC: 0x60EE, //CJK UNIFIED IDEOGRAPH
+ 0xB5AD: 0x6DE1, //CJK UNIFIED IDEOGRAPH
+ 0xB5AE: 0x8BDE, //CJK UNIFIED IDEOGRAPH
+ 0xB5AF: 0x5F39, //CJK UNIFIED IDEOGRAPH
+ 0xB5B0: 0x86CB, //CJK UNIFIED IDEOGRAPH
+ 0xB5B1: 0x5F53, //CJK UNIFIED IDEOGRAPH
+ 0xB5B2: 0x6321, //CJK UNIFIED IDEOGRAPH
+ 0xB5B3: 0x515A, //CJK UNIFIED IDEOGRAPH
+ 0xB5B4: 0x8361, //CJK UNIFIED IDEOGRAPH
+ 0xB5B5: 0x6863, //CJK UNIFIED IDEOGRAPH
+ 0xB5B6: 0x5200, //CJK UNIFIED IDEOGRAPH
+ 0xB5B7: 0x6363, //CJK UNIFIED IDEOGRAPH
+ 0xB5B8: 0x8E48, //CJK UNIFIED IDEOGRAPH
+ 0xB5B9: 0x5012, //CJK UNIFIED IDEOGRAPH
+ 0xB5BA: 0x5C9B, //CJK UNIFIED IDEOGRAPH
+ 0xB5BB: 0x7977, //CJK UNIFIED IDEOGRAPH
+ 0xB5BC: 0x5BFC, //CJK UNIFIED IDEOGRAPH
+ 0xB5BD: 0x5230, //CJK UNIFIED IDEOGRAPH
+ 0xB5BE: 0x7A3B, //CJK UNIFIED IDEOGRAPH
+ 0xB5BF: 0x60BC, //CJK UNIFIED IDEOGRAPH
+ 0xB5C0: 0x9053, //CJK UNIFIED IDEOGRAPH
+ 0xB5C1: 0x76D7, //CJK UNIFIED IDEOGRAPH
+ 0xB5C2: 0x5FB7, //CJK UNIFIED IDEOGRAPH
+ 0xB5C3: 0x5F97, //CJK UNIFIED IDEOGRAPH
+ 0xB5C4: 0x7684, //CJK UNIFIED IDEOGRAPH
+ 0xB5C5: 0x8E6C, //CJK UNIFIED IDEOGRAPH
+ 0xB5C6: 0x706F, //CJK UNIFIED IDEOGRAPH
+ 0xB5C7: 0x767B, //CJK UNIFIED IDEOGRAPH
+ 0xB5C8: 0x7B49, //CJK UNIFIED IDEOGRAPH
+ 0xB5C9: 0x77AA, //CJK UNIFIED IDEOGRAPH
+ 0xB5CA: 0x51F3, //CJK UNIFIED IDEOGRAPH
+ 0xB5CB: 0x9093, //CJK UNIFIED IDEOGRAPH
+ 0xB5CC: 0x5824, //CJK UNIFIED IDEOGRAPH
+ 0xB5CD: 0x4F4E, //CJK UNIFIED IDEOGRAPH
+ 0xB5CE: 0x6EF4, //CJK UNIFIED IDEOGRAPH
+ 0xB5CF: 0x8FEA, //CJK UNIFIED IDEOGRAPH
+ 0xB5D0: 0x654C, //CJK UNIFIED IDEOGRAPH
+ 0xB5D1: 0x7B1B, //CJK UNIFIED IDEOGRAPH
+ 0xB5D2: 0x72C4, //CJK UNIFIED IDEOGRAPH
+ 0xB5D3: 0x6DA4, //CJK UNIFIED IDEOGRAPH
+ 0xB5D4: 0x7FDF, //CJK UNIFIED IDEOGRAPH
+ 0xB5D5: 0x5AE1, //CJK UNIFIED IDEOGRAPH
+ 0xB5D6: 0x62B5, //CJK UNIFIED IDEOGRAPH
+ 0xB5D7: 0x5E95, //CJK UNIFIED IDEOGRAPH
+ 0xB5D8: 0x5730, //CJK UNIFIED IDEOGRAPH
+ 0xB5D9: 0x8482, //CJK UNIFIED IDEOGRAPH
+ 0xB5DA: 0x7B2C, //CJK UNIFIED IDEOGRAPH
+ 0xB5DB: 0x5E1D, //CJK UNIFIED IDEOGRAPH
+ 0xB5DC: 0x5F1F, //CJK UNIFIED IDEOGRAPH
+ 0xB5DD: 0x9012, //CJK UNIFIED IDEOGRAPH
+ 0xB5DE: 0x7F14, //CJK UNIFIED IDEOGRAPH
+ 0xB5DF: 0x98A0, //CJK UNIFIED IDEOGRAPH
+ 0xB5E0: 0x6382, //CJK UNIFIED IDEOGRAPH
+ 0xB5E1: 0x6EC7, //CJK UNIFIED IDEOGRAPH
+ 0xB5E2: 0x7898, //CJK UNIFIED IDEOGRAPH
+ 0xB5E3: 0x70B9, //CJK UNIFIED IDEOGRAPH
+ 0xB5E4: 0x5178, //CJK UNIFIED IDEOGRAPH
+ 0xB5E5: 0x975B, //CJK UNIFIED IDEOGRAPH
+ 0xB5E6: 0x57AB, //CJK UNIFIED IDEOGRAPH
+ 0xB5E7: 0x7535, //CJK UNIFIED IDEOGRAPH
+ 0xB5E8: 0x4F43, //CJK UNIFIED IDEOGRAPH
+ 0xB5E9: 0x7538, //CJK UNIFIED IDEOGRAPH
+ 0xB5EA: 0x5E97, //CJK UNIFIED IDEOGRAPH
+ 0xB5EB: 0x60E6, //CJK UNIFIED IDEOGRAPH
+ 0xB5EC: 0x5960, //CJK UNIFIED IDEOGRAPH
+ 0xB5ED: 0x6DC0, //CJK UNIFIED IDEOGRAPH
+ 0xB5EE: 0x6BBF, //CJK UNIFIED IDEOGRAPH
+ 0xB5EF: 0x7889, //CJK UNIFIED IDEOGRAPH
+ 0xB5F0: 0x53FC, //CJK UNIFIED IDEOGRAPH
+ 0xB5F1: 0x96D5, //CJK UNIFIED IDEOGRAPH
+ 0xB5F2: 0x51CB, //CJK UNIFIED IDEOGRAPH
+ 0xB5F3: 0x5201, //CJK UNIFIED IDEOGRAPH
+ 0xB5F4: 0x6389, //CJK UNIFIED IDEOGRAPH
+ 0xB5F5: 0x540A, //CJK UNIFIED IDEOGRAPH
+ 0xB5F6: 0x9493, //CJK UNIFIED IDEOGRAPH
+ 0xB5F7: 0x8C03, //CJK UNIFIED IDEOGRAPH
+ 0xB5F8: 0x8DCC, //CJK UNIFIED IDEOGRAPH
+ 0xB5F9: 0x7239, //CJK UNIFIED IDEOGRAPH
+ 0xB5FA: 0x789F, //CJK UNIFIED IDEOGRAPH
+ 0xB5FB: 0x8776, //CJK UNIFIED IDEOGRAPH
+ 0xB5FC: 0x8FED, //CJK UNIFIED IDEOGRAPH
+ 0xB5FD: 0x8C0D, //CJK UNIFIED IDEOGRAPH
+ 0xB5FE: 0x53E0, //CJK UNIFIED IDEOGRAPH
+ 0xB640: 0x7993, //CJK UNIFIED IDEOGRAPH
+ 0xB641: 0x7994, //CJK UNIFIED IDEOGRAPH
+ 0xB642: 0x7995, //CJK UNIFIED IDEOGRAPH
+ 0xB643: 0x7996, //CJK UNIFIED IDEOGRAPH
+ 0xB644: 0x7997, //CJK UNIFIED IDEOGRAPH
+ 0xB645: 0x7998, //CJK UNIFIED IDEOGRAPH
+ 0xB646: 0x7999, //CJK UNIFIED IDEOGRAPH
+ 0xB647: 0x799B, //CJK UNIFIED IDEOGRAPH
+ 0xB648: 0x799C, //CJK UNIFIED IDEOGRAPH
+ 0xB649: 0x799D, //CJK UNIFIED IDEOGRAPH
+ 0xB64A: 0x799E, //CJK UNIFIED IDEOGRAPH
+ 0xB64B: 0x799F, //CJK UNIFIED IDEOGRAPH
+ 0xB64C: 0x79A0, //CJK UNIFIED IDEOGRAPH
+ 0xB64D: 0x79A1, //CJK UNIFIED IDEOGRAPH
+ 0xB64E: 0x79A2, //CJK UNIFIED IDEOGRAPH
+ 0xB64F: 0x79A3, //CJK UNIFIED IDEOGRAPH
+ 0xB650: 0x79A4, //CJK UNIFIED IDEOGRAPH
+ 0xB651: 0x79A5, //CJK UNIFIED IDEOGRAPH
+ 0xB652: 0x79A6, //CJK UNIFIED IDEOGRAPH
+ 0xB653: 0x79A8, //CJK UNIFIED IDEOGRAPH
+ 0xB654: 0x79A9, //CJK UNIFIED IDEOGRAPH
+ 0xB655: 0x79AA, //CJK UNIFIED IDEOGRAPH
+ 0xB656: 0x79AB, //CJK UNIFIED IDEOGRAPH
+ 0xB657: 0x79AC, //CJK UNIFIED IDEOGRAPH
+ 0xB658: 0x79AD, //CJK UNIFIED IDEOGRAPH
+ 0xB659: 0x79AE, //CJK UNIFIED IDEOGRAPH
+ 0xB65A: 0x79AF, //CJK UNIFIED IDEOGRAPH
+ 0xB65B: 0x79B0, //CJK UNIFIED IDEOGRAPH
+ 0xB65C: 0x79B1, //CJK UNIFIED IDEOGRAPH
+ 0xB65D: 0x79B2, //CJK UNIFIED IDEOGRAPH
+ 0xB65E: 0x79B4, //CJK UNIFIED IDEOGRAPH
+ 0xB65F: 0x79B5, //CJK UNIFIED IDEOGRAPH
+ 0xB660: 0x79B6, //CJK UNIFIED IDEOGRAPH
+ 0xB661: 0x79B7, //CJK UNIFIED IDEOGRAPH
+ 0xB662: 0x79B8, //CJK UNIFIED IDEOGRAPH
+ 0xB663: 0x79BC, //CJK UNIFIED IDEOGRAPH
+ 0xB664: 0x79BF, //CJK UNIFIED IDEOGRAPH
+ 0xB665: 0x79C2, //CJK UNIFIED IDEOGRAPH
+ 0xB666: 0x79C4, //CJK UNIFIED IDEOGRAPH
+ 0xB667: 0x79C5, //CJK UNIFIED IDEOGRAPH
+ 0xB668: 0x79C7, //CJK UNIFIED IDEOGRAPH
+ 0xB669: 0x79C8, //CJK UNIFIED IDEOGRAPH
+ 0xB66A: 0x79CA, //CJK UNIFIED IDEOGRAPH
+ 0xB66B: 0x79CC, //CJK UNIFIED IDEOGRAPH
+ 0xB66C: 0x79CE, //CJK UNIFIED IDEOGRAPH
+ 0xB66D: 0x79CF, //CJK UNIFIED IDEOGRAPH
+ 0xB66E: 0x79D0, //CJK UNIFIED IDEOGRAPH
+ 0xB66F: 0x79D3, //CJK UNIFIED IDEOGRAPH
+ 0xB670: 0x79D4, //CJK UNIFIED IDEOGRAPH
+ 0xB671: 0x79D6, //CJK UNIFIED IDEOGRAPH
+ 0xB672: 0x79D7, //CJK UNIFIED IDEOGRAPH
+ 0xB673: 0x79D9, //CJK UNIFIED IDEOGRAPH
+ 0xB674: 0x79DA, //CJK UNIFIED IDEOGRAPH
+ 0xB675: 0x79DB, //CJK UNIFIED IDEOGRAPH
+ 0xB676: 0x79DC, //CJK UNIFIED IDEOGRAPH
+ 0xB677: 0x79DD, //CJK UNIFIED IDEOGRAPH
+ 0xB678: 0x79DE, //CJK UNIFIED IDEOGRAPH
+ 0xB679: 0x79E0, //CJK UNIFIED IDEOGRAPH
+ 0xB67A: 0x79E1, //CJK UNIFIED IDEOGRAPH
+ 0xB67B: 0x79E2, //CJK UNIFIED IDEOGRAPH
+ 0xB67C: 0x79E5, //CJK UNIFIED IDEOGRAPH
+ 0xB67D: 0x79E8, //CJK UNIFIED IDEOGRAPH
+ 0xB67E: 0x79EA, //CJK UNIFIED IDEOGRAPH
+ 0xB680: 0x79EC, //CJK UNIFIED IDEOGRAPH
+ 0xB681: 0x79EE, //CJK UNIFIED IDEOGRAPH
+ 0xB682: 0x79F1, //CJK UNIFIED IDEOGRAPH
+ 0xB683: 0x79F2, //CJK UNIFIED IDEOGRAPH
+ 0xB684: 0x79F3, //CJK UNIFIED IDEOGRAPH
+ 0xB685: 0x79F4, //CJK UNIFIED IDEOGRAPH
+ 0xB686: 0x79F5, //CJK UNIFIED IDEOGRAPH
+ 0xB687: 0x79F6, //CJK UNIFIED IDEOGRAPH
+ 0xB688: 0x79F7, //CJK UNIFIED IDEOGRAPH
+ 0xB689: 0x79F9, //CJK UNIFIED IDEOGRAPH
+ 0xB68A: 0x79FA, //CJK UNIFIED IDEOGRAPH
+ 0xB68B: 0x79FC, //CJK UNIFIED IDEOGRAPH
+ 0xB68C: 0x79FE, //CJK UNIFIED IDEOGRAPH
+ 0xB68D: 0x79FF, //CJK UNIFIED IDEOGRAPH
+ 0xB68E: 0x7A01, //CJK UNIFIED IDEOGRAPH
+ 0xB68F: 0x7A04, //CJK UNIFIED IDEOGRAPH
+ 0xB690: 0x7A05, //CJK UNIFIED IDEOGRAPH
+ 0xB691: 0x7A07, //CJK UNIFIED IDEOGRAPH
+ 0xB692: 0x7A08, //CJK UNIFIED IDEOGRAPH
+ 0xB693: 0x7A09, //CJK UNIFIED IDEOGRAPH
+ 0xB694: 0x7A0A, //CJK UNIFIED IDEOGRAPH
+ 0xB695: 0x7A0C, //CJK UNIFIED IDEOGRAPH
+ 0xB696: 0x7A0F, //CJK UNIFIED IDEOGRAPH
+ 0xB697: 0x7A10, //CJK UNIFIED IDEOGRAPH
+ 0xB698: 0x7A11, //CJK UNIFIED IDEOGRAPH
+ 0xB699: 0x7A12, //CJK UNIFIED IDEOGRAPH
+ 0xB69A: 0x7A13, //CJK UNIFIED IDEOGRAPH
+ 0xB69B: 0x7A15, //CJK UNIFIED IDEOGRAPH
+ 0xB69C: 0x7A16, //CJK UNIFIED IDEOGRAPH
+ 0xB69D: 0x7A18, //CJK UNIFIED IDEOGRAPH
+ 0xB69E: 0x7A19, //CJK UNIFIED IDEOGRAPH
+ 0xB69F: 0x7A1B, //CJK UNIFIED IDEOGRAPH
+ 0xB6A0: 0x7A1C, //CJK UNIFIED IDEOGRAPH
+ 0xB6A1: 0x4E01, //CJK UNIFIED IDEOGRAPH
+ 0xB6A2: 0x76EF, //CJK UNIFIED IDEOGRAPH
+ 0xB6A3: 0x53EE, //CJK UNIFIED IDEOGRAPH
+ 0xB6A4: 0x9489, //CJK UNIFIED IDEOGRAPH
+ 0xB6A5: 0x9876, //CJK UNIFIED IDEOGRAPH
+ 0xB6A6: 0x9F0E, //CJK UNIFIED IDEOGRAPH
+ 0xB6A7: 0x952D, //CJK UNIFIED IDEOGRAPH
+ 0xB6A8: 0x5B9A, //CJK UNIFIED IDEOGRAPH
+ 0xB6A9: 0x8BA2, //CJK UNIFIED IDEOGRAPH
+ 0xB6AA: 0x4E22, //CJK UNIFIED IDEOGRAPH
+ 0xB6AB: 0x4E1C, //CJK UNIFIED IDEOGRAPH
+ 0xB6AC: 0x51AC, //CJK UNIFIED IDEOGRAPH
+ 0xB6AD: 0x8463, //CJK UNIFIED IDEOGRAPH
+ 0xB6AE: 0x61C2, //CJK UNIFIED IDEOGRAPH
+ 0xB6AF: 0x52A8, //CJK UNIFIED IDEOGRAPH
+ 0xB6B0: 0x680B, //CJK UNIFIED IDEOGRAPH
+ 0xB6B1: 0x4F97, //CJK UNIFIED IDEOGRAPH
+ 0xB6B2: 0x606B, //CJK UNIFIED IDEOGRAPH
+ 0xB6B3: 0x51BB, //CJK UNIFIED IDEOGRAPH
+ 0xB6B4: 0x6D1E, //CJK UNIFIED IDEOGRAPH
+ 0xB6B5: 0x515C, //CJK UNIFIED IDEOGRAPH
+ 0xB6B6: 0x6296, //CJK UNIFIED IDEOGRAPH
+ 0xB6B7: 0x6597, //CJK UNIFIED IDEOGRAPH
+ 0xB6B8: 0x9661, //CJK UNIFIED IDEOGRAPH
+ 0xB6B9: 0x8C46, //CJK UNIFIED IDEOGRAPH
+ 0xB6BA: 0x9017, //CJK UNIFIED IDEOGRAPH
+ 0xB6BB: 0x75D8, //CJK UNIFIED IDEOGRAPH
+ 0xB6BC: 0x90FD, //CJK UNIFIED IDEOGRAPH
+ 0xB6BD: 0x7763, //CJK UNIFIED IDEOGRAPH
+ 0xB6BE: 0x6BD2, //CJK UNIFIED IDEOGRAPH
+ 0xB6BF: 0x728A, //CJK UNIFIED IDEOGRAPH
+ 0xB6C0: 0x72EC, //CJK UNIFIED IDEOGRAPH
+ 0xB6C1: 0x8BFB, //CJK UNIFIED IDEOGRAPH
+ 0xB6C2: 0x5835, //CJK UNIFIED IDEOGRAPH
+ 0xB6C3: 0x7779, //CJK UNIFIED IDEOGRAPH
+ 0xB6C4: 0x8D4C, //CJK UNIFIED IDEOGRAPH
+ 0xB6C5: 0x675C, //CJK UNIFIED IDEOGRAPH
+ 0xB6C6: 0x9540, //CJK UNIFIED IDEOGRAPH
+ 0xB6C7: 0x809A, //CJK UNIFIED IDEOGRAPH
+ 0xB6C8: 0x5EA6, //CJK UNIFIED IDEOGRAPH
+ 0xB6C9: 0x6E21, //CJK UNIFIED IDEOGRAPH
+ 0xB6CA: 0x5992, //CJK UNIFIED IDEOGRAPH
+ 0xB6CB: 0x7AEF, //CJK UNIFIED IDEOGRAPH
+ 0xB6CC: 0x77ED, //CJK UNIFIED IDEOGRAPH
+ 0xB6CD: 0x953B, //CJK UNIFIED IDEOGRAPH
+ 0xB6CE: 0x6BB5, //CJK UNIFIED IDEOGRAPH
+ 0xB6CF: 0x65AD, //CJK UNIFIED IDEOGRAPH
+ 0xB6D0: 0x7F0E, //CJK UNIFIED IDEOGRAPH
+ 0xB6D1: 0x5806, //CJK UNIFIED IDEOGRAPH
+ 0xB6D2: 0x5151, //CJK UNIFIED IDEOGRAPH
+ 0xB6D3: 0x961F, //CJK UNIFIED IDEOGRAPH
+ 0xB6D4: 0x5BF9, //CJK UNIFIED IDEOGRAPH
+ 0xB6D5: 0x58A9, //CJK UNIFIED IDEOGRAPH
+ 0xB6D6: 0x5428, //CJK UNIFIED IDEOGRAPH
+ 0xB6D7: 0x8E72, //CJK UNIFIED IDEOGRAPH
+ 0xB6D8: 0x6566, //CJK UNIFIED IDEOGRAPH
+ 0xB6D9: 0x987F, //CJK UNIFIED IDEOGRAPH
+ 0xB6DA: 0x56E4, //CJK UNIFIED IDEOGRAPH
+ 0xB6DB: 0x949D, //CJK UNIFIED IDEOGRAPH
+ 0xB6DC: 0x76FE, //CJK UNIFIED IDEOGRAPH
+ 0xB6DD: 0x9041, //CJK UNIFIED IDEOGRAPH
+ 0xB6DE: 0x6387, //CJK UNIFIED IDEOGRAPH
+ 0xB6DF: 0x54C6, //CJK UNIFIED IDEOGRAPH
+ 0xB6E0: 0x591A, //CJK UNIFIED IDEOGRAPH
+ 0xB6E1: 0x593A, //CJK UNIFIED IDEOGRAPH
+ 0xB6E2: 0x579B, //CJK UNIFIED IDEOGRAPH
+ 0xB6E3: 0x8EB2, //CJK UNIFIED IDEOGRAPH
+ 0xB6E4: 0x6735, //CJK UNIFIED IDEOGRAPH
+ 0xB6E5: 0x8DFA, //CJK UNIFIED IDEOGRAPH
+ 0xB6E6: 0x8235, //CJK UNIFIED IDEOGRAPH
+ 0xB6E7: 0x5241, //CJK UNIFIED IDEOGRAPH
+ 0xB6E8: 0x60F0, //CJK UNIFIED IDEOGRAPH
+ 0xB6E9: 0x5815, //CJK UNIFIED IDEOGRAPH
+ 0xB6EA: 0x86FE, //CJK UNIFIED IDEOGRAPH
+ 0xB6EB: 0x5CE8, //CJK UNIFIED IDEOGRAPH
+ 0xB6EC: 0x9E45, //CJK UNIFIED IDEOGRAPH
+ 0xB6ED: 0x4FC4, //CJK UNIFIED IDEOGRAPH
+ 0xB6EE: 0x989D, //CJK UNIFIED IDEOGRAPH
+ 0xB6EF: 0x8BB9, //CJK UNIFIED IDEOGRAPH
+ 0xB6F0: 0x5A25, //CJK UNIFIED IDEOGRAPH
+ 0xB6F1: 0x6076, //CJK UNIFIED IDEOGRAPH
+ 0xB6F2: 0x5384, //CJK UNIFIED IDEOGRAPH
+ 0xB6F3: 0x627C, //CJK UNIFIED IDEOGRAPH
+ 0xB6F4: 0x904F, //CJK UNIFIED IDEOGRAPH
+ 0xB6F5: 0x9102, //CJK UNIFIED IDEOGRAPH
+ 0xB6F6: 0x997F, //CJK UNIFIED IDEOGRAPH
+ 0xB6F7: 0x6069, //CJK UNIFIED IDEOGRAPH
+ 0xB6F8: 0x800C, //CJK UNIFIED IDEOGRAPH
+ 0xB6F9: 0x513F, //CJK UNIFIED IDEOGRAPH
+ 0xB6FA: 0x8033, //CJK UNIFIED IDEOGRAPH
+ 0xB6FB: 0x5C14, //CJK UNIFIED IDEOGRAPH
+ 0xB6FC: 0x9975, //CJK UNIFIED IDEOGRAPH
+ 0xB6FD: 0x6D31, //CJK UNIFIED IDEOGRAPH
+ 0xB6FE: 0x4E8C, //CJK UNIFIED IDEOGRAPH
+ 0xB740: 0x7A1D, //CJK UNIFIED IDEOGRAPH
+ 0xB741: 0x7A1F, //CJK UNIFIED IDEOGRAPH
+ 0xB742: 0x7A21, //CJK UNIFIED IDEOGRAPH
+ 0xB743: 0x7A22, //CJK UNIFIED IDEOGRAPH
+ 0xB744: 0x7A24, //CJK UNIFIED IDEOGRAPH
+ 0xB745: 0x7A25, //CJK UNIFIED IDEOGRAPH
+ 0xB746: 0x7A26, //CJK UNIFIED IDEOGRAPH
+ 0xB747: 0x7A27, //CJK UNIFIED IDEOGRAPH
+ 0xB748: 0x7A28, //CJK UNIFIED IDEOGRAPH
+ 0xB749: 0x7A29, //CJK UNIFIED IDEOGRAPH
+ 0xB74A: 0x7A2A, //CJK UNIFIED IDEOGRAPH
+ 0xB74B: 0x7A2B, //CJK UNIFIED IDEOGRAPH
+ 0xB74C: 0x7A2C, //CJK UNIFIED IDEOGRAPH
+ 0xB74D: 0x7A2D, //CJK UNIFIED IDEOGRAPH
+ 0xB74E: 0x7A2E, //CJK UNIFIED IDEOGRAPH
+ 0xB74F: 0x7A2F, //CJK UNIFIED IDEOGRAPH
+ 0xB750: 0x7A30, //CJK UNIFIED IDEOGRAPH
+ 0xB751: 0x7A31, //CJK UNIFIED IDEOGRAPH
+ 0xB752: 0x7A32, //CJK UNIFIED IDEOGRAPH
+ 0xB753: 0x7A34, //CJK UNIFIED IDEOGRAPH
+ 0xB754: 0x7A35, //CJK UNIFIED IDEOGRAPH
+ 0xB755: 0x7A36, //CJK UNIFIED IDEOGRAPH
+ 0xB756: 0x7A38, //CJK UNIFIED IDEOGRAPH
+ 0xB757: 0x7A3A, //CJK UNIFIED IDEOGRAPH
+ 0xB758: 0x7A3E, //CJK UNIFIED IDEOGRAPH
+ 0xB759: 0x7A40, //CJK UNIFIED IDEOGRAPH
+ 0xB75A: 0x7A41, //CJK UNIFIED IDEOGRAPH
+ 0xB75B: 0x7A42, //CJK UNIFIED IDEOGRAPH
+ 0xB75C: 0x7A43, //CJK UNIFIED IDEOGRAPH
+ 0xB75D: 0x7A44, //CJK UNIFIED IDEOGRAPH
+ 0xB75E: 0x7A45, //CJK UNIFIED IDEOGRAPH
+ 0xB75F: 0x7A47, //CJK UNIFIED IDEOGRAPH
+ 0xB760: 0x7A48, //CJK UNIFIED IDEOGRAPH
+ 0xB761: 0x7A49, //CJK UNIFIED IDEOGRAPH
+ 0xB762: 0x7A4A, //CJK UNIFIED IDEOGRAPH
+ 0xB763: 0x7A4B, //CJK UNIFIED IDEOGRAPH
+ 0xB764: 0x7A4C, //CJK UNIFIED IDEOGRAPH
+ 0xB765: 0x7A4D, //CJK UNIFIED IDEOGRAPH
+ 0xB766: 0x7A4E, //CJK UNIFIED IDEOGRAPH
+ 0xB767: 0x7A4F, //CJK UNIFIED IDEOGRAPH
+ 0xB768: 0x7A50, //CJK UNIFIED IDEOGRAPH
+ 0xB769: 0x7A52, //CJK UNIFIED IDEOGRAPH
+ 0xB76A: 0x7A53, //CJK UNIFIED IDEOGRAPH
+ 0xB76B: 0x7A54, //CJK UNIFIED IDEOGRAPH
+ 0xB76C: 0x7A55, //CJK UNIFIED IDEOGRAPH
+ 0xB76D: 0x7A56, //CJK UNIFIED IDEOGRAPH
+ 0xB76E: 0x7A58, //CJK UNIFIED IDEOGRAPH
+ 0xB76F: 0x7A59, //CJK UNIFIED IDEOGRAPH
+ 0xB770: 0x7A5A, //CJK UNIFIED IDEOGRAPH
+ 0xB771: 0x7A5B, //CJK UNIFIED IDEOGRAPH
+ 0xB772: 0x7A5C, //CJK UNIFIED IDEOGRAPH
+ 0xB773: 0x7A5D, //CJK UNIFIED IDEOGRAPH
+ 0xB774: 0x7A5E, //CJK UNIFIED IDEOGRAPH
+ 0xB775: 0x7A5F, //CJK UNIFIED IDEOGRAPH
+ 0xB776: 0x7A60, //CJK UNIFIED IDEOGRAPH
+ 0xB777: 0x7A61, //CJK UNIFIED IDEOGRAPH
+ 0xB778: 0x7A62, //CJK UNIFIED IDEOGRAPH
+ 0xB779: 0x7A63, //CJK UNIFIED IDEOGRAPH
+ 0xB77A: 0x7A64, //CJK UNIFIED IDEOGRAPH
+ 0xB77B: 0x7A65, //CJK UNIFIED IDEOGRAPH
+ 0xB77C: 0x7A66, //CJK UNIFIED IDEOGRAPH
+ 0xB77D: 0x7A67, //CJK UNIFIED IDEOGRAPH
+ 0xB77E: 0x7A68, //CJK UNIFIED IDEOGRAPH
+ 0xB780: 0x7A69, //CJK UNIFIED IDEOGRAPH
+ 0xB781: 0x7A6A, //CJK UNIFIED IDEOGRAPH
+ 0xB782: 0x7A6B, //CJK UNIFIED IDEOGRAPH
+ 0xB783: 0x7A6C, //CJK UNIFIED IDEOGRAPH
+ 0xB784: 0x7A6D, //CJK UNIFIED IDEOGRAPH
+ 0xB785: 0x7A6E, //CJK UNIFIED IDEOGRAPH
+ 0xB786: 0x7A6F, //CJK UNIFIED IDEOGRAPH
+ 0xB787: 0x7A71, //CJK UNIFIED IDEOGRAPH
+ 0xB788: 0x7A72, //CJK UNIFIED IDEOGRAPH
+ 0xB789: 0x7A73, //CJK UNIFIED IDEOGRAPH
+ 0xB78A: 0x7A75, //CJK UNIFIED IDEOGRAPH
+ 0xB78B: 0x7A7B, //CJK UNIFIED IDEOGRAPH
+ 0xB78C: 0x7A7C, //CJK UNIFIED IDEOGRAPH
+ 0xB78D: 0x7A7D, //CJK UNIFIED IDEOGRAPH
+ 0xB78E: 0x7A7E, //CJK UNIFIED IDEOGRAPH
+ 0xB78F: 0x7A82, //CJK UNIFIED IDEOGRAPH
+ 0xB790: 0x7A85, //CJK UNIFIED IDEOGRAPH
+ 0xB791: 0x7A87, //CJK UNIFIED IDEOGRAPH
+ 0xB792: 0x7A89, //CJK UNIFIED IDEOGRAPH
+ 0xB793: 0x7A8A, //CJK UNIFIED IDEOGRAPH
+ 0xB794: 0x7A8B, //CJK UNIFIED IDEOGRAPH
+ 0xB795: 0x7A8C, //CJK UNIFIED IDEOGRAPH
+ 0xB796: 0x7A8E, //CJK UNIFIED IDEOGRAPH
+ 0xB797: 0x7A8F, //CJK UNIFIED IDEOGRAPH
+ 0xB798: 0x7A90, //CJK UNIFIED IDEOGRAPH
+ 0xB799: 0x7A93, //CJK UNIFIED IDEOGRAPH
+ 0xB79A: 0x7A94, //CJK UNIFIED IDEOGRAPH
+ 0xB79B: 0x7A99, //CJK UNIFIED IDEOGRAPH
+ 0xB79C: 0x7A9A, //CJK UNIFIED IDEOGRAPH
+ 0xB79D: 0x7A9B, //CJK UNIFIED IDEOGRAPH
+ 0xB79E: 0x7A9E, //CJK UNIFIED IDEOGRAPH
+ 0xB79F: 0x7AA1, //CJK UNIFIED IDEOGRAPH
+ 0xB7A0: 0x7AA2, //CJK UNIFIED IDEOGRAPH
+ 0xB7A1: 0x8D30, //CJK UNIFIED IDEOGRAPH
+ 0xB7A2: 0x53D1, //CJK UNIFIED IDEOGRAPH
+ 0xB7A3: 0x7F5A, //CJK UNIFIED IDEOGRAPH
+ 0xB7A4: 0x7B4F, //CJK UNIFIED IDEOGRAPH
+ 0xB7A5: 0x4F10, //CJK UNIFIED IDEOGRAPH
+ 0xB7A6: 0x4E4F, //CJK UNIFIED IDEOGRAPH
+ 0xB7A7: 0x9600, //CJK UNIFIED IDEOGRAPH
+ 0xB7A8: 0x6CD5, //CJK UNIFIED IDEOGRAPH
+ 0xB7A9: 0x73D0, //CJK UNIFIED IDEOGRAPH
+ 0xB7AA: 0x85E9, //CJK UNIFIED IDEOGRAPH
+ 0xB7AB: 0x5E06, //CJK UNIFIED IDEOGRAPH
+ 0xB7AC: 0x756A, //CJK UNIFIED IDEOGRAPH
+ 0xB7AD: 0x7FFB, //CJK UNIFIED IDEOGRAPH
+ 0xB7AE: 0x6A0A, //CJK UNIFIED IDEOGRAPH
+ 0xB7AF: 0x77FE, //CJK UNIFIED IDEOGRAPH
+ 0xB7B0: 0x9492, //CJK UNIFIED IDEOGRAPH
+ 0xB7B1: 0x7E41, //CJK UNIFIED IDEOGRAPH
+ 0xB7B2: 0x51E1, //CJK UNIFIED IDEOGRAPH
+ 0xB7B3: 0x70E6, //CJK UNIFIED IDEOGRAPH
+ 0xB7B4: 0x53CD, //CJK UNIFIED IDEOGRAPH
+ 0xB7B5: 0x8FD4, //CJK UNIFIED IDEOGRAPH
+ 0xB7B6: 0x8303, //CJK UNIFIED IDEOGRAPH
+ 0xB7B7: 0x8D29, //CJK UNIFIED IDEOGRAPH
+ 0xB7B8: 0x72AF, //CJK UNIFIED IDEOGRAPH
+ 0xB7B9: 0x996D, //CJK UNIFIED IDEOGRAPH
+ 0xB7BA: 0x6CDB, //CJK UNIFIED IDEOGRAPH
+ 0xB7BB: 0x574A, //CJK UNIFIED IDEOGRAPH
+ 0xB7BC: 0x82B3, //CJK UNIFIED IDEOGRAPH
+ 0xB7BD: 0x65B9, //CJK UNIFIED IDEOGRAPH
+ 0xB7BE: 0x80AA, //CJK UNIFIED IDEOGRAPH
+ 0xB7BF: 0x623F, //CJK UNIFIED IDEOGRAPH
+ 0xB7C0: 0x9632, //CJK UNIFIED IDEOGRAPH
+ 0xB7C1: 0x59A8, //CJK UNIFIED IDEOGRAPH
+ 0xB7C2: 0x4EFF, //CJK UNIFIED IDEOGRAPH
+ 0xB7C3: 0x8BBF, //CJK UNIFIED IDEOGRAPH
+ 0xB7C4: 0x7EBA, //CJK UNIFIED IDEOGRAPH
+ 0xB7C5: 0x653E, //CJK UNIFIED IDEOGRAPH
+ 0xB7C6: 0x83F2, //CJK UNIFIED IDEOGRAPH
+ 0xB7C7: 0x975E, //CJK UNIFIED IDEOGRAPH
+ 0xB7C8: 0x5561, //CJK UNIFIED IDEOGRAPH
+ 0xB7C9: 0x98DE, //CJK UNIFIED IDEOGRAPH
+ 0xB7CA: 0x80A5, //CJK UNIFIED IDEOGRAPH
+ 0xB7CB: 0x532A, //CJK UNIFIED IDEOGRAPH
+ 0xB7CC: 0x8BFD, //CJK UNIFIED IDEOGRAPH
+ 0xB7CD: 0x5420, //CJK UNIFIED IDEOGRAPH
+ 0xB7CE: 0x80BA, //CJK UNIFIED IDEOGRAPH
+ 0xB7CF: 0x5E9F, //CJK UNIFIED IDEOGRAPH
+ 0xB7D0: 0x6CB8, //CJK UNIFIED IDEOGRAPH
+ 0xB7D1: 0x8D39, //CJK UNIFIED IDEOGRAPH
+ 0xB7D2: 0x82AC, //CJK UNIFIED IDEOGRAPH
+ 0xB7D3: 0x915A, //CJK UNIFIED IDEOGRAPH
+ 0xB7D4: 0x5429, //CJK UNIFIED IDEOGRAPH
+ 0xB7D5: 0x6C1B, //CJK UNIFIED IDEOGRAPH
+ 0xB7D6: 0x5206, //CJK UNIFIED IDEOGRAPH
+ 0xB7D7: 0x7EB7, //CJK UNIFIED IDEOGRAPH
+ 0xB7D8: 0x575F, //CJK UNIFIED IDEOGRAPH
+ 0xB7D9: 0x711A, //CJK UNIFIED IDEOGRAPH
+ 0xB7DA: 0x6C7E, //CJK UNIFIED IDEOGRAPH
+ 0xB7DB: 0x7C89, //CJK UNIFIED IDEOGRAPH
+ 0xB7DC: 0x594B, //CJK UNIFIED IDEOGRAPH
+ 0xB7DD: 0x4EFD, //CJK UNIFIED IDEOGRAPH
+ 0xB7DE: 0x5FFF, //CJK UNIFIED IDEOGRAPH
+ 0xB7DF: 0x6124, //CJK UNIFIED IDEOGRAPH
+ 0xB7E0: 0x7CAA, //CJK UNIFIED IDEOGRAPH
+ 0xB7E1: 0x4E30, //CJK UNIFIED IDEOGRAPH
+ 0xB7E2: 0x5C01, //CJK UNIFIED IDEOGRAPH
+ 0xB7E3: 0x67AB, //CJK UNIFIED IDEOGRAPH
+ 0xB7E4: 0x8702, //CJK UNIFIED IDEOGRAPH
+ 0xB7E5: 0x5CF0, //CJK UNIFIED IDEOGRAPH
+ 0xB7E6: 0x950B, //CJK UNIFIED IDEOGRAPH
+ 0xB7E7: 0x98CE, //CJK UNIFIED IDEOGRAPH
+ 0xB7E8: 0x75AF, //CJK UNIFIED IDEOGRAPH
+ 0xB7E9: 0x70FD, //CJK UNIFIED IDEOGRAPH
+ 0xB7EA: 0x9022, //CJK UNIFIED IDEOGRAPH
+ 0xB7EB: 0x51AF, //CJK UNIFIED IDEOGRAPH
+ 0xB7EC: 0x7F1D, //CJK UNIFIED IDEOGRAPH
+ 0xB7ED: 0x8BBD, //CJK UNIFIED IDEOGRAPH
+ 0xB7EE: 0x5949, //CJK UNIFIED IDEOGRAPH
+ 0xB7EF: 0x51E4, //CJK UNIFIED IDEOGRAPH
+ 0xB7F0: 0x4F5B, //CJK UNIFIED IDEOGRAPH
+ 0xB7F1: 0x5426, //CJK UNIFIED IDEOGRAPH
+ 0xB7F2: 0x592B, //CJK UNIFIED IDEOGRAPH
+ 0xB7F3: 0x6577, //CJK UNIFIED IDEOGRAPH
+ 0xB7F4: 0x80A4, //CJK UNIFIED IDEOGRAPH
+ 0xB7F5: 0x5B75, //CJK UNIFIED IDEOGRAPH
+ 0xB7F6: 0x6276, //CJK UNIFIED IDEOGRAPH
+ 0xB7F7: 0x62C2, //CJK UNIFIED IDEOGRAPH
+ 0xB7F8: 0x8F90, //CJK UNIFIED IDEOGRAPH
+ 0xB7F9: 0x5E45, //CJK UNIFIED IDEOGRAPH
+ 0xB7FA: 0x6C1F, //CJK UNIFIED IDEOGRAPH
+ 0xB7FB: 0x7B26, //CJK UNIFIED IDEOGRAPH
+ 0xB7FC: 0x4F0F, //CJK UNIFIED IDEOGRAPH
+ 0xB7FD: 0x4FD8, //CJK UNIFIED IDEOGRAPH
+ 0xB7FE: 0x670D, //CJK UNIFIED IDEOGRAPH
+ 0xB840: 0x7AA3, //CJK UNIFIED IDEOGRAPH
+ 0xB841: 0x7AA4, //CJK UNIFIED IDEOGRAPH
+ 0xB842: 0x7AA7, //CJK UNIFIED IDEOGRAPH
+ 0xB843: 0x7AA9, //CJK UNIFIED IDEOGRAPH
+ 0xB844: 0x7AAA, //CJK UNIFIED IDEOGRAPH
+ 0xB845: 0x7AAB, //CJK UNIFIED IDEOGRAPH
+ 0xB846: 0x7AAE, //CJK UNIFIED IDEOGRAPH
+ 0xB847: 0x7AAF, //CJK UNIFIED IDEOGRAPH
+ 0xB848: 0x7AB0, //CJK UNIFIED IDEOGRAPH
+ 0xB849: 0x7AB1, //CJK UNIFIED IDEOGRAPH
+ 0xB84A: 0x7AB2, //CJK UNIFIED IDEOGRAPH
+ 0xB84B: 0x7AB4, //CJK UNIFIED IDEOGRAPH
+ 0xB84C: 0x7AB5, //CJK UNIFIED IDEOGRAPH
+ 0xB84D: 0x7AB6, //CJK UNIFIED IDEOGRAPH
+ 0xB84E: 0x7AB7, //CJK UNIFIED IDEOGRAPH
+ 0xB84F: 0x7AB8, //CJK UNIFIED IDEOGRAPH
+ 0xB850: 0x7AB9, //CJK UNIFIED IDEOGRAPH
+ 0xB851: 0x7ABA, //CJK UNIFIED IDEOGRAPH
+ 0xB852: 0x7ABB, //CJK UNIFIED IDEOGRAPH
+ 0xB853: 0x7ABC, //CJK UNIFIED IDEOGRAPH
+ 0xB854: 0x7ABD, //CJK UNIFIED IDEOGRAPH
+ 0xB855: 0x7ABE, //CJK UNIFIED IDEOGRAPH
+ 0xB856: 0x7AC0, //CJK UNIFIED IDEOGRAPH
+ 0xB857: 0x7AC1, //CJK UNIFIED IDEOGRAPH
+ 0xB858: 0x7AC2, //CJK UNIFIED IDEOGRAPH
+ 0xB859: 0x7AC3, //CJK UNIFIED IDEOGRAPH
+ 0xB85A: 0x7AC4, //CJK UNIFIED IDEOGRAPH
+ 0xB85B: 0x7AC5, //CJK UNIFIED IDEOGRAPH
+ 0xB85C: 0x7AC6, //CJK UNIFIED IDEOGRAPH
+ 0xB85D: 0x7AC7, //CJK UNIFIED IDEOGRAPH
+ 0xB85E: 0x7AC8, //CJK UNIFIED IDEOGRAPH
+ 0xB85F: 0x7AC9, //CJK UNIFIED IDEOGRAPH
+ 0xB860: 0x7ACA, //CJK UNIFIED IDEOGRAPH
+ 0xB861: 0x7ACC, //CJK UNIFIED IDEOGRAPH
+ 0xB862: 0x7ACD, //CJK UNIFIED IDEOGRAPH
+ 0xB863: 0x7ACE, //CJK UNIFIED IDEOGRAPH
+ 0xB864: 0x7ACF, //CJK UNIFIED IDEOGRAPH
+ 0xB865: 0x7AD0, //CJK UNIFIED IDEOGRAPH
+ 0xB866: 0x7AD1, //CJK UNIFIED IDEOGRAPH
+ 0xB867: 0x7AD2, //CJK UNIFIED IDEOGRAPH
+ 0xB868: 0x7AD3, //CJK UNIFIED IDEOGRAPH
+ 0xB869: 0x7AD4, //CJK UNIFIED IDEOGRAPH
+ 0xB86A: 0x7AD5, //CJK UNIFIED IDEOGRAPH
+ 0xB86B: 0x7AD7, //CJK UNIFIED IDEOGRAPH
+ 0xB86C: 0x7AD8, //CJK UNIFIED IDEOGRAPH
+ 0xB86D: 0x7ADA, //CJK UNIFIED IDEOGRAPH
+ 0xB86E: 0x7ADB, //CJK UNIFIED IDEOGRAPH
+ 0xB86F: 0x7ADC, //CJK UNIFIED IDEOGRAPH
+ 0xB870: 0x7ADD, //CJK UNIFIED IDEOGRAPH
+ 0xB871: 0x7AE1, //CJK UNIFIED IDEOGRAPH
+ 0xB872: 0x7AE2, //CJK UNIFIED IDEOGRAPH
+ 0xB873: 0x7AE4, //CJK UNIFIED IDEOGRAPH
+ 0xB874: 0x7AE7, //CJK UNIFIED IDEOGRAPH
+ 0xB875: 0x7AE8, //CJK UNIFIED IDEOGRAPH
+ 0xB876: 0x7AE9, //CJK UNIFIED IDEOGRAPH
+ 0xB877: 0x7AEA, //CJK UNIFIED IDEOGRAPH
+ 0xB878: 0x7AEB, //CJK UNIFIED IDEOGRAPH
+ 0xB879: 0x7AEC, //CJK UNIFIED IDEOGRAPH
+ 0xB87A: 0x7AEE, //CJK UNIFIED IDEOGRAPH
+ 0xB87B: 0x7AF0, //CJK UNIFIED IDEOGRAPH
+ 0xB87C: 0x7AF1, //CJK UNIFIED IDEOGRAPH
+ 0xB87D: 0x7AF2, //CJK UNIFIED IDEOGRAPH
+ 0xB87E: 0x7AF3, //CJK UNIFIED IDEOGRAPH
+ 0xB880: 0x7AF4, //CJK UNIFIED IDEOGRAPH
+ 0xB881: 0x7AF5, //CJK UNIFIED IDEOGRAPH
+ 0xB882: 0x7AF6, //CJK UNIFIED IDEOGRAPH
+ 0xB883: 0x7AF7, //CJK UNIFIED IDEOGRAPH
+ 0xB884: 0x7AF8, //CJK UNIFIED IDEOGRAPH
+ 0xB885: 0x7AFB, //CJK UNIFIED IDEOGRAPH
+ 0xB886: 0x7AFC, //CJK UNIFIED IDEOGRAPH
+ 0xB887: 0x7AFE, //CJK UNIFIED IDEOGRAPH
+ 0xB888: 0x7B00, //CJK UNIFIED IDEOGRAPH
+ 0xB889: 0x7B01, //CJK UNIFIED IDEOGRAPH
+ 0xB88A: 0x7B02, //CJK UNIFIED IDEOGRAPH
+ 0xB88B: 0x7B05, //CJK UNIFIED IDEOGRAPH
+ 0xB88C: 0x7B07, //CJK UNIFIED IDEOGRAPH
+ 0xB88D: 0x7B09, //CJK UNIFIED IDEOGRAPH
+ 0xB88E: 0x7B0C, //CJK UNIFIED IDEOGRAPH
+ 0xB88F: 0x7B0D, //CJK UNIFIED IDEOGRAPH
+ 0xB890: 0x7B0E, //CJK UNIFIED IDEOGRAPH
+ 0xB891: 0x7B10, //CJK UNIFIED IDEOGRAPH
+ 0xB892: 0x7B12, //CJK UNIFIED IDEOGRAPH
+ 0xB893: 0x7B13, //CJK UNIFIED IDEOGRAPH
+ 0xB894: 0x7B16, //CJK UNIFIED IDEOGRAPH
+ 0xB895: 0x7B17, //CJK UNIFIED IDEOGRAPH
+ 0xB896: 0x7B18, //CJK UNIFIED IDEOGRAPH
+ 0xB897: 0x7B1A, //CJK UNIFIED IDEOGRAPH
+ 0xB898: 0x7B1C, //CJK UNIFIED IDEOGRAPH
+ 0xB899: 0x7B1D, //CJK UNIFIED IDEOGRAPH
+ 0xB89A: 0x7B1F, //CJK UNIFIED IDEOGRAPH
+ 0xB89B: 0x7B21, //CJK UNIFIED IDEOGRAPH
+ 0xB89C: 0x7B22, //CJK UNIFIED IDEOGRAPH
+ 0xB89D: 0x7B23, //CJK UNIFIED IDEOGRAPH
+ 0xB89E: 0x7B27, //CJK UNIFIED IDEOGRAPH
+ 0xB89F: 0x7B29, //CJK UNIFIED IDEOGRAPH
+ 0xB8A0: 0x7B2D, //CJK UNIFIED IDEOGRAPH
+ 0xB8A1: 0x6D6E, //CJK UNIFIED IDEOGRAPH
+ 0xB8A2: 0x6DAA, //CJK UNIFIED IDEOGRAPH
+ 0xB8A3: 0x798F, //CJK UNIFIED IDEOGRAPH
+ 0xB8A4: 0x88B1, //CJK UNIFIED IDEOGRAPH
+ 0xB8A5: 0x5F17, //CJK UNIFIED IDEOGRAPH
+ 0xB8A6: 0x752B, //CJK UNIFIED IDEOGRAPH
+ 0xB8A7: 0x629A, //CJK UNIFIED IDEOGRAPH
+ 0xB8A8: 0x8F85, //CJK UNIFIED IDEOGRAPH
+ 0xB8A9: 0x4FEF, //CJK UNIFIED IDEOGRAPH
+ 0xB8AA: 0x91DC, //CJK UNIFIED IDEOGRAPH
+ 0xB8AB: 0x65A7, //CJK UNIFIED IDEOGRAPH
+ 0xB8AC: 0x812F, //CJK UNIFIED IDEOGRAPH
+ 0xB8AD: 0x8151, //CJK UNIFIED IDEOGRAPH
+ 0xB8AE: 0x5E9C, //CJK UNIFIED IDEOGRAPH
+ 0xB8AF: 0x8150, //CJK UNIFIED IDEOGRAPH
+ 0xB8B0: 0x8D74, //CJK UNIFIED IDEOGRAPH
+ 0xB8B1: 0x526F, //CJK UNIFIED IDEOGRAPH
+ 0xB8B2: 0x8986, //CJK UNIFIED IDEOGRAPH
+ 0xB8B3: 0x8D4B, //CJK UNIFIED IDEOGRAPH
+ 0xB8B4: 0x590D, //CJK UNIFIED IDEOGRAPH
+ 0xB8B5: 0x5085, //CJK UNIFIED IDEOGRAPH
+ 0xB8B6: 0x4ED8, //CJK UNIFIED IDEOGRAPH
+ 0xB8B7: 0x961C, //CJK UNIFIED IDEOGRAPH
+ 0xB8B8: 0x7236, //CJK UNIFIED IDEOGRAPH
+ 0xB8B9: 0x8179, //CJK UNIFIED IDEOGRAPH
+ 0xB8BA: 0x8D1F, //CJK UNIFIED IDEOGRAPH
+ 0xB8BB: 0x5BCC, //CJK UNIFIED IDEOGRAPH
+ 0xB8BC: 0x8BA3, //CJK UNIFIED IDEOGRAPH
+ 0xB8BD: 0x9644, //CJK UNIFIED IDEOGRAPH
+ 0xB8BE: 0x5987, //CJK UNIFIED IDEOGRAPH
+ 0xB8BF: 0x7F1A, //CJK UNIFIED IDEOGRAPH
+ 0xB8C0: 0x5490, //CJK UNIFIED IDEOGRAPH
+ 0xB8C1: 0x5676, //CJK UNIFIED IDEOGRAPH
+ 0xB8C2: 0x560E, //CJK UNIFIED IDEOGRAPH
+ 0xB8C3: 0x8BE5, //CJK UNIFIED IDEOGRAPH
+ 0xB8C4: 0x6539, //CJK UNIFIED IDEOGRAPH
+ 0xB8C5: 0x6982, //CJK UNIFIED IDEOGRAPH
+ 0xB8C6: 0x9499, //CJK UNIFIED IDEOGRAPH
+ 0xB8C7: 0x76D6, //CJK UNIFIED IDEOGRAPH
+ 0xB8C8: 0x6E89, //CJK UNIFIED IDEOGRAPH
+ 0xB8C9: 0x5E72, //CJK UNIFIED IDEOGRAPH
+ 0xB8CA: 0x7518, //CJK UNIFIED IDEOGRAPH
+ 0xB8CB: 0x6746, //CJK UNIFIED IDEOGRAPH
+ 0xB8CC: 0x67D1, //CJK UNIFIED IDEOGRAPH
+ 0xB8CD: 0x7AFF, //CJK UNIFIED IDEOGRAPH
+ 0xB8CE: 0x809D, //CJK UNIFIED IDEOGRAPH
+ 0xB8CF: 0x8D76, //CJK UNIFIED IDEOGRAPH
+ 0xB8D0: 0x611F, //CJK UNIFIED IDEOGRAPH
+ 0xB8D1: 0x79C6, //CJK UNIFIED IDEOGRAPH
+ 0xB8D2: 0x6562, //CJK UNIFIED IDEOGRAPH
+ 0xB8D3: 0x8D63, //CJK UNIFIED IDEOGRAPH
+ 0xB8D4: 0x5188, //CJK UNIFIED IDEOGRAPH
+ 0xB8D5: 0x521A, //CJK UNIFIED IDEOGRAPH
+ 0xB8D6: 0x94A2, //CJK UNIFIED IDEOGRAPH
+ 0xB8D7: 0x7F38, //CJK UNIFIED IDEOGRAPH
+ 0xB8D8: 0x809B, //CJK UNIFIED IDEOGRAPH
+ 0xB8D9: 0x7EB2, //CJK UNIFIED IDEOGRAPH
+ 0xB8DA: 0x5C97, //CJK UNIFIED IDEOGRAPH
+ 0xB8DB: 0x6E2F, //CJK UNIFIED IDEOGRAPH
+ 0xB8DC: 0x6760, //CJK UNIFIED IDEOGRAPH
+ 0xB8DD: 0x7BD9, //CJK UNIFIED IDEOGRAPH
+ 0xB8DE: 0x768B, //CJK UNIFIED IDEOGRAPH
+ 0xB8DF: 0x9AD8, //CJK UNIFIED IDEOGRAPH
+ 0xB8E0: 0x818F, //CJK UNIFIED IDEOGRAPH
+ 0xB8E1: 0x7F94, //CJK UNIFIED IDEOGRAPH
+ 0xB8E2: 0x7CD5, //CJK UNIFIED IDEOGRAPH
+ 0xB8E3: 0x641E, //CJK UNIFIED IDEOGRAPH
+ 0xB8E4: 0x9550, //CJK UNIFIED IDEOGRAPH
+ 0xB8E5: 0x7A3F, //CJK UNIFIED IDEOGRAPH
+ 0xB8E6: 0x544A, //CJK UNIFIED IDEOGRAPH
+ 0xB8E7: 0x54E5, //CJK UNIFIED IDEOGRAPH
+ 0xB8E8: 0x6B4C, //CJK UNIFIED IDEOGRAPH
+ 0xB8E9: 0x6401, //CJK UNIFIED IDEOGRAPH
+ 0xB8EA: 0x6208, //CJK UNIFIED IDEOGRAPH
+ 0xB8EB: 0x9E3D, //CJK UNIFIED IDEOGRAPH
+ 0xB8EC: 0x80F3, //CJK UNIFIED IDEOGRAPH
+ 0xB8ED: 0x7599, //CJK UNIFIED IDEOGRAPH
+ 0xB8EE: 0x5272, //CJK UNIFIED IDEOGRAPH
+ 0xB8EF: 0x9769, //CJK UNIFIED IDEOGRAPH
+ 0xB8F0: 0x845B, //CJK UNIFIED IDEOGRAPH
+ 0xB8F1: 0x683C, //CJK UNIFIED IDEOGRAPH
+ 0xB8F2: 0x86E4, //CJK UNIFIED IDEOGRAPH
+ 0xB8F3: 0x9601, //CJK UNIFIED IDEOGRAPH
+ 0xB8F4: 0x9694, //CJK UNIFIED IDEOGRAPH
+ 0xB8F5: 0x94EC, //CJK UNIFIED IDEOGRAPH
+ 0xB8F6: 0x4E2A, //CJK UNIFIED IDEOGRAPH
+ 0xB8F7: 0x5404, //CJK UNIFIED IDEOGRAPH
+ 0xB8F8: 0x7ED9, //CJK UNIFIED IDEOGRAPH
+ 0xB8F9: 0x6839, //CJK UNIFIED IDEOGRAPH
+ 0xB8FA: 0x8DDF, //CJK UNIFIED IDEOGRAPH
+ 0xB8FB: 0x8015, //CJK UNIFIED IDEOGRAPH
+ 0xB8FC: 0x66F4, //CJK UNIFIED IDEOGRAPH
+ 0xB8FD: 0x5E9A, //CJK UNIFIED IDEOGRAPH
+ 0xB8FE: 0x7FB9, //CJK UNIFIED IDEOGRAPH
+ 0xB940: 0x7B2F, //CJK UNIFIED IDEOGRAPH
+ 0xB941: 0x7B30, //CJK UNIFIED IDEOGRAPH
+ 0xB942: 0x7B32, //CJK UNIFIED IDEOGRAPH
+ 0xB943: 0x7B34, //CJK UNIFIED IDEOGRAPH
+ 0xB944: 0x7B35, //CJK UNIFIED IDEOGRAPH
+ 0xB945: 0x7B36, //CJK UNIFIED IDEOGRAPH
+ 0xB946: 0x7B37, //CJK UNIFIED IDEOGRAPH
+ 0xB947: 0x7B39, //CJK UNIFIED IDEOGRAPH
+ 0xB948: 0x7B3B, //CJK UNIFIED IDEOGRAPH
+ 0xB949: 0x7B3D, //CJK UNIFIED IDEOGRAPH
+ 0xB94A: 0x7B3F, //CJK UNIFIED IDEOGRAPH
+ 0xB94B: 0x7B40, //CJK UNIFIED IDEOGRAPH
+ 0xB94C: 0x7B41, //CJK UNIFIED IDEOGRAPH
+ 0xB94D: 0x7B42, //CJK UNIFIED IDEOGRAPH
+ 0xB94E: 0x7B43, //CJK UNIFIED IDEOGRAPH
+ 0xB94F: 0x7B44, //CJK UNIFIED IDEOGRAPH
+ 0xB950: 0x7B46, //CJK UNIFIED IDEOGRAPH
+ 0xB951: 0x7B48, //CJK UNIFIED IDEOGRAPH
+ 0xB952: 0x7B4A, //CJK UNIFIED IDEOGRAPH
+ 0xB953: 0x7B4D, //CJK UNIFIED IDEOGRAPH
+ 0xB954: 0x7B4E, //CJK UNIFIED IDEOGRAPH
+ 0xB955: 0x7B53, //CJK UNIFIED IDEOGRAPH
+ 0xB956: 0x7B55, //CJK UNIFIED IDEOGRAPH
+ 0xB957: 0x7B57, //CJK UNIFIED IDEOGRAPH
+ 0xB958: 0x7B59, //CJK UNIFIED IDEOGRAPH
+ 0xB959: 0x7B5C, //CJK UNIFIED IDEOGRAPH
+ 0xB95A: 0x7B5E, //CJK UNIFIED IDEOGRAPH
+ 0xB95B: 0x7B5F, //CJK UNIFIED IDEOGRAPH
+ 0xB95C: 0x7B61, //CJK UNIFIED IDEOGRAPH
+ 0xB95D: 0x7B63, //CJK UNIFIED IDEOGRAPH
+ 0xB95E: 0x7B64, //CJK UNIFIED IDEOGRAPH
+ 0xB95F: 0x7B65, //CJK UNIFIED IDEOGRAPH
+ 0xB960: 0x7B66, //CJK UNIFIED IDEOGRAPH
+ 0xB961: 0x7B67, //CJK UNIFIED IDEOGRAPH
+ 0xB962: 0x7B68, //CJK UNIFIED IDEOGRAPH
+ 0xB963: 0x7B69, //CJK UNIFIED IDEOGRAPH
+ 0xB964: 0x7B6A, //CJK UNIFIED IDEOGRAPH
+ 0xB965: 0x7B6B, //CJK UNIFIED IDEOGRAPH
+ 0xB966: 0x7B6C, //CJK UNIFIED IDEOGRAPH
+ 0xB967: 0x7B6D, //CJK UNIFIED IDEOGRAPH
+ 0xB968: 0x7B6F, //CJK UNIFIED IDEOGRAPH
+ 0xB969: 0x7B70, //CJK UNIFIED IDEOGRAPH
+ 0xB96A: 0x7B73, //CJK UNIFIED IDEOGRAPH
+ 0xB96B: 0x7B74, //CJK UNIFIED IDEOGRAPH
+ 0xB96C: 0x7B76, //CJK UNIFIED IDEOGRAPH
+ 0xB96D: 0x7B78, //CJK UNIFIED IDEOGRAPH
+ 0xB96E: 0x7B7A, //CJK UNIFIED IDEOGRAPH
+ 0xB96F: 0x7B7C, //CJK UNIFIED IDEOGRAPH
+ 0xB970: 0x7B7D, //CJK UNIFIED IDEOGRAPH
+ 0xB971: 0x7B7F, //CJK UNIFIED IDEOGRAPH
+ 0xB972: 0x7B81, //CJK UNIFIED IDEOGRAPH
+ 0xB973: 0x7B82, //CJK UNIFIED IDEOGRAPH
+ 0xB974: 0x7B83, //CJK UNIFIED IDEOGRAPH
+ 0xB975: 0x7B84, //CJK UNIFIED IDEOGRAPH
+ 0xB976: 0x7B86, //CJK UNIFIED IDEOGRAPH
+ 0xB977: 0x7B87, //CJK UNIFIED IDEOGRAPH
+ 0xB978: 0x7B88, //CJK UNIFIED IDEOGRAPH
+ 0xB979: 0x7B89, //CJK UNIFIED IDEOGRAPH
+ 0xB97A: 0x7B8A, //CJK UNIFIED IDEOGRAPH
+ 0xB97B: 0x7B8B, //CJK UNIFIED IDEOGRAPH
+ 0xB97C: 0x7B8C, //CJK UNIFIED IDEOGRAPH
+ 0xB97D: 0x7B8E, //CJK UNIFIED IDEOGRAPH
+ 0xB97E: 0x7B8F, //CJK UNIFIED IDEOGRAPH
+ 0xB980: 0x7B91, //CJK UNIFIED IDEOGRAPH
+ 0xB981: 0x7B92, //CJK UNIFIED IDEOGRAPH
+ 0xB982: 0x7B93, //CJK UNIFIED IDEOGRAPH
+ 0xB983: 0x7B96, //CJK UNIFIED IDEOGRAPH
+ 0xB984: 0x7B98, //CJK UNIFIED IDEOGRAPH
+ 0xB985: 0x7B99, //CJK UNIFIED IDEOGRAPH
+ 0xB986: 0x7B9A, //CJK UNIFIED IDEOGRAPH
+ 0xB987: 0x7B9B, //CJK UNIFIED IDEOGRAPH
+ 0xB988: 0x7B9E, //CJK UNIFIED IDEOGRAPH
+ 0xB989: 0x7B9F, //CJK UNIFIED IDEOGRAPH
+ 0xB98A: 0x7BA0, //CJK UNIFIED IDEOGRAPH
+ 0xB98B: 0x7BA3, //CJK UNIFIED IDEOGRAPH
+ 0xB98C: 0x7BA4, //CJK UNIFIED IDEOGRAPH
+ 0xB98D: 0x7BA5, //CJK UNIFIED IDEOGRAPH
+ 0xB98E: 0x7BAE, //CJK UNIFIED IDEOGRAPH
+ 0xB98F: 0x7BAF, //CJK UNIFIED IDEOGRAPH
+ 0xB990: 0x7BB0, //CJK UNIFIED IDEOGRAPH
+ 0xB991: 0x7BB2, //CJK UNIFIED IDEOGRAPH
+ 0xB992: 0x7BB3, //CJK UNIFIED IDEOGRAPH
+ 0xB993: 0x7BB5, //CJK UNIFIED IDEOGRAPH
+ 0xB994: 0x7BB6, //CJK UNIFIED IDEOGRAPH
+ 0xB995: 0x7BB7, //CJK UNIFIED IDEOGRAPH
+ 0xB996: 0x7BB9, //CJK UNIFIED IDEOGRAPH
+ 0xB997: 0x7BBA, //CJK UNIFIED IDEOGRAPH
+ 0xB998: 0x7BBB, //CJK UNIFIED IDEOGRAPH
+ 0xB999: 0x7BBC, //CJK UNIFIED IDEOGRAPH
+ 0xB99A: 0x7BBD, //CJK UNIFIED IDEOGRAPH
+ 0xB99B: 0x7BBE, //CJK UNIFIED IDEOGRAPH
+ 0xB99C: 0x7BBF, //CJK UNIFIED IDEOGRAPH
+ 0xB99D: 0x7BC0, //CJK UNIFIED IDEOGRAPH
+ 0xB99E: 0x7BC2, //CJK UNIFIED IDEOGRAPH
+ 0xB99F: 0x7BC3, //CJK UNIFIED IDEOGRAPH
+ 0xB9A0: 0x7BC4, //CJK UNIFIED IDEOGRAPH
+ 0xB9A1: 0x57C2, //CJK UNIFIED IDEOGRAPH
+ 0xB9A2: 0x803F, //CJK UNIFIED IDEOGRAPH
+ 0xB9A3: 0x6897, //CJK UNIFIED IDEOGRAPH
+ 0xB9A4: 0x5DE5, //CJK UNIFIED IDEOGRAPH
+ 0xB9A5: 0x653B, //CJK UNIFIED IDEOGRAPH
+ 0xB9A6: 0x529F, //CJK UNIFIED IDEOGRAPH
+ 0xB9A7: 0x606D, //CJK UNIFIED IDEOGRAPH
+ 0xB9A8: 0x9F9A, //CJK UNIFIED IDEOGRAPH
+ 0xB9A9: 0x4F9B, //CJK UNIFIED IDEOGRAPH
+ 0xB9AA: 0x8EAC, //CJK UNIFIED IDEOGRAPH
+ 0xB9AB: 0x516C, //CJK UNIFIED IDEOGRAPH
+ 0xB9AC: 0x5BAB, //CJK UNIFIED IDEOGRAPH
+ 0xB9AD: 0x5F13, //CJK UNIFIED IDEOGRAPH
+ 0xB9AE: 0x5DE9, //CJK UNIFIED IDEOGRAPH
+ 0xB9AF: 0x6C5E, //CJK UNIFIED IDEOGRAPH
+ 0xB9B0: 0x62F1, //CJK UNIFIED IDEOGRAPH
+ 0xB9B1: 0x8D21, //CJK UNIFIED IDEOGRAPH
+ 0xB9B2: 0x5171, //CJK UNIFIED IDEOGRAPH
+ 0xB9B3: 0x94A9, //CJK UNIFIED IDEOGRAPH
+ 0xB9B4: 0x52FE, //CJK UNIFIED IDEOGRAPH
+ 0xB9B5: 0x6C9F, //CJK UNIFIED IDEOGRAPH
+ 0xB9B6: 0x82DF, //CJK UNIFIED IDEOGRAPH
+ 0xB9B7: 0x72D7, //CJK UNIFIED IDEOGRAPH
+ 0xB9B8: 0x57A2, //CJK UNIFIED IDEOGRAPH
+ 0xB9B9: 0x6784, //CJK UNIFIED IDEOGRAPH
+ 0xB9BA: 0x8D2D, //CJK UNIFIED IDEOGRAPH
+ 0xB9BB: 0x591F, //CJK UNIFIED IDEOGRAPH
+ 0xB9BC: 0x8F9C, //CJK UNIFIED IDEOGRAPH
+ 0xB9BD: 0x83C7, //CJK UNIFIED IDEOGRAPH
+ 0xB9BE: 0x5495, //CJK UNIFIED IDEOGRAPH
+ 0xB9BF: 0x7B8D, //CJK UNIFIED IDEOGRAPH
+ 0xB9C0: 0x4F30, //CJK UNIFIED IDEOGRAPH
+ 0xB9C1: 0x6CBD, //CJK UNIFIED IDEOGRAPH
+ 0xB9C2: 0x5B64, //CJK UNIFIED IDEOGRAPH
+ 0xB9C3: 0x59D1, //CJK UNIFIED IDEOGRAPH
+ 0xB9C4: 0x9F13, //CJK UNIFIED IDEOGRAPH
+ 0xB9C5: 0x53E4, //CJK UNIFIED IDEOGRAPH
+ 0xB9C6: 0x86CA, //CJK UNIFIED IDEOGRAPH
+ 0xB9C7: 0x9AA8, //CJK UNIFIED IDEOGRAPH
+ 0xB9C8: 0x8C37, //CJK UNIFIED IDEOGRAPH
+ 0xB9C9: 0x80A1, //CJK UNIFIED IDEOGRAPH
+ 0xB9CA: 0x6545, //CJK UNIFIED IDEOGRAPH
+ 0xB9CB: 0x987E, //CJK UNIFIED IDEOGRAPH
+ 0xB9CC: 0x56FA, //CJK UNIFIED IDEOGRAPH
+ 0xB9CD: 0x96C7, //CJK UNIFIED IDEOGRAPH
+ 0xB9CE: 0x522E, //CJK UNIFIED IDEOGRAPH
+ 0xB9CF: 0x74DC, //CJK UNIFIED IDEOGRAPH
+ 0xB9D0: 0x5250, //CJK UNIFIED IDEOGRAPH
+ 0xB9D1: 0x5BE1, //CJK UNIFIED IDEOGRAPH
+ 0xB9D2: 0x6302, //CJK UNIFIED IDEOGRAPH
+ 0xB9D3: 0x8902, //CJK UNIFIED IDEOGRAPH
+ 0xB9D4: 0x4E56, //CJK UNIFIED IDEOGRAPH
+ 0xB9D5: 0x62D0, //CJK UNIFIED IDEOGRAPH
+ 0xB9D6: 0x602A, //CJK UNIFIED IDEOGRAPH
+ 0xB9D7: 0x68FA, //CJK UNIFIED IDEOGRAPH
+ 0xB9D8: 0x5173, //CJK UNIFIED IDEOGRAPH
+ 0xB9D9: 0x5B98, //CJK UNIFIED IDEOGRAPH
+ 0xB9DA: 0x51A0, //CJK UNIFIED IDEOGRAPH
+ 0xB9DB: 0x89C2, //CJK UNIFIED IDEOGRAPH
+ 0xB9DC: 0x7BA1, //CJK UNIFIED IDEOGRAPH
+ 0xB9DD: 0x9986, //CJK UNIFIED IDEOGRAPH
+ 0xB9DE: 0x7F50, //CJK UNIFIED IDEOGRAPH
+ 0xB9DF: 0x60EF, //CJK UNIFIED IDEOGRAPH
+ 0xB9E0: 0x704C, //CJK UNIFIED IDEOGRAPH
+ 0xB9E1: 0x8D2F, //CJK UNIFIED IDEOGRAPH
+ 0xB9E2: 0x5149, //CJK UNIFIED IDEOGRAPH
+ 0xB9E3: 0x5E7F, //CJK UNIFIED IDEOGRAPH
+ 0xB9E4: 0x901B, //CJK UNIFIED IDEOGRAPH
+ 0xB9E5: 0x7470, //CJK UNIFIED IDEOGRAPH
+ 0xB9E6: 0x89C4, //CJK UNIFIED IDEOGRAPH
+ 0xB9E7: 0x572D, //CJK UNIFIED IDEOGRAPH
+ 0xB9E8: 0x7845, //CJK UNIFIED IDEOGRAPH
+ 0xB9E9: 0x5F52, //CJK UNIFIED IDEOGRAPH
+ 0xB9EA: 0x9F9F, //CJK UNIFIED IDEOGRAPH
+ 0xB9EB: 0x95FA, //CJK UNIFIED IDEOGRAPH
+ 0xB9EC: 0x8F68, //CJK UNIFIED IDEOGRAPH
+ 0xB9ED: 0x9B3C, //CJK UNIFIED IDEOGRAPH
+ 0xB9EE: 0x8BE1, //CJK UNIFIED IDEOGRAPH
+ 0xB9EF: 0x7678, //CJK UNIFIED IDEOGRAPH
+ 0xB9F0: 0x6842, //CJK UNIFIED IDEOGRAPH
+ 0xB9F1: 0x67DC, //CJK UNIFIED IDEOGRAPH
+ 0xB9F2: 0x8DEA, //CJK UNIFIED IDEOGRAPH
+ 0xB9F3: 0x8D35, //CJK UNIFIED IDEOGRAPH
+ 0xB9F4: 0x523D, //CJK UNIFIED IDEOGRAPH
+ 0xB9F5: 0x8F8A, //CJK UNIFIED IDEOGRAPH
+ 0xB9F6: 0x6EDA, //CJK UNIFIED IDEOGRAPH
+ 0xB9F7: 0x68CD, //CJK UNIFIED IDEOGRAPH
+ 0xB9F8: 0x9505, //CJK UNIFIED IDEOGRAPH
+ 0xB9F9: 0x90ED, //CJK UNIFIED IDEOGRAPH
+ 0xB9FA: 0x56FD, //CJK UNIFIED IDEOGRAPH
+ 0xB9FB: 0x679C, //CJK UNIFIED IDEOGRAPH
+ 0xB9FC: 0x88F9, //CJK UNIFIED IDEOGRAPH
+ 0xB9FD: 0x8FC7, //CJK UNIFIED IDEOGRAPH
+ 0xB9FE: 0x54C8, //CJK UNIFIED IDEOGRAPH
+ 0xBA40: 0x7BC5, //CJK UNIFIED IDEOGRAPH
+ 0xBA41: 0x7BC8, //CJK UNIFIED IDEOGRAPH
+ 0xBA42: 0x7BC9, //CJK UNIFIED IDEOGRAPH
+ 0xBA43: 0x7BCA, //CJK UNIFIED IDEOGRAPH
+ 0xBA44: 0x7BCB, //CJK UNIFIED IDEOGRAPH
+ 0xBA45: 0x7BCD, //CJK UNIFIED IDEOGRAPH
+ 0xBA46: 0x7BCE, //CJK UNIFIED IDEOGRAPH
+ 0xBA47: 0x7BCF, //CJK UNIFIED IDEOGRAPH
+ 0xBA48: 0x7BD0, //CJK UNIFIED IDEOGRAPH
+ 0xBA49: 0x7BD2, //CJK UNIFIED IDEOGRAPH
+ 0xBA4A: 0x7BD4, //CJK UNIFIED IDEOGRAPH
+ 0xBA4B: 0x7BD5, //CJK UNIFIED IDEOGRAPH
+ 0xBA4C: 0x7BD6, //CJK UNIFIED IDEOGRAPH
+ 0xBA4D: 0x7BD7, //CJK UNIFIED IDEOGRAPH
+ 0xBA4E: 0x7BD8, //CJK UNIFIED IDEOGRAPH
+ 0xBA4F: 0x7BDB, //CJK UNIFIED IDEOGRAPH
+ 0xBA50: 0x7BDC, //CJK UNIFIED IDEOGRAPH
+ 0xBA51: 0x7BDE, //CJK UNIFIED IDEOGRAPH
+ 0xBA52: 0x7BDF, //CJK UNIFIED IDEOGRAPH
+ 0xBA53: 0x7BE0, //CJK UNIFIED IDEOGRAPH
+ 0xBA54: 0x7BE2, //CJK UNIFIED IDEOGRAPH
+ 0xBA55: 0x7BE3, //CJK UNIFIED IDEOGRAPH
+ 0xBA56: 0x7BE4, //CJK UNIFIED IDEOGRAPH
+ 0xBA57: 0x7BE7, //CJK UNIFIED IDEOGRAPH
+ 0xBA58: 0x7BE8, //CJK UNIFIED IDEOGRAPH
+ 0xBA59: 0x7BE9, //CJK UNIFIED IDEOGRAPH
+ 0xBA5A: 0x7BEB, //CJK UNIFIED IDEOGRAPH
+ 0xBA5B: 0x7BEC, //CJK UNIFIED IDEOGRAPH
+ 0xBA5C: 0x7BED, //CJK UNIFIED IDEOGRAPH
+ 0xBA5D: 0x7BEF, //CJK UNIFIED IDEOGRAPH
+ 0xBA5E: 0x7BF0, //CJK UNIFIED IDEOGRAPH
+ 0xBA5F: 0x7BF2, //CJK UNIFIED IDEOGRAPH
+ 0xBA60: 0x7BF3, //CJK UNIFIED IDEOGRAPH
+ 0xBA61: 0x7BF4, //CJK UNIFIED IDEOGRAPH
+ 0xBA62: 0x7BF5, //CJK UNIFIED IDEOGRAPH
+ 0xBA63: 0x7BF6, //CJK UNIFIED IDEOGRAPH
+ 0xBA64: 0x7BF8, //CJK UNIFIED IDEOGRAPH
+ 0xBA65: 0x7BF9, //CJK UNIFIED IDEOGRAPH
+ 0xBA66: 0x7BFA, //CJK UNIFIED IDEOGRAPH
+ 0xBA67: 0x7BFB, //CJK UNIFIED IDEOGRAPH
+ 0xBA68: 0x7BFD, //CJK UNIFIED IDEOGRAPH
+ 0xBA69: 0x7BFF, //CJK UNIFIED IDEOGRAPH
+ 0xBA6A: 0x7C00, //CJK UNIFIED IDEOGRAPH
+ 0xBA6B: 0x7C01, //CJK UNIFIED IDEOGRAPH
+ 0xBA6C: 0x7C02, //CJK UNIFIED IDEOGRAPH
+ 0xBA6D: 0x7C03, //CJK UNIFIED IDEOGRAPH
+ 0xBA6E: 0x7C04, //CJK UNIFIED IDEOGRAPH
+ 0xBA6F: 0x7C05, //CJK UNIFIED IDEOGRAPH
+ 0xBA70: 0x7C06, //CJK UNIFIED IDEOGRAPH
+ 0xBA71: 0x7C08, //CJK UNIFIED IDEOGRAPH
+ 0xBA72: 0x7C09, //CJK UNIFIED IDEOGRAPH
+ 0xBA73: 0x7C0A, //CJK UNIFIED IDEOGRAPH
+ 0xBA74: 0x7C0D, //CJK UNIFIED IDEOGRAPH
+ 0xBA75: 0x7C0E, //CJK UNIFIED IDEOGRAPH
+ 0xBA76: 0x7C10, //CJK UNIFIED IDEOGRAPH
+ 0xBA77: 0x7C11, //CJK UNIFIED IDEOGRAPH
+ 0xBA78: 0x7C12, //CJK UNIFIED IDEOGRAPH
+ 0xBA79: 0x7C13, //CJK UNIFIED IDEOGRAPH
+ 0xBA7A: 0x7C14, //CJK UNIFIED IDEOGRAPH
+ 0xBA7B: 0x7C15, //CJK UNIFIED IDEOGRAPH
+ 0xBA7C: 0x7C17, //CJK UNIFIED IDEOGRAPH
+ 0xBA7D: 0x7C18, //CJK UNIFIED IDEOGRAPH
+ 0xBA7E: 0x7C19, //CJK UNIFIED IDEOGRAPH
+ 0xBA80: 0x7C1A, //CJK UNIFIED IDEOGRAPH
+ 0xBA81: 0x7C1B, //CJK UNIFIED IDEOGRAPH
+ 0xBA82: 0x7C1C, //CJK UNIFIED IDEOGRAPH
+ 0xBA83: 0x7C1D, //CJK UNIFIED IDEOGRAPH
+ 0xBA84: 0x7C1E, //CJK UNIFIED IDEOGRAPH
+ 0xBA85: 0x7C20, //CJK UNIFIED IDEOGRAPH
+ 0xBA86: 0x7C21, //CJK UNIFIED IDEOGRAPH
+ 0xBA87: 0x7C22, //CJK UNIFIED IDEOGRAPH
+ 0xBA88: 0x7C23, //CJK UNIFIED IDEOGRAPH
+ 0xBA89: 0x7C24, //CJK UNIFIED IDEOGRAPH
+ 0xBA8A: 0x7C25, //CJK UNIFIED IDEOGRAPH
+ 0xBA8B: 0x7C28, //CJK UNIFIED IDEOGRAPH
+ 0xBA8C: 0x7C29, //CJK UNIFIED IDEOGRAPH
+ 0xBA8D: 0x7C2B, //CJK UNIFIED IDEOGRAPH
+ 0xBA8E: 0x7C2C, //CJK UNIFIED IDEOGRAPH
+ 0xBA8F: 0x7C2D, //CJK UNIFIED IDEOGRAPH
+ 0xBA90: 0x7C2E, //CJK UNIFIED IDEOGRAPH
+ 0xBA91: 0x7C2F, //CJK UNIFIED IDEOGRAPH
+ 0xBA92: 0x7C30, //CJK UNIFIED IDEOGRAPH
+ 0xBA93: 0x7C31, //CJK UNIFIED IDEOGRAPH
+ 0xBA94: 0x7C32, //CJK UNIFIED IDEOGRAPH
+ 0xBA95: 0x7C33, //CJK UNIFIED IDEOGRAPH
+ 0xBA96: 0x7C34, //CJK UNIFIED IDEOGRAPH
+ 0xBA97: 0x7C35, //CJK UNIFIED IDEOGRAPH
+ 0xBA98: 0x7C36, //CJK UNIFIED IDEOGRAPH
+ 0xBA99: 0x7C37, //CJK UNIFIED IDEOGRAPH
+ 0xBA9A: 0x7C39, //CJK UNIFIED IDEOGRAPH
+ 0xBA9B: 0x7C3A, //CJK UNIFIED IDEOGRAPH
+ 0xBA9C: 0x7C3B, //CJK UNIFIED IDEOGRAPH
+ 0xBA9D: 0x7C3C, //CJK UNIFIED IDEOGRAPH
+ 0xBA9E: 0x7C3D, //CJK UNIFIED IDEOGRAPH
+ 0xBA9F: 0x7C3E, //CJK UNIFIED IDEOGRAPH
+ 0xBAA0: 0x7C42, //CJK UNIFIED IDEOGRAPH
+ 0xBAA1: 0x9AB8, //CJK UNIFIED IDEOGRAPH
+ 0xBAA2: 0x5B69, //CJK UNIFIED IDEOGRAPH
+ 0xBAA3: 0x6D77, //CJK UNIFIED IDEOGRAPH
+ 0xBAA4: 0x6C26, //CJK UNIFIED IDEOGRAPH
+ 0xBAA5: 0x4EA5, //CJK UNIFIED IDEOGRAPH
+ 0xBAA6: 0x5BB3, //CJK UNIFIED IDEOGRAPH
+ 0xBAA7: 0x9A87, //CJK UNIFIED IDEOGRAPH
+ 0xBAA8: 0x9163, //CJK UNIFIED IDEOGRAPH
+ 0xBAA9: 0x61A8, //CJK UNIFIED IDEOGRAPH
+ 0xBAAA: 0x90AF, //CJK UNIFIED IDEOGRAPH
+ 0xBAAB: 0x97E9, //CJK UNIFIED IDEOGRAPH
+ 0xBAAC: 0x542B, //CJK UNIFIED IDEOGRAPH
+ 0xBAAD: 0x6DB5, //CJK UNIFIED IDEOGRAPH
+ 0xBAAE: 0x5BD2, //CJK UNIFIED IDEOGRAPH
+ 0xBAAF: 0x51FD, //CJK UNIFIED IDEOGRAPH
+ 0xBAB0: 0x558A, //CJK UNIFIED IDEOGRAPH
+ 0xBAB1: 0x7F55, //CJK UNIFIED IDEOGRAPH
+ 0xBAB2: 0x7FF0, //CJK UNIFIED IDEOGRAPH
+ 0xBAB3: 0x64BC, //CJK UNIFIED IDEOGRAPH
+ 0xBAB4: 0x634D, //CJK UNIFIED IDEOGRAPH
+ 0xBAB5: 0x65F1, //CJK UNIFIED IDEOGRAPH
+ 0xBAB6: 0x61BE, //CJK UNIFIED IDEOGRAPH
+ 0xBAB7: 0x608D, //CJK UNIFIED IDEOGRAPH
+ 0xBAB8: 0x710A, //CJK UNIFIED IDEOGRAPH
+ 0xBAB9: 0x6C57, //CJK UNIFIED IDEOGRAPH
+ 0xBABA: 0x6C49, //CJK UNIFIED IDEOGRAPH
+ 0xBABB: 0x592F, //CJK UNIFIED IDEOGRAPH
+ 0xBABC: 0x676D, //CJK UNIFIED IDEOGRAPH
+ 0xBABD: 0x822A, //CJK UNIFIED IDEOGRAPH
+ 0xBABE: 0x58D5, //CJK UNIFIED IDEOGRAPH
+ 0xBABF: 0x568E, //CJK UNIFIED IDEOGRAPH
+ 0xBAC0: 0x8C6A, //CJK UNIFIED IDEOGRAPH
+ 0xBAC1: 0x6BEB, //CJK UNIFIED IDEOGRAPH
+ 0xBAC2: 0x90DD, //CJK UNIFIED IDEOGRAPH
+ 0xBAC3: 0x597D, //CJK UNIFIED IDEOGRAPH
+ 0xBAC4: 0x8017, //CJK UNIFIED IDEOGRAPH
+ 0xBAC5: 0x53F7, //CJK UNIFIED IDEOGRAPH
+ 0xBAC6: 0x6D69, //CJK UNIFIED IDEOGRAPH
+ 0xBAC7: 0x5475, //CJK UNIFIED IDEOGRAPH
+ 0xBAC8: 0x559D, //CJK UNIFIED IDEOGRAPH
+ 0xBAC9: 0x8377, //CJK UNIFIED IDEOGRAPH
+ 0xBACA: 0x83CF, //CJK UNIFIED IDEOGRAPH
+ 0xBACB: 0x6838, //CJK UNIFIED IDEOGRAPH
+ 0xBACC: 0x79BE, //CJK UNIFIED IDEOGRAPH
+ 0xBACD: 0x548C, //CJK UNIFIED IDEOGRAPH
+ 0xBACE: 0x4F55, //CJK UNIFIED IDEOGRAPH
+ 0xBACF: 0x5408, //CJK UNIFIED IDEOGRAPH
+ 0xBAD0: 0x76D2, //CJK UNIFIED IDEOGRAPH
+ 0xBAD1: 0x8C89, //CJK UNIFIED IDEOGRAPH
+ 0xBAD2: 0x9602, //CJK UNIFIED IDEOGRAPH
+ 0xBAD3: 0x6CB3, //CJK UNIFIED IDEOGRAPH
+ 0xBAD4: 0x6DB8, //CJK UNIFIED IDEOGRAPH
+ 0xBAD5: 0x8D6B, //CJK UNIFIED IDEOGRAPH
+ 0xBAD6: 0x8910, //CJK UNIFIED IDEOGRAPH
+ 0xBAD7: 0x9E64, //CJK UNIFIED IDEOGRAPH
+ 0xBAD8: 0x8D3A, //CJK UNIFIED IDEOGRAPH
+ 0xBAD9: 0x563F, //CJK UNIFIED IDEOGRAPH
+ 0xBADA: 0x9ED1, //CJK UNIFIED IDEOGRAPH
+ 0xBADB: 0x75D5, //CJK UNIFIED IDEOGRAPH
+ 0xBADC: 0x5F88, //CJK UNIFIED IDEOGRAPH
+ 0xBADD: 0x72E0, //CJK UNIFIED IDEOGRAPH
+ 0xBADE: 0x6068, //CJK UNIFIED IDEOGRAPH
+ 0xBADF: 0x54FC, //CJK UNIFIED IDEOGRAPH
+ 0xBAE0: 0x4EA8, //CJK UNIFIED IDEOGRAPH
+ 0xBAE1: 0x6A2A, //CJK UNIFIED IDEOGRAPH
+ 0xBAE2: 0x8861, //CJK UNIFIED IDEOGRAPH
+ 0xBAE3: 0x6052, //CJK UNIFIED IDEOGRAPH
+ 0xBAE4: 0x8F70, //CJK UNIFIED IDEOGRAPH
+ 0xBAE5: 0x54C4, //CJK UNIFIED IDEOGRAPH
+ 0xBAE6: 0x70D8, //CJK UNIFIED IDEOGRAPH
+ 0xBAE7: 0x8679, //CJK UNIFIED IDEOGRAPH
+ 0xBAE8: 0x9E3F, //CJK UNIFIED IDEOGRAPH
+ 0xBAE9: 0x6D2A, //CJK UNIFIED IDEOGRAPH
+ 0xBAEA: 0x5B8F, //CJK UNIFIED IDEOGRAPH
+ 0xBAEB: 0x5F18, //CJK UNIFIED IDEOGRAPH
+ 0xBAEC: 0x7EA2, //CJK UNIFIED IDEOGRAPH
+ 0xBAED: 0x5589, //CJK UNIFIED IDEOGRAPH
+ 0xBAEE: 0x4FAF, //CJK UNIFIED IDEOGRAPH
+ 0xBAEF: 0x7334, //CJK UNIFIED IDEOGRAPH
+ 0xBAF0: 0x543C, //CJK UNIFIED IDEOGRAPH
+ 0xBAF1: 0x539A, //CJK UNIFIED IDEOGRAPH
+ 0xBAF2: 0x5019, //CJK UNIFIED IDEOGRAPH
+ 0xBAF3: 0x540E, //CJK UNIFIED IDEOGRAPH
+ 0xBAF4: 0x547C, //CJK UNIFIED IDEOGRAPH
+ 0xBAF5: 0x4E4E, //CJK UNIFIED IDEOGRAPH
+ 0xBAF6: 0x5FFD, //CJK UNIFIED IDEOGRAPH
+ 0xBAF7: 0x745A, //CJK UNIFIED IDEOGRAPH
+ 0xBAF8: 0x58F6, //CJK UNIFIED IDEOGRAPH
+ 0xBAF9: 0x846B, //CJK UNIFIED IDEOGRAPH
+ 0xBAFA: 0x80E1, //CJK UNIFIED IDEOGRAPH
+ 0xBAFB: 0x8774, //CJK UNIFIED IDEOGRAPH
+ 0xBAFC: 0x72D0, //CJK UNIFIED IDEOGRAPH
+ 0xBAFD: 0x7CCA, //CJK UNIFIED IDEOGRAPH
+ 0xBAFE: 0x6E56, //CJK UNIFIED IDEOGRAPH
+ 0xBB40: 0x7C43, //CJK UNIFIED IDEOGRAPH
+ 0xBB41: 0x7C44, //CJK UNIFIED IDEOGRAPH
+ 0xBB42: 0x7C45, //CJK UNIFIED IDEOGRAPH
+ 0xBB43: 0x7C46, //CJK UNIFIED IDEOGRAPH
+ 0xBB44: 0x7C47, //CJK UNIFIED IDEOGRAPH
+ 0xBB45: 0x7C48, //CJK UNIFIED IDEOGRAPH
+ 0xBB46: 0x7C49, //CJK UNIFIED IDEOGRAPH
+ 0xBB47: 0x7C4A, //CJK UNIFIED IDEOGRAPH
+ 0xBB48: 0x7C4B, //CJK UNIFIED IDEOGRAPH
+ 0xBB49: 0x7C4C, //CJK UNIFIED IDEOGRAPH
+ 0xBB4A: 0x7C4E, //CJK UNIFIED IDEOGRAPH
+ 0xBB4B: 0x7C4F, //CJK UNIFIED IDEOGRAPH
+ 0xBB4C: 0x7C50, //CJK UNIFIED IDEOGRAPH
+ 0xBB4D: 0x7C51, //CJK UNIFIED IDEOGRAPH
+ 0xBB4E: 0x7C52, //CJK UNIFIED IDEOGRAPH
+ 0xBB4F: 0x7C53, //CJK UNIFIED IDEOGRAPH
+ 0xBB50: 0x7C54, //CJK UNIFIED IDEOGRAPH
+ 0xBB51: 0x7C55, //CJK UNIFIED IDEOGRAPH
+ 0xBB52: 0x7C56, //CJK UNIFIED IDEOGRAPH
+ 0xBB53: 0x7C57, //CJK UNIFIED IDEOGRAPH
+ 0xBB54: 0x7C58, //CJK UNIFIED IDEOGRAPH
+ 0xBB55: 0x7C59, //CJK UNIFIED IDEOGRAPH
+ 0xBB56: 0x7C5A, //CJK UNIFIED IDEOGRAPH
+ 0xBB57: 0x7C5B, //CJK UNIFIED IDEOGRAPH
+ 0xBB58: 0x7C5C, //CJK UNIFIED IDEOGRAPH
+ 0xBB59: 0x7C5D, //CJK UNIFIED IDEOGRAPH
+ 0xBB5A: 0x7C5E, //CJK UNIFIED IDEOGRAPH
+ 0xBB5B: 0x7C5F, //CJK UNIFIED IDEOGRAPH
+ 0xBB5C: 0x7C60, //CJK UNIFIED IDEOGRAPH
+ 0xBB5D: 0x7C61, //CJK UNIFIED IDEOGRAPH
+ 0xBB5E: 0x7C62, //CJK UNIFIED IDEOGRAPH
+ 0xBB5F: 0x7C63, //CJK UNIFIED IDEOGRAPH
+ 0xBB60: 0x7C64, //CJK UNIFIED IDEOGRAPH
+ 0xBB61: 0x7C65, //CJK UNIFIED IDEOGRAPH
+ 0xBB62: 0x7C66, //CJK UNIFIED IDEOGRAPH
+ 0xBB63: 0x7C67, //CJK UNIFIED IDEOGRAPH
+ 0xBB64: 0x7C68, //CJK UNIFIED IDEOGRAPH
+ 0xBB65: 0x7C69, //CJK UNIFIED IDEOGRAPH
+ 0xBB66: 0x7C6A, //CJK UNIFIED IDEOGRAPH
+ 0xBB67: 0x7C6B, //CJK UNIFIED IDEOGRAPH
+ 0xBB68: 0x7C6C, //CJK UNIFIED IDEOGRAPH
+ 0xBB69: 0x7C6D, //CJK UNIFIED IDEOGRAPH
+ 0xBB6A: 0x7C6E, //CJK UNIFIED IDEOGRAPH
+ 0xBB6B: 0x7C6F, //CJK UNIFIED IDEOGRAPH
+ 0xBB6C: 0x7C70, //CJK UNIFIED IDEOGRAPH
+ 0xBB6D: 0x7C71, //CJK UNIFIED IDEOGRAPH
+ 0xBB6E: 0x7C72, //CJK UNIFIED IDEOGRAPH
+ 0xBB6F: 0x7C75, //CJK UNIFIED IDEOGRAPH
+ 0xBB70: 0x7C76, //CJK UNIFIED IDEOGRAPH
+ 0xBB71: 0x7C77, //CJK UNIFIED IDEOGRAPH
+ 0xBB72: 0x7C78, //CJK UNIFIED IDEOGRAPH
+ 0xBB73: 0x7C79, //CJK UNIFIED IDEOGRAPH
+ 0xBB74: 0x7C7A, //CJK UNIFIED IDEOGRAPH
+ 0xBB75: 0x7C7E, //CJK UNIFIED IDEOGRAPH
+ 0xBB76: 0x7C7F, //CJK UNIFIED IDEOGRAPH
+ 0xBB77: 0x7C80, //CJK UNIFIED IDEOGRAPH
+ 0xBB78: 0x7C81, //CJK UNIFIED IDEOGRAPH
+ 0xBB79: 0x7C82, //CJK UNIFIED IDEOGRAPH
+ 0xBB7A: 0x7C83, //CJK UNIFIED IDEOGRAPH
+ 0xBB7B: 0x7C84, //CJK UNIFIED IDEOGRAPH
+ 0xBB7C: 0x7C85, //CJK UNIFIED IDEOGRAPH
+ 0xBB7D: 0x7C86, //CJK UNIFIED IDEOGRAPH
+ 0xBB7E: 0x7C87, //CJK UNIFIED IDEOGRAPH
+ 0xBB80: 0x7C88, //CJK UNIFIED IDEOGRAPH
+ 0xBB81: 0x7C8A, //CJK UNIFIED IDEOGRAPH
+ 0xBB82: 0x7C8B, //CJK UNIFIED IDEOGRAPH
+ 0xBB83: 0x7C8C, //CJK UNIFIED IDEOGRAPH
+ 0xBB84: 0x7C8D, //CJK UNIFIED IDEOGRAPH
+ 0xBB85: 0x7C8E, //CJK UNIFIED IDEOGRAPH
+ 0xBB86: 0x7C8F, //CJK UNIFIED IDEOGRAPH
+ 0xBB87: 0x7C90, //CJK UNIFIED IDEOGRAPH
+ 0xBB88: 0x7C93, //CJK UNIFIED IDEOGRAPH
+ 0xBB89: 0x7C94, //CJK UNIFIED IDEOGRAPH
+ 0xBB8A: 0x7C96, //CJK UNIFIED IDEOGRAPH
+ 0xBB8B: 0x7C99, //CJK UNIFIED IDEOGRAPH
+ 0xBB8C: 0x7C9A, //CJK UNIFIED IDEOGRAPH
+ 0xBB8D: 0x7C9B, //CJK UNIFIED IDEOGRAPH
+ 0xBB8E: 0x7CA0, //CJK UNIFIED IDEOGRAPH
+ 0xBB8F: 0x7CA1, //CJK UNIFIED IDEOGRAPH
+ 0xBB90: 0x7CA3, //CJK UNIFIED IDEOGRAPH
+ 0xBB91: 0x7CA6, //CJK UNIFIED IDEOGRAPH
+ 0xBB92: 0x7CA7, //CJK UNIFIED IDEOGRAPH
+ 0xBB93: 0x7CA8, //CJK UNIFIED IDEOGRAPH
+ 0xBB94: 0x7CA9, //CJK UNIFIED IDEOGRAPH
+ 0xBB95: 0x7CAB, //CJK UNIFIED IDEOGRAPH
+ 0xBB96: 0x7CAC, //CJK UNIFIED IDEOGRAPH
+ 0xBB97: 0x7CAD, //CJK UNIFIED IDEOGRAPH
+ 0xBB98: 0x7CAF, //CJK UNIFIED IDEOGRAPH
+ 0xBB99: 0x7CB0, //CJK UNIFIED IDEOGRAPH
+ 0xBB9A: 0x7CB4, //CJK UNIFIED IDEOGRAPH
+ 0xBB9B: 0x7CB5, //CJK UNIFIED IDEOGRAPH
+ 0xBB9C: 0x7CB6, //CJK UNIFIED IDEOGRAPH
+ 0xBB9D: 0x7CB7, //CJK UNIFIED IDEOGRAPH
+ 0xBB9E: 0x7CB8, //CJK UNIFIED IDEOGRAPH
+ 0xBB9F: 0x7CBA, //CJK UNIFIED IDEOGRAPH
+ 0xBBA0: 0x7CBB, //CJK UNIFIED IDEOGRAPH
+ 0xBBA1: 0x5F27, //CJK UNIFIED IDEOGRAPH
+ 0xBBA2: 0x864E, //CJK UNIFIED IDEOGRAPH
+ 0xBBA3: 0x552C, //CJK UNIFIED IDEOGRAPH
+ 0xBBA4: 0x62A4, //CJK UNIFIED IDEOGRAPH
+ 0xBBA5: 0x4E92, //CJK UNIFIED IDEOGRAPH
+ 0xBBA6: 0x6CAA, //CJK UNIFIED IDEOGRAPH
+ 0xBBA7: 0x6237, //CJK UNIFIED IDEOGRAPH
+ 0xBBA8: 0x82B1, //CJK UNIFIED IDEOGRAPH
+ 0xBBA9: 0x54D7, //CJK UNIFIED IDEOGRAPH
+ 0xBBAA: 0x534E, //CJK UNIFIED IDEOGRAPH
+ 0xBBAB: 0x733E, //CJK UNIFIED IDEOGRAPH
+ 0xBBAC: 0x6ED1, //CJK UNIFIED IDEOGRAPH
+ 0xBBAD: 0x753B, //CJK UNIFIED IDEOGRAPH
+ 0xBBAE: 0x5212, //CJK UNIFIED IDEOGRAPH
+ 0xBBAF: 0x5316, //CJK UNIFIED IDEOGRAPH
+ 0xBBB0: 0x8BDD, //CJK UNIFIED IDEOGRAPH
+ 0xBBB1: 0x69D0, //CJK UNIFIED IDEOGRAPH
+ 0xBBB2: 0x5F8A, //CJK UNIFIED IDEOGRAPH
+ 0xBBB3: 0x6000, //CJK UNIFIED IDEOGRAPH
+ 0xBBB4: 0x6DEE, //CJK UNIFIED IDEOGRAPH
+ 0xBBB5: 0x574F, //CJK UNIFIED IDEOGRAPH
+ 0xBBB6: 0x6B22, //CJK UNIFIED IDEOGRAPH
+ 0xBBB7: 0x73AF, //CJK UNIFIED IDEOGRAPH
+ 0xBBB8: 0x6853, //CJK UNIFIED IDEOGRAPH
+ 0xBBB9: 0x8FD8, //CJK UNIFIED IDEOGRAPH
+ 0xBBBA: 0x7F13, //CJK UNIFIED IDEOGRAPH
+ 0xBBBB: 0x6362, //CJK UNIFIED IDEOGRAPH
+ 0xBBBC: 0x60A3, //CJK UNIFIED IDEOGRAPH
+ 0xBBBD: 0x5524, //CJK UNIFIED IDEOGRAPH
+ 0xBBBE: 0x75EA, //CJK UNIFIED IDEOGRAPH
+ 0xBBBF: 0x8C62, //CJK UNIFIED IDEOGRAPH
+ 0xBBC0: 0x7115, //CJK UNIFIED IDEOGRAPH
+ 0xBBC1: 0x6DA3, //CJK UNIFIED IDEOGRAPH
+ 0xBBC2: 0x5BA6, //CJK UNIFIED IDEOGRAPH
+ 0xBBC3: 0x5E7B, //CJK UNIFIED IDEOGRAPH
+ 0xBBC4: 0x8352, //CJK UNIFIED IDEOGRAPH
+ 0xBBC5: 0x614C, //CJK UNIFIED IDEOGRAPH
+ 0xBBC6: 0x9EC4, //CJK UNIFIED IDEOGRAPH
+ 0xBBC7: 0x78FA, //CJK UNIFIED IDEOGRAPH
+ 0xBBC8: 0x8757, //CJK UNIFIED IDEOGRAPH
+ 0xBBC9: 0x7C27, //CJK UNIFIED IDEOGRAPH
+ 0xBBCA: 0x7687, //CJK UNIFIED IDEOGRAPH
+ 0xBBCB: 0x51F0, //CJK UNIFIED IDEOGRAPH
+ 0xBBCC: 0x60F6, //CJK UNIFIED IDEOGRAPH
+ 0xBBCD: 0x714C, //CJK UNIFIED IDEOGRAPH
+ 0xBBCE: 0x6643, //CJK UNIFIED IDEOGRAPH
+ 0xBBCF: 0x5E4C, //CJK UNIFIED IDEOGRAPH
+ 0xBBD0: 0x604D, //CJK UNIFIED IDEOGRAPH
+ 0xBBD1: 0x8C0E, //CJK UNIFIED IDEOGRAPH
+ 0xBBD2: 0x7070, //CJK UNIFIED IDEOGRAPH
+ 0xBBD3: 0x6325, //CJK UNIFIED IDEOGRAPH
+ 0xBBD4: 0x8F89, //CJK UNIFIED IDEOGRAPH
+ 0xBBD5: 0x5FBD, //CJK UNIFIED IDEOGRAPH
+ 0xBBD6: 0x6062, //CJK UNIFIED IDEOGRAPH
+ 0xBBD7: 0x86D4, //CJK UNIFIED IDEOGRAPH
+ 0xBBD8: 0x56DE, //CJK UNIFIED IDEOGRAPH
+ 0xBBD9: 0x6BC1, //CJK UNIFIED IDEOGRAPH
+ 0xBBDA: 0x6094, //CJK UNIFIED IDEOGRAPH
+ 0xBBDB: 0x6167, //CJK UNIFIED IDEOGRAPH
+ 0xBBDC: 0x5349, //CJK UNIFIED IDEOGRAPH
+ 0xBBDD: 0x60E0, //CJK UNIFIED IDEOGRAPH
+ 0xBBDE: 0x6666, //CJK UNIFIED IDEOGRAPH
+ 0xBBDF: 0x8D3F, //CJK UNIFIED IDEOGRAPH
+ 0xBBE0: 0x79FD, //CJK UNIFIED IDEOGRAPH
+ 0xBBE1: 0x4F1A, //CJK UNIFIED IDEOGRAPH
+ 0xBBE2: 0x70E9, //CJK UNIFIED IDEOGRAPH
+ 0xBBE3: 0x6C47, //CJK UNIFIED IDEOGRAPH
+ 0xBBE4: 0x8BB3, //CJK UNIFIED IDEOGRAPH
+ 0xBBE5: 0x8BF2, //CJK UNIFIED IDEOGRAPH
+ 0xBBE6: 0x7ED8, //CJK UNIFIED IDEOGRAPH
+ 0xBBE7: 0x8364, //CJK UNIFIED IDEOGRAPH
+ 0xBBE8: 0x660F, //CJK UNIFIED IDEOGRAPH
+ 0xBBE9: 0x5A5A, //CJK UNIFIED IDEOGRAPH
+ 0xBBEA: 0x9B42, //CJK UNIFIED IDEOGRAPH
+ 0xBBEB: 0x6D51, //CJK UNIFIED IDEOGRAPH
+ 0xBBEC: 0x6DF7, //CJK UNIFIED IDEOGRAPH
+ 0xBBED: 0x8C41, //CJK UNIFIED IDEOGRAPH
+ 0xBBEE: 0x6D3B, //CJK UNIFIED IDEOGRAPH
+ 0xBBEF: 0x4F19, //CJK UNIFIED IDEOGRAPH
+ 0xBBF0: 0x706B, //CJK UNIFIED IDEOGRAPH
+ 0xBBF1: 0x83B7, //CJK UNIFIED IDEOGRAPH
+ 0xBBF2: 0x6216, //CJK UNIFIED IDEOGRAPH
+ 0xBBF3: 0x60D1, //CJK UNIFIED IDEOGRAPH
+ 0xBBF4: 0x970D, //CJK UNIFIED IDEOGRAPH
+ 0xBBF5: 0x8D27, //CJK UNIFIED IDEOGRAPH
+ 0xBBF6: 0x7978, //CJK UNIFIED IDEOGRAPH
+ 0xBBF7: 0x51FB, //CJK UNIFIED IDEOGRAPH
+ 0xBBF8: 0x573E, //CJK UNIFIED IDEOGRAPH
+ 0xBBF9: 0x57FA, //CJK UNIFIED IDEOGRAPH
+ 0xBBFA: 0x673A, //CJK UNIFIED IDEOGRAPH
+ 0xBBFB: 0x7578, //CJK UNIFIED IDEOGRAPH
+ 0xBBFC: 0x7A3D, //CJK UNIFIED IDEOGRAPH
+ 0xBBFD: 0x79EF, //CJK UNIFIED IDEOGRAPH
+ 0xBBFE: 0x7B95, //CJK UNIFIED IDEOGRAPH
+ 0xBC40: 0x7CBF, //CJK UNIFIED IDEOGRAPH
+ 0xBC41: 0x7CC0, //CJK UNIFIED IDEOGRAPH
+ 0xBC42: 0x7CC2, //CJK UNIFIED IDEOGRAPH
+ 0xBC43: 0x7CC3, //CJK UNIFIED IDEOGRAPH
+ 0xBC44: 0x7CC4, //CJK UNIFIED IDEOGRAPH
+ 0xBC45: 0x7CC6, //CJK UNIFIED IDEOGRAPH
+ 0xBC46: 0x7CC9, //CJK UNIFIED IDEOGRAPH
+ 0xBC47: 0x7CCB, //CJK UNIFIED IDEOGRAPH
+ 0xBC48: 0x7CCE, //CJK UNIFIED IDEOGRAPH
+ 0xBC49: 0x7CCF, //CJK UNIFIED IDEOGRAPH
+ 0xBC4A: 0x7CD0, //CJK UNIFIED IDEOGRAPH
+ 0xBC4B: 0x7CD1, //CJK UNIFIED IDEOGRAPH
+ 0xBC4C: 0x7CD2, //CJK UNIFIED IDEOGRAPH
+ 0xBC4D: 0x7CD3, //CJK UNIFIED IDEOGRAPH
+ 0xBC4E: 0x7CD4, //CJK UNIFIED IDEOGRAPH
+ 0xBC4F: 0x7CD8, //CJK UNIFIED IDEOGRAPH
+ 0xBC50: 0x7CDA, //CJK UNIFIED IDEOGRAPH
+ 0xBC51: 0x7CDB, //CJK UNIFIED IDEOGRAPH
+ 0xBC52: 0x7CDD, //CJK UNIFIED IDEOGRAPH
+ 0xBC53: 0x7CDE, //CJK UNIFIED IDEOGRAPH
+ 0xBC54: 0x7CE1, //CJK UNIFIED IDEOGRAPH
+ 0xBC55: 0x7CE2, //CJK UNIFIED IDEOGRAPH
+ 0xBC56: 0x7CE3, //CJK UNIFIED IDEOGRAPH
+ 0xBC57: 0x7CE4, //CJK UNIFIED IDEOGRAPH
+ 0xBC58: 0x7CE5, //CJK UNIFIED IDEOGRAPH
+ 0xBC59: 0x7CE6, //CJK UNIFIED IDEOGRAPH
+ 0xBC5A: 0x7CE7, //CJK UNIFIED IDEOGRAPH
+ 0xBC5B: 0x7CE9, //CJK UNIFIED IDEOGRAPH
+ 0xBC5C: 0x7CEA, //CJK UNIFIED IDEOGRAPH
+ 0xBC5D: 0x7CEB, //CJK UNIFIED IDEOGRAPH
+ 0xBC5E: 0x7CEC, //CJK UNIFIED IDEOGRAPH
+ 0xBC5F: 0x7CED, //CJK UNIFIED IDEOGRAPH
+ 0xBC60: 0x7CEE, //CJK UNIFIED IDEOGRAPH
+ 0xBC61: 0x7CF0, //CJK UNIFIED IDEOGRAPH
+ 0xBC62: 0x7CF1, //CJK UNIFIED IDEOGRAPH
+ 0xBC63: 0x7CF2, //CJK UNIFIED IDEOGRAPH
+ 0xBC64: 0x7CF3, //CJK UNIFIED IDEOGRAPH
+ 0xBC65: 0x7CF4, //CJK UNIFIED IDEOGRAPH
+ 0xBC66: 0x7CF5, //CJK UNIFIED IDEOGRAPH
+ 0xBC67: 0x7CF6, //CJK UNIFIED IDEOGRAPH
+ 0xBC68: 0x7CF7, //CJK UNIFIED IDEOGRAPH
+ 0xBC69: 0x7CF9, //CJK UNIFIED IDEOGRAPH
+ 0xBC6A: 0x7CFA, //CJK UNIFIED IDEOGRAPH
+ 0xBC6B: 0x7CFC, //CJK UNIFIED IDEOGRAPH
+ 0xBC6C: 0x7CFD, //CJK UNIFIED IDEOGRAPH
+ 0xBC6D: 0x7CFE, //CJK UNIFIED IDEOGRAPH
+ 0xBC6E: 0x7CFF, //CJK UNIFIED IDEOGRAPH
+ 0xBC6F: 0x7D00, //CJK UNIFIED IDEOGRAPH
+ 0xBC70: 0x7D01, //CJK UNIFIED IDEOGRAPH
+ 0xBC71: 0x7D02, //CJK UNIFIED IDEOGRAPH
+ 0xBC72: 0x7D03, //CJK UNIFIED IDEOGRAPH
+ 0xBC73: 0x7D04, //CJK UNIFIED IDEOGRAPH
+ 0xBC74: 0x7D05, //CJK UNIFIED IDEOGRAPH
+ 0xBC75: 0x7D06, //CJK UNIFIED IDEOGRAPH
+ 0xBC76: 0x7D07, //CJK UNIFIED IDEOGRAPH
+ 0xBC77: 0x7D08, //CJK UNIFIED IDEOGRAPH
+ 0xBC78: 0x7D09, //CJK UNIFIED IDEOGRAPH
+ 0xBC79: 0x7D0B, //CJK UNIFIED IDEOGRAPH
+ 0xBC7A: 0x7D0C, //CJK UNIFIED IDEOGRAPH
+ 0xBC7B: 0x7D0D, //CJK UNIFIED IDEOGRAPH
+ 0xBC7C: 0x7D0E, //CJK UNIFIED IDEOGRAPH
+ 0xBC7D: 0x7D0F, //CJK UNIFIED IDEOGRAPH
+ 0xBC7E: 0x7D10, //CJK UNIFIED IDEOGRAPH
+ 0xBC80: 0x7D11, //CJK UNIFIED IDEOGRAPH
+ 0xBC81: 0x7D12, //CJK UNIFIED IDEOGRAPH
+ 0xBC82: 0x7D13, //CJK UNIFIED IDEOGRAPH
+ 0xBC83: 0x7D14, //CJK UNIFIED IDEOGRAPH
+ 0xBC84: 0x7D15, //CJK UNIFIED IDEOGRAPH
+ 0xBC85: 0x7D16, //CJK UNIFIED IDEOGRAPH
+ 0xBC86: 0x7D17, //CJK UNIFIED IDEOGRAPH
+ 0xBC87: 0x7D18, //CJK UNIFIED IDEOGRAPH
+ 0xBC88: 0x7D19, //CJK UNIFIED IDEOGRAPH
+ 0xBC89: 0x7D1A, //CJK UNIFIED IDEOGRAPH
+ 0xBC8A: 0x7D1B, //CJK UNIFIED IDEOGRAPH
+ 0xBC8B: 0x7D1C, //CJK UNIFIED IDEOGRAPH
+ 0xBC8C: 0x7D1D, //CJK UNIFIED IDEOGRAPH
+ 0xBC8D: 0x7D1E, //CJK UNIFIED IDEOGRAPH
+ 0xBC8E: 0x7D1F, //CJK UNIFIED IDEOGRAPH
+ 0xBC8F: 0x7D21, //CJK UNIFIED IDEOGRAPH
+ 0xBC90: 0x7D23, //CJK UNIFIED IDEOGRAPH
+ 0xBC91: 0x7D24, //CJK UNIFIED IDEOGRAPH
+ 0xBC92: 0x7D25, //CJK UNIFIED IDEOGRAPH
+ 0xBC93: 0x7D26, //CJK UNIFIED IDEOGRAPH
+ 0xBC94: 0x7D28, //CJK UNIFIED IDEOGRAPH
+ 0xBC95: 0x7D29, //CJK UNIFIED IDEOGRAPH
+ 0xBC96: 0x7D2A, //CJK UNIFIED IDEOGRAPH
+ 0xBC97: 0x7D2C, //CJK UNIFIED IDEOGRAPH
+ 0xBC98: 0x7D2D, //CJK UNIFIED IDEOGRAPH
+ 0xBC99: 0x7D2E, //CJK UNIFIED IDEOGRAPH
+ 0xBC9A: 0x7D30, //CJK UNIFIED IDEOGRAPH
+ 0xBC9B: 0x7D31, //CJK UNIFIED IDEOGRAPH
+ 0xBC9C: 0x7D32, //CJK UNIFIED IDEOGRAPH
+ 0xBC9D: 0x7D33, //CJK UNIFIED IDEOGRAPH
+ 0xBC9E: 0x7D34, //CJK UNIFIED IDEOGRAPH
+ 0xBC9F: 0x7D35, //CJK UNIFIED IDEOGRAPH
+ 0xBCA0: 0x7D36, //CJK UNIFIED IDEOGRAPH
+ 0xBCA1: 0x808C, //CJK UNIFIED IDEOGRAPH
+ 0xBCA2: 0x9965, //CJK UNIFIED IDEOGRAPH
+ 0xBCA3: 0x8FF9, //CJK UNIFIED IDEOGRAPH
+ 0xBCA4: 0x6FC0, //CJK UNIFIED IDEOGRAPH
+ 0xBCA5: 0x8BA5, //CJK UNIFIED IDEOGRAPH
+ 0xBCA6: 0x9E21, //CJK UNIFIED IDEOGRAPH
+ 0xBCA7: 0x59EC, //CJK UNIFIED IDEOGRAPH
+ 0xBCA8: 0x7EE9, //CJK UNIFIED IDEOGRAPH
+ 0xBCA9: 0x7F09, //CJK UNIFIED IDEOGRAPH
+ 0xBCAA: 0x5409, //CJK UNIFIED IDEOGRAPH
+ 0xBCAB: 0x6781, //CJK UNIFIED IDEOGRAPH
+ 0xBCAC: 0x68D8, //CJK UNIFIED IDEOGRAPH
+ 0xBCAD: 0x8F91, //CJK UNIFIED IDEOGRAPH
+ 0xBCAE: 0x7C4D, //CJK UNIFIED IDEOGRAPH
+ 0xBCAF: 0x96C6, //CJK UNIFIED IDEOGRAPH
+ 0xBCB0: 0x53CA, //CJK UNIFIED IDEOGRAPH
+ 0xBCB1: 0x6025, //CJK UNIFIED IDEOGRAPH
+ 0xBCB2: 0x75BE, //CJK UNIFIED IDEOGRAPH
+ 0xBCB3: 0x6C72, //CJK UNIFIED IDEOGRAPH
+ 0xBCB4: 0x5373, //CJK UNIFIED IDEOGRAPH
+ 0xBCB5: 0x5AC9, //CJK UNIFIED IDEOGRAPH
+ 0xBCB6: 0x7EA7, //CJK UNIFIED IDEOGRAPH
+ 0xBCB7: 0x6324, //CJK UNIFIED IDEOGRAPH
+ 0xBCB8: 0x51E0, //CJK UNIFIED IDEOGRAPH
+ 0xBCB9: 0x810A, //CJK UNIFIED IDEOGRAPH
+ 0xBCBA: 0x5DF1, //CJK UNIFIED IDEOGRAPH
+ 0xBCBB: 0x84DF, //CJK UNIFIED IDEOGRAPH
+ 0xBCBC: 0x6280, //CJK UNIFIED IDEOGRAPH
+ 0xBCBD: 0x5180, //CJK UNIFIED IDEOGRAPH
+ 0xBCBE: 0x5B63, //CJK UNIFIED IDEOGRAPH
+ 0xBCBF: 0x4F0E, //CJK UNIFIED IDEOGRAPH
+ 0xBCC0: 0x796D, //CJK UNIFIED IDEOGRAPH
+ 0xBCC1: 0x5242, //CJK UNIFIED IDEOGRAPH
+ 0xBCC2: 0x60B8, //CJK UNIFIED IDEOGRAPH
+ 0xBCC3: 0x6D4E, //CJK UNIFIED IDEOGRAPH
+ 0xBCC4: 0x5BC4, //CJK UNIFIED IDEOGRAPH
+ 0xBCC5: 0x5BC2, //CJK UNIFIED IDEOGRAPH
+ 0xBCC6: 0x8BA1, //CJK UNIFIED IDEOGRAPH
+ 0xBCC7: 0x8BB0, //CJK UNIFIED IDEOGRAPH
+ 0xBCC8: 0x65E2, //CJK UNIFIED IDEOGRAPH
+ 0xBCC9: 0x5FCC, //CJK UNIFIED IDEOGRAPH
+ 0xBCCA: 0x9645, //CJK UNIFIED IDEOGRAPH
+ 0xBCCB: 0x5993, //CJK UNIFIED IDEOGRAPH
+ 0xBCCC: 0x7EE7, //CJK UNIFIED IDEOGRAPH
+ 0xBCCD: 0x7EAA, //CJK UNIFIED IDEOGRAPH
+ 0xBCCE: 0x5609, //CJK UNIFIED IDEOGRAPH
+ 0xBCCF: 0x67B7, //CJK UNIFIED IDEOGRAPH
+ 0xBCD0: 0x5939, //CJK UNIFIED IDEOGRAPH
+ 0xBCD1: 0x4F73, //CJK UNIFIED IDEOGRAPH
+ 0xBCD2: 0x5BB6, //CJK UNIFIED IDEOGRAPH
+ 0xBCD3: 0x52A0, //CJK UNIFIED IDEOGRAPH
+ 0xBCD4: 0x835A, //CJK UNIFIED IDEOGRAPH
+ 0xBCD5: 0x988A, //CJK UNIFIED IDEOGRAPH
+ 0xBCD6: 0x8D3E, //CJK UNIFIED IDEOGRAPH
+ 0xBCD7: 0x7532, //CJK UNIFIED IDEOGRAPH
+ 0xBCD8: 0x94BE, //CJK UNIFIED IDEOGRAPH
+ 0xBCD9: 0x5047, //CJK UNIFIED IDEOGRAPH
+ 0xBCDA: 0x7A3C, //CJK UNIFIED IDEOGRAPH
+ 0xBCDB: 0x4EF7, //CJK UNIFIED IDEOGRAPH
+ 0xBCDC: 0x67B6, //CJK UNIFIED IDEOGRAPH
+ 0xBCDD: 0x9A7E, //CJK UNIFIED IDEOGRAPH
+ 0xBCDE: 0x5AC1, //CJK UNIFIED IDEOGRAPH
+ 0xBCDF: 0x6B7C, //CJK UNIFIED IDEOGRAPH
+ 0xBCE0: 0x76D1, //CJK UNIFIED IDEOGRAPH
+ 0xBCE1: 0x575A, //CJK UNIFIED IDEOGRAPH
+ 0xBCE2: 0x5C16, //CJK UNIFIED IDEOGRAPH
+ 0xBCE3: 0x7B3A, //CJK UNIFIED IDEOGRAPH
+ 0xBCE4: 0x95F4, //CJK UNIFIED IDEOGRAPH
+ 0xBCE5: 0x714E, //CJK UNIFIED IDEOGRAPH
+ 0xBCE6: 0x517C, //CJK UNIFIED IDEOGRAPH
+ 0xBCE7: 0x80A9, //CJK UNIFIED IDEOGRAPH
+ 0xBCE8: 0x8270, //CJK UNIFIED IDEOGRAPH
+ 0xBCE9: 0x5978, //CJK UNIFIED IDEOGRAPH
+ 0xBCEA: 0x7F04, //CJK UNIFIED IDEOGRAPH
+ 0xBCEB: 0x8327, //CJK UNIFIED IDEOGRAPH
+ 0xBCEC: 0x68C0, //CJK UNIFIED IDEOGRAPH
+ 0xBCED: 0x67EC, //CJK UNIFIED IDEOGRAPH
+ 0xBCEE: 0x78B1, //CJK UNIFIED IDEOGRAPH
+ 0xBCEF: 0x7877, //CJK UNIFIED IDEOGRAPH
+ 0xBCF0: 0x62E3, //CJK UNIFIED IDEOGRAPH
+ 0xBCF1: 0x6361, //CJK UNIFIED IDEOGRAPH
+ 0xBCF2: 0x7B80, //CJK UNIFIED IDEOGRAPH
+ 0xBCF3: 0x4FED, //CJK UNIFIED IDEOGRAPH
+ 0xBCF4: 0x526A, //CJK UNIFIED IDEOGRAPH
+ 0xBCF5: 0x51CF, //CJK UNIFIED IDEOGRAPH
+ 0xBCF6: 0x8350, //CJK UNIFIED IDEOGRAPH
+ 0xBCF7: 0x69DB, //CJK UNIFIED IDEOGRAPH
+ 0xBCF8: 0x9274, //CJK UNIFIED IDEOGRAPH
+ 0xBCF9: 0x8DF5, //CJK UNIFIED IDEOGRAPH
+ 0xBCFA: 0x8D31, //CJK UNIFIED IDEOGRAPH
+ 0xBCFB: 0x89C1, //CJK UNIFIED IDEOGRAPH
+ 0xBCFC: 0x952E, //CJK UNIFIED IDEOGRAPH
+ 0xBCFD: 0x7BAD, //CJK UNIFIED IDEOGRAPH
+ 0xBCFE: 0x4EF6, //CJK UNIFIED IDEOGRAPH
+ 0xBD40: 0x7D37, //CJK UNIFIED IDEOGRAPH
+ 0xBD41: 0x7D38, //CJK UNIFIED IDEOGRAPH
+ 0xBD42: 0x7D39, //CJK UNIFIED IDEOGRAPH
+ 0xBD43: 0x7D3A, //CJK UNIFIED IDEOGRAPH
+ 0xBD44: 0x7D3B, //CJK UNIFIED IDEOGRAPH
+ 0xBD45: 0x7D3C, //CJK UNIFIED IDEOGRAPH
+ 0xBD46: 0x7D3D, //CJK UNIFIED IDEOGRAPH
+ 0xBD47: 0x7D3E, //CJK UNIFIED IDEOGRAPH
+ 0xBD48: 0x7D3F, //CJK UNIFIED IDEOGRAPH
+ 0xBD49: 0x7D40, //CJK UNIFIED IDEOGRAPH
+ 0xBD4A: 0x7D41, //CJK UNIFIED IDEOGRAPH
+ 0xBD4B: 0x7D42, //CJK UNIFIED IDEOGRAPH
+ 0xBD4C: 0x7D43, //CJK UNIFIED IDEOGRAPH
+ 0xBD4D: 0x7D44, //CJK UNIFIED IDEOGRAPH
+ 0xBD4E: 0x7D45, //CJK UNIFIED IDEOGRAPH
+ 0xBD4F: 0x7D46, //CJK UNIFIED IDEOGRAPH
+ 0xBD50: 0x7D47, //CJK UNIFIED IDEOGRAPH
+ 0xBD51: 0x7D48, //CJK UNIFIED IDEOGRAPH
+ 0xBD52: 0x7D49, //CJK UNIFIED IDEOGRAPH
+ 0xBD53: 0x7D4A, //CJK UNIFIED IDEOGRAPH
+ 0xBD54: 0x7D4B, //CJK UNIFIED IDEOGRAPH
+ 0xBD55: 0x7D4C, //CJK UNIFIED IDEOGRAPH
+ 0xBD56: 0x7D4D, //CJK UNIFIED IDEOGRAPH
+ 0xBD57: 0x7D4E, //CJK UNIFIED IDEOGRAPH
+ 0xBD58: 0x7D4F, //CJK UNIFIED IDEOGRAPH
+ 0xBD59: 0x7D50, //CJK UNIFIED IDEOGRAPH
+ 0xBD5A: 0x7D51, //CJK UNIFIED IDEOGRAPH
+ 0xBD5B: 0x7D52, //CJK UNIFIED IDEOGRAPH
+ 0xBD5C: 0x7D53, //CJK UNIFIED IDEOGRAPH
+ 0xBD5D: 0x7D54, //CJK UNIFIED IDEOGRAPH
+ 0xBD5E: 0x7D55, //CJK UNIFIED IDEOGRAPH
+ 0xBD5F: 0x7D56, //CJK UNIFIED IDEOGRAPH
+ 0xBD60: 0x7D57, //CJK UNIFIED IDEOGRAPH
+ 0xBD61: 0x7D58, //CJK UNIFIED IDEOGRAPH
+ 0xBD62: 0x7D59, //CJK UNIFIED IDEOGRAPH
+ 0xBD63: 0x7D5A, //CJK UNIFIED IDEOGRAPH
+ 0xBD64: 0x7D5B, //CJK UNIFIED IDEOGRAPH
+ 0xBD65: 0x7D5C, //CJK UNIFIED IDEOGRAPH
+ 0xBD66: 0x7D5D, //CJK UNIFIED IDEOGRAPH
+ 0xBD67: 0x7D5E, //CJK UNIFIED IDEOGRAPH
+ 0xBD68: 0x7D5F, //CJK UNIFIED IDEOGRAPH
+ 0xBD69: 0x7D60, //CJK UNIFIED IDEOGRAPH
+ 0xBD6A: 0x7D61, //CJK UNIFIED IDEOGRAPH
+ 0xBD6B: 0x7D62, //CJK UNIFIED IDEOGRAPH
+ 0xBD6C: 0x7D63, //CJK UNIFIED IDEOGRAPH
+ 0xBD6D: 0x7D64, //CJK UNIFIED IDEOGRAPH
+ 0xBD6E: 0x7D65, //CJK UNIFIED IDEOGRAPH
+ 0xBD6F: 0x7D66, //CJK UNIFIED IDEOGRAPH
+ 0xBD70: 0x7D67, //CJK UNIFIED IDEOGRAPH
+ 0xBD71: 0x7D68, //CJK UNIFIED IDEOGRAPH
+ 0xBD72: 0x7D69, //CJK UNIFIED IDEOGRAPH
+ 0xBD73: 0x7D6A, //CJK UNIFIED IDEOGRAPH
+ 0xBD74: 0x7D6B, //CJK UNIFIED IDEOGRAPH
+ 0xBD75: 0x7D6C, //CJK UNIFIED IDEOGRAPH
+ 0xBD76: 0x7D6D, //CJK UNIFIED IDEOGRAPH
+ 0xBD77: 0x7D6F, //CJK UNIFIED IDEOGRAPH
+ 0xBD78: 0x7D70, //CJK UNIFIED IDEOGRAPH
+ 0xBD79: 0x7D71, //CJK UNIFIED IDEOGRAPH
+ 0xBD7A: 0x7D72, //CJK UNIFIED IDEOGRAPH
+ 0xBD7B: 0x7D73, //CJK UNIFIED IDEOGRAPH
+ 0xBD7C: 0x7D74, //CJK UNIFIED IDEOGRAPH
+ 0xBD7D: 0x7D75, //CJK UNIFIED IDEOGRAPH
+ 0xBD7E: 0x7D76, //CJK UNIFIED IDEOGRAPH
+ 0xBD80: 0x7D78, //CJK UNIFIED IDEOGRAPH
+ 0xBD81: 0x7D79, //CJK UNIFIED IDEOGRAPH
+ 0xBD82: 0x7D7A, //CJK UNIFIED IDEOGRAPH
+ 0xBD83: 0x7D7B, //CJK UNIFIED IDEOGRAPH
+ 0xBD84: 0x7D7C, //CJK UNIFIED IDEOGRAPH
+ 0xBD85: 0x7D7D, //CJK UNIFIED IDEOGRAPH
+ 0xBD86: 0x7D7E, //CJK UNIFIED IDEOGRAPH
+ 0xBD87: 0x7D7F, //CJK UNIFIED IDEOGRAPH
+ 0xBD88: 0x7D80, //CJK UNIFIED IDEOGRAPH
+ 0xBD89: 0x7D81, //CJK UNIFIED IDEOGRAPH
+ 0xBD8A: 0x7D82, //CJK UNIFIED IDEOGRAPH
+ 0xBD8B: 0x7D83, //CJK UNIFIED IDEOGRAPH
+ 0xBD8C: 0x7D84, //CJK UNIFIED IDEOGRAPH
+ 0xBD8D: 0x7D85, //CJK UNIFIED IDEOGRAPH
+ 0xBD8E: 0x7D86, //CJK UNIFIED IDEOGRAPH
+ 0xBD8F: 0x7D87, //CJK UNIFIED IDEOGRAPH
+ 0xBD90: 0x7D88, //CJK UNIFIED IDEOGRAPH
+ 0xBD91: 0x7D89, //CJK UNIFIED IDEOGRAPH
+ 0xBD92: 0x7D8A, //CJK UNIFIED IDEOGRAPH
+ 0xBD93: 0x7D8B, //CJK UNIFIED IDEOGRAPH
+ 0xBD94: 0x7D8C, //CJK UNIFIED IDEOGRAPH
+ 0xBD95: 0x7D8D, //CJK UNIFIED IDEOGRAPH
+ 0xBD96: 0x7D8E, //CJK UNIFIED IDEOGRAPH
+ 0xBD97: 0x7D8F, //CJK UNIFIED IDEOGRAPH
+ 0xBD98: 0x7D90, //CJK UNIFIED IDEOGRAPH
+ 0xBD99: 0x7D91, //CJK UNIFIED IDEOGRAPH
+ 0xBD9A: 0x7D92, //CJK UNIFIED IDEOGRAPH
+ 0xBD9B: 0x7D93, //CJK UNIFIED IDEOGRAPH
+ 0xBD9C: 0x7D94, //CJK UNIFIED IDEOGRAPH
+ 0xBD9D: 0x7D95, //CJK UNIFIED IDEOGRAPH
+ 0xBD9E: 0x7D96, //CJK UNIFIED IDEOGRAPH
+ 0xBD9F: 0x7D97, //CJK UNIFIED IDEOGRAPH
+ 0xBDA0: 0x7D98, //CJK UNIFIED IDEOGRAPH
+ 0xBDA1: 0x5065, //CJK UNIFIED IDEOGRAPH
+ 0xBDA2: 0x8230, //CJK UNIFIED IDEOGRAPH
+ 0xBDA3: 0x5251, //CJK UNIFIED IDEOGRAPH
+ 0xBDA4: 0x996F, //CJK UNIFIED IDEOGRAPH
+ 0xBDA5: 0x6E10, //CJK UNIFIED IDEOGRAPH
+ 0xBDA6: 0x6E85, //CJK UNIFIED IDEOGRAPH
+ 0xBDA7: 0x6DA7, //CJK UNIFIED IDEOGRAPH
+ 0xBDA8: 0x5EFA, //CJK UNIFIED IDEOGRAPH
+ 0xBDA9: 0x50F5, //CJK UNIFIED IDEOGRAPH
+ 0xBDAA: 0x59DC, //CJK UNIFIED IDEOGRAPH
+ 0xBDAB: 0x5C06, //CJK UNIFIED IDEOGRAPH
+ 0xBDAC: 0x6D46, //CJK UNIFIED IDEOGRAPH
+ 0xBDAD: 0x6C5F, //CJK UNIFIED IDEOGRAPH
+ 0xBDAE: 0x7586, //CJK UNIFIED IDEOGRAPH
+ 0xBDAF: 0x848B, //CJK UNIFIED IDEOGRAPH
+ 0xBDB0: 0x6868, //CJK UNIFIED IDEOGRAPH
+ 0xBDB1: 0x5956, //CJK UNIFIED IDEOGRAPH
+ 0xBDB2: 0x8BB2, //CJK UNIFIED IDEOGRAPH
+ 0xBDB3: 0x5320, //CJK UNIFIED IDEOGRAPH
+ 0xBDB4: 0x9171, //CJK UNIFIED IDEOGRAPH
+ 0xBDB5: 0x964D, //CJK UNIFIED IDEOGRAPH
+ 0xBDB6: 0x8549, //CJK UNIFIED IDEOGRAPH
+ 0xBDB7: 0x6912, //CJK UNIFIED IDEOGRAPH
+ 0xBDB8: 0x7901, //CJK UNIFIED IDEOGRAPH
+ 0xBDB9: 0x7126, //CJK UNIFIED IDEOGRAPH
+ 0xBDBA: 0x80F6, //CJK UNIFIED IDEOGRAPH
+ 0xBDBB: 0x4EA4, //CJK UNIFIED IDEOGRAPH
+ 0xBDBC: 0x90CA, //CJK UNIFIED IDEOGRAPH
+ 0xBDBD: 0x6D47, //CJK UNIFIED IDEOGRAPH
+ 0xBDBE: 0x9A84, //CJK UNIFIED IDEOGRAPH
+ 0xBDBF: 0x5A07, //CJK UNIFIED IDEOGRAPH
+ 0xBDC0: 0x56BC, //CJK UNIFIED IDEOGRAPH
+ 0xBDC1: 0x6405, //CJK UNIFIED IDEOGRAPH
+ 0xBDC2: 0x94F0, //CJK UNIFIED IDEOGRAPH
+ 0xBDC3: 0x77EB, //CJK UNIFIED IDEOGRAPH
+ 0xBDC4: 0x4FA5, //CJK UNIFIED IDEOGRAPH
+ 0xBDC5: 0x811A, //CJK UNIFIED IDEOGRAPH
+ 0xBDC6: 0x72E1, //CJK UNIFIED IDEOGRAPH
+ 0xBDC7: 0x89D2, //CJK UNIFIED IDEOGRAPH
+ 0xBDC8: 0x997A, //CJK UNIFIED IDEOGRAPH
+ 0xBDC9: 0x7F34, //CJK UNIFIED IDEOGRAPH
+ 0xBDCA: 0x7EDE, //CJK UNIFIED IDEOGRAPH
+ 0xBDCB: 0x527F, //CJK UNIFIED IDEOGRAPH
+ 0xBDCC: 0x6559, //CJK UNIFIED IDEOGRAPH
+ 0xBDCD: 0x9175, //CJK UNIFIED IDEOGRAPH
+ 0xBDCE: 0x8F7F, //CJK UNIFIED IDEOGRAPH
+ 0xBDCF: 0x8F83, //CJK UNIFIED IDEOGRAPH
+ 0xBDD0: 0x53EB, //CJK UNIFIED IDEOGRAPH
+ 0xBDD1: 0x7A96, //CJK UNIFIED IDEOGRAPH
+ 0xBDD2: 0x63ED, //CJK UNIFIED IDEOGRAPH
+ 0xBDD3: 0x63A5, //CJK UNIFIED IDEOGRAPH
+ 0xBDD4: 0x7686, //CJK UNIFIED IDEOGRAPH
+ 0xBDD5: 0x79F8, //CJK UNIFIED IDEOGRAPH
+ 0xBDD6: 0x8857, //CJK UNIFIED IDEOGRAPH
+ 0xBDD7: 0x9636, //CJK UNIFIED IDEOGRAPH
+ 0xBDD8: 0x622A, //CJK UNIFIED IDEOGRAPH
+ 0xBDD9: 0x52AB, //CJK UNIFIED IDEOGRAPH
+ 0xBDDA: 0x8282, //CJK UNIFIED IDEOGRAPH
+ 0xBDDB: 0x6854, //CJK UNIFIED IDEOGRAPH
+ 0xBDDC: 0x6770, //CJK UNIFIED IDEOGRAPH
+ 0xBDDD: 0x6377, //CJK UNIFIED IDEOGRAPH
+ 0xBDDE: 0x776B, //CJK UNIFIED IDEOGRAPH
+ 0xBDDF: 0x7AED, //CJK UNIFIED IDEOGRAPH
+ 0xBDE0: 0x6D01, //CJK UNIFIED IDEOGRAPH
+ 0xBDE1: 0x7ED3, //CJK UNIFIED IDEOGRAPH
+ 0xBDE2: 0x89E3, //CJK UNIFIED IDEOGRAPH
+ 0xBDE3: 0x59D0, //CJK UNIFIED IDEOGRAPH
+ 0xBDE4: 0x6212, //CJK UNIFIED IDEOGRAPH
+ 0xBDE5: 0x85C9, //CJK UNIFIED IDEOGRAPH
+ 0xBDE6: 0x82A5, //CJK UNIFIED IDEOGRAPH
+ 0xBDE7: 0x754C, //CJK UNIFIED IDEOGRAPH
+ 0xBDE8: 0x501F, //CJK UNIFIED IDEOGRAPH
+ 0xBDE9: 0x4ECB, //CJK UNIFIED IDEOGRAPH
+ 0xBDEA: 0x75A5, //CJK UNIFIED IDEOGRAPH
+ 0xBDEB: 0x8BEB, //CJK UNIFIED IDEOGRAPH
+ 0xBDEC: 0x5C4A, //CJK UNIFIED IDEOGRAPH
+ 0xBDED: 0x5DFE, //CJK UNIFIED IDEOGRAPH
+ 0xBDEE: 0x7B4B, //CJK UNIFIED IDEOGRAPH
+ 0xBDEF: 0x65A4, //CJK UNIFIED IDEOGRAPH
+ 0xBDF0: 0x91D1, //CJK UNIFIED IDEOGRAPH
+ 0xBDF1: 0x4ECA, //CJK UNIFIED IDEOGRAPH
+ 0xBDF2: 0x6D25, //CJK UNIFIED IDEOGRAPH
+ 0xBDF3: 0x895F, //CJK UNIFIED IDEOGRAPH
+ 0xBDF4: 0x7D27, //CJK UNIFIED IDEOGRAPH
+ 0xBDF5: 0x9526, //CJK UNIFIED IDEOGRAPH
+ 0xBDF6: 0x4EC5, //CJK UNIFIED IDEOGRAPH
+ 0xBDF7: 0x8C28, //CJK UNIFIED IDEOGRAPH
+ 0xBDF8: 0x8FDB, //CJK UNIFIED IDEOGRAPH
+ 0xBDF9: 0x9773, //CJK UNIFIED IDEOGRAPH
+ 0xBDFA: 0x664B, //CJK UNIFIED IDEOGRAPH
+ 0xBDFB: 0x7981, //CJK UNIFIED IDEOGRAPH
+ 0xBDFC: 0x8FD1, //CJK UNIFIED IDEOGRAPH
+ 0xBDFD: 0x70EC, //CJK UNIFIED IDEOGRAPH
+ 0xBDFE: 0x6D78, //CJK UNIFIED IDEOGRAPH
+ 0xBE40: 0x7D99, //CJK UNIFIED IDEOGRAPH
+ 0xBE41: 0x7D9A, //CJK UNIFIED IDEOGRAPH
+ 0xBE42: 0x7D9B, //CJK UNIFIED IDEOGRAPH
+ 0xBE43: 0x7D9C, //CJK UNIFIED IDEOGRAPH
+ 0xBE44: 0x7D9D, //CJK UNIFIED IDEOGRAPH
+ 0xBE45: 0x7D9E, //CJK UNIFIED IDEOGRAPH
+ 0xBE46: 0x7D9F, //CJK UNIFIED IDEOGRAPH
+ 0xBE47: 0x7DA0, //CJK UNIFIED IDEOGRAPH
+ 0xBE48: 0x7DA1, //CJK UNIFIED IDEOGRAPH
+ 0xBE49: 0x7DA2, //CJK UNIFIED IDEOGRAPH
+ 0xBE4A: 0x7DA3, //CJK UNIFIED IDEOGRAPH
+ 0xBE4B: 0x7DA4, //CJK UNIFIED IDEOGRAPH
+ 0xBE4C: 0x7DA5, //CJK UNIFIED IDEOGRAPH
+ 0xBE4D: 0x7DA7, //CJK UNIFIED IDEOGRAPH
+ 0xBE4E: 0x7DA8, //CJK UNIFIED IDEOGRAPH
+ 0xBE4F: 0x7DA9, //CJK UNIFIED IDEOGRAPH
+ 0xBE50: 0x7DAA, //CJK UNIFIED IDEOGRAPH
+ 0xBE51: 0x7DAB, //CJK UNIFIED IDEOGRAPH
+ 0xBE52: 0x7DAC, //CJK UNIFIED IDEOGRAPH
+ 0xBE53: 0x7DAD, //CJK UNIFIED IDEOGRAPH
+ 0xBE54: 0x7DAF, //CJK UNIFIED IDEOGRAPH
+ 0xBE55: 0x7DB0, //CJK UNIFIED IDEOGRAPH
+ 0xBE56: 0x7DB1, //CJK UNIFIED IDEOGRAPH
+ 0xBE57: 0x7DB2, //CJK UNIFIED IDEOGRAPH
+ 0xBE58: 0x7DB3, //CJK UNIFIED IDEOGRAPH
+ 0xBE59: 0x7DB4, //CJK UNIFIED IDEOGRAPH
+ 0xBE5A: 0x7DB5, //CJK UNIFIED IDEOGRAPH
+ 0xBE5B: 0x7DB6, //CJK UNIFIED IDEOGRAPH
+ 0xBE5C: 0x7DB7, //CJK UNIFIED IDEOGRAPH
+ 0xBE5D: 0x7DB8, //CJK UNIFIED IDEOGRAPH
+ 0xBE5E: 0x7DB9, //CJK UNIFIED IDEOGRAPH
+ 0xBE5F: 0x7DBA, //CJK UNIFIED IDEOGRAPH
+ 0xBE60: 0x7DBB, //CJK UNIFIED IDEOGRAPH
+ 0xBE61: 0x7DBC, //CJK UNIFIED IDEOGRAPH
+ 0xBE62: 0x7DBD, //CJK UNIFIED IDEOGRAPH
+ 0xBE63: 0x7DBE, //CJK UNIFIED IDEOGRAPH
+ 0xBE64: 0x7DBF, //CJK UNIFIED IDEOGRAPH
+ 0xBE65: 0x7DC0, //CJK UNIFIED IDEOGRAPH
+ 0xBE66: 0x7DC1, //CJK UNIFIED IDEOGRAPH
+ 0xBE67: 0x7DC2, //CJK UNIFIED IDEOGRAPH
+ 0xBE68: 0x7DC3, //CJK UNIFIED IDEOGRAPH
+ 0xBE69: 0x7DC4, //CJK UNIFIED IDEOGRAPH
+ 0xBE6A: 0x7DC5, //CJK UNIFIED IDEOGRAPH
+ 0xBE6B: 0x7DC6, //CJK UNIFIED IDEOGRAPH
+ 0xBE6C: 0x7DC7, //CJK UNIFIED IDEOGRAPH
+ 0xBE6D: 0x7DC8, //CJK UNIFIED IDEOGRAPH
+ 0xBE6E: 0x7DC9, //CJK UNIFIED IDEOGRAPH
+ 0xBE6F: 0x7DCA, //CJK UNIFIED IDEOGRAPH
+ 0xBE70: 0x7DCB, //CJK UNIFIED IDEOGRAPH
+ 0xBE71: 0x7DCC, //CJK UNIFIED IDEOGRAPH
+ 0xBE72: 0x7DCD, //CJK UNIFIED IDEOGRAPH
+ 0xBE73: 0x7DCE, //CJK UNIFIED IDEOGRAPH
+ 0xBE74: 0x7DCF, //CJK UNIFIED IDEOGRAPH
+ 0xBE75: 0x7DD0, //CJK UNIFIED IDEOGRAPH
+ 0xBE76: 0x7DD1, //CJK UNIFIED IDEOGRAPH
+ 0xBE77: 0x7DD2, //CJK UNIFIED IDEOGRAPH
+ 0xBE78: 0x7DD3, //CJK UNIFIED IDEOGRAPH
+ 0xBE79: 0x7DD4, //CJK UNIFIED IDEOGRAPH
+ 0xBE7A: 0x7DD5, //CJK UNIFIED IDEOGRAPH
+ 0xBE7B: 0x7DD6, //CJK UNIFIED IDEOGRAPH
+ 0xBE7C: 0x7DD7, //CJK UNIFIED IDEOGRAPH
+ 0xBE7D: 0x7DD8, //CJK UNIFIED IDEOGRAPH
+ 0xBE7E: 0x7DD9, //CJK UNIFIED IDEOGRAPH
+ 0xBE80: 0x7DDA, //CJK UNIFIED IDEOGRAPH
+ 0xBE81: 0x7DDB, //CJK UNIFIED IDEOGRAPH
+ 0xBE82: 0x7DDC, //CJK UNIFIED IDEOGRAPH
+ 0xBE83: 0x7DDD, //CJK UNIFIED IDEOGRAPH
+ 0xBE84: 0x7DDE, //CJK UNIFIED IDEOGRAPH
+ 0xBE85: 0x7DDF, //CJK UNIFIED IDEOGRAPH
+ 0xBE86: 0x7DE0, //CJK UNIFIED IDEOGRAPH
+ 0xBE87: 0x7DE1, //CJK UNIFIED IDEOGRAPH
+ 0xBE88: 0x7DE2, //CJK UNIFIED IDEOGRAPH
+ 0xBE89: 0x7DE3, //CJK UNIFIED IDEOGRAPH
+ 0xBE8A: 0x7DE4, //CJK UNIFIED IDEOGRAPH
+ 0xBE8B: 0x7DE5, //CJK UNIFIED IDEOGRAPH
+ 0xBE8C: 0x7DE6, //CJK UNIFIED IDEOGRAPH
+ 0xBE8D: 0x7DE7, //CJK UNIFIED IDEOGRAPH
+ 0xBE8E: 0x7DE8, //CJK UNIFIED IDEOGRAPH
+ 0xBE8F: 0x7DE9, //CJK UNIFIED IDEOGRAPH
+ 0xBE90: 0x7DEA, //CJK UNIFIED IDEOGRAPH
+ 0xBE91: 0x7DEB, //CJK UNIFIED IDEOGRAPH
+ 0xBE92: 0x7DEC, //CJK UNIFIED IDEOGRAPH
+ 0xBE93: 0x7DED, //CJK UNIFIED IDEOGRAPH
+ 0xBE94: 0x7DEE, //CJK UNIFIED IDEOGRAPH
+ 0xBE95: 0x7DEF, //CJK UNIFIED IDEOGRAPH
+ 0xBE96: 0x7DF0, //CJK UNIFIED IDEOGRAPH
+ 0xBE97: 0x7DF1, //CJK UNIFIED IDEOGRAPH
+ 0xBE98: 0x7DF2, //CJK UNIFIED IDEOGRAPH
+ 0xBE99: 0x7DF3, //CJK UNIFIED IDEOGRAPH
+ 0xBE9A: 0x7DF4, //CJK UNIFIED IDEOGRAPH
+ 0xBE9B: 0x7DF5, //CJK UNIFIED IDEOGRAPH
+ 0xBE9C: 0x7DF6, //CJK UNIFIED IDEOGRAPH
+ 0xBE9D: 0x7DF7, //CJK UNIFIED IDEOGRAPH
+ 0xBE9E: 0x7DF8, //CJK UNIFIED IDEOGRAPH
+ 0xBE9F: 0x7DF9, //CJK UNIFIED IDEOGRAPH
+ 0xBEA0: 0x7DFA, //CJK UNIFIED IDEOGRAPH
+ 0xBEA1: 0x5C3D, //CJK UNIFIED IDEOGRAPH
+ 0xBEA2: 0x52B2, //CJK UNIFIED IDEOGRAPH
+ 0xBEA3: 0x8346, //CJK UNIFIED IDEOGRAPH
+ 0xBEA4: 0x5162, //CJK UNIFIED IDEOGRAPH
+ 0xBEA5: 0x830E, //CJK UNIFIED IDEOGRAPH
+ 0xBEA6: 0x775B, //CJK UNIFIED IDEOGRAPH
+ 0xBEA7: 0x6676, //CJK UNIFIED IDEOGRAPH
+ 0xBEA8: 0x9CB8, //CJK UNIFIED IDEOGRAPH
+ 0xBEA9: 0x4EAC, //CJK UNIFIED IDEOGRAPH
+ 0xBEAA: 0x60CA, //CJK UNIFIED IDEOGRAPH
+ 0xBEAB: 0x7CBE, //CJK UNIFIED IDEOGRAPH
+ 0xBEAC: 0x7CB3, //CJK UNIFIED IDEOGRAPH
+ 0xBEAD: 0x7ECF, //CJK UNIFIED IDEOGRAPH
+ 0xBEAE: 0x4E95, //CJK UNIFIED IDEOGRAPH
+ 0xBEAF: 0x8B66, //CJK UNIFIED IDEOGRAPH
+ 0xBEB0: 0x666F, //CJK UNIFIED IDEOGRAPH
+ 0xBEB1: 0x9888, //CJK UNIFIED IDEOGRAPH
+ 0xBEB2: 0x9759, //CJK UNIFIED IDEOGRAPH
+ 0xBEB3: 0x5883, //CJK UNIFIED IDEOGRAPH
+ 0xBEB4: 0x656C, //CJK UNIFIED IDEOGRAPH
+ 0xBEB5: 0x955C, //CJK UNIFIED IDEOGRAPH
+ 0xBEB6: 0x5F84, //CJK UNIFIED IDEOGRAPH
+ 0xBEB7: 0x75C9, //CJK UNIFIED IDEOGRAPH
+ 0xBEB8: 0x9756, //CJK UNIFIED IDEOGRAPH
+ 0xBEB9: 0x7ADF, //CJK UNIFIED IDEOGRAPH
+ 0xBEBA: 0x7ADE, //CJK UNIFIED IDEOGRAPH
+ 0xBEBB: 0x51C0, //CJK UNIFIED IDEOGRAPH
+ 0xBEBC: 0x70AF, //CJK UNIFIED IDEOGRAPH
+ 0xBEBD: 0x7A98, //CJK UNIFIED IDEOGRAPH
+ 0xBEBE: 0x63EA, //CJK UNIFIED IDEOGRAPH
+ 0xBEBF: 0x7A76, //CJK UNIFIED IDEOGRAPH
+ 0xBEC0: 0x7EA0, //CJK UNIFIED IDEOGRAPH
+ 0xBEC1: 0x7396, //CJK UNIFIED IDEOGRAPH
+ 0xBEC2: 0x97ED, //CJK UNIFIED IDEOGRAPH
+ 0xBEC3: 0x4E45, //CJK UNIFIED IDEOGRAPH
+ 0xBEC4: 0x7078, //CJK UNIFIED IDEOGRAPH
+ 0xBEC5: 0x4E5D, //CJK UNIFIED IDEOGRAPH
+ 0xBEC6: 0x9152, //CJK UNIFIED IDEOGRAPH
+ 0xBEC7: 0x53A9, //CJK UNIFIED IDEOGRAPH
+ 0xBEC8: 0x6551, //CJK UNIFIED IDEOGRAPH
+ 0xBEC9: 0x65E7, //CJK UNIFIED IDEOGRAPH
+ 0xBECA: 0x81FC, //CJK UNIFIED IDEOGRAPH
+ 0xBECB: 0x8205, //CJK UNIFIED IDEOGRAPH
+ 0xBECC: 0x548E, //CJK UNIFIED IDEOGRAPH
+ 0xBECD: 0x5C31, //CJK UNIFIED IDEOGRAPH
+ 0xBECE: 0x759A, //CJK UNIFIED IDEOGRAPH
+ 0xBECF: 0x97A0, //CJK UNIFIED IDEOGRAPH
+ 0xBED0: 0x62D8, //CJK UNIFIED IDEOGRAPH
+ 0xBED1: 0x72D9, //CJK UNIFIED IDEOGRAPH
+ 0xBED2: 0x75BD, //CJK UNIFIED IDEOGRAPH
+ 0xBED3: 0x5C45, //CJK UNIFIED IDEOGRAPH
+ 0xBED4: 0x9A79, //CJK UNIFIED IDEOGRAPH
+ 0xBED5: 0x83CA, //CJK UNIFIED IDEOGRAPH
+ 0xBED6: 0x5C40, //CJK UNIFIED IDEOGRAPH
+ 0xBED7: 0x5480, //CJK UNIFIED IDEOGRAPH
+ 0xBED8: 0x77E9, //CJK UNIFIED IDEOGRAPH
+ 0xBED9: 0x4E3E, //CJK UNIFIED IDEOGRAPH
+ 0xBEDA: 0x6CAE, //CJK UNIFIED IDEOGRAPH
+ 0xBEDB: 0x805A, //CJK UNIFIED IDEOGRAPH
+ 0xBEDC: 0x62D2, //CJK UNIFIED IDEOGRAPH
+ 0xBEDD: 0x636E, //CJK UNIFIED IDEOGRAPH
+ 0xBEDE: 0x5DE8, //CJK UNIFIED IDEOGRAPH
+ 0xBEDF: 0x5177, //CJK UNIFIED IDEOGRAPH
+ 0xBEE0: 0x8DDD, //CJK UNIFIED IDEOGRAPH
+ 0xBEE1: 0x8E1E, //CJK UNIFIED IDEOGRAPH
+ 0xBEE2: 0x952F, //CJK UNIFIED IDEOGRAPH
+ 0xBEE3: 0x4FF1, //CJK UNIFIED IDEOGRAPH
+ 0xBEE4: 0x53E5, //CJK UNIFIED IDEOGRAPH
+ 0xBEE5: 0x60E7, //CJK UNIFIED IDEOGRAPH
+ 0xBEE6: 0x70AC, //CJK UNIFIED IDEOGRAPH
+ 0xBEE7: 0x5267, //CJK UNIFIED IDEOGRAPH
+ 0xBEE8: 0x6350, //CJK UNIFIED IDEOGRAPH
+ 0xBEE9: 0x9E43, //CJK UNIFIED IDEOGRAPH
+ 0xBEEA: 0x5A1F, //CJK UNIFIED IDEOGRAPH
+ 0xBEEB: 0x5026, //CJK UNIFIED IDEOGRAPH
+ 0xBEEC: 0x7737, //CJK UNIFIED IDEOGRAPH
+ 0xBEED: 0x5377, //CJK UNIFIED IDEOGRAPH
+ 0xBEEE: 0x7EE2, //CJK UNIFIED IDEOGRAPH
+ 0xBEEF: 0x6485, //CJK UNIFIED IDEOGRAPH
+ 0xBEF0: 0x652B, //CJK UNIFIED IDEOGRAPH
+ 0xBEF1: 0x6289, //CJK UNIFIED IDEOGRAPH
+ 0xBEF2: 0x6398, //CJK UNIFIED IDEOGRAPH
+ 0xBEF3: 0x5014, //CJK UNIFIED IDEOGRAPH
+ 0xBEF4: 0x7235, //CJK UNIFIED IDEOGRAPH
+ 0xBEF5: 0x89C9, //CJK UNIFIED IDEOGRAPH
+ 0xBEF6: 0x51B3, //CJK UNIFIED IDEOGRAPH
+ 0xBEF7: 0x8BC0, //CJK UNIFIED IDEOGRAPH
+ 0xBEF8: 0x7EDD, //CJK UNIFIED IDEOGRAPH
+ 0xBEF9: 0x5747, //CJK UNIFIED IDEOGRAPH
+ 0xBEFA: 0x83CC, //CJK UNIFIED IDEOGRAPH
+ 0xBEFB: 0x94A7, //CJK UNIFIED IDEOGRAPH
+ 0xBEFC: 0x519B, //CJK UNIFIED IDEOGRAPH
+ 0xBEFD: 0x541B, //CJK UNIFIED IDEOGRAPH
+ 0xBEFE: 0x5CFB, //CJK UNIFIED IDEOGRAPH
+ 0xBF40: 0x7DFB, //CJK UNIFIED IDEOGRAPH
+ 0xBF41: 0x7DFC, //CJK UNIFIED IDEOGRAPH
+ 0xBF42: 0x7DFD, //CJK UNIFIED IDEOGRAPH
+ 0xBF43: 0x7DFE, //CJK UNIFIED IDEOGRAPH
+ 0xBF44: 0x7DFF, //CJK UNIFIED IDEOGRAPH
+ 0xBF45: 0x7E00, //CJK UNIFIED IDEOGRAPH
+ 0xBF46: 0x7E01, //CJK UNIFIED IDEOGRAPH
+ 0xBF47: 0x7E02, //CJK UNIFIED IDEOGRAPH
+ 0xBF48: 0x7E03, //CJK UNIFIED IDEOGRAPH
+ 0xBF49: 0x7E04, //CJK UNIFIED IDEOGRAPH
+ 0xBF4A: 0x7E05, //CJK UNIFIED IDEOGRAPH
+ 0xBF4B: 0x7E06, //CJK UNIFIED IDEOGRAPH
+ 0xBF4C: 0x7E07, //CJK UNIFIED IDEOGRAPH
+ 0xBF4D: 0x7E08, //CJK UNIFIED IDEOGRAPH
+ 0xBF4E: 0x7E09, //CJK UNIFIED IDEOGRAPH
+ 0xBF4F: 0x7E0A, //CJK UNIFIED IDEOGRAPH
+ 0xBF50: 0x7E0B, //CJK UNIFIED IDEOGRAPH
+ 0xBF51: 0x7E0C, //CJK UNIFIED IDEOGRAPH
+ 0xBF52: 0x7E0D, //CJK UNIFIED IDEOGRAPH
+ 0xBF53: 0x7E0E, //CJK UNIFIED IDEOGRAPH
+ 0xBF54: 0x7E0F, //CJK UNIFIED IDEOGRAPH
+ 0xBF55: 0x7E10, //CJK UNIFIED IDEOGRAPH
+ 0xBF56: 0x7E11, //CJK UNIFIED IDEOGRAPH
+ 0xBF57: 0x7E12, //CJK UNIFIED IDEOGRAPH
+ 0xBF58: 0x7E13, //CJK UNIFIED IDEOGRAPH
+ 0xBF59: 0x7E14, //CJK UNIFIED IDEOGRAPH
+ 0xBF5A: 0x7E15, //CJK UNIFIED IDEOGRAPH
+ 0xBF5B: 0x7E16, //CJK UNIFIED IDEOGRAPH
+ 0xBF5C: 0x7E17, //CJK UNIFIED IDEOGRAPH
+ 0xBF5D: 0x7E18, //CJK UNIFIED IDEOGRAPH
+ 0xBF5E: 0x7E19, //CJK UNIFIED IDEOGRAPH
+ 0xBF5F: 0x7E1A, //CJK UNIFIED IDEOGRAPH
+ 0xBF60: 0x7E1B, //CJK UNIFIED IDEOGRAPH
+ 0xBF61: 0x7E1C, //CJK UNIFIED IDEOGRAPH
+ 0xBF62: 0x7E1D, //CJK UNIFIED IDEOGRAPH
+ 0xBF63: 0x7E1E, //CJK UNIFIED IDEOGRAPH
+ 0xBF64: 0x7E1F, //CJK UNIFIED IDEOGRAPH
+ 0xBF65: 0x7E20, //CJK UNIFIED IDEOGRAPH
+ 0xBF66: 0x7E21, //CJK UNIFIED IDEOGRAPH
+ 0xBF67: 0x7E22, //CJK UNIFIED IDEOGRAPH
+ 0xBF68: 0x7E23, //CJK UNIFIED IDEOGRAPH
+ 0xBF69: 0x7E24, //CJK UNIFIED IDEOGRAPH
+ 0xBF6A: 0x7E25, //CJK UNIFIED IDEOGRAPH
+ 0xBF6B: 0x7E26, //CJK UNIFIED IDEOGRAPH
+ 0xBF6C: 0x7E27, //CJK UNIFIED IDEOGRAPH
+ 0xBF6D: 0x7E28, //CJK UNIFIED IDEOGRAPH
+ 0xBF6E: 0x7E29, //CJK UNIFIED IDEOGRAPH
+ 0xBF6F: 0x7E2A, //CJK UNIFIED IDEOGRAPH
+ 0xBF70: 0x7E2B, //CJK UNIFIED IDEOGRAPH
+ 0xBF71: 0x7E2C, //CJK UNIFIED IDEOGRAPH
+ 0xBF72: 0x7E2D, //CJK UNIFIED IDEOGRAPH
+ 0xBF73: 0x7E2E, //CJK UNIFIED IDEOGRAPH
+ 0xBF74: 0x7E2F, //CJK UNIFIED IDEOGRAPH
+ 0xBF75: 0x7E30, //CJK UNIFIED IDEOGRAPH
+ 0xBF76: 0x7E31, //CJK UNIFIED IDEOGRAPH
+ 0xBF77: 0x7E32, //CJK UNIFIED IDEOGRAPH
+ 0xBF78: 0x7E33, //CJK UNIFIED IDEOGRAPH
+ 0xBF79: 0x7E34, //CJK UNIFIED IDEOGRAPH
+ 0xBF7A: 0x7E35, //CJK UNIFIED IDEOGRAPH
+ 0xBF7B: 0x7E36, //CJK UNIFIED IDEOGRAPH
+ 0xBF7C: 0x7E37, //CJK UNIFIED IDEOGRAPH
+ 0xBF7D: 0x7E38, //CJK UNIFIED IDEOGRAPH
+ 0xBF7E: 0x7E39, //CJK UNIFIED IDEOGRAPH
+ 0xBF80: 0x7E3A, //CJK UNIFIED IDEOGRAPH
+ 0xBF81: 0x7E3C, //CJK UNIFIED IDEOGRAPH
+ 0xBF82: 0x7E3D, //CJK UNIFIED IDEOGRAPH
+ 0xBF83: 0x7E3E, //CJK UNIFIED IDEOGRAPH
+ 0xBF84: 0x7E3F, //CJK UNIFIED IDEOGRAPH
+ 0xBF85: 0x7E40, //CJK UNIFIED IDEOGRAPH
+ 0xBF86: 0x7E42, //CJK UNIFIED IDEOGRAPH
+ 0xBF87: 0x7E43, //CJK UNIFIED IDEOGRAPH
+ 0xBF88: 0x7E44, //CJK UNIFIED IDEOGRAPH
+ 0xBF89: 0x7E45, //CJK UNIFIED IDEOGRAPH
+ 0xBF8A: 0x7E46, //CJK UNIFIED IDEOGRAPH
+ 0xBF8B: 0x7E48, //CJK UNIFIED IDEOGRAPH
+ 0xBF8C: 0x7E49, //CJK UNIFIED IDEOGRAPH
+ 0xBF8D: 0x7E4A, //CJK UNIFIED IDEOGRAPH
+ 0xBF8E: 0x7E4B, //CJK UNIFIED IDEOGRAPH
+ 0xBF8F: 0x7E4C, //CJK UNIFIED IDEOGRAPH
+ 0xBF90: 0x7E4D, //CJK UNIFIED IDEOGRAPH
+ 0xBF91: 0x7E4E, //CJK UNIFIED IDEOGRAPH
+ 0xBF92: 0x7E4F, //CJK UNIFIED IDEOGRAPH
+ 0xBF93: 0x7E50, //CJK UNIFIED IDEOGRAPH
+ 0xBF94: 0x7E51, //CJK UNIFIED IDEOGRAPH
+ 0xBF95: 0x7E52, //CJK UNIFIED IDEOGRAPH
+ 0xBF96: 0x7E53, //CJK UNIFIED IDEOGRAPH
+ 0xBF97: 0x7E54, //CJK UNIFIED IDEOGRAPH
+ 0xBF98: 0x7E55, //CJK UNIFIED IDEOGRAPH
+ 0xBF99: 0x7E56, //CJK UNIFIED IDEOGRAPH
+ 0xBF9A: 0x7E57, //CJK UNIFIED IDEOGRAPH
+ 0xBF9B: 0x7E58, //CJK UNIFIED IDEOGRAPH
+ 0xBF9C: 0x7E59, //CJK UNIFIED IDEOGRAPH
+ 0xBF9D: 0x7E5A, //CJK UNIFIED IDEOGRAPH
+ 0xBF9E: 0x7E5B, //CJK UNIFIED IDEOGRAPH
+ 0xBF9F: 0x7E5C, //CJK UNIFIED IDEOGRAPH
+ 0xBFA0: 0x7E5D, //CJK UNIFIED IDEOGRAPH
+ 0xBFA1: 0x4FCA, //CJK UNIFIED IDEOGRAPH
+ 0xBFA2: 0x7AE3, //CJK UNIFIED IDEOGRAPH
+ 0xBFA3: 0x6D5A, //CJK UNIFIED IDEOGRAPH
+ 0xBFA4: 0x90E1, //CJK UNIFIED IDEOGRAPH
+ 0xBFA5: 0x9A8F, //CJK UNIFIED IDEOGRAPH
+ 0xBFA6: 0x5580, //CJK UNIFIED IDEOGRAPH
+ 0xBFA7: 0x5496, //CJK UNIFIED IDEOGRAPH
+ 0xBFA8: 0x5361, //CJK UNIFIED IDEOGRAPH
+ 0xBFA9: 0x54AF, //CJK UNIFIED IDEOGRAPH
+ 0xBFAA: 0x5F00, //CJK UNIFIED IDEOGRAPH
+ 0xBFAB: 0x63E9, //CJK UNIFIED IDEOGRAPH
+ 0xBFAC: 0x6977, //CJK UNIFIED IDEOGRAPH
+ 0xBFAD: 0x51EF, //CJK UNIFIED IDEOGRAPH
+ 0xBFAE: 0x6168, //CJK UNIFIED IDEOGRAPH
+ 0xBFAF: 0x520A, //CJK UNIFIED IDEOGRAPH
+ 0xBFB0: 0x582A, //CJK UNIFIED IDEOGRAPH
+ 0xBFB1: 0x52D8, //CJK UNIFIED IDEOGRAPH
+ 0xBFB2: 0x574E, //CJK UNIFIED IDEOGRAPH
+ 0xBFB3: 0x780D, //CJK UNIFIED IDEOGRAPH
+ 0xBFB4: 0x770B, //CJK UNIFIED IDEOGRAPH
+ 0xBFB5: 0x5EB7, //CJK UNIFIED IDEOGRAPH
+ 0xBFB6: 0x6177, //CJK UNIFIED IDEOGRAPH
+ 0xBFB7: 0x7CE0, //CJK UNIFIED IDEOGRAPH
+ 0xBFB8: 0x625B, //CJK UNIFIED IDEOGRAPH
+ 0xBFB9: 0x6297, //CJK UNIFIED IDEOGRAPH
+ 0xBFBA: 0x4EA2, //CJK UNIFIED IDEOGRAPH
+ 0xBFBB: 0x7095, //CJK UNIFIED IDEOGRAPH
+ 0xBFBC: 0x8003, //CJK UNIFIED IDEOGRAPH
+ 0xBFBD: 0x62F7, //CJK UNIFIED IDEOGRAPH
+ 0xBFBE: 0x70E4, //CJK UNIFIED IDEOGRAPH
+ 0xBFBF: 0x9760, //CJK UNIFIED IDEOGRAPH
+ 0xBFC0: 0x5777, //CJK UNIFIED IDEOGRAPH
+ 0xBFC1: 0x82DB, //CJK UNIFIED IDEOGRAPH
+ 0xBFC2: 0x67EF, //CJK UNIFIED IDEOGRAPH
+ 0xBFC3: 0x68F5, //CJK UNIFIED IDEOGRAPH
+ 0xBFC4: 0x78D5, //CJK UNIFIED IDEOGRAPH
+ 0xBFC5: 0x9897, //CJK UNIFIED IDEOGRAPH
+ 0xBFC6: 0x79D1, //CJK UNIFIED IDEOGRAPH
+ 0xBFC7: 0x58F3, //CJK UNIFIED IDEOGRAPH
+ 0xBFC8: 0x54B3, //CJK UNIFIED IDEOGRAPH
+ 0xBFC9: 0x53EF, //CJK UNIFIED IDEOGRAPH
+ 0xBFCA: 0x6E34, //CJK UNIFIED IDEOGRAPH
+ 0xBFCB: 0x514B, //CJK UNIFIED IDEOGRAPH
+ 0xBFCC: 0x523B, //CJK UNIFIED IDEOGRAPH
+ 0xBFCD: 0x5BA2, //CJK UNIFIED IDEOGRAPH
+ 0xBFCE: 0x8BFE, //CJK UNIFIED IDEOGRAPH
+ 0xBFCF: 0x80AF, //CJK UNIFIED IDEOGRAPH
+ 0xBFD0: 0x5543, //CJK UNIFIED IDEOGRAPH
+ 0xBFD1: 0x57A6, //CJK UNIFIED IDEOGRAPH
+ 0xBFD2: 0x6073, //CJK UNIFIED IDEOGRAPH
+ 0xBFD3: 0x5751, //CJK UNIFIED IDEOGRAPH
+ 0xBFD4: 0x542D, //CJK UNIFIED IDEOGRAPH
+ 0xBFD5: 0x7A7A, //CJK UNIFIED IDEOGRAPH
+ 0xBFD6: 0x6050, //CJK UNIFIED IDEOGRAPH
+ 0xBFD7: 0x5B54, //CJK UNIFIED IDEOGRAPH
+ 0xBFD8: 0x63A7, //CJK UNIFIED IDEOGRAPH
+ 0xBFD9: 0x62A0, //CJK UNIFIED IDEOGRAPH
+ 0xBFDA: 0x53E3, //CJK UNIFIED IDEOGRAPH
+ 0xBFDB: 0x6263, //CJK UNIFIED IDEOGRAPH
+ 0xBFDC: 0x5BC7, //CJK UNIFIED IDEOGRAPH
+ 0xBFDD: 0x67AF, //CJK UNIFIED IDEOGRAPH
+ 0xBFDE: 0x54ED, //CJK UNIFIED IDEOGRAPH
+ 0xBFDF: 0x7A9F, //CJK UNIFIED IDEOGRAPH
+ 0xBFE0: 0x82E6, //CJK UNIFIED IDEOGRAPH
+ 0xBFE1: 0x9177, //CJK UNIFIED IDEOGRAPH
+ 0xBFE2: 0x5E93, //CJK UNIFIED IDEOGRAPH
+ 0xBFE3: 0x88E4, //CJK UNIFIED IDEOGRAPH
+ 0xBFE4: 0x5938, //CJK UNIFIED IDEOGRAPH
+ 0xBFE5: 0x57AE, //CJK UNIFIED IDEOGRAPH
+ 0xBFE6: 0x630E, //CJK UNIFIED IDEOGRAPH
+ 0xBFE7: 0x8DE8, //CJK UNIFIED IDEOGRAPH
+ 0xBFE8: 0x80EF, //CJK UNIFIED IDEOGRAPH
+ 0xBFE9: 0x5757, //CJK UNIFIED IDEOGRAPH
+ 0xBFEA: 0x7B77, //CJK UNIFIED IDEOGRAPH
+ 0xBFEB: 0x4FA9, //CJK UNIFIED IDEOGRAPH
+ 0xBFEC: 0x5FEB, //CJK UNIFIED IDEOGRAPH
+ 0xBFED: 0x5BBD, //CJK UNIFIED IDEOGRAPH
+ 0xBFEE: 0x6B3E, //CJK UNIFIED IDEOGRAPH
+ 0xBFEF: 0x5321, //CJK UNIFIED IDEOGRAPH
+ 0xBFF0: 0x7B50, //CJK UNIFIED IDEOGRAPH
+ 0xBFF1: 0x72C2, //CJK UNIFIED IDEOGRAPH
+ 0xBFF2: 0x6846, //CJK UNIFIED IDEOGRAPH
+ 0xBFF3: 0x77FF, //CJK UNIFIED IDEOGRAPH
+ 0xBFF4: 0x7736, //CJK UNIFIED IDEOGRAPH
+ 0xBFF5: 0x65F7, //CJK UNIFIED IDEOGRAPH
+ 0xBFF6: 0x51B5, //CJK UNIFIED IDEOGRAPH
+ 0xBFF7: 0x4E8F, //CJK UNIFIED IDEOGRAPH
+ 0xBFF8: 0x76D4, //CJK UNIFIED IDEOGRAPH
+ 0xBFF9: 0x5CBF, //CJK UNIFIED IDEOGRAPH
+ 0xBFFA: 0x7AA5, //CJK UNIFIED IDEOGRAPH
+ 0xBFFB: 0x8475, //CJK UNIFIED IDEOGRAPH
+ 0xBFFC: 0x594E, //CJK UNIFIED IDEOGRAPH
+ 0xBFFD: 0x9B41, //CJK UNIFIED IDEOGRAPH
+ 0xBFFE: 0x5080, //CJK UNIFIED IDEOGRAPH
+ 0xC040: 0x7E5E, //CJK UNIFIED IDEOGRAPH
+ 0xC041: 0x7E5F, //CJK UNIFIED IDEOGRAPH
+ 0xC042: 0x7E60, //CJK UNIFIED IDEOGRAPH
+ 0xC043: 0x7E61, //CJK UNIFIED IDEOGRAPH
+ 0xC044: 0x7E62, //CJK UNIFIED IDEOGRAPH
+ 0xC045: 0x7E63, //CJK UNIFIED IDEOGRAPH
+ 0xC046: 0x7E64, //CJK UNIFIED IDEOGRAPH
+ 0xC047: 0x7E65, //CJK UNIFIED IDEOGRAPH
+ 0xC048: 0x7E66, //CJK UNIFIED IDEOGRAPH
+ 0xC049: 0x7E67, //CJK UNIFIED IDEOGRAPH
+ 0xC04A: 0x7E68, //CJK UNIFIED IDEOGRAPH
+ 0xC04B: 0x7E69, //CJK UNIFIED IDEOGRAPH
+ 0xC04C: 0x7E6A, //CJK UNIFIED IDEOGRAPH
+ 0xC04D: 0x7E6B, //CJK UNIFIED IDEOGRAPH
+ 0xC04E: 0x7E6C, //CJK UNIFIED IDEOGRAPH
+ 0xC04F: 0x7E6D, //CJK UNIFIED IDEOGRAPH
+ 0xC050: 0x7E6E, //CJK UNIFIED IDEOGRAPH
+ 0xC051: 0x7E6F, //CJK UNIFIED IDEOGRAPH
+ 0xC052: 0x7E70, //CJK UNIFIED IDEOGRAPH
+ 0xC053: 0x7E71, //CJK UNIFIED IDEOGRAPH
+ 0xC054: 0x7E72, //CJK UNIFIED IDEOGRAPH
+ 0xC055: 0x7E73, //CJK UNIFIED IDEOGRAPH
+ 0xC056: 0x7E74, //CJK UNIFIED IDEOGRAPH
+ 0xC057: 0x7E75, //CJK UNIFIED IDEOGRAPH
+ 0xC058: 0x7E76, //CJK UNIFIED IDEOGRAPH
+ 0xC059: 0x7E77, //CJK UNIFIED IDEOGRAPH
+ 0xC05A: 0x7E78, //CJK UNIFIED IDEOGRAPH
+ 0xC05B: 0x7E79, //CJK UNIFIED IDEOGRAPH
+ 0xC05C: 0x7E7A, //CJK UNIFIED IDEOGRAPH
+ 0xC05D: 0x7E7B, //CJK UNIFIED IDEOGRAPH
+ 0xC05E: 0x7E7C, //CJK UNIFIED IDEOGRAPH
+ 0xC05F: 0x7E7D, //CJK UNIFIED IDEOGRAPH
+ 0xC060: 0x7E7E, //CJK UNIFIED IDEOGRAPH
+ 0xC061: 0x7E7F, //CJK UNIFIED IDEOGRAPH
+ 0xC062: 0x7E80, //CJK UNIFIED IDEOGRAPH
+ 0xC063: 0x7E81, //CJK UNIFIED IDEOGRAPH
+ 0xC064: 0x7E83, //CJK UNIFIED IDEOGRAPH
+ 0xC065: 0x7E84, //CJK UNIFIED IDEOGRAPH
+ 0xC066: 0x7E85, //CJK UNIFIED IDEOGRAPH
+ 0xC067: 0x7E86, //CJK UNIFIED IDEOGRAPH
+ 0xC068: 0x7E87, //CJK UNIFIED IDEOGRAPH
+ 0xC069: 0x7E88, //CJK UNIFIED IDEOGRAPH
+ 0xC06A: 0x7E89, //CJK UNIFIED IDEOGRAPH
+ 0xC06B: 0x7E8A, //CJK UNIFIED IDEOGRAPH
+ 0xC06C: 0x7E8B, //CJK UNIFIED IDEOGRAPH
+ 0xC06D: 0x7E8C, //CJK UNIFIED IDEOGRAPH
+ 0xC06E: 0x7E8D, //CJK UNIFIED IDEOGRAPH
+ 0xC06F: 0x7E8E, //CJK UNIFIED IDEOGRAPH
+ 0xC070: 0x7E8F, //CJK UNIFIED IDEOGRAPH
+ 0xC071: 0x7E90, //CJK UNIFIED IDEOGRAPH
+ 0xC072: 0x7E91, //CJK UNIFIED IDEOGRAPH
+ 0xC073: 0x7E92, //CJK UNIFIED IDEOGRAPH
+ 0xC074: 0x7E93, //CJK UNIFIED IDEOGRAPH
+ 0xC075: 0x7E94, //CJK UNIFIED IDEOGRAPH
+ 0xC076: 0x7E95, //CJK UNIFIED IDEOGRAPH
+ 0xC077: 0x7E96, //CJK UNIFIED IDEOGRAPH
+ 0xC078: 0x7E97, //CJK UNIFIED IDEOGRAPH
+ 0xC079: 0x7E98, //CJK UNIFIED IDEOGRAPH
+ 0xC07A: 0x7E99, //CJK UNIFIED IDEOGRAPH
+ 0xC07B: 0x7E9A, //CJK UNIFIED IDEOGRAPH
+ 0xC07C: 0x7E9C, //CJK UNIFIED IDEOGRAPH
+ 0xC07D: 0x7E9D, //CJK UNIFIED IDEOGRAPH
+ 0xC07E: 0x7E9E, //CJK UNIFIED IDEOGRAPH
+ 0xC080: 0x7EAE, //CJK UNIFIED IDEOGRAPH
+ 0xC081: 0x7EB4, //CJK UNIFIED IDEOGRAPH
+ 0xC082: 0x7EBB, //CJK UNIFIED IDEOGRAPH
+ 0xC083: 0x7EBC, //CJK UNIFIED IDEOGRAPH
+ 0xC084: 0x7ED6, //CJK UNIFIED IDEOGRAPH
+ 0xC085: 0x7EE4, //CJK UNIFIED IDEOGRAPH
+ 0xC086: 0x7EEC, //CJK UNIFIED IDEOGRAPH
+ 0xC087: 0x7EF9, //CJK UNIFIED IDEOGRAPH
+ 0xC088: 0x7F0A, //CJK UNIFIED IDEOGRAPH
+ 0xC089: 0x7F10, //CJK UNIFIED IDEOGRAPH
+ 0xC08A: 0x7F1E, //CJK UNIFIED IDEOGRAPH
+ 0xC08B: 0x7F37, //CJK UNIFIED IDEOGRAPH
+ 0xC08C: 0x7F39, //CJK UNIFIED IDEOGRAPH
+ 0xC08D: 0x7F3B, //CJK UNIFIED IDEOGRAPH
+ 0xC08E: 0x7F3C, //CJK UNIFIED IDEOGRAPH
+ 0xC08F: 0x7F3D, //CJK UNIFIED IDEOGRAPH
+ 0xC090: 0x7F3E, //CJK UNIFIED IDEOGRAPH
+ 0xC091: 0x7F3F, //CJK UNIFIED IDEOGRAPH
+ 0xC092: 0x7F40, //CJK UNIFIED IDEOGRAPH
+ 0xC093: 0x7F41, //CJK UNIFIED IDEOGRAPH
+ 0xC094: 0x7F43, //CJK UNIFIED IDEOGRAPH
+ 0xC095: 0x7F46, //CJK UNIFIED IDEOGRAPH
+ 0xC096: 0x7F47, //CJK UNIFIED IDEOGRAPH
+ 0xC097: 0x7F48, //CJK UNIFIED IDEOGRAPH
+ 0xC098: 0x7F49, //CJK UNIFIED IDEOGRAPH
+ 0xC099: 0x7F4A, //CJK UNIFIED IDEOGRAPH
+ 0xC09A: 0x7F4B, //CJK UNIFIED IDEOGRAPH
+ 0xC09B: 0x7F4C, //CJK UNIFIED IDEOGRAPH
+ 0xC09C: 0x7F4D, //CJK UNIFIED IDEOGRAPH
+ 0xC09D: 0x7F4E, //CJK UNIFIED IDEOGRAPH
+ 0xC09E: 0x7F4F, //CJK UNIFIED IDEOGRAPH
+ 0xC09F: 0x7F52, //CJK UNIFIED IDEOGRAPH
+ 0xC0A0: 0x7F53, //CJK UNIFIED IDEOGRAPH
+ 0xC0A1: 0x9988, //CJK UNIFIED IDEOGRAPH
+ 0xC0A2: 0x6127, //CJK UNIFIED IDEOGRAPH
+ 0xC0A3: 0x6E83, //CJK UNIFIED IDEOGRAPH
+ 0xC0A4: 0x5764, //CJK UNIFIED IDEOGRAPH
+ 0xC0A5: 0x6606, //CJK UNIFIED IDEOGRAPH
+ 0xC0A6: 0x6346, //CJK UNIFIED IDEOGRAPH
+ 0xC0A7: 0x56F0, //CJK UNIFIED IDEOGRAPH
+ 0xC0A8: 0x62EC, //CJK UNIFIED IDEOGRAPH
+ 0xC0A9: 0x6269, //CJK UNIFIED IDEOGRAPH
+ 0xC0AA: 0x5ED3, //CJK UNIFIED IDEOGRAPH
+ 0xC0AB: 0x9614, //CJK UNIFIED IDEOGRAPH
+ 0xC0AC: 0x5783, //CJK UNIFIED IDEOGRAPH
+ 0xC0AD: 0x62C9, //CJK UNIFIED IDEOGRAPH
+ 0xC0AE: 0x5587, //CJK UNIFIED IDEOGRAPH
+ 0xC0AF: 0x8721, //CJK UNIFIED IDEOGRAPH
+ 0xC0B0: 0x814A, //CJK UNIFIED IDEOGRAPH
+ 0xC0B1: 0x8FA3, //CJK UNIFIED IDEOGRAPH
+ 0xC0B2: 0x5566, //CJK UNIFIED IDEOGRAPH
+ 0xC0B3: 0x83B1, //CJK UNIFIED IDEOGRAPH
+ 0xC0B4: 0x6765, //CJK UNIFIED IDEOGRAPH
+ 0xC0B5: 0x8D56, //CJK UNIFIED IDEOGRAPH
+ 0xC0B6: 0x84DD, //CJK UNIFIED IDEOGRAPH
+ 0xC0B7: 0x5A6A, //CJK UNIFIED IDEOGRAPH
+ 0xC0B8: 0x680F, //CJK UNIFIED IDEOGRAPH
+ 0xC0B9: 0x62E6, //CJK UNIFIED IDEOGRAPH
+ 0xC0BA: 0x7BEE, //CJK UNIFIED IDEOGRAPH
+ 0xC0BB: 0x9611, //CJK UNIFIED IDEOGRAPH
+ 0xC0BC: 0x5170, //CJK UNIFIED IDEOGRAPH
+ 0xC0BD: 0x6F9C, //CJK UNIFIED IDEOGRAPH
+ 0xC0BE: 0x8C30, //CJK UNIFIED IDEOGRAPH
+ 0xC0BF: 0x63FD, //CJK UNIFIED IDEOGRAPH
+ 0xC0C0: 0x89C8, //CJK UNIFIED IDEOGRAPH
+ 0xC0C1: 0x61D2, //CJK UNIFIED IDEOGRAPH
+ 0xC0C2: 0x7F06, //CJK UNIFIED IDEOGRAPH
+ 0xC0C3: 0x70C2, //CJK UNIFIED IDEOGRAPH
+ 0xC0C4: 0x6EE5, //CJK UNIFIED IDEOGRAPH
+ 0xC0C5: 0x7405, //CJK UNIFIED IDEOGRAPH
+ 0xC0C6: 0x6994, //CJK UNIFIED IDEOGRAPH
+ 0xC0C7: 0x72FC, //CJK UNIFIED IDEOGRAPH
+ 0xC0C8: 0x5ECA, //CJK UNIFIED IDEOGRAPH
+ 0xC0C9: 0x90CE, //CJK UNIFIED IDEOGRAPH
+ 0xC0CA: 0x6717, //CJK UNIFIED IDEOGRAPH
+ 0xC0CB: 0x6D6A, //CJK UNIFIED IDEOGRAPH
+ 0xC0CC: 0x635E, //CJK UNIFIED IDEOGRAPH
+ 0xC0CD: 0x52B3, //CJK UNIFIED IDEOGRAPH
+ 0xC0CE: 0x7262, //CJK UNIFIED IDEOGRAPH
+ 0xC0CF: 0x8001, //CJK UNIFIED IDEOGRAPH
+ 0xC0D0: 0x4F6C, //CJK UNIFIED IDEOGRAPH
+ 0xC0D1: 0x59E5, //CJK UNIFIED IDEOGRAPH
+ 0xC0D2: 0x916A, //CJK UNIFIED IDEOGRAPH
+ 0xC0D3: 0x70D9, //CJK UNIFIED IDEOGRAPH
+ 0xC0D4: 0x6D9D, //CJK UNIFIED IDEOGRAPH
+ 0xC0D5: 0x52D2, //CJK UNIFIED IDEOGRAPH
+ 0xC0D6: 0x4E50, //CJK UNIFIED IDEOGRAPH
+ 0xC0D7: 0x96F7, //CJK UNIFIED IDEOGRAPH
+ 0xC0D8: 0x956D, //CJK UNIFIED IDEOGRAPH
+ 0xC0D9: 0x857E, //CJK UNIFIED IDEOGRAPH
+ 0xC0DA: 0x78CA, //CJK UNIFIED IDEOGRAPH
+ 0xC0DB: 0x7D2F, //CJK UNIFIED IDEOGRAPH
+ 0xC0DC: 0x5121, //CJK UNIFIED IDEOGRAPH
+ 0xC0DD: 0x5792, //CJK UNIFIED IDEOGRAPH
+ 0xC0DE: 0x64C2, //CJK UNIFIED IDEOGRAPH
+ 0xC0DF: 0x808B, //CJK UNIFIED IDEOGRAPH
+ 0xC0E0: 0x7C7B, //CJK UNIFIED IDEOGRAPH
+ 0xC0E1: 0x6CEA, //CJK UNIFIED IDEOGRAPH
+ 0xC0E2: 0x68F1, //CJK UNIFIED IDEOGRAPH
+ 0xC0E3: 0x695E, //CJK UNIFIED IDEOGRAPH
+ 0xC0E4: 0x51B7, //CJK UNIFIED IDEOGRAPH
+ 0xC0E5: 0x5398, //CJK UNIFIED IDEOGRAPH
+ 0xC0E6: 0x68A8, //CJK UNIFIED IDEOGRAPH
+ 0xC0E7: 0x7281, //CJK UNIFIED IDEOGRAPH
+ 0xC0E8: 0x9ECE, //CJK UNIFIED IDEOGRAPH
+ 0xC0E9: 0x7BF1, //CJK UNIFIED IDEOGRAPH
+ 0xC0EA: 0x72F8, //CJK UNIFIED IDEOGRAPH
+ 0xC0EB: 0x79BB, //CJK UNIFIED IDEOGRAPH
+ 0xC0EC: 0x6F13, //CJK UNIFIED IDEOGRAPH
+ 0xC0ED: 0x7406, //CJK UNIFIED IDEOGRAPH
+ 0xC0EE: 0x674E, //CJK UNIFIED IDEOGRAPH
+ 0xC0EF: 0x91CC, //CJK UNIFIED IDEOGRAPH
+ 0xC0F0: 0x9CA4, //CJK UNIFIED IDEOGRAPH
+ 0xC0F1: 0x793C, //CJK UNIFIED IDEOGRAPH
+ 0xC0F2: 0x8389, //CJK UNIFIED IDEOGRAPH
+ 0xC0F3: 0x8354, //CJK UNIFIED IDEOGRAPH
+ 0xC0F4: 0x540F, //CJK UNIFIED IDEOGRAPH
+ 0xC0F5: 0x6817, //CJK UNIFIED IDEOGRAPH
+ 0xC0F6: 0x4E3D, //CJK UNIFIED IDEOGRAPH
+ 0xC0F7: 0x5389, //CJK UNIFIED IDEOGRAPH
+ 0xC0F8: 0x52B1, //CJK UNIFIED IDEOGRAPH
+ 0xC0F9: 0x783E, //CJK UNIFIED IDEOGRAPH
+ 0xC0FA: 0x5386, //CJK UNIFIED IDEOGRAPH
+ 0xC0FB: 0x5229, //CJK UNIFIED IDEOGRAPH
+ 0xC0FC: 0x5088, //CJK UNIFIED IDEOGRAPH
+ 0xC0FD: 0x4F8B, //CJK UNIFIED IDEOGRAPH
+ 0xC0FE: 0x4FD0, //CJK UNIFIED IDEOGRAPH
+ 0xC140: 0x7F56, //CJK UNIFIED IDEOGRAPH
+ 0xC141: 0x7F59, //CJK UNIFIED IDEOGRAPH
+ 0xC142: 0x7F5B, //CJK UNIFIED IDEOGRAPH
+ 0xC143: 0x7F5C, //CJK UNIFIED IDEOGRAPH
+ 0xC144: 0x7F5D, //CJK UNIFIED IDEOGRAPH
+ 0xC145: 0x7F5E, //CJK UNIFIED IDEOGRAPH
+ 0xC146: 0x7F60, //CJK UNIFIED IDEOGRAPH
+ 0xC147: 0x7F63, //CJK UNIFIED IDEOGRAPH
+ 0xC148: 0x7F64, //CJK UNIFIED IDEOGRAPH
+ 0xC149: 0x7F65, //CJK UNIFIED IDEOGRAPH
+ 0xC14A: 0x7F66, //CJK UNIFIED IDEOGRAPH
+ 0xC14B: 0x7F67, //CJK UNIFIED IDEOGRAPH
+ 0xC14C: 0x7F6B, //CJK UNIFIED IDEOGRAPH
+ 0xC14D: 0x7F6C, //CJK UNIFIED IDEOGRAPH
+ 0xC14E: 0x7F6D, //CJK UNIFIED IDEOGRAPH
+ 0xC14F: 0x7F6F, //CJK UNIFIED IDEOGRAPH
+ 0xC150: 0x7F70, //CJK UNIFIED IDEOGRAPH
+ 0xC151: 0x7F73, //CJK UNIFIED IDEOGRAPH
+ 0xC152: 0x7F75, //CJK UNIFIED IDEOGRAPH
+ 0xC153: 0x7F76, //CJK UNIFIED IDEOGRAPH
+ 0xC154: 0x7F77, //CJK UNIFIED IDEOGRAPH
+ 0xC155: 0x7F78, //CJK UNIFIED IDEOGRAPH
+ 0xC156: 0x7F7A, //CJK UNIFIED IDEOGRAPH
+ 0xC157: 0x7F7B, //CJK UNIFIED IDEOGRAPH
+ 0xC158: 0x7F7C, //CJK UNIFIED IDEOGRAPH
+ 0xC159: 0x7F7D, //CJK UNIFIED IDEOGRAPH
+ 0xC15A: 0x7F7F, //CJK UNIFIED IDEOGRAPH
+ 0xC15B: 0x7F80, //CJK UNIFIED IDEOGRAPH
+ 0xC15C: 0x7F82, //CJK UNIFIED IDEOGRAPH
+ 0xC15D: 0x7F83, //CJK UNIFIED IDEOGRAPH
+ 0xC15E: 0x7F84, //CJK UNIFIED IDEOGRAPH
+ 0xC15F: 0x7F85, //CJK UNIFIED IDEOGRAPH
+ 0xC160: 0x7F86, //CJK UNIFIED IDEOGRAPH
+ 0xC161: 0x7F87, //CJK UNIFIED IDEOGRAPH
+ 0xC162: 0x7F88, //CJK UNIFIED IDEOGRAPH
+ 0xC163: 0x7F89, //CJK UNIFIED IDEOGRAPH
+ 0xC164: 0x7F8B, //CJK UNIFIED IDEOGRAPH
+ 0xC165: 0x7F8D, //CJK UNIFIED IDEOGRAPH
+ 0xC166: 0x7F8F, //CJK UNIFIED IDEOGRAPH
+ 0xC167: 0x7F90, //CJK UNIFIED IDEOGRAPH
+ 0xC168: 0x7F91, //CJK UNIFIED IDEOGRAPH
+ 0xC169: 0x7F92, //CJK UNIFIED IDEOGRAPH
+ 0xC16A: 0x7F93, //CJK UNIFIED IDEOGRAPH
+ 0xC16B: 0x7F95, //CJK UNIFIED IDEOGRAPH
+ 0xC16C: 0x7F96, //CJK UNIFIED IDEOGRAPH
+ 0xC16D: 0x7F97, //CJK UNIFIED IDEOGRAPH
+ 0xC16E: 0x7F98, //CJK UNIFIED IDEOGRAPH
+ 0xC16F: 0x7F99, //CJK UNIFIED IDEOGRAPH
+ 0xC170: 0x7F9B, //CJK UNIFIED IDEOGRAPH
+ 0xC171: 0x7F9C, //CJK UNIFIED IDEOGRAPH
+ 0xC172: 0x7FA0, //CJK UNIFIED IDEOGRAPH
+ 0xC173: 0x7FA2, //CJK UNIFIED IDEOGRAPH
+ 0xC174: 0x7FA3, //CJK UNIFIED IDEOGRAPH
+ 0xC175: 0x7FA5, //CJK UNIFIED IDEOGRAPH
+ 0xC176: 0x7FA6, //CJK UNIFIED IDEOGRAPH
+ 0xC177: 0x7FA8, //CJK UNIFIED IDEOGRAPH
+ 0xC178: 0x7FA9, //CJK UNIFIED IDEOGRAPH
+ 0xC179: 0x7FAA, //CJK UNIFIED IDEOGRAPH
+ 0xC17A: 0x7FAB, //CJK UNIFIED IDEOGRAPH
+ 0xC17B: 0x7FAC, //CJK UNIFIED IDEOGRAPH
+ 0xC17C: 0x7FAD, //CJK UNIFIED IDEOGRAPH
+ 0xC17D: 0x7FAE, //CJK UNIFIED IDEOGRAPH
+ 0xC17E: 0x7FB1, //CJK UNIFIED IDEOGRAPH
+ 0xC180: 0x7FB3, //CJK UNIFIED IDEOGRAPH
+ 0xC181: 0x7FB4, //CJK UNIFIED IDEOGRAPH
+ 0xC182: 0x7FB5, //CJK UNIFIED IDEOGRAPH
+ 0xC183: 0x7FB6, //CJK UNIFIED IDEOGRAPH
+ 0xC184: 0x7FB7, //CJK UNIFIED IDEOGRAPH
+ 0xC185: 0x7FBA, //CJK UNIFIED IDEOGRAPH
+ 0xC186: 0x7FBB, //CJK UNIFIED IDEOGRAPH
+ 0xC187: 0x7FBE, //CJK UNIFIED IDEOGRAPH
+ 0xC188: 0x7FC0, //CJK UNIFIED IDEOGRAPH
+ 0xC189: 0x7FC2, //CJK UNIFIED IDEOGRAPH
+ 0xC18A: 0x7FC3, //CJK UNIFIED IDEOGRAPH
+ 0xC18B: 0x7FC4, //CJK UNIFIED IDEOGRAPH
+ 0xC18C: 0x7FC6, //CJK UNIFIED IDEOGRAPH
+ 0xC18D: 0x7FC7, //CJK UNIFIED IDEOGRAPH
+ 0xC18E: 0x7FC8, //CJK UNIFIED IDEOGRAPH
+ 0xC18F: 0x7FC9, //CJK UNIFIED IDEOGRAPH
+ 0xC190: 0x7FCB, //CJK UNIFIED IDEOGRAPH
+ 0xC191: 0x7FCD, //CJK UNIFIED IDEOGRAPH
+ 0xC192: 0x7FCF, //CJK UNIFIED IDEOGRAPH
+ 0xC193: 0x7FD0, //CJK UNIFIED IDEOGRAPH
+ 0xC194: 0x7FD1, //CJK UNIFIED IDEOGRAPH
+ 0xC195: 0x7FD2, //CJK UNIFIED IDEOGRAPH
+ 0xC196: 0x7FD3, //CJK UNIFIED IDEOGRAPH
+ 0xC197: 0x7FD6, //CJK UNIFIED IDEOGRAPH
+ 0xC198: 0x7FD7, //CJK UNIFIED IDEOGRAPH
+ 0xC199: 0x7FD9, //CJK UNIFIED IDEOGRAPH
+ 0xC19A: 0x7FDA, //CJK UNIFIED IDEOGRAPH
+ 0xC19B: 0x7FDB, //CJK UNIFIED IDEOGRAPH
+ 0xC19C: 0x7FDC, //CJK UNIFIED IDEOGRAPH
+ 0xC19D: 0x7FDD, //CJK UNIFIED IDEOGRAPH
+ 0xC19E: 0x7FDE, //CJK UNIFIED IDEOGRAPH
+ 0xC19F: 0x7FE2, //CJK UNIFIED IDEOGRAPH
+ 0xC1A0: 0x7FE3, //CJK UNIFIED IDEOGRAPH
+ 0xC1A1: 0x75E2, //CJK UNIFIED IDEOGRAPH
+ 0xC1A2: 0x7ACB, //CJK UNIFIED IDEOGRAPH
+ 0xC1A3: 0x7C92, //CJK UNIFIED IDEOGRAPH
+ 0xC1A4: 0x6CA5, //CJK UNIFIED IDEOGRAPH
+ 0xC1A5: 0x96B6, //CJK UNIFIED IDEOGRAPH
+ 0xC1A6: 0x529B, //CJK UNIFIED IDEOGRAPH
+ 0xC1A7: 0x7483, //CJK UNIFIED IDEOGRAPH
+ 0xC1A8: 0x54E9, //CJK UNIFIED IDEOGRAPH
+ 0xC1A9: 0x4FE9, //CJK UNIFIED IDEOGRAPH
+ 0xC1AA: 0x8054, //CJK UNIFIED IDEOGRAPH
+ 0xC1AB: 0x83B2, //CJK UNIFIED IDEOGRAPH
+ 0xC1AC: 0x8FDE, //CJK UNIFIED IDEOGRAPH
+ 0xC1AD: 0x9570, //CJK UNIFIED IDEOGRAPH
+ 0xC1AE: 0x5EC9, //CJK UNIFIED IDEOGRAPH
+ 0xC1AF: 0x601C, //CJK UNIFIED IDEOGRAPH
+ 0xC1B0: 0x6D9F, //CJK UNIFIED IDEOGRAPH
+ 0xC1B1: 0x5E18, //CJK UNIFIED IDEOGRAPH
+ 0xC1B2: 0x655B, //CJK UNIFIED IDEOGRAPH
+ 0xC1B3: 0x8138, //CJK UNIFIED IDEOGRAPH
+ 0xC1B4: 0x94FE, //CJK UNIFIED IDEOGRAPH
+ 0xC1B5: 0x604B, //CJK UNIFIED IDEOGRAPH
+ 0xC1B6: 0x70BC, //CJK UNIFIED IDEOGRAPH
+ 0xC1B7: 0x7EC3, //CJK UNIFIED IDEOGRAPH
+ 0xC1B8: 0x7CAE, //CJK UNIFIED IDEOGRAPH
+ 0xC1B9: 0x51C9, //CJK UNIFIED IDEOGRAPH
+ 0xC1BA: 0x6881, //CJK UNIFIED IDEOGRAPH
+ 0xC1BB: 0x7CB1, //CJK UNIFIED IDEOGRAPH
+ 0xC1BC: 0x826F, //CJK UNIFIED IDEOGRAPH
+ 0xC1BD: 0x4E24, //CJK UNIFIED IDEOGRAPH
+ 0xC1BE: 0x8F86, //CJK UNIFIED IDEOGRAPH
+ 0xC1BF: 0x91CF, //CJK UNIFIED IDEOGRAPH
+ 0xC1C0: 0x667E, //CJK UNIFIED IDEOGRAPH
+ 0xC1C1: 0x4EAE, //CJK UNIFIED IDEOGRAPH
+ 0xC1C2: 0x8C05, //CJK UNIFIED IDEOGRAPH
+ 0xC1C3: 0x64A9, //CJK UNIFIED IDEOGRAPH
+ 0xC1C4: 0x804A, //CJK UNIFIED IDEOGRAPH
+ 0xC1C5: 0x50DA, //CJK UNIFIED IDEOGRAPH
+ 0xC1C6: 0x7597, //CJK UNIFIED IDEOGRAPH
+ 0xC1C7: 0x71CE, //CJK UNIFIED IDEOGRAPH
+ 0xC1C8: 0x5BE5, //CJK UNIFIED IDEOGRAPH
+ 0xC1C9: 0x8FBD, //CJK UNIFIED IDEOGRAPH
+ 0xC1CA: 0x6F66, //CJK UNIFIED IDEOGRAPH
+ 0xC1CB: 0x4E86, //CJK UNIFIED IDEOGRAPH
+ 0xC1CC: 0x6482, //CJK UNIFIED IDEOGRAPH
+ 0xC1CD: 0x9563, //CJK UNIFIED IDEOGRAPH
+ 0xC1CE: 0x5ED6, //CJK UNIFIED IDEOGRAPH
+ 0xC1CF: 0x6599, //CJK UNIFIED IDEOGRAPH
+ 0xC1D0: 0x5217, //CJK UNIFIED IDEOGRAPH
+ 0xC1D1: 0x88C2, //CJK UNIFIED IDEOGRAPH
+ 0xC1D2: 0x70C8, //CJK UNIFIED IDEOGRAPH
+ 0xC1D3: 0x52A3, //CJK UNIFIED IDEOGRAPH
+ 0xC1D4: 0x730E, //CJK UNIFIED IDEOGRAPH
+ 0xC1D5: 0x7433, //CJK UNIFIED IDEOGRAPH
+ 0xC1D6: 0x6797, //CJK UNIFIED IDEOGRAPH
+ 0xC1D7: 0x78F7, //CJK UNIFIED IDEOGRAPH
+ 0xC1D8: 0x9716, //CJK UNIFIED IDEOGRAPH
+ 0xC1D9: 0x4E34, //CJK UNIFIED IDEOGRAPH
+ 0xC1DA: 0x90BB, //CJK UNIFIED IDEOGRAPH
+ 0xC1DB: 0x9CDE, //CJK UNIFIED IDEOGRAPH
+ 0xC1DC: 0x6DCB, //CJK UNIFIED IDEOGRAPH
+ 0xC1DD: 0x51DB, //CJK UNIFIED IDEOGRAPH
+ 0xC1DE: 0x8D41, //CJK UNIFIED IDEOGRAPH
+ 0xC1DF: 0x541D, //CJK UNIFIED IDEOGRAPH
+ 0xC1E0: 0x62CE, //CJK UNIFIED IDEOGRAPH
+ 0xC1E1: 0x73B2, //CJK UNIFIED IDEOGRAPH
+ 0xC1E2: 0x83F1, //CJK UNIFIED IDEOGRAPH
+ 0xC1E3: 0x96F6, //CJK UNIFIED IDEOGRAPH
+ 0xC1E4: 0x9F84, //CJK UNIFIED IDEOGRAPH
+ 0xC1E5: 0x94C3, //CJK UNIFIED IDEOGRAPH
+ 0xC1E6: 0x4F36, //CJK UNIFIED IDEOGRAPH
+ 0xC1E7: 0x7F9A, //CJK UNIFIED IDEOGRAPH
+ 0xC1E8: 0x51CC, //CJK UNIFIED IDEOGRAPH
+ 0xC1E9: 0x7075, //CJK UNIFIED IDEOGRAPH
+ 0xC1EA: 0x9675, //CJK UNIFIED IDEOGRAPH
+ 0xC1EB: 0x5CAD, //CJK UNIFIED IDEOGRAPH
+ 0xC1EC: 0x9886, //CJK UNIFIED IDEOGRAPH
+ 0xC1ED: 0x53E6, //CJK UNIFIED IDEOGRAPH
+ 0xC1EE: 0x4EE4, //CJK UNIFIED IDEOGRAPH
+ 0xC1EF: 0x6E9C, //CJK UNIFIED IDEOGRAPH
+ 0xC1F0: 0x7409, //CJK UNIFIED IDEOGRAPH
+ 0xC1F1: 0x69B4, //CJK UNIFIED IDEOGRAPH
+ 0xC1F2: 0x786B, //CJK UNIFIED IDEOGRAPH
+ 0xC1F3: 0x998F, //CJK UNIFIED IDEOGRAPH
+ 0xC1F4: 0x7559, //CJK UNIFIED IDEOGRAPH
+ 0xC1F5: 0x5218, //CJK UNIFIED IDEOGRAPH
+ 0xC1F6: 0x7624, //CJK UNIFIED IDEOGRAPH
+ 0xC1F7: 0x6D41, //CJK UNIFIED IDEOGRAPH
+ 0xC1F8: 0x67F3, //CJK UNIFIED IDEOGRAPH
+ 0xC1F9: 0x516D, //CJK UNIFIED IDEOGRAPH
+ 0xC1FA: 0x9F99, //CJK UNIFIED IDEOGRAPH
+ 0xC1FB: 0x804B, //CJK UNIFIED IDEOGRAPH
+ 0xC1FC: 0x5499, //CJK UNIFIED IDEOGRAPH
+ 0xC1FD: 0x7B3C, //CJK UNIFIED IDEOGRAPH
+ 0xC1FE: 0x7ABF, //CJK UNIFIED IDEOGRAPH
+ 0xC240: 0x7FE4, //CJK UNIFIED IDEOGRAPH
+ 0xC241: 0x7FE7, //CJK UNIFIED IDEOGRAPH
+ 0xC242: 0x7FE8, //CJK UNIFIED IDEOGRAPH
+ 0xC243: 0x7FEA, //CJK UNIFIED IDEOGRAPH
+ 0xC244: 0x7FEB, //CJK UNIFIED IDEOGRAPH
+ 0xC245: 0x7FEC, //CJK UNIFIED IDEOGRAPH
+ 0xC246: 0x7FED, //CJK UNIFIED IDEOGRAPH
+ 0xC247: 0x7FEF, //CJK UNIFIED IDEOGRAPH
+ 0xC248: 0x7FF2, //CJK UNIFIED IDEOGRAPH
+ 0xC249: 0x7FF4, //CJK UNIFIED IDEOGRAPH
+ 0xC24A: 0x7FF5, //CJK UNIFIED IDEOGRAPH
+ 0xC24B: 0x7FF6, //CJK UNIFIED IDEOGRAPH
+ 0xC24C: 0x7FF7, //CJK UNIFIED IDEOGRAPH
+ 0xC24D: 0x7FF8, //CJK UNIFIED IDEOGRAPH
+ 0xC24E: 0x7FF9, //CJK UNIFIED IDEOGRAPH
+ 0xC24F: 0x7FFA, //CJK UNIFIED IDEOGRAPH
+ 0xC250: 0x7FFD, //CJK UNIFIED IDEOGRAPH
+ 0xC251: 0x7FFE, //CJK UNIFIED IDEOGRAPH
+ 0xC252: 0x7FFF, //CJK UNIFIED IDEOGRAPH
+ 0xC253: 0x8002, //CJK UNIFIED IDEOGRAPH
+ 0xC254: 0x8007, //CJK UNIFIED IDEOGRAPH
+ 0xC255: 0x8008, //CJK UNIFIED IDEOGRAPH
+ 0xC256: 0x8009, //CJK UNIFIED IDEOGRAPH
+ 0xC257: 0x800A, //CJK UNIFIED IDEOGRAPH
+ 0xC258: 0x800E, //CJK UNIFIED IDEOGRAPH
+ 0xC259: 0x800F, //CJK UNIFIED IDEOGRAPH
+ 0xC25A: 0x8011, //CJK UNIFIED IDEOGRAPH
+ 0xC25B: 0x8013, //CJK UNIFIED IDEOGRAPH
+ 0xC25C: 0x801A, //CJK UNIFIED IDEOGRAPH
+ 0xC25D: 0x801B, //CJK UNIFIED IDEOGRAPH
+ 0xC25E: 0x801D, //CJK UNIFIED IDEOGRAPH
+ 0xC25F: 0x801E, //CJK UNIFIED IDEOGRAPH
+ 0xC260: 0x801F, //CJK UNIFIED IDEOGRAPH
+ 0xC261: 0x8021, //CJK UNIFIED IDEOGRAPH
+ 0xC262: 0x8023, //CJK UNIFIED IDEOGRAPH
+ 0xC263: 0x8024, //CJK UNIFIED IDEOGRAPH
+ 0xC264: 0x802B, //CJK UNIFIED IDEOGRAPH
+ 0xC265: 0x802C, //CJK UNIFIED IDEOGRAPH
+ 0xC266: 0x802D, //CJK UNIFIED IDEOGRAPH
+ 0xC267: 0x802E, //CJK UNIFIED IDEOGRAPH
+ 0xC268: 0x802F, //CJK UNIFIED IDEOGRAPH
+ 0xC269: 0x8030, //CJK UNIFIED IDEOGRAPH
+ 0xC26A: 0x8032, //CJK UNIFIED IDEOGRAPH
+ 0xC26B: 0x8034, //CJK UNIFIED IDEOGRAPH
+ 0xC26C: 0x8039, //CJK UNIFIED IDEOGRAPH
+ 0xC26D: 0x803A, //CJK UNIFIED IDEOGRAPH
+ 0xC26E: 0x803C, //CJK UNIFIED IDEOGRAPH
+ 0xC26F: 0x803E, //CJK UNIFIED IDEOGRAPH
+ 0xC270: 0x8040, //CJK UNIFIED IDEOGRAPH
+ 0xC271: 0x8041, //CJK UNIFIED IDEOGRAPH
+ 0xC272: 0x8044, //CJK UNIFIED IDEOGRAPH
+ 0xC273: 0x8045, //CJK UNIFIED IDEOGRAPH
+ 0xC274: 0x8047, //CJK UNIFIED IDEOGRAPH
+ 0xC275: 0x8048, //CJK UNIFIED IDEOGRAPH
+ 0xC276: 0x8049, //CJK UNIFIED IDEOGRAPH
+ 0xC277: 0x804E, //CJK UNIFIED IDEOGRAPH
+ 0xC278: 0x804F, //CJK UNIFIED IDEOGRAPH
+ 0xC279: 0x8050, //CJK UNIFIED IDEOGRAPH
+ 0xC27A: 0x8051, //CJK UNIFIED IDEOGRAPH
+ 0xC27B: 0x8053, //CJK UNIFIED IDEOGRAPH
+ 0xC27C: 0x8055, //CJK UNIFIED IDEOGRAPH
+ 0xC27D: 0x8056, //CJK UNIFIED IDEOGRAPH
+ 0xC27E: 0x8057, //CJK UNIFIED IDEOGRAPH
+ 0xC280: 0x8059, //CJK UNIFIED IDEOGRAPH
+ 0xC281: 0x805B, //CJK UNIFIED IDEOGRAPH
+ 0xC282: 0x805C, //CJK UNIFIED IDEOGRAPH
+ 0xC283: 0x805D, //CJK UNIFIED IDEOGRAPH
+ 0xC284: 0x805E, //CJK UNIFIED IDEOGRAPH
+ 0xC285: 0x805F, //CJK UNIFIED IDEOGRAPH
+ 0xC286: 0x8060, //CJK UNIFIED IDEOGRAPH
+ 0xC287: 0x8061, //CJK UNIFIED IDEOGRAPH
+ 0xC288: 0x8062, //CJK UNIFIED IDEOGRAPH
+ 0xC289: 0x8063, //CJK UNIFIED IDEOGRAPH
+ 0xC28A: 0x8064, //CJK UNIFIED IDEOGRAPH
+ 0xC28B: 0x8065, //CJK UNIFIED IDEOGRAPH
+ 0xC28C: 0x8066, //CJK UNIFIED IDEOGRAPH
+ 0xC28D: 0x8067, //CJK UNIFIED IDEOGRAPH
+ 0xC28E: 0x8068, //CJK UNIFIED IDEOGRAPH
+ 0xC28F: 0x806B, //CJK UNIFIED IDEOGRAPH
+ 0xC290: 0x806C, //CJK UNIFIED IDEOGRAPH
+ 0xC291: 0x806D, //CJK UNIFIED IDEOGRAPH
+ 0xC292: 0x806E, //CJK UNIFIED IDEOGRAPH
+ 0xC293: 0x806F, //CJK UNIFIED IDEOGRAPH
+ 0xC294: 0x8070, //CJK UNIFIED IDEOGRAPH
+ 0xC295: 0x8072, //CJK UNIFIED IDEOGRAPH
+ 0xC296: 0x8073, //CJK UNIFIED IDEOGRAPH
+ 0xC297: 0x8074, //CJK UNIFIED IDEOGRAPH
+ 0xC298: 0x8075, //CJK UNIFIED IDEOGRAPH
+ 0xC299: 0x8076, //CJK UNIFIED IDEOGRAPH
+ 0xC29A: 0x8077, //CJK UNIFIED IDEOGRAPH
+ 0xC29B: 0x8078, //CJK UNIFIED IDEOGRAPH
+ 0xC29C: 0x8079, //CJK UNIFIED IDEOGRAPH
+ 0xC29D: 0x807A, //CJK UNIFIED IDEOGRAPH
+ 0xC29E: 0x807B, //CJK UNIFIED IDEOGRAPH
+ 0xC29F: 0x807C, //CJK UNIFIED IDEOGRAPH
+ 0xC2A0: 0x807D, //CJK UNIFIED IDEOGRAPH
+ 0xC2A1: 0x9686, //CJK UNIFIED IDEOGRAPH
+ 0xC2A2: 0x5784, //CJK UNIFIED IDEOGRAPH
+ 0xC2A3: 0x62E2, //CJK UNIFIED IDEOGRAPH
+ 0xC2A4: 0x9647, //CJK UNIFIED IDEOGRAPH
+ 0xC2A5: 0x697C, //CJK UNIFIED IDEOGRAPH
+ 0xC2A6: 0x5A04, //CJK UNIFIED IDEOGRAPH
+ 0xC2A7: 0x6402, //CJK UNIFIED IDEOGRAPH
+ 0xC2A8: 0x7BD3, //CJK UNIFIED IDEOGRAPH
+ 0xC2A9: 0x6F0F, //CJK UNIFIED IDEOGRAPH
+ 0xC2AA: 0x964B, //CJK UNIFIED IDEOGRAPH
+ 0xC2AB: 0x82A6, //CJK UNIFIED IDEOGRAPH
+ 0xC2AC: 0x5362, //CJK UNIFIED IDEOGRAPH
+ 0xC2AD: 0x9885, //CJK UNIFIED IDEOGRAPH
+ 0xC2AE: 0x5E90, //CJK UNIFIED IDEOGRAPH
+ 0xC2AF: 0x7089, //CJK UNIFIED IDEOGRAPH
+ 0xC2B0: 0x63B3, //CJK UNIFIED IDEOGRAPH
+ 0xC2B1: 0x5364, //CJK UNIFIED IDEOGRAPH
+ 0xC2B2: 0x864F, //CJK UNIFIED IDEOGRAPH
+ 0xC2B3: 0x9C81, //CJK UNIFIED IDEOGRAPH
+ 0xC2B4: 0x9E93, //CJK UNIFIED IDEOGRAPH
+ 0xC2B5: 0x788C, //CJK UNIFIED IDEOGRAPH
+ 0xC2B6: 0x9732, //CJK UNIFIED IDEOGRAPH
+ 0xC2B7: 0x8DEF, //CJK UNIFIED IDEOGRAPH
+ 0xC2B8: 0x8D42, //CJK UNIFIED IDEOGRAPH
+ 0xC2B9: 0x9E7F, //CJK UNIFIED IDEOGRAPH
+ 0xC2BA: 0x6F5E, //CJK UNIFIED IDEOGRAPH
+ 0xC2BB: 0x7984, //CJK UNIFIED IDEOGRAPH
+ 0xC2BC: 0x5F55, //CJK UNIFIED IDEOGRAPH
+ 0xC2BD: 0x9646, //CJK UNIFIED IDEOGRAPH
+ 0xC2BE: 0x622E, //CJK UNIFIED IDEOGRAPH
+ 0xC2BF: 0x9A74, //CJK UNIFIED IDEOGRAPH
+ 0xC2C0: 0x5415, //CJK UNIFIED IDEOGRAPH
+ 0xC2C1: 0x94DD, //CJK UNIFIED IDEOGRAPH
+ 0xC2C2: 0x4FA3, //CJK UNIFIED IDEOGRAPH
+ 0xC2C3: 0x65C5, //CJK UNIFIED IDEOGRAPH
+ 0xC2C4: 0x5C65, //CJK UNIFIED IDEOGRAPH
+ 0xC2C5: 0x5C61, //CJK UNIFIED IDEOGRAPH
+ 0xC2C6: 0x7F15, //CJK UNIFIED IDEOGRAPH
+ 0xC2C7: 0x8651, //CJK UNIFIED IDEOGRAPH
+ 0xC2C8: 0x6C2F, //CJK UNIFIED IDEOGRAPH
+ 0xC2C9: 0x5F8B, //CJK UNIFIED IDEOGRAPH
+ 0xC2CA: 0x7387, //CJK UNIFIED IDEOGRAPH
+ 0xC2CB: 0x6EE4, //CJK UNIFIED IDEOGRAPH
+ 0xC2CC: 0x7EFF, //CJK UNIFIED IDEOGRAPH
+ 0xC2CD: 0x5CE6, //CJK UNIFIED IDEOGRAPH
+ 0xC2CE: 0x631B, //CJK UNIFIED IDEOGRAPH
+ 0xC2CF: 0x5B6A, //CJK UNIFIED IDEOGRAPH
+ 0xC2D0: 0x6EE6, //CJK UNIFIED IDEOGRAPH
+ 0xC2D1: 0x5375, //CJK UNIFIED IDEOGRAPH
+ 0xC2D2: 0x4E71, //CJK UNIFIED IDEOGRAPH
+ 0xC2D3: 0x63A0, //CJK UNIFIED IDEOGRAPH
+ 0xC2D4: 0x7565, //CJK UNIFIED IDEOGRAPH
+ 0xC2D5: 0x62A1, //CJK UNIFIED IDEOGRAPH
+ 0xC2D6: 0x8F6E, //CJK UNIFIED IDEOGRAPH
+ 0xC2D7: 0x4F26, //CJK UNIFIED IDEOGRAPH
+ 0xC2D8: 0x4ED1, //CJK UNIFIED IDEOGRAPH
+ 0xC2D9: 0x6CA6, //CJK UNIFIED IDEOGRAPH
+ 0xC2DA: 0x7EB6, //CJK UNIFIED IDEOGRAPH
+ 0xC2DB: 0x8BBA, //CJK UNIFIED IDEOGRAPH
+ 0xC2DC: 0x841D, //CJK UNIFIED IDEOGRAPH
+ 0xC2DD: 0x87BA, //CJK UNIFIED IDEOGRAPH
+ 0xC2DE: 0x7F57, //CJK UNIFIED IDEOGRAPH
+ 0xC2DF: 0x903B, //CJK UNIFIED IDEOGRAPH
+ 0xC2E0: 0x9523, //CJK UNIFIED IDEOGRAPH
+ 0xC2E1: 0x7BA9, //CJK UNIFIED IDEOGRAPH
+ 0xC2E2: 0x9AA1, //CJK UNIFIED IDEOGRAPH
+ 0xC2E3: 0x88F8, //CJK UNIFIED IDEOGRAPH
+ 0xC2E4: 0x843D, //CJK UNIFIED IDEOGRAPH
+ 0xC2E5: 0x6D1B, //CJK UNIFIED IDEOGRAPH
+ 0xC2E6: 0x9A86, //CJK UNIFIED IDEOGRAPH
+ 0xC2E7: 0x7EDC, //CJK UNIFIED IDEOGRAPH
+ 0xC2E8: 0x5988, //CJK UNIFIED IDEOGRAPH
+ 0xC2E9: 0x9EBB, //CJK UNIFIED IDEOGRAPH
+ 0xC2EA: 0x739B, //CJK UNIFIED IDEOGRAPH
+ 0xC2EB: 0x7801, //CJK UNIFIED IDEOGRAPH
+ 0xC2EC: 0x8682, //CJK UNIFIED IDEOGRAPH
+ 0xC2ED: 0x9A6C, //CJK UNIFIED IDEOGRAPH
+ 0xC2EE: 0x9A82, //CJK UNIFIED IDEOGRAPH
+ 0xC2EF: 0x561B, //CJK UNIFIED IDEOGRAPH
+ 0xC2F0: 0x5417, //CJK UNIFIED IDEOGRAPH
+ 0xC2F1: 0x57CB, //CJK UNIFIED IDEOGRAPH
+ 0xC2F2: 0x4E70, //CJK UNIFIED IDEOGRAPH
+ 0xC2F3: 0x9EA6, //CJK UNIFIED IDEOGRAPH
+ 0xC2F4: 0x5356, //CJK UNIFIED IDEOGRAPH
+ 0xC2F5: 0x8FC8, //CJK UNIFIED IDEOGRAPH
+ 0xC2F6: 0x8109, //CJK UNIFIED IDEOGRAPH
+ 0xC2F7: 0x7792, //CJK UNIFIED IDEOGRAPH
+ 0xC2F8: 0x9992, //CJK UNIFIED IDEOGRAPH
+ 0xC2F9: 0x86EE, //CJK UNIFIED IDEOGRAPH
+ 0xC2FA: 0x6EE1, //CJK UNIFIED IDEOGRAPH
+ 0xC2FB: 0x8513, //CJK UNIFIED IDEOGRAPH
+ 0xC2FC: 0x66FC, //CJK UNIFIED IDEOGRAPH
+ 0xC2FD: 0x6162, //CJK UNIFIED IDEOGRAPH
+ 0xC2FE: 0x6F2B, //CJK UNIFIED IDEOGRAPH
+ 0xC340: 0x807E, //CJK UNIFIED IDEOGRAPH
+ 0xC341: 0x8081, //CJK UNIFIED IDEOGRAPH
+ 0xC342: 0x8082, //CJK UNIFIED IDEOGRAPH
+ 0xC343: 0x8085, //CJK UNIFIED IDEOGRAPH
+ 0xC344: 0x8088, //CJK UNIFIED IDEOGRAPH
+ 0xC345: 0x808A, //CJK UNIFIED IDEOGRAPH
+ 0xC346: 0x808D, //CJK UNIFIED IDEOGRAPH
+ 0xC347: 0x808E, //CJK UNIFIED IDEOGRAPH
+ 0xC348: 0x808F, //CJK UNIFIED IDEOGRAPH
+ 0xC349: 0x8090, //CJK UNIFIED IDEOGRAPH
+ 0xC34A: 0x8091, //CJK UNIFIED IDEOGRAPH
+ 0xC34B: 0x8092, //CJK UNIFIED IDEOGRAPH
+ 0xC34C: 0x8094, //CJK UNIFIED IDEOGRAPH
+ 0xC34D: 0x8095, //CJK UNIFIED IDEOGRAPH
+ 0xC34E: 0x8097, //CJK UNIFIED IDEOGRAPH
+ 0xC34F: 0x8099, //CJK UNIFIED IDEOGRAPH
+ 0xC350: 0x809E, //CJK UNIFIED IDEOGRAPH
+ 0xC351: 0x80A3, //CJK UNIFIED IDEOGRAPH
+ 0xC352: 0x80A6, //CJK UNIFIED IDEOGRAPH
+ 0xC353: 0x80A7, //CJK UNIFIED IDEOGRAPH
+ 0xC354: 0x80A8, //CJK UNIFIED IDEOGRAPH
+ 0xC355: 0x80AC, //CJK UNIFIED IDEOGRAPH
+ 0xC356: 0x80B0, //CJK UNIFIED IDEOGRAPH
+ 0xC357: 0x80B3, //CJK UNIFIED IDEOGRAPH
+ 0xC358: 0x80B5, //CJK UNIFIED IDEOGRAPH
+ 0xC359: 0x80B6, //CJK UNIFIED IDEOGRAPH
+ 0xC35A: 0x80B8, //CJK UNIFIED IDEOGRAPH
+ 0xC35B: 0x80B9, //CJK UNIFIED IDEOGRAPH
+ 0xC35C: 0x80BB, //CJK UNIFIED IDEOGRAPH
+ 0xC35D: 0x80C5, //CJK UNIFIED IDEOGRAPH
+ 0xC35E: 0x80C7, //CJK UNIFIED IDEOGRAPH
+ 0xC35F: 0x80C8, //CJK UNIFIED IDEOGRAPH
+ 0xC360: 0x80C9, //CJK UNIFIED IDEOGRAPH
+ 0xC361: 0x80CA, //CJK UNIFIED IDEOGRAPH
+ 0xC362: 0x80CB, //CJK UNIFIED IDEOGRAPH
+ 0xC363: 0x80CF, //CJK UNIFIED IDEOGRAPH
+ 0xC364: 0x80D0, //CJK UNIFIED IDEOGRAPH
+ 0xC365: 0x80D1, //CJK UNIFIED IDEOGRAPH
+ 0xC366: 0x80D2, //CJK UNIFIED IDEOGRAPH
+ 0xC367: 0x80D3, //CJK UNIFIED IDEOGRAPH
+ 0xC368: 0x80D4, //CJK UNIFIED IDEOGRAPH
+ 0xC369: 0x80D5, //CJK UNIFIED IDEOGRAPH
+ 0xC36A: 0x80D8, //CJK UNIFIED IDEOGRAPH
+ 0xC36B: 0x80DF, //CJK UNIFIED IDEOGRAPH
+ 0xC36C: 0x80E0, //CJK UNIFIED IDEOGRAPH
+ 0xC36D: 0x80E2, //CJK UNIFIED IDEOGRAPH
+ 0xC36E: 0x80E3, //CJK UNIFIED IDEOGRAPH
+ 0xC36F: 0x80E6, //CJK UNIFIED IDEOGRAPH
+ 0xC370: 0x80EE, //CJK UNIFIED IDEOGRAPH
+ 0xC371: 0x80F5, //CJK UNIFIED IDEOGRAPH
+ 0xC372: 0x80F7, //CJK UNIFIED IDEOGRAPH
+ 0xC373: 0x80F9, //CJK UNIFIED IDEOGRAPH
+ 0xC374: 0x80FB, //CJK UNIFIED IDEOGRAPH
+ 0xC375: 0x80FE, //CJK UNIFIED IDEOGRAPH
+ 0xC376: 0x80FF, //CJK UNIFIED IDEOGRAPH
+ 0xC377: 0x8100, //CJK UNIFIED IDEOGRAPH
+ 0xC378: 0x8101, //CJK UNIFIED IDEOGRAPH
+ 0xC379: 0x8103, //CJK UNIFIED IDEOGRAPH
+ 0xC37A: 0x8104, //CJK UNIFIED IDEOGRAPH
+ 0xC37B: 0x8105, //CJK UNIFIED IDEOGRAPH
+ 0xC37C: 0x8107, //CJK UNIFIED IDEOGRAPH
+ 0xC37D: 0x8108, //CJK UNIFIED IDEOGRAPH
+ 0xC37E: 0x810B, //CJK UNIFIED IDEOGRAPH
+ 0xC380: 0x810C, //CJK UNIFIED IDEOGRAPH
+ 0xC381: 0x8115, //CJK UNIFIED IDEOGRAPH
+ 0xC382: 0x8117, //CJK UNIFIED IDEOGRAPH
+ 0xC383: 0x8119, //CJK UNIFIED IDEOGRAPH
+ 0xC384: 0x811B, //CJK UNIFIED IDEOGRAPH
+ 0xC385: 0x811C, //CJK UNIFIED IDEOGRAPH
+ 0xC386: 0x811D, //CJK UNIFIED IDEOGRAPH
+ 0xC387: 0x811F, //CJK UNIFIED IDEOGRAPH
+ 0xC388: 0x8120, //CJK UNIFIED IDEOGRAPH
+ 0xC389: 0x8121, //CJK UNIFIED IDEOGRAPH
+ 0xC38A: 0x8122, //CJK UNIFIED IDEOGRAPH
+ 0xC38B: 0x8123, //CJK UNIFIED IDEOGRAPH
+ 0xC38C: 0x8124, //CJK UNIFIED IDEOGRAPH
+ 0xC38D: 0x8125, //CJK UNIFIED IDEOGRAPH
+ 0xC38E: 0x8126, //CJK UNIFIED IDEOGRAPH
+ 0xC38F: 0x8127, //CJK UNIFIED IDEOGRAPH
+ 0xC390: 0x8128, //CJK UNIFIED IDEOGRAPH
+ 0xC391: 0x8129, //CJK UNIFIED IDEOGRAPH
+ 0xC392: 0x812A, //CJK UNIFIED IDEOGRAPH
+ 0xC393: 0x812B, //CJK UNIFIED IDEOGRAPH
+ 0xC394: 0x812D, //CJK UNIFIED IDEOGRAPH
+ 0xC395: 0x812E, //CJK UNIFIED IDEOGRAPH
+ 0xC396: 0x8130, //CJK UNIFIED IDEOGRAPH
+ 0xC397: 0x8133, //CJK UNIFIED IDEOGRAPH
+ 0xC398: 0x8134, //CJK UNIFIED IDEOGRAPH
+ 0xC399: 0x8135, //CJK UNIFIED IDEOGRAPH
+ 0xC39A: 0x8137, //CJK UNIFIED IDEOGRAPH
+ 0xC39B: 0x8139, //CJK UNIFIED IDEOGRAPH
+ 0xC39C: 0x813A, //CJK UNIFIED IDEOGRAPH
+ 0xC39D: 0x813B, //CJK UNIFIED IDEOGRAPH
+ 0xC39E: 0x813C, //CJK UNIFIED IDEOGRAPH
+ 0xC39F: 0x813D, //CJK UNIFIED IDEOGRAPH
+ 0xC3A0: 0x813F, //CJK UNIFIED IDEOGRAPH
+ 0xC3A1: 0x8C29, //CJK UNIFIED IDEOGRAPH
+ 0xC3A2: 0x8292, //CJK UNIFIED IDEOGRAPH
+ 0xC3A3: 0x832B, //CJK UNIFIED IDEOGRAPH
+ 0xC3A4: 0x76F2, //CJK UNIFIED IDEOGRAPH
+ 0xC3A5: 0x6C13, //CJK UNIFIED IDEOGRAPH
+ 0xC3A6: 0x5FD9, //CJK UNIFIED IDEOGRAPH
+ 0xC3A7: 0x83BD, //CJK UNIFIED IDEOGRAPH
+ 0xC3A8: 0x732B, //CJK UNIFIED IDEOGRAPH
+ 0xC3A9: 0x8305, //CJK UNIFIED IDEOGRAPH
+ 0xC3AA: 0x951A, //CJK UNIFIED IDEOGRAPH
+ 0xC3AB: 0x6BDB, //CJK UNIFIED IDEOGRAPH
+ 0xC3AC: 0x77DB, //CJK UNIFIED IDEOGRAPH
+ 0xC3AD: 0x94C6, //CJK UNIFIED IDEOGRAPH
+ 0xC3AE: 0x536F, //CJK UNIFIED IDEOGRAPH
+ 0xC3AF: 0x8302, //CJK UNIFIED IDEOGRAPH
+ 0xC3B0: 0x5192, //CJK UNIFIED IDEOGRAPH
+ 0xC3B1: 0x5E3D, //CJK UNIFIED IDEOGRAPH
+ 0xC3B2: 0x8C8C, //CJK UNIFIED IDEOGRAPH
+ 0xC3B3: 0x8D38, //CJK UNIFIED IDEOGRAPH
+ 0xC3B4: 0x4E48, //CJK UNIFIED IDEOGRAPH
+ 0xC3B5: 0x73AB, //CJK UNIFIED IDEOGRAPH
+ 0xC3B6: 0x679A, //CJK UNIFIED IDEOGRAPH
+ 0xC3B7: 0x6885, //CJK UNIFIED IDEOGRAPH
+ 0xC3B8: 0x9176, //CJK UNIFIED IDEOGRAPH
+ 0xC3B9: 0x9709, //CJK UNIFIED IDEOGRAPH
+ 0xC3BA: 0x7164, //CJK UNIFIED IDEOGRAPH
+ 0xC3BB: 0x6CA1, //CJK UNIFIED IDEOGRAPH
+ 0xC3BC: 0x7709, //CJK UNIFIED IDEOGRAPH
+ 0xC3BD: 0x5A92, //CJK UNIFIED IDEOGRAPH
+ 0xC3BE: 0x9541, //CJK UNIFIED IDEOGRAPH
+ 0xC3BF: 0x6BCF, //CJK UNIFIED IDEOGRAPH
+ 0xC3C0: 0x7F8E, //CJK UNIFIED IDEOGRAPH
+ 0xC3C1: 0x6627, //CJK UNIFIED IDEOGRAPH
+ 0xC3C2: 0x5BD0, //CJK UNIFIED IDEOGRAPH
+ 0xC3C3: 0x59B9, //CJK UNIFIED IDEOGRAPH
+ 0xC3C4: 0x5A9A, //CJK UNIFIED IDEOGRAPH
+ 0xC3C5: 0x95E8, //CJK UNIFIED IDEOGRAPH
+ 0xC3C6: 0x95F7, //CJK UNIFIED IDEOGRAPH
+ 0xC3C7: 0x4EEC, //CJK UNIFIED IDEOGRAPH
+ 0xC3C8: 0x840C, //CJK UNIFIED IDEOGRAPH
+ 0xC3C9: 0x8499, //CJK UNIFIED IDEOGRAPH
+ 0xC3CA: 0x6AAC, //CJK UNIFIED IDEOGRAPH
+ 0xC3CB: 0x76DF, //CJK UNIFIED IDEOGRAPH
+ 0xC3CC: 0x9530, //CJK UNIFIED IDEOGRAPH
+ 0xC3CD: 0x731B, //CJK UNIFIED IDEOGRAPH
+ 0xC3CE: 0x68A6, //CJK UNIFIED IDEOGRAPH
+ 0xC3CF: 0x5B5F, //CJK UNIFIED IDEOGRAPH
+ 0xC3D0: 0x772F, //CJK UNIFIED IDEOGRAPH
+ 0xC3D1: 0x919A, //CJK UNIFIED IDEOGRAPH
+ 0xC3D2: 0x9761, //CJK UNIFIED IDEOGRAPH
+ 0xC3D3: 0x7CDC, //CJK UNIFIED IDEOGRAPH
+ 0xC3D4: 0x8FF7, //CJK UNIFIED IDEOGRAPH
+ 0xC3D5: 0x8C1C, //CJK UNIFIED IDEOGRAPH
+ 0xC3D6: 0x5F25, //CJK UNIFIED IDEOGRAPH
+ 0xC3D7: 0x7C73, //CJK UNIFIED IDEOGRAPH
+ 0xC3D8: 0x79D8, //CJK UNIFIED IDEOGRAPH
+ 0xC3D9: 0x89C5, //CJK UNIFIED IDEOGRAPH
+ 0xC3DA: 0x6CCC, //CJK UNIFIED IDEOGRAPH
+ 0xC3DB: 0x871C, //CJK UNIFIED IDEOGRAPH
+ 0xC3DC: 0x5BC6, //CJK UNIFIED IDEOGRAPH
+ 0xC3DD: 0x5E42, //CJK UNIFIED IDEOGRAPH
+ 0xC3DE: 0x68C9, //CJK UNIFIED IDEOGRAPH
+ 0xC3DF: 0x7720, //CJK UNIFIED IDEOGRAPH
+ 0xC3E0: 0x7EF5, //CJK UNIFIED IDEOGRAPH
+ 0xC3E1: 0x5195, //CJK UNIFIED IDEOGRAPH
+ 0xC3E2: 0x514D, //CJK UNIFIED IDEOGRAPH
+ 0xC3E3: 0x52C9, //CJK UNIFIED IDEOGRAPH
+ 0xC3E4: 0x5A29, //CJK UNIFIED IDEOGRAPH
+ 0xC3E5: 0x7F05, //CJK UNIFIED IDEOGRAPH
+ 0xC3E6: 0x9762, //CJK UNIFIED IDEOGRAPH
+ 0xC3E7: 0x82D7, //CJK UNIFIED IDEOGRAPH
+ 0xC3E8: 0x63CF, //CJK UNIFIED IDEOGRAPH
+ 0xC3E9: 0x7784, //CJK UNIFIED IDEOGRAPH
+ 0xC3EA: 0x85D0, //CJK UNIFIED IDEOGRAPH
+ 0xC3EB: 0x79D2, //CJK UNIFIED IDEOGRAPH
+ 0xC3EC: 0x6E3A, //CJK UNIFIED IDEOGRAPH
+ 0xC3ED: 0x5E99, //CJK UNIFIED IDEOGRAPH
+ 0xC3EE: 0x5999, //CJK UNIFIED IDEOGRAPH
+ 0xC3EF: 0x8511, //CJK UNIFIED IDEOGRAPH
+ 0xC3F0: 0x706D, //CJK UNIFIED IDEOGRAPH
+ 0xC3F1: 0x6C11, //CJK UNIFIED IDEOGRAPH
+ 0xC3F2: 0x62BF, //CJK UNIFIED IDEOGRAPH
+ 0xC3F3: 0x76BF, //CJK UNIFIED IDEOGRAPH
+ 0xC3F4: 0x654F, //CJK UNIFIED IDEOGRAPH
+ 0xC3F5: 0x60AF, //CJK UNIFIED IDEOGRAPH
+ 0xC3F6: 0x95FD, //CJK UNIFIED IDEOGRAPH
+ 0xC3F7: 0x660E, //CJK UNIFIED IDEOGRAPH
+ 0xC3F8: 0x879F, //CJK UNIFIED IDEOGRAPH
+ 0xC3F9: 0x9E23, //CJK UNIFIED IDEOGRAPH
+ 0xC3FA: 0x94ED, //CJK UNIFIED IDEOGRAPH
+ 0xC3FB: 0x540D, //CJK UNIFIED IDEOGRAPH
+ 0xC3FC: 0x547D, //CJK UNIFIED IDEOGRAPH
+ 0xC3FD: 0x8C2C, //CJK UNIFIED IDEOGRAPH
+ 0xC3FE: 0x6478, //CJK UNIFIED IDEOGRAPH
+ 0xC440: 0x8140, //CJK UNIFIED IDEOGRAPH
+ 0xC441: 0x8141, //CJK UNIFIED IDEOGRAPH
+ 0xC442: 0x8142, //CJK UNIFIED IDEOGRAPH
+ 0xC443: 0x8143, //CJK UNIFIED IDEOGRAPH
+ 0xC444: 0x8144, //CJK UNIFIED IDEOGRAPH
+ 0xC445: 0x8145, //CJK UNIFIED IDEOGRAPH
+ 0xC446: 0x8147, //CJK UNIFIED IDEOGRAPH
+ 0xC447: 0x8149, //CJK UNIFIED IDEOGRAPH
+ 0xC448: 0x814D, //CJK UNIFIED IDEOGRAPH
+ 0xC449: 0x814E, //CJK UNIFIED IDEOGRAPH
+ 0xC44A: 0x814F, //CJK UNIFIED IDEOGRAPH
+ 0xC44B: 0x8152, //CJK UNIFIED IDEOGRAPH
+ 0xC44C: 0x8156, //CJK UNIFIED IDEOGRAPH
+ 0xC44D: 0x8157, //CJK UNIFIED IDEOGRAPH
+ 0xC44E: 0x8158, //CJK UNIFIED IDEOGRAPH
+ 0xC44F: 0x815B, //CJK UNIFIED IDEOGRAPH
+ 0xC450: 0x815C, //CJK UNIFIED IDEOGRAPH
+ 0xC451: 0x815D, //CJK UNIFIED IDEOGRAPH
+ 0xC452: 0x815E, //CJK UNIFIED IDEOGRAPH
+ 0xC453: 0x815F, //CJK UNIFIED IDEOGRAPH
+ 0xC454: 0x8161, //CJK UNIFIED IDEOGRAPH
+ 0xC455: 0x8162, //CJK UNIFIED IDEOGRAPH
+ 0xC456: 0x8163, //CJK UNIFIED IDEOGRAPH
+ 0xC457: 0x8164, //CJK UNIFIED IDEOGRAPH
+ 0xC458: 0x8166, //CJK UNIFIED IDEOGRAPH
+ 0xC459: 0x8168, //CJK UNIFIED IDEOGRAPH
+ 0xC45A: 0x816A, //CJK UNIFIED IDEOGRAPH
+ 0xC45B: 0x816B, //CJK UNIFIED IDEOGRAPH
+ 0xC45C: 0x816C, //CJK UNIFIED IDEOGRAPH
+ 0xC45D: 0x816F, //CJK UNIFIED IDEOGRAPH
+ 0xC45E: 0x8172, //CJK UNIFIED IDEOGRAPH
+ 0xC45F: 0x8173, //CJK UNIFIED IDEOGRAPH
+ 0xC460: 0x8175, //CJK UNIFIED IDEOGRAPH
+ 0xC461: 0x8176, //CJK UNIFIED IDEOGRAPH
+ 0xC462: 0x8177, //CJK UNIFIED IDEOGRAPH
+ 0xC463: 0x8178, //CJK UNIFIED IDEOGRAPH
+ 0xC464: 0x8181, //CJK UNIFIED IDEOGRAPH
+ 0xC465: 0x8183, //CJK UNIFIED IDEOGRAPH
+ 0xC466: 0x8184, //CJK UNIFIED IDEOGRAPH
+ 0xC467: 0x8185, //CJK UNIFIED IDEOGRAPH
+ 0xC468: 0x8186, //CJK UNIFIED IDEOGRAPH
+ 0xC469: 0x8187, //CJK UNIFIED IDEOGRAPH
+ 0xC46A: 0x8189, //CJK UNIFIED IDEOGRAPH
+ 0xC46B: 0x818B, //CJK UNIFIED IDEOGRAPH
+ 0xC46C: 0x818C, //CJK UNIFIED IDEOGRAPH
+ 0xC46D: 0x818D, //CJK UNIFIED IDEOGRAPH
+ 0xC46E: 0x818E, //CJK UNIFIED IDEOGRAPH
+ 0xC46F: 0x8190, //CJK UNIFIED IDEOGRAPH
+ 0xC470: 0x8192, //CJK UNIFIED IDEOGRAPH
+ 0xC471: 0x8193, //CJK UNIFIED IDEOGRAPH
+ 0xC472: 0x8194, //CJK UNIFIED IDEOGRAPH
+ 0xC473: 0x8195, //CJK UNIFIED IDEOGRAPH
+ 0xC474: 0x8196, //CJK UNIFIED IDEOGRAPH
+ 0xC475: 0x8197, //CJK UNIFIED IDEOGRAPH
+ 0xC476: 0x8199, //CJK UNIFIED IDEOGRAPH
+ 0xC477: 0x819A, //CJK UNIFIED IDEOGRAPH
+ 0xC478: 0x819E, //CJK UNIFIED IDEOGRAPH
+ 0xC479: 0x819F, //CJK UNIFIED IDEOGRAPH
+ 0xC47A: 0x81A0, //CJK UNIFIED IDEOGRAPH
+ 0xC47B: 0x81A1, //CJK UNIFIED IDEOGRAPH
+ 0xC47C: 0x81A2, //CJK UNIFIED IDEOGRAPH
+ 0xC47D: 0x81A4, //CJK UNIFIED IDEOGRAPH
+ 0xC47E: 0x81A5, //CJK UNIFIED IDEOGRAPH
+ 0xC480: 0x81A7, //CJK UNIFIED IDEOGRAPH
+ 0xC481: 0x81A9, //CJK UNIFIED IDEOGRAPH
+ 0xC482: 0x81AB, //CJK UNIFIED IDEOGRAPH
+ 0xC483: 0x81AC, //CJK UNIFIED IDEOGRAPH
+ 0xC484: 0x81AD, //CJK UNIFIED IDEOGRAPH
+ 0xC485: 0x81AE, //CJK UNIFIED IDEOGRAPH
+ 0xC486: 0x81AF, //CJK UNIFIED IDEOGRAPH
+ 0xC487: 0x81B0, //CJK UNIFIED IDEOGRAPH
+ 0xC488: 0x81B1, //CJK UNIFIED IDEOGRAPH
+ 0xC489: 0x81B2, //CJK UNIFIED IDEOGRAPH
+ 0xC48A: 0x81B4, //CJK UNIFIED IDEOGRAPH
+ 0xC48B: 0x81B5, //CJK UNIFIED IDEOGRAPH
+ 0xC48C: 0x81B6, //CJK UNIFIED IDEOGRAPH
+ 0xC48D: 0x81B7, //CJK UNIFIED IDEOGRAPH
+ 0xC48E: 0x81B8, //CJK UNIFIED IDEOGRAPH
+ 0xC48F: 0x81B9, //CJK UNIFIED IDEOGRAPH
+ 0xC490: 0x81BC, //CJK UNIFIED IDEOGRAPH
+ 0xC491: 0x81BD, //CJK UNIFIED IDEOGRAPH
+ 0xC492: 0x81BE, //CJK UNIFIED IDEOGRAPH
+ 0xC493: 0x81BF, //CJK UNIFIED IDEOGRAPH
+ 0xC494: 0x81C4, //CJK UNIFIED IDEOGRAPH
+ 0xC495: 0x81C5, //CJK UNIFIED IDEOGRAPH
+ 0xC496: 0x81C7, //CJK UNIFIED IDEOGRAPH
+ 0xC497: 0x81C8, //CJK UNIFIED IDEOGRAPH
+ 0xC498: 0x81C9, //CJK UNIFIED IDEOGRAPH
+ 0xC499: 0x81CB, //CJK UNIFIED IDEOGRAPH
+ 0xC49A: 0x81CD, //CJK UNIFIED IDEOGRAPH
+ 0xC49B: 0x81CE, //CJK UNIFIED IDEOGRAPH
+ 0xC49C: 0x81CF, //CJK UNIFIED IDEOGRAPH
+ 0xC49D: 0x81D0, //CJK UNIFIED IDEOGRAPH
+ 0xC49E: 0x81D1, //CJK UNIFIED IDEOGRAPH
+ 0xC49F: 0x81D2, //CJK UNIFIED IDEOGRAPH
+ 0xC4A0: 0x81D3, //CJK UNIFIED IDEOGRAPH
+ 0xC4A1: 0x6479, //CJK UNIFIED IDEOGRAPH
+ 0xC4A2: 0x8611, //CJK UNIFIED IDEOGRAPH
+ 0xC4A3: 0x6A21, //CJK UNIFIED IDEOGRAPH
+ 0xC4A4: 0x819C, //CJK UNIFIED IDEOGRAPH
+ 0xC4A5: 0x78E8, //CJK UNIFIED IDEOGRAPH
+ 0xC4A6: 0x6469, //CJK UNIFIED IDEOGRAPH
+ 0xC4A7: 0x9B54, //CJK UNIFIED IDEOGRAPH
+ 0xC4A8: 0x62B9, //CJK UNIFIED IDEOGRAPH
+ 0xC4A9: 0x672B, //CJK UNIFIED IDEOGRAPH
+ 0xC4AA: 0x83AB, //CJK UNIFIED IDEOGRAPH
+ 0xC4AB: 0x58A8, //CJK UNIFIED IDEOGRAPH
+ 0xC4AC: 0x9ED8, //CJK UNIFIED IDEOGRAPH
+ 0xC4AD: 0x6CAB, //CJK UNIFIED IDEOGRAPH
+ 0xC4AE: 0x6F20, //CJK UNIFIED IDEOGRAPH
+ 0xC4AF: 0x5BDE, //CJK UNIFIED IDEOGRAPH
+ 0xC4B0: 0x964C, //CJK UNIFIED IDEOGRAPH
+ 0xC4B1: 0x8C0B, //CJK UNIFIED IDEOGRAPH
+ 0xC4B2: 0x725F, //CJK UNIFIED IDEOGRAPH
+ 0xC4B3: 0x67D0, //CJK UNIFIED IDEOGRAPH
+ 0xC4B4: 0x62C7, //CJK UNIFIED IDEOGRAPH
+ 0xC4B5: 0x7261, //CJK UNIFIED IDEOGRAPH
+ 0xC4B6: 0x4EA9, //CJK UNIFIED IDEOGRAPH
+ 0xC4B7: 0x59C6, //CJK UNIFIED IDEOGRAPH
+ 0xC4B8: 0x6BCD, //CJK UNIFIED IDEOGRAPH
+ 0xC4B9: 0x5893, //CJK UNIFIED IDEOGRAPH
+ 0xC4BA: 0x66AE, //CJK UNIFIED IDEOGRAPH
+ 0xC4BB: 0x5E55, //CJK UNIFIED IDEOGRAPH
+ 0xC4BC: 0x52DF, //CJK UNIFIED IDEOGRAPH
+ 0xC4BD: 0x6155, //CJK UNIFIED IDEOGRAPH
+ 0xC4BE: 0x6728, //CJK UNIFIED IDEOGRAPH
+ 0xC4BF: 0x76EE, //CJK UNIFIED IDEOGRAPH
+ 0xC4C0: 0x7766, //CJK UNIFIED IDEOGRAPH
+ 0xC4C1: 0x7267, //CJK UNIFIED IDEOGRAPH
+ 0xC4C2: 0x7A46, //CJK UNIFIED IDEOGRAPH
+ 0xC4C3: 0x62FF, //CJK UNIFIED IDEOGRAPH
+ 0xC4C4: 0x54EA, //CJK UNIFIED IDEOGRAPH
+ 0xC4C5: 0x5450, //CJK UNIFIED IDEOGRAPH
+ 0xC4C6: 0x94A0, //CJK UNIFIED IDEOGRAPH
+ 0xC4C7: 0x90A3, //CJK UNIFIED IDEOGRAPH
+ 0xC4C8: 0x5A1C, //CJK UNIFIED IDEOGRAPH
+ 0xC4C9: 0x7EB3, //CJK UNIFIED IDEOGRAPH
+ 0xC4CA: 0x6C16, //CJK UNIFIED IDEOGRAPH
+ 0xC4CB: 0x4E43, //CJK UNIFIED IDEOGRAPH
+ 0xC4CC: 0x5976, //CJK UNIFIED IDEOGRAPH
+ 0xC4CD: 0x8010, //CJK UNIFIED IDEOGRAPH
+ 0xC4CE: 0x5948, //CJK UNIFIED IDEOGRAPH
+ 0xC4CF: 0x5357, //CJK UNIFIED IDEOGRAPH
+ 0xC4D0: 0x7537, //CJK UNIFIED IDEOGRAPH
+ 0xC4D1: 0x96BE, //CJK UNIFIED IDEOGRAPH
+ 0xC4D2: 0x56CA, //CJK UNIFIED IDEOGRAPH
+ 0xC4D3: 0x6320, //CJK UNIFIED IDEOGRAPH
+ 0xC4D4: 0x8111, //CJK UNIFIED IDEOGRAPH
+ 0xC4D5: 0x607C, //CJK UNIFIED IDEOGRAPH
+ 0xC4D6: 0x95F9, //CJK UNIFIED IDEOGRAPH
+ 0xC4D7: 0x6DD6, //CJK UNIFIED IDEOGRAPH
+ 0xC4D8: 0x5462, //CJK UNIFIED IDEOGRAPH
+ 0xC4D9: 0x9981, //CJK UNIFIED IDEOGRAPH
+ 0xC4DA: 0x5185, //CJK UNIFIED IDEOGRAPH
+ 0xC4DB: 0x5AE9, //CJK UNIFIED IDEOGRAPH
+ 0xC4DC: 0x80FD, //CJK UNIFIED IDEOGRAPH
+ 0xC4DD: 0x59AE, //CJK UNIFIED IDEOGRAPH
+ 0xC4DE: 0x9713, //CJK UNIFIED IDEOGRAPH
+ 0xC4DF: 0x502A, //CJK UNIFIED IDEOGRAPH
+ 0xC4E0: 0x6CE5, //CJK UNIFIED IDEOGRAPH
+ 0xC4E1: 0x5C3C, //CJK UNIFIED IDEOGRAPH
+ 0xC4E2: 0x62DF, //CJK UNIFIED IDEOGRAPH
+ 0xC4E3: 0x4F60, //CJK UNIFIED IDEOGRAPH
+ 0xC4E4: 0x533F, //CJK UNIFIED IDEOGRAPH
+ 0xC4E5: 0x817B, //CJK UNIFIED IDEOGRAPH
+ 0xC4E6: 0x9006, //CJK UNIFIED IDEOGRAPH
+ 0xC4E7: 0x6EBA, //CJK UNIFIED IDEOGRAPH
+ 0xC4E8: 0x852B, //CJK UNIFIED IDEOGRAPH
+ 0xC4E9: 0x62C8, //CJK UNIFIED IDEOGRAPH
+ 0xC4EA: 0x5E74, //CJK UNIFIED IDEOGRAPH
+ 0xC4EB: 0x78BE, //CJK UNIFIED IDEOGRAPH
+ 0xC4EC: 0x64B5, //CJK UNIFIED IDEOGRAPH
+ 0xC4ED: 0x637B, //CJK UNIFIED IDEOGRAPH
+ 0xC4EE: 0x5FF5, //CJK UNIFIED IDEOGRAPH
+ 0xC4EF: 0x5A18, //CJK UNIFIED IDEOGRAPH
+ 0xC4F0: 0x917F, //CJK UNIFIED IDEOGRAPH
+ 0xC4F1: 0x9E1F, //CJK UNIFIED IDEOGRAPH
+ 0xC4F2: 0x5C3F, //CJK UNIFIED IDEOGRAPH
+ 0xC4F3: 0x634F, //CJK UNIFIED IDEOGRAPH
+ 0xC4F4: 0x8042, //CJK UNIFIED IDEOGRAPH
+ 0xC4F5: 0x5B7D, //CJK UNIFIED IDEOGRAPH
+ 0xC4F6: 0x556E, //CJK UNIFIED IDEOGRAPH
+ 0xC4F7: 0x954A, //CJK UNIFIED IDEOGRAPH
+ 0xC4F8: 0x954D, //CJK UNIFIED IDEOGRAPH
+ 0xC4F9: 0x6D85, //CJK UNIFIED IDEOGRAPH
+ 0xC4FA: 0x60A8, //CJK UNIFIED IDEOGRAPH
+ 0xC4FB: 0x67E0, //CJK UNIFIED IDEOGRAPH
+ 0xC4FC: 0x72DE, //CJK UNIFIED IDEOGRAPH
+ 0xC4FD: 0x51DD, //CJK UNIFIED IDEOGRAPH
+ 0xC4FE: 0x5B81, //CJK UNIFIED IDEOGRAPH
+ 0xC540: 0x81D4, //CJK UNIFIED IDEOGRAPH
+ 0xC541: 0x81D5, //CJK UNIFIED IDEOGRAPH
+ 0xC542: 0x81D6, //CJK UNIFIED IDEOGRAPH
+ 0xC543: 0x81D7, //CJK UNIFIED IDEOGRAPH
+ 0xC544: 0x81D8, //CJK UNIFIED IDEOGRAPH
+ 0xC545: 0x81D9, //CJK UNIFIED IDEOGRAPH
+ 0xC546: 0x81DA, //CJK UNIFIED IDEOGRAPH
+ 0xC547: 0x81DB, //CJK UNIFIED IDEOGRAPH
+ 0xC548: 0x81DC, //CJK UNIFIED IDEOGRAPH
+ 0xC549: 0x81DD, //CJK UNIFIED IDEOGRAPH
+ 0xC54A: 0x81DE, //CJK UNIFIED IDEOGRAPH
+ 0xC54B: 0x81DF, //CJK UNIFIED IDEOGRAPH
+ 0xC54C: 0x81E0, //CJK UNIFIED IDEOGRAPH
+ 0xC54D: 0x81E1, //CJK UNIFIED IDEOGRAPH
+ 0xC54E: 0x81E2, //CJK UNIFIED IDEOGRAPH
+ 0xC54F: 0x81E4, //CJK UNIFIED IDEOGRAPH
+ 0xC550: 0x81E5, //CJK UNIFIED IDEOGRAPH
+ 0xC551: 0x81E6, //CJK UNIFIED IDEOGRAPH
+ 0xC552: 0x81E8, //CJK UNIFIED IDEOGRAPH
+ 0xC553: 0x81E9, //CJK UNIFIED IDEOGRAPH
+ 0xC554: 0x81EB, //CJK UNIFIED IDEOGRAPH
+ 0xC555: 0x81EE, //CJK UNIFIED IDEOGRAPH
+ 0xC556: 0x81EF, //CJK UNIFIED IDEOGRAPH
+ 0xC557: 0x81F0, //CJK UNIFIED IDEOGRAPH
+ 0xC558: 0x81F1, //CJK UNIFIED IDEOGRAPH
+ 0xC559: 0x81F2, //CJK UNIFIED IDEOGRAPH
+ 0xC55A: 0x81F5, //CJK UNIFIED IDEOGRAPH
+ 0xC55B: 0x81F6, //CJK UNIFIED IDEOGRAPH
+ 0xC55C: 0x81F7, //CJK UNIFIED IDEOGRAPH
+ 0xC55D: 0x81F8, //CJK UNIFIED IDEOGRAPH
+ 0xC55E: 0x81F9, //CJK UNIFIED IDEOGRAPH
+ 0xC55F: 0x81FA, //CJK UNIFIED IDEOGRAPH
+ 0xC560: 0x81FD, //CJK UNIFIED IDEOGRAPH
+ 0xC561: 0x81FF, //CJK UNIFIED IDEOGRAPH
+ 0xC562: 0x8203, //CJK UNIFIED IDEOGRAPH
+ 0xC563: 0x8207, //CJK UNIFIED IDEOGRAPH
+ 0xC564: 0x8208, //CJK UNIFIED IDEOGRAPH
+ 0xC565: 0x8209, //CJK UNIFIED IDEOGRAPH
+ 0xC566: 0x820A, //CJK UNIFIED IDEOGRAPH
+ 0xC567: 0x820B, //CJK UNIFIED IDEOGRAPH
+ 0xC568: 0x820E, //CJK UNIFIED IDEOGRAPH
+ 0xC569: 0x820F, //CJK UNIFIED IDEOGRAPH
+ 0xC56A: 0x8211, //CJK UNIFIED IDEOGRAPH
+ 0xC56B: 0x8213, //CJK UNIFIED IDEOGRAPH
+ 0xC56C: 0x8215, //CJK UNIFIED IDEOGRAPH
+ 0xC56D: 0x8216, //CJK UNIFIED IDEOGRAPH
+ 0xC56E: 0x8217, //CJK UNIFIED IDEOGRAPH
+ 0xC56F: 0x8218, //CJK UNIFIED IDEOGRAPH
+ 0xC570: 0x8219, //CJK UNIFIED IDEOGRAPH
+ 0xC571: 0x821A, //CJK UNIFIED IDEOGRAPH
+ 0xC572: 0x821D, //CJK UNIFIED IDEOGRAPH
+ 0xC573: 0x8220, //CJK UNIFIED IDEOGRAPH
+ 0xC574: 0x8224, //CJK UNIFIED IDEOGRAPH
+ 0xC575: 0x8225, //CJK UNIFIED IDEOGRAPH
+ 0xC576: 0x8226, //CJK UNIFIED IDEOGRAPH
+ 0xC577: 0x8227, //CJK UNIFIED IDEOGRAPH
+ 0xC578: 0x8229, //CJK UNIFIED IDEOGRAPH
+ 0xC579: 0x822E, //CJK UNIFIED IDEOGRAPH
+ 0xC57A: 0x8232, //CJK UNIFIED IDEOGRAPH
+ 0xC57B: 0x823A, //CJK UNIFIED IDEOGRAPH
+ 0xC57C: 0x823C, //CJK UNIFIED IDEOGRAPH
+ 0xC57D: 0x823D, //CJK UNIFIED IDEOGRAPH
+ 0xC57E: 0x823F, //CJK UNIFIED IDEOGRAPH
+ 0xC580: 0x8240, //CJK UNIFIED IDEOGRAPH
+ 0xC581: 0x8241, //CJK UNIFIED IDEOGRAPH
+ 0xC582: 0x8242, //CJK UNIFIED IDEOGRAPH
+ 0xC583: 0x8243, //CJK UNIFIED IDEOGRAPH
+ 0xC584: 0x8245, //CJK UNIFIED IDEOGRAPH
+ 0xC585: 0x8246, //CJK UNIFIED IDEOGRAPH
+ 0xC586: 0x8248, //CJK UNIFIED IDEOGRAPH
+ 0xC587: 0x824A, //CJK UNIFIED IDEOGRAPH
+ 0xC588: 0x824C, //CJK UNIFIED IDEOGRAPH
+ 0xC589: 0x824D, //CJK UNIFIED IDEOGRAPH
+ 0xC58A: 0x824E, //CJK UNIFIED IDEOGRAPH
+ 0xC58B: 0x8250, //CJK UNIFIED IDEOGRAPH
+ 0xC58C: 0x8251, //CJK UNIFIED IDEOGRAPH
+ 0xC58D: 0x8252, //CJK UNIFIED IDEOGRAPH
+ 0xC58E: 0x8253, //CJK UNIFIED IDEOGRAPH
+ 0xC58F: 0x8254, //CJK UNIFIED IDEOGRAPH
+ 0xC590: 0x8255, //CJK UNIFIED IDEOGRAPH
+ 0xC591: 0x8256, //CJK UNIFIED IDEOGRAPH
+ 0xC592: 0x8257, //CJK UNIFIED IDEOGRAPH
+ 0xC593: 0x8259, //CJK UNIFIED IDEOGRAPH
+ 0xC594: 0x825B, //CJK UNIFIED IDEOGRAPH
+ 0xC595: 0x825C, //CJK UNIFIED IDEOGRAPH
+ 0xC596: 0x825D, //CJK UNIFIED IDEOGRAPH
+ 0xC597: 0x825E, //CJK UNIFIED IDEOGRAPH
+ 0xC598: 0x8260, //CJK UNIFIED IDEOGRAPH
+ 0xC599: 0x8261, //CJK UNIFIED IDEOGRAPH
+ 0xC59A: 0x8262, //CJK UNIFIED IDEOGRAPH
+ 0xC59B: 0x8263, //CJK UNIFIED IDEOGRAPH
+ 0xC59C: 0x8264, //CJK UNIFIED IDEOGRAPH
+ 0xC59D: 0x8265, //CJK UNIFIED IDEOGRAPH
+ 0xC59E: 0x8266, //CJK UNIFIED IDEOGRAPH
+ 0xC59F: 0x8267, //CJK UNIFIED IDEOGRAPH
+ 0xC5A0: 0x8269, //CJK UNIFIED IDEOGRAPH
+ 0xC5A1: 0x62E7, //CJK UNIFIED IDEOGRAPH
+ 0xC5A2: 0x6CDE, //CJK UNIFIED IDEOGRAPH
+ 0xC5A3: 0x725B, //CJK UNIFIED IDEOGRAPH
+ 0xC5A4: 0x626D, //CJK UNIFIED IDEOGRAPH
+ 0xC5A5: 0x94AE, //CJK UNIFIED IDEOGRAPH
+ 0xC5A6: 0x7EBD, //CJK UNIFIED IDEOGRAPH
+ 0xC5A7: 0x8113, //CJK UNIFIED IDEOGRAPH
+ 0xC5A8: 0x6D53, //CJK UNIFIED IDEOGRAPH
+ 0xC5A9: 0x519C, //CJK UNIFIED IDEOGRAPH
+ 0xC5AA: 0x5F04, //CJK UNIFIED IDEOGRAPH
+ 0xC5AB: 0x5974, //CJK UNIFIED IDEOGRAPH
+ 0xC5AC: 0x52AA, //CJK UNIFIED IDEOGRAPH
+ 0xC5AD: 0x6012, //CJK UNIFIED IDEOGRAPH
+ 0xC5AE: 0x5973, //CJK UNIFIED IDEOGRAPH
+ 0xC5AF: 0x6696, //CJK UNIFIED IDEOGRAPH
+ 0xC5B0: 0x8650, //CJK UNIFIED IDEOGRAPH
+ 0xC5B1: 0x759F, //CJK UNIFIED IDEOGRAPH
+ 0xC5B2: 0x632A, //CJK UNIFIED IDEOGRAPH
+ 0xC5B3: 0x61E6, //CJK UNIFIED IDEOGRAPH
+ 0xC5B4: 0x7CEF, //CJK UNIFIED IDEOGRAPH
+ 0xC5B5: 0x8BFA, //CJK UNIFIED IDEOGRAPH
+ 0xC5B6: 0x54E6, //CJK UNIFIED IDEOGRAPH
+ 0xC5B7: 0x6B27, //CJK UNIFIED IDEOGRAPH
+ 0xC5B8: 0x9E25, //CJK UNIFIED IDEOGRAPH
+ 0xC5B9: 0x6BB4, //CJK UNIFIED IDEOGRAPH
+ 0xC5BA: 0x85D5, //CJK UNIFIED IDEOGRAPH
+ 0xC5BB: 0x5455, //CJK UNIFIED IDEOGRAPH
+ 0xC5BC: 0x5076, //CJK UNIFIED IDEOGRAPH
+ 0xC5BD: 0x6CA4, //CJK UNIFIED IDEOGRAPH
+ 0xC5BE: 0x556A, //CJK UNIFIED IDEOGRAPH
+ 0xC5BF: 0x8DB4, //CJK UNIFIED IDEOGRAPH
+ 0xC5C0: 0x722C, //CJK UNIFIED IDEOGRAPH
+ 0xC5C1: 0x5E15, //CJK UNIFIED IDEOGRAPH
+ 0xC5C2: 0x6015, //CJK UNIFIED IDEOGRAPH
+ 0xC5C3: 0x7436, //CJK UNIFIED IDEOGRAPH
+ 0xC5C4: 0x62CD, //CJK UNIFIED IDEOGRAPH
+ 0xC5C5: 0x6392, //CJK UNIFIED IDEOGRAPH
+ 0xC5C6: 0x724C, //CJK UNIFIED IDEOGRAPH
+ 0xC5C7: 0x5F98, //CJK UNIFIED IDEOGRAPH
+ 0xC5C8: 0x6E43, //CJK UNIFIED IDEOGRAPH
+ 0xC5C9: 0x6D3E, //CJK UNIFIED IDEOGRAPH
+ 0xC5CA: 0x6500, //CJK UNIFIED IDEOGRAPH
+ 0xC5CB: 0x6F58, //CJK UNIFIED IDEOGRAPH
+ 0xC5CC: 0x76D8, //CJK UNIFIED IDEOGRAPH
+ 0xC5CD: 0x78D0, //CJK UNIFIED IDEOGRAPH
+ 0xC5CE: 0x76FC, //CJK UNIFIED IDEOGRAPH
+ 0xC5CF: 0x7554, //CJK UNIFIED IDEOGRAPH
+ 0xC5D0: 0x5224, //CJK UNIFIED IDEOGRAPH
+ 0xC5D1: 0x53DB, //CJK UNIFIED IDEOGRAPH
+ 0xC5D2: 0x4E53, //CJK UNIFIED IDEOGRAPH
+ 0xC5D3: 0x5E9E, //CJK UNIFIED IDEOGRAPH
+ 0xC5D4: 0x65C1, //CJK UNIFIED IDEOGRAPH
+ 0xC5D5: 0x802A, //CJK UNIFIED IDEOGRAPH
+ 0xC5D6: 0x80D6, //CJK UNIFIED IDEOGRAPH
+ 0xC5D7: 0x629B, //CJK UNIFIED IDEOGRAPH
+ 0xC5D8: 0x5486, //CJK UNIFIED IDEOGRAPH
+ 0xC5D9: 0x5228, //CJK UNIFIED IDEOGRAPH
+ 0xC5DA: 0x70AE, //CJK UNIFIED IDEOGRAPH
+ 0xC5DB: 0x888D, //CJK UNIFIED IDEOGRAPH
+ 0xC5DC: 0x8DD1, //CJK UNIFIED IDEOGRAPH
+ 0xC5DD: 0x6CE1, //CJK UNIFIED IDEOGRAPH
+ 0xC5DE: 0x5478, //CJK UNIFIED IDEOGRAPH
+ 0xC5DF: 0x80DA, //CJK UNIFIED IDEOGRAPH
+ 0xC5E0: 0x57F9, //CJK UNIFIED IDEOGRAPH
+ 0xC5E1: 0x88F4, //CJK UNIFIED IDEOGRAPH
+ 0xC5E2: 0x8D54, //CJK UNIFIED IDEOGRAPH
+ 0xC5E3: 0x966A, //CJK UNIFIED IDEOGRAPH
+ 0xC5E4: 0x914D, //CJK UNIFIED IDEOGRAPH
+ 0xC5E5: 0x4F69, //CJK UNIFIED IDEOGRAPH
+ 0xC5E6: 0x6C9B, //CJK UNIFIED IDEOGRAPH
+ 0xC5E7: 0x55B7, //CJK UNIFIED IDEOGRAPH
+ 0xC5E8: 0x76C6, //CJK UNIFIED IDEOGRAPH
+ 0xC5E9: 0x7830, //CJK UNIFIED IDEOGRAPH
+ 0xC5EA: 0x62A8, //CJK UNIFIED IDEOGRAPH
+ 0xC5EB: 0x70F9, //CJK UNIFIED IDEOGRAPH
+ 0xC5EC: 0x6F8E, //CJK UNIFIED IDEOGRAPH
+ 0xC5ED: 0x5F6D, //CJK UNIFIED IDEOGRAPH
+ 0xC5EE: 0x84EC, //CJK UNIFIED IDEOGRAPH
+ 0xC5EF: 0x68DA, //CJK UNIFIED IDEOGRAPH
+ 0xC5F0: 0x787C, //CJK UNIFIED IDEOGRAPH
+ 0xC5F1: 0x7BF7, //CJK UNIFIED IDEOGRAPH
+ 0xC5F2: 0x81A8, //CJK UNIFIED IDEOGRAPH
+ 0xC5F3: 0x670B, //CJK UNIFIED IDEOGRAPH
+ 0xC5F4: 0x9E4F, //CJK UNIFIED IDEOGRAPH
+ 0xC5F5: 0x6367, //CJK UNIFIED IDEOGRAPH
+ 0xC5F6: 0x78B0, //CJK UNIFIED IDEOGRAPH
+ 0xC5F7: 0x576F, //CJK UNIFIED IDEOGRAPH
+ 0xC5F8: 0x7812, //CJK UNIFIED IDEOGRAPH
+ 0xC5F9: 0x9739, //CJK UNIFIED IDEOGRAPH
+ 0xC5FA: 0x6279, //CJK UNIFIED IDEOGRAPH
+ 0xC5FB: 0x62AB, //CJK UNIFIED IDEOGRAPH
+ 0xC5FC: 0x5288, //CJK UNIFIED IDEOGRAPH
+ 0xC5FD: 0x7435, //CJK UNIFIED IDEOGRAPH
+ 0xC5FE: 0x6BD7, //CJK UNIFIED IDEOGRAPH
+ 0xC640: 0x826A, //CJK UNIFIED IDEOGRAPH
+ 0xC641: 0x826B, //CJK UNIFIED IDEOGRAPH
+ 0xC642: 0x826C, //CJK UNIFIED IDEOGRAPH
+ 0xC643: 0x826D, //CJK UNIFIED IDEOGRAPH
+ 0xC644: 0x8271, //CJK UNIFIED IDEOGRAPH
+ 0xC645: 0x8275, //CJK UNIFIED IDEOGRAPH
+ 0xC646: 0x8276, //CJK UNIFIED IDEOGRAPH
+ 0xC647: 0x8277, //CJK UNIFIED IDEOGRAPH
+ 0xC648: 0x8278, //CJK UNIFIED IDEOGRAPH
+ 0xC649: 0x827B, //CJK UNIFIED IDEOGRAPH
+ 0xC64A: 0x827C, //CJK UNIFIED IDEOGRAPH
+ 0xC64B: 0x8280, //CJK UNIFIED IDEOGRAPH
+ 0xC64C: 0x8281, //CJK UNIFIED IDEOGRAPH
+ 0xC64D: 0x8283, //CJK UNIFIED IDEOGRAPH
+ 0xC64E: 0x8285, //CJK UNIFIED IDEOGRAPH
+ 0xC64F: 0x8286, //CJK UNIFIED IDEOGRAPH
+ 0xC650: 0x8287, //CJK UNIFIED IDEOGRAPH
+ 0xC651: 0x8289, //CJK UNIFIED IDEOGRAPH
+ 0xC652: 0x828C, //CJK UNIFIED IDEOGRAPH
+ 0xC653: 0x8290, //CJK UNIFIED IDEOGRAPH
+ 0xC654: 0x8293, //CJK UNIFIED IDEOGRAPH
+ 0xC655: 0x8294, //CJK UNIFIED IDEOGRAPH
+ 0xC656: 0x8295, //CJK UNIFIED IDEOGRAPH
+ 0xC657: 0x8296, //CJK UNIFIED IDEOGRAPH
+ 0xC658: 0x829A, //CJK UNIFIED IDEOGRAPH
+ 0xC659: 0x829B, //CJK UNIFIED IDEOGRAPH
+ 0xC65A: 0x829E, //CJK UNIFIED IDEOGRAPH
+ 0xC65B: 0x82A0, //CJK UNIFIED IDEOGRAPH
+ 0xC65C: 0x82A2, //CJK UNIFIED IDEOGRAPH
+ 0xC65D: 0x82A3, //CJK UNIFIED IDEOGRAPH
+ 0xC65E: 0x82A7, //CJK UNIFIED IDEOGRAPH
+ 0xC65F: 0x82B2, //CJK UNIFIED IDEOGRAPH
+ 0xC660: 0x82B5, //CJK UNIFIED IDEOGRAPH
+ 0xC661: 0x82B6, //CJK UNIFIED IDEOGRAPH
+ 0xC662: 0x82BA, //CJK UNIFIED IDEOGRAPH
+ 0xC663: 0x82BB, //CJK UNIFIED IDEOGRAPH
+ 0xC664: 0x82BC, //CJK UNIFIED IDEOGRAPH
+ 0xC665: 0x82BF, //CJK UNIFIED IDEOGRAPH
+ 0xC666: 0x82C0, //CJK UNIFIED IDEOGRAPH
+ 0xC667: 0x82C2, //CJK UNIFIED IDEOGRAPH
+ 0xC668: 0x82C3, //CJK UNIFIED IDEOGRAPH
+ 0xC669: 0x82C5, //CJK UNIFIED IDEOGRAPH
+ 0xC66A: 0x82C6, //CJK UNIFIED IDEOGRAPH
+ 0xC66B: 0x82C9, //CJK UNIFIED IDEOGRAPH
+ 0xC66C: 0x82D0, //CJK UNIFIED IDEOGRAPH
+ 0xC66D: 0x82D6, //CJK UNIFIED IDEOGRAPH
+ 0xC66E: 0x82D9, //CJK UNIFIED IDEOGRAPH
+ 0xC66F: 0x82DA, //CJK UNIFIED IDEOGRAPH
+ 0xC670: 0x82DD, //CJK UNIFIED IDEOGRAPH
+ 0xC671: 0x82E2, //CJK UNIFIED IDEOGRAPH
+ 0xC672: 0x82E7, //CJK UNIFIED IDEOGRAPH
+ 0xC673: 0x82E8, //CJK UNIFIED IDEOGRAPH
+ 0xC674: 0x82E9, //CJK UNIFIED IDEOGRAPH
+ 0xC675: 0x82EA, //CJK UNIFIED IDEOGRAPH
+ 0xC676: 0x82EC, //CJK UNIFIED IDEOGRAPH
+ 0xC677: 0x82ED, //CJK UNIFIED IDEOGRAPH
+ 0xC678: 0x82EE, //CJK UNIFIED IDEOGRAPH
+ 0xC679: 0x82F0, //CJK UNIFIED IDEOGRAPH
+ 0xC67A: 0x82F2, //CJK UNIFIED IDEOGRAPH
+ 0xC67B: 0x82F3, //CJK UNIFIED IDEOGRAPH
+ 0xC67C: 0x82F5, //CJK UNIFIED IDEOGRAPH
+ 0xC67D: 0x82F6, //CJK UNIFIED IDEOGRAPH
+ 0xC67E: 0x82F8, //CJK UNIFIED IDEOGRAPH
+ 0xC680: 0x82FA, //CJK UNIFIED IDEOGRAPH
+ 0xC681: 0x82FC, //CJK UNIFIED IDEOGRAPH
+ 0xC682: 0x82FD, //CJK UNIFIED IDEOGRAPH
+ 0xC683: 0x82FE, //CJK UNIFIED IDEOGRAPH
+ 0xC684: 0x82FF, //CJK UNIFIED IDEOGRAPH
+ 0xC685: 0x8300, //CJK UNIFIED IDEOGRAPH
+ 0xC686: 0x830A, //CJK UNIFIED IDEOGRAPH
+ 0xC687: 0x830B, //CJK UNIFIED IDEOGRAPH
+ 0xC688: 0x830D, //CJK UNIFIED IDEOGRAPH
+ 0xC689: 0x8310, //CJK UNIFIED IDEOGRAPH
+ 0xC68A: 0x8312, //CJK UNIFIED IDEOGRAPH
+ 0xC68B: 0x8313, //CJK UNIFIED IDEOGRAPH
+ 0xC68C: 0x8316, //CJK UNIFIED IDEOGRAPH
+ 0xC68D: 0x8318, //CJK UNIFIED IDEOGRAPH
+ 0xC68E: 0x8319, //CJK UNIFIED IDEOGRAPH
+ 0xC68F: 0x831D, //CJK UNIFIED IDEOGRAPH
+ 0xC690: 0x831E, //CJK UNIFIED IDEOGRAPH
+ 0xC691: 0x831F, //CJK UNIFIED IDEOGRAPH
+ 0xC692: 0x8320, //CJK UNIFIED IDEOGRAPH
+ 0xC693: 0x8321, //CJK UNIFIED IDEOGRAPH
+ 0xC694: 0x8322, //CJK UNIFIED IDEOGRAPH
+ 0xC695: 0x8323, //CJK UNIFIED IDEOGRAPH
+ 0xC696: 0x8324, //CJK UNIFIED IDEOGRAPH
+ 0xC697: 0x8325, //CJK UNIFIED IDEOGRAPH
+ 0xC698: 0x8326, //CJK UNIFIED IDEOGRAPH
+ 0xC699: 0x8329, //CJK UNIFIED IDEOGRAPH
+ 0xC69A: 0x832A, //CJK UNIFIED IDEOGRAPH
+ 0xC69B: 0x832E, //CJK UNIFIED IDEOGRAPH
+ 0xC69C: 0x8330, //CJK UNIFIED IDEOGRAPH
+ 0xC69D: 0x8332, //CJK UNIFIED IDEOGRAPH
+ 0xC69E: 0x8337, //CJK UNIFIED IDEOGRAPH
+ 0xC69F: 0x833B, //CJK UNIFIED IDEOGRAPH
+ 0xC6A0: 0x833D, //CJK UNIFIED IDEOGRAPH
+ 0xC6A1: 0x5564, //CJK UNIFIED IDEOGRAPH
+ 0xC6A2: 0x813E, //CJK UNIFIED IDEOGRAPH
+ 0xC6A3: 0x75B2, //CJK UNIFIED IDEOGRAPH
+ 0xC6A4: 0x76AE, //CJK UNIFIED IDEOGRAPH
+ 0xC6A5: 0x5339, //CJK UNIFIED IDEOGRAPH
+ 0xC6A6: 0x75DE, //CJK UNIFIED IDEOGRAPH
+ 0xC6A7: 0x50FB, //CJK UNIFIED IDEOGRAPH
+ 0xC6A8: 0x5C41, //CJK UNIFIED IDEOGRAPH
+ 0xC6A9: 0x8B6C, //CJK UNIFIED IDEOGRAPH
+ 0xC6AA: 0x7BC7, //CJK UNIFIED IDEOGRAPH
+ 0xC6AB: 0x504F, //CJK UNIFIED IDEOGRAPH
+ 0xC6AC: 0x7247, //CJK UNIFIED IDEOGRAPH
+ 0xC6AD: 0x9A97, //CJK UNIFIED IDEOGRAPH
+ 0xC6AE: 0x98D8, //CJK UNIFIED IDEOGRAPH
+ 0xC6AF: 0x6F02, //CJK UNIFIED IDEOGRAPH
+ 0xC6B0: 0x74E2, //CJK UNIFIED IDEOGRAPH
+ 0xC6B1: 0x7968, //CJK UNIFIED IDEOGRAPH
+ 0xC6B2: 0x6487, //CJK UNIFIED IDEOGRAPH
+ 0xC6B3: 0x77A5, //CJK UNIFIED IDEOGRAPH
+ 0xC6B4: 0x62FC, //CJK UNIFIED IDEOGRAPH
+ 0xC6B5: 0x9891, //CJK UNIFIED IDEOGRAPH
+ 0xC6B6: 0x8D2B, //CJK UNIFIED IDEOGRAPH
+ 0xC6B7: 0x54C1, //CJK UNIFIED IDEOGRAPH
+ 0xC6B8: 0x8058, //CJK UNIFIED IDEOGRAPH
+ 0xC6B9: 0x4E52, //CJK UNIFIED IDEOGRAPH
+ 0xC6BA: 0x576A, //CJK UNIFIED IDEOGRAPH
+ 0xC6BB: 0x82F9, //CJK UNIFIED IDEOGRAPH
+ 0xC6BC: 0x840D, //CJK UNIFIED IDEOGRAPH
+ 0xC6BD: 0x5E73, //CJK UNIFIED IDEOGRAPH
+ 0xC6BE: 0x51ED, //CJK UNIFIED IDEOGRAPH
+ 0xC6BF: 0x74F6, //CJK UNIFIED IDEOGRAPH
+ 0xC6C0: 0x8BC4, //CJK UNIFIED IDEOGRAPH
+ 0xC6C1: 0x5C4F, //CJK UNIFIED IDEOGRAPH
+ 0xC6C2: 0x5761, //CJK UNIFIED IDEOGRAPH
+ 0xC6C3: 0x6CFC, //CJK UNIFIED IDEOGRAPH
+ 0xC6C4: 0x9887, //CJK UNIFIED IDEOGRAPH
+ 0xC6C5: 0x5A46, //CJK UNIFIED IDEOGRAPH
+ 0xC6C6: 0x7834, //CJK UNIFIED IDEOGRAPH
+ 0xC6C7: 0x9B44, //CJK UNIFIED IDEOGRAPH
+ 0xC6C8: 0x8FEB, //CJK UNIFIED IDEOGRAPH
+ 0xC6C9: 0x7C95, //CJK UNIFIED IDEOGRAPH
+ 0xC6CA: 0x5256, //CJK UNIFIED IDEOGRAPH
+ 0xC6CB: 0x6251, //CJK UNIFIED IDEOGRAPH
+ 0xC6CC: 0x94FA, //CJK UNIFIED IDEOGRAPH
+ 0xC6CD: 0x4EC6, //CJK UNIFIED IDEOGRAPH
+ 0xC6CE: 0x8386, //CJK UNIFIED IDEOGRAPH
+ 0xC6CF: 0x8461, //CJK UNIFIED IDEOGRAPH
+ 0xC6D0: 0x83E9, //CJK UNIFIED IDEOGRAPH
+ 0xC6D1: 0x84B2, //CJK UNIFIED IDEOGRAPH
+ 0xC6D2: 0x57D4, //CJK UNIFIED IDEOGRAPH
+ 0xC6D3: 0x6734, //CJK UNIFIED IDEOGRAPH
+ 0xC6D4: 0x5703, //CJK UNIFIED IDEOGRAPH
+ 0xC6D5: 0x666E, //CJK UNIFIED IDEOGRAPH
+ 0xC6D6: 0x6D66, //CJK UNIFIED IDEOGRAPH
+ 0xC6D7: 0x8C31, //CJK UNIFIED IDEOGRAPH
+ 0xC6D8: 0x66DD, //CJK UNIFIED IDEOGRAPH
+ 0xC6D9: 0x7011, //CJK UNIFIED IDEOGRAPH
+ 0xC6DA: 0x671F, //CJK UNIFIED IDEOGRAPH
+ 0xC6DB: 0x6B3A, //CJK UNIFIED IDEOGRAPH
+ 0xC6DC: 0x6816, //CJK UNIFIED IDEOGRAPH
+ 0xC6DD: 0x621A, //CJK UNIFIED IDEOGRAPH
+ 0xC6DE: 0x59BB, //CJK UNIFIED IDEOGRAPH
+ 0xC6DF: 0x4E03, //CJK UNIFIED IDEOGRAPH
+ 0xC6E0: 0x51C4, //CJK UNIFIED IDEOGRAPH
+ 0xC6E1: 0x6F06, //CJK UNIFIED IDEOGRAPH
+ 0xC6E2: 0x67D2, //CJK UNIFIED IDEOGRAPH
+ 0xC6E3: 0x6C8F, //CJK UNIFIED IDEOGRAPH
+ 0xC6E4: 0x5176, //CJK UNIFIED IDEOGRAPH
+ 0xC6E5: 0x68CB, //CJK UNIFIED IDEOGRAPH
+ 0xC6E6: 0x5947, //CJK UNIFIED IDEOGRAPH
+ 0xC6E7: 0x6B67, //CJK UNIFIED IDEOGRAPH
+ 0xC6E8: 0x7566, //CJK UNIFIED IDEOGRAPH
+ 0xC6E9: 0x5D0E, //CJK UNIFIED IDEOGRAPH
+ 0xC6EA: 0x8110, //CJK UNIFIED IDEOGRAPH
+ 0xC6EB: 0x9F50, //CJK UNIFIED IDEOGRAPH
+ 0xC6EC: 0x65D7, //CJK UNIFIED IDEOGRAPH
+ 0xC6ED: 0x7948, //CJK UNIFIED IDEOGRAPH
+ 0xC6EE: 0x7941, //CJK UNIFIED IDEOGRAPH
+ 0xC6EF: 0x9A91, //CJK UNIFIED IDEOGRAPH
+ 0xC6F0: 0x8D77, //CJK UNIFIED IDEOGRAPH
+ 0xC6F1: 0x5C82, //CJK UNIFIED IDEOGRAPH
+ 0xC6F2: 0x4E5E, //CJK UNIFIED IDEOGRAPH
+ 0xC6F3: 0x4F01, //CJK UNIFIED IDEOGRAPH
+ 0xC6F4: 0x542F, //CJK UNIFIED IDEOGRAPH
+ 0xC6F5: 0x5951, //CJK UNIFIED IDEOGRAPH
+ 0xC6F6: 0x780C, //CJK UNIFIED IDEOGRAPH
+ 0xC6F7: 0x5668, //CJK UNIFIED IDEOGRAPH
+ 0xC6F8: 0x6C14, //CJK UNIFIED IDEOGRAPH
+ 0xC6F9: 0x8FC4, //CJK UNIFIED IDEOGRAPH
+ 0xC6FA: 0x5F03, //CJK UNIFIED IDEOGRAPH
+ 0xC6FB: 0x6C7D, //CJK UNIFIED IDEOGRAPH
+ 0xC6FC: 0x6CE3, //CJK UNIFIED IDEOGRAPH
+ 0xC6FD: 0x8BAB, //CJK UNIFIED IDEOGRAPH
+ 0xC6FE: 0x6390, //CJK UNIFIED IDEOGRAPH
+ 0xC740: 0x833E, //CJK UNIFIED IDEOGRAPH
+ 0xC741: 0x833F, //CJK UNIFIED IDEOGRAPH
+ 0xC742: 0x8341, //CJK UNIFIED IDEOGRAPH
+ 0xC743: 0x8342, //CJK UNIFIED IDEOGRAPH
+ 0xC744: 0x8344, //CJK UNIFIED IDEOGRAPH
+ 0xC745: 0x8345, //CJK UNIFIED IDEOGRAPH
+ 0xC746: 0x8348, //CJK UNIFIED IDEOGRAPH
+ 0xC747: 0x834A, //CJK UNIFIED IDEOGRAPH
+ 0xC748: 0x834B, //CJK UNIFIED IDEOGRAPH
+ 0xC749: 0x834C, //CJK UNIFIED IDEOGRAPH
+ 0xC74A: 0x834D, //CJK UNIFIED IDEOGRAPH
+ 0xC74B: 0x834E, //CJK UNIFIED IDEOGRAPH
+ 0xC74C: 0x8353, //CJK UNIFIED IDEOGRAPH
+ 0xC74D: 0x8355, //CJK UNIFIED IDEOGRAPH
+ 0xC74E: 0x8356, //CJK UNIFIED IDEOGRAPH
+ 0xC74F: 0x8357, //CJK UNIFIED IDEOGRAPH
+ 0xC750: 0x8358, //CJK UNIFIED IDEOGRAPH
+ 0xC751: 0x8359, //CJK UNIFIED IDEOGRAPH
+ 0xC752: 0x835D, //CJK UNIFIED IDEOGRAPH
+ 0xC753: 0x8362, //CJK UNIFIED IDEOGRAPH
+ 0xC754: 0x8370, //CJK UNIFIED IDEOGRAPH
+ 0xC755: 0x8371, //CJK UNIFIED IDEOGRAPH
+ 0xC756: 0x8372, //CJK UNIFIED IDEOGRAPH
+ 0xC757: 0x8373, //CJK UNIFIED IDEOGRAPH
+ 0xC758: 0x8374, //CJK UNIFIED IDEOGRAPH
+ 0xC759: 0x8375, //CJK UNIFIED IDEOGRAPH
+ 0xC75A: 0x8376, //CJK UNIFIED IDEOGRAPH
+ 0xC75B: 0x8379, //CJK UNIFIED IDEOGRAPH
+ 0xC75C: 0x837A, //CJK UNIFIED IDEOGRAPH
+ 0xC75D: 0x837E, //CJK UNIFIED IDEOGRAPH
+ 0xC75E: 0x837F, //CJK UNIFIED IDEOGRAPH
+ 0xC75F: 0x8380, //CJK UNIFIED IDEOGRAPH
+ 0xC760: 0x8381, //CJK UNIFIED IDEOGRAPH
+ 0xC761: 0x8382, //CJK UNIFIED IDEOGRAPH
+ 0xC762: 0x8383, //CJK UNIFIED IDEOGRAPH
+ 0xC763: 0x8384, //CJK UNIFIED IDEOGRAPH
+ 0xC764: 0x8387, //CJK UNIFIED IDEOGRAPH
+ 0xC765: 0x8388, //CJK UNIFIED IDEOGRAPH
+ 0xC766: 0x838A, //CJK UNIFIED IDEOGRAPH
+ 0xC767: 0x838B, //CJK UNIFIED IDEOGRAPH
+ 0xC768: 0x838C, //CJK UNIFIED IDEOGRAPH
+ 0xC769: 0x838D, //CJK UNIFIED IDEOGRAPH
+ 0xC76A: 0x838F, //CJK UNIFIED IDEOGRAPH
+ 0xC76B: 0x8390, //CJK UNIFIED IDEOGRAPH
+ 0xC76C: 0x8391, //CJK UNIFIED IDEOGRAPH
+ 0xC76D: 0x8394, //CJK UNIFIED IDEOGRAPH
+ 0xC76E: 0x8395, //CJK UNIFIED IDEOGRAPH
+ 0xC76F: 0x8396, //CJK UNIFIED IDEOGRAPH
+ 0xC770: 0x8397, //CJK UNIFIED IDEOGRAPH
+ 0xC771: 0x8399, //CJK UNIFIED IDEOGRAPH
+ 0xC772: 0x839A, //CJK UNIFIED IDEOGRAPH
+ 0xC773: 0x839D, //CJK UNIFIED IDEOGRAPH
+ 0xC774: 0x839F, //CJK UNIFIED IDEOGRAPH
+ 0xC775: 0x83A1, //CJK UNIFIED IDEOGRAPH
+ 0xC776: 0x83A2, //CJK UNIFIED IDEOGRAPH
+ 0xC777: 0x83A3, //CJK UNIFIED IDEOGRAPH
+ 0xC778: 0x83A4, //CJK UNIFIED IDEOGRAPH
+ 0xC779: 0x83A5, //CJK UNIFIED IDEOGRAPH
+ 0xC77A: 0x83A6, //CJK UNIFIED IDEOGRAPH
+ 0xC77B: 0x83A7, //CJK UNIFIED IDEOGRAPH
+ 0xC77C: 0x83AC, //CJK UNIFIED IDEOGRAPH
+ 0xC77D: 0x83AD, //CJK UNIFIED IDEOGRAPH
+ 0xC77E: 0x83AE, //CJK UNIFIED IDEOGRAPH
+ 0xC780: 0x83AF, //CJK UNIFIED IDEOGRAPH
+ 0xC781: 0x83B5, //CJK UNIFIED IDEOGRAPH
+ 0xC782: 0x83BB, //CJK UNIFIED IDEOGRAPH
+ 0xC783: 0x83BE, //CJK UNIFIED IDEOGRAPH
+ 0xC784: 0x83BF, //CJK UNIFIED IDEOGRAPH
+ 0xC785: 0x83C2, //CJK UNIFIED IDEOGRAPH
+ 0xC786: 0x83C3, //CJK UNIFIED IDEOGRAPH
+ 0xC787: 0x83C4, //CJK UNIFIED IDEOGRAPH
+ 0xC788: 0x83C6, //CJK UNIFIED IDEOGRAPH
+ 0xC789: 0x83C8, //CJK UNIFIED IDEOGRAPH
+ 0xC78A: 0x83C9, //CJK UNIFIED IDEOGRAPH
+ 0xC78B: 0x83CB, //CJK UNIFIED IDEOGRAPH
+ 0xC78C: 0x83CD, //CJK UNIFIED IDEOGRAPH
+ 0xC78D: 0x83CE, //CJK UNIFIED IDEOGRAPH
+ 0xC78E: 0x83D0, //CJK UNIFIED IDEOGRAPH
+ 0xC78F: 0x83D1, //CJK UNIFIED IDEOGRAPH
+ 0xC790: 0x83D2, //CJK UNIFIED IDEOGRAPH
+ 0xC791: 0x83D3, //CJK UNIFIED IDEOGRAPH
+ 0xC792: 0x83D5, //CJK UNIFIED IDEOGRAPH
+ 0xC793: 0x83D7, //CJK UNIFIED IDEOGRAPH
+ 0xC794: 0x83D9, //CJK UNIFIED IDEOGRAPH
+ 0xC795: 0x83DA, //CJK UNIFIED IDEOGRAPH
+ 0xC796: 0x83DB, //CJK UNIFIED IDEOGRAPH
+ 0xC797: 0x83DE, //CJK UNIFIED IDEOGRAPH
+ 0xC798: 0x83E2, //CJK UNIFIED IDEOGRAPH
+ 0xC799: 0x83E3, //CJK UNIFIED IDEOGRAPH
+ 0xC79A: 0x83E4, //CJK UNIFIED IDEOGRAPH
+ 0xC79B: 0x83E6, //CJK UNIFIED IDEOGRAPH
+ 0xC79C: 0x83E7, //CJK UNIFIED IDEOGRAPH
+ 0xC79D: 0x83E8, //CJK UNIFIED IDEOGRAPH
+ 0xC79E: 0x83EB, //CJK UNIFIED IDEOGRAPH
+ 0xC79F: 0x83EC, //CJK UNIFIED IDEOGRAPH
+ 0xC7A0: 0x83ED, //CJK UNIFIED IDEOGRAPH
+ 0xC7A1: 0x6070, //CJK UNIFIED IDEOGRAPH
+ 0xC7A2: 0x6D3D, //CJK UNIFIED IDEOGRAPH
+ 0xC7A3: 0x7275, //CJK UNIFIED IDEOGRAPH
+ 0xC7A4: 0x6266, //CJK UNIFIED IDEOGRAPH
+ 0xC7A5: 0x948E, //CJK UNIFIED IDEOGRAPH
+ 0xC7A6: 0x94C5, //CJK UNIFIED IDEOGRAPH
+ 0xC7A7: 0x5343, //CJK UNIFIED IDEOGRAPH
+ 0xC7A8: 0x8FC1, //CJK UNIFIED IDEOGRAPH
+ 0xC7A9: 0x7B7E, //CJK UNIFIED IDEOGRAPH
+ 0xC7AA: 0x4EDF, //CJK UNIFIED IDEOGRAPH
+ 0xC7AB: 0x8C26, //CJK UNIFIED IDEOGRAPH
+ 0xC7AC: 0x4E7E, //CJK UNIFIED IDEOGRAPH
+ 0xC7AD: 0x9ED4, //CJK UNIFIED IDEOGRAPH
+ 0xC7AE: 0x94B1, //CJK UNIFIED IDEOGRAPH
+ 0xC7AF: 0x94B3, //CJK UNIFIED IDEOGRAPH
+ 0xC7B0: 0x524D, //CJK UNIFIED IDEOGRAPH
+ 0xC7B1: 0x6F5C, //CJK UNIFIED IDEOGRAPH
+ 0xC7B2: 0x9063, //CJK UNIFIED IDEOGRAPH
+ 0xC7B3: 0x6D45, //CJK UNIFIED IDEOGRAPH
+ 0xC7B4: 0x8C34, //CJK UNIFIED IDEOGRAPH
+ 0xC7B5: 0x5811, //CJK UNIFIED IDEOGRAPH
+ 0xC7B6: 0x5D4C, //CJK UNIFIED IDEOGRAPH
+ 0xC7B7: 0x6B20, //CJK UNIFIED IDEOGRAPH
+ 0xC7B8: 0x6B49, //CJK UNIFIED IDEOGRAPH
+ 0xC7B9: 0x67AA, //CJK UNIFIED IDEOGRAPH
+ 0xC7BA: 0x545B, //CJK UNIFIED IDEOGRAPH
+ 0xC7BB: 0x8154, //CJK UNIFIED IDEOGRAPH
+ 0xC7BC: 0x7F8C, //CJK UNIFIED IDEOGRAPH
+ 0xC7BD: 0x5899, //CJK UNIFIED IDEOGRAPH
+ 0xC7BE: 0x8537, //CJK UNIFIED IDEOGRAPH
+ 0xC7BF: 0x5F3A, //CJK UNIFIED IDEOGRAPH
+ 0xC7C0: 0x62A2, //CJK UNIFIED IDEOGRAPH
+ 0xC7C1: 0x6A47, //CJK UNIFIED IDEOGRAPH
+ 0xC7C2: 0x9539, //CJK UNIFIED IDEOGRAPH
+ 0xC7C3: 0x6572, //CJK UNIFIED IDEOGRAPH
+ 0xC7C4: 0x6084, //CJK UNIFIED IDEOGRAPH
+ 0xC7C5: 0x6865, //CJK UNIFIED IDEOGRAPH
+ 0xC7C6: 0x77A7, //CJK UNIFIED IDEOGRAPH
+ 0xC7C7: 0x4E54, //CJK UNIFIED IDEOGRAPH
+ 0xC7C8: 0x4FA8, //CJK UNIFIED IDEOGRAPH
+ 0xC7C9: 0x5DE7, //CJK UNIFIED IDEOGRAPH
+ 0xC7CA: 0x9798, //CJK UNIFIED IDEOGRAPH
+ 0xC7CB: 0x64AC, //CJK UNIFIED IDEOGRAPH
+ 0xC7CC: 0x7FD8, //CJK UNIFIED IDEOGRAPH
+ 0xC7CD: 0x5CED, //CJK UNIFIED IDEOGRAPH
+ 0xC7CE: 0x4FCF, //CJK UNIFIED IDEOGRAPH
+ 0xC7CF: 0x7A8D, //CJK UNIFIED IDEOGRAPH
+ 0xC7D0: 0x5207, //CJK UNIFIED IDEOGRAPH
+ 0xC7D1: 0x8304, //CJK UNIFIED IDEOGRAPH
+ 0xC7D2: 0x4E14, //CJK UNIFIED IDEOGRAPH
+ 0xC7D3: 0x602F, //CJK UNIFIED IDEOGRAPH
+ 0xC7D4: 0x7A83, //CJK UNIFIED IDEOGRAPH
+ 0xC7D5: 0x94A6, //CJK UNIFIED IDEOGRAPH
+ 0xC7D6: 0x4FB5, //CJK UNIFIED IDEOGRAPH
+ 0xC7D7: 0x4EB2, //CJK UNIFIED IDEOGRAPH
+ 0xC7D8: 0x79E6, //CJK UNIFIED IDEOGRAPH
+ 0xC7D9: 0x7434, //CJK UNIFIED IDEOGRAPH
+ 0xC7DA: 0x52E4, //CJK UNIFIED IDEOGRAPH
+ 0xC7DB: 0x82B9, //CJK UNIFIED IDEOGRAPH
+ 0xC7DC: 0x64D2, //CJK UNIFIED IDEOGRAPH
+ 0xC7DD: 0x79BD, //CJK UNIFIED IDEOGRAPH
+ 0xC7DE: 0x5BDD, //CJK UNIFIED IDEOGRAPH
+ 0xC7DF: 0x6C81, //CJK UNIFIED IDEOGRAPH
+ 0xC7E0: 0x9752, //CJK UNIFIED IDEOGRAPH
+ 0xC7E1: 0x8F7B, //CJK UNIFIED IDEOGRAPH
+ 0xC7E2: 0x6C22, //CJK UNIFIED IDEOGRAPH
+ 0xC7E3: 0x503E, //CJK UNIFIED IDEOGRAPH
+ 0xC7E4: 0x537F, //CJK UNIFIED IDEOGRAPH
+ 0xC7E5: 0x6E05, //CJK UNIFIED IDEOGRAPH
+ 0xC7E6: 0x64CE, //CJK UNIFIED IDEOGRAPH
+ 0xC7E7: 0x6674, //CJK UNIFIED IDEOGRAPH
+ 0xC7E8: 0x6C30, //CJK UNIFIED IDEOGRAPH
+ 0xC7E9: 0x60C5, //CJK UNIFIED IDEOGRAPH
+ 0xC7EA: 0x9877, //CJK UNIFIED IDEOGRAPH
+ 0xC7EB: 0x8BF7, //CJK UNIFIED IDEOGRAPH
+ 0xC7EC: 0x5E86, //CJK UNIFIED IDEOGRAPH
+ 0xC7ED: 0x743C, //CJK UNIFIED IDEOGRAPH
+ 0xC7EE: 0x7A77, //CJK UNIFIED IDEOGRAPH
+ 0xC7EF: 0x79CB, //CJK UNIFIED IDEOGRAPH
+ 0xC7F0: 0x4E18, //CJK UNIFIED IDEOGRAPH
+ 0xC7F1: 0x90B1, //CJK UNIFIED IDEOGRAPH
+ 0xC7F2: 0x7403, //CJK UNIFIED IDEOGRAPH
+ 0xC7F3: 0x6C42, //CJK UNIFIED IDEOGRAPH
+ 0xC7F4: 0x56DA, //CJK UNIFIED IDEOGRAPH
+ 0xC7F5: 0x914B, //CJK UNIFIED IDEOGRAPH
+ 0xC7F6: 0x6CC5, //CJK UNIFIED IDEOGRAPH
+ 0xC7F7: 0x8D8B, //CJK UNIFIED IDEOGRAPH
+ 0xC7F8: 0x533A, //CJK UNIFIED IDEOGRAPH
+ 0xC7F9: 0x86C6, //CJK UNIFIED IDEOGRAPH
+ 0xC7FA: 0x66F2, //CJK UNIFIED IDEOGRAPH
+ 0xC7FB: 0x8EAF, //CJK UNIFIED IDEOGRAPH
+ 0xC7FC: 0x5C48, //CJK UNIFIED IDEOGRAPH
+ 0xC7FD: 0x9A71, //CJK UNIFIED IDEOGRAPH
+ 0xC7FE: 0x6E20, //CJK UNIFIED IDEOGRAPH
+ 0xC840: 0x83EE, //CJK UNIFIED IDEOGRAPH
+ 0xC841: 0x83EF, //CJK UNIFIED IDEOGRAPH
+ 0xC842: 0x83F3, //CJK UNIFIED IDEOGRAPH
+ 0xC843: 0x83F4, //CJK UNIFIED IDEOGRAPH
+ 0xC844: 0x83F5, //CJK UNIFIED IDEOGRAPH
+ 0xC845: 0x83F6, //CJK UNIFIED IDEOGRAPH
+ 0xC846: 0x83F7, //CJK UNIFIED IDEOGRAPH
+ 0xC847: 0x83FA, //CJK UNIFIED IDEOGRAPH
+ 0xC848: 0x83FB, //CJK UNIFIED IDEOGRAPH
+ 0xC849: 0x83FC, //CJK UNIFIED IDEOGRAPH
+ 0xC84A: 0x83FE, //CJK UNIFIED IDEOGRAPH
+ 0xC84B: 0x83FF, //CJK UNIFIED IDEOGRAPH
+ 0xC84C: 0x8400, //CJK UNIFIED IDEOGRAPH
+ 0xC84D: 0x8402, //CJK UNIFIED IDEOGRAPH
+ 0xC84E: 0x8405, //CJK UNIFIED IDEOGRAPH
+ 0xC84F: 0x8407, //CJK UNIFIED IDEOGRAPH
+ 0xC850: 0x8408, //CJK UNIFIED IDEOGRAPH
+ 0xC851: 0x8409, //CJK UNIFIED IDEOGRAPH
+ 0xC852: 0x840A, //CJK UNIFIED IDEOGRAPH
+ 0xC853: 0x8410, //CJK UNIFIED IDEOGRAPH
+ 0xC854: 0x8412, //CJK UNIFIED IDEOGRAPH
+ 0xC855: 0x8413, //CJK UNIFIED IDEOGRAPH
+ 0xC856: 0x8414, //CJK UNIFIED IDEOGRAPH
+ 0xC857: 0x8415, //CJK UNIFIED IDEOGRAPH
+ 0xC858: 0x8416, //CJK UNIFIED IDEOGRAPH
+ 0xC859: 0x8417, //CJK UNIFIED IDEOGRAPH
+ 0xC85A: 0x8419, //CJK UNIFIED IDEOGRAPH
+ 0xC85B: 0x841A, //CJK UNIFIED IDEOGRAPH
+ 0xC85C: 0x841B, //CJK UNIFIED IDEOGRAPH
+ 0xC85D: 0x841E, //CJK UNIFIED IDEOGRAPH
+ 0xC85E: 0x841F, //CJK UNIFIED IDEOGRAPH
+ 0xC85F: 0x8420, //CJK UNIFIED IDEOGRAPH
+ 0xC860: 0x8421, //CJK UNIFIED IDEOGRAPH
+ 0xC861: 0x8422, //CJK UNIFIED IDEOGRAPH
+ 0xC862: 0x8423, //CJK UNIFIED IDEOGRAPH
+ 0xC863: 0x8429, //CJK UNIFIED IDEOGRAPH
+ 0xC864: 0x842A, //CJK UNIFIED IDEOGRAPH
+ 0xC865: 0x842B, //CJK UNIFIED IDEOGRAPH
+ 0xC866: 0x842C, //CJK UNIFIED IDEOGRAPH
+ 0xC867: 0x842D, //CJK UNIFIED IDEOGRAPH
+ 0xC868: 0x842E, //CJK UNIFIED IDEOGRAPH
+ 0xC869: 0x842F, //CJK UNIFIED IDEOGRAPH
+ 0xC86A: 0x8430, //CJK UNIFIED IDEOGRAPH
+ 0xC86B: 0x8432, //CJK UNIFIED IDEOGRAPH
+ 0xC86C: 0x8433, //CJK UNIFIED IDEOGRAPH
+ 0xC86D: 0x8434, //CJK UNIFIED IDEOGRAPH
+ 0xC86E: 0x8435, //CJK UNIFIED IDEOGRAPH
+ 0xC86F: 0x8436, //CJK UNIFIED IDEOGRAPH
+ 0xC870: 0x8437, //CJK UNIFIED IDEOGRAPH
+ 0xC871: 0x8439, //CJK UNIFIED IDEOGRAPH
+ 0xC872: 0x843A, //CJK UNIFIED IDEOGRAPH
+ 0xC873: 0x843B, //CJK UNIFIED IDEOGRAPH
+ 0xC874: 0x843E, //CJK UNIFIED IDEOGRAPH
+ 0xC875: 0x843F, //CJK UNIFIED IDEOGRAPH
+ 0xC876: 0x8440, //CJK UNIFIED IDEOGRAPH
+ 0xC877: 0x8441, //CJK UNIFIED IDEOGRAPH
+ 0xC878: 0x8442, //CJK UNIFIED IDEOGRAPH
+ 0xC879: 0x8443, //CJK UNIFIED IDEOGRAPH
+ 0xC87A: 0x8444, //CJK UNIFIED IDEOGRAPH
+ 0xC87B: 0x8445, //CJK UNIFIED IDEOGRAPH
+ 0xC87C: 0x8447, //CJK UNIFIED IDEOGRAPH
+ 0xC87D: 0x8448, //CJK UNIFIED IDEOGRAPH
+ 0xC87E: 0x8449, //CJK UNIFIED IDEOGRAPH
+ 0xC880: 0x844A, //CJK UNIFIED IDEOGRAPH
+ 0xC881: 0x844B, //CJK UNIFIED IDEOGRAPH
+ 0xC882: 0x844C, //CJK UNIFIED IDEOGRAPH
+ 0xC883: 0x844D, //CJK UNIFIED IDEOGRAPH
+ 0xC884: 0x844E, //CJK UNIFIED IDEOGRAPH
+ 0xC885: 0x844F, //CJK UNIFIED IDEOGRAPH
+ 0xC886: 0x8450, //CJK UNIFIED IDEOGRAPH
+ 0xC887: 0x8452, //CJK UNIFIED IDEOGRAPH
+ 0xC888: 0x8453, //CJK UNIFIED IDEOGRAPH
+ 0xC889: 0x8454, //CJK UNIFIED IDEOGRAPH
+ 0xC88A: 0x8455, //CJK UNIFIED IDEOGRAPH
+ 0xC88B: 0x8456, //CJK UNIFIED IDEOGRAPH
+ 0xC88C: 0x8458, //CJK UNIFIED IDEOGRAPH
+ 0xC88D: 0x845D, //CJK UNIFIED IDEOGRAPH
+ 0xC88E: 0x845E, //CJK UNIFIED IDEOGRAPH
+ 0xC88F: 0x845F, //CJK UNIFIED IDEOGRAPH
+ 0xC890: 0x8460, //CJK UNIFIED IDEOGRAPH
+ 0xC891: 0x8462, //CJK UNIFIED IDEOGRAPH
+ 0xC892: 0x8464, //CJK UNIFIED IDEOGRAPH
+ 0xC893: 0x8465, //CJK UNIFIED IDEOGRAPH
+ 0xC894: 0x8466, //CJK UNIFIED IDEOGRAPH
+ 0xC895: 0x8467, //CJK UNIFIED IDEOGRAPH
+ 0xC896: 0x8468, //CJK UNIFIED IDEOGRAPH
+ 0xC897: 0x846A, //CJK UNIFIED IDEOGRAPH
+ 0xC898: 0x846E, //CJK UNIFIED IDEOGRAPH
+ 0xC899: 0x846F, //CJK UNIFIED IDEOGRAPH
+ 0xC89A: 0x8470, //CJK UNIFIED IDEOGRAPH
+ 0xC89B: 0x8472, //CJK UNIFIED IDEOGRAPH
+ 0xC89C: 0x8474, //CJK UNIFIED IDEOGRAPH
+ 0xC89D: 0x8477, //CJK UNIFIED IDEOGRAPH
+ 0xC89E: 0x8479, //CJK UNIFIED IDEOGRAPH
+ 0xC89F: 0x847B, //CJK UNIFIED IDEOGRAPH
+ 0xC8A0: 0x847C, //CJK UNIFIED IDEOGRAPH
+ 0xC8A1: 0x53D6, //CJK UNIFIED IDEOGRAPH
+ 0xC8A2: 0x5A36, //CJK UNIFIED IDEOGRAPH
+ 0xC8A3: 0x9F8B, //CJK UNIFIED IDEOGRAPH
+ 0xC8A4: 0x8DA3, //CJK UNIFIED IDEOGRAPH
+ 0xC8A5: 0x53BB, //CJK UNIFIED IDEOGRAPH
+ 0xC8A6: 0x5708, //CJK UNIFIED IDEOGRAPH
+ 0xC8A7: 0x98A7, //CJK UNIFIED IDEOGRAPH
+ 0xC8A8: 0x6743, //CJK UNIFIED IDEOGRAPH
+ 0xC8A9: 0x919B, //CJK UNIFIED IDEOGRAPH
+ 0xC8AA: 0x6CC9, //CJK UNIFIED IDEOGRAPH
+ 0xC8AB: 0x5168, //CJK UNIFIED IDEOGRAPH
+ 0xC8AC: 0x75CA, //CJK UNIFIED IDEOGRAPH
+ 0xC8AD: 0x62F3, //CJK UNIFIED IDEOGRAPH
+ 0xC8AE: 0x72AC, //CJK UNIFIED IDEOGRAPH
+ 0xC8AF: 0x5238, //CJK UNIFIED IDEOGRAPH
+ 0xC8B0: 0x529D, //CJK UNIFIED IDEOGRAPH
+ 0xC8B1: 0x7F3A, //CJK UNIFIED IDEOGRAPH
+ 0xC8B2: 0x7094, //CJK UNIFIED IDEOGRAPH
+ 0xC8B3: 0x7638, //CJK UNIFIED IDEOGRAPH
+ 0xC8B4: 0x5374, //CJK UNIFIED IDEOGRAPH
+ 0xC8B5: 0x9E4A, //CJK UNIFIED IDEOGRAPH
+ 0xC8B6: 0x69B7, //CJK UNIFIED IDEOGRAPH
+ 0xC8B7: 0x786E, //CJK UNIFIED IDEOGRAPH
+ 0xC8B8: 0x96C0, //CJK UNIFIED IDEOGRAPH
+ 0xC8B9: 0x88D9, //CJK UNIFIED IDEOGRAPH
+ 0xC8BA: 0x7FA4, //CJK UNIFIED IDEOGRAPH
+ 0xC8BB: 0x7136, //CJK UNIFIED IDEOGRAPH
+ 0xC8BC: 0x71C3, //CJK UNIFIED IDEOGRAPH
+ 0xC8BD: 0x5189, //CJK UNIFIED IDEOGRAPH
+ 0xC8BE: 0x67D3, //CJK UNIFIED IDEOGRAPH
+ 0xC8BF: 0x74E4, //CJK UNIFIED IDEOGRAPH
+ 0xC8C0: 0x58E4, //CJK UNIFIED IDEOGRAPH
+ 0xC8C1: 0x6518, //CJK UNIFIED IDEOGRAPH
+ 0xC8C2: 0x56B7, //CJK UNIFIED IDEOGRAPH
+ 0xC8C3: 0x8BA9, //CJK UNIFIED IDEOGRAPH
+ 0xC8C4: 0x9976, //CJK UNIFIED IDEOGRAPH
+ 0xC8C5: 0x6270, //CJK UNIFIED IDEOGRAPH
+ 0xC8C6: 0x7ED5, //CJK UNIFIED IDEOGRAPH
+ 0xC8C7: 0x60F9, //CJK UNIFIED IDEOGRAPH
+ 0xC8C8: 0x70ED, //CJK UNIFIED IDEOGRAPH
+ 0xC8C9: 0x58EC, //CJK UNIFIED IDEOGRAPH
+ 0xC8CA: 0x4EC1, //CJK UNIFIED IDEOGRAPH
+ 0xC8CB: 0x4EBA, //CJK UNIFIED IDEOGRAPH
+ 0xC8CC: 0x5FCD, //CJK UNIFIED IDEOGRAPH
+ 0xC8CD: 0x97E7, //CJK UNIFIED IDEOGRAPH
+ 0xC8CE: 0x4EFB, //CJK UNIFIED IDEOGRAPH
+ 0xC8CF: 0x8BA4, //CJK UNIFIED IDEOGRAPH
+ 0xC8D0: 0x5203, //CJK UNIFIED IDEOGRAPH
+ 0xC8D1: 0x598A, //CJK UNIFIED IDEOGRAPH
+ 0xC8D2: 0x7EAB, //CJK UNIFIED IDEOGRAPH
+ 0xC8D3: 0x6254, //CJK UNIFIED IDEOGRAPH
+ 0xC8D4: 0x4ECD, //CJK UNIFIED IDEOGRAPH
+ 0xC8D5: 0x65E5, //CJK UNIFIED IDEOGRAPH
+ 0xC8D6: 0x620E, //CJK UNIFIED IDEOGRAPH
+ 0xC8D7: 0x8338, //CJK UNIFIED IDEOGRAPH
+ 0xC8D8: 0x84C9, //CJK UNIFIED IDEOGRAPH
+ 0xC8D9: 0x8363, //CJK UNIFIED IDEOGRAPH
+ 0xC8DA: 0x878D, //CJK UNIFIED IDEOGRAPH
+ 0xC8DB: 0x7194, //CJK UNIFIED IDEOGRAPH
+ 0xC8DC: 0x6EB6, //CJK UNIFIED IDEOGRAPH
+ 0xC8DD: 0x5BB9, //CJK UNIFIED IDEOGRAPH
+ 0xC8DE: 0x7ED2, //CJK UNIFIED IDEOGRAPH
+ 0xC8DF: 0x5197, //CJK UNIFIED IDEOGRAPH
+ 0xC8E0: 0x63C9, //CJK UNIFIED IDEOGRAPH
+ 0xC8E1: 0x67D4, //CJK UNIFIED IDEOGRAPH
+ 0xC8E2: 0x8089, //CJK UNIFIED IDEOGRAPH
+ 0xC8E3: 0x8339, //CJK UNIFIED IDEOGRAPH
+ 0xC8E4: 0x8815, //CJK UNIFIED IDEOGRAPH
+ 0xC8E5: 0x5112, //CJK UNIFIED IDEOGRAPH
+ 0xC8E6: 0x5B7A, //CJK UNIFIED IDEOGRAPH
+ 0xC8E7: 0x5982, //CJK UNIFIED IDEOGRAPH
+ 0xC8E8: 0x8FB1, //CJK UNIFIED IDEOGRAPH
+ 0xC8E9: 0x4E73, //CJK UNIFIED IDEOGRAPH
+ 0xC8EA: 0x6C5D, //CJK UNIFIED IDEOGRAPH
+ 0xC8EB: 0x5165, //CJK UNIFIED IDEOGRAPH
+ 0xC8EC: 0x8925, //CJK UNIFIED IDEOGRAPH
+ 0xC8ED: 0x8F6F, //CJK UNIFIED IDEOGRAPH
+ 0xC8EE: 0x962E, //CJK UNIFIED IDEOGRAPH
+ 0xC8EF: 0x854A, //CJK UNIFIED IDEOGRAPH
+ 0xC8F0: 0x745E, //CJK UNIFIED IDEOGRAPH
+ 0xC8F1: 0x9510, //CJK UNIFIED IDEOGRAPH
+ 0xC8F2: 0x95F0, //CJK UNIFIED IDEOGRAPH
+ 0xC8F3: 0x6DA6, //CJK UNIFIED IDEOGRAPH
+ 0xC8F4: 0x82E5, //CJK UNIFIED IDEOGRAPH
+ 0xC8F5: 0x5F31, //CJK UNIFIED IDEOGRAPH
+ 0xC8F6: 0x6492, //CJK UNIFIED IDEOGRAPH
+ 0xC8F7: 0x6D12, //CJK UNIFIED IDEOGRAPH
+ 0xC8F8: 0x8428, //CJK UNIFIED IDEOGRAPH
+ 0xC8F9: 0x816E, //CJK UNIFIED IDEOGRAPH
+ 0xC8FA: 0x9CC3, //CJK UNIFIED IDEOGRAPH
+ 0xC8FB: 0x585E, //CJK UNIFIED IDEOGRAPH
+ 0xC8FC: 0x8D5B, //CJK UNIFIED IDEOGRAPH
+ 0xC8FD: 0x4E09, //CJK UNIFIED IDEOGRAPH
+ 0xC8FE: 0x53C1, //CJK UNIFIED IDEOGRAPH
+ 0xC940: 0x847D, //CJK UNIFIED IDEOGRAPH
+ 0xC941: 0x847E, //CJK UNIFIED IDEOGRAPH
+ 0xC942: 0x847F, //CJK UNIFIED IDEOGRAPH
+ 0xC943: 0x8480, //CJK UNIFIED IDEOGRAPH
+ 0xC944: 0x8481, //CJK UNIFIED IDEOGRAPH
+ 0xC945: 0x8483, //CJK UNIFIED IDEOGRAPH
+ 0xC946: 0x8484, //CJK UNIFIED IDEOGRAPH
+ 0xC947: 0x8485, //CJK UNIFIED IDEOGRAPH
+ 0xC948: 0x8486, //CJK UNIFIED IDEOGRAPH
+ 0xC949: 0x848A, //CJK UNIFIED IDEOGRAPH
+ 0xC94A: 0x848D, //CJK UNIFIED IDEOGRAPH
+ 0xC94B: 0x848F, //CJK UNIFIED IDEOGRAPH
+ 0xC94C: 0x8490, //CJK UNIFIED IDEOGRAPH
+ 0xC94D: 0x8491, //CJK UNIFIED IDEOGRAPH
+ 0xC94E: 0x8492, //CJK UNIFIED IDEOGRAPH
+ 0xC94F: 0x8493, //CJK UNIFIED IDEOGRAPH
+ 0xC950: 0x8494, //CJK UNIFIED IDEOGRAPH
+ 0xC951: 0x8495, //CJK UNIFIED IDEOGRAPH
+ 0xC952: 0x8496, //CJK UNIFIED IDEOGRAPH
+ 0xC953: 0x8498, //CJK UNIFIED IDEOGRAPH
+ 0xC954: 0x849A, //CJK UNIFIED IDEOGRAPH
+ 0xC955: 0x849B, //CJK UNIFIED IDEOGRAPH
+ 0xC956: 0x849D, //CJK UNIFIED IDEOGRAPH
+ 0xC957: 0x849E, //CJK UNIFIED IDEOGRAPH
+ 0xC958: 0x849F, //CJK UNIFIED IDEOGRAPH
+ 0xC959: 0x84A0, //CJK UNIFIED IDEOGRAPH
+ 0xC95A: 0x84A2, //CJK UNIFIED IDEOGRAPH
+ 0xC95B: 0x84A3, //CJK UNIFIED IDEOGRAPH
+ 0xC95C: 0x84A4, //CJK UNIFIED IDEOGRAPH
+ 0xC95D: 0x84A5, //CJK UNIFIED IDEOGRAPH
+ 0xC95E: 0x84A6, //CJK UNIFIED IDEOGRAPH
+ 0xC95F: 0x84A7, //CJK UNIFIED IDEOGRAPH
+ 0xC960: 0x84A8, //CJK UNIFIED IDEOGRAPH
+ 0xC961: 0x84A9, //CJK UNIFIED IDEOGRAPH
+ 0xC962: 0x84AA, //CJK UNIFIED IDEOGRAPH
+ 0xC963: 0x84AB, //CJK UNIFIED IDEOGRAPH
+ 0xC964: 0x84AC, //CJK UNIFIED IDEOGRAPH
+ 0xC965: 0x84AD, //CJK UNIFIED IDEOGRAPH
+ 0xC966: 0x84AE, //CJK UNIFIED IDEOGRAPH
+ 0xC967: 0x84B0, //CJK UNIFIED IDEOGRAPH
+ 0xC968: 0x84B1, //CJK UNIFIED IDEOGRAPH
+ 0xC969: 0x84B3, //CJK UNIFIED IDEOGRAPH
+ 0xC96A: 0x84B5, //CJK UNIFIED IDEOGRAPH
+ 0xC96B: 0x84B6, //CJK UNIFIED IDEOGRAPH
+ 0xC96C: 0x84B7, //CJK UNIFIED IDEOGRAPH
+ 0xC96D: 0x84BB, //CJK UNIFIED IDEOGRAPH
+ 0xC96E: 0x84BC, //CJK UNIFIED IDEOGRAPH
+ 0xC96F: 0x84BE, //CJK UNIFIED IDEOGRAPH
+ 0xC970: 0x84C0, //CJK UNIFIED IDEOGRAPH
+ 0xC971: 0x84C2, //CJK UNIFIED IDEOGRAPH
+ 0xC972: 0x84C3, //CJK UNIFIED IDEOGRAPH
+ 0xC973: 0x84C5, //CJK UNIFIED IDEOGRAPH
+ 0xC974: 0x84C6, //CJK UNIFIED IDEOGRAPH
+ 0xC975: 0x84C7, //CJK UNIFIED IDEOGRAPH
+ 0xC976: 0x84C8, //CJK UNIFIED IDEOGRAPH
+ 0xC977: 0x84CB, //CJK UNIFIED IDEOGRAPH
+ 0xC978: 0x84CC, //CJK UNIFIED IDEOGRAPH
+ 0xC979: 0x84CE, //CJK UNIFIED IDEOGRAPH
+ 0xC97A: 0x84CF, //CJK UNIFIED IDEOGRAPH
+ 0xC97B: 0x84D2, //CJK UNIFIED IDEOGRAPH
+ 0xC97C: 0x84D4, //CJK UNIFIED IDEOGRAPH
+ 0xC97D: 0x84D5, //CJK UNIFIED IDEOGRAPH
+ 0xC97E: 0x84D7, //CJK UNIFIED IDEOGRAPH
+ 0xC980: 0x84D8, //CJK UNIFIED IDEOGRAPH
+ 0xC981: 0x84D9, //CJK UNIFIED IDEOGRAPH
+ 0xC982: 0x84DA, //CJK UNIFIED IDEOGRAPH
+ 0xC983: 0x84DB, //CJK UNIFIED IDEOGRAPH
+ 0xC984: 0x84DC, //CJK UNIFIED IDEOGRAPH
+ 0xC985: 0x84DE, //CJK UNIFIED IDEOGRAPH
+ 0xC986: 0x84E1, //CJK UNIFIED IDEOGRAPH
+ 0xC987: 0x84E2, //CJK UNIFIED IDEOGRAPH
+ 0xC988: 0x84E4, //CJK UNIFIED IDEOGRAPH
+ 0xC989: 0x84E7, //CJK UNIFIED IDEOGRAPH
+ 0xC98A: 0x84E8, //CJK UNIFIED IDEOGRAPH
+ 0xC98B: 0x84E9, //CJK UNIFIED IDEOGRAPH
+ 0xC98C: 0x84EA, //CJK UNIFIED IDEOGRAPH
+ 0xC98D: 0x84EB, //CJK UNIFIED IDEOGRAPH
+ 0xC98E: 0x84ED, //CJK UNIFIED IDEOGRAPH
+ 0xC98F: 0x84EE, //CJK UNIFIED IDEOGRAPH
+ 0xC990: 0x84EF, //CJK UNIFIED IDEOGRAPH
+ 0xC991: 0x84F1, //CJK UNIFIED IDEOGRAPH
+ 0xC992: 0x84F2, //CJK UNIFIED IDEOGRAPH
+ 0xC993: 0x84F3, //CJK UNIFIED IDEOGRAPH
+ 0xC994: 0x84F4, //CJK UNIFIED IDEOGRAPH
+ 0xC995: 0x84F5, //CJK UNIFIED IDEOGRAPH
+ 0xC996: 0x84F6, //CJK UNIFIED IDEOGRAPH
+ 0xC997: 0x84F7, //CJK UNIFIED IDEOGRAPH
+ 0xC998: 0x84F8, //CJK UNIFIED IDEOGRAPH
+ 0xC999: 0x84F9, //CJK UNIFIED IDEOGRAPH
+ 0xC99A: 0x84FA, //CJK UNIFIED IDEOGRAPH
+ 0xC99B: 0x84FB, //CJK UNIFIED IDEOGRAPH
+ 0xC99C: 0x84FD, //CJK UNIFIED IDEOGRAPH
+ 0xC99D: 0x84FE, //CJK UNIFIED IDEOGRAPH
+ 0xC99E: 0x8500, //CJK UNIFIED IDEOGRAPH
+ 0xC99F: 0x8501, //CJK UNIFIED IDEOGRAPH
+ 0xC9A0: 0x8502, //CJK UNIFIED IDEOGRAPH
+ 0xC9A1: 0x4F1E, //CJK UNIFIED IDEOGRAPH
+ 0xC9A2: 0x6563, //CJK UNIFIED IDEOGRAPH
+ 0xC9A3: 0x6851, //CJK UNIFIED IDEOGRAPH
+ 0xC9A4: 0x55D3, //CJK UNIFIED IDEOGRAPH
+ 0xC9A5: 0x4E27, //CJK UNIFIED IDEOGRAPH
+ 0xC9A6: 0x6414, //CJK UNIFIED IDEOGRAPH
+ 0xC9A7: 0x9A9A, //CJK UNIFIED IDEOGRAPH
+ 0xC9A8: 0x626B, //CJK UNIFIED IDEOGRAPH
+ 0xC9A9: 0x5AC2, //CJK UNIFIED IDEOGRAPH
+ 0xC9AA: 0x745F, //CJK UNIFIED IDEOGRAPH
+ 0xC9AB: 0x8272, //CJK UNIFIED IDEOGRAPH
+ 0xC9AC: 0x6DA9, //CJK UNIFIED IDEOGRAPH
+ 0xC9AD: 0x68EE, //CJK UNIFIED IDEOGRAPH
+ 0xC9AE: 0x50E7, //CJK UNIFIED IDEOGRAPH
+ 0xC9AF: 0x838E, //CJK UNIFIED IDEOGRAPH
+ 0xC9B0: 0x7802, //CJK UNIFIED IDEOGRAPH
+ 0xC9B1: 0x6740, //CJK UNIFIED IDEOGRAPH
+ 0xC9B2: 0x5239, //CJK UNIFIED IDEOGRAPH
+ 0xC9B3: 0x6C99, //CJK UNIFIED IDEOGRAPH
+ 0xC9B4: 0x7EB1, //CJK UNIFIED IDEOGRAPH
+ 0xC9B5: 0x50BB, //CJK UNIFIED IDEOGRAPH
+ 0xC9B6: 0x5565, //CJK UNIFIED IDEOGRAPH
+ 0xC9B7: 0x715E, //CJK UNIFIED IDEOGRAPH
+ 0xC9B8: 0x7B5B, //CJK UNIFIED IDEOGRAPH
+ 0xC9B9: 0x6652, //CJK UNIFIED IDEOGRAPH
+ 0xC9BA: 0x73CA, //CJK UNIFIED IDEOGRAPH
+ 0xC9BB: 0x82EB, //CJK UNIFIED IDEOGRAPH
+ 0xC9BC: 0x6749, //CJK UNIFIED IDEOGRAPH
+ 0xC9BD: 0x5C71, //CJK UNIFIED IDEOGRAPH
+ 0xC9BE: 0x5220, //CJK UNIFIED IDEOGRAPH
+ 0xC9BF: 0x717D, //CJK UNIFIED IDEOGRAPH
+ 0xC9C0: 0x886B, //CJK UNIFIED IDEOGRAPH
+ 0xC9C1: 0x95EA, //CJK UNIFIED IDEOGRAPH
+ 0xC9C2: 0x9655, //CJK UNIFIED IDEOGRAPH
+ 0xC9C3: 0x64C5, //CJK UNIFIED IDEOGRAPH
+ 0xC9C4: 0x8D61, //CJK UNIFIED IDEOGRAPH
+ 0xC9C5: 0x81B3, //CJK UNIFIED IDEOGRAPH
+ 0xC9C6: 0x5584, //CJK UNIFIED IDEOGRAPH
+ 0xC9C7: 0x6C55, //CJK UNIFIED IDEOGRAPH
+ 0xC9C8: 0x6247, //CJK UNIFIED IDEOGRAPH
+ 0xC9C9: 0x7F2E, //CJK UNIFIED IDEOGRAPH
+ 0xC9CA: 0x5892, //CJK UNIFIED IDEOGRAPH
+ 0xC9CB: 0x4F24, //CJK UNIFIED IDEOGRAPH
+ 0xC9CC: 0x5546, //CJK UNIFIED IDEOGRAPH
+ 0xC9CD: 0x8D4F, //CJK UNIFIED IDEOGRAPH
+ 0xC9CE: 0x664C, //CJK UNIFIED IDEOGRAPH
+ 0xC9CF: 0x4E0A, //CJK UNIFIED IDEOGRAPH
+ 0xC9D0: 0x5C1A, //CJK UNIFIED IDEOGRAPH
+ 0xC9D1: 0x88F3, //CJK UNIFIED IDEOGRAPH
+ 0xC9D2: 0x68A2, //CJK UNIFIED IDEOGRAPH
+ 0xC9D3: 0x634E, //CJK UNIFIED IDEOGRAPH
+ 0xC9D4: 0x7A0D, //CJK UNIFIED IDEOGRAPH
+ 0xC9D5: 0x70E7, //CJK UNIFIED IDEOGRAPH
+ 0xC9D6: 0x828D, //CJK UNIFIED IDEOGRAPH
+ 0xC9D7: 0x52FA, //CJK UNIFIED IDEOGRAPH
+ 0xC9D8: 0x97F6, //CJK UNIFIED IDEOGRAPH
+ 0xC9D9: 0x5C11, //CJK UNIFIED IDEOGRAPH
+ 0xC9DA: 0x54E8, //CJK UNIFIED IDEOGRAPH
+ 0xC9DB: 0x90B5, //CJK UNIFIED IDEOGRAPH
+ 0xC9DC: 0x7ECD, //CJK UNIFIED IDEOGRAPH
+ 0xC9DD: 0x5962, //CJK UNIFIED IDEOGRAPH
+ 0xC9DE: 0x8D4A, //CJK UNIFIED IDEOGRAPH
+ 0xC9DF: 0x86C7, //CJK UNIFIED IDEOGRAPH
+ 0xC9E0: 0x820C, //CJK UNIFIED IDEOGRAPH
+ 0xC9E1: 0x820D, //CJK UNIFIED IDEOGRAPH
+ 0xC9E2: 0x8D66, //CJK UNIFIED IDEOGRAPH
+ 0xC9E3: 0x6444, //CJK UNIFIED IDEOGRAPH
+ 0xC9E4: 0x5C04, //CJK UNIFIED IDEOGRAPH
+ 0xC9E5: 0x6151, //CJK UNIFIED IDEOGRAPH
+ 0xC9E6: 0x6D89, //CJK UNIFIED IDEOGRAPH
+ 0xC9E7: 0x793E, //CJK UNIFIED IDEOGRAPH
+ 0xC9E8: 0x8BBE, //CJK UNIFIED IDEOGRAPH
+ 0xC9E9: 0x7837, //CJK UNIFIED IDEOGRAPH
+ 0xC9EA: 0x7533, //CJK UNIFIED IDEOGRAPH
+ 0xC9EB: 0x547B, //CJK UNIFIED IDEOGRAPH
+ 0xC9EC: 0x4F38, //CJK UNIFIED IDEOGRAPH
+ 0xC9ED: 0x8EAB, //CJK UNIFIED IDEOGRAPH
+ 0xC9EE: 0x6DF1, //CJK UNIFIED IDEOGRAPH
+ 0xC9EF: 0x5A20, //CJK UNIFIED IDEOGRAPH
+ 0xC9F0: 0x7EC5, //CJK UNIFIED IDEOGRAPH
+ 0xC9F1: 0x795E, //CJK UNIFIED IDEOGRAPH
+ 0xC9F2: 0x6C88, //CJK UNIFIED IDEOGRAPH
+ 0xC9F3: 0x5BA1, //CJK UNIFIED IDEOGRAPH
+ 0xC9F4: 0x5A76, //CJK UNIFIED IDEOGRAPH
+ 0xC9F5: 0x751A, //CJK UNIFIED IDEOGRAPH
+ 0xC9F6: 0x80BE, //CJK UNIFIED IDEOGRAPH
+ 0xC9F7: 0x614E, //CJK UNIFIED IDEOGRAPH
+ 0xC9F8: 0x6E17, //CJK UNIFIED IDEOGRAPH
+ 0xC9F9: 0x58F0, //CJK UNIFIED IDEOGRAPH
+ 0xC9FA: 0x751F, //CJK UNIFIED IDEOGRAPH
+ 0xC9FB: 0x7525, //CJK UNIFIED IDEOGRAPH
+ 0xC9FC: 0x7272, //CJK UNIFIED IDEOGRAPH
+ 0xC9FD: 0x5347, //CJK UNIFIED IDEOGRAPH
+ 0xC9FE: 0x7EF3, //CJK UNIFIED IDEOGRAPH
+ 0xCA40: 0x8503, //CJK UNIFIED IDEOGRAPH
+ 0xCA41: 0x8504, //CJK UNIFIED IDEOGRAPH
+ 0xCA42: 0x8505, //CJK UNIFIED IDEOGRAPH
+ 0xCA43: 0x8506, //CJK UNIFIED IDEOGRAPH
+ 0xCA44: 0x8507, //CJK UNIFIED IDEOGRAPH
+ 0xCA45: 0x8508, //CJK UNIFIED IDEOGRAPH
+ 0xCA46: 0x8509, //CJK UNIFIED IDEOGRAPH
+ 0xCA47: 0x850A, //CJK UNIFIED IDEOGRAPH
+ 0xCA48: 0x850B, //CJK UNIFIED IDEOGRAPH
+ 0xCA49: 0x850D, //CJK UNIFIED IDEOGRAPH
+ 0xCA4A: 0x850E, //CJK UNIFIED IDEOGRAPH
+ 0xCA4B: 0x850F, //CJK UNIFIED IDEOGRAPH
+ 0xCA4C: 0x8510, //CJK UNIFIED IDEOGRAPH
+ 0xCA4D: 0x8512, //CJK UNIFIED IDEOGRAPH
+ 0xCA4E: 0x8514, //CJK UNIFIED IDEOGRAPH
+ 0xCA4F: 0x8515, //CJK UNIFIED IDEOGRAPH
+ 0xCA50: 0x8516, //CJK UNIFIED IDEOGRAPH
+ 0xCA51: 0x8518, //CJK UNIFIED IDEOGRAPH
+ 0xCA52: 0x8519, //CJK UNIFIED IDEOGRAPH
+ 0xCA53: 0x851B, //CJK UNIFIED IDEOGRAPH
+ 0xCA54: 0x851C, //CJK UNIFIED IDEOGRAPH
+ 0xCA55: 0x851D, //CJK UNIFIED IDEOGRAPH
+ 0xCA56: 0x851E, //CJK UNIFIED IDEOGRAPH
+ 0xCA57: 0x8520, //CJK UNIFIED IDEOGRAPH
+ 0xCA58: 0x8522, //CJK UNIFIED IDEOGRAPH
+ 0xCA59: 0x8523, //CJK UNIFIED IDEOGRAPH
+ 0xCA5A: 0x8524, //CJK UNIFIED IDEOGRAPH
+ 0xCA5B: 0x8525, //CJK UNIFIED IDEOGRAPH
+ 0xCA5C: 0x8526, //CJK UNIFIED IDEOGRAPH
+ 0xCA5D: 0x8527, //CJK UNIFIED IDEOGRAPH
+ 0xCA5E: 0x8528, //CJK UNIFIED IDEOGRAPH
+ 0xCA5F: 0x8529, //CJK UNIFIED IDEOGRAPH
+ 0xCA60: 0x852A, //CJK UNIFIED IDEOGRAPH
+ 0xCA61: 0x852D, //CJK UNIFIED IDEOGRAPH
+ 0xCA62: 0x852E, //CJK UNIFIED IDEOGRAPH
+ 0xCA63: 0x852F, //CJK UNIFIED IDEOGRAPH
+ 0xCA64: 0x8530, //CJK UNIFIED IDEOGRAPH
+ 0xCA65: 0x8531, //CJK UNIFIED IDEOGRAPH
+ 0xCA66: 0x8532, //CJK UNIFIED IDEOGRAPH
+ 0xCA67: 0x8533, //CJK UNIFIED IDEOGRAPH
+ 0xCA68: 0x8534, //CJK UNIFIED IDEOGRAPH
+ 0xCA69: 0x8535, //CJK UNIFIED IDEOGRAPH
+ 0xCA6A: 0x8536, //CJK UNIFIED IDEOGRAPH
+ 0xCA6B: 0x853E, //CJK UNIFIED IDEOGRAPH
+ 0xCA6C: 0x853F, //CJK UNIFIED IDEOGRAPH
+ 0xCA6D: 0x8540, //CJK UNIFIED IDEOGRAPH
+ 0xCA6E: 0x8541, //CJK UNIFIED IDEOGRAPH
+ 0xCA6F: 0x8542, //CJK UNIFIED IDEOGRAPH
+ 0xCA70: 0x8544, //CJK UNIFIED IDEOGRAPH
+ 0xCA71: 0x8545, //CJK UNIFIED IDEOGRAPH
+ 0xCA72: 0x8546, //CJK UNIFIED IDEOGRAPH
+ 0xCA73: 0x8547, //CJK UNIFIED IDEOGRAPH
+ 0xCA74: 0x854B, //CJK UNIFIED IDEOGRAPH
+ 0xCA75: 0x854C, //CJK UNIFIED IDEOGRAPH
+ 0xCA76: 0x854D, //CJK UNIFIED IDEOGRAPH
+ 0xCA77: 0x854E, //CJK UNIFIED IDEOGRAPH
+ 0xCA78: 0x854F, //CJK UNIFIED IDEOGRAPH
+ 0xCA79: 0x8550, //CJK UNIFIED IDEOGRAPH
+ 0xCA7A: 0x8551, //CJK UNIFIED IDEOGRAPH
+ 0xCA7B: 0x8552, //CJK UNIFIED IDEOGRAPH
+ 0xCA7C: 0x8553, //CJK UNIFIED IDEOGRAPH
+ 0xCA7D: 0x8554, //CJK UNIFIED IDEOGRAPH
+ 0xCA7E: 0x8555, //CJK UNIFIED IDEOGRAPH
+ 0xCA80: 0x8557, //CJK UNIFIED IDEOGRAPH
+ 0xCA81: 0x8558, //CJK UNIFIED IDEOGRAPH
+ 0xCA82: 0x855A, //CJK UNIFIED IDEOGRAPH
+ 0xCA83: 0x855B, //CJK UNIFIED IDEOGRAPH
+ 0xCA84: 0x855C, //CJK UNIFIED IDEOGRAPH
+ 0xCA85: 0x855D, //CJK UNIFIED IDEOGRAPH
+ 0xCA86: 0x855F, //CJK UNIFIED IDEOGRAPH
+ 0xCA87: 0x8560, //CJK UNIFIED IDEOGRAPH
+ 0xCA88: 0x8561, //CJK UNIFIED IDEOGRAPH
+ 0xCA89: 0x8562, //CJK UNIFIED IDEOGRAPH
+ 0xCA8A: 0x8563, //CJK UNIFIED IDEOGRAPH
+ 0xCA8B: 0x8565, //CJK UNIFIED IDEOGRAPH
+ 0xCA8C: 0x8566, //CJK UNIFIED IDEOGRAPH
+ 0xCA8D: 0x8567, //CJK UNIFIED IDEOGRAPH
+ 0xCA8E: 0x8569, //CJK UNIFIED IDEOGRAPH
+ 0xCA8F: 0x856A, //CJK UNIFIED IDEOGRAPH
+ 0xCA90: 0x856B, //CJK UNIFIED IDEOGRAPH
+ 0xCA91: 0x856C, //CJK UNIFIED IDEOGRAPH
+ 0xCA92: 0x856D, //CJK UNIFIED IDEOGRAPH
+ 0xCA93: 0x856E, //CJK UNIFIED IDEOGRAPH
+ 0xCA94: 0x856F, //CJK UNIFIED IDEOGRAPH
+ 0xCA95: 0x8570, //CJK UNIFIED IDEOGRAPH
+ 0xCA96: 0x8571, //CJK UNIFIED IDEOGRAPH
+ 0xCA97: 0x8573, //CJK UNIFIED IDEOGRAPH
+ 0xCA98: 0x8575, //CJK UNIFIED IDEOGRAPH
+ 0xCA99: 0x8576, //CJK UNIFIED IDEOGRAPH
+ 0xCA9A: 0x8577, //CJK UNIFIED IDEOGRAPH
+ 0xCA9B: 0x8578, //CJK UNIFIED IDEOGRAPH
+ 0xCA9C: 0x857C, //CJK UNIFIED IDEOGRAPH
+ 0xCA9D: 0x857D, //CJK UNIFIED IDEOGRAPH
+ 0xCA9E: 0x857F, //CJK UNIFIED IDEOGRAPH
+ 0xCA9F: 0x8580, //CJK UNIFIED IDEOGRAPH
+ 0xCAA0: 0x8581, //CJK UNIFIED IDEOGRAPH
+ 0xCAA1: 0x7701, //CJK UNIFIED IDEOGRAPH
+ 0xCAA2: 0x76DB, //CJK UNIFIED IDEOGRAPH
+ 0xCAA3: 0x5269, //CJK UNIFIED IDEOGRAPH
+ 0xCAA4: 0x80DC, //CJK UNIFIED IDEOGRAPH
+ 0xCAA5: 0x5723, //CJK UNIFIED IDEOGRAPH
+ 0xCAA6: 0x5E08, //CJK UNIFIED IDEOGRAPH
+ 0xCAA7: 0x5931, //CJK UNIFIED IDEOGRAPH
+ 0xCAA8: 0x72EE, //CJK UNIFIED IDEOGRAPH
+ 0xCAA9: 0x65BD, //CJK UNIFIED IDEOGRAPH
+ 0xCAAA: 0x6E7F, //CJK UNIFIED IDEOGRAPH
+ 0xCAAB: 0x8BD7, //CJK UNIFIED IDEOGRAPH
+ 0xCAAC: 0x5C38, //CJK UNIFIED IDEOGRAPH
+ 0xCAAD: 0x8671, //CJK UNIFIED IDEOGRAPH
+ 0xCAAE: 0x5341, //CJK UNIFIED IDEOGRAPH
+ 0xCAAF: 0x77F3, //CJK UNIFIED IDEOGRAPH
+ 0xCAB0: 0x62FE, //CJK UNIFIED IDEOGRAPH
+ 0xCAB1: 0x65F6, //CJK UNIFIED IDEOGRAPH
+ 0xCAB2: 0x4EC0, //CJK UNIFIED IDEOGRAPH
+ 0xCAB3: 0x98DF, //CJK UNIFIED IDEOGRAPH
+ 0xCAB4: 0x8680, //CJK UNIFIED IDEOGRAPH
+ 0xCAB5: 0x5B9E, //CJK UNIFIED IDEOGRAPH
+ 0xCAB6: 0x8BC6, //CJK UNIFIED IDEOGRAPH
+ 0xCAB7: 0x53F2, //CJK UNIFIED IDEOGRAPH
+ 0xCAB8: 0x77E2, //CJK UNIFIED IDEOGRAPH
+ 0xCAB9: 0x4F7F, //CJK UNIFIED IDEOGRAPH
+ 0xCABA: 0x5C4E, //CJK UNIFIED IDEOGRAPH
+ 0xCABB: 0x9A76, //CJK UNIFIED IDEOGRAPH
+ 0xCABC: 0x59CB, //CJK UNIFIED IDEOGRAPH
+ 0xCABD: 0x5F0F, //CJK UNIFIED IDEOGRAPH
+ 0xCABE: 0x793A, //CJK UNIFIED IDEOGRAPH
+ 0xCABF: 0x58EB, //CJK UNIFIED IDEOGRAPH
+ 0xCAC0: 0x4E16, //CJK UNIFIED IDEOGRAPH
+ 0xCAC1: 0x67FF, //CJK UNIFIED IDEOGRAPH
+ 0xCAC2: 0x4E8B, //CJK UNIFIED IDEOGRAPH
+ 0xCAC3: 0x62ED, //CJK UNIFIED IDEOGRAPH
+ 0xCAC4: 0x8A93, //CJK UNIFIED IDEOGRAPH
+ 0xCAC5: 0x901D, //CJK UNIFIED IDEOGRAPH
+ 0xCAC6: 0x52BF, //CJK UNIFIED IDEOGRAPH
+ 0xCAC7: 0x662F, //CJK UNIFIED IDEOGRAPH
+ 0xCAC8: 0x55DC, //CJK UNIFIED IDEOGRAPH
+ 0xCAC9: 0x566C, //CJK UNIFIED IDEOGRAPH
+ 0xCACA: 0x9002, //CJK UNIFIED IDEOGRAPH
+ 0xCACB: 0x4ED5, //CJK UNIFIED IDEOGRAPH
+ 0xCACC: 0x4F8D, //CJK UNIFIED IDEOGRAPH
+ 0xCACD: 0x91CA, //CJK UNIFIED IDEOGRAPH
+ 0xCACE: 0x9970, //CJK UNIFIED IDEOGRAPH
+ 0xCACF: 0x6C0F, //CJK UNIFIED IDEOGRAPH
+ 0xCAD0: 0x5E02, //CJK UNIFIED IDEOGRAPH
+ 0xCAD1: 0x6043, //CJK UNIFIED IDEOGRAPH
+ 0xCAD2: 0x5BA4, //CJK UNIFIED IDEOGRAPH
+ 0xCAD3: 0x89C6, //CJK UNIFIED IDEOGRAPH
+ 0xCAD4: 0x8BD5, //CJK UNIFIED IDEOGRAPH
+ 0xCAD5: 0x6536, //CJK UNIFIED IDEOGRAPH
+ 0xCAD6: 0x624B, //CJK UNIFIED IDEOGRAPH
+ 0xCAD7: 0x9996, //CJK UNIFIED IDEOGRAPH
+ 0xCAD8: 0x5B88, //CJK UNIFIED IDEOGRAPH
+ 0xCAD9: 0x5BFF, //CJK UNIFIED IDEOGRAPH
+ 0xCADA: 0x6388, //CJK UNIFIED IDEOGRAPH
+ 0xCADB: 0x552E, //CJK UNIFIED IDEOGRAPH
+ 0xCADC: 0x53D7, //CJK UNIFIED IDEOGRAPH
+ 0xCADD: 0x7626, //CJK UNIFIED IDEOGRAPH
+ 0xCADE: 0x517D, //CJK UNIFIED IDEOGRAPH
+ 0xCADF: 0x852C, //CJK UNIFIED IDEOGRAPH
+ 0xCAE0: 0x67A2, //CJK UNIFIED IDEOGRAPH
+ 0xCAE1: 0x68B3, //CJK UNIFIED IDEOGRAPH
+ 0xCAE2: 0x6B8A, //CJK UNIFIED IDEOGRAPH
+ 0xCAE3: 0x6292, //CJK UNIFIED IDEOGRAPH
+ 0xCAE4: 0x8F93, //CJK UNIFIED IDEOGRAPH
+ 0xCAE5: 0x53D4, //CJK UNIFIED IDEOGRAPH
+ 0xCAE6: 0x8212, //CJK UNIFIED IDEOGRAPH
+ 0xCAE7: 0x6DD1, //CJK UNIFIED IDEOGRAPH
+ 0xCAE8: 0x758F, //CJK UNIFIED IDEOGRAPH
+ 0xCAE9: 0x4E66, //CJK UNIFIED IDEOGRAPH
+ 0xCAEA: 0x8D4E, //CJK UNIFIED IDEOGRAPH
+ 0xCAEB: 0x5B70, //CJK UNIFIED IDEOGRAPH
+ 0xCAEC: 0x719F, //CJK UNIFIED IDEOGRAPH
+ 0xCAED: 0x85AF, //CJK UNIFIED IDEOGRAPH
+ 0xCAEE: 0x6691, //CJK UNIFIED IDEOGRAPH
+ 0xCAEF: 0x66D9, //CJK UNIFIED IDEOGRAPH
+ 0xCAF0: 0x7F72, //CJK UNIFIED IDEOGRAPH
+ 0xCAF1: 0x8700, //CJK UNIFIED IDEOGRAPH
+ 0xCAF2: 0x9ECD, //CJK UNIFIED IDEOGRAPH
+ 0xCAF3: 0x9F20, //CJK UNIFIED IDEOGRAPH
+ 0xCAF4: 0x5C5E, //CJK UNIFIED IDEOGRAPH
+ 0xCAF5: 0x672F, //CJK UNIFIED IDEOGRAPH
+ 0xCAF6: 0x8FF0, //CJK UNIFIED IDEOGRAPH
+ 0xCAF7: 0x6811, //CJK UNIFIED IDEOGRAPH
+ 0xCAF8: 0x675F, //CJK UNIFIED IDEOGRAPH
+ 0xCAF9: 0x620D, //CJK UNIFIED IDEOGRAPH
+ 0xCAFA: 0x7AD6, //CJK UNIFIED IDEOGRAPH
+ 0xCAFB: 0x5885, //CJK UNIFIED IDEOGRAPH
+ 0xCAFC: 0x5EB6, //CJK UNIFIED IDEOGRAPH
+ 0xCAFD: 0x6570, //CJK UNIFIED IDEOGRAPH
+ 0xCAFE: 0x6F31, //CJK UNIFIED IDEOGRAPH
+ 0xCB40: 0x8582, //CJK UNIFIED IDEOGRAPH
+ 0xCB41: 0x8583, //CJK UNIFIED IDEOGRAPH
+ 0xCB42: 0x8586, //CJK UNIFIED IDEOGRAPH
+ 0xCB43: 0x8588, //CJK UNIFIED IDEOGRAPH
+ 0xCB44: 0x8589, //CJK UNIFIED IDEOGRAPH
+ 0xCB45: 0x858A, //CJK UNIFIED IDEOGRAPH
+ 0xCB46: 0x858B, //CJK UNIFIED IDEOGRAPH
+ 0xCB47: 0x858C, //CJK UNIFIED IDEOGRAPH
+ 0xCB48: 0x858D, //CJK UNIFIED IDEOGRAPH
+ 0xCB49: 0x858E, //CJK UNIFIED IDEOGRAPH
+ 0xCB4A: 0x8590, //CJK UNIFIED IDEOGRAPH
+ 0xCB4B: 0x8591, //CJK UNIFIED IDEOGRAPH
+ 0xCB4C: 0x8592, //CJK UNIFIED IDEOGRAPH
+ 0xCB4D: 0x8593, //CJK UNIFIED IDEOGRAPH
+ 0xCB4E: 0x8594, //CJK UNIFIED IDEOGRAPH
+ 0xCB4F: 0x8595, //CJK UNIFIED IDEOGRAPH
+ 0xCB50: 0x8596, //CJK UNIFIED IDEOGRAPH
+ 0xCB51: 0x8597, //CJK UNIFIED IDEOGRAPH
+ 0xCB52: 0x8598, //CJK UNIFIED IDEOGRAPH
+ 0xCB53: 0x8599, //CJK UNIFIED IDEOGRAPH
+ 0xCB54: 0x859A, //CJK UNIFIED IDEOGRAPH
+ 0xCB55: 0x859D, //CJK UNIFIED IDEOGRAPH
+ 0xCB56: 0x859E, //CJK UNIFIED IDEOGRAPH
+ 0xCB57: 0x859F, //CJK UNIFIED IDEOGRAPH
+ 0xCB58: 0x85A0, //CJK UNIFIED IDEOGRAPH
+ 0xCB59: 0x85A1, //CJK UNIFIED IDEOGRAPH
+ 0xCB5A: 0x85A2, //CJK UNIFIED IDEOGRAPH
+ 0xCB5B: 0x85A3, //CJK UNIFIED IDEOGRAPH
+ 0xCB5C: 0x85A5, //CJK UNIFIED IDEOGRAPH
+ 0xCB5D: 0x85A6, //CJK UNIFIED IDEOGRAPH
+ 0xCB5E: 0x85A7, //CJK UNIFIED IDEOGRAPH
+ 0xCB5F: 0x85A9, //CJK UNIFIED IDEOGRAPH
+ 0xCB60: 0x85AB, //CJK UNIFIED IDEOGRAPH
+ 0xCB61: 0x85AC, //CJK UNIFIED IDEOGRAPH
+ 0xCB62: 0x85AD, //CJK UNIFIED IDEOGRAPH
+ 0xCB63: 0x85B1, //CJK UNIFIED IDEOGRAPH
+ 0xCB64: 0x85B2, //CJK UNIFIED IDEOGRAPH
+ 0xCB65: 0x85B3, //CJK UNIFIED IDEOGRAPH
+ 0xCB66: 0x85B4, //CJK UNIFIED IDEOGRAPH
+ 0xCB67: 0x85B5, //CJK UNIFIED IDEOGRAPH
+ 0xCB68: 0x85B6, //CJK UNIFIED IDEOGRAPH
+ 0xCB69: 0x85B8, //CJK UNIFIED IDEOGRAPH
+ 0xCB6A: 0x85BA, //CJK UNIFIED IDEOGRAPH
+ 0xCB6B: 0x85BB, //CJK UNIFIED IDEOGRAPH
+ 0xCB6C: 0x85BC, //CJK UNIFIED IDEOGRAPH
+ 0xCB6D: 0x85BD, //CJK UNIFIED IDEOGRAPH
+ 0xCB6E: 0x85BE, //CJK UNIFIED IDEOGRAPH
+ 0xCB6F: 0x85BF, //CJK UNIFIED IDEOGRAPH
+ 0xCB70: 0x85C0, //CJK UNIFIED IDEOGRAPH
+ 0xCB71: 0x85C2, //CJK UNIFIED IDEOGRAPH
+ 0xCB72: 0x85C3, //CJK UNIFIED IDEOGRAPH
+ 0xCB73: 0x85C4, //CJK UNIFIED IDEOGRAPH
+ 0xCB74: 0x85C5, //CJK UNIFIED IDEOGRAPH
+ 0xCB75: 0x85C6, //CJK UNIFIED IDEOGRAPH
+ 0xCB76: 0x85C7, //CJK UNIFIED IDEOGRAPH
+ 0xCB77: 0x85C8, //CJK UNIFIED IDEOGRAPH
+ 0xCB78: 0x85CA, //CJK UNIFIED IDEOGRAPH
+ 0xCB79: 0x85CB, //CJK UNIFIED IDEOGRAPH
+ 0xCB7A: 0x85CC, //CJK UNIFIED IDEOGRAPH
+ 0xCB7B: 0x85CD, //CJK UNIFIED IDEOGRAPH
+ 0xCB7C: 0x85CE, //CJK UNIFIED IDEOGRAPH
+ 0xCB7D: 0x85D1, //CJK UNIFIED IDEOGRAPH
+ 0xCB7E: 0x85D2, //CJK UNIFIED IDEOGRAPH
+ 0xCB80: 0x85D4, //CJK UNIFIED IDEOGRAPH
+ 0xCB81: 0x85D6, //CJK UNIFIED IDEOGRAPH
+ 0xCB82: 0x85D7, //CJK UNIFIED IDEOGRAPH
+ 0xCB83: 0x85D8, //CJK UNIFIED IDEOGRAPH
+ 0xCB84: 0x85D9, //CJK UNIFIED IDEOGRAPH
+ 0xCB85: 0x85DA, //CJK UNIFIED IDEOGRAPH
+ 0xCB86: 0x85DB, //CJK UNIFIED IDEOGRAPH
+ 0xCB87: 0x85DD, //CJK UNIFIED IDEOGRAPH
+ 0xCB88: 0x85DE, //CJK UNIFIED IDEOGRAPH
+ 0xCB89: 0x85DF, //CJK UNIFIED IDEOGRAPH
+ 0xCB8A: 0x85E0, //CJK UNIFIED IDEOGRAPH
+ 0xCB8B: 0x85E1, //CJK UNIFIED IDEOGRAPH
+ 0xCB8C: 0x85E2, //CJK UNIFIED IDEOGRAPH
+ 0xCB8D: 0x85E3, //CJK UNIFIED IDEOGRAPH
+ 0xCB8E: 0x85E5, //CJK UNIFIED IDEOGRAPH
+ 0xCB8F: 0x85E6, //CJK UNIFIED IDEOGRAPH
+ 0xCB90: 0x85E7, //CJK UNIFIED IDEOGRAPH
+ 0xCB91: 0x85E8, //CJK UNIFIED IDEOGRAPH
+ 0xCB92: 0x85EA, //CJK UNIFIED IDEOGRAPH
+ 0xCB93: 0x85EB, //CJK UNIFIED IDEOGRAPH
+ 0xCB94: 0x85EC, //CJK UNIFIED IDEOGRAPH
+ 0xCB95: 0x85ED, //CJK UNIFIED IDEOGRAPH
+ 0xCB96: 0x85EE, //CJK UNIFIED IDEOGRAPH
+ 0xCB97: 0x85EF, //CJK UNIFIED IDEOGRAPH
+ 0xCB98: 0x85F0, //CJK UNIFIED IDEOGRAPH
+ 0xCB99: 0x85F1, //CJK UNIFIED IDEOGRAPH
+ 0xCB9A: 0x85F2, //CJK UNIFIED IDEOGRAPH
+ 0xCB9B: 0x85F3, //CJK UNIFIED IDEOGRAPH
+ 0xCB9C: 0x85F4, //CJK UNIFIED IDEOGRAPH
+ 0xCB9D: 0x85F5, //CJK UNIFIED IDEOGRAPH
+ 0xCB9E: 0x85F6, //CJK UNIFIED IDEOGRAPH
+ 0xCB9F: 0x85F7, //CJK UNIFIED IDEOGRAPH
+ 0xCBA0: 0x85F8, //CJK UNIFIED IDEOGRAPH
+ 0xCBA1: 0x6055, //CJK UNIFIED IDEOGRAPH
+ 0xCBA2: 0x5237, //CJK UNIFIED IDEOGRAPH
+ 0xCBA3: 0x800D, //CJK UNIFIED IDEOGRAPH
+ 0xCBA4: 0x6454, //CJK UNIFIED IDEOGRAPH
+ 0xCBA5: 0x8870, //CJK UNIFIED IDEOGRAPH
+ 0xCBA6: 0x7529, //CJK UNIFIED IDEOGRAPH
+ 0xCBA7: 0x5E05, //CJK UNIFIED IDEOGRAPH
+ 0xCBA8: 0x6813, //CJK UNIFIED IDEOGRAPH
+ 0xCBA9: 0x62F4, //CJK UNIFIED IDEOGRAPH
+ 0xCBAA: 0x971C, //CJK UNIFIED IDEOGRAPH
+ 0xCBAB: 0x53CC, //CJK UNIFIED IDEOGRAPH
+ 0xCBAC: 0x723D, //CJK UNIFIED IDEOGRAPH
+ 0xCBAD: 0x8C01, //CJK UNIFIED IDEOGRAPH
+ 0xCBAE: 0x6C34, //CJK UNIFIED IDEOGRAPH
+ 0xCBAF: 0x7761, //CJK UNIFIED IDEOGRAPH
+ 0xCBB0: 0x7A0E, //CJK UNIFIED IDEOGRAPH
+ 0xCBB1: 0x542E, //CJK UNIFIED IDEOGRAPH
+ 0xCBB2: 0x77AC, //CJK UNIFIED IDEOGRAPH
+ 0xCBB3: 0x987A, //CJK UNIFIED IDEOGRAPH
+ 0xCBB4: 0x821C, //CJK UNIFIED IDEOGRAPH
+ 0xCBB5: 0x8BF4, //CJK UNIFIED IDEOGRAPH
+ 0xCBB6: 0x7855, //CJK UNIFIED IDEOGRAPH
+ 0xCBB7: 0x6714, //CJK UNIFIED IDEOGRAPH
+ 0xCBB8: 0x70C1, //CJK UNIFIED IDEOGRAPH
+ 0xCBB9: 0x65AF, //CJK UNIFIED IDEOGRAPH
+ 0xCBBA: 0x6495, //CJK UNIFIED IDEOGRAPH
+ 0xCBBB: 0x5636, //CJK UNIFIED IDEOGRAPH
+ 0xCBBC: 0x601D, //CJK UNIFIED IDEOGRAPH
+ 0xCBBD: 0x79C1, //CJK UNIFIED IDEOGRAPH
+ 0xCBBE: 0x53F8, //CJK UNIFIED IDEOGRAPH
+ 0xCBBF: 0x4E1D, //CJK UNIFIED IDEOGRAPH
+ 0xCBC0: 0x6B7B, //CJK UNIFIED IDEOGRAPH
+ 0xCBC1: 0x8086, //CJK UNIFIED IDEOGRAPH
+ 0xCBC2: 0x5BFA, //CJK UNIFIED IDEOGRAPH
+ 0xCBC3: 0x55E3, //CJK UNIFIED IDEOGRAPH
+ 0xCBC4: 0x56DB, //CJK UNIFIED IDEOGRAPH
+ 0xCBC5: 0x4F3A, //CJK UNIFIED IDEOGRAPH
+ 0xCBC6: 0x4F3C, //CJK UNIFIED IDEOGRAPH
+ 0xCBC7: 0x9972, //CJK UNIFIED IDEOGRAPH
+ 0xCBC8: 0x5DF3, //CJK UNIFIED IDEOGRAPH
+ 0xCBC9: 0x677E, //CJK UNIFIED IDEOGRAPH
+ 0xCBCA: 0x8038, //CJK UNIFIED IDEOGRAPH
+ 0xCBCB: 0x6002, //CJK UNIFIED IDEOGRAPH
+ 0xCBCC: 0x9882, //CJK UNIFIED IDEOGRAPH
+ 0xCBCD: 0x9001, //CJK UNIFIED IDEOGRAPH
+ 0xCBCE: 0x5B8B, //CJK UNIFIED IDEOGRAPH
+ 0xCBCF: 0x8BBC, //CJK UNIFIED IDEOGRAPH
+ 0xCBD0: 0x8BF5, //CJK UNIFIED IDEOGRAPH
+ 0xCBD1: 0x641C, //CJK UNIFIED IDEOGRAPH
+ 0xCBD2: 0x8258, //CJK UNIFIED IDEOGRAPH
+ 0xCBD3: 0x64DE, //CJK UNIFIED IDEOGRAPH
+ 0xCBD4: 0x55FD, //CJK UNIFIED IDEOGRAPH
+ 0xCBD5: 0x82CF, //CJK UNIFIED IDEOGRAPH
+ 0xCBD6: 0x9165, //CJK UNIFIED IDEOGRAPH
+ 0xCBD7: 0x4FD7, //CJK UNIFIED IDEOGRAPH
+ 0xCBD8: 0x7D20, //CJK UNIFIED IDEOGRAPH
+ 0xCBD9: 0x901F, //CJK UNIFIED IDEOGRAPH
+ 0xCBDA: 0x7C9F, //CJK UNIFIED IDEOGRAPH
+ 0xCBDB: 0x50F3, //CJK UNIFIED IDEOGRAPH
+ 0xCBDC: 0x5851, //CJK UNIFIED IDEOGRAPH
+ 0xCBDD: 0x6EAF, //CJK UNIFIED IDEOGRAPH
+ 0xCBDE: 0x5BBF, //CJK UNIFIED IDEOGRAPH
+ 0xCBDF: 0x8BC9, //CJK UNIFIED IDEOGRAPH
+ 0xCBE0: 0x8083, //CJK UNIFIED IDEOGRAPH
+ 0xCBE1: 0x9178, //CJK UNIFIED IDEOGRAPH
+ 0xCBE2: 0x849C, //CJK UNIFIED IDEOGRAPH
+ 0xCBE3: 0x7B97, //CJK UNIFIED IDEOGRAPH
+ 0xCBE4: 0x867D, //CJK UNIFIED IDEOGRAPH
+ 0xCBE5: 0x968B, //CJK UNIFIED IDEOGRAPH
+ 0xCBE6: 0x968F, //CJK UNIFIED IDEOGRAPH
+ 0xCBE7: 0x7EE5, //CJK UNIFIED IDEOGRAPH
+ 0xCBE8: 0x9AD3, //CJK UNIFIED IDEOGRAPH
+ 0xCBE9: 0x788E, //CJK UNIFIED IDEOGRAPH
+ 0xCBEA: 0x5C81, //CJK UNIFIED IDEOGRAPH
+ 0xCBEB: 0x7A57, //CJK UNIFIED IDEOGRAPH
+ 0xCBEC: 0x9042, //CJK UNIFIED IDEOGRAPH
+ 0xCBED: 0x96A7, //CJK UNIFIED IDEOGRAPH
+ 0xCBEE: 0x795F, //CJK UNIFIED IDEOGRAPH
+ 0xCBEF: 0x5B59, //CJK UNIFIED IDEOGRAPH
+ 0xCBF0: 0x635F, //CJK UNIFIED IDEOGRAPH
+ 0xCBF1: 0x7B0B, //CJK UNIFIED IDEOGRAPH
+ 0xCBF2: 0x84D1, //CJK UNIFIED IDEOGRAPH
+ 0xCBF3: 0x68AD, //CJK UNIFIED IDEOGRAPH
+ 0xCBF4: 0x5506, //CJK UNIFIED IDEOGRAPH
+ 0xCBF5: 0x7F29, //CJK UNIFIED IDEOGRAPH
+ 0xCBF6: 0x7410, //CJK UNIFIED IDEOGRAPH
+ 0xCBF7: 0x7D22, //CJK UNIFIED IDEOGRAPH
+ 0xCBF8: 0x9501, //CJK UNIFIED IDEOGRAPH
+ 0xCBF9: 0x6240, //CJK UNIFIED IDEOGRAPH
+ 0xCBFA: 0x584C, //CJK UNIFIED IDEOGRAPH
+ 0xCBFB: 0x4ED6, //CJK UNIFIED IDEOGRAPH
+ 0xCBFC: 0x5B83, //CJK UNIFIED IDEOGRAPH
+ 0xCBFD: 0x5979, //CJK UNIFIED IDEOGRAPH
+ 0xCBFE: 0x5854, //CJK UNIFIED IDEOGRAPH
+ 0xCC40: 0x85F9, //CJK UNIFIED IDEOGRAPH
+ 0xCC41: 0x85FA, //CJK UNIFIED IDEOGRAPH
+ 0xCC42: 0x85FC, //CJK UNIFIED IDEOGRAPH
+ 0xCC43: 0x85FD, //CJK UNIFIED IDEOGRAPH
+ 0xCC44: 0x85FE, //CJK UNIFIED IDEOGRAPH
+ 0xCC45: 0x8600, //CJK UNIFIED IDEOGRAPH
+ 0xCC46: 0x8601, //CJK UNIFIED IDEOGRAPH
+ 0xCC47: 0x8602, //CJK UNIFIED IDEOGRAPH
+ 0xCC48: 0x8603, //CJK UNIFIED IDEOGRAPH
+ 0xCC49: 0x8604, //CJK UNIFIED IDEOGRAPH
+ 0xCC4A: 0x8606, //CJK UNIFIED IDEOGRAPH
+ 0xCC4B: 0x8607, //CJK UNIFIED IDEOGRAPH
+ 0xCC4C: 0x8608, //CJK UNIFIED IDEOGRAPH
+ 0xCC4D: 0x8609, //CJK UNIFIED IDEOGRAPH
+ 0xCC4E: 0x860A, //CJK UNIFIED IDEOGRAPH
+ 0xCC4F: 0x860B, //CJK UNIFIED IDEOGRAPH
+ 0xCC50: 0x860C, //CJK UNIFIED IDEOGRAPH
+ 0xCC51: 0x860D, //CJK UNIFIED IDEOGRAPH
+ 0xCC52: 0x860E, //CJK UNIFIED IDEOGRAPH
+ 0xCC53: 0x860F, //CJK UNIFIED IDEOGRAPH
+ 0xCC54: 0x8610, //CJK UNIFIED IDEOGRAPH
+ 0xCC55: 0x8612, //CJK UNIFIED IDEOGRAPH
+ 0xCC56: 0x8613, //CJK UNIFIED IDEOGRAPH
+ 0xCC57: 0x8614, //CJK UNIFIED IDEOGRAPH
+ 0xCC58: 0x8615, //CJK UNIFIED IDEOGRAPH
+ 0xCC59: 0x8617, //CJK UNIFIED IDEOGRAPH
+ 0xCC5A: 0x8618, //CJK UNIFIED IDEOGRAPH
+ 0xCC5B: 0x8619, //CJK UNIFIED IDEOGRAPH
+ 0xCC5C: 0x861A, //CJK UNIFIED IDEOGRAPH
+ 0xCC5D: 0x861B, //CJK UNIFIED IDEOGRAPH
+ 0xCC5E: 0x861C, //CJK UNIFIED IDEOGRAPH
+ 0xCC5F: 0x861D, //CJK UNIFIED IDEOGRAPH
+ 0xCC60: 0x861E, //CJK UNIFIED IDEOGRAPH
+ 0xCC61: 0x861F, //CJK UNIFIED IDEOGRAPH
+ 0xCC62: 0x8620, //CJK UNIFIED IDEOGRAPH
+ 0xCC63: 0x8621, //CJK UNIFIED IDEOGRAPH
+ 0xCC64: 0x8622, //CJK UNIFIED IDEOGRAPH
+ 0xCC65: 0x8623, //CJK UNIFIED IDEOGRAPH
+ 0xCC66: 0x8624, //CJK UNIFIED IDEOGRAPH
+ 0xCC67: 0x8625, //CJK UNIFIED IDEOGRAPH
+ 0xCC68: 0x8626, //CJK UNIFIED IDEOGRAPH
+ 0xCC69: 0x8628, //CJK UNIFIED IDEOGRAPH
+ 0xCC6A: 0x862A, //CJK UNIFIED IDEOGRAPH
+ 0xCC6B: 0x862B, //CJK UNIFIED IDEOGRAPH
+ 0xCC6C: 0x862C, //CJK UNIFIED IDEOGRAPH
+ 0xCC6D: 0x862D, //CJK UNIFIED IDEOGRAPH
+ 0xCC6E: 0x862E, //CJK UNIFIED IDEOGRAPH
+ 0xCC6F: 0x862F, //CJK UNIFIED IDEOGRAPH
+ 0xCC70: 0x8630, //CJK UNIFIED IDEOGRAPH
+ 0xCC71: 0x8631, //CJK UNIFIED IDEOGRAPH
+ 0xCC72: 0x8632, //CJK UNIFIED IDEOGRAPH
+ 0xCC73: 0x8633, //CJK UNIFIED IDEOGRAPH
+ 0xCC74: 0x8634, //CJK UNIFIED IDEOGRAPH
+ 0xCC75: 0x8635, //CJK UNIFIED IDEOGRAPH
+ 0xCC76: 0x8636, //CJK UNIFIED IDEOGRAPH
+ 0xCC77: 0x8637, //CJK UNIFIED IDEOGRAPH
+ 0xCC78: 0x8639, //CJK UNIFIED IDEOGRAPH
+ 0xCC79: 0x863A, //CJK UNIFIED IDEOGRAPH
+ 0xCC7A: 0x863B, //CJK UNIFIED IDEOGRAPH
+ 0xCC7B: 0x863D, //CJK UNIFIED IDEOGRAPH
+ 0xCC7C: 0x863E, //CJK UNIFIED IDEOGRAPH
+ 0xCC7D: 0x863F, //CJK UNIFIED IDEOGRAPH
+ 0xCC7E: 0x8640, //CJK UNIFIED IDEOGRAPH
+ 0xCC80: 0x8641, //CJK UNIFIED IDEOGRAPH
+ 0xCC81: 0x8642, //CJK UNIFIED IDEOGRAPH
+ 0xCC82: 0x8643, //CJK UNIFIED IDEOGRAPH
+ 0xCC83: 0x8644, //CJK UNIFIED IDEOGRAPH
+ 0xCC84: 0x8645, //CJK UNIFIED IDEOGRAPH
+ 0xCC85: 0x8646, //CJK UNIFIED IDEOGRAPH
+ 0xCC86: 0x8647, //CJK UNIFIED IDEOGRAPH
+ 0xCC87: 0x8648, //CJK UNIFIED IDEOGRAPH
+ 0xCC88: 0x8649, //CJK UNIFIED IDEOGRAPH
+ 0xCC89: 0x864A, //CJK UNIFIED IDEOGRAPH
+ 0xCC8A: 0x864B, //CJK UNIFIED IDEOGRAPH
+ 0xCC8B: 0x864C, //CJK UNIFIED IDEOGRAPH
+ 0xCC8C: 0x8652, //CJK UNIFIED IDEOGRAPH
+ 0xCC8D: 0x8653, //CJK UNIFIED IDEOGRAPH
+ 0xCC8E: 0x8655, //CJK UNIFIED IDEOGRAPH
+ 0xCC8F: 0x8656, //CJK UNIFIED IDEOGRAPH
+ 0xCC90: 0x8657, //CJK UNIFIED IDEOGRAPH
+ 0xCC91: 0x8658, //CJK UNIFIED IDEOGRAPH
+ 0xCC92: 0x8659, //CJK UNIFIED IDEOGRAPH
+ 0xCC93: 0x865B, //CJK UNIFIED IDEOGRAPH
+ 0xCC94: 0x865C, //CJK UNIFIED IDEOGRAPH
+ 0xCC95: 0x865D, //CJK UNIFIED IDEOGRAPH
+ 0xCC96: 0x865F, //CJK UNIFIED IDEOGRAPH
+ 0xCC97: 0x8660, //CJK UNIFIED IDEOGRAPH
+ 0xCC98: 0x8661, //CJK UNIFIED IDEOGRAPH
+ 0xCC99: 0x8663, //CJK UNIFIED IDEOGRAPH
+ 0xCC9A: 0x8664, //CJK UNIFIED IDEOGRAPH
+ 0xCC9B: 0x8665, //CJK UNIFIED IDEOGRAPH
+ 0xCC9C: 0x8666, //CJK UNIFIED IDEOGRAPH
+ 0xCC9D: 0x8667, //CJK UNIFIED IDEOGRAPH
+ 0xCC9E: 0x8668, //CJK UNIFIED IDEOGRAPH
+ 0xCC9F: 0x8669, //CJK UNIFIED IDEOGRAPH
+ 0xCCA0: 0x866A, //CJK UNIFIED IDEOGRAPH
+ 0xCCA1: 0x736D, //CJK UNIFIED IDEOGRAPH
+ 0xCCA2: 0x631E, //CJK UNIFIED IDEOGRAPH
+ 0xCCA3: 0x8E4B, //CJK UNIFIED IDEOGRAPH
+ 0xCCA4: 0x8E0F, //CJK UNIFIED IDEOGRAPH
+ 0xCCA5: 0x80CE, //CJK UNIFIED IDEOGRAPH
+ 0xCCA6: 0x82D4, //CJK UNIFIED IDEOGRAPH
+ 0xCCA7: 0x62AC, //CJK UNIFIED IDEOGRAPH
+ 0xCCA8: 0x53F0, //CJK UNIFIED IDEOGRAPH
+ 0xCCA9: 0x6CF0, //CJK UNIFIED IDEOGRAPH
+ 0xCCAA: 0x915E, //CJK UNIFIED IDEOGRAPH
+ 0xCCAB: 0x592A, //CJK UNIFIED IDEOGRAPH
+ 0xCCAC: 0x6001, //CJK UNIFIED IDEOGRAPH
+ 0xCCAD: 0x6C70, //CJK UNIFIED IDEOGRAPH
+ 0xCCAE: 0x574D, //CJK UNIFIED IDEOGRAPH
+ 0xCCAF: 0x644A, //CJK UNIFIED IDEOGRAPH
+ 0xCCB0: 0x8D2A, //CJK UNIFIED IDEOGRAPH
+ 0xCCB1: 0x762B, //CJK UNIFIED IDEOGRAPH
+ 0xCCB2: 0x6EE9, //CJK UNIFIED IDEOGRAPH
+ 0xCCB3: 0x575B, //CJK UNIFIED IDEOGRAPH
+ 0xCCB4: 0x6A80, //CJK UNIFIED IDEOGRAPH
+ 0xCCB5: 0x75F0, //CJK UNIFIED IDEOGRAPH
+ 0xCCB6: 0x6F6D, //CJK UNIFIED IDEOGRAPH
+ 0xCCB7: 0x8C2D, //CJK UNIFIED IDEOGRAPH
+ 0xCCB8: 0x8C08, //CJK UNIFIED IDEOGRAPH
+ 0xCCB9: 0x5766, //CJK UNIFIED IDEOGRAPH
+ 0xCCBA: 0x6BEF, //CJK UNIFIED IDEOGRAPH
+ 0xCCBB: 0x8892, //CJK UNIFIED IDEOGRAPH
+ 0xCCBC: 0x78B3, //CJK UNIFIED IDEOGRAPH
+ 0xCCBD: 0x63A2, //CJK UNIFIED IDEOGRAPH
+ 0xCCBE: 0x53F9, //CJK UNIFIED IDEOGRAPH
+ 0xCCBF: 0x70AD, //CJK UNIFIED IDEOGRAPH
+ 0xCCC0: 0x6C64, //CJK UNIFIED IDEOGRAPH
+ 0xCCC1: 0x5858, //CJK UNIFIED IDEOGRAPH
+ 0xCCC2: 0x642A, //CJK UNIFIED IDEOGRAPH
+ 0xCCC3: 0x5802, //CJK UNIFIED IDEOGRAPH
+ 0xCCC4: 0x68E0, //CJK UNIFIED IDEOGRAPH
+ 0xCCC5: 0x819B, //CJK UNIFIED IDEOGRAPH
+ 0xCCC6: 0x5510, //CJK UNIFIED IDEOGRAPH
+ 0xCCC7: 0x7CD6, //CJK UNIFIED IDEOGRAPH
+ 0xCCC8: 0x5018, //CJK UNIFIED IDEOGRAPH
+ 0xCCC9: 0x8EBA, //CJK UNIFIED IDEOGRAPH
+ 0xCCCA: 0x6DCC, //CJK UNIFIED IDEOGRAPH
+ 0xCCCB: 0x8D9F, //CJK UNIFIED IDEOGRAPH
+ 0xCCCC: 0x70EB, //CJK UNIFIED IDEOGRAPH
+ 0xCCCD: 0x638F, //CJK UNIFIED IDEOGRAPH
+ 0xCCCE: 0x6D9B, //CJK UNIFIED IDEOGRAPH
+ 0xCCCF: 0x6ED4, //CJK UNIFIED IDEOGRAPH
+ 0xCCD0: 0x7EE6, //CJK UNIFIED IDEOGRAPH
+ 0xCCD1: 0x8404, //CJK UNIFIED IDEOGRAPH
+ 0xCCD2: 0x6843, //CJK UNIFIED IDEOGRAPH
+ 0xCCD3: 0x9003, //CJK UNIFIED IDEOGRAPH
+ 0xCCD4: 0x6DD8, //CJK UNIFIED IDEOGRAPH
+ 0xCCD5: 0x9676, //CJK UNIFIED IDEOGRAPH
+ 0xCCD6: 0x8BA8, //CJK UNIFIED IDEOGRAPH
+ 0xCCD7: 0x5957, //CJK UNIFIED IDEOGRAPH
+ 0xCCD8: 0x7279, //CJK UNIFIED IDEOGRAPH
+ 0xCCD9: 0x85E4, //CJK UNIFIED IDEOGRAPH
+ 0xCCDA: 0x817E, //CJK UNIFIED IDEOGRAPH
+ 0xCCDB: 0x75BC, //CJK UNIFIED IDEOGRAPH
+ 0xCCDC: 0x8A8A, //CJK UNIFIED IDEOGRAPH
+ 0xCCDD: 0x68AF, //CJK UNIFIED IDEOGRAPH
+ 0xCCDE: 0x5254, //CJK UNIFIED IDEOGRAPH
+ 0xCCDF: 0x8E22, //CJK UNIFIED IDEOGRAPH
+ 0xCCE0: 0x9511, //CJK UNIFIED IDEOGRAPH
+ 0xCCE1: 0x63D0, //CJK UNIFIED IDEOGRAPH
+ 0xCCE2: 0x9898, //CJK UNIFIED IDEOGRAPH
+ 0xCCE3: 0x8E44, //CJK UNIFIED IDEOGRAPH
+ 0xCCE4: 0x557C, //CJK UNIFIED IDEOGRAPH
+ 0xCCE5: 0x4F53, //CJK UNIFIED IDEOGRAPH
+ 0xCCE6: 0x66FF, //CJK UNIFIED IDEOGRAPH
+ 0xCCE7: 0x568F, //CJK UNIFIED IDEOGRAPH
+ 0xCCE8: 0x60D5, //CJK UNIFIED IDEOGRAPH
+ 0xCCE9: 0x6D95, //CJK UNIFIED IDEOGRAPH
+ 0xCCEA: 0x5243, //CJK UNIFIED IDEOGRAPH
+ 0xCCEB: 0x5C49, //CJK UNIFIED IDEOGRAPH
+ 0xCCEC: 0x5929, //CJK UNIFIED IDEOGRAPH
+ 0xCCED: 0x6DFB, //CJK UNIFIED IDEOGRAPH
+ 0xCCEE: 0x586B, //CJK UNIFIED IDEOGRAPH
+ 0xCCEF: 0x7530, //CJK UNIFIED IDEOGRAPH
+ 0xCCF0: 0x751C, //CJK UNIFIED IDEOGRAPH
+ 0xCCF1: 0x606C, //CJK UNIFIED IDEOGRAPH
+ 0xCCF2: 0x8214, //CJK UNIFIED IDEOGRAPH
+ 0xCCF3: 0x8146, //CJK UNIFIED IDEOGRAPH
+ 0xCCF4: 0x6311, //CJK UNIFIED IDEOGRAPH
+ 0xCCF5: 0x6761, //CJK UNIFIED IDEOGRAPH
+ 0xCCF6: 0x8FE2, //CJK UNIFIED IDEOGRAPH
+ 0xCCF7: 0x773A, //CJK UNIFIED IDEOGRAPH
+ 0xCCF8: 0x8DF3, //CJK UNIFIED IDEOGRAPH
+ 0xCCF9: 0x8D34, //CJK UNIFIED IDEOGRAPH
+ 0xCCFA: 0x94C1, //CJK UNIFIED IDEOGRAPH
+ 0xCCFB: 0x5E16, //CJK UNIFIED IDEOGRAPH
+ 0xCCFC: 0x5385, //CJK UNIFIED IDEOGRAPH
+ 0xCCFD: 0x542C, //CJK UNIFIED IDEOGRAPH
+ 0xCCFE: 0x70C3, //CJK UNIFIED IDEOGRAPH
+ 0xCD40: 0x866D, //CJK UNIFIED IDEOGRAPH
+ 0xCD41: 0x866F, //CJK UNIFIED IDEOGRAPH
+ 0xCD42: 0x8670, //CJK UNIFIED IDEOGRAPH
+ 0xCD43: 0x8672, //CJK UNIFIED IDEOGRAPH
+ 0xCD44: 0x8673, //CJK UNIFIED IDEOGRAPH
+ 0xCD45: 0x8674, //CJK UNIFIED IDEOGRAPH
+ 0xCD46: 0x8675, //CJK UNIFIED IDEOGRAPH
+ 0xCD47: 0x8676, //CJK UNIFIED IDEOGRAPH
+ 0xCD48: 0x8677, //CJK UNIFIED IDEOGRAPH
+ 0xCD49: 0x8678, //CJK UNIFIED IDEOGRAPH
+ 0xCD4A: 0x8683, //CJK UNIFIED IDEOGRAPH
+ 0xCD4B: 0x8684, //CJK UNIFIED IDEOGRAPH
+ 0xCD4C: 0x8685, //CJK UNIFIED IDEOGRAPH
+ 0xCD4D: 0x8686, //CJK UNIFIED IDEOGRAPH
+ 0xCD4E: 0x8687, //CJK UNIFIED IDEOGRAPH
+ 0xCD4F: 0x8688, //CJK UNIFIED IDEOGRAPH
+ 0xCD50: 0x8689, //CJK UNIFIED IDEOGRAPH
+ 0xCD51: 0x868E, //CJK UNIFIED IDEOGRAPH
+ 0xCD52: 0x868F, //CJK UNIFIED IDEOGRAPH
+ 0xCD53: 0x8690, //CJK UNIFIED IDEOGRAPH
+ 0xCD54: 0x8691, //CJK UNIFIED IDEOGRAPH
+ 0xCD55: 0x8692, //CJK UNIFIED IDEOGRAPH
+ 0xCD56: 0x8694, //CJK UNIFIED IDEOGRAPH
+ 0xCD57: 0x8696, //CJK UNIFIED IDEOGRAPH
+ 0xCD58: 0x8697, //CJK UNIFIED IDEOGRAPH
+ 0xCD59: 0x8698, //CJK UNIFIED IDEOGRAPH
+ 0xCD5A: 0x8699, //CJK UNIFIED IDEOGRAPH
+ 0xCD5B: 0x869A, //CJK UNIFIED IDEOGRAPH
+ 0xCD5C: 0x869B, //CJK UNIFIED IDEOGRAPH
+ 0xCD5D: 0x869E, //CJK UNIFIED IDEOGRAPH
+ 0xCD5E: 0x869F, //CJK UNIFIED IDEOGRAPH
+ 0xCD5F: 0x86A0, //CJK UNIFIED IDEOGRAPH
+ 0xCD60: 0x86A1, //CJK UNIFIED IDEOGRAPH
+ 0xCD61: 0x86A2, //CJK UNIFIED IDEOGRAPH
+ 0xCD62: 0x86A5, //CJK UNIFIED IDEOGRAPH
+ 0xCD63: 0x86A6, //CJK UNIFIED IDEOGRAPH
+ 0xCD64: 0x86AB, //CJK UNIFIED IDEOGRAPH
+ 0xCD65: 0x86AD, //CJK UNIFIED IDEOGRAPH
+ 0xCD66: 0x86AE, //CJK UNIFIED IDEOGRAPH
+ 0xCD67: 0x86B2, //CJK UNIFIED IDEOGRAPH
+ 0xCD68: 0x86B3, //CJK UNIFIED IDEOGRAPH
+ 0xCD69: 0x86B7, //CJK UNIFIED IDEOGRAPH
+ 0xCD6A: 0x86B8, //CJK UNIFIED IDEOGRAPH
+ 0xCD6B: 0x86B9, //CJK UNIFIED IDEOGRAPH
+ 0xCD6C: 0x86BB, //CJK UNIFIED IDEOGRAPH
+ 0xCD6D: 0x86BC, //CJK UNIFIED IDEOGRAPH
+ 0xCD6E: 0x86BD, //CJK UNIFIED IDEOGRAPH
+ 0xCD6F: 0x86BE, //CJK UNIFIED IDEOGRAPH
+ 0xCD70: 0x86BF, //CJK UNIFIED IDEOGRAPH
+ 0xCD71: 0x86C1, //CJK UNIFIED IDEOGRAPH
+ 0xCD72: 0x86C2, //CJK UNIFIED IDEOGRAPH
+ 0xCD73: 0x86C3, //CJK UNIFIED IDEOGRAPH
+ 0xCD74: 0x86C5, //CJK UNIFIED IDEOGRAPH
+ 0xCD75: 0x86C8, //CJK UNIFIED IDEOGRAPH
+ 0xCD76: 0x86CC, //CJK UNIFIED IDEOGRAPH
+ 0xCD77: 0x86CD, //CJK UNIFIED IDEOGRAPH
+ 0xCD78: 0x86D2, //CJK UNIFIED IDEOGRAPH
+ 0xCD79: 0x86D3, //CJK UNIFIED IDEOGRAPH
+ 0xCD7A: 0x86D5, //CJK UNIFIED IDEOGRAPH
+ 0xCD7B: 0x86D6, //CJK UNIFIED IDEOGRAPH
+ 0xCD7C: 0x86D7, //CJK UNIFIED IDEOGRAPH
+ 0xCD7D: 0x86DA, //CJK UNIFIED IDEOGRAPH
+ 0xCD7E: 0x86DC, //CJK UNIFIED IDEOGRAPH
+ 0xCD80: 0x86DD, //CJK UNIFIED IDEOGRAPH
+ 0xCD81: 0x86E0, //CJK UNIFIED IDEOGRAPH
+ 0xCD82: 0x86E1, //CJK UNIFIED IDEOGRAPH
+ 0xCD83: 0x86E2, //CJK UNIFIED IDEOGRAPH
+ 0xCD84: 0x86E3, //CJK UNIFIED IDEOGRAPH
+ 0xCD85: 0x86E5, //CJK UNIFIED IDEOGRAPH
+ 0xCD86: 0x86E6, //CJK UNIFIED IDEOGRAPH
+ 0xCD87: 0x86E7, //CJK UNIFIED IDEOGRAPH
+ 0xCD88: 0x86E8, //CJK UNIFIED IDEOGRAPH
+ 0xCD89: 0x86EA, //CJK UNIFIED IDEOGRAPH
+ 0xCD8A: 0x86EB, //CJK UNIFIED IDEOGRAPH
+ 0xCD8B: 0x86EC, //CJK UNIFIED IDEOGRAPH
+ 0xCD8C: 0x86EF, //CJK UNIFIED IDEOGRAPH
+ 0xCD8D: 0x86F5, //CJK UNIFIED IDEOGRAPH
+ 0xCD8E: 0x86F6, //CJK UNIFIED IDEOGRAPH
+ 0xCD8F: 0x86F7, //CJK UNIFIED IDEOGRAPH
+ 0xCD90: 0x86FA, //CJK UNIFIED IDEOGRAPH
+ 0xCD91: 0x86FB, //CJK UNIFIED IDEOGRAPH
+ 0xCD92: 0x86FC, //CJK UNIFIED IDEOGRAPH
+ 0xCD93: 0x86FD, //CJK UNIFIED IDEOGRAPH
+ 0xCD94: 0x86FF, //CJK UNIFIED IDEOGRAPH
+ 0xCD95: 0x8701, //CJK UNIFIED IDEOGRAPH
+ 0xCD96: 0x8704, //CJK UNIFIED IDEOGRAPH
+ 0xCD97: 0x8705, //CJK UNIFIED IDEOGRAPH
+ 0xCD98: 0x8706, //CJK UNIFIED IDEOGRAPH
+ 0xCD99: 0x870B, //CJK UNIFIED IDEOGRAPH
+ 0xCD9A: 0x870C, //CJK UNIFIED IDEOGRAPH
+ 0xCD9B: 0x870E, //CJK UNIFIED IDEOGRAPH
+ 0xCD9C: 0x870F, //CJK UNIFIED IDEOGRAPH
+ 0xCD9D: 0x8710, //CJK UNIFIED IDEOGRAPH
+ 0xCD9E: 0x8711, //CJK UNIFIED IDEOGRAPH
+ 0xCD9F: 0x8714, //CJK UNIFIED IDEOGRAPH
+ 0xCDA0: 0x8716, //CJK UNIFIED IDEOGRAPH
+ 0xCDA1: 0x6C40, //CJK UNIFIED IDEOGRAPH
+ 0xCDA2: 0x5EF7, //CJK UNIFIED IDEOGRAPH
+ 0xCDA3: 0x505C, //CJK UNIFIED IDEOGRAPH
+ 0xCDA4: 0x4EAD, //CJK UNIFIED IDEOGRAPH
+ 0xCDA5: 0x5EAD, //CJK UNIFIED IDEOGRAPH
+ 0xCDA6: 0x633A, //CJK UNIFIED IDEOGRAPH
+ 0xCDA7: 0x8247, //CJK UNIFIED IDEOGRAPH
+ 0xCDA8: 0x901A, //CJK UNIFIED IDEOGRAPH
+ 0xCDA9: 0x6850, //CJK UNIFIED IDEOGRAPH
+ 0xCDAA: 0x916E, //CJK UNIFIED IDEOGRAPH
+ 0xCDAB: 0x77B3, //CJK UNIFIED IDEOGRAPH
+ 0xCDAC: 0x540C, //CJK UNIFIED IDEOGRAPH
+ 0xCDAD: 0x94DC, //CJK UNIFIED IDEOGRAPH
+ 0xCDAE: 0x5F64, //CJK UNIFIED IDEOGRAPH
+ 0xCDAF: 0x7AE5, //CJK UNIFIED IDEOGRAPH
+ 0xCDB0: 0x6876, //CJK UNIFIED IDEOGRAPH
+ 0xCDB1: 0x6345, //CJK UNIFIED IDEOGRAPH
+ 0xCDB2: 0x7B52, //CJK UNIFIED IDEOGRAPH
+ 0xCDB3: 0x7EDF, //CJK UNIFIED IDEOGRAPH
+ 0xCDB4: 0x75DB, //CJK UNIFIED IDEOGRAPH
+ 0xCDB5: 0x5077, //CJK UNIFIED IDEOGRAPH
+ 0xCDB6: 0x6295, //CJK UNIFIED IDEOGRAPH
+ 0xCDB7: 0x5934, //CJK UNIFIED IDEOGRAPH
+ 0xCDB8: 0x900F, //CJK UNIFIED IDEOGRAPH
+ 0xCDB9: 0x51F8, //CJK UNIFIED IDEOGRAPH
+ 0xCDBA: 0x79C3, //CJK UNIFIED IDEOGRAPH
+ 0xCDBB: 0x7A81, //CJK UNIFIED IDEOGRAPH
+ 0xCDBC: 0x56FE, //CJK UNIFIED IDEOGRAPH
+ 0xCDBD: 0x5F92, //CJK UNIFIED IDEOGRAPH
+ 0xCDBE: 0x9014, //CJK UNIFIED IDEOGRAPH
+ 0xCDBF: 0x6D82, //CJK UNIFIED IDEOGRAPH
+ 0xCDC0: 0x5C60, //CJK UNIFIED IDEOGRAPH
+ 0xCDC1: 0x571F, //CJK UNIFIED IDEOGRAPH
+ 0xCDC2: 0x5410, //CJK UNIFIED IDEOGRAPH
+ 0xCDC3: 0x5154, //CJK UNIFIED IDEOGRAPH
+ 0xCDC4: 0x6E4D, //CJK UNIFIED IDEOGRAPH
+ 0xCDC5: 0x56E2, //CJK UNIFIED IDEOGRAPH
+ 0xCDC6: 0x63A8, //CJK UNIFIED IDEOGRAPH
+ 0xCDC7: 0x9893, //CJK UNIFIED IDEOGRAPH
+ 0xCDC8: 0x817F, //CJK UNIFIED IDEOGRAPH
+ 0xCDC9: 0x8715, //CJK UNIFIED IDEOGRAPH
+ 0xCDCA: 0x892A, //CJK UNIFIED IDEOGRAPH
+ 0xCDCB: 0x9000, //CJK UNIFIED IDEOGRAPH
+ 0xCDCC: 0x541E, //CJK UNIFIED IDEOGRAPH
+ 0xCDCD: 0x5C6F, //CJK UNIFIED IDEOGRAPH
+ 0xCDCE: 0x81C0, //CJK UNIFIED IDEOGRAPH
+ 0xCDCF: 0x62D6, //CJK UNIFIED IDEOGRAPH
+ 0xCDD0: 0x6258, //CJK UNIFIED IDEOGRAPH
+ 0xCDD1: 0x8131, //CJK UNIFIED IDEOGRAPH
+ 0xCDD2: 0x9E35, //CJK UNIFIED IDEOGRAPH
+ 0xCDD3: 0x9640, //CJK UNIFIED IDEOGRAPH
+ 0xCDD4: 0x9A6E, //CJK UNIFIED IDEOGRAPH
+ 0xCDD5: 0x9A7C, //CJK UNIFIED IDEOGRAPH
+ 0xCDD6: 0x692D, //CJK UNIFIED IDEOGRAPH
+ 0xCDD7: 0x59A5, //CJK UNIFIED IDEOGRAPH
+ 0xCDD8: 0x62D3, //CJK UNIFIED IDEOGRAPH
+ 0xCDD9: 0x553E, //CJK UNIFIED IDEOGRAPH
+ 0xCDDA: 0x6316, //CJK UNIFIED IDEOGRAPH
+ 0xCDDB: 0x54C7, //CJK UNIFIED IDEOGRAPH
+ 0xCDDC: 0x86D9, //CJK UNIFIED IDEOGRAPH
+ 0xCDDD: 0x6D3C, //CJK UNIFIED IDEOGRAPH
+ 0xCDDE: 0x5A03, //CJK UNIFIED IDEOGRAPH
+ 0xCDDF: 0x74E6, //CJK UNIFIED IDEOGRAPH
+ 0xCDE0: 0x889C, //CJK UNIFIED IDEOGRAPH
+ 0xCDE1: 0x6B6A, //CJK UNIFIED IDEOGRAPH
+ 0xCDE2: 0x5916, //CJK UNIFIED IDEOGRAPH
+ 0xCDE3: 0x8C4C, //CJK UNIFIED IDEOGRAPH
+ 0xCDE4: 0x5F2F, //CJK UNIFIED IDEOGRAPH
+ 0xCDE5: 0x6E7E, //CJK UNIFIED IDEOGRAPH
+ 0xCDE6: 0x73A9, //CJK UNIFIED IDEOGRAPH
+ 0xCDE7: 0x987D, //CJK UNIFIED IDEOGRAPH
+ 0xCDE8: 0x4E38, //CJK UNIFIED IDEOGRAPH
+ 0xCDE9: 0x70F7, //CJK UNIFIED IDEOGRAPH
+ 0xCDEA: 0x5B8C, //CJK UNIFIED IDEOGRAPH
+ 0xCDEB: 0x7897, //CJK UNIFIED IDEOGRAPH
+ 0xCDEC: 0x633D, //CJK UNIFIED IDEOGRAPH
+ 0xCDED: 0x665A, //CJK UNIFIED IDEOGRAPH
+ 0xCDEE: 0x7696, //CJK UNIFIED IDEOGRAPH
+ 0xCDEF: 0x60CB, //CJK UNIFIED IDEOGRAPH
+ 0xCDF0: 0x5B9B, //CJK UNIFIED IDEOGRAPH
+ 0xCDF1: 0x5A49, //CJK UNIFIED IDEOGRAPH
+ 0xCDF2: 0x4E07, //CJK UNIFIED IDEOGRAPH
+ 0xCDF3: 0x8155, //CJK UNIFIED IDEOGRAPH
+ 0xCDF4: 0x6C6A, //CJK UNIFIED IDEOGRAPH
+ 0xCDF5: 0x738B, //CJK UNIFIED IDEOGRAPH
+ 0xCDF6: 0x4EA1, //CJK UNIFIED IDEOGRAPH
+ 0xCDF7: 0x6789, //CJK UNIFIED IDEOGRAPH
+ 0xCDF8: 0x7F51, //CJK UNIFIED IDEOGRAPH
+ 0xCDF9: 0x5F80, //CJK UNIFIED IDEOGRAPH
+ 0xCDFA: 0x65FA, //CJK UNIFIED IDEOGRAPH
+ 0xCDFB: 0x671B, //CJK UNIFIED IDEOGRAPH
+ 0xCDFC: 0x5FD8, //CJK UNIFIED IDEOGRAPH
+ 0xCDFD: 0x5984, //CJK UNIFIED IDEOGRAPH
+ 0xCDFE: 0x5A01, //CJK UNIFIED IDEOGRAPH
+ 0xCE40: 0x8719, //CJK UNIFIED IDEOGRAPH
+ 0xCE41: 0x871B, //CJK UNIFIED IDEOGRAPH
+ 0xCE42: 0x871D, //CJK UNIFIED IDEOGRAPH
+ 0xCE43: 0x871F, //CJK UNIFIED IDEOGRAPH
+ 0xCE44: 0x8720, //CJK UNIFIED IDEOGRAPH
+ 0xCE45: 0x8724, //CJK UNIFIED IDEOGRAPH
+ 0xCE46: 0x8726, //CJK UNIFIED IDEOGRAPH
+ 0xCE47: 0x8727, //CJK UNIFIED IDEOGRAPH
+ 0xCE48: 0x8728, //CJK UNIFIED IDEOGRAPH
+ 0xCE49: 0x872A, //CJK UNIFIED IDEOGRAPH
+ 0xCE4A: 0x872B, //CJK UNIFIED IDEOGRAPH
+ 0xCE4B: 0x872C, //CJK UNIFIED IDEOGRAPH
+ 0xCE4C: 0x872D, //CJK UNIFIED IDEOGRAPH
+ 0xCE4D: 0x872F, //CJK UNIFIED IDEOGRAPH
+ 0xCE4E: 0x8730, //CJK UNIFIED IDEOGRAPH
+ 0xCE4F: 0x8732, //CJK UNIFIED IDEOGRAPH
+ 0xCE50: 0x8733, //CJK UNIFIED IDEOGRAPH
+ 0xCE51: 0x8735, //CJK UNIFIED IDEOGRAPH
+ 0xCE52: 0x8736, //CJK UNIFIED IDEOGRAPH
+ 0xCE53: 0x8738, //CJK UNIFIED IDEOGRAPH
+ 0xCE54: 0x8739, //CJK UNIFIED IDEOGRAPH
+ 0xCE55: 0x873A, //CJK UNIFIED IDEOGRAPH
+ 0xCE56: 0x873C, //CJK UNIFIED IDEOGRAPH
+ 0xCE57: 0x873D, //CJK UNIFIED IDEOGRAPH
+ 0xCE58: 0x8740, //CJK UNIFIED IDEOGRAPH
+ 0xCE59: 0x8741, //CJK UNIFIED IDEOGRAPH
+ 0xCE5A: 0x8742, //CJK UNIFIED IDEOGRAPH
+ 0xCE5B: 0x8743, //CJK UNIFIED IDEOGRAPH
+ 0xCE5C: 0x8744, //CJK UNIFIED IDEOGRAPH
+ 0xCE5D: 0x8745, //CJK UNIFIED IDEOGRAPH
+ 0xCE5E: 0x8746, //CJK UNIFIED IDEOGRAPH
+ 0xCE5F: 0x874A, //CJK UNIFIED IDEOGRAPH
+ 0xCE60: 0x874B, //CJK UNIFIED IDEOGRAPH
+ 0xCE61: 0x874D, //CJK UNIFIED IDEOGRAPH
+ 0xCE62: 0x874F, //CJK UNIFIED IDEOGRAPH
+ 0xCE63: 0x8750, //CJK UNIFIED IDEOGRAPH
+ 0xCE64: 0x8751, //CJK UNIFIED IDEOGRAPH
+ 0xCE65: 0x8752, //CJK UNIFIED IDEOGRAPH
+ 0xCE66: 0x8754, //CJK UNIFIED IDEOGRAPH
+ 0xCE67: 0x8755, //CJK UNIFIED IDEOGRAPH
+ 0xCE68: 0x8756, //CJK UNIFIED IDEOGRAPH
+ 0xCE69: 0x8758, //CJK UNIFIED IDEOGRAPH
+ 0xCE6A: 0x875A, //CJK UNIFIED IDEOGRAPH
+ 0xCE6B: 0x875B, //CJK UNIFIED IDEOGRAPH
+ 0xCE6C: 0x875C, //CJK UNIFIED IDEOGRAPH
+ 0xCE6D: 0x875D, //CJK UNIFIED IDEOGRAPH
+ 0xCE6E: 0x875E, //CJK UNIFIED IDEOGRAPH
+ 0xCE6F: 0x875F, //CJK UNIFIED IDEOGRAPH
+ 0xCE70: 0x8761, //CJK UNIFIED IDEOGRAPH
+ 0xCE71: 0x8762, //CJK UNIFIED IDEOGRAPH
+ 0xCE72: 0x8766, //CJK UNIFIED IDEOGRAPH
+ 0xCE73: 0x8767, //CJK UNIFIED IDEOGRAPH
+ 0xCE74: 0x8768, //CJK UNIFIED IDEOGRAPH
+ 0xCE75: 0x8769, //CJK UNIFIED IDEOGRAPH
+ 0xCE76: 0x876A, //CJK UNIFIED IDEOGRAPH
+ 0xCE77: 0x876B, //CJK UNIFIED IDEOGRAPH
+ 0xCE78: 0x876C, //CJK UNIFIED IDEOGRAPH
+ 0xCE79: 0x876D, //CJK UNIFIED IDEOGRAPH
+ 0xCE7A: 0x876F, //CJK UNIFIED IDEOGRAPH
+ 0xCE7B: 0x8771, //CJK UNIFIED IDEOGRAPH
+ 0xCE7C: 0x8772, //CJK UNIFIED IDEOGRAPH
+ 0xCE7D: 0x8773, //CJK UNIFIED IDEOGRAPH
+ 0xCE7E: 0x8775, //CJK UNIFIED IDEOGRAPH
+ 0xCE80: 0x8777, //CJK UNIFIED IDEOGRAPH
+ 0xCE81: 0x8778, //CJK UNIFIED IDEOGRAPH
+ 0xCE82: 0x8779, //CJK UNIFIED IDEOGRAPH
+ 0xCE83: 0x877A, //CJK UNIFIED IDEOGRAPH
+ 0xCE84: 0x877F, //CJK UNIFIED IDEOGRAPH
+ 0xCE85: 0x8780, //CJK UNIFIED IDEOGRAPH
+ 0xCE86: 0x8781, //CJK UNIFIED IDEOGRAPH
+ 0xCE87: 0x8784, //CJK UNIFIED IDEOGRAPH
+ 0xCE88: 0x8786, //CJK UNIFIED IDEOGRAPH
+ 0xCE89: 0x8787, //CJK UNIFIED IDEOGRAPH
+ 0xCE8A: 0x8789, //CJK UNIFIED IDEOGRAPH
+ 0xCE8B: 0x878A, //CJK UNIFIED IDEOGRAPH
+ 0xCE8C: 0x878C, //CJK UNIFIED IDEOGRAPH
+ 0xCE8D: 0x878E, //CJK UNIFIED IDEOGRAPH
+ 0xCE8E: 0x878F, //CJK UNIFIED IDEOGRAPH
+ 0xCE8F: 0x8790, //CJK UNIFIED IDEOGRAPH
+ 0xCE90: 0x8791, //CJK UNIFIED IDEOGRAPH
+ 0xCE91: 0x8792, //CJK UNIFIED IDEOGRAPH
+ 0xCE92: 0x8794, //CJK UNIFIED IDEOGRAPH
+ 0xCE93: 0x8795, //CJK UNIFIED IDEOGRAPH
+ 0xCE94: 0x8796, //CJK UNIFIED IDEOGRAPH
+ 0xCE95: 0x8798, //CJK UNIFIED IDEOGRAPH
+ 0xCE96: 0x8799, //CJK UNIFIED IDEOGRAPH
+ 0xCE97: 0x879A, //CJK UNIFIED IDEOGRAPH
+ 0xCE98: 0x879B, //CJK UNIFIED IDEOGRAPH
+ 0xCE99: 0x879C, //CJK UNIFIED IDEOGRAPH
+ 0xCE9A: 0x879D, //CJK UNIFIED IDEOGRAPH
+ 0xCE9B: 0x879E, //CJK UNIFIED IDEOGRAPH
+ 0xCE9C: 0x87A0, //CJK UNIFIED IDEOGRAPH
+ 0xCE9D: 0x87A1, //CJK UNIFIED IDEOGRAPH
+ 0xCE9E: 0x87A2, //CJK UNIFIED IDEOGRAPH
+ 0xCE9F: 0x87A3, //CJK UNIFIED IDEOGRAPH
+ 0xCEA0: 0x87A4, //CJK UNIFIED IDEOGRAPH
+ 0xCEA1: 0x5DCD, //CJK UNIFIED IDEOGRAPH
+ 0xCEA2: 0x5FAE, //CJK UNIFIED IDEOGRAPH
+ 0xCEA3: 0x5371, //CJK UNIFIED IDEOGRAPH
+ 0xCEA4: 0x97E6, //CJK UNIFIED IDEOGRAPH
+ 0xCEA5: 0x8FDD, //CJK UNIFIED IDEOGRAPH
+ 0xCEA6: 0x6845, //CJK UNIFIED IDEOGRAPH
+ 0xCEA7: 0x56F4, //CJK UNIFIED IDEOGRAPH
+ 0xCEA8: 0x552F, //CJK UNIFIED IDEOGRAPH
+ 0xCEA9: 0x60DF, //CJK UNIFIED IDEOGRAPH
+ 0xCEAA: 0x4E3A, //CJK UNIFIED IDEOGRAPH
+ 0xCEAB: 0x6F4D, //CJK UNIFIED IDEOGRAPH
+ 0xCEAC: 0x7EF4, //CJK UNIFIED IDEOGRAPH
+ 0xCEAD: 0x82C7, //CJK UNIFIED IDEOGRAPH
+ 0xCEAE: 0x840E, //CJK UNIFIED IDEOGRAPH
+ 0xCEAF: 0x59D4, //CJK UNIFIED IDEOGRAPH
+ 0xCEB0: 0x4F1F, //CJK UNIFIED IDEOGRAPH
+ 0xCEB1: 0x4F2A, //CJK UNIFIED IDEOGRAPH
+ 0xCEB2: 0x5C3E, //CJK UNIFIED IDEOGRAPH
+ 0xCEB3: 0x7EAC, //CJK UNIFIED IDEOGRAPH
+ 0xCEB4: 0x672A, //CJK UNIFIED IDEOGRAPH
+ 0xCEB5: 0x851A, //CJK UNIFIED IDEOGRAPH
+ 0xCEB6: 0x5473, //CJK UNIFIED IDEOGRAPH
+ 0xCEB7: 0x754F, //CJK UNIFIED IDEOGRAPH
+ 0xCEB8: 0x80C3, //CJK UNIFIED IDEOGRAPH
+ 0xCEB9: 0x5582, //CJK UNIFIED IDEOGRAPH
+ 0xCEBA: 0x9B4F, //CJK UNIFIED IDEOGRAPH
+ 0xCEBB: 0x4F4D, //CJK UNIFIED IDEOGRAPH
+ 0xCEBC: 0x6E2D, //CJK UNIFIED IDEOGRAPH
+ 0xCEBD: 0x8C13, //CJK UNIFIED IDEOGRAPH
+ 0xCEBE: 0x5C09, //CJK UNIFIED IDEOGRAPH
+ 0xCEBF: 0x6170, //CJK UNIFIED IDEOGRAPH
+ 0xCEC0: 0x536B, //CJK UNIFIED IDEOGRAPH
+ 0xCEC1: 0x761F, //CJK UNIFIED IDEOGRAPH
+ 0xCEC2: 0x6E29, //CJK UNIFIED IDEOGRAPH
+ 0xCEC3: 0x868A, //CJK UNIFIED IDEOGRAPH
+ 0xCEC4: 0x6587, //CJK UNIFIED IDEOGRAPH
+ 0xCEC5: 0x95FB, //CJK UNIFIED IDEOGRAPH
+ 0xCEC6: 0x7EB9, //CJK UNIFIED IDEOGRAPH
+ 0xCEC7: 0x543B, //CJK UNIFIED IDEOGRAPH
+ 0xCEC8: 0x7A33, //CJK UNIFIED IDEOGRAPH
+ 0xCEC9: 0x7D0A, //CJK UNIFIED IDEOGRAPH
+ 0xCECA: 0x95EE, //CJK UNIFIED IDEOGRAPH
+ 0xCECB: 0x55E1, //CJK UNIFIED IDEOGRAPH
+ 0xCECC: 0x7FC1, //CJK UNIFIED IDEOGRAPH
+ 0xCECD: 0x74EE, //CJK UNIFIED IDEOGRAPH
+ 0xCECE: 0x631D, //CJK UNIFIED IDEOGRAPH
+ 0xCECF: 0x8717, //CJK UNIFIED IDEOGRAPH
+ 0xCED0: 0x6DA1, //CJK UNIFIED IDEOGRAPH
+ 0xCED1: 0x7A9D, //CJK UNIFIED IDEOGRAPH
+ 0xCED2: 0x6211, //CJK UNIFIED IDEOGRAPH
+ 0xCED3: 0x65A1, //CJK UNIFIED IDEOGRAPH
+ 0xCED4: 0x5367, //CJK UNIFIED IDEOGRAPH
+ 0xCED5: 0x63E1, //CJK UNIFIED IDEOGRAPH
+ 0xCED6: 0x6C83, //CJK UNIFIED IDEOGRAPH
+ 0xCED7: 0x5DEB, //CJK UNIFIED IDEOGRAPH
+ 0xCED8: 0x545C, //CJK UNIFIED IDEOGRAPH
+ 0xCED9: 0x94A8, //CJK UNIFIED IDEOGRAPH
+ 0xCEDA: 0x4E4C, //CJK UNIFIED IDEOGRAPH
+ 0xCEDB: 0x6C61, //CJK UNIFIED IDEOGRAPH
+ 0xCEDC: 0x8BEC, //CJK UNIFIED IDEOGRAPH
+ 0xCEDD: 0x5C4B, //CJK UNIFIED IDEOGRAPH
+ 0xCEDE: 0x65E0, //CJK UNIFIED IDEOGRAPH
+ 0xCEDF: 0x829C, //CJK UNIFIED IDEOGRAPH
+ 0xCEE0: 0x68A7, //CJK UNIFIED IDEOGRAPH
+ 0xCEE1: 0x543E, //CJK UNIFIED IDEOGRAPH
+ 0xCEE2: 0x5434, //CJK UNIFIED IDEOGRAPH
+ 0xCEE3: 0x6BCB, //CJK UNIFIED IDEOGRAPH
+ 0xCEE4: 0x6B66, //CJK UNIFIED IDEOGRAPH
+ 0xCEE5: 0x4E94, //CJK UNIFIED IDEOGRAPH
+ 0xCEE6: 0x6342, //CJK UNIFIED IDEOGRAPH
+ 0xCEE7: 0x5348, //CJK UNIFIED IDEOGRAPH
+ 0xCEE8: 0x821E, //CJK UNIFIED IDEOGRAPH
+ 0xCEE9: 0x4F0D, //CJK UNIFIED IDEOGRAPH
+ 0xCEEA: 0x4FAE, //CJK UNIFIED IDEOGRAPH
+ 0xCEEB: 0x575E, //CJK UNIFIED IDEOGRAPH
+ 0xCEEC: 0x620A, //CJK UNIFIED IDEOGRAPH
+ 0xCEED: 0x96FE, //CJK UNIFIED IDEOGRAPH
+ 0xCEEE: 0x6664, //CJK UNIFIED IDEOGRAPH
+ 0xCEEF: 0x7269, //CJK UNIFIED IDEOGRAPH
+ 0xCEF0: 0x52FF, //CJK UNIFIED IDEOGRAPH
+ 0xCEF1: 0x52A1, //CJK UNIFIED IDEOGRAPH
+ 0xCEF2: 0x609F, //CJK UNIFIED IDEOGRAPH
+ 0xCEF3: 0x8BEF, //CJK UNIFIED IDEOGRAPH
+ 0xCEF4: 0x6614, //CJK UNIFIED IDEOGRAPH
+ 0xCEF5: 0x7199, //CJK UNIFIED IDEOGRAPH
+ 0xCEF6: 0x6790, //CJK UNIFIED IDEOGRAPH
+ 0xCEF7: 0x897F, //CJK UNIFIED IDEOGRAPH
+ 0xCEF8: 0x7852, //CJK UNIFIED IDEOGRAPH
+ 0xCEF9: 0x77FD, //CJK UNIFIED IDEOGRAPH
+ 0xCEFA: 0x6670, //CJK UNIFIED IDEOGRAPH
+ 0xCEFB: 0x563B, //CJK UNIFIED IDEOGRAPH
+ 0xCEFC: 0x5438, //CJK UNIFIED IDEOGRAPH
+ 0xCEFD: 0x9521, //CJK UNIFIED IDEOGRAPH
+ 0xCEFE: 0x727A, //CJK UNIFIED IDEOGRAPH
+ 0xCF40: 0x87A5, //CJK UNIFIED IDEOGRAPH
+ 0xCF41: 0x87A6, //CJK UNIFIED IDEOGRAPH
+ 0xCF42: 0x87A7, //CJK UNIFIED IDEOGRAPH
+ 0xCF43: 0x87A9, //CJK UNIFIED IDEOGRAPH
+ 0xCF44: 0x87AA, //CJK UNIFIED IDEOGRAPH
+ 0xCF45: 0x87AE, //CJK UNIFIED IDEOGRAPH
+ 0xCF46: 0x87B0, //CJK UNIFIED IDEOGRAPH
+ 0xCF47: 0x87B1, //CJK UNIFIED IDEOGRAPH
+ 0xCF48: 0x87B2, //CJK UNIFIED IDEOGRAPH
+ 0xCF49: 0x87B4, //CJK UNIFIED IDEOGRAPH
+ 0xCF4A: 0x87B6, //CJK UNIFIED IDEOGRAPH
+ 0xCF4B: 0x87B7, //CJK UNIFIED IDEOGRAPH
+ 0xCF4C: 0x87B8, //CJK UNIFIED IDEOGRAPH
+ 0xCF4D: 0x87B9, //CJK UNIFIED IDEOGRAPH
+ 0xCF4E: 0x87BB, //CJK UNIFIED IDEOGRAPH
+ 0xCF4F: 0x87BC, //CJK UNIFIED IDEOGRAPH
+ 0xCF50: 0x87BE, //CJK UNIFIED IDEOGRAPH
+ 0xCF51: 0x87BF, //CJK UNIFIED IDEOGRAPH
+ 0xCF52: 0x87C1, //CJK UNIFIED IDEOGRAPH
+ 0xCF53: 0x87C2, //CJK UNIFIED IDEOGRAPH
+ 0xCF54: 0x87C3, //CJK UNIFIED IDEOGRAPH
+ 0xCF55: 0x87C4, //CJK UNIFIED IDEOGRAPH
+ 0xCF56: 0x87C5, //CJK UNIFIED IDEOGRAPH
+ 0xCF57: 0x87C7, //CJK UNIFIED IDEOGRAPH
+ 0xCF58: 0x87C8, //CJK UNIFIED IDEOGRAPH
+ 0xCF59: 0x87C9, //CJK UNIFIED IDEOGRAPH
+ 0xCF5A: 0x87CC, //CJK UNIFIED IDEOGRAPH
+ 0xCF5B: 0x87CD, //CJK UNIFIED IDEOGRAPH
+ 0xCF5C: 0x87CE, //CJK UNIFIED IDEOGRAPH
+ 0xCF5D: 0x87CF, //CJK UNIFIED IDEOGRAPH
+ 0xCF5E: 0x87D0, //CJK UNIFIED IDEOGRAPH
+ 0xCF5F: 0x87D4, //CJK UNIFIED IDEOGRAPH
+ 0xCF60: 0x87D5, //CJK UNIFIED IDEOGRAPH
+ 0xCF61: 0x87D6, //CJK UNIFIED IDEOGRAPH
+ 0xCF62: 0x87D7, //CJK UNIFIED IDEOGRAPH
+ 0xCF63: 0x87D8, //CJK UNIFIED IDEOGRAPH
+ 0xCF64: 0x87D9, //CJK UNIFIED IDEOGRAPH
+ 0xCF65: 0x87DA, //CJK UNIFIED IDEOGRAPH
+ 0xCF66: 0x87DC, //CJK UNIFIED IDEOGRAPH
+ 0xCF67: 0x87DD, //CJK UNIFIED IDEOGRAPH
+ 0xCF68: 0x87DE, //CJK UNIFIED IDEOGRAPH
+ 0xCF69: 0x87DF, //CJK UNIFIED IDEOGRAPH
+ 0xCF6A: 0x87E1, //CJK UNIFIED IDEOGRAPH
+ 0xCF6B: 0x87E2, //CJK UNIFIED IDEOGRAPH
+ 0xCF6C: 0x87E3, //CJK UNIFIED IDEOGRAPH
+ 0xCF6D: 0x87E4, //CJK UNIFIED IDEOGRAPH
+ 0xCF6E: 0x87E6, //CJK UNIFIED IDEOGRAPH
+ 0xCF6F: 0x87E7, //CJK UNIFIED IDEOGRAPH
+ 0xCF70: 0x87E8, //CJK UNIFIED IDEOGRAPH
+ 0xCF71: 0x87E9, //CJK UNIFIED IDEOGRAPH
+ 0xCF72: 0x87EB, //CJK UNIFIED IDEOGRAPH
+ 0xCF73: 0x87EC, //CJK UNIFIED IDEOGRAPH
+ 0xCF74: 0x87ED, //CJK UNIFIED IDEOGRAPH
+ 0xCF75: 0x87EF, //CJK UNIFIED IDEOGRAPH
+ 0xCF76: 0x87F0, //CJK UNIFIED IDEOGRAPH
+ 0xCF77: 0x87F1, //CJK UNIFIED IDEOGRAPH
+ 0xCF78: 0x87F2, //CJK UNIFIED IDEOGRAPH
+ 0xCF79: 0x87F3, //CJK UNIFIED IDEOGRAPH
+ 0xCF7A: 0x87F4, //CJK UNIFIED IDEOGRAPH
+ 0xCF7B: 0x87F5, //CJK UNIFIED IDEOGRAPH
+ 0xCF7C: 0x87F6, //CJK UNIFIED IDEOGRAPH
+ 0xCF7D: 0x87F7, //CJK UNIFIED IDEOGRAPH
+ 0xCF7E: 0x87F8, //CJK UNIFIED IDEOGRAPH
+ 0xCF80: 0x87FA, //CJK UNIFIED IDEOGRAPH
+ 0xCF81: 0x87FB, //CJK UNIFIED IDEOGRAPH
+ 0xCF82: 0x87FC, //CJK UNIFIED IDEOGRAPH
+ 0xCF83: 0x87FD, //CJK UNIFIED IDEOGRAPH
+ 0xCF84: 0x87FF, //CJK UNIFIED IDEOGRAPH
+ 0xCF85: 0x8800, //CJK UNIFIED IDEOGRAPH
+ 0xCF86: 0x8801, //CJK UNIFIED IDEOGRAPH
+ 0xCF87: 0x8802, //CJK UNIFIED IDEOGRAPH
+ 0xCF88: 0x8804, //CJK UNIFIED IDEOGRAPH
+ 0xCF89: 0x8805, //CJK UNIFIED IDEOGRAPH
+ 0xCF8A: 0x8806, //CJK UNIFIED IDEOGRAPH
+ 0xCF8B: 0x8807, //CJK UNIFIED IDEOGRAPH
+ 0xCF8C: 0x8808, //CJK UNIFIED IDEOGRAPH
+ 0xCF8D: 0x8809, //CJK UNIFIED IDEOGRAPH
+ 0xCF8E: 0x880B, //CJK UNIFIED IDEOGRAPH
+ 0xCF8F: 0x880C, //CJK UNIFIED IDEOGRAPH
+ 0xCF90: 0x880D, //CJK UNIFIED IDEOGRAPH
+ 0xCF91: 0x880E, //CJK UNIFIED IDEOGRAPH
+ 0xCF92: 0x880F, //CJK UNIFIED IDEOGRAPH
+ 0xCF93: 0x8810, //CJK UNIFIED IDEOGRAPH
+ 0xCF94: 0x8811, //CJK UNIFIED IDEOGRAPH
+ 0xCF95: 0x8812, //CJK UNIFIED IDEOGRAPH
+ 0xCF96: 0x8814, //CJK UNIFIED IDEOGRAPH
+ 0xCF97: 0x8817, //CJK UNIFIED IDEOGRAPH
+ 0xCF98: 0x8818, //CJK UNIFIED IDEOGRAPH
+ 0xCF99: 0x8819, //CJK UNIFIED IDEOGRAPH
+ 0xCF9A: 0x881A, //CJK UNIFIED IDEOGRAPH
+ 0xCF9B: 0x881C, //CJK UNIFIED IDEOGRAPH
+ 0xCF9C: 0x881D, //CJK UNIFIED IDEOGRAPH
+ 0xCF9D: 0x881E, //CJK UNIFIED IDEOGRAPH
+ 0xCF9E: 0x881F, //CJK UNIFIED IDEOGRAPH
+ 0xCF9F: 0x8820, //CJK UNIFIED IDEOGRAPH
+ 0xCFA0: 0x8823, //CJK UNIFIED IDEOGRAPH
+ 0xCFA1: 0x7A00, //CJK UNIFIED IDEOGRAPH
+ 0xCFA2: 0x606F, //CJK UNIFIED IDEOGRAPH
+ 0xCFA3: 0x5E0C, //CJK UNIFIED IDEOGRAPH
+ 0xCFA4: 0x6089, //CJK UNIFIED IDEOGRAPH
+ 0xCFA5: 0x819D, //CJK UNIFIED IDEOGRAPH
+ 0xCFA6: 0x5915, //CJK UNIFIED IDEOGRAPH
+ 0xCFA7: 0x60DC, //CJK UNIFIED IDEOGRAPH
+ 0xCFA8: 0x7184, //CJK UNIFIED IDEOGRAPH
+ 0xCFA9: 0x70EF, //CJK UNIFIED IDEOGRAPH
+ 0xCFAA: 0x6EAA, //CJK UNIFIED IDEOGRAPH
+ 0xCFAB: 0x6C50, //CJK UNIFIED IDEOGRAPH
+ 0xCFAC: 0x7280, //CJK UNIFIED IDEOGRAPH
+ 0xCFAD: 0x6A84, //CJK UNIFIED IDEOGRAPH
+ 0xCFAE: 0x88AD, //CJK UNIFIED IDEOGRAPH
+ 0xCFAF: 0x5E2D, //CJK UNIFIED IDEOGRAPH
+ 0xCFB0: 0x4E60, //CJK UNIFIED IDEOGRAPH
+ 0xCFB1: 0x5AB3, //CJK UNIFIED IDEOGRAPH
+ 0xCFB2: 0x559C, //CJK UNIFIED IDEOGRAPH
+ 0xCFB3: 0x94E3, //CJK UNIFIED IDEOGRAPH
+ 0xCFB4: 0x6D17, //CJK UNIFIED IDEOGRAPH
+ 0xCFB5: 0x7CFB, //CJK UNIFIED IDEOGRAPH
+ 0xCFB6: 0x9699, //CJK UNIFIED IDEOGRAPH
+ 0xCFB7: 0x620F, //CJK UNIFIED IDEOGRAPH
+ 0xCFB8: 0x7EC6, //CJK UNIFIED IDEOGRAPH
+ 0xCFB9: 0x778E, //CJK UNIFIED IDEOGRAPH
+ 0xCFBA: 0x867E, //CJK UNIFIED IDEOGRAPH
+ 0xCFBB: 0x5323, //CJK UNIFIED IDEOGRAPH
+ 0xCFBC: 0x971E, //CJK UNIFIED IDEOGRAPH
+ 0xCFBD: 0x8F96, //CJK UNIFIED IDEOGRAPH
+ 0xCFBE: 0x6687, //CJK UNIFIED IDEOGRAPH
+ 0xCFBF: 0x5CE1, //CJK UNIFIED IDEOGRAPH
+ 0xCFC0: 0x4FA0, //CJK UNIFIED IDEOGRAPH
+ 0xCFC1: 0x72ED, //CJK UNIFIED IDEOGRAPH
+ 0xCFC2: 0x4E0B, //CJK UNIFIED IDEOGRAPH
+ 0xCFC3: 0x53A6, //CJK UNIFIED IDEOGRAPH
+ 0xCFC4: 0x590F, //CJK UNIFIED IDEOGRAPH
+ 0xCFC5: 0x5413, //CJK UNIFIED IDEOGRAPH
+ 0xCFC6: 0x6380, //CJK UNIFIED IDEOGRAPH
+ 0xCFC7: 0x9528, //CJK UNIFIED IDEOGRAPH
+ 0xCFC8: 0x5148, //CJK UNIFIED IDEOGRAPH
+ 0xCFC9: 0x4ED9, //CJK UNIFIED IDEOGRAPH
+ 0xCFCA: 0x9C9C, //CJK UNIFIED IDEOGRAPH
+ 0xCFCB: 0x7EA4, //CJK UNIFIED IDEOGRAPH
+ 0xCFCC: 0x54B8, //CJK UNIFIED IDEOGRAPH
+ 0xCFCD: 0x8D24, //CJK UNIFIED IDEOGRAPH
+ 0xCFCE: 0x8854, //CJK UNIFIED IDEOGRAPH
+ 0xCFCF: 0x8237, //CJK UNIFIED IDEOGRAPH
+ 0xCFD0: 0x95F2, //CJK UNIFIED IDEOGRAPH
+ 0xCFD1: 0x6D8E, //CJK UNIFIED IDEOGRAPH
+ 0xCFD2: 0x5F26, //CJK UNIFIED IDEOGRAPH
+ 0xCFD3: 0x5ACC, //CJK UNIFIED IDEOGRAPH
+ 0xCFD4: 0x663E, //CJK UNIFIED IDEOGRAPH
+ 0xCFD5: 0x9669, //CJK UNIFIED IDEOGRAPH
+ 0xCFD6: 0x73B0, //CJK UNIFIED IDEOGRAPH
+ 0xCFD7: 0x732E, //CJK UNIFIED IDEOGRAPH
+ 0xCFD8: 0x53BF, //CJK UNIFIED IDEOGRAPH
+ 0xCFD9: 0x817A, //CJK UNIFIED IDEOGRAPH
+ 0xCFDA: 0x9985, //CJK UNIFIED IDEOGRAPH
+ 0xCFDB: 0x7FA1, //CJK UNIFIED IDEOGRAPH
+ 0xCFDC: 0x5BAA, //CJK UNIFIED IDEOGRAPH
+ 0xCFDD: 0x9677, //CJK UNIFIED IDEOGRAPH
+ 0xCFDE: 0x9650, //CJK UNIFIED IDEOGRAPH
+ 0xCFDF: 0x7EBF, //CJK UNIFIED IDEOGRAPH
+ 0xCFE0: 0x76F8, //CJK UNIFIED IDEOGRAPH
+ 0xCFE1: 0x53A2, //CJK UNIFIED IDEOGRAPH
+ 0xCFE2: 0x9576, //CJK UNIFIED IDEOGRAPH
+ 0xCFE3: 0x9999, //CJK UNIFIED IDEOGRAPH
+ 0xCFE4: 0x7BB1, //CJK UNIFIED IDEOGRAPH
+ 0xCFE5: 0x8944, //CJK UNIFIED IDEOGRAPH
+ 0xCFE6: 0x6E58, //CJK UNIFIED IDEOGRAPH
+ 0xCFE7: 0x4E61, //CJK UNIFIED IDEOGRAPH
+ 0xCFE8: 0x7FD4, //CJK UNIFIED IDEOGRAPH
+ 0xCFE9: 0x7965, //CJK UNIFIED IDEOGRAPH
+ 0xCFEA: 0x8BE6, //CJK UNIFIED IDEOGRAPH
+ 0xCFEB: 0x60F3, //CJK UNIFIED IDEOGRAPH
+ 0xCFEC: 0x54CD, //CJK UNIFIED IDEOGRAPH
+ 0xCFED: 0x4EAB, //CJK UNIFIED IDEOGRAPH
+ 0xCFEE: 0x9879, //CJK UNIFIED IDEOGRAPH
+ 0xCFEF: 0x5DF7, //CJK UNIFIED IDEOGRAPH
+ 0xCFF0: 0x6A61, //CJK UNIFIED IDEOGRAPH
+ 0xCFF1: 0x50CF, //CJK UNIFIED IDEOGRAPH
+ 0xCFF2: 0x5411, //CJK UNIFIED IDEOGRAPH
+ 0xCFF3: 0x8C61, //CJK UNIFIED IDEOGRAPH
+ 0xCFF4: 0x8427, //CJK UNIFIED IDEOGRAPH
+ 0xCFF5: 0x785D, //CJK UNIFIED IDEOGRAPH
+ 0xCFF6: 0x9704, //CJK UNIFIED IDEOGRAPH
+ 0xCFF7: 0x524A, //CJK UNIFIED IDEOGRAPH
+ 0xCFF8: 0x54EE, //CJK UNIFIED IDEOGRAPH
+ 0xCFF9: 0x56A3, //CJK UNIFIED IDEOGRAPH
+ 0xCFFA: 0x9500, //CJK UNIFIED IDEOGRAPH
+ 0xCFFB: 0x6D88, //CJK UNIFIED IDEOGRAPH
+ 0xCFFC: 0x5BB5, //CJK UNIFIED IDEOGRAPH
+ 0xCFFD: 0x6DC6, //CJK UNIFIED IDEOGRAPH
+ 0xCFFE: 0x6653, //CJK UNIFIED IDEOGRAPH
+ 0xD040: 0x8824, //CJK UNIFIED IDEOGRAPH
+ 0xD041: 0x8825, //CJK UNIFIED IDEOGRAPH
+ 0xD042: 0x8826, //CJK UNIFIED IDEOGRAPH
+ 0xD043: 0x8827, //CJK UNIFIED IDEOGRAPH
+ 0xD044: 0x8828, //CJK UNIFIED IDEOGRAPH
+ 0xD045: 0x8829, //CJK UNIFIED IDEOGRAPH
+ 0xD046: 0x882A, //CJK UNIFIED IDEOGRAPH
+ 0xD047: 0x882B, //CJK UNIFIED IDEOGRAPH
+ 0xD048: 0x882C, //CJK UNIFIED IDEOGRAPH
+ 0xD049: 0x882D, //CJK UNIFIED IDEOGRAPH
+ 0xD04A: 0x882E, //CJK UNIFIED IDEOGRAPH
+ 0xD04B: 0x882F, //CJK UNIFIED IDEOGRAPH
+ 0xD04C: 0x8830, //CJK UNIFIED IDEOGRAPH
+ 0xD04D: 0x8831, //CJK UNIFIED IDEOGRAPH
+ 0xD04E: 0x8833, //CJK UNIFIED IDEOGRAPH
+ 0xD04F: 0x8834, //CJK UNIFIED IDEOGRAPH
+ 0xD050: 0x8835, //CJK UNIFIED IDEOGRAPH
+ 0xD051: 0x8836, //CJK UNIFIED IDEOGRAPH
+ 0xD052: 0x8837, //CJK UNIFIED IDEOGRAPH
+ 0xD053: 0x8838, //CJK UNIFIED IDEOGRAPH
+ 0xD054: 0x883A, //CJK UNIFIED IDEOGRAPH
+ 0xD055: 0x883B, //CJK UNIFIED IDEOGRAPH
+ 0xD056: 0x883D, //CJK UNIFIED IDEOGRAPH
+ 0xD057: 0x883E, //CJK UNIFIED IDEOGRAPH
+ 0xD058: 0x883F, //CJK UNIFIED IDEOGRAPH
+ 0xD059: 0x8841, //CJK UNIFIED IDEOGRAPH
+ 0xD05A: 0x8842, //CJK UNIFIED IDEOGRAPH
+ 0xD05B: 0x8843, //CJK UNIFIED IDEOGRAPH
+ 0xD05C: 0x8846, //CJK UNIFIED IDEOGRAPH
+ 0xD05D: 0x8847, //CJK UNIFIED IDEOGRAPH
+ 0xD05E: 0x8848, //CJK UNIFIED IDEOGRAPH
+ 0xD05F: 0x8849, //CJK UNIFIED IDEOGRAPH
+ 0xD060: 0x884A, //CJK UNIFIED IDEOGRAPH
+ 0xD061: 0x884B, //CJK UNIFIED IDEOGRAPH
+ 0xD062: 0x884E, //CJK UNIFIED IDEOGRAPH
+ 0xD063: 0x884F, //CJK UNIFIED IDEOGRAPH
+ 0xD064: 0x8850, //CJK UNIFIED IDEOGRAPH
+ 0xD065: 0x8851, //CJK UNIFIED IDEOGRAPH
+ 0xD066: 0x8852, //CJK UNIFIED IDEOGRAPH
+ 0xD067: 0x8853, //CJK UNIFIED IDEOGRAPH
+ 0xD068: 0x8855, //CJK UNIFIED IDEOGRAPH
+ 0xD069: 0x8856, //CJK UNIFIED IDEOGRAPH
+ 0xD06A: 0x8858, //CJK UNIFIED IDEOGRAPH
+ 0xD06B: 0x885A, //CJK UNIFIED IDEOGRAPH
+ 0xD06C: 0x885B, //CJK UNIFIED IDEOGRAPH
+ 0xD06D: 0x885C, //CJK UNIFIED IDEOGRAPH
+ 0xD06E: 0x885D, //CJK UNIFIED IDEOGRAPH
+ 0xD06F: 0x885E, //CJK UNIFIED IDEOGRAPH
+ 0xD070: 0x885F, //CJK UNIFIED IDEOGRAPH
+ 0xD071: 0x8860, //CJK UNIFIED IDEOGRAPH
+ 0xD072: 0x8866, //CJK UNIFIED IDEOGRAPH
+ 0xD073: 0x8867, //CJK UNIFIED IDEOGRAPH
+ 0xD074: 0x886A, //CJK UNIFIED IDEOGRAPH
+ 0xD075: 0x886D, //CJK UNIFIED IDEOGRAPH
+ 0xD076: 0x886F, //CJK UNIFIED IDEOGRAPH
+ 0xD077: 0x8871, //CJK UNIFIED IDEOGRAPH
+ 0xD078: 0x8873, //CJK UNIFIED IDEOGRAPH
+ 0xD079: 0x8874, //CJK UNIFIED IDEOGRAPH
+ 0xD07A: 0x8875, //CJK UNIFIED IDEOGRAPH
+ 0xD07B: 0x8876, //CJK UNIFIED IDEOGRAPH
+ 0xD07C: 0x8878, //CJK UNIFIED IDEOGRAPH
+ 0xD07D: 0x8879, //CJK UNIFIED IDEOGRAPH
+ 0xD07E: 0x887A, //CJK UNIFIED IDEOGRAPH
+ 0xD080: 0x887B, //CJK UNIFIED IDEOGRAPH
+ 0xD081: 0x887C, //CJK UNIFIED IDEOGRAPH
+ 0xD082: 0x8880, //CJK UNIFIED IDEOGRAPH
+ 0xD083: 0x8883, //CJK UNIFIED IDEOGRAPH
+ 0xD084: 0x8886, //CJK UNIFIED IDEOGRAPH
+ 0xD085: 0x8887, //CJK UNIFIED IDEOGRAPH
+ 0xD086: 0x8889, //CJK UNIFIED IDEOGRAPH
+ 0xD087: 0x888A, //CJK UNIFIED IDEOGRAPH
+ 0xD088: 0x888C, //CJK UNIFIED IDEOGRAPH
+ 0xD089: 0x888E, //CJK UNIFIED IDEOGRAPH
+ 0xD08A: 0x888F, //CJK UNIFIED IDEOGRAPH
+ 0xD08B: 0x8890, //CJK UNIFIED IDEOGRAPH
+ 0xD08C: 0x8891, //CJK UNIFIED IDEOGRAPH
+ 0xD08D: 0x8893, //CJK UNIFIED IDEOGRAPH
+ 0xD08E: 0x8894, //CJK UNIFIED IDEOGRAPH
+ 0xD08F: 0x8895, //CJK UNIFIED IDEOGRAPH
+ 0xD090: 0x8897, //CJK UNIFIED IDEOGRAPH
+ 0xD091: 0x8898, //CJK UNIFIED IDEOGRAPH
+ 0xD092: 0x8899, //CJK UNIFIED IDEOGRAPH
+ 0xD093: 0x889A, //CJK UNIFIED IDEOGRAPH
+ 0xD094: 0x889B, //CJK UNIFIED IDEOGRAPH
+ 0xD095: 0x889D, //CJK UNIFIED IDEOGRAPH
+ 0xD096: 0x889E, //CJK UNIFIED IDEOGRAPH
+ 0xD097: 0x889F, //CJK UNIFIED IDEOGRAPH
+ 0xD098: 0x88A0, //CJK UNIFIED IDEOGRAPH
+ 0xD099: 0x88A1, //CJK UNIFIED IDEOGRAPH
+ 0xD09A: 0x88A3, //CJK UNIFIED IDEOGRAPH
+ 0xD09B: 0x88A5, //CJK UNIFIED IDEOGRAPH
+ 0xD09C: 0x88A6, //CJK UNIFIED IDEOGRAPH
+ 0xD09D: 0x88A7, //CJK UNIFIED IDEOGRAPH
+ 0xD09E: 0x88A8, //CJK UNIFIED IDEOGRAPH
+ 0xD09F: 0x88A9, //CJK UNIFIED IDEOGRAPH
+ 0xD0A0: 0x88AA, //CJK UNIFIED IDEOGRAPH
+ 0xD0A1: 0x5C0F, //CJK UNIFIED IDEOGRAPH
+ 0xD0A2: 0x5B5D, //CJK UNIFIED IDEOGRAPH
+ 0xD0A3: 0x6821, //CJK UNIFIED IDEOGRAPH
+ 0xD0A4: 0x8096, //CJK UNIFIED IDEOGRAPH
+ 0xD0A5: 0x5578, //CJK UNIFIED IDEOGRAPH
+ 0xD0A6: 0x7B11, //CJK UNIFIED IDEOGRAPH
+ 0xD0A7: 0x6548, //CJK UNIFIED IDEOGRAPH
+ 0xD0A8: 0x6954, //CJK UNIFIED IDEOGRAPH
+ 0xD0A9: 0x4E9B, //CJK UNIFIED IDEOGRAPH
+ 0xD0AA: 0x6B47, //CJK UNIFIED IDEOGRAPH
+ 0xD0AB: 0x874E, //CJK UNIFIED IDEOGRAPH
+ 0xD0AC: 0x978B, //CJK UNIFIED IDEOGRAPH
+ 0xD0AD: 0x534F, //CJK UNIFIED IDEOGRAPH
+ 0xD0AE: 0x631F, //CJK UNIFIED IDEOGRAPH
+ 0xD0AF: 0x643A, //CJK UNIFIED IDEOGRAPH
+ 0xD0B0: 0x90AA, //CJK UNIFIED IDEOGRAPH
+ 0xD0B1: 0x659C, //CJK UNIFIED IDEOGRAPH
+ 0xD0B2: 0x80C1, //CJK UNIFIED IDEOGRAPH
+ 0xD0B3: 0x8C10, //CJK UNIFIED IDEOGRAPH
+ 0xD0B4: 0x5199, //CJK UNIFIED IDEOGRAPH
+ 0xD0B5: 0x68B0, //CJK UNIFIED IDEOGRAPH
+ 0xD0B6: 0x5378, //CJK UNIFIED IDEOGRAPH
+ 0xD0B7: 0x87F9, //CJK UNIFIED IDEOGRAPH
+ 0xD0B8: 0x61C8, //CJK UNIFIED IDEOGRAPH
+ 0xD0B9: 0x6CC4, //CJK UNIFIED IDEOGRAPH
+ 0xD0BA: 0x6CFB, //CJK UNIFIED IDEOGRAPH
+ 0xD0BB: 0x8C22, //CJK UNIFIED IDEOGRAPH
+ 0xD0BC: 0x5C51, //CJK UNIFIED IDEOGRAPH
+ 0xD0BD: 0x85AA, //CJK UNIFIED IDEOGRAPH
+ 0xD0BE: 0x82AF, //CJK UNIFIED IDEOGRAPH
+ 0xD0BF: 0x950C, //CJK UNIFIED IDEOGRAPH
+ 0xD0C0: 0x6B23, //CJK UNIFIED IDEOGRAPH
+ 0xD0C1: 0x8F9B, //CJK UNIFIED IDEOGRAPH
+ 0xD0C2: 0x65B0, //CJK UNIFIED IDEOGRAPH
+ 0xD0C3: 0x5FFB, //CJK UNIFIED IDEOGRAPH
+ 0xD0C4: 0x5FC3, //CJK UNIFIED IDEOGRAPH
+ 0xD0C5: 0x4FE1, //CJK UNIFIED IDEOGRAPH
+ 0xD0C6: 0x8845, //CJK UNIFIED IDEOGRAPH
+ 0xD0C7: 0x661F, //CJK UNIFIED IDEOGRAPH
+ 0xD0C8: 0x8165, //CJK UNIFIED IDEOGRAPH
+ 0xD0C9: 0x7329, //CJK UNIFIED IDEOGRAPH
+ 0xD0CA: 0x60FA, //CJK UNIFIED IDEOGRAPH
+ 0xD0CB: 0x5174, //CJK UNIFIED IDEOGRAPH
+ 0xD0CC: 0x5211, //CJK UNIFIED IDEOGRAPH
+ 0xD0CD: 0x578B, //CJK UNIFIED IDEOGRAPH
+ 0xD0CE: 0x5F62, //CJK UNIFIED IDEOGRAPH
+ 0xD0CF: 0x90A2, //CJK UNIFIED IDEOGRAPH
+ 0xD0D0: 0x884C, //CJK UNIFIED IDEOGRAPH
+ 0xD0D1: 0x9192, //CJK UNIFIED IDEOGRAPH
+ 0xD0D2: 0x5E78, //CJK UNIFIED IDEOGRAPH
+ 0xD0D3: 0x674F, //CJK UNIFIED IDEOGRAPH
+ 0xD0D4: 0x6027, //CJK UNIFIED IDEOGRAPH
+ 0xD0D5: 0x59D3, //CJK UNIFIED IDEOGRAPH
+ 0xD0D6: 0x5144, //CJK UNIFIED IDEOGRAPH
+ 0xD0D7: 0x51F6, //CJK UNIFIED IDEOGRAPH
+ 0xD0D8: 0x80F8, //CJK UNIFIED IDEOGRAPH
+ 0xD0D9: 0x5308, //CJK UNIFIED IDEOGRAPH
+ 0xD0DA: 0x6C79, //CJK UNIFIED IDEOGRAPH
+ 0xD0DB: 0x96C4, //CJK UNIFIED IDEOGRAPH
+ 0xD0DC: 0x718A, //CJK UNIFIED IDEOGRAPH
+ 0xD0DD: 0x4F11, //CJK UNIFIED IDEOGRAPH
+ 0xD0DE: 0x4FEE, //CJK UNIFIED IDEOGRAPH
+ 0xD0DF: 0x7F9E, //CJK UNIFIED IDEOGRAPH
+ 0xD0E0: 0x673D, //CJK UNIFIED IDEOGRAPH
+ 0xD0E1: 0x55C5, //CJK UNIFIED IDEOGRAPH
+ 0xD0E2: 0x9508, //CJK UNIFIED IDEOGRAPH
+ 0xD0E3: 0x79C0, //CJK UNIFIED IDEOGRAPH
+ 0xD0E4: 0x8896, //CJK UNIFIED IDEOGRAPH
+ 0xD0E5: 0x7EE3, //CJK UNIFIED IDEOGRAPH
+ 0xD0E6: 0x589F, //CJK UNIFIED IDEOGRAPH
+ 0xD0E7: 0x620C, //CJK UNIFIED IDEOGRAPH
+ 0xD0E8: 0x9700, //CJK UNIFIED IDEOGRAPH
+ 0xD0E9: 0x865A, //CJK UNIFIED IDEOGRAPH
+ 0xD0EA: 0x5618, //CJK UNIFIED IDEOGRAPH
+ 0xD0EB: 0x987B, //CJK UNIFIED IDEOGRAPH
+ 0xD0EC: 0x5F90, //CJK UNIFIED IDEOGRAPH
+ 0xD0ED: 0x8BB8, //CJK UNIFIED IDEOGRAPH
+ 0xD0EE: 0x84C4, //CJK UNIFIED IDEOGRAPH
+ 0xD0EF: 0x9157, //CJK UNIFIED IDEOGRAPH
+ 0xD0F0: 0x53D9, //CJK UNIFIED IDEOGRAPH
+ 0xD0F1: 0x65ED, //CJK UNIFIED IDEOGRAPH
+ 0xD0F2: 0x5E8F, //CJK UNIFIED IDEOGRAPH
+ 0xD0F3: 0x755C, //CJK UNIFIED IDEOGRAPH
+ 0xD0F4: 0x6064, //CJK UNIFIED IDEOGRAPH
+ 0xD0F5: 0x7D6E, //CJK UNIFIED IDEOGRAPH
+ 0xD0F6: 0x5A7F, //CJK UNIFIED IDEOGRAPH
+ 0xD0F7: 0x7EEA, //CJK UNIFIED IDEOGRAPH
+ 0xD0F8: 0x7EED, //CJK UNIFIED IDEOGRAPH
+ 0xD0F9: 0x8F69, //CJK UNIFIED IDEOGRAPH
+ 0xD0FA: 0x55A7, //CJK UNIFIED IDEOGRAPH
+ 0xD0FB: 0x5BA3, //CJK UNIFIED IDEOGRAPH
+ 0xD0FC: 0x60AC, //CJK UNIFIED IDEOGRAPH
+ 0xD0FD: 0x65CB, //CJK UNIFIED IDEOGRAPH
+ 0xD0FE: 0x7384, //CJK UNIFIED IDEOGRAPH
+ 0xD140: 0x88AC, //CJK UNIFIED IDEOGRAPH
+ 0xD141: 0x88AE, //CJK UNIFIED IDEOGRAPH
+ 0xD142: 0x88AF, //CJK UNIFIED IDEOGRAPH
+ 0xD143: 0x88B0, //CJK UNIFIED IDEOGRAPH
+ 0xD144: 0x88B2, //CJK UNIFIED IDEOGRAPH
+ 0xD145: 0x88B3, //CJK UNIFIED IDEOGRAPH
+ 0xD146: 0x88B4, //CJK UNIFIED IDEOGRAPH
+ 0xD147: 0x88B5, //CJK UNIFIED IDEOGRAPH
+ 0xD148: 0x88B6, //CJK UNIFIED IDEOGRAPH
+ 0xD149: 0x88B8, //CJK UNIFIED IDEOGRAPH
+ 0xD14A: 0x88B9, //CJK UNIFIED IDEOGRAPH
+ 0xD14B: 0x88BA, //CJK UNIFIED IDEOGRAPH
+ 0xD14C: 0x88BB, //CJK UNIFIED IDEOGRAPH
+ 0xD14D: 0x88BD, //CJK UNIFIED IDEOGRAPH
+ 0xD14E: 0x88BE, //CJK UNIFIED IDEOGRAPH
+ 0xD14F: 0x88BF, //CJK UNIFIED IDEOGRAPH
+ 0xD150: 0x88C0, //CJK UNIFIED IDEOGRAPH
+ 0xD151: 0x88C3, //CJK UNIFIED IDEOGRAPH
+ 0xD152: 0x88C4, //CJK UNIFIED IDEOGRAPH
+ 0xD153: 0x88C7, //CJK UNIFIED IDEOGRAPH
+ 0xD154: 0x88C8, //CJK UNIFIED IDEOGRAPH
+ 0xD155: 0x88CA, //CJK UNIFIED IDEOGRAPH
+ 0xD156: 0x88CB, //CJK UNIFIED IDEOGRAPH
+ 0xD157: 0x88CC, //CJK UNIFIED IDEOGRAPH
+ 0xD158: 0x88CD, //CJK UNIFIED IDEOGRAPH
+ 0xD159: 0x88CF, //CJK UNIFIED IDEOGRAPH
+ 0xD15A: 0x88D0, //CJK UNIFIED IDEOGRAPH
+ 0xD15B: 0x88D1, //CJK UNIFIED IDEOGRAPH
+ 0xD15C: 0x88D3, //CJK UNIFIED IDEOGRAPH
+ 0xD15D: 0x88D6, //CJK UNIFIED IDEOGRAPH
+ 0xD15E: 0x88D7, //CJK UNIFIED IDEOGRAPH
+ 0xD15F: 0x88DA, //CJK UNIFIED IDEOGRAPH
+ 0xD160: 0x88DB, //CJK UNIFIED IDEOGRAPH
+ 0xD161: 0x88DC, //CJK UNIFIED IDEOGRAPH
+ 0xD162: 0x88DD, //CJK UNIFIED IDEOGRAPH
+ 0xD163: 0x88DE, //CJK UNIFIED IDEOGRAPH
+ 0xD164: 0x88E0, //CJK UNIFIED IDEOGRAPH
+ 0xD165: 0x88E1, //CJK UNIFIED IDEOGRAPH
+ 0xD166: 0x88E6, //CJK UNIFIED IDEOGRAPH
+ 0xD167: 0x88E7, //CJK UNIFIED IDEOGRAPH
+ 0xD168: 0x88E9, //CJK UNIFIED IDEOGRAPH
+ 0xD169: 0x88EA, //CJK UNIFIED IDEOGRAPH
+ 0xD16A: 0x88EB, //CJK UNIFIED IDEOGRAPH
+ 0xD16B: 0x88EC, //CJK UNIFIED IDEOGRAPH
+ 0xD16C: 0x88ED, //CJK UNIFIED IDEOGRAPH
+ 0xD16D: 0x88EE, //CJK UNIFIED IDEOGRAPH
+ 0xD16E: 0x88EF, //CJK UNIFIED IDEOGRAPH
+ 0xD16F: 0x88F2, //CJK UNIFIED IDEOGRAPH
+ 0xD170: 0x88F5, //CJK UNIFIED IDEOGRAPH
+ 0xD171: 0x88F6, //CJK UNIFIED IDEOGRAPH
+ 0xD172: 0x88F7, //CJK UNIFIED IDEOGRAPH
+ 0xD173: 0x88FA, //CJK UNIFIED IDEOGRAPH
+ 0xD174: 0x88FB, //CJK UNIFIED IDEOGRAPH
+ 0xD175: 0x88FD, //CJK UNIFIED IDEOGRAPH
+ 0xD176: 0x88FF, //CJK UNIFIED IDEOGRAPH
+ 0xD177: 0x8900, //CJK UNIFIED IDEOGRAPH
+ 0xD178: 0x8901, //CJK UNIFIED IDEOGRAPH
+ 0xD179: 0x8903, //CJK UNIFIED IDEOGRAPH
+ 0xD17A: 0x8904, //CJK UNIFIED IDEOGRAPH
+ 0xD17B: 0x8905, //CJK UNIFIED IDEOGRAPH
+ 0xD17C: 0x8906, //CJK UNIFIED IDEOGRAPH
+ 0xD17D: 0x8907, //CJK UNIFIED IDEOGRAPH
+ 0xD17E: 0x8908, //CJK UNIFIED IDEOGRAPH
+ 0xD180: 0x8909, //CJK UNIFIED IDEOGRAPH
+ 0xD181: 0x890B, //CJK UNIFIED IDEOGRAPH
+ 0xD182: 0x890C, //CJK UNIFIED IDEOGRAPH
+ 0xD183: 0x890D, //CJK UNIFIED IDEOGRAPH
+ 0xD184: 0x890E, //CJK UNIFIED IDEOGRAPH
+ 0xD185: 0x890F, //CJK UNIFIED IDEOGRAPH
+ 0xD186: 0x8911, //CJK UNIFIED IDEOGRAPH
+ 0xD187: 0x8914, //CJK UNIFIED IDEOGRAPH
+ 0xD188: 0x8915, //CJK UNIFIED IDEOGRAPH
+ 0xD189: 0x8916, //CJK UNIFIED IDEOGRAPH
+ 0xD18A: 0x8917, //CJK UNIFIED IDEOGRAPH
+ 0xD18B: 0x8918, //CJK UNIFIED IDEOGRAPH
+ 0xD18C: 0x891C, //CJK UNIFIED IDEOGRAPH
+ 0xD18D: 0x891D, //CJK UNIFIED IDEOGRAPH
+ 0xD18E: 0x891E, //CJK UNIFIED IDEOGRAPH
+ 0xD18F: 0x891F, //CJK UNIFIED IDEOGRAPH
+ 0xD190: 0x8920, //CJK UNIFIED IDEOGRAPH
+ 0xD191: 0x8922, //CJK UNIFIED IDEOGRAPH
+ 0xD192: 0x8923, //CJK UNIFIED IDEOGRAPH
+ 0xD193: 0x8924, //CJK UNIFIED IDEOGRAPH
+ 0xD194: 0x8926, //CJK UNIFIED IDEOGRAPH
+ 0xD195: 0x8927, //CJK UNIFIED IDEOGRAPH
+ 0xD196: 0x8928, //CJK UNIFIED IDEOGRAPH
+ 0xD197: 0x8929, //CJK UNIFIED IDEOGRAPH
+ 0xD198: 0x892C, //CJK UNIFIED IDEOGRAPH
+ 0xD199: 0x892D, //CJK UNIFIED IDEOGRAPH
+ 0xD19A: 0x892E, //CJK UNIFIED IDEOGRAPH
+ 0xD19B: 0x892F, //CJK UNIFIED IDEOGRAPH
+ 0xD19C: 0x8931, //CJK UNIFIED IDEOGRAPH
+ 0xD19D: 0x8932, //CJK UNIFIED IDEOGRAPH
+ 0xD19E: 0x8933, //CJK UNIFIED IDEOGRAPH
+ 0xD19F: 0x8935, //CJK UNIFIED IDEOGRAPH
+ 0xD1A0: 0x8937, //CJK UNIFIED IDEOGRAPH
+ 0xD1A1: 0x9009, //CJK UNIFIED IDEOGRAPH
+ 0xD1A2: 0x7663, //CJK UNIFIED IDEOGRAPH
+ 0xD1A3: 0x7729, //CJK UNIFIED IDEOGRAPH
+ 0xD1A4: 0x7EDA, //CJK UNIFIED IDEOGRAPH
+ 0xD1A5: 0x9774, //CJK UNIFIED IDEOGRAPH
+ 0xD1A6: 0x859B, //CJK UNIFIED IDEOGRAPH
+ 0xD1A7: 0x5B66, //CJK UNIFIED IDEOGRAPH
+ 0xD1A8: 0x7A74, //CJK UNIFIED IDEOGRAPH
+ 0xD1A9: 0x96EA, //CJK UNIFIED IDEOGRAPH
+ 0xD1AA: 0x8840, //CJK UNIFIED IDEOGRAPH
+ 0xD1AB: 0x52CB, //CJK UNIFIED IDEOGRAPH
+ 0xD1AC: 0x718F, //CJK UNIFIED IDEOGRAPH
+ 0xD1AD: 0x5FAA, //CJK UNIFIED IDEOGRAPH
+ 0xD1AE: 0x65EC, //CJK UNIFIED IDEOGRAPH
+ 0xD1AF: 0x8BE2, //CJK UNIFIED IDEOGRAPH
+ 0xD1B0: 0x5BFB, //CJK UNIFIED IDEOGRAPH
+ 0xD1B1: 0x9A6F, //CJK UNIFIED IDEOGRAPH
+ 0xD1B2: 0x5DE1, //CJK UNIFIED IDEOGRAPH
+ 0xD1B3: 0x6B89, //CJK UNIFIED IDEOGRAPH
+ 0xD1B4: 0x6C5B, //CJK UNIFIED IDEOGRAPH
+ 0xD1B5: 0x8BAD, //CJK UNIFIED IDEOGRAPH
+ 0xD1B6: 0x8BAF, //CJK UNIFIED IDEOGRAPH
+ 0xD1B7: 0x900A, //CJK UNIFIED IDEOGRAPH
+ 0xD1B8: 0x8FC5, //CJK UNIFIED IDEOGRAPH
+ 0xD1B9: 0x538B, //CJK UNIFIED IDEOGRAPH
+ 0xD1BA: 0x62BC, //CJK UNIFIED IDEOGRAPH
+ 0xD1BB: 0x9E26, //CJK UNIFIED IDEOGRAPH
+ 0xD1BC: 0x9E2D, //CJK UNIFIED IDEOGRAPH
+ 0xD1BD: 0x5440, //CJK UNIFIED IDEOGRAPH
+ 0xD1BE: 0x4E2B, //CJK UNIFIED IDEOGRAPH
+ 0xD1BF: 0x82BD, //CJK UNIFIED IDEOGRAPH
+ 0xD1C0: 0x7259, //CJK UNIFIED IDEOGRAPH
+ 0xD1C1: 0x869C, //CJK UNIFIED IDEOGRAPH
+ 0xD1C2: 0x5D16, //CJK UNIFIED IDEOGRAPH
+ 0xD1C3: 0x8859, //CJK UNIFIED IDEOGRAPH
+ 0xD1C4: 0x6DAF, //CJK UNIFIED IDEOGRAPH
+ 0xD1C5: 0x96C5, //CJK UNIFIED IDEOGRAPH
+ 0xD1C6: 0x54D1, //CJK UNIFIED IDEOGRAPH
+ 0xD1C7: 0x4E9A, //CJK UNIFIED IDEOGRAPH
+ 0xD1C8: 0x8BB6, //CJK UNIFIED IDEOGRAPH
+ 0xD1C9: 0x7109, //CJK UNIFIED IDEOGRAPH
+ 0xD1CA: 0x54BD, //CJK UNIFIED IDEOGRAPH
+ 0xD1CB: 0x9609, //CJK UNIFIED IDEOGRAPH
+ 0xD1CC: 0x70DF, //CJK UNIFIED IDEOGRAPH
+ 0xD1CD: 0x6DF9, //CJK UNIFIED IDEOGRAPH
+ 0xD1CE: 0x76D0, //CJK UNIFIED IDEOGRAPH
+ 0xD1CF: 0x4E25, //CJK UNIFIED IDEOGRAPH
+ 0xD1D0: 0x7814, //CJK UNIFIED IDEOGRAPH
+ 0xD1D1: 0x8712, //CJK UNIFIED IDEOGRAPH
+ 0xD1D2: 0x5CA9, //CJK UNIFIED IDEOGRAPH
+ 0xD1D3: 0x5EF6, //CJK UNIFIED IDEOGRAPH
+ 0xD1D4: 0x8A00, //CJK UNIFIED IDEOGRAPH
+ 0xD1D5: 0x989C, //CJK UNIFIED IDEOGRAPH
+ 0xD1D6: 0x960E, //CJK UNIFIED IDEOGRAPH
+ 0xD1D7: 0x708E, //CJK UNIFIED IDEOGRAPH
+ 0xD1D8: 0x6CBF, //CJK UNIFIED IDEOGRAPH
+ 0xD1D9: 0x5944, //CJK UNIFIED IDEOGRAPH
+ 0xD1DA: 0x63A9, //CJK UNIFIED IDEOGRAPH
+ 0xD1DB: 0x773C, //CJK UNIFIED IDEOGRAPH
+ 0xD1DC: 0x884D, //CJK UNIFIED IDEOGRAPH
+ 0xD1DD: 0x6F14, //CJK UNIFIED IDEOGRAPH
+ 0xD1DE: 0x8273, //CJK UNIFIED IDEOGRAPH
+ 0xD1DF: 0x5830, //CJK UNIFIED IDEOGRAPH
+ 0xD1E0: 0x71D5, //CJK UNIFIED IDEOGRAPH
+ 0xD1E1: 0x538C, //CJK UNIFIED IDEOGRAPH
+ 0xD1E2: 0x781A, //CJK UNIFIED IDEOGRAPH
+ 0xD1E3: 0x96C1, //CJK UNIFIED IDEOGRAPH
+ 0xD1E4: 0x5501, //CJK UNIFIED IDEOGRAPH
+ 0xD1E5: 0x5F66, //CJK UNIFIED IDEOGRAPH
+ 0xD1E6: 0x7130, //CJK UNIFIED IDEOGRAPH
+ 0xD1E7: 0x5BB4, //CJK UNIFIED IDEOGRAPH
+ 0xD1E8: 0x8C1A, //CJK UNIFIED IDEOGRAPH
+ 0xD1E9: 0x9A8C, //CJK UNIFIED IDEOGRAPH
+ 0xD1EA: 0x6B83, //CJK UNIFIED IDEOGRAPH
+ 0xD1EB: 0x592E, //CJK UNIFIED IDEOGRAPH
+ 0xD1EC: 0x9E2F, //CJK UNIFIED IDEOGRAPH
+ 0xD1ED: 0x79E7, //CJK UNIFIED IDEOGRAPH
+ 0xD1EE: 0x6768, //CJK UNIFIED IDEOGRAPH
+ 0xD1EF: 0x626C, //CJK UNIFIED IDEOGRAPH
+ 0xD1F0: 0x4F6F, //CJK UNIFIED IDEOGRAPH
+ 0xD1F1: 0x75A1, //CJK UNIFIED IDEOGRAPH
+ 0xD1F2: 0x7F8A, //CJK UNIFIED IDEOGRAPH
+ 0xD1F3: 0x6D0B, //CJK UNIFIED IDEOGRAPH
+ 0xD1F4: 0x9633, //CJK UNIFIED IDEOGRAPH
+ 0xD1F5: 0x6C27, //CJK UNIFIED IDEOGRAPH
+ 0xD1F6: 0x4EF0, //CJK UNIFIED IDEOGRAPH
+ 0xD1F7: 0x75D2, //CJK UNIFIED IDEOGRAPH
+ 0xD1F8: 0x517B, //CJK UNIFIED IDEOGRAPH
+ 0xD1F9: 0x6837, //CJK UNIFIED IDEOGRAPH
+ 0xD1FA: 0x6F3E, //CJK UNIFIED IDEOGRAPH
+ 0xD1FB: 0x9080, //CJK UNIFIED IDEOGRAPH
+ 0xD1FC: 0x8170, //CJK UNIFIED IDEOGRAPH
+ 0xD1FD: 0x5996, //CJK UNIFIED IDEOGRAPH
+ 0xD1FE: 0x7476, //CJK UNIFIED IDEOGRAPH
+ 0xD240: 0x8938, //CJK UNIFIED IDEOGRAPH
+ 0xD241: 0x8939, //CJK UNIFIED IDEOGRAPH
+ 0xD242: 0x893A, //CJK UNIFIED IDEOGRAPH
+ 0xD243: 0x893B, //CJK UNIFIED IDEOGRAPH
+ 0xD244: 0x893C, //CJK UNIFIED IDEOGRAPH
+ 0xD245: 0x893D, //CJK UNIFIED IDEOGRAPH
+ 0xD246: 0x893E, //CJK UNIFIED IDEOGRAPH
+ 0xD247: 0x893F, //CJK UNIFIED IDEOGRAPH
+ 0xD248: 0x8940, //CJK UNIFIED IDEOGRAPH
+ 0xD249: 0x8942, //CJK UNIFIED IDEOGRAPH
+ 0xD24A: 0x8943, //CJK UNIFIED IDEOGRAPH
+ 0xD24B: 0x8945, //CJK UNIFIED IDEOGRAPH
+ 0xD24C: 0x8946, //CJK UNIFIED IDEOGRAPH
+ 0xD24D: 0x8947, //CJK UNIFIED IDEOGRAPH
+ 0xD24E: 0x8948, //CJK UNIFIED IDEOGRAPH
+ 0xD24F: 0x8949, //CJK UNIFIED IDEOGRAPH
+ 0xD250: 0x894A, //CJK UNIFIED IDEOGRAPH
+ 0xD251: 0x894B, //CJK UNIFIED IDEOGRAPH
+ 0xD252: 0x894C, //CJK UNIFIED IDEOGRAPH
+ 0xD253: 0x894D, //CJK UNIFIED IDEOGRAPH
+ 0xD254: 0x894E, //CJK UNIFIED IDEOGRAPH
+ 0xD255: 0x894F, //CJK UNIFIED IDEOGRAPH
+ 0xD256: 0x8950, //CJK UNIFIED IDEOGRAPH
+ 0xD257: 0x8951, //CJK UNIFIED IDEOGRAPH
+ 0xD258: 0x8952, //CJK UNIFIED IDEOGRAPH
+ 0xD259: 0x8953, //CJK UNIFIED IDEOGRAPH
+ 0xD25A: 0x8954, //CJK UNIFIED IDEOGRAPH
+ 0xD25B: 0x8955, //CJK UNIFIED IDEOGRAPH
+ 0xD25C: 0x8956, //CJK UNIFIED IDEOGRAPH
+ 0xD25D: 0x8957, //CJK UNIFIED IDEOGRAPH
+ 0xD25E: 0x8958, //CJK UNIFIED IDEOGRAPH
+ 0xD25F: 0x8959, //CJK UNIFIED IDEOGRAPH
+ 0xD260: 0x895A, //CJK UNIFIED IDEOGRAPH
+ 0xD261: 0x895B, //CJK UNIFIED IDEOGRAPH
+ 0xD262: 0x895C, //CJK UNIFIED IDEOGRAPH
+ 0xD263: 0x895D, //CJK UNIFIED IDEOGRAPH
+ 0xD264: 0x8960, //CJK UNIFIED IDEOGRAPH
+ 0xD265: 0x8961, //CJK UNIFIED IDEOGRAPH
+ 0xD266: 0x8962, //CJK UNIFIED IDEOGRAPH
+ 0xD267: 0x8963, //CJK UNIFIED IDEOGRAPH
+ 0xD268: 0x8964, //CJK UNIFIED IDEOGRAPH
+ 0xD269: 0x8965, //CJK UNIFIED IDEOGRAPH
+ 0xD26A: 0x8967, //CJK UNIFIED IDEOGRAPH
+ 0xD26B: 0x8968, //CJK UNIFIED IDEOGRAPH
+ 0xD26C: 0x8969, //CJK UNIFIED IDEOGRAPH
+ 0xD26D: 0x896A, //CJK UNIFIED IDEOGRAPH
+ 0xD26E: 0x896B, //CJK UNIFIED IDEOGRAPH
+ 0xD26F: 0x896C, //CJK UNIFIED IDEOGRAPH
+ 0xD270: 0x896D, //CJK UNIFIED IDEOGRAPH
+ 0xD271: 0x896E, //CJK UNIFIED IDEOGRAPH
+ 0xD272: 0x896F, //CJK UNIFIED IDEOGRAPH
+ 0xD273: 0x8970, //CJK UNIFIED IDEOGRAPH
+ 0xD274: 0x8971, //CJK UNIFIED IDEOGRAPH
+ 0xD275: 0x8972, //CJK UNIFIED IDEOGRAPH
+ 0xD276: 0x8973, //CJK UNIFIED IDEOGRAPH
+ 0xD277: 0x8974, //CJK UNIFIED IDEOGRAPH
+ 0xD278: 0x8975, //CJK UNIFIED IDEOGRAPH
+ 0xD279: 0x8976, //CJK UNIFIED IDEOGRAPH
+ 0xD27A: 0x8977, //CJK UNIFIED IDEOGRAPH
+ 0xD27B: 0x8978, //CJK UNIFIED IDEOGRAPH
+ 0xD27C: 0x8979, //CJK UNIFIED IDEOGRAPH
+ 0xD27D: 0x897A, //CJK UNIFIED IDEOGRAPH
+ 0xD27E: 0x897C, //CJK UNIFIED IDEOGRAPH
+ 0xD280: 0x897D, //CJK UNIFIED IDEOGRAPH
+ 0xD281: 0x897E, //CJK UNIFIED IDEOGRAPH
+ 0xD282: 0x8980, //CJK UNIFIED IDEOGRAPH
+ 0xD283: 0x8982, //CJK UNIFIED IDEOGRAPH
+ 0xD284: 0x8984, //CJK UNIFIED IDEOGRAPH
+ 0xD285: 0x8985, //CJK UNIFIED IDEOGRAPH
+ 0xD286: 0x8987, //CJK UNIFIED IDEOGRAPH
+ 0xD287: 0x8988, //CJK UNIFIED IDEOGRAPH
+ 0xD288: 0x8989, //CJK UNIFIED IDEOGRAPH
+ 0xD289: 0x898A, //CJK UNIFIED IDEOGRAPH
+ 0xD28A: 0x898B, //CJK UNIFIED IDEOGRAPH
+ 0xD28B: 0x898C, //CJK UNIFIED IDEOGRAPH
+ 0xD28C: 0x898D, //CJK UNIFIED IDEOGRAPH
+ 0xD28D: 0x898E, //CJK UNIFIED IDEOGRAPH
+ 0xD28E: 0x898F, //CJK UNIFIED IDEOGRAPH
+ 0xD28F: 0x8990, //CJK UNIFIED IDEOGRAPH
+ 0xD290: 0x8991, //CJK UNIFIED IDEOGRAPH
+ 0xD291: 0x8992, //CJK UNIFIED IDEOGRAPH
+ 0xD292: 0x8993, //CJK UNIFIED IDEOGRAPH
+ 0xD293: 0x8994, //CJK UNIFIED IDEOGRAPH
+ 0xD294: 0x8995, //CJK UNIFIED IDEOGRAPH
+ 0xD295: 0x8996, //CJK UNIFIED IDEOGRAPH
+ 0xD296: 0x8997, //CJK UNIFIED IDEOGRAPH
+ 0xD297: 0x8998, //CJK UNIFIED IDEOGRAPH
+ 0xD298: 0x8999, //CJK UNIFIED IDEOGRAPH
+ 0xD299: 0x899A, //CJK UNIFIED IDEOGRAPH
+ 0xD29A: 0x899B, //CJK UNIFIED IDEOGRAPH
+ 0xD29B: 0x899C, //CJK UNIFIED IDEOGRAPH
+ 0xD29C: 0x899D, //CJK UNIFIED IDEOGRAPH
+ 0xD29D: 0x899E, //CJK UNIFIED IDEOGRAPH
+ 0xD29E: 0x899F, //CJK UNIFIED IDEOGRAPH
+ 0xD29F: 0x89A0, //CJK UNIFIED IDEOGRAPH
+ 0xD2A0: 0x89A1, //CJK UNIFIED IDEOGRAPH
+ 0xD2A1: 0x6447, //CJK UNIFIED IDEOGRAPH
+ 0xD2A2: 0x5C27, //CJK UNIFIED IDEOGRAPH
+ 0xD2A3: 0x9065, //CJK UNIFIED IDEOGRAPH
+ 0xD2A4: 0x7A91, //CJK UNIFIED IDEOGRAPH
+ 0xD2A5: 0x8C23, //CJK UNIFIED IDEOGRAPH
+ 0xD2A6: 0x59DA, //CJK UNIFIED IDEOGRAPH
+ 0xD2A7: 0x54AC, //CJK UNIFIED IDEOGRAPH
+ 0xD2A8: 0x8200, //CJK UNIFIED IDEOGRAPH
+ 0xD2A9: 0x836F, //CJK UNIFIED IDEOGRAPH
+ 0xD2AA: 0x8981, //CJK UNIFIED IDEOGRAPH
+ 0xD2AB: 0x8000, //CJK UNIFIED IDEOGRAPH
+ 0xD2AC: 0x6930, //CJK UNIFIED IDEOGRAPH
+ 0xD2AD: 0x564E, //CJK UNIFIED IDEOGRAPH
+ 0xD2AE: 0x8036, //CJK UNIFIED IDEOGRAPH
+ 0xD2AF: 0x7237, //CJK UNIFIED IDEOGRAPH
+ 0xD2B0: 0x91CE, //CJK UNIFIED IDEOGRAPH
+ 0xD2B1: 0x51B6, //CJK UNIFIED IDEOGRAPH
+ 0xD2B2: 0x4E5F, //CJK UNIFIED IDEOGRAPH
+ 0xD2B3: 0x9875, //CJK UNIFIED IDEOGRAPH
+ 0xD2B4: 0x6396, //CJK UNIFIED IDEOGRAPH
+ 0xD2B5: 0x4E1A, //CJK UNIFIED IDEOGRAPH
+ 0xD2B6: 0x53F6, //CJK UNIFIED IDEOGRAPH
+ 0xD2B7: 0x66F3, //CJK UNIFIED IDEOGRAPH
+ 0xD2B8: 0x814B, //CJK UNIFIED IDEOGRAPH
+ 0xD2B9: 0x591C, //CJK UNIFIED IDEOGRAPH
+ 0xD2BA: 0x6DB2, //CJK UNIFIED IDEOGRAPH
+ 0xD2BB: 0x4E00, //CJK UNIFIED IDEOGRAPH
+ 0xD2BC: 0x58F9, //CJK UNIFIED IDEOGRAPH
+ 0xD2BD: 0x533B, //CJK UNIFIED IDEOGRAPH
+ 0xD2BE: 0x63D6, //CJK UNIFIED IDEOGRAPH
+ 0xD2BF: 0x94F1, //CJK UNIFIED IDEOGRAPH
+ 0xD2C0: 0x4F9D, //CJK UNIFIED IDEOGRAPH
+ 0xD2C1: 0x4F0A, //CJK UNIFIED IDEOGRAPH
+ 0xD2C2: 0x8863, //CJK UNIFIED IDEOGRAPH
+ 0xD2C3: 0x9890, //CJK UNIFIED IDEOGRAPH
+ 0xD2C4: 0x5937, //CJK UNIFIED IDEOGRAPH
+ 0xD2C5: 0x9057, //CJK UNIFIED IDEOGRAPH
+ 0xD2C6: 0x79FB, //CJK UNIFIED IDEOGRAPH
+ 0xD2C7: 0x4EEA, //CJK UNIFIED IDEOGRAPH
+ 0xD2C8: 0x80F0, //CJK UNIFIED IDEOGRAPH
+ 0xD2C9: 0x7591, //CJK UNIFIED IDEOGRAPH
+ 0xD2CA: 0x6C82, //CJK UNIFIED IDEOGRAPH
+ 0xD2CB: 0x5B9C, //CJK UNIFIED IDEOGRAPH
+ 0xD2CC: 0x59E8, //CJK UNIFIED IDEOGRAPH
+ 0xD2CD: 0x5F5D, //CJK UNIFIED IDEOGRAPH
+ 0xD2CE: 0x6905, //CJK UNIFIED IDEOGRAPH
+ 0xD2CF: 0x8681, //CJK UNIFIED IDEOGRAPH
+ 0xD2D0: 0x501A, //CJK UNIFIED IDEOGRAPH
+ 0xD2D1: 0x5DF2, //CJK UNIFIED IDEOGRAPH
+ 0xD2D2: 0x4E59, //CJK UNIFIED IDEOGRAPH
+ 0xD2D3: 0x77E3, //CJK UNIFIED IDEOGRAPH
+ 0xD2D4: 0x4EE5, //CJK UNIFIED IDEOGRAPH
+ 0xD2D5: 0x827A, //CJK UNIFIED IDEOGRAPH
+ 0xD2D6: 0x6291, //CJK UNIFIED IDEOGRAPH
+ 0xD2D7: 0x6613, //CJK UNIFIED IDEOGRAPH
+ 0xD2D8: 0x9091, //CJK UNIFIED IDEOGRAPH
+ 0xD2D9: 0x5C79, //CJK UNIFIED IDEOGRAPH
+ 0xD2DA: 0x4EBF, //CJK UNIFIED IDEOGRAPH
+ 0xD2DB: 0x5F79, //CJK UNIFIED IDEOGRAPH
+ 0xD2DC: 0x81C6, //CJK UNIFIED IDEOGRAPH
+ 0xD2DD: 0x9038, //CJK UNIFIED IDEOGRAPH
+ 0xD2DE: 0x8084, //CJK UNIFIED IDEOGRAPH
+ 0xD2DF: 0x75AB, //CJK UNIFIED IDEOGRAPH
+ 0xD2E0: 0x4EA6, //CJK UNIFIED IDEOGRAPH
+ 0xD2E1: 0x88D4, //CJK UNIFIED IDEOGRAPH
+ 0xD2E2: 0x610F, //CJK UNIFIED IDEOGRAPH
+ 0xD2E3: 0x6BC5, //CJK UNIFIED IDEOGRAPH
+ 0xD2E4: 0x5FC6, //CJK UNIFIED IDEOGRAPH
+ 0xD2E5: 0x4E49, //CJK UNIFIED IDEOGRAPH
+ 0xD2E6: 0x76CA, //CJK UNIFIED IDEOGRAPH
+ 0xD2E7: 0x6EA2, //CJK UNIFIED IDEOGRAPH
+ 0xD2E8: 0x8BE3, //CJK UNIFIED IDEOGRAPH
+ 0xD2E9: 0x8BAE, //CJK UNIFIED IDEOGRAPH
+ 0xD2EA: 0x8C0A, //CJK UNIFIED IDEOGRAPH
+ 0xD2EB: 0x8BD1, //CJK UNIFIED IDEOGRAPH
+ 0xD2EC: 0x5F02, //CJK UNIFIED IDEOGRAPH
+ 0xD2ED: 0x7FFC, //CJK UNIFIED IDEOGRAPH
+ 0xD2EE: 0x7FCC, //CJK UNIFIED IDEOGRAPH
+ 0xD2EF: 0x7ECE, //CJK UNIFIED IDEOGRAPH
+ 0xD2F0: 0x8335, //CJK UNIFIED IDEOGRAPH
+ 0xD2F1: 0x836B, //CJK UNIFIED IDEOGRAPH
+ 0xD2F2: 0x56E0, //CJK UNIFIED IDEOGRAPH
+ 0xD2F3: 0x6BB7, //CJK UNIFIED IDEOGRAPH
+ 0xD2F4: 0x97F3, //CJK UNIFIED IDEOGRAPH
+ 0xD2F5: 0x9634, //CJK UNIFIED IDEOGRAPH
+ 0xD2F6: 0x59FB, //CJK UNIFIED IDEOGRAPH
+ 0xD2F7: 0x541F, //CJK UNIFIED IDEOGRAPH
+ 0xD2F8: 0x94F6, //CJK UNIFIED IDEOGRAPH
+ 0xD2F9: 0x6DEB, //CJK UNIFIED IDEOGRAPH
+ 0xD2FA: 0x5BC5, //CJK UNIFIED IDEOGRAPH
+ 0xD2FB: 0x996E, //CJK UNIFIED IDEOGRAPH
+ 0xD2FC: 0x5C39, //CJK UNIFIED IDEOGRAPH
+ 0xD2FD: 0x5F15, //CJK UNIFIED IDEOGRAPH
+ 0xD2FE: 0x9690, //CJK UNIFIED IDEOGRAPH
+ 0xD340: 0x89A2, //CJK UNIFIED IDEOGRAPH
+ 0xD341: 0x89A3, //CJK UNIFIED IDEOGRAPH
+ 0xD342: 0x89A4, //CJK UNIFIED IDEOGRAPH
+ 0xD343: 0x89A5, //CJK UNIFIED IDEOGRAPH
+ 0xD344: 0x89A6, //CJK UNIFIED IDEOGRAPH
+ 0xD345: 0x89A7, //CJK UNIFIED IDEOGRAPH
+ 0xD346: 0x89A8, //CJK UNIFIED IDEOGRAPH
+ 0xD347: 0x89A9, //CJK UNIFIED IDEOGRAPH
+ 0xD348: 0x89AA, //CJK UNIFIED IDEOGRAPH
+ 0xD349: 0x89AB, //CJK UNIFIED IDEOGRAPH
+ 0xD34A: 0x89AC, //CJK UNIFIED IDEOGRAPH
+ 0xD34B: 0x89AD, //CJK UNIFIED IDEOGRAPH
+ 0xD34C: 0x89AE, //CJK UNIFIED IDEOGRAPH
+ 0xD34D: 0x89AF, //CJK UNIFIED IDEOGRAPH
+ 0xD34E: 0x89B0, //CJK UNIFIED IDEOGRAPH
+ 0xD34F: 0x89B1, //CJK UNIFIED IDEOGRAPH
+ 0xD350: 0x89B2, //CJK UNIFIED IDEOGRAPH
+ 0xD351: 0x89B3, //CJK UNIFIED IDEOGRAPH
+ 0xD352: 0x89B4, //CJK UNIFIED IDEOGRAPH
+ 0xD353: 0x89B5, //CJK UNIFIED IDEOGRAPH
+ 0xD354: 0x89B6, //CJK UNIFIED IDEOGRAPH
+ 0xD355: 0x89B7, //CJK UNIFIED IDEOGRAPH
+ 0xD356: 0x89B8, //CJK UNIFIED IDEOGRAPH
+ 0xD357: 0x89B9, //CJK UNIFIED IDEOGRAPH
+ 0xD358: 0x89BA, //CJK UNIFIED IDEOGRAPH
+ 0xD359: 0x89BB, //CJK UNIFIED IDEOGRAPH
+ 0xD35A: 0x89BC, //CJK UNIFIED IDEOGRAPH
+ 0xD35B: 0x89BD, //CJK UNIFIED IDEOGRAPH
+ 0xD35C: 0x89BE, //CJK UNIFIED IDEOGRAPH
+ 0xD35D: 0x89BF, //CJK UNIFIED IDEOGRAPH
+ 0xD35E: 0x89C0, //CJK UNIFIED IDEOGRAPH
+ 0xD35F: 0x89C3, //CJK UNIFIED IDEOGRAPH
+ 0xD360: 0x89CD, //CJK UNIFIED IDEOGRAPH
+ 0xD361: 0x89D3, //CJK UNIFIED IDEOGRAPH
+ 0xD362: 0x89D4, //CJK UNIFIED IDEOGRAPH
+ 0xD363: 0x89D5, //CJK UNIFIED IDEOGRAPH
+ 0xD364: 0x89D7, //CJK UNIFIED IDEOGRAPH
+ 0xD365: 0x89D8, //CJK UNIFIED IDEOGRAPH
+ 0xD366: 0x89D9, //CJK UNIFIED IDEOGRAPH
+ 0xD367: 0x89DB, //CJK UNIFIED IDEOGRAPH
+ 0xD368: 0x89DD, //CJK UNIFIED IDEOGRAPH
+ 0xD369: 0x89DF, //CJK UNIFIED IDEOGRAPH
+ 0xD36A: 0x89E0, //CJK UNIFIED IDEOGRAPH
+ 0xD36B: 0x89E1, //CJK UNIFIED IDEOGRAPH
+ 0xD36C: 0x89E2, //CJK UNIFIED IDEOGRAPH
+ 0xD36D: 0x89E4, //CJK UNIFIED IDEOGRAPH
+ 0xD36E: 0x89E7, //CJK UNIFIED IDEOGRAPH
+ 0xD36F: 0x89E8, //CJK UNIFIED IDEOGRAPH
+ 0xD370: 0x89E9, //CJK UNIFIED IDEOGRAPH
+ 0xD371: 0x89EA, //CJK UNIFIED IDEOGRAPH
+ 0xD372: 0x89EC, //CJK UNIFIED IDEOGRAPH
+ 0xD373: 0x89ED, //CJK UNIFIED IDEOGRAPH
+ 0xD374: 0x89EE, //CJK UNIFIED IDEOGRAPH
+ 0xD375: 0x89F0, //CJK UNIFIED IDEOGRAPH
+ 0xD376: 0x89F1, //CJK UNIFIED IDEOGRAPH
+ 0xD377: 0x89F2, //CJK UNIFIED IDEOGRAPH
+ 0xD378: 0x89F4, //CJK UNIFIED IDEOGRAPH
+ 0xD379: 0x89F5, //CJK UNIFIED IDEOGRAPH
+ 0xD37A: 0x89F6, //CJK UNIFIED IDEOGRAPH
+ 0xD37B: 0x89F7, //CJK UNIFIED IDEOGRAPH
+ 0xD37C: 0x89F8, //CJK UNIFIED IDEOGRAPH
+ 0xD37D: 0x89F9, //CJK UNIFIED IDEOGRAPH
+ 0xD37E: 0x89FA, //CJK UNIFIED IDEOGRAPH
+ 0xD380: 0x89FB, //CJK UNIFIED IDEOGRAPH
+ 0xD381: 0x89FC, //CJK UNIFIED IDEOGRAPH
+ 0xD382: 0x89FD, //CJK UNIFIED IDEOGRAPH
+ 0xD383: 0x89FE, //CJK UNIFIED IDEOGRAPH
+ 0xD384: 0x89FF, //CJK UNIFIED IDEOGRAPH
+ 0xD385: 0x8A01, //CJK UNIFIED IDEOGRAPH
+ 0xD386: 0x8A02, //CJK UNIFIED IDEOGRAPH
+ 0xD387: 0x8A03, //CJK UNIFIED IDEOGRAPH
+ 0xD388: 0x8A04, //CJK UNIFIED IDEOGRAPH
+ 0xD389: 0x8A05, //CJK UNIFIED IDEOGRAPH
+ 0xD38A: 0x8A06, //CJK UNIFIED IDEOGRAPH
+ 0xD38B: 0x8A08, //CJK UNIFIED IDEOGRAPH
+ 0xD38C: 0x8A09, //CJK UNIFIED IDEOGRAPH
+ 0xD38D: 0x8A0A, //CJK UNIFIED IDEOGRAPH
+ 0xD38E: 0x8A0B, //CJK UNIFIED IDEOGRAPH
+ 0xD38F: 0x8A0C, //CJK UNIFIED IDEOGRAPH
+ 0xD390: 0x8A0D, //CJK UNIFIED IDEOGRAPH
+ 0xD391: 0x8A0E, //CJK UNIFIED IDEOGRAPH
+ 0xD392: 0x8A0F, //CJK UNIFIED IDEOGRAPH
+ 0xD393: 0x8A10, //CJK UNIFIED IDEOGRAPH
+ 0xD394: 0x8A11, //CJK UNIFIED IDEOGRAPH
+ 0xD395: 0x8A12, //CJK UNIFIED IDEOGRAPH
+ 0xD396: 0x8A13, //CJK UNIFIED IDEOGRAPH
+ 0xD397: 0x8A14, //CJK UNIFIED IDEOGRAPH
+ 0xD398: 0x8A15, //CJK UNIFIED IDEOGRAPH
+ 0xD399: 0x8A16, //CJK UNIFIED IDEOGRAPH
+ 0xD39A: 0x8A17, //CJK UNIFIED IDEOGRAPH
+ 0xD39B: 0x8A18, //CJK UNIFIED IDEOGRAPH
+ 0xD39C: 0x8A19, //CJK UNIFIED IDEOGRAPH
+ 0xD39D: 0x8A1A, //CJK UNIFIED IDEOGRAPH
+ 0xD39E: 0x8A1B, //CJK UNIFIED IDEOGRAPH
+ 0xD39F: 0x8A1C, //CJK UNIFIED IDEOGRAPH
+ 0xD3A0: 0x8A1D, //CJK UNIFIED IDEOGRAPH
+ 0xD3A1: 0x5370, //CJK UNIFIED IDEOGRAPH
+ 0xD3A2: 0x82F1, //CJK UNIFIED IDEOGRAPH
+ 0xD3A3: 0x6A31, //CJK UNIFIED IDEOGRAPH
+ 0xD3A4: 0x5A74, //CJK UNIFIED IDEOGRAPH
+ 0xD3A5: 0x9E70, //CJK UNIFIED IDEOGRAPH
+ 0xD3A6: 0x5E94, //CJK UNIFIED IDEOGRAPH
+ 0xD3A7: 0x7F28, //CJK UNIFIED IDEOGRAPH
+ 0xD3A8: 0x83B9, //CJK UNIFIED IDEOGRAPH
+ 0xD3A9: 0x8424, //CJK UNIFIED IDEOGRAPH
+ 0xD3AA: 0x8425, //CJK UNIFIED IDEOGRAPH
+ 0xD3AB: 0x8367, //CJK UNIFIED IDEOGRAPH
+ 0xD3AC: 0x8747, //CJK UNIFIED IDEOGRAPH
+ 0xD3AD: 0x8FCE, //CJK UNIFIED IDEOGRAPH
+ 0xD3AE: 0x8D62, //CJK UNIFIED IDEOGRAPH
+ 0xD3AF: 0x76C8, //CJK UNIFIED IDEOGRAPH
+ 0xD3B0: 0x5F71, //CJK UNIFIED IDEOGRAPH
+ 0xD3B1: 0x9896, //CJK UNIFIED IDEOGRAPH
+ 0xD3B2: 0x786C, //CJK UNIFIED IDEOGRAPH
+ 0xD3B3: 0x6620, //CJK UNIFIED IDEOGRAPH
+ 0xD3B4: 0x54DF, //CJK UNIFIED IDEOGRAPH
+ 0xD3B5: 0x62E5, //CJK UNIFIED IDEOGRAPH
+ 0xD3B6: 0x4F63, //CJK UNIFIED IDEOGRAPH
+ 0xD3B7: 0x81C3, //CJK UNIFIED IDEOGRAPH
+ 0xD3B8: 0x75C8, //CJK UNIFIED IDEOGRAPH
+ 0xD3B9: 0x5EB8, //CJK UNIFIED IDEOGRAPH
+ 0xD3BA: 0x96CD, //CJK UNIFIED IDEOGRAPH
+ 0xD3BB: 0x8E0A, //CJK UNIFIED IDEOGRAPH
+ 0xD3BC: 0x86F9, //CJK UNIFIED IDEOGRAPH
+ 0xD3BD: 0x548F, //CJK UNIFIED IDEOGRAPH
+ 0xD3BE: 0x6CF3, //CJK UNIFIED IDEOGRAPH
+ 0xD3BF: 0x6D8C, //CJK UNIFIED IDEOGRAPH
+ 0xD3C0: 0x6C38, //CJK UNIFIED IDEOGRAPH
+ 0xD3C1: 0x607F, //CJK UNIFIED IDEOGRAPH
+ 0xD3C2: 0x52C7, //CJK UNIFIED IDEOGRAPH
+ 0xD3C3: 0x7528, //CJK UNIFIED IDEOGRAPH
+ 0xD3C4: 0x5E7D, //CJK UNIFIED IDEOGRAPH
+ 0xD3C5: 0x4F18, //CJK UNIFIED IDEOGRAPH
+ 0xD3C6: 0x60A0, //CJK UNIFIED IDEOGRAPH
+ 0xD3C7: 0x5FE7, //CJK UNIFIED IDEOGRAPH
+ 0xD3C8: 0x5C24, //CJK UNIFIED IDEOGRAPH
+ 0xD3C9: 0x7531, //CJK UNIFIED IDEOGRAPH
+ 0xD3CA: 0x90AE, //CJK UNIFIED IDEOGRAPH
+ 0xD3CB: 0x94C0, //CJK UNIFIED IDEOGRAPH
+ 0xD3CC: 0x72B9, //CJK UNIFIED IDEOGRAPH
+ 0xD3CD: 0x6CB9, //CJK UNIFIED IDEOGRAPH
+ 0xD3CE: 0x6E38, //CJK UNIFIED IDEOGRAPH
+ 0xD3CF: 0x9149, //CJK UNIFIED IDEOGRAPH
+ 0xD3D0: 0x6709, //CJK UNIFIED IDEOGRAPH
+ 0xD3D1: 0x53CB, //CJK UNIFIED IDEOGRAPH
+ 0xD3D2: 0x53F3, //CJK UNIFIED IDEOGRAPH
+ 0xD3D3: 0x4F51, //CJK UNIFIED IDEOGRAPH
+ 0xD3D4: 0x91C9, //CJK UNIFIED IDEOGRAPH
+ 0xD3D5: 0x8BF1, //CJK UNIFIED IDEOGRAPH
+ 0xD3D6: 0x53C8, //CJK UNIFIED IDEOGRAPH
+ 0xD3D7: 0x5E7C, //CJK UNIFIED IDEOGRAPH
+ 0xD3D8: 0x8FC2, //CJK UNIFIED IDEOGRAPH
+ 0xD3D9: 0x6DE4, //CJK UNIFIED IDEOGRAPH
+ 0xD3DA: 0x4E8E, //CJK UNIFIED IDEOGRAPH
+ 0xD3DB: 0x76C2, //CJK UNIFIED IDEOGRAPH
+ 0xD3DC: 0x6986, //CJK UNIFIED IDEOGRAPH
+ 0xD3DD: 0x865E, //CJK UNIFIED IDEOGRAPH
+ 0xD3DE: 0x611A, //CJK UNIFIED IDEOGRAPH
+ 0xD3DF: 0x8206, //CJK UNIFIED IDEOGRAPH
+ 0xD3E0: 0x4F59, //CJK UNIFIED IDEOGRAPH
+ 0xD3E1: 0x4FDE, //CJK UNIFIED IDEOGRAPH
+ 0xD3E2: 0x903E, //CJK UNIFIED IDEOGRAPH
+ 0xD3E3: 0x9C7C, //CJK UNIFIED IDEOGRAPH
+ 0xD3E4: 0x6109, //CJK UNIFIED IDEOGRAPH
+ 0xD3E5: 0x6E1D, //CJK UNIFIED IDEOGRAPH
+ 0xD3E6: 0x6E14, //CJK UNIFIED IDEOGRAPH
+ 0xD3E7: 0x9685, //CJK UNIFIED IDEOGRAPH
+ 0xD3E8: 0x4E88, //CJK UNIFIED IDEOGRAPH
+ 0xD3E9: 0x5A31, //CJK UNIFIED IDEOGRAPH
+ 0xD3EA: 0x96E8, //CJK UNIFIED IDEOGRAPH
+ 0xD3EB: 0x4E0E, //CJK UNIFIED IDEOGRAPH
+ 0xD3EC: 0x5C7F, //CJK UNIFIED IDEOGRAPH
+ 0xD3ED: 0x79B9, //CJK UNIFIED IDEOGRAPH
+ 0xD3EE: 0x5B87, //CJK UNIFIED IDEOGRAPH
+ 0xD3EF: 0x8BED, //CJK UNIFIED IDEOGRAPH
+ 0xD3F0: 0x7FBD, //CJK UNIFIED IDEOGRAPH
+ 0xD3F1: 0x7389, //CJK UNIFIED IDEOGRAPH
+ 0xD3F2: 0x57DF, //CJK UNIFIED IDEOGRAPH
+ 0xD3F3: 0x828B, //CJK UNIFIED IDEOGRAPH
+ 0xD3F4: 0x90C1, //CJK UNIFIED IDEOGRAPH
+ 0xD3F5: 0x5401, //CJK UNIFIED IDEOGRAPH
+ 0xD3F6: 0x9047, //CJK UNIFIED IDEOGRAPH
+ 0xD3F7: 0x55BB, //CJK UNIFIED IDEOGRAPH
+ 0xD3F8: 0x5CEA, //CJK UNIFIED IDEOGRAPH
+ 0xD3F9: 0x5FA1, //CJK UNIFIED IDEOGRAPH
+ 0xD3FA: 0x6108, //CJK UNIFIED IDEOGRAPH
+ 0xD3FB: 0x6B32, //CJK UNIFIED IDEOGRAPH
+ 0xD3FC: 0x72F1, //CJK UNIFIED IDEOGRAPH
+ 0xD3FD: 0x80B2, //CJK UNIFIED IDEOGRAPH
+ 0xD3FE: 0x8A89, //CJK UNIFIED IDEOGRAPH
+ 0xD440: 0x8A1E, //CJK UNIFIED IDEOGRAPH
+ 0xD441: 0x8A1F, //CJK UNIFIED IDEOGRAPH
+ 0xD442: 0x8A20, //CJK UNIFIED IDEOGRAPH
+ 0xD443: 0x8A21, //CJK UNIFIED IDEOGRAPH
+ 0xD444: 0x8A22, //CJK UNIFIED IDEOGRAPH
+ 0xD445: 0x8A23, //CJK UNIFIED IDEOGRAPH
+ 0xD446: 0x8A24, //CJK UNIFIED IDEOGRAPH
+ 0xD447: 0x8A25, //CJK UNIFIED IDEOGRAPH
+ 0xD448: 0x8A26, //CJK UNIFIED IDEOGRAPH
+ 0xD449: 0x8A27, //CJK UNIFIED IDEOGRAPH
+ 0xD44A: 0x8A28, //CJK UNIFIED IDEOGRAPH
+ 0xD44B: 0x8A29, //CJK UNIFIED IDEOGRAPH
+ 0xD44C: 0x8A2A, //CJK UNIFIED IDEOGRAPH
+ 0xD44D: 0x8A2B, //CJK UNIFIED IDEOGRAPH
+ 0xD44E: 0x8A2C, //CJK UNIFIED IDEOGRAPH
+ 0xD44F: 0x8A2D, //CJK UNIFIED IDEOGRAPH
+ 0xD450: 0x8A2E, //CJK UNIFIED IDEOGRAPH
+ 0xD451: 0x8A2F, //CJK UNIFIED IDEOGRAPH
+ 0xD452: 0x8A30, //CJK UNIFIED IDEOGRAPH
+ 0xD453: 0x8A31, //CJK UNIFIED IDEOGRAPH
+ 0xD454: 0x8A32, //CJK UNIFIED IDEOGRAPH
+ 0xD455: 0x8A33, //CJK UNIFIED IDEOGRAPH
+ 0xD456: 0x8A34, //CJK UNIFIED IDEOGRAPH
+ 0xD457: 0x8A35, //CJK UNIFIED IDEOGRAPH
+ 0xD458: 0x8A36, //CJK UNIFIED IDEOGRAPH
+ 0xD459: 0x8A37, //CJK UNIFIED IDEOGRAPH
+ 0xD45A: 0x8A38, //CJK UNIFIED IDEOGRAPH
+ 0xD45B: 0x8A39, //CJK UNIFIED IDEOGRAPH
+ 0xD45C: 0x8A3A, //CJK UNIFIED IDEOGRAPH
+ 0xD45D: 0x8A3B, //CJK UNIFIED IDEOGRAPH
+ 0xD45E: 0x8A3C, //CJK UNIFIED IDEOGRAPH
+ 0xD45F: 0x8A3D, //CJK UNIFIED IDEOGRAPH
+ 0xD460: 0x8A3F, //CJK UNIFIED IDEOGRAPH
+ 0xD461: 0x8A40, //CJK UNIFIED IDEOGRAPH
+ 0xD462: 0x8A41, //CJK UNIFIED IDEOGRAPH
+ 0xD463: 0x8A42, //CJK UNIFIED IDEOGRAPH
+ 0xD464: 0x8A43, //CJK UNIFIED IDEOGRAPH
+ 0xD465: 0x8A44, //CJK UNIFIED IDEOGRAPH
+ 0xD466: 0x8A45, //CJK UNIFIED IDEOGRAPH
+ 0xD467: 0x8A46, //CJK UNIFIED IDEOGRAPH
+ 0xD468: 0x8A47, //CJK UNIFIED IDEOGRAPH
+ 0xD469: 0x8A49, //CJK UNIFIED IDEOGRAPH
+ 0xD46A: 0x8A4A, //CJK UNIFIED IDEOGRAPH
+ 0xD46B: 0x8A4B, //CJK UNIFIED IDEOGRAPH
+ 0xD46C: 0x8A4C, //CJK UNIFIED IDEOGRAPH
+ 0xD46D: 0x8A4D, //CJK UNIFIED IDEOGRAPH
+ 0xD46E: 0x8A4E, //CJK UNIFIED IDEOGRAPH
+ 0xD46F: 0x8A4F, //CJK UNIFIED IDEOGRAPH
+ 0xD470: 0x8A50, //CJK UNIFIED IDEOGRAPH
+ 0xD471: 0x8A51, //CJK UNIFIED IDEOGRAPH
+ 0xD472: 0x8A52, //CJK UNIFIED IDEOGRAPH
+ 0xD473: 0x8A53, //CJK UNIFIED IDEOGRAPH
+ 0xD474: 0x8A54, //CJK UNIFIED IDEOGRAPH
+ 0xD475: 0x8A55, //CJK UNIFIED IDEOGRAPH
+ 0xD476: 0x8A56, //CJK UNIFIED IDEOGRAPH
+ 0xD477: 0x8A57, //CJK UNIFIED IDEOGRAPH
+ 0xD478: 0x8A58, //CJK UNIFIED IDEOGRAPH
+ 0xD479: 0x8A59, //CJK UNIFIED IDEOGRAPH
+ 0xD47A: 0x8A5A, //CJK UNIFIED IDEOGRAPH
+ 0xD47B: 0x8A5B, //CJK UNIFIED IDEOGRAPH
+ 0xD47C: 0x8A5C, //CJK UNIFIED IDEOGRAPH
+ 0xD47D: 0x8A5D, //CJK UNIFIED IDEOGRAPH
+ 0xD47E: 0x8A5E, //CJK UNIFIED IDEOGRAPH
+ 0xD480: 0x8A5F, //CJK UNIFIED IDEOGRAPH
+ 0xD481: 0x8A60, //CJK UNIFIED IDEOGRAPH
+ 0xD482: 0x8A61, //CJK UNIFIED IDEOGRAPH
+ 0xD483: 0x8A62, //CJK UNIFIED IDEOGRAPH
+ 0xD484: 0x8A63, //CJK UNIFIED IDEOGRAPH
+ 0xD485: 0x8A64, //CJK UNIFIED IDEOGRAPH
+ 0xD486: 0x8A65, //CJK UNIFIED IDEOGRAPH
+ 0xD487: 0x8A66, //CJK UNIFIED IDEOGRAPH
+ 0xD488: 0x8A67, //CJK UNIFIED IDEOGRAPH
+ 0xD489: 0x8A68, //CJK UNIFIED IDEOGRAPH
+ 0xD48A: 0x8A69, //CJK UNIFIED IDEOGRAPH
+ 0xD48B: 0x8A6A, //CJK UNIFIED IDEOGRAPH
+ 0xD48C: 0x8A6B, //CJK UNIFIED IDEOGRAPH
+ 0xD48D: 0x8A6C, //CJK UNIFIED IDEOGRAPH
+ 0xD48E: 0x8A6D, //CJK UNIFIED IDEOGRAPH
+ 0xD48F: 0x8A6E, //CJK UNIFIED IDEOGRAPH
+ 0xD490: 0x8A6F, //CJK UNIFIED IDEOGRAPH
+ 0xD491: 0x8A70, //CJK UNIFIED IDEOGRAPH
+ 0xD492: 0x8A71, //CJK UNIFIED IDEOGRAPH
+ 0xD493: 0x8A72, //CJK UNIFIED IDEOGRAPH
+ 0xD494: 0x8A73, //CJK UNIFIED IDEOGRAPH
+ 0xD495: 0x8A74, //CJK UNIFIED IDEOGRAPH
+ 0xD496: 0x8A75, //CJK UNIFIED IDEOGRAPH
+ 0xD497: 0x8A76, //CJK UNIFIED IDEOGRAPH
+ 0xD498: 0x8A77, //CJK UNIFIED IDEOGRAPH
+ 0xD499: 0x8A78, //CJK UNIFIED IDEOGRAPH
+ 0xD49A: 0x8A7A, //CJK UNIFIED IDEOGRAPH
+ 0xD49B: 0x8A7B, //CJK UNIFIED IDEOGRAPH
+ 0xD49C: 0x8A7C, //CJK UNIFIED IDEOGRAPH
+ 0xD49D: 0x8A7D, //CJK UNIFIED IDEOGRAPH
+ 0xD49E: 0x8A7E, //CJK UNIFIED IDEOGRAPH
+ 0xD49F: 0x8A7F, //CJK UNIFIED IDEOGRAPH
+ 0xD4A0: 0x8A80, //CJK UNIFIED IDEOGRAPH
+ 0xD4A1: 0x6D74, //CJK UNIFIED IDEOGRAPH
+ 0xD4A2: 0x5BD3, //CJK UNIFIED IDEOGRAPH
+ 0xD4A3: 0x88D5, //CJK UNIFIED IDEOGRAPH
+ 0xD4A4: 0x9884, //CJK UNIFIED IDEOGRAPH
+ 0xD4A5: 0x8C6B, //CJK UNIFIED IDEOGRAPH
+ 0xD4A6: 0x9A6D, //CJK UNIFIED IDEOGRAPH
+ 0xD4A7: 0x9E33, //CJK UNIFIED IDEOGRAPH
+ 0xD4A8: 0x6E0A, //CJK UNIFIED IDEOGRAPH
+ 0xD4A9: 0x51A4, //CJK UNIFIED IDEOGRAPH
+ 0xD4AA: 0x5143, //CJK UNIFIED IDEOGRAPH
+ 0xD4AB: 0x57A3, //CJK UNIFIED IDEOGRAPH
+ 0xD4AC: 0x8881, //CJK UNIFIED IDEOGRAPH
+ 0xD4AD: 0x539F, //CJK UNIFIED IDEOGRAPH
+ 0xD4AE: 0x63F4, //CJK UNIFIED IDEOGRAPH
+ 0xD4AF: 0x8F95, //CJK UNIFIED IDEOGRAPH
+ 0xD4B0: 0x56ED, //CJK UNIFIED IDEOGRAPH
+ 0xD4B1: 0x5458, //CJK UNIFIED IDEOGRAPH
+ 0xD4B2: 0x5706, //CJK UNIFIED IDEOGRAPH
+ 0xD4B3: 0x733F, //CJK UNIFIED IDEOGRAPH
+ 0xD4B4: 0x6E90, //CJK UNIFIED IDEOGRAPH
+ 0xD4B5: 0x7F18, //CJK UNIFIED IDEOGRAPH
+ 0xD4B6: 0x8FDC, //CJK UNIFIED IDEOGRAPH
+ 0xD4B7: 0x82D1, //CJK UNIFIED IDEOGRAPH
+ 0xD4B8: 0x613F, //CJK UNIFIED IDEOGRAPH
+ 0xD4B9: 0x6028, //CJK UNIFIED IDEOGRAPH
+ 0xD4BA: 0x9662, //CJK UNIFIED IDEOGRAPH
+ 0xD4BB: 0x66F0, //CJK UNIFIED IDEOGRAPH
+ 0xD4BC: 0x7EA6, //CJK UNIFIED IDEOGRAPH
+ 0xD4BD: 0x8D8A, //CJK UNIFIED IDEOGRAPH
+ 0xD4BE: 0x8DC3, //CJK UNIFIED IDEOGRAPH
+ 0xD4BF: 0x94A5, //CJK UNIFIED IDEOGRAPH
+ 0xD4C0: 0x5CB3, //CJK UNIFIED IDEOGRAPH
+ 0xD4C1: 0x7CA4, //CJK UNIFIED IDEOGRAPH
+ 0xD4C2: 0x6708, //CJK UNIFIED IDEOGRAPH
+ 0xD4C3: 0x60A6, //CJK UNIFIED IDEOGRAPH
+ 0xD4C4: 0x9605, //CJK UNIFIED IDEOGRAPH
+ 0xD4C5: 0x8018, //CJK UNIFIED IDEOGRAPH
+ 0xD4C6: 0x4E91, //CJK UNIFIED IDEOGRAPH
+ 0xD4C7: 0x90E7, //CJK UNIFIED IDEOGRAPH
+ 0xD4C8: 0x5300, //CJK UNIFIED IDEOGRAPH
+ 0xD4C9: 0x9668, //CJK UNIFIED IDEOGRAPH
+ 0xD4CA: 0x5141, //CJK UNIFIED IDEOGRAPH
+ 0xD4CB: 0x8FD0, //CJK UNIFIED IDEOGRAPH
+ 0xD4CC: 0x8574, //CJK UNIFIED IDEOGRAPH
+ 0xD4CD: 0x915D, //CJK UNIFIED IDEOGRAPH
+ 0xD4CE: 0x6655, //CJK UNIFIED IDEOGRAPH
+ 0xD4CF: 0x97F5, //CJK UNIFIED IDEOGRAPH
+ 0xD4D0: 0x5B55, //CJK UNIFIED IDEOGRAPH
+ 0xD4D1: 0x531D, //CJK UNIFIED IDEOGRAPH
+ 0xD4D2: 0x7838, //CJK UNIFIED IDEOGRAPH
+ 0xD4D3: 0x6742, //CJK UNIFIED IDEOGRAPH
+ 0xD4D4: 0x683D, //CJK UNIFIED IDEOGRAPH
+ 0xD4D5: 0x54C9, //CJK UNIFIED IDEOGRAPH
+ 0xD4D6: 0x707E, //CJK UNIFIED IDEOGRAPH
+ 0xD4D7: 0x5BB0, //CJK UNIFIED IDEOGRAPH
+ 0xD4D8: 0x8F7D, //CJK UNIFIED IDEOGRAPH
+ 0xD4D9: 0x518D, //CJK UNIFIED IDEOGRAPH
+ 0xD4DA: 0x5728, //CJK UNIFIED IDEOGRAPH
+ 0xD4DB: 0x54B1, //CJK UNIFIED IDEOGRAPH
+ 0xD4DC: 0x6512, //CJK UNIFIED IDEOGRAPH
+ 0xD4DD: 0x6682, //CJK UNIFIED IDEOGRAPH
+ 0xD4DE: 0x8D5E, //CJK UNIFIED IDEOGRAPH
+ 0xD4DF: 0x8D43, //CJK UNIFIED IDEOGRAPH
+ 0xD4E0: 0x810F, //CJK UNIFIED IDEOGRAPH
+ 0xD4E1: 0x846C, //CJK UNIFIED IDEOGRAPH
+ 0xD4E2: 0x906D, //CJK UNIFIED IDEOGRAPH
+ 0xD4E3: 0x7CDF, //CJK UNIFIED IDEOGRAPH
+ 0xD4E4: 0x51FF, //CJK UNIFIED IDEOGRAPH
+ 0xD4E5: 0x85FB, //CJK UNIFIED IDEOGRAPH
+ 0xD4E6: 0x67A3, //CJK UNIFIED IDEOGRAPH
+ 0xD4E7: 0x65E9, //CJK UNIFIED IDEOGRAPH
+ 0xD4E8: 0x6FA1, //CJK UNIFIED IDEOGRAPH
+ 0xD4E9: 0x86A4, //CJK UNIFIED IDEOGRAPH
+ 0xD4EA: 0x8E81, //CJK UNIFIED IDEOGRAPH
+ 0xD4EB: 0x566A, //CJK UNIFIED IDEOGRAPH
+ 0xD4EC: 0x9020, //CJK UNIFIED IDEOGRAPH
+ 0xD4ED: 0x7682, //CJK UNIFIED IDEOGRAPH
+ 0xD4EE: 0x7076, //CJK UNIFIED IDEOGRAPH
+ 0xD4EF: 0x71E5, //CJK UNIFIED IDEOGRAPH
+ 0xD4F0: 0x8D23, //CJK UNIFIED IDEOGRAPH
+ 0xD4F1: 0x62E9, //CJK UNIFIED IDEOGRAPH
+ 0xD4F2: 0x5219, //CJK UNIFIED IDEOGRAPH
+ 0xD4F3: 0x6CFD, //CJK UNIFIED IDEOGRAPH
+ 0xD4F4: 0x8D3C, //CJK UNIFIED IDEOGRAPH
+ 0xD4F5: 0x600E, //CJK UNIFIED IDEOGRAPH
+ 0xD4F6: 0x589E, //CJK UNIFIED IDEOGRAPH
+ 0xD4F7: 0x618E, //CJK UNIFIED IDEOGRAPH
+ 0xD4F8: 0x66FE, //CJK UNIFIED IDEOGRAPH
+ 0xD4F9: 0x8D60, //CJK UNIFIED IDEOGRAPH
+ 0xD4FA: 0x624E, //CJK UNIFIED IDEOGRAPH
+ 0xD4FB: 0x55B3, //CJK UNIFIED IDEOGRAPH
+ 0xD4FC: 0x6E23, //CJK UNIFIED IDEOGRAPH
+ 0xD4FD: 0x672D, //CJK UNIFIED IDEOGRAPH
+ 0xD4FE: 0x8F67, //CJK UNIFIED IDEOGRAPH
+ 0xD540: 0x8A81, //CJK UNIFIED IDEOGRAPH
+ 0xD541: 0x8A82, //CJK UNIFIED IDEOGRAPH
+ 0xD542: 0x8A83, //CJK UNIFIED IDEOGRAPH
+ 0xD543: 0x8A84, //CJK UNIFIED IDEOGRAPH
+ 0xD544: 0x8A85, //CJK UNIFIED IDEOGRAPH
+ 0xD545: 0x8A86, //CJK UNIFIED IDEOGRAPH
+ 0xD546: 0x8A87, //CJK UNIFIED IDEOGRAPH
+ 0xD547: 0x8A88, //CJK UNIFIED IDEOGRAPH
+ 0xD548: 0x8A8B, //CJK UNIFIED IDEOGRAPH
+ 0xD549: 0x8A8C, //CJK UNIFIED IDEOGRAPH
+ 0xD54A: 0x8A8D, //CJK UNIFIED IDEOGRAPH
+ 0xD54B: 0x8A8E, //CJK UNIFIED IDEOGRAPH
+ 0xD54C: 0x8A8F, //CJK UNIFIED IDEOGRAPH
+ 0xD54D: 0x8A90, //CJK UNIFIED IDEOGRAPH
+ 0xD54E: 0x8A91, //CJK UNIFIED IDEOGRAPH
+ 0xD54F: 0x8A92, //CJK UNIFIED IDEOGRAPH
+ 0xD550: 0x8A94, //CJK UNIFIED IDEOGRAPH
+ 0xD551: 0x8A95, //CJK UNIFIED IDEOGRAPH
+ 0xD552: 0x8A96, //CJK UNIFIED IDEOGRAPH
+ 0xD553: 0x8A97, //CJK UNIFIED IDEOGRAPH
+ 0xD554: 0x8A98, //CJK UNIFIED IDEOGRAPH
+ 0xD555: 0x8A99, //CJK UNIFIED IDEOGRAPH
+ 0xD556: 0x8A9A, //CJK UNIFIED IDEOGRAPH
+ 0xD557: 0x8A9B, //CJK UNIFIED IDEOGRAPH
+ 0xD558: 0x8A9C, //CJK UNIFIED IDEOGRAPH
+ 0xD559: 0x8A9D, //CJK UNIFIED IDEOGRAPH
+ 0xD55A: 0x8A9E, //CJK UNIFIED IDEOGRAPH
+ 0xD55B: 0x8A9F, //CJK UNIFIED IDEOGRAPH
+ 0xD55C: 0x8AA0, //CJK UNIFIED IDEOGRAPH
+ 0xD55D: 0x8AA1, //CJK UNIFIED IDEOGRAPH
+ 0xD55E: 0x8AA2, //CJK UNIFIED IDEOGRAPH
+ 0xD55F: 0x8AA3, //CJK UNIFIED IDEOGRAPH
+ 0xD560: 0x8AA4, //CJK UNIFIED IDEOGRAPH
+ 0xD561: 0x8AA5, //CJK UNIFIED IDEOGRAPH
+ 0xD562: 0x8AA6, //CJK UNIFIED IDEOGRAPH
+ 0xD563: 0x8AA7, //CJK UNIFIED IDEOGRAPH
+ 0xD564: 0x8AA8, //CJK UNIFIED IDEOGRAPH
+ 0xD565: 0x8AA9, //CJK UNIFIED IDEOGRAPH
+ 0xD566: 0x8AAA, //CJK UNIFIED IDEOGRAPH
+ 0xD567: 0x8AAB, //CJK UNIFIED IDEOGRAPH
+ 0xD568: 0x8AAC, //CJK UNIFIED IDEOGRAPH
+ 0xD569: 0x8AAD, //CJK UNIFIED IDEOGRAPH
+ 0xD56A: 0x8AAE, //CJK UNIFIED IDEOGRAPH
+ 0xD56B: 0x8AAF, //CJK UNIFIED IDEOGRAPH
+ 0xD56C: 0x8AB0, //CJK UNIFIED IDEOGRAPH
+ 0xD56D: 0x8AB1, //CJK UNIFIED IDEOGRAPH
+ 0xD56E: 0x8AB2, //CJK UNIFIED IDEOGRAPH
+ 0xD56F: 0x8AB3, //CJK UNIFIED IDEOGRAPH
+ 0xD570: 0x8AB4, //CJK UNIFIED IDEOGRAPH
+ 0xD571: 0x8AB5, //CJK UNIFIED IDEOGRAPH
+ 0xD572: 0x8AB6, //CJK UNIFIED IDEOGRAPH
+ 0xD573: 0x8AB7, //CJK UNIFIED IDEOGRAPH
+ 0xD574: 0x8AB8, //CJK UNIFIED IDEOGRAPH
+ 0xD575: 0x8AB9, //CJK UNIFIED IDEOGRAPH
+ 0xD576: 0x8ABA, //CJK UNIFIED IDEOGRAPH
+ 0xD577: 0x8ABB, //CJK UNIFIED IDEOGRAPH
+ 0xD578: 0x8ABC, //CJK UNIFIED IDEOGRAPH
+ 0xD579: 0x8ABD, //CJK UNIFIED IDEOGRAPH
+ 0xD57A: 0x8ABE, //CJK UNIFIED IDEOGRAPH
+ 0xD57B: 0x8ABF, //CJK UNIFIED IDEOGRAPH
+ 0xD57C: 0x8AC0, //CJK UNIFIED IDEOGRAPH
+ 0xD57D: 0x8AC1, //CJK UNIFIED IDEOGRAPH
+ 0xD57E: 0x8AC2, //CJK UNIFIED IDEOGRAPH
+ 0xD580: 0x8AC3, //CJK UNIFIED IDEOGRAPH
+ 0xD581: 0x8AC4, //CJK UNIFIED IDEOGRAPH
+ 0xD582: 0x8AC5, //CJK UNIFIED IDEOGRAPH
+ 0xD583: 0x8AC6, //CJK UNIFIED IDEOGRAPH
+ 0xD584: 0x8AC7, //CJK UNIFIED IDEOGRAPH
+ 0xD585: 0x8AC8, //CJK UNIFIED IDEOGRAPH
+ 0xD586: 0x8AC9, //CJK UNIFIED IDEOGRAPH
+ 0xD587: 0x8ACA, //CJK UNIFIED IDEOGRAPH
+ 0xD588: 0x8ACB, //CJK UNIFIED IDEOGRAPH
+ 0xD589: 0x8ACC, //CJK UNIFIED IDEOGRAPH
+ 0xD58A: 0x8ACD, //CJK UNIFIED IDEOGRAPH
+ 0xD58B: 0x8ACE, //CJK UNIFIED IDEOGRAPH
+ 0xD58C: 0x8ACF, //CJK UNIFIED IDEOGRAPH
+ 0xD58D: 0x8AD0, //CJK UNIFIED IDEOGRAPH
+ 0xD58E: 0x8AD1, //CJK UNIFIED IDEOGRAPH
+ 0xD58F: 0x8AD2, //CJK UNIFIED IDEOGRAPH
+ 0xD590: 0x8AD3, //CJK UNIFIED IDEOGRAPH
+ 0xD591: 0x8AD4, //CJK UNIFIED IDEOGRAPH
+ 0xD592: 0x8AD5, //CJK UNIFIED IDEOGRAPH
+ 0xD593: 0x8AD6, //CJK UNIFIED IDEOGRAPH
+ 0xD594: 0x8AD7, //CJK UNIFIED IDEOGRAPH
+ 0xD595: 0x8AD8, //CJK UNIFIED IDEOGRAPH
+ 0xD596: 0x8AD9, //CJK UNIFIED IDEOGRAPH
+ 0xD597: 0x8ADA, //CJK UNIFIED IDEOGRAPH
+ 0xD598: 0x8ADB, //CJK UNIFIED IDEOGRAPH
+ 0xD599: 0x8ADC, //CJK UNIFIED IDEOGRAPH
+ 0xD59A: 0x8ADD, //CJK UNIFIED IDEOGRAPH
+ 0xD59B: 0x8ADE, //CJK UNIFIED IDEOGRAPH
+ 0xD59C: 0x8ADF, //CJK UNIFIED IDEOGRAPH
+ 0xD59D: 0x8AE0, //CJK UNIFIED IDEOGRAPH
+ 0xD59E: 0x8AE1, //CJK UNIFIED IDEOGRAPH
+ 0xD59F: 0x8AE2, //CJK UNIFIED IDEOGRAPH
+ 0xD5A0: 0x8AE3, //CJK UNIFIED IDEOGRAPH
+ 0xD5A1: 0x94E1, //CJK UNIFIED IDEOGRAPH
+ 0xD5A2: 0x95F8, //CJK UNIFIED IDEOGRAPH
+ 0xD5A3: 0x7728, //CJK UNIFIED IDEOGRAPH
+ 0xD5A4: 0x6805, //CJK UNIFIED IDEOGRAPH
+ 0xD5A5: 0x69A8, //CJK UNIFIED IDEOGRAPH
+ 0xD5A6: 0x548B, //CJK UNIFIED IDEOGRAPH
+ 0xD5A7: 0x4E4D, //CJK UNIFIED IDEOGRAPH
+ 0xD5A8: 0x70B8, //CJK UNIFIED IDEOGRAPH
+ 0xD5A9: 0x8BC8, //CJK UNIFIED IDEOGRAPH
+ 0xD5AA: 0x6458, //CJK UNIFIED IDEOGRAPH
+ 0xD5AB: 0x658B, //CJK UNIFIED IDEOGRAPH
+ 0xD5AC: 0x5B85, //CJK UNIFIED IDEOGRAPH
+ 0xD5AD: 0x7A84, //CJK UNIFIED IDEOGRAPH
+ 0xD5AE: 0x503A, //CJK UNIFIED IDEOGRAPH
+ 0xD5AF: 0x5BE8, //CJK UNIFIED IDEOGRAPH
+ 0xD5B0: 0x77BB, //CJK UNIFIED IDEOGRAPH
+ 0xD5B1: 0x6BE1, //CJK UNIFIED IDEOGRAPH
+ 0xD5B2: 0x8A79, //CJK UNIFIED IDEOGRAPH
+ 0xD5B3: 0x7C98, //CJK UNIFIED IDEOGRAPH
+ 0xD5B4: 0x6CBE, //CJK UNIFIED IDEOGRAPH
+ 0xD5B5: 0x76CF, //CJK UNIFIED IDEOGRAPH
+ 0xD5B6: 0x65A9, //CJK UNIFIED IDEOGRAPH
+ 0xD5B7: 0x8F97, //CJK UNIFIED IDEOGRAPH
+ 0xD5B8: 0x5D2D, //CJK UNIFIED IDEOGRAPH
+ 0xD5B9: 0x5C55, //CJK UNIFIED IDEOGRAPH
+ 0xD5BA: 0x8638, //CJK UNIFIED IDEOGRAPH
+ 0xD5BB: 0x6808, //CJK UNIFIED IDEOGRAPH
+ 0xD5BC: 0x5360, //CJK UNIFIED IDEOGRAPH
+ 0xD5BD: 0x6218, //CJK UNIFIED IDEOGRAPH
+ 0xD5BE: 0x7AD9, //CJK UNIFIED IDEOGRAPH
+ 0xD5BF: 0x6E5B, //CJK UNIFIED IDEOGRAPH
+ 0xD5C0: 0x7EFD, //CJK UNIFIED IDEOGRAPH
+ 0xD5C1: 0x6A1F, //CJK UNIFIED IDEOGRAPH
+ 0xD5C2: 0x7AE0, //CJK UNIFIED IDEOGRAPH
+ 0xD5C3: 0x5F70, //CJK UNIFIED IDEOGRAPH
+ 0xD5C4: 0x6F33, //CJK UNIFIED IDEOGRAPH
+ 0xD5C5: 0x5F20, //CJK UNIFIED IDEOGRAPH
+ 0xD5C6: 0x638C, //CJK UNIFIED IDEOGRAPH
+ 0xD5C7: 0x6DA8, //CJK UNIFIED IDEOGRAPH
+ 0xD5C8: 0x6756, //CJK UNIFIED IDEOGRAPH
+ 0xD5C9: 0x4E08, //CJK UNIFIED IDEOGRAPH
+ 0xD5CA: 0x5E10, //CJK UNIFIED IDEOGRAPH
+ 0xD5CB: 0x8D26, //CJK UNIFIED IDEOGRAPH
+ 0xD5CC: 0x4ED7, //CJK UNIFIED IDEOGRAPH
+ 0xD5CD: 0x80C0, //CJK UNIFIED IDEOGRAPH
+ 0xD5CE: 0x7634, //CJK UNIFIED IDEOGRAPH
+ 0xD5CF: 0x969C, //CJK UNIFIED IDEOGRAPH
+ 0xD5D0: 0x62DB, //CJK UNIFIED IDEOGRAPH
+ 0xD5D1: 0x662D, //CJK UNIFIED IDEOGRAPH
+ 0xD5D2: 0x627E, //CJK UNIFIED IDEOGRAPH
+ 0xD5D3: 0x6CBC, //CJK UNIFIED IDEOGRAPH
+ 0xD5D4: 0x8D75, //CJK UNIFIED IDEOGRAPH
+ 0xD5D5: 0x7167, //CJK UNIFIED IDEOGRAPH
+ 0xD5D6: 0x7F69, //CJK UNIFIED IDEOGRAPH
+ 0xD5D7: 0x5146, //CJK UNIFIED IDEOGRAPH
+ 0xD5D8: 0x8087, //CJK UNIFIED IDEOGRAPH
+ 0xD5D9: 0x53EC, //CJK UNIFIED IDEOGRAPH
+ 0xD5DA: 0x906E, //CJK UNIFIED IDEOGRAPH
+ 0xD5DB: 0x6298, //CJK UNIFIED IDEOGRAPH
+ 0xD5DC: 0x54F2, //CJK UNIFIED IDEOGRAPH
+ 0xD5DD: 0x86F0, //CJK UNIFIED IDEOGRAPH
+ 0xD5DE: 0x8F99, //CJK UNIFIED IDEOGRAPH
+ 0xD5DF: 0x8005, //CJK UNIFIED IDEOGRAPH
+ 0xD5E0: 0x9517, //CJK UNIFIED IDEOGRAPH
+ 0xD5E1: 0x8517, //CJK UNIFIED IDEOGRAPH
+ 0xD5E2: 0x8FD9, //CJK UNIFIED IDEOGRAPH
+ 0xD5E3: 0x6D59, //CJK UNIFIED IDEOGRAPH
+ 0xD5E4: 0x73CD, //CJK UNIFIED IDEOGRAPH
+ 0xD5E5: 0x659F, //CJK UNIFIED IDEOGRAPH
+ 0xD5E6: 0x771F, //CJK UNIFIED IDEOGRAPH
+ 0xD5E7: 0x7504, //CJK UNIFIED IDEOGRAPH
+ 0xD5E8: 0x7827, //CJK UNIFIED IDEOGRAPH
+ 0xD5E9: 0x81FB, //CJK UNIFIED IDEOGRAPH
+ 0xD5EA: 0x8D1E, //CJK UNIFIED IDEOGRAPH
+ 0xD5EB: 0x9488, //CJK UNIFIED IDEOGRAPH
+ 0xD5EC: 0x4FA6, //CJK UNIFIED IDEOGRAPH
+ 0xD5ED: 0x6795, //CJK UNIFIED IDEOGRAPH
+ 0xD5EE: 0x75B9, //CJK UNIFIED IDEOGRAPH
+ 0xD5EF: 0x8BCA, //CJK UNIFIED IDEOGRAPH
+ 0xD5F0: 0x9707, //CJK UNIFIED IDEOGRAPH
+ 0xD5F1: 0x632F, //CJK UNIFIED IDEOGRAPH
+ 0xD5F2: 0x9547, //CJK UNIFIED IDEOGRAPH
+ 0xD5F3: 0x9635, //CJK UNIFIED IDEOGRAPH
+ 0xD5F4: 0x84B8, //CJK UNIFIED IDEOGRAPH
+ 0xD5F5: 0x6323, //CJK UNIFIED IDEOGRAPH
+ 0xD5F6: 0x7741, //CJK UNIFIED IDEOGRAPH
+ 0xD5F7: 0x5F81, //CJK UNIFIED IDEOGRAPH
+ 0xD5F8: 0x72F0, //CJK UNIFIED IDEOGRAPH
+ 0xD5F9: 0x4E89, //CJK UNIFIED IDEOGRAPH
+ 0xD5FA: 0x6014, //CJK UNIFIED IDEOGRAPH
+ 0xD5FB: 0x6574, //CJK UNIFIED IDEOGRAPH
+ 0xD5FC: 0x62EF, //CJK UNIFIED IDEOGRAPH
+ 0xD5FD: 0x6B63, //CJK UNIFIED IDEOGRAPH
+ 0xD5FE: 0x653F, //CJK UNIFIED IDEOGRAPH
+ 0xD640: 0x8AE4, //CJK UNIFIED IDEOGRAPH
+ 0xD641: 0x8AE5, //CJK UNIFIED IDEOGRAPH
+ 0xD642: 0x8AE6, //CJK UNIFIED IDEOGRAPH
+ 0xD643: 0x8AE7, //CJK UNIFIED IDEOGRAPH
+ 0xD644: 0x8AE8, //CJK UNIFIED IDEOGRAPH
+ 0xD645: 0x8AE9, //CJK UNIFIED IDEOGRAPH
+ 0xD646: 0x8AEA, //CJK UNIFIED IDEOGRAPH
+ 0xD647: 0x8AEB, //CJK UNIFIED IDEOGRAPH
+ 0xD648: 0x8AEC, //CJK UNIFIED IDEOGRAPH
+ 0xD649: 0x8AED, //CJK UNIFIED IDEOGRAPH
+ 0xD64A: 0x8AEE, //CJK UNIFIED IDEOGRAPH
+ 0xD64B: 0x8AEF, //CJK UNIFIED IDEOGRAPH
+ 0xD64C: 0x8AF0, //CJK UNIFIED IDEOGRAPH
+ 0xD64D: 0x8AF1, //CJK UNIFIED IDEOGRAPH
+ 0xD64E: 0x8AF2, //CJK UNIFIED IDEOGRAPH
+ 0xD64F: 0x8AF3, //CJK UNIFIED IDEOGRAPH
+ 0xD650: 0x8AF4, //CJK UNIFIED IDEOGRAPH
+ 0xD651: 0x8AF5, //CJK UNIFIED IDEOGRAPH
+ 0xD652: 0x8AF6, //CJK UNIFIED IDEOGRAPH
+ 0xD653: 0x8AF7, //CJK UNIFIED IDEOGRAPH
+ 0xD654: 0x8AF8, //CJK UNIFIED IDEOGRAPH
+ 0xD655: 0x8AF9, //CJK UNIFIED IDEOGRAPH
+ 0xD656: 0x8AFA, //CJK UNIFIED IDEOGRAPH
+ 0xD657: 0x8AFB, //CJK UNIFIED IDEOGRAPH
+ 0xD658: 0x8AFC, //CJK UNIFIED IDEOGRAPH
+ 0xD659: 0x8AFD, //CJK UNIFIED IDEOGRAPH
+ 0xD65A: 0x8AFE, //CJK UNIFIED IDEOGRAPH
+ 0xD65B: 0x8AFF, //CJK UNIFIED IDEOGRAPH
+ 0xD65C: 0x8B00, //CJK UNIFIED IDEOGRAPH
+ 0xD65D: 0x8B01, //CJK UNIFIED IDEOGRAPH
+ 0xD65E: 0x8B02, //CJK UNIFIED IDEOGRAPH
+ 0xD65F: 0x8B03, //CJK UNIFIED IDEOGRAPH
+ 0xD660: 0x8B04, //CJK UNIFIED IDEOGRAPH
+ 0xD661: 0x8B05, //CJK UNIFIED IDEOGRAPH
+ 0xD662: 0x8B06, //CJK UNIFIED IDEOGRAPH
+ 0xD663: 0x8B08, //CJK UNIFIED IDEOGRAPH
+ 0xD664: 0x8B09, //CJK UNIFIED IDEOGRAPH
+ 0xD665: 0x8B0A, //CJK UNIFIED IDEOGRAPH
+ 0xD666: 0x8B0B, //CJK UNIFIED IDEOGRAPH
+ 0xD667: 0x8B0C, //CJK UNIFIED IDEOGRAPH
+ 0xD668: 0x8B0D, //CJK UNIFIED IDEOGRAPH
+ 0xD669: 0x8B0E, //CJK UNIFIED IDEOGRAPH
+ 0xD66A: 0x8B0F, //CJK UNIFIED IDEOGRAPH
+ 0xD66B: 0x8B10, //CJK UNIFIED IDEOGRAPH
+ 0xD66C: 0x8B11, //CJK UNIFIED IDEOGRAPH
+ 0xD66D: 0x8B12, //CJK UNIFIED IDEOGRAPH
+ 0xD66E: 0x8B13, //CJK UNIFIED IDEOGRAPH
+ 0xD66F: 0x8B14, //CJK UNIFIED IDEOGRAPH
+ 0xD670: 0x8B15, //CJK UNIFIED IDEOGRAPH
+ 0xD671: 0x8B16, //CJK UNIFIED IDEOGRAPH
+ 0xD672: 0x8B17, //CJK UNIFIED IDEOGRAPH
+ 0xD673: 0x8B18, //CJK UNIFIED IDEOGRAPH
+ 0xD674: 0x8B19, //CJK UNIFIED IDEOGRAPH
+ 0xD675: 0x8B1A, //CJK UNIFIED IDEOGRAPH
+ 0xD676: 0x8B1B, //CJK UNIFIED IDEOGRAPH
+ 0xD677: 0x8B1C, //CJK UNIFIED IDEOGRAPH
+ 0xD678: 0x8B1D, //CJK UNIFIED IDEOGRAPH
+ 0xD679: 0x8B1E, //CJK UNIFIED IDEOGRAPH
+ 0xD67A: 0x8B1F, //CJK UNIFIED IDEOGRAPH
+ 0xD67B: 0x8B20, //CJK UNIFIED IDEOGRAPH
+ 0xD67C: 0x8B21, //CJK UNIFIED IDEOGRAPH
+ 0xD67D: 0x8B22, //CJK UNIFIED IDEOGRAPH
+ 0xD67E: 0x8B23, //CJK UNIFIED IDEOGRAPH
+ 0xD680: 0x8B24, //CJK UNIFIED IDEOGRAPH
+ 0xD681: 0x8B25, //CJK UNIFIED IDEOGRAPH
+ 0xD682: 0x8B27, //CJK UNIFIED IDEOGRAPH
+ 0xD683: 0x8B28, //CJK UNIFIED IDEOGRAPH
+ 0xD684: 0x8B29, //CJK UNIFIED IDEOGRAPH
+ 0xD685: 0x8B2A, //CJK UNIFIED IDEOGRAPH
+ 0xD686: 0x8B2B, //CJK UNIFIED IDEOGRAPH
+ 0xD687: 0x8B2C, //CJK UNIFIED IDEOGRAPH
+ 0xD688: 0x8B2D, //CJK UNIFIED IDEOGRAPH
+ 0xD689: 0x8B2E, //CJK UNIFIED IDEOGRAPH
+ 0xD68A: 0x8B2F, //CJK UNIFIED IDEOGRAPH
+ 0xD68B: 0x8B30, //CJK UNIFIED IDEOGRAPH
+ 0xD68C: 0x8B31, //CJK UNIFIED IDEOGRAPH
+ 0xD68D: 0x8B32, //CJK UNIFIED IDEOGRAPH
+ 0xD68E: 0x8B33, //CJK UNIFIED IDEOGRAPH
+ 0xD68F: 0x8B34, //CJK UNIFIED IDEOGRAPH
+ 0xD690: 0x8B35, //CJK UNIFIED IDEOGRAPH
+ 0xD691: 0x8B36, //CJK UNIFIED IDEOGRAPH
+ 0xD692: 0x8B37, //CJK UNIFIED IDEOGRAPH
+ 0xD693: 0x8B38, //CJK UNIFIED IDEOGRAPH
+ 0xD694: 0x8B39, //CJK UNIFIED IDEOGRAPH
+ 0xD695: 0x8B3A, //CJK UNIFIED IDEOGRAPH
+ 0xD696: 0x8B3B, //CJK UNIFIED IDEOGRAPH
+ 0xD697: 0x8B3C, //CJK UNIFIED IDEOGRAPH
+ 0xD698: 0x8B3D, //CJK UNIFIED IDEOGRAPH
+ 0xD699: 0x8B3E, //CJK UNIFIED IDEOGRAPH
+ 0xD69A: 0x8B3F, //CJK UNIFIED IDEOGRAPH
+ 0xD69B: 0x8B40, //CJK UNIFIED IDEOGRAPH
+ 0xD69C: 0x8B41, //CJK UNIFIED IDEOGRAPH
+ 0xD69D: 0x8B42, //CJK UNIFIED IDEOGRAPH
+ 0xD69E: 0x8B43, //CJK UNIFIED IDEOGRAPH
+ 0xD69F: 0x8B44, //CJK UNIFIED IDEOGRAPH
+ 0xD6A0: 0x8B45, //CJK UNIFIED IDEOGRAPH
+ 0xD6A1: 0x5E27, //CJK UNIFIED IDEOGRAPH
+ 0xD6A2: 0x75C7, //CJK UNIFIED IDEOGRAPH
+ 0xD6A3: 0x90D1, //CJK UNIFIED IDEOGRAPH
+ 0xD6A4: 0x8BC1, //CJK UNIFIED IDEOGRAPH
+ 0xD6A5: 0x829D, //CJK UNIFIED IDEOGRAPH
+ 0xD6A6: 0x679D, //CJK UNIFIED IDEOGRAPH
+ 0xD6A7: 0x652F, //CJK UNIFIED IDEOGRAPH
+ 0xD6A8: 0x5431, //CJK UNIFIED IDEOGRAPH
+ 0xD6A9: 0x8718, //CJK UNIFIED IDEOGRAPH
+ 0xD6AA: 0x77E5, //CJK UNIFIED IDEOGRAPH
+ 0xD6AB: 0x80A2, //CJK UNIFIED IDEOGRAPH
+ 0xD6AC: 0x8102, //CJK UNIFIED IDEOGRAPH
+ 0xD6AD: 0x6C41, //CJK UNIFIED IDEOGRAPH
+ 0xD6AE: 0x4E4B, //CJK UNIFIED IDEOGRAPH
+ 0xD6AF: 0x7EC7, //CJK UNIFIED IDEOGRAPH
+ 0xD6B0: 0x804C, //CJK UNIFIED IDEOGRAPH
+ 0xD6B1: 0x76F4, //CJK UNIFIED IDEOGRAPH
+ 0xD6B2: 0x690D, //CJK UNIFIED IDEOGRAPH
+ 0xD6B3: 0x6B96, //CJK UNIFIED IDEOGRAPH
+ 0xD6B4: 0x6267, //CJK UNIFIED IDEOGRAPH
+ 0xD6B5: 0x503C, //CJK UNIFIED IDEOGRAPH
+ 0xD6B6: 0x4F84, //CJK UNIFIED IDEOGRAPH
+ 0xD6B7: 0x5740, //CJK UNIFIED IDEOGRAPH
+ 0xD6B8: 0x6307, //CJK UNIFIED IDEOGRAPH
+ 0xD6B9: 0x6B62, //CJK UNIFIED IDEOGRAPH
+ 0xD6BA: 0x8DBE, //CJK UNIFIED IDEOGRAPH
+ 0xD6BB: 0x53EA, //CJK UNIFIED IDEOGRAPH
+ 0xD6BC: 0x65E8, //CJK UNIFIED IDEOGRAPH
+ 0xD6BD: 0x7EB8, //CJK UNIFIED IDEOGRAPH
+ 0xD6BE: 0x5FD7, //CJK UNIFIED IDEOGRAPH
+ 0xD6BF: 0x631A, //CJK UNIFIED IDEOGRAPH
+ 0xD6C0: 0x63B7, //CJK UNIFIED IDEOGRAPH
+ 0xD6C1: 0x81F3, //CJK UNIFIED IDEOGRAPH
+ 0xD6C2: 0x81F4, //CJK UNIFIED IDEOGRAPH
+ 0xD6C3: 0x7F6E, //CJK UNIFIED IDEOGRAPH
+ 0xD6C4: 0x5E1C, //CJK UNIFIED IDEOGRAPH
+ 0xD6C5: 0x5CD9, //CJK UNIFIED IDEOGRAPH
+ 0xD6C6: 0x5236, //CJK UNIFIED IDEOGRAPH
+ 0xD6C7: 0x667A, //CJK UNIFIED IDEOGRAPH
+ 0xD6C8: 0x79E9, //CJK UNIFIED IDEOGRAPH
+ 0xD6C9: 0x7A1A, //CJK UNIFIED IDEOGRAPH
+ 0xD6CA: 0x8D28, //CJK UNIFIED IDEOGRAPH
+ 0xD6CB: 0x7099, //CJK UNIFIED IDEOGRAPH
+ 0xD6CC: 0x75D4, //CJK UNIFIED IDEOGRAPH
+ 0xD6CD: 0x6EDE, //CJK UNIFIED IDEOGRAPH
+ 0xD6CE: 0x6CBB, //CJK UNIFIED IDEOGRAPH
+ 0xD6CF: 0x7A92, //CJK UNIFIED IDEOGRAPH
+ 0xD6D0: 0x4E2D, //CJK UNIFIED IDEOGRAPH
+ 0xD6D1: 0x76C5, //CJK UNIFIED IDEOGRAPH
+ 0xD6D2: 0x5FE0, //CJK UNIFIED IDEOGRAPH
+ 0xD6D3: 0x949F, //CJK UNIFIED IDEOGRAPH
+ 0xD6D4: 0x8877, //CJK UNIFIED IDEOGRAPH
+ 0xD6D5: 0x7EC8, //CJK UNIFIED IDEOGRAPH
+ 0xD6D6: 0x79CD, //CJK UNIFIED IDEOGRAPH
+ 0xD6D7: 0x80BF, //CJK UNIFIED IDEOGRAPH
+ 0xD6D8: 0x91CD, //CJK UNIFIED IDEOGRAPH
+ 0xD6D9: 0x4EF2, //CJK UNIFIED IDEOGRAPH
+ 0xD6DA: 0x4F17, //CJK UNIFIED IDEOGRAPH
+ 0xD6DB: 0x821F, //CJK UNIFIED IDEOGRAPH
+ 0xD6DC: 0x5468, //CJK UNIFIED IDEOGRAPH
+ 0xD6DD: 0x5DDE, //CJK UNIFIED IDEOGRAPH
+ 0xD6DE: 0x6D32, //CJK UNIFIED IDEOGRAPH
+ 0xD6DF: 0x8BCC, //CJK UNIFIED IDEOGRAPH
+ 0xD6E0: 0x7CA5, //CJK UNIFIED IDEOGRAPH
+ 0xD6E1: 0x8F74, //CJK UNIFIED IDEOGRAPH
+ 0xD6E2: 0x8098, //CJK UNIFIED IDEOGRAPH
+ 0xD6E3: 0x5E1A, //CJK UNIFIED IDEOGRAPH
+ 0xD6E4: 0x5492, //CJK UNIFIED IDEOGRAPH
+ 0xD6E5: 0x76B1, //CJK UNIFIED IDEOGRAPH
+ 0xD6E6: 0x5B99, //CJK UNIFIED IDEOGRAPH
+ 0xD6E7: 0x663C, //CJK UNIFIED IDEOGRAPH
+ 0xD6E8: 0x9AA4, //CJK UNIFIED IDEOGRAPH
+ 0xD6E9: 0x73E0, //CJK UNIFIED IDEOGRAPH
+ 0xD6EA: 0x682A, //CJK UNIFIED IDEOGRAPH
+ 0xD6EB: 0x86DB, //CJK UNIFIED IDEOGRAPH
+ 0xD6EC: 0x6731, //CJK UNIFIED IDEOGRAPH
+ 0xD6ED: 0x732A, //CJK UNIFIED IDEOGRAPH
+ 0xD6EE: 0x8BF8, //CJK UNIFIED IDEOGRAPH
+ 0xD6EF: 0x8BDB, //CJK UNIFIED IDEOGRAPH
+ 0xD6F0: 0x9010, //CJK UNIFIED IDEOGRAPH
+ 0xD6F1: 0x7AF9, //CJK UNIFIED IDEOGRAPH
+ 0xD6F2: 0x70DB, //CJK UNIFIED IDEOGRAPH
+ 0xD6F3: 0x716E, //CJK UNIFIED IDEOGRAPH
+ 0xD6F4: 0x62C4, //CJK UNIFIED IDEOGRAPH
+ 0xD6F5: 0x77A9, //CJK UNIFIED IDEOGRAPH
+ 0xD6F6: 0x5631, //CJK UNIFIED IDEOGRAPH
+ 0xD6F7: 0x4E3B, //CJK UNIFIED IDEOGRAPH
+ 0xD6F8: 0x8457, //CJK UNIFIED IDEOGRAPH
+ 0xD6F9: 0x67F1, //CJK UNIFIED IDEOGRAPH
+ 0xD6FA: 0x52A9, //CJK UNIFIED IDEOGRAPH
+ 0xD6FB: 0x86C0, //CJK UNIFIED IDEOGRAPH
+ 0xD6FC: 0x8D2E, //CJK UNIFIED IDEOGRAPH
+ 0xD6FD: 0x94F8, //CJK UNIFIED IDEOGRAPH
+ 0xD6FE: 0x7B51, //CJK UNIFIED IDEOGRAPH
+ 0xD740: 0x8B46, //CJK UNIFIED IDEOGRAPH
+ 0xD741: 0x8B47, //CJK UNIFIED IDEOGRAPH
+ 0xD742: 0x8B48, //CJK UNIFIED IDEOGRAPH
+ 0xD743: 0x8B49, //CJK UNIFIED IDEOGRAPH
+ 0xD744: 0x8B4A, //CJK UNIFIED IDEOGRAPH
+ 0xD745: 0x8B4B, //CJK UNIFIED IDEOGRAPH
+ 0xD746: 0x8B4C, //CJK UNIFIED IDEOGRAPH
+ 0xD747: 0x8B4D, //CJK UNIFIED IDEOGRAPH
+ 0xD748: 0x8B4E, //CJK UNIFIED IDEOGRAPH
+ 0xD749: 0x8B4F, //CJK UNIFIED IDEOGRAPH
+ 0xD74A: 0x8B50, //CJK UNIFIED IDEOGRAPH
+ 0xD74B: 0x8B51, //CJK UNIFIED IDEOGRAPH
+ 0xD74C: 0x8B52, //CJK UNIFIED IDEOGRAPH
+ 0xD74D: 0x8B53, //CJK UNIFIED IDEOGRAPH
+ 0xD74E: 0x8B54, //CJK UNIFIED IDEOGRAPH
+ 0xD74F: 0x8B55, //CJK UNIFIED IDEOGRAPH
+ 0xD750: 0x8B56, //CJK UNIFIED IDEOGRAPH
+ 0xD751: 0x8B57, //CJK UNIFIED IDEOGRAPH
+ 0xD752: 0x8B58, //CJK UNIFIED IDEOGRAPH
+ 0xD753: 0x8B59, //CJK UNIFIED IDEOGRAPH
+ 0xD754: 0x8B5A, //CJK UNIFIED IDEOGRAPH
+ 0xD755: 0x8B5B, //CJK UNIFIED IDEOGRAPH
+ 0xD756: 0x8B5C, //CJK UNIFIED IDEOGRAPH
+ 0xD757: 0x8B5D, //CJK UNIFIED IDEOGRAPH
+ 0xD758: 0x8B5E, //CJK UNIFIED IDEOGRAPH
+ 0xD759: 0x8B5F, //CJK UNIFIED IDEOGRAPH
+ 0xD75A: 0x8B60, //CJK UNIFIED IDEOGRAPH
+ 0xD75B: 0x8B61, //CJK UNIFIED IDEOGRAPH
+ 0xD75C: 0x8B62, //CJK UNIFIED IDEOGRAPH
+ 0xD75D: 0x8B63, //CJK UNIFIED IDEOGRAPH
+ 0xD75E: 0x8B64, //CJK UNIFIED IDEOGRAPH
+ 0xD75F: 0x8B65, //CJK UNIFIED IDEOGRAPH
+ 0xD760: 0x8B67, //CJK UNIFIED IDEOGRAPH
+ 0xD761: 0x8B68, //CJK UNIFIED IDEOGRAPH
+ 0xD762: 0x8B69, //CJK UNIFIED IDEOGRAPH
+ 0xD763: 0x8B6A, //CJK UNIFIED IDEOGRAPH
+ 0xD764: 0x8B6B, //CJK UNIFIED IDEOGRAPH
+ 0xD765: 0x8B6D, //CJK UNIFIED IDEOGRAPH
+ 0xD766: 0x8B6E, //CJK UNIFIED IDEOGRAPH
+ 0xD767: 0x8B6F, //CJK UNIFIED IDEOGRAPH
+ 0xD768: 0x8B70, //CJK UNIFIED IDEOGRAPH
+ 0xD769: 0x8B71, //CJK UNIFIED IDEOGRAPH
+ 0xD76A: 0x8B72, //CJK UNIFIED IDEOGRAPH
+ 0xD76B: 0x8B73, //CJK UNIFIED IDEOGRAPH
+ 0xD76C: 0x8B74, //CJK UNIFIED IDEOGRAPH
+ 0xD76D: 0x8B75, //CJK UNIFIED IDEOGRAPH
+ 0xD76E: 0x8B76, //CJK UNIFIED IDEOGRAPH
+ 0xD76F: 0x8B77, //CJK UNIFIED IDEOGRAPH
+ 0xD770: 0x8B78, //CJK UNIFIED IDEOGRAPH
+ 0xD771: 0x8B79, //CJK UNIFIED IDEOGRAPH
+ 0xD772: 0x8B7A, //CJK UNIFIED IDEOGRAPH
+ 0xD773: 0x8B7B, //CJK UNIFIED IDEOGRAPH
+ 0xD774: 0x8B7C, //CJK UNIFIED IDEOGRAPH
+ 0xD775: 0x8B7D, //CJK UNIFIED IDEOGRAPH
+ 0xD776: 0x8B7E, //CJK UNIFIED IDEOGRAPH
+ 0xD777: 0x8B7F, //CJK UNIFIED IDEOGRAPH
+ 0xD778: 0x8B80, //CJK UNIFIED IDEOGRAPH
+ 0xD779: 0x8B81, //CJK UNIFIED IDEOGRAPH
+ 0xD77A: 0x8B82, //CJK UNIFIED IDEOGRAPH
+ 0xD77B: 0x8B83, //CJK UNIFIED IDEOGRAPH
+ 0xD77C: 0x8B84, //CJK UNIFIED IDEOGRAPH
+ 0xD77D: 0x8B85, //CJK UNIFIED IDEOGRAPH
+ 0xD77E: 0x8B86, //CJK UNIFIED IDEOGRAPH
+ 0xD780: 0x8B87, //CJK UNIFIED IDEOGRAPH
+ 0xD781: 0x8B88, //CJK UNIFIED IDEOGRAPH
+ 0xD782: 0x8B89, //CJK UNIFIED IDEOGRAPH
+ 0xD783: 0x8B8A, //CJK UNIFIED IDEOGRAPH
+ 0xD784: 0x8B8B, //CJK UNIFIED IDEOGRAPH
+ 0xD785: 0x8B8C, //CJK UNIFIED IDEOGRAPH
+ 0xD786: 0x8B8D, //CJK UNIFIED IDEOGRAPH
+ 0xD787: 0x8B8E, //CJK UNIFIED IDEOGRAPH
+ 0xD788: 0x8B8F, //CJK UNIFIED IDEOGRAPH
+ 0xD789: 0x8B90, //CJK UNIFIED IDEOGRAPH
+ 0xD78A: 0x8B91, //CJK UNIFIED IDEOGRAPH
+ 0xD78B: 0x8B92, //CJK UNIFIED IDEOGRAPH
+ 0xD78C: 0x8B93, //CJK UNIFIED IDEOGRAPH
+ 0xD78D: 0x8B94, //CJK UNIFIED IDEOGRAPH
+ 0xD78E: 0x8B95, //CJK UNIFIED IDEOGRAPH
+ 0xD78F: 0x8B96, //CJK UNIFIED IDEOGRAPH
+ 0xD790: 0x8B97, //CJK UNIFIED IDEOGRAPH
+ 0xD791: 0x8B98, //CJK UNIFIED IDEOGRAPH
+ 0xD792: 0x8B99, //CJK UNIFIED IDEOGRAPH
+ 0xD793: 0x8B9A, //CJK UNIFIED IDEOGRAPH
+ 0xD794: 0x8B9B, //CJK UNIFIED IDEOGRAPH
+ 0xD795: 0x8B9C, //CJK UNIFIED IDEOGRAPH
+ 0xD796: 0x8B9D, //CJK UNIFIED IDEOGRAPH
+ 0xD797: 0x8B9E, //CJK UNIFIED IDEOGRAPH
+ 0xD798: 0x8B9F, //CJK UNIFIED IDEOGRAPH
+ 0xD799: 0x8BAC, //CJK UNIFIED IDEOGRAPH
+ 0xD79A: 0x8BB1, //CJK UNIFIED IDEOGRAPH
+ 0xD79B: 0x8BBB, //CJK UNIFIED IDEOGRAPH
+ 0xD79C: 0x8BC7, //CJK UNIFIED IDEOGRAPH
+ 0xD79D: 0x8BD0, //CJK UNIFIED IDEOGRAPH
+ 0xD79E: 0x8BEA, //CJK UNIFIED IDEOGRAPH
+ 0xD79F: 0x8C09, //CJK UNIFIED IDEOGRAPH
+ 0xD7A0: 0x8C1E, //CJK UNIFIED IDEOGRAPH
+ 0xD7A1: 0x4F4F, //CJK UNIFIED IDEOGRAPH
+ 0xD7A2: 0x6CE8, //CJK UNIFIED IDEOGRAPH
+ 0xD7A3: 0x795D, //CJK UNIFIED IDEOGRAPH
+ 0xD7A4: 0x9A7B, //CJK UNIFIED IDEOGRAPH
+ 0xD7A5: 0x6293, //CJK UNIFIED IDEOGRAPH
+ 0xD7A6: 0x722A, //CJK UNIFIED IDEOGRAPH
+ 0xD7A7: 0x62FD, //CJK UNIFIED IDEOGRAPH
+ 0xD7A8: 0x4E13, //CJK UNIFIED IDEOGRAPH
+ 0xD7A9: 0x7816, //CJK UNIFIED IDEOGRAPH
+ 0xD7AA: 0x8F6C, //CJK UNIFIED IDEOGRAPH
+ 0xD7AB: 0x64B0, //CJK UNIFIED IDEOGRAPH
+ 0xD7AC: 0x8D5A, //CJK UNIFIED IDEOGRAPH
+ 0xD7AD: 0x7BC6, //CJK UNIFIED IDEOGRAPH
+ 0xD7AE: 0x6869, //CJK UNIFIED IDEOGRAPH
+ 0xD7AF: 0x5E84, //CJK UNIFIED IDEOGRAPH
+ 0xD7B0: 0x88C5, //CJK UNIFIED IDEOGRAPH
+ 0xD7B1: 0x5986, //CJK UNIFIED IDEOGRAPH
+ 0xD7B2: 0x649E, //CJK UNIFIED IDEOGRAPH
+ 0xD7B3: 0x58EE, //CJK UNIFIED IDEOGRAPH
+ 0xD7B4: 0x72B6, //CJK UNIFIED IDEOGRAPH
+ 0xD7B5: 0x690E, //CJK UNIFIED IDEOGRAPH
+ 0xD7B6: 0x9525, //CJK UNIFIED IDEOGRAPH
+ 0xD7B7: 0x8FFD, //CJK UNIFIED IDEOGRAPH
+ 0xD7B8: 0x8D58, //CJK UNIFIED IDEOGRAPH
+ 0xD7B9: 0x5760, //CJK UNIFIED IDEOGRAPH
+ 0xD7BA: 0x7F00, //CJK UNIFIED IDEOGRAPH
+ 0xD7BB: 0x8C06, //CJK UNIFIED IDEOGRAPH
+ 0xD7BC: 0x51C6, //CJK UNIFIED IDEOGRAPH
+ 0xD7BD: 0x6349, //CJK UNIFIED IDEOGRAPH
+ 0xD7BE: 0x62D9, //CJK UNIFIED IDEOGRAPH
+ 0xD7BF: 0x5353, //CJK UNIFIED IDEOGRAPH
+ 0xD7C0: 0x684C, //CJK UNIFIED IDEOGRAPH
+ 0xD7C1: 0x7422, //CJK UNIFIED IDEOGRAPH
+ 0xD7C2: 0x8301, //CJK UNIFIED IDEOGRAPH
+ 0xD7C3: 0x914C, //CJK UNIFIED IDEOGRAPH
+ 0xD7C4: 0x5544, //CJK UNIFIED IDEOGRAPH
+ 0xD7C5: 0x7740, //CJK UNIFIED IDEOGRAPH
+ 0xD7C6: 0x707C, //CJK UNIFIED IDEOGRAPH
+ 0xD7C7: 0x6D4A, //CJK UNIFIED IDEOGRAPH
+ 0xD7C8: 0x5179, //CJK UNIFIED IDEOGRAPH
+ 0xD7C9: 0x54A8, //CJK UNIFIED IDEOGRAPH
+ 0xD7CA: 0x8D44, //CJK UNIFIED IDEOGRAPH
+ 0xD7CB: 0x59FF, //CJK UNIFIED IDEOGRAPH
+ 0xD7CC: 0x6ECB, //CJK UNIFIED IDEOGRAPH
+ 0xD7CD: 0x6DC4, //CJK UNIFIED IDEOGRAPH
+ 0xD7CE: 0x5B5C, //CJK UNIFIED IDEOGRAPH
+ 0xD7CF: 0x7D2B, //CJK UNIFIED IDEOGRAPH
+ 0xD7D0: 0x4ED4, //CJK UNIFIED IDEOGRAPH
+ 0xD7D1: 0x7C7D, //CJK UNIFIED IDEOGRAPH
+ 0xD7D2: 0x6ED3, //CJK UNIFIED IDEOGRAPH
+ 0xD7D3: 0x5B50, //CJK UNIFIED IDEOGRAPH
+ 0xD7D4: 0x81EA, //CJK UNIFIED IDEOGRAPH
+ 0xD7D5: 0x6E0D, //CJK UNIFIED IDEOGRAPH
+ 0xD7D6: 0x5B57, //CJK UNIFIED IDEOGRAPH
+ 0xD7D7: 0x9B03, //CJK UNIFIED IDEOGRAPH
+ 0xD7D8: 0x68D5, //CJK UNIFIED IDEOGRAPH
+ 0xD7D9: 0x8E2A, //CJK UNIFIED IDEOGRAPH
+ 0xD7DA: 0x5B97, //CJK UNIFIED IDEOGRAPH
+ 0xD7DB: 0x7EFC, //CJK UNIFIED IDEOGRAPH
+ 0xD7DC: 0x603B, //CJK UNIFIED IDEOGRAPH
+ 0xD7DD: 0x7EB5, //CJK UNIFIED IDEOGRAPH
+ 0xD7DE: 0x90B9, //CJK UNIFIED IDEOGRAPH
+ 0xD7DF: 0x8D70, //CJK UNIFIED IDEOGRAPH
+ 0xD7E0: 0x594F, //CJK UNIFIED IDEOGRAPH
+ 0xD7E1: 0x63CD, //CJK UNIFIED IDEOGRAPH
+ 0xD7E2: 0x79DF, //CJK UNIFIED IDEOGRAPH
+ 0xD7E3: 0x8DB3, //CJK UNIFIED IDEOGRAPH
+ 0xD7E4: 0x5352, //CJK UNIFIED IDEOGRAPH
+ 0xD7E5: 0x65CF, //CJK UNIFIED IDEOGRAPH
+ 0xD7E6: 0x7956, //CJK UNIFIED IDEOGRAPH
+ 0xD7E7: 0x8BC5, //CJK UNIFIED IDEOGRAPH
+ 0xD7E8: 0x963B, //CJK UNIFIED IDEOGRAPH
+ 0xD7E9: 0x7EC4, //CJK UNIFIED IDEOGRAPH
+ 0xD7EA: 0x94BB, //CJK UNIFIED IDEOGRAPH
+ 0xD7EB: 0x7E82, //CJK UNIFIED IDEOGRAPH
+ 0xD7EC: 0x5634, //CJK UNIFIED IDEOGRAPH
+ 0xD7ED: 0x9189, //CJK UNIFIED IDEOGRAPH
+ 0xD7EE: 0x6700, //CJK UNIFIED IDEOGRAPH
+ 0xD7EF: 0x7F6A, //CJK UNIFIED IDEOGRAPH
+ 0xD7F0: 0x5C0A, //CJK UNIFIED IDEOGRAPH
+ 0xD7F1: 0x9075, //CJK UNIFIED IDEOGRAPH
+ 0xD7F2: 0x6628, //CJK UNIFIED IDEOGRAPH
+ 0xD7F3: 0x5DE6, //CJK UNIFIED IDEOGRAPH
+ 0xD7F4: 0x4F50, //CJK UNIFIED IDEOGRAPH
+ 0xD7F5: 0x67DE, //CJK UNIFIED IDEOGRAPH
+ 0xD7F6: 0x505A, //CJK UNIFIED IDEOGRAPH
+ 0xD7F7: 0x4F5C, //CJK UNIFIED IDEOGRAPH
+ 0xD7F8: 0x5750, //CJK UNIFIED IDEOGRAPH
+ 0xD7F9: 0x5EA7, //CJK UNIFIED IDEOGRAPH
+ 0xD840: 0x8C38, //CJK UNIFIED IDEOGRAPH
+ 0xD841: 0x8C39, //CJK UNIFIED IDEOGRAPH
+ 0xD842: 0x8C3A, //CJK UNIFIED IDEOGRAPH
+ 0xD843: 0x8C3B, //CJK UNIFIED IDEOGRAPH
+ 0xD844: 0x8C3C, //CJK UNIFIED IDEOGRAPH
+ 0xD845: 0x8C3D, //CJK UNIFIED IDEOGRAPH
+ 0xD846: 0x8C3E, //CJK UNIFIED IDEOGRAPH
+ 0xD847: 0x8C3F, //CJK UNIFIED IDEOGRAPH
+ 0xD848: 0x8C40, //CJK UNIFIED IDEOGRAPH
+ 0xD849: 0x8C42, //CJK UNIFIED IDEOGRAPH
+ 0xD84A: 0x8C43, //CJK UNIFIED IDEOGRAPH
+ 0xD84B: 0x8C44, //CJK UNIFIED IDEOGRAPH
+ 0xD84C: 0x8C45, //CJK UNIFIED IDEOGRAPH
+ 0xD84D: 0x8C48, //CJK UNIFIED IDEOGRAPH
+ 0xD84E: 0x8C4A, //CJK UNIFIED IDEOGRAPH
+ 0xD84F: 0x8C4B, //CJK UNIFIED IDEOGRAPH
+ 0xD850: 0x8C4D, //CJK UNIFIED IDEOGRAPH
+ 0xD851: 0x8C4E, //CJK UNIFIED IDEOGRAPH
+ 0xD852: 0x8C4F, //CJK UNIFIED IDEOGRAPH
+ 0xD853: 0x8C50, //CJK UNIFIED IDEOGRAPH
+ 0xD854: 0x8C51, //CJK UNIFIED IDEOGRAPH
+ 0xD855: 0x8C52, //CJK UNIFIED IDEOGRAPH
+ 0xD856: 0x8C53, //CJK UNIFIED IDEOGRAPH
+ 0xD857: 0x8C54, //CJK UNIFIED IDEOGRAPH
+ 0xD858: 0x8C56, //CJK UNIFIED IDEOGRAPH
+ 0xD859: 0x8C57, //CJK UNIFIED IDEOGRAPH
+ 0xD85A: 0x8C58, //CJK UNIFIED IDEOGRAPH
+ 0xD85B: 0x8C59, //CJK UNIFIED IDEOGRAPH
+ 0xD85C: 0x8C5B, //CJK UNIFIED IDEOGRAPH
+ 0xD85D: 0x8C5C, //CJK UNIFIED IDEOGRAPH
+ 0xD85E: 0x8C5D, //CJK UNIFIED IDEOGRAPH
+ 0xD85F: 0x8C5E, //CJK UNIFIED IDEOGRAPH
+ 0xD860: 0x8C5F, //CJK UNIFIED IDEOGRAPH
+ 0xD861: 0x8C60, //CJK UNIFIED IDEOGRAPH
+ 0xD862: 0x8C63, //CJK UNIFIED IDEOGRAPH
+ 0xD863: 0x8C64, //CJK UNIFIED IDEOGRAPH
+ 0xD864: 0x8C65, //CJK UNIFIED IDEOGRAPH
+ 0xD865: 0x8C66, //CJK UNIFIED IDEOGRAPH
+ 0xD866: 0x8C67, //CJK UNIFIED IDEOGRAPH
+ 0xD867: 0x8C68, //CJK UNIFIED IDEOGRAPH
+ 0xD868: 0x8C69, //CJK UNIFIED IDEOGRAPH
+ 0xD869: 0x8C6C, //CJK UNIFIED IDEOGRAPH
+ 0xD86A: 0x8C6D, //CJK UNIFIED IDEOGRAPH
+ 0xD86B: 0x8C6E, //CJK UNIFIED IDEOGRAPH
+ 0xD86C: 0x8C6F, //CJK UNIFIED IDEOGRAPH
+ 0xD86D: 0x8C70, //CJK UNIFIED IDEOGRAPH
+ 0xD86E: 0x8C71, //CJK UNIFIED IDEOGRAPH
+ 0xD86F: 0x8C72, //CJK UNIFIED IDEOGRAPH
+ 0xD870: 0x8C74, //CJK UNIFIED IDEOGRAPH
+ 0xD871: 0x8C75, //CJK UNIFIED IDEOGRAPH
+ 0xD872: 0x8C76, //CJK UNIFIED IDEOGRAPH
+ 0xD873: 0x8C77, //CJK UNIFIED IDEOGRAPH
+ 0xD874: 0x8C7B, //CJK UNIFIED IDEOGRAPH
+ 0xD875: 0x8C7C, //CJK UNIFIED IDEOGRAPH
+ 0xD876: 0x8C7D, //CJK UNIFIED IDEOGRAPH
+ 0xD877: 0x8C7E, //CJK UNIFIED IDEOGRAPH
+ 0xD878: 0x8C7F, //CJK UNIFIED IDEOGRAPH
+ 0xD879: 0x8C80, //CJK UNIFIED IDEOGRAPH
+ 0xD87A: 0x8C81, //CJK UNIFIED IDEOGRAPH
+ 0xD87B: 0x8C83, //CJK UNIFIED IDEOGRAPH
+ 0xD87C: 0x8C84, //CJK UNIFIED IDEOGRAPH
+ 0xD87D: 0x8C86, //CJK UNIFIED IDEOGRAPH
+ 0xD87E: 0x8C87, //CJK UNIFIED IDEOGRAPH
+ 0xD880: 0x8C88, //CJK UNIFIED IDEOGRAPH
+ 0xD881: 0x8C8B, //CJK UNIFIED IDEOGRAPH
+ 0xD882: 0x8C8D, //CJK UNIFIED IDEOGRAPH
+ 0xD883: 0x8C8E, //CJK UNIFIED IDEOGRAPH
+ 0xD884: 0x8C8F, //CJK UNIFIED IDEOGRAPH
+ 0xD885: 0x8C90, //CJK UNIFIED IDEOGRAPH
+ 0xD886: 0x8C91, //CJK UNIFIED IDEOGRAPH
+ 0xD887: 0x8C92, //CJK UNIFIED IDEOGRAPH
+ 0xD888: 0x8C93, //CJK UNIFIED IDEOGRAPH
+ 0xD889: 0x8C95, //CJK UNIFIED IDEOGRAPH
+ 0xD88A: 0x8C96, //CJK UNIFIED IDEOGRAPH
+ 0xD88B: 0x8C97, //CJK UNIFIED IDEOGRAPH
+ 0xD88C: 0x8C99, //CJK UNIFIED IDEOGRAPH
+ 0xD88D: 0x8C9A, //CJK UNIFIED IDEOGRAPH
+ 0xD88E: 0x8C9B, //CJK UNIFIED IDEOGRAPH
+ 0xD88F: 0x8C9C, //CJK UNIFIED IDEOGRAPH
+ 0xD890: 0x8C9D, //CJK UNIFIED IDEOGRAPH
+ 0xD891: 0x8C9E, //CJK UNIFIED IDEOGRAPH
+ 0xD892: 0x8C9F, //CJK UNIFIED IDEOGRAPH
+ 0xD893: 0x8CA0, //CJK UNIFIED IDEOGRAPH
+ 0xD894: 0x8CA1, //CJK UNIFIED IDEOGRAPH
+ 0xD895: 0x8CA2, //CJK UNIFIED IDEOGRAPH
+ 0xD896: 0x8CA3, //CJK UNIFIED IDEOGRAPH
+ 0xD897: 0x8CA4, //CJK UNIFIED IDEOGRAPH
+ 0xD898: 0x8CA5, //CJK UNIFIED IDEOGRAPH
+ 0xD899: 0x8CA6, //CJK UNIFIED IDEOGRAPH
+ 0xD89A: 0x8CA7, //CJK UNIFIED IDEOGRAPH
+ 0xD89B: 0x8CA8, //CJK UNIFIED IDEOGRAPH
+ 0xD89C: 0x8CA9, //CJK UNIFIED IDEOGRAPH
+ 0xD89D: 0x8CAA, //CJK UNIFIED IDEOGRAPH
+ 0xD89E: 0x8CAB, //CJK UNIFIED IDEOGRAPH
+ 0xD89F: 0x8CAC, //CJK UNIFIED IDEOGRAPH
+ 0xD8A0: 0x8CAD, //CJK UNIFIED IDEOGRAPH
+ 0xD8A1: 0x4E8D, //CJK UNIFIED IDEOGRAPH
+ 0xD8A2: 0x4E0C, //CJK UNIFIED IDEOGRAPH
+ 0xD8A3: 0x5140, //CJK UNIFIED IDEOGRAPH
+ 0xD8A4: 0x4E10, //CJK UNIFIED IDEOGRAPH
+ 0xD8A5: 0x5EFF, //CJK UNIFIED IDEOGRAPH
+ 0xD8A6: 0x5345, //CJK UNIFIED IDEOGRAPH
+ 0xD8A7: 0x4E15, //CJK UNIFIED IDEOGRAPH
+ 0xD8A8: 0x4E98, //CJK UNIFIED IDEOGRAPH
+ 0xD8A9: 0x4E1E, //CJK UNIFIED IDEOGRAPH
+ 0xD8AA: 0x9B32, //CJK UNIFIED IDEOGRAPH
+ 0xD8AB: 0x5B6C, //CJK UNIFIED IDEOGRAPH
+ 0xD8AC: 0x5669, //CJK UNIFIED IDEOGRAPH
+ 0xD8AD: 0x4E28, //CJK UNIFIED IDEOGRAPH
+ 0xD8AE: 0x79BA, //CJK UNIFIED IDEOGRAPH
+ 0xD8AF: 0x4E3F, //CJK UNIFIED IDEOGRAPH
+ 0xD8B0: 0x5315, //CJK UNIFIED IDEOGRAPH
+ 0xD8B1: 0x4E47, //CJK UNIFIED IDEOGRAPH
+ 0xD8B2: 0x592D, //CJK UNIFIED IDEOGRAPH
+ 0xD8B3: 0x723B, //CJK UNIFIED IDEOGRAPH
+ 0xD8B4: 0x536E, //CJK UNIFIED IDEOGRAPH
+ 0xD8B5: 0x6C10, //CJK UNIFIED IDEOGRAPH
+ 0xD8B6: 0x56DF, //CJK UNIFIED IDEOGRAPH
+ 0xD8B7: 0x80E4, //CJK UNIFIED IDEOGRAPH
+ 0xD8B8: 0x9997, //CJK UNIFIED IDEOGRAPH
+ 0xD8B9: 0x6BD3, //CJK UNIFIED IDEOGRAPH
+ 0xD8BA: 0x777E, //CJK UNIFIED IDEOGRAPH
+ 0xD8BB: 0x9F17, //CJK UNIFIED IDEOGRAPH
+ 0xD8BC: 0x4E36, //CJK UNIFIED IDEOGRAPH
+ 0xD8BD: 0x4E9F, //CJK UNIFIED IDEOGRAPH
+ 0xD8BE: 0x9F10, //CJK UNIFIED IDEOGRAPH
+ 0xD8BF: 0x4E5C, //CJK UNIFIED IDEOGRAPH
+ 0xD8C0: 0x4E69, //CJK UNIFIED IDEOGRAPH
+ 0xD8C1: 0x4E93, //CJK UNIFIED IDEOGRAPH
+ 0xD8C2: 0x8288, //CJK UNIFIED IDEOGRAPH
+ 0xD8C3: 0x5B5B, //CJK UNIFIED IDEOGRAPH
+ 0xD8C4: 0x556C, //CJK UNIFIED IDEOGRAPH
+ 0xD8C5: 0x560F, //CJK UNIFIED IDEOGRAPH
+ 0xD8C6: 0x4EC4, //CJK UNIFIED IDEOGRAPH
+ 0xD8C7: 0x538D, //CJK UNIFIED IDEOGRAPH
+ 0xD8C8: 0x539D, //CJK UNIFIED IDEOGRAPH
+ 0xD8C9: 0x53A3, //CJK UNIFIED IDEOGRAPH
+ 0xD8CA: 0x53A5, //CJK UNIFIED IDEOGRAPH
+ 0xD8CB: 0x53AE, //CJK UNIFIED IDEOGRAPH
+ 0xD8CC: 0x9765, //CJK UNIFIED IDEOGRAPH
+ 0xD8CD: 0x8D5D, //CJK UNIFIED IDEOGRAPH
+ 0xD8CE: 0x531A, //CJK UNIFIED IDEOGRAPH
+ 0xD8CF: 0x53F5, //CJK UNIFIED IDEOGRAPH
+ 0xD8D0: 0x5326, //CJK UNIFIED IDEOGRAPH
+ 0xD8D1: 0x532E, //CJK UNIFIED IDEOGRAPH
+ 0xD8D2: 0x533E, //CJK UNIFIED IDEOGRAPH
+ 0xD8D3: 0x8D5C, //CJK UNIFIED IDEOGRAPH
+ 0xD8D4: 0x5366, //CJK UNIFIED IDEOGRAPH
+ 0xD8D5: 0x5363, //CJK UNIFIED IDEOGRAPH
+ 0xD8D6: 0x5202, //CJK UNIFIED IDEOGRAPH
+ 0xD8D7: 0x5208, //CJK UNIFIED IDEOGRAPH
+ 0xD8D8: 0x520E, //CJK UNIFIED IDEOGRAPH
+ 0xD8D9: 0x522D, //CJK UNIFIED IDEOGRAPH
+ 0xD8DA: 0x5233, //CJK UNIFIED IDEOGRAPH
+ 0xD8DB: 0x523F, //CJK UNIFIED IDEOGRAPH
+ 0xD8DC: 0x5240, //CJK UNIFIED IDEOGRAPH
+ 0xD8DD: 0x524C, //CJK UNIFIED IDEOGRAPH
+ 0xD8DE: 0x525E, //CJK UNIFIED IDEOGRAPH
+ 0xD8DF: 0x5261, //CJK UNIFIED IDEOGRAPH
+ 0xD8E0: 0x525C, //CJK UNIFIED IDEOGRAPH
+ 0xD8E1: 0x84AF, //CJK UNIFIED IDEOGRAPH
+ 0xD8E2: 0x527D, //CJK UNIFIED IDEOGRAPH
+ 0xD8E3: 0x5282, //CJK UNIFIED IDEOGRAPH
+ 0xD8E4: 0x5281, //CJK UNIFIED IDEOGRAPH
+ 0xD8E5: 0x5290, //CJK UNIFIED IDEOGRAPH
+ 0xD8E6: 0x5293, //CJK UNIFIED IDEOGRAPH
+ 0xD8E7: 0x5182, //CJK UNIFIED IDEOGRAPH
+ 0xD8E8: 0x7F54, //CJK UNIFIED IDEOGRAPH
+ 0xD8E9: 0x4EBB, //CJK UNIFIED IDEOGRAPH
+ 0xD8EA: 0x4EC3, //CJK UNIFIED IDEOGRAPH
+ 0xD8EB: 0x4EC9, //CJK UNIFIED IDEOGRAPH
+ 0xD8EC: 0x4EC2, //CJK UNIFIED IDEOGRAPH
+ 0xD8ED: 0x4EE8, //CJK UNIFIED IDEOGRAPH
+ 0xD8EE: 0x4EE1, //CJK UNIFIED IDEOGRAPH
+ 0xD8EF: 0x4EEB, //CJK UNIFIED IDEOGRAPH
+ 0xD8F0: 0x4EDE, //CJK UNIFIED IDEOGRAPH
+ 0xD8F1: 0x4F1B, //CJK UNIFIED IDEOGRAPH
+ 0xD8F2: 0x4EF3, //CJK UNIFIED IDEOGRAPH
+ 0xD8F3: 0x4F22, //CJK UNIFIED IDEOGRAPH
+ 0xD8F4: 0x4F64, //CJK UNIFIED IDEOGRAPH
+ 0xD8F5: 0x4EF5, //CJK UNIFIED IDEOGRAPH
+ 0xD8F6: 0x4F25, //CJK UNIFIED IDEOGRAPH
+ 0xD8F7: 0x4F27, //CJK UNIFIED IDEOGRAPH
+ 0xD8F8: 0x4F09, //CJK UNIFIED IDEOGRAPH
+ 0xD8F9: 0x4F2B, //CJK UNIFIED IDEOGRAPH
+ 0xD8FA: 0x4F5E, //CJK UNIFIED IDEOGRAPH
+ 0xD8FB: 0x4F67, //CJK UNIFIED IDEOGRAPH
+ 0xD8FC: 0x6538, //CJK UNIFIED IDEOGRAPH
+ 0xD8FD: 0x4F5A, //CJK UNIFIED IDEOGRAPH
+ 0xD8FE: 0x4F5D, //CJK UNIFIED IDEOGRAPH
+ 0xD940: 0x8CAE, //CJK UNIFIED IDEOGRAPH
+ 0xD941: 0x8CAF, //CJK UNIFIED IDEOGRAPH
+ 0xD942: 0x8CB0, //CJK UNIFIED IDEOGRAPH
+ 0xD943: 0x8CB1, //CJK UNIFIED IDEOGRAPH
+ 0xD944: 0x8CB2, //CJK UNIFIED IDEOGRAPH
+ 0xD945: 0x8CB3, //CJK UNIFIED IDEOGRAPH
+ 0xD946: 0x8CB4, //CJK UNIFIED IDEOGRAPH
+ 0xD947: 0x8CB5, //CJK UNIFIED IDEOGRAPH
+ 0xD948: 0x8CB6, //CJK UNIFIED IDEOGRAPH
+ 0xD949: 0x8CB7, //CJK UNIFIED IDEOGRAPH
+ 0xD94A: 0x8CB8, //CJK UNIFIED IDEOGRAPH
+ 0xD94B: 0x8CB9, //CJK UNIFIED IDEOGRAPH
+ 0xD94C: 0x8CBA, //CJK UNIFIED IDEOGRAPH
+ 0xD94D: 0x8CBB, //CJK UNIFIED IDEOGRAPH
+ 0xD94E: 0x8CBC, //CJK UNIFIED IDEOGRAPH
+ 0xD94F: 0x8CBD, //CJK UNIFIED IDEOGRAPH
+ 0xD950: 0x8CBE, //CJK UNIFIED IDEOGRAPH
+ 0xD951: 0x8CBF, //CJK UNIFIED IDEOGRAPH
+ 0xD952: 0x8CC0, //CJK UNIFIED IDEOGRAPH
+ 0xD953: 0x8CC1, //CJK UNIFIED IDEOGRAPH
+ 0xD954: 0x8CC2, //CJK UNIFIED IDEOGRAPH
+ 0xD955: 0x8CC3, //CJK UNIFIED IDEOGRAPH
+ 0xD956: 0x8CC4, //CJK UNIFIED IDEOGRAPH
+ 0xD957: 0x8CC5, //CJK UNIFIED IDEOGRAPH
+ 0xD958: 0x8CC6, //CJK UNIFIED IDEOGRAPH
+ 0xD959: 0x8CC7, //CJK UNIFIED IDEOGRAPH
+ 0xD95A: 0x8CC8, //CJK UNIFIED IDEOGRAPH
+ 0xD95B: 0x8CC9, //CJK UNIFIED IDEOGRAPH
+ 0xD95C: 0x8CCA, //CJK UNIFIED IDEOGRAPH
+ 0xD95D: 0x8CCB, //CJK UNIFIED IDEOGRAPH
+ 0xD95E: 0x8CCC, //CJK UNIFIED IDEOGRAPH
+ 0xD95F: 0x8CCD, //CJK UNIFIED IDEOGRAPH
+ 0xD960: 0x8CCE, //CJK UNIFIED IDEOGRAPH
+ 0xD961: 0x8CCF, //CJK UNIFIED IDEOGRAPH
+ 0xD962: 0x8CD0, //CJK UNIFIED IDEOGRAPH
+ 0xD963: 0x8CD1, //CJK UNIFIED IDEOGRAPH
+ 0xD964: 0x8CD2, //CJK UNIFIED IDEOGRAPH
+ 0xD965: 0x8CD3, //CJK UNIFIED IDEOGRAPH
+ 0xD966: 0x8CD4, //CJK UNIFIED IDEOGRAPH
+ 0xD967: 0x8CD5, //CJK UNIFIED IDEOGRAPH
+ 0xD968: 0x8CD6, //CJK UNIFIED IDEOGRAPH
+ 0xD969: 0x8CD7, //CJK UNIFIED IDEOGRAPH
+ 0xD96A: 0x8CD8, //CJK UNIFIED IDEOGRAPH
+ 0xD96B: 0x8CD9, //CJK UNIFIED IDEOGRAPH
+ 0xD96C: 0x8CDA, //CJK UNIFIED IDEOGRAPH
+ 0xD96D: 0x8CDB, //CJK UNIFIED IDEOGRAPH
+ 0xD96E: 0x8CDC, //CJK UNIFIED IDEOGRAPH
+ 0xD96F: 0x8CDD, //CJK UNIFIED IDEOGRAPH
+ 0xD970: 0x8CDE, //CJK UNIFIED IDEOGRAPH
+ 0xD971: 0x8CDF, //CJK UNIFIED IDEOGRAPH
+ 0xD972: 0x8CE0, //CJK UNIFIED IDEOGRAPH
+ 0xD973: 0x8CE1, //CJK UNIFIED IDEOGRAPH
+ 0xD974: 0x8CE2, //CJK UNIFIED IDEOGRAPH
+ 0xD975: 0x8CE3, //CJK UNIFIED IDEOGRAPH
+ 0xD976: 0x8CE4, //CJK UNIFIED IDEOGRAPH
+ 0xD977: 0x8CE5, //CJK UNIFIED IDEOGRAPH
+ 0xD978: 0x8CE6, //CJK UNIFIED IDEOGRAPH
+ 0xD979: 0x8CE7, //CJK UNIFIED IDEOGRAPH
+ 0xD97A: 0x8CE8, //CJK UNIFIED IDEOGRAPH
+ 0xD97B: 0x8CE9, //CJK UNIFIED IDEOGRAPH
+ 0xD97C: 0x8CEA, //CJK UNIFIED IDEOGRAPH
+ 0xD97D: 0x8CEB, //CJK UNIFIED IDEOGRAPH
+ 0xD97E: 0x8CEC, //CJK UNIFIED IDEOGRAPH
+ 0xD980: 0x8CED, //CJK UNIFIED IDEOGRAPH
+ 0xD981: 0x8CEE, //CJK UNIFIED IDEOGRAPH
+ 0xD982: 0x8CEF, //CJK UNIFIED IDEOGRAPH
+ 0xD983: 0x8CF0, //CJK UNIFIED IDEOGRAPH
+ 0xD984: 0x8CF1, //CJK UNIFIED IDEOGRAPH
+ 0xD985: 0x8CF2, //CJK UNIFIED IDEOGRAPH
+ 0xD986: 0x8CF3, //CJK UNIFIED IDEOGRAPH
+ 0xD987: 0x8CF4, //CJK UNIFIED IDEOGRAPH
+ 0xD988: 0x8CF5, //CJK UNIFIED IDEOGRAPH
+ 0xD989: 0x8CF6, //CJK UNIFIED IDEOGRAPH
+ 0xD98A: 0x8CF7, //CJK UNIFIED IDEOGRAPH
+ 0xD98B: 0x8CF8, //CJK UNIFIED IDEOGRAPH
+ 0xD98C: 0x8CF9, //CJK UNIFIED IDEOGRAPH
+ 0xD98D: 0x8CFA, //CJK UNIFIED IDEOGRAPH
+ 0xD98E: 0x8CFB, //CJK UNIFIED IDEOGRAPH
+ 0xD98F: 0x8CFC, //CJK UNIFIED IDEOGRAPH
+ 0xD990: 0x8CFD, //CJK UNIFIED IDEOGRAPH
+ 0xD991: 0x8CFE, //CJK UNIFIED IDEOGRAPH
+ 0xD992: 0x8CFF, //CJK UNIFIED IDEOGRAPH
+ 0xD993: 0x8D00, //CJK UNIFIED IDEOGRAPH
+ 0xD994: 0x8D01, //CJK UNIFIED IDEOGRAPH
+ 0xD995: 0x8D02, //CJK UNIFIED IDEOGRAPH
+ 0xD996: 0x8D03, //CJK UNIFIED IDEOGRAPH
+ 0xD997: 0x8D04, //CJK UNIFIED IDEOGRAPH
+ 0xD998: 0x8D05, //CJK UNIFIED IDEOGRAPH
+ 0xD999: 0x8D06, //CJK UNIFIED IDEOGRAPH
+ 0xD99A: 0x8D07, //CJK UNIFIED IDEOGRAPH
+ 0xD99B: 0x8D08, //CJK UNIFIED IDEOGRAPH
+ 0xD99C: 0x8D09, //CJK UNIFIED IDEOGRAPH
+ 0xD99D: 0x8D0A, //CJK UNIFIED IDEOGRAPH
+ 0xD99E: 0x8D0B, //CJK UNIFIED IDEOGRAPH
+ 0xD99F: 0x8D0C, //CJK UNIFIED IDEOGRAPH
+ 0xD9A0: 0x8D0D, //CJK UNIFIED IDEOGRAPH
+ 0xD9A1: 0x4F5F, //CJK UNIFIED IDEOGRAPH
+ 0xD9A2: 0x4F57, //CJK UNIFIED IDEOGRAPH
+ 0xD9A3: 0x4F32, //CJK UNIFIED IDEOGRAPH
+ 0xD9A4: 0x4F3D, //CJK UNIFIED IDEOGRAPH
+ 0xD9A5: 0x4F76, //CJK UNIFIED IDEOGRAPH
+ 0xD9A6: 0x4F74, //CJK UNIFIED IDEOGRAPH
+ 0xD9A7: 0x4F91, //CJK UNIFIED IDEOGRAPH
+ 0xD9A8: 0x4F89, //CJK UNIFIED IDEOGRAPH
+ 0xD9A9: 0x4F83, //CJK UNIFIED IDEOGRAPH
+ 0xD9AA: 0x4F8F, //CJK UNIFIED IDEOGRAPH
+ 0xD9AB: 0x4F7E, //CJK UNIFIED IDEOGRAPH
+ 0xD9AC: 0x4F7B, //CJK UNIFIED IDEOGRAPH
+ 0xD9AD: 0x4FAA, //CJK UNIFIED IDEOGRAPH
+ 0xD9AE: 0x4F7C, //CJK UNIFIED IDEOGRAPH
+ 0xD9AF: 0x4FAC, //CJK UNIFIED IDEOGRAPH
+ 0xD9B0: 0x4F94, //CJK UNIFIED IDEOGRAPH
+ 0xD9B1: 0x4FE6, //CJK UNIFIED IDEOGRAPH
+ 0xD9B2: 0x4FE8, //CJK UNIFIED IDEOGRAPH
+ 0xD9B3: 0x4FEA, //CJK UNIFIED IDEOGRAPH
+ 0xD9B4: 0x4FC5, //CJK UNIFIED IDEOGRAPH
+ 0xD9B5: 0x4FDA, //CJK UNIFIED IDEOGRAPH
+ 0xD9B6: 0x4FE3, //CJK UNIFIED IDEOGRAPH
+ 0xD9B7: 0x4FDC, //CJK UNIFIED IDEOGRAPH
+ 0xD9B8: 0x4FD1, //CJK UNIFIED IDEOGRAPH
+ 0xD9B9: 0x4FDF, //CJK UNIFIED IDEOGRAPH
+ 0xD9BA: 0x4FF8, //CJK UNIFIED IDEOGRAPH
+ 0xD9BB: 0x5029, //CJK UNIFIED IDEOGRAPH
+ 0xD9BC: 0x504C, //CJK UNIFIED IDEOGRAPH
+ 0xD9BD: 0x4FF3, //CJK UNIFIED IDEOGRAPH
+ 0xD9BE: 0x502C, //CJK UNIFIED IDEOGRAPH
+ 0xD9BF: 0x500F, //CJK UNIFIED IDEOGRAPH
+ 0xD9C0: 0x502E, //CJK UNIFIED IDEOGRAPH
+ 0xD9C1: 0x502D, //CJK UNIFIED IDEOGRAPH
+ 0xD9C2: 0x4FFE, //CJK UNIFIED IDEOGRAPH
+ 0xD9C3: 0x501C, //CJK UNIFIED IDEOGRAPH
+ 0xD9C4: 0x500C, //CJK UNIFIED IDEOGRAPH
+ 0xD9C5: 0x5025, //CJK UNIFIED IDEOGRAPH
+ 0xD9C6: 0x5028, //CJK UNIFIED IDEOGRAPH
+ 0xD9C7: 0x507E, //CJK UNIFIED IDEOGRAPH
+ 0xD9C8: 0x5043, //CJK UNIFIED IDEOGRAPH
+ 0xD9C9: 0x5055, //CJK UNIFIED IDEOGRAPH
+ 0xD9CA: 0x5048, //CJK UNIFIED IDEOGRAPH
+ 0xD9CB: 0x504E, //CJK UNIFIED IDEOGRAPH
+ 0xD9CC: 0x506C, //CJK UNIFIED IDEOGRAPH
+ 0xD9CD: 0x507B, //CJK UNIFIED IDEOGRAPH
+ 0xD9CE: 0x50A5, //CJK UNIFIED IDEOGRAPH
+ 0xD9CF: 0x50A7, //CJK UNIFIED IDEOGRAPH
+ 0xD9D0: 0x50A9, //CJK UNIFIED IDEOGRAPH
+ 0xD9D1: 0x50BA, //CJK UNIFIED IDEOGRAPH
+ 0xD9D2: 0x50D6, //CJK UNIFIED IDEOGRAPH
+ 0xD9D3: 0x5106, //CJK UNIFIED IDEOGRAPH
+ 0xD9D4: 0x50ED, //CJK UNIFIED IDEOGRAPH
+ 0xD9D5: 0x50EC, //CJK UNIFIED IDEOGRAPH
+ 0xD9D6: 0x50E6, //CJK UNIFIED IDEOGRAPH
+ 0xD9D7: 0x50EE, //CJK UNIFIED IDEOGRAPH
+ 0xD9D8: 0x5107, //CJK UNIFIED IDEOGRAPH
+ 0xD9D9: 0x510B, //CJK UNIFIED IDEOGRAPH
+ 0xD9DA: 0x4EDD, //CJK UNIFIED IDEOGRAPH
+ 0xD9DB: 0x6C3D, //CJK UNIFIED IDEOGRAPH
+ 0xD9DC: 0x4F58, //CJK UNIFIED IDEOGRAPH
+ 0xD9DD: 0x4F65, //CJK UNIFIED IDEOGRAPH
+ 0xD9DE: 0x4FCE, //CJK UNIFIED IDEOGRAPH
+ 0xD9DF: 0x9FA0, //CJK UNIFIED IDEOGRAPH
+ 0xD9E0: 0x6C46, //CJK UNIFIED IDEOGRAPH
+ 0xD9E1: 0x7C74, //CJK UNIFIED IDEOGRAPH
+ 0xD9E2: 0x516E, //CJK UNIFIED IDEOGRAPH
+ 0xD9E3: 0x5DFD, //CJK UNIFIED IDEOGRAPH
+ 0xD9E4: 0x9EC9, //CJK UNIFIED IDEOGRAPH
+ 0xD9E5: 0x9998, //CJK UNIFIED IDEOGRAPH
+ 0xD9E6: 0x5181, //CJK UNIFIED IDEOGRAPH
+ 0xD9E7: 0x5914, //CJK UNIFIED IDEOGRAPH
+ 0xD9E8: 0x52F9, //CJK UNIFIED IDEOGRAPH
+ 0xD9E9: 0x530D, //CJK UNIFIED IDEOGRAPH
+ 0xD9EA: 0x8A07, //CJK UNIFIED IDEOGRAPH
+ 0xD9EB: 0x5310, //CJK UNIFIED IDEOGRAPH
+ 0xD9EC: 0x51EB, //CJK UNIFIED IDEOGRAPH
+ 0xD9ED: 0x5919, //CJK UNIFIED IDEOGRAPH
+ 0xD9EE: 0x5155, //CJK UNIFIED IDEOGRAPH
+ 0xD9EF: 0x4EA0, //CJK UNIFIED IDEOGRAPH
+ 0xD9F0: 0x5156, //CJK UNIFIED IDEOGRAPH
+ 0xD9F1: 0x4EB3, //CJK UNIFIED IDEOGRAPH
+ 0xD9F2: 0x886E, //CJK UNIFIED IDEOGRAPH
+ 0xD9F3: 0x88A4, //CJK UNIFIED IDEOGRAPH
+ 0xD9F4: 0x4EB5, //CJK UNIFIED IDEOGRAPH
+ 0xD9F5: 0x8114, //CJK UNIFIED IDEOGRAPH
+ 0xD9F6: 0x88D2, //CJK UNIFIED IDEOGRAPH
+ 0xD9F7: 0x7980, //CJK UNIFIED IDEOGRAPH
+ 0xD9F8: 0x5B34, //CJK UNIFIED IDEOGRAPH
+ 0xD9F9: 0x8803, //CJK UNIFIED IDEOGRAPH
+ 0xD9FA: 0x7FB8, //CJK UNIFIED IDEOGRAPH
+ 0xD9FB: 0x51AB, //CJK UNIFIED IDEOGRAPH
+ 0xD9FC: 0x51B1, //CJK UNIFIED IDEOGRAPH
+ 0xD9FD: 0x51BD, //CJK UNIFIED IDEOGRAPH
+ 0xD9FE: 0x51BC, //CJK UNIFIED IDEOGRAPH
+ 0xDA40: 0x8D0E, //CJK UNIFIED IDEOGRAPH
+ 0xDA41: 0x8D0F, //CJK UNIFIED IDEOGRAPH
+ 0xDA42: 0x8D10, //CJK UNIFIED IDEOGRAPH
+ 0xDA43: 0x8D11, //CJK UNIFIED IDEOGRAPH
+ 0xDA44: 0x8D12, //CJK UNIFIED IDEOGRAPH
+ 0xDA45: 0x8D13, //CJK UNIFIED IDEOGRAPH
+ 0xDA46: 0x8D14, //CJK UNIFIED IDEOGRAPH
+ 0xDA47: 0x8D15, //CJK UNIFIED IDEOGRAPH
+ 0xDA48: 0x8D16, //CJK UNIFIED IDEOGRAPH
+ 0xDA49: 0x8D17, //CJK UNIFIED IDEOGRAPH
+ 0xDA4A: 0x8D18, //CJK UNIFIED IDEOGRAPH
+ 0xDA4B: 0x8D19, //CJK UNIFIED IDEOGRAPH
+ 0xDA4C: 0x8D1A, //CJK UNIFIED IDEOGRAPH
+ 0xDA4D: 0x8D1B, //CJK UNIFIED IDEOGRAPH
+ 0xDA4E: 0x8D1C, //CJK UNIFIED IDEOGRAPH
+ 0xDA4F: 0x8D20, //CJK UNIFIED IDEOGRAPH
+ 0xDA50: 0x8D51, //CJK UNIFIED IDEOGRAPH
+ 0xDA51: 0x8D52, //CJK UNIFIED IDEOGRAPH
+ 0xDA52: 0x8D57, //CJK UNIFIED IDEOGRAPH
+ 0xDA53: 0x8D5F, //CJK UNIFIED IDEOGRAPH
+ 0xDA54: 0x8D65, //CJK UNIFIED IDEOGRAPH
+ 0xDA55: 0x8D68, //CJK UNIFIED IDEOGRAPH
+ 0xDA56: 0x8D69, //CJK UNIFIED IDEOGRAPH
+ 0xDA57: 0x8D6A, //CJK UNIFIED IDEOGRAPH
+ 0xDA58: 0x8D6C, //CJK UNIFIED IDEOGRAPH
+ 0xDA59: 0x8D6E, //CJK UNIFIED IDEOGRAPH
+ 0xDA5A: 0x8D6F, //CJK UNIFIED IDEOGRAPH
+ 0xDA5B: 0x8D71, //CJK UNIFIED IDEOGRAPH
+ 0xDA5C: 0x8D72, //CJK UNIFIED IDEOGRAPH
+ 0xDA5D: 0x8D78, //CJK UNIFIED IDEOGRAPH
+ 0xDA5E: 0x8D79, //CJK UNIFIED IDEOGRAPH
+ 0xDA5F: 0x8D7A, //CJK UNIFIED IDEOGRAPH
+ 0xDA60: 0x8D7B, //CJK UNIFIED IDEOGRAPH
+ 0xDA61: 0x8D7C, //CJK UNIFIED IDEOGRAPH
+ 0xDA62: 0x8D7D, //CJK UNIFIED IDEOGRAPH
+ 0xDA63: 0x8D7E, //CJK UNIFIED IDEOGRAPH
+ 0xDA64: 0x8D7F, //CJK UNIFIED IDEOGRAPH
+ 0xDA65: 0x8D80, //CJK UNIFIED IDEOGRAPH
+ 0xDA66: 0x8D82, //CJK UNIFIED IDEOGRAPH
+ 0xDA67: 0x8D83, //CJK UNIFIED IDEOGRAPH
+ 0xDA68: 0x8D86, //CJK UNIFIED IDEOGRAPH
+ 0xDA69: 0x8D87, //CJK UNIFIED IDEOGRAPH
+ 0xDA6A: 0x8D88, //CJK UNIFIED IDEOGRAPH
+ 0xDA6B: 0x8D89, //CJK UNIFIED IDEOGRAPH
+ 0xDA6C: 0x8D8C, //CJK UNIFIED IDEOGRAPH
+ 0xDA6D: 0x8D8D, //CJK UNIFIED IDEOGRAPH
+ 0xDA6E: 0x8D8E, //CJK UNIFIED IDEOGRAPH
+ 0xDA6F: 0x8D8F, //CJK UNIFIED IDEOGRAPH
+ 0xDA70: 0x8D90, //CJK UNIFIED IDEOGRAPH
+ 0xDA71: 0x8D92, //CJK UNIFIED IDEOGRAPH
+ 0xDA72: 0x8D93, //CJK UNIFIED IDEOGRAPH
+ 0xDA73: 0x8D95, //CJK UNIFIED IDEOGRAPH
+ 0xDA74: 0x8D96, //CJK UNIFIED IDEOGRAPH
+ 0xDA75: 0x8D97, //CJK UNIFIED IDEOGRAPH
+ 0xDA76: 0x8D98, //CJK UNIFIED IDEOGRAPH
+ 0xDA77: 0x8D99, //CJK UNIFIED IDEOGRAPH
+ 0xDA78: 0x8D9A, //CJK UNIFIED IDEOGRAPH
+ 0xDA79: 0x8D9B, //CJK UNIFIED IDEOGRAPH
+ 0xDA7A: 0x8D9C, //CJK UNIFIED IDEOGRAPH
+ 0xDA7B: 0x8D9D, //CJK UNIFIED IDEOGRAPH
+ 0xDA7C: 0x8D9E, //CJK UNIFIED IDEOGRAPH
+ 0xDA7D: 0x8DA0, //CJK UNIFIED IDEOGRAPH
+ 0xDA7E: 0x8DA1, //CJK UNIFIED IDEOGRAPH
+ 0xDA80: 0x8DA2, //CJK UNIFIED IDEOGRAPH
+ 0xDA81: 0x8DA4, //CJK UNIFIED IDEOGRAPH
+ 0xDA82: 0x8DA5, //CJK UNIFIED IDEOGRAPH
+ 0xDA83: 0x8DA6, //CJK UNIFIED IDEOGRAPH
+ 0xDA84: 0x8DA7, //CJK UNIFIED IDEOGRAPH
+ 0xDA85: 0x8DA8, //CJK UNIFIED IDEOGRAPH
+ 0xDA86: 0x8DA9, //CJK UNIFIED IDEOGRAPH
+ 0xDA87: 0x8DAA, //CJK UNIFIED IDEOGRAPH
+ 0xDA88: 0x8DAB, //CJK UNIFIED IDEOGRAPH
+ 0xDA89: 0x8DAC, //CJK UNIFIED IDEOGRAPH
+ 0xDA8A: 0x8DAD, //CJK UNIFIED IDEOGRAPH
+ 0xDA8B: 0x8DAE, //CJK UNIFIED IDEOGRAPH
+ 0xDA8C: 0x8DAF, //CJK UNIFIED IDEOGRAPH
+ 0xDA8D: 0x8DB0, //CJK UNIFIED IDEOGRAPH
+ 0xDA8E: 0x8DB2, //CJK UNIFIED IDEOGRAPH
+ 0xDA8F: 0x8DB6, //CJK UNIFIED IDEOGRAPH
+ 0xDA90: 0x8DB7, //CJK UNIFIED IDEOGRAPH
+ 0xDA91: 0x8DB9, //CJK UNIFIED IDEOGRAPH
+ 0xDA92: 0x8DBB, //CJK UNIFIED IDEOGRAPH
+ 0xDA93: 0x8DBD, //CJK UNIFIED IDEOGRAPH
+ 0xDA94: 0x8DC0, //CJK UNIFIED IDEOGRAPH
+ 0xDA95: 0x8DC1, //CJK UNIFIED IDEOGRAPH
+ 0xDA96: 0x8DC2, //CJK UNIFIED IDEOGRAPH
+ 0xDA97: 0x8DC5, //CJK UNIFIED IDEOGRAPH
+ 0xDA98: 0x8DC7, //CJK UNIFIED IDEOGRAPH
+ 0xDA99: 0x8DC8, //CJK UNIFIED IDEOGRAPH
+ 0xDA9A: 0x8DC9, //CJK UNIFIED IDEOGRAPH
+ 0xDA9B: 0x8DCA, //CJK UNIFIED IDEOGRAPH
+ 0xDA9C: 0x8DCD, //CJK UNIFIED IDEOGRAPH
+ 0xDA9D: 0x8DD0, //CJK UNIFIED IDEOGRAPH
+ 0xDA9E: 0x8DD2, //CJK UNIFIED IDEOGRAPH
+ 0xDA9F: 0x8DD3, //CJK UNIFIED IDEOGRAPH
+ 0xDAA0: 0x8DD4, //CJK UNIFIED IDEOGRAPH
+ 0xDAA1: 0x51C7, //CJK UNIFIED IDEOGRAPH
+ 0xDAA2: 0x5196, //CJK UNIFIED IDEOGRAPH
+ 0xDAA3: 0x51A2, //CJK UNIFIED IDEOGRAPH
+ 0xDAA4: 0x51A5, //CJK UNIFIED IDEOGRAPH
+ 0xDAA5: 0x8BA0, //CJK UNIFIED IDEOGRAPH
+ 0xDAA6: 0x8BA6, //CJK UNIFIED IDEOGRAPH
+ 0xDAA7: 0x8BA7, //CJK UNIFIED IDEOGRAPH
+ 0xDAA8: 0x8BAA, //CJK UNIFIED IDEOGRAPH
+ 0xDAA9: 0x8BB4, //CJK UNIFIED IDEOGRAPH
+ 0xDAAA: 0x8BB5, //CJK UNIFIED IDEOGRAPH
+ 0xDAAB: 0x8BB7, //CJK UNIFIED IDEOGRAPH
+ 0xDAAC: 0x8BC2, //CJK UNIFIED IDEOGRAPH
+ 0xDAAD: 0x8BC3, //CJK UNIFIED IDEOGRAPH
+ 0xDAAE: 0x8BCB, //CJK UNIFIED IDEOGRAPH
+ 0xDAAF: 0x8BCF, //CJK UNIFIED IDEOGRAPH
+ 0xDAB0: 0x8BCE, //CJK UNIFIED IDEOGRAPH
+ 0xDAB1: 0x8BD2, //CJK UNIFIED IDEOGRAPH
+ 0xDAB2: 0x8BD3, //CJK UNIFIED IDEOGRAPH
+ 0xDAB3: 0x8BD4, //CJK UNIFIED IDEOGRAPH
+ 0xDAB4: 0x8BD6, //CJK UNIFIED IDEOGRAPH
+ 0xDAB5: 0x8BD8, //CJK UNIFIED IDEOGRAPH
+ 0xDAB6: 0x8BD9, //CJK UNIFIED IDEOGRAPH
+ 0xDAB7: 0x8BDC, //CJK UNIFIED IDEOGRAPH
+ 0xDAB8: 0x8BDF, //CJK UNIFIED IDEOGRAPH
+ 0xDAB9: 0x8BE0, //CJK UNIFIED IDEOGRAPH
+ 0xDABA: 0x8BE4, //CJK UNIFIED IDEOGRAPH
+ 0xDABB: 0x8BE8, //CJK UNIFIED IDEOGRAPH
+ 0xDABC: 0x8BE9, //CJK UNIFIED IDEOGRAPH
+ 0xDABD: 0x8BEE, //CJK UNIFIED IDEOGRAPH
+ 0xDABE: 0x8BF0, //CJK UNIFIED IDEOGRAPH
+ 0xDABF: 0x8BF3, //CJK UNIFIED IDEOGRAPH
+ 0xDAC0: 0x8BF6, //CJK UNIFIED IDEOGRAPH
+ 0xDAC1: 0x8BF9, //CJK UNIFIED IDEOGRAPH
+ 0xDAC2: 0x8BFC, //CJK UNIFIED IDEOGRAPH
+ 0xDAC3: 0x8BFF, //CJK UNIFIED IDEOGRAPH
+ 0xDAC4: 0x8C00, //CJK UNIFIED IDEOGRAPH
+ 0xDAC5: 0x8C02, //CJK UNIFIED IDEOGRAPH
+ 0xDAC6: 0x8C04, //CJK UNIFIED IDEOGRAPH
+ 0xDAC7: 0x8C07, //CJK UNIFIED IDEOGRAPH
+ 0xDAC8: 0x8C0C, //CJK UNIFIED IDEOGRAPH
+ 0xDAC9: 0x8C0F, //CJK UNIFIED IDEOGRAPH
+ 0xDACA: 0x8C11, //CJK UNIFIED IDEOGRAPH
+ 0xDACB: 0x8C12, //CJK UNIFIED IDEOGRAPH
+ 0xDACC: 0x8C14, //CJK UNIFIED IDEOGRAPH
+ 0xDACD: 0x8C15, //CJK UNIFIED IDEOGRAPH
+ 0xDACE: 0x8C16, //CJK UNIFIED IDEOGRAPH
+ 0xDACF: 0x8C19, //CJK UNIFIED IDEOGRAPH
+ 0xDAD0: 0x8C1B, //CJK UNIFIED IDEOGRAPH
+ 0xDAD1: 0x8C18, //CJK UNIFIED IDEOGRAPH
+ 0xDAD2: 0x8C1D, //CJK UNIFIED IDEOGRAPH
+ 0xDAD3: 0x8C1F, //CJK UNIFIED IDEOGRAPH
+ 0xDAD4: 0x8C20, //CJK UNIFIED IDEOGRAPH
+ 0xDAD5: 0x8C21, //CJK UNIFIED IDEOGRAPH
+ 0xDAD6: 0x8C25, //CJK UNIFIED IDEOGRAPH
+ 0xDAD7: 0x8C27, //CJK UNIFIED IDEOGRAPH
+ 0xDAD8: 0x8C2A, //CJK UNIFIED IDEOGRAPH
+ 0xDAD9: 0x8C2B, //CJK UNIFIED IDEOGRAPH
+ 0xDADA: 0x8C2E, //CJK UNIFIED IDEOGRAPH
+ 0xDADB: 0x8C2F, //CJK UNIFIED IDEOGRAPH
+ 0xDADC: 0x8C32, //CJK UNIFIED IDEOGRAPH
+ 0xDADD: 0x8C33, //CJK UNIFIED IDEOGRAPH
+ 0xDADE: 0x8C35, //CJK UNIFIED IDEOGRAPH
+ 0xDADF: 0x8C36, //CJK UNIFIED IDEOGRAPH
+ 0xDAE0: 0x5369, //CJK UNIFIED IDEOGRAPH
+ 0xDAE1: 0x537A, //CJK UNIFIED IDEOGRAPH
+ 0xDAE2: 0x961D, //CJK UNIFIED IDEOGRAPH
+ 0xDAE3: 0x9622, //CJK UNIFIED IDEOGRAPH
+ 0xDAE4: 0x9621, //CJK UNIFIED IDEOGRAPH
+ 0xDAE5: 0x9631, //CJK UNIFIED IDEOGRAPH
+ 0xDAE6: 0x962A, //CJK UNIFIED IDEOGRAPH
+ 0xDAE7: 0x963D, //CJK UNIFIED IDEOGRAPH
+ 0xDAE8: 0x963C, //CJK UNIFIED IDEOGRAPH
+ 0xDAE9: 0x9642, //CJK UNIFIED IDEOGRAPH
+ 0xDAEA: 0x9649, //CJK UNIFIED IDEOGRAPH
+ 0xDAEB: 0x9654, //CJK UNIFIED IDEOGRAPH
+ 0xDAEC: 0x965F, //CJK UNIFIED IDEOGRAPH
+ 0xDAED: 0x9667, //CJK UNIFIED IDEOGRAPH
+ 0xDAEE: 0x966C, //CJK UNIFIED IDEOGRAPH
+ 0xDAEF: 0x9672, //CJK UNIFIED IDEOGRAPH
+ 0xDAF0: 0x9674, //CJK UNIFIED IDEOGRAPH
+ 0xDAF1: 0x9688, //CJK UNIFIED IDEOGRAPH
+ 0xDAF2: 0x968D, //CJK UNIFIED IDEOGRAPH
+ 0xDAF3: 0x9697, //CJK UNIFIED IDEOGRAPH
+ 0xDAF4: 0x96B0, //CJK UNIFIED IDEOGRAPH
+ 0xDAF5: 0x9097, //CJK UNIFIED IDEOGRAPH
+ 0xDAF6: 0x909B, //CJK UNIFIED IDEOGRAPH
+ 0xDAF7: 0x909D, //CJK UNIFIED IDEOGRAPH
+ 0xDAF8: 0x9099, //CJK UNIFIED IDEOGRAPH
+ 0xDAF9: 0x90AC, //CJK UNIFIED IDEOGRAPH
+ 0xDAFA: 0x90A1, //CJK UNIFIED IDEOGRAPH
+ 0xDAFB: 0x90B4, //CJK UNIFIED IDEOGRAPH
+ 0xDAFC: 0x90B3, //CJK UNIFIED IDEOGRAPH
+ 0xDAFD: 0x90B6, //CJK UNIFIED IDEOGRAPH
+ 0xDAFE: 0x90BA, //CJK UNIFIED IDEOGRAPH
+ 0xDB40: 0x8DD5, //CJK UNIFIED IDEOGRAPH
+ 0xDB41: 0x8DD8, //CJK UNIFIED IDEOGRAPH
+ 0xDB42: 0x8DD9, //CJK UNIFIED IDEOGRAPH
+ 0xDB43: 0x8DDC, //CJK UNIFIED IDEOGRAPH
+ 0xDB44: 0x8DE0, //CJK UNIFIED IDEOGRAPH
+ 0xDB45: 0x8DE1, //CJK UNIFIED IDEOGRAPH
+ 0xDB46: 0x8DE2, //CJK UNIFIED IDEOGRAPH
+ 0xDB47: 0x8DE5, //CJK UNIFIED IDEOGRAPH
+ 0xDB48: 0x8DE6, //CJK UNIFIED IDEOGRAPH
+ 0xDB49: 0x8DE7, //CJK UNIFIED IDEOGRAPH
+ 0xDB4A: 0x8DE9, //CJK UNIFIED IDEOGRAPH
+ 0xDB4B: 0x8DED, //CJK UNIFIED IDEOGRAPH
+ 0xDB4C: 0x8DEE, //CJK UNIFIED IDEOGRAPH
+ 0xDB4D: 0x8DF0, //CJK UNIFIED IDEOGRAPH
+ 0xDB4E: 0x8DF1, //CJK UNIFIED IDEOGRAPH
+ 0xDB4F: 0x8DF2, //CJK UNIFIED IDEOGRAPH
+ 0xDB50: 0x8DF4, //CJK UNIFIED IDEOGRAPH
+ 0xDB51: 0x8DF6, //CJK UNIFIED IDEOGRAPH
+ 0xDB52: 0x8DFC, //CJK UNIFIED IDEOGRAPH
+ 0xDB53: 0x8DFE, //CJK UNIFIED IDEOGRAPH
+ 0xDB54: 0x8DFF, //CJK UNIFIED IDEOGRAPH
+ 0xDB55: 0x8E00, //CJK UNIFIED IDEOGRAPH
+ 0xDB56: 0x8E01, //CJK UNIFIED IDEOGRAPH
+ 0xDB57: 0x8E02, //CJK UNIFIED IDEOGRAPH
+ 0xDB58: 0x8E03, //CJK UNIFIED IDEOGRAPH
+ 0xDB59: 0x8E04, //CJK UNIFIED IDEOGRAPH
+ 0xDB5A: 0x8E06, //CJK UNIFIED IDEOGRAPH
+ 0xDB5B: 0x8E07, //CJK UNIFIED IDEOGRAPH
+ 0xDB5C: 0x8E08, //CJK UNIFIED IDEOGRAPH
+ 0xDB5D: 0x8E0B, //CJK UNIFIED IDEOGRAPH
+ 0xDB5E: 0x8E0D, //CJK UNIFIED IDEOGRAPH
+ 0xDB5F: 0x8E0E, //CJK UNIFIED IDEOGRAPH
+ 0xDB60: 0x8E10, //CJK UNIFIED IDEOGRAPH
+ 0xDB61: 0x8E11, //CJK UNIFIED IDEOGRAPH
+ 0xDB62: 0x8E12, //CJK UNIFIED IDEOGRAPH
+ 0xDB63: 0x8E13, //CJK UNIFIED IDEOGRAPH
+ 0xDB64: 0x8E15, //CJK UNIFIED IDEOGRAPH
+ 0xDB65: 0x8E16, //CJK UNIFIED IDEOGRAPH
+ 0xDB66: 0x8E17, //CJK UNIFIED IDEOGRAPH
+ 0xDB67: 0x8E18, //CJK UNIFIED IDEOGRAPH
+ 0xDB68: 0x8E19, //CJK UNIFIED IDEOGRAPH
+ 0xDB69: 0x8E1A, //CJK UNIFIED IDEOGRAPH
+ 0xDB6A: 0x8E1B, //CJK UNIFIED IDEOGRAPH
+ 0xDB6B: 0x8E1C, //CJK UNIFIED IDEOGRAPH
+ 0xDB6C: 0x8E20, //CJK UNIFIED IDEOGRAPH
+ 0xDB6D: 0x8E21, //CJK UNIFIED IDEOGRAPH
+ 0xDB6E: 0x8E24, //CJK UNIFIED IDEOGRAPH
+ 0xDB6F: 0x8E25, //CJK UNIFIED IDEOGRAPH
+ 0xDB70: 0x8E26, //CJK UNIFIED IDEOGRAPH
+ 0xDB71: 0x8E27, //CJK UNIFIED IDEOGRAPH
+ 0xDB72: 0x8E28, //CJK UNIFIED IDEOGRAPH
+ 0xDB73: 0x8E2B, //CJK UNIFIED IDEOGRAPH
+ 0xDB74: 0x8E2D, //CJK UNIFIED IDEOGRAPH
+ 0xDB75: 0x8E30, //CJK UNIFIED IDEOGRAPH
+ 0xDB76: 0x8E32, //CJK UNIFIED IDEOGRAPH
+ 0xDB77: 0x8E33, //CJK UNIFIED IDEOGRAPH
+ 0xDB78: 0x8E34, //CJK UNIFIED IDEOGRAPH
+ 0xDB79: 0x8E36, //CJK UNIFIED IDEOGRAPH
+ 0xDB7A: 0x8E37, //CJK UNIFIED IDEOGRAPH
+ 0xDB7B: 0x8E38, //CJK UNIFIED IDEOGRAPH
+ 0xDB7C: 0x8E3B, //CJK UNIFIED IDEOGRAPH
+ 0xDB7D: 0x8E3C, //CJK UNIFIED IDEOGRAPH
+ 0xDB7E: 0x8E3E, //CJK UNIFIED IDEOGRAPH
+ 0xDB80: 0x8E3F, //CJK UNIFIED IDEOGRAPH
+ 0xDB81: 0x8E43, //CJK UNIFIED IDEOGRAPH
+ 0xDB82: 0x8E45, //CJK UNIFIED IDEOGRAPH
+ 0xDB83: 0x8E46, //CJK UNIFIED IDEOGRAPH
+ 0xDB84: 0x8E4C, //CJK UNIFIED IDEOGRAPH
+ 0xDB85: 0x8E4D, //CJK UNIFIED IDEOGRAPH
+ 0xDB86: 0x8E4E, //CJK UNIFIED IDEOGRAPH
+ 0xDB87: 0x8E4F, //CJK UNIFIED IDEOGRAPH
+ 0xDB88: 0x8E50, //CJK UNIFIED IDEOGRAPH
+ 0xDB89: 0x8E53, //CJK UNIFIED IDEOGRAPH
+ 0xDB8A: 0x8E54, //CJK UNIFIED IDEOGRAPH
+ 0xDB8B: 0x8E55, //CJK UNIFIED IDEOGRAPH
+ 0xDB8C: 0x8E56, //CJK UNIFIED IDEOGRAPH
+ 0xDB8D: 0x8E57, //CJK UNIFIED IDEOGRAPH
+ 0xDB8E: 0x8E58, //CJK UNIFIED IDEOGRAPH
+ 0xDB8F: 0x8E5A, //CJK UNIFIED IDEOGRAPH
+ 0xDB90: 0x8E5B, //CJK UNIFIED IDEOGRAPH
+ 0xDB91: 0x8E5C, //CJK UNIFIED IDEOGRAPH
+ 0xDB92: 0x8E5D, //CJK UNIFIED IDEOGRAPH
+ 0xDB93: 0x8E5E, //CJK UNIFIED IDEOGRAPH
+ 0xDB94: 0x8E5F, //CJK UNIFIED IDEOGRAPH
+ 0xDB95: 0x8E60, //CJK UNIFIED IDEOGRAPH
+ 0xDB96: 0x8E61, //CJK UNIFIED IDEOGRAPH
+ 0xDB97: 0x8E62, //CJK UNIFIED IDEOGRAPH
+ 0xDB98: 0x8E63, //CJK UNIFIED IDEOGRAPH
+ 0xDB99: 0x8E64, //CJK UNIFIED IDEOGRAPH
+ 0xDB9A: 0x8E65, //CJK UNIFIED IDEOGRAPH
+ 0xDB9B: 0x8E67, //CJK UNIFIED IDEOGRAPH
+ 0xDB9C: 0x8E68, //CJK UNIFIED IDEOGRAPH
+ 0xDB9D: 0x8E6A, //CJK UNIFIED IDEOGRAPH
+ 0xDB9E: 0x8E6B, //CJK UNIFIED IDEOGRAPH
+ 0xDB9F: 0x8E6E, //CJK UNIFIED IDEOGRAPH
+ 0xDBA0: 0x8E71, //CJK UNIFIED IDEOGRAPH
+ 0xDBA1: 0x90B8, //CJK UNIFIED IDEOGRAPH
+ 0xDBA2: 0x90B0, //CJK UNIFIED IDEOGRAPH
+ 0xDBA3: 0x90CF, //CJK UNIFIED IDEOGRAPH
+ 0xDBA4: 0x90C5, //CJK UNIFIED IDEOGRAPH
+ 0xDBA5: 0x90BE, //CJK UNIFIED IDEOGRAPH
+ 0xDBA6: 0x90D0, //CJK UNIFIED IDEOGRAPH
+ 0xDBA7: 0x90C4, //CJK UNIFIED IDEOGRAPH
+ 0xDBA8: 0x90C7, //CJK UNIFIED IDEOGRAPH
+ 0xDBA9: 0x90D3, //CJK UNIFIED IDEOGRAPH
+ 0xDBAA: 0x90E6, //CJK UNIFIED IDEOGRAPH
+ 0xDBAB: 0x90E2, //CJK UNIFIED IDEOGRAPH
+ 0xDBAC: 0x90DC, //CJK UNIFIED IDEOGRAPH
+ 0xDBAD: 0x90D7, //CJK UNIFIED IDEOGRAPH
+ 0xDBAE: 0x90DB, //CJK UNIFIED IDEOGRAPH
+ 0xDBAF: 0x90EB, //CJK UNIFIED IDEOGRAPH
+ 0xDBB0: 0x90EF, //CJK UNIFIED IDEOGRAPH
+ 0xDBB1: 0x90FE, //CJK UNIFIED IDEOGRAPH
+ 0xDBB2: 0x9104, //CJK UNIFIED IDEOGRAPH
+ 0xDBB3: 0x9122, //CJK UNIFIED IDEOGRAPH
+ 0xDBB4: 0x911E, //CJK UNIFIED IDEOGRAPH
+ 0xDBB5: 0x9123, //CJK UNIFIED IDEOGRAPH
+ 0xDBB6: 0x9131, //CJK UNIFIED IDEOGRAPH
+ 0xDBB7: 0x912F, //CJK UNIFIED IDEOGRAPH
+ 0xDBB8: 0x9139, //CJK UNIFIED IDEOGRAPH
+ 0xDBB9: 0x9143, //CJK UNIFIED IDEOGRAPH
+ 0xDBBA: 0x9146, //CJK UNIFIED IDEOGRAPH
+ 0xDBBB: 0x520D, //CJK UNIFIED IDEOGRAPH
+ 0xDBBC: 0x5942, //CJK UNIFIED IDEOGRAPH
+ 0xDBBD: 0x52A2, //CJK UNIFIED IDEOGRAPH
+ 0xDBBE: 0x52AC, //CJK UNIFIED IDEOGRAPH
+ 0xDBBF: 0x52AD, //CJK UNIFIED IDEOGRAPH
+ 0xDBC0: 0x52BE, //CJK UNIFIED IDEOGRAPH
+ 0xDBC1: 0x54FF, //CJK UNIFIED IDEOGRAPH
+ 0xDBC2: 0x52D0, //CJK UNIFIED IDEOGRAPH
+ 0xDBC3: 0x52D6, //CJK UNIFIED IDEOGRAPH
+ 0xDBC4: 0x52F0, //CJK UNIFIED IDEOGRAPH
+ 0xDBC5: 0x53DF, //CJK UNIFIED IDEOGRAPH
+ 0xDBC6: 0x71EE, //CJK UNIFIED IDEOGRAPH
+ 0xDBC7: 0x77CD, //CJK UNIFIED IDEOGRAPH
+ 0xDBC8: 0x5EF4, //CJK UNIFIED IDEOGRAPH
+ 0xDBC9: 0x51F5, //CJK UNIFIED IDEOGRAPH
+ 0xDBCA: 0x51FC, //CJK UNIFIED IDEOGRAPH
+ 0xDBCB: 0x9B2F, //CJK UNIFIED IDEOGRAPH
+ 0xDBCC: 0x53B6, //CJK UNIFIED IDEOGRAPH
+ 0xDBCD: 0x5F01, //CJK UNIFIED IDEOGRAPH
+ 0xDBCE: 0x755A, //CJK UNIFIED IDEOGRAPH
+ 0xDBCF: 0x5DEF, //CJK UNIFIED IDEOGRAPH
+ 0xDBD0: 0x574C, //CJK UNIFIED IDEOGRAPH
+ 0xDBD1: 0x57A9, //CJK UNIFIED IDEOGRAPH
+ 0xDBD2: 0x57A1, //CJK UNIFIED IDEOGRAPH
+ 0xDBD3: 0x587E, //CJK UNIFIED IDEOGRAPH
+ 0xDBD4: 0x58BC, //CJK UNIFIED IDEOGRAPH
+ 0xDBD5: 0x58C5, //CJK UNIFIED IDEOGRAPH
+ 0xDBD6: 0x58D1, //CJK UNIFIED IDEOGRAPH
+ 0xDBD7: 0x5729, //CJK UNIFIED IDEOGRAPH
+ 0xDBD8: 0x572C, //CJK UNIFIED IDEOGRAPH
+ 0xDBD9: 0x572A, //CJK UNIFIED IDEOGRAPH
+ 0xDBDA: 0x5733, //CJK UNIFIED IDEOGRAPH
+ 0xDBDB: 0x5739, //CJK UNIFIED IDEOGRAPH
+ 0xDBDC: 0x572E, //CJK UNIFIED IDEOGRAPH
+ 0xDBDD: 0x572F, //CJK UNIFIED IDEOGRAPH
+ 0xDBDE: 0x575C, //CJK UNIFIED IDEOGRAPH
+ 0xDBDF: 0x573B, //CJK UNIFIED IDEOGRAPH
+ 0xDBE0: 0x5742, //CJK UNIFIED IDEOGRAPH
+ 0xDBE1: 0x5769, //CJK UNIFIED IDEOGRAPH
+ 0xDBE2: 0x5785, //CJK UNIFIED IDEOGRAPH
+ 0xDBE3: 0x576B, //CJK UNIFIED IDEOGRAPH
+ 0xDBE4: 0x5786, //CJK UNIFIED IDEOGRAPH
+ 0xDBE5: 0x577C, //CJK UNIFIED IDEOGRAPH
+ 0xDBE6: 0x577B, //CJK UNIFIED IDEOGRAPH
+ 0xDBE7: 0x5768, //CJK UNIFIED IDEOGRAPH
+ 0xDBE8: 0x576D, //CJK UNIFIED IDEOGRAPH
+ 0xDBE9: 0x5776, //CJK UNIFIED IDEOGRAPH
+ 0xDBEA: 0x5773, //CJK UNIFIED IDEOGRAPH
+ 0xDBEB: 0x57AD, //CJK UNIFIED IDEOGRAPH
+ 0xDBEC: 0x57A4, //CJK UNIFIED IDEOGRAPH
+ 0xDBED: 0x578C, //CJK UNIFIED IDEOGRAPH
+ 0xDBEE: 0x57B2, //CJK UNIFIED IDEOGRAPH
+ 0xDBEF: 0x57CF, //CJK UNIFIED IDEOGRAPH
+ 0xDBF0: 0x57A7, //CJK UNIFIED IDEOGRAPH
+ 0xDBF1: 0x57B4, //CJK UNIFIED IDEOGRAPH
+ 0xDBF2: 0x5793, //CJK UNIFIED IDEOGRAPH
+ 0xDBF3: 0x57A0, //CJK UNIFIED IDEOGRAPH
+ 0xDBF4: 0x57D5, //CJK UNIFIED IDEOGRAPH
+ 0xDBF5: 0x57D8, //CJK UNIFIED IDEOGRAPH
+ 0xDBF6: 0x57DA, //CJK UNIFIED IDEOGRAPH
+ 0xDBF7: 0x57D9, //CJK UNIFIED IDEOGRAPH
+ 0xDBF8: 0x57D2, //CJK UNIFIED IDEOGRAPH
+ 0xDBF9: 0x57B8, //CJK UNIFIED IDEOGRAPH
+ 0xDBFA: 0x57F4, //CJK UNIFIED IDEOGRAPH
+ 0xDBFB: 0x57EF, //CJK UNIFIED IDEOGRAPH
+ 0xDBFC: 0x57F8, //CJK UNIFIED IDEOGRAPH
+ 0xDBFD: 0x57E4, //CJK UNIFIED IDEOGRAPH
+ 0xDBFE: 0x57DD, //CJK UNIFIED IDEOGRAPH
+ 0xDC40: 0x8E73, //CJK UNIFIED IDEOGRAPH
+ 0xDC41: 0x8E75, //CJK UNIFIED IDEOGRAPH
+ 0xDC42: 0x8E77, //CJK UNIFIED IDEOGRAPH
+ 0xDC43: 0x8E78, //CJK UNIFIED IDEOGRAPH
+ 0xDC44: 0x8E79, //CJK UNIFIED IDEOGRAPH
+ 0xDC45: 0x8E7A, //CJK UNIFIED IDEOGRAPH
+ 0xDC46: 0x8E7B, //CJK UNIFIED IDEOGRAPH
+ 0xDC47: 0x8E7D, //CJK UNIFIED IDEOGRAPH
+ 0xDC48: 0x8E7E, //CJK UNIFIED IDEOGRAPH
+ 0xDC49: 0x8E80, //CJK UNIFIED IDEOGRAPH
+ 0xDC4A: 0x8E82, //CJK UNIFIED IDEOGRAPH
+ 0xDC4B: 0x8E83, //CJK UNIFIED IDEOGRAPH
+ 0xDC4C: 0x8E84, //CJK UNIFIED IDEOGRAPH
+ 0xDC4D: 0x8E86, //CJK UNIFIED IDEOGRAPH
+ 0xDC4E: 0x8E88, //CJK UNIFIED IDEOGRAPH
+ 0xDC4F: 0x8E89, //CJK UNIFIED IDEOGRAPH
+ 0xDC50: 0x8E8A, //CJK UNIFIED IDEOGRAPH
+ 0xDC51: 0x8E8B, //CJK UNIFIED IDEOGRAPH
+ 0xDC52: 0x8E8C, //CJK UNIFIED IDEOGRAPH
+ 0xDC53: 0x8E8D, //CJK UNIFIED IDEOGRAPH
+ 0xDC54: 0x8E8E, //CJK UNIFIED IDEOGRAPH
+ 0xDC55: 0x8E91, //CJK UNIFIED IDEOGRAPH
+ 0xDC56: 0x8E92, //CJK UNIFIED IDEOGRAPH
+ 0xDC57: 0x8E93, //CJK UNIFIED IDEOGRAPH
+ 0xDC58: 0x8E95, //CJK UNIFIED IDEOGRAPH
+ 0xDC59: 0x8E96, //CJK UNIFIED IDEOGRAPH
+ 0xDC5A: 0x8E97, //CJK UNIFIED IDEOGRAPH
+ 0xDC5B: 0x8E98, //CJK UNIFIED IDEOGRAPH
+ 0xDC5C: 0x8E99, //CJK UNIFIED IDEOGRAPH
+ 0xDC5D: 0x8E9A, //CJK UNIFIED IDEOGRAPH
+ 0xDC5E: 0x8E9B, //CJK UNIFIED IDEOGRAPH
+ 0xDC5F: 0x8E9D, //CJK UNIFIED IDEOGRAPH
+ 0xDC60: 0x8E9F, //CJK UNIFIED IDEOGRAPH
+ 0xDC61: 0x8EA0, //CJK UNIFIED IDEOGRAPH
+ 0xDC62: 0x8EA1, //CJK UNIFIED IDEOGRAPH
+ 0xDC63: 0x8EA2, //CJK UNIFIED IDEOGRAPH
+ 0xDC64: 0x8EA3, //CJK UNIFIED IDEOGRAPH
+ 0xDC65: 0x8EA4, //CJK UNIFIED IDEOGRAPH
+ 0xDC66: 0x8EA5, //CJK UNIFIED IDEOGRAPH
+ 0xDC67: 0x8EA6, //CJK UNIFIED IDEOGRAPH
+ 0xDC68: 0x8EA7, //CJK UNIFIED IDEOGRAPH
+ 0xDC69: 0x8EA8, //CJK UNIFIED IDEOGRAPH
+ 0xDC6A: 0x8EA9, //CJK UNIFIED IDEOGRAPH
+ 0xDC6B: 0x8EAA, //CJK UNIFIED IDEOGRAPH
+ 0xDC6C: 0x8EAD, //CJK UNIFIED IDEOGRAPH
+ 0xDC6D: 0x8EAE, //CJK UNIFIED IDEOGRAPH
+ 0xDC6E: 0x8EB0, //CJK UNIFIED IDEOGRAPH
+ 0xDC6F: 0x8EB1, //CJK UNIFIED IDEOGRAPH
+ 0xDC70: 0x8EB3, //CJK UNIFIED IDEOGRAPH
+ 0xDC71: 0x8EB4, //CJK UNIFIED IDEOGRAPH
+ 0xDC72: 0x8EB5, //CJK UNIFIED IDEOGRAPH
+ 0xDC73: 0x8EB6, //CJK UNIFIED IDEOGRAPH
+ 0xDC74: 0x8EB7, //CJK UNIFIED IDEOGRAPH
+ 0xDC75: 0x8EB8, //CJK UNIFIED IDEOGRAPH
+ 0xDC76: 0x8EB9, //CJK UNIFIED IDEOGRAPH
+ 0xDC77: 0x8EBB, //CJK UNIFIED IDEOGRAPH
+ 0xDC78: 0x8EBC, //CJK UNIFIED IDEOGRAPH
+ 0xDC79: 0x8EBD, //CJK UNIFIED IDEOGRAPH
+ 0xDC7A: 0x8EBE, //CJK UNIFIED IDEOGRAPH
+ 0xDC7B: 0x8EBF, //CJK UNIFIED IDEOGRAPH
+ 0xDC7C: 0x8EC0, //CJK UNIFIED IDEOGRAPH
+ 0xDC7D: 0x8EC1, //CJK UNIFIED IDEOGRAPH
+ 0xDC7E: 0x8EC2, //CJK UNIFIED IDEOGRAPH
+ 0xDC80: 0x8EC3, //CJK UNIFIED IDEOGRAPH
+ 0xDC81: 0x8EC4, //CJK UNIFIED IDEOGRAPH
+ 0xDC82: 0x8EC5, //CJK UNIFIED IDEOGRAPH
+ 0xDC83: 0x8EC6, //CJK UNIFIED IDEOGRAPH
+ 0xDC84: 0x8EC7, //CJK UNIFIED IDEOGRAPH
+ 0xDC85: 0x8EC8, //CJK UNIFIED IDEOGRAPH
+ 0xDC86: 0x8EC9, //CJK UNIFIED IDEOGRAPH
+ 0xDC87: 0x8ECA, //CJK UNIFIED IDEOGRAPH
+ 0xDC88: 0x8ECB, //CJK UNIFIED IDEOGRAPH
+ 0xDC89: 0x8ECC, //CJK UNIFIED IDEOGRAPH
+ 0xDC8A: 0x8ECD, //CJK UNIFIED IDEOGRAPH
+ 0xDC8B: 0x8ECF, //CJK UNIFIED IDEOGRAPH
+ 0xDC8C: 0x8ED0, //CJK UNIFIED IDEOGRAPH
+ 0xDC8D: 0x8ED1, //CJK UNIFIED IDEOGRAPH
+ 0xDC8E: 0x8ED2, //CJK UNIFIED IDEOGRAPH
+ 0xDC8F: 0x8ED3, //CJK UNIFIED IDEOGRAPH
+ 0xDC90: 0x8ED4, //CJK UNIFIED IDEOGRAPH
+ 0xDC91: 0x8ED5, //CJK UNIFIED IDEOGRAPH
+ 0xDC92: 0x8ED6, //CJK UNIFIED IDEOGRAPH
+ 0xDC93: 0x8ED7, //CJK UNIFIED IDEOGRAPH
+ 0xDC94: 0x8ED8, //CJK UNIFIED IDEOGRAPH
+ 0xDC95: 0x8ED9, //CJK UNIFIED IDEOGRAPH
+ 0xDC96: 0x8EDA, //CJK UNIFIED IDEOGRAPH
+ 0xDC97: 0x8EDB, //CJK UNIFIED IDEOGRAPH
+ 0xDC98: 0x8EDC, //CJK UNIFIED IDEOGRAPH
+ 0xDC99: 0x8EDD, //CJK UNIFIED IDEOGRAPH
+ 0xDC9A: 0x8EDE, //CJK UNIFIED IDEOGRAPH
+ 0xDC9B: 0x8EDF, //CJK UNIFIED IDEOGRAPH
+ 0xDC9C: 0x8EE0, //CJK UNIFIED IDEOGRAPH
+ 0xDC9D: 0x8EE1, //CJK UNIFIED IDEOGRAPH
+ 0xDC9E: 0x8EE2, //CJK UNIFIED IDEOGRAPH
+ 0xDC9F: 0x8EE3, //CJK UNIFIED IDEOGRAPH
+ 0xDCA0: 0x8EE4, //CJK UNIFIED IDEOGRAPH
+ 0xDCA1: 0x580B, //CJK UNIFIED IDEOGRAPH
+ 0xDCA2: 0x580D, //CJK UNIFIED IDEOGRAPH
+ 0xDCA3: 0x57FD, //CJK UNIFIED IDEOGRAPH
+ 0xDCA4: 0x57ED, //CJK UNIFIED IDEOGRAPH
+ 0xDCA5: 0x5800, //CJK UNIFIED IDEOGRAPH
+ 0xDCA6: 0x581E, //CJK UNIFIED IDEOGRAPH
+ 0xDCA7: 0x5819, //CJK UNIFIED IDEOGRAPH
+ 0xDCA8: 0x5844, //CJK UNIFIED IDEOGRAPH
+ 0xDCA9: 0x5820, //CJK UNIFIED IDEOGRAPH
+ 0xDCAA: 0x5865, //CJK UNIFIED IDEOGRAPH
+ 0xDCAB: 0x586C, //CJK UNIFIED IDEOGRAPH
+ 0xDCAC: 0x5881, //CJK UNIFIED IDEOGRAPH
+ 0xDCAD: 0x5889, //CJK UNIFIED IDEOGRAPH
+ 0xDCAE: 0x589A, //CJK UNIFIED IDEOGRAPH
+ 0xDCAF: 0x5880, //CJK UNIFIED IDEOGRAPH
+ 0xDCB0: 0x99A8, //CJK UNIFIED IDEOGRAPH
+ 0xDCB1: 0x9F19, //CJK UNIFIED IDEOGRAPH
+ 0xDCB2: 0x61FF, //CJK UNIFIED IDEOGRAPH
+ 0xDCB3: 0x8279, //CJK UNIFIED IDEOGRAPH
+ 0xDCB4: 0x827D, //CJK UNIFIED IDEOGRAPH
+ 0xDCB5: 0x827F, //CJK UNIFIED IDEOGRAPH
+ 0xDCB6: 0x828F, //CJK UNIFIED IDEOGRAPH
+ 0xDCB7: 0x828A, //CJK UNIFIED IDEOGRAPH
+ 0xDCB8: 0x82A8, //CJK UNIFIED IDEOGRAPH
+ 0xDCB9: 0x8284, //CJK UNIFIED IDEOGRAPH
+ 0xDCBA: 0x828E, //CJK UNIFIED IDEOGRAPH
+ 0xDCBB: 0x8291, //CJK UNIFIED IDEOGRAPH
+ 0xDCBC: 0x8297, //CJK UNIFIED IDEOGRAPH
+ 0xDCBD: 0x8299, //CJK UNIFIED IDEOGRAPH
+ 0xDCBE: 0x82AB, //CJK UNIFIED IDEOGRAPH
+ 0xDCBF: 0x82B8, //CJK UNIFIED IDEOGRAPH
+ 0xDCC0: 0x82BE, //CJK UNIFIED IDEOGRAPH
+ 0xDCC1: 0x82B0, //CJK UNIFIED IDEOGRAPH
+ 0xDCC2: 0x82C8, //CJK UNIFIED IDEOGRAPH
+ 0xDCC3: 0x82CA, //CJK UNIFIED IDEOGRAPH
+ 0xDCC4: 0x82E3, //CJK UNIFIED IDEOGRAPH
+ 0xDCC5: 0x8298, //CJK UNIFIED IDEOGRAPH
+ 0xDCC6: 0x82B7, //CJK UNIFIED IDEOGRAPH
+ 0xDCC7: 0x82AE, //CJK UNIFIED IDEOGRAPH
+ 0xDCC8: 0x82CB, //CJK UNIFIED IDEOGRAPH
+ 0xDCC9: 0x82CC, //CJK UNIFIED IDEOGRAPH
+ 0xDCCA: 0x82C1, //CJK UNIFIED IDEOGRAPH
+ 0xDCCB: 0x82A9, //CJK UNIFIED IDEOGRAPH
+ 0xDCCC: 0x82B4, //CJK UNIFIED IDEOGRAPH
+ 0xDCCD: 0x82A1, //CJK UNIFIED IDEOGRAPH
+ 0xDCCE: 0x82AA, //CJK UNIFIED IDEOGRAPH
+ 0xDCCF: 0x829F, //CJK UNIFIED IDEOGRAPH
+ 0xDCD0: 0x82C4, //CJK UNIFIED IDEOGRAPH
+ 0xDCD1: 0x82CE, //CJK UNIFIED IDEOGRAPH
+ 0xDCD2: 0x82A4, //CJK UNIFIED IDEOGRAPH
+ 0xDCD3: 0x82E1, //CJK UNIFIED IDEOGRAPH
+ 0xDCD4: 0x8309, //CJK UNIFIED IDEOGRAPH
+ 0xDCD5: 0x82F7, //CJK UNIFIED IDEOGRAPH
+ 0xDCD6: 0x82E4, //CJK UNIFIED IDEOGRAPH
+ 0xDCD7: 0x830F, //CJK UNIFIED IDEOGRAPH
+ 0xDCD8: 0x8307, //CJK UNIFIED IDEOGRAPH
+ 0xDCD9: 0x82DC, //CJK UNIFIED IDEOGRAPH
+ 0xDCDA: 0x82F4, //CJK UNIFIED IDEOGRAPH
+ 0xDCDB: 0x82D2, //CJK UNIFIED IDEOGRAPH
+ 0xDCDC: 0x82D8, //CJK UNIFIED IDEOGRAPH
+ 0xDCDD: 0x830C, //CJK UNIFIED IDEOGRAPH
+ 0xDCDE: 0x82FB, //CJK UNIFIED IDEOGRAPH
+ 0xDCDF: 0x82D3, //CJK UNIFIED IDEOGRAPH
+ 0xDCE0: 0x8311, //CJK UNIFIED IDEOGRAPH
+ 0xDCE1: 0x831A, //CJK UNIFIED IDEOGRAPH
+ 0xDCE2: 0x8306, //CJK UNIFIED IDEOGRAPH
+ 0xDCE3: 0x8314, //CJK UNIFIED IDEOGRAPH
+ 0xDCE4: 0x8315, //CJK UNIFIED IDEOGRAPH
+ 0xDCE5: 0x82E0, //CJK UNIFIED IDEOGRAPH
+ 0xDCE6: 0x82D5, //CJK UNIFIED IDEOGRAPH
+ 0xDCE7: 0x831C, //CJK UNIFIED IDEOGRAPH
+ 0xDCE8: 0x8351, //CJK UNIFIED IDEOGRAPH
+ 0xDCE9: 0x835B, //CJK UNIFIED IDEOGRAPH
+ 0xDCEA: 0x835C, //CJK UNIFIED IDEOGRAPH
+ 0xDCEB: 0x8308, //CJK UNIFIED IDEOGRAPH
+ 0xDCEC: 0x8392, //CJK UNIFIED IDEOGRAPH
+ 0xDCED: 0x833C, //CJK UNIFIED IDEOGRAPH
+ 0xDCEE: 0x8334, //CJK UNIFIED IDEOGRAPH
+ 0xDCEF: 0x8331, //CJK UNIFIED IDEOGRAPH
+ 0xDCF0: 0x839B, //CJK UNIFIED IDEOGRAPH
+ 0xDCF1: 0x835E, //CJK UNIFIED IDEOGRAPH
+ 0xDCF2: 0x832F, //CJK UNIFIED IDEOGRAPH
+ 0xDCF3: 0x834F, //CJK UNIFIED IDEOGRAPH
+ 0xDCF4: 0x8347, //CJK UNIFIED IDEOGRAPH
+ 0xDCF5: 0x8343, //CJK UNIFIED IDEOGRAPH
+ 0xDCF6: 0x835F, //CJK UNIFIED IDEOGRAPH
+ 0xDCF7: 0x8340, //CJK UNIFIED IDEOGRAPH
+ 0xDCF8: 0x8317, //CJK UNIFIED IDEOGRAPH
+ 0xDCF9: 0x8360, //CJK UNIFIED IDEOGRAPH
+ 0xDCFA: 0x832D, //CJK UNIFIED IDEOGRAPH
+ 0xDCFB: 0x833A, //CJK UNIFIED IDEOGRAPH
+ 0xDCFC: 0x8333, //CJK UNIFIED IDEOGRAPH
+ 0xDCFD: 0x8366, //CJK UNIFIED IDEOGRAPH
+ 0xDCFE: 0x8365, //CJK UNIFIED IDEOGRAPH
+ 0xDD40: 0x8EE5, //CJK UNIFIED IDEOGRAPH
+ 0xDD41: 0x8EE6, //CJK UNIFIED IDEOGRAPH
+ 0xDD42: 0x8EE7, //CJK UNIFIED IDEOGRAPH
+ 0xDD43: 0x8EE8, //CJK UNIFIED IDEOGRAPH
+ 0xDD44: 0x8EE9, //CJK UNIFIED IDEOGRAPH
+ 0xDD45: 0x8EEA, //CJK UNIFIED IDEOGRAPH
+ 0xDD46: 0x8EEB, //CJK UNIFIED IDEOGRAPH
+ 0xDD47: 0x8EEC, //CJK UNIFIED IDEOGRAPH
+ 0xDD48: 0x8EED, //CJK UNIFIED IDEOGRAPH
+ 0xDD49: 0x8EEE, //CJK UNIFIED IDEOGRAPH
+ 0xDD4A: 0x8EEF, //CJK UNIFIED IDEOGRAPH
+ 0xDD4B: 0x8EF0, //CJK UNIFIED IDEOGRAPH
+ 0xDD4C: 0x8EF1, //CJK UNIFIED IDEOGRAPH
+ 0xDD4D: 0x8EF2, //CJK UNIFIED IDEOGRAPH
+ 0xDD4E: 0x8EF3, //CJK UNIFIED IDEOGRAPH
+ 0xDD4F: 0x8EF4, //CJK UNIFIED IDEOGRAPH
+ 0xDD50: 0x8EF5, //CJK UNIFIED IDEOGRAPH
+ 0xDD51: 0x8EF6, //CJK UNIFIED IDEOGRAPH
+ 0xDD52: 0x8EF7, //CJK UNIFIED IDEOGRAPH
+ 0xDD53: 0x8EF8, //CJK UNIFIED IDEOGRAPH
+ 0xDD54: 0x8EF9, //CJK UNIFIED IDEOGRAPH
+ 0xDD55: 0x8EFA, //CJK UNIFIED IDEOGRAPH
+ 0xDD56: 0x8EFB, //CJK UNIFIED IDEOGRAPH
+ 0xDD57: 0x8EFC, //CJK UNIFIED IDEOGRAPH
+ 0xDD58: 0x8EFD, //CJK UNIFIED IDEOGRAPH
+ 0xDD59: 0x8EFE, //CJK UNIFIED IDEOGRAPH
+ 0xDD5A: 0x8EFF, //CJK UNIFIED IDEOGRAPH
+ 0xDD5B: 0x8F00, //CJK UNIFIED IDEOGRAPH
+ 0xDD5C: 0x8F01, //CJK UNIFIED IDEOGRAPH
+ 0xDD5D: 0x8F02, //CJK UNIFIED IDEOGRAPH
+ 0xDD5E: 0x8F03, //CJK UNIFIED IDEOGRAPH
+ 0xDD5F: 0x8F04, //CJK UNIFIED IDEOGRAPH
+ 0xDD60: 0x8F05, //CJK UNIFIED IDEOGRAPH
+ 0xDD61: 0x8F06, //CJK UNIFIED IDEOGRAPH
+ 0xDD62: 0x8F07, //CJK UNIFIED IDEOGRAPH
+ 0xDD63: 0x8F08, //CJK UNIFIED IDEOGRAPH
+ 0xDD64: 0x8F09, //CJK UNIFIED IDEOGRAPH
+ 0xDD65: 0x8F0A, //CJK UNIFIED IDEOGRAPH
+ 0xDD66: 0x8F0B, //CJK UNIFIED IDEOGRAPH
+ 0xDD67: 0x8F0C, //CJK UNIFIED IDEOGRAPH
+ 0xDD68: 0x8F0D, //CJK UNIFIED IDEOGRAPH
+ 0xDD69: 0x8F0E, //CJK UNIFIED IDEOGRAPH
+ 0xDD6A: 0x8F0F, //CJK UNIFIED IDEOGRAPH
+ 0xDD6B: 0x8F10, //CJK UNIFIED IDEOGRAPH
+ 0xDD6C: 0x8F11, //CJK UNIFIED IDEOGRAPH
+ 0xDD6D: 0x8F12, //CJK UNIFIED IDEOGRAPH
+ 0xDD6E: 0x8F13, //CJK UNIFIED IDEOGRAPH
+ 0xDD6F: 0x8F14, //CJK UNIFIED IDEOGRAPH
+ 0xDD70: 0x8F15, //CJK UNIFIED IDEOGRAPH
+ 0xDD71: 0x8F16, //CJK UNIFIED IDEOGRAPH
+ 0xDD72: 0x8F17, //CJK UNIFIED IDEOGRAPH
+ 0xDD73: 0x8F18, //CJK UNIFIED IDEOGRAPH
+ 0xDD74: 0x8F19, //CJK UNIFIED IDEOGRAPH
+ 0xDD75: 0x8F1A, //CJK UNIFIED IDEOGRAPH
+ 0xDD76: 0x8F1B, //CJK UNIFIED IDEOGRAPH
+ 0xDD77: 0x8F1C, //CJK UNIFIED IDEOGRAPH
+ 0xDD78: 0x8F1D, //CJK UNIFIED IDEOGRAPH
+ 0xDD79: 0x8F1E, //CJK UNIFIED IDEOGRAPH
+ 0xDD7A: 0x8F1F, //CJK UNIFIED IDEOGRAPH
+ 0xDD7B: 0x8F20, //CJK UNIFIED IDEOGRAPH
+ 0xDD7C: 0x8F21, //CJK UNIFIED IDEOGRAPH
+ 0xDD7D: 0x8F22, //CJK UNIFIED IDEOGRAPH
+ 0xDD7E: 0x8F23, //CJK UNIFIED IDEOGRAPH
+ 0xDD80: 0x8F24, //CJK UNIFIED IDEOGRAPH
+ 0xDD81: 0x8F25, //CJK UNIFIED IDEOGRAPH
+ 0xDD82: 0x8F26, //CJK UNIFIED IDEOGRAPH
+ 0xDD83: 0x8F27, //CJK UNIFIED IDEOGRAPH
+ 0xDD84: 0x8F28, //CJK UNIFIED IDEOGRAPH
+ 0xDD85: 0x8F29, //CJK UNIFIED IDEOGRAPH
+ 0xDD86: 0x8F2A, //CJK UNIFIED IDEOGRAPH
+ 0xDD87: 0x8F2B, //CJK UNIFIED IDEOGRAPH
+ 0xDD88: 0x8F2C, //CJK UNIFIED IDEOGRAPH
+ 0xDD89: 0x8F2D, //CJK UNIFIED IDEOGRAPH
+ 0xDD8A: 0x8F2E, //CJK UNIFIED IDEOGRAPH
+ 0xDD8B: 0x8F2F, //CJK UNIFIED IDEOGRAPH
+ 0xDD8C: 0x8F30, //CJK UNIFIED IDEOGRAPH
+ 0xDD8D: 0x8F31, //CJK UNIFIED IDEOGRAPH
+ 0xDD8E: 0x8F32, //CJK UNIFIED IDEOGRAPH
+ 0xDD8F: 0x8F33, //CJK UNIFIED IDEOGRAPH
+ 0xDD90: 0x8F34, //CJK UNIFIED IDEOGRAPH
+ 0xDD91: 0x8F35, //CJK UNIFIED IDEOGRAPH
+ 0xDD92: 0x8F36, //CJK UNIFIED IDEOGRAPH
+ 0xDD93: 0x8F37, //CJK UNIFIED IDEOGRAPH
+ 0xDD94: 0x8F38, //CJK UNIFIED IDEOGRAPH
+ 0xDD95: 0x8F39, //CJK UNIFIED IDEOGRAPH
+ 0xDD96: 0x8F3A, //CJK UNIFIED IDEOGRAPH
+ 0xDD97: 0x8F3B, //CJK UNIFIED IDEOGRAPH
+ 0xDD98: 0x8F3C, //CJK UNIFIED IDEOGRAPH
+ 0xDD99: 0x8F3D, //CJK UNIFIED IDEOGRAPH
+ 0xDD9A: 0x8F3E, //CJK UNIFIED IDEOGRAPH
+ 0xDD9B: 0x8F3F, //CJK UNIFIED IDEOGRAPH
+ 0xDD9C: 0x8F40, //CJK UNIFIED IDEOGRAPH
+ 0xDD9D: 0x8F41, //CJK UNIFIED IDEOGRAPH
+ 0xDD9E: 0x8F42, //CJK UNIFIED IDEOGRAPH
+ 0xDD9F: 0x8F43, //CJK UNIFIED IDEOGRAPH
+ 0xDDA0: 0x8F44, //CJK UNIFIED IDEOGRAPH
+ 0xDDA1: 0x8368, //CJK UNIFIED IDEOGRAPH
+ 0xDDA2: 0x831B, //CJK UNIFIED IDEOGRAPH
+ 0xDDA3: 0x8369, //CJK UNIFIED IDEOGRAPH
+ 0xDDA4: 0x836C, //CJK UNIFIED IDEOGRAPH
+ 0xDDA5: 0x836A, //CJK UNIFIED IDEOGRAPH
+ 0xDDA6: 0x836D, //CJK UNIFIED IDEOGRAPH
+ 0xDDA7: 0x836E, //CJK UNIFIED IDEOGRAPH
+ 0xDDA8: 0x83B0, //CJK UNIFIED IDEOGRAPH
+ 0xDDA9: 0x8378, //CJK UNIFIED IDEOGRAPH
+ 0xDDAA: 0x83B3, //CJK UNIFIED IDEOGRAPH
+ 0xDDAB: 0x83B4, //CJK UNIFIED IDEOGRAPH
+ 0xDDAC: 0x83A0, //CJK UNIFIED IDEOGRAPH
+ 0xDDAD: 0x83AA, //CJK UNIFIED IDEOGRAPH
+ 0xDDAE: 0x8393, //CJK UNIFIED IDEOGRAPH
+ 0xDDAF: 0x839C, //CJK UNIFIED IDEOGRAPH
+ 0xDDB0: 0x8385, //CJK UNIFIED IDEOGRAPH
+ 0xDDB1: 0x837C, //CJK UNIFIED IDEOGRAPH
+ 0xDDB2: 0x83B6, //CJK UNIFIED IDEOGRAPH
+ 0xDDB3: 0x83A9, //CJK UNIFIED IDEOGRAPH
+ 0xDDB4: 0x837D, //CJK UNIFIED IDEOGRAPH
+ 0xDDB5: 0x83B8, //CJK UNIFIED IDEOGRAPH
+ 0xDDB6: 0x837B, //CJK UNIFIED IDEOGRAPH
+ 0xDDB7: 0x8398, //CJK UNIFIED IDEOGRAPH
+ 0xDDB8: 0x839E, //CJK UNIFIED IDEOGRAPH
+ 0xDDB9: 0x83A8, //CJK UNIFIED IDEOGRAPH
+ 0xDDBA: 0x83BA, //CJK UNIFIED IDEOGRAPH
+ 0xDDBB: 0x83BC, //CJK UNIFIED IDEOGRAPH
+ 0xDDBC: 0x83C1, //CJK UNIFIED IDEOGRAPH
+ 0xDDBD: 0x8401, //CJK UNIFIED IDEOGRAPH
+ 0xDDBE: 0x83E5, //CJK UNIFIED IDEOGRAPH
+ 0xDDBF: 0x83D8, //CJK UNIFIED IDEOGRAPH
+ 0xDDC0: 0x5807, //CJK UNIFIED IDEOGRAPH
+ 0xDDC1: 0x8418, //CJK UNIFIED IDEOGRAPH
+ 0xDDC2: 0x840B, //CJK UNIFIED IDEOGRAPH
+ 0xDDC3: 0x83DD, //CJK UNIFIED IDEOGRAPH
+ 0xDDC4: 0x83FD, //CJK UNIFIED IDEOGRAPH
+ 0xDDC5: 0x83D6, //CJK UNIFIED IDEOGRAPH
+ 0xDDC6: 0x841C, //CJK UNIFIED IDEOGRAPH
+ 0xDDC7: 0x8438, //CJK UNIFIED IDEOGRAPH
+ 0xDDC8: 0x8411, //CJK UNIFIED IDEOGRAPH
+ 0xDDC9: 0x8406, //CJK UNIFIED IDEOGRAPH
+ 0xDDCA: 0x83D4, //CJK UNIFIED IDEOGRAPH
+ 0xDDCB: 0x83DF, //CJK UNIFIED IDEOGRAPH
+ 0xDDCC: 0x840F, //CJK UNIFIED IDEOGRAPH
+ 0xDDCD: 0x8403, //CJK UNIFIED IDEOGRAPH
+ 0xDDCE: 0x83F8, //CJK UNIFIED IDEOGRAPH
+ 0xDDCF: 0x83F9, //CJK UNIFIED IDEOGRAPH
+ 0xDDD0: 0x83EA, //CJK UNIFIED IDEOGRAPH
+ 0xDDD1: 0x83C5, //CJK UNIFIED IDEOGRAPH
+ 0xDDD2: 0x83C0, //CJK UNIFIED IDEOGRAPH
+ 0xDDD3: 0x8426, //CJK UNIFIED IDEOGRAPH
+ 0xDDD4: 0x83F0, //CJK UNIFIED IDEOGRAPH
+ 0xDDD5: 0x83E1, //CJK UNIFIED IDEOGRAPH
+ 0xDDD6: 0x845C, //CJK UNIFIED IDEOGRAPH
+ 0xDDD7: 0x8451, //CJK UNIFIED IDEOGRAPH
+ 0xDDD8: 0x845A, //CJK UNIFIED IDEOGRAPH
+ 0xDDD9: 0x8459, //CJK UNIFIED IDEOGRAPH
+ 0xDDDA: 0x8473, //CJK UNIFIED IDEOGRAPH
+ 0xDDDB: 0x8487, //CJK UNIFIED IDEOGRAPH
+ 0xDDDC: 0x8488, //CJK UNIFIED IDEOGRAPH
+ 0xDDDD: 0x847A, //CJK UNIFIED IDEOGRAPH
+ 0xDDDE: 0x8489, //CJK UNIFIED IDEOGRAPH
+ 0xDDDF: 0x8478, //CJK UNIFIED IDEOGRAPH
+ 0xDDE0: 0x843C, //CJK UNIFIED IDEOGRAPH
+ 0xDDE1: 0x8446, //CJK UNIFIED IDEOGRAPH
+ 0xDDE2: 0x8469, //CJK UNIFIED IDEOGRAPH
+ 0xDDE3: 0x8476, //CJK UNIFIED IDEOGRAPH
+ 0xDDE4: 0x848C, //CJK UNIFIED IDEOGRAPH
+ 0xDDE5: 0x848E, //CJK UNIFIED IDEOGRAPH
+ 0xDDE6: 0x8431, //CJK UNIFIED IDEOGRAPH
+ 0xDDE7: 0x846D, //CJK UNIFIED IDEOGRAPH
+ 0xDDE8: 0x84C1, //CJK UNIFIED IDEOGRAPH
+ 0xDDE9: 0x84CD, //CJK UNIFIED IDEOGRAPH
+ 0xDDEA: 0x84D0, //CJK UNIFIED IDEOGRAPH
+ 0xDDEB: 0x84E6, //CJK UNIFIED IDEOGRAPH
+ 0xDDEC: 0x84BD, //CJK UNIFIED IDEOGRAPH
+ 0xDDED: 0x84D3, //CJK UNIFIED IDEOGRAPH
+ 0xDDEE: 0x84CA, //CJK UNIFIED IDEOGRAPH
+ 0xDDEF: 0x84BF, //CJK UNIFIED IDEOGRAPH
+ 0xDDF0: 0x84BA, //CJK UNIFIED IDEOGRAPH
+ 0xDDF1: 0x84E0, //CJK UNIFIED IDEOGRAPH
+ 0xDDF2: 0x84A1, //CJK UNIFIED IDEOGRAPH
+ 0xDDF3: 0x84B9, //CJK UNIFIED IDEOGRAPH
+ 0xDDF4: 0x84B4, //CJK UNIFIED IDEOGRAPH
+ 0xDDF5: 0x8497, //CJK UNIFIED IDEOGRAPH
+ 0xDDF6: 0x84E5, //CJK UNIFIED IDEOGRAPH
+ 0xDDF7: 0x84E3, //CJK UNIFIED IDEOGRAPH
+ 0xDDF8: 0x850C, //CJK UNIFIED IDEOGRAPH
+ 0xDDF9: 0x750D, //CJK UNIFIED IDEOGRAPH
+ 0xDDFA: 0x8538, //CJK UNIFIED IDEOGRAPH
+ 0xDDFB: 0x84F0, //CJK UNIFIED IDEOGRAPH
+ 0xDDFC: 0x8539, //CJK UNIFIED IDEOGRAPH
+ 0xDDFD: 0x851F, //CJK UNIFIED IDEOGRAPH
+ 0xDDFE: 0x853A, //CJK UNIFIED IDEOGRAPH
+ 0xDE40: 0x8F45, //CJK UNIFIED IDEOGRAPH
+ 0xDE41: 0x8F46, //CJK UNIFIED IDEOGRAPH
+ 0xDE42: 0x8F47, //CJK UNIFIED IDEOGRAPH
+ 0xDE43: 0x8F48, //CJK UNIFIED IDEOGRAPH
+ 0xDE44: 0x8F49, //CJK UNIFIED IDEOGRAPH
+ 0xDE45: 0x8F4A, //CJK UNIFIED IDEOGRAPH
+ 0xDE46: 0x8F4B, //CJK UNIFIED IDEOGRAPH
+ 0xDE47: 0x8F4C, //CJK UNIFIED IDEOGRAPH
+ 0xDE48: 0x8F4D, //CJK UNIFIED IDEOGRAPH
+ 0xDE49: 0x8F4E, //CJK UNIFIED IDEOGRAPH
+ 0xDE4A: 0x8F4F, //CJK UNIFIED IDEOGRAPH
+ 0xDE4B: 0x8F50, //CJK UNIFIED IDEOGRAPH
+ 0xDE4C: 0x8F51, //CJK UNIFIED IDEOGRAPH
+ 0xDE4D: 0x8F52, //CJK UNIFIED IDEOGRAPH
+ 0xDE4E: 0x8F53, //CJK UNIFIED IDEOGRAPH
+ 0xDE4F: 0x8F54, //CJK UNIFIED IDEOGRAPH
+ 0xDE50: 0x8F55, //CJK UNIFIED IDEOGRAPH
+ 0xDE51: 0x8F56, //CJK UNIFIED IDEOGRAPH
+ 0xDE52: 0x8F57, //CJK UNIFIED IDEOGRAPH
+ 0xDE53: 0x8F58, //CJK UNIFIED IDEOGRAPH
+ 0xDE54: 0x8F59, //CJK UNIFIED IDEOGRAPH
+ 0xDE55: 0x8F5A, //CJK UNIFIED IDEOGRAPH
+ 0xDE56: 0x8F5B, //CJK UNIFIED IDEOGRAPH
+ 0xDE57: 0x8F5C, //CJK UNIFIED IDEOGRAPH
+ 0xDE58: 0x8F5D, //CJK UNIFIED IDEOGRAPH
+ 0xDE59: 0x8F5E, //CJK UNIFIED IDEOGRAPH
+ 0xDE5A: 0x8F5F, //CJK UNIFIED IDEOGRAPH
+ 0xDE5B: 0x8F60, //CJK UNIFIED IDEOGRAPH
+ 0xDE5C: 0x8F61, //CJK UNIFIED IDEOGRAPH
+ 0xDE5D: 0x8F62, //CJK UNIFIED IDEOGRAPH
+ 0xDE5E: 0x8F63, //CJK UNIFIED IDEOGRAPH
+ 0xDE5F: 0x8F64, //CJK UNIFIED IDEOGRAPH
+ 0xDE60: 0x8F65, //CJK UNIFIED IDEOGRAPH
+ 0xDE61: 0x8F6A, //CJK UNIFIED IDEOGRAPH
+ 0xDE62: 0x8F80, //CJK UNIFIED IDEOGRAPH
+ 0xDE63: 0x8F8C, //CJK UNIFIED IDEOGRAPH
+ 0xDE64: 0x8F92, //CJK UNIFIED IDEOGRAPH
+ 0xDE65: 0x8F9D, //CJK UNIFIED IDEOGRAPH
+ 0xDE66: 0x8FA0, //CJK UNIFIED IDEOGRAPH
+ 0xDE67: 0x8FA1, //CJK UNIFIED IDEOGRAPH
+ 0xDE68: 0x8FA2, //CJK UNIFIED IDEOGRAPH
+ 0xDE69: 0x8FA4, //CJK UNIFIED IDEOGRAPH
+ 0xDE6A: 0x8FA5, //CJK UNIFIED IDEOGRAPH
+ 0xDE6B: 0x8FA6, //CJK UNIFIED IDEOGRAPH
+ 0xDE6C: 0x8FA7, //CJK UNIFIED IDEOGRAPH
+ 0xDE6D: 0x8FAA, //CJK UNIFIED IDEOGRAPH
+ 0xDE6E: 0x8FAC, //CJK UNIFIED IDEOGRAPH
+ 0xDE6F: 0x8FAD, //CJK UNIFIED IDEOGRAPH
+ 0xDE70: 0x8FAE, //CJK UNIFIED IDEOGRAPH
+ 0xDE71: 0x8FAF, //CJK UNIFIED IDEOGRAPH
+ 0xDE72: 0x8FB2, //CJK UNIFIED IDEOGRAPH
+ 0xDE73: 0x8FB3, //CJK UNIFIED IDEOGRAPH
+ 0xDE74: 0x8FB4, //CJK UNIFIED IDEOGRAPH
+ 0xDE75: 0x8FB5, //CJK UNIFIED IDEOGRAPH
+ 0xDE76: 0x8FB7, //CJK UNIFIED IDEOGRAPH
+ 0xDE77: 0x8FB8, //CJK UNIFIED IDEOGRAPH
+ 0xDE78: 0x8FBA, //CJK UNIFIED IDEOGRAPH
+ 0xDE79: 0x8FBB, //CJK UNIFIED IDEOGRAPH
+ 0xDE7A: 0x8FBC, //CJK UNIFIED IDEOGRAPH
+ 0xDE7B: 0x8FBF, //CJK UNIFIED IDEOGRAPH
+ 0xDE7C: 0x8FC0, //CJK UNIFIED IDEOGRAPH
+ 0xDE7D: 0x8FC3, //CJK UNIFIED IDEOGRAPH
+ 0xDE7E: 0x8FC6, //CJK UNIFIED IDEOGRAPH
+ 0xDE80: 0x8FC9, //CJK UNIFIED IDEOGRAPH
+ 0xDE81: 0x8FCA, //CJK UNIFIED IDEOGRAPH
+ 0xDE82: 0x8FCB, //CJK UNIFIED IDEOGRAPH
+ 0xDE83: 0x8FCC, //CJK UNIFIED IDEOGRAPH
+ 0xDE84: 0x8FCD, //CJK UNIFIED IDEOGRAPH
+ 0xDE85: 0x8FCF, //CJK UNIFIED IDEOGRAPH
+ 0xDE86: 0x8FD2, //CJK UNIFIED IDEOGRAPH
+ 0xDE87: 0x8FD6, //CJK UNIFIED IDEOGRAPH
+ 0xDE88: 0x8FD7, //CJK UNIFIED IDEOGRAPH
+ 0xDE89: 0x8FDA, //CJK UNIFIED IDEOGRAPH
+ 0xDE8A: 0x8FE0, //CJK UNIFIED IDEOGRAPH
+ 0xDE8B: 0x8FE1, //CJK UNIFIED IDEOGRAPH
+ 0xDE8C: 0x8FE3, //CJK UNIFIED IDEOGRAPH
+ 0xDE8D: 0x8FE7, //CJK UNIFIED IDEOGRAPH
+ 0xDE8E: 0x8FEC, //CJK UNIFIED IDEOGRAPH
+ 0xDE8F: 0x8FEF, //CJK UNIFIED IDEOGRAPH
+ 0xDE90: 0x8FF1, //CJK UNIFIED IDEOGRAPH
+ 0xDE91: 0x8FF2, //CJK UNIFIED IDEOGRAPH
+ 0xDE92: 0x8FF4, //CJK UNIFIED IDEOGRAPH
+ 0xDE93: 0x8FF5, //CJK UNIFIED IDEOGRAPH
+ 0xDE94: 0x8FF6, //CJK UNIFIED IDEOGRAPH
+ 0xDE95: 0x8FFA, //CJK UNIFIED IDEOGRAPH
+ 0xDE96: 0x8FFB, //CJK UNIFIED IDEOGRAPH
+ 0xDE97: 0x8FFC, //CJK UNIFIED IDEOGRAPH
+ 0xDE98: 0x8FFE, //CJK UNIFIED IDEOGRAPH
+ 0xDE99: 0x8FFF, //CJK UNIFIED IDEOGRAPH
+ 0xDE9A: 0x9007, //CJK UNIFIED IDEOGRAPH
+ 0xDE9B: 0x9008, //CJK UNIFIED IDEOGRAPH
+ 0xDE9C: 0x900C, //CJK UNIFIED IDEOGRAPH
+ 0xDE9D: 0x900E, //CJK UNIFIED IDEOGRAPH
+ 0xDE9E: 0x9013, //CJK UNIFIED IDEOGRAPH
+ 0xDE9F: 0x9015, //CJK UNIFIED IDEOGRAPH
+ 0xDEA0: 0x9018, //CJK UNIFIED IDEOGRAPH
+ 0xDEA1: 0x8556, //CJK UNIFIED IDEOGRAPH
+ 0xDEA2: 0x853B, //CJK UNIFIED IDEOGRAPH
+ 0xDEA3: 0x84FF, //CJK UNIFIED IDEOGRAPH
+ 0xDEA4: 0x84FC, //CJK UNIFIED IDEOGRAPH
+ 0xDEA5: 0x8559, //CJK UNIFIED IDEOGRAPH
+ 0xDEA6: 0x8548, //CJK UNIFIED IDEOGRAPH
+ 0xDEA7: 0x8568, //CJK UNIFIED IDEOGRAPH
+ 0xDEA8: 0x8564, //CJK UNIFIED IDEOGRAPH
+ 0xDEA9: 0x855E, //CJK UNIFIED IDEOGRAPH
+ 0xDEAA: 0x857A, //CJK UNIFIED IDEOGRAPH
+ 0xDEAB: 0x77A2, //CJK UNIFIED IDEOGRAPH
+ 0xDEAC: 0x8543, //CJK UNIFIED IDEOGRAPH
+ 0xDEAD: 0x8572, //CJK UNIFIED IDEOGRAPH
+ 0xDEAE: 0x857B, //CJK UNIFIED IDEOGRAPH
+ 0xDEAF: 0x85A4, //CJK UNIFIED IDEOGRAPH
+ 0xDEB0: 0x85A8, //CJK UNIFIED IDEOGRAPH
+ 0xDEB1: 0x8587, //CJK UNIFIED IDEOGRAPH
+ 0xDEB2: 0x858F, //CJK UNIFIED IDEOGRAPH
+ 0xDEB3: 0x8579, //CJK UNIFIED IDEOGRAPH
+ 0xDEB4: 0x85AE, //CJK UNIFIED IDEOGRAPH
+ 0xDEB5: 0x859C, //CJK UNIFIED IDEOGRAPH
+ 0xDEB6: 0x8585, //CJK UNIFIED IDEOGRAPH
+ 0xDEB7: 0x85B9, //CJK UNIFIED IDEOGRAPH
+ 0xDEB8: 0x85B7, //CJK UNIFIED IDEOGRAPH
+ 0xDEB9: 0x85B0, //CJK UNIFIED IDEOGRAPH
+ 0xDEBA: 0x85D3, //CJK UNIFIED IDEOGRAPH
+ 0xDEBB: 0x85C1, //CJK UNIFIED IDEOGRAPH
+ 0xDEBC: 0x85DC, //CJK UNIFIED IDEOGRAPH
+ 0xDEBD: 0x85FF, //CJK UNIFIED IDEOGRAPH
+ 0xDEBE: 0x8627, //CJK UNIFIED IDEOGRAPH
+ 0xDEBF: 0x8605, //CJK UNIFIED IDEOGRAPH
+ 0xDEC0: 0x8629, //CJK UNIFIED IDEOGRAPH
+ 0xDEC1: 0x8616, //CJK UNIFIED IDEOGRAPH
+ 0xDEC2: 0x863C, //CJK UNIFIED IDEOGRAPH
+ 0xDEC3: 0x5EFE, //CJK UNIFIED IDEOGRAPH
+ 0xDEC4: 0x5F08, //CJK UNIFIED IDEOGRAPH
+ 0xDEC5: 0x593C, //CJK UNIFIED IDEOGRAPH
+ 0xDEC6: 0x5941, //CJK UNIFIED IDEOGRAPH
+ 0xDEC7: 0x8037, //CJK UNIFIED IDEOGRAPH
+ 0xDEC8: 0x5955, //CJK UNIFIED IDEOGRAPH
+ 0xDEC9: 0x595A, //CJK UNIFIED IDEOGRAPH
+ 0xDECA: 0x5958, //CJK UNIFIED IDEOGRAPH
+ 0xDECB: 0x530F, //CJK UNIFIED IDEOGRAPH
+ 0xDECC: 0x5C22, //CJK UNIFIED IDEOGRAPH
+ 0xDECD: 0x5C25, //CJK UNIFIED IDEOGRAPH
+ 0xDECE: 0x5C2C, //CJK UNIFIED IDEOGRAPH
+ 0xDECF: 0x5C34, //CJK UNIFIED IDEOGRAPH
+ 0xDED0: 0x624C, //CJK UNIFIED IDEOGRAPH
+ 0xDED1: 0x626A, //CJK UNIFIED IDEOGRAPH
+ 0xDED2: 0x629F, //CJK UNIFIED IDEOGRAPH
+ 0xDED3: 0x62BB, //CJK UNIFIED IDEOGRAPH
+ 0xDED4: 0x62CA, //CJK UNIFIED IDEOGRAPH
+ 0xDED5: 0x62DA, //CJK UNIFIED IDEOGRAPH
+ 0xDED6: 0x62D7, //CJK UNIFIED IDEOGRAPH
+ 0xDED7: 0x62EE, //CJK UNIFIED IDEOGRAPH
+ 0xDED8: 0x6322, //CJK UNIFIED IDEOGRAPH
+ 0xDED9: 0x62F6, //CJK UNIFIED IDEOGRAPH
+ 0xDEDA: 0x6339, //CJK UNIFIED IDEOGRAPH
+ 0xDEDB: 0x634B, //CJK UNIFIED IDEOGRAPH
+ 0xDEDC: 0x6343, //CJK UNIFIED IDEOGRAPH
+ 0xDEDD: 0x63AD, //CJK UNIFIED IDEOGRAPH
+ 0xDEDE: 0x63F6, //CJK UNIFIED IDEOGRAPH
+ 0xDEDF: 0x6371, //CJK UNIFIED IDEOGRAPH
+ 0xDEE0: 0x637A, //CJK UNIFIED IDEOGRAPH
+ 0xDEE1: 0x638E, //CJK UNIFIED IDEOGRAPH
+ 0xDEE2: 0x63B4, //CJK UNIFIED IDEOGRAPH
+ 0xDEE3: 0x636D, //CJK UNIFIED IDEOGRAPH
+ 0xDEE4: 0x63AC, //CJK UNIFIED IDEOGRAPH
+ 0xDEE5: 0x638A, //CJK UNIFIED IDEOGRAPH
+ 0xDEE6: 0x6369, //CJK UNIFIED IDEOGRAPH
+ 0xDEE7: 0x63AE, //CJK UNIFIED IDEOGRAPH
+ 0xDEE8: 0x63BC, //CJK UNIFIED IDEOGRAPH
+ 0xDEE9: 0x63F2, //CJK UNIFIED IDEOGRAPH
+ 0xDEEA: 0x63F8, //CJK UNIFIED IDEOGRAPH
+ 0xDEEB: 0x63E0, //CJK UNIFIED IDEOGRAPH
+ 0xDEEC: 0x63FF, //CJK UNIFIED IDEOGRAPH
+ 0xDEED: 0x63C4, //CJK UNIFIED IDEOGRAPH
+ 0xDEEE: 0x63DE, //CJK UNIFIED IDEOGRAPH
+ 0xDEEF: 0x63CE, //CJK UNIFIED IDEOGRAPH
+ 0xDEF0: 0x6452, //CJK UNIFIED IDEOGRAPH
+ 0xDEF1: 0x63C6, //CJK UNIFIED IDEOGRAPH
+ 0xDEF2: 0x63BE, //CJK UNIFIED IDEOGRAPH
+ 0xDEF3: 0x6445, //CJK UNIFIED IDEOGRAPH
+ 0xDEF4: 0x6441, //CJK UNIFIED IDEOGRAPH
+ 0xDEF5: 0x640B, //CJK UNIFIED IDEOGRAPH
+ 0xDEF6: 0x641B, //CJK UNIFIED IDEOGRAPH
+ 0xDEF7: 0x6420, //CJK UNIFIED IDEOGRAPH
+ 0xDEF8: 0x640C, //CJK UNIFIED IDEOGRAPH
+ 0xDEF9: 0x6426, //CJK UNIFIED IDEOGRAPH
+ 0xDEFA: 0x6421, //CJK UNIFIED IDEOGRAPH
+ 0xDEFB: 0x645E, //CJK UNIFIED IDEOGRAPH
+ 0xDEFC: 0x6484, //CJK UNIFIED IDEOGRAPH
+ 0xDEFD: 0x646D, //CJK UNIFIED IDEOGRAPH
+ 0xDEFE: 0x6496, //CJK UNIFIED IDEOGRAPH
+ 0xDF40: 0x9019, //CJK UNIFIED IDEOGRAPH
+ 0xDF41: 0x901C, //CJK UNIFIED IDEOGRAPH
+ 0xDF42: 0x9023, //CJK UNIFIED IDEOGRAPH
+ 0xDF43: 0x9024, //CJK UNIFIED IDEOGRAPH
+ 0xDF44: 0x9025, //CJK UNIFIED IDEOGRAPH
+ 0xDF45: 0x9027, //CJK UNIFIED IDEOGRAPH
+ 0xDF46: 0x9028, //CJK UNIFIED IDEOGRAPH
+ 0xDF47: 0x9029, //CJK UNIFIED IDEOGRAPH
+ 0xDF48: 0x902A, //CJK UNIFIED IDEOGRAPH
+ 0xDF49: 0x902B, //CJK UNIFIED IDEOGRAPH
+ 0xDF4A: 0x902C, //CJK UNIFIED IDEOGRAPH
+ 0xDF4B: 0x9030, //CJK UNIFIED IDEOGRAPH
+ 0xDF4C: 0x9031, //CJK UNIFIED IDEOGRAPH
+ 0xDF4D: 0x9032, //CJK UNIFIED IDEOGRAPH
+ 0xDF4E: 0x9033, //CJK UNIFIED IDEOGRAPH
+ 0xDF4F: 0x9034, //CJK UNIFIED IDEOGRAPH
+ 0xDF50: 0x9037, //CJK UNIFIED IDEOGRAPH
+ 0xDF51: 0x9039, //CJK UNIFIED IDEOGRAPH
+ 0xDF52: 0x903A, //CJK UNIFIED IDEOGRAPH
+ 0xDF53: 0x903D, //CJK UNIFIED IDEOGRAPH
+ 0xDF54: 0x903F, //CJK UNIFIED IDEOGRAPH
+ 0xDF55: 0x9040, //CJK UNIFIED IDEOGRAPH
+ 0xDF56: 0x9043, //CJK UNIFIED IDEOGRAPH
+ 0xDF57: 0x9045, //CJK UNIFIED IDEOGRAPH
+ 0xDF58: 0x9046, //CJK UNIFIED IDEOGRAPH
+ 0xDF59: 0x9048, //CJK UNIFIED IDEOGRAPH
+ 0xDF5A: 0x9049, //CJK UNIFIED IDEOGRAPH
+ 0xDF5B: 0x904A, //CJK UNIFIED IDEOGRAPH
+ 0xDF5C: 0x904B, //CJK UNIFIED IDEOGRAPH
+ 0xDF5D: 0x904C, //CJK UNIFIED IDEOGRAPH
+ 0xDF5E: 0x904E, //CJK UNIFIED IDEOGRAPH
+ 0xDF5F: 0x9054, //CJK UNIFIED IDEOGRAPH
+ 0xDF60: 0x9055, //CJK UNIFIED IDEOGRAPH
+ 0xDF61: 0x9056, //CJK UNIFIED IDEOGRAPH
+ 0xDF62: 0x9059, //CJK UNIFIED IDEOGRAPH
+ 0xDF63: 0x905A, //CJK UNIFIED IDEOGRAPH
+ 0xDF64: 0x905C, //CJK UNIFIED IDEOGRAPH
+ 0xDF65: 0x905D, //CJK UNIFIED IDEOGRAPH
+ 0xDF66: 0x905E, //CJK UNIFIED IDEOGRAPH
+ 0xDF67: 0x905F, //CJK UNIFIED IDEOGRAPH
+ 0xDF68: 0x9060, //CJK UNIFIED IDEOGRAPH
+ 0xDF69: 0x9061, //CJK UNIFIED IDEOGRAPH
+ 0xDF6A: 0x9064, //CJK UNIFIED IDEOGRAPH
+ 0xDF6B: 0x9066, //CJK UNIFIED IDEOGRAPH
+ 0xDF6C: 0x9067, //CJK UNIFIED IDEOGRAPH
+ 0xDF6D: 0x9069, //CJK UNIFIED IDEOGRAPH
+ 0xDF6E: 0x906A, //CJK UNIFIED IDEOGRAPH
+ 0xDF6F: 0x906B, //CJK UNIFIED IDEOGRAPH
+ 0xDF70: 0x906C, //CJK UNIFIED IDEOGRAPH
+ 0xDF71: 0x906F, //CJK UNIFIED IDEOGRAPH
+ 0xDF72: 0x9070, //CJK UNIFIED IDEOGRAPH
+ 0xDF73: 0x9071, //CJK UNIFIED IDEOGRAPH
+ 0xDF74: 0x9072, //CJK UNIFIED IDEOGRAPH
+ 0xDF75: 0x9073, //CJK UNIFIED IDEOGRAPH
+ 0xDF76: 0x9076, //CJK UNIFIED IDEOGRAPH
+ 0xDF77: 0x9077, //CJK UNIFIED IDEOGRAPH
+ 0xDF78: 0x9078, //CJK UNIFIED IDEOGRAPH
+ 0xDF79: 0x9079, //CJK UNIFIED IDEOGRAPH
+ 0xDF7A: 0x907A, //CJK UNIFIED IDEOGRAPH
+ 0xDF7B: 0x907B, //CJK UNIFIED IDEOGRAPH
+ 0xDF7C: 0x907C, //CJK UNIFIED IDEOGRAPH
+ 0xDF7D: 0x907E, //CJK UNIFIED IDEOGRAPH
+ 0xDF7E: 0x9081, //CJK UNIFIED IDEOGRAPH
+ 0xDF80: 0x9084, //CJK UNIFIED IDEOGRAPH
+ 0xDF81: 0x9085, //CJK UNIFIED IDEOGRAPH
+ 0xDF82: 0x9086, //CJK UNIFIED IDEOGRAPH
+ 0xDF83: 0x9087, //CJK UNIFIED IDEOGRAPH
+ 0xDF84: 0x9089, //CJK UNIFIED IDEOGRAPH
+ 0xDF85: 0x908A, //CJK UNIFIED IDEOGRAPH
+ 0xDF86: 0x908C, //CJK UNIFIED IDEOGRAPH
+ 0xDF87: 0x908D, //CJK UNIFIED IDEOGRAPH
+ 0xDF88: 0x908E, //CJK UNIFIED IDEOGRAPH
+ 0xDF89: 0x908F, //CJK UNIFIED IDEOGRAPH
+ 0xDF8A: 0x9090, //CJK UNIFIED IDEOGRAPH
+ 0xDF8B: 0x9092, //CJK UNIFIED IDEOGRAPH
+ 0xDF8C: 0x9094, //CJK UNIFIED IDEOGRAPH
+ 0xDF8D: 0x9096, //CJK UNIFIED IDEOGRAPH
+ 0xDF8E: 0x9098, //CJK UNIFIED IDEOGRAPH
+ 0xDF8F: 0x909A, //CJK UNIFIED IDEOGRAPH
+ 0xDF90: 0x909C, //CJK UNIFIED IDEOGRAPH
+ 0xDF91: 0x909E, //CJK UNIFIED IDEOGRAPH
+ 0xDF92: 0x909F, //CJK UNIFIED IDEOGRAPH
+ 0xDF93: 0x90A0, //CJK UNIFIED IDEOGRAPH
+ 0xDF94: 0x90A4, //CJK UNIFIED IDEOGRAPH
+ 0xDF95: 0x90A5, //CJK UNIFIED IDEOGRAPH
+ 0xDF96: 0x90A7, //CJK UNIFIED IDEOGRAPH
+ 0xDF97: 0x90A8, //CJK UNIFIED IDEOGRAPH
+ 0xDF98: 0x90A9, //CJK UNIFIED IDEOGRAPH
+ 0xDF99: 0x90AB, //CJK UNIFIED IDEOGRAPH
+ 0xDF9A: 0x90AD, //CJK UNIFIED IDEOGRAPH
+ 0xDF9B: 0x90B2, //CJK UNIFIED IDEOGRAPH
+ 0xDF9C: 0x90B7, //CJK UNIFIED IDEOGRAPH
+ 0xDF9D: 0x90BC, //CJK UNIFIED IDEOGRAPH
+ 0xDF9E: 0x90BD, //CJK UNIFIED IDEOGRAPH
+ 0xDF9F: 0x90BF, //CJK UNIFIED IDEOGRAPH
+ 0xDFA0: 0x90C0, //CJK UNIFIED IDEOGRAPH
+ 0xDFA1: 0x647A, //CJK UNIFIED IDEOGRAPH
+ 0xDFA2: 0x64B7, //CJK UNIFIED IDEOGRAPH
+ 0xDFA3: 0x64B8, //CJK UNIFIED IDEOGRAPH
+ 0xDFA4: 0x6499, //CJK UNIFIED IDEOGRAPH
+ 0xDFA5: 0x64BA, //CJK UNIFIED IDEOGRAPH
+ 0xDFA6: 0x64C0, //CJK UNIFIED IDEOGRAPH
+ 0xDFA7: 0x64D0, //CJK UNIFIED IDEOGRAPH
+ 0xDFA8: 0x64D7, //CJK UNIFIED IDEOGRAPH
+ 0xDFA9: 0x64E4, //CJK UNIFIED IDEOGRAPH
+ 0xDFAA: 0x64E2, //CJK UNIFIED IDEOGRAPH
+ 0xDFAB: 0x6509, //CJK UNIFIED IDEOGRAPH
+ 0xDFAC: 0x6525, //CJK UNIFIED IDEOGRAPH
+ 0xDFAD: 0x652E, //CJK UNIFIED IDEOGRAPH
+ 0xDFAE: 0x5F0B, //CJK UNIFIED IDEOGRAPH
+ 0xDFAF: 0x5FD2, //CJK UNIFIED IDEOGRAPH
+ 0xDFB0: 0x7519, //CJK UNIFIED IDEOGRAPH
+ 0xDFB1: 0x5F11, //CJK UNIFIED IDEOGRAPH
+ 0xDFB2: 0x535F, //CJK UNIFIED IDEOGRAPH
+ 0xDFB3: 0x53F1, //CJK UNIFIED IDEOGRAPH
+ 0xDFB4: 0x53FD, //CJK UNIFIED IDEOGRAPH
+ 0xDFB5: 0x53E9, //CJK UNIFIED IDEOGRAPH
+ 0xDFB6: 0x53E8, //CJK UNIFIED IDEOGRAPH
+ 0xDFB7: 0x53FB, //CJK UNIFIED IDEOGRAPH
+ 0xDFB8: 0x5412, //CJK UNIFIED IDEOGRAPH
+ 0xDFB9: 0x5416, //CJK UNIFIED IDEOGRAPH
+ 0xDFBA: 0x5406, //CJK UNIFIED IDEOGRAPH
+ 0xDFBB: 0x544B, //CJK UNIFIED IDEOGRAPH
+ 0xDFBC: 0x5452, //CJK UNIFIED IDEOGRAPH
+ 0xDFBD: 0x5453, //CJK UNIFIED IDEOGRAPH
+ 0xDFBE: 0x5454, //CJK UNIFIED IDEOGRAPH
+ 0xDFBF: 0x5456, //CJK UNIFIED IDEOGRAPH
+ 0xDFC0: 0x5443, //CJK UNIFIED IDEOGRAPH
+ 0xDFC1: 0x5421, //CJK UNIFIED IDEOGRAPH
+ 0xDFC2: 0x5457, //CJK UNIFIED IDEOGRAPH
+ 0xDFC3: 0x5459, //CJK UNIFIED IDEOGRAPH
+ 0xDFC4: 0x5423, //CJK UNIFIED IDEOGRAPH
+ 0xDFC5: 0x5432, //CJK UNIFIED IDEOGRAPH
+ 0xDFC6: 0x5482, //CJK UNIFIED IDEOGRAPH
+ 0xDFC7: 0x5494, //CJK UNIFIED IDEOGRAPH
+ 0xDFC8: 0x5477, //CJK UNIFIED IDEOGRAPH
+ 0xDFC9: 0x5471, //CJK UNIFIED IDEOGRAPH
+ 0xDFCA: 0x5464, //CJK UNIFIED IDEOGRAPH
+ 0xDFCB: 0x549A, //CJK UNIFIED IDEOGRAPH
+ 0xDFCC: 0x549B, //CJK UNIFIED IDEOGRAPH
+ 0xDFCD: 0x5484, //CJK UNIFIED IDEOGRAPH
+ 0xDFCE: 0x5476, //CJK UNIFIED IDEOGRAPH
+ 0xDFCF: 0x5466, //CJK UNIFIED IDEOGRAPH
+ 0xDFD0: 0x549D, //CJK UNIFIED IDEOGRAPH
+ 0xDFD1: 0x54D0, //CJK UNIFIED IDEOGRAPH
+ 0xDFD2: 0x54AD, //CJK UNIFIED IDEOGRAPH
+ 0xDFD3: 0x54C2, //CJK UNIFIED IDEOGRAPH
+ 0xDFD4: 0x54B4, //CJK UNIFIED IDEOGRAPH
+ 0xDFD5: 0x54D2, //CJK UNIFIED IDEOGRAPH
+ 0xDFD6: 0x54A7, //CJK UNIFIED IDEOGRAPH
+ 0xDFD7: 0x54A6, //CJK UNIFIED IDEOGRAPH
+ 0xDFD8: 0x54D3, //CJK UNIFIED IDEOGRAPH
+ 0xDFD9: 0x54D4, //CJK UNIFIED IDEOGRAPH
+ 0xDFDA: 0x5472, //CJK UNIFIED IDEOGRAPH
+ 0xDFDB: 0x54A3, //CJK UNIFIED IDEOGRAPH
+ 0xDFDC: 0x54D5, //CJK UNIFIED IDEOGRAPH
+ 0xDFDD: 0x54BB, //CJK UNIFIED IDEOGRAPH
+ 0xDFDE: 0x54BF, //CJK UNIFIED IDEOGRAPH
+ 0xDFDF: 0x54CC, //CJK UNIFIED IDEOGRAPH
+ 0xDFE0: 0x54D9, //CJK UNIFIED IDEOGRAPH
+ 0xDFE1: 0x54DA, //CJK UNIFIED IDEOGRAPH
+ 0xDFE2: 0x54DC, //CJK UNIFIED IDEOGRAPH
+ 0xDFE3: 0x54A9, //CJK UNIFIED IDEOGRAPH
+ 0xDFE4: 0x54AA, //CJK UNIFIED IDEOGRAPH
+ 0xDFE5: 0x54A4, //CJK UNIFIED IDEOGRAPH
+ 0xDFE6: 0x54DD, //CJK UNIFIED IDEOGRAPH
+ 0xDFE7: 0x54CF, //CJK UNIFIED IDEOGRAPH
+ 0xDFE8: 0x54DE, //CJK UNIFIED IDEOGRAPH
+ 0xDFE9: 0x551B, //CJK UNIFIED IDEOGRAPH
+ 0xDFEA: 0x54E7, //CJK UNIFIED IDEOGRAPH
+ 0xDFEB: 0x5520, //CJK UNIFIED IDEOGRAPH
+ 0xDFEC: 0x54FD, //CJK UNIFIED IDEOGRAPH
+ 0xDFED: 0x5514, //CJK UNIFIED IDEOGRAPH
+ 0xDFEE: 0x54F3, //CJK UNIFIED IDEOGRAPH
+ 0xDFEF: 0x5522, //CJK UNIFIED IDEOGRAPH
+ 0xDFF0: 0x5523, //CJK UNIFIED IDEOGRAPH
+ 0xDFF1: 0x550F, //CJK UNIFIED IDEOGRAPH
+ 0xDFF2: 0x5511, //CJK UNIFIED IDEOGRAPH
+ 0xDFF3: 0x5527, //CJK UNIFIED IDEOGRAPH
+ 0xDFF4: 0x552A, //CJK UNIFIED IDEOGRAPH
+ 0xDFF5: 0x5567, //CJK UNIFIED IDEOGRAPH
+ 0xDFF6: 0x558F, //CJK UNIFIED IDEOGRAPH
+ 0xDFF7: 0x55B5, //CJK UNIFIED IDEOGRAPH
+ 0xDFF8: 0x5549, //CJK UNIFIED IDEOGRAPH
+ 0xDFF9: 0x556D, //CJK UNIFIED IDEOGRAPH
+ 0xDFFA: 0x5541, //CJK UNIFIED IDEOGRAPH
+ 0xDFFB: 0x5555, //CJK UNIFIED IDEOGRAPH
+ 0xDFFC: 0x553F, //CJK UNIFIED IDEOGRAPH
+ 0xDFFD: 0x5550, //CJK UNIFIED IDEOGRAPH
+ 0xDFFE: 0x553C, //CJK UNIFIED IDEOGRAPH
+ 0xE040: 0x90C2, //CJK UNIFIED IDEOGRAPH
+ 0xE041: 0x90C3, //CJK UNIFIED IDEOGRAPH
+ 0xE042: 0x90C6, //CJK UNIFIED IDEOGRAPH
+ 0xE043: 0x90C8, //CJK UNIFIED IDEOGRAPH
+ 0xE044: 0x90C9, //CJK UNIFIED IDEOGRAPH
+ 0xE045: 0x90CB, //CJK UNIFIED IDEOGRAPH
+ 0xE046: 0x90CC, //CJK UNIFIED IDEOGRAPH
+ 0xE047: 0x90CD, //CJK UNIFIED IDEOGRAPH
+ 0xE048: 0x90D2, //CJK UNIFIED IDEOGRAPH
+ 0xE049: 0x90D4, //CJK UNIFIED IDEOGRAPH
+ 0xE04A: 0x90D5, //CJK UNIFIED IDEOGRAPH
+ 0xE04B: 0x90D6, //CJK UNIFIED IDEOGRAPH
+ 0xE04C: 0x90D8, //CJK UNIFIED IDEOGRAPH
+ 0xE04D: 0x90D9, //CJK UNIFIED IDEOGRAPH
+ 0xE04E: 0x90DA, //CJK UNIFIED IDEOGRAPH
+ 0xE04F: 0x90DE, //CJK UNIFIED IDEOGRAPH
+ 0xE050: 0x90DF, //CJK UNIFIED IDEOGRAPH
+ 0xE051: 0x90E0, //CJK UNIFIED IDEOGRAPH
+ 0xE052: 0x90E3, //CJK UNIFIED IDEOGRAPH
+ 0xE053: 0x90E4, //CJK UNIFIED IDEOGRAPH
+ 0xE054: 0x90E5, //CJK UNIFIED IDEOGRAPH
+ 0xE055: 0x90E9, //CJK UNIFIED IDEOGRAPH
+ 0xE056: 0x90EA, //CJK UNIFIED IDEOGRAPH
+ 0xE057: 0x90EC, //CJK UNIFIED IDEOGRAPH
+ 0xE058: 0x90EE, //CJK UNIFIED IDEOGRAPH
+ 0xE059: 0x90F0, //CJK UNIFIED IDEOGRAPH
+ 0xE05A: 0x90F1, //CJK UNIFIED IDEOGRAPH
+ 0xE05B: 0x90F2, //CJK UNIFIED IDEOGRAPH
+ 0xE05C: 0x90F3, //CJK UNIFIED IDEOGRAPH
+ 0xE05D: 0x90F5, //CJK UNIFIED IDEOGRAPH
+ 0xE05E: 0x90F6, //CJK UNIFIED IDEOGRAPH
+ 0xE05F: 0x90F7, //CJK UNIFIED IDEOGRAPH
+ 0xE060: 0x90F9, //CJK UNIFIED IDEOGRAPH
+ 0xE061: 0x90FA, //CJK UNIFIED IDEOGRAPH
+ 0xE062: 0x90FB, //CJK UNIFIED IDEOGRAPH
+ 0xE063: 0x90FC, //CJK UNIFIED IDEOGRAPH
+ 0xE064: 0x90FF, //CJK UNIFIED IDEOGRAPH
+ 0xE065: 0x9100, //CJK UNIFIED IDEOGRAPH
+ 0xE066: 0x9101, //CJK UNIFIED IDEOGRAPH
+ 0xE067: 0x9103, //CJK UNIFIED IDEOGRAPH
+ 0xE068: 0x9105, //CJK UNIFIED IDEOGRAPH
+ 0xE069: 0x9106, //CJK UNIFIED IDEOGRAPH
+ 0xE06A: 0x9107, //CJK UNIFIED IDEOGRAPH
+ 0xE06B: 0x9108, //CJK UNIFIED IDEOGRAPH
+ 0xE06C: 0x9109, //CJK UNIFIED IDEOGRAPH
+ 0xE06D: 0x910A, //CJK UNIFIED IDEOGRAPH
+ 0xE06E: 0x910B, //CJK UNIFIED IDEOGRAPH
+ 0xE06F: 0x910C, //CJK UNIFIED IDEOGRAPH
+ 0xE070: 0x910D, //CJK UNIFIED IDEOGRAPH
+ 0xE071: 0x910E, //CJK UNIFIED IDEOGRAPH
+ 0xE072: 0x910F, //CJK UNIFIED IDEOGRAPH
+ 0xE073: 0x9110, //CJK UNIFIED IDEOGRAPH
+ 0xE074: 0x9111, //CJK UNIFIED IDEOGRAPH
+ 0xE075: 0x9112, //CJK UNIFIED IDEOGRAPH
+ 0xE076: 0x9113, //CJK UNIFIED IDEOGRAPH
+ 0xE077: 0x9114, //CJK UNIFIED IDEOGRAPH
+ 0xE078: 0x9115, //CJK UNIFIED IDEOGRAPH
+ 0xE079: 0x9116, //CJK UNIFIED IDEOGRAPH
+ 0xE07A: 0x9117, //CJK UNIFIED IDEOGRAPH
+ 0xE07B: 0x9118, //CJK UNIFIED IDEOGRAPH
+ 0xE07C: 0x911A, //CJK UNIFIED IDEOGRAPH
+ 0xE07D: 0x911B, //CJK UNIFIED IDEOGRAPH
+ 0xE07E: 0x911C, //CJK UNIFIED IDEOGRAPH
+ 0xE080: 0x911D, //CJK UNIFIED IDEOGRAPH
+ 0xE081: 0x911F, //CJK UNIFIED IDEOGRAPH
+ 0xE082: 0x9120, //CJK UNIFIED IDEOGRAPH
+ 0xE083: 0x9121, //CJK UNIFIED IDEOGRAPH
+ 0xE084: 0x9124, //CJK UNIFIED IDEOGRAPH
+ 0xE085: 0x9125, //CJK UNIFIED IDEOGRAPH
+ 0xE086: 0x9126, //CJK UNIFIED IDEOGRAPH
+ 0xE087: 0x9127, //CJK UNIFIED IDEOGRAPH
+ 0xE088: 0x9128, //CJK UNIFIED IDEOGRAPH
+ 0xE089: 0x9129, //CJK UNIFIED IDEOGRAPH
+ 0xE08A: 0x912A, //CJK UNIFIED IDEOGRAPH
+ 0xE08B: 0x912B, //CJK UNIFIED IDEOGRAPH
+ 0xE08C: 0x912C, //CJK UNIFIED IDEOGRAPH
+ 0xE08D: 0x912D, //CJK UNIFIED IDEOGRAPH
+ 0xE08E: 0x912E, //CJK UNIFIED IDEOGRAPH
+ 0xE08F: 0x9130, //CJK UNIFIED IDEOGRAPH
+ 0xE090: 0x9132, //CJK UNIFIED IDEOGRAPH
+ 0xE091: 0x9133, //CJK UNIFIED IDEOGRAPH
+ 0xE092: 0x9134, //CJK UNIFIED IDEOGRAPH
+ 0xE093: 0x9135, //CJK UNIFIED IDEOGRAPH
+ 0xE094: 0x9136, //CJK UNIFIED IDEOGRAPH
+ 0xE095: 0x9137, //CJK UNIFIED IDEOGRAPH
+ 0xE096: 0x9138, //CJK UNIFIED IDEOGRAPH
+ 0xE097: 0x913A, //CJK UNIFIED IDEOGRAPH
+ 0xE098: 0x913B, //CJK UNIFIED IDEOGRAPH
+ 0xE099: 0x913C, //CJK UNIFIED IDEOGRAPH
+ 0xE09A: 0x913D, //CJK UNIFIED IDEOGRAPH
+ 0xE09B: 0x913E, //CJK UNIFIED IDEOGRAPH
+ 0xE09C: 0x913F, //CJK UNIFIED IDEOGRAPH
+ 0xE09D: 0x9140, //CJK UNIFIED IDEOGRAPH
+ 0xE09E: 0x9141, //CJK UNIFIED IDEOGRAPH
+ 0xE09F: 0x9142, //CJK UNIFIED IDEOGRAPH
+ 0xE0A0: 0x9144, //CJK UNIFIED IDEOGRAPH
+ 0xE0A1: 0x5537, //CJK UNIFIED IDEOGRAPH
+ 0xE0A2: 0x5556, //CJK UNIFIED IDEOGRAPH
+ 0xE0A3: 0x5575, //CJK UNIFIED IDEOGRAPH
+ 0xE0A4: 0x5576, //CJK UNIFIED IDEOGRAPH
+ 0xE0A5: 0x5577, //CJK UNIFIED IDEOGRAPH
+ 0xE0A6: 0x5533, //CJK UNIFIED IDEOGRAPH
+ 0xE0A7: 0x5530, //CJK UNIFIED IDEOGRAPH
+ 0xE0A8: 0x555C, //CJK UNIFIED IDEOGRAPH
+ 0xE0A9: 0x558B, //CJK UNIFIED IDEOGRAPH
+ 0xE0AA: 0x55D2, //CJK UNIFIED IDEOGRAPH
+ 0xE0AB: 0x5583, //CJK UNIFIED IDEOGRAPH
+ 0xE0AC: 0x55B1, //CJK UNIFIED IDEOGRAPH
+ 0xE0AD: 0x55B9, //CJK UNIFIED IDEOGRAPH
+ 0xE0AE: 0x5588, //CJK UNIFIED IDEOGRAPH
+ 0xE0AF: 0x5581, //CJK UNIFIED IDEOGRAPH
+ 0xE0B0: 0x559F, //CJK UNIFIED IDEOGRAPH
+ 0xE0B1: 0x557E, //CJK UNIFIED IDEOGRAPH
+ 0xE0B2: 0x55D6, //CJK UNIFIED IDEOGRAPH
+ 0xE0B3: 0x5591, //CJK UNIFIED IDEOGRAPH
+ 0xE0B4: 0x557B, //CJK UNIFIED IDEOGRAPH
+ 0xE0B5: 0x55DF, //CJK UNIFIED IDEOGRAPH
+ 0xE0B6: 0x55BD, //CJK UNIFIED IDEOGRAPH
+ 0xE0B7: 0x55BE, //CJK UNIFIED IDEOGRAPH
+ 0xE0B8: 0x5594, //CJK UNIFIED IDEOGRAPH
+ 0xE0B9: 0x5599, //CJK UNIFIED IDEOGRAPH
+ 0xE0BA: 0x55EA, //CJK UNIFIED IDEOGRAPH
+ 0xE0BB: 0x55F7, //CJK UNIFIED IDEOGRAPH
+ 0xE0BC: 0x55C9, //CJK UNIFIED IDEOGRAPH
+ 0xE0BD: 0x561F, //CJK UNIFIED IDEOGRAPH
+ 0xE0BE: 0x55D1, //CJK UNIFIED IDEOGRAPH
+ 0xE0BF: 0x55EB, //CJK UNIFIED IDEOGRAPH
+ 0xE0C0: 0x55EC, //CJK UNIFIED IDEOGRAPH
+ 0xE0C1: 0x55D4, //CJK UNIFIED IDEOGRAPH
+ 0xE0C2: 0x55E6, //CJK UNIFIED IDEOGRAPH
+ 0xE0C3: 0x55DD, //CJK UNIFIED IDEOGRAPH
+ 0xE0C4: 0x55C4, //CJK UNIFIED IDEOGRAPH
+ 0xE0C5: 0x55EF, //CJK UNIFIED IDEOGRAPH
+ 0xE0C6: 0x55E5, //CJK UNIFIED IDEOGRAPH
+ 0xE0C7: 0x55F2, //CJK UNIFIED IDEOGRAPH
+ 0xE0C8: 0x55F3, //CJK UNIFIED IDEOGRAPH
+ 0xE0C9: 0x55CC, //CJK UNIFIED IDEOGRAPH
+ 0xE0CA: 0x55CD, //CJK UNIFIED IDEOGRAPH
+ 0xE0CB: 0x55E8, //CJK UNIFIED IDEOGRAPH
+ 0xE0CC: 0x55F5, //CJK UNIFIED IDEOGRAPH
+ 0xE0CD: 0x55E4, //CJK UNIFIED IDEOGRAPH
+ 0xE0CE: 0x8F94, //CJK UNIFIED IDEOGRAPH
+ 0xE0CF: 0x561E, //CJK UNIFIED IDEOGRAPH
+ 0xE0D0: 0x5608, //CJK UNIFIED IDEOGRAPH
+ 0xE0D1: 0x560C, //CJK UNIFIED IDEOGRAPH
+ 0xE0D2: 0x5601, //CJK UNIFIED IDEOGRAPH
+ 0xE0D3: 0x5624, //CJK UNIFIED IDEOGRAPH
+ 0xE0D4: 0x5623, //CJK UNIFIED IDEOGRAPH
+ 0xE0D5: 0x55FE, //CJK UNIFIED IDEOGRAPH
+ 0xE0D6: 0x5600, //CJK UNIFIED IDEOGRAPH
+ 0xE0D7: 0x5627, //CJK UNIFIED IDEOGRAPH
+ 0xE0D8: 0x562D, //CJK UNIFIED IDEOGRAPH
+ 0xE0D9: 0x5658, //CJK UNIFIED IDEOGRAPH
+ 0xE0DA: 0x5639, //CJK UNIFIED IDEOGRAPH
+ 0xE0DB: 0x5657, //CJK UNIFIED IDEOGRAPH
+ 0xE0DC: 0x562C, //CJK UNIFIED IDEOGRAPH
+ 0xE0DD: 0x564D, //CJK UNIFIED IDEOGRAPH
+ 0xE0DE: 0x5662, //CJK UNIFIED IDEOGRAPH
+ 0xE0DF: 0x5659, //CJK UNIFIED IDEOGRAPH
+ 0xE0E0: 0x565C, //CJK UNIFIED IDEOGRAPH
+ 0xE0E1: 0x564C, //CJK UNIFIED IDEOGRAPH
+ 0xE0E2: 0x5654, //CJK UNIFIED IDEOGRAPH
+ 0xE0E3: 0x5686, //CJK UNIFIED IDEOGRAPH
+ 0xE0E4: 0x5664, //CJK UNIFIED IDEOGRAPH
+ 0xE0E5: 0x5671, //CJK UNIFIED IDEOGRAPH
+ 0xE0E6: 0x566B, //CJK UNIFIED IDEOGRAPH
+ 0xE0E7: 0x567B, //CJK UNIFIED IDEOGRAPH
+ 0xE0E8: 0x567C, //CJK UNIFIED IDEOGRAPH
+ 0xE0E9: 0x5685, //CJK UNIFIED IDEOGRAPH
+ 0xE0EA: 0x5693, //CJK UNIFIED IDEOGRAPH
+ 0xE0EB: 0x56AF, //CJK UNIFIED IDEOGRAPH
+ 0xE0EC: 0x56D4, //CJK UNIFIED IDEOGRAPH
+ 0xE0ED: 0x56D7, //CJK UNIFIED IDEOGRAPH
+ 0xE0EE: 0x56DD, //CJK UNIFIED IDEOGRAPH
+ 0xE0EF: 0x56E1, //CJK UNIFIED IDEOGRAPH
+ 0xE0F0: 0x56F5, //CJK UNIFIED IDEOGRAPH
+ 0xE0F1: 0x56EB, //CJK UNIFIED IDEOGRAPH
+ 0xE0F2: 0x56F9, //CJK UNIFIED IDEOGRAPH
+ 0xE0F3: 0x56FF, //CJK UNIFIED IDEOGRAPH
+ 0xE0F4: 0x5704, //CJK UNIFIED IDEOGRAPH
+ 0xE0F5: 0x570A, //CJK UNIFIED IDEOGRAPH
+ 0xE0F6: 0x5709, //CJK UNIFIED IDEOGRAPH
+ 0xE0F7: 0x571C, //CJK UNIFIED IDEOGRAPH
+ 0xE0F8: 0x5E0F, //CJK UNIFIED IDEOGRAPH
+ 0xE0F9: 0x5E19, //CJK UNIFIED IDEOGRAPH
+ 0xE0FA: 0x5E14, //CJK UNIFIED IDEOGRAPH
+ 0xE0FB: 0x5E11, //CJK UNIFIED IDEOGRAPH
+ 0xE0FC: 0x5E31, //CJK UNIFIED IDEOGRAPH
+ 0xE0FD: 0x5E3B, //CJK UNIFIED IDEOGRAPH
+ 0xE0FE: 0x5E3C, //CJK UNIFIED IDEOGRAPH
+ 0xE140: 0x9145, //CJK UNIFIED IDEOGRAPH
+ 0xE141: 0x9147, //CJK UNIFIED IDEOGRAPH
+ 0xE142: 0x9148, //CJK UNIFIED IDEOGRAPH
+ 0xE143: 0x9151, //CJK UNIFIED IDEOGRAPH
+ 0xE144: 0x9153, //CJK UNIFIED IDEOGRAPH
+ 0xE145: 0x9154, //CJK UNIFIED IDEOGRAPH
+ 0xE146: 0x9155, //CJK UNIFIED IDEOGRAPH
+ 0xE147: 0x9156, //CJK UNIFIED IDEOGRAPH
+ 0xE148: 0x9158, //CJK UNIFIED IDEOGRAPH
+ 0xE149: 0x9159, //CJK UNIFIED IDEOGRAPH
+ 0xE14A: 0x915B, //CJK UNIFIED IDEOGRAPH
+ 0xE14B: 0x915C, //CJK UNIFIED IDEOGRAPH
+ 0xE14C: 0x915F, //CJK UNIFIED IDEOGRAPH
+ 0xE14D: 0x9160, //CJK UNIFIED IDEOGRAPH
+ 0xE14E: 0x9166, //CJK UNIFIED IDEOGRAPH
+ 0xE14F: 0x9167, //CJK UNIFIED IDEOGRAPH
+ 0xE150: 0x9168, //CJK UNIFIED IDEOGRAPH
+ 0xE151: 0x916B, //CJK UNIFIED IDEOGRAPH
+ 0xE152: 0x916D, //CJK UNIFIED IDEOGRAPH
+ 0xE153: 0x9173, //CJK UNIFIED IDEOGRAPH
+ 0xE154: 0x917A, //CJK UNIFIED IDEOGRAPH
+ 0xE155: 0x917B, //CJK UNIFIED IDEOGRAPH
+ 0xE156: 0x917C, //CJK UNIFIED IDEOGRAPH
+ 0xE157: 0x9180, //CJK UNIFIED IDEOGRAPH
+ 0xE158: 0x9181, //CJK UNIFIED IDEOGRAPH
+ 0xE159: 0x9182, //CJK UNIFIED IDEOGRAPH
+ 0xE15A: 0x9183, //CJK UNIFIED IDEOGRAPH
+ 0xE15B: 0x9184, //CJK UNIFIED IDEOGRAPH
+ 0xE15C: 0x9186, //CJK UNIFIED IDEOGRAPH
+ 0xE15D: 0x9188, //CJK UNIFIED IDEOGRAPH
+ 0xE15E: 0x918A, //CJK UNIFIED IDEOGRAPH
+ 0xE15F: 0x918E, //CJK UNIFIED IDEOGRAPH
+ 0xE160: 0x918F, //CJK UNIFIED IDEOGRAPH
+ 0xE161: 0x9193, //CJK UNIFIED IDEOGRAPH
+ 0xE162: 0x9194, //CJK UNIFIED IDEOGRAPH
+ 0xE163: 0x9195, //CJK UNIFIED IDEOGRAPH
+ 0xE164: 0x9196, //CJK UNIFIED IDEOGRAPH
+ 0xE165: 0x9197, //CJK UNIFIED IDEOGRAPH
+ 0xE166: 0x9198, //CJK UNIFIED IDEOGRAPH
+ 0xE167: 0x9199, //CJK UNIFIED IDEOGRAPH
+ 0xE168: 0x919C, //CJK UNIFIED IDEOGRAPH
+ 0xE169: 0x919D, //CJK UNIFIED IDEOGRAPH
+ 0xE16A: 0x919E, //CJK UNIFIED IDEOGRAPH
+ 0xE16B: 0x919F, //CJK UNIFIED IDEOGRAPH
+ 0xE16C: 0x91A0, //CJK UNIFIED IDEOGRAPH
+ 0xE16D: 0x91A1, //CJK UNIFIED IDEOGRAPH
+ 0xE16E: 0x91A4, //CJK UNIFIED IDEOGRAPH
+ 0xE16F: 0x91A5, //CJK UNIFIED IDEOGRAPH
+ 0xE170: 0x91A6, //CJK UNIFIED IDEOGRAPH
+ 0xE171: 0x91A7, //CJK UNIFIED IDEOGRAPH
+ 0xE172: 0x91A8, //CJK UNIFIED IDEOGRAPH
+ 0xE173: 0x91A9, //CJK UNIFIED IDEOGRAPH
+ 0xE174: 0x91AB, //CJK UNIFIED IDEOGRAPH
+ 0xE175: 0x91AC, //CJK UNIFIED IDEOGRAPH
+ 0xE176: 0x91B0, //CJK UNIFIED IDEOGRAPH
+ 0xE177: 0x91B1, //CJK UNIFIED IDEOGRAPH
+ 0xE178: 0x91B2, //CJK UNIFIED IDEOGRAPH
+ 0xE179: 0x91B3, //CJK UNIFIED IDEOGRAPH
+ 0xE17A: 0x91B6, //CJK UNIFIED IDEOGRAPH
+ 0xE17B: 0x91B7, //CJK UNIFIED IDEOGRAPH
+ 0xE17C: 0x91B8, //CJK UNIFIED IDEOGRAPH
+ 0xE17D: 0x91B9, //CJK UNIFIED IDEOGRAPH
+ 0xE17E: 0x91BB, //CJK UNIFIED IDEOGRAPH
+ 0xE180: 0x91BC, //CJK UNIFIED IDEOGRAPH
+ 0xE181: 0x91BD, //CJK UNIFIED IDEOGRAPH
+ 0xE182: 0x91BE, //CJK UNIFIED IDEOGRAPH
+ 0xE183: 0x91BF, //CJK UNIFIED IDEOGRAPH
+ 0xE184: 0x91C0, //CJK UNIFIED IDEOGRAPH
+ 0xE185: 0x91C1, //CJK UNIFIED IDEOGRAPH
+ 0xE186: 0x91C2, //CJK UNIFIED IDEOGRAPH
+ 0xE187: 0x91C3, //CJK UNIFIED IDEOGRAPH
+ 0xE188: 0x91C4, //CJK UNIFIED IDEOGRAPH
+ 0xE189: 0x91C5, //CJK UNIFIED IDEOGRAPH
+ 0xE18A: 0x91C6, //CJK UNIFIED IDEOGRAPH
+ 0xE18B: 0x91C8, //CJK UNIFIED IDEOGRAPH
+ 0xE18C: 0x91CB, //CJK UNIFIED IDEOGRAPH
+ 0xE18D: 0x91D0, //CJK UNIFIED IDEOGRAPH
+ 0xE18E: 0x91D2, //CJK UNIFIED IDEOGRAPH
+ 0xE18F: 0x91D3, //CJK UNIFIED IDEOGRAPH
+ 0xE190: 0x91D4, //CJK UNIFIED IDEOGRAPH
+ 0xE191: 0x91D5, //CJK UNIFIED IDEOGRAPH
+ 0xE192: 0x91D6, //CJK UNIFIED IDEOGRAPH
+ 0xE193: 0x91D7, //CJK UNIFIED IDEOGRAPH
+ 0xE194: 0x91D8, //CJK UNIFIED IDEOGRAPH
+ 0xE195: 0x91D9, //CJK UNIFIED IDEOGRAPH
+ 0xE196: 0x91DA, //CJK UNIFIED IDEOGRAPH
+ 0xE197: 0x91DB, //CJK UNIFIED IDEOGRAPH
+ 0xE198: 0x91DD, //CJK UNIFIED IDEOGRAPH
+ 0xE199: 0x91DE, //CJK UNIFIED IDEOGRAPH
+ 0xE19A: 0x91DF, //CJK UNIFIED IDEOGRAPH
+ 0xE19B: 0x91E0, //CJK UNIFIED IDEOGRAPH
+ 0xE19C: 0x91E1, //CJK UNIFIED IDEOGRAPH
+ 0xE19D: 0x91E2, //CJK UNIFIED IDEOGRAPH
+ 0xE19E: 0x91E3, //CJK UNIFIED IDEOGRAPH
+ 0xE19F: 0x91E4, //CJK UNIFIED IDEOGRAPH
+ 0xE1A0: 0x91E5, //CJK UNIFIED IDEOGRAPH
+ 0xE1A1: 0x5E37, //CJK UNIFIED IDEOGRAPH
+ 0xE1A2: 0x5E44, //CJK UNIFIED IDEOGRAPH
+ 0xE1A3: 0x5E54, //CJK UNIFIED IDEOGRAPH
+ 0xE1A4: 0x5E5B, //CJK UNIFIED IDEOGRAPH
+ 0xE1A5: 0x5E5E, //CJK UNIFIED IDEOGRAPH
+ 0xE1A6: 0x5E61, //CJK UNIFIED IDEOGRAPH
+ 0xE1A7: 0x5C8C, //CJK UNIFIED IDEOGRAPH
+ 0xE1A8: 0x5C7A, //CJK UNIFIED IDEOGRAPH
+ 0xE1A9: 0x5C8D, //CJK UNIFIED IDEOGRAPH
+ 0xE1AA: 0x5C90, //CJK UNIFIED IDEOGRAPH
+ 0xE1AB: 0x5C96, //CJK UNIFIED IDEOGRAPH
+ 0xE1AC: 0x5C88, //CJK UNIFIED IDEOGRAPH
+ 0xE1AD: 0x5C98, //CJK UNIFIED IDEOGRAPH
+ 0xE1AE: 0x5C99, //CJK UNIFIED IDEOGRAPH
+ 0xE1AF: 0x5C91, //CJK UNIFIED IDEOGRAPH
+ 0xE1B0: 0x5C9A, //CJK UNIFIED IDEOGRAPH
+ 0xE1B1: 0x5C9C, //CJK UNIFIED IDEOGRAPH
+ 0xE1B2: 0x5CB5, //CJK UNIFIED IDEOGRAPH
+ 0xE1B3: 0x5CA2, //CJK UNIFIED IDEOGRAPH
+ 0xE1B4: 0x5CBD, //CJK UNIFIED IDEOGRAPH
+ 0xE1B5: 0x5CAC, //CJK UNIFIED IDEOGRAPH
+ 0xE1B6: 0x5CAB, //CJK UNIFIED IDEOGRAPH
+ 0xE1B7: 0x5CB1, //CJK UNIFIED IDEOGRAPH
+ 0xE1B8: 0x5CA3, //CJK UNIFIED IDEOGRAPH
+ 0xE1B9: 0x5CC1, //CJK UNIFIED IDEOGRAPH
+ 0xE1BA: 0x5CB7, //CJK UNIFIED IDEOGRAPH
+ 0xE1BB: 0x5CC4, //CJK UNIFIED IDEOGRAPH
+ 0xE1BC: 0x5CD2, //CJK UNIFIED IDEOGRAPH
+ 0xE1BD: 0x5CE4, //CJK UNIFIED IDEOGRAPH
+ 0xE1BE: 0x5CCB, //CJK UNIFIED IDEOGRAPH
+ 0xE1BF: 0x5CE5, //CJK UNIFIED IDEOGRAPH
+ 0xE1C0: 0x5D02, //CJK UNIFIED IDEOGRAPH
+ 0xE1C1: 0x5D03, //CJK UNIFIED IDEOGRAPH
+ 0xE1C2: 0x5D27, //CJK UNIFIED IDEOGRAPH
+ 0xE1C3: 0x5D26, //CJK UNIFIED IDEOGRAPH
+ 0xE1C4: 0x5D2E, //CJK UNIFIED IDEOGRAPH
+ 0xE1C5: 0x5D24, //CJK UNIFIED IDEOGRAPH
+ 0xE1C6: 0x5D1E, //CJK UNIFIED IDEOGRAPH
+ 0xE1C7: 0x5D06, //CJK UNIFIED IDEOGRAPH
+ 0xE1C8: 0x5D1B, //CJK UNIFIED IDEOGRAPH
+ 0xE1C9: 0x5D58, //CJK UNIFIED IDEOGRAPH
+ 0xE1CA: 0x5D3E, //CJK UNIFIED IDEOGRAPH
+ 0xE1CB: 0x5D34, //CJK UNIFIED IDEOGRAPH
+ 0xE1CC: 0x5D3D, //CJK UNIFIED IDEOGRAPH
+ 0xE1CD: 0x5D6C, //CJK UNIFIED IDEOGRAPH
+ 0xE1CE: 0x5D5B, //CJK UNIFIED IDEOGRAPH
+ 0xE1CF: 0x5D6F, //CJK UNIFIED IDEOGRAPH
+ 0xE1D0: 0x5D5D, //CJK UNIFIED IDEOGRAPH
+ 0xE1D1: 0x5D6B, //CJK UNIFIED IDEOGRAPH
+ 0xE1D2: 0x5D4B, //CJK UNIFIED IDEOGRAPH
+ 0xE1D3: 0x5D4A, //CJK UNIFIED IDEOGRAPH
+ 0xE1D4: 0x5D69, //CJK UNIFIED IDEOGRAPH
+ 0xE1D5: 0x5D74, //CJK UNIFIED IDEOGRAPH
+ 0xE1D6: 0x5D82, //CJK UNIFIED IDEOGRAPH
+ 0xE1D7: 0x5D99, //CJK UNIFIED IDEOGRAPH
+ 0xE1D8: 0x5D9D, //CJK UNIFIED IDEOGRAPH
+ 0xE1D9: 0x8C73, //CJK UNIFIED IDEOGRAPH
+ 0xE1DA: 0x5DB7, //CJK UNIFIED IDEOGRAPH
+ 0xE1DB: 0x5DC5, //CJK UNIFIED IDEOGRAPH
+ 0xE1DC: 0x5F73, //CJK UNIFIED IDEOGRAPH
+ 0xE1DD: 0x5F77, //CJK UNIFIED IDEOGRAPH
+ 0xE1DE: 0x5F82, //CJK UNIFIED IDEOGRAPH
+ 0xE1DF: 0x5F87, //CJK UNIFIED IDEOGRAPH
+ 0xE1E0: 0x5F89, //CJK UNIFIED IDEOGRAPH
+ 0xE1E1: 0x5F8C, //CJK UNIFIED IDEOGRAPH
+ 0xE1E2: 0x5F95, //CJK UNIFIED IDEOGRAPH
+ 0xE1E3: 0x5F99, //CJK UNIFIED IDEOGRAPH
+ 0xE1E4: 0x5F9C, //CJK UNIFIED IDEOGRAPH
+ 0xE1E5: 0x5FA8, //CJK UNIFIED IDEOGRAPH
+ 0xE1E6: 0x5FAD, //CJK UNIFIED IDEOGRAPH
+ 0xE1E7: 0x5FB5, //CJK UNIFIED IDEOGRAPH
+ 0xE1E8: 0x5FBC, //CJK UNIFIED IDEOGRAPH
+ 0xE1E9: 0x8862, //CJK UNIFIED IDEOGRAPH
+ 0xE1EA: 0x5F61, //CJK UNIFIED IDEOGRAPH
+ 0xE1EB: 0x72AD, //CJK UNIFIED IDEOGRAPH
+ 0xE1EC: 0x72B0, //CJK UNIFIED IDEOGRAPH
+ 0xE1ED: 0x72B4, //CJK UNIFIED IDEOGRAPH
+ 0xE1EE: 0x72B7, //CJK UNIFIED IDEOGRAPH
+ 0xE1EF: 0x72B8, //CJK UNIFIED IDEOGRAPH
+ 0xE1F0: 0x72C3, //CJK UNIFIED IDEOGRAPH
+ 0xE1F1: 0x72C1, //CJK UNIFIED IDEOGRAPH
+ 0xE1F2: 0x72CE, //CJK UNIFIED IDEOGRAPH
+ 0xE1F3: 0x72CD, //CJK UNIFIED IDEOGRAPH
+ 0xE1F4: 0x72D2, //CJK UNIFIED IDEOGRAPH
+ 0xE1F5: 0x72E8, //CJK UNIFIED IDEOGRAPH
+ 0xE1F6: 0x72EF, //CJK UNIFIED IDEOGRAPH
+ 0xE1F7: 0x72E9, //CJK UNIFIED IDEOGRAPH
+ 0xE1F8: 0x72F2, //CJK UNIFIED IDEOGRAPH
+ 0xE1F9: 0x72F4, //CJK UNIFIED IDEOGRAPH
+ 0xE1FA: 0x72F7, //CJK UNIFIED IDEOGRAPH
+ 0xE1FB: 0x7301, //CJK UNIFIED IDEOGRAPH
+ 0xE1FC: 0x72F3, //CJK UNIFIED IDEOGRAPH
+ 0xE1FD: 0x7303, //CJK UNIFIED IDEOGRAPH
+ 0xE1FE: 0x72FA, //CJK UNIFIED IDEOGRAPH
+ 0xE240: 0x91E6, //CJK UNIFIED IDEOGRAPH
+ 0xE241: 0x91E7, //CJK UNIFIED IDEOGRAPH
+ 0xE242: 0x91E8, //CJK UNIFIED IDEOGRAPH
+ 0xE243: 0x91E9, //CJK UNIFIED IDEOGRAPH
+ 0xE244: 0x91EA, //CJK UNIFIED IDEOGRAPH
+ 0xE245: 0x91EB, //CJK UNIFIED IDEOGRAPH
+ 0xE246: 0x91EC, //CJK UNIFIED IDEOGRAPH
+ 0xE247: 0x91ED, //CJK UNIFIED IDEOGRAPH
+ 0xE248: 0x91EE, //CJK UNIFIED IDEOGRAPH
+ 0xE249: 0x91EF, //CJK UNIFIED IDEOGRAPH
+ 0xE24A: 0x91F0, //CJK UNIFIED IDEOGRAPH
+ 0xE24B: 0x91F1, //CJK UNIFIED IDEOGRAPH
+ 0xE24C: 0x91F2, //CJK UNIFIED IDEOGRAPH
+ 0xE24D: 0x91F3, //CJK UNIFIED IDEOGRAPH
+ 0xE24E: 0x91F4, //CJK UNIFIED IDEOGRAPH
+ 0xE24F: 0x91F5, //CJK UNIFIED IDEOGRAPH
+ 0xE250: 0x91F6, //CJK UNIFIED IDEOGRAPH
+ 0xE251: 0x91F7, //CJK UNIFIED IDEOGRAPH
+ 0xE252: 0x91F8, //CJK UNIFIED IDEOGRAPH
+ 0xE253: 0x91F9, //CJK UNIFIED IDEOGRAPH
+ 0xE254: 0x91FA, //CJK UNIFIED IDEOGRAPH
+ 0xE255: 0x91FB, //CJK UNIFIED IDEOGRAPH
+ 0xE256: 0x91FC, //CJK UNIFIED IDEOGRAPH
+ 0xE257: 0x91FD, //CJK UNIFIED IDEOGRAPH
+ 0xE258: 0x91FE, //CJK UNIFIED IDEOGRAPH
+ 0xE259: 0x91FF, //CJK UNIFIED IDEOGRAPH
+ 0xE25A: 0x9200, //CJK UNIFIED IDEOGRAPH
+ 0xE25B: 0x9201, //CJK UNIFIED IDEOGRAPH
+ 0xE25C: 0x9202, //CJK UNIFIED IDEOGRAPH
+ 0xE25D: 0x9203, //CJK UNIFIED IDEOGRAPH
+ 0xE25E: 0x9204, //CJK UNIFIED IDEOGRAPH
+ 0xE25F: 0x9205, //CJK UNIFIED IDEOGRAPH
+ 0xE260: 0x9206, //CJK UNIFIED IDEOGRAPH
+ 0xE261: 0x9207, //CJK UNIFIED IDEOGRAPH
+ 0xE262: 0x9208, //CJK UNIFIED IDEOGRAPH
+ 0xE263: 0x9209, //CJK UNIFIED IDEOGRAPH
+ 0xE264: 0x920A, //CJK UNIFIED IDEOGRAPH
+ 0xE265: 0x920B, //CJK UNIFIED IDEOGRAPH
+ 0xE266: 0x920C, //CJK UNIFIED IDEOGRAPH
+ 0xE267: 0x920D, //CJK UNIFIED IDEOGRAPH
+ 0xE268: 0x920E, //CJK UNIFIED IDEOGRAPH
+ 0xE269: 0x920F, //CJK UNIFIED IDEOGRAPH
+ 0xE26A: 0x9210, //CJK UNIFIED IDEOGRAPH
+ 0xE26B: 0x9211, //CJK UNIFIED IDEOGRAPH
+ 0xE26C: 0x9212, //CJK UNIFIED IDEOGRAPH
+ 0xE26D: 0x9213, //CJK UNIFIED IDEOGRAPH
+ 0xE26E: 0x9214, //CJK UNIFIED IDEOGRAPH
+ 0xE26F: 0x9215, //CJK UNIFIED IDEOGRAPH
+ 0xE270: 0x9216, //CJK UNIFIED IDEOGRAPH
+ 0xE271: 0x9217, //CJK UNIFIED IDEOGRAPH
+ 0xE272: 0x9218, //CJK UNIFIED IDEOGRAPH
+ 0xE273: 0x9219, //CJK UNIFIED IDEOGRAPH
+ 0xE274: 0x921A, //CJK UNIFIED IDEOGRAPH
+ 0xE275: 0x921B, //CJK UNIFIED IDEOGRAPH
+ 0xE276: 0x921C, //CJK UNIFIED IDEOGRAPH
+ 0xE277: 0x921D, //CJK UNIFIED IDEOGRAPH
+ 0xE278: 0x921E, //CJK UNIFIED IDEOGRAPH
+ 0xE279: 0x921F, //CJK UNIFIED IDEOGRAPH
+ 0xE27A: 0x9220, //CJK UNIFIED IDEOGRAPH
+ 0xE27B: 0x9221, //CJK UNIFIED IDEOGRAPH
+ 0xE27C: 0x9222, //CJK UNIFIED IDEOGRAPH
+ 0xE27D: 0x9223, //CJK UNIFIED IDEOGRAPH
+ 0xE27E: 0x9224, //CJK UNIFIED IDEOGRAPH
+ 0xE280: 0x9225, //CJK UNIFIED IDEOGRAPH
+ 0xE281: 0x9226, //CJK UNIFIED IDEOGRAPH
+ 0xE282: 0x9227, //CJK UNIFIED IDEOGRAPH
+ 0xE283: 0x9228, //CJK UNIFIED IDEOGRAPH
+ 0xE284: 0x9229, //CJK UNIFIED IDEOGRAPH
+ 0xE285: 0x922A, //CJK UNIFIED IDEOGRAPH
+ 0xE286: 0x922B, //CJK UNIFIED IDEOGRAPH
+ 0xE287: 0x922C, //CJK UNIFIED IDEOGRAPH
+ 0xE288: 0x922D, //CJK UNIFIED IDEOGRAPH
+ 0xE289: 0x922E, //CJK UNIFIED IDEOGRAPH
+ 0xE28A: 0x922F, //CJK UNIFIED IDEOGRAPH
+ 0xE28B: 0x9230, //CJK UNIFIED IDEOGRAPH
+ 0xE28C: 0x9231, //CJK UNIFIED IDEOGRAPH
+ 0xE28D: 0x9232, //CJK UNIFIED IDEOGRAPH
+ 0xE28E: 0x9233, //CJK UNIFIED IDEOGRAPH
+ 0xE28F: 0x9234, //CJK UNIFIED IDEOGRAPH
+ 0xE290: 0x9235, //CJK UNIFIED IDEOGRAPH
+ 0xE291: 0x9236, //CJK UNIFIED IDEOGRAPH
+ 0xE292: 0x9237, //CJK UNIFIED IDEOGRAPH
+ 0xE293: 0x9238, //CJK UNIFIED IDEOGRAPH
+ 0xE294: 0x9239, //CJK UNIFIED IDEOGRAPH
+ 0xE295: 0x923A, //CJK UNIFIED IDEOGRAPH
+ 0xE296: 0x923B, //CJK UNIFIED IDEOGRAPH
+ 0xE297: 0x923C, //CJK UNIFIED IDEOGRAPH
+ 0xE298: 0x923D, //CJK UNIFIED IDEOGRAPH
+ 0xE299: 0x923E, //CJK UNIFIED IDEOGRAPH
+ 0xE29A: 0x923F, //CJK UNIFIED IDEOGRAPH
+ 0xE29B: 0x9240, //CJK UNIFIED IDEOGRAPH
+ 0xE29C: 0x9241, //CJK UNIFIED IDEOGRAPH
+ 0xE29D: 0x9242, //CJK UNIFIED IDEOGRAPH
+ 0xE29E: 0x9243, //CJK UNIFIED IDEOGRAPH
+ 0xE29F: 0x9244, //CJK UNIFIED IDEOGRAPH
+ 0xE2A0: 0x9245, //CJK UNIFIED IDEOGRAPH
+ 0xE2A1: 0x72FB, //CJK UNIFIED IDEOGRAPH
+ 0xE2A2: 0x7317, //CJK UNIFIED IDEOGRAPH
+ 0xE2A3: 0x7313, //CJK UNIFIED IDEOGRAPH
+ 0xE2A4: 0x7321, //CJK UNIFIED IDEOGRAPH
+ 0xE2A5: 0x730A, //CJK UNIFIED IDEOGRAPH
+ 0xE2A6: 0x731E, //CJK UNIFIED IDEOGRAPH
+ 0xE2A7: 0x731D, //CJK UNIFIED IDEOGRAPH
+ 0xE2A8: 0x7315, //CJK UNIFIED IDEOGRAPH
+ 0xE2A9: 0x7322, //CJK UNIFIED IDEOGRAPH
+ 0xE2AA: 0x7339, //CJK UNIFIED IDEOGRAPH
+ 0xE2AB: 0x7325, //CJK UNIFIED IDEOGRAPH
+ 0xE2AC: 0x732C, //CJK UNIFIED IDEOGRAPH
+ 0xE2AD: 0x7338, //CJK UNIFIED IDEOGRAPH
+ 0xE2AE: 0x7331, //CJK UNIFIED IDEOGRAPH
+ 0xE2AF: 0x7350, //CJK UNIFIED IDEOGRAPH
+ 0xE2B0: 0x734D, //CJK UNIFIED IDEOGRAPH
+ 0xE2B1: 0x7357, //CJK UNIFIED IDEOGRAPH
+ 0xE2B2: 0x7360, //CJK UNIFIED IDEOGRAPH
+ 0xE2B3: 0x736C, //CJK UNIFIED IDEOGRAPH
+ 0xE2B4: 0x736F, //CJK UNIFIED IDEOGRAPH
+ 0xE2B5: 0x737E, //CJK UNIFIED IDEOGRAPH
+ 0xE2B6: 0x821B, //CJK UNIFIED IDEOGRAPH
+ 0xE2B7: 0x5925, //CJK UNIFIED IDEOGRAPH
+ 0xE2B8: 0x98E7, //CJK UNIFIED IDEOGRAPH
+ 0xE2B9: 0x5924, //CJK UNIFIED IDEOGRAPH
+ 0xE2BA: 0x5902, //CJK UNIFIED IDEOGRAPH
+ 0xE2BB: 0x9963, //CJK UNIFIED IDEOGRAPH
+ 0xE2BC: 0x9967, //CJK UNIFIED IDEOGRAPH
+ 0xE2BD: 0x9968, //CJK UNIFIED IDEOGRAPH
+ 0xE2BE: 0x9969, //CJK UNIFIED IDEOGRAPH
+ 0xE2BF: 0x996A, //CJK UNIFIED IDEOGRAPH
+ 0xE2C0: 0x996B, //CJK UNIFIED IDEOGRAPH
+ 0xE2C1: 0x996C, //CJK UNIFIED IDEOGRAPH
+ 0xE2C2: 0x9974, //CJK UNIFIED IDEOGRAPH
+ 0xE2C3: 0x9977, //CJK UNIFIED IDEOGRAPH
+ 0xE2C4: 0x997D, //CJK UNIFIED IDEOGRAPH
+ 0xE2C5: 0x9980, //CJK UNIFIED IDEOGRAPH
+ 0xE2C6: 0x9984, //CJK UNIFIED IDEOGRAPH
+ 0xE2C7: 0x9987, //CJK UNIFIED IDEOGRAPH
+ 0xE2C8: 0x998A, //CJK UNIFIED IDEOGRAPH
+ 0xE2C9: 0x998D, //CJK UNIFIED IDEOGRAPH
+ 0xE2CA: 0x9990, //CJK UNIFIED IDEOGRAPH
+ 0xE2CB: 0x9991, //CJK UNIFIED IDEOGRAPH
+ 0xE2CC: 0x9993, //CJK UNIFIED IDEOGRAPH
+ 0xE2CD: 0x9994, //CJK UNIFIED IDEOGRAPH
+ 0xE2CE: 0x9995, //CJK UNIFIED IDEOGRAPH
+ 0xE2CF: 0x5E80, //CJK UNIFIED IDEOGRAPH
+ 0xE2D0: 0x5E91, //CJK UNIFIED IDEOGRAPH
+ 0xE2D1: 0x5E8B, //CJK UNIFIED IDEOGRAPH
+ 0xE2D2: 0x5E96, //CJK UNIFIED IDEOGRAPH
+ 0xE2D3: 0x5EA5, //CJK UNIFIED IDEOGRAPH
+ 0xE2D4: 0x5EA0, //CJK UNIFIED IDEOGRAPH
+ 0xE2D5: 0x5EB9, //CJK UNIFIED IDEOGRAPH
+ 0xE2D6: 0x5EB5, //CJK UNIFIED IDEOGRAPH
+ 0xE2D7: 0x5EBE, //CJK UNIFIED IDEOGRAPH
+ 0xE2D8: 0x5EB3, //CJK UNIFIED IDEOGRAPH
+ 0xE2D9: 0x8D53, //CJK UNIFIED IDEOGRAPH
+ 0xE2DA: 0x5ED2, //CJK UNIFIED IDEOGRAPH
+ 0xE2DB: 0x5ED1, //CJK UNIFIED IDEOGRAPH
+ 0xE2DC: 0x5EDB, //CJK UNIFIED IDEOGRAPH
+ 0xE2DD: 0x5EE8, //CJK UNIFIED IDEOGRAPH
+ 0xE2DE: 0x5EEA, //CJK UNIFIED IDEOGRAPH
+ 0xE2DF: 0x81BA, //CJK UNIFIED IDEOGRAPH
+ 0xE2E0: 0x5FC4, //CJK UNIFIED IDEOGRAPH
+ 0xE2E1: 0x5FC9, //CJK UNIFIED IDEOGRAPH
+ 0xE2E2: 0x5FD6, //CJK UNIFIED IDEOGRAPH
+ 0xE2E3: 0x5FCF, //CJK UNIFIED IDEOGRAPH
+ 0xE2E4: 0x6003, //CJK UNIFIED IDEOGRAPH
+ 0xE2E5: 0x5FEE, //CJK UNIFIED IDEOGRAPH
+ 0xE2E6: 0x6004, //CJK UNIFIED IDEOGRAPH
+ 0xE2E7: 0x5FE1, //CJK UNIFIED IDEOGRAPH
+ 0xE2E8: 0x5FE4, //CJK UNIFIED IDEOGRAPH
+ 0xE2E9: 0x5FFE, //CJK UNIFIED IDEOGRAPH
+ 0xE2EA: 0x6005, //CJK UNIFIED IDEOGRAPH
+ 0xE2EB: 0x6006, //CJK UNIFIED IDEOGRAPH
+ 0xE2EC: 0x5FEA, //CJK UNIFIED IDEOGRAPH
+ 0xE2ED: 0x5FED, //CJK UNIFIED IDEOGRAPH
+ 0xE2EE: 0x5FF8, //CJK UNIFIED IDEOGRAPH
+ 0xE2EF: 0x6019, //CJK UNIFIED IDEOGRAPH
+ 0xE2F0: 0x6035, //CJK UNIFIED IDEOGRAPH
+ 0xE2F1: 0x6026, //CJK UNIFIED IDEOGRAPH
+ 0xE2F2: 0x601B, //CJK UNIFIED IDEOGRAPH
+ 0xE2F3: 0x600F, //CJK UNIFIED IDEOGRAPH
+ 0xE2F4: 0x600D, //CJK UNIFIED IDEOGRAPH
+ 0xE2F5: 0x6029, //CJK UNIFIED IDEOGRAPH
+ 0xE2F6: 0x602B, //CJK UNIFIED IDEOGRAPH
+ 0xE2F7: 0x600A, //CJK UNIFIED IDEOGRAPH
+ 0xE2F8: 0x603F, //CJK UNIFIED IDEOGRAPH
+ 0xE2F9: 0x6021, //CJK UNIFIED IDEOGRAPH
+ 0xE2FA: 0x6078, //CJK UNIFIED IDEOGRAPH
+ 0xE2FB: 0x6079, //CJK UNIFIED IDEOGRAPH
+ 0xE2FC: 0x607B, //CJK UNIFIED IDEOGRAPH
+ 0xE2FD: 0x607A, //CJK UNIFIED IDEOGRAPH
+ 0xE2FE: 0x6042, //CJK UNIFIED IDEOGRAPH
+ 0xE340: 0x9246, //CJK UNIFIED IDEOGRAPH
+ 0xE341: 0x9247, //CJK UNIFIED IDEOGRAPH
+ 0xE342: 0x9248, //CJK UNIFIED IDEOGRAPH
+ 0xE343: 0x9249, //CJK UNIFIED IDEOGRAPH
+ 0xE344: 0x924A, //CJK UNIFIED IDEOGRAPH
+ 0xE345: 0x924B, //CJK UNIFIED IDEOGRAPH
+ 0xE346: 0x924C, //CJK UNIFIED IDEOGRAPH
+ 0xE347: 0x924D, //CJK UNIFIED IDEOGRAPH
+ 0xE348: 0x924E, //CJK UNIFIED IDEOGRAPH
+ 0xE349: 0x924F, //CJK UNIFIED IDEOGRAPH
+ 0xE34A: 0x9250, //CJK UNIFIED IDEOGRAPH
+ 0xE34B: 0x9251, //CJK UNIFIED IDEOGRAPH
+ 0xE34C: 0x9252, //CJK UNIFIED IDEOGRAPH
+ 0xE34D: 0x9253, //CJK UNIFIED IDEOGRAPH
+ 0xE34E: 0x9254, //CJK UNIFIED IDEOGRAPH
+ 0xE34F: 0x9255, //CJK UNIFIED IDEOGRAPH
+ 0xE350: 0x9256, //CJK UNIFIED IDEOGRAPH
+ 0xE351: 0x9257, //CJK UNIFIED IDEOGRAPH
+ 0xE352: 0x9258, //CJK UNIFIED IDEOGRAPH
+ 0xE353: 0x9259, //CJK UNIFIED IDEOGRAPH
+ 0xE354: 0x925A, //CJK UNIFIED IDEOGRAPH
+ 0xE355: 0x925B, //CJK UNIFIED IDEOGRAPH
+ 0xE356: 0x925C, //CJK UNIFIED IDEOGRAPH
+ 0xE357: 0x925D, //CJK UNIFIED IDEOGRAPH
+ 0xE358: 0x925E, //CJK UNIFIED IDEOGRAPH
+ 0xE359: 0x925F, //CJK UNIFIED IDEOGRAPH
+ 0xE35A: 0x9260, //CJK UNIFIED IDEOGRAPH
+ 0xE35B: 0x9261, //CJK UNIFIED IDEOGRAPH
+ 0xE35C: 0x9262, //CJK UNIFIED IDEOGRAPH
+ 0xE35D: 0x9263, //CJK UNIFIED IDEOGRAPH
+ 0xE35E: 0x9264, //CJK UNIFIED IDEOGRAPH
+ 0xE35F: 0x9265, //CJK UNIFIED IDEOGRAPH
+ 0xE360: 0x9266, //CJK UNIFIED IDEOGRAPH
+ 0xE361: 0x9267, //CJK UNIFIED IDEOGRAPH
+ 0xE362: 0x9268, //CJK UNIFIED IDEOGRAPH
+ 0xE363: 0x9269, //CJK UNIFIED IDEOGRAPH
+ 0xE364: 0x926A, //CJK UNIFIED IDEOGRAPH
+ 0xE365: 0x926B, //CJK UNIFIED IDEOGRAPH
+ 0xE366: 0x926C, //CJK UNIFIED IDEOGRAPH
+ 0xE367: 0x926D, //CJK UNIFIED IDEOGRAPH
+ 0xE368: 0x926E, //CJK UNIFIED IDEOGRAPH
+ 0xE369: 0x926F, //CJK UNIFIED IDEOGRAPH
+ 0xE36A: 0x9270, //CJK UNIFIED IDEOGRAPH
+ 0xE36B: 0x9271, //CJK UNIFIED IDEOGRAPH
+ 0xE36C: 0x9272, //CJK UNIFIED IDEOGRAPH
+ 0xE36D: 0x9273, //CJK UNIFIED IDEOGRAPH
+ 0xE36E: 0x9275, //CJK UNIFIED IDEOGRAPH
+ 0xE36F: 0x9276, //CJK UNIFIED IDEOGRAPH
+ 0xE370: 0x9277, //CJK UNIFIED IDEOGRAPH
+ 0xE371: 0x9278, //CJK UNIFIED IDEOGRAPH
+ 0xE372: 0x9279, //CJK UNIFIED IDEOGRAPH
+ 0xE373: 0x927A, //CJK UNIFIED IDEOGRAPH
+ 0xE374: 0x927B, //CJK UNIFIED IDEOGRAPH
+ 0xE375: 0x927C, //CJK UNIFIED IDEOGRAPH
+ 0xE376: 0x927D, //CJK UNIFIED IDEOGRAPH
+ 0xE377: 0x927E, //CJK UNIFIED IDEOGRAPH
+ 0xE378: 0x927F, //CJK UNIFIED IDEOGRAPH
+ 0xE379: 0x9280, //CJK UNIFIED IDEOGRAPH
+ 0xE37A: 0x9281, //CJK UNIFIED IDEOGRAPH
+ 0xE37B: 0x9282, //CJK UNIFIED IDEOGRAPH
+ 0xE37C: 0x9283, //CJK UNIFIED IDEOGRAPH
+ 0xE37D: 0x9284, //CJK UNIFIED IDEOGRAPH
+ 0xE37E: 0x9285, //CJK UNIFIED IDEOGRAPH
+ 0xE380: 0x9286, //CJK UNIFIED IDEOGRAPH
+ 0xE381: 0x9287, //CJK UNIFIED IDEOGRAPH
+ 0xE382: 0x9288, //CJK UNIFIED IDEOGRAPH
+ 0xE383: 0x9289, //CJK UNIFIED IDEOGRAPH
+ 0xE384: 0x928A, //CJK UNIFIED IDEOGRAPH
+ 0xE385: 0x928B, //CJK UNIFIED IDEOGRAPH
+ 0xE386: 0x928C, //CJK UNIFIED IDEOGRAPH
+ 0xE387: 0x928D, //CJK UNIFIED IDEOGRAPH
+ 0xE388: 0x928F, //CJK UNIFIED IDEOGRAPH
+ 0xE389: 0x9290, //CJK UNIFIED IDEOGRAPH
+ 0xE38A: 0x9291, //CJK UNIFIED IDEOGRAPH
+ 0xE38B: 0x9292, //CJK UNIFIED IDEOGRAPH
+ 0xE38C: 0x9293, //CJK UNIFIED IDEOGRAPH
+ 0xE38D: 0x9294, //CJK UNIFIED IDEOGRAPH
+ 0xE38E: 0x9295, //CJK UNIFIED IDEOGRAPH
+ 0xE38F: 0x9296, //CJK UNIFIED IDEOGRAPH
+ 0xE390: 0x9297, //CJK UNIFIED IDEOGRAPH
+ 0xE391: 0x9298, //CJK UNIFIED IDEOGRAPH
+ 0xE392: 0x9299, //CJK UNIFIED IDEOGRAPH
+ 0xE393: 0x929A, //CJK UNIFIED IDEOGRAPH
+ 0xE394: 0x929B, //CJK UNIFIED IDEOGRAPH
+ 0xE395: 0x929C, //CJK UNIFIED IDEOGRAPH
+ 0xE396: 0x929D, //CJK UNIFIED IDEOGRAPH
+ 0xE397: 0x929E, //CJK UNIFIED IDEOGRAPH
+ 0xE398: 0x929F, //CJK UNIFIED IDEOGRAPH
+ 0xE399: 0x92A0, //CJK UNIFIED IDEOGRAPH
+ 0xE39A: 0x92A1, //CJK UNIFIED IDEOGRAPH
+ 0xE39B: 0x92A2, //CJK UNIFIED IDEOGRAPH
+ 0xE39C: 0x92A3, //CJK UNIFIED IDEOGRAPH
+ 0xE39D: 0x92A4, //CJK UNIFIED IDEOGRAPH
+ 0xE39E: 0x92A5, //CJK UNIFIED IDEOGRAPH
+ 0xE39F: 0x92A6, //CJK UNIFIED IDEOGRAPH
+ 0xE3A0: 0x92A7, //CJK UNIFIED IDEOGRAPH
+ 0xE3A1: 0x606A, //CJK UNIFIED IDEOGRAPH
+ 0xE3A2: 0x607D, //CJK UNIFIED IDEOGRAPH
+ 0xE3A3: 0x6096, //CJK UNIFIED IDEOGRAPH
+ 0xE3A4: 0x609A, //CJK UNIFIED IDEOGRAPH
+ 0xE3A5: 0x60AD, //CJK UNIFIED IDEOGRAPH
+ 0xE3A6: 0x609D, //CJK UNIFIED IDEOGRAPH
+ 0xE3A7: 0x6083, //CJK UNIFIED IDEOGRAPH
+ 0xE3A8: 0x6092, //CJK UNIFIED IDEOGRAPH
+ 0xE3A9: 0x608C, //CJK UNIFIED IDEOGRAPH
+ 0xE3AA: 0x609B, //CJK UNIFIED IDEOGRAPH
+ 0xE3AB: 0x60EC, //CJK UNIFIED IDEOGRAPH
+ 0xE3AC: 0x60BB, //CJK UNIFIED IDEOGRAPH
+ 0xE3AD: 0x60B1, //CJK UNIFIED IDEOGRAPH
+ 0xE3AE: 0x60DD, //CJK UNIFIED IDEOGRAPH
+ 0xE3AF: 0x60D8, //CJK UNIFIED IDEOGRAPH
+ 0xE3B0: 0x60C6, //CJK UNIFIED IDEOGRAPH
+ 0xE3B1: 0x60DA, //CJK UNIFIED IDEOGRAPH
+ 0xE3B2: 0x60B4, //CJK UNIFIED IDEOGRAPH
+ 0xE3B3: 0x6120, //CJK UNIFIED IDEOGRAPH
+ 0xE3B4: 0x6126, //CJK UNIFIED IDEOGRAPH
+ 0xE3B5: 0x6115, //CJK UNIFIED IDEOGRAPH
+ 0xE3B6: 0x6123, //CJK UNIFIED IDEOGRAPH
+ 0xE3B7: 0x60F4, //CJK UNIFIED IDEOGRAPH
+ 0xE3B8: 0x6100, //CJK UNIFIED IDEOGRAPH
+ 0xE3B9: 0x610E, //CJK UNIFIED IDEOGRAPH
+ 0xE3BA: 0x612B, //CJK UNIFIED IDEOGRAPH
+ 0xE3BB: 0x614A, //CJK UNIFIED IDEOGRAPH
+ 0xE3BC: 0x6175, //CJK UNIFIED IDEOGRAPH
+ 0xE3BD: 0x61AC, //CJK UNIFIED IDEOGRAPH
+ 0xE3BE: 0x6194, //CJK UNIFIED IDEOGRAPH
+ 0xE3BF: 0x61A7, //CJK UNIFIED IDEOGRAPH
+ 0xE3C0: 0x61B7, //CJK UNIFIED IDEOGRAPH
+ 0xE3C1: 0x61D4, //CJK UNIFIED IDEOGRAPH
+ 0xE3C2: 0x61F5, //CJK UNIFIED IDEOGRAPH
+ 0xE3C3: 0x5FDD, //CJK UNIFIED IDEOGRAPH
+ 0xE3C4: 0x96B3, //CJK UNIFIED IDEOGRAPH
+ 0xE3C5: 0x95E9, //CJK UNIFIED IDEOGRAPH
+ 0xE3C6: 0x95EB, //CJK UNIFIED IDEOGRAPH
+ 0xE3C7: 0x95F1, //CJK UNIFIED IDEOGRAPH
+ 0xE3C8: 0x95F3, //CJK UNIFIED IDEOGRAPH
+ 0xE3C9: 0x95F5, //CJK UNIFIED IDEOGRAPH
+ 0xE3CA: 0x95F6, //CJK UNIFIED IDEOGRAPH
+ 0xE3CB: 0x95FC, //CJK UNIFIED IDEOGRAPH
+ 0xE3CC: 0x95FE, //CJK UNIFIED IDEOGRAPH
+ 0xE3CD: 0x9603, //CJK UNIFIED IDEOGRAPH
+ 0xE3CE: 0x9604, //CJK UNIFIED IDEOGRAPH
+ 0xE3CF: 0x9606, //CJK UNIFIED IDEOGRAPH
+ 0xE3D0: 0x9608, //CJK UNIFIED IDEOGRAPH
+ 0xE3D1: 0x960A, //CJK UNIFIED IDEOGRAPH
+ 0xE3D2: 0x960B, //CJK UNIFIED IDEOGRAPH
+ 0xE3D3: 0x960C, //CJK UNIFIED IDEOGRAPH
+ 0xE3D4: 0x960D, //CJK UNIFIED IDEOGRAPH
+ 0xE3D5: 0x960F, //CJK UNIFIED IDEOGRAPH
+ 0xE3D6: 0x9612, //CJK UNIFIED IDEOGRAPH
+ 0xE3D7: 0x9615, //CJK UNIFIED IDEOGRAPH
+ 0xE3D8: 0x9616, //CJK UNIFIED IDEOGRAPH
+ 0xE3D9: 0x9617, //CJK UNIFIED IDEOGRAPH
+ 0xE3DA: 0x9619, //CJK UNIFIED IDEOGRAPH
+ 0xE3DB: 0x961A, //CJK UNIFIED IDEOGRAPH
+ 0xE3DC: 0x4E2C, //CJK UNIFIED IDEOGRAPH
+ 0xE3DD: 0x723F, //CJK UNIFIED IDEOGRAPH
+ 0xE3DE: 0x6215, //CJK UNIFIED IDEOGRAPH
+ 0xE3DF: 0x6C35, //CJK UNIFIED IDEOGRAPH
+ 0xE3E0: 0x6C54, //CJK UNIFIED IDEOGRAPH
+ 0xE3E1: 0x6C5C, //CJK UNIFIED IDEOGRAPH
+ 0xE3E2: 0x6C4A, //CJK UNIFIED IDEOGRAPH
+ 0xE3E3: 0x6CA3, //CJK UNIFIED IDEOGRAPH
+ 0xE3E4: 0x6C85, //CJK UNIFIED IDEOGRAPH
+ 0xE3E5: 0x6C90, //CJK UNIFIED IDEOGRAPH
+ 0xE3E6: 0x6C94, //CJK UNIFIED IDEOGRAPH
+ 0xE3E7: 0x6C8C, //CJK UNIFIED IDEOGRAPH
+ 0xE3E8: 0x6C68, //CJK UNIFIED IDEOGRAPH
+ 0xE3E9: 0x6C69, //CJK UNIFIED IDEOGRAPH
+ 0xE3EA: 0x6C74, //CJK UNIFIED IDEOGRAPH
+ 0xE3EB: 0x6C76, //CJK UNIFIED IDEOGRAPH
+ 0xE3EC: 0x6C86, //CJK UNIFIED IDEOGRAPH
+ 0xE3ED: 0x6CA9, //CJK UNIFIED IDEOGRAPH
+ 0xE3EE: 0x6CD0, //CJK UNIFIED IDEOGRAPH
+ 0xE3EF: 0x6CD4, //CJK UNIFIED IDEOGRAPH
+ 0xE3F0: 0x6CAD, //CJK UNIFIED IDEOGRAPH
+ 0xE3F1: 0x6CF7, //CJK UNIFIED IDEOGRAPH
+ 0xE3F2: 0x6CF8, //CJK UNIFIED IDEOGRAPH
+ 0xE3F3: 0x6CF1, //CJK UNIFIED IDEOGRAPH
+ 0xE3F4: 0x6CD7, //CJK UNIFIED IDEOGRAPH
+ 0xE3F5: 0x6CB2, //CJK UNIFIED IDEOGRAPH
+ 0xE3F6: 0x6CE0, //CJK UNIFIED IDEOGRAPH
+ 0xE3F7: 0x6CD6, //CJK UNIFIED IDEOGRAPH
+ 0xE3F8: 0x6CFA, //CJK UNIFIED IDEOGRAPH
+ 0xE3F9: 0x6CEB, //CJK UNIFIED IDEOGRAPH
+ 0xE3FA: 0x6CEE, //CJK UNIFIED IDEOGRAPH
+ 0xE3FB: 0x6CB1, //CJK UNIFIED IDEOGRAPH
+ 0xE3FC: 0x6CD3, //CJK UNIFIED IDEOGRAPH
+ 0xE3FD: 0x6CEF, //CJK UNIFIED IDEOGRAPH
+ 0xE3FE: 0x6CFE, //CJK UNIFIED IDEOGRAPH
+ 0xE440: 0x92A8, //CJK UNIFIED IDEOGRAPH
+ 0xE441: 0x92A9, //CJK UNIFIED IDEOGRAPH
+ 0xE442: 0x92AA, //CJK UNIFIED IDEOGRAPH
+ 0xE443: 0x92AB, //CJK UNIFIED IDEOGRAPH
+ 0xE444: 0x92AC, //CJK UNIFIED IDEOGRAPH
+ 0xE445: 0x92AD, //CJK UNIFIED IDEOGRAPH
+ 0xE446: 0x92AF, //CJK UNIFIED IDEOGRAPH
+ 0xE447: 0x92B0, //CJK UNIFIED IDEOGRAPH
+ 0xE448: 0x92B1, //CJK UNIFIED IDEOGRAPH
+ 0xE449: 0x92B2, //CJK UNIFIED IDEOGRAPH
+ 0xE44A: 0x92B3, //CJK UNIFIED IDEOGRAPH
+ 0xE44B: 0x92B4, //CJK UNIFIED IDEOGRAPH
+ 0xE44C: 0x92B5, //CJK UNIFIED IDEOGRAPH
+ 0xE44D: 0x92B6, //CJK UNIFIED IDEOGRAPH
+ 0xE44E: 0x92B7, //CJK UNIFIED IDEOGRAPH
+ 0xE44F: 0x92B8, //CJK UNIFIED IDEOGRAPH
+ 0xE450: 0x92B9, //CJK UNIFIED IDEOGRAPH
+ 0xE451: 0x92BA, //CJK UNIFIED IDEOGRAPH
+ 0xE452: 0x92BB, //CJK UNIFIED IDEOGRAPH
+ 0xE453: 0x92BC, //CJK UNIFIED IDEOGRAPH
+ 0xE454: 0x92BD, //CJK UNIFIED IDEOGRAPH
+ 0xE455: 0x92BE, //CJK UNIFIED IDEOGRAPH
+ 0xE456: 0x92BF, //CJK UNIFIED IDEOGRAPH
+ 0xE457: 0x92C0, //CJK UNIFIED IDEOGRAPH
+ 0xE458: 0x92C1, //CJK UNIFIED IDEOGRAPH
+ 0xE459: 0x92C2, //CJK UNIFIED IDEOGRAPH
+ 0xE45A: 0x92C3, //CJK UNIFIED IDEOGRAPH
+ 0xE45B: 0x92C4, //CJK UNIFIED IDEOGRAPH
+ 0xE45C: 0x92C5, //CJK UNIFIED IDEOGRAPH
+ 0xE45D: 0x92C6, //CJK UNIFIED IDEOGRAPH
+ 0xE45E: 0x92C7, //CJK UNIFIED IDEOGRAPH
+ 0xE45F: 0x92C9, //CJK UNIFIED IDEOGRAPH
+ 0xE460: 0x92CA, //CJK UNIFIED IDEOGRAPH
+ 0xE461: 0x92CB, //CJK UNIFIED IDEOGRAPH
+ 0xE462: 0x92CC, //CJK UNIFIED IDEOGRAPH
+ 0xE463: 0x92CD, //CJK UNIFIED IDEOGRAPH
+ 0xE464: 0x92CE, //CJK UNIFIED IDEOGRAPH
+ 0xE465: 0x92CF, //CJK UNIFIED IDEOGRAPH
+ 0xE466: 0x92D0, //CJK UNIFIED IDEOGRAPH
+ 0xE467: 0x92D1, //CJK UNIFIED IDEOGRAPH
+ 0xE468: 0x92D2, //CJK UNIFIED IDEOGRAPH
+ 0xE469: 0x92D3, //CJK UNIFIED IDEOGRAPH
+ 0xE46A: 0x92D4, //CJK UNIFIED IDEOGRAPH
+ 0xE46B: 0x92D5, //CJK UNIFIED IDEOGRAPH
+ 0xE46C: 0x92D6, //CJK UNIFIED IDEOGRAPH
+ 0xE46D: 0x92D7, //CJK UNIFIED IDEOGRAPH
+ 0xE46E: 0x92D8, //CJK UNIFIED IDEOGRAPH
+ 0xE46F: 0x92D9, //CJK UNIFIED IDEOGRAPH
+ 0xE470: 0x92DA, //CJK UNIFIED IDEOGRAPH
+ 0xE471: 0x92DB, //CJK UNIFIED IDEOGRAPH
+ 0xE472: 0x92DC, //CJK UNIFIED IDEOGRAPH
+ 0xE473: 0x92DD, //CJK UNIFIED IDEOGRAPH
+ 0xE474: 0x92DE, //CJK UNIFIED IDEOGRAPH
+ 0xE475: 0x92DF, //CJK UNIFIED IDEOGRAPH
+ 0xE476: 0x92E0, //CJK UNIFIED IDEOGRAPH
+ 0xE477: 0x92E1, //CJK UNIFIED IDEOGRAPH
+ 0xE478: 0x92E2, //CJK UNIFIED IDEOGRAPH
+ 0xE479: 0x92E3, //CJK UNIFIED IDEOGRAPH
+ 0xE47A: 0x92E4, //CJK UNIFIED IDEOGRAPH
+ 0xE47B: 0x92E5, //CJK UNIFIED IDEOGRAPH
+ 0xE47C: 0x92E6, //CJK UNIFIED IDEOGRAPH
+ 0xE47D: 0x92E7, //CJK UNIFIED IDEOGRAPH
+ 0xE47E: 0x92E8, //CJK UNIFIED IDEOGRAPH
+ 0xE480: 0x92E9, //CJK UNIFIED IDEOGRAPH
+ 0xE481: 0x92EA, //CJK UNIFIED IDEOGRAPH
+ 0xE482: 0x92EB, //CJK UNIFIED IDEOGRAPH
+ 0xE483: 0x92EC, //CJK UNIFIED IDEOGRAPH
+ 0xE484: 0x92ED, //CJK UNIFIED IDEOGRAPH
+ 0xE485: 0x92EE, //CJK UNIFIED IDEOGRAPH
+ 0xE486: 0x92EF, //CJK UNIFIED IDEOGRAPH
+ 0xE487: 0x92F0, //CJK UNIFIED IDEOGRAPH
+ 0xE488: 0x92F1, //CJK UNIFIED IDEOGRAPH
+ 0xE489: 0x92F2, //CJK UNIFIED IDEOGRAPH
+ 0xE48A: 0x92F3, //CJK UNIFIED IDEOGRAPH
+ 0xE48B: 0x92F4, //CJK UNIFIED IDEOGRAPH
+ 0xE48C: 0x92F5, //CJK UNIFIED IDEOGRAPH
+ 0xE48D: 0x92F6, //CJK UNIFIED IDEOGRAPH
+ 0xE48E: 0x92F7, //CJK UNIFIED IDEOGRAPH
+ 0xE48F: 0x92F8, //CJK UNIFIED IDEOGRAPH
+ 0xE490: 0x92F9, //CJK UNIFIED IDEOGRAPH
+ 0xE491: 0x92FA, //CJK UNIFIED IDEOGRAPH
+ 0xE492: 0x92FB, //CJK UNIFIED IDEOGRAPH
+ 0xE493: 0x92FC, //CJK UNIFIED IDEOGRAPH
+ 0xE494: 0x92FD, //CJK UNIFIED IDEOGRAPH
+ 0xE495: 0x92FE, //CJK UNIFIED IDEOGRAPH
+ 0xE496: 0x92FF, //CJK UNIFIED IDEOGRAPH
+ 0xE497: 0x9300, //CJK UNIFIED IDEOGRAPH
+ 0xE498: 0x9301, //CJK UNIFIED IDEOGRAPH
+ 0xE499: 0x9302, //CJK UNIFIED IDEOGRAPH
+ 0xE49A: 0x9303, //CJK UNIFIED IDEOGRAPH
+ 0xE49B: 0x9304, //CJK UNIFIED IDEOGRAPH
+ 0xE49C: 0x9305, //CJK UNIFIED IDEOGRAPH
+ 0xE49D: 0x9306, //CJK UNIFIED IDEOGRAPH
+ 0xE49E: 0x9307, //CJK UNIFIED IDEOGRAPH
+ 0xE49F: 0x9308, //CJK UNIFIED IDEOGRAPH
+ 0xE4A0: 0x9309, //CJK UNIFIED IDEOGRAPH
+ 0xE4A1: 0x6D39, //CJK UNIFIED IDEOGRAPH
+ 0xE4A2: 0x6D27, //CJK UNIFIED IDEOGRAPH
+ 0xE4A3: 0x6D0C, //CJK UNIFIED IDEOGRAPH
+ 0xE4A4: 0x6D43, //CJK UNIFIED IDEOGRAPH
+ 0xE4A5: 0x6D48, //CJK UNIFIED IDEOGRAPH
+ 0xE4A6: 0x6D07, //CJK UNIFIED IDEOGRAPH
+ 0xE4A7: 0x6D04, //CJK UNIFIED IDEOGRAPH
+ 0xE4A8: 0x6D19, //CJK UNIFIED IDEOGRAPH
+ 0xE4A9: 0x6D0E, //CJK UNIFIED IDEOGRAPH
+ 0xE4AA: 0x6D2B, //CJK UNIFIED IDEOGRAPH
+ 0xE4AB: 0x6D4D, //CJK UNIFIED IDEOGRAPH
+ 0xE4AC: 0x6D2E, //CJK UNIFIED IDEOGRAPH
+ 0xE4AD: 0x6D35, //CJK UNIFIED IDEOGRAPH
+ 0xE4AE: 0x6D1A, //CJK UNIFIED IDEOGRAPH
+ 0xE4AF: 0x6D4F, //CJK UNIFIED IDEOGRAPH
+ 0xE4B0: 0x6D52, //CJK UNIFIED IDEOGRAPH
+ 0xE4B1: 0x6D54, //CJK UNIFIED IDEOGRAPH
+ 0xE4B2: 0x6D33, //CJK UNIFIED IDEOGRAPH
+ 0xE4B3: 0x6D91, //CJK UNIFIED IDEOGRAPH
+ 0xE4B4: 0x6D6F, //CJK UNIFIED IDEOGRAPH
+ 0xE4B5: 0x6D9E, //CJK UNIFIED IDEOGRAPH
+ 0xE4B6: 0x6DA0, //CJK UNIFIED IDEOGRAPH
+ 0xE4B7: 0x6D5E, //CJK UNIFIED IDEOGRAPH
+ 0xE4B8: 0x6D93, //CJK UNIFIED IDEOGRAPH
+ 0xE4B9: 0x6D94, //CJK UNIFIED IDEOGRAPH
+ 0xE4BA: 0x6D5C, //CJK UNIFIED IDEOGRAPH
+ 0xE4BB: 0x6D60, //CJK UNIFIED IDEOGRAPH
+ 0xE4BC: 0x6D7C, //CJK UNIFIED IDEOGRAPH
+ 0xE4BD: 0x6D63, //CJK UNIFIED IDEOGRAPH
+ 0xE4BE: 0x6E1A, //CJK UNIFIED IDEOGRAPH
+ 0xE4BF: 0x6DC7, //CJK UNIFIED IDEOGRAPH
+ 0xE4C0: 0x6DC5, //CJK UNIFIED IDEOGRAPH
+ 0xE4C1: 0x6DDE, //CJK UNIFIED IDEOGRAPH
+ 0xE4C2: 0x6E0E, //CJK UNIFIED IDEOGRAPH
+ 0xE4C3: 0x6DBF, //CJK UNIFIED IDEOGRAPH
+ 0xE4C4: 0x6DE0, //CJK UNIFIED IDEOGRAPH
+ 0xE4C5: 0x6E11, //CJK UNIFIED IDEOGRAPH
+ 0xE4C6: 0x6DE6, //CJK UNIFIED IDEOGRAPH
+ 0xE4C7: 0x6DDD, //CJK UNIFIED IDEOGRAPH
+ 0xE4C8: 0x6DD9, //CJK UNIFIED IDEOGRAPH
+ 0xE4C9: 0x6E16, //CJK UNIFIED IDEOGRAPH
+ 0xE4CA: 0x6DAB, //CJK UNIFIED IDEOGRAPH
+ 0xE4CB: 0x6E0C, //CJK UNIFIED IDEOGRAPH
+ 0xE4CC: 0x6DAE, //CJK UNIFIED IDEOGRAPH
+ 0xE4CD: 0x6E2B, //CJK UNIFIED IDEOGRAPH
+ 0xE4CE: 0x6E6E, //CJK UNIFIED IDEOGRAPH
+ 0xE4CF: 0x6E4E, //CJK UNIFIED IDEOGRAPH
+ 0xE4D0: 0x6E6B, //CJK UNIFIED IDEOGRAPH
+ 0xE4D1: 0x6EB2, //CJK UNIFIED IDEOGRAPH
+ 0xE4D2: 0x6E5F, //CJK UNIFIED IDEOGRAPH
+ 0xE4D3: 0x6E86, //CJK UNIFIED IDEOGRAPH
+ 0xE4D4: 0x6E53, //CJK UNIFIED IDEOGRAPH
+ 0xE4D5: 0x6E54, //CJK UNIFIED IDEOGRAPH
+ 0xE4D6: 0x6E32, //CJK UNIFIED IDEOGRAPH
+ 0xE4D7: 0x6E25, //CJK UNIFIED IDEOGRAPH
+ 0xE4D8: 0x6E44, //CJK UNIFIED IDEOGRAPH
+ 0xE4D9: 0x6EDF, //CJK UNIFIED IDEOGRAPH
+ 0xE4DA: 0x6EB1, //CJK UNIFIED IDEOGRAPH
+ 0xE4DB: 0x6E98, //CJK UNIFIED IDEOGRAPH
+ 0xE4DC: 0x6EE0, //CJK UNIFIED IDEOGRAPH
+ 0xE4DD: 0x6F2D, //CJK UNIFIED IDEOGRAPH
+ 0xE4DE: 0x6EE2, //CJK UNIFIED IDEOGRAPH
+ 0xE4DF: 0x6EA5, //CJK UNIFIED IDEOGRAPH
+ 0xE4E0: 0x6EA7, //CJK UNIFIED IDEOGRAPH
+ 0xE4E1: 0x6EBD, //CJK UNIFIED IDEOGRAPH
+ 0xE4E2: 0x6EBB, //CJK UNIFIED IDEOGRAPH
+ 0xE4E3: 0x6EB7, //CJK UNIFIED IDEOGRAPH
+ 0xE4E4: 0x6ED7, //CJK UNIFIED IDEOGRAPH
+ 0xE4E5: 0x6EB4, //CJK UNIFIED IDEOGRAPH
+ 0xE4E6: 0x6ECF, //CJK UNIFIED IDEOGRAPH
+ 0xE4E7: 0x6E8F, //CJK UNIFIED IDEOGRAPH
+ 0xE4E8: 0x6EC2, //CJK UNIFIED IDEOGRAPH
+ 0xE4E9: 0x6E9F, //CJK UNIFIED IDEOGRAPH
+ 0xE4EA: 0x6F62, //CJK UNIFIED IDEOGRAPH
+ 0xE4EB: 0x6F46, //CJK UNIFIED IDEOGRAPH
+ 0xE4EC: 0x6F47, //CJK UNIFIED IDEOGRAPH
+ 0xE4ED: 0x6F24, //CJK UNIFIED IDEOGRAPH
+ 0xE4EE: 0x6F15, //CJK UNIFIED IDEOGRAPH
+ 0xE4EF: 0x6EF9, //CJK UNIFIED IDEOGRAPH
+ 0xE4F0: 0x6F2F, //CJK UNIFIED IDEOGRAPH
+ 0xE4F1: 0x6F36, //CJK UNIFIED IDEOGRAPH
+ 0xE4F2: 0x6F4B, //CJK UNIFIED IDEOGRAPH
+ 0xE4F3: 0x6F74, //CJK UNIFIED IDEOGRAPH
+ 0xE4F4: 0x6F2A, //CJK UNIFIED IDEOGRAPH
+ 0xE4F5: 0x6F09, //CJK UNIFIED IDEOGRAPH
+ 0xE4F6: 0x6F29, //CJK UNIFIED IDEOGRAPH
+ 0xE4F7: 0x6F89, //CJK UNIFIED IDEOGRAPH
+ 0xE4F8: 0x6F8D, //CJK UNIFIED IDEOGRAPH
+ 0xE4F9: 0x6F8C, //CJK UNIFIED IDEOGRAPH
+ 0xE4FA: 0x6F78, //CJK UNIFIED IDEOGRAPH
+ 0xE4FB: 0x6F72, //CJK UNIFIED IDEOGRAPH
+ 0xE4FC: 0x6F7C, //CJK UNIFIED IDEOGRAPH
+ 0xE4FD: 0x6F7A, //CJK UNIFIED IDEOGRAPH
+ 0xE4FE: 0x6FD1, //CJK UNIFIED IDEOGRAPH
+ 0xE540: 0x930A, //CJK UNIFIED IDEOGRAPH
+ 0xE541: 0x930B, //CJK UNIFIED IDEOGRAPH
+ 0xE542: 0x930C, //CJK UNIFIED IDEOGRAPH
+ 0xE543: 0x930D, //CJK UNIFIED IDEOGRAPH
+ 0xE544: 0x930E, //CJK UNIFIED IDEOGRAPH
+ 0xE545: 0x930F, //CJK UNIFIED IDEOGRAPH
+ 0xE546: 0x9310, //CJK UNIFIED IDEOGRAPH
+ 0xE547: 0x9311, //CJK UNIFIED IDEOGRAPH
+ 0xE548: 0x9312, //CJK UNIFIED IDEOGRAPH
+ 0xE549: 0x9313, //CJK UNIFIED IDEOGRAPH
+ 0xE54A: 0x9314, //CJK UNIFIED IDEOGRAPH
+ 0xE54B: 0x9315, //CJK UNIFIED IDEOGRAPH
+ 0xE54C: 0x9316, //CJK UNIFIED IDEOGRAPH
+ 0xE54D: 0x9317, //CJK UNIFIED IDEOGRAPH
+ 0xE54E: 0x9318, //CJK UNIFIED IDEOGRAPH
+ 0xE54F: 0x9319, //CJK UNIFIED IDEOGRAPH
+ 0xE550: 0x931A, //CJK UNIFIED IDEOGRAPH
+ 0xE551: 0x931B, //CJK UNIFIED IDEOGRAPH
+ 0xE552: 0x931C, //CJK UNIFIED IDEOGRAPH
+ 0xE553: 0x931D, //CJK UNIFIED IDEOGRAPH
+ 0xE554: 0x931E, //CJK UNIFIED IDEOGRAPH
+ 0xE555: 0x931F, //CJK UNIFIED IDEOGRAPH
+ 0xE556: 0x9320, //CJK UNIFIED IDEOGRAPH
+ 0xE557: 0x9321, //CJK UNIFIED IDEOGRAPH
+ 0xE558: 0x9322, //CJK UNIFIED IDEOGRAPH
+ 0xE559: 0x9323, //CJK UNIFIED IDEOGRAPH
+ 0xE55A: 0x9324, //CJK UNIFIED IDEOGRAPH
+ 0xE55B: 0x9325, //CJK UNIFIED IDEOGRAPH
+ 0xE55C: 0x9326, //CJK UNIFIED IDEOGRAPH
+ 0xE55D: 0x9327, //CJK UNIFIED IDEOGRAPH
+ 0xE55E: 0x9328, //CJK UNIFIED IDEOGRAPH
+ 0xE55F: 0x9329, //CJK UNIFIED IDEOGRAPH
+ 0xE560: 0x932A, //CJK UNIFIED IDEOGRAPH
+ 0xE561: 0x932B, //CJK UNIFIED IDEOGRAPH
+ 0xE562: 0x932C, //CJK UNIFIED IDEOGRAPH
+ 0xE563: 0x932D, //CJK UNIFIED IDEOGRAPH
+ 0xE564: 0x932E, //CJK UNIFIED IDEOGRAPH
+ 0xE565: 0x932F, //CJK UNIFIED IDEOGRAPH
+ 0xE566: 0x9330, //CJK UNIFIED IDEOGRAPH
+ 0xE567: 0x9331, //CJK UNIFIED IDEOGRAPH
+ 0xE568: 0x9332, //CJK UNIFIED IDEOGRAPH
+ 0xE569: 0x9333, //CJK UNIFIED IDEOGRAPH
+ 0xE56A: 0x9334, //CJK UNIFIED IDEOGRAPH
+ 0xE56B: 0x9335, //CJK UNIFIED IDEOGRAPH
+ 0xE56C: 0x9336, //CJK UNIFIED IDEOGRAPH
+ 0xE56D: 0x9337, //CJK UNIFIED IDEOGRAPH
+ 0xE56E: 0x9338, //CJK UNIFIED IDEOGRAPH
+ 0xE56F: 0x9339, //CJK UNIFIED IDEOGRAPH
+ 0xE570: 0x933A, //CJK UNIFIED IDEOGRAPH
+ 0xE571: 0x933B, //CJK UNIFIED IDEOGRAPH
+ 0xE572: 0x933C, //CJK UNIFIED IDEOGRAPH
+ 0xE573: 0x933D, //CJK UNIFIED IDEOGRAPH
+ 0xE574: 0x933F, //CJK UNIFIED IDEOGRAPH
+ 0xE575: 0x9340, //CJK UNIFIED IDEOGRAPH
+ 0xE576: 0x9341, //CJK UNIFIED IDEOGRAPH
+ 0xE577: 0x9342, //CJK UNIFIED IDEOGRAPH
+ 0xE578: 0x9343, //CJK UNIFIED IDEOGRAPH
+ 0xE579: 0x9344, //CJK UNIFIED IDEOGRAPH
+ 0xE57A: 0x9345, //CJK UNIFIED IDEOGRAPH
+ 0xE57B: 0x9346, //CJK UNIFIED IDEOGRAPH
+ 0xE57C: 0x9347, //CJK UNIFIED IDEOGRAPH
+ 0xE57D: 0x9348, //CJK UNIFIED IDEOGRAPH
+ 0xE57E: 0x9349, //CJK UNIFIED IDEOGRAPH
+ 0xE580: 0x934A, //CJK UNIFIED IDEOGRAPH
+ 0xE581: 0x934B, //CJK UNIFIED IDEOGRAPH
+ 0xE582: 0x934C, //CJK UNIFIED IDEOGRAPH
+ 0xE583: 0x934D, //CJK UNIFIED IDEOGRAPH
+ 0xE584: 0x934E, //CJK UNIFIED IDEOGRAPH
+ 0xE585: 0x934F, //CJK UNIFIED IDEOGRAPH
+ 0xE586: 0x9350, //CJK UNIFIED IDEOGRAPH
+ 0xE587: 0x9351, //CJK UNIFIED IDEOGRAPH
+ 0xE588: 0x9352, //CJK UNIFIED IDEOGRAPH
+ 0xE589: 0x9353, //CJK UNIFIED IDEOGRAPH
+ 0xE58A: 0x9354, //CJK UNIFIED IDEOGRAPH
+ 0xE58B: 0x9355, //CJK UNIFIED IDEOGRAPH
+ 0xE58C: 0x9356, //CJK UNIFIED IDEOGRAPH
+ 0xE58D: 0x9357, //CJK UNIFIED IDEOGRAPH
+ 0xE58E: 0x9358, //CJK UNIFIED IDEOGRAPH
+ 0xE58F: 0x9359, //CJK UNIFIED IDEOGRAPH
+ 0xE590: 0x935A, //CJK UNIFIED IDEOGRAPH
+ 0xE591: 0x935B, //CJK UNIFIED IDEOGRAPH
+ 0xE592: 0x935C, //CJK UNIFIED IDEOGRAPH
+ 0xE593: 0x935D, //CJK UNIFIED IDEOGRAPH
+ 0xE594: 0x935E, //CJK UNIFIED IDEOGRAPH
+ 0xE595: 0x935F, //CJK UNIFIED IDEOGRAPH
+ 0xE596: 0x9360, //CJK UNIFIED IDEOGRAPH
+ 0xE597: 0x9361, //CJK UNIFIED IDEOGRAPH
+ 0xE598: 0x9362, //CJK UNIFIED IDEOGRAPH
+ 0xE599: 0x9363, //CJK UNIFIED IDEOGRAPH
+ 0xE59A: 0x9364, //CJK UNIFIED IDEOGRAPH
+ 0xE59B: 0x9365, //CJK UNIFIED IDEOGRAPH
+ 0xE59C: 0x9366, //CJK UNIFIED IDEOGRAPH
+ 0xE59D: 0x9367, //CJK UNIFIED IDEOGRAPH
+ 0xE59E: 0x9368, //CJK UNIFIED IDEOGRAPH
+ 0xE59F: 0x9369, //CJK UNIFIED IDEOGRAPH
+ 0xE5A0: 0x936B, //CJK UNIFIED IDEOGRAPH
+ 0xE5A1: 0x6FC9, //CJK UNIFIED IDEOGRAPH
+ 0xE5A2: 0x6FA7, //CJK UNIFIED IDEOGRAPH
+ 0xE5A3: 0x6FB9, //CJK UNIFIED IDEOGRAPH
+ 0xE5A4: 0x6FB6, //CJK UNIFIED IDEOGRAPH
+ 0xE5A5: 0x6FC2, //CJK UNIFIED IDEOGRAPH
+ 0xE5A6: 0x6FE1, //CJK UNIFIED IDEOGRAPH
+ 0xE5A7: 0x6FEE, //CJK UNIFIED IDEOGRAPH
+ 0xE5A8: 0x6FDE, //CJK UNIFIED IDEOGRAPH
+ 0xE5A9: 0x6FE0, //CJK UNIFIED IDEOGRAPH
+ 0xE5AA: 0x6FEF, //CJK UNIFIED IDEOGRAPH
+ 0xE5AB: 0x701A, //CJK UNIFIED IDEOGRAPH
+ 0xE5AC: 0x7023, //CJK UNIFIED IDEOGRAPH
+ 0xE5AD: 0x701B, //CJK UNIFIED IDEOGRAPH
+ 0xE5AE: 0x7039, //CJK UNIFIED IDEOGRAPH
+ 0xE5AF: 0x7035, //CJK UNIFIED IDEOGRAPH
+ 0xE5B0: 0x704F, //CJK UNIFIED IDEOGRAPH
+ 0xE5B1: 0x705E, //CJK UNIFIED IDEOGRAPH
+ 0xE5B2: 0x5B80, //CJK UNIFIED IDEOGRAPH
+ 0xE5B3: 0x5B84, //CJK UNIFIED IDEOGRAPH
+ 0xE5B4: 0x5B95, //CJK UNIFIED IDEOGRAPH
+ 0xE5B5: 0x5B93, //CJK UNIFIED IDEOGRAPH
+ 0xE5B6: 0x5BA5, //CJK UNIFIED IDEOGRAPH
+ 0xE5B7: 0x5BB8, //CJK UNIFIED IDEOGRAPH
+ 0xE5B8: 0x752F, //CJK UNIFIED IDEOGRAPH
+ 0xE5B9: 0x9A9E, //CJK UNIFIED IDEOGRAPH
+ 0xE5BA: 0x6434, //CJK UNIFIED IDEOGRAPH
+ 0xE5BB: 0x5BE4, //CJK UNIFIED IDEOGRAPH
+ 0xE5BC: 0x5BEE, //CJK UNIFIED IDEOGRAPH
+ 0xE5BD: 0x8930, //CJK UNIFIED IDEOGRAPH
+ 0xE5BE: 0x5BF0, //CJK UNIFIED IDEOGRAPH
+ 0xE5BF: 0x8E47, //CJK UNIFIED IDEOGRAPH
+ 0xE5C0: 0x8B07, //CJK UNIFIED IDEOGRAPH
+ 0xE5C1: 0x8FB6, //CJK UNIFIED IDEOGRAPH
+ 0xE5C2: 0x8FD3, //CJK UNIFIED IDEOGRAPH
+ 0xE5C3: 0x8FD5, //CJK UNIFIED IDEOGRAPH
+ 0xE5C4: 0x8FE5, //CJK UNIFIED IDEOGRAPH
+ 0xE5C5: 0x8FEE, //CJK UNIFIED IDEOGRAPH
+ 0xE5C6: 0x8FE4, //CJK UNIFIED IDEOGRAPH
+ 0xE5C7: 0x8FE9, //CJK UNIFIED IDEOGRAPH
+ 0xE5C8: 0x8FE6, //CJK UNIFIED IDEOGRAPH
+ 0xE5C9: 0x8FF3, //CJK UNIFIED IDEOGRAPH
+ 0xE5CA: 0x8FE8, //CJK UNIFIED IDEOGRAPH
+ 0xE5CB: 0x9005, //CJK UNIFIED IDEOGRAPH
+ 0xE5CC: 0x9004, //CJK UNIFIED IDEOGRAPH
+ 0xE5CD: 0x900B, //CJK UNIFIED IDEOGRAPH
+ 0xE5CE: 0x9026, //CJK UNIFIED IDEOGRAPH
+ 0xE5CF: 0x9011, //CJK UNIFIED IDEOGRAPH
+ 0xE5D0: 0x900D, //CJK UNIFIED IDEOGRAPH
+ 0xE5D1: 0x9016, //CJK UNIFIED IDEOGRAPH
+ 0xE5D2: 0x9021, //CJK UNIFIED IDEOGRAPH
+ 0xE5D3: 0x9035, //CJK UNIFIED IDEOGRAPH
+ 0xE5D4: 0x9036, //CJK UNIFIED IDEOGRAPH
+ 0xE5D5: 0x902D, //CJK UNIFIED IDEOGRAPH
+ 0xE5D6: 0x902F, //CJK UNIFIED IDEOGRAPH
+ 0xE5D7: 0x9044, //CJK UNIFIED IDEOGRAPH
+ 0xE5D8: 0x9051, //CJK UNIFIED IDEOGRAPH
+ 0xE5D9: 0x9052, //CJK UNIFIED IDEOGRAPH
+ 0xE5DA: 0x9050, //CJK UNIFIED IDEOGRAPH
+ 0xE5DB: 0x9068, //CJK UNIFIED IDEOGRAPH
+ 0xE5DC: 0x9058, //CJK UNIFIED IDEOGRAPH
+ 0xE5DD: 0x9062, //CJK UNIFIED IDEOGRAPH
+ 0xE5DE: 0x905B, //CJK UNIFIED IDEOGRAPH
+ 0xE5DF: 0x66B9, //CJK UNIFIED IDEOGRAPH
+ 0xE5E0: 0x9074, //CJK UNIFIED IDEOGRAPH
+ 0xE5E1: 0x907D, //CJK UNIFIED IDEOGRAPH
+ 0xE5E2: 0x9082, //CJK UNIFIED IDEOGRAPH
+ 0xE5E3: 0x9088, //CJK UNIFIED IDEOGRAPH
+ 0xE5E4: 0x9083, //CJK UNIFIED IDEOGRAPH
+ 0xE5E5: 0x908B, //CJK UNIFIED IDEOGRAPH
+ 0xE5E6: 0x5F50, //CJK UNIFIED IDEOGRAPH
+ 0xE5E7: 0x5F57, //CJK UNIFIED IDEOGRAPH
+ 0xE5E8: 0x5F56, //CJK UNIFIED IDEOGRAPH
+ 0xE5E9: 0x5F58, //CJK UNIFIED IDEOGRAPH
+ 0xE5EA: 0x5C3B, //CJK UNIFIED IDEOGRAPH
+ 0xE5EB: 0x54AB, //CJK UNIFIED IDEOGRAPH
+ 0xE5EC: 0x5C50, //CJK UNIFIED IDEOGRAPH
+ 0xE5ED: 0x5C59, //CJK UNIFIED IDEOGRAPH
+ 0xE5EE: 0x5B71, //CJK UNIFIED IDEOGRAPH
+ 0xE5EF: 0x5C63, //CJK UNIFIED IDEOGRAPH
+ 0xE5F0: 0x5C66, //CJK UNIFIED IDEOGRAPH
+ 0xE5F1: 0x7FBC, //CJK UNIFIED IDEOGRAPH
+ 0xE5F2: 0x5F2A, //CJK UNIFIED IDEOGRAPH
+ 0xE5F3: 0x5F29, //CJK UNIFIED IDEOGRAPH
+ 0xE5F4: 0x5F2D, //CJK UNIFIED IDEOGRAPH
+ 0xE5F5: 0x8274, //CJK UNIFIED IDEOGRAPH
+ 0xE5F6: 0x5F3C, //CJK UNIFIED IDEOGRAPH
+ 0xE5F7: 0x9B3B, //CJK UNIFIED IDEOGRAPH
+ 0xE5F8: 0x5C6E, //CJK UNIFIED IDEOGRAPH
+ 0xE5F9: 0x5981, //CJK UNIFIED IDEOGRAPH
+ 0xE5FA: 0x5983, //CJK UNIFIED IDEOGRAPH
+ 0xE5FB: 0x598D, //CJK UNIFIED IDEOGRAPH
+ 0xE5FC: 0x59A9, //CJK UNIFIED IDEOGRAPH
+ 0xE5FD: 0x59AA, //CJK UNIFIED IDEOGRAPH
+ 0xE5FE: 0x59A3, //CJK UNIFIED IDEOGRAPH
+ 0xE640: 0x936C, //CJK UNIFIED IDEOGRAPH
+ 0xE641: 0x936D, //CJK UNIFIED IDEOGRAPH
+ 0xE642: 0x936E, //CJK UNIFIED IDEOGRAPH
+ 0xE643: 0x936F, //CJK UNIFIED IDEOGRAPH
+ 0xE644: 0x9370, //CJK UNIFIED IDEOGRAPH
+ 0xE645: 0x9371, //CJK UNIFIED IDEOGRAPH
+ 0xE646: 0x9372, //CJK UNIFIED IDEOGRAPH
+ 0xE647: 0x9373, //CJK UNIFIED IDEOGRAPH
+ 0xE648: 0x9374, //CJK UNIFIED IDEOGRAPH
+ 0xE649: 0x9375, //CJK UNIFIED IDEOGRAPH
+ 0xE64A: 0x9376, //CJK UNIFIED IDEOGRAPH
+ 0xE64B: 0x9377, //CJK UNIFIED IDEOGRAPH
+ 0xE64C: 0x9378, //CJK UNIFIED IDEOGRAPH
+ 0xE64D: 0x9379, //CJK UNIFIED IDEOGRAPH
+ 0xE64E: 0x937A, //CJK UNIFIED IDEOGRAPH
+ 0xE64F: 0x937B, //CJK UNIFIED IDEOGRAPH
+ 0xE650: 0x937C, //CJK UNIFIED IDEOGRAPH
+ 0xE651: 0x937D, //CJK UNIFIED IDEOGRAPH
+ 0xE652: 0x937E, //CJK UNIFIED IDEOGRAPH
+ 0xE653: 0x937F, //CJK UNIFIED IDEOGRAPH
+ 0xE654: 0x9380, //CJK UNIFIED IDEOGRAPH
+ 0xE655: 0x9381, //CJK UNIFIED IDEOGRAPH
+ 0xE656: 0x9382, //CJK UNIFIED IDEOGRAPH
+ 0xE657: 0x9383, //CJK UNIFIED IDEOGRAPH
+ 0xE658: 0x9384, //CJK UNIFIED IDEOGRAPH
+ 0xE659: 0x9385, //CJK UNIFIED IDEOGRAPH
+ 0xE65A: 0x9386, //CJK UNIFIED IDEOGRAPH
+ 0xE65B: 0x9387, //CJK UNIFIED IDEOGRAPH
+ 0xE65C: 0x9388, //CJK UNIFIED IDEOGRAPH
+ 0xE65D: 0x9389, //CJK UNIFIED IDEOGRAPH
+ 0xE65E: 0x938A, //CJK UNIFIED IDEOGRAPH
+ 0xE65F: 0x938B, //CJK UNIFIED IDEOGRAPH
+ 0xE660: 0x938C, //CJK UNIFIED IDEOGRAPH
+ 0xE661: 0x938D, //CJK UNIFIED IDEOGRAPH
+ 0xE662: 0x938E, //CJK UNIFIED IDEOGRAPH
+ 0xE663: 0x9390, //CJK UNIFIED IDEOGRAPH
+ 0xE664: 0x9391, //CJK UNIFIED IDEOGRAPH
+ 0xE665: 0x9392, //CJK UNIFIED IDEOGRAPH
+ 0xE666: 0x9393, //CJK UNIFIED IDEOGRAPH
+ 0xE667: 0x9394, //CJK UNIFIED IDEOGRAPH
+ 0xE668: 0x9395, //CJK UNIFIED IDEOGRAPH
+ 0xE669: 0x9396, //CJK UNIFIED IDEOGRAPH
+ 0xE66A: 0x9397, //CJK UNIFIED IDEOGRAPH
+ 0xE66B: 0x9398, //CJK UNIFIED IDEOGRAPH
+ 0xE66C: 0x9399, //CJK UNIFIED IDEOGRAPH
+ 0xE66D: 0x939A, //CJK UNIFIED IDEOGRAPH
+ 0xE66E: 0x939B, //CJK UNIFIED IDEOGRAPH
+ 0xE66F: 0x939C, //CJK UNIFIED IDEOGRAPH
+ 0xE670: 0x939D, //CJK UNIFIED IDEOGRAPH
+ 0xE671: 0x939E, //CJK UNIFIED IDEOGRAPH
+ 0xE672: 0x939F, //CJK UNIFIED IDEOGRAPH
+ 0xE673: 0x93A0, //CJK UNIFIED IDEOGRAPH
+ 0xE674: 0x93A1, //CJK UNIFIED IDEOGRAPH
+ 0xE675: 0x93A2, //CJK UNIFIED IDEOGRAPH
+ 0xE676: 0x93A3, //CJK UNIFIED IDEOGRAPH
+ 0xE677: 0x93A4, //CJK UNIFIED IDEOGRAPH
+ 0xE678: 0x93A5, //CJK UNIFIED IDEOGRAPH
+ 0xE679: 0x93A6, //CJK UNIFIED IDEOGRAPH
+ 0xE67A: 0x93A7, //CJK UNIFIED IDEOGRAPH
+ 0xE67B: 0x93A8, //CJK UNIFIED IDEOGRAPH
+ 0xE67C: 0x93A9, //CJK UNIFIED IDEOGRAPH
+ 0xE67D: 0x93AA, //CJK UNIFIED IDEOGRAPH
+ 0xE67E: 0x93AB, //CJK UNIFIED IDEOGRAPH
+ 0xE680: 0x93AC, //CJK UNIFIED IDEOGRAPH
+ 0xE681: 0x93AD, //CJK UNIFIED IDEOGRAPH
+ 0xE682: 0x93AE, //CJK UNIFIED IDEOGRAPH
+ 0xE683: 0x93AF, //CJK UNIFIED IDEOGRAPH
+ 0xE684: 0x93B0, //CJK UNIFIED IDEOGRAPH
+ 0xE685: 0x93B1, //CJK UNIFIED IDEOGRAPH
+ 0xE686: 0x93B2, //CJK UNIFIED IDEOGRAPH
+ 0xE687: 0x93B3, //CJK UNIFIED IDEOGRAPH
+ 0xE688: 0x93B4, //CJK UNIFIED IDEOGRAPH
+ 0xE689: 0x93B5, //CJK UNIFIED IDEOGRAPH
+ 0xE68A: 0x93B6, //CJK UNIFIED IDEOGRAPH
+ 0xE68B: 0x93B7, //CJK UNIFIED IDEOGRAPH
+ 0xE68C: 0x93B8, //CJK UNIFIED IDEOGRAPH
+ 0xE68D: 0x93B9, //CJK UNIFIED IDEOGRAPH
+ 0xE68E: 0x93BA, //CJK UNIFIED IDEOGRAPH
+ 0xE68F: 0x93BB, //CJK UNIFIED IDEOGRAPH
+ 0xE690: 0x93BC, //CJK UNIFIED IDEOGRAPH
+ 0xE691: 0x93BD, //CJK UNIFIED IDEOGRAPH
+ 0xE692: 0x93BE, //CJK UNIFIED IDEOGRAPH
+ 0xE693: 0x93BF, //CJK UNIFIED IDEOGRAPH
+ 0xE694: 0x93C0, //CJK UNIFIED IDEOGRAPH
+ 0xE695: 0x93C1, //CJK UNIFIED IDEOGRAPH
+ 0xE696: 0x93C2, //CJK UNIFIED IDEOGRAPH
+ 0xE697: 0x93C3, //CJK UNIFIED IDEOGRAPH
+ 0xE698: 0x93C4, //CJK UNIFIED IDEOGRAPH
+ 0xE699: 0x93C5, //CJK UNIFIED IDEOGRAPH
+ 0xE69A: 0x93C6, //CJK UNIFIED IDEOGRAPH
+ 0xE69B: 0x93C7, //CJK UNIFIED IDEOGRAPH
+ 0xE69C: 0x93C8, //CJK UNIFIED IDEOGRAPH
+ 0xE69D: 0x93C9, //CJK UNIFIED IDEOGRAPH
+ 0xE69E: 0x93CB, //CJK UNIFIED IDEOGRAPH
+ 0xE69F: 0x93CC, //CJK UNIFIED IDEOGRAPH
+ 0xE6A0: 0x93CD, //CJK UNIFIED IDEOGRAPH
+ 0xE6A1: 0x5997, //CJK UNIFIED IDEOGRAPH
+ 0xE6A2: 0x59CA, //CJK UNIFIED IDEOGRAPH
+ 0xE6A3: 0x59AB, //CJK UNIFIED IDEOGRAPH
+ 0xE6A4: 0x599E, //CJK UNIFIED IDEOGRAPH
+ 0xE6A5: 0x59A4, //CJK UNIFIED IDEOGRAPH
+ 0xE6A6: 0x59D2, //CJK UNIFIED IDEOGRAPH
+ 0xE6A7: 0x59B2, //CJK UNIFIED IDEOGRAPH
+ 0xE6A8: 0x59AF, //CJK UNIFIED IDEOGRAPH
+ 0xE6A9: 0x59D7, //CJK UNIFIED IDEOGRAPH
+ 0xE6AA: 0x59BE, //CJK UNIFIED IDEOGRAPH
+ 0xE6AB: 0x5A05, //CJK UNIFIED IDEOGRAPH
+ 0xE6AC: 0x5A06, //CJK UNIFIED IDEOGRAPH
+ 0xE6AD: 0x59DD, //CJK UNIFIED IDEOGRAPH
+ 0xE6AE: 0x5A08, //CJK UNIFIED IDEOGRAPH
+ 0xE6AF: 0x59E3, //CJK UNIFIED IDEOGRAPH
+ 0xE6B0: 0x59D8, //CJK UNIFIED IDEOGRAPH
+ 0xE6B1: 0x59F9, //CJK UNIFIED IDEOGRAPH
+ 0xE6B2: 0x5A0C, //CJK UNIFIED IDEOGRAPH
+ 0xE6B3: 0x5A09, //CJK UNIFIED IDEOGRAPH
+ 0xE6B4: 0x5A32, //CJK UNIFIED IDEOGRAPH
+ 0xE6B5: 0x5A34, //CJK UNIFIED IDEOGRAPH
+ 0xE6B6: 0x5A11, //CJK UNIFIED IDEOGRAPH
+ 0xE6B7: 0x5A23, //CJK UNIFIED IDEOGRAPH
+ 0xE6B8: 0x5A13, //CJK UNIFIED IDEOGRAPH
+ 0xE6B9: 0x5A40, //CJK UNIFIED IDEOGRAPH
+ 0xE6BA: 0x5A67, //CJK UNIFIED IDEOGRAPH
+ 0xE6BB: 0x5A4A, //CJK UNIFIED IDEOGRAPH
+ 0xE6BC: 0x5A55, //CJK UNIFIED IDEOGRAPH
+ 0xE6BD: 0x5A3C, //CJK UNIFIED IDEOGRAPH
+ 0xE6BE: 0x5A62, //CJK UNIFIED IDEOGRAPH
+ 0xE6BF: 0x5A75, //CJK UNIFIED IDEOGRAPH
+ 0xE6C0: 0x80EC, //CJK UNIFIED IDEOGRAPH
+ 0xE6C1: 0x5AAA, //CJK UNIFIED IDEOGRAPH
+ 0xE6C2: 0x5A9B, //CJK UNIFIED IDEOGRAPH
+ 0xE6C3: 0x5A77, //CJK UNIFIED IDEOGRAPH
+ 0xE6C4: 0x5A7A, //CJK UNIFIED IDEOGRAPH
+ 0xE6C5: 0x5ABE, //CJK UNIFIED IDEOGRAPH
+ 0xE6C6: 0x5AEB, //CJK UNIFIED IDEOGRAPH
+ 0xE6C7: 0x5AB2, //CJK UNIFIED IDEOGRAPH
+ 0xE6C8: 0x5AD2, //CJK UNIFIED IDEOGRAPH
+ 0xE6C9: 0x5AD4, //CJK UNIFIED IDEOGRAPH
+ 0xE6CA: 0x5AB8, //CJK UNIFIED IDEOGRAPH
+ 0xE6CB: 0x5AE0, //CJK UNIFIED IDEOGRAPH
+ 0xE6CC: 0x5AE3, //CJK UNIFIED IDEOGRAPH
+ 0xE6CD: 0x5AF1, //CJK UNIFIED IDEOGRAPH
+ 0xE6CE: 0x5AD6, //CJK UNIFIED IDEOGRAPH
+ 0xE6CF: 0x5AE6, //CJK UNIFIED IDEOGRAPH
+ 0xE6D0: 0x5AD8, //CJK UNIFIED IDEOGRAPH
+ 0xE6D1: 0x5ADC, //CJK UNIFIED IDEOGRAPH
+ 0xE6D2: 0x5B09, //CJK UNIFIED IDEOGRAPH
+ 0xE6D3: 0x5B17, //CJK UNIFIED IDEOGRAPH
+ 0xE6D4: 0x5B16, //CJK UNIFIED IDEOGRAPH
+ 0xE6D5: 0x5B32, //CJK UNIFIED IDEOGRAPH
+ 0xE6D6: 0x5B37, //CJK UNIFIED IDEOGRAPH
+ 0xE6D7: 0x5B40, //CJK UNIFIED IDEOGRAPH
+ 0xE6D8: 0x5C15, //CJK UNIFIED IDEOGRAPH
+ 0xE6D9: 0x5C1C, //CJK UNIFIED IDEOGRAPH
+ 0xE6DA: 0x5B5A, //CJK UNIFIED IDEOGRAPH
+ 0xE6DB: 0x5B65, //CJK UNIFIED IDEOGRAPH
+ 0xE6DC: 0x5B73, //CJK UNIFIED IDEOGRAPH
+ 0xE6DD: 0x5B51, //CJK UNIFIED IDEOGRAPH
+ 0xE6DE: 0x5B53, //CJK UNIFIED IDEOGRAPH
+ 0xE6DF: 0x5B62, //CJK UNIFIED IDEOGRAPH
+ 0xE6E0: 0x9A75, //CJK UNIFIED IDEOGRAPH
+ 0xE6E1: 0x9A77, //CJK UNIFIED IDEOGRAPH
+ 0xE6E2: 0x9A78, //CJK UNIFIED IDEOGRAPH
+ 0xE6E3: 0x9A7A, //CJK UNIFIED IDEOGRAPH
+ 0xE6E4: 0x9A7F, //CJK UNIFIED IDEOGRAPH
+ 0xE6E5: 0x9A7D, //CJK UNIFIED IDEOGRAPH
+ 0xE6E6: 0x9A80, //CJK UNIFIED IDEOGRAPH
+ 0xE6E7: 0x9A81, //CJK UNIFIED IDEOGRAPH
+ 0xE6E8: 0x9A85, //CJK UNIFIED IDEOGRAPH
+ 0xE6E9: 0x9A88, //CJK UNIFIED IDEOGRAPH
+ 0xE6EA: 0x9A8A, //CJK UNIFIED IDEOGRAPH
+ 0xE6EB: 0x9A90, //CJK UNIFIED IDEOGRAPH
+ 0xE6EC: 0x9A92, //CJK UNIFIED IDEOGRAPH
+ 0xE6ED: 0x9A93, //CJK UNIFIED IDEOGRAPH
+ 0xE6EE: 0x9A96, //CJK UNIFIED IDEOGRAPH
+ 0xE6EF: 0x9A98, //CJK UNIFIED IDEOGRAPH
+ 0xE6F0: 0x9A9B, //CJK UNIFIED IDEOGRAPH
+ 0xE6F1: 0x9A9C, //CJK UNIFIED IDEOGRAPH
+ 0xE6F2: 0x9A9D, //CJK UNIFIED IDEOGRAPH
+ 0xE6F3: 0x9A9F, //CJK UNIFIED IDEOGRAPH
+ 0xE6F4: 0x9AA0, //CJK UNIFIED IDEOGRAPH
+ 0xE6F5: 0x9AA2, //CJK UNIFIED IDEOGRAPH
+ 0xE6F6: 0x9AA3, //CJK UNIFIED IDEOGRAPH
+ 0xE6F7: 0x9AA5, //CJK UNIFIED IDEOGRAPH
+ 0xE6F8: 0x9AA7, //CJK UNIFIED IDEOGRAPH
+ 0xE6F9: 0x7E9F, //CJK UNIFIED IDEOGRAPH
+ 0xE6FA: 0x7EA1, //CJK UNIFIED IDEOGRAPH
+ 0xE6FB: 0x7EA3, //CJK UNIFIED IDEOGRAPH
+ 0xE6FC: 0x7EA5, //CJK UNIFIED IDEOGRAPH
+ 0xE6FD: 0x7EA8, //CJK UNIFIED IDEOGRAPH
+ 0xE6FE: 0x7EA9, //CJK UNIFIED IDEOGRAPH
+ 0xE740: 0x93CE, //CJK UNIFIED IDEOGRAPH
+ 0xE741: 0x93CF, //CJK UNIFIED IDEOGRAPH
+ 0xE742: 0x93D0, //CJK UNIFIED IDEOGRAPH
+ 0xE743: 0x93D1, //CJK UNIFIED IDEOGRAPH
+ 0xE744: 0x93D2, //CJK UNIFIED IDEOGRAPH
+ 0xE745: 0x93D3, //CJK UNIFIED IDEOGRAPH
+ 0xE746: 0x93D4, //CJK UNIFIED IDEOGRAPH
+ 0xE747: 0x93D5, //CJK UNIFIED IDEOGRAPH
+ 0xE748: 0x93D7, //CJK UNIFIED IDEOGRAPH
+ 0xE749: 0x93D8, //CJK UNIFIED IDEOGRAPH
+ 0xE74A: 0x93D9, //CJK UNIFIED IDEOGRAPH
+ 0xE74B: 0x93DA, //CJK UNIFIED IDEOGRAPH
+ 0xE74C: 0x93DB, //CJK UNIFIED IDEOGRAPH
+ 0xE74D: 0x93DC, //CJK UNIFIED IDEOGRAPH
+ 0xE74E: 0x93DD, //CJK UNIFIED IDEOGRAPH
+ 0xE74F: 0x93DE, //CJK UNIFIED IDEOGRAPH
+ 0xE750: 0x93DF, //CJK UNIFIED IDEOGRAPH
+ 0xE751: 0x93E0, //CJK UNIFIED IDEOGRAPH
+ 0xE752: 0x93E1, //CJK UNIFIED IDEOGRAPH
+ 0xE753: 0x93E2, //CJK UNIFIED IDEOGRAPH
+ 0xE754: 0x93E3, //CJK UNIFIED IDEOGRAPH
+ 0xE755: 0x93E4, //CJK UNIFIED IDEOGRAPH
+ 0xE756: 0x93E5, //CJK UNIFIED IDEOGRAPH
+ 0xE757: 0x93E6, //CJK UNIFIED IDEOGRAPH
+ 0xE758: 0x93E7, //CJK UNIFIED IDEOGRAPH
+ 0xE759: 0x93E8, //CJK UNIFIED IDEOGRAPH
+ 0xE75A: 0x93E9, //CJK UNIFIED IDEOGRAPH
+ 0xE75B: 0x93EA, //CJK UNIFIED IDEOGRAPH
+ 0xE75C: 0x93EB, //CJK UNIFIED IDEOGRAPH
+ 0xE75D: 0x93EC, //CJK UNIFIED IDEOGRAPH
+ 0xE75E: 0x93ED, //CJK UNIFIED IDEOGRAPH
+ 0xE75F: 0x93EE, //CJK UNIFIED IDEOGRAPH
+ 0xE760: 0x93EF, //CJK UNIFIED IDEOGRAPH
+ 0xE761: 0x93F0, //CJK UNIFIED IDEOGRAPH
+ 0xE762: 0x93F1, //CJK UNIFIED IDEOGRAPH
+ 0xE763: 0x93F2, //CJK UNIFIED IDEOGRAPH
+ 0xE764: 0x93F3, //CJK UNIFIED IDEOGRAPH
+ 0xE765: 0x93F4, //CJK UNIFIED IDEOGRAPH
+ 0xE766: 0x93F5, //CJK UNIFIED IDEOGRAPH
+ 0xE767: 0x93F6, //CJK UNIFIED IDEOGRAPH
+ 0xE768: 0x93F7, //CJK UNIFIED IDEOGRAPH
+ 0xE769: 0x93F8, //CJK UNIFIED IDEOGRAPH
+ 0xE76A: 0x93F9, //CJK UNIFIED IDEOGRAPH
+ 0xE76B: 0x93FA, //CJK UNIFIED IDEOGRAPH
+ 0xE76C: 0x93FB, //CJK UNIFIED IDEOGRAPH
+ 0xE76D: 0x93FC, //CJK UNIFIED IDEOGRAPH
+ 0xE76E: 0x93FD, //CJK UNIFIED IDEOGRAPH
+ 0xE76F: 0x93FE, //CJK UNIFIED IDEOGRAPH
+ 0xE770: 0x93FF, //CJK UNIFIED IDEOGRAPH
+ 0xE771: 0x9400, //CJK UNIFIED IDEOGRAPH
+ 0xE772: 0x9401, //CJK UNIFIED IDEOGRAPH
+ 0xE773: 0x9402, //CJK UNIFIED IDEOGRAPH
+ 0xE774: 0x9403, //CJK UNIFIED IDEOGRAPH
+ 0xE775: 0x9404, //CJK UNIFIED IDEOGRAPH
+ 0xE776: 0x9405, //CJK UNIFIED IDEOGRAPH
+ 0xE777: 0x9406, //CJK UNIFIED IDEOGRAPH
+ 0xE778: 0x9407, //CJK UNIFIED IDEOGRAPH
+ 0xE779: 0x9408, //CJK UNIFIED IDEOGRAPH
+ 0xE77A: 0x9409, //CJK UNIFIED IDEOGRAPH
+ 0xE77B: 0x940A, //CJK UNIFIED IDEOGRAPH
+ 0xE77C: 0x940B, //CJK UNIFIED IDEOGRAPH
+ 0xE77D: 0x940C, //CJK UNIFIED IDEOGRAPH
+ 0xE77E: 0x940D, //CJK UNIFIED IDEOGRAPH
+ 0xE780: 0x940E, //CJK UNIFIED IDEOGRAPH
+ 0xE781: 0x940F, //CJK UNIFIED IDEOGRAPH
+ 0xE782: 0x9410, //CJK UNIFIED IDEOGRAPH
+ 0xE783: 0x9411, //CJK UNIFIED IDEOGRAPH
+ 0xE784: 0x9412, //CJK UNIFIED IDEOGRAPH
+ 0xE785: 0x9413, //CJK UNIFIED IDEOGRAPH
+ 0xE786: 0x9414, //CJK UNIFIED IDEOGRAPH
+ 0xE787: 0x9415, //CJK UNIFIED IDEOGRAPH
+ 0xE788: 0x9416, //CJK UNIFIED IDEOGRAPH
+ 0xE789: 0x9417, //CJK UNIFIED IDEOGRAPH
+ 0xE78A: 0x9418, //CJK UNIFIED IDEOGRAPH
+ 0xE78B: 0x9419, //CJK UNIFIED IDEOGRAPH
+ 0xE78C: 0x941A, //CJK UNIFIED IDEOGRAPH
+ 0xE78D: 0x941B, //CJK UNIFIED IDEOGRAPH
+ 0xE78E: 0x941C, //CJK UNIFIED IDEOGRAPH
+ 0xE78F: 0x941D, //CJK UNIFIED IDEOGRAPH
+ 0xE790: 0x941E, //CJK UNIFIED IDEOGRAPH
+ 0xE791: 0x941F, //CJK UNIFIED IDEOGRAPH
+ 0xE792: 0x9420, //CJK UNIFIED IDEOGRAPH
+ 0xE793: 0x9421, //CJK UNIFIED IDEOGRAPH
+ 0xE794: 0x9422, //CJK UNIFIED IDEOGRAPH
+ 0xE795: 0x9423, //CJK UNIFIED IDEOGRAPH
+ 0xE796: 0x9424, //CJK UNIFIED IDEOGRAPH
+ 0xE797: 0x9425, //CJK UNIFIED IDEOGRAPH
+ 0xE798: 0x9426, //CJK UNIFIED IDEOGRAPH
+ 0xE799: 0x9427, //CJK UNIFIED IDEOGRAPH
+ 0xE79A: 0x9428, //CJK UNIFIED IDEOGRAPH
+ 0xE79B: 0x9429, //CJK UNIFIED IDEOGRAPH
+ 0xE79C: 0x942A, //CJK UNIFIED IDEOGRAPH
+ 0xE79D: 0x942B, //CJK UNIFIED IDEOGRAPH
+ 0xE79E: 0x942C, //CJK UNIFIED IDEOGRAPH
+ 0xE79F: 0x942D, //CJK UNIFIED IDEOGRAPH
+ 0xE7A0: 0x942E, //CJK UNIFIED IDEOGRAPH
+ 0xE7A1: 0x7EAD, //CJK UNIFIED IDEOGRAPH
+ 0xE7A2: 0x7EB0, //CJK UNIFIED IDEOGRAPH
+ 0xE7A3: 0x7EBE, //CJK UNIFIED IDEOGRAPH
+ 0xE7A4: 0x7EC0, //CJK UNIFIED IDEOGRAPH
+ 0xE7A5: 0x7EC1, //CJK UNIFIED IDEOGRAPH
+ 0xE7A6: 0x7EC2, //CJK UNIFIED IDEOGRAPH
+ 0xE7A7: 0x7EC9, //CJK UNIFIED IDEOGRAPH
+ 0xE7A8: 0x7ECB, //CJK UNIFIED IDEOGRAPH
+ 0xE7A9: 0x7ECC, //CJK UNIFIED IDEOGRAPH
+ 0xE7AA: 0x7ED0, //CJK UNIFIED IDEOGRAPH
+ 0xE7AB: 0x7ED4, //CJK UNIFIED IDEOGRAPH
+ 0xE7AC: 0x7ED7, //CJK UNIFIED IDEOGRAPH
+ 0xE7AD: 0x7EDB, //CJK UNIFIED IDEOGRAPH
+ 0xE7AE: 0x7EE0, //CJK UNIFIED IDEOGRAPH
+ 0xE7AF: 0x7EE1, //CJK UNIFIED IDEOGRAPH
+ 0xE7B0: 0x7EE8, //CJK UNIFIED IDEOGRAPH
+ 0xE7B1: 0x7EEB, //CJK UNIFIED IDEOGRAPH
+ 0xE7B2: 0x7EEE, //CJK UNIFIED IDEOGRAPH
+ 0xE7B3: 0x7EEF, //CJK UNIFIED IDEOGRAPH
+ 0xE7B4: 0x7EF1, //CJK UNIFIED IDEOGRAPH
+ 0xE7B5: 0x7EF2, //CJK UNIFIED IDEOGRAPH
+ 0xE7B6: 0x7F0D, //CJK UNIFIED IDEOGRAPH
+ 0xE7B7: 0x7EF6, //CJK UNIFIED IDEOGRAPH
+ 0xE7B8: 0x7EFA, //CJK UNIFIED IDEOGRAPH
+ 0xE7B9: 0x7EFB, //CJK UNIFIED IDEOGRAPH
+ 0xE7BA: 0x7EFE, //CJK UNIFIED IDEOGRAPH
+ 0xE7BB: 0x7F01, //CJK UNIFIED IDEOGRAPH
+ 0xE7BC: 0x7F02, //CJK UNIFIED IDEOGRAPH
+ 0xE7BD: 0x7F03, //CJK UNIFIED IDEOGRAPH
+ 0xE7BE: 0x7F07, //CJK UNIFIED IDEOGRAPH
+ 0xE7BF: 0x7F08, //CJK UNIFIED IDEOGRAPH
+ 0xE7C0: 0x7F0B, //CJK UNIFIED IDEOGRAPH
+ 0xE7C1: 0x7F0C, //CJK UNIFIED IDEOGRAPH
+ 0xE7C2: 0x7F0F, //CJK UNIFIED IDEOGRAPH
+ 0xE7C3: 0x7F11, //CJK UNIFIED IDEOGRAPH
+ 0xE7C4: 0x7F12, //CJK UNIFIED IDEOGRAPH
+ 0xE7C5: 0x7F17, //CJK UNIFIED IDEOGRAPH
+ 0xE7C6: 0x7F19, //CJK UNIFIED IDEOGRAPH
+ 0xE7C7: 0x7F1C, //CJK UNIFIED IDEOGRAPH
+ 0xE7C8: 0x7F1B, //CJK UNIFIED IDEOGRAPH
+ 0xE7C9: 0x7F1F, //CJK UNIFIED IDEOGRAPH
+ 0xE7CA: 0x7F21, //CJK UNIFIED IDEOGRAPH
+ 0xE7CB: 0x7F22, //CJK UNIFIED IDEOGRAPH
+ 0xE7CC: 0x7F23, //CJK UNIFIED IDEOGRAPH
+ 0xE7CD: 0x7F24, //CJK UNIFIED IDEOGRAPH
+ 0xE7CE: 0x7F25, //CJK UNIFIED IDEOGRAPH
+ 0xE7CF: 0x7F26, //CJK UNIFIED IDEOGRAPH
+ 0xE7D0: 0x7F27, //CJK UNIFIED IDEOGRAPH
+ 0xE7D1: 0x7F2A, //CJK UNIFIED IDEOGRAPH
+ 0xE7D2: 0x7F2B, //CJK UNIFIED IDEOGRAPH
+ 0xE7D3: 0x7F2C, //CJK UNIFIED IDEOGRAPH
+ 0xE7D4: 0x7F2D, //CJK UNIFIED IDEOGRAPH
+ 0xE7D5: 0x7F2F, //CJK UNIFIED IDEOGRAPH
+ 0xE7D6: 0x7F30, //CJK UNIFIED IDEOGRAPH
+ 0xE7D7: 0x7F31, //CJK UNIFIED IDEOGRAPH
+ 0xE7D8: 0x7F32, //CJK UNIFIED IDEOGRAPH
+ 0xE7D9: 0x7F33, //CJK UNIFIED IDEOGRAPH
+ 0xE7DA: 0x7F35, //CJK UNIFIED IDEOGRAPH
+ 0xE7DB: 0x5E7A, //CJK UNIFIED IDEOGRAPH
+ 0xE7DC: 0x757F, //CJK UNIFIED IDEOGRAPH
+ 0xE7DD: 0x5DDB, //CJK UNIFIED IDEOGRAPH
+ 0xE7DE: 0x753E, //CJK UNIFIED IDEOGRAPH
+ 0xE7DF: 0x9095, //CJK UNIFIED IDEOGRAPH
+ 0xE7E0: 0x738E, //CJK UNIFIED IDEOGRAPH
+ 0xE7E1: 0x7391, //CJK UNIFIED IDEOGRAPH
+ 0xE7E2: 0x73AE, //CJK UNIFIED IDEOGRAPH
+ 0xE7E3: 0x73A2, //CJK UNIFIED IDEOGRAPH
+ 0xE7E4: 0x739F, //CJK UNIFIED IDEOGRAPH
+ 0xE7E5: 0x73CF, //CJK UNIFIED IDEOGRAPH
+ 0xE7E6: 0x73C2, //CJK UNIFIED IDEOGRAPH
+ 0xE7E7: 0x73D1, //CJK UNIFIED IDEOGRAPH
+ 0xE7E8: 0x73B7, //CJK UNIFIED IDEOGRAPH
+ 0xE7E9: 0x73B3, //CJK UNIFIED IDEOGRAPH
+ 0xE7EA: 0x73C0, //CJK UNIFIED IDEOGRAPH
+ 0xE7EB: 0x73C9, //CJK UNIFIED IDEOGRAPH
+ 0xE7EC: 0x73C8, //CJK UNIFIED IDEOGRAPH
+ 0xE7ED: 0x73E5, //CJK UNIFIED IDEOGRAPH
+ 0xE7EE: 0x73D9, //CJK UNIFIED IDEOGRAPH
+ 0xE7EF: 0x987C, //CJK UNIFIED IDEOGRAPH
+ 0xE7F0: 0x740A, //CJK UNIFIED IDEOGRAPH
+ 0xE7F1: 0x73E9, //CJK UNIFIED IDEOGRAPH
+ 0xE7F2: 0x73E7, //CJK UNIFIED IDEOGRAPH
+ 0xE7F3: 0x73DE, //CJK UNIFIED IDEOGRAPH
+ 0xE7F4: 0x73BA, //CJK UNIFIED IDEOGRAPH
+ 0xE7F5: 0x73F2, //CJK UNIFIED IDEOGRAPH
+ 0xE7F6: 0x740F, //CJK UNIFIED IDEOGRAPH
+ 0xE7F7: 0x742A, //CJK UNIFIED IDEOGRAPH
+ 0xE7F8: 0x745B, //CJK UNIFIED IDEOGRAPH
+ 0xE7F9: 0x7426, //CJK UNIFIED IDEOGRAPH
+ 0xE7FA: 0x7425, //CJK UNIFIED IDEOGRAPH
+ 0xE7FB: 0x7428, //CJK UNIFIED IDEOGRAPH
+ 0xE7FC: 0x7430, //CJK UNIFIED IDEOGRAPH
+ 0xE7FD: 0x742E, //CJK UNIFIED IDEOGRAPH
+ 0xE7FE: 0x742C, //CJK UNIFIED IDEOGRAPH
+ 0xE840: 0x942F, //CJK UNIFIED IDEOGRAPH
+ 0xE841: 0x9430, //CJK UNIFIED IDEOGRAPH
+ 0xE842: 0x9431, //CJK UNIFIED IDEOGRAPH
+ 0xE843: 0x9432, //CJK UNIFIED IDEOGRAPH
+ 0xE844: 0x9433, //CJK UNIFIED IDEOGRAPH
+ 0xE845: 0x9434, //CJK UNIFIED IDEOGRAPH
+ 0xE846: 0x9435, //CJK UNIFIED IDEOGRAPH
+ 0xE847: 0x9436, //CJK UNIFIED IDEOGRAPH
+ 0xE848: 0x9437, //CJK UNIFIED IDEOGRAPH
+ 0xE849: 0x9438, //CJK UNIFIED IDEOGRAPH
+ 0xE84A: 0x9439, //CJK UNIFIED IDEOGRAPH
+ 0xE84B: 0x943A, //CJK UNIFIED IDEOGRAPH
+ 0xE84C: 0x943B, //CJK UNIFIED IDEOGRAPH
+ 0xE84D: 0x943C, //CJK UNIFIED IDEOGRAPH
+ 0xE84E: 0x943D, //CJK UNIFIED IDEOGRAPH
+ 0xE84F: 0x943F, //CJK UNIFIED IDEOGRAPH
+ 0xE850: 0x9440, //CJK UNIFIED IDEOGRAPH
+ 0xE851: 0x9441, //CJK UNIFIED IDEOGRAPH
+ 0xE852: 0x9442, //CJK UNIFIED IDEOGRAPH
+ 0xE853: 0x9443, //CJK UNIFIED IDEOGRAPH
+ 0xE854: 0x9444, //CJK UNIFIED IDEOGRAPH
+ 0xE855: 0x9445, //CJK UNIFIED IDEOGRAPH
+ 0xE856: 0x9446, //CJK UNIFIED IDEOGRAPH
+ 0xE857: 0x9447, //CJK UNIFIED IDEOGRAPH
+ 0xE858: 0x9448, //CJK UNIFIED IDEOGRAPH
+ 0xE859: 0x9449, //CJK UNIFIED IDEOGRAPH
+ 0xE85A: 0x944A, //CJK UNIFIED IDEOGRAPH
+ 0xE85B: 0x944B, //CJK UNIFIED IDEOGRAPH
+ 0xE85C: 0x944C, //CJK UNIFIED IDEOGRAPH
+ 0xE85D: 0x944D, //CJK UNIFIED IDEOGRAPH
+ 0xE85E: 0x944E, //CJK UNIFIED IDEOGRAPH
+ 0xE85F: 0x944F, //CJK UNIFIED IDEOGRAPH
+ 0xE860: 0x9450, //CJK UNIFIED IDEOGRAPH
+ 0xE861: 0x9451, //CJK UNIFIED IDEOGRAPH
+ 0xE862: 0x9452, //CJK UNIFIED IDEOGRAPH
+ 0xE863: 0x9453, //CJK UNIFIED IDEOGRAPH
+ 0xE864: 0x9454, //CJK UNIFIED IDEOGRAPH
+ 0xE865: 0x9455, //CJK UNIFIED IDEOGRAPH
+ 0xE866: 0x9456, //CJK UNIFIED IDEOGRAPH
+ 0xE867: 0x9457, //CJK UNIFIED IDEOGRAPH
+ 0xE868: 0x9458, //CJK UNIFIED IDEOGRAPH
+ 0xE869: 0x9459, //CJK UNIFIED IDEOGRAPH
+ 0xE86A: 0x945A, //CJK UNIFIED IDEOGRAPH
+ 0xE86B: 0x945B, //CJK UNIFIED IDEOGRAPH
+ 0xE86C: 0x945C, //CJK UNIFIED IDEOGRAPH
+ 0xE86D: 0x945D, //CJK UNIFIED IDEOGRAPH
+ 0xE86E: 0x945E, //CJK UNIFIED IDEOGRAPH
+ 0xE86F: 0x945F, //CJK UNIFIED IDEOGRAPH
+ 0xE870: 0x9460, //CJK UNIFIED IDEOGRAPH
+ 0xE871: 0x9461, //CJK UNIFIED IDEOGRAPH
+ 0xE872: 0x9462, //CJK UNIFIED IDEOGRAPH
+ 0xE873: 0x9463, //CJK UNIFIED IDEOGRAPH
+ 0xE874: 0x9464, //CJK UNIFIED IDEOGRAPH
+ 0xE875: 0x9465, //CJK UNIFIED IDEOGRAPH
+ 0xE876: 0x9466, //CJK UNIFIED IDEOGRAPH
+ 0xE877: 0x9467, //CJK UNIFIED IDEOGRAPH
+ 0xE878: 0x9468, //CJK UNIFIED IDEOGRAPH
+ 0xE879: 0x9469, //CJK UNIFIED IDEOGRAPH
+ 0xE87A: 0x946A, //CJK UNIFIED IDEOGRAPH
+ 0xE87B: 0x946C, //CJK UNIFIED IDEOGRAPH
+ 0xE87C: 0x946D, //CJK UNIFIED IDEOGRAPH
+ 0xE87D: 0x946E, //CJK UNIFIED IDEOGRAPH
+ 0xE87E: 0x946F, //CJK UNIFIED IDEOGRAPH
+ 0xE880: 0x9470, //CJK UNIFIED IDEOGRAPH
+ 0xE881: 0x9471, //CJK UNIFIED IDEOGRAPH
+ 0xE882: 0x9472, //CJK UNIFIED IDEOGRAPH
+ 0xE883: 0x9473, //CJK UNIFIED IDEOGRAPH
+ 0xE884: 0x9474, //CJK UNIFIED IDEOGRAPH
+ 0xE885: 0x9475, //CJK UNIFIED IDEOGRAPH
+ 0xE886: 0x9476, //CJK UNIFIED IDEOGRAPH
+ 0xE887: 0x9477, //CJK UNIFIED IDEOGRAPH
+ 0xE888: 0x9478, //CJK UNIFIED IDEOGRAPH
+ 0xE889: 0x9479, //CJK UNIFIED IDEOGRAPH
+ 0xE88A: 0x947A, //CJK UNIFIED IDEOGRAPH
+ 0xE88B: 0x947B, //CJK UNIFIED IDEOGRAPH
+ 0xE88C: 0x947C, //CJK UNIFIED IDEOGRAPH
+ 0xE88D: 0x947D, //CJK UNIFIED IDEOGRAPH
+ 0xE88E: 0x947E, //CJK UNIFIED IDEOGRAPH
+ 0xE88F: 0x947F, //CJK UNIFIED IDEOGRAPH
+ 0xE890: 0x9480, //CJK UNIFIED IDEOGRAPH
+ 0xE891: 0x9481, //CJK UNIFIED IDEOGRAPH
+ 0xE892: 0x9482, //CJK UNIFIED IDEOGRAPH
+ 0xE893: 0x9483, //CJK UNIFIED IDEOGRAPH
+ 0xE894: 0x9484, //CJK UNIFIED IDEOGRAPH
+ 0xE895: 0x9491, //CJK UNIFIED IDEOGRAPH
+ 0xE896: 0x9496, //CJK UNIFIED IDEOGRAPH
+ 0xE897: 0x9498, //CJK UNIFIED IDEOGRAPH
+ 0xE898: 0x94C7, //CJK UNIFIED IDEOGRAPH
+ 0xE899: 0x94CF, //CJK UNIFIED IDEOGRAPH
+ 0xE89A: 0x94D3, //CJK UNIFIED IDEOGRAPH
+ 0xE89B: 0x94D4, //CJK UNIFIED IDEOGRAPH
+ 0xE89C: 0x94DA, //CJK UNIFIED IDEOGRAPH
+ 0xE89D: 0x94E6, //CJK UNIFIED IDEOGRAPH
+ 0xE89E: 0x94FB, //CJK UNIFIED IDEOGRAPH
+ 0xE89F: 0x951C, //CJK UNIFIED IDEOGRAPH
+ 0xE8A0: 0x9520, //CJK UNIFIED IDEOGRAPH
+ 0xE8A1: 0x741B, //CJK UNIFIED IDEOGRAPH
+ 0xE8A2: 0x741A, //CJK UNIFIED IDEOGRAPH
+ 0xE8A3: 0x7441, //CJK UNIFIED IDEOGRAPH
+ 0xE8A4: 0x745C, //CJK UNIFIED IDEOGRAPH
+ 0xE8A5: 0x7457, //CJK UNIFIED IDEOGRAPH
+ 0xE8A6: 0x7455, //CJK UNIFIED IDEOGRAPH
+ 0xE8A7: 0x7459, //CJK UNIFIED IDEOGRAPH
+ 0xE8A8: 0x7477, //CJK UNIFIED IDEOGRAPH
+ 0xE8A9: 0x746D, //CJK UNIFIED IDEOGRAPH
+ 0xE8AA: 0x747E, //CJK UNIFIED IDEOGRAPH
+ 0xE8AB: 0x749C, //CJK UNIFIED IDEOGRAPH
+ 0xE8AC: 0x748E, //CJK UNIFIED IDEOGRAPH
+ 0xE8AD: 0x7480, //CJK UNIFIED IDEOGRAPH
+ 0xE8AE: 0x7481, //CJK UNIFIED IDEOGRAPH
+ 0xE8AF: 0x7487, //CJK UNIFIED IDEOGRAPH
+ 0xE8B0: 0x748B, //CJK UNIFIED IDEOGRAPH
+ 0xE8B1: 0x749E, //CJK UNIFIED IDEOGRAPH
+ 0xE8B2: 0x74A8, //CJK UNIFIED IDEOGRAPH
+ 0xE8B3: 0x74A9, //CJK UNIFIED IDEOGRAPH
+ 0xE8B4: 0x7490, //CJK UNIFIED IDEOGRAPH
+ 0xE8B5: 0x74A7, //CJK UNIFIED IDEOGRAPH
+ 0xE8B6: 0x74D2, //CJK UNIFIED IDEOGRAPH
+ 0xE8B7: 0x74BA, //CJK UNIFIED IDEOGRAPH
+ 0xE8B8: 0x97EA, //CJK UNIFIED IDEOGRAPH
+ 0xE8B9: 0x97EB, //CJK UNIFIED IDEOGRAPH
+ 0xE8BA: 0x97EC, //CJK UNIFIED IDEOGRAPH
+ 0xE8BB: 0x674C, //CJK UNIFIED IDEOGRAPH
+ 0xE8BC: 0x6753, //CJK UNIFIED IDEOGRAPH
+ 0xE8BD: 0x675E, //CJK UNIFIED IDEOGRAPH
+ 0xE8BE: 0x6748, //CJK UNIFIED IDEOGRAPH
+ 0xE8BF: 0x6769, //CJK UNIFIED IDEOGRAPH
+ 0xE8C0: 0x67A5, //CJK UNIFIED IDEOGRAPH
+ 0xE8C1: 0x6787, //CJK UNIFIED IDEOGRAPH
+ 0xE8C2: 0x676A, //CJK UNIFIED IDEOGRAPH
+ 0xE8C3: 0x6773, //CJK UNIFIED IDEOGRAPH
+ 0xE8C4: 0x6798, //CJK UNIFIED IDEOGRAPH
+ 0xE8C5: 0x67A7, //CJK UNIFIED IDEOGRAPH
+ 0xE8C6: 0x6775, //CJK UNIFIED IDEOGRAPH
+ 0xE8C7: 0x67A8, //CJK UNIFIED IDEOGRAPH
+ 0xE8C8: 0x679E, //CJK UNIFIED IDEOGRAPH
+ 0xE8C9: 0x67AD, //CJK UNIFIED IDEOGRAPH
+ 0xE8CA: 0x678B, //CJK UNIFIED IDEOGRAPH
+ 0xE8CB: 0x6777, //CJK UNIFIED IDEOGRAPH
+ 0xE8CC: 0x677C, //CJK UNIFIED IDEOGRAPH
+ 0xE8CD: 0x67F0, //CJK UNIFIED IDEOGRAPH
+ 0xE8CE: 0x6809, //CJK UNIFIED IDEOGRAPH
+ 0xE8CF: 0x67D8, //CJK UNIFIED IDEOGRAPH
+ 0xE8D0: 0x680A, //CJK UNIFIED IDEOGRAPH
+ 0xE8D1: 0x67E9, //CJK UNIFIED IDEOGRAPH
+ 0xE8D2: 0x67B0, //CJK UNIFIED IDEOGRAPH
+ 0xE8D3: 0x680C, //CJK UNIFIED IDEOGRAPH
+ 0xE8D4: 0x67D9, //CJK UNIFIED IDEOGRAPH
+ 0xE8D5: 0x67B5, //CJK UNIFIED IDEOGRAPH
+ 0xE8D6: 0x67DA, //CJK UNIFIED IDEOGRAPH
+ 0xE8D7: 0x67B3, //CJK UNIFIED IDEOGRAPH
+ 0xE8D8: 0x67DD, //CJK UNIFIED IDEOGRAPH
+ 0xE8D9: 0x6800, //CJK UNIFIED IDEOGRAPH
+ 0xE8DA: 0x67C3, //CJK UNIFIED IDEOGRAPH
+ 0xE8DB: 0x67B8, //CJK UNIFIED IDEOGRAPH
+ 0xE8DC: 0x67E2, //CJK UNIFIED IDEOGRAPH
+ 0xE8DD: 0x680E, //CJK UNIFIED IDEOGRAPH
+ 0xE8DE: 0x67C1, //CJK UNIFIED IDEOGRAPH
+ 0xE8DF: 0x67FD, //CJK UNIFIED IDEOGRAPH
+ 0xE8E0: 0x6832, //CJK UNIFIED IDEOGRAPH
+ 0xE8E1: 0x6833, //CJK UNIFIED IDEOGRAPH
+ 0xE8E2: 0x6860, //CJK UNIFIED IDEOGRAPH
+ 0xE8E3: 0x6861, //CJK UNIFIED IDEOGRAPH
+ 0xE8E4: 0x684E, //CJK UNIFIED IDEOGRAPH
+ 0xE8E5: 0x6862, //CJK UNIFIED IDEOGRAPH
+ 0xE8E6: 0x6844, //CJK UNIFIED IDEOGRAPH
+ 0xE8E7: 0x6864, //CJK UNIFIED IDEOGRAPH
+ 0xE8E8: 0x6883, //CJK UNIFIED IDEOGRAPH
+ 0xE8E9: 0x681D, //CJK UNIFIED IDEOGRAPH
+ 0xE8EA: 0x6855, //CJK UNIFIED IDEOGRAPH
+ 0xE8EB: 0x6866, //CJK UNIFIED IDEOGRAPH
+ 0xE8EC: 0x6841, //CJK UNIFIED IDEOGRAPH
+ 0xE8ED: 0x6867, //CJK UNIFIED IDEOGRAPH
+ 0xE8EE: 0x6840, //CJK UNIFIED IDEOGRAPH
+ 0xE8EF: 0x683E, //CJK UNIFIED IDEOGRAPH
+ 0xE8F0: 0x684A, //CJK UNIFIED IDEOGRAPH
+ 0xE8F1: 0x6849, //CJK UNIFIED IDEOGRAPH
+ 0xE8F2: 0x6829, //CJK UNIFIED IDEOGRAPH
+ 0xE8F3: 0x68B5, //CJK UNIFIED IDEOGRAPH
+ 0xE8F4: 0x688F, //CJK UNIFIED IDEOGRAPH
+ 0xE8F5: 0x6874, //CJK UNIFIED IDEOGRAPH
+ 0xE8F6: 0x6877, //CJK UNIFIED IDEOGRAPH
+ 0xE8F7: 0x6893, //CJK UNIFIED IDEOGRAPH
+ 0xE8F8: 0x686B, //CJK UNIFIED IDEOGRAPH
+ 0xE8F9: 0x68C2, //CJK UNIFIED IDEOGRAPH
+ 0xE8FA: 0x696E, //CJK UNIFIED IDEOGRAPH
+ 0xE8FB: 0x68FC, //CJK UNIFIED IDEOGRAPH
+ 0xE8FC: 0x691F, //CJK UNIFIED IDEOGRAPH
+ 0xE8FD: 0x6920, //CJK UNIFIED IDEOGRAPH
+ 0xE8FE: 0x68F9, //CJK UNIFIED IDEOGRAPH
+ 0xE940: 0x9527, //CJK UNIFIED IDEOGRAPH
+ 0xE941: 0x9533, //CJK UNIFIED IDEOGRAPH
+ 0xE942: 0x953D, //CJK UNIFIED IDEOGRAPH
+ 0xE943: 0x9543, //CJK UNIFIED IDEOGRAPH
+ 0xE944: 0x9548, //CJK UNIFIED IDEOGRAPH
+ 0xE945: 0x954B, //CJK UNIFIED IDEOGRAPH
+ 0xE946: 0x9555, //CJK UNIFIED IDEOGRAPH
+ 0xE947: 0x955A, //CJK UNIFIED IDEOGRAPH
+ 0xE948: 0x9560, //CJK UNIFIED IDEOGRAPH
+ 0xE949: 0x956E, //CJK UNIFIED IDEOGRAPH
+ 0xE94A: 0x9574, //CJK UNIFIED IDEOGRAPH
+ 0xE94B: 0x9575, //CJK UNIFIED IDEOGRAPH
+ 0xE94C: 0x9577, //CJK UNIFIED IDEOGRAPH
+ 0xE94D: 0x9578, //CJK UNIFIED IDEOGRAPH
+ 0xE94E: 0x9579, //CJK UNIFIED IDEOGRAPH
+ 0xE94F: 0x957A, //CJK UNIFIED IDEOGRAPH
+ 0xE950: 0x957B, //CJK UNIFIED IDEOGRAPH
+ 0xE951: 0x957C, //CJK UNIFIED IDEOGRAPH
+ 0xE952: 0x957D, //CJK UNIFIED IDEOGRAPH
+ 0xE953: 0x957E, //CJK UNIFIED IDEOGRAPH
+ 0xE954: 0x9580, //CJK UNIFIED IDEOGRAPH
+ 0xE955: 0x9581, //CJK UNIFIED IDEOGRAPH
+ 0xE956: 0x9582, //CJK UNIFIED IDEOGRAPH
+ 0xE957: 0x9583, //CJK UNIFIED IDEOGRAPH
+ 0xE958: 0x9584, //CJK UNIFIED IDEOGRAPH
+ 0xE959: 0x9585, //CJK UNIFIED IDEOGRAPH
+ 0xE95A: 0x9586, //CJK UNIFIED IDEOGRAPH
+ 0xE95B: 0x9587, //CJK UNIFIED IDEOGRAPH
+ 0xE95C: 0x9588, //CJK UNIFIED IDEOGRAPH
+ 0xE95D: 0x9589, //CJK UNIFIED IDEOGRAPH
+ 0xE95E: 0x958A, //CJK UNIFIED IDEOGRAPH
+ 0xE95F: 0x958B, //CJK UNIFIED IDEOGRAPH
+ 0xE960: 0x958C, //CJK UNIFIED IDEOGRAPH
+ 0xE961: 0x958D, //CJK UNIFIED IDEOGRAPH
+ 0xE962: 0x958E, //CJK UNIFIED IDEOGRAPH
+ 0xE963: 0x958F, //CJK UNIFIED IDEOGRAPH
+ 0xE964: 0x9590, //CJK UNIFIED IDEOGRAPH
+ 0xE965: 0x9591, //CJK UNIFIED IDEOGRAPH
+ 0xE966: 0x9592, //CJK UNIFIED IDEOGRAPH
+ 0xE967: 0x9593, //CJK UNIFIED IDEOGRAPH
+ 0xE968: 0x9594, //CJK UNIFIED IDEOGRAPH
+ 0xE969: 0x9595, //CJK UNIFIED IDEOGRAPH
+ 0xE96A: 0x9596, //CJK UNIFIED IDEOGRAPH
+ 0xE96B: 0x9597, //CJK UNIFIED IDEOGRAPH
+ 0xE96C: 0x9598, //CJK UNIFIED IDEOGRAPH
+ 0xE96D: 0x9599, //CJK UNIFIED IDEOGRAPH
+ 0xE96E: 0x959A, //CJK UNIFIED IDEOGRAPH
+ 0xE96F: 0x959B, //CJK UNIFIED IDEOGRAPH
+ 0xE970: 0x959C, //CJK UNIFIED IDEOGRAPH
+ 0xE971: 0x959D, //CJK UNIFIED IDEOGRAPH
+ 0xE972: 0x959E, //CJK UNIFIED IDEOGRAPH
+ 0xE973: 0x959F, //CJK UNIFIED IDEOGRAPH
+ 0xE974: 0x95A0, //CJK UNIFIED IDEOGRAPH
+ 0xE975: 0x95A1, //CJK UNIFIED IDEOGRAPH
+ 0xE976: 0x95A2, //CJK UNIFIED IDEOGRAPH
+ 0xE977: 0x95A3, //CJK UNIFIED IDEOGRAPH
+ 0xE978: 0x95A4, //CJK UNIFIED IDEOGRAPH
+ 0xE979: 0x95A5, //CJK UNIFIED IDEOGRAPH
+ 0xE97A: 0x95A6, //CJK UNIFIED IDEOGRAPH
+ 0xE97B: 0x95A7, //CJK UNIFIED IDEOGRAPH
+ 0xE97C: 0x95A8, //CJK UNIFIED IDEOGRAPH
+ 0xE97D: 0x95A9, //CJK UNIFIED IDEOGRAPH
+ 0xE97E: 0x95AA, //CJK UNIFIED IDEOGRAPH
+ 0xE980: 0x95AB, //CJK UNIFIED IDEOGRAPH
+ 0xE981: 0x95AC, //CJK UNIFIED IDEOGRAPH
+ 0xE982: 0x95AD, //CJK UNIFIED IDEOGRAPH
+ 0xE983: 0x95AE, //CJK UNIFIED IDEOGRAPH
+ 0xE984: 0x95AF, //CJK UNIFIED IDEOGRAPH
+ 0xE985: 0x95B0, //CJK UNIFIED IDEOGRAPH
+ 0xE986: 0x95B1, //CJK UNIFIED IDEOGRAPH
+ 0xE987: 0x95B2, //CJK UNIFIED IDEOGRAPH
+ 0xE988: 0x95B3, //CJK UNIFIED IDEOGRAPH
+ 0xE989: 0x95B4, //CJK UNIFIED IDEOGRAPH
+ 0xE98A: 0x95B5, //CJK UNIFIED IDEOGRAPH
+ 0xE98B: 0x95B6, //CJK UNIFIED IDEOGRAPH
+ 0xE98C: 0x95B7, //CJK UNIFIED IDEOGRAPH
+ 0xE98D: 0x95B8, //CJK UNIFIED IDEOGRAPH
+ 0xE98E: 0x95B9, //CJK UNIFIED IDEOGRAPH
+ 0xE98F: 0x95BA, //CJK UNIFIED IDEOGRAPH
+ 0xE990: 0x95BB, //CJK UNIFIED IDEOGRAPH
+ 0xE991: 0x95BC, //CJK UNIFIED IDEOGRAPH
+ 0xE992: 0x95BD, //CJK UNIFIED IDEOGRAPH
+ 0xE993: 0x95BE, //CJK UNIFIED IDEOGRAPH
+ 0xE994: 0x95BF, //CJK UNIFIED IDEOGRAPH
+ 0xE995: 0x95C0, //CJK UNIFIED IDEOGRAPH
+ 0xE996: 0x95C1, //CJK UNIFIED IDEOGRAPH
+ 0xE997: 0x95C2, //CJK UNIFIED IDEOGRAPH
+ 0xE998: 0x95C3, //CJK UNIFIED IDEOGRAPH
+ 0xE999: 0x95C4, //CJK UNIFIED IDEOGRAPH
+ 0xE99A: 0x95C5, //CJK UNIFIED IDEOGRAPH
+ 0xE99B: 0x95C6, //CJK UNIFIED IDEOGRAPH
+ 0xE99C: 0x95C7, //CJK UNIFIED IDEOGRAPH
+ 0xE99D: 0x95C8, //CJK UNIFIED IDEOGRAPH
+ 0xE99E: 0x95C9, //CJK UNIFIED IDEOGRAPH
+ 0xE99F: 0x95CA, //CJK UNIFIED IDEOGRAPH
+ 0xE9A0: 0x95CB, //CJK UNIFIED IDEOGRAPH
+ 0xE9A1: 0x6924, //CJK UNIFIED IDEOGRAPH
+ 0xE9A2: 0x68F0, //CJK UNIFIED IDEOGRAPH
+ 0xE9A3: 0x690B, //CJK UNIFIED IDEOGRAPH
+ 0xE9A4: 0x6901, //CJK UNIFIED IDEOGRAPH
+ 0xE9A5: 0x6957, //CJK UNIFIED IDEOGRAPH
+ 0xE9A6: 0x68E3, //CJK UNIFIED IDEOGRAPH
+ 0xE9A7: 0x6910, //CJK UNIFIED IDEOGRAPH
+ 0xE9A8: 0x6971, //CJK UNIFIED IDEOGRAPH
+ 0xE9A9: 0x6939, //CJK UNIFIED IDEOGRAPH
+ 0xE9AA: 0x6960, //CJK UNIFIED IDEOGRAPH
+ 0xE9AB: 0x6942, //CJK UNIFIED IDEOGRAPH
+ 0xE9AC: 0x695D, //CJK UNIFIED IDEOGRAPH
+ 0xE9AD: 0x6984, //CJK UNIFIED IDEOGRAPH
+ 0xE9AE: 0x696B, //CJK UNIFIED IDEOGRAPH
+ 0xE9AF: 0x6980, //CJK UNIFIED IDEOGRAPH
+ 0xE9B0: 0x6998, //CJK UNIFIED IDEOGRAPH
+ 0xE9B1: 0x6978, //CJK UNIFIED IDEOGRAPH
+ 0xE9B2: 0x6934, //CJK UNIFIED IDEOGRAPH
+ 0xE9B3: 0x69CC, //CJK UNIFIED IDEOGRAPH
+ 0xE9B4: 0x6987, //CJK UNIFIED IDEOGRAPH
+ 0xE9B5: 0x6988, //CJK UNIFIED IDEOGRAPH
+ 0xE9B6: 0x69CE, //CJK UNIFIED IDEOGRAPH
+ 0xE9B7: 0x6989, //CJK UNIFIED IDEOGRAPH
+ 0xE9B8: 0x6966, //CJK UNIFIED IDEOGRAPH
+ 0xE9B9: 0x6963, //CJK UNIFIED IDEOGRAPH
+ 0xE9BA: 0x6979, //CJK UNIFIED IDEOGRAPH
+ 0xE9BB: 0x699B, //CJK UNIFIED IDEOGRAPH
+ 0xE9BC: 0x69A7, //CJK UNIFIED IDEOGRAPH
+ 0xE9BD: 0x69BB, //CJK UNIFIED IDEOGRAPH
+ 0xE9BE: 0x69AB, //CJK UNIFIED IDEOGRAPH
+ 0xE9BF: 0x69AD, //CJK UNIFIED IDEOGRAPH
+ 0xE9C0: 0x69D4, //CJK UNIFIED IDEOGRAPH
+ 0xE9C1: 0x69B1, //CJK UNIFIED IDEOGRAPH
+ 0xE9C2: 0x69C1, //CJK UNIFIED IDEOGRAPH
+ 0xE9C3: 0x69CA, //CJK UNIFIED IDEOGRAPH
+ 0xE9C4: 0x69DF, //CJK UNIFIED IDEOGRAPH
+ 0xE9C5: 0x6995, //CJK UNIFIED IDEOGRAPH
+ 0xE9C6: 0x69E0, //CJK UNIFIED IDEOGRAPH
+ 0xE9C7: 0x698D, //CJK UNIFIED IDEOGRAPH
+ 0xE9C8: 0x69FF, //CJK UNIFIED IDEOGRAPH
+ 0xE9C9: 0x6A2F, //CJK UNIFIED IDEOGRAPH
+ 0xE9CA: 0x69ED, //CJK UNIFIED IDEOGRAPH
+ 0xE9CB: 0x6A17, //CJK UNIFIED IDEOGRAPH
+ 0xE9CC: 0x6A18, //CJK UNIFIED IDEOGRAPH
+ 0xE9CD: 0x6A65, //CJK UNIFIED IDEOGRAPH
+ 0xE9CE: 0x69F2, //CJK UNIFIED IDEOGRAPH
+ 0xE9CF: 0x6A44, //CJK UNIFIED IDEOGRAPH
+ 0xE9D0: 0x6A3E, //CJK UNIFIED IDEOGRAPH
+ 0xE9D1: 0x6AA0, //CJK UNIFIED IDEOGRAPH
+ 0xE9D2: 0x6A50, //CJK UNIFIED IDEOGRAPH
+ 0xE9D3: 0x6A5B, //CJK UNIFIED IDEOGRAPH
+ 0xE9D4: 0x6A35, //CJK UNIFIED IDEOGRAPH
+ 0xE9D5: 0x6A8E, //CJK UNIFIED IDEOGRAPH
+ 0xE9D6: 0x6A79, //CJK UNIFIED IDEOGRAPH
+ 0xE9D7: 0x6A3D, //CJK UNIFIED IDEOGRAPH
+ 0xE9D8: 0x6A28, //CJK UNIFIED IDEOGRAPH
+ 0xE9D9: 0x6A58, //CJK UNIFIED IDEOGRAPH
+ 0xE9DA: 0x6A7C, //CJK UNIFIED IDEOGRAPH
+ 0xE9DB: 0x6A91, //CJK UNIFIED IDEOGRAPH
+ 0xE9DC: 0x6A90, //CJK UNIFIED IDEOGRAPH
+ 0xE9DD: 0x6AA9, //CJK UNIFIED IDEOGRAPH
+ 0xE9DE: 0x6A97, //CJK UNIFIED IDEOGRAPH
+ 0xE9DF: 0x6AAB, //CJK UNIFIED IDEOGRAPH
+ 0xE9E0: 0x7337, //CJK UNIFIED IDEOGRAPH
+ 0xE9E1: 0x7352, //CJK UNIFIED IDEOGRAPH
+ 0xE9E2: 0x6B81, //CJK UNIFIED IDEOGRAPH
+ 0xE9E3: 0x6B82, //CJK UNIFIED IDEOGRAPH
+ 0xE9E4: 0x6B87, //CJK UNIFIED IDEOGRAPH
+ 0xE9E5: 0x6B84, //CJK UNIFIED IDEOGRAPH
+ 0xE9E6: 0x6B92, //CJK UNIFIED IDEOGRAPH
+ 0xE9E7: 0x6B93, //CJK UNIFIED IDEOGRAPH
+ 0xE9E8: 0x6B8D, //CJK UNIFIED IDEOGRAPH
+ 0xE9E9: 0x6B9A, //CJK UNIFIED IDEOGRAPH
+ 0xE9EA: 0x6B9B, //CJK UNIFIED IDEOGRAPH
+ 0xE9EB: 0x6BA1, //CJK UNIFIED IDEOGRAPH
+ 0xE9EC: 0x6BAA, //CJK UNIFIED IDEOGRAPH
+ 0xE9ED: 0x8F6B, //CJK UNIFIED IDEOGRAPH
+ 0xE9EE: 0x8F6D, //CJK UNIFIED IDEOGRAPH
+ 0xE9EF: 0x8F71, //CJK UNIFIED IDEOGRAPH
+ 0xE9F0: 0x8F72, //CJK UNIFIED IDEOGRAPH
+ 0xE9F1: 0x8F73, //CJK UNIFIED IDEOGRAPH
+ 0xE9F2: 0x8F75, //CJK UNIFIED IDEOGRAPH
+ 0xE9F3: 0x8F76, //CJK UNIFIED IDEOGRAPH
+ 0xE9F4: 0x8F78, //CJK UNIFIED IDEOGRAPH
+ 0xE9F5: 0x8F77, //CJK UNIFIED IDEOGRAPH
+ 0xE9F6: 0x8F79, //CJK UNIFIED IDEOGRAPH
+ 0xE9F7: 0x8F7A, //CJK UNIFIED IDEOGRAPH
+ 0xE9F8: 0x8F7C, //CJK UNIFIED IDEOGRAPH
+ 0xE9F9: 0x8F7E, //CJK UNIFIED IDEOGRAPH
+ 0xE9FA: 0x8F81, //CJK UNIFIED IDEOGRAPH
+ 0xE9FB: 0x8F82, //CJK UNIFIED IDEOGRAPH
+ 0xE9FC: 0x8F84, //CJK UNIFIED IDEOGRAPH
+ 0xE9FD: 0x8F87, //CJK UNIFIED IDEOGRAPH
+ 0xE9FE: 0x8F8B, //CJK UNIFIED IDEOGRAPH
+ 0xEA40: 0x95CC, //CJK UNIFIED IDEOGRAPH
+ 0xEA41: 0x95CD, //CJK UNIFIED IDEOGRAPH
+ 0xEA42: 0x95CE, //CJK UNIFIED IDEOGRAPH
+ 0xEA43: 0x95CF, //CJK UNIFIED IDEOGRAPH
+ 0xEA44: 0x95D0, //CJK UNIFIED IDEOGRAPH
+ 0xEA45: 0x95D1, //CJK UNIFIED IDEOGRAPH
+ 0xEA46: 0x95D2, //CJK UNIFIED IDEOGRAPH
+ 0xEA47: 0x95D3, //CJK UNIFIED IDEOGRAPH
+ 0xEA48: 0x95D4, //CJK UNIFIED IDEOGRAPH
+ 0xEA49: 0x95D5, //CJK UNIFIED IDEOGRAPH
+ 0xEA4A: 0x95D6, //CJK UNIFIED IDEOGRAPH
+ 0xEA4B: 0x95D7, //CJK UNIFIED IDEOGRAPH
+ 0xEA4C: 0x95D8, //CJK UNIFIED IDEOGRAPH
+ 0xEA4D: 0x95D9, //CJK UNIFIED IDEOGRAPH
+ 0xEA4E: 0x95DA, //CJK UNIFIED IDEOGRAPH
+ 0xEA4F: 0x95DB, //CJK UNIFIED IDEOGRAPH
+ 0xEA50: 0x95DC, //CJK UNIFIED IDEOGRAPH
+ 0xEA51: 0x95DD, //CJK UNIFIED IDEOGRAPH
+ 0xEA52: 0x95DE, //CJK UNIFIED IDEOGRAPH
+ 0xEA53: 0x95DF, //CJK UNIFIED IDEOGRAPH
+ 0xEA54: 0x95E0, //CJK UNIFIED IDEOGRAPH
+ 0xEA55: 0x95E1, //CJK UNIFIED IDEOGRAPH
+ 0xEA56: 0x95E2, //CJK UNIFIED IDEOGRAPH
+ 0xEA57: 0x95E3, //CJK UNIFIED IDEOGRAPH
+ 0xEA58: 0x95E4, //CJK UNIFIED IDEOGRAPH
+ 0xEA59: 0x95E5, //CJK UNIFIED IDEOGRAPH
+ 0xEA5A: 0x95E6, //CJK UNIFIED IDEOGRAPH
+ 0xEA5B: 0x95E7, //CJK UNIFIED IDEOGRAPH
+ 0xEA5C: 0x95EC, //CJK UNIFIED IDEOGRAPH
+ 0xEA5D: 0x95FF, //CJK UNIFIED IDEOGRAPH
+ 0xEA5E: 0x9607, //CJK UNIFIED IDEOGRAPH
+ 0xEA5F: 0x9613, //CJK UNIFIED IDEOGRAPH
+ 0xEA60: 0x9618, //CJK UNIFIED IDEOGRAPH
+ 0xEA61: 0x961B, //CJK UNIFIED IDEOGRAPH
+ 0xEA62: 0x961E, //CJK UNIFIED IDEOGRAPH
+ 0xEA63: 0x9620, //CJK UNIFIED IDEOGRAPH
+ 0xEA64: 0x9623, //CJK UNIFIED IDEOGRAPH
+ 0xEA65: 0x9624, //CJK UNIFIED IDEOGRAPH
+ 0xEA66: 0x9625, //CJK UNIFIED IDEOGRAPH
+ 0xEA67: 0x9626, //CJK UNIFIED IDEOGRAPH
+ 0xEA68: 0x9627, //CJK UNIFIED IDEOGRAPH
+ 0xEA69: 0x9628, //CJK UNIFIED IDEOGRAPH
+ 0xEA6A: 0x9629, //CJK UNIFIED IDEOGRAPH
+ 0xEA6B: 0x962B, //CJK UNIFIED IDEOGRAPH
+ 0xEA6C: 0x962C, //CJK UNIFIED IDEOGRAPH
+ 0xEA6D: 0x962D, //CJK UNIFIED IDEOGRAPH
+ 0xEA6E: 0x962F, //CJK UNIFIED IDEOGRAPH
+ 0xEA6F: 0x9630, //CJK UNIFIED IDEOGRAPH
+ 0xEA70: 0x9637, //CJK UNIFIED IDEOGRAPH
+ 0xEA71: 0x9638, //CJK UNIFIED IDEOGRAPH
+ 0xEA72: 0x9639, //CJK UNIFIED IDEOGRAPH
+ 0xEA73: 0x963A, //CJK UNIFIED IDEOGRAPH
+ 0xEA74: 0x963E, //CJK UNIFIED IDEOGRAPH
+ 0xEA75: 0x9641, //CJK UNIFIED IDEOGRAPH
+ 0xEA76: 0x9643, //CJK UNIFIED IDEOGRAPH
+ 0xEA77: 0x964A, //CJK UNIFIED IDEOGRAPH
+ 0xEA78: 0x964E, //CJK UNIFIED IDEOGRAPH
+ 0xEA79: 0x964F, //CJK UNIFIED IDEOGRAPH
+ 0xEA7A: 0x9651, //CJK UNIFIED IDEOGRAPH
+ 0xEA7B: 0x9652, //CJK UNIFIED IDEOGRAPH
+ 0xEA7C: 0x9653, //CJK UNIFIED IDEOGRAPH
+ 0xEA7D: 0x9656, //CJK UNIFIED IDEOGRAPH
+ 0xEA7E: 0x9657, //CJK UNIFIED IDEOGRAPH
+ 0xEA80: 0x9658, //CJK UNIFIED IDEOGRAPH
+ 0xEA81: 0x9659, //CJK UNIFIED IDEOGRAPH
+ 0xEA82: 0x965A, //CJK UNIFIED IDEOGRAPH
+ 0xEA83: 0x965C, //CJK UNIFIED IDEOGRAPH
+ 0xEA84: 0x965D, //CJK UNIFIED IDEOGRAPH
+ 0xEA85: 0x965E, //CJK UNIFIED IDEOGRAPH
+ 0xEA86: 0x9660, //CJK UNIFIED IDEOGRAPH
+ 0xEA87: 0x9663, //CJK UNIFIED IDEOGRAPH
+ 0xEA88: 0x9665, //CJK UNIFIED IDEOGRAPH
+ 0xEA89: 0x9666, //CJK UNIFIED IDEOGRAPH
+ 0xEA8A: 0x966B, //CJK UNIFIED IDEOGRAPH
+ 0xEA8B: 0x966D, //CJK UNIFIED IDEOGRAPH
+ 0xEA8C: 0x966E, //CJK UNIFIED IDEOGRAPH
+ 0xEA8D: 0x966F, //CJK UNIFIED IDEOGRAPH
+ 0xEA8E: 0x9670, //CJK UNIFIED IDEOGRAPH
+ 0xEA8F: 0x9671, //CJK UNIFIED IDEOGRAPH
+ 0xEA90: 0x9673, //CJK UNIFIED IDEOGRAPH
+ 0xEA91: 0x9678, //CJK UNIFIED IDEOGRAPH
+ 0xEA92: 0x9679, //CJK UNIFIED IDEOGRAPH
+ 0xEA93: 0x967A, //CJK UNIFIED IDEOGRAPH
+ 0xEA94: 0x967B, //CJK UNIFIED IDEOGRAPH
+ 0xEA95: 0x967C, //CJK UNIFIED IDEOGRAPH
+ 0xEA96: 0x967D, //CJK UNIFIED IDEOGRAPH
+ 0xEA97: 0x967E, //CJK UNIFIED IDEOGRAPH
+ 0xEA98: 0x967F, //CJK UNIFIED IDEOGRAPH
+ 0xEA99: 0x9680, //CJK UNIFIED IDEOGRAPH
+ 0xEA9A: 0x9681, //CJK UNIFIED IDEOGRAPH
+ 0xEA9B: 0x9682, //CJK UNIFIED IDEOGRAPH
+ 0xEA9C: 0x9683, //CJK UNIFIED IDEOGRAPH
+ 0xEA9D: 0x9684, //CJK UNIFIED IDEOGRAPH
+ 0xEA9E: 0x9687, //CJK UNIFIED IDEOGRAPH
+ 0xEA9F: 0x9689, //CJK UNIFIED IDEOGRAPH
+ 0xEAA0: 0x968A, //CJK UNIFIED IDEOGRAPH
+ 0xEAA1: 0x8F8D, //CJK UNIFIED IDEOGRAPH
+ 0xEAA2: 0x8F8E, //CJK UNIFIED IDEOGRAPH
+ 0xEAA3: 0x8F8F, //CJK UNIFIED IDEOGRAPH
+ 0xEAA4: 0x8F98, //CJK UNIFIED IDEOGRAPH
+ 0xEAA5: 0x8F9A, //CJK UNIFIED IDEOGRAPH
+ 0xEAA6: 0x8ECE, //CJK UNIFIED IDEOGRAPH
+ 0xEAA7: 0x620B, //CJK UNIFIED IDEOGRAPH
+ 0xEAA8: 0x6217, //CJK UNIFIED IDEOGRAPH
+ 0xEAA9: 0x621B, //CJK UNIFIED IDEOGRAPH
+ 0xEAAA: 0x621F, //CJK UNIFIED IDEOGRAPH
+ 0xEAAB: 0x6222, //CJK UNIFIED IDEOGRAPH
+ 0xEAAC: 0x6221, //CJK UNIFIED IDEOGRAPH
+ 0xEAAD: 0x6225, //CJK UNIFIED IDEOGRAPH
+ 0xEAAE: 0x6224, //CJK UNIFIED IDEOGRAPH
+ 0xEAAF: 0x622C, //CJK UNIFIED IDEOGRAPH
+ 0xEAB0: 0x81E7, //CJK UNIFIED IDEOGRAPH
+ 0xEAB1: 0x74EF, //CJK UNIFIED IDEOGRAPH
+ 0xEAB2: 0x74F4, //CJK UNIFIED IDEOGRAPH
+ 0xEAB3: 0x74FF, //CJK UNIFIED IDEOGRAPH
+ 0xEAB4: 0x750F, //CJK UNIFIED IDEOGRAPH
+ 0xEAB5: 0x7511, //CJK UNIFIED IDEOGRAPH
+ 0xEAB6: 0x7513, //CJK UNIFIED IDEOGRAPH
+ 0xEAB7: 0x6534, //CJK UNIFIED IDEOGRAPH
+ 0xEAB8: 0x65EE, //CJK UNIFIED IDEOGRAPH
+ 0xEAB9: 0x65EF, //CJK UNIFIED IDEOGRAPH
+ 0xEABA: 0x65F0, //CJK UNIFIED IDEOGRAPH
+ 0xEABB: 0x660A, //CJK UNIFIED IDEOGRAPH
+ 0xEABC: 0x6619, //CJK UNIFIED IDEOGRAPH
+ 0xEABD: 0x6772, //CJK UNIFIED IDEOGRAPH
+ 0xEABE: 0x6603, //CJK UNIFIED IDEOGRAPH
+ 0xEABF: 0x6615, //CJK UNIFIED IDEOGRAPH
+ 0xEAC0: 0x6600, //CJK UNIFIED IDEOGRAPH
+ 0xEAC1: 0x7085, //CJK UNIFIED IDEOGRAPH
+ 0xEAC2: 0x66F7, //CJK UNIFIED IDEOGRAPH
+ 0xEAC3: 0x661D, //CJK UNIFIED IDEOGRAPH
+ 0xEAC4: 0x6634, //CJK UNIFIED IDEOGRAPH
+ 0xEAC5: 0x6631, //CJK UNIFIED IDEOGRAPH
+ 0xEAC6: 0x6636, //CJK UNIFIED IDEOGRAPH
+ 0xEAC7: 0x6635, //CJK UNIFIED IDEOGRAPH
+ 0xEAC8: 0x8006, //CJK UNIFIED IDEOGRAPH
+ 0xEAC9: 0x665F, //CJK UNIFIED IDEOGRAPH
+ 0xEACA: 0x6654, //CJK UNIFIED IDEOGRAPH
+ 0xEACB: 0x6641, //CJK UNIFIED IDEOGRAPH
+ 0xEACC: 0x664F, //CJK UNIFIED IDEOGRAPH
+ 0xEACD: 0x6656, //CJK UNIFIED IDEOGRAPH
+ 0xEACE: 0x6661, //CJK UNIFIED IDEOGRAPH
+ 0xEACF: 0x6657, //CJK UNIFIED IDEOGRAPH
+ 0xEAD0: 0x6677, //CJK UNIFIED IDEOGRAPH
+ 0xEAD1: 0x6684, //CJK UNIFIED IDEOGRAPH
+ 0xEAD2: 0x668C, //CJK UNIFIED IDEOGRAPH
+ 0xEAD3: 0x66A7, //CJK UNIFIED IDEOGRAPH
+ 0xEAD4: 0x669D, //CJK UNIFIED IDEOGRAPH
+ 0xEAD5: 0x66BE, //CJK UNIFIED IDEOGRAPH
+ 0xEAD6: 0x66DB, //CJK UNIFIED IDEOGRAPH
+ 0xEAD7: 0x66DC, //CJK UNIFIED IDEOGRAPH
+ 0xEAD8: 0x66E6, //CJK UNIFIED IDEOGRAPH
+ 0xEAD9: 0x66E9, //CJK UNIFIED IDEOGRAPH
+ 0xEADA: 0x8D32, //CJK UNIFIED IDEOGRAPH
+ 0xEADB: 0x8D33, //CJK UNIFIED IDEOGRAPH
+ 0xEADC: 0x8D36, //CJK UNIFIED IDEOGRAPH
+ 0xEADD: 0x8D3B, //CJK UNIFIED IDEOGRAPH
+ 0xEADE: 0x8D3D, //CJK UNIFIED IDEOGRAPH
+ 0xEADF: 0x8D40, //CJK UNIFIED IDEOGRAPH
+ 0xEAE0: 0x8D45, //CJK UNIFIED IDEOGRAPH
+ 0xEAE1: 0x8D46, //CJK UNIFIED IDEOGRAPH
+ 0xEAE2: 0x8D48, //CJK UNIFIED IDEOGRAPH
+ 0xEAE3: 0x8D49, //CJK UNIFIED IDEOGRAPH
+ 0xEAE4: 0x8D47, //CJK UNIFIED IDEOGRAPH
+ 0xEAE5: 0x8D4D, //CJK UNIFIED IDEOGRAPH
+ 0xEAE6: 0x8D55, //CJK UNIFIED IDEOGRAPH
+ 0xEAE7: 0x8D59, //CJK UNIFIED IDEOGRAPH
+ 0xEAE8: 0x89C7, //CJK UNIFIED IDEOGRAPH
+ 0xEAE9: 0x89CA, //CJK UNIFIED IDEOGRAPH
+ 0xEAEA: 0x89CB, //CJK UNIFIED IDEOGRAPH
+ 0xEAEB: 0x89CC, //CJK UNIFIED IDEOGRAPH
+ 0xEAEC: 0x89CE, //CJK UNIFIED IDEOGRAPH
+ 0xEAED: 0x89CF, //CJK UNIFIED IDEOGRAPH
+ 0xEAEE: 0x89D0, //CJK UNIFIED IDEOGRAPH
+ 0xEAEF: 0x89D1, //CJK UNIFIED IDEOGRAPH
+ 0xEAF0: 0x726E, //CJK UNIFIED IDEOGRAPH
+ 0xEAF1: 0x729F, //CJK UNIFIED IDEOGRAPH
+ 0xEAF2: 0x725D, //CJK UNIFIED IDEOGRAPH
+ 0xEAF3: 0x7266, //CJK UNIFIED IDEOGRAPH
+ 0xEAF4: 0x726F, //CJK UNIFIED IDEOGRAPH
+ 0xEAF5: 0x727E, //CJK UNIFIED IDEOGRAPH
+ 0xEAF6: 0x727F, //CJK UNIFIED IDEOGRAPH
+ 0xEAF7: 0x7284, //CJK UNIFIED IDEOGRAPH
+ 0xEAF8: 0x728B, //CJK UNIFIED IDEOGRAPH
+ 0xEAF9: 0x728D, //CJK UNIFIED IDEOGRAPH
+ 0xEAFA: 0x728F, //CJK UNIFIED IDEOGRAPH
+ 0xEAFB: 0x7292, //CJK UNIFIED IDEOGRAPH
+ 0xEAFC: 0x6308, //CJK UNIFIED IDEOGRAPH
+ 0xEAFD: 0x6332, //CJK UNIFIED IDEOGRAPH
+ 0xEAFE: 0x63B0, //CJK UNIFIED IDEOGRAPH
+ 0xEB40: 0x968C, //CJK UNIFIED IDEOGRAPH
+ 0xEB41: 0x968E, //CJK UNIFIED IDEOGRAPH
+ 0xEB42: 0x9691, //CJK UNIFIED IDEOGRAPH
+ 0xEB43: 0x9692, //CJK UNIFIED IDEOGRAPH
+ 0xEB44: 0x9693, //CJK UNIFIED IDEOGRAPH
+ 0xEB45: 0x9695, //CJK UNIFIED IDEOGRAPH
+ 0xEB46: 0x9696, //CJK UNIFIED IDEOGRAPH
+ 0xEB47: 0x969A, //CJK UNIFIED IDEOGRAPH
+ 0xEB48: 0x969B, //CJK UNIFIED IDEOGRAPH
+ 0xEB49: 0x969D, //CJK UNIFIED IDEOGRAPH
+ 0xEB4A: 0x969E, //CJK UNIFIED IDEOGRAPH
+ 0xEB4B: 0x969F, //CJK UNIFIED IDEOGRAPH
+ 0xEB4C: 0x96A0, //CJK UNIFIED IDEOGRAPH
+ 0xEB4D: 0x96A1, //CJK UNIFIED IDEOGRAPH
+ 0xEB4E: 0x96A2, //CJK UNIFIED IDEOGRAPH
+ 0xEB4F: 0x96A3, //CJK UNIFIED IDEOGRAPH
+ 0xEB50: 0x96A4, //CJK UNIFIED IDEOGRAPH
+ 0xEB51: 0x96A5, //CJK UNIFIED IDEOGRAPH
+ 0xEB52: 0x96A6, //CJK UNIFIED IDEOGRAPH
+ 0xEB53: 0x96A8, //CJK UNIFIED IDEOGRAPH
+ 0xEB54: 0x96A9, //CJK UNIFIED IDEOGRAPH
+ 0xEB55: 0x96AA, //CJK UNIFIED IDEOGRAPH
+ 0xEB56: 0x96AB, //CJK UNIFIED IDEOGRAPH
+ 0xEB57: 0x96AC, //CJK UNIFIED IDEOGRAPH
+ 0xEB58: 0x96AD, //CJK UNIFIED IDEOGRAPH
+ 0xEB59: 0x96AE, //CJK UNIFIED IDEOGRAPH
+ 0xEB5A: 0x96AF, //CJK UNIFIED IDEOGRAPH
+ 0xEB5B: 0x96B1, //CJK UNIFIED IDEOGRAPH
+ 0xEB5C: 0x96B2, //CJK UNIFIED IDEOGRAPH
+ 0xEB5D: 0x96B4, //CJK UNIFIED IDEOGRAPH
+ 0xEB5E: 0x96B5, //CJK UNIFIED IDEOGRAPH
+ 0xEB5F: 0x96B7, //CJK UNIFIED IDEOGRAPH
+ 0xEB60: 0x96B8, //CJK UNIFIED IDEOGRAPH
+ 0xEB61: 0x96BA, //CJK UNIFIED IDEOGRAPH
+ 0xEB62: 0x96BB, //CJK UNIFIED IDEOGRAPH
+ 0xEB63: 0x96BF, //CJK UNIFIED IDEOGRAPH
+ 0xEB64: 0x96C2, //CJK UNIFIED IDEOGRAPH
+ 0xEB65: 0x96C3, //CJK UNIFIED IDEOGRAPH
+ 0xEB66: 0x96C8, //CJK UNIFIED IDEOGRAPH
+ 0xEB67: 0x96CA, //CJK UNIFIED IDEOGRAPH
+ 0xEB68: 0x96CB, //CJK UNIFIED IDEOGRAPH
+ 0xEB69: 0x96D0, //CJK UNIFIED IDEOGRAPH
+ 0xEB6A: 0x96D1, //CJK UNIFIED IDEOGRAPH
+ 0xEB6B: 0x96D3, //CJK UNIFIED IDEOGRAPH
+ 0xEB6C: 0x96D4, //CJK UNIFIED IDEOGRAPH
+ 0xEB6D: 0x96D6, //CJK UNIFIED IDEOGRAPH
+ 0xEB6E: 0x96D7, //CJK UNIFIED IDEOGRAPH
+ 0xEB6F: 0x96D8, //CJK UNIFIED IDEOGRAPH
+ 0xEB70: 0x96D9, //CJK UNIFIED IDEOGRAPH
+ 0xEB71: 0x96DA, //CJK UNIFIED IDEOGRAPH
+ 0xEB72: 0x96DB, //CJK UNIFIED IDEOGRAPH
+ 0xEB73: 0x96DC, //CJK UNIFIED IDEOGRAPH
+ 0xEB74: 0x96DD, //CJK UNIFIED IDEOGRAPH
+ 0xEB75: 0x96DE, //CJK UNIFIED IDEOGRAPH
+ 0xEB76: 0x96DF, //CJK UNIFIED IDEOGRAPH
+ 0xEB77: 0x96E1, //CJK UNIFIED IDEOGRAPH
+ 0xEB78: 0x96E2, //CJK UNIFIED IDEOGRAPH
+ 0xEB79: 0x96E3, //CJK UNIFIED IDEOGRAPH
+ 0xEB7A: 0x96E4, //CJK UNIFIED IDEOGRAPH
+ 0xEB7B: 0x96E5, //CJK UNIFIED IDEOGRAPH
+ 0xEB7C: 0x96E6, //CJK UNIFIED IDEOGRAPH
+ 0xEB7D: 0x96E7, //CJK UNIFIED IDEOGRAPH
+ 0xEB7E: 0x96EB, //CJK UNIFIED IDEOGRAPH
+ 0xEB80: 0x96EC, //CJK UNIFIED IDEOGRAPH
+ 0xEB81: 0x96ED, //CJK UNIFIED IDEOGRAPH
+ 0xEB82: 0x96EE, //CJK UNIFIED IDEOGRAPH
+ 0xEB83: 0x96F0, //CJK UNIFIED IDEOGRAPH
+ 0xEB84: 0x96F1, //CJK UNIFIED IDEOGRAPH
+ 0xEB85: 0x96F2, //CJK UNIFIED IDEOGRAPH
+ 0xEB86: 0x96F4, //CJK UNIFIED IDEOGRAPH
+ 0xEB87: 0x96F5, //CJK UNIFIED IDEOGRAPH
+ 0xEB88: 0x96F8, //CJK UNIFIED IDEOGRAPH
+ 0xEB89: 0x96FA, //CJK UNIFIED IDEOGRAPH
+ 0xEB8A: 0x96FB, //CJK UNIFIED IDEOGRAPH
+ 0xEB8B: 0x96FC, //CJK UNIFIED IDEOGRAPH
+ 0xEB8C: 0x96FD, //CJK UNIFIED IDEOGRAPH
+ 0xEB8D: 0x96FF, //CJK UNIFIED IDEOGRAPH
+ 0xEB8E: 0x9702, //CJK UNIFIED IDEOGRAPH
+ 0xEB8F: 0x9703, //CJK UNIFIED IDEOGRAPH
+ 0xEB90: 0x9705, //CJK UNIFIED IDEOGRAPH
+ 0xEB91: 0x970A, //CJK UNIFIED IDEOGRAPH
+ 0xEB92: 0x970B, //CJK UNIFIED IDEOGRAPH
+ 0xEB93: 0x970C, //CJK UNIFIED IDEOGRAPH
+ 0xEB94: 0x9710, //CJK UNIFIED IDEOGRAPH
+ 0xEB95: 0x9711, //CJK UNIFIED IDEOGRAPH
+ 0xEB96: 0x9712, //CJK UNIFIED IDEOGRAPH
+ 0xEB97: 0x9714, //CJK UNIFIED IDEOGRAPH
+ 0xEB98: 0x9715, //CJK UNIFIED IDEOGRAPH
+ 0xEB99: 0x9717, //CJK UNIFIED IDEOGRAPH
+ 0xEB9A: 0x9718, //CJK UNIFIED IDEOGRAPH
+ 0xEB9B: 0x9719, //CJK UNIFIED IDEOGRAPH
+ 0xEB9C: 0x971A, //CJK UNIFIED IDEOGRAPH
+ 0xEB9D: 0x971B, //CJK UNIFIED IDEOGRAPH
+ 0xEB9E: 0x971D, //CJK UNIFIED IDEOGRAPH
+ 0xEB9F: 0x971F, //CJK UNIFIED IDEOGRAPH
+ 0xEBA0: 0x9720, //CJK UNIFIED IDEOGRAPH
+ 0xEBA1: 0x643F, //CJK UNIFIED IDEOGRAPH
+ 0xEBA2: 0x64D8, //CJK UNIFIED IDEOGRAPH
+ 0xEBA3: 0x8004, //CJK UNIFIED IDEOGRAPH
+ 0xEBA4: 0x6BEA, //CJK UNIFIED IDEOGRAPH
+ 0xEBA5: 0x6BF3, //CJK UNIFIED IDEOGRAPH
+ 0xEBA6: 0x6BFD, //CJK UNIFIED IDEOGRAPH
+ 0xEBA7: 0x6BF5, //CJK UNIFIED IDEOGRAPH
+ 0xEBA8: 0x6BF9, //CJK UNIFIED IDEOGRAPH
+ 0xEBA9: 0x6C05, //CJK UNIFIED IDEOGRAPH
+ 0xEBAA: 0x6C07, //CJK UNIFIED IDEOGRAPH
+ 0xEBAB: 0x6C06, //CJK UNIFIED IDEOGRAPH
+ 0xEBAC: 0x6C0D, //CJK UNIFIED IDEOGRAPH
+ 0xEBAD: 0x6C15, //CJK UNIFIED IDEOGRAPH
+ 0xEBAE: 0x6C18, //CJK UNIFIED IDEOGRAPH
+ 0xEBAF: 0x6C19, //CJK UNIFIED IDEOGRAPH
+ 0xEBB0: 0x6C1A, //CJK UNIFIED IDEOGRAPH
+ 0xEBB1: 0x6C21, //CJK UNIFIED IDEOGRAPH
+ 0xEBB2: 0x6C29, //CJK UNIFIED IDEOGRAPH
+ 0xEBB3: 0x6C24, //CJK UNIFIED IDEOGRAPH
+ 0xEBB4: 0x6C2A, //CJK UNIFIED IDEOGRAPH
+ 0xEBB5: 0x6C32, //CJK UNIFIED IDEOGRAPH
+ 0xEBB6: 0x6535, //CJK UNIFIED IDEOGRAPH
+ 0xEBB7: 0x6555, //CJK UNIFIED IDEOGRAPH
+ 0xEBB8: 0x656B, //CJK UNIFIED IDEOGRAPH
+ 0xEBB9: 0x724D, //CJK UNIFIED IDEOGRAPH
+ 0xEBBA: 0x7252, //CJK UNIFIED IDEOGRAPH
+ 0xEBBB: 0x7256, //CJK UNIFIED IDEOGRAPH
+ 0xEBBC: 0x7230, //CJK UNIFIED IDEOGRAPH
+ 0xEBBD: 0x8662, //CJK UNIFIED IDEOGRAPH
+ 0xEBBE: 0x5216, //CJK UNIFIED IDEOGRAPH
+ 0xEBBF: 0x809F, //CJK UNIFIED IDEOGRAPH
+ 0xEBC0: 0x809C, //CJK UNIFIED IDEOGRAPH
+ 0xEBC1: 0x8093, //CJK UNIFIED IDEOGRAPH
+ 0xEBC2: 0x80BC, //CJK UNIFIED IDEOGRAPH
+ 0xEBC3: 0x670A, //CJK UNIFIED IDEOGRAPH
+ 0xEBC4: 0x80BD, //CJK UNIFIED IDEOGRAPH
+ 0xEBC5: 0x80B1, //CJK UNIFIED IDEOGRAPH
+ 0xEBC6: 0x80AB, //CJK UNIFIED IDEOGRAPH
+ 0xEBC7: 0x80AD, //CJK UNIFIED IDEOGRAPH
+ 0xEBC8: 0x80B4, //CJK UNIFIED IDEOGRAPH
+ 0xEBC9: 0x80B7, //CJK UNIFIED IDEOGRAPH
+ 0xEBCA: 0x80E7, //CJK UNIFIED IDEOGRAPH
+ 0xEBCB: 0x80E8, //CJK UNIFIED IDEOGRAPH
+ 0xEBCC: 0x80E9, //CJK UNIFIED IDEOGRAPH
+ 0xEBCD: 0x80EA, //CJK UNIFIED IDEOGRAPH
+ 0xEBCE: 0x80DB, //CJK UNIFIED IDEOGRAPH
+ 0xEBCF: 0x80C2, //CJK UNIFIED IDEOGRAPH
+ 0xEBD0: 0x80C4, //CJK UNIFIED IDEOGRAPH
+ 0xEBD1: 0x80D9, //CJK UNIFIED IDEOGRAPH
+ 0xEBD2: 0x80CD, //CJK UNIFIED IDEOGRAPH
+ 0xEBD3: 0x80D7, //CJK UNIFIED IDEOGRAPH
+ 0xEBD4: 0x6710, //CJK UNIFIED IDEOGRAPH
+ 0xEBD5: 0x80DD, //CJK UNIFIED IDEOGRAPH
+ 0xEBD6: 0x80EB, //CJK UNIFIED IDEOGRAPH
+ 0xEBD7: 0x80F1, //CJK UNIFIED IDEOGRAPH
+ 0xEBD8: 0x80F4, //CJK UNIFIED IDEOGRAPH
+ 0xEBD9: 0x80ED, //CJK UNIFIED IDEOGRAPH
+ 0xEBDA: 0x810D, //CJK UNIFIED IDEOGRAPH
+ 0xEBDB: 0x810E, //CJK UNIFIED IDEOGRAPH
+ 0xEBDC: 0x80F2, //CJK UNIFIED IDEOGRAPH
+ 0xEBDD: 0x80FC, //CJK UNIFIED IDEOGRAPH
+ 0xEBDE: 0x6715, //CJK UNIFIED IDEOGRAPH
+ 0xEBDF: 0x8112, //CJK UNIFIED IDEOGRAPH
+ 0xEBE0: 0x8C5A, //CJK UNIFIED IDEOGRAPH
+ 0xEBE1: 0x8136, //CJK UNIFIED IDEOGRAPH
+ 0xEBE2: 0x811E, //CJK UNIFIED IDEOGRAPH
+ 0xEBE3: 0x812C, //CJK UNIFIED IDEOGRAPH
+ 0xEBE4: 0x8118, //CJK UNIFIED IDEOGRAPH
+ 0xEBE5: 0x8132, //CJK UNIFIED IDEOGRAPH
+ 0xEBE6: 0x8148, //CJK UNIFIED IDEOGRAPH
+ 0xEBE7: 0x814C, //CJK UNIFIED IDEOGRAPH
+ 0xEBE8: 0x8153, //CJK UNIFIED IDEOGRAPH
+ 0xEBE9: 0x8174, //CJK UNIFIED IDEOGRAPH
+ 0xEBEA: 0x8159, //CJK UNIFIED IDEOGRAPH
+ 0xEBEB: 0x815A, //CJK UNIFIED IDEOGRAPH
+ 0xEBEC: 0x8171, //CJK UNIFIED IDEOGRAPH
+ 0xEBED: 0x8160, //CJK UNIFIED IDEOGRAPH
+ 0xEBEE: 0x8169, //CJK UNIFIED IDEOGRAPH
+ 0xEBEF: 0x817C, //CJK UNIFIED IDEOGRAPH
+ 0xEBF0: 0x817D, //CJK UNIFIED IDEOGRAPH
+ 0xEBF1: 0x816D, //CJK UNIFIED IDEOGRAPH
+ 0xEBF2: 0x8167, //CJK UNIFIED IDEOGRAPH
+ 0xEBF3: 0x584D, //CJK UNIFIED IDEOGRAPH
+ 0xEBF4: 0x5AB5, //CJK UNIFIED IDEOGRAPH
+ 0xEBF5: 0x8188, //CJK UNIFIED IDEOGRAPH
+ 0xEBF6: 0x8182, //CJK UNIFIED IDEOGRAPH
+ 0xEBF7: 0x8191, //CJK UNIFIED IDEOGRAPH
+ 0xEBF8: 0x6ED5, //CJK UNIFIED IDEOGRAPH
+ 0xEBF9: 0x81A3, //CJK UNIFIED IDEOGRAPH
+ 0xEBFA: 0x81AA, //CJK UNIFIED IDEOGRAPH
+ 0xEBFB: 0x81CC, //CJK UNIFIED IDEOGRAPH
+ 0xEBFC: 0x6726, //CJK UNIFIED IDEOGRAPH
+ 0xEBFD: 0x81CA, //CJK UNIFIED IDEOGRAPH
+ 0xEBFE: 0x81BB, //CJK UNIFIED IDEOGRAPH
+ 0xEC40: 0x9721, //CJK UNIFIED IDEOGRAPH
+ 0xEC41: 0x9722, //CJK UNIFIED IDEOGRAPH
+ 0xEC42: 0x9723, //CJK UNIFIED IDEOGRAPH
+ 0xEC43: 0x9724, //CJK UNIFIED IDEOGRAPH
+ 0xEC44: 0x9725, //CJK UNIFIED IDEOGRAPH
+ 0xEC45: 0x9726, //CJK UNIFIED IDEOGRAPH
+ 0xEC46: 0x9727, //CJK UNIFIED IDEOGRAPH
+ 0xEC47: 0x9728, //CJK UNIFIED IDEOGRAPH
+ 0xEC48: 0x9729, //CJK UNIFIED IDEOGRAPH
+ 0xEC49: 0x972B, //CJK UNIFIED IDEOGRAPH
+ 0xEC4A: 0x972C, //CJK UNIFIED IDEOGRAPH
+ 0xEC4B: 0x972E, //CJK UNIFIED IDEOGRAPH
+ 0xEC4C: 0x972F, //CJK UNIFIED IDEOGRAPH
+ 0xEC4D: 0x9731, //CJK UNIFIED IDEOGRAPH
+ 0xEC4E: 0x9733, //CJK UNIFIED IDEOGRAPH
+ 0xEC4F: 0x9734, //CJK UNIFIED IDEOGRAPH
+ 0xEC50: 0x9735, //CJK UNIFIED IDEOGRAPH
+ 0xEC51: 0x9736, //CJK UNIFIED IDEOGRAPH
+ 0xEC52: 0x9737, //CJK UNIFIED IDEOGRAPH
+ 0xEC53: 0x973A, //CJK UNIFIED IDEOGRAPH
+ 0xEC54: 0x973B, //CJK UNIFIED IDEOGRAPH
+ 0xEC55: 0x973C, //CJK UNIFIED IDEOGRAPH
+ 0xEC56: 0x973D, //CJK UNIFIED IDEOGRAPH
+ 0xEC57: 0x973F, //CJK UNIFIED IDEOGRAPH
+ 0xEC58: 0x9740, //CJK UNIFIED IDEOGRAPH
+ 0xEC59: 0x9741, //CJK UNIFIED IDEOGRAPH
+ 0xEC5A: 0x9742, //CJK UNIFIED IDEOGRAPH
+ 0xEC5B: 0x9743, //CJK UNIFIED IDEOGRAPH
+ 0xEC5C: 0x9744, //CJK UNIFIED IDEOGRAPH
+ 0xEC5D: 0x9745, //CJK UNIFIED IDEOGRAPH
+ 0xEC5E: 0x9746, //CJK UNIFIED IDEOGRAPH
+ 0xEC5F: 0x9747, //CJK UNIFIED IDEOGRAPH
+ 0xEC60: 0x9748, //CJK UNIFIED IDEOGRAPH
+ 0xEC61: 0x9749, //CJK UNIFIED IDEOGRAPH
+ 0xEC62: 0x974A, //CJK UNIFIED IDEOGRAPH
+ 0xEC63: 0x974B, //CJK UNIFIED IDEOGRAPH
+ 0xEC64: 0x974C, //CJK UNIFIED IDEOGRAPH
+ 0xEC65: 0x974D, //CJK UNIFIED IDEOGRAPH
+ 0xEC66: 0x974E, //CJK UNIFIED IDEOGRAPH
+ 0xEC67: 0x974F, //CJK UNIFIED IDEOGRAPH
+ 0xEC68: 0x9750, //CJK UNIFIED IDEOGRAPH
+ 0xEC69: 0x9751, //CJK UNIFIED IDEOGRAPH
+ 0xEC6A: 0x9754, //CJK UNIFIED IDEOGRAPH
+ 0xEC6B: 0x9755, //CJK UNIFIED IDEOGRAPH
+ 0xEC6C: 0x9757, //CJK UNIFIED IDEOGRAPH
+ 0xEC6D: 0x9758, //CJK UNIFIED IDEOGRAPH
+ 0xEC6E: 0x975A, //CJK UNIFIED IDEOGRAPH
+ 0xEC6F: 0x975C, //CJK UNIFIED IDEOGRAPH
+ 0xEC70: 0x975D, //CJK UNIFIED IDEOGRAPH
+ 0xEC71: 0x975F, //CJK UNIFIED IDEOGRAPH
+ 0xEC72: 0x9763, //CJK UNIFIED IDEOGRAPH
+ 0xEC73: 0x9764, //CJK UNIFIED IDEOGRAPH
+ 0xEC74: 0x9766, //CJK UNIFIED IDEOGRAPH
+ 0xEC75: 0x9767, //CJK UNIFIED IDEOGRAPH
+ 0xEC76: 0x9768, //CJK UNIFIED IDEOGRAPH
+ 0xEC77: 0x976A, //CJK UNIFIED IDEOGRAPH
+ 0xEC78: 0x976B, //CJK UNIFIED IDEOGRAPH
+ 0xEC79: 0x976C, //CJK UNIFIED IDEOGRAPH
+ 0xEC7A: 0x976D, //CJK UNIFIED IDEOGRAPH
+ 0xEC7B: 0x976E, //CJK UNIFIED IDEOGRAPH
+ 0xEC7C: 0x976F, //CJK UNIFIED IDEOGRAPH
+ 0xEC7D: 0x9770, //CJK UNIFIED IDEOGRAPH
+ 0xEC7E: 0x9771, //CJK UNIFIED IDEOGRAPH
+ 0xEC80: 0x9772, //CJK UNIFIED IDEOGRAPH
+ 0xEC81: 0x9775, //CJK UNIFIED IDEOGRAPH
+ 0xEC82: 0x9777, //CJK UNIFIED IDEOGRAPH
+ 0xEC83: 0x9778, //CJK UNIFIED IDEOGRAPH
+ 0xEC84: 0x9779, //CJK UNIFIED IDEOGRAPH
+ 0xEC85: 0x977A, //CJK UNIFIED IDEOGRAPH
+ 0xEC86: 0x977B, //CJK UNIFIED IDEOGRAPH
+ 0xEC87: 0x977D, //CJK UNIFIED IDEOGRAPH
+ 0xEC88: 0x977E, //CJK UNIFIED IDEOGRAPH
+ 0xEC89: 0x977F, //CJK UNIFIED IDEOGRAPH
+ 0xEC8A: 0x9780, //CJK UNIFIED IDEOGRAPH
+ 0xEC8B: 0x9781, //CJK UNIFIED IDEOGRAPH
+ 0xEC8C: 0x9782, //CJK UNIFIED IDEOGRAPH
+ 0xEC8D: 0x9783, //CJK UNIFIED IDEOGRAPH
+ 0xEC8E: 0x9784, //CJK UNIFIED IDEOGRAPH
+ 0xEC8F: 0x9786, //CJK UNIFIED IDEOGRAPH
+ 0xEC90: 0x9787, //CJK UNIFIED IDEOGRAPH
+ 0xEC91: 0x9788, //CJK UNIFIED IDEOGRAPH
+ 0xEC92: 0x9789, //CJK UNIFIED IDEOGRAPH
+ 0xEC93: 0x978A, //CJK UNIFIED IDEOGRAPH
+ 0xEC94: 0x978C, //CJK UNIFIED IDEOGRAPH
+ 0xEC95: 0x978E, //CJK UNIFIED IDEOGRAPH
+ 0xEC96: 0x978F, //CJK UNIFIED IDEOGRAPH
+ 0xEC97: 0x9790, //CJK UNIFIED IDEOGRAPH
+ 0xEC98: 0x9793, //CJK UNIFIED IDEOGRAPH
+ 0xEC99: 0x9795, //CJK UNIFIED IDEOGRAPH
+ 0xEC9A: 0x9796, //CJK UNIFIED IDEOGRAPH
+ 0xEC9B: 0x9797, //CJK UNIFIED IDEOGRAPH
+ 0xEC9C: 0x9799, //CJK UNIFIED IDEOGRAPH
+ 0xEC9D: 0x979A, //CJK UNIFIED IDEOGRAPH
+ 0xEC9E: 0x979B, //CJK UNIFIED IDEOGRAPH
+ 0xEC9F: 0x979C, //CJK UNIFIED IDEOGRAPH
+ 0xECA0: 0x979D, //CJK UNIFIED IDEOGRAPH
+ 0xECA1: 0x81C1, //CJK UNIFIED IDEOGRAPH
+ 0xECA2: 0x81A6, //CJK UNIFIED IDEOGRAPH
+ 0xECA3: 0x6B24, //CJK UNIFIED IDEOGRAPH
+ 0xECA4: 0x6B37, //CJK UNIFIED IDEOGRAPH
+ 0xECA5: 0x6B39, //CJK UNIFIED IDEOGRAPH
+ 0xECA6: 0x6B43, //CJK UNIFIED IDEOGRAPH
+ 0xECA7: 0x6B46, //CJK UNIFIED IDEOGRAPH
+ 0xECA8: 0x6B59, //CJK UNIFIED IDEOGRAPH
+ 0xECA9: 0x98D1, //CJK UNIFIED IDEOGRAPH
+ 0xECAA: 0x98D2, //CJK UNIFIED IDEOGRAPH
+ 0xECAB: 0x98D3, //CJK UNIFIED IDEOGRAPH
+ 0xECAC: 0x98D5, //CJK UNIFIED IDEOGRAPH
+ 0xECAD: 0x98D9, //CJK UNIFIED IDEOGRAPH
+ 0xECAE: 0x98DA, //CJK UNIFIED IDEOGRAPH
+ 0xECAF: 0x6BB3, //CJK UNIFIED IDEOGRAPH
+ 0xECB0: 0x5F40, //CJK UNIFIED IDEOGRAPH
+ 0xECB1: 0x6BC2, //CJK UNIFIED IDEOGRAPH
+ 0xECB2: 0x89F3, //CJK UNIFIED IDEOGRAPH
+ 0xECB3: 0x6590, //CJK UNIFIED IDEOGRAPH
+ 0xECB4: 0x9F51, //CJK UNIFIED IDEOGRAPH
+ 0xECB5: 0x6593, //CJK UNIFIED IDEOGRAPH
+ 0xECB6: 0x65BC, //CJK UNIFIED IDEOGRAPH
+ 0xECB7: 0x65C6, //CJK UNIFIED IDEOGRAPH
+ 0xECB8: 0x65C4, //CJK UNIFIED IDEOGRAPH
+ 0xECB9: 0x65C3, //CJK UNIFIED IDEOGRAPH
+ 0xECBA: 0x65CC, //CJK UNIFIED IDEOGRAPH
+ 0xECBB: 0x65CE, //CJK UNIFIED IDEOGRAPH
+ 0xECBC: 0x65D2, //CJK UNIFIED IDEOGRAPH
+ 0xECBD: 0x65D6, //CJK UNIFIED IDEOGRAPH
+ 0xECBE: 0x7080, //CJK UNIFIED IDEOGRAPH
+ 0xECBF: 0x709C, //CJK UNIFIED IDEOGRAPH
+ 0xECC0: 0x7096, //CJK UNIFIED IDEOGRAPH
+ 0xECC1: 0x709D, //CJK UNIFIED IDEOGRAPH
+ 0xECC2: 0x70BB, //CJK UNIFIED IDEOGRAPH
+ 0xECC3: 0x70C0, //CJK UNIFIED IDEOGRAPH
+ 0xECC4: 0x70B7, //CJK UNIFIED IDEOGRAPH
+ 0xECC5: 0x70AB, //CJK UNIFIED IDEOGRAPH
+ 0xECC6: 0x70B1, //CJK UNIFIED IDEOGRAPH
+ 0xECC7: 0x70E8, //CJK UNIFIED IDEOGRAPH
+ 0xECC8: 0x70CA, //CJK UNIFIED IDEOGRAPH
+ 0xECC9: 0x7110, //CJK UNIFIED IDEOGRAPH
+ 0xECCA: 0x7113, //CJK UNIFIED IDEOGRAPH
+ 0xECCB: 0x7116, //CJK UNIFIED IDEOGRAPH
+ 0xECCC: 0x712F, //CJK UNIFIED IDEOGRAPH
+ 0xECCD: 0x7131, //CJK UNIFIED IDEOGRAPH
+ 0xECCE: 0x7173, //CJK UNIFIED IDEOGRAPH
+ 0xECCF: 0x715C, //CJK UNIFIED IDEOGRAPH
+ 0xECD0: 0x7168, //CJK UNIFIED IDEOGRAPH
+ 0xECD1: 0x7145, //CJK UNIFIED IDEOGRAPH
+ 0xECD2: 0x7172, //CJK UNIFIED IDEOGRAPH
+ 0xECD3: 0x714A, //CJK UNIFIED IDEOGRAPH
+ 0xECD4: 0x7178, //CJK UNIFIED IDEOGRAPH
+ 0xECD5: 0x717A, //CJK UNIFIED IDEOGRAPH
+ 0xECD6: 0x7198, //CJK UNIFIED IDEOGRAPH
+ 0xECD7: 0x71B3, //CJK UNIFIED IDEOGRAPH
+ 0xECD8: 0x71B5, //CJK UNIFIED IDEOGRAPH
+ 0xECD9: 0x71A8, //CJK UNIFIED IDEOGRAPH
+ 0xECDA: 0x71A0, //CJK UNIFIED IDEOGRAPH
+ 0xECDB: 0x71E0, //CJK UNIFIED IDEOGRAPH
+ 0xECDC: 0x71D4, //CJK UNIFIED IDEOGRAPH
+ 0xECDD: 0x71E7, //CJK UNIFIED IDEOGRAPH
+ 0xECDE: 0x71F9, //CJK UNIFIED IDEOGRAPH
+ 0xECDF: 0x721D, //CJK UNIFIED IDEOGRAPH
+ 0xECE0: 0x7228, //CJK UNIFIED IDEOGRAPH
+ 0xECE1: 0x706C, //CJK UNIFIED IDEOGRAPH
+ 0xECE2: 0x7118, //CJK UNIFIED IDEOGRAPH
+ 0xECE3: 0x7166, //CJK UNIFIED IDEOGRAPH
+ 0xECE4: 0x71B9, //CJK UNIFIED IDEOGRAPH
+ 0xECE5: 0x623E, //CJK UNIFIED IDEOGRAPH
+ 0xECE6: 0x623D, //CJK UNIFIED IDEOGRAPH
+ 0xECE7: 0x6243, //CJK UNIFIED IDEOGRAPH
+ 0xECE8: 0x6248, //CJK UNIFIED IDEOGRAPH
+ 0xECE9: 0x6249, //CJK UNIFIED IDEOGRAPH
+ 0xECEA: 0x793B, //CJK UNIFIED IDEOGRAPH
+ 0xECEB: 0x7940, //CJK UNIFIED IDEOGRAPH
+ 0xECEC: 0x7946, //CJK UNIFIED IDEOGRAPH
+ 0xECED: 0x7949, //CJK UNIFIED IDEOGRAPH
+ 0xECEE: 0x795B, //CJK UNIFIED IDEOGRAPH
+ 0xECEF: 0x795C, //CJK UNIFIED IDEOGRAPH
+ 0xECF0: 0x7953, //CJK UNIFIED IDEOGRAPH
+ 0xECF1: 0x795A, //CJK UNIFIED IDEOGRAPH
+ 0xECF2: 0x7962, //CJK UNIFIED IDEOGRAPH
+ 0xECF3: 0x7957, //CJK UNIFIED IDEOGRAPH
+ 0xECF4: 0x7960, //CJK UNIFIED IDEOGRAPH
+ 0xECF5: 0x796F, //CJK UNIFIED IDEOGRAPH
+ 0xECF6: 0x7967, //CJK UNIFIED IDEOGRAPH
+ 0xECF7: 0x797A, //CJK UNIFIED IDEOGRAPH
+ 0xECF8: 0x7985, //CJK UNIFIED IDEOGRAPH
+ 0xECF9: 0x798A, //CJK UNIFIED IDEOGRAPH
+ 0xECFA: 0x799A, //CJK UNIFIED IDEOGRAPH
+ 0xECFB: 0x79A7, //CJK UNIFIED IDEOGRAPH
+ 0xECFC: 0x79B3, //CJK UNIFIED IDEOGRAPH
+ 0xECFD: 0x5FD1, //CJK UNIFIED IDEOGRAPH
+ 0xECFE: 0x5FD0, //CJK UNIFIED IDEOGRAPH
+ 0xED40: 0x979E, //CJK UNIFIED IDEOGRAPH
+ 0xED41: 0x979F, //CJK UNIFIED IDEOGRAPH
+ 0xED42: 0x97A1, //CJK UNIFIED IDEOGRAPH
+ 0xED43: 0x97A2, //CJK UNIFIED IDEOGRAPH
+ 0xED44: 0x97A4, //CJK UNIFIED IDEOGRAPH
+ 0xED45: 0x97A5, //CJK UNIFIED IDEOGRAPH
+ 0xED46: 0x97A6, //CJK UNIFIED IDEOGRAPH
+ 0xED47: 0x97A7, //CJK UNIFIED IDEOGRAPH
+ 0xED48: 0x97A8, //CJK UNIFIED IDEOGRAPH
+ 0xED49: 0x97A9, //CJK UNIFIED IDEOGRAPH
+ 0xED4A: 0x97AA, //CJK UNIFIED IDEOGRAPH
+ 0xED4B: 0x97AC, //CJK UNIFIED IDEOGRAPH
+ 0xED4C: 0x97AE, //CJK UNIFIED IDEOGRAPH
+ 0xED4D: 0x97B0, //CJK UNIFIED IDEOGRAPH
+ 0xED4E: 0x97B1, //CJK UNIFIED IDEOGRAPH
+ 0xED4F: 0x97B3, //CJK UNIFIED IDEOGRAPH
+ 0xED50: 0x97B5, //CJK UNIFIED IDEOGRAPH
+ 0xED51: 0x97B6, //CJK UNIFIED IDEOGRAPH
+ 0xED52: 0x97B7, //CJK UNIFIED IDEOGRAPH
+ 0xED53: 0x97B8, //CJK UNIFIED IDEOGRAPH
+ 0xED54: 0x97B9, //CJK UNIFIED IDEOGRAPH
+ 0xED55: 0x97BA, //CJK UNIFIED IDEOGRAPH
+ 0xED56: 0x97BB, //CJK UNIFIED IDEOGRAPH
+ 0xED57: 0x97BC, //CJK UNIFIED IDEOGRAPH
+ 0xED58: 0x97BD, //CJK UNIFIED IDEOGRAPH
+ 0xED59: 0x97BE, //CJK UNIFIED IDEOGRAPH
+ 0xED5A: 0x97BF, //CJK UNIFIED IDEOGRAPH
+ 0xED5B: 0x97C0, //CJK UNIFIED IDEOGRAPH
+ 0xED5C: 0x97C1, //CJK UNIFIED IDEOGRAPH
+ 0xED5D: 0x97C2, //CJK UNIFIED IDEOGRAPH
+ 0xED5E: 0x97C3, //CJK UNIFIED IDEOGRAPH
+ 0xED5F: 0x97C4, //CJK UNIFIED IDEOGRAPH
+ 0xED60: 0x97C5, //CJK UNIFIED IDEOGRAPH
+ 0xED61: 0x97C6, //CJK UNIFIED IDEOGRAPH
+ 0xED62: 0x97C7, //CJK UNIFIED IDEOGRAPH
+ 0xED63: 0x97C8, //CJK UNIFIED IDEOGRAPH
+ 0xED64: 0x97C9, //CJK UNIFIED IDEOGRAPH
+ 0xED65: 0x97CA, //CJK UNIFIED IDEOGRAPH
+ 0xED66: 0x97CB, //CJK UNIFIED IDEOGRAPH
+ 0xED67: 0x97CC, //CJK UNIFIED IDEOGRAPH
+ 0xED68: 0x97CD, //CJK UNIFIED IDEOGRAPH
+ 0xED69: 0x97CE, //CJK UNIFIED IDEOGRAPH
+ 0xED6A: 0x97CF, //CJK UNIFIED IDEOGRAPH
+ 0xED6B: 0x97D0, //CJK UNIFIED IDEOGRAPH
+ 0xED6C: 0x97D1, //CJK UNIFIED IDEOGRAPH
+ 0xED6D: 0x97D2, //CJK UNIFIED IDEOGRAPH
+ 0xED6E: 0x97D3, //CJK UNIFIED IDEOGRAPH
+ 0xED6F: 0x97D4, //CJK UNIFIED IDEOGRAPH
+ 0xED70: 0x97D5, //CJK UNIFIED IDEOGRAPH
+ 0xED71: 0x97D6, //CJK UNIFIED IDEOGRAPH
+ 0xED72: 0x97D7, //CJK UNIFIED IDEOGRAPH
+ 0xED73: 0x97D8, //CJK UNIFIED IDEOGRAPH
+ 0xED74: 0x97D9, //CJK UNIFIED IDEOGRAPH
+ 0xED75: 0x97DA, //CJK UNIFIED IDEOGRAPH
+ 0xED76: 0x97DB, //CJK UNIFIED IDEOGRAPH
+ 0xED77: 0x97DC, //CJK UNIFIED IDEOGRAPH
+ 0xED78: 0x97DD, //CJK UNIFIED IDEOGRAPH
+ 0xED79: 0x97DE, //CJK UNIFIED IDEOGRAPH
+ 0xED7A: 0x97DF, //CJK UNIFIED IDEOGRAPH
+ 0xED7B: 0x97E0, //CJK UNIFIED IDEOGRAPH
+ 0xED7C: 0x97E1, //CJK UNIFIED IDEOGRAPH
+ 0xED7D: 0x97E2, //CJK UNIFIED IDEOGRAPH
+ 0xED7E: 0x97E3, //CJK UNIFIED IDEOGRAPH
+ 0xED80: 0x97E4, //CJK UNIFIED IDEOGRAPH
+ 0xED81: 0x97E5, //CJK UNIFIED IDEOGRAPH
+ 0xED82: 0x97E8, //CJK UNIFIED IDEOGRAPH
+ 0xED83: 0x97EE, //CJK UNIFIED IDEOGRAPH
+ 0xED84: 0x97EF, //CJK UNIFIED IDEOGRAPH
+ 0xED85: 0x97F0, //CJK UNIFIED IDEOGRAPH
+ 0xED86: 0x97F1, //CJK UNIFIED IDEOGRAPH
+ 0xED87: 0x97F2, //CJK UNIFIED IDEOGRAPH
+ 0xED88: 0x97F4, //CJK UNIFIED IDEOGRAPH
+ 0xED89: 0x97F7, //CJK UNIFIED IDEOGRAPH
+ 0xED8A: 0x97F8, //CJK UNIFIED IDEOGRAPH
+ 0xED8B: 0x97F9, //CJK UNIFIED IDEOGRAPH
+ 0xED8C: 0x97FA, //CJK UNIFIED IDEOGRAPH
+ 0xED8D: 0x97FB, //CJK UNIFIED IDEOGRAPH
+ 0xED8E: 0x97FC, //CJK UNIFIED IDEOGRAPH
+ 0xED8F: 0x97FD, //CJK UNIFIED IDEOGRAPH
+ 0xED90: 0x97FE, //CJK UNIFIED IDEOGRAPH
+ 0xED91: 0x97FF, //CJK UNIFIED IDEOGRAPH
+ 0xED92: 0x9800, //CJK UNIFIED IDEOGRAPH
+ 0xED93: 0x9801, //CJK UNIFIED IDEOGRAPH
+ 0xED94: 0x9802, //CJK UNIFIED IDEOGRAPH
+ 0xED95: 0x9803, //CJK UNIFIED IDEOGRAPH
+ 0xED96: 0x9804, //CJK UNIFIED IDEOGRAPH
+ 0xED97: 0x9805, //CJK UNIFIED IDEOGRAPH
+ 0xED98: 0x9806, //CJK UNIFIED IDEOGRAPH
+ 0xED99: 0x9807, //CJK UNIFIED IDEOGRAPH
+ 0xED9A: 0x9808, //CJK UNIFIED IDEOGRAPH
+ 0xED9B: 0x9809, //CJK UNIFIED IDEOGRAPH
+ 0xED9C: 0x980A, //CJK UNIFIED IDEOGRAPH
+ 0xED9D: 0x980B, //CJK UNIFIED IDEOGRAPH
+ 0xED9E: 0x980C, //CJK UNIFIED IDEOGRAPH
+ 0xED9F: 0x980D, //CJK UNIFIED IDEOGRAPH
+ 0xEDA0: 0x980E, //CJK UNIFIED IDEOGRAPH
+ 0xEDA1: 0x603C, //CJK UNIFIED IDEOGRAPH
+ 0xEDA2: 0x605D, //CJK UNIFIED IDEOGRAPH
+ 0xEDA3: 0x605A, //CJK UNIFIED IDEOGRAPH
+ 0xEDA4: 0x6067, //CJK UNIFIED IDEOGRAPH
+ 0xEDA5: 0x6041, //CJK UNIFIED IDEOGRAPH
+ 0xEDA6: 0x6059, //CJK UNIFIED IDEOGRAPH
+ 0xEDA7: 0x6063, //CJK UNIFIED IDEOGRAPH
+ 0xEDA8: 0x60AB, //CJK UNIFIED IDEOGRAPH
+ 0xEDA9: 0x6106, //CJK UNIFIED IDEOGRAPH
+ 0xEDAA: 0x610D, //CJK UNIFIED IDEOGRAPH
+ 0xEDAB: 0x615D, //CJK UNIFIED IDEOGRAPH
+ 0xEDAC: 0x61A9, //CJK UNIFIED IDEOGRAPH
+ 0xEDAD: 0x619D, //CJK UNIFIED IDEOGRAPH
+ 0xEDAE: 0x61CB, //CJK UNIFIED IDEOGRAPH
+ 0xEDAF: 0x61D1, //CJK UNIFIED IDEOGRAPH
+ 0xEDB0: 0x6206, //CJK UNIFIED IDEOGRAPH
+ 0xEDB1: 0x8080, //CJK UNIFIED IDEOGRAPH
+ 0xEDB2: 0x807F, //CJK UNIFIED IDEOGRAPH
+ 0xEDB3: 0x6C93, //CJK UNIFIED IDEOGRAPH
+ 0xEDB4: 0x6CF6, //CJK UNIFIED IDEOGRAPH
+ 0xEDB5: 0x6DFC, //CJK UNIFIED IDEOGRAPH
+ 0xEDB6: 0x77F6, //CJK UNIFIED IDEOGRAPH
+ 0xEDB7: 0x77F8, //CJK UNIFIED IDEOGRAPH
+ 0xEDB8: 0x7800, //CJK UNIFIED IDEOGRAPH
+ 0xEDB9: 0x7809, //CJK UNIFIED IDEOGRAPH
+ 0xEDBA: 0x7817, //CJK UNIFIED IDEOGRAPH
+ 0xEDBB: 0x7818, //CJK UNIFIED IDEOGRAPH
+ 0xEDBC: 0x7811, //CJK UNIFIED IDEOGRAPH
+ 0xEDBD: 0x65AB, //CJK UNIFIED IDEOGRAPH
+ 0xEDBE: 0x782D, //CJK UNIFIED IDEOGRAPH
+ 0xEDBF: 0x781C, //CJK UNIFIED IDEOGRAPH
+ 0xEDC0: 0x781D, //CJK UNIFIED IDEOGRAPH
+ 0xEDC1: 0x7839, //CJK UNIFIED IDEOGRAPH
+ 0xEDC2: 0x783A, //CJK UNIFIED IDEOGRAPH
+ 0xEDC3: 0x783B, //CJK UNIFIED IDEOGRAPH
+ 0xEDC4: 0x781F, //CJK UNIFIED IDEOGRAPH
+ 0xEDC5: 0x783C, //CJK UNIFIED IDEOGRAPH
+ 0xEDC6: 0x7825, //CJK UNIFIED IDEOGRAPH
+ 0xEDC7: 0x782C, //CJK UNIFIED IDEOGRAPH
+ 0xEDC8: 0x7823, //CJK UNIFIED IDEOGRAPH
+ 0xEDC9: 0x7829, //CJK UNIFIED IDEOGRAPH
+ 0xEDCA: 0x784E, //CJK UNIFIED IDEOGRAPH
+ 0xEDCB: 0x786D, //CJK UNIFIED IDEOGRAPH
+ 0xEDCC: 0x7856, //CJK UNIFIED IDEOGRAPH
+ 0xEDCD: 0x7857, //CJK UNIFIED IDEOGRAPH
+ 0xEDCE: 0x7826, //CJK UNIFIED IDEOGRAPH
+ 0xEDCF: 0x7850, //CJK UNIFIED IDEOGRAPH
+ 0xEDD0: 0x7847, //CJK UNIFIED IDEOGRAPH
+ 0xEDD1: 0x784C, //CJK UNIFIED IDEOGRAPH
+ 0xEDD2: 0x786A, //CJK UNIFIED IDEOGRAPH
+ 0xEDD3: 0x789B, //CJK UNIFIED IDEOGRAPH
+ 0xEDD4: 0x7893, //CJK UNIFIED IDEOGRAPH
+ 0xEDD5: 0x789A, //CJK UNIFIED IDEOGRAPH
+ 0xEDD6: 0x7887, //CJK UNIFIED IDEOGRAPH
+ 0xEDD7: 0x789C, //CJK UNIFIED IDEOGRAPH
+ 0xEDD8: 0x78A1, //CJK UNIFIED IDEOGRAPH
+ 0xEDD9: 0x78A3, //CJK UNIFIED IDEOGRAPH
+ 0xEDDA: 0x78B2, //CJK UNIFIED IDEOGRAPH
+ 0xEDDB: 0x78B9, //CJK UNIFIED IDEOGRAPH
+ 0xEDDC: 0x78A5, //CJK UNIFIED IDEOGRAPH
+ 0xEDDD: 0x78D4, //CJK UNIFIED IDEOGRAPH
+ 0xEDDE: 0x78D9, //CJK UNIFIED IDEOGRAPH
+ 0xEDDF: 0x78C9, //CJK UNIFIED IDEOGRAPH
+ 0xEDE0: 0x78EC, //CJK UNIFIED IDEOGRAPH
+ 0xEDE1: 0x78F2, //CJK UNIFIED IDEOGRAPH
+ 0xEDE2: 0x7905, //CJK UNIFIED IDEOGRAPH
+ 0xEDE3: 0x78F4, //CJK UNIFIED IDEOGRAPH
+ 0xEDE4: 0x7913, //CJK UNIFIED IDEOGRAPH
+ 0xEDE5: 0x7924, //CJK UNIFIED IDEOGRAPH
+ 0xEDE6: 0x791E, //CJK UNIFIED IDEOGRAPH
+ 0xEDE7: 0x7934, //CJK UNIFIED IDEOGRAPH
+ 0xEDE8: 0x9F9B, //CJK UNIFIED IDEOGRAPH
+ 0xEDE9: 0x9EF9, //CJK UNIFIED IDEOGRAPH
+ 0xEDEA: 0x9EFB, //CJK UNIFIED IDEOGRAPH
+ 0xEDEB: 0x9EFC, //CJK UNIFIED IDEOGRAPH
+ 0xEDEC: 0x76F1, //CJK UNIFIED IDEOGRAPH
+ 0xEDED: 0x7704, //CJK UNIFIED IDEOGRAPH
+ 0xEDEE: 0x770D, //CJK UNIFIED IDEOGRAPH
+ 0xEDEF: 0x76F9, //CJK UNIFIED IDEOGRAPH
+ 0xEDF0: 0x7707, //CJK UNIFIED IDEOGRAPH
+ 0xEDF1: 0x7708, //CJK UNIFIED IDEOGRAPH
+ 0xEDF2: 0x771A, //CJK UNIFIED IDEOGRAPH
+ 0xEDF3: 0x7722, //CJK UNIFIED IDEOGRAPH
+ 0xEDF4: 0x7719, //CJK UNIFIED IDEOGRAPH
+ 0xEDF5: 0x772D, //CJK UNIFIED IDEOGRAPH
+ 0xEDF6: 0x7726, //CJK UNIFIED IDEOGRAPH
+ 0xEDF7: 0x7735, //CJK UNIFIED IDEOGRAPH
+ 0xEDF8: 0x7738, //CJK UNIFIED IDEOGRAPH
+ 0xEDF9: 0x7750, //CJK UNIFIED IDEOGRAPH
+ 0xEDFA: 0x7751, //CJK UNIFIED IDEOGRAPH
+ 0xEDFB: 0x7747, //CJK UNIFIED IDEOGRAPH
+ 0xEDFC: 0x7743, //CJK UNIFIED IDEOGRAPH
+ 0xEDFD: 0x775A, //CJK UNIFIED IDEOGRAPH
+ 0xEDFE: 0x7768, //CJK UNIFIED IDEOGRAPH
+ 0xEE40: 0x980F, //CJK UNIFIED IDEOGRAPH
+ 0xEE41: 0x9810, //CJK UNIFIED IDEOGRAPH
+ 0xEE42: 0x9811, //CJK UNIFIED IDEOGRAPH
+ 0xEE43: 0x9812, //CJK UNIFIED IDEOGRAPH
+ 0xEE44: 0x9813, //CJK UNIFIED IDEOGRAPH
+ 0xEE45: 0x9814, //CJK UNIFIED IDEOGRAPH
+ 0xEE46: 0x9815, //CJK UNIFIED IDEOGRAPH
+ 0xEE47: 0x9816, //CJK UNIFIED IDEOGRAPH
+ 0xEE48: 0x9817, //CJK UNIFIED IDEOGRAPH
+ 0xEE49: 0x9818, //CJK UNIFIED IDEOGRAPH
+ 0xEE4A: 0x9819, //CJK UNIFIED IDEOGRAPH
+ 0xEE4B: 0x981A, //CJK UNIFIED IDEOGRAPH
+ 0xEE4C: 0x981B, //CJK UNIFIED IDEOGRAPH
+ 0xEE4D: 0x981C, //CJK UNIFIED IDEOGRAPH
+ 0xEE4E: 0x981D, //CJK UNIFIED IDEOGRAPH
+ 0xEE4F: 0x981E, //CJK UNIFIED IDEOGRAPH
+ 0xEE50: 0x981F, //CJK UNIFIED IDEOGRAPH
+ 0xEE51: 0x9820, //CJK UNIFIED IDEOGRAPH
+ 0xEE52: 0x9821, //CJK UNIFIED IDEOGRAPH
+ 0xEE53: 0x9822, //CJK UNIFIED IDEOGRAPH
+ 0xEE54: 0x9823, //CJK UNIFIED IDEOGRAPH
+ 0xEE55: 0x9824, //CJK UNIFIED IDEOGRAPH
+ 0xEE56: 0x9825, //CJK UNIFIED IDEOGRAPH
+ 0xEE57: 0x9826, //CJK UNIFIED IDEOGRAPH
+ 0xEE58: 0x9827, //CJK UNIFIED IDEOGRAPH
+ 0xEE59: 0x9828, //CJK UNIFIED IDEOGRAPH
+ 0xEE5A: 0x9829, //CJK UNIFIED IDEOGRAPH
+ 0xEE5B: 0x982A, //CJK UNIFIED IDEOGRAPH
+ 0xEE5C: 0x982B, //CJK UNIFIED IDEOGRAPH
+ 0xEE5D: 0x982C, //CJK UNIFIED IDEOGRAPH
+ 0xEE5E: 0x982D, //CJK UNIFIED IDEOGRAPH
+ 0xEE5F: 0x982E, //CJK UNIFIED IDEOGRAPH
+ 0xEE60: 0x982F, //CJK UNIFIED IDEOGRAPH
+ 0xEE61: 0x9830, //CJK UNIFIED IDEOGRAPH
+ 0xEE62: 0x9831, //CJK UNIFIED IDEOGRAPH
+ 0xEE63: 0x9832, //CJK UNIFIED IDEOGRAPH
+ 0xEE64: 0x9833, //CJK UNIFIED IDEOGRAPH
+ 0xEE65: 0x9834, //CJK UNIFIED IDEOGRAPH
+ 0xEE66: 0x9835, //CJK UNIFIED IDEOGRAPH
+ 0xEE67: 0x9836, //CJK UNIFIED IDEOGRAPH
+ 0xEE68: 0x9837, //CJK UNIFIED IDEOGRAPH
+ 0xEE69: 0x9838, //CJK UNIFIED IDEOGRAPH
+ 0xEE6A: 0x9839, //CJK UNIFIED IDEOGRAPH
+ 0xEE6B: 0x983A, //CJK UNIFIED IDEOGRAPH
+ 0xEE6C: 0x983B, //CJK UNIFIED IDEOGRAPH
+ 0xEE6D: 0x983C, //CJK UNIFIED IDEOGRAPH
+ 0xEE6E: 0x983D, //CJK UNIFIED IDEOGRAPH
+ 0xEE6F: 0x983E, //CJK UNIFIED IDEOGRAPH
+ 0xEE70: 0x983F, //CJK UNIFIED IDEOGRAPH
+ 0xEE71: 0x9840, //CJK UNIFIED IDEOGRAPH
+ 0xEE72: 0x9841, //CJK UNIFIED IDEOGRAPH
+ 0xEE73: 0x9842, //CJK UNIFIED IDEOGRAPH
+ 0xEE74: 0x9843, //CJK UNIFIED IDEOGRAPH
+ 0xEE75: 0x9844, //CJK UNIFIED IDEOGRAPH
+ 0xEE76: 0x9845, //CJK UNIFIED IDEOGRAPH
+ 0xEE77: 0x9846, //CJK UNIFIED IDEOGRAPH
+ 0xEE78: 0x9847, //CJK UNIFIED IDEOGRAPH
+ 0xEE79: 0x9848, //CJK UNIFIED IDEOGRAPH
+ 0xEE7A: 0x9849, //CJK UNIFIED IDEOGRAPH
+ 0xEE7B: 0x984A, //CJK UNIFIED IDEOGRAPH
+ 0xEE7C: 0x984B, //CJK UNIFIED IDEOGRAPH
+ 0xEE7D: 0x984C, //CJK UNIFIED IDEOGRAPH
+ 0xEE7E: 0x984D, //CJK UNIFIED IDEOGRAPH
+ 0xEE80: 0x984E, //CJK UNIFIED IDEOGRAPH
+ 0xEE81: 0x984F, //CJK UNIFIED IDEOGRAPH
+ 0xEE82: 0x9850, //CJK UNIFIED IDEOGRAPH
+ 0xEE83: 0x9851, //CJK UNIFIED IDEOGRAPH
+ 0xEE84: 0x9852, //CJK UNIFIED IDEOGRAPH
+ 0xEE85: 0x9853, //CJK UNIFIED IDEOGRAPH
+ 0xEE86: 0x9854, //CJK UNIFIED IDEOGRAPH
+ 0xEE87: 0x9855, //CJK UNIFIED IDEOGRAPH
+ 0xEE88: 0x9856, //CJK UNIFIED IDEOGRAPH
+ 0xEE89: 0x9857, //CJK UNIFIED IDEOGRAPH
+ 0xEE8A: 0x9858, //CJK UNIFIED IDEOGRAPH
+ 0xEE8B: 0x9859, //CJK UNIFIED IDEOGRAPH
+ 0xEE8C: 0x985A, //CJK UNIFIED IDEOGRAPH
+ 0xEE8D: 0x985B, //CJK UNIFIED IDEOGRAPH
+ 0xEE8E: 0x985C, //CJK UNIFIED IDEOGRAPH
+ 0xEE8F: 0x985D, //CJK UNIFIED IDEOGRAPH
+ 0xEE90: 0x985E, //CJK UNIFIED IDEOGRAPH
+ 0xEE91: 0x985F, //CJK UNIFIED IDEOGRAPH
+ 0xEE92: 0x9860, //CJK UNIFIED IDEOGRAPH
+ 0xEE93: 0x9861, //CJK UNIFIED IDEOGRAPH
+ 0xEE94: 0x9862, //CJK UNIFIED IDEOGRAPH
+ 0xEE95: 0x9863, //CJK UNIFIED IDEOGRAPH
+ 0xEE96: 0x9864, //CJK UNIFIED IDEOGRAPH
+ 0xEE97: 0x9865, //CJK UNIFIED IDEOGRAPH
+ 0xEE98: 0x9866, //CJK UNIFIED IDEOGRAPH
+ 0xEE99: 0x9867, //CJK UNIFIED IDEOGRAPH
+ 0xEE9A: 0x9868, //CJK UNIFIED IDEOGRAPH
+ 0xEE9B: 0x9869, //CJK UNIFIED IDEOGRAPH
+ 0xEE9C: 0x986A, //CJK UNIFIED IDEOGRAPH
+ 0xEE9D: 0x986B, //CJK UNIFIED IDEOGRAPH
+ 0xEE9E: 0x986C, //CJK UNIFIED IDEOGRAPH
+ 0xEE9F: 0x986D, //CJK UNIFIED IDEOGRAPH
+ 0xEEA0: 0x986E, //CJK UNIFIED IDEOGRAPH
+ 0xEEA1: 0x7762, //CJK UNIFIED IDEOGRAPH
+ 0xEEA2: 0x7765, //CJK UNIFIED IDEOGRAPH
+ 0xEEA3: 0x777F, //CJK UNIFIED IDEOGRAPH
+ 0xEEA4: 0x778D, //CJK UNIFIED IDEOGRAPH
+ 0xEEA5: 0x777D, //CJK UNIFIED IDEOGRAPH
+ 0xEEA6: 0x7780, //CJK UNIFIED IDEOGRAPH
+ 0xEEA7: 0x778C, //CJK UNIFIED IDEOGRAPH
+ 0xEEA8: 0x7791, //CJK UNIFIED IDEOGRAPH
+ 0xEEA9: 0x779F, //CJK UNIFIED IDEOGRAPH
+ 0xEEAA: 0x77A0, //CJK UNIFIED IDEOGRAPH
+ 0xEEAB: 0x77B0, //CJK UNIFIED IDEOGRAPH
+ 0xEEAC: 0x77B5, //CJK UNIFIED IDEOGRAPH
+ 0xEEAD: 0x77BD, //CJK UNIFIED IDEOGRAPH
+ 0xEEAE: 0x753A, //CJK UNIFIED IDEOGRAPH
+ 0xEEAF: 0x7540, //CJK UNIFIED IDEOGRAPH
+ 0xEEB0: 0x754E, //CJK UNIFIED IDEOGRAPH
+ 0xEEB1: 0x754B, //CJK UNIFIED IDEOGRAPH
+ 0xEEB2: 0x7548, //CJK UNIFIED IDEOGRAPH
+ 0xEEB3: 0x755B, //CJK UNIFIED IDEOGRAPH
+ 0xEEB4: 0x7572, //CJK UNIFIED IDEOGRAPH
+ 0xEEB5: 0x7579, //CJK UNIFIED IDEOGRAPH
+ 0xEEB6: 0x7583, //CJK UNIFIED IDEOGRAPH
+ 0xEEB7: 0x7F58, //CJK UNIFIED IDEOGRAPH
+ 0xEEB8: 0x7F61, //CJK UNIFIED IDEOGRAPH
+ 0xEEB9: 0x7F5F, //CJK UNIFIED IDEOGRAPH
+ 0xEEBA: 0x8A48, //CJK UNIFIED IDEOGRAPH
+ 0xEEBB: 0x7F68, //CJK UNIFIED IDEOGRAPH
+ 0xEEBC: 0x7F74, //CJK UNIFIED IDEOGRAPH
+ 0xEEBD: 0x7F71, //CJK UNIFIED IDEOGRAPH
+ 0xEEBE: 0x7F79, //CJK UNIFIED IDEOGRAPH
+ 0xEEBF: 0x7F81, //CJK UNIFIED IDEOGRAPH
+ 0xEEC0: 0x7F7E, //CJK UNIFIED IDEOGRAPH
+ 0xEEC1: 0x76CD, //CJK UNIFIED IDEOGRAPH
+ 0xEEC2: 0x76E5, //CJK UNIFIED IDEOGRAPH
+ 0xEEC3: 0x8832, //CJK UNIFIED IDEOGRAPH
+ 0xEEC4: 0x9485, //CJK UNIFIED IDEOGRAPH
+ 0xEEC5: 0x9486, //CJK UNIFIED IDEOGRAPH
+ 0xEEC6: 0x9487, //CJK UNIFIED IDEOGRAPH
+ 0xEEC7: 0x948B, //CJK UNIFIED IDEOGRAPH
+ 0xEEC8: 0x948A, //CJK UNIFIED IDEOGRAPH
+ 0xEEC9: 0x948C, //CJK UNIFIED IDEOGRAPH
+ 0xEECA: 0x948D, //CJK UNIFIED IDEOGRAPH
+ 0xEECB: 0x948F, //CJK UNIFIED IDEOGRAPH
+ 0xEECC: 0x9490, //CJK UNIFIED IDEOGRAPH
+ 0xEECD: 0x9494, //CJK UNIFIED IDEOGRAPH
+ 0xEECE: 0x9497, //CJK UNIFIED IDEOGRAPH
+ 0xEECF: 0x9495, //CJK UNIFIED IDEOGRAPH
+ 0xEED0: 0x949A, //CJK UNIFIED IDEOGRAPH
+ 0xEED1: 0x949B, //CJK UNIFIED IDEOGRAPH
+ 0xEED2: 0x949C, //CJK UNIFIED IDEOGRAPH
+ 0xEED3: 0x94A3, //CJK UNIFIED IDEOGRAPH
+ 0xEED4: 0x94A4, //CJK UNIFIED IDEOGRAPH
+ 0xEED5: 0x94AB, //CJK UNIFIED IDEOGRAPH
+ 0xEED6: 0x94AA, //CJK UNIFIED IDEOGRAPH
+ 0xEED7: 0x94AD, //CJK UNIFIED IDEOGRAPH
+ 0xEED8: 0x94AC, //CJK UNIFIED IDEOGRAPH
+ 0xEED9: 0x94AF, //CJK UNIFIED IDEOGRAPH
+ 0xEEDA: 0x94B0, //CJK UNIFIED IDEOGRAPH
+ 0xEEDB: 0x94B2, //CJK UNIFIED IDEOGRAPH
+ 0xEEDC: 0x94B4, //CJK UNIFIED IDEOGRAPH
+ 0xEEDD: 0x94B6, //CJK UNIFIED IDEOGRAPH
+ 0xEEDE: 0x94B7, //CJK UNIFIED IDEOGRAPH
+ 0xEEDF: 0x94B8, //CJK UNIFIED IDEOGRAPH
+ 0xEEE0: 0x94B9, //CJK UNIFIED IDEOGRAPH
+ 0xEEE1: 0x94BA, //CJK UNIFIED IDEOGRAPH
+ 0xEEE2: 0x94BC, //CJK UNIFIED IDEOGRAPH
+ 0xEEE3: 0x94BD, //CJK UNIFIED IDEOGRAPH
+ 0xEEE4: 0x94BF, //CJK UNIFIED IDEOGRAPH
+ 0xEEE5: 0x94C4, //CJK UNIFIED IDEOGRAPH
+ 0xEEE6: 0x94C8, //CJK UNIFIED IDEOGRAPH
+ 0xEEE7: 0x94C9, //CJK UNIFIED IDEOGRAPH
+ 0xEEE8: 0x94CA, //CJK UNIFIED IDEOGRAPH
+ 0xEEE9: 0x94CB, //CJK UNIFIED IDEOGRAPH
+ 0xEEEA: 0x94CC, //CJK UNIFIED IDEOGRAPH
+ 0xEEEB: 0x94CD, //CJK UNIFIED IDEOGRAPH
+ 0xEEEC: 0x94CE, //CJK UNIFIED IDEOGRAPH
+ 0xEEED: 0x94D0, //CJK UNIFIED IDEOGRAPH
+ 0xEEEE: 0x94D1, //CJK UNIFIED IDEOGRAPH
+ 0xEEEF: 0x94D2, //CJK UNIFIED IDEOGRAPH
+ 0xEEF0: 0x94D5, //CJK UNIFIED IDEOGRAPH
+ 0xEEF1: 0x94D6, //CJK UNIFIED IDEOGRAPH
+ 0xEEF2: 0x94D7, //CJK UNIFIED IDEOGRAPH
+ 0xEEF3: 0x94D9, //CJK UNIFIED IDEOGRAPH
+ 0xEEF4: 0x94D8, //CJK UNIFIED IDEOGRAPH
+ 0xEEF5: 0x94DB, //CJK UNIFIED IDEOGRAPH
+ 0xEEF6: 0x94DE, //CJK UNIFIED IDEOGRAPH
+ 0xEEF7: 0x94DF, //CJK UNIFIED IDEOGRAPH
+ 0xEEF8: 0x94E0, //CJK UNIFIED IDEOGRAPH
+ 0xEEF9: 0x94E2, //CJK UNIFIED IDEOGRAPH
+ 0xEEFA: 0x94E4, //CJK UNIFIED IDEOGRAPH
+ 0xEEFB: 0x94E5, //CJK UNIFIED IDEOGRAPH
+ 0xEEFC: 0x94E7, //CJK UNIFIED IDEOGRAPH
+ 0xEEFD: 0x94E8, //CJK UNIFIED IDEOGRAPH
+ 0xEEFE: 0x94EA, //CJK UNIFIED IDEOGRAPH
+ 0xEF40: 0x986F, //CJK UNIFIED IDEOGRAPH
+ 0xEF41: 0x9870, //CJK UNIFIED IDEOGRAPH
+ 0xEF42: 0x9871, //CJK UNIFIED IDEOGRAPH
+ 0xEF43: 0x9872, //CJK UNIFIED IDEOGRAPH
+ 0xEF44: 0x9873, //CJK UNIFIED IDEOGRAPH
+ 0xEF45: 0x9874, //CJK UNIFIED IDEOGRAPH
+ 0xEF46: 0x988B, //CJK UNIFIED IDEOGRAPH
+ 0xEF47: 0x988E, //CJK UNIFIED IDEOGRAPH
+ 0xEF48: 0x9892, //CJK UNIFIED IDEOGRAPH
+ 0xEF49: 0x9895, //CJK UNIFIED IDEOGRAPH
+ 0xEF4A: 0x9899, //CJK UNIFIED IDEOGRAPH
+ 0xEF4B: 0x98A3, //CJK UNIFIED IDEOGRAPH
+ 0xEF4C: 0x98A8, //CJK UNIFIED IDEOGRAPH
+ 0xEF4D: 0x98A9, //CJK UNIFIED IDEOGRAPH
+ 0xEF4E: 0x98AA, //CJK UNIFIED IDEOGRAPH
+ 0xEF4F: 0x98AB, //CJK UNIFIED IDEOGRAPH
+ 0xEF50: 0x98AC, //CJK UNIFIED IDEOGRAPH
+ 0xEF51: 0x98AD, //CJK UNIFIED IDEOGRAPH
+ 0xEF52: 0x98AE, //CJK UNIFIED IDEOGRAPH
+ 0xEF53: 0x98AF, //CJK UNIFIED IDEOGRAPH
+ 0xEF54: 0x98B0, //CJK UNIFIED IDEOGRAPH
+ 0xEF55: 0x98B1, //CJK UNIFIED IDEOGRAPH
+ 0xEF56: 0x98B2, //CJK UNIFIED IDEOGRAPH
+ 0xEF57: 0x98B3, //CJK UNIFIED IDEOGRAPH
+ 0xEF58: 0x98B4, //CJK UNIFIED IDEOGRAPH
+ 0xEF59: 0x98B5, //CJK UNIFIED IDEOGRAPH
+ 0xEF5A: 0x98B6, //CJK UNIFIED IDEOGRAPH
+ 0xEF5B: 0x98B7, //CJK UNIFIED IDEOGRAPH
+ 0xEF5C: 0x98B8, //CJK UNIFIED IDEOGRAPH
+ 0xEF5D: 0x98B9, //CJK UNIFIED IDEOGRAPH
+ 0xEF5E: 0x98BA, //CJK UNIFIED IDEOGRAPH
+ 0xEF5F: 0x98BB, //CJK UNIFIED IDEOGRAPH
+ 0xEF60: 0x98BC, //CJK UNIFIED IDEOGRAPH
+ 0xEF61: 0x98BD, //CJK UNIFIED IDEOGRAPH
+ 0xEF62: 0x98BE, //CJK UNIFIED IDEOGRAPH
+ 0xEF63: 0x98BF, //CJK UNIFIED IDEOGRAPH
+ 0xEF64: 0x98C0, //CJK UNIFIED IDEOGRAPH
+ 0xEF65: 0x98C1, //CJK UNIFIED IDEOGRAPH
+ 0xEF66: 0x98C2, //CJK UNIFIED IDEOGRAPH
+ 0xEF67: 0x98C3, //CJK UNIFIED IDEOGRAPH
+ 0xEF68: 0x98C4, //CJK UNIFIED IDEOGRAPH
+ 0xEF69: 0x98C5, //CJK UNIFIED IDEOGRAPH
+ 0xEF6A: 0x98C6, //CJK UNIFIED IDEOGRAPH
+ 0xEF6B: 0x98C7, //CJK UNIFIED IDEOGRAPH
+ 0xEF6C: 0x98C8, //CJK UNIFIED IDEOGRAPH
+ 0xEF6D: 0x98C9, //CJK UNIFIED IDEOGRAPH
+ 0xEF6E: 0x98CA, //CJK UNIFIED IDEOGRAPH
+ 0xEF6F: 0x98CB, //CJK UNIFIED IDEOGRAPH
+ 0xEF70: 0x98CC, //CJK UNIFIED IDEOGRAPH
+ 0xEF71: 0x98CD, //CJK UNIFIED IDEOGRAPH
+ 0xEF72: 0x98CF, //CJK UNIFIED IDEOGRAPH
+ 0xEF73: 0x98D0, //CJK UNIFIED IDEOGRAPH
+ 0xEF74: 0x98D4, //CJK UNIFIED IDEOGRAPH
+ 0xEF75: 0x98D6, //CJK UNIFIED IDEOGRAPH
+ 0xEF76: 0x98D7, //CJK UNIFIED IDEOGRAPH
+ 0xEF77: 0x98DB, //CJK UNIFIED IDEOGRAPH
+ 0xEF78: 0x98DC, //CJK UNIFIED IDEOGRAPH
+ 0xEF79: 0x98DD, //CJK UNIFIED IDEOGRAPH
+ 0xEF7A: 0x98E0, //CJK UNIFIED IDEOGRAPH
+ 0xEF7B: 0x98E1, //CJK UNIFIED IDEOGRAPH
+ 0xEF7C: 0x98E2, //CJK UNIFIED IDEOGRAPH
+ 0xEF7D: 0x98E3, //CJK UNIFIED IDEOGRAPH
+ 0xEF7E: 0x98E4, //CJK UNIFIED IDEOGRAPH
+ 0xEF80: 0x98E5, //CJK UNIFIED IDEOGRAPH
+ 0xEF81: 0x98E6, //CJK UNIFIED IDEOGRAPH
+ 0xEF82: 0x98E9, //CJK UNIFIED IDEOGRAPH
+ 0xEF83: 0x98EA, //CJK UNIFIED IDEOGRAPH
+ 0xEF84: 0x98EB, //CJK UNIFIED IDEOGRAPH
+ 0xEF85: 0x98EC, //CJK UNIFIED IDEOGRAPH
+ 0xEF86: 0x98ED, //CJK UNIFIED IDEOGRAPH
+ 0xEF87: 0x98EE, //CJK UNIFIED IDEOGRAPH
+ 0xEF88: 0x98EF, //CJK UNIFIED IDEOGRAPH
+ 0xEF89: 0x98F0, //CJK UNIFIED IDEOGRAPH
+ 0xEF8A: 0x98F1, //CJK UNIFIED IDEOGRAPH
+ 0xEF8B: 0x98F2, //CJK UNIFIED IDEOGRAPH
+ 0xEF8C: 0x98F3, //CJK UNIFIED IDEOGRAPH
+ 0xEF8D: 0x98F4, //CJK UNIFIED IDEOGRAPH
+ 0xEF8E: 0x98F5, //CJK UNIFIED IDEOGRAPH
+ 0xEF8F: 0x98F6, //CJK UNIFIED IDEOGRAPH
+ 0xEF90: 0x98F7, //CJK UNIFIED IDEOGRAPH
+ 0xEF91: 0x98F8, //CJK UNIFIED IDEOGRAPH
+ 0xEF92: 0x98F9, //CJK UNIFIED IDEOGRAPH
+ 0xEF93: 0x98FA, //CJK UNIFIED IDEOGRAPH
+ 0xEF94: 0x98FB, //CJK UNIFIED IDEOGRAPH
+ 0xEF95: 0x98FC, //CJK UNIFIED IDEOGRAPH
+ 0xEF96: 0x98FD, //CJK UNIFIED IDEOGRAPH
+ 0xEF97: 0x98FE, //CJK UNIFIED IDEOGRAPH
+ 0xEF98: 0x98FF, //CJK UNIFIED IDEOGRAPH
+ 0xEF99: 0x9900, //CJK UNIFIED IDEOGRAPH
+ 0xEF9A: 0x9901, //CJK UNIFIED IDEOGRAPH
+ 0xEF9B: 0x9902, //CJK UNIFIED IDEOGRAPH
+ 0xEF9C: 0x9903, //CJK UNIFIED IDEOGRAPH
+ 0xEF9D: 0x9904, //CJK UNIFIED IDEOGRAPH
+ 0xEF9E: 0x9905, //CJK UNIFIED IDEOGRAPH
+ 0xEF9F: 0x9906, //CJK UNIFIED IDEOGRAPH
+ 0xEFA0: 0x9907, //CJK UNIFIED IDEOGRAPH
+ 0xEFA1: 0x94E9, //CJK UNIFIED IDEOGRAPH
+ 0xEFA2: 0x94EB, //CJK UNIFIED IDEOGRAPH
+ 0xEFA3: 0x94EE, //CJK UNIFIED IDEOGRAPH
+ 0xEFA4: 0x94EF, //CJK UNIFIED IDEOGRAPH
+ 0xEFA5: 0x94F3, //CJK UNIFIED IDEOGRAPH
+ 0xEFA6: 0x94F4, //CJK UNIFIED IDEOGRAPH
+ 0xEFA7: 0x94F5, //CJK UNIFIED IDEOGRAPH
+ 0xEFA8: 0x94F7, //CJK UNIFIED IDEOGRAPH
+ 0xEFA9: 0x94F9, //CJK UNIFIED IDEOGRAPH
+ 0xEFAA: 0x94FC, //CJK UNIFIED IDEOGRAPH
+ 0xEFAB: 0x94FD, //CJK UNIFIED IDEOGRAPH
+ 0xEFAC: 0x94FF, //CJK UNIFIED IDEOGRAPH
+ 0xEFAD: 0x9503, //CJK UNIFIED IDEOGRAPH
+ 0xEFAE: 0x9502, //CJK UNIFIED IDEOGRAPH
+ 0xEFAF: 0x9506, //CJK UNIFIED IDEOGRAPH
+ 0xEFB0: 0x9507, //CJK UNIFIED IDEOGRAPH
+ 0xEFB1: 0x9509, //CJK UNIFIED IDEOGRAPH
+ 0xEFB2: 0x950A, //CJK UNIFIED IDEOGRAPH
+ 0xEFB3: 0x950D, //CJK UNIFIED IDEOGRAPH
+ 0xEFB4: 0x950E, //CJK UNIFIED IDEOGRAPH
+ 0xEFB5: 0x950F, //CJK UNIFIED IDEOGRAPH
+ 0xEFB6: 0x9512, //CJK UNIFIED IDEOGRAPH
+ 0xEFB7: 0x9513, //CJK UNIFIED IDEOGRAPH
+ 0xEFB8: 0x9514, //CJK UNIFIED IDEOGRAPH
+ 0xEFB9: 0x9515, //CJK UNIFIED IDEOGRAPH
+ 0xEFBA: 0x9516, //CJK UNIFIED IDEOGRAPH
+ 0xEFBB: 0x9518, //CJK UNIFIED IDEOGRAPH
+ 0xEFBC: 0x951B, //CJK UNIFIED IDEOGRAPH
+ 0xEFBD: 0x951D, //CJK UNIFIED IDEOGRAPH
+ 0xEFBE: 0x951E, //CJK UNIFIED IDEOGRAPH
+ 0xEFBF: 0x951F, //CJK UNIFIED IDEOGRAPH
+ 0xEFC0: 0x9522, //CJK UNIFIED IDEOGRAPH
+ 0xEFC1: 0x952A, //CJK UNIFIED IDEOGRAPH
+ 0xEFC2: 0x952B, //CJK UNIFIED IDEOGRAPH
+ 0xEFC3: 0x9529, //CJK UNIFIED IDEOGRAPH
+ 0xEFC4: 0x952C, //CJK UNIFIED IDEOGRAPH
+ 0xEFC5: 0x9531, //CJK UNIFIED IDEOGRAPH
+ 0xEFC6: 0x9532, //CJK UNIFIED IDEOGRAPH
+ 0xEFC7: 0x9534, //CJK UNIFIED IDEOGRAPH
+ 0xEFC8: 0x9536, //CJK UNIFIED IDEOGRAPH
+ 0xEFC9: 0x9537, //CJK UNIFIED IDEOGRAPH
+ 0xEFCA: 0x9538, //CJK UNIFIED IDEOGRAPH
+ 0xEFCB: 0x953C, //CJK UNIFIED IDEOGRAPH
+ 0xEFCC: 0x953E, //CJK UNIFIED IDEOGRAPH
+ 0xEFCD: 0x953F, //CJK UNIFIED IDEOGRAPH
+ 0xEFCE: 0x9542, //CJK UNIFIED IDEOGRAPH
+ 0xEFCF: 0x9535, //CJK UNIFIED IDEOGRAPH
+ 0xEFD0: 0x9544, //CJK UNIFIED IDEOGRAPH
+ 0xEFD1: 0x9545, //CJK UNIFIED IDEOGRAPH
+ 0xEFD2: 0x9546, //CJK UNIFIED IDEOGRAPH
+ 0xEFD3: 0x9549, //CJK UNIFIED IDEOGRAPH
+ 0xEFD4: 0x954C, //CJK UNIFIED IDEOGRAPH
+ 0xEFD5: 0x954E, //CJK UNIFIED IDEOGRAPH
+ 0xEFD6: 0x954F, //CJK UNIFIED IDEOGRAPH
+ 0xEFD7: 0x9552, //CJK UNIFIED IDEOGRAPH
+ 0xEFD8: 0x9553, //CJK UNIFIED IDEOGRAPH
+ 0xEFD9: 0x9554, //CJK UNIFIED IDEOGRAPH
+ 0xEFDA: 0x9556, //CJK UNIFIED IDEOGRAPH
+ 0xEFDB: 0x9557, //CJK UNIFIED IDEOGRAPH
+ 0xEFDC: 0x9558, //CJK UNIFIED IDEOGRAPH
+ 0xEFDD: 0x9559, //CJK UNIFIED IDEOGRAPH
+ 0xEFDE: 0x955B, //CJK UNIFIED IDEOGRAPH
+ 0xEFDF: 0x955E, //CJK UNIFIED IDEOGRAPH
+ 0xEFE0: 0x955F, //CJK UNIFIED IDEOGRAPH
+ 0xEFE1: 0x955D, //CJK UNIFIED IDEOGRAPH
+ 0xEFE2: 0x9561, //CJK UNIFIED IDEOGRAPH
+ 0xEFE3: 0x9562, //CJK UNIFIED IDEOGRAPH
+ 0xEFE4: 0x9564, //CJK UNIFIED IDEOGRAPH
+ 0xEFE5: 0x9565, //CJK UNIFIED IDEOGRAPH
+ 0xEFE6: 0x9566, //CJK UNIFIED IDEOGRAPH
+ 0xEFE7: 0x9567, //CJK UNIFIED IDEOGRAPH
+ 0xEFE8: 0x9568, //CJK UNIFIED IDEOGRAPH
+ 0xEFE9: 0x9569, //CJK UNIFIED IDEOGRAPH
+ 0xEFEA: 0x956A, //CJK UNIFIED IDEOGRAPH
+ 0xEFEB: 0x956B, //CJK UNIFIED IDEOGRAPH
+ 0xEFEC: 0x956C, //CJK UNIFIED IDEOGRAPH
+ 0xEFED: 0x956F, //CJK UNIFIED IDEOGRAPH
+ 0xEFEE: 0x9571, //CJK UNIFIED IDEOGRAPH
+ 0xEFEF: 0x9572, //CJK UNIFIED IDEOGRAPH
+ 0xEFF0: 0x9573, //CJK UNIFIED IDEOGRAPH
+ 0xEFF1: 0x953A, //CJK UNIFIED IDEOGRAPH
+ 0xEFF2: 0x77E7, //CJK UNIFIED IDEOGRAPH
+ 0xEFF3: 0x77EC, //CJK UNIFIED IDEOGRAPH
+ 0xEFF4: 0x96C9, //CJK UNIFIED IDEOGRAPH
+ 0xEFF5: 0x79D5, //CJK UNIFIED IDEOGRAPH
+ 0xEFF6: 0x79ED, //CJK UNIFIED IDEOGRAPH
+ 0xEFF7: 0x79E3, //CJK UNIFIED IDEOGRAPH
+ 0xEFF8: 0x79EB, //CJK UNIFIED IDEOGRAPH
+ 0xEFF9: 0x7A06, //CJK UNIFIED IDEOGRAPH
+ 0xEFFA: 0x5D47, //CJK UNIFIED IDEOGRAPH
+ 0xEFFB: 0x7A03, //CJK UNIFIED IDEOGRAPH
+ 0xEFFC: 0x7A02, //CJK UNIFIED IDEOGRAPH
+ 0xEFFD: 0x7A1E, //CJK UNIFIED IDEOGRAPH
+ 0xEFFE: 0x7A14, //CJK UNIFIED IDEOGRAPH
+ 0xF040: 0x9908, //CJK UNIFIED IDEOGRAPH
+ 0xF041: 0x9909, //CJK UNIFIED IDEOGRAPH
+ 0xF042: 0x990A, //CJK UNIFIED IDEOGRAPH
+ 0xF043: 0x990B, //CJK UNIFIED IDEOGRAPH
+ 0xF044: 0x990C, //CJK UNIFIED IDEOGRAPH
+ 0xF045: 0x990E, //CJK UNIFIED IDEOGRAPH
+ 0xF046: 0x990F, //CJK UNIFIED IDEOGRAPH
+ 0xF047: 0x9911, //CJK UNIFIED IDEOGRAPH
+ 0xF048: 0x9912, //CJK UNIFIED IDEOGRAPH
+ 0xF049: 0x9913, //CJK UNIFIED IDEOGRAPH
+ 0xF04A: 0x9914, //CJK UNIFIED IDEOGRAPH
+ 0xF04B: 0x9915, //CJK UNIFIED IDEOGRAPH
+ 0xF04C: 0x9916, //CJK UNIFIED IDEOGRAPH
+ 0xF04D: 0x9917, //CJK UNIFIED IDEOGRAPH
+ 0xF04E: 0x9918, //CJK UNIFIED IDEOGRAPH
+ 0xF04F: 0x9919, //CJK UNIFIED IDEOGRAPH
+ 0xF050: 0x991A, //CJK UNIFIED IDEOGRAPH
+ 0xF051: 0x991B, //CJK UNIFIED IDEOGRAPH
+ 0xF052: 0x991C, //CJK UNIFIED IDEOGRAPH
+ 0xF053: 0x991D, //CJK UNIFIED IDEOGRAPH
+ 0xF054: 0x991E, //CJK UNIFIED IDEOGRAPH
+ 0xF055: 0x991F, //CJK UNIFIED IDEOGRAPH
+ 0xF056: 0x9920, //CJK UNIFIED IDEOGRAPH
+ 0xF057: 0x9921, //CJK UNIFIED IDEOGRAPH
+ 0xF058: 0x9922, //CJK UNIFIED IDEOGRAPH
+ 0xF059: 0x9923, //CJK UNIFIED IDEOGRAPH
+ 0xF05A: 0x9924, //CJK UNIFIED IDEOGRAPH
+ 0xF05B: 0x9925, //CJK UNIFIED IDEOGRAPH
+ 0xF05C: 0x9926, //CJK UNIFIED IDEOGRAPH
+ 0xF05D: 0x9927, //CJK UNIFIED IDEOGRAPH
+ 0xF05E: 0x9928, //CJK UNIFIED IDEOGRAPH
+ 0xF05F: 0x9929, //CJK UNIFIED IDEOGRAPH
+ 0xF060: 0x992A, //CJK UNIFIED IDEOGRAPH
+ 0xF061: 0x992B, //CJK UNIFIED IDEOGRAPH
+ 0xF062: 0x992C, //CJK UNIFIED IDEOGRAPH
+ 0xF063: 0x992D, //CJK UNIFIED IDEOGRAPH
+ 0xF064: 0x992F, //CJK UNIFIED IDEOGRAPH
+ 0xF065: 0x9930, //CJK UNIFIED IDEOGRAPH
+ 0xF066: 0x9931, //CJK UNIFIED IDEOGRAPH
+ 0xF067: 0x9932, //CJK UNIFIED IDEOGRAPH
+ 0xF068: 0x9933, //CJK UNIFIED IDEOGRAPH
+ 0xF069: 0x9934, //CJK UNIFIED IDEOGRAPH
+ 0xF06A: 0x9935, //CJK UNIFIED IDEOGRAPH
+ 0xF06B: 0x9936, //CJK UNIFIED IDEOGRAPH
+ 0xF06C: 0x9937, //CJK UNIFIED IDEOGRAPH
+ 0xF06D: 0x9938, //CJK UNIFIED IDEOGRAPH
+ 0xF06E: 0x9939, //CJK UNIFIED IDEOGRAPH
+ 0xF06F: 0x993A, //CJK UNIFIED IDEOGRAPH
+ 0xF070: 0x993B, //CJK UNIFIED IDEOGRAPH
+ 0xF071: 0x993C, //CJK UNIFIED IDEOGRAPH
+ 0xF072: 0x993D, //CJK UNIFIED IDEOGRAPH
+ 0xF073: 0x993E, //CJK UNIFIED IDEOGRAPH
+ 0xF074: 0x993F, //CJK UNIFIED IDEOGRAPH
+ 0xF075: 0x9940, //CJK UNIFIED IDEOGRAPH
+ 0xF076: 0x9941, //CJK UNIFIED IDEOGRAPH
+ 0xF077: 0x9942, //CJK UNIFIED IDEOGRAPH
+ 0xF078: 0x9943, //CJK UNIFIED IDEOGRAPH
+ 0xF079: 0x9944, //CJK UNIFIED IDEOGRAPH
+ 0xF07A: 0x9945, //CJK UNIFIED IDEOGRAPH
+ 0xF07B: 0x9946, //CJK UNIFIED IDEOGRAPH
+ 0xF07C: 0x9947, //CJK UNIFIED IDEOGRAPH
+ 0xF07D: 0x9948, //CJK UNIFIED IDEOGRAPH
+ 0xF07E: 0x9949, //CJK UNIFIED IDEOGRAPH
+ 0xF080: 0x994A, //CJK UNIFIED IDEOGRAPH
+ 0xF081: 0x994B, //CJK UNIFIED IDEOGRAPH
+ 0xF082: 0x994C, //CJK UNIFIED IDEOGRAPH
+ 0xF083: 0x994D, //CJK UNIFIED IDEOGRAPH
+ 0xF084: 0x994E, //CJK UNIFIED IDEOGRAPH
+ 0xF085: 0x994F, //CJK UNIFIED IDEOGRAPH
+ 0xF086: 0x9950, //CJK UNIFIED IDEOGRAPH
+ 0xF087: 0x9951, //CJK UNIFIED IDEOGRAPH
+ 0xF088: 0x9952, //CJK UNIFIED IDEOGRAPH
+ 0xF089: 0x9953, //CJK UNIFIED IDEOGRAPH
+ 0xF08A: 0x9956, //CJK UNIFIED IDEOGRAPH
+ 0xF08B: 0x9957, //CJK UNIFIED IDEOGRAPH
+ 0xF08C: 0x9958, //CJK UNIFIED IDEOGRAPH
+ 0xF08D: 0x9959, //CJK UNIFIED IDEOGRAPH
+ 0xF08E: 0x995A, //CJK UNIFIED IDEOGRAPH
+ 0xF08F: 0x995B, //CJK UNIFIED IDEOGRAPH
+ 0xF090: 0x995C, //CJK UNIFIED IDEOGRAPH
+ 0xF091: 0x995D, //CJK UNIFIED IDEOGRAPH
+ 0xF092: 0x995E, //CJK UNIFIED IDEOGRAPH
+ 0xF093: 0x995F, //CJK UNIFIED IDEOGRAPH
+ 0xF094: 0x9960, //CJK UNIFIED IDEOGRAPH
+ 0xF095: 0x9961, //CJK UNIFIED IDEOGRAPH
+ 0xF096: 0x9962, //CJK UNIFIED IDEOGRAPH
+ 0xF097: 0x9964, //CJK UNIFIED IDEOGRAPH
+ 0xF098: 0x9966, //CJK UNIFIED IDEOGRAPH
+ 0xF099: 0x9973, //CJK UNIFIED IDEOGRAPH
+ 0xF09A: 0x9978, //CJK UNIFIED IDEOGRAPH
+ 0xF09B: 0x9979, //CJK UNIFIED IDEOGRAPH
+ 0xF09C: 0x997B, //CJK UNIFIED IDEOGRAPH
+ 0xF09D: 0x997E, //CJK UNIFIED IDEOGRAPH
+ 0xF09E: 0x9982, //CJK UNIFIED IDEOGRAPH
+ 0xF09F: 0x9983, //CJK UNIFIED IDEOGRAPH
+ 0xF0A0: 0x9989, //CJK UNIFIED IDEOGRAPH
+ 0xF0A1: 0x7A39, //CJK UNIFIED IDEOGRAPH
+ 0xF0A2: 0x7A37, //CJK UNIFIED IDEOGRAPH
+ 0xF0A3: 0x7A51, //CJK UNIFIED IDEOGRAPH
+ 0xF0A4: 0x9ECF, //CJK UNIFIED IDEOGRAPH
+ 0xF0A5: 0x99A5, //CJK UNIFIED IDEOGRAPH
+ 0xF0A6: 0x7A70, //CJK UNIFIED IDEOGRAPH
+ 0xF0A7: 0x7688, //CJK UNIFIED IDEOGRAPH
+ 0xF0A8: 0x768E, //CJK UNIFIED IDEOGRAPH
+ 0xF0A9: 0x7693, //CJK UNIFIED IDEOGRAPH
+ 0xF0AA: 0x7699, //CJK UNIFIED IDEOGRAPH
+ 0xF0AB: 0x76A4, //CJK UNIFIED IDEOGRAPH
+ 0xF0AC: 0x74DE, //CJK UNIFIED IDEOGRAPH
+ 0xF0AD: 0x74E0, //CJK UNIFIED IDEOGRAPH
+ 0xF0AE: 0x752C, //CJK UNIFIED IDEOGRAPH
+ 0xF0AF: 0x9E20, //CJK UNIFIED IDEOGRAPH
+ 0xF0B0: 0x9E22, //CJK UNIFIED IDEOGRAPH
+ 0xF0B1: 0x9E28, //CJK UNIFIED IDEOGRAPH
+ 0xF0B2: 0x9E29, //CJK UNIFIED IDEOGRAPH
+ 0xF0B3: 0x9E2A, //CJK UNIFIED IDEOGRAPH
+ 0xF0B4: 0x9E2B, //CJK UNIFIED IDEOGRAPH
+ 0xF0B5: 0x9E2C, //CJK UNIFIED IDEOGRAPH
+ 0xF0B6: 0x9E32, //CJK UNIFIED IDEOGRAPH
+ 0xF0B7: 0x9E31, //CJK UNIFIED IDEOGRAPH
+ 0xF0B8: 0x9E36, //CJK UNIFIED IDEOGRAPH
+ 0xF0B9: 0x9E38, //CJK UNIFIED IDEOGRAPH
+ 0xF0BA: 0x9E37, //CJK UNIFIED IDEOGRAPH
+ 0xF0BB: 0x9E39, //CJK UNIFIED IDEOGRAPH
+ 0xF0BC: 0x9E3A, //CJK UNIFIED IDEOGRAPH
+ 0xF0BD: 0x9E3E, //CJK UNIFIED IDEOGRAPH
+ 0xF0BE: 0x9E41, //CJK UNIFIED IDEOGRAPH
+ 0xF0BF: 0x9E42, //CJK UNIFIED IDEOGRAPH
+ 0xF0C0: 0x9E44, //CJK UNIFIED IDEOGRAPH
+ 0xF0C1: 0x9E46, //CJK UNIFIED IDEOGRAPH
+ 0xF0C2: 0x9E47, //CJK UNIFIED IDEOGRAPH
+ 0xF0C3: 0x9E48, //CJK UNIFIED IDEOGRAPH
+ 0xF0C4: 0x9E49, //CJK UNIFIED IDEOGRAPH
+ 0xF0C5: 0x9E4B, //CJK UNIFIED IDEOGRAPH
+ 0xF0C6: 0x9E4C, //CJK UNIFIED IDEOGRAPH
+ 0xF0C7: 0x9E4E, //CJK UNIFIED IDEOGRAPH
+ 0xF0C8: 0x9E51, //CJK UNIFIED IDEOGRAPH
+ 0xF0C9: 0x9E55, //CJK UNIFIED IDEOGRAPH
+ 0xF0CA: 0x9E57, //CJK UNIFIED IDEOGRAPH
+ 0xF0CB: 0x9E5A, //CJK UNIFIED IDEOGRAPH
+ 0xF0CC: 0x9E5B, //CJK UNIFIED IDEOGRAPH
+ 0xF0CD: 0x9E5C, //CJK UNIFIED IDEOGRAPH
+ 0xF0CE: 0x9E5E, //CJK UNIFIED IDEOGRAPH
+ 0xF0CF: 0x9E63, //CJK UNIFIED IDEOGRAPH
+ 0xF0D0: 0x9E66, //CJK UNIFIED IDEOGRAPH
+ 0xF0D1: 0x9E67, //CJK UNIFIED IDEOGRAPH
+ 0xF0D2: 0x9E68, //CJK UNIFIED IDEOGRAPH
+ 0xF0D3: 0x9E69, //CJK UNIFIED IDEOGRAPH
+ 0xF0D4: 0x9E6A, //CJK UNIFIED IDEOGRAPH
+ 0xF0D5: 0x9E6B, //CJK UNIFIED IDEOGRAPH
+ 0xF0D6: 0x9E6C, //CJK UNIFIED IDEOGRAPH
+ 0xF0D7: 0x9E71, //CJK UNIFIED IDEOGRAPH
+ 0xF0D8: 0x9E6D, //CJK UNIFIED IDEOGRAPH
+ 0xF0D9: 0x9E73, //CJK UNIFIED IDEOGRAPH
+ 0xF0DA: 0x7592, //CJK UNIFIED IDEOGRAPH
+ 0xF0DB: 0x7594, //CJK UNIFIED IDEOGRAPH
+ 0xF0DC: 0x7596, //CJK UNIFIED IDEOGRAPH
+ 0xF0DD: 0x75A0, //CJK UNIFIED IDEOGRAPH
+ 0xF0DE: 0x759D, //CJK UNIFIED IDEOGRAPH
+ 0xF0DF: 0x75AC, //CJK UNIFIED IDEOGRAPH
+ 0xF0E0: 0x75A3, //CJK UNIFIED IDEOGRAPH
+ 0xF0E1: 0x75B3, //CJK UNIFIED IDEOGRAPH
+ 0xF0E2: 0x75B4, //CJK UNIFIED IDEOGRAPH
+ 0xF0E3: 0x75B8, //CJK UNIFIED IDEOGRAPH
+ 0xF0E4: 0x75C4, //CJK UNIFIED IDEOGRAPH
+ 0xF0E5: 0x75B1, //CJK UNIFIED IDEOGRAPH
+ 0xF0E6: 0x75B0, //CJK UNIFIED IDEOGRAPH
+ 0xF0E7: 0x75C3, //CJK UNIFIED IDEOGRAPH
+ 0xF0E8: 0x75C2, //CJK UNIFIED IDEOGRAPH
+ 0xF0E9: 0x75D6, //CJK UNIFIED IDEOGRAPH
+ 0xF0EA: 0x75CD, //CJK UNIFIED IDEOGRAPH
+ 0xF0EB: 0x75E3, //CJK UNIFIED IDEOGRAPH
+ 0xF0EC: 0x75E8, //CJK UNIFIED IDEOGRAPH
+ 0xF0ED: 0x75E6, //CJK UNIFIED IDEOGRAPH
+ 0xF0EE: 0x75E4, //CJK UNIFIED IDEOGRAPH
+ 0xF0EF: 0x75EB, //CJK UNIFIED IDEOGRAPH
+ 0xF0F0: 0x75E7, //CJK UNIFIED IDEOGRAPH
+ 0xF0F1: 0x7603, //CJK UNIFIED IDEOGRAPH
+ 0xF0F2: 0x75F1, //CJK UNIFIED IDEOGRAPH
+ 0xF0F3: 0x75FC, //CJK UNIFIED IDEOGRAPH
+ 0xF0F4: 0x75FF, //CJK UNIFIED IDEOGRAPH
+ 0xF0F5: 0x7610, //CJK UNIFIED IDEOGRAPH
+ 0xF0F6: 0x7600, //CJK UNIFIED IDEOGRAPH
+ 0xF0F7: 0x7605, //CJK UNIFIED IDEOGRAPH
+ 0xF0F8: 0x760C, //CJK UNIFIED IDEOGRAPH
+ 0xF0F9: 0x7617, //CJK UNIFIED IDEOGRAPH
+ 0xF0FA: 0x760A, //CJK UNIFIED IDEOGRAPH
+ 0xF0FB: 0x7625, //CJK UNIFIED IDEOGRAPH
+ 0xF0FC: 0x7618, //CJK UNIFIED IDEOGRAPH
+ 0xF0FD: 0x7615, //CJK UNIFIED IDEOGRAPH
+ 0xF0FE: 0x7619, //CJK UNIFIED IDEOGRAPH
+ 0xF140: 0x998C, //CJK UNIFIED IDEOGRAPH
+ 0xF141: 0x998E, //CJK UNIFIED IDEOGRAPH
+ 0xF142: 0x999A, //CJK UNIFIED IDEOGRAPH
+ 0xF143: 0x999B, //CJK UNIFIED IDEOGRAPH
+ 0xF144: 0x999C, //CJK UNIFIED IDEOGRAPH
+ 0xF145: 0x999D, //CJK UNIFIED IDEOGRAPH
+ 0xF146: 0x999E, //CJK UNIFIED IDEOGRAPH
+ 0xF147: 0x999F, //CJK UNIFIED IDEOGRAPH
+ 0xF148: 0x99A0, //CJK UNIFIED IDEOGRAPH
+ 0xF149: 0x99A1, //CJK UNIFIED IDEOGRAPH
+ 0xF14A: 0x99A2, //CJK UNIFIED IDEOGRAPH
+ 0xF14B: 0x99A3, //CJK UNIFIED IDEOGRAPH
+ 0xF14C: 0x99A4, //CJK UNIFIED IDEOGRAPH
+ 0xF14D: 0x99A6, //CJK UNIFIED IDEOGRAPH
+ 0xF14E: 0x99A7, //CJK UNIFIED IDEOGRAPH
+ 0xF14F: 0x99A9, //CJK UNIFIED IDEOGRAPH
+ 0xF150: 0x99AA, //CJK UNIFIED IDEOGRAPH
+ 0xF151: 0x99AB, //CJK UNIFIED IDEOGRAPH
+ 0xF152: 0x99AC, //CJK UNIFIED IDEOGRAPH
+ 0xF153: 0x99AD, //CJK UNIFIED IDEOGRAPH
+ 0xF154: 0x99AE, //CJK UNIFIED IDEOGRAPH
+ 0xF155: 0x99AF, //CJK UNIFIED IDEOGRAPH
+ 0xF156: 0x99B0, //CJK UNIFIED IDEOGRAPH
+ 0xF157: 0x99B1, //CJK UNIFIED IDEOGRAPH
+ 0xF158: 0x99B2, //CJK UNIFIED IDEOGRAPH
+ 0xF159: 0x99B3, //CJK UNIFIED IDEOGRAPH
+ 0xF15A: 0x99B4, //CJK UNIFIED IDEOGRAPH
+ 0xF15B: 0x99B5, //CJK UNIFIED IDEOGRAPH
+ 0xF15C: 0x99B6, //CJK UNIFIED IDEOGRAPH
+ 0xF15D: 0x99B7, //CJK UNIFIED IDEOGRAPH
+ 0xF15E: 0x99B8, //CJK UNIFIED IDEOGRAPH
+ 0xF15F: 0x99B9, //CJK UNIFIED IDEOGRAPH
+ 0xF160: 0x99BA, //CJK UNIFIED IDEOGRAPH
+ 0xF161: 0x99BB, //CJK UNIFIED IDEOGRAPH
+ 0xF162: 0x99BC, //CJK UNIFIED IDEOGRAPH
+ 0xF163: 0x99BD, //CJK UNIFIED IDEOGRAPH
+ 0xF164: 0x99BE, //CJK UNIFIED IDEOGRAPH
+ 0xF165: 0x99BF, //CJK UNIFIED IDEOGRAPH
+ 0xF166: 0x99C0, //CJK UNIFIED IDEOGRAPH
+ 0xF167: 0x99C1, //CJK UNIFIED IDEOGRAPH
+ 0xF168: 0x99C2, //CJK UNIFIED IDEOGRAPH
+ 0xF169: 0x99C3, //CJK UNIFIED IDEOGRAPH
+ 0xF16A: 0x99C4, //CJK UNIFIED IDEOGRAPH
+ 0xF16B: 0x99C5, //CJK UNIFIED IDEOGRAPH
+ 0xF16C: 0x99C6, //CJK UNIFIED IDEOGRAPH
+ 0xF16D: 0x99C7, //CJK UNIFIED IDEOGRAPH
+ 0xF16E: 0x99C8, //CJK UNIFIED IDEOGRAPH
+ 0xF16F: 0x99C9, //CJK UNIFIED IDEOGRAPH
+ 0xF170: 0x99CA, //CJK UNIFIED IDEOGRAPH
+ 0xF171: 0x99CB, //CJK UNIFIED IDEOGRAPH
+ 0xF172: 0x99CC, //CJK UNIFIED IDEOGRAPH
+ 0xF173: 0x99CD, //CJK UNIFIED IDEOGRAPH
+ 0xF174: 0x99CE, //CJK UNIFIED IDEOGRAPH
+ 0xF175: 0x99CF, //CJK UNIFIED IDEOGRAPH
+ 0xF176: 0x99D0, //CJK UNIFIED IDEOGRAPH
+ 0xF177: 0x99D1, //CJK UNIFIED IDEOGRAPH
+ 0xF178: 0x99D2, //CJK UNIFIED IDEOGRAPH
+ 0xF179: 0x99D3, //CJK UNIFIED IDEOGRAPH
+ 0xF17A: 0x99D4, //CJK UNIFIED IDEOGRAPH
+ 0xF17B: 0x99D5, //CJK UNIFIED IDEOGRAPH
+ 0xF17C: 0x99D6, //CJK UNIFIED IDEOGRAPH
+ 0xF17D: 0x99D7, //CJK UNIFIED IDEOGRAPH
+ 0xF17E: 0x99D8, //CJK UNIFIED IDEOGRAPH
+ 0xF180: 0x99D9, //CJK UNIFIED IDEOGRAPH
+ 0xF181: 0x99DA, //CJK UNIFIED IDEOGRAPH
+ 0xF182: 0x99DB, //CJK UNIFIED IDEOGRAPH
+ 0xF183: 0x99DC, //CJK UNIFIED IDEOGRAPH
+ 0xF184: 0x99DD, //CJK UNIFIED IDEOGRAPH
+ 0xF185: 0x99DE, //CJK UNIFIED IDEOGRAPH
+ 0xF186: 0x99DF, //CJK UNIFIED IDEOGRAPH
+ 0xF187: 0x99E0, //CJK UNIFIED IDEOGRAPH
+ 0xF188: 0x99E1, //CJK UNIFIED IDEOGRAPH
+ 0xF189: 0x99E2, //CJK UNIFIED IDEOGRAPH
+ 0xF18A: 0x99E3, //CJK UNIFIED IDEOGRAPH
+ 0xF18B: 0x99E4, //CJK UNIFIED IDEOGRAPH
+ 0xF18C: 0x99E5, //CJK UNIFIED IDEOGRAPH
+ 0xF18D: 0x99E6, //CJK UNIFIED IDEOGRAPH
+ 0xF18E: 0x99E7, //CJK UNIFIED IDEOGRAPH
+ 0xF18F: 0x99E8, //CJK UNIFIED IDEOGRAPH
+ 0xF190: 0x99E9, //CJK UNIFIED IDEOGRAPH
+ 0xF191: 0x99EA, //CJK UNIFIED IDEOGRAPH
+ 0xF192: 0x99EB, //CJK UNIFIED IDEOGRAPH
+ 0xF193: 0x99EC, //CJK UNIFIED IDEOGRAPH
+ 0xF194: 0x99ED, //CJK UNIFIED IDEOGRAPH
+ 0xF195: 0x99EE, //CJK UNIFIED IDEOGRAPH
+ 0xF196: 0x99EF, //CJK UNIFIED IDEOGRAPH
+ 0xF197: 0x99F0, //CJK UNIFIED IDEOGRAPH
+ 0xF198: 0x99F1, //CJK UNIFIED IDEOGRAPH
+ 0xF199: 0x99F2, //CJK UNIFIED IDEOGRAPH
+ 0xF19A: 0x99F3, //CJK UNIFIED IDEOGRAPH
+ 0xF19B: 0x99F4, //CJK UNIFIED IDEOGRAPH
+ 0xF19C: 0x99F5, //CJK UNIFIED IDEOGRAPH
+ 0xF19D: 0x99F6, //CJK UNIFIED IDEOGRAPH
+ 0xF19E: 0x99F7, //CJK UNIFIED IDEOGRAPH
+ 0xF19F: 0x99F8, //CJK UNIFIED IDEOGRAPH
+ 0xF1A0: 0x99F9, //CJK UNIFIED IDEOGRAPH
+ 0xF1A1: 0x761B, //CJK UNIFIED IDEOGRAPH
+ 0xF1A2: 0x763C, //CJK UNIFIED IDEOGRAPH
+ 0xF1A3: 0x7622, //CJK UNIFIED IDEOGRAPH
+ 0xF1A4: 0x7620, //CJK UNIFIED IDEOGRAPH
+ 0xF1A5: 0x7640, //CJK UNIFIED IDEOGRAPH
+ 0xF1A6: 0x762D, //CJK UNIFIED IDEOGRAPH
+ 0xF1A7: 0x7630, //CJK UNIFIED IDEOGRAPH
+ 0xF1A8: 0x763F, //CJK UNIFIED IDEOGRAPH
+ 0xF1A9: 0x7635, //CJK UNIFIED IDEOGRAPH
+ 0xF1AA: 0x7643, //CJK UNIFIED IDEOGRAPH
+ 0xF1AB: 0x763E, //CJK UNIFIED IDEOGRAPH
+ 0xF1AC: 0x7633, //CJK UNIFIED IDEOGRAPH
+ 0xF1AD: 0x764D, //CJK UNIFIED IDEOGRAPH
+ 0xF1AE: 0x765E, //CJK UNIFIED IDEOGRAPH
+ 0xF1AF: 0x7654, //CJK UNIFIED IDEOGRAPH
+ 0xF1B0: 0x765C, //CJK UNIFIED IDEOGRAPH
+ 0xF1B1: 0x7656, //CJK UNIFIED IDEOGRAPH
+ 0xF1B2: 0x766B, //CJK UNIFIED IDEOGRAPH
+ 0xF1B3: 0x766F, //CJK UNIFIED IDEOGRAPH
+ 0xF1B4: 0x7FCA, //CJK UNIFIED IDEOGRAPH
+ 0xF1B5: 0x7AE6, //CJK UNIFIED IDEOGRAPH
+ 0xF1B6: 0x7A78, //CJK UNIFIED IDEOGRAPH
+ 0xF1B7: 0x7A79, //CJK UNIFIED IDEOGRAPH
+ 0xF1B8: 0x7A80, //CJK UNIFIED IDEOGRAPH
+ 0xF1B9: 0x7A86, //CJK UNIFIED IDEOGRAPH
+ 0xF1BA: 0x7A88, //CJK UNIFIED IDEOGRAPH
+ 0xF1BB: 0x7A95, //CJK UNIFIED IDEOGRAPH
+ 0xF1BC: 0x7AA6, //CJK UNIFIED IDEOGRAPH
+ 0xF1BD: 0x7AA0, //CJK UNIFIED IDEOGRAPH
+ 0xF1BE: 0x7AAC, //CJK UNIFIED IDEOGRAPH
+ 0xF1BF: 0x7AA8, //CJK UNIFIED IDEOGRAPH
+ 0xF1C0: 0x7AAD, //CJK UNIFIED IDEOGRAPH
+ 0xF1C1: 0x7AB3, //CJK UNIFIED IDEOGRAPH
+ 0xF1C2: 0x8864, //CJK UNIFIED IDEOGRAPH
+ 0xF1C3: 0x8869, //CJK UNIFIED IDEOGRAPH
+ 0xF1C4: 0x8872, //CJK UNIFIED IDEOGRAPH
+ 0xF1C5: 0x887D, //CJK UNIFIED IDEOGRAPH
+ 0xF1C6: 0x887F, //CJK UNIFIED IDEOGRAPH
+ 0xF1C7: 0x8882, //CJK UNIFIED IDEOGRAPH
+ 0xF1C8: 0x88A2, //CJK UNIFIED IDEOGRAPH
+ 0xF1C9: 0x88C6, //CJK UNIFIED IDEOGRAPH
+ 0xF1CA: 0x88B7, //CJK UNIFIED IDEOGRAPH
+ 0xF1CB: 0x88BC, //CJK UNIFIED IDEOGRAPH
+ 0xF1CC: 0x88C9, //CJK UNIFIED IDEOGRAPH
+ 0xF1CD: 0x88E2, //CJK UNIFIED IDEOGRAPH
+ 0xF1CE: 0x88CE, //CJK UNIFIED IDEOGRAPH
+ 0xF1CF: 0x88E3, //CJK UNIFIED IDEOGRAPH
+ 0xF1D0: 0x88E5, //CJK UNIFIED IDEOGRAPH
+ 0xF1D1: 0x88F1, //CJK UNIFIED IDEOGRAPH
+ 0xF1D2: 0x891A, //CJK UNIFIED IDEOGRAPH
+ 0xF1D3: 0x88FC, //CJK UNIFIED IDEOGRAPH
+ 0xF1D4: 0x88E8, //CJK UNIFIED IDEOGRAPH
+ 0xF1D5: 0x88FE, //CJK UNIFIED IDEOGRAPH
+ 0xF1D6: 0x88F0, //CJK UNIFIED IDEOGRAPH
+ 0xF1D7: 0x8921, //CJK UNIFIED IDEOGRAPH
+ 0xF1D8: 0x8919, //CJK UNIFIED IDEOGRAPH
+ 0xF1D9: 0x8913, //CJK UNIFIED IDEOGRAPH
+ 0xF1DA: 0x891B, //CJK UNIFIED IDEOGRAPH
+ 0xF1DB: 0x890A, //CJK UNIFIED IDEOGRAPH
+ 0xF1DC: 0x8934, //CJK UNIFIED IDEOGRAPH
+ 0xF1DD: 0x892B, //CJK UNIFIED IDEOGRAPH
+ 0xF1DE: 0x8936, //CJK UNIFIED IDEOGRAPH
+ 0xF1DF: 0x8941, //CJK UNIFIED IDEOGRAPH
+ 0xF1E0: 0x8966, //CJK UNIFIED IDEOGRAPH
+ 0xF1E1: 0x897B, //CJK UNIFIED IDEOGRAPH
+ 0xF1E2: 0x758B, //CJK UNIFIED IDEOGRAPH
+ 0xF1E3: 0x80E5, //CJK UNIFIED IDEOGRAPH
+ 0xF1E4: 0x76B2, //CJK UNIFIED IDEOGRAPH
+ 0xF1E5: 0x76B4, //CJK UNIFIED IDEOGRAPH
+ 0xF1E6: 0x77DC, //CJK UNIFIED IDEOGRAPH
+ 0xF1E7: 0x8012, //CJK UNIFIED IDEOGRAPH
+ 0xF1E8: 0x8014, //CJK UNIFIED IDEOGRAPH
+ 0xF1E9: 0x8016, //CJK UNIFIED IDEOGRAPH
+ 0xF1EA: 0x801C, //CJK UNIFIED IDEOGRAPH
+ 0xF1EB: 0x8020, //CJK UNIFIED IDEOGRAPH
+ 0xF1EC: 0x8022, //CJK UNIFIED IDEOGRAPH
+ 0xF1ED: 0x8025, //CJK UNIFIED IDEOGRAPH
+ 0xF1EE: 0x8026, //CJK UNIFIED IDEOGRAPH
+ 0xF1EF: 0x8027, //CJK UNIFIED IDEOGRAPH
+ 0xF1F0: 0x8029, //CJK UNIFIED IDEOGRAPH
+ 0xF1F1: 0x8028, //CJK UNIFIED IDEOGRAPH
+ 0xF1F2: 0x8031, //CJK UNIFIED IDEOGRAPH
+ 0xF1F3: 0x800B, //CJK UNIFIED IDEOGRAPH
+ 0xF1F4: 0x8035, //CJK UNIFIED IDEOGRAPH
+ 0xF1F5: 0x8043, //CJK UNIFIED IDEOGRAPH
+ 0xF1F6: 0x8046, //CJK UNIFIED IDEOGRAPH
+ 0xF1F7: 0x804D, //CJK UNIFIED IDEOGRAPH
+ 0xF1F8: 0x8052, //CJK UNIFIED IDEOGRAPH
+ 0xF1F9: 0x8069, //CJK UNIFIED IDEOGRAPH
+ 0xF1FA: 0x8071, //CJK UNIFIED IDEOGRAPH
+ 0xF1FB: 0x8983, //CJK UNIFIED IDEOGRAPH
+ 0xF1FC: 0x9878, //CJK UNIFIED IDEOGRAPH
+ 0xF1FD: 0x9880, //CJK UNIFIED IDEOGRAPH
+ 0xF1FE: 0x9883, //CJK UNIFIED IDEOGRAPH
+ 0xF240: 0x99FA, //CJK UNIFIED IDEOGRAPH
+ 0xF241: 0x99FB, //CJK UNIFIED IDEOGRAPH
+ 0xF242: 0x99FC, //CJK UNIFIED IDEOGRAPH
+ 0xF243: 0x99FD, //CJK UNIFIED IDEOGRAPH
+ 0xF244: 0x99FE, //CJK UNIFIED IDEOGRAPH
+ 0xF245: 0x99FF, //CJK UNIFIED IDEOGRAPH
+ 0xF246: 0x9A00, //CJK UNIFIED IDEOGRAPH
+ 0xF247: 0x9A01, //CJK UNIFIED IDEOGRAPH
+ 0xF248: 0x9A02, //CJK UNIFIED IDEOGRAPH
+ 0xF249: 0x9A03, //CJK UNIFIED IDEOGRAPH
+ 0xF24A: 0x9A04, //CJK UNIFIED IDEOGRAPH
+ 0xF24B: 0x9A05, //CJK UNIFIED IDEOGRAPH
+ 0xF24C: 0x9A06, //CJK UNIFIED IDEOGRAPH
+ 0xF24D: 0x9A07, //CJK UNIFIED IDEOGRAPH
+ 0xF24E: 0x9A08, //CJK UNIFIED IDEOGRAPH
+ 0xF24F: 0x9A09, //CJK UNIFIED IDEOGRAPH
+ 0xF250: 0x9A0A, //CJK UNIFIED IDEOGRAPH
+ 0xF251: 0x9A0B, //CJK UNIFIED IDEOGRAPH
+ 0xF252: 0x9A0C, //CJK UNIFIED IDEOGRAPH
+ 0xF253: 0x9A0D, //CJK UNIFIED IDEOGRAPH
+ 0xF254: 0x9A0E, //CJK UNIFIED IDEOGRAPH
+ 0xF255: 0x9A0F, //CJK UNIFIED IDEOGRAPH
+ 0xF256: 0x9A10, //CJK UNIFIED IDEOGRAPH
+ 0xF257: 0x9A11, //CJK UNIFIED IDEOGRAPH
+ 0xF258: 0x9A12, //CJK UNIFIED IDEOGRAPH
+ 0xF259: 0x9A13, //CJK UNIFIED IDEOGRAPH
+ 0xF25A: 0x9A14, //CJK UNIFIED IDEOGRAPH
+ 0xF25B: 0x9A15, //CJK UNIFIED IDEOGRAPH
+ 0xF25C: 0x9A16, //CJK UNIFIED IDEOGRAPH
+ 0xF25D: 0x9A17, //CJK UNIFIED IDEOGRAPH
+ 0xF25E: 0x9A18, //CJK UNIFIED IDEOGRAPH
+ 0xF25F: 0x9A19, //CJK UNIFIED IDEOGRAPH
+ 0xF260: 0x9A1A, //CJK UNIFIED IDEOGRAPH
+ 0xF261: 0x9A1B, //CJK UNIFIED IDEOGRAPH
+ 0xF262: 0x9A1C, //CJK UNIFIED IDEOGRAPH
+ 0xF263: 0x9A1D, //CJK UNIFIED IDEOGRAPH
+ 0xF264: 0x9A1E, //CJK UNIFIED IDEOGRAPH
+ 0xF265: 0x9A1F, //CJK UNIFIED IDEOGRAPH
+ 0xF266: 0x9A20, //CJK UNIFIED IDEOGRAPH
+ 0xF267: 0x9A21, //CJK UNIFIED IDEOGRAPH
+ 0xF268: 0x9A22, //CJK UNIFIED IDEOGRAPH
+ 0xF269: 0x9A23, //CJK UNIFIED IDEOGRAPH
+ 0xF26A: 0x9A24, //CJK UNIFIED IDEOGRAPH
+ 0xF26B: 0x9A25, //CJK UNIFIED IDEOGRAPH
+ 0xF26C: 0x9A26, //CJK UNIFIED IDEOGRAPH
+ 0xF26D: 0x9A27, //CJK UNIFIED IDEOGRAPH
+ 0xF26E: 0x9A28, //CJK UNIFIED IDEOGRAPH
+ 0xF26F: 0x9A29, //CJK UNIFIED IDEOGRAPH
+ 0xF270: 0x9A2A, //CJK UNIFIED IDEOGRAPH
+ 0xF271: 0x9A2B, //CJK UNIFIED IDEOGRAPH
+ 0xF272: 0x9A2C, //CJK UNIFIED IDEOGRAPH
+ 0xF273: 0x9A2D, //CJK UNIFIED IDEOGRAPH
+ 0xF274: 0x9A2E, //CJK UNIFIED IDEOGRAPH
+ 0xF275: 0x9A2F, //CJK UNIFIED IDEOGRAPH
+ 0xF276: 0x9A30, //CJK UNIFIED IDEOGRAPH
+ 0xF277: 0x9A31, //CJK UNIFIED IDEOGRAPH
+ 0xF278: 0x9A32, //CJK UNIFIED IDEOGRAPH
+ 0xF279: 0x9A33, //CJK UNIFIED IDEOGRAPH
+ 0xF27A: 0x9A34, //CJK UNIFIED IDEOGRAPH
+ 0xF27B: 0x9A35, //CJK UNIFIED IDEOGRAPH
+ 0xF27C: 0x9A36, //CJK UNIFIED IDEOGRAPH
+ 0xF27D: 0x9A37, //CJK UNIFIED IDEOGRAPH
+ 0xF27E: 0x9A38, //CJK UNIFIED IDEOGRAPH
+ 0xF280: 0x9A39, //CJK UNIFIED IDEOGRAPH
+ 0xF281: 0x9A3A, //CJK UNIFIED IDEOGRAPH
+ 0xF282: 0x9A3B, //CJK UNIFIED IDEOGRAPH
+ 0xF283: 0x9A3C, //CJK UNIFIED IDEOGRAPH
+ 0xF284: 0x9A3D, //CJK UNIFIED IDEOGRAPH
+ 0xF285: 0x9A3E, //CJK UNIFIED IDEOGRAPH
+ 0xF286: 0x9A3F, //CJK UNIFIED IDEOGRAPH
+ 0xF287: 0x9A40, //CJK UNIFIED IDEOGRAPH
+ 0xF288: 0x9A41, //CJK UNIFIED IDEOGRAPH
+ 0xF289: 0x9A42, //CJK UNIFIED IDEOGRAPH
+ 0xF28A: 0x9A43, //CJK UNIFIED IDEOGRAPH
+ 0xF28B: 0x9A44, //CJK UNIFIED IDEOGRAPH
+ 0xF28C: 0x9A45, //CJK UNIFIED IDEOGRAPH
+ 0xF28D: 0x9A46, //CJK UNIFIED IDEOGRAPH
+ 0xF28E: 0x9A47, //CJK UNIFIED IDEOGRAPH
+ 0xF28F: 0x9A48, //CJK UNIFIED IDEOGRAPH
+ 0xF290: 0x9A49, //CJK UNIFIED IDEOGRAPH
+ 0xF291: 0x9A4A, //CJK UNIFIED IDEOGRAPH
+ 0xF292: 0x9A4B, //CJK UNIFIED IDEOGRAPH
+ 0xF293: 0x9A4C, //CJK UNIFIED IDEOGRAPH
+ 0xF294: 0x9A4D, //CJK UNIFIED IDEOGRAPH
+ 0xF295: 0x9A4E, //CJK UNIFIED IDEOGRAPH
+ 0xF296: 0x9A4F, //CJK UNIFIED IDEOGRAPH
+ 0xF297: 0x9A50, //CJK UNIFIED IDEOGRAPH
+ 0xF298: 0x9A51, //CJK UNIFIED IDEOGRAPH
+ 0xF299: 0x9A52, //CJK UNIFIED IDEOGRAPH
+ 0xF29A: 0x9A53, //CJK UNIFIED IDEOGRAPH
+ 0xF29B: 0x9A54, //CJK UNIFIED IDEOGRAPH
+ 0xF29C: 0x9A55, //CJK UNIFIED IDEOGRAPH
+ 0xF29D: 0x9A56, //CJK UNIFIED IDEOGRAPH
+ 0xF29E: 0x9A57, //CJK UNIFIED IDEOGRAPH
+ 0xF29F: 0x9A58, //CJK UNIFIED IDEOGRAPH
+ 0xF2A0: 0x9A59, //CJK UNIFIED IDEOGRAPH
+ 0xF2A1: 0x9889, //CJK UNIFIED IDEOGRAPH
+ 0xF2A2: 0x988C, //CJK UNIFIED IDEOGRAPH
+ 0xF2A3: 0x988D, //CJK UNIFIED IDEOGRAPH
+ 0xF2A4: 0x988F, //CJK UNIFIED IDEOGRAPH
+ 0xF2A5: 0x9894, //CJK UNIFIED IDEOGRAPH
+ 0xF2A6: 0x989A, //CJK UNIFIED IDEOGRAPH
+ 0xF2A7: 0x989B, //CJK UNIFIED IDEOGRAPH
+ 0xF2A8: 0x989E, //CJK UNIFIED IDEOGRAPH
+ 0xF2A9: 0x989F, //CJK UNIFIED IDEOGRAPH
+ 0xF2AA: 0x98A1, //CJK UNIFIED IDEOGRAPH
+ 0xF2AB: 0x98A2, //CJK UNIFIED IDEOGRAPH
+ 0xF2AC: 0x98A5, //CJK UNIFIED IDEOGRAPH
+ 0xF2AD: 0x98A6, //CJK UNIFIED IDEOGRAPH
+ 0xF2AE: 0x864D, //CJK UNIFIED IDEOGRAPH
+ 0xF2AF: 0x8654, //CJK UNIFIED IDEOGRAPH
+ 0xF2B0: 0x866C, //CJK UNIFIED IDEOGRAPH
+ 0xF2B1: 0x866E, //CJK UNIFIED IDEOGRAPH
+ 0xF2B2: 0x867F, //CJK UNIFIED IDEOGRAPH
+ 0xF2B3: 0x867A, //CJK UNIFIED IDEOGRAPH
+ 0xF2B4: 0x867C, //CJK UNIFIED IDEOGRAPH
+ 0xF2B5: 0x867B, //CJK UNIFIED IDEOGRAPH
+ 0xF2B6: 0x86A8, //CJK UNIFIED IDEOGRAPH
+ 0xF2B7: 0x868D, //CJK UNIFIED IDEOGRAPH
+ 0xF2B8: 0x868B, //CJK UNIFIED IDEOGRAPH
+ 0xF2B9: 0x86AC, //CJK UNIFIED IDEOGRAPH
+ 0xF2BA: 0x869D, //CJK UNIFIED IDEOGRAPH
+ 0xF2BB: 0x86A7, //CJK UNIFIED IDEOGRAPH
+ 0xF2BC: 0x86A3, //CJK UNIFIED IDEOGRAPH
+ 0xF2BD: 0x86AA, //CJK UNIFIED IDEOGRAPH
+ 0xF2BE: 0x8693, //CJK UNIFIED IDEOGRAPH
+ 0xF2BF: 0x86A9, //CJK UNIFIED IDEOGRAPH
+ 0xF2C0: 0x86B6, //CJK UNIFIED IDEOGRAPH
+ 0xF2C1: 0x86C4, //CJK UNIFIED IDEOGRAPH
+ 0xF2C2: 0x86B5, //CJK UNIFIED IDEOGRAPH
+ 0xF2C3: 0x86CE, //CJK UNIFIED IDEOGRAPH
+ 0xF2C4: 0x86B0, //CJK UNIFIED IDEOGRAPH
+ 0xF2C5: 0x86BA, //CJK UNIFIED IDEOGRAPH
+ 0xF2C6: 0x86B1, //CJK UNIFIED IDEOGRAPH
+ 0xF2C7: 0x86AF, //CJK UNIFIED IDEOGRAPH
+ 0xF2C8: 0x86C9, //CJK UNIFIED IDEOGRAPH
+ 0xF2C9: 0x86CF, //CJK UNIFIED IDEOGRAPH
+ 0xF2CA: 0x86B4, //CJK UNIFIED IDEOGRAPH
+ 0xF2CB: 0x86E9, //CJK UNIFIED IDEOGRAPH
+ 0xF2CC: 0x86F1, //CJK UNIFIED IDEOGRAPH
+ 0xF2CD: 0x86F2, //CJK UNIFIED IDEOGRAPH
+ 0xF2CE: 0x86ED, //CJK UNIFIED IDEOGRAPH
+ 0xF2CF: 0x86F3, //CJK UNIFIED IDEOGRAPH
+ 0xF2D0: 0x86D0, //CJK UNIFIED IDEOGRAPH
+ 0xF2D1: 0x8713, //CJK UNIFIED IDEOGRAPH
+ 0xF2D2: 0x86DE, //CJK UNIFIED IDEOGRAPH
+ 0xF2D3: 0x86F4, //CJK UNIFIED IDEOGRAPH
+ 0xF2D4: 0x86DF, //CJK UNIFIED IDEOGRAPH
+ 0xF2D5: 0x86D8, //CJK UNIFIED IDEOGRAPH
+ 0xF2D6: 0x86D1, //CJK UNIFIED IDEOGRAPH
+ 0xF2D7: 0x8703, //CJK UNIFIED IDEOGRAPH
+ 0xF2D8: 0x8707, //CJK UNIFIED IDEOGRAPH
+ 0xF2D9: 0x86F8, //CJK UNIFIED IDEOGRAPH
+ 0xF2DA: 0x8708, //CJK UNIFIED IDEOGRAPH
+ 0xF2DB: 0x870A, //CJK UNIFIED IDEOGRAPH
+ 0xF2DC: 0x870D, //CJK UNIFIED IDEOGRAPH
+ 0xF2DD: 0x8709, //CJK UNIFIED IDEOGRAPH
+ 0xF2DE: 0x8723, //CJK UNIFIED IDEOGRAPH
+ 0xF2DF: 0x873B, //CJK UNIFIED IDEOGRAPH
+ 0xF2E0: 0x871E, //CJK UNIFIED IDEOGRAPH
+ 0xF2E1: 0x8725, //CJK UNIFIED IDEOGRAPH
+ 0xF2E2: 0x872E, //CJK UNIFIED IDEOGRAPH
+ 0xF2E3: 0x871A, //CJK UNIFIED IDEOGRAPH
+ 0xF2E4: 0x873E, //CJK UNIFIED IDEOGRAPH
+ 0xF2E5: 0x8748, //CJK UNIFIED IDEOGRAPH
+ 0xF2E6: 0x8734, //CJK UNIFIED IDEOGRAPH
+ 0xF2E7: 0x8731, //CJK UNIFIED IDEOGRAPH
+ 0xF2E8: 0x8729, //CJK UNIFIED IDEOGRAPH
+ 0xF2E9: 0x8737, //CJK UNIFIED IDEOGRAPH
+ 0xF2EA: 0x873F, //CJK UNIFIED IDEOGRAPH
+ 0xF2EB: 0x8782, //CJK UNIFIED IDEOGRAPH
+ 0xF2EC: 0x8722, //CJK UNIFIED IDEOGRAPH
+ 0xF2ED: 0x877D, //CJK UNIFIED IDEOGRAPH
+ 0xF2EE: 0x877E, //CJK UNIFIED IDEOGRAPH
+ 0xF2EF: 0x877B, //CJK UNIFIED IDEOGRAPH
+ 0xF2F0: 0x8760, //CJK UNIFIED IDEOGRAPH
+ 0xF2F1: 0x8770, //CJK UNIFIED IDEOGRAPH
+ 0xF2F2: 0x874C, //CJK UNIFIED IDEOGRAPH
+ 0xF2F3: 0x876E, //CJK UNIFIED IDEOGRAPH
+ 0xF2F4: 0x878B, //CJK UNIFIED IDEOGRAPH
+ 0xF2F5: 0x8753, //CJK UNIFIED IDEOGRAPH
+ 0xF2F6: 0x8763, //CJK UNIFIED IDEOGRAPH
+ 0xF2F7: 0x877C, //CJK UNIFIED IDEOGRAPH
+ 0xF2F8: 0x8764, //CJK UNIFIED IDEOGRAPH
+ 0xF2F9: 0x8759, //CJK UNIFIED IDEOGRAPH
+ 0xF2FA: 0x8765, //CJK UNIFIED IDEOGRAPH
+ 0xF2FB: 0x8793, //CJK UNIFIED IDEOGRAPH
+ 0xF2FC: 0x87AF, //CJK UNIFIED IDEOGRAPH
+ 0xF2FD: 0x87A8, //CJK UNIFIED IDEOGRAPH
+ 0xF2FE: 0x87D2, //CJK UNIFIED IDEOGRAPH
+ 0xF340: 0x9A5A, //CJK UNIFIED IDEOGRAPH
+ 0xF341: 0x9A5B, //CJK UNIFIED IDEOGRAPH
+ 0xF342: 0x9A5C, //CJK UNIFIED IDEOGRAPH
+ 0xF343: 0x9A5D, //CJK UNIFIED IDEOGRAPH
+ 0xF344: 0x9A5E, //CJK UNIFIED IDEOGRAPH
+ 0xF345: 0x9A5F, //CJK UNIFIED IDEOGRAPH
+ 0xF346: 0x9A60, //CJK UNIFIED IDEOGRAPH
+ 0xF347: 0x9A61, //CJK UNIFIED IDEOGRAPH
+ 0xF348: 0x9A62, //CJK UNIFIED IDEOGRAPH
+ 0xF349: 0x9A63, //CJK UNIFIED IDEOGRAPH
+ 0xF34A: 0x9A64, //CJK UNIFIED IDEOGRAPH
+ 0xF34B: 0x9A65, //CJK UNIFIED IDEOGRAPH
+ 0xF34C: 0x9A66, //CJK UNIFIED IDEOGRAPH
+ 0xF34D: 0x9A67, //CJK UNIFIED IDEOGRAPH
+ 0xF34E: 0x9A68, //CJK UNIFIED IDEOGRAPH
+ 0xF34F: 0x9A69, //CJK UNIFIED IDEOGRAPH
+ 0xF350: 0x9A6A, //CJK UNIFIED IDEOGRAPH
+ 0xF351: 0x9A6B, //CJK UNIFIED IDEOGRAPH
+ 0xF352: 0x9A72, //CJK UNIFIED IDEOGRAPH
+ 0xF353: 0x9A83, //CJK UNIFIED IDEOGRAPH
+ 0xF354: 0x9A89, //CJK UNIFIED IDEOGRAPH
+ 0xF355: 0x9A8D, //CJK UNIFIED IDEOGRAPH
+ 0xF356: 0x9A8E, //CJK UNIFIED IDEOGRAPH
+ 0xF357: 0x9A94, //CJK UNIFIED IDEOGRAPH
+ 0xF358: 0x9A95, //CJK UNIFIED IDEOGRAPH
+ 0xF359: 0x9A99, //CJK UNIFIED IDEOGRAPH
+ 0xF35A: 0x9AA6, //CJK UNIFIED IDEOGRAPH
+ 0xF35B: 0x9AA9, //CJK UNIFIED IDEOGRAPH
+ 0xF35C: 0x9AAA, //CJK UNIFIED IDEOGRAPH
+ 0xF35D: 0x9AAB, //CJK UNIFIED IDEOGRAPH
+ 0xF35E: 0x9AAC, //CJK UNIFIED IDEOGRAPH
+ 0xF35F: 0x9AAD, //CJK UNIFIED IDEOGRAPH
+ 0xF360: 0x9AAE, //CJK UNIFIED IDEOGRAPH
+ 0xF361: 0x9AAF, //CJK UNIFIED IDEOGRAPH
+ 0xF362: 0x9AB2, //CJK UNIFIED IDEOGRAPH
+ 0xF363: 0x9AB3, //CJK UNIFIED IDEOGRAPH
+ 0xF364: 0x9AB4, //CJK UNIFIED IDEOGRAPH
+ 0xF365: 0x9AB5, //CJK UNIFIED IDEOGRAPH
+ 0xF366: 0x9AB9, //CJK UNIFIED IDEOGRAPH
+ 0xF367: 0x9ABB, //CJK UNIFIED IDEOGRAPH
+ 0xF368: 0x9ABD, //CJK UNIFIED IDEOGRAPH
+ 0xF369: 0x9ABE, //CJK UNIFIED IDEOGRAPH
+ 0xF36A: 0x9ABF, //CJK UNIFIED IDEOGRAPH
+ 0xF36B: 0x9AC3, //CJK UNIFIED IDEOGRAPH
+ 0xF36C: 0x9AC4, //CJK UNIFIED IDEOGRAPH
+ 0xF36D: 0x9AC6, //CJK UNIFIED IDEOGRAPH
+ 0xF36E: 0x9AC7, //CJK UNIFIED IDEOGRAPH
+ 0xF36F: 0x9AC8, //CJK UNIFIED IDEOGRAPH
+ 0xF370: 0x9AC9, //CJK UNIFIED IDEOGRAPH
+ 0xF371: 0x9ACA, //CJK UNIFIED IDEOGRAPH
+ 0xF372: 0x9ACD, //CJK UNIFIED IDEOGRAPH
+ 0xF373: 0x9ACE, //CJK UNIFIED IDEOGRAPH
+ 0xF374: 0x9ACF, //CJK UNIFIED IDEOGRAPH
+ 0xF375: 0x9AD0, //CJK UNIFIED IDEOGRAPH
+ 0xF376: 0x9AD2, //CJK UNIFIED IDEOGRAPH
+ 0xF377: 0x9AD4, //CJK UNIFIED IDEOGRAPH
+ 0xF378: 0x9AD5, //CJK UNIFIED IDEOGRAPH
+ 0xF379: 0x9AD6, //CJK UNIFIED IDEOGRAPH
+ 0xF37A: 0x9AD7, //CJK UNIFIED IDEOGRAPH
+ 0xF37B: 0x9AD9, //CJK UNIFIED IDEOGRAPH
+ 0xF37C: 0x9ADA, //CJK UNIFIED IDEOGRAPH
+ 0xF37D: 0x9ADB, //CJK UNIFIED IDEOGRAPH
+ 0xF37E: 0x9ADC, //CJK UNIFIED IDEOGRAPH
+ 0xF380: 0x9ADD, //CJK UNIFIED IDEOGRAPH
+ 0xF381: 0x9ADE, //CJK UNIFIED IDEOGRAPH
+ 0xF382: 0x9AE0, //CJK UNIFIED IDEOGRAPH
+ 0xF383: 0x9AE2, //CJK UNIFIED IDEOGRAPH
+ 0xF384: 0x9AE3, //CJK UNIFIED IDEOGRAPH
+ 0xF385: 0x9AE4, //CJK UNIFIED IDEOGRAPH
+ 0xF386: 0x9AE5, //CJK UNIFIED IDEOGRAPH
+ 0xF387: 0x9AE7, //CJK UNIFIED IDEOGRAPH
+ 0xF388: 0x9AE8, //CJK UNIFIED IDEOGRAPH
+ 0xF389: 0x9AE9, //CJK UNIFIED IDEOGRAPH
+ 0xF38A: 0x9AEA, //CJK UNIFIED IDEOGRAPH
+ 0xF38B: 0x9AEC, //CJK UNIFIED IDEOGRAPH
+ 0xF38C: 0x9AEE, //CJK UNIFIED IDEOGRAPH
+ 0xF38D: 0x9AF0, //CJK UNIFIED IDEOGRAPH
+ 0xF38E: 0x9AF1, //CJK UNIFIED IDEOGRAPH
+ 0xF38F: 0x9AF2, //CJK UNIFIED IDEOGRAPH
+ 0xF390: 0x9AF3, //CJK UNIFIED IDEOGRAPH
+ 0xF391: 0x9AF4, //CJK UNIFIED IDEOGRAPH
+ 0xF392: 0x9AF5, //CJK UNIFIED IDEOGRAPH
+ 0xF393: 0x9AF6, //CJK UNIFIED IDEOGRAPH
+ 0xF394: 0x9AF7, //CJK UNIFIED IDEOGRAPH
+ 0xF395: 0x9AF8, //CJK UNIFIED IDEOGRAPH
+ 0xF396: 0x9AFA, //CJK UNIFIED IDEOGRAPH
+ 0xF397: 0x9AFC, //CJK UNIFIED IDEOGRAPH
+ 0xF398: 0x9AFD, //CJK UNIFIED IDEOGRAPH
+ 0xF399: 0x9AFE, //CJK UNIFIED IDEOGRAPH
+ 0xF39A: 0x9AFF, //CJK UNIFIED IDEOGRAPH
+ 0xF39B: 0x9B00, //CJK UNIFIED IDEOGRAPH
+ 0xF39C: 0x9B01, //CJK UNIFIED IDEOGRAPH
+ 0xF39D: 0x9B02, //CJK UNIFIED IDEOGRAPH
+ 0xF39E: 0x9B04, //CJK UNIFIED IDEOGRAPH
+ 0xF39F: 0x9B05, //CJK UNIFIED IDEOGRAPH
+ 0xF3A0: 0x9B06, //CJK UNIFIED IDEOGRAPH
+ 0xF3A1: 0x87C6, //CJK UNIFIED IDEOGRAPH
+ 0xF3A2: 0x8788, //CJK UNIFIED IDEOGRAPH
+ 0xF3A3: 0x8785, //CJK UNIFIED IDEOGRAPH
+ 0xF3A4: 0x87AD, //CJK UNIFIED IDEOGRAPH
+ 0xF3A5: 0x8797, //CJK UNIFIED IDEOGRAPH
+ 0xF3A6: 0x8783, //CJK UNIFIED IDEOGRAPH
+ 0xF3A7: 0x87AB, //CJK UNIFIED IDEOGRAPH
+ 0xF3A8: 0x87E5, //CJK UNIFIED IDEOGRAPH
+ 0xF3A9: 0x87AC, //CJK UNIFIED IDEOGRAPH
+ 0xF3AA: 0x87B5, //CJK UNIFIED IDEOGRAPH
+ 0xF3AB: 0x87B3, //CJK UNIFIED IDEOGRAPH
+ 0xF3AC: 0x87CB, //CJK UNIFIED IDEOGRAPH
+ 0xF3AD: 0x87D3, //CJK UNIFIED IDEOGRAPH
+ 0xF3AE: 0x87BD, //CJK UNIFIED IDEOGRAPH
+ 0xF3AF: 0x87D1, //CJK UNIFIED IDEOGRAPH
+ 0xF3B0: 0x87C0, //CJK UNIFIED IDEOGRAPH
+ 0xF3B1: 0x87CA, //CJK UNIFIED IDEOGRAPH
+ 0xF3B2: 0x87DB, //CJK UNIFIED IDEOGRAPH
+ 0xF3B3: 0x87EA, //CJK UNIFIED IDEOGRAPH
+ 0xF3B4: 0x87E0, //CJK UNIFIED IDEOGRAPH
+ 0xF3B5: 0x87EE, //CJK UNIFIED IDEOGRAPH
+ 0xF3B6: 0x8816, //CJK UNIFIED IDEOGRAPH
+ 0xF3B7: 0x8813, //CJK UNIFIED IDEOGRAPH
+ 0xF3B8: 0x87FE, //CJK UNIFIED IDEOGRAPH
+ 0xF3B9: 0x880A, //CJK UNIFIED IDEOGRAPH
+ 0xF3BA: 0x881B, //CJK UNIFIED IDEOGRAPH
+ 0xF3BB: 0x8821, //CJK UNIFIED IDEOGRAPH
+ 0xF3BC: 0x8839, //CJK UNIFIED IDEOGRAPH
+ 0xF3BD: 0x883C, //CJK UNIFIED IDEOGRAPH
+ 0xF3BE: 0x7F36, //CJK UNIFIED IDEOGRAPH
+ 0xF3BF: 0x7F42, //CJK UNIFIED IDEOGRAPH
+ 0xF3C0: 0x7F44, //CJK UNIFIED IDEOGRAPH
+ 0xF3C1: 0x7F45, //CJK UNIFIED IDEOGRAPH
+ 0xF3C2: 0x8210, //CJK UNIFIED IDEOGRAPH
+ 0xF3C3: 0x7AFA, //CJK UNIFIED IDEOGRAPH
+ 0xF3C4: 0x7AFD, //CJK UNIFIED IDEOGRAPH
+ 0xF3C5: 0x7B08, //CJK UNIFIED IDEOGRAPH
+ 0xF3C6: 0x7B03, //CJK UNIFIED IDEOGRAPH
+ 0xF3C7: 0x7B04, //CJK UNIFIED IDEOGRAPH
+ 0xF3C8: 0x7B15, //CJK UNIFIED IDEOGRAPH
+ 0xF3C9: 0x7B0A, //CJK UNIFIED IDEOGRAPH
+ 0xF3CA: 0x7B2B, //CJK UNIFIED IDEOGRAPH
+ 0xF3CB: 0x7B0F, //CJK UNIFIED IDEOGRAPH
+ 0xF3CC: 0x7B47, //CJK UNIFIED IDEOGRAPH
+ 0xF3CD: 0x7B38, //CJK UNIFIED IDEOGRAPH
+ 0xF3CE: 0x7B2A, //CJK UNIFIED IDEOGRAPH
+ 0xF3CF: 0x7B19, //CJK UNIFIED IDEOGRAPH
+ 0xF3D0: 0x7B2E, //CJK UNIFIED IDEOGRAPH
+ 0xF3D1: 0x7B31, //CJK UNIFIED IDEOGRAPH
+ 0xF3D2: 0x7B20, //CJK UNIFIED IDEOGRAPH
+ 0xF3D3: 0x7B25, //CJK UNIFIED IDEOGRAPH
+ 0xF3D4: 0x7B24, //CJK UNIFIED IDEOGRAPH
+ 0xF3D5: 0x7B33, //CJK UNIFIED IDEOGRAPH
+ 0xF3D6: 0x7B3E, //CJK UNIFIED IDEOGRAPH
+ 0xF3D7: 0x7B1E, //CJK UNIFIED IDEOGRAPH
+ 0xF3D8: 0x7B58, //CJK UNIFIED IDEOGRAPH
+ 0xF3D9: 0x7B5A, //CJK UNIFIED IDEOGRAPH
+ 0xF3DA: 0x7B45, //CJK UNIFIED IDEOGRAPH
+ 0xF3DB: 0x7B75, //CJK UNIFIED IDEOGRAPH
+ 0xF3DC: 0x7B4C, //CJK UNIFIED IDEOGRAPH
+ 0xF3DD: 0x7B5D, //CJK UNIFIED IDEOGRAPH
+ 0xF3DE: 0x7B60, //CJK UNIFIED IDEOGRAPH
+ 0xF3DF: 0x7B6E, //CJK UNIFIED IDEOGRAPH
+ 0xF3E0: 0x7B7B, //CJK UNIFIED IDEOGRAPH
+ 0xF3E1: 0x7B62, //CJK UNIFIED IDEOGRAPH
+ 0xF3E2: 0x7B72, //CJK UNIFIED IDEOGRAPH
+ 0xF3E3: 0x7B71, //CJK UNIFIED IDEOGRAPH
+ 0xF3E4: 0x7B90, //CJK UNIFIED IDEOGRAPH
+ 0xF3E5: 0x7BA6, //CJK UNIFIED IDEOGRAPH
+ 0xF3E6: 0x7BA7, //CJK UNIFIED IDEOGRAPH
+ 0xF3E7: 0x7BB8, //CJK UNIFIED IDEOGRAPH
+ 0xF3E8: 0x7BAC, //CJK UNIFIED IDEOGRAPH
+ 0xF3E9: 0x7B9D, //CJK UNIFIED IDEOGRAPH
+ 0xF3EA: 0x7BA8, //CJK UNIFIED IDEOGRAPH
+ 0xF3EB: 0x7B85, //CJK UNIFIED IDEOGRAPH
+ 0xF3EC: 0x7BAA, //CJK UNIFIED IDEOGRAPH
+ 0xF3ED: 0x7B9C, //CJK UNIFIED IDEOGRAPH
+ 0xF3EE: 0x7BA2, //CJK UNIFIED IDEOGRAPH
+ 0xF3EF: 0x7BAB, //CJK UNIFIED IDEOGRAPH
+ 0xF3F0: 0x7BB4, //CJK UNIFIED IDEOGRAPH
+ 0xF3F1: 0x7BD1, //CJK UNIFIED IDEOGRAPH
+ 0xF3F2: 0x7BC1, //CJK UNIFIED IDEOGRAPH
+ 0xF3F3: 0x7BCC, //CJK UNIFIED IDEOGRAPH
+ 0xF3F4: 0x7BDD, //CJK UNIFIED IDEOGRAPH
+ 0xF3F5: 0x7BDA, //CJK UNIFIED IDEOGRAPH
+ 0xF3F6: 0x7BE5, //CJK UNIFIED IDEOGRAPH
+ 0xF3F7: 0x7BE6, //CJK UNIFIED IDEOGRAPH
+ 0xF3F8: 0x7BEA, //CJK UNIFIED IDEOGRAPH
+ 0xF3F9: 0x7C0C, //CJK UNIFIED IDEOGRAPH
+ 0xF3FA: 0x7BFE, //CJK UNIFIED IDEOGRAPH
+ 0xF3FB: 0x7BFC, //CJK UNIFIED IDEOGRAPH
+ 0xF3FC: 0x7C0F, //CJK UNIFIED IDEOGRAPH
+ 0xF3FD: 0x7C16, //CJK UNIFIED IDEOGRAPH
+ 0xF3FE: 0x7C0B, //CJK UNIFIED IDEOGRAPH
+ 0xF440: 0x9B07, //CJK UNIFIED IDEOGRAPH
+ 0xF441: 0x9B09, //CJK UNIFIED IDEOGRAPH
+ 0xF442: 0x9B0A, //CJK UNIFIED IDEOGRAPH
+ 0xF443: 0x9B0B, //CJK UNIFIED IDEOGRAPH
+ 0xF444: 0x9B0C, //CJK UNIFIED IDEOGRAPH
+ 0xF445: 0x9B0D, //CJK UNIFIED IDEOGRAPH
+ 0xF446: 0x9B0E, //CJK UNIFIED IDEOGRAPH
+ 0xF447: 0x9B10, //CJK UNIFIED IDEOGRAPH
+ 0xF448: 0x9B11, //CJK UNIFIED IDEOGRAPH
+ 0xF449: 0x9B12, //CJK UNIFIED IDEOGRAPH
+ 0xF44A: 0x9B14, //CJK UNIFIED IDEOGRAPH
+ 0xF44B: 0x9B15, //CJK UNIFIED IDEOGRAPH
+ 0xF44C: 0x9B16, //CJK UNIFIED IDEOGRAPH
+ 0xF44D: 0x9B17, //CJK UNIFIED IDEOGRAPH
+ 0xF44E: 0x9B18, //CJK UNIFIED IDEOGRAPH
+ 0xF44F: 0x9B19, //CJK UNIFIED IDEOGRAPH
+ 0xF450: 0x9B1A, //CJK UNIFIED IDEOGRAPH
+ 0xF451: 0x9B1B, //CJK UNIFIED IDEOGRAPH
+ 0xF452: 0x9B1C, //CJK UNIFIED IDEOGRAPH
+ 0xF453: 0x9B1D, //CJK UNIFIED IDEOGRAPH
+ 0xF454: 0x9B1E, //CJK UNIFIED IDEOGRAPH
+ 0xF455: 0x9B20, //CJK UNIFIED IDEOGRAPH
+ 0xF456: 0x9B21, //CJK UNIFIED IDEOGRAPH
+ 0xF457: 0x9B22, //CJK UNIFIED IDEOGRAPH
+ 0xF458: 0x9B24, //CJK UNIFIED IDEOGRAPH
+ 0xF459: 0x9B25, //CJK UNIFIED IDEOGRAPH
+ 0xF45A: 0x9B26, //CJK UNIFIED IDEOGRAPH
+ 0xF45B: 0x9B27, //CJK UNIFIED IDEOGRAPH
+ 0xF45C: 0x9B28, //CJK UNIFIED IDEOGRAPH
+ 0xF45D: 0x9B29, //CJK UNIFIED IDEOGRAPH
+ 0xF45E: 0x9B2A, //CJK UNIFIED IDEOGRAPH
+ 0xF45F: 0x9B2B, //CJK UNIFIED IDEOGRAPH
+ 0xF460: 0x9B2C, //CJK UNIFIED IDEOGRAPH
+ 0xF461: 0x9B2D, //CJK UNIFIED IDEOGRAPH
+ 0xF462: 0x9B2E, //CJK UNIFIED IDEOGRAPH
+ 0xF463: 0x9B30, //CJK UNIFIED IDEOGRAPH
+ 0xF464: 0x9B31, //CJK UNIFIED IDEOGRAPH
+ 0xF465: 0x9B33, //CJK UNIFIED IDEOGRAPH
+ 0xF466: 0x9B34, //CJK UNIFIED IDEOGRAPH
+ 0xF467: 0x9B35, //CJK UNIFIED IDEOGRAPH
+ 0xF468: 0x9B36, //CJK UNIFIED IDEOGRAPH
+ 0xF469: 0x9B37, //CJK UNIFIED IDEOGRAPH
+ 0xF46A: 0x9B38, //CJK UNIFIED IDEOGRAPH
+ 0xF46B: 0x9B39, //CJK UNIFIED IDEOGRAPH
+ 0xF46C: 0x9B3A, //CJK UNIFIED IDEOGRAPH
+ 0xF46D: 0x9B3D, //CJK UNIFIED IDEOGRAPH
+ 0xF46E: 0x9B3E, //CJK UNIFIED IDEOGRAPH
+ 0xF46F: 0x9B3F, //CJK UNIFIED IDEOGRAPH
+ 0xF470: 0x9B40, //CJK UNIFIED IDEOGRAPH
+ 0xF471: 0x9B46, //CJK UNIFIED IDEOGRAPH
+ 0xF472: 0x9B4A, //CJK UNIFIED IDEOGRAPH
+ 0xF473: 0x9B4B, //CJK UNIFIED IDEOGRAPH
+ 0xF474: 0x9B4C, //CJK UNIFIED IDEOGRAPH
+ 0xF475: 0x9B4E, //CJK UNIFIED IDEOGRAPH
+ 0xF476: 0x9B50, //CJK UNIFIED IDEOGRAPH
+ 0xF477: 0x9B52, //CJK UNIFIED IDEOGRAPH
+ 0xF478: 0x9B53, //CJK UNIFIED IDEOGRAPH
+ 0xF479: 0x9B55, //CJK UNIFIED IDEOGRAPH
+ 0xF47A: 0x9B56, //CJK UNIFIED IDEOGRAPH
+ 0xF47B: 0x9B57, //CJK UNIFIED IDEOGRAPH
+ 0xF47C: 0x9B58, //CJK UNIFIED IDEOGRAPH
+ 0xF47D: 0x9B59, //CJK UNIFIED IDEOGRAPH
+ 0xF47E: 0x9B5A, //CJK UNIFIED IDEOGRAPH
+ 0xF480: 0x9B5B, //CJK UNIFIED IDEOGRAPH
+ 0xF481: 0x9B5C, //CJK UNIFIED IDEOGRAPH
+ 0xF482: 0x9B5D, //CJK UNIFIED IDEOGRAPH
+ 0xF483: 0x9B5E, //CJK UNIFIED IDEOGRAPH
+ 0xF484: 0x9B5F, //CJK UNIFIED IDEOGRAPH
+ 0xF485: 0x9B60, //CJK UNIFIED IDEOGRAPH
+ 0xF486: 0x9B61, //CJK UNIFIED IDEOGRAPH
+ 0xF487: 0x9B62, //CJK UNIFIED IDEOGRAPH
+ 0xF488: 0x9B63, //CJK UNIFIED IDEOGRAPH
+ 0xF489: 0x9B64, //CJK UNIFIED IDEOGRAPH
+ 0xF48A: 0x9B65, //CJK UNIFIED IDEOGRAPH
+ 0xF48B: 0x9B66, //CJK UNIFIED IDEOGRAPH
+ 0xF48C: 0x9B67, //CJK UNIFIED IDEOGRAPH
+ 0xF48D: 0x9B68, //CJK UNIFIED IDEOGRAPH
+ 0xF48E: 0x9B69, //CJK UNIFIED IDEOGRAPH
+ 0xF48F: 0x9B6A, //CJK UNIFIED IDEOGRAPH
+ 0xF490: 0x9B6B, //CJK UNIFIED IDEOGRAPH
+ 0xF491: 0x9B6C, //CJK UNIFIED IDEOGRAPH
+ 0xF492: 0x9B6D, //CJK UNIFIED IDEOGRAPH
+ 0xF493: 0x9B6E, //CJK UNIFIED IDEOGRAPH
+ 0xF494: 0x9B6F, //CJK UNIFIED IDEOGRAPH
+ 0xF495: 0x9B70, //CJK UNIFIED IDEOGRAPH
+ 0xF496: 0x9B71, //CJK UNIFIED IDEOGRAPH
+ 0xF497: 0x9B72, //CJK UNIFIED IDEOGRAPH
+ 0xF498: 0x9B73, //CJK UNIFIED IDEOGRAPH
+ 0xF499: 0x9B74, //CJK UNIFIED IDEOGRAPH
+ 0xF49A: 0x9B75, //CJK UNIFIED IDEOGRAPH
+ 0xF49B: 0x9B76, //CJK UNIFIED IDEOGRAPH
+ 0xF49C: 0x9B77, //CJK UNIFIED IDEOGRAPH
+ 0xF49D: 0x9B78, //CJK UNIFIED IDEOGRAPH
+ 0xF49E: 0x9B79, //CJK UNIFIED IDEOGRAPH
+ 0xF49F: 0x9B7A, //CJK UNIFIED IDEOGRAPH
+ 0xF4A0: 0x9B7B, //CJK UNIFIED IDEOGRAPH
+ 0xF4A1: 0x7C1F, //CJK UNIFIED IDEOGRAPH
+ 0xF4A2: 0x7C2A, //CJK UNIFIED IDEOGRAPH
+ 0xF4A3: 0x7C26, //CJK UNIFIED IDEOGRAPH
+ 0xF4A4: 0x7C38, //CJK UNIFIED IDEOGRAPH
+ 0xF4A5: 0x7C41, //CJK UNIFIED IDEOGRAPH
+ 0xF4A6: 0x7C40, //CJK UNIFIED IDEOGRAPH
+ 0xF4A7: 0x81FE, //CJK UNIFIED IDEOGRAPH
+ 0xF4A8: 0x8201, //CJK UNIFIED IDEOGRAPH
+ 0xF4A9: 0x8202, //CJK UNIFIED IDEOGRAPH
+ 0xF4AA: 0x8204, //CJK UNIFIED IDEOGRAPH
+ 0xF4AB: 0x81EC, //CJK UNIFIED IDEOGRAPH
+ 0xF4AC: 0x8844, //CJK UNIFIED IDEOGRAPH
+ 0xF4AD: 0x8221, //CJK UNIFIED IDEOGRAPH
+ 0xF4AE: 0x8222, //CJK UNIFIED IDEOGRAPH
+ 0xF4AF: 0x8223, //CJK UNIFIED IDEOGRAPH
+ 0xF4B0: 0x822D, //CJK UNIFIED IDEOGRAPH
+ 0xF4B1: 0x822F, //CJK UNIFIED IDEOGRAPH
+ 0xF4B2: 0x8228, //CJK UNIFIED IDEOGRAPH
+ 0xF4B3: 0x822B, //CJK UNIFIED IDEOGRAPH
+ 0xF4B4: 0x8238, //CJK UNIFIED IDEOGRAPH
+ 0xF4B5: 0x823B, //CJK UNIFIED IDEOGRAPH
+ 0xF4B6: 0x8233, //CJK UNIFIED IDEOGRAPH
+ 0xF4B7: 0x8234, //CJK UNIFIED IDEOGRAPH
+ 0xF4B8: 0x823E, //CJK UNIFIED IDEOGRAPH
+ 0xF4B9: 0x8244, //CJK UNIFIED IDEOGRAPH
+ 0xF4BA: 0x8249, //CJK UNIFIED IDEOGRAPH
+ 0xF4BB: 0x824B, //CJK UNIFIED IDEOGRAPH
+ 0xF4BC: 0x824F, //CJK UNIFIED IDEOGRAPH
+ 0xF4BD: 0x825A, //CJK UNIFIED IDEOGRAPH
+ 0xF4BE: 0x825F, //CJK UNIFIED IDEOGRAPH
+ 0xF4BF: 0x8268, //CJK UNIFIED IDEOGRAPH
+ 0xF4C0: 0x887E, //CJK UNIFIED IDEOGRAPH
+ 0xF4C1: 0x8885, //CJK UNIFIED IDEOGRAPH
+ 0xF4C2: 0x8888, //CJK UNIFIED IDEOGRAPH
+ 0xF4C3: 0x88D8, //CJK UNIFIED IDEOGRAPH
+ 0xF4C4: 0x88DF, //CJK UNIFIED IDEOGRAPH
+ 0xF4C5: 0x895E, //CJK UNIFIED IDEOGRAPH
+ 0xF4C6: 0x7F9D, //CJK UNIFIED IDEOGRAPH
+ 0xF4C7: 0x7F9F, //CJK UNIFIED IDEOGRAPH
+ 0xF4C8: 0x7FA7, //CJK UNIFIED IDEOGRAPH
+ 0xF4C9: 0x7FAF, //CJK UNIFIED IDEOGRAPH
+ 0xF4CA: 0x7FB0, //CJK UNIFIED IDEOGRAPH
+ 0xF4CB: 0x7FB2, //CJK UNIFIED IDEOGRAPH
+ 0xF4CC: 0x7C7C, //CJK UNIFIED IDEOGRAPH
+ 0xF4CD: 0x6549, //CJK UNIFIED IDEOGRAPH
+ 0xF4CE: 0x7C91, //CJK UNIFIED IDEOGRAPH
+ 0xF4CF: 0x7C9D, //CJK UNIFIED IDEOGRAPH
+ 0xF4D0: 0x7C9C, //CJK UNIFIED IDEOGRAPH
+ 0xF4D1: 0x7C9E, //CJK UNIFIED IDEOGRAPH
+ 0xF4D2: 0x7CA2, //CJK UNIFIED IDEOGRAPH
+ 0xF4D3: 0x7CB2, //CJK UNIFIED IDEOGRAPH
+ 0xF4D4: 0x7CBC, //CJK UNIFIED IDEOGRAPH
+ 0xF4D5: 0x7CBD, //CJK UNIFIED IDEOGRAPH
+ 0xF4D6: 0x7CC1, //CJK UNIFIED IDEOGRAPH
+ 0xF4D7: 0x7CC7, //CJK UNIFIED IDEOGRAPH
+ 0xF4D8: 0x7CCC, //CJK UNIFIED IDEOGRAPH
+ 0xF4D9: 0x7CCD, //CJK UNIFIED IDEOGRAPH
+ 0xF4DA: 0x7CC8, //CJK UNIFIED IDEOGRAPH
+ 0xF4DB: 0x7CC5, //CJK UNIFIED IDEOGRAPH
+ 0xF4DC: 0x7CD7, //CJK UNIFIED IDEOGRAPH
+ 0xF4DD: 0x7CE8, //CJK UNIFIED IDEOGRAPH
+ 0xF4DE: 0x826E, //CJK UNIFIED IDEOGRAPH
+ 0xF4DF: 0x66A8, //CJK UNIFIED IDEOGRAPH
+ 0xF4E0: 0x7FBF, //CJK UNIFIED IDEOGRAPH
+ 0xF4E1: 0x7FCE, //CJK UNIFIED IDEOGRAPH
+ 0xF4E2: 0x7FD5, //CJK UNIFIED IDEOGRAPH
+ 0xF4E3: 0x7FE5, //CJK UNIFIED IDEOGRAPH
+ 0xF4E4: 0x7FE1, //CJK UNIFIED IDEOGRAPH
+ 0xF4E5: 0x7FE6, //CJK UNIFIED IDEOGRAPH
+ 0xF4E6: 0x7FE9, //CJK UNIFIED IDEOGRAPH
+ 0xF4E7: 0x7FEE, //CJK UNIFIED IDEOGRAPH
+ 0xF4E8: 0x7FF3, //CJK UNIFIED IDEOGRAPH
+ 0xF4E9: 0x7CF8, //CJK UNIFIED IDEOGRAPH
+ 0xF4EA: 0x7D77, //CJK UNIFIED IDEOGRAPH
+ 0xF4EB: 0x7DA6, //CJK UNIFIED IDEOGRAPH
+ 0xF4EC: 0x7DAE, //CJK UNIFIED IDEOGRAPH
+ 0xF4ED: 0x7E47, //CJK UNIFIED IDEOGRAPH
+ 0xF4EE: 0x7E9B, //CJK UNIFIED IDEOGRAPH
+ 0xF4EF: 0x9EB8, //CJK UNIFIED IDEOGRAPH
+ 0xF4F0: 0x9EB4, //CJK UNIFIED IDEOGRAPH
+ 0xF4F1: 0x8D73, //CJK UNIFIED IDEOGRAPH
+ 0xF4F2: 0x8D84, //CJK UNIFIED IDEOGRAPH
+ 0xF4F3: 0x8D94, //CJK UNIFIED IDEOGRAPH
+ 0xF4F4: 0x8D91, //CJK UNIFIED IDEOGRAPH
+ 0xF4F5: 0x8DB1, //CJK UNIFIED IDEOGRAPH
+ 0xF4F6: 0x8D67, //CJK UNIFIED IDEOGRAPH
+ 0xF4F7: 0x8D6D, //CJK UNIFIED IDEOGRAPH
+ 0xF4F8: 0x8C47, //CJK UNIFIED IDEOGRAPH
+ 0xF4F9: 0x8C49, //CJK UNIFIED IDEOGRAPH
+ 0xF4FA: 0x914A, //CJK UNIFIED IDEOGRAPH
+ 0xF4FB: 0x9150, //CJK UNIFIED IDEOGRAPH
+ 0xF4FC: 0x914E, //CJK UNIFIED IDEOGRAPH
+ 0xF4FD: 0x914F, //CJK UNIFIED IDEOGRAPH
+ 0xF4FE: 0x9164, //CJK UNIFIED IDEOGRAPH
+ 0xF540: 0x9B7C, //CJK UNIFIED IDEOGRAPH
+ 0xF541: 0x9B7D, //CJK UNIFIED IDEOGRAPH
+ 0xF542: 0x9B7E, //CJK UNIFIED IDEOGRAPH
+ 0xF543: 0x9B7F, //CJK UNIFIED IDEOGRAPH
+ 0xF544: 0x9B80, //CJK UNIFIED IDEOGRAPH
+ 0xF545: 0x9B81, //CJK UNIFIED IDEOGRAPH
+ 0xF546: 0x9B82, //CJK UNIFIED IDEOGRAPH
+ 0xF547: 0x9B83, //CJK UNIFIED IDEOGRAPH
+ 0xF548: 0x9B84, //CJK UNIFIED IDEOGRAPH
+ 0xF549: 0x9B85, //CJK UNIFIED IDEOGRAPH
+ 0xF54A: 0x9B86, //CJK UNIFIED IDEOGRAPH
+ 0xF54B: 0x9B87, //CJK UNIFIED IDEOGRAPH
+ 0xF54C: 0x9B88, //CJK UNIFIED IDEOGRAPH
+ 0xF54D: 0x9B89, //CJK UNIFIED IDEOGRAPH
+ 0xF54E: 0x9B8A, //CJK UNIFIED IDEOGRAPH
+ 0xF54F: 0x9B8B, //CJK UNIFIED IDEOGRAPH
+ 0xF550: 0x9B8C, //CJK UNIFIED IDEOGRAPH
+ 0xF551: 0x9B8D, //CJK UNIFIED IDEOGRAPH
+ 0xF552: 0x9B8E, //CJK UNIFIED IDEOGRAPH
+ 0xF553: 0x9B8F, //CJK UNIFIED IDEOGRAPH
+ 0xF554: 0x9B90, //CJK UNIFIED IDEOGRAPH
+ 0xF555: 0x9B91, //CJK UNIFIED IDEOGRAPH
+ 0xF556: 0x9B92, //CJK UNIFIED IDEOGRAPH
+ 0xF557: 0x9B93, //CJK UNIFIED IDEOGRAPH
+ 0xF558: 0x9B94, //CJK UNIFIED IDEOGRAPH
+ 0xF559: 0x9B95, //CJK UNIFIED IDEOGRAPH
+ 0xF55A: 0x9B96, //CJK UNIFIED IDEOGRAPH
+ 0xF55B: 0x9B97, //CJK UNIFIED IDEOGRAPH
+ 0xF55C: 0x9B98, //CJK UNIFIED IDEOGRAPH
+ 0xF55D: 0x9B99, //CJK UNIFIED IDEOGRAPH
+ 0xF55E: 0x9B9A, //CJK UNIFIED IDEOGRAPH
+ 0xF55F: 0x9B9B, //CJK UNIFIED IDEOGRAPH
+ 0xF560: 0x9B9C, //CJK UNIFIED IDEOGRAPH
+ 0xF561: 0x9B9D, //CJK UNIFIED IDEOGRAPH
+ 0xF562: 0x9B9E, //CJK UNIFIED IDEOGRAPH
+ 0xF563: 0x9B9F, //CJK UNIFIED IDEOGRAPH
+ 0xF564: 0x9BA0, //CJK UNIFIED IDEOGRAPH
+ 0xF565: 0x9BA1, //CJK UNIFIED IDEOGRAPH
+ 0xF566: 0x9BA2, //CJK UNIFIED IDEOGRAPH
+ 0xF567: 0x9BA3, //CJK UNIFIED IDEOGRAPH
+ 0xF568: 0x9BA4, //CJK UNIFIED IDEOGRAPH
+ 0xF569: 0x9BA5, //CJK UNIFIED IDEOGRAPH
+ 0xF56A: 0x9BA6, //CJK UNIFIED IDEOGRAPH
+ 0xF56B: 0x9BA7, //CJK UNIFIED IDEOGRAPH
+ 0xF56C: 0x9BA8, //CJK UNIFIED IDEOGRAPH
+ 0xF56D: 0x9BA9, //CJK UNIFIED IDEOGRAPH
+ 0xF56E: 0x9BAA, //CJK UNIFIED IDEOGRAPH
+ 0xF56F: 0x9BAB, //CJK UNIFIED IDEOGRAPH
+ 0xF570: 0x9BAC, //CJK UNIFIED IDEOGRAPH
+ 0xF571: 0x9BAD, //CJK UNIFIED IDEOGRAPH
+ 0xF572: 0x9BAE, //CJK UNIFIED IDEOGRAPH
+ 0xF573: 0x9BAF, //CJK UNIFIED IDEOGRAPH
+ 0xF574: 0x9BB0, //CJK UNIFIED IDEOGRAPH
+ 0xF575: 0x9BB1, //CJK UNIFIED IDEOGRAPH
+ 0xF576: 0x9BB2, //CJK UNIFIED IDEOGRAPH
+ 0xF577: 0x9BB3, //CJK UNIFIED IDEOGRAPH
+ 0xF578: 0x9BB4, //CJK UNIFIED IDEOGRAPH
+ 0xF579: 0x9BB5, //CJK UNIFIED IDEOGRAPH
+ 0xF57A: 0x9BB6, //CJK UNIFIED IDEOGRAPH
+ 0xF57B: 0x9BB7, //CJK UNIFIED IDEOGRAPH
+ 0xF57C: 0x9BB8, //CJK UNIFIED IDEOGRAPH
+ 0xF57D: 0x9BB9, //CJK UNIFIED IDEOGRAPH
+ 0xF57E: 0x9BBA, //CJK UNIFIED IDEOGRAPH
+ 0xF580: 0x9BBB, //CJK UNIFIED IDEOGRAPH
+ 0xF581: 0x9BBC, //CJK UNIFIED IDEOGRAPH
+ 0xF582: 0x9BBD, //CJK UNIFIED IDEOGRAPH
+ 0xF583: 0x9BBE, //CJK UNIFIED IDEOGRAPH
+ 0xF584: 0x9BBF, //CJK UNIFIED IDEOGRAPH
+ 0xF585: 0x9BC0, //CJK UNIFIED IDEOGRAPH
+ 0xF586: 0x9BC1, //CJK UNIFIED IDEOGRAPH
+ 0xF587: 0x9BC2, //CJK UNIFIED IDEOGRAPH
+ 0xF588: 0x9BC3, //CJK UNIFIED IDEOGRAPH
+ 0xF589: 0x9BC4, //CJK UNIFIED IDEOGRAPH
+ 0xF58A: 0x9BC5, //CJK UNIFIED IDEOGRAPH
+ 0xF58B: 0x9BC6, //CJK UNIFIED IDEOGRAPH
+ 0xF58C: 0x9BC7, //CJK UNIFIED IDEOGRAPH
+ 0xF58D: 0x9BC8, //CJK UNIFIED IDEOGRAPH
+ 0xF58E: 0x9BC9, //CJK UNIFIED IDEOGRAPH
+ 0xF58F: 0x9BCA, //CJK UNIFIED IDEOGRAPH
+ 0xF590: 0x9BCB, //CJK UNIFIED IDEOGRAPH
+ 0xF591: 0x9BCC, //CJK UNIFIED IDEOGRAPH
+ 0xF592: 0x9BCD, //CJK UNIFIED IDEOGRAPH
+ 0xF593: 0x9BCE, //CJK UNIFIED IDEOGRAPH
+ 0xF594: 0x9BCF, //CJK UNIFIED IDEOGRAPH
+ 0xF595: 0x9BD0, //CJK UNIFIED IDEOGRAPH
+ 0xF596: 0x9BD1, //CJK UNIFIED IDEOGRAPH
+ 0xF597: 0x9BD2, //CJK UNIFIED IDEOGRAPH
+ 0xF598: 0x9BD3, //CJK UNIFIED IDEOGRAPH
+ 0xF599: 0x9BD4, //CJK UNIFIED IDEOGRAPH
+ 0xF59A: 0x9BD5, //CJK UNIFIED IDEOGRAPH
+ 0xF59B: 0x9BD6, //CJK UNIFIED IDEOGRAPH
+ 0xF59C: 0x9BD7, //CJK UNIFIED IDEOGRAPH
+ 0xF59D: 0x9BD8, //CJK UNIFIED IDEOGRAPH
+ 0xF59E: 0x9BD9, //CJK UNIFIED IDEOGRAPH
+ 0xF59F: 0x9BDA, //CJK UNIFIED IDEOGRAPH
+ 0xF5A0: 0x9BDB, //CJK UNIFIED IDEOGRAPH
+ 0xF5A1: 0x9162, //CJK UNIFIED IDEOGRAPH
+ 0xF5A2: 0x9161, //CJK UNIFIED IDEOGRAPH
+ 0xF5A3: 0x9170, //CJK UNIFIED IDEOGRAPH
+ 0xF5A4: 0x9169, //CJK UNIFIED IDEOGRAPH
+ 0xF5A5: 0x916F, //CJK UNIFIED IDEOGRAPH
+ 0xF5A6: 0x917D, //CJK UNIFIED IDEOGRAPH
+ 0xF5A7: 0x917E, //CJK UNIFIED IDEOGRAPH
+ 0xF5A8: 0x9172, //CJK UNIFIED IDEOGRAPH
+ 0xF5A9: 0x9174, //CJK UNIFIED IDEOGRAPH
+ 0xF5AA: 0x9179, //CJK UNIFIED IDEOGRAPH
+ 0xF5AB: 0x918C, //CJK UNIFIED IDEOGRAPH
+ 0xF5AC: 0x9185, //CJK UNIFIED IDEOGRAPH
+ 0xF5AD: 0x9190, //CJK UNIFIED IDEOGRAPH
+ 0xF5AE: 0x918D, //CJK UNIFIED IDEOGRAPH
+ 0xF5AF: 0x9191, //CJK UNIFIED IDEOGRAPH
+ 0xF5B0: 0x91A2, //CJK UNIFIED IDEOGRAPH
+ 0xF5B1: 0x91A3, //CJK UNIFIED IDEOGRAPH
+ 0xF5B2: 0x91AA, //CJK UNIFIED IDEOGRAPH
+ 0xF5B3: 0x91AD, //CJK UNIFIED IDEOGRAPH
+ 0xF5B4: 0x91AE, //CJK UNIFIED IDEOGRAPH
+ 0xF5B5: 0x91AF, //CJK UNIFIED IDEOGRAPH
+ 0xF5B6: 0x91B5, //CJK UNIFIED IDEOGRAPH
+ 0xF5B7: 0x91B4, //CJK UNIFIED IDEOGRAPH
+ 0xF5B8: 0x91BA, //CJK UNIFIED IDEOGRAPH
+ 0xF5B9: 0x8C55, //CJK UNIFIED IDEOGRAPH
+ 0xF5BA: 0x9E7E, //CJK UNIFIED IDEOGRAPH
+ 0xF5BB: 0x8DB8, //CJK UNIFIED IDEOGRAPH
+ 0xF5BC: 0x8DEB, //CJK UNIFIED IDEOGRAPH
+ 0xF5BD: 0x8E05, //CJK UNIFIED IDEOGRAPH
+ 0xF5BE: 0x8E59, //CJK UNIFIED IDEOGRAPH
+ 0xF5BF: 0x8E69, //CJK UNIFIED IDEOGRAPH
+ 0xF5C0: 0x8DB5, //CJK UNIFIED IDEOGRAPH
+ 0xF5C1: 0x8DBF, //CJK UNIFIED IDEOGRAPH
+ 0xF5C2: 0x8DBC, //CJK UNIFIED IDEOGRAPH
+ 0xF5C3: 0x8DBA, //CJK UNIFIED IDEOGRAPH
+ 0xF5C4: 0x8DC4, //CJK UNIFIED IDEOGRAPH
+ 0xF5C5: 0x8DD6, //CJK UNIFIED IDEOGRAPH
+ 0xF5C6: 0x8DD7, //CJK UNIFIED IDEOGRAPH
+ 0xF5C7: 0x8DDA, //CJK UNIFIED IDEOGRAPH
+ 0xF5C8: 0x8DDE, //CJK UNIFIED IDEOGRAPH
+ 0xF5C9: 0x8DCE, //CJK UNIFIED IDEOGRAPH
+ 0xF5CA: 0x8DCF, //CJK UNIFIED IDEOGRAPH
+ 0xF5CB: 0x8DDB, //CJK UNIFIED IDEOGRAPH
+ 0xF5CC: 0x8DC6, //CJK UNIFIED IDEOGRAPH
+ 0xF5CD: 0x8DEC, //CJK UNIFIED IDEOGRAPH
+ 0xF5CE: 0x8DF7, //CJK UNIFIED IDEOGRAPH
+ 0xF5CF: 0x8DF8, //CJK UNIFIED IDEOGRAPH
+ 0xF5D0: 0x8DE3, //CJK UNIFIED IDEOGRAPH
+ 0xF5D1: 0x8DF9, //CJK UNIFIED IDEOGRAPH
+ 0xF5D2: 0x8DFB, //CJK UNIFIED IDEOGRAPH
+ 0xF5D3: 0x8DE4, //CJK UNIFIED IDEOGRAPH
+ 0xF5D4: 0x8E09, //CJK UNIFIED IDEOGRAPH
+ 0xF5D5: 0x8DFD, //CJK UNIFIED IDEOGRAPH
+ 0xF5D6: 0x8E14, //CJK UNIFIED IDEOGRAPH
+ 0xF5D7: 0x8E1D, //CJK UNIFIED IDEOGRAPH
+ 0xF5D8: 0x8E1F, //CJK UNIFIED IDEOGRAPH
+ 0xF5D9: 0x8E2C, //CJK UNIFIED IDEOGRAPH
+ 0xF5DA: 0x8E2E, //CJK UNIFIED IDEOGRAPH
+ 0xF5DB: 0x8E23, //CJK UNIFIED IDEOGRAPH
+ 0xF5DC: 0x8E2F, //CJK UNIFIED IDEOGRAPH
+ 0xF5DD: 0x8E3A, //CJK UNIFIED IDEOGRAPH
+ 0xF5DE: 0x8E40, //CJK UNIFIED IDEOGRAPH
+ 0xF5DF: 0x8E39, //CJK UNIFIED IDEOGRAPH
+ 0xF5E0: 0x8E35, //CJK UNIFIED IDEOGRAPH
+ 0xF5E1: 0x8E3D, //CJK UNIFIED IDEOGRAPH
+ 0xF5E2: 0x8E31, //CJK UNIFIED IDEOGRAPH
+ 0xF5E3: 0x8E49, //CJK UNIFIED IDEOGRAPH
+ 0xF5E4: 0x8E41, //CJK UNIFIED IDEOGRAPH
+ 0xF5E5: 0x8E42, //CJK UNIFIED IDEOGRAPH
+ 0xF5E6: 0x8E51, //CJK UNIFIED IDEOGRAPH
+ 0xF5E7: 0x8E52, //CJK UNIFIED IDEOGRAPH
+ 0xF5E8: 0x8E4A, //CJK UNIFIED IDEOGRAPH
+ 0xF5E9: 0x8E70, //CJK UNIFIED IDEOGRAPH
+ 0xF5EA: 0x8E76, //CJK UNIFIED IDEOGRAPH
+ 0xF5EB: 0x8E7C, //CJK UNIFIED IDEOGRAPH
+ 0xF5EC: 0x8E6F, //CJK UNIFIED IDEOGRAPH
+ 0xF5ED: 0x8E74, //CJK UNIFIED IDEOGRAPH
+ 0xF5EE: 0x8E85, //CJK UNIFIED IDEOGRAPH
+ 0xF5EF: 0x8E8F, //CJK UNIFIED IDEOGRAPH
+ 0xF5F0: 0x8E94, //CJK UNIFIED IDEOGRAPH
+ 0xF5F1: 0x8E90, //CJK UNIFIED IDEOGRAPH
+ 0xF5F2: 0x8E9C, //CJK UNIFIED IDEOGRAPH
+ 0xF5F3: 0x8E9E, //CJK UNIFIED IDEOGRAPH
+ 0xF5F4: 0x8C78, //CJK UNIFIED IDEOGRAPH
+ 0xF5F5: 0x8C82, //CJK UNIFIED IDEOGRAPH
+ 0xF5F6: 0x8C8A, //CJK UNIFIED IDEOGRAPH
+ 0xF5F7: 0x8C85, //CJK UNIFIED IDEOGRAPH
+ 0xF5F8: 0x8C98, //CJK UNIFIED IDEOGRAPH
+ 0xF5F9: 0x8C94, //CJK UNIFIED IDEOGRAPH
+ 0xF5FA: 0x659B, //CJK UNIFIED IDEOGRAPH
+ 0xF5FB: 0x89D6, //CJK UNIFIED IDEOGRAPH
+ 0xF5FC: 0x89DE, //CJK UNIFIED IDEOGRAPH
+ 0xF5FD: 0x89DA, //CJK UNIFIED IDEOGRAPH
+ 0xF5FE: 0x89DC, //CJK UNIFIED IDEOGRAPH
+ 0xF640: 0x9BDC, //CJK UNIFIED IDEOGRAPH
+ 0xF641: 0x9BDD, //CJK UNIFIED IDEOGRAPH
+ 0xF642: 0x9BDE, //CJK UNIFIED IDEOGRAPH
+ 0xF643: 0x9BDF, //CJK UNIFIED IDEOGRAPH
+ 0xF644: 0x9BE0, //CJK UNIFIED IDEOGRAPH
+ 0xF645: 0x9BE1, //CJK UNIFIED IDEOGRAPH
+ 0xF646: 0x9BE2, //CJK UNIFIED IDEOGRAPH
+ 0xF647: 0x9BE3, //CJK UNIFIED IDEOGRAPH
+ 0xF648: 0x9BE4, //CJK UNIFIED IDEOGRAPH
+ 0xF649: 0x9BE5, //CJK UNIFIED IDEOGRAPH
+ 0xF64A: 0x9BE6, //CJK UNIFIED IDEOGRAPH
+ 0xF64B: 0x9BE7, //CJK UNIFIED IDEOGRAPH
+ 0xF64C: 0x9BE8, //CJK UNIFIED IDEOGRAPH
+ 0xF64D: 0x9BE9, //CJK UNIFIED IDEOGRAPH
+ 0xF64E: 0x9BEA, //CJK UNIFIED IDEOGRAPH
+ 0xF64F: 0x9BEB, //CJK UNIFIED IDEOGRAPH
+ 0xF650: 0x9BEC, //CJK UNIFIED IDEOGRAPH
+ 0xF651: 0x9BED, //CJK UNIFIED IDEOGRAPH
+ 0xF652: 0x9BEE, //CJK UNIFIED IDEOGRAPH
+ 0xF653: 0x9BEF, //CJK UNIFIED IDEOGRAPH
+ 0xF654: 0x9BF0, //CJK UNIFIED IDEOGRAPH
+ 0xF655: 0x9BF1, //CJK UNIFIED IDEOGRAPH
+ 0xF656: 0x9BF2, //CJK UNIFIED IDEOGRAPH
+ 0xF657: 0x9BF3, //CJK UNIFIED IDEOGRAPH
+ 0xF658: 0x9BF4, //CJK UNIFIED IDEOGRAPH
+ 0xF659: 0x9BF5, //CJK UNIFIED IDEOGRAPH
+ 0xF65A: 0x9BF6, //CJK UNIFIED IDEOGRAPH
+ 0xF65B: 0x9BF7, //CJK UNIFIED IDEOGRAPH
+ 0xF65C: 0x9BF8, //CJK UNIFIED IDEOGRAPH
+ 0xF65D: 0x9BF9, //CJK UNIFIED IDEOGRAPH
+ 0xF65E: 0x9BFA, //CJK UNIFIED IDEOGRAPH
+ 0xF65F: 0x9BFB, //CJK UNIFIED IDEOGRAPH
+ 0xF660: 0x9BFC, //CJK UNIFIED IDEOGRAPH
+ 0xF661: 0x9BFD, //CJK UNIFIED IDEOGRAPH
+ 0xF662: 0x9BFE, //CJK UNIFIED IDEOGRAPH
+ 0xF663: 0x9BFF, //CJK UNIFIED IDEOGRAPH
+ 0xF664: 0x9C00, //CJK UNIFIED IDEOGRAPH
+ 0xF665: 0x9C01, //CJK UNIFIED IDEOGRAPH
+ 0xF666: 0x9C02, //CJK UNIFIED IDEOGRAPH
+ 0xF667: 0x9C03, //CJK UNIFIED IDEOGRAPH
+ 0xF668: 0x9C04, //CJK UNIFIED IDEOGRAPH
+ 0xF669: 0x9C05, //CJK UNIFIED IDEOGRAPH
+ 0xF66A: 0x9C06, //CJK UNIFIED IDEOGRAPH
+ 0xF66B: 0x9C07, //CJK UNIFIED IDEOGRAPH
+ 0xF66C: 0x9C08, //CJK UNIFIED IDEOGRAPH
+ 0xF66D: 0x9C09, //CJK UNIFIED IDEOGRAPH
+ 0xF66E: 0x9C0A, //CJK UNIFIED IDEOGRAPH
+ 0xF66F: 0x9C0B, //CJK UNIFIED IDEOGRAPH
+ 0xF670: 0x9C0C, //CJK UNIFIED IDEOGRAPH
+ 0xF671: 0x9C0D, //CJK UNIFIED IDEOGRAPH
+ 0xF672: 0x9C0E, //CJK UNIFIED IDEOGRAPH
+ 0xF673: 0x9C0F, //CJK UNIFIED IDEOGRAPH
+ 0xF674: 0x9C10, //CJK UNIFIED IDEOGRAPH
+ 0xF675: 0x9C11, //CJK UNIFIED IDEOGRAPH
+ 0xF676: 0x9C12, //CJK UNIFIED IDEOGRAPH
+ 0xF677: 0x9C13, //CJK UNIFIED IDEOGRAPH
+ 0xF678: 0x9C14, //CJK UNIFIED IDEOGRAPH
+ 0xF679: 0x9C15, //CJK UNIFIED IDEOGRAPH
+ 0xF67A: 0x9C16, //CJK UNIFIED IDEOGRAPH
+ 0xF67B: 0x9C17, //CJK UNIFIED IDEOGRAPH
+ 0xF67C: 0x9C18, //CJK UNIFIED IDEOGRAPH
+ 0xF67D: 0x9C19, //CJK UNIFIED IDEOGRAPH
+ 0xF67E: 0x9C1A, //CJK UNIFIED IDEOGRAPH
+ 0xF680: 0x9C1B, //CJK UNIFIED IDEOGRAPH
+ 0xF681: 0x9C1C, //CJK UNIFIED IDEOGRAPH
+ 0xF682: 0x9C1D, //CJK UNIFIED IDEOGRAPH
+ 0xF683: 0x9C1E, //CJK UNIFIED IDEOGRAPH
+ 0xF684: 0x9C1F, //CJK UNIFIED IDEOGRAPH
+ 0xF685: 0x9C20, //CJK UNIFIED IDEOGRAPH
+ 0xF686: 0x9C21, //CJK UNIFIED IDEOGRAPH
+ 0xF687: 0x9C22, //CJK UNIFIED IDEOGRAPH
+ 0xF688: 0x9C23, //CJK UNIFIED IDEOGRAPH
+ 0xF689: 0x9C24, //CJK UNIFIED IDEOGRAPH
+ 0xF68A: 0x9C25, //CJK UNIFIED IDEOGRAPH
+ 0xF68B: 0x9C26, //CJK UNIFIED IDEOGRAPH
+ 0xF68C: 0x9C27, //CJK UNIFIED IDEOGRAPH
+ 0xF68D: 0x9C28, //CJK UNIFIED IDEOGRAPH
+ 0xF68E: 0x9C29, //CJK UNIFIED IDEOGRAPH
+ 0xF68F: 0x9C2A, //CJK UNIFIED IDEOGRAPH
+ 0xF690: 0x9C2B, //CJK UNIFIED IDEOGRAPH
+ 0xF691: 0x9C2C, //CJK UNIFIED IDEOGRAPH
+ 0xF692: 0x9C2D, //CJK UNIFIED IDEOGRAPH
+ 0xF693: 0x9C2E, //CJK UNIFIED IDEOGRAPH
+ 0xF694: 0x9C2F, //CJK UNIFIED IDEOGRAPH
+ 0xF695: 0x9C30, //CJK UNIFIED IDEOGRAPH
+ 0xF696: 0x9C31, //CJK UNIFIED IDEOGRAPH
+ 0xF697: 0x9C32, //CJK UNIFIED IDEOGRAPH
+ 0xF698: 0x9C33, //CJK UNIFIED IDEOGRAPH
+ 0xF699: 0x9C34, //CJK UNIFIED IDEOGRAPH
+ 0xF69A: 0x9C35, //CJK UNIFIED IDEOGRAPH
+ 0xF69B: 0x9C36, //CJK UNIFIED IDEOGRAPH
+ 0xF69C: 0x9C37, //CJK UNIFIED IDEOGRAPH
+ 0xF69D: 0x9C38, //CJK UNIFIED IDEOGRAPH
+ 0xF69E: 0x9C39, //CJK UNIFIED IDEOGRAPH
+ 0xF69F: 0x9C3A, //CJK UNIFIED IDEOGRAPH
+ 0xF6A0: 0x9C3B, //CJK UNIFIED IDEOGRAPH
+ 0xF6A1: 0x89E5, //CJK UNIFIED IDEOGRAPH
+ 0xF6A2: 0x89EB, //CJK UNIFIED IDEOGRAPH
+ 0xF6A3: 0x89EF, //CJK UNIFIED IDEOGRAPH
+ 0xF6A4: 0x8A3E, //CJK UNIFIED IDEOGRAPH
+ 0xF6A5: 0x8B26, //CJK UNIFIED IDEOGRAPH
+ 0xF6A6: 0x9753, //CJK UNIFIED IDEOGRAPH
+ 0xF6A7: 0x96E9, //CJK UNIFIED IDEOGRAPH
+ 0xF6A8: 0x96F3, //CJK UNIFIED IDEOGRAPH
+ 0xF6A9: 0x96EF, //CJK UNIFIED IDEOGRAPH
+ 0xF6AA: 0x9706, //CJK UNIFIED IDEOGRAPH
+ 0xF6AB: 0x9701, //CJK UNIFIED IDEOGRAPH
+ 0xF6AC: 0x9708, //CJK UNIFIED IDEOGRAPH
+ 0xF6AD: 0x970F, //CJK UNIFIED IDEOGRAPH
+ 0xF6AE: 0x970E, //CJK UNIFIED IDEOGRAPH
+ 0xF6AF: 0x972A, //CJK UNIFIED IDEOGRAPH
+ 0xF6B0: 0x972D, //CJK UNIFIED IDEOGRAPH
+ 0xF6B1: 0x9730, //CJK UNIFIED IDEOGRAPH
+ 0xF6B2: 0x973E, //CJK UNIFIED IDEOGRAPH
+ 0xF6B3: 0x9F80, //CJK UNIFIED IDEOGRAPH
+ 0xF6B4: 0x9F83, //CJK UNIFIED IDEOGRAPH
+ 0xF6B5: 0x9F85, //CJK UNIFIED IDEOGRAPH
+ 0xF6B6: 0x9F86, //CJK UNIFIED IDEOGRAPH
+ 0xF6B7: 0x9F87, //CJK UNIFIED IDEOGRAPH
+ 0xF6B8: 0x9F88, //CJK UNIFIED IDEOGRAPH
+ 0xF6B9: 0x9F89, //CJK UNIFIED IDEOGRAPH
+ 0xF6BA: 0x9F8A, //CJK UNIFIED IDEOGRAPH
+ 0xF6BB: 0x9F8C, //CJK UNIFIED IDEOGRAPH
+ 0xF6BC: 0x9EFE, //CJK UNIFIED IDEOGRAPH
+ 0xF6BD: 0x9F0B, //CJK UNIFIED IDEOGRAPH
+ 0xF6BE: 0x9F0D, //CJK UNIFIED IDEOGRAPH
+ 0xF6BF: 0x96B9, //CJK UNIFIED IDEOGRAPH
+ 0xF6C0: 0x96BC, //CJK UNIFIED IDEOGRAPH
+ 0xF6C1: 0x96BD, //CJK UNIFIED IDEOGRAPH
+ 0xF6C2: 0x96CE, //CJK UNIFIED IDEOGRAPH
+ 0xF6C3: 0x96D2, //CJK UNIFIED IDEOGRAPH
+ 0xF6C4: 0x77BF, //CJK UNIFIED IDEOGRAPH
+ 0xF6C5: 0x96E0, //CJK UNIFIED IDEOGRAPH
+ 0xF6C6: 0x928E, //CJK UNIFIED IDEOGRAPH
+ 0xF6C7: 0x92AE, //CJK UNIFIED IDEOGRAPH
+ 0xF6C8: 0x92C8, //CJK UNIFIED IDEOGRAPH
+ 0xF6C9: 0x933E, //CJK UNIFIED IDEOGRAPH
+ 0xF6CA: 0x936A, //CJK UNIFIED IDEOGRAPH
+ 0xF6CB: 0x93CA, //CJK UNIFIED IDEOGRAPH
+ 0xF6CC: 0x938F, //CJK UNIFIED IDEOGRAPH
+ 0xF6CD: 0x943E, //CJK UNIFIED IDEOGRAPH
+ 0xF6CE: 0x946B, //CJK UNIFIED IDEOGRAPH
+ 0xF6CF: 0x9C7F, //CJK UNIFIED IDEOGRAPH
+ 0xF6D0: 0x9C82, //CJK UNIFIED IDEOGRAPH
+ 0xF6D1: 0x9C85, //CJK UNIFIED IDEOGRAPH
+ 0xF6D2: 0x9C86, //CJK UNIFIED IDEOGRAPH
+ 0xF6D3: 0x9C87, //CJK UNIFIED IDEOGRAPH
+ 0xF6D4: 0x9C88, //CJK UNIFIED IDEOGRAPH
+ 0xF6D5: 0x7A23, //CJK UNIFIED IDEOGRAPH
+ 0xF6D6: 0x9C8B, //CJK UNIFIED IDEOGRAPH
+ 0xF6D7: 0x9C8E, //CJK UNIFIED IDEOGRAPH
+ 0xF6D8: 0x9C90, //CJK UNIFIED IDEOGRAPH
+ 0xF6D9: 0x9C91, //CJK UNIFIED IDEOGRAPH
+ 0xF6DA: 0x9C92, //CJK UNIFIED IDEOGRAPH
+ 0xF6DB: 0x9C94, //CJK UNIFIED IDEOGRAPH
+ 0xF6DC: 0x9C95, //CJK UNIFIED IDEOGRAPH
+ 0xF6DD: 0x9C9A, //CJK UNIFIED IDEOGRAPH
+ 0xF6DE: 0x9C9B, //CJK UNIFIED IDEOGRAPH
+ 0xF6DF: 0x9C9E, //CJK UNIFIED IDEOGRAPH
+ 0xF6E0: 0x9C9F, //CJK UNIFIED IDEOGRAPH
+ 0xF6E1: 0x9CA0, //CJK UNIFIED IDEOGRAPH
+ 0xF6E2: 0x9CA1, //CJK UNIFIED IDEOGRAPH
+ 0xF6E3: 0x9CA2, //CJK UNIFIED IDEOGRAPH
+ 0xF6E4: 0x9CA3, //CJK UNIFIED IDEOGRAPH
+ 0xF6E5: 0x9CA5, //CJK UNIFIED IDEOGRAPH
+ 0xF6E6: 0x9CA6, //CJK UNIFIED IDEOGRAPH
+ 0xF6E7: 0x9CA7, //CJK UNIFIED IDEOGRAPH
+ 0xF6E8: 0x9CA8, //CJK UNIFIED IDEOGRAPH
+ 0xF6E9: 0x9CA9, //CJK UNIFIED IDEOGRAPH
+ 0xF6EA: 0x9CAB, //CJK UNIFIED IDEOGRAPH
+ 0xF6EB: 0x9CAD, //CJK UNIFIED IDEOGRAPH
+ 0xF6EC: 0x9CAE, //CJK UNIFIED IDEOGRAPH
+ 0xF6ED: 0x9CB0, //CJK UNIFIED IDEOGRAPH
+ 0xF6EE: 0x9CB1, //CJK UNIFIED IDEOGRAPH
+ 0xF6EF: 0x9CB2, //CJK UNIFIED IDEOGRAPH
+ 0xF6F0: 0x9CB3, //CJK UNIFIED IDEOGRAPH
+ 0xF6F1: 0x9CB4, //CJK UNIFIED IDEOGRAPH
+ 0xF6F2: 0x9CB5, //CJK UNIFIED IDEOGRAPH
+ 0xF6F3: 0x9CB6, //CJK UNIFIED IDEOGRAPH
+ 0xF6F4: 0x9CB7, //CJK UNIFIED IDEOGRAPH
+ 0xF6F5: 0x9CBA, //CJK UNIFIED IDEOGRAPH
+ 0xF6F6: 0x9CBB, //CJK UNIFIED IDEOGRAPH
+ 0xF6F7: 0x9CBC, //CJK UNIFIED IDEOGRAPH
+ 0xF6F8: 0x9CBD, //CJK UNIFIED IDEOGRAPH
+ 0xF6F9: 0x9CC4, //CJK UNIFIED IDEOGRAPH
+ 0xF6FA: 0x9CC5, //CJK UNIFIED IDEOGRAPH
+ 0xF6FB: 0x9CC6, //CJK UNIFIED IDEOGRAPH
+ 0xF6FC: 0x9CC7, //CJK UNIFIED IDEOGRAPH
+ 0xF6FD: 0x9CCA, //CJK UNIFIED IDEOGRAPH
+ 0xF6FE: 0x9CCB, //CJK UNIFIED IDEOGRAPH
+ 0xF740: 0x9C3C, //CJK UNIFIED IDEOGRAPH
+ 0xF741: 0x9C3D, //CJK UNIFIED IDEOGRAPH
+ 0xF742: 0x9C3E, //CJK UNIFIED IDEOGRAPH
+ 0xF743: 0x9C3F, //CJK UNIFIED IDEOGRAPH
+ 0xF744: 0x9C40, //CJK UNIFIED IDEOGRAPH
+ 0xF745: 0x9C41, //CJK UNIFIED IDEOGRAPH
+ 0xF746: 0x9C42, //CJK UNIFIED IDEOGRAPH
+ 0xF747: 0x9C43, //CJK UNIFIED IDEOGRAPH
+ 0xF748: 0x9C44, //CJK UNIFIED IDEOGRAPH
+ 0xF749: 0x9C45, //CJK UNIFIED IDEOGRAPH
+ 0xF74A: 0x9C46, //CJK UNIFIED IDEOGRAPH
+ 0xF74B: 0x9C47, //CJK UNIFIED IDEOGRAPH
+ 0xF74C: 0x9C48, //CJK UNIFIED IDEOGRAPH
+ 0xF74D: 0x9C49, //CJK UNIFIED IDEOGRAPH
+ 0xF74E: 0x9C4A, //CJK UNIFIED IDEOGRAPH
+ 0xF74F: 0x9C4B, //CJK UNIFIED IDEOGRAPH
+ 0xF750: 0x9C4C, //CJK UNIFIED IDEOGRAPH
+ 0xF751: 0x9C4D, //CJK UNIFIED IDEOGRAPH
+ 0xF752: 0x9C4E, //CJK UNIFIED IDEOGRAPH
+ 0xF753: 0x9C4F, //CJK UNIFIED IDEOGRAPH
+ 0xF754: 0x9C50, //CJK UNIFIED IDEOGRAPH
+ 0xF755: 0x9C51, //CJK UNIFIED IDEOGRAPH
+ 0xF756: 0x9C52, //CJK UNIFIED IDEOGRAPH
+ 0xF757: 0x9C53, //CJK UNIFIED IDEOGRAPH
+ 0xF758: 0x9C54, //CJK UNIFIED IDEOGRAPH
+ 0xF759: 0x9C55, //CJK UNIFIED IDEOGRAPH
+ 0xF75A: 0x9C56, //CJK UNIFIED IDEOGRAPH
+ 0xF75B: 0x9C57, //CJK UNIFIED IDEOGRAPH
+ 0xF75C: 0x9C58, //CJK UNIFIED IDEOGRAPH
+ 0xF75D: 0x9C59, //CJK UNIFIED IDEOGRAPH
+ 0xF75E: 0x9C5A, //CJK UNIFIED IDEOGRAPH
+ 0xF75F: 0x9C5B, //CJK UNIFIED IDEOGRAPH
+ 0xF760: 0x9C5C, //CJK UNIFIED IDEOGRAPH
+ 0xF761: 0x9C5D, //CJK UNIFIED IDEOGRAPH
+ 0xF762: 0x9C5E, //CJK UNIFIED IDEOGRAPH
+ 0xF763: 0x9C5F, //CJK UNIFIED IDEOGRAPH
+ 0xF764: 0x9C60, //CJK UNIFIED IDEOGRAPH
+ 0xF765: 0x9C61, //CJK UNIFIED IDEOGRAPH
+ 0xF766: 0x9C62, //CJK UNIFIED IDEOGRAPH
+ 0xF767: 0x9C63, //CJK UNIFIED IDEOGRAPH
+ 0xF768: 0x9C64, //CJK UNIFIED IDEOGRAPH
+ 0xF769: 0x9C65, //CJK UNIFIED IDEOGRAPH
+ 0xF76A: 0x9C66, //CJK UNIFIED IDEOGRAPH
+ 0xF76B: 0x9C67, //CJK UNIFIED IDEOGRAPH
+ 0xF76C: 0x9C68, //CJK UNIFIED IDEOGRAPH
+ 0xF76D: 0x9C69, //CJK UNIFIED IDEOGRAPH
+ 0xF76E: 0x9C6A, //CJK UNIFIED IDEOGRAPH
+ 0xF76F: 0x9C6B, //CJK UNIFIED IDEOGRAPH
+ 0xF770: 0x9C6C, //CJK UNIFIED IDEOGRAPH
+ 0xF771: 0x9C6D, //CJK UNIFIED IDEOGRAPH
+ 0xF772: 0x9C6E, //CJK UNIFIED IDEOGRAPH
+ 0xF773: 0x9C6F, //CJK UNIFIED IDEOGRAPH
+ 0xF774: 0x9C70, //CJK UNIFIED IDEOGRAPH
+ 0xF775: 0x9C71, //CJK UNIFIED IDEOGRAPH
+ 0xF776: 0x9C72, //CJK UNIFIED IDEOGRAPH
+ 0xF777: 0x9C73, //CJK UNIFIED IDEOGRAPH
+ 0xF778: 0x9C74, //CJK UNIFIED IDEOGRAPH
+ 0xF779: 0x9C75, //CJK UNIFIED IDEOGRAPH
+ 0xF77A: 0x9C76, //CJK UNIFIED IDEOGRAPH
+ 0xF77B: 0x9C77, //CJK UNIFIED IDEOGRAPH
+ 0xF77C: 0x9C78, //CJK UNIFIED IDEOGRAPH
+ 0xF77D: 0x9C79, //CJK UNIFIED IDEOGRAPH
+ 0xF77E: 0x9C7A, //CJK UNIFIED IDEOGRAPH
+ 0xF780: 0x9C7B, //CJK UNIFIED IDEOGRAPH
+ 0xF781: 0x9C7D, //CJK UNIFIED IDEOGRAPH
+ 0xF782: 0x9C7E, //CJK UNIFIED IDEOGRAPH
+ 0xF783: 0x9C80, //CJK UNIFIED IDEOGRAPH
+ 0xF784: 0x9C83, //CJK UNIFIED IDEOGRAPH
+ 0xF785: 0x9C84, //CJK UNIFIED IDEOGRAPH
+ 0xF786: 0x9C89, //CJK UNIFIED IDEOGRAPH
+ 0xF787: 0x9C8A, //CJK UNIFIED IDEOGRAPH
+ 0xF788: 0x9C8C, //CJK UNIFIED IDEOGRAPH
+ 0xF789: 0x9C8F, //CJK UNIFIED IDEOGRAPH
+ 0xF78A: 0x9C93, //CJK UNIFIED IDEOGRAPH
+ 0xF78B: 0x9C96, //CJK UNIFIED IDEOGRAPH
+ 0xF78C: 0x9C97, //CJK UNIFIED IDEOGRAPH
+ 0xF78D: 0x9C98, //CJK UNIFIED IDEOGRAPH
+ 0xF78E: 0x9C99, //CJK UNIFIED IDEOGRAPH
+ 0xF78F: 0x9C9D, //CJK UNIFIED IDEOGRAPH
+ 0xF790: 0x9CAA, //CJK UNIFIED IDEOGRAPH
+ 0xF791: 0x9CAC, //CJK UNIFIED IDEOGRAPH
+ 0xF792: 0x9CAF, //CJK UNIFIED IDEOGRAPH
+ 0xF793: 0x9CB9, //CJK UNIFIED IDEOGRAPH
+ 0xF794: 0x9CBE, //CJK UNIFIED IDEOGRAPH
+ 0xF795: 0x9CBF, //CJK UNIFIED IDEOGRAPH
+ 0xF796: 0x9CC0, //CJK UNIFIED IDEOGRAPH
+ 0xF797: 0x9CC1, //CJK UNIFIED IDEOGRAPH
+ 0xF798: 0x9CC2, //CJK UNIFIED IDEOGRAPH
+ 0xF799: 0x9CC8, //CJK UNIFIED IDEOGRAPH
+ 0xF79A: 0x9CC9, //CJK UNIFIED IDEOGRAPH
+ 0xF79B: 0x9CD1, //CJK UNIFIED IDEOGRAPH
+ 0xF79C: 0x9CD2, //CJK UNIFIED IDEOGRAPH
+ 0xF79D: 0x9CDA, //CJK UNIFIED IDEOGRAPH
+ 0xF79E: 0x9CDB, //CJK UNIFIED IDEOGRAPH
+ 0xF79F: 0x9CE0, //CJK UNIFIED IDEOGRAPH
+ 0xF7A0: 0x9CE1, //CJK UNIFIED IDEOGRAPH
+ 0xF7A1: 0x9CCC, //CJK UNIFIED IDEOGRAPH
+ 0xF7A2: 0x9CCD, //CJK UNIFIED IDEOGRAPH
+ 0xF7A3: 0x9CCE, //CJK UNIFIED IDEOGRAPH
+ 0xF7A4: 0x9CCF, //CJK UNIFIED IDEOGRAPH
+ 0xF7A5: 0x9CD0, //CJK UNIFIED IDEOGRAPH
+ 0xF7A6: 0x9CD3, //CJK UNIFIED IDEOGRAPH
+ 0xF7A7: 0x9CD4, //CJK UNIFIED IDEOGRAPH
+ 0xF7A8: 0x9CD5, //CJK UNIFIED IDEOGRAPH
+ 0xF7A9: 0x9CD7, //CJK UNIFIED IDEOGRAPH
+ 0xF7AA: 0x9CD8, //CJK UNIFIED IDEOGRAPH
+ 0xF7AB: 0x9CD9, //CJK UNIFIED IDEOGRAPH
+ 0xF7AC: 0x9CDC, //CJK UNIFIED IDEOGRAPH
+ 0xF7AD: 0x9CDD, //CJK UNIFIED IDEOGRAPH
+ 0xF7AE: 0x9CDF, //CJK UNIFIED IDEOGRAPH
+ 0xF7AF: 0x9CE2, //CJK UNIFIED IDEOGRAPH
+ 0xF7B0: 0x977C, //CJK UNIFIED IDEOGRAPH
+ 0xF7B1: 0x9785, //CJK UNIFIED IDEOGRAPH
+ 0xF7B2: 0x9791, //CJK UNIFIED IDEOGRAPH
+ 0xF7B3: 0x9792, //CJK UNIFIED IDEOGRAPH
+ 0xF7B4: 0x9794, //CJK UNIFIED IDEOGRAPH
+ 0xF7B5: 0x97AF, //CJK UNIFIED IDEOGRAPH
+ 0xF7B6: 0x97AB, //CJK UNIFIED IDEOGRAPH
+ 0xF7B7: 0x97A3, //CJK UNIFIED IDEOGRAPH
+ 0xF7B8: 0x97B2, //CJK UNIFIED IDEOGRAPH
+ 0xF7B9: 0x97B4, //CJK UNIFIED IDEOGRAPH
+ 0xF7BA: 0x9AB1, //CJK UNIFIED IDEOGRAPH
+ 0xF7BB: 0x9AB0, //CJK UNIFIED IDEOGRAPH
+ 0xF7BC: 0x9AB7, //CJK UNIFIED IDEOGRAPH
+ 0xF7BD: 0x9E58, //CJK UNIFIED IDEOGRAPH
+ 0xF7BE: 0x9AB6, //CJK UNIFIED IDEOGRAPH
+ 0xF7BF: 0x9ABA, //CJK UNIFIED IDEOGRAPH
+ 0xF7C0: 0x9ABC, //CJK UNIFIED IDEOGRAPH
+ 0xF7C1: 0x9AC1, //CJK UNIFIED IDEOGRAPH
+ 0xF7C2: 0x9AC0, //CJK UNIFIED IDEOGRAPH
+ 0xF7C3: 0x9AC5, //CJK UNIFIED IDEOGRAPH
+ 0xF7C4: 0x9AC2, //CJK UNIFIED IDEOGRAPH
+ 0xF7C5: 0x9ACB, //CJK UNIFIED IDEOGRAPH
+ 0xF7C6: 0x9ACC, //CJK UNIFIED IDEOGRAPH
+ 0xF7C7: 0x9AD1, //CJK UNIFIED IDEOGRAPH
+ 0xF7C8: 0x9B45, //CJK UNIFIED IDEOGRAPH
+ 0xF7C9: 0x9B43, //CJK UNIFIED IDEOGRAPH
+ 0xF7CA: 0x9B47, //CJK UNIFIED IDEOGRAPH
+ 0xF7CB: 0x9B49, //CJK UNIFIED IDEOGRAPH
+ 0xF7CC: 0x9B48, //CJK UNIFIED IDEOGRAPH
+ 0xF7CD: 0x9B4D, //CJK UNIFIED IDEOGRAPH
+ 0xF7CE: 0x9B51, //CJK UNIFIED IDEOGRAPH
+ 0xF7CF: 0x98E8, //CJK UNIFIED IDEOGRAPH
+ 0xF7D0: 0x990D, //CJK UNIFIED IDEOGRAPH
+ 0xF7D1: 0x992E, //CJK UNIFIED IDEOGRAPH
+ 0xF7D2: 0x9955, //CJK UNIFIED IDEOGRAPH
+ 0xF7D3: 0x9954, //CJK UNIFIED IDEOGRAPH
+ 0xF7D4: 0x9ADF, //CJK UNIFIED IDEOGRAPH
+ 0xF7D5: 0x9AE1, //CJK UNIFIED IDEOGRAPH
+ 0xF7D6: 0x9AE6, //CJK UNIFIED IDEOGRAPH
+ 0xF7D7: 0x9AEF, //CJK UNIFIED IDEOGRAPH
+ 0xF7D8: 0x9AEB, //CJK UNIFIED IDEOGRAPH
+ 0xF7D9: 0x9AFB, //CJK UNIFIED IDEOGRAPH
+ 0xF7DA: 0x9AED, //CJK UNIFIED IDEOGRAPH
+ 0xF7DB: 0x9AF9, //CJK UNIFIED IDEOGRAPH
+ 0xF7DC: 0x9B08, //CJK UNIFIED IDEOGRAPH
+ 0xF7DD: 0x9B0F, //CJK UNIFIED IDEOGRAPH
+ 0xF7DE: 0x9B13, //CJK UNIFIED IDEOGRAPH
+ 0xF7DF: 0x9B1F, //CJK UNIFIED IDEOGRAPH
+ 0xF7E0: 0x9B23, //CJK UNIFIED IDEOGRAPH
+ 0xF7E1: 0x9EBD, //CJK UNIFIED IDEOGRAPH
+ 0xF7E2: 0x9EBE, //CJK UNIFIED IDEOGRAPH
+ 0xF7E3: 0x7E3B, //CJK UNIFIED IDEOGRAPH
+ 0xF7E4: 0x9E82, //CJK UNIFIED IDEOGRAPH
+ 0xF7E5: 0x9E87, //CJK UNIFIED IDEOGRAPH
+ 0xF7E6: 0x9E88, //CJK UNIFIED IDEOGRAPH
+ 0xF7E7: 0x9E8B, //CJK UNIFIED IDEOGRAPH
+ 0xF7E8: 0x9E92, //CJK UNIFIED IDEOGRAPH
+ 0xF7E9: 0x93D6, //CJK UNIFIED IDEOGRAPH
+ 0xF7EA: 0x9E9D, //CJK UNIFIED IDEOGRAPH
+ 0xF7EB: 0x9E9F, //CJK UNIFIED IDEOGRAPH
+ 0xF7EC: 0x9EDB, //CJK UNIFIED IDEOGRAPH
+ 0xF7ED: 0x9EDC, //CJK UNIFIED IDEOGRAPH
+ 0xF7EE: 0x9EDD, //CJK UNIFIED IDEOGRAPH
+ 0xF7EF: 0x9EE0, //CJK UNIFIED IDEOGRAPH
+ 0xF7F0: 0x9EDF, //CJK UNIFIED IDEOGRAPH
+ 0xF7F1: 0x9EE2, //CJK UNIFIED IDEOGRAPH
+ 0xF7F2: 0x9EE9, //CJK UNIFIED IDEOGRAPH
+ 0xF7F3: 0x9EE7, //CJK UNIFIED IDEOGRAPH
+ 0xF7F4: 0x9EE5, //CJK UNIFIED IDEOGRAPH
+ 0xF7F5: 0x9EEA, //CJK UNIFIED IDEOGRAPH
+ 0xF7F6: 0x9EEF, //CJK UNIFIED IDEOGRAPH
+ 0xF7F7: 0x9F22, //CJK UNIFIED IDEOGRAPH
+ 0xF7F8: 0x9F2C, //CJK UNIFIED IDEOGRAPH
+ 0xF7F9: 0x9F2F, //CJK UNIFIED IDEOGRAPH
+ 0xF7FA: 0x9F39, //CJK UNIFIED IDEOGRAPH
+ 0xF7FB: 0x9F37, //CJK UNIFIED IDEOGRAPH
+ 0xF7FC: 0x9F3D, //CJK UNIFIED IDEOGRAPH
+ 0xF7FD: 0x9F3E, //CJK UNIFIED IDEOGRAPH
+ 0xF7FE: 0x9F44, //CJK UNIFIED IDEOGRAPH
+ 0xF840: 0x9CE3, //CJK UNIFIED IDEOGRAPH
+ 0xF841: 0x9CE4, //CJK UNIFIED IDEOGRAPH
+ 0xF842: 0x9CE5, //CJK UNIFIED IDEOGRAPH
+ 0xF843: 0x9CE6, //CJK UNIFIED IDEOGRAPH
+ 0xF844: 0x9CE7, //CJK UNIFIED IDEOGRAPH
+ 0xF845: 0x9CE8, //CJK UNIFIED IDEOGRAPH
+ 0xF846: 0x9CE9, //CJK UNIFIED IDEOGRAPH
+ 0xF847: 0x9CEA, //CJK UNIFIED IDEOGRAPH
+ 0xF848: 0x9CEB, //CJK UNIFIED IDEOGRAPH
+ 0xF849: 0x9CEC, //CJK UNIFIED IDEOGRAPH
+ 0xF84A: 0x9CED, //CJK UNIFIED IDEOGRAPH
+ 0xF84B: 0x9CEE, //CJK UNIFIED IDEOGRAPH
+ 0xF84C: 0x9CEF, //CJK UNIFIED IDEOGRAPH
+ 0xF84D: 0x9CF0, //CJK UNIFIED IDEOGRAPH
+ 0xF84E: 0x9CF1, //CJK UNIFIED IDEOGRAPH
+ 0xF84F: 0x9CF2, //CJK UNIFIED IDEOGRAPH
+ 0xF850: 0x9CF3, //CJK UNIFIED IDEOGRAPH
+ 0xF851: 0x9CF4, //CJK UNIFIED IDEOGRAPH
+ 0xF852: 0x9CF5, //CJK UNIFIED IDEOGRAPH
+ 0xF853: 0x9CF6, //CJK UNIFIED IDEOGRAPH
+ 0xF854: 0x9CF7, //CJK UNIFIED IDEOGRAPH
+ 0xF855: 0x9CF8, //CJK UNIFIED IDEOGRAPH
+ 0xF856: 0x9CF9, //CJK UNIFIED IDEOGRAPH
+ 0xF857: 0x9CFA, //CJK UNIFIED IDEOGRAPH
+ 0xF858: 0x9CFB, //CJK UNIFIED IDEOGRAPH
+ 0xF859: 0x9CFC, //CJK UNIFIED IDEOGRAPH
+ 0xF85A: 0x9CFD, //CJK UNIFIED IDEOGRAPH
+ 0xF85B: 0x9CFE, //CJK UNIFIED IDEOGRAPH
+ 0xF85C: 0x9CFF, //CJK UNIFIED IDEOGRAPH
+ 0xF85D: 0x9D00, //CJK UNIFIED IDEOGRAPH
+ 0xF85E: 0x9D01, //CJK UNIFIED IDEOGRAPH
+ 0xF85F: 0x9D02, //CJK UNIFIED IDEOGRAPH
+ 0xF860: 0x9D03, //CJK UNIFIED IDEOGRAPH
+ 0xF861: 0x9D04, //CJK UNIFIED IDEOGRAPH
+ 0xF862: 0x9D05, //CJK UNIFIED IDEOGRAPH
+ 0xF863: 0x9D06, //CJK UNIFIED IDEOGRAPH
+ 0xF864: 0x9D07, //CJK UNIFIED IDEOGRAPH
+ 0xF865: 0x9D08, //CJK UNIFIED IDEOGRAPH
+ 0xF866: 0x9D09, //CJK UNIFIED IDEOGRAPH
+ 0xF867: 0x9D0A, //CJK UNIFIED IDEOGRAPH
+ 0xF868: 0x9D0B, //CJK UNIFIED IDEOGRAPH
+ 0xF869: 0x9D0C, //CJK UNIFIED IDEOGRAPH
+ 0xF86A: 0x9D0D, //CJK UNIFIED IDEOGRAPH
+ 0xF86B: 0x9D0E, //CJK UNIFIED IDEOGRAPH
+ 0xF86C: 0x9D0F, //CJK UNIFIED IDEOGRAPH
+ 0xF86D: 0x9D10, //CJK UNIFIED IDEOGRAPH
+ 0xF86E: 0x9D11, //CJK UNIFIED IDEOGRAPH
+ 0xF86F: 0x9D12, //CJK UNIFIED IDEOGRAPH
+ 0xF870: 0x9D13, //CJK UNIFIED IDEOGRAPH
+ 0xF871: 0x9D14, //CJK UNIFIED IDEOGRAPH
+ 0xF872: 0x9D15, //CJK UNIFIED IDEOGRAPH
+ 0xF873: 0x9D16, //CJK UNIFIED IDEOGRAPH
+ 0xF874: 0x9D17, //CJK UNIFIED IDEOGRAPH
+ 0xF875: 0x9D18, //CJK UNIFIED IDEOGRAPH
+ 0xF876: 0x9D19, //CJK UNIFIED IDEOGRAPH
+ 0xF877: 0x9D1A, //CJK UNIFIED IDEOGRAPH
+ 0xF878: 0x9D1B, //CJK UNIFIED IDEOGRAPH
+ 0xF879: 0x9D1C, //CJK UNIFIED IDEOGRAPH
+ 0xF87A: 0x9D1D, //CJK UNIFIED IDEOGRAPH
+ 0xF87B: 0x9D1E, //CJK UNIFIED IDEOGRAPH
+ 0xF87C: 0x9D1F, //CJK UNIFIED IDEOGRAPH
+ 0xF87D: 0x9D20, //CJK UNIFIED IDEOGRAPH
+ 0xF87E: 0x9D21, //CJK UNIFIED IDEOGRAPH
+ 0xF880: 0x9D22, //CJK UNIFIED IDEOGRAPH
+ 0xF881: 0x9D23, //CJK UNIFIED IDEOGRAPH
+ 0xF882: 0x9D24, //CJK UNIFIED IDEOGRAPH
+ 0xF883: 0x9D25, //CJK UNIFIED IDEOGRAPH
+ 0xF884: 0x9D26, //CJK UNIFIED IDEOGRAPH
+ 0xF885: 0x9D27, //CJK UNIFIED IDEOGRAPH
+ 0xF886: 0x9D28, //CJK UNIFIED IDEOGRAPH
+ 0xF887: 0x9D29, //CJK UNIFIED IDEOGRAPH
+ 0xF888: 0x9D2A, //CJK UNIFIED IDEOGRAPH
+ 0xF889: 0x9D2B, //CJK UNIFIED IDEOGRAPH
+ 0xF88A: 0x9D2C, //CJK UNIFIED IDEOGRAPH
+ 0xF88B: 0x9D2D, //CJK UNIFIED IDEOGRAPH
+ 0xF88C: 0x9D2E, //CJK UNIFIED IDEOGRAPH
+ 0xF88D: 0x9D2F, //CJK UNIFIED IDEOGRAPH
+ 0xF88E: 0x9D30, //CJK UNIFIED IDEOGRAPH
+ 0xF88F: 0x9D31, //CJK UNIFIED IDEOGRAPH
+ 0xF890: 0x9D32, //CJK UNIFIED IDEOGRAPH
+ 0xF891: 0x9D33, //CJK UNIFIED IDEOGRAPH
+ 0xF892: 0x9D34, //CJK UNIFIED IDEOGRAPH
+ 0xF893: 0x9D35, //CJK UNIFIED IDEOGRAPH
+ 0xF894: 0x9D36, //CJK UNIFIED IDEOGRAPH
+ 0xF895: 0x9D37, //CJK UNIFIED IDEOGRAPH
+ 0xF896: 0x9D38, //CJK UNIFIED IDEOGRAPH
+ 0xF897: 0x9D39, //CJK UNIFIED IDEOGRAPH
+ 0xF898: 0x9D3A, //CJK UNIFIED IDEOGRAPH
+ 0xF899: 0x9D3B, //CJK UNIFIED IDEOGRAPH
+ 0xF89A: 0x9D3C, //CJK UNIFIED IDEOGRAPH
+ 0xF89B: 0x9D3D, //CJK UNIFIED IDEOGRAPH
+ 0xF89C: 0x9D3E, //CJK UNIFIED IDEOGRAPH
+ 0xF89D: 0x9D3F, //CJK UNIFIED IDEOGRAPH
+ 0xF89E: 0x9D40, //CJK UNIFIED IDEOGRAPH
+ 0xF89F: 0x9D41, //CJK UNIFIED IDEOGRAPH
+ 0xF8A0: 0x9D42, //CJK UNIFIED IDEOGRAPH
+ 0xF940: 0x9D43, //CJK UNIFIED IDEOGRAPH
+ 0xF941: 0x9D44, //CJK UNIFIED IDEOGRAPH
+ 0xF942: 0x9D45, //CJK UNIFIED IDEOGRAPH
+ 0xF943: 0x9D46, //CJK UNIFIED IDEOGRAPH
+ 0xF944: 0x9D47, //CJK UNIFIED IDEOGRAPH
+ 0xF945: 0x9D48, //CJK UNIFIED IDEOGRAPH
+ 0xF946: 0x9D49, //CJK UNIFIED IDEOGRAPH
+ 0xF947: 0x9D4A, //CJK UNIFIED IDEOGRAPH
+ 0xF948: 0x9D4B, //CJK UNIFIED IDEOGRAPH
+ 0xF949: 0x9D4C, //CJK UNIFIED IDEOGRAPH
+ 0xF94A: 0x9D4D, //CJK UNIFIED IDEOGRAPH
+ 0xF94B: 0x9D4E, //CJK UNIFIED IDEOGRAPH
+ 0xF94C: 0x9D4F, //CJK UNIFIED IDEOGRAPH
+ 0xF94D: 0x9D50, //CJK UNIFIED IDEOGRAPH
+ 0xF94E: 0x9D51, //CJK UNIFIED IDEOGRAPH
+ 0xF94F: 0x9D52, //CJK UNIFIED IDEOGRAPH
+ 0xF950: 0x9D53, //CJK UNIFIED IDEOGRAPH
+ 0xF951: 0x9D54, //CJK UNIFIED IDEOGRAPH
+ 0xF952: 0x9D55, //CJK UNIFIED IDEOGRAPH
+ 0xF953: 0x9D56, //CJK UNIFIED IDEOGRAPH
+ 0xF954: 0x9D57, //CJK UNIFIED IDEOGRAPH
+ 0xF955: 0x9D58, //CJK UNIFIED IDEOGRAPH
+ 0xF956: 0x9D59, //CJK UNIFIED IDEOGRAPH
+ 0xF957: 0x9D5A, //CJK UNIFIED IDEOGRAPH
+ 0xF958: 0x9D5B, //CJK UNIFIED IDEOGRAPH
+ 0xF959: 0x9D5C, //CJK UNIFIED IDEOGRAPH
+ 0xF95A: 0x9D5D, //CJK UNIFIED IDEOGRAPH
+ 0xF95B: 0x9D5E, //CJK UNIFIED IDEOGRAPH
+ 0xF95C: 0x9D5F, //CJK UNIFIED IDEOGRAPH
+ 0xF95D: 0x9D60, //CJK UNIFIED IDEOGRAPH
+ 0xF95E: 0x9D61, //CJK UNIFIED IDEOGRAPH
+ 0xF95F: 0x9D62, //CJK UNIFIED IDEOGRAPH
+ 0xF960: 0x9D63, //CJK UNIFIED IDEOGRAPH
+ 0xF961: 0x9D64, //CJK UNIFIED IDEOGRAPH
+ 0xF962: 0x9D65, //CJK UNIFIED IDEOGRAPH
+ 0xF963: 0x9D66, //CJK UNIFIED IDEOGRAPH
+ 0xF964: 0x9D67, //CJK UNIFIED IDEOGRAPH
+ 0xF965: 0x9D68, //CJK UNIFIED IDEOGRAPH
+ 0xF966: 0x9D69, //CJK UNIFIED IDEOGRAPH
+ 0xF967: 0x9D6A, //CJK UNIFIED IDEOGRAPH
+ 0xF968: 0x9D6B, //CJK UNIFIED IDEOGRAPH
+ 0xF969: 0x9D6C, //CJK UNIFIED IDEOGRAPH
+ 0xF96A: 0x9D6D, //CJK UNIFIED IDEOGRAPH
+ 0xF96B: 0x9D6E, //CJK UNIFIED IDEOGRAPH
+ 0xF96C: 0x9D6F, //CJK UNIFIED IDEOGRAPH
+ 0xF96D: 0x9D70, //CJK UNIFIED IDEOGRAPH
+ 0xF96E: 0x9D71, //CJK UNIFIED IDEOGRAPH
+ 0xF96F: 0x9D72, //CJK UNIFIED IDEOGRAPH
+ 0xF970: 0x9D73, //CJK UNIFIED IDEOGRAPH
+ 0xF971: 0x9D74, //CJK UNIFIED IDEOGRAPH
+ 0xF972: 0x9D75, //CJK UNIFIED IDEOGRAPH
+ 0xF973: 0x9D76, //CJK UNIFIED IDEOGRAPH
+ 0xF974: 0x9D77, //CJK UNIFIED IDEOGRAPH
+ 0xF975: 0x9D78, //CJK UNIFIED IDEOGRAPH
+ 0xF976: 0x9D79, //CJK UNIFIED IDEOGRAPH
+ 0xF977: 0x9D7A, //CJK UNIFIED IDEOGRAPH
+ 0xF978: 0x9D7B, //CJK UNIFIED IDEOGRAPH
+ 0xF979: 0x9D7C, //CJK UNIFIED IDEOGRAPH
+ 0xF97A: 0x9D7D, //CJK UNIFIED IDEOGRAPH
+ 0xF97B: 0x9D7E, //CJK UNIFIED IDEOGRAPH
+ 0xF97C: 0x9D7F, //CJK UNIFIED IDEOGRAPH
+ 0xF97D: 0x9D80, //CJK UNIFIED IDEOGRAPH
+ 0xF97E: 0x9D81, //CJK UNIFIED IDEOGRAPH
+ 0xF980: 0x9D82, //CJK UNIFIED IDEOGRAPH
+ 0xF981: 0x9D83, //CJK UNIFIED IDEOGRAPH
+ 0xF982: 0x9D84, //CJK UNIFIED IDEOGRAPH
+ 0xF983: 0x9D85, //CJK UNIFIED IDEOGRAPH
+ 0xF984: 0x9D86, //CJK UNIFIED IDEOGRAPH
+ 0xF985: 0x9D87, //CJK UNIFIED IDEOGRAPH
+ 0xF986: 0x9D88, //CJK UNIFIED IDEOGRAPH
+ 0xF987: 0x9D89, //CJK UNIFIED IDEOGRAPH
+ 0xF988: 0x9D8A, //CJK UNIFIED IDEOGRAPH
+ 0xF989: 0x9D8B, //CJK UNIFIED IDEOGRAPH
+ 0xF98A: 0x9D8C, //CJK UNIFIED IDEOGRAPH
+ 0xF98B: 0x9D8D, //CJK UNIFIED IDEOGRAPH
+ 0xF98C: 0x9D8E, //CJK UNIFIED IDEOGRAPH
+ 0xF98D: 0x9D8F, //CJK UNIFIED IDEOGRAPH
+ 0xF98E: 0x9D90, //CJK UNIFIED IDEOGRAPH
+ 0xF98F: 0x9D91, //CJK UNIFIED IDEOGRAPH
+ 0xF990: 0x9D92, //CJK UNIFIED IDEOGRAPH
+ 0xF991: 0x9D93, //CJK UNIFIED IDEOGRAPH
+ 0xF992: 0x9D94, //CJK UNIFIED IDEOGRAPH
+ 0xF993: 0x9D95, //CJK UNIFIED IDEOGRAPH
+ 0xF994: 0x9D96, //CJK UNIFIED IDEOGRAPH
+ 0xF995: 0x9D97, //CJK UNIFIED IDEOGRAPH
+ 0xF996: 0x9D98, //CJK UNIFIED IDEOGRAPH
+ 0xF997: 0x9D99, //CJK UNIFIED IDEOGRAPH
+ 0xF998: 0x9D9A, //CJK UNIFIED IDEOGRAPH
+ 0xF999: 0x9D9B, //CJK UNIFIED IDEOGRAPH
+ 0xF99A: 0x9D9C, //CJK UNIFIED IDEOGRAPH
+ 0xF99B: 0x9D9D, //CJK UNIFIED IDEOGRAPH
+ 0xF99C: 0x9D9E, //CJK UNIFIED IDEOGRAPH
+ 0xF99D: 0x9D9F, //CJK UNIFIED IDEOGRAPH
+ 0xF99E: 0x9DA0, //CJK UNIFIED IDEOGRAPH
+ 0xF99F: 0x9DA1, //CJK UNIFIED IDEOGRAPH
+ 0xF9A0: 0x9DA2, //CJK UNIFIED IDEOGRAPH
+ 0xFA40: 0x9DA3, //CJK UNIFIED IDEOGRAPH
+ 0xFA41: 0x9DA4, //CJK UNIFIED IDEOGRAPH
+ 0xFA42: 0x9DA5, //CJK UNIFIED IDEOGRAPH
+ 0xFA43: 0x9DA6, //CJK UNIFIED IDEOGRAPH
+ 0xFA44: 0x9DA7, //CJK UNIFIED IDEOGRAPH
+ 0xFA45: 0x9DA8, //CJK UNIFIED IDEOGRAPH
+ 0xFA46: 0x9DA9, //CJK UNIFIED IDEOGRAPH
+ 0xFA47: 0x9DAA, //CJK UNIFIED IDEOGRAPH
+ 0xFA48: 0x9DAB, //CJK UNIFIED IDEOGRAPH
+ 0xFA49: 0x9DAC, //CJK UNIFIED IDEOGRAPH
+ 0xFA4A: 0x9DAD, //CJK UNIFIED IDEOGRAPH
+ 0xFA4B: 0x9DAE, //CJK UNIFIED IDEOGRAPH
+ 0xFA4C: 0x9DAF, //CJK UNIFIED IDEOGRAPH
+ 0xFA4D: 0x9DB0, //CJK UNIFIED IDEOGRAPH
+ 0xFA4E: 0x9DB1, //CJK UNIFIED IDEOGRAPH
+ 0xFA4F: 0x9DB2, //CJK UNIFIED IDEOGRAPH
+ 0xFA50: 0x9DB3, //CJK UNIFIED IDEOGRAPH
+ 0xFA51: 0x9DB4, //CJK UNIFIED IDEOGRAPH
+ 0xFA52: 0x9DB5, //CJK UNIFIED IDEOGRAPH
+ 0xFA53: 0x9DB6, //CJK UNIFIED IDEOGRAPH
+ 0xFA54: 0x9DB7, //CJK UNIFIED IDEOGRAPH
+ 0xFA55: 0x9DB8, //CJK UNIFIED IDEOGRAPH
+ 0xFA56: 0x9DB9, //CJK UNIFIED IDEOGRAPH
+ 0xFA57: 0x9DBA, //CJK UNIFIED IDEOGRAPH
+ 0xFA58: 0x9DBB, //CJK UNIFIED IDEOGRAPH
+ 0xFA59: 0x9DBC, //CJK UNIFIED IDEOGRAPH
+ 0xFA5A: 0x9DBD, //CJK UNIFIED IDEOGRAPH
+ 0xFA5B: 0x9DBE, //CJK UNIFIED IDEOGRAPH
+ 0xFA5C: 0x9DBF, //CJK UNIFIED IDEOGRAPH
+ 0xFA5D: 0x9DC0, //CJK UNIFIED IDEOGRAPH
+ 0xFA5E: 0x9DC1, //CJK UNIFIED IDEOGRAPH
+ 0xFA5F: 0x9DC2, //CJK UNIFIED IDEOGRAPH
+ 0xFA60: 0x9DC3, //CJK UNIFIED IDEOGRAPH
+ 0xFA61: 0x9DC4, //CJK UNIFIED IDEOGRAPH
+ 0xFA62: 0x9DC5, //CJK UNIFIED IDEOGRAPH
+ 0xFA63: 0x9DC6, //CJK UNIFIED IDEOGRAPH
+ 0xFA64: 0x9DC7, //CJK UNIFIED IDEOGRAPH
+ 0xFA65: 0x9DC8, //CJK UNIFIED IDEOGRAPH
+ 0xFA66: 0x9DC9, //CJK UNIFIED IDEOGRAPH
+ 0xFA67: 0x9DCA, //CJK UNIFIED IDEOGRAPH
+ 0xFA68: 0x9DCB, //CJK UNIFIED IDEOGRAPH
+ 0xFA69: 0x9DCC, //CJK UNIFIED IDEOGRAPH
+ 0xFA6A: 0x9DCD, //CJK UNIFIED IDEOGRAPH
+ 0xFA6B: 0x9DCE, //CJK UNIFIED IDEOGRAPH
+ 0xFA6C: 0x9DCF, //CJK UNIFIED IDEOGRAPH
+ 0xFA6D: 0x9DD0, //CJK UNIFIED IDEOGRAPH
+ 0xFA6E: 0x9DD1, //CJK UNIFIED IDEOGRAPH
+ 0xFA6F: 0x9DD2, //CJK UNIFIED IDEOGRAPH
+ 0xFA70: 0x9DD3, //CJK UNIFIED IDEOGRAPH
+ 0xFA71: 0x9DD4, //CJK UNIFIED IDEOGRAPH
+ 0xFA72: 0x9DD5, //CJK UNIFIED IDEOGRAPH
+ 0xFA73: 0x9DD6, //CJK UNIFIED IDEOGRAPH
+ 0xFA74: 0x9DD7, //CJK UNIFIED IDEOGRAPH
+ 0xFA75: 0x9DD8, //CJK UNIFIED IDEOGRAPH
+ 0xFA76: 0x9DD9, //CJK UNIFIED IDEOGRAPH
+ 0xFA77: 0x9DDA, //CJK UNIFIED IDEOGRAPH
+ 0xFA78: 0x9DDB, //CJK UNIFIED IDEOGRAPH
+ 0xFA79: 0x9DDC, //CJK UNIFIED IDEOGRAPH
+ 0xFA7A: 0x9DDD, //CJK UNIFIED IDEOGRAPH
+ 0xFA7B: 0x9DDE, //CJK UNIFIED IDEOGRAPH
+ 0xFA7C: 0x9DDF, //CJK UNIFIED IDEOGRAPH
+ 0xFA7D: 0x9DE0, //CJK UNIFIED IDEOGRAPH
+ 0xFA7E: 0x9DE1, //CJK UNIFIED IDEOGRAPH
+ 0xFA80: 0x9DE2, //CJK UNIFIED IDEOGRAPH
+ 0xFA81: 0x9DE3, //CJK UNIFIED IDEOGRAPH
+ 0xFA82: 0x9DE4, //CJK UNIFIED IDEOGRAPH
+ 0xFA83: 0x9DE5, //CJK UNIFIED IDEOGRAPH
+ 0xFA84: 0x9DE6, //CJK UNIFIED IDEOGRAPH
+ 0xFA85: 0x9DE7, //CJK UNIFIED IDEOGRAPH
+ 0xFA86: 0x9DE8, //CJK UNIFIED IDEOGRAPH
+ 0xFA87: 0x9DE9, //CJK UNIFIED IDEOGRAPH
+ 0xFA88: 0x9DEA, //CJK UNIFIED IDEOGRAPH
+ 0xFA89: 0x9DEB, //CJK UNIFIED IDEOGRAPH
+ 0xFA8A: 0x9DEC, //CJK UNIFIED IDEOGRAPH
+ 0xFA8B: 0x9DED, //CJK UNIFIED IDEOGRAPH
+ 0xFA8C: 0x9DEE, //CJK UNIFIED IDEOGRAPH
+ 0xFA8D: 0x9DEF, //CJK UNIFIED IDEOGRAPH
+ 0xFA8E: 0x9DF0, //CJK UNIFIED IDEOGRAPH
+ 0xFA8F: 0x9DF1, //CJK UNIFIED IDEOGRAPH
+ 0xFA90: 0x9DF2, //CJK UNIFIED IDEOGRAPH
+ 0xFA91: 0x9DF3, //CJK UNIFIED IDEOGRAPH
+ 0xFA92: 0x9DF4, //CJK UNIFIED IDEOGRAPH
+ 0xFA93: 0x9DF5, //CJK UNIFIED IDEOGRAPH
+ 0xFA94: 0x9DF6, //CJK UNIFIED IDEOGRAPH
+ 0xFA95: 0x9DF7, //CJK UNIFIED IDEOGRAPH
+ 0xFA96: 0x9DF8, //CJK UNIFIED IDEOGRAPH
+ 0xFA97: 0x9DF9, //CJK UNIFIED IDEOGRAPH
+ 0xFA98: 0x9DFA, //CJK UNIFIED IDEOGRAPH
+ 0xFA99: 0x9DFB, //CJK UNIFIED IDEOGRAPH
+ 0xFA9A: 0x9DFC, //CJK UNIFIED IDEOGRAPH
+ 0xFA9B: 0x9DFD, //CJK UNIFIED IDEOGRAPH
+ 0xFA9C: 0x9DFE, //CJK UNIFIED IDEOGRAPH
+ 0xFA9D: 0x9DFF, //CJK UNIFIED IDEOGRAPH
+ 0xFA9E: 0x9E00, //CJK UNIFIED IDEOGRAPH
+ 0xFA9F: 0x9E01, //CJK UNIFIED IDEOGRAPH
+ 0xFAA0: 0x9E02, //CJK UNIFIED IDEOGRAPH
+ 0xFB40: 0x9E03, //CJK UNIFIED IDEOGRAPH
+ 0xFB41: 0x9E04, //CJK UNIFIED IDEOGRAPH
+ 0xFB42: 0x9E05, //CJK UNIFIED IDEOGRAPH
+ 0xFB43: 0x9E06, //CJK UNIFIED IDEOGRAPH
+ 0xFB44: 0x9E07, //CJK UNIFIED IDEOGRAPH
+ 0xFB45: 0x9E08, //CJK UNIFIED IDEOGRAPH
+ 0xFB46: 0x9E09, //CJK UNIFIED IDEOGRAPH
+ 0xFB47: 0x9E0A, //CJK UNIFIED IDEOGRAPH
+ 0xFB48: 0x9E0B, //CJK UNIFIED IDEOGRAPH
+ 0xFB49: 0x9E0C, //CJK UNIFIED IDEOGRAPH
+ 0xFB4A: 0x9E0D, //CJK UNIFIED IDEOGRAPH
+ 0xFB4B: 0x9E0E, //CJK UNIFIED IDEOGRAPH
+ 0xFB4C: 0x9E0F, //CJK UNIFIED IDEOGRAPH
+ 0xFB4D: 0x9E10, //CJK UNIFIED IDEOGRAPH
+ 0xFB4E: 0x9E11, //CJK UNIFIED IDEOGRAPH
+ 0xFB4F: 0x9E12, //CJK UNIFIED IDEOGRAPH
+ 0xFB50: 0x9E13, //CJK UNIFIED IDEOGRAPH
+ 0xFB51: 0x9E14, //CJK UNIFIED IDEOGRAPH
+ 0xFB52: 0x9E15, //CJK UNIFIED IDEOGRAPH
+ 0xFB53: 0x9E16, //CJK UNIFIED IDEOGRAPH
+ 0xFB54: 0x9E17, //CJK UNIFIED IDEOGRAPH
+ 0xFB55: 0x9E18, //CJK UNIFIED IDEOGRAPH
+ 0xFB56: 0x9E19, //CJK UNIFIED IDEOGRAPH
+ 0xFB57: 0x9E1A, //CJK UNIFIED IDEOGRAPH
+ 0xFB58: 0x9E1B, //CJK UNIFIED IDEOGRAPH
+ 0xFB59: 0x9E1C, //CJK UNIFIED IDEOGRAPH
+ 0xFB5A: 0x9E1D, //CJK UNIFIED IDEOGRAPH
+ 0xFB5B: 0x9E1E, //CJK UNIFIED IDEOGRAPH
+ 0xFB5C: 0x9E24, //CJK UNIFIED IDEOGRAPH
+ 0xFB5D: 0x9E27, //CJK UNIFIED IDEOGRAPH
+ 0xFB5E: 0x9E2E, //CJK UNIFIED IDEOGRAPH
+ 0xFB5F: 0x9E30, //CJK UNIFIED IDEOGRAPH
+ 0xFB60: 0x9E34, //CJK UNIFIED IDEOGRAPH
+ 0xFB61: 0x9E3B, //CJK UNIFIED IDEOGRAPH
+ 0xFB62: 0x9E3C, //CJK UNIFIED IDEOGRAPH
+ 0xFB63: 0x9E40, //CJK UNIFIED IDEOGRAPH
+ 0xFB64: 0x9E4D, //CJK UNIFIED IDEOGRAPH
+ 0xFB65: 0x9E50, //CJK UNIFIED IDEOGRAPH
+ 0xFB66: 0x9E52, //CJK UNIFIED IDEOGRAPH
+ 0xFB67: 0x9E53, //CJK UNIFIED IDEOGRAPH
+ 0xFB68: 0x9E54, //CJK UNIFIED IDEOGRAPH
+ 0xFB69: 0x9E56, //CJK UNIFIED IDEOGRAPH
+ 0xFB6A: 0x9E59, //CJK UNIFIED IDEOGRAPH
+ 0xFB6B: 0x9E5D, //CJK UNIFIED IDEOGRAPH
+ 0xFB6C: 0x9E5F, //CJK UNIFIED IDEOGRAPH
+ 0xFB6D: 0x9E60, //CJK UNIFIED IDEOGRAPH
+ 0xFB6E: 0x9E61, //CJK UNIFIED IDEOGRAPH
+ 0xFB6F: 0x9E62, //CJK UNIFIED IDEOGRAPH
+ 0xFB70: 0x9E65, //CJK UNIFIED IDEOGRAPH
+ 0xFB71: 0x9E6E, //CJK UNIFIED IDEOGRAPH
+ 0xFB72: 0x9E6F, //CJK UNIFIED IDEOGRAPH
+ 0xFB73: 0x9E72, //CJK UNIFIED IDEOGRAPH
+ 0xFB74: 0x9E74, //CJK UNIFIED IDEOGRAPH
+ 0xFB75: 0x9E75, //CJK UNIFIED IDEOGRAPH
+ 0xFB76: 0x9E76, //CJK UNIFIED IDEOGRAPH
+ 0xFB77: 0x9E77, //CJK UNIFIED IDEOGRAPH
+ 0xFB78: 0x9E78, //CJK UNIFIED IDEOGRAPH
+ 0xFB79: 0x9E79, //CJK UNIFIED IDEOGRAPH
+ 0xFB7A: 0x9E7A, //CJK UNIFIED IDEOGRAPH
+ 0xFB7B: 0x9E7B, //CJK UNIFIED IDEOGRAPH
+ 0xFB7C: 0x9E7C, //CJK UNIFIED IDEOGRAPH
+ 0xFB7D: 0x9E7D, //CJK UNIFIED IDEOGRAPH
+ 0xFB7E: 0x9E80, //CJK UNIFIED IDEOGRAPH
+ 0xFB80: 0x9E81, //CJK UNIFIED IDEOGRAPH
+ 0xFB81: 0x9E83, //CJK UNIFIED IDEOGRAPH
+ 0xFB82: 0x9E84, //CJK UNIFIED IDEOGRAPH
+ 0xFB83: 0x9E85, //CJK UNIFIED IDEOGRAPH
+ 0xFB84: 0x9E86, //CJK UNIFIED IDEOGRAPH
+ 0xFB85: 0x9E89, //CJK UNIFIED IDEOGRAPH
+ 0xFB86: 0x9E8A, //CJK UNIFIED IDEOGRAPH
+ 0xFB87: 0x9E8C, //CJK UNIFIED IDEOGRAPH
+ 0xFB88: 0x9E8D, //CJK UNIFIED IDEOGRAPH
+ 0xFB89: 0x9E8E, //CJK UNIFIED IDEOGRAPH
+ 0xFB8A: 0x9E8F, //CJK UNIFIED IDEOGRAPH
+ 0xFB8B: 0x9E90, //CJK UNIFIED IDEOGRAPH
+ 0xFB8C: 0x9E91, //CJK UNIFIED IDEOGRAPH
+ 0xFB8D: 0x9E94, //CJK UNIFIED IDEOGRAPH
+ 0xFB8E: 0x9E95, //CJK UNIFIED IDEOGRAPH
+ 0xFB8F: 0x9E96, //CJK UNIFIED IDEOGRAPH
+ 0xFB90: 0x9E97, //CJK UNIFIED IDEOGRAPH
+ 0xFB91: 0x9E98, //CJK UNIFIED IDEOGRAPH
+ 0xFB92: 0x9E99, //CJK UNIFIED IDEOGRAPH
+ 0xFB93: 0x9E9A, //CJK UNIFIED IDEOGRAPH
+ 0xFB94: 0x9E9B, //CJK UNIFIED IDEOGRAPH
+ 0xFB95: 0x9E9C, //CJK UNIFIED IDEOGRAPH
+ 0xFB96: 0x9E9E, //CJK UNIFIED IDEOGRAPH
+ 0xFB97: 0x9EA0, //CJK UNIFIED IDEOGRAPH
+ 0xFB98: 0x9EA1, //CJK UNIFIED IDEOGRAPH
+ 0xFB99: 0x9EA2, //CJK UNIFIED IDEOGRAPH
+ 0xFB9A: 0x9EA3, //CJK UNIFIED IDEOGRAPH
+ 0xFB9B: 0x9EA4, //CJK UNIFIED IDEOGRAPH
+ 0xFB9C: 0x9EA5, //CJK UNIFIED IDEOGRAPH
+ 0xFB9D: 0x9EA7, //CJK UNIFIED IDEOGRAPH
+ 0xFB9E: 0x9EA8, //CJK UNIFIED IDEOGRAPH
+ 0xFB9F: 0x9EA9, //CJK UNIFIED IDEOGRAPH
+ 0xFBA0: 0x9EAA, //CJK UNIFIED IDEOGRAPH
+ 0xFC40: 0x9EAB, //CJK UNIFIED IDEOGRAPH
+ 0xFC41: 0x9EAC, //CJK UNIFIED IDEOGRAPH
+ 0xFC42: 0x9EAD, //CJK UNIFIED IDEOGRAPH
+ 0xFC43: 0x9EAE, //CJK UNIFIED IDEOGRAPH
+ 0xFC44: 0x9EAF, //CJK UNIFIED IDEOGRAPH
+ 0xFC45: 0x9EB0, //CJK UNIFIED IDEOGRAPH
+ 0xFC46: 0x9EB1, //CJK UNIFIED IDEOGRAPH
+ 0xFC47: 0x9EB2, //CJK UNIFIED IDEOGRAPH
+ 0xFC48: 0x9EB3, //CJK UNIFIED IDEOGRAPH
+ 0xFC49: 0x9EB5, //CJK UNIFIED IDEOGRAPH
+ 0xFC4A: 0x9EB6, //CJK UNIFIED IDEOGRAPH
+ 0xFC4B: 0x9EB7, //CJK UNIFIED IDEOGRAPH
+ 0xFC4C: 0x9EB9, //CJK UNIFIED IDEOGRAPH
+ 0xFC4D: 0x9EBA, //CJK UNIFIED IDEOGRAPH
+ 0xFC4E: 0x9EBC, //CJK UNIFIED IDEOGRAPH
+ 0xFC4F: 0x9EBF, //CJK UNIFIED IDEOGRAPH
+ 0xFC50: 0x9EC0, //CJK UNIFIED IDEOGRAPH
+ 0xFC51: 0x9EC1, //CJK UNIFIED IDEOGRAPH
+ 0xFC52: 0x9EC2, //CJK UNIFIED IDEOGRAPH
+ 0xFC53: 0x9EC3, //CJK UNIFIED IDEOGRAPH
+ 0xFC54: 0x9EC5, //CJK UNIFIED IDEOGRAPH
+ 0xFC55: 0x9EC6, //CJK UNIFIED IDEOGRAPH
+ 0xFC56: 0x9EC7, //CJK UNIFIED IDEOGRAPH
+ 0xFC57: 0x9EC8, //CJK UNIFIED IDEOGRAPH
+ 0xFC58: 0x9ECA, //CJK UNIFIED IDEOGRAPH
+ 0xFC59: 0x9ECB, //CJK UNIFIED IDEOGRAPH
+ 0xFC5A: 0x9ECC, //CJK UNIFIED IDEOGRAPH
+ 0xFC5B: 0x9ED0, //CJK UNIFIED IDEOGRAPH
+ 0xFC5C: 0x9ED2, //CJK UNIFIED IDEOGRAPH
+ 0xFC5D: 0x9ED3, //CJK UNIFIED IDEOGRAPH
+ 0xFC5E: 0x9ED5, //CJK UNIFIED IDEOGRAPH
+ 0xFC5F: 0x9ED6, //CJK UNIFIED IDEOGRAPH
+ 0xFC60: 0x9ED7, //CJK UNIFIED IDEOGRAPH
+ 0xFC61: 0x9ED9, //CJK UNIFIED IDEOGRAPH
+ 0xFC62: 0x9EDA, //CJK UNIFIED IDEOGRAPH
+ 0xFC63: 0x9EDE, //CJK UNIFIED IDEOGRAPH
+ 0xFC64: 0x9EE1, //CJK UNIFIED IDEOGRAPH
+ 0xFC65: 0x9EE3, //CJK UNIFIED IDEOGRAPH
+ 0xFC66: 0x9EE4, //CJK UNIFIED IDEOGRAPH
+ 0xFC67: 0x9EE6, //CJK UNIFIED IDEOGRAPH
+ 0xFC68: 0x9EE8, //CJK UNIFIED IDEOGRAPH
+ 0xFC69: 0x9EEB, //CJK UNIFIED IDEOGRAPH
+ 0xFC6A: 0x9EEC, //CJK UNIFIED IDEOGRAPH
+ 0xFC6B: 0x9EED, //CJK UNIFIED IDEOGRAPH
+ 0xFC6C: 0x9EEE, //CJK UNIFIED IDEOGRAPH
+ 0xFC6D: 0x9EF0, //CJK UNIFIED IDEOGRAPH
+ 0xFC6E: 0x9EF1, //CJK UNIFIED IDEOGRAPH
+ 0xFC6F: 0x9EF2, //CJK UNIFIED IDEOGRAPH
+ 0xFC70: 0x9EF3, //CJK UNIFIED IDEOGRAPH
+ 0xFC71: 0x9EF4, //CJK UNIFIED IDEOGRAPH
+ 0xFC72: 0x9EF5, //CJK UNIFIED IDEOGRAPH
+ 0xFC73: 0x9EF6, //CJK UNIFIED IDEOGRAPH
+ 0xFC74: 0x9EF7, //CJK UNIFIED IDEOGRAPH
+ 0xFC75: 0x9EF8, //CJK UNIFIED IDEOGRAPH
+ 0xFC76: 0x9EFA, //CJK UNIFIED IDEOGRAPH
+ 0xFC77: 0x9EFD, //CJK UNIFIED IDEOGRAPH
+ 0xFC78: 0x9EFF, //CJK UNIFIED IDEOGRAPH
+ 0xFC79: 0x9F00, //CJK UNIFIED IDEOGRAPH
+ 0xFC7A: 0x9F01, //CJK UNIFIED IDEOGRAPH
+ 0xFC7B: 0x9F02, //CJK UNIFIED IDEOGRAPH
+ 0xFC7C: 0x9F03, //CJK UNIFIED IDEOGRAPH
+ 0xFC7D: 0x9F04, //CJK UNIFIED IDEOGRAPH
+ 0xFC7E: 0x9F05, //CJK UNIFIED IDEOGRAPH
+ 0xFC80: 0x9F06, //CJK UNIFIED IDEOGRAPH
+ 0xFC81: 0x9F07, //CJK UNIFIED IDEOGRAPH
+ 0xFC82: 0x9F08, //CJK UNIFIED IDEOGRAPH
+ 0xFC83: 0x9F09, //CJK UNIFIED IDEOGRAPH
+ 0xFC84: 0x9F0A, //CJK UNIFIED IDEOGRAPH
+ 0xFC85: 0x9F0C, //CJK UNIFIED IDEOGRAPH
+ 0xFC86: 0x9F0F, //CJK UNIFIED IDEOGRAPH
+ 0xFC87: 0x9F11, //CJK UNIFIED IDEOGRAPH
+ 0xFC88: 0x9F12, //CJK UNIFIED IDEOGRAPH
+ 0xFC89: 0x9F14, //CJK UNIFIED IDEOGRAPH
+ 0xFC8A: 0x9F15, //CJK UNIFIED IDEOGRAPH
+ 0xFC8B: 0x9F16, //CJK UNIFIED IDEOGRAPH
+ 0xFC8C: 0x9F18, //CJK UNIFIED IDEOGRAPH
+ 0xFC8D: 0x9F1A, //CJK UNIFIED IDEOGRAPH
+ 0xFC8E: 0x9F1B, //CJK UNIFIED IDEOGRAPH
+ 0xFC8F: 0x9F1C, //CJK UNIFIED IDEOGRAPH
+ 0xFC90: 0x9F1D, //CJK UNIFIED IDEOGRAPH
+ 0xFC91: 0x9F1E, //CJK UNIFIED IDEOGRAPH
+ 0xFC92: 0x9F1F, //CJK UNIFIED IDEOGRAPH
+ 0xFC93: 0x9F21, //CJK UNIFIED IDEOGRAPH
+ 0xFC94: 0x9F23, //CJK UNIFIED IDEOGRAPH
+ 0xFC95: 0x9F24, //CJK UNIFIED IDEOGRAPH
+ 0xFC96: 0x9F25, //CJK UNIFIED IDEOGRAPH
+ 0xFC97: 0x9F26, //CJK UNIFIED IDEOGRAPH
+ 0xFC98: 0x9F27, //CJK UNIFIED IDEOGRAPH
+ 0xFC99: 0x9F28, //CJK UNIFIED IDEOGRAPH
+ 0xFC9A: 0x9F29, //CJK UNIFIED IDEOGRAPH
+ 0xFC9B: 0x9F2A, //CJK UNIFIED IDEOGRAPH
+ 0xFC9C: 0x9F2B, //CJK UNIFIED IDEOGRAPH
+ 0xFC9D: 0x9F2D, //CJK UNIFIED IDEOGRAPH
+ 0xFC9E: 0x9F2E, //CJK UNIFIED IDEOGRAPH
+ 0xFC9F: 0x9F30, //CJK UNIFIED IDEOGRAPH
+ 0xFCA0: 0x9F31, //CJK UNIFIED IDEOGRAPH
+ 0xFD40: 0x9F32, //CJK UNIFIED IDEOGRAPH
+ 0xFD41: 0x9F33, //CJK UNIFIED IDEOGRAPH
+ 0xFD42: 0x9F34, //CJK UNIFIED IDEOGRAPH
+ 0xFD43: 0x9F35, //CJK UNIFIED IDEOGRAPH
+ 0xFD44: 0x9F36, //CJK UNIFIED IDEOGRAPH
+ 0xFD45: 0x9F38, //CJK UNIFIED IDEOGRAPH
+ 0xFD46: 0x9F3A, //CJK UNIFIED IDEOGRAPH
+ 0xFD47: 0x9F3C, //CJK UNIFIED IDEOGRAPH
+ 0xFD48: 0x9F3F, //CJK UNIFIED IDEOGRAPH
+ 0xFD49: 0x9F40, //CJK UNIFIED IDEOGRAPH
+ 0xFD4A: 0x9F41, //CJK UNIFIED IDEOGRAPH
+ 0xFD4B: 0x9F42, //CJK UNIFIED IDEOGRAPH
+ 0xFD4C: 0x9F43, //CJK UNIFIED IDEOGRAPH
+ 0xFD4D: 0x9F45, //CJK UNIFIED IDEOGRAPH
+ 0xFD4E: 0x9F46, //CJK UNIFIED IDEOGRAPH
+ 0xFD4F: 0x9F47, //CJK UNIFIED IDEOGRAPH
+ 0xFD50: 0x9F48, //CJK UNIFIED IDEOGRAPH
+ 0xFD51: 0x9F49, //CJK UNIFIED IDEOGRAPH
+ 0xFD52: 0x9F4A, //CJK UNIFIED IDEOGRAPH
+ 0xFD53: 0x9F4B, //CJK UNIFIED IDEOGRAPH
+ 0xFD54: 0x9F4C, //CJK UNIFIED IDEOGRAPH
+ 0xFD55: 0x9F4D, //CJK UNIFIED IDEOGRAPH
+ 0xFD56: 0x9F4E, //CJK UNIFIED IDEOGRAPH
+ 0xFD57: 0x9F4F, //CJK UNIFIED IDEOGRAPH
+ 0xFD58: 0x9F52, //CJK UNIFIED IDEOGRAPH
+ 0xFD59: 0x9F53, //CJK UNIFIED IDEOGRAPH
+ 0xFD5A: 0x9F54, //CJK UNIFIED IDEOGRAPH
+ 0xFD5B: 0x9F55, //CJK UNIFIED IDEOGRAPH
+ 0xFD5C: 0x9F56, //CJK UNIFIED IDEOGRAPH
+ 0xFD5D: 0x9F57, //CJK UNIFIED IDEOGRAPH
+ 0xFD5E: 0x9F58, //CJK UNIFIED IDEOGRAPH
+ 0xFD5F: 0x9F59, //CJK UNIFIED IDEOGRAPH
+ 0xFD60: 0x9F5A, //CJK UNIFIED IDEOGRAPH
+ 0xFD61: 0x9F5B, //CJK UNIFIED IDEOGRAPH
+ 0xFD62: 0x9F5C, //CJK UNIFIED IDEOGRAPH
+ 0xFD63: 0x9F5D, //CJK UNIFIED IDEOGRAPH
+ 0xFD64: 0x9F5E, //CJK UNIFIED IDEOGRAPH
+ 0xFD65: 0x9F5F, //CJK UNIFIED IDEOGRAPH
+ 0xFD66: 0x9F60, //CJK UNIFIED IDEOGRAPH
+ 0xFD67: 0x9F61, //CJK UNIFIED IDEOGRAPH
+ 0xFD68: 0x9F62, //CJK UNIFIED IDEOGRAPH
+ 0xFD69: 0x9F63, //CJK UNIFIED IDEOGRAPH
+ 0xFD6A: 0x9F64, //CJK UNIFIED IDEOGRAPH
+ 0xFD6B: 0x9F65, //CJK UNIFIED IDEOGRAPH
+ 0xFD6C: 0x9F66, //CJK UNIFIED IDEOGRAPH
+ 0xFD6D: 0x9F67, //CJK UNIFIED IDEOGRAPH
+ 0xFD6E: 0x9F68, //CJK UNIFIED IDEOGRAPH
+ 0xFD6F: 0x9F69, //CJK UNIFIED IDEOGRAPH
+ 0xFD70: 0x9F6A, //CJK UNIFIED IDEOGRAPH
+ 0xFD71: 0x9F6B, //CJK UNIFIED IDEOGRAPH
+ 0xFD72: 0x9F6C, //CJK UNIFIED IDEOGRAPH
+ 0xFD73: 0x9F6D, //CJK UNIFIED IDEOGRAPH
+ 0xFD74: 0x9F6E, //CJK UNIFIED IDEOGRAPH
+ 0xFD75: 0x9F6F, //CJK UNIFIED IDEOGRAPH
+ 0xFD76: 0x9F70, //CJK UNIFIED IDEOGRAPH
+ 0xFD77: 0x9F71, //CJK UNIFIED IDEOGRAPH
+ 0xFD78: 0x9F72, //CJK UNIFIED IDEOGRAPH
+ 0xFD79: 0x9F73, //CJK UNIFIED IDEOGRAPH
+ 0xFD7A: 0x9F74, //CJK UNIFIED IDEOGRAPH
+ 0xFD7B: 0x9F75, //CJK UNIFIED IDEOGRAPH
+ 0xFD7C: 0x9F76, //CJK UNIFIED IDEOGRAPH
+ 0xFD7D: 0x9F77, //CJK UNIFIED IDEOGRAPH
+ 0xFD7E: 0x9F78, //CJK UNIFIED IDEOGRAPH
+ 0xFD80: 0x9F79, //CJK UNIFIED IDEOGRAPH
+ 0xFD81: 0x9F7A, //CJK UNIFIED IDEOGRAPH
+ 0xFD82: 0x9F7B, //CJK UNIFIED IDEOGRAPH
+ 0xFD83: 0x9F7C, //CJK UNIFIED IDEOGRAPH
+ 0xFD84: 0x9F7D, //CJK UNIFIED IDEOGRAPH
+ 0xFD85: 0x9F7E, //CJK UNIFIED IDEOGRAPH
+ 0xFD86: 0x9F81, //CJK UNIFIED IDEOGRAPH
+ 0xFD87: 0x9F82, //CJK UNIFIED IDEOGRAPH
+ 0xFD88: 0x9F8D, //CJK UNIFIED IDEOGRAPH
+ 0xFD89: 0x9F8E, //CJK UNIFIED IDEOGRAPH
+ 0xFD8A: 0x9F8F, //CJK UNIFIED IDEOGRAPH
+ 0xFD8B: 0x9F90, //CJK UNIFIED IDEOGRAPH
+ 0xFD8C: 0x9F91, //CJK UNIFIED IDEOGRAPH
+ 0xFD8D: 0x9F92, //CJK UNIFIED IDEOGRAPH
+ 0xFD8E: 0x9F93, //CJK UNIFIED IDEOGRAPH
+ 0xFD8F: 0x9F94, //CJK UNIFIED IDEOGRAPH
+ 0xFD90: 0x9F95, //CJK UNIFIED IDEOGRAPH
+ 0xFD91: 0x9F96, //CJK UNIFIED IDEOGRAPH
+ 0xFD92: 0x9F97, //CJK UNIFIED IDEOGRAPH
+ 0xFD93: 0x9F98, //CJK UNIFIED IDEOGRAPH
+ 0xFD94: 0x9F9C, //CJK UNIFIED IDEOGRAPH
+ 0xFD95: 0x9F9D, //CJK UNIFIED IDEOGRAPH
+ 0xFD96: 0x9F9E, //CJK UNIFIED IDEOGRAPH
+ 0xFD97: 0x9FA1, //CJK UNIFIED IDEOGRAPH
+ 0xFD98: 0x9FA2, //CJK UNIFIED IDEOGRAPH
+ 0xFD99: 0x9FA3, //CJK UNIFIED IDEOGRAPH
+ 0xFD9A: 0x9FA4, //CJK UNIFIED IDEOGRAPH
+ 0xFD9B: 0x9FA5, //CJK UNIFIED IDEOGRAPH
+ 0xFD9C: 0xF92C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFD9D: 0xF979, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFD9E: 0xF995, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFD9F: 0xF9E7, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFDA0: 0xF9F1, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE40: 0xFA0C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE41: 0xFA0D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE42: 0xFA0E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE43: 0xFA0F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE44: 0xFA11, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE45: 0xFA13, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE46: 0xFA14, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE47: 0xFA18, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE48: 0xFA1F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE49: 0xFA20, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE4A: 0xFA21, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE4B: 0xFA23, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE4C: 0xFA24, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE4D: 0xFA27, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE4E: 0xFA28, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFE4F: 0xFA29, //CJK COMPATIBILITY IDEOGRAPH
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp949.go b/vendor/github.com/denisenkom/go-mssqldb/cp949.go
new file mode 100644
index 000000000..cddfcbc85
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp949.go
@@ -0,0 +1,17312 @@
+package mssql
+
+var cp949 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0xFFFD, //UNDEFINED
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ 0xFFFD, //UNDEFINED
+ },
+ db: map[int]rune{
+ 0x8141: 0xAC02, //HANGUL SYLLABLE KIYEOK A SSANGKIYEOK
+ 0x8142: 0xAC03, //HANGUL SYLLABLE KIYEOK A KIYEOKSIOS
+ 0x8143: 0xAC05, //HANGUL SYLLABLE KIYEOK A NIEUNCIEUC
+ 0x8144: 0xAC06, //HANGUL SYLLABLE KIYEOK A NIEUNHIEUH
+ 0x8145: 0xAC0B, //HANGUL SYLLABLE KIYEOK A RIEULPIEUP
+ 0x8146: 0xAC0C, //HANGUL SYLLABLE KIYEOK A RIEULSIOS
+ 0x8147: 0xAC0D, //HANGUL SYLLABLE KIYEOK A RIEULTHIEUTH
+ 0x8148: 0xAC0E, //HANGUL SYLLABLE KIYEOK A RIEULPHIEUPH
+ 0x8149: 0xAC0F, //HANGUL SYLLABLE KIYEOK A RIEULHIEUH
+ 0x814A: 0xAC18, //HANGUL SYLLABLE KIYEOK A KHIEUKH
+ 0x814B: 0xAC1E, //HANGUL SYLLABLE KIYEOK AE SSANGKIYEOK
+ 0x814C: 0xAC1F, //HANGUL SYLLABLE KIYEOK AE KIYEOKSIOS
+ 0x814D: 0xAC21, //HANGUL SYLLABLE KIYEOK AE NIEUNCIEUC
+ 0x814E: 0xAC22, //HANGUL SYLLABLE KIYEOK AE NIEUNHIEUH
+ 0x814F: 0xAC23, //HANGUL SYLLABLE KIYEOK AE TIKEUT
+ 0x8150: 0xAC25, //HANGUL SYLLABLE KIYEOK AE RIEULKIYEOK
+ 0x8151: 0xAC26, //HANGUL SYLLABLE KIYEOK AE RIEULMIEUM
+ 0x8152: 0xAC27, //HANGUL SYLLABLE KIYEOK AE RIEULPIEUP
+ 0x8153: 0xAC28, //HANGUL SYLLABLE KIYEOK AE RIEULSIOS
+ 0x8154: 0xAC29, //HANGUL SYLLABLE KIYEOK AE RIEULTHIEUTH
+ 0x8155: 0xAC2A, //HANGUL SYLLABLE KIYEOK AE RIEULPHIEUPH
+ 0x8156: 0xAC2B, //HANGUL SYLLABLE KIYEOK AE RIEULHIEUH
+ 0x8157: 0xAC2E, //HANGUL SYLLABLE KIYEOK AE PIEUPSIOS
+ 0x8158: 0xAC32, //HANGUL SYLLABLE KIYEOK AE CIEUC
+ 0x8159: 0xAC33, //HANGUL SYLLABLE KIYEOK AE CHIEUCH
+ 0x815A: 0xAC34, //HANGUL SYLLABLE KIYEOK AE KHIEUKH
+ 0x8161: 0xAC35, //HANGUL SYLLABLE KIYEOK AE THIEUTH
+ 0x8162: 0xAC36, //HANGUL SYLLABLE KIYEOK AE PHIEUPH
+ 0x8163: 0xAC37, //HANGUL SYLLABLE KIYEOK AE HIEUH
+ 0x8164: 0xAC3A, //HANGUL SYLLABLE KIYEOK YA SSANGKIYEOK
+ 0x8165: 0xAC3B, //HANGUL SYLLABLE KIYEOK YA KIYEOKSIOS
+ 0x8166: 0xAC3D, //HANGUL SYLLABLE KIYEOK YA NIEUNCIEUC
+ 0x8167: 0xAC3E, //HANGUL SYLLABLE KIYEOK YA NIEUNHIEUH
+ 0x8168: 0xAC3F, //HANGUL SYLLABLE KIYEOK YA TIKEUT
+ 0x8169: 0xAC41, //HANGUL SYLLABLE KIYEOK YA RIEULKIYEOK
+ 0x816A: 0xAC42, //HANGUL SYLLABLE KIYEOK YA RIEULMIEUM
+ 0x816B: 0xAC43, //HANGUL SYLLABLE KIYEOK YA RIEULPIEUP
+ 0x816C: 0xAC44, //HANGUL SYLLABLE KIYEOK YA RIEULSIOS
+ 0x816D: 0xAC45, //HANGUL SYLLABLE KIYEOK YA RIEULTHIEUTH
+ 0x816E: 0xAC46, //HANGUL SYLLABLE KIYEOK YA RIEULPHIEUPH
+ 0x816F: 0xAC47, //HANGUL SYLLABLE KIYEOK YA RIEULHIEUH
+ 0x8170: 0xAC48, //HANGUL SYLLABLE KIYEOK YA MIEUM
+ 0x8171: 0xAC49, //HANGUL SYLLABLE KIYEOK YA PIEUP
+ 0x8172: 0xAC4A, //HANGUL SYLLABLE KIYEOK YA PIEUPSIOS
+ 0x8173: 0xAC4C, //HANGUL SYLLABLE KIYEOK YA SSANGSIOS
+ 0x8174: 0xAC4E, //HANGUL SYLLABLE KIYEOK YA CIEUC
+ 0x8175: 0xAC4F, //HANGUL SYLLABLE KIYEOK YA CHIEUCH
+ 0x8176: 0xAC50, //HANGUL SYLLABLE KIYEOK YA KHIEUKH
+ 0x8177: 0xAC51, //HANGUL SYLLABLE KIYEOK YA THIEUTH
+ 0x8178: 0xAC52, //HANGUL SYLLABLE KIYEOK YA PHIEUPH
+ 0x8179: 0xAC53, //HANGUL SYLLABLE KIYEOK YA HIEUH
+ 0x817A: 0xAC55, //HANGUL SYLLABLE KIYEOK YAE KIYEOK
+ 0x8181: 0xAC56, //HANGUL SYLLABLE KIYEOK YAE SSANGKIYEOK
+ 0x8182: 0xAC57, //HANGUL SYLLABLE KIYEOK YAE KIYEOKSIOS
+ 0x8183: 0xAC59, //HANGUL SYLLABLE KIYEOK YAE NIEUNCIEUC
+ 0x8184: 0xAC5A, //HANGUL SYLLABLE KIYEOK YAE NIEUNHIEUH
+ 0x8185: 0xAC5B, //HANGUL SYLLABLE KIYEOK YAE TIKEUT
+ 0x8186: 0xAC5D, //HANGUL SYLLABLE KIYEOK YAE RIEULKIYEOK
+ 0x8187: 0xAC5E, //HANGUL SYLLABLE KIYEOK YAE RIEULMIEUM
+ 0x8188: 0xAC5F, //HANGUL SYLLABLE KIYEOK YAE RIEULPIEUP
+ 0x8189: 0xAC60, //HANGUL SYLLABLE KIYEOK YAE RIEULSIOS
+ 0x818A: 0xAC61, //HANGUL SYLLABLE KIYEOK YAE RIEULTHIEUTH
+ 0x818B: 0xAC62, //HANGUL SYLLABLE KIYEOK YAE RIEULPHIEUPH
+ 0x818C: 0xAC63, //HANGUL SYLLABLE KIYEOK YAE RIEULHIEUH
+ 0x818D: 0xAC64, //HANGUL SYLLABLE KIYEOK YAE MIEUM
+ 0x818E: 0xAC65, //HANGUL SYLLABLE KIYEOK YAE PIEUP
+ 0x818F: 0xAC66, //HANGUL SYLLABLE KIYEOK YAE PIEUPSIOS
+ 0x8190: 0xAC67, //HANGUL SYLLABLE KIYEOK YAE SIOS
+ 0x8191: 0xAC68, //HANGUL SYLLABLE KIYEOK YAE SSANGSIOS
+ 0x8192: 0xAC69, //HANGUL SYLLABLE KIYEOK YAE IEUNG
+ 0x8193: 0xAC6A, //HANGUL SYLLABLE KIYEOK YAE CIEUC
+ 0x8194: 0xAC6B, //HANGUL SYLLABLE KIYEOK YAE CHIEUCH
+ 0x8195: 0xAC6C, //HANGUL SYLLABLE KIYEOK YAE KHIEUKH
+ 0x8196: 0xAC6D, //HANGUL SYLLABLE KIYEOK YAE THIEUTH
+ 0x8197: 0xAC6E, //HANGUL SYLLABLE KIYEOK YAE PHIEUPH
+ 0x8198: 0xAC6F, //HANGUL SYLLABLE KIYEOK YAE HIEUH
+ 0x8199: 0xAC72, //HANGUL SYLLABLE KIYEOK EO SSANGKIYEOK
+ 0x819A: 0xAC73, //HANGUL SYLLABLE KIYEOK EO KIYEOKSIOS
+ 0x819B: 0xAC75, //HANGUL SYLLABLE KIYEOK EO NIEUNCIEUC
+ 0x819C: 0xAC76, //HANGUL SYLLABLE KIYEOK EO NIEUNHIEUH
+ 0x819D: 0xAC79, //HANGUL SYLLABLE KIYEOK EO RIEULKIYEOK
+ 0x819E: 0xAC7B, //HANGUL SYLLABLE KIYEOK EO RIEULPIEUP
+ 0x819F: 0xAC7C, //HANGUL SYLLABLE KIYEOK EO RIEULSIOS
+ 0x81A0: 0xAC7D, //HANGUL SYLLABLE KIYEOK EO RIEULTHIEUTH
+ 0x81A1: 0xAC7E, //HANGUL SYLLABLE KIYEOK EO RIEULPHIEUPH
+ 0x81A2: 0xAC7F, //HANGUL SYLLABLE KIYEOK EO RIEULHIEUH
+ 0x81A3: 0xAC82, //HANGUL SYLLABLE KIYEOK EO PIEUPSIOS
+ 0x81A4: 0xAC87, //HANGUL SYLLABLE KIYEOK EO CHIEUCH
+ 0x81A5: 0xAC88, //HANGUL SYLLABLE KIYEOK EO KHIEUKH
+ 0x81A6: 0xAC8D, //HANGUL SYLLABLE KIYEOK E KIYEOK
+ 0x81A7: 0xAC8E, //HANGUL SYLLABLE KIYEOK E SSANGKIYEOK
+ 0x81A8: 0xAC8F, //HANGUL SYLLABLE KIYEOK E KIYEOKSIOS
+ 0x81A9: 0xAC91, //HANGUL SYLLABLE KIYEOK E NIEUNCIEUC
+ 0x81AA: 0xAC92, //HANGUL SYLLABLE KIYEOK E NIEUNHIEUH
+ 0x81AB: 0xAC93, //HANGUL SYLLABLE KIYEOK E TIKEUT
+ 0x81AC: 0xAC95, //HANGUL SYLLABLE KIYEOK E RIEULKIYEOK
+ 0x81AD: 0xAC96, //HANGUL SYLLABLE KIYEOK E RIEULMIEUM
+ 0x81AE: 0xAC97, //HANGUL SYLLABLE KIYEOK E RIEULPIEUP
+ 0x81AF: 0xAC98, //HANGUL SYLLABLE KIYEOK E RIEULSIOS
+ 0x81B0: 0xAC99, //HANGUL SYLLABLE KIYEOK E RIEULTHIEUTH
+ 0x81B1: 0xAC9A, //HANGUL SYLLABLE KIYEOK E RIEULPHIEUPH
+ 0x81B2: 0xAC9B, //HANGUL SYLLABLE KIYEOK E RIEULHIEUH
+ 0x81B3: 0xAC9E, //HANGUL SYLLABLE KIYEOK E PIEUPSIOS
+ 0x81B4: 0xACA2, //HANGUL SYLLABLE KIYEOK E CIEUC
+ 0x81B5: 0xACA3, //HANGUL SYLLABLE KIYEOK E CHIEUCH
+ 0x81B6: 0xACA4, //HANGUL SYLLABLE KIYEOK E KHIEUKH
+ 0x81B7: 0xACA5, //HANGUL SYLLABLE KIYEOK E THIEUTH
+ 0x81B8: 0xACA6, //HANGUL SYLLABLE KIYEOK E PHIEUPH
+ 0x81B9: 0xACA7, //HANGUL SYLLABLE KIYEOK E HIEUH
+ 0x81BA: 0xACAB, //HANGUL SYLLABLE KIYEOK YEO KIYEOKSIOS
+ 0x81BB: 0xACAD, //HANGUL SYLLABLE KIYEOK YEO NIEUNCIEUC
+ 0x81BC: 0xACAE, //HANGUL SYLLABLE KIYEOK YEO NIEUNHIEUH
+ 0x81BD: 0xACB1, //HANGUL SYLLABLE KIYEOK YEO RIEULKIYEOK
+ 0x81BE: 0xACB2, //HANGUL SYLLABLE KIYEOK YEO RIEULMIEUM
+ 0x81BF: 0xACB3, //HANGUL SYLLABLE KIYEOK YEO RIEULPIEUP
+ 0x81C0: 0xACB4, //HANGUL SYLLABLE KIYEOK YEO RIEULSIOS
+ 0x81C1: 0xACB5, //HANGUL SYLLABLE KIYEOK YEO RIEULTHIEUTH
+ 0x81C2: 0xACB6, //HANGUL SYLLABLE KIYEOK YEO RIEULPHIEUPH
+ 0x81C3: 0xACB7, //HANGUL SYLLABLE KIYEOK YEO RIEULHIEUH
+ 0x81C4: 0xACBA, //HANGUL SYLLABLE KIYEOK YEO PIEUPSIOS
+ 0x81C5: 0xACBE, //HANGUL SYLLABLE KIYEOK YEO CIEUC
+ 0x81C6: 0xACBF, //HANGUL SYLLABLE KIYEOK YEO CHIEUCH
+ 0x81C7: 0xACC0, //HANGUL SYLLABLE KIYEOK YEO KHIEUKH
+ 0x81C8: 0xACC2, //HANGUL SYLLABLE KIYEOK YEO PHIEUPH
+ 0x81C9: 0xACC3, //HANGUL SYLLABLE KIYEOK YEO HIEUH
+ 0x81CA: 0xACC5, //HANGUL SYLLABLE KIYEOK YE KIYEOK
+ 0x81CB: 0xACC6, //HANGUL SYLLABLE KIYEOK YE SSANGKIYEOK
+ 0x81CC: 0xACC7, //HANGUL SYLLABLE KIYEOK YE KIYEOKSIOS
+ 0x81CD: 0xACC9, //HANGUL SYLLABLE KIYEOK YE NIEUNCIEUC
+ 0x81CE: 0xACCA, //HANGUL SYLLABLE KIYEOK YE NIEUNHIEUH
+ 0x81CF: 0xACCB, //HANGUL SYLLABLE KIYEOK YE TIKEUT
+ 0x81D0: 0xACCD, //HANGUL SYLLABLE KIYEOK YE RIEULKIYEOK
+ 0x81D1: 0xACCE, //HANGUL SYLLABLE KIYEOK YE RIEULMIEUM
+ 0x81D2: 0xACCF, //HANGUL SYLLABLE KIYEOK YE RIEULPIEUP
+ 0x81D3: 0xACD0, //HANGUL SYLLABLE KIYEOK YE RIEULSIOS
+ 0x81D4: 0xACD1, //HANGUL SYLLABLE KIYEOK YE RIEULTHIEUTH
+ 0x81D5: 0xACD2, //HANGUL SYLLABLE KIYEOK YE RIEULPHIEUPH
+ 0x81D6: 0xACD3, //HANGUL SYLLABLE KIYEOK YE RIEULHIEUH
+ 0x81D7: 0xACD4, //HANGUL SYLLABLE KIYEOK YE MIEUM
+ 0x81D8: 0xACD6, //HANGUL SYLLABLE KIYEOK YE PIEUPSIOS
+ 0x81D9: 0xACD8, //HANGUL SYLLABLE KIYEOK YE SSANGSIOS
+ 0x81DA: 0xACD9, //HANGUL SYLLABLE KIYEOK YE IEUNG
+ 0x81DB: 0xACDA, //HANGUL SYLLABLE KIYEOK YE CIEUC
+ 0x81DC: 0xACDB, //HANGUL SYLLABLE KIYEOK YE CHIEUCH
+ 0x81DD: 0xACDC, //HANGUL SYLLABLE KIYEOK YE KHIEUKH
+ 0x81DE: 0xACDD, //HANGUL SYLLABLE KIYEOK YE THIEUTH
+ 0x81DF: 0xACDE, //HANGUL SYLLABLE KIYEOK YE PHIEUPH
+ 0x81E0: 0xACDF, //HANGUL SYLLABLE KIYEOK YE HIEUH
+ 0x81E1: 0xACE2, //HANGUL SYLLABLE KIYEOK O SSANGKIYEOK
+ 0x81E2: 0xACE3, //HANGUL SYLLABLE KIYEOK O KIYEOKSIOS
+ 0x81E3: 0xACE5, //HANGUL SYLLABLE KIYEOK O NIEUNCIEUC
+ 0x81E4: 0xACE6, //HANGUL SYLLABLE KIYEOK O NIEUNHIEUH
+ 0x81E5: 0xACE9, //HANGUL SYLLABLE KIYEOK O RIEULKIYEOK
+ 0x81E6: 0xACEB, //HANGUL SYLLABLE KIYEOK O RIEULPIEUP
+ 0x81E7: 0xACED, //HANGUL SYLLABLE KIYEOK O RIEULTHIEUTH
+ 0x81E8: 0xACEE, //HANGUL SYLLABLE KIYEOK O RIEULPHIEUPH
+ 0x81E9: 0xACF2, //HANGUL SYLLABLE KIYEOK O PIEUPSIOS
+ 0x81EA: 0xACF4, //HANGUL SYLLABLE KIYEOK O SSANGSIOS
+ 0x81EB: 0xACF7, //HANGUL SYLLABLE KIYEOK O CHIEUCH
+ 0x81EC: 0xACF8, //HANGUL SYLLABLE KIYEOK O KHIEUKH
+ 0x81ED: 0xACF9, //HANGUL SYLLABLE KIYEOK O THIEUTH
+ 0x81EE: 0xACFA, //HANGUL SYLLABLE KIYEOK O PHIEUPH
+ 0x81EF: 0xACFB, //HANGUL SYLLABLE KIYEOK O HIEUH
+ 0x81F0: 0xACFE, //HANGUL SYLLABLE KIYEOK WA SSANGKIYEOK
+ 0x81F1: 0xACFF, //HANGUL SYLLABLE KIYEOK WA KIYEOKSIOS
+ 0x81F2: 0xAD01, //HANGUL SYLLABLE KIYEOK WA NIEUNCIEUC
+ 0x81F3: 0xAD02, //HANGUL SYLLABLE KIYEOK WA NIEUNHIEUH
+ 0x81F4: 0xAD03, //HANGUL SYLLABLE KIYEOK WA TIKEUT
+ 0x81F5: 0xAD05, //HANGUL SYLLABLE KIYEOK WA RIEULKIYEOK
+ 0x81F6: 0xAD07, //HANGUL SYLLABLE KIYEOK WA RIEULPIEUP
+ 0x81F7: 0xAD08, //HANGUL SYLLABLE KIYEOK WA RIEULSIOS
+ 0x81F8: 0xAD09, //HANGUL SYLLABLE KIYEOK WA RIEULTHIEUTH
+ 0x81F9: 0xAD0A, //HANGUL SYLLABLE KIYEOK WA RIEULPHIEUPH
+ 0x81FA: 0xAD0B, //HANGUL SYLLABLE KIYEOK WA RIEULHIEUH
+ 0x81FB: 0xAD0E, //HANGUL SYLLABLE KIYEOK WA PIEUPSIOS
+ 0x81FC: 0xAD10, //HANGUL SYLLABLE KIYEOK WA SSANGSIOS
+ 0x81FD: 0xAD12, //HANGUL SYLLABLE KIYEOK WA CIEUC
+ 0x81FE: 0xAD13, //HANGUL SYLLABLE KIYEOK WA CHIEUCH
+ 0x8241: 0xAD14, //HANGUL SYLLABLE KIYEOK WA KHIEUKH
+ 0x8242: 0xAD15, //HANGUL SYLLABLE KIYEOK WA THIEUTH
+ 0x8243: 0xAD16, //HANGUL SYLLABLE KIYEOK WA PHIEUPH
+ 0x8244: 0xAD17, //HANGUL SYLLABLE KIYEOK WA HIEUH
+ 0x8245: 0xAD19, //HANGUL SYLLABLE KIYEOK WAE KIYEOK
+ 0x8246: 0xAD1A, //HANGUL SYLLABLE KIYEOK WAE SSANGKIYEOK
+ 0x8247: 0xAD1B, //HANGUL SYLLABLE KIYEOK WAE KIYEOKSIOS
+ 0x8248: 0xAD1D, //HANGUL SYLLABLE KIYEOK WAE NIEUNCIEUC
+ 0x8249: 0xAD1E, //HANGUL SYLLABLE KIYEOK WAE NIEUNHIEUH
+ 0x824A: 0xAD1F, //HANGUL SYLLABLE KIYEOK WAE TIKEUT
+ 0x824B: 0xAD21, //HANGUL SYLLABLE KIYEOK WAE RIEULKIYEOK
+ 0x824C: 0xAD22, //HANGUL SYLLABLE KIYEOK WAE RIEULMIEUM
+ 0x824D: 0xAD23, //HANGUL SYLLABLE KIYEOK WAE RIEULPIEUP
+ 0x824E: 0xAD24, //HANGUL SYLLABLE KIYEOK WAE RIEULSIOS
+ 0x824F: 0xAD25, //HANGUL SYLLABLE KIYEOK WAE RIEULTHIEUTH
+ 0x8250: 0xAD26, //HANGUL SYLLABLE KIYEOK WAE RIEULPHIEUPH
+ 0x8251: 0xAD27, //HANGUL SYLLABLE KIYEOK WAE RIEULHIEUH
+ 0x8252: 0xAD28, //HANGUL SYLLABLE KIYEOK WAE MIEUM
+ 0x8253: 0xAD2A, //HANGUL SYLLABLE KIYEOK WAE PIEUPSIOS
+ 0x8254: 0xAD2B, //HANGUL SYLLABLE KIYEOK WAE SIOS
+ 0x8255: 0xAD2E, //HANGUL SYLLABLE KIYEOK WAE CIEUC
+ 0x8256: 0xAD2F, //HANGUL SYLLABLE KIYEOK WAE CHIEUCH
+ 0x8257: 0xAD30, //HANGUL SYLLABLE KIYEOK WAE KHIEUKH
+ 0x8258: 0xAD31, //HANGUL SYLLABLE KIYEOK WAE THIEUTH
+ 0x8259: 0xAD32, //HANGUL SYLLABLE KIYEOK WAE PHIEUPH
+ 0x825A: 0xAD33, //HANGUL SYLLABLE KIYEOK WAE HIEUH
+ 0x8261: 0xAD36, //HANGUL SYLLABLE KIYEOK OE SSANGKIYEOK
+ 0x8262: 0xAD37, //HANGUL SYLLABLE KIYEOK OE KIYEOKSIOS
+ 0x8263: 0xAD39, //HANGUL SYLLABLE KIYEOK OE NIEUNCIEUC
+ 0x8264: 0xAD3A, //HANGUL SYLLABLE KIYEOK OE NIEUNHIEUH
+ 0x8265: 0xAD3B, //HANGUL SYLLABLE KIYEOK OE TIKEUT
+ 0x8266: 0xAD3D, //HANGUL SYLLABLE KIYEOK OE RIEULKIYEOK
+ 0x8267: 0xAD3E, //HANGUL SYLLABLE KIYEOK OE RIEULMIEUM
+ 0x8268: 0xAD3F, //HANGUL SYLLABLE KIYEOK OE RIEULPIEUP
+ 0x8269: 0xAD40, //HANGUL SYLLABLE KIYEOK OE RIEULSIOS
+ 0x826A: 0xAD41, //HANGUL SYLLABLE KIYEOK OE RIEULTHIEUTH
+ 0x826B: 0xAD42, //HANGUL SYLLABLE KIYEOK OE RIEULPHIEUPH
+ 0x826C: 0xAD43, //HANGUL SYLLABLE KIYEOK OE RIEULHIEUH
+ 0x826D: 0xAD46, //HANGUL SYLLABLE KIYEOK OE PIEUPSIOS
+ 0x826E: 0xAD48, //HANGUL SYLLABLE KIYEOK OE SSANGSIOS
+ 0x826F: 0xAD4A, //HANGUL SYLLABLE KIYEOK OE CIEUC
+ 0x8270: 0xAD4B, //HANGUL SYLLABLE KIYEOK OE CHIEUCH
+ 0x8271: 0xAD4C, //HANGUL SYLLABLE KIYEOK OE KHIEUKH
+ 0x8272: 0xAD4D, //HANGUL SYLLABLE KIYEOK OE THIEUTH
+ 0x8273: 0xAD4E, //HANGUL SYLLABLE KIYEOK OE PHIEUPH
+ 0x8274: 0xAD4F, //HANGUL SYLLABLE KIYEOK OE HIEUH
+ 0x8275: 0xAD51, //HANGUL SYLLABLE KIYEOK YO KIYEOK
+ 0x8276: 0xAD52, //HANGUL SYLLABLE KIYEOK YO SSANGKIYEOK
+ 0x8277: 0xAD53, //HANGUL SYLLABLE KIYEOK YO KIYEOKSIOS
+ 0x8278: 0xAD55, //HANGUL SYLLABLE KIYEOK YO NIEUNCIEUC
+ 0x8279: 0xAD56, //HANGUL SYLLABLE KIYEOK YO NIEUNHIEUH
+ 0x827A: 0xAD57, //HANGUL SYLLABLE KIYEOK YO TIKEUT
+ 0x8281: 0xAD59, //HANGUL SYLLABLE KIYEOK YO RIEULKIYEOK
+ 0x8282: 0xAD5A, //HANGUL SYLLABLE KIYEOK YO RIEULMIEUM
+ 0x8283: 0xAD5B, //HANGUL SYLLABLE KIYEOK YO RIEULPIEUP
+ 0x8284: 0xAD5C, //HANGUL SYLLABLE KIYEOK YO RIEULSIOS
+ 0x8285: 0xAD5D, //HANGUL SYLLABLE KIYEOK YO RIEULTHIEUTH
+ 0x8286: 0xAD5E, //HANGUL SYLLABLE KIYEOK YO RIEULPHIEUPH
+ 0x8287: 0xAD5F, //HANGUL SYLLABLE KIYEOK YO RIEULHIEUH
+ 0x8288: 0xAD60, //HANGUL SYLLABLE KIYEOK YO MIEUM
+ 0x8289: 0xAD62, //HANGUL SYLLABLE KIYEOK YO PIEUPSIOS
+ 0x828A: 0xAD64, //HANGUL SYLLABLE KIYEOK YO SSANGSIOS
+ 0x828B: 0xAD65, //HANGUL SYLLABLE KIYEOK YO IEUNG
+ 0x828C: 0xAD66, //HANGUL SYLLABLE KIYEOK YO CIEUC
+ 0x828D: 0xAD67, //HANGUL SYLLABLE KIYEOK YO CHIEUCH
+ 0x828E: 0xAD68, //HANGUL SYLLABLE KIYEOK YO KHIEUKH
+ 0x828F: 0xAD69, //HANGUL SYLLABLE KIYEOK YO THIEUTH
+ 0x8290: 0xAD6A, //HANGUL SYLLABLE KIYEOK YO PHIEUPH
+ 0x8291: 0xAD6B, //HANGUL SYLLABLE KIYEOK YO HIEUH
+ 0x8292: 0xAD6E, //HANGUL SYLLABLE KIYEOK U SSANGKIYEOK
+ 0x8293: 0xAD6F, //HANGUL SYLLABLE KIYEOK U KIYEOKSIOS
+ 0x8294: 0xAD71, //HANGUL SYLLABLE KIYEOK U NIEUNCIEUC
+ 0x8295: 0xAD72, //HANGUL SYLLABLE KIYEOK U NIEUNHIEUH
+ 0x8296: 0xAD77, //HANGUL SYLLABLE KIYEOK U RIEULPIEUP
+ 0x8297: 0xAD78, //HANGUL SYLLABLE KIYEOK U RIEULSIOS
+ 0x8298: 0xAD79, //HANGUL SYLLABLE KIYEOK U RIEULTHIEUTH
+ 0x8299: 0xAD7A, //HANGUL SYLLABLE KIYEOK U RIEULPHIEUPH
+ 0x829A: 0xAD7E, //HANGUL SYLLABLE KIYEOK U PIEUPSIOS
+ 0x829B: 0xAD80, //HANGUL SYLLABLE KIYEOK U SSANGSIOS
+ 0x829C: 0xAD83, //HANGUL SYLLABLE KIYEOK U CHIEUCH
+ 0x829D: 0xAD84, //HANGUL SYLLABLE KIYEOK U KHIEUKH
+ 0x829E: 0xAD85, //HANGUL SYLLABLE KIYEOK U THIEUTH
+ 0x829F: 0xAD86, //HANGUL SYLLABLE KIYEOK U PHIEUPH
+ 0x82A0: 0xAD87, //HANGUL SYLLABLE KIYEOK U HIEUH
+ 0x82A1: 0xAD8A, //HANGUL SYLLABLE KIYEOK WEO SSANGKIYEOK
+ 0x82A2: 0xAD8B, //HANGUL SYLLABLE KIYEOK WEO KIYEOKSIOS
+ 0x82A3: 0xAD8D, //HANGUL SYLLABLE KIYEOK WEO NIEUNCIEUC
+ 0x82A4: 0xAD8E, //HANGUL SYLLABLE KIYEOK WEO NIEUNHIEUH
+ 0x82A5: 0xAD8F, //HANGUL SYLLABLE KIYEOK WEO TIKEUT
+ 0x82A6: 0xAD91, //HANGUL SYLLABLE KIYEOK WEO RIEULKIYEOK
+ 0x82A7: 0xAD92, //HANGUL SYLLABLE KIYEOK WEO RIEULMIEUM
+ 0x82A8: 0xAD93, //HANGUL SYLLABLE KIYEOK WEO RIEULPIEUP
+ 0x82A9: 0xAD94, //HANGUL SYLLABLE KIYEOK WEO RIEULSIOS
+ 0x82AA: 0xAD95, //HANGUL SYLLABLE KIYEOK WEO RIEULTHIEUTH
+ 0x82AB: 0xAD96, //HANGUL SYLLABLE KIYEOK WEO RIEULPHIEUPH
+ 0x82AC: 0xAD97, //HANGUL SYLLABLE KIYEOK WEO RIEULHIEUH
+ 0x82AD: 0xAD98, //HANGUL SYLLABLE KIYEOK WEO MIEUM
+ 0x82AE: 0xAD99, //HANGUL SYLLABLE KIYEOK WEO PIEUP
+ 0x82AF: 0xAD9A, //HANGUL SYLLABLE KIYEOK WEO PIEUPSIOS
+ 0x82B0: 0xAD9B, //HANGUL SYLLABLE KIYEOK WEO SIOS
+ 0x82B1: 0xAD9E, //HANGUL SYLLABLE KIYEOK WEO CIEUC
+ 0x82B2: 0xAD9F, //HANGUL SYLLABLE KIYEOK WEO CHIEUCH
+ 0x82B3: 0xADA0, //HANGUL SYLLABLE KIYEOK WEO KHIEUKH
+ 0x82B4: 0xADA1, //HANGUL SYLLABLE KIYEOK WEO THIEUTH
+ 0x82B5: 0xADA2, //HANGUL SYLLABLE KIYEOK WEO PHIEUPH
+ 0x82B6: 0xADA3, //HANGUL SYLLABLE KIYEOK WEO HIEUH
+ 0x82B7: 0xADA5, //HANGUL SYLLABLE KIYEOK WE KIYEOK
+ 0x82B8: 0xADA6, //HANGUL SYLLABLE KIYEOK WE SSANGKIYEOK
+ 0x82B9: 0xADA7, //HANGUL SYLLABLE KIYEOK WE KIYEOKSIOS
+ 0x82BA: 0xADA8, //HANGUL SYLLABLE KIYEOK WE NIEUN
+ 0x82BB: 0xADA9, //HANGUL SYLLABLE KIYEOK WE NIEUNCIEUC
+ 0x82BC: 0xADAA, //HANGUL SYLLABLE KIYEOK WE NIEUNHIEUH
+ 0x82BD: 0xADAB, //HANGUL SYLLABLE KIYEOK WE TIKEUT
+ 0x82BE: 0xADAC, //HANGUL SYLLABLE KIYEOK WE RIEUL
+ 0x82BF: 0xADAD, //HANGUL SYLLABLE KIYEOK WE RIEULKIYEOK
+ 0x82C0: 0xADAE, //HANGUL SYLLABLE KIYEOK WE RIEULMIEUM
+ 0x82C1: 0xADAF, //HANGUL SYLLABLE KIYEOK WE RIEULPIEUP
+ 0x82C2: 0xADB0, //HANGUL SYLLABLE KIYEOK WE RIEULSIOS
+ 0x82C3: 0xADB1, //HANGUL SYLLABLE KIYEOK WE RIEULTHIEUTH
+ 0x82C4: 0xADB2, //HANGUL SYLLABLE KIYEOK WE RIEULPHIEUPH
+ 0x82C5: 0xADB3, //HANGUL SYLLABLE KIYEOK WE RIEULHIEUH
+ 0x82C6: 0xADB4, //HANGUL SYLLABLE KIYEOK WE MIEUM
+ 0x82C7: 0xADB5, //HANGUL SYLLABLE KIYEOK WE PIEUP
+ 0x82C8: 0xADB6, //HANGUL SYLLABLE KIYEOK WE PIEUPSIOS
+ 0x82C9: 0xADB8, //HANGUL SYLLABLE KIYEOK WE SSANGSIOS
+ 0x82CA: 0xADB9, //HANGUL SYLLABLE KIYEOK WE IEUNG
+ 0x82CB: 0xADBA, //HANGUL SYLLABLE KIYEOK WE CIEUC
+ 0x82CC: 0xADBB, //HANGUL SYLLABLE KIYEOK WE CHIEUCH
+ 0x82CD: 0xADBC, //HANGUL SYLLABLE KIYEOK WE KHIEUKH
+ 0x82CE: 0xADBD, //HANGUL SYLLABLE KIYEOK WE THIEUTH
+ 0x82CF: 0xADBE, //HANGUL SYLLABLE KIYEOK WE PHIEUPH
+ 0x82D0: 0xADBF, //HANGUL SYLLABLE KIYEOK WE HIEUH
+ 0x82D1: 0xADC2, //HANGUL SYLLABLE KIYEOK WI SSANGKIYEOK
+ 0x82D2: 0xADC3, //HANGUL SYLLABLE KIYEOK WI KIYEOKSIOS
+ 0x82D3: 0xADC5, //HANGUL SYLLABLE KIYEOK WI NIEUNCIEUC
+ 0x82D4: 0xADC6, //HANGUL SYLLABLE KIYEOK WI NIEUNHIEUH
+ 0x82D5: 0xADC7, //HANGUL SYLLABLE KIYEOK WI TIKEUT
+ 0x82D6: 0xADC9, //HANGUL SYLLABLE KIYEOK WI RIEULKIYEOK
+ 0x82D7: 0xADCA, //HANGUL SYLLABLE KIYEOK WI RIEULMIEUM
+ 0x82D8: 0xADCB, //HANGUL SYLLABLE KIYEOK WI RIEULPIEUP
+ 0x82D9: 0xADCC, //HANGUL SYLLABLE KIYEOK WI RIEULSIOS
+ 0x82DA: 0xADCD, //HANGUL SYLLABLE KIYEOK WI RIEULTHIEUTH
+ 0x82DB: 0xADCE, //HANGUL SYLLABLE KIYEOK WI RIEULPHIEUPH
+ 0x82DC: 0xADCF, //HANGUL SYLLABLE KIYEOK WI RIEULHIEUH
+ 0x82DD: 0xADD2, //HANGUL SYLLABLE KIYEOK WI PIEUPSIOS
+ 0x82DE: 0xADD4, //HANGUL SYLLABLE KIYEOK WI SSANGSIOS
+ 0x82DF: 0xADD5, //HANGUL SYLLABLE KIYEOK WI IEUNG
+ 0x82E0: 0xADD6, //HANGUL SYLLABLE KIYEOK WI CIEUC
+ 0x82E1: 0xADD7, //HANGUL SYLLABLE KIYEOK WI CHIEUCH
+ 0x82E2: 0xADD8, //HANGUL SYLLABLE KIYEOK WI KHIEUKH
+ 0x82E3: 0xADD9, //HANGUL SYLLABLE KIYEOK WI THIEUTH
+ 0x82E4: 0xADDA, //HANGUL SYLLABLE KIYEOK WI PHIEUPH
+ 0x82E5: 0xADDB, //HANGUL SYLLABLE KIYEOK WI HIEUH
+ 0x82E6: 0xADDD, //HANGUL SYLLABLE KIYEOK YU KIYEOK
+ 0x82E7: 0xADDE, //HANGUL SYLLABLE KIYEOK YU SSANGKIYEOK
+ 0x82E8: 0xADDF, //HANGUL SYLLABLE KIYEOK YU KIYEOKSIOS
+ 0x82E9: 0xADE1, //HANGUL SYLLABLE KIYEOK YU NIEUNCIEUC
+ 0x82EA: 0xADE2, //HANGUL SYLLABLE KIYEOK YU NIEUNHIEUH
+ 0x82EB: 0xADE3, //HANGUL SYLLABLE KIYEOK YU TIKEUT
+ 0x82EC: 0xADE5, //HANGUL SYLLABLE KIYEOK YU RIEULKIYEOK
+ 0x82ED: 0xADE6, //HANGUL SYLLABLE KIYEOK YU RIEULMIEUM
+ 0x82EE: 0xADE7, //HANGUL SYLLABLE KIYEOK YU RIEULPIEUP
+ 0x82EF: 0xADE8, //HANGUL SYLLABLE KIYEOK YU RIEULSIOS
+ 0x82F0: 0xADE9, //HANGUL SYLLABLE KIYEOK YU RIEULTHIEUTH
+ 0x82F1: 0xADEA, //HANGUL SYLLABLE KIYEOK YU RIEULPHIEUPH
+ 0x82F2: 0xADEB, //HANGUL SYLLABLE KIYEOK YU RIEULHIEUH
+ 0x82F3: 0xADEC, //HANGUL SYLLABLE KIYEOK YU MIEUM
+ 0x82F4: 0xADED, //HANGUL SYLLABLE KIYEOK YU PIEUP
+ 0x82F5: 0xADEE, //HANGUL SYLLABLE KIYEOK YU PIEUPSIOS
+ 0x82F6: 0xADEF, //HANGUL SYLLABLE KIYEOK YU SIOS
+ 0x82F7: 0xADF0, //HANGUL SYLLABLE KIYEOK YU SSANGSIOS
+ 0x82F8: 0xADF1, //HANGUL SYLLABLE KIYEOK YU IEUNG
+ 0x82F9: 0xADF2, //HANGUL SYLLABLE KIYEOK YU CIEUC
+ 0x82FA: 0xADF3, //HANGUL SYLLABLE KIYEOK YU CHIEUCH
+ 0x82FB: 0xADF4, //HANGUL SYLLABLE KIYEOK YU KHIEUKH
+ 0x82FC: 0xADF5, //HANGUL SYLLABLE KIYEOK YU THIEUTH
+ 0x82FD: 0xADF6, //HANGUL SYLLABLE KIYEOK YU PHIEUPH
+ 0x82FE: 0xADF7, //HANGUL SYLLABLE KIYEOK YU HIEUH
+ 0x8341: 0xADFA, //HANGUL SYLLABLE KIYEOK EU SSANGKIYEOK
+ 0x8342: 0xADFB, //HANGUL SYLLABLE KIYEOK EU KIYEOKSIOS
+ 0x8343: 0xADFD, //HANGUL SYLLABLE KIYEOK EU NIEUNCIEUC
+ 0x8344: 0xADFE, //HANGUL SYLLABLE KIYEOK EU NIEUNHIEUH
+ 0x8345: 0xAE02, //HANGUL SYLLABLE KIYEOK EU RIEULMIEUM
+ 0x8346: 0xAE03, //HANGUL SYLLABLE KIYEOK EU RIEULPIEUP
+ 0x8347: 0xAE04, //HANGUL SYLLABLE KIYEOK EU RIEULSIOS
+ 0x8348: 0xAE05, //HANGUL SYLLABLE KIYEOK EU RIEULTHIEUTH
+ 0x8349: 0xAE06, //HANGUL SYLLABLE KIYEOK EU RIEULPHIEUPH
+ 0x834A: 0xAE07, //HANGUL SYLLABLE KIYEOK EU RIEULHIEUH
+ 0x834B: 0xAE0A, //HANGUL SYLLABLE KIYEOK EU PIEUPSIOS
+ 0x834C: 0xAE0C, //HANGUL SYLLABLE KIYEOK EU SSANGSIOS
+ 0x834D: 0xAE0E, //HANGUL SYLLABLE KIYEOK EU CIEUC
+ 0x834E: 0xAE0F, //HANGUL SYLLABLE KIYEOK EU CHIEUCH
+ 0x834F: 0xAE10, //HANGUL SYLLABLE KIYEOK EU KHIEUKH
+ 0x8350: 0xAE11, //HANGUL SYLLABLE KIYEOK EU THIEUTH
+ 0x8351: 0xAE12, //HANGUL SYLLABLE KIYEOK EU PHIEUPH
+ 0x8352: 0xAE13, //HANGUL SYLLABLE KIYEOK EU HIEUH
+ 0x8353: 0xAE15, //HANGUL SYLLABLE KIYEOK YI KIYEOK
+ 0x8354: 0xAE16, //HANGUL SYLLABLE KIYEOK YI SSANGKIYEOK
+ 0x8355: 0xAE17, //HANGUL SYLLABLE KIYEOK YI KIYEOKSIOS
+ 0x8356: 0xAE18, //HANGUL SYLLABLE KIYEOK YI NIEUN
+ 0x8357: 0xAE19, //HANGUL SYLLABLE KIYEOK YI NIEUNCIEUC
+ 0x8358: 0xAE1A, //HANGUL SYLLABLE KIYEOK YI NIEUNHIEUH
+ 0x8359: 0xAE1B, //HANGUL SYLLABLE KIYEOK YI TIKEUT
+ 0x835A: 0xAE1C, //HANGUL SYLLABLE KIYEOK YI RIEUL
+ 0x8361: 0xAE1D, //HANGUL SYLLABLE KIYEOK YI RIEULKIYEOK
+ 0x8362: 0xAE1E, //HANGUL SYLLABLE KIYEOK YI RIEULMIEUM
+ 0x8363: 0xAE1F, //HANGUL SYLLABLE KIYEOK YI RIEULPIEUP
+ 0x8364: 0xAE20, //HANGUL SYLLABLE KIYEOK YI RIEULSIOS
+ 0x8365: 0xAE21, //HANGUL SYLLABLE KIYEOK YI RIEULTHIEUTH
+ 0x8366: 0xAE22, //HANGUL SYLLABLE KIYEOK YI RIEULPHIEUPH
+ 0x8367: 0xAE23, //HANGUL SYLLABLE KIYEOK YI RIEULHIEUH
+ 0x8368: 0xAE24, //HANGUL SYLLABLE KIYEOK YI MIEUM
+ 0x8369: 0xAE25, //HANGUL SYLLABLE KIYEOK YI PIEUP
+ 0x836A: 0xAE26, //HANGUL SYLLABLE KIYEOK YI PIEUPSIOS
+ 0x836B: 0xAE27, //HANGUL SYLLABLE KIYEOK YI SIOS
+ 0x836C: 0xAE28, //HANGUL SYLLABLE KIYEOK YI SSANGSIOS
+ 0x836D: 0xAE29, //HANGUL SYLLABLE KIYEOK YI IEUNG
+ 0x836E: 0xAE2A, //HANGUL SYLLABLE KIYEOK YI CIEUC
+ 0x836F: 0xAE2B, //HANGUL SYLLABLE KIYEOK YI CHIEUCH
+ 0x8370: 0xAE2C, //HANGUL SYLLABLE KIYEOK YI KHIEUKH
+ 0x8371: 0xAE2D, //HANGUL SYLLABLE KIYEOK YI THIEUTH
+ 0x8372: 0xAE2E, //HANGUL SYLLABLE KIYEOK YI PHIEUPH
+ 0x8373: 0xAE2F, //HANGUL SYLLABLE KIYEOK YI HIEUH
+ 0x8374: 0xAE32, //HANGUL SYLLABLE KIYEOK I SSANGKIYEOK
+ 0x8375: 0xAE33, //HANGUL SYLLABLE KIYEOK I KIYEOKSIOS
+ 0x8376: 0xAE35, //HANGUL SYLLABLE KIYEOK I NIEUNCIEUC
+ 0x8377: 0xAE36, //HANGUL SYLLABLE KIYEOK I NIEUNHIEUH
+ 0x8378: 0xAE39, //HANGUL SYLLABLE KIYEOK I RIEULKIYEOK
+ 0x8379: 0xAE3B, //HANGUL SYLLABLE KIYEOK I RIEULPIEUP
+ 0x837A: 0xAE3C, //HANGUL SYLLABLE KIYEOK I RIEULSIOS
+ 0x8381: 0xAE3D, //HANGUL SYLLABLE KIYEOK I RIEULTHIEUTH
+ 0x8382: 0xAE3E, //HANGUL SYLLABLE KIYEOK I RIEULPHIEUPH
+ 0x8383: 0xAE3F, //HANGUL SYLLABLE KIYEOK I RIEULHIEUH
+ 0x8384: 0xAE42, //HANGUL SYLLABLE KIYEOK I PIEUPSIOS
+ 0x8385: 0xAE44, //HANGUL SYLLABLE KIYEOK I SSANGSIOS
+ 0x8386: 0xAE47, //HANGUL SYLLABLE KIYEOK I CHIEUCH
+ 0x8387: 0xAE48, //HANGUL SYLLABLE KIYEOK I KHIEUKH
+ 0x8388: 0xAE49, //HANGUL SYLLABLE KIYEOK I THIEUTH
+ 0x8389: 0xAE4B, //HANGUL SYLLABLE KIYEOK I HIEUH
+ 0x838A: 0xAE4F, //HANGUL SYLLABLE SSANGKIYEOK A KIYEOKSIOS
+ 0x838B: 0xAE51, //HANGUL SYLLABLE SSANGKIYEOK A NIEUNCIEUC
+ 0x838C: 0xAE52, //HANGUL SYLLABLE SSANGKIYEOK A NIEUNHIEUH
+ 0x838D: 0xAE53, //HANGUL SYLLABLE SSANGKIYEOK A TIKEUT
+ 0x838E: 0xAE55, //HANGUL SYLLABLE SSANGKIYEOK A RIEULKIYEOK
+ 0x838F: 0xAE57, //HANGUL SYLLABLE SSANGKIYEOK A RIEULPIEUP
+ 0x8390: 0xAE58, //HANGUL SYLLABLE SSANGKIYEOK A RIEULSIOS
+ 0x8391: 0xAE59, //HANGUL SYLLABLE SSANGKIYEOK A RIEULTHIEUTH
+ 0x8392: 0xAE5A, //HANGUL SYLLABLE SSANGKIYEOK A RIEULPHIEUPH
+ 0x8393: 0xAE5B, //HANGUL SYLLABLE SSANGKIYEOK A RIEULHIEUH
+ 0x8394: 0xAE5E, //HANGUL SYLLABLE SSANGKIYEOK A PIEUPSIOS
+ 0x8395: 0xAE62, //HANGUL SYLLABLE SSANGKIYEOK A CIEUC
+ 0x8396: 0xAE63, //HANGUL SYLLABLE SSANGKIYEOK A CHIEUCH
+ 0x8397: 0xAE64, //HANGUL SYLLABLE SSANGKIYEOK A KHIEUKH
+ 0x8398: 0xAE66, //HANGUL SYLLABLE SSANGKIYEOK A PHIEUPH
+ 0x8399: 0xAE67, //HANGUL SYLLABLE SSANGKIYEOK A HIEUH
+ 0x839A: 0xAE6A, //HANGUL SYLLABLE SSANGKIYEOK AE SSANGKIYEOK
+ 0x839B: 0xAE6B, //HANGUL SYLLABLE SSANGKIYEOK AE KIYEOKSIOS
+ 0x839C: 0xAE6D, //HANGUL SYLLABLE SSANGKIYEOK AE NIEUNCIEUC
+ 0x839D: 0xAE6E, //HANGUL SYLLABLE SSANGKIYEOK AE NIEUNHIEUH
+ 0x839E: 0xAE6F, //HANGUL SYLLABLE SSANGKIYEOK AE TIKEUT
+ 0x839F: 0xAE71, //HANGUL SYLLABLE SSANGKIYEOK AE RIEULKIYEOK
+ 0x83A0: 0xAE72, //HANGUL SYLLABLE SSANGKIYEOK AE RIEULMIEUM
+ 0x83A1: 0xAE73, //HANGUL SYLLABLE SSANGKIYEOK AE RIEULPIEUP
+ 0x83A2: 0xAE74, //HANGUL SYLLABLE SSANGKIYEOK AE RIEULSIOS
+ 0x83A3: 0xAE75, //HANGUL SYLLABLE SSANGKIYEOK AE RIEULTHIEUTH
+ 0x83A4: 0xAE76, //HANGUL SYLLABLE SSANGKIYEOK AE RIEULPHIEUPH
+ 0x83A5: 0xAE77, //HANGUL SYLLABLE SSANGKIYEOK AE RIEULHIEUH
+ 0x83A6: 0xAE7A, //HANGUL SYLLABLE SSANGKIYEOK AE PIEUPSIOS
+ 0x83A7: 0xAE7E, //HANGUL SYLLABLE SSANGKIYEOK AE CIEUC
+ 0x83A8: 0xAE7F, //HANGUL SYLLABLE SSANGKIYEOK AE CHIEUCH
+ 0x83A9: 0xAE80, //HANGUL SYLLABLE SSANGKIYEOK AE KHIEUKH
+ 0x83AA: 0xAE81, //HANGUL SYLLABLE SSANGKIYEOK AE THIEUTH
+ 0x83AB: 0xAE82, //HANGUL SYLLABLE SSANGKIYEOK AE PHIEUPH
+ 0x83AC: 0xAE83, //HANGUL SYLLABLE SSANGKIYEOK AE HIEUH
+ 0x83AD: 0xAE86, //HANGUL SYLLABLE SSANGKIYEOK YA SSANGKIYEOK
+ 0x83AE: 0xAE87, //HANGUL SYLLABLE SSANGKIYEOK YA KIYEOKSIOS
+ 0x83AF: 0xAE88, //HANGUL SYLLABLE SSANGKIYEOK YA NIEUN
+ 0x83B0: 0xAE89, //HANGUL SYLLABLE SSANGKIYEOK YA NIEUNCIEUC
+ 0x83B1: 0xAE8A, //HANGUL SYLLABLE SSANGKIYEOK YA NIEUNHIEUH
+ 0x83B2: 0xAE8B, //HANGUL SYLLABLE SSANGKIYEOK YA TIKEUT
+ 0x83B3: 0xAE8D, //HANGUL SYLLABLE SSANGKIYEOK YA RIEULKIYEOK
+ 0x83B4: 0xAE8E, //HANGUL SYLLABLE SSANGKIYEOK YA RIEULMIEUM
+ 0x83B5: 0xAE8F, //HANGUL SYLLABLE SSANGKIYEOK YA RIEULPIEUP
+ 0x83B6: 0xAE90, //HANGUL SYLLABLE SSANGKIYEOK YA RIEULSIOS
+ 0x83B7: 0xAE91, //HANGUL SYLLABLE SSANGKIYEOK YA RIEULTHIEUTH
+ 0x83B8: 0xAE92, //HANGUL SYLLABLE SSANGKIYEOK YA RIEULPHIEUPH
+ 0x83B9: 0xAE93, //HANGUL SYLLABLE SSANGKIYEOK YA RIEULHIEUH
+ 0x83BA: 0xAE94, //HANGUL SYLLABLE SSANGKIYEOK YA MIEUM
+ 0x83BB: 0xAE95, //HANGUL SYLLABLE SSANGKIYEOK YA PIEUP
+ 0x83BC: 0xAE96, //HANGUL SYLLABLE SSANGKIYEOK YA PIEUPSIOS
+ 0x83BD: 0xAE97, //HANGUL SYLLABLE SSANGKIYEOK YA SIOS
+ 0x83BE: 0xAE98, //HANGUL SYLLABLE SSANGKIYEOK YA SSANGSIOS
+ 0x83BF: 0xAE99, //HANGUL SYLLABLE SSANGKIYEOK YA IEUNG
+ 0x83C0: 0xAE9A, //HANGUL SYLLABLE SSANGKIYEOK YA CIEUC
+ 0x83C1: 0xAE9B, //HANGUL SYLLABLE SSANGKIYEOK YA CHIEUCH
+ 0x83C2: 0xAE9C, //HANGUL SYLLABLE SSANGKIYEOK YA KHIEUKH
+ 0x83C3: 0xAE9D, //HANGUL SYLLABLE SSANGKIYEOK YA THIEUTH
+ 0x83C4: 0xAE9E, //HANGUL SYLLABLE SSANGKIYEOK YA PHIEUPH
+ 0x83C5: 0xAE9F, //HANGUL SYLLABLE SSANGKIYEOK YA HIEUH
+ 0x83C6: 0xAEA0, //HANGUL SYLLABLE SSANGKIYEOK YAE
+ 0x83C7: 0xAEA1, //HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOK
+ 0x83C8: 0xAEA2, //HANGUL SYLLABLE SSANGKIYEOK YAE SSANGKIYEOK
+ 0x83C9: 0xAEA3, //HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOKSIOS
+ 0x83CA: 0xAEA4, //HANGUL SYLLABLE SSANGKIYEOK YAE NIEUN
+ 0x83CB: 0xAEA5, //HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNCIEUC
+ 0x83CC: 0xAEA6, //HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNHIEUH
+ 0x83CD: 0xAEA7, //HANGUL SYLLABLE SSANGKIYEOK YAE TIKEUT
+ 0x83CE: 0xAEA8, //HANGUL SYLLABLE SSANGKIYEOK YAE RIEUL
+ 0x83CF: 0xAEA9, //HANGUL SYLLABLE SSANGKIYEOK YAE RIEULKIYEOK
+ 0x83D0: 0xAEAA, //HANGUL SYLLABLE SSANGKIYEOK YAE RIEULMIEUM
+ 0x83D1: 0xAEAB, //HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPIEUP
+ 0x83D2: 0xAEAC, //HANGUL SYLLABLE SSANGKIYEOK YAE RIEULSIOS
+ 0x83D3: 0xAEAD, //HANGUL SYLLABLE SSANGKIYEOK YAE RIEULTHIEUTH
+ 0x83D4: 0xAEAE, //HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPHIEUPH
+ 0x83D5: 0xAEAF, //HANGUL SYLLABLE SSANGKIYEOK YAE RIEULHIEUH
+ 0x83D6: 0xAEB0, //HANGUL SYLLABLE SSANGKIYEOK YAE MIEUM
+ 0x83D7: 0xAEB1, //HANGUL SYLLABLE SSANGKIYEOK YAE PIEUP
+ 0x83D8: 0xAEB2, //HANGUL SYLLABLE SSANGKIYEOK YAE PIEUPSIOS
+ 0x83D9: 0xAEB3, //HANGUL SYLLABLE SSANGKIYEOK YAE SIOS
+ 0x83DA: 0xAEB4, //HANGUL SYLLABLE SSANGKIYEOK YAE SSANGSIOS
+ 0x83DB: 0xAEB5, //HANGUL SYLLABLE SSANGKIYEOK YAE IEUNG
+ 0x83DC: 0xAEB6, //HANGUL SYLLABLE SSANGKIYEOK YAE CIEUC
+ 0x83DD: 0xAEB7, //HANGUL SYLLABLE SSANGKIYEOK YAE CHIEUCH
+ 0x83DE: 0xAEB8, //HANGUL SYLLABLE SSANGKIYEOK YAE KHIEUKH
+ 0x83DF: 0xAEB9, //HANGUL SYLLABLE SSANGKIYEOK YAE THIEUTH
+ 0x83E0: 0xAEBA, //HANGUL SYLLABLE SSANGKIYEOK YAE PHIEUPH
+ 0x83E1: 0xAEBB, //HANGUL SYLLABLE SSANGKIYEOK YAE HIEUH
+ 0x83E2: 0xAEBF, //HANGUL SYLLABLE SSANGKIYEOK EO KIYEOKSIOS
+ 0x83E3: 0xAEC1, //HANGUL SYLLABLE SSANGKIYEOK EO NIEUNCIEUC
+ 0x83E4: 0xAEC2, //HANGUL SYLLABLE SSANGKIYEOK EO NIEUNHIEUH
+ 0x83E5: 0xAEC3, //HANGUL SYLLABLE SSANGKIYEOK EO TIKEUT
+ 0x83E6: 0xAEC5, //HANGUL SYLLABLE SSANGKIYEOK EO RIEULKIYEOK
+ 0x83E7: 0xAEC6, //HANGUL SYLLABLE SSANGKIYEOK EO RIEULMIEUM
+ 0x83E8: 0xAEC7, //HANGUL SYLLABLE SSANGKIYEOK EO RIEULPIEUP
+ 0x83E9: 0xAEC8, //HANGUL SYLLABLE SSANGKIYEOK EO RIEULSIOS
+ 0x83EA: 0xAEC9, //HANGUL SYLLABLE SSANGKIYEOK EO RIEULTHIEUTH
+ 0x83EB: 0xAECA, //HANGUL SYLLABLE SSANGKIYEOK EO RIEULPHIEUPH
+ 0x83EC: 0xAECB, //HANGUL SYLLABLE SSANGKIYEOK EO RIEULHIEUH
+ 0x83ED: 0xAECE, //HANGUL SYLLABLE SSANGKIYEOK EO PIEUPSIOS
+ 0x83EE: 0xAED2, //HANGUL SYLLABLE SSANGKIYEOK EO CIEUC
+ 0x83EF: 0xAED3, //HANGUL SYLLABLE SSANGKIYEOK EO CHIEUCH
+ 0x83F0: 0xAED4, //HANGUL SYLLABLE SSANGKIYEOK EO KHIEUKH
+ 0x83F1: 0xAED5, //HANGUL SYLLABLE SSANGKIYEOK EO THIEUTH
+ 0x83F2: 0xAED6, //HANGUL SYLLABLE SSANGKIYEOK EO PHIEUPH
+ 0x83F3: 0xAED7, //HANGUL SYLLABLE SSANGKIYEOK EO HIEUH
+ 0x83F4: 0xAEDA, //HANGUL SYLLABLE SSANGKIYEOK E SSANGKIYEOK
+ 0x83F5: 0xAEDB, //HANGUL SYLLABLE SSANGKIYEOK E KIYEOKSIOS
+ 0x83F6: 0xAEDD, //HANGUL SYLLABLE SSANGKIYEOK E NIEUNCIEUC
+ 0x83F7: 0xAEDE, //HANGUL SYLLABLE SSANGKIYEOK E NIEUNHIEUH
+ 0x83F8: 0xAEDF, //HANGUL SYLLABLE SSANGKIYEOK E TIKEUT
+ 0x83F9: 0xAEE0, //HANGUL SYLLABLE SSANGKIYEOK E RIEUL
+ 0x83FA: 0xAEE1, //HANGUL SYLLABLE SSANGKIYEOK E RIEULKIYEOK
+ 0x83FB: 0xAEE2, //HANGUL SYLLABLE SSANGKIYEOK E RIEULMIEUM
+ 0x83FC: 0xAEE3, //HANGUL SYLLABLE SSANGKIYEOK E RIEULPIEUP
+ 0x83FD: 0xAEE4, //HANGUL SYLLABLE SSANGKIYEOK E RIEULSIOS
+ 0x83FE: 0xAEE5, //HANGUL SYLLABLE SSANGKIYEOK E RIEULTHIEUTH
+ 0x8441: 0xAEE6, //HANGUL SYLLABLE SSANGKIYEOK E RIEULPHIEUPH
+ 0x8442: 0xAEE7, //HANGUL SYLLABLE SSANGKIYEOK E RIEULHIEUH
+ 0x8443: 0xAEE9, //HANGUL SYLLABLE SSANGKIYEOK E PIEUP
+ 0x8444: 0xAEEA, //HANGUL SYLLABLE SSANGKIYEOK E PIEUPSIOS
+ 0x8445: 0xAEEC, //HANGUL SYLLABLE SSANGKIYEOK E SSANGSIOS
+ 0x8446: 0xAEEE, //HANGUL SYLLABLE SSANGKIYEOK E CIEUC
+ 0x8447: 0xAEEF, //HANGUL SYLLABLE SSANGKIYEOK E CHIEUCH
+ 0x8448: 0xAEF0, //HANGUL SYLLABLE SSANGKIYEOK E KHIEUKH
+ 0x8449: 0xAEF1, //HANGUL SYLLABLE SSANGKIYEOK E THIEUTH
+ 0x844A: 0xAEF2, //HANGUL SYLLABLE SSANGKIYEOK E PHIEUPH
+ 0x844B: 0xAEF3, //HANGUL SYLLABLE SSANGKIYEOK E HIEUH
+ 0x844C: 0xAEF5, //HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOK
+ 0x844D: 0xAEF6, //HANGUL SYLLABLE SSANGKIYEOK YEO SSANGKIYEOK
+ 0x844E: 0xAEF7, //HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOKSIOS
+ 0x844F: 0xAEF9, //HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNCIEUC
+ 0x8450: 0xAEFA, //HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNHIEUH
+ 0x8451: 0xAEFB, //HANGUL SYLLABLE SSANGKIYEOK YEO TIKEUT
+ 0x8452: 0xAEFD, //HANGUL SYLLABLE SSANGKIYEOK YEO RIEULKIYEOK
+ 0x8453: 0xAEFE, //HANGUL SYLLABLE SSANGKIYEOK YEO RIEULMIEUM
+ 0x8454: 0xAEFF, //HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPIEUP
+ 0x8455: 0xAF00, //HANGUL SYLLABLE SSANGKIYEOK YEO RIEULSIOS
+ 0x8456: 0xAF01, //HANGUL SYLLABLE SSANGKIYEOK YEO RIEULTHIEUTH
+ 0x8457: 0xAF02, //HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPHIEUPH
+ 0x8458: 0xAF03, //HANGUL SYLLABLE SSANGKIYEOK YEO RIEULHIEUH
+ 0x8459: 0xAF04, //HANGUL SYLLABLE SSANGKIYEOK YEO MIEUM
+ 0x845A: 0xAF05, //HANGUL SYLLABLE SSANGKIYEOK YEO PIEUP
+ 0x8461: 0xAF06, //HANGUL SYLLABLE SSANGKIYEOK YEO PIEUPSIOS
+ 0x8462: 0xAF09, //HANGUL SYLLABLE SSANGKIYEOK YEO IEUNG
+ 0x8463: 0xAF0A, //HANGUL SYLLABLE SSANGKIYEOK YEO CIEUC
+ 0x8464: 0xAF0B, //HANGUL SYLLABLE SSANGKIYEOK YEO CHIEUCH
+ 0x8465: 0xAF0C, //HANGUL SYLLABLE SSANGKIYEOK YEO KHIEUKH
+ 0x8466: 0xAF0E, //HANGUL SYLLABLE SSANGKIYEOK YEO PHIEUPH
+ 0x8467: 0xAF0F, //HANGUL SYLLABLE SSANGKIYEOK YEO HIEUH
+ 0x8468: 0xAF11, //HANGUL SYLLABLE SSANGKIYEOK YE KIYEOK
+ 0x8469: 0xAF12, //HANGUL SYLLABLE SSANGKIYEOK YE SSANGKIYEOK
+ 0x846A: 0xAF13, //HANGUL SYLLABLE SSANGKIYEOK YE KIYEOKSIOS
+ 0x846B: 0xAF14, //HANGUL SYLLABLE SSANGKIYEOK YE NIEUN
+ 0x846C: 0xAF15, //HANGUL SYLLABLE SSANGKIYEOK YE NIEUNCIEUC
+ 0x846D: 0xAF16, //HANGUL SYLLABLE SSANGKIYEOK YE NIEUNHIEUH
+ 0x846E: 0xAF17, //HANGUL SYLLABLE SSANGKIYEOK YE TIKEUT
+ 0x846F: 0xAF18, //HANGUL SYLLABLE SSANGKIYEOK YE RIEUL
+ 0x8470: 0xAF19, //HANGUL SYLLABLE SSANGKIYEOK YE RIEULKIYEOK
+ 0x8471: 0xAF1A, //HANGUL SYLLABLE SSANGKIYEOK YE RIEULMIEUM
+ 0x8472: 0xAF1B, //HANGUL SYLLABLE SSANGKIYEOK YE RIEULPIEUP
+ 0x8473: 0xAF1C, //HANGUL SYLLABLE SSANGKIYEOK YE RIEULSIOS
+ 0x8474: 0xAF1D, //HANGUL SYLLABLE SSANGKIYEOK YE RIEULTHIEUTH
+ 0x8475: 0xAF1E, //HANGUL SYLLABLE SSANGKIYEOK YE RIEULPHIEUPH
+ 0x8476: 0xAF1F, //HANGUL SYLLABLE SSANGKIYEOK YE RIEULHIEUH
+ 0x8477: 0xAF20, //HANGUL SYLLABLE SSANGKIYEOK YE MIEUM
+ 0x8478: 0xAF21, //HANGUL SYLLABLE SSANGKIYEOK YE PIEUP
+ 0x8479: 0xAF22, //HANGUL SYLLABLE SSANGKIYEOK YE PIEUPSIOS
+ 0x847A: 0xAF23, //HANGUL SYLLABLE SSANGKIYEOK YE SIOS
+ 0x8481: 0xAF24, //HANGUL SYLLABLE SSANGKIYEOK YE SSANGSIOS
+ 0x8482: 0xAF25, //HANGUL SYLLABLE SSANGKIYEOK YE IEUNG
+ 0x8483: 0xAF26, //HANGUL SYLLABLE SSANGKIYEOK YE CIEUC
+ 0x8484: 0xAF27, //HANGUL SYLLABLE SSANGKIYEOK YE CHIEUCH
+ 0x8485: 0xAF28, //HANGUL SYLLABLE SSANGKIYEOK YE KHIEUKH
+ 0x8486: 0xAF29, //HANGUL SYLLABLE SSANGKIYEOK YE THIEUTH
+ 0x8487: 0xAF2A, //HANGUL SYLLABLE SSANGKIYEOK YE PHIEUPH
+ 0x8488: 0xAF2B, //HANGUL SYLLABLE SSANGKIYEOK YE HIEUH
+ 0x8489: 0xAF2E, //HANGUL SYLLABLE SSANGKIYEOK O SSANGKIYEOK
+ 0x848A: 0xAF2F, //HANGUL SYLLABLE SSANGKIYEOK O KIYEOKSIOS
+ 0x848B: 0xAF31, //HANGUL SYLLABLE SSANGKIYEOK O NIEUNCIEUC
+ 0x848C: 0xAF33, //HANGUL SYLLABLE SSANGKIYEOK O TIKEUT
+ 0x848D: 0xAF35, //HANGUL SYLLABLE SSANGKIYEOK O RIEULKIYEOK
+ 0x848E: 0xAF36, //HANGUL SYLLABLE SSANGKIYEOK O RIEULMIEUM
+ 0x848F: 0xAF37, //HANGUL SYLLABLE SSANGKIYEOK O RIEULPIEUP
+ 0x8490: 0xAF38, //HANGUL SYLLABLE SSANGKIYEOK O RIEULSIOS
+ 0x8491: 0xAF39, //HANGUL SYLLABLE SSANGKIYEOK O RIEULTHIEUTH
+ 0x8492: 0xAF3A, //HANGUL SYLLABLE SSANGKIYEOK O RIEULPHIEUPH
+ 0x8493: 0xAF3B, //HANGUL SYLLABLE SSANGKIYEOK O RIEULHIEUH
+ 0x8494: 0xAF3E, //HANGUL SYLLABLE SSANGKIYEOK O PIEUPSIOS
+ 0x8495: 0xAF40, //HANGUL SYLLABLE SSANGKIYEOK O SSANGSIOS
+ 0x8496: 0xAF44, //HANGUL SYLLABLE SSANGKIYEOK O KHIEUKH
+ 0x8497: 0xAF45, //HANGUL SYLLABLE SSANGKIYEOK O THIEUTH
+ 0x8498: 0xAF46, //HANGUL SYLLABLE SSANGKIYEOK O PHIEUPH
+ 0x8499: 0xAF47, //HANGUL SYLLABLE SSANGKIYEOK O HIEUH
+ 0x849A: 0xAF4A, //HANGUL SYLLABLE SSANGKIYEOK WA SSANGKIYEOK
+ 0x849B: 0xAF4B, //HANGUL SYLLABLE SSANGKIYEOK WA KIYEOKSIOS
+ 0x849C: 0xAF4C, //HANGUL SYLLABLE SSANGKIYEOK WA NIEUN
+ 0x849D: 0xAF4D, //HANGUL SYLLABLE SSANGKIYEOK WA NIEUNCIEUC
+ 0x849E: 0xAF4E, //HANGUL SYLLABLE SSANGKIYEOK WA NIEUNHIEUH
+ 0x849F: 0xAF4F, //HANGUL SYLLABLE SSANGKIYEOK WA TIKEUT
+ 0x84A0: 0xAF51, //HANGUL SYLLABLE SSANGKIYEOK WA RIEULKIYEOK
+ 0x84A1: 0xAF52, //HANGUL SYLLABLE SSANGKIYEOK WA RIEULMIEUM
+ 0x84A2: 0xAF53, //HANGUL SYLLABLE SSANGKIYEOK WA RIEULPIEUP
+ 0x84A3: 0xAF54, //HANGUL SYLLABLE SSANGKIYEOK WA RIEULSIOS
+ 0x84A4: 0xAF55, //HANGUL SYLLABLE SSANGKIYEOK WA RIEULTHIEUTH
+ 0x84A5: 0xAF56, //HANGUL SYLLABLE SSANGKIYEOK WA RIEULPHIEUPH
+ 0x84A6: 0xAF57, //HANGUL SYLLABLE SSANGKIYEOK WA RIEULHIEUH
+ 0x84A7: 0xAF58, //HANGUL SYLLABLE SSANGKIYEOK WA MIEUM
+ 0x84A8: 0xAF59, //HANGUL SYLLABLE SSANGKIYEOK WA PIEUP
+ 0x84A9: 0xAF5A, //HANGUL SYLLABLE SSANGKIYEOK WA PIEUPSIOS
+ 0x84AA: 0xAF5B, //HANGUL SYLLABLE SSANGKIYEOK WA SIOS
+ 0x84AB: 0xAF5E, //HANGUL SYLLABLE SSANGKIYEOK WA CIEUC
+ 0x84AC: 0xAF5F, //HANGUL SYLLABLE SSANGKIYEOK WA CHIEUCH
+ 0x84AD: 0xAF60, //HANGUL SYLLABLE SSANGKIYEOK WA KHIEUKH
+ 0x84AE: 0xAF61, //HANGUL SYLLABLE SSANGKIYEOK WA THIEUTH
+ 0x84AF: 0xAF62, //HANGUL SYLLABLE SSANGKIYEOK WA PHIEUPH
+ 0x84B0: 0xAF63, //HANGUL SYLLABLE SSANGKIYEOK WA HIEUH
+ 0x84B1: 0xAF66, //HANGUL SYLLABLE SSANGKIYEOK WAE SSANGKIYEOK
+ 0x84B2: 0xAF67, //HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOKSIOS
+ 0x84B3: 0xAF68, //HANGUL SYLLABLE SSANGKIYEOK WAE NIEUN
+ 0x84B4: 0xAF69, //HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNCIEUC
+ 0x84B5: 0xAF6A, //HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNHIEUH
+ 0x84B6: 0xAF6B, //HANGUL SYLLABLE SSANGKIYEOK WAE TIKEUT
+ 0x84B7: 0xAF6C, //HANGUL SYLLABLE SSANGKIYEOK WAE RIEUL
+ 0x84B8: 0xAF6D, //HANGUL SYLLABLE SSANGKIYEOK WAE RIEULKIYEOK
+ 0x84B9: 0xAF6E, //HANGUL SYLLABLE SSANGKIYEOK WAE RIEULMIEUM
+ 0x84BA: 0xAF6F, //HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPIEUP
+ 0x84BB: 0xAF70, //HANGUL SYLLABLE SSANGKIYEOK WAE RIEULSIOS
+ 0x84BC: 0xAF71, //HANGUL SYLLABLE SSANGKIYEOK WAE RIEULTHIEUTH
+ 0x84BD: 0xAF72, //HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPHIEUPH
+ 0x84BE: 0xAF73, //HANGUL SYLLABLE SSANGKIYEOK WAE RIEULHIEUH
+ 0x84BF: 0xAF74, //HANGUL SYLLABLE SSANGKIYEOK WAE MIEUM
+ 0x84C0: 0xAF75, //HANGUL SYLLABLE SSANGKIYEOK WAE PIEUP
+ 0x84C1: 0xAF76, //HANGUL SYLLABLE SSANGKIYEOK WAE PIEUPSIOS
+ 0x84C2: 0xAF77, //HANGUL SYLLABLE SSANGKIYEOK WAE SIOS
+ 0x84C3: 0xAF78, //HANGUL SYLLABLE SSANGKIYEOK WAE SSANGSIOS
+ 0x84C4: 0xAF7A, //HANGUL SYLLABLE SSANGKIYEOK WAE CIEUC
+ 0x84C5: 0xAF7B, //HANGUL SYLLABLE SSANGKIYEOK WAE CHIEUCH
+ 0x84C6: 0xAF7C, //HANGUL SYLLABLE SSANGKIYEOK WAE KHIEUKH
+ 0x84C7: 0xAF7D, //HANGUL SYLLABLE SSANGKIYEOK WAE THIEUTH
+ 0x84C8: 0xAF7E, //HANGUL SYLLABLE SSANGKIYEOK WAE PHIEUPH
+ 0x84C9: 0xAF7F, //HANGUL SYLLABLE SSANGKIYEOK WAE HIEUH
+ 0x84CA: 0xAF81, //HANGUL SYLLABLE SSANGKIYEOK OE KIYEOK
+ 0x84CB: 0xAF82, //HANGUL SYLLABLE SSANGKIYEOK OE SSANGKIYEOK
+ 0x84CC: 0xAF83, //HANGUL SYLLABLE SSANGKIYEOK OE KIYEOKSIOS
+ 0x84CD: 0xAF85, //HANGUL SYLLABLE SSANGKIYEOK OE NIEUNCIEUC
+ 0x84CE: 0xAF86, //HANGUL SYLLABLE SSANGKIYEOK OE NIEUNHIEUH
+ 0x84CF: 0xAF87, //HANGUL SYLLABLE SSANGKIYEOK OE TIKEUT
+ 0x84D0: 0xAF89, //HANGUL SYLLABLE SSANGKIYEOK OE RIEULKIYEOK
+ 0x84D1: 0xAF8A, //HANGUL SYLLABLE SSANGKIYEOK OE RIEULMIEUM
+ 0x84D2: 0xAF8B, //HANGUL SYLLABLE SSANGKIYEOK OE RIEULPIEUP
+ 0x84D3: 0xAF8C, //HANGUL SYLLABLE SSANGKIYEOK OE RIEULSIOS
+ 0x84D4: 0xAF8D, //HANGUL SYLLABLE SSANGKIYEOK OE RIEULTHIEUTH
+ 0x84D5: 0xAF8E, //HANGUL SYLLABLE SSANGKIYEOK OE RIEULPHIEUPH
+ 0x84D6: 0xAF8F, //HANGUL SYLLABLE SSANGKIYEOK OE RIEULHIEUH
+ 0x84D7: 0xAF92, //HANGUL SYLLABLE SSANGKIYEOK OE PIEUPSIOS
+ 0x84D8: 0xAF93, //HANGUL SYLLABLE SSANGKIYEOK OE SIOS
+ 0x84D9: 0xAF94, //HANGUL SYLLABLE SSANGKIYEOK OE SSANGSIOS
+ 0x84DA: 0xAF96, //HANGUL SYLLABLE SSANGKIYEOK OE CIEUC
+ 0x84DB: 0xAF97, //HANGUL SYLLABLE SSANGKIYEOK OE CHIEUCH
+ 0x84DC: 0xAF98, //HANGUL SYLLABLE SSANGKIYEOK OE KHIEUKH
+ 0x84DD: 0xAF99, //HANGUL SYLLABLE SSANGKIYEOK OE THIEUTH
+ 0x84DE: 0xAF9A, //HANGUL SYLLABLE SSANGKIYEOK OE PHIEUPH
+ 0x84DF: 0xAF9B, //HANGUL SYLLABLE SSANGKIYEOK OE HIEUH
+ 0x84E0: 0xAF9D, //HANGUL SYLLABLE SSANGKIYEOK YO KIYEOK
+ 0x84E1: 0xAF9E, //HANGUL SYLLABLE SSANGKIYEOK YO SSANGKIYEOK
+ 0x84E2: 0xAF9F, //HANGUL SYLLABLE SSANGKIYEOK YO KIYEOKSIOS
+ 0x84E3: 0xAFA0, //HANGUL SYLLABLE SSANGKIYEOK YO NIEUN
+ 0x84E4: 0xAFA1, //HANGUL SYLLABLE SSANGKIYEOK YO NIEUNCIEUC
+ 0x84E5: 0xAFA2, //HANGUL SYLLABLE SSANGKIYEOK YO NIEUNHIEUH
+ 0x84E6: 0xAFA3, //HANGUL SYLLABLE SSANGKIYEOK YO TIKEUT
+ 0x84E7: 0xAFA4, //HANGUL SYLLABLE SSANGKIYEOK YO RIEUL
+ 0x84E8: 0xAFA5, //HANGUL SYLLABLE SSANGKIYEOK YO RIEULKIYEOK
+ 0x84E9: 0xAFA6, //HANGUL SYLLABLE SSANGKIYEOK YO RIEULMIEUM
+ 0x84EA: 0xAFA7, //HANGUL SYLLABLE SSANGKIYEOK YO RIEULPIEUP
+ 0x84EB: 0xAFA8, //HANGUL SYLLABLE SSANGKIYEOK YO RIEULSIOS
+ 0x84EC: 0xAFA9, //HANGUL SYLLABLE SSANGKIYEOK YO RIEULTHIEUTH
+ 0x84ED: 0xAFAA, //HANGUL SYLLABLE SSANGKIYEOK YO RIEULPHIEUPH
+ 0x84EE: 0xAFAB, //HANGUL SYLLABLE SSANGKIYEOK YO RIEULHIEUH
+ 0x84EF: 0xAFAC, //HANGUL SYLLABLE SSANGKIYEOK YO MIEUM
+ 0x84F0: 0xAFAD, //HANGUL SYLLABLE SSANGKIYEOK YO PIEUP
+ 0x84F1: 0xAFAE, //HANGUL SYLLABLE SSANGKIYEOK YO PIEUPSIOS
+ 0x84F2: 0xAFAF, //HANGUL SYLLABLE SSANGKIYEOK YO SIOS
+ 0x84F3: 0xAFB0, //HANGUL SYLLABLE SSANGKIYEOK YO SSANGSIOS
+ 0x84F4: 0xAFB1, //HANGUL SYLLABLE SSANGKIYEOK YO IEUNG
+ 0x84F5: 0xAFB2, //HANGUL SYLLABLE SSANGKIYEOK YO CIEUC
+ 0x84F6: 0xAFB3, //HANGUL SYLLABLE SSANGKIYEOK YO CHIEUCH
+ 0x84F7: 0xAFB4, //HANGUL SYLLABLE SSANGKIYEOK YO KHIEUKH
+ 0x84F8: 0xAFB5, //HANGUL SYLLABLE SSANGKIYEOK YO THIEUTH
+ 0x84F9: 0xAFB6, //HANGUL SYLLABLE SSANGKIYEOK YO PHIEUPH
+ 0x84FA: 0xAFB7, //HANGUL SYLLABLE SSANGKIYEOK YO HIEUH
+ 0x84FB: 0xAFBA, //HANGUL SYLLABLE SSANGKIYEOK U SSANGKIYEOK
+ 0x84FC: 0xAFBB, //HANGUL SYLLABLE SSANGKIYEOK U KIYEOKSIOS
+ 0x84FD: 0xAFBD, //HANGUL SYLLABLE SSANGKIYEOK U NIEUNCIEUC
+ 0x84FE: 0xAFBE, //HANGUL SYLLABLE SSANGKIYEOK U NIEUNHIEUH
+ 0x8541: 0xAFBF, //HANGUL SYLLABLE SSANGKIYEOK U TIKEUT
+ 0x8542: 0xAFC1, //HANGUL SYLLABLE SSANGKIYEOK U RIEULKIYEOK
+ 0x8543: 0xAFC2, //HANGUL SYLLABLE SSANGKIYEOK U RIEULMIEUM
+ 0x8544: 0xAFC3, //HANGUL SYLLABLE SSANGKIYEOK U RIEULPIEUP
+ 0x8545: 0xAFC4, //HANGUL SYLLABLE SSANGKIYEOK U RIEULSIOS
+ 0x8546: 0xAFC5, //HANGUL SYLLABLE SSANGKIYEOK U RIEULTHIEUTH
+ 0x8547: 0xAFC6, //HANGUL SYLLABLE SSANGKIYEOK U RIEULPHIEUPH
+ 0x8548: 0xAFCA, //HANGUL SYLLABLE SSANGKIYEOK U PIEUPSIOS
+ 0x8549: 0xAFCC, //HANGUL SYLLABLE SSANGKIYEOK U SSANGSIOS
+ 0x854A: 0xAFCF, //HANGUL SYLLABLE SSANGKIYEOK U CHIEUCH
+ 0x854B: 0xAFD0, //HANGUL SYLLABLE SSANGKIYEOK U KHIEUKH
+ 0x854C: 0xAFD1, //HANGUL SYLLABLE SSANGKIYEOK U THIEUTH
+ 0x854D: 0xAFD2, //HANGUL SYLLABLE SSANGKIYEOK U PHIEUPH
+ 0x854E: 0xAFD3, //HANGUL SYLLABLE SSANGKIYEOK U HIEUH
+ 0x854F: 0xAFD5, //HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOK
+ 0x8550: 0xAFD6, //HANGUL SYLLABLE SSANGKIYEOK WEO SSANGKIYEOK
+ 0x8551: 0xAFD7, //HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOKSIOS
+ 0x8552: 0xAFD8, //HANGUL SYLLABLE SSANGKIYEOK WEO NIEUN
+ 0x8553: 0xAFD9, //HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNCIEUC
+ 0x8554: 0xAFDA, //HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNHIEUH
+ 0x8555: 0xAFDB, //HANGUL SYLLABLE SSANGKIYEOK WEO TIKEUT
+ 0x8556: 0xAFDD, //HANGUL SYLLABLE SSANGKIYEOK WEO RIEULKIYEOK
+ 0x8557: 0xAFDE, //HANGUL SYLLABLE SSANGKIYEOK WEO RIEULMIEUM
+ 0x8558: 0xAFDF, //HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPIEUP
+ 0x8559: 0xAFE0, //HANGUL SYLLABLE SSANGKIYEOK WEO RIEULSIOS
+ 0x855A: 0xAFE1, //HANGUL SYLLABLE SSANGKIYEOK WEO RIEULTHIEUTH
+ 0x8561: 0xAFE2, //HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPHIEUPH
+ 0x8562: 0xAFE3, //HANGUL SYLLABLE SSANGKIYEOK WEO RIEULHIEUH
+ 0x8563: 0xAFE4, //HANGUL SYLLABLE SSANGKIYEOK WEO MIEUM
+ 0x8564: 0xAFE5, //HANGUL SYLLABLE SSANGKIYEOK WEO PIEUP
+ 0x8565: 0xAFE6, //HANGUL SYLLABLE SSANGKIYEOK WEO PIEUPSIOS
+ 0x8566: 0xAFE7, //HANGUL SYLLABLE SSANGKIYEOK WEO SIOS
+ 0x8567: 0xAFEA, //HANGUL SYLLABLE SSANGKIYEOK WEO CIEUC
+ 0x8568: 0xAFEB, //HANGUL SYLLABLE SSANGKIYEOK WEO CHIEUCH
+ 0x8569: 0xAFEC, //HANGUL SYLLABLE SSANGKIYEOK WEO KHIEUKH
+ 0x856A: 0xAFED, //HANGUL SYLLABLE SSANGKIYEOK WEO THIEUTH
+ 0x856B: 0xAFEE, //HANGUL SYLLABLE SSANGKIYEOK WEO PHIEUPH
+ 0x856C: 0xAFEF, //HANGUL SYLLABLE SSANGKIYEOK WEO HIEUH
+ 0x856D: 0xAFF2, //HANGUL SYLLABLE SSANGKIYEOK WE SSANGKIYEOK
+ 0x856E: 0xAFF3, //HANGUL SYLLABLE SSANGKIYEOK WE KIYEOKSIOS
+ 0x856F: 0xAFF5, //HANGUL SYLLABLE SSANGKIYEOK WE NIEUNCIEUC
+ 0x8570: 0xAFF6, //HANGUL SYLLABLE SSANGKIYEOK WE NIEUNHIEUH
+ 0x8571: 0xAFF7, //HANGUL SYLLABLE SSANGKIYEOK WE TIKEUT
+ 0x8572: 0xAFF9, //HANGUL SYLLABLE SSANGKIYEOK WE RIEULKIYEOK
+ 0x8573: 0xAFFA, //HANGUL SYLLABLE SSANGKIYEOK WE RIEULMIEUM
+ 0x8574: 0xAFFB, //HANGUL SYLLABLE SSANGKIYEOK WE RIEULPIEUP
+ 0x8575: 0xAFFC, //HANGUL SYLLABLE SSANGKIYEOK WE RIEULSIOS
+ 0x8576: 0xAFFD, //HANGUL SYLLABLE SSANGKIYEOK WE RIEULTHIEUTH
+ 0x8577: 0xAFFE, //HANGUL SYLLABLE SSANGKIYEOK WE RIEULPHIEUPH
+ 0x8578: 0xAFFF, //HANGUL SYLLABLE SSANGKIYEOK WE RIEULHIEUH
+ 0x8579: 0xB002, //HANGUL SYLLABLE SSANGKIYEOK WE PIEUPSIOS
+ 0x857A: 0xB003, //HANGUL SYLLABLE SSANGKIYEOK WE SIOS
+ 0x8581: 0xB005, //HANGUL SYLLABLE SSANGKIYEOK WE IEUNG
+ 0x8582: 0xB006, //HANGUL SYLLABLE SSANGKIYEOK WE CIEUC
+ 0x8583: 0xB007, //HANGUL SYLLABLE SSANGKIYEOK WE CHIEUCH
+ 0x8584: 0xB008, //HANGUL SYLLABLE SSANGKIYEOK WE KHIEUKH
+ 0x8585: 0xB009, //HANGUL SYLLABLE SSANGKIYEOK WE THIEUTH
+ 0x8586: 0xB00A, //HANGUL SYLLABLE SSANGKIYEOK WE PHIEUPH
+ 0x8587: 0xB00B, //HANGUL SYLLABLE SSANGKIYEOK WE HIEUH
+ 0x8588: 0xB00D, //HANGUL SYLLABLE SSANGKIYEOK WI KIYEOK
+ 0x8589: 0xB00E, //HANGUL SYLLABLE SSANGKIYEOK WI SSANGKIYEOK
+ 0x858A: 0xB00F, //HANGUL SYLLABLE SSANGKIYEOK WI KIYEOKSIOS
+ 0x858B: 0xB011, //HANGUL SYLLABLE SSANGKIYEOK WI NIEUNCIEUC
+ 0x858C: 0xB012, //HANGUL SYLLABLE SSANGKIYEOK WI NIEUNHIEUH
+ 0x858D: 0xB013, //HANGUL SYLLABLE SSANGKIYEOK WI TIKEUT
+ 0x858E: 0xB015, //HANGUL SYLLABLE SSANGKIYEOK WI RIEULKIYEOK
+ 0x858F: 0xB016, //HANGUL SYLLABLE SSANGKIYEOK WI RIEULMIEUM
+ 0x8590: 0xB017, //HANGUL SYLLABLE SSANGKIYEOK WI RIEULPIEUP
+ 0x8591: 0xB018, //HANGUL SYLLABLE SSANGKIYEOK WI RIEULSIOS
+ 0x8592: 0xB019, //HANGUL SYLLABLE SSANGKIYEOK WI RIEULTHIEUTH
+ 0x8593: 0xB01A, //HANGUL SYLLABLE SSANGKIYEOK WI RIEULPHIEUPH
+ 0x8594: 0xB01B, //HANGUL SYLLABLE SSANGKIYEOK WI RIEULHIEUH
+ 0x8595: 0xB01E, //HANGUL SYLLABLE SSANGKIYEOK WI PIEUPSIOS
+ 0x8596: 0xB01F, //HANGUL SYLLABLE SSANGKIYEOK WI SIOS
+ 0x8597: 0xB020, //HANGUL SYLLABLE SSANGKIYEOK WI SSANGSIOS
+ 0x8598: 0xB021, //HANGUL SYLLABLE SSANGKIYEOK WI IEUNG
+ 0x8599: 0xB022, //HANGUL SYLLABLE SSANGKIYEOK WI CIEUC
+ 0x859A: 0xB023, //HANGUL SYLLABLE SSANGKIYEOK WI CHIEUCH
+ 0x859B: 0xB024, //HANGUL SYLLABLE SSANGKIYEOK WI KHIEUKH
+ 0x859C: 0xB025, //HANGUL SYLLABLE SSANGKIYEOK WI THIEUTH
+ 0x859D: 0xB026, //HANGUL SYLLABLE SSANGKIYEOK WI PHIEUPH
+ 0x859E: 0xB027, //HANGUL SYLLABLE SSANGKIYEOK WI HIEUH
+ 0x859F: 0xB029, //HANGUL SYLLABLE SSANGKIYEOK YU KIYEOK
+ 0x85A0: 0xB02A, //HANGUL SYLLABLE SSANGKIYEOK YU SSANGKIYEOK
+ 0x85A1: 0xB02B, //HANGUL SYLLABLE SSANGKIYEOK YU KIYEOKSIOS
+ 0x85A2: 0xB02C, //HANGUL SYLLABLE SSANGKIYEOK YU NIEUN
+ 0x85A3: 0xB02D, //HANGUL SYLLABLE SSANGKIYEOK YU NIEUNCIEUC
+ 0x85A4: 0xB02E, //HANGUL SYLLABLE SSANGKIYEOK YU NIEUNHIEUH
+ 0x85A5: 0xB02F, //HANGUL SYLLABLE SSANGKIYEOK YU TIKEUT
+ 0x85A6: 0xB030, //HANGUL SYLLABLE SSANGKIYEOK YU RIEUL
+ 0x85A7: 0xB031, //HANGUL SYLLABLE SSANGKIYEOK YU RIEULKIYEOK
+ 0x85A8: 0xB032, //HANGUL SYLLABLE SSANGKIYEOK YU RIEULMIEUM
+ 0x85A9: 0xB033, //HANGUL SYLLABLE SSANGKIYEOK YU RIEULPIEUP
+ 0x85AA: 0xB034, //HANGUL SYLLABLE SSANGKIYEOK YU RIEULSIOS
+ 0x85AB: 0xB035, //HANGUL SYLLABLE SSANGKIYEOK YU RIEULTHIEUTH
+ 0x85AC: 0xB036, //HANGUL SYLLABLE SSANGKIYEOK YU RIEULPHIEUPH
+ 0x85AD: 0xB037, //HANGUL SYLLABLE SSANGKIYEOK YU RIEULHIEUH
+ 0x85AE: 0xB038, //HANGUL SYLLABLE SSANGKIYEOK YU MIEUM
+ 0x85AF: 0xB039, //HANGUL SYLLABLE SSANGKIYEOK YU PIEUP
+ 0x85B0: 0xB03A, //HANGUL SYLLABLE SSANGKIYEOK YU PIEUPSIOS
+ 0x85B1: 0xB03B, //HANGUL SYLLABLE SSANGKIYEOK YU SIOS
+ 0x85B2: 0xB03C, //HANGUL SYLLABLE SSANGKIYEOK YU SSANGSIOS
+ 0x85B3: 0xB03D, //HANGUL SYLLABLE SSANGKIYEOK YU IEUNG
+ 0x85B4: 0xB03E, //HANGUL SYLLABLE SSANGKIYEOK YU CIEUC
+ 0x85B5: 0xB03F, //HANGUL SYLLABLE SSANGKIYEOK YU CHIEUCH
+ 0x85B6: 0xB040, //HANGUL SYLLABLE SSANGKIYEOK YU KHIEUKH
+ 0x85B7: 0xB041, //HANGUL SYLLABLE SSANGKIYEOK YU THIEUTH
+ 0x85B8: 0xB042, //HANGUL SYLLABLE SSANGKIYEOK YU PHIEUPH
+ 0x85B9: 0xB043, //HANGUL SYLLABLE SSANGKIYEOK YU HIEUH
+ 0x85BA: 0xB046, //HANGUL SYLLABLE SSANGKIYEOK EU SSANGKIYEOK
+ 0x85BB: 0xB047, //HANGUL SYLLABLE SSANGKIYEOK EU KIYEOKSIOS
+ 0x85BC: 0xB049, //HANGUL SYLLABLE SSANGKIYEOK EU NIEUNCIEUC
+ 0x85BD: 0xB04B, //HANGUL SYLLABLE SSANGKIYEOK EU TIKEUT
+ 0x85BE: 0xB04D, //HANGUL SYLLABLE SSANGKIYEOK EU RIEULKIYEOK
+ 0x85BF: 0xB04F, //HANGUL SYLLABLE SSANGKIYEOK EU RIEULPIEUP
+ 0x85C0: 0xB050, //HANGUL SYLLABLE SSANGKIYEOK EU RIEULSIOS
+ 0x85C1: 0xB051, //HANGUL SYLLABLE SSANGKIYEOK EU RIEULTHIEUTH
+ 0x85C2: 0xB052, //HANGUL SYLLABLE SSANGKIYEOK EU RIEULPHIEUPH
+ 0x85C3: 0xB056, //HANGUL SYLLABLE SSANGKIYEOK EU PIEUPSIOS
+ 0x85C4: 0xB058, //HANGUL SYLLABLE SSANGKIYEOK EU SSANGSIOS
+ 0x85C5: 0xB05A, //HANGUL SYLLABLE SSANGKIYEOK EU CIEUC
+ 0x85C6: 0xB05B, //HANGUL SYLLABLE SSANGKIYEOK EU CHIEUCH
+ 0x85C7: 0xB05C, //HANGUL SYLLABLE SSANGKIYEOK EU KHIEUKH
+ 0x85C8: 0xB05E, //HANGUL SYLLABLE SSANGKIYEOK EU PHIEUPH
+ 0x85C9: 0xB05F, //HANGUL SYLLABLE SSANGKIYEOK EU HIEUH
+ 0x85CA: 0xB060, //HANGUL SYLLABLE SSANGKIYEOK YI
+ 0x85CB: 0xB061, //HANGUL SYLLABLE SSANGKIYEOK YI KIYEOK
+ 0x85CC: 0xB062, //HANGUL SYLLABLE SSANGKIYEOK YI SSANGKIYEOK
+ 0x85CD: 0xB063, //HANGUL SYLLABLE SSANGKIYEOK YI KIYEOKSIOS
+ 0x85CE: 0xB064, //HANGUL SYLLABLE SSANGKIYEOK YI NIEUN
+ 0x85CF: 0xB065, //HANGUL SYLLABLE SSANGKIYEOK YI NIEUNCIEUC
+ 0x85D0: 0xB066, //HANGUL SYLLABLE SSANGKIYEOK YI NIEUNHIEUH
+ 0x85D1: 0xB067, //HANGUL SYLLABLE SSANGKIYEOK YI TIKEUT
+ 0x85D2: 0xB068, //HANGUL SYLLABLE SSANGKIYEOK YI RIEUL
+ 0x85D3: 0xB069, //HANGUL SYLLABLE SSANGKIYEOK YI RIEULKIYEOK
+ 0x85D4: 0xB06A, //HANGUL SYLLABLE SSANGKIYEOK YI RIEULMIEUM
+ 0x85D5: 0xB06B, //HANGUL SYLLABLE SSANGKIYEOK YI RIEULPIEUP
+ 0x85D6: 0xB06C, //HANGUL SYLLABLE SSANGKIYEOK YI RIEULSIOS
+ 0x85D7: 0xB06D, //HANGUL SYLLABLE SSANGKIYEOK YI RIEULTHIEUTH
+ 0x85D8: 0xB06E, //HANGUL SYLLABLE SSANGKIYEOK YI RIEULPHIEUPH
+ 0x85D9: 0xB06F, //HANGUL SYLLABLE SSANGKIYEOK YI RIEULHIEUH
+ 0x85DA: 0xB070, //HANGUL SYLLABLE SSANGKIYEOK YI MIEUM
+ 0x85DB: 0xB071, //HANGUL SYLLABLE SSANGKIYEOK YI PIEUP
+ 0x85DC: 0xB072, //HANGUL SYLLABLE SSANGKIYEOK YI PIEUPSIOS
+ 0x85DD: 0xB073, //HANGUL SYLLABLE SSANGKIYEOK YI SIOS
+ 0x85DE: 0xB074, //HANGUL SYLLABLE SSANGKIYEOK YI SSANGSIOS
+ 0x85DF: 0xB075, //HANGUL SYLLABLE SSANGKIYEOK YI IEUNG
+ 0x85E0: 0xB076, //HANGUL SYLLABLE SSANGKIYEOK YI CIEUC
+ 0x85E1: 0xB077, //HANGUL SYLLABLE SSANGKIYEOK YI CHIEUCH
+ 0x85E2: 0xB078, //HANGUL SYLLABLE SSANGKIYEOK YI KHIEUKH
+ 0x85E3: 0xB079, //HANGUL SYLLABLE SSANGKIYEOK YI THIEUTH
+ 0x85E4: 0xB07A, //HANGUL SYLLABLE SSANGKIYEOK YI PHIEUPH
+ 0x85E5: 0xB07B, //HANGUL SYLLABLE SSANGKIYEOK YI HIEUH
+ 0x85E6: 0xB07E, //HANGUL SYLLABLE SSANGKIYEOK I SSANGKIYEOK
+ 0x85E7: 0xB07F, //HANGUL SYLLABLE SSANGKIYEOK I KIYEOKSIOS
+ 0x85E8: 0xB081, //HANGUL SYLLABLE SSANGKIYEOK I NIEUNCIEUC
+ 0x85E9: 0xB082, //HANGUL SYLLABLE SSANGKIYEOK I NIEUNHIEUH
+ 0x85EA: 0xB083, //HANGUL SYLLABLE SSANGKIYEOK I TIKEUT
+ 0x85EB: 0xB085, //HANGUL SYLLABLE SSANGKIYEOK I RIEULKIYEOK
+ 0x85EC: 0xB086, //HANGUL SYLLABLE SSANGKIYEOK I RIEULMIEUM
+ 0x85ED: 0xB087, //HANGUL SYLLABLE SSANGKIYEOK I RIEULPIEUP
+ 0x85EE: 0xB088, //HANGUL SYLLABLE SSANGKIYEOK I RIEULSIOS
+ 0x85EF: 0xB089, //HANGUL SYLLABLE SSANGKIYEOK I RIEULTHIEUTH
+ 0x85F0: 0xB08A, //HANGUL SYLLABLE SSANGKIYEOK I RIEULPHIEUPH
+ 0x85F1: 0xB08B, //HANGUL SYLLABLE SSANGKIYEOK I RIEULHIEUH
+ 0x85F2: 0xB08E, //HANGUL SYLLABLE SSANGKIYEOK I PIEUPSIOS
+ 0x85F3: 0xB090, //HANGUL SYLLABLE SSANGKIYEOK I SSANGSIOS
+ 0x85F4: 0xB092, //HANGUL SYLLABLE SSANGKIYEOK I CIEUC
+ 0x85F5: 0xB093, //HANGUL SYLLABLE SSANGKIYEOK I CHIEUCH
+ 0x85F6: 0xB094, //HANGUL SYLLABLE SSANGKIYEOK I KHIEUKH
+ 0x85F7: 0xB095, //HANGUL SYLLABLE SSANGKIYEOK I THIEUTH
+ 0x85F8: 0xB096, //HANGUL SYLLABLE SSANGKIYEOK I PHIEUPH
+ 0x85F9: 0xB097, //HANGUL SYLLABLE SSANGKIYEOK I HIEUH
+ 0x85FA: 0xB09B, //HANGUL SYLLABLE NIEUN A KIYEOKSIOS
+ 0x85FB: 0xB09D, //HANGUL SYLLABLE NIEUN A NIEUNCIEUC
+ 0x85FC: 0xB09E, //HANGUL SYLLABLE NIEUN A NIEUNHIEUH
+ 0x85FD: 0xB0A3, //HANGUL SYLLABLE NIEUN A RIEULPIEUP
+ 0x85FE: 0xB0A4, //HANGUL SYLLABLE NIEUN A RIEULSIOS
+ 0x8641: 0xB0A5, //HANGUL SYLLABLE NIEUN A RIEULTHIEUTH
+ 0x8642: 0xB0A6, //HANGUL SYLLABLE NIEUN A RIEULPHIEUPH
+ 0x8643: 0xB0A7, //HANGUL SYLLABLE NIEUN A RIEULHIEUH
+ 0x8644: 0xB0AA, //HANGUL SYLLABLE NIEUN A PIEUPSIOS
+ 0x8645: 0xB0B0, //HANGUL SYLLABLE NIEUN A KHIEUKH
+ 0x8646: 0xB0B2, //HANGUL SYLLABLE NIEUN A PHIEUPH
+ 0x8647: 0xB0B6, //HANGUL SYLLABLE NIEUN AE SSANGKIYEOK
+ 0x8648: 0xB0B7, //HANGUL SYLLABLE NIEUN AE KIYEOKSIOS
+ 0x8649: 0xB0B9, //HANGUL SYLLABLE NIEUN AE NIEUNCIEUC
+ 0x864A: 0xB0BA, //HANGUL SYLLABLE NIEUN AE NIEUNHIEUH
+ 0x864B: 0xB0BB, //HANGUL SYLLABLE NIEUN AE TIKEUT
+ 0x864C: 0xB0BD, //HANGUL SYLLABLE NIEUN AE RIEULKIYEOK
+ 0x864D: 0xB0BE, //HANGUL SYLLABLE NIEUN AE RIEULMIEUM
+ 0x864E: 0xB0BF, //HANGUL SYLLABLE NIEUN AE RIEULPIEUP
+ 0x864F: 0xB0C0, //HANGUL SYLLABLE NIEUN AE RIEULSIOS
+ 0x8650: 0xB0C1, //HANGUL SYLLABLE NIEUN AE RIEULTHIEUTH
+ 0x8651: 0xB0C2, //HANGUL SYLLABLE NIEUN AE RIEULPHIEUPH
+ 0x8652: 0xB0C3, //HANGUL SYLLABLE NIEUN AE RIEULHIEUH
+ 0x8653: 0xB0C6, //HANGUL SYLLABLE NIEUN AE PIEUPSIOS
+ 0x8654: 0xB0CA, //HANGUL SYLLABLE NIEUN AE CIEUC
+ 0x8655: 0xB0CB, //HANGUL SYLLABLE NIEUN AE CHIEUCH
+ 0x8656: 0xB0CC, //HANGUL SYLLABLE NIEUN AE KHIEUKH
+ 0x8657: 0xB0CD, //HANGUL SYLLABLE NIEUN AE THIEUTH
+ 0x8658: 0xB0CE, //HANGUL SYLLABLE NIEUN AE PHIEUPH
+ 0x8659: 0xB0CF, //HANGUL SYLLABLE NIEUN AE HIEUH
+ 0x865A: 0xB0D2, //HANGUL SYLLABLE NIEUN YA SSANGKIYEOK
+ 0x8661: 0xB0D3, //HANGUL SYLLABLE NIEUN YA KIYEOKSIOS
+ 0x8662: 0xB0D5, //HANGUL SYLLABLE NIEUN YA NIEUNCIEUC
+ 0x8663: 0xB0D6, //HANGUL SYLLABLE NIEUN YA NIEUNHIEUH
+ 0x8664: 0xB0D7, //HANGUL SYLLABLE NIEUN YA TIKEUT
+ 0x8665: 0xB0D9, //HANGUL SYLLABLE NIEUN YA RIEULKIYEOK
+ 0x8666: 0xB0DA, //HANGUL SYLLABLE NIEUN YA RIEULMIEUM
+ 0x8667: 0xB0DB, //HANGUL SYLLABLE NIEUN YA RIEULPIEUP
+ 0x8668: 0xB0DC, //HANGUL SYLLABLE NIEUN YA RIEULSIOS
+ 0x8669: 0xB0DD, //HANGUL SYLLABLE NIEUN YA RIEULTHIEUTH
+ 0x866A: 0xB0DE, //HANGUL SYLLABLE NIEUN YA RIEULPHIEUPH
+ 0x866B: 0xB0DF, //HANGUL SYLLABLE NIEUN YA RIEULHIEUH
+ 0x866C: 0xB0E1, //HANGUL SYLLABLE NIEUN YA PIEUP
+ 0x866D: 0xB0E2, //HANGUL SYLLABLE NIEUN YA PIEUPSIOS
+ 0x866E: 0xB0E3, //HANGUL SYLLABLE NIEUN YA SIOS
+ 0x866F: 0xB0E4, //HANGUL SYLLABLE NIEUN YA SSANGSIOS
+ 0x8670: 0xB0E6, //HANGUL SYLLABLE NIEUN YA CIEUC
+ 0x8671: 0xB0E7, //HANGUL SYLLABLE NIEUN YA CHIEUCH
+ 0x8672: 0xB0E8, //HANGUL SYLLABLE NIEUN YA KHIEUKH
+ 0x8673: 0xB0E9, //HANGUL SYLLABLE NIEUN YA THIEUTH
+ 0x8674: 0xB0EA, //HANGUL SYLLABLE NIEUN YA PHIEUPH
+ 0x8675: 0xB0EB, //HANGUL SYLLABLE NIEUN YA HIEUH
+ 0x8676: 0xB0EC, //HANGUL SYLLABLE NIEUN YAE
+ 0x8677: 0xB0ED, //HANGUL SYLLABLE NIEUN YAE KIYEOK
+ 0x8678: 0xB0EE, //HANGUL SYLLABLE NIEUN YAE SSANGKIYEOK
+ 0x8679: 0xB0EF, //HANGUL SYLLABLE NIEUN YAE KIYEOKSIOS
+ 0x867A: 0xB0F0, //HANGUL SYLLABLE NIEUN YAE NIEUN
+ 0x8681: 0xB0F1, //HANGUL SYLLABLE NIEUN YAE NIEUNCIEUC
+ 0x8682: 0xB0F2, //HANGUL SYLLABLE NIEUN YAE NIEUNHIEUH
+ 0x8683: 0xB0F3, //HANGUL SYLLABLE NIEUN YAE TIKEUT
+ 0x8684: 0xB0F4, //HANGUL SYLLABLE NIEUN YAE RIEUL
+ 0x8685: 0xB0F5, //HANGUL SYLLABLE NIEUN YAE RIEULKIYEOK
+ 0x8686: 0xB0F6, //HANGUL SYLLABLE NIEUN YAE RIEULMIEUM
+ 0x8687: 0xB0F7, //HANGUL SYLLABLE NIEUN YAE RIEULPIEUP
+ 0x8688: 0xB0F8, //HANGUL SYLLABLE NIEUN YAE RIEULSIOS
+ 0x8689: 0xB0F9, //HANGUL SYLLABLE NIEUN YAE RIEULTHIEUTH
+ 0x868A: 0xB0FA, //HANGUL SYLLABLE NIEUN YAE RIEULPHIEUPH
+ 0x868B: 0xB0FB, //HANGUL SYLLABLE NIEUN YAE RIEULHIEUH
+ 0x868C: 0xB0FC, //HANGUL SYLLABLE NIEUN YAE MIEUM
+ 0x868D: 0xB0FD, //HANGUL SYLLABLE NIEUN YAE PIEUP
+ 0x868E: 0xB0FE, //HANGUL SYLLABLE NIEUN YAE PIEUPSIOS
+ 0x868F: 0xB0FF, //HANGUL SYLLABLE NIEUN YAE SIOS
+ 0x8690: 0xB100, //HANGUL SYLLABLE NIEUN YAE SSANGSIOS
+ 0x8691: 0xB101, //HANGUL SYLLABLE NIEUN YAE IEUNG
+ 0x8692: 0xB102, //HANGUL SYLLABLE NIEUN YAE CIEUC
+ 0x8693: 0xB103, //HANGUL SYLLABLE NIEUN YAE CHIEUCH
+ 0x8694: 0xB104, //HANGUL SYLLABLE NIEUN YAE KHIEUKH
+ 0x8695: 0xB105, //HANGUL SYLLABLE NIEUN YAE THIEUTH
+ 0x8696: 0xB106, //HANGUL SYLLABLE NIEUN YAE PHIEUPH
+ 0x8697: 0xB107, //HANGUL SYLLABLE NIEUN YAE HIEUH
+ 0x8698: 0xB10A, //HANGUL SYLLABLE NIEUN EO SSANGKIYEOK
+ 0x8699: 0xB10D, //HANGUL SYLLABLE NIEUN EO NIEUNCIEUC
+ 0x869A: 0xB10E, //HANGUL SYLLABLE NIEUN EO NIEUNHIEUH
+ 0x869B: 0xB10F, //HANGUL SYLLABLE NIEUN EO TIKEUT
+ 0x869C: 0xB111, //HANGUL SYLLABLE NIEUN EO RIEULKIYEOK
+ 0x869D: 0xB114, //HANGUL SYLLABLE NIEUN EO RIEULSIOS
+ 0x869E: 0xB115, //HANGUL SYLLABLE NIEUN EO RIEULTHIEUTH
+ 0x869F: 0xB116, //HANGUL SYLLABLE NIEUN EO RIEULPHIEUPH
+ 0x86A0: 0xB117, //HANGUL SYLLABLE NIEUN EO RIEULHIEUH
+ 0x86A1: 0xB11A, //HANGUL SYLLABLE NIEUN EO PIEUPSIOS
+ 0x86A2: 0xB11E, //HANGUL SYLLABLE NIEUN EO CIEUC
+ 0x86A3: 0xB11F, //HANGUL SYLLABLE NIEUN EO CHIEUCH
+ 0x86A4: 0xB120, //HANGUL SYLLABLE NIEUN EO KHIEUKH
+ 0x86A5: 0xB121, //HANGUL SYLLABLE NIEUN EO THIEUTH
+ 0x86A6: 0xB122, //HANGUL SYLLABLE NIEUN EO PHIEUPH
+ 0x86A7: 0xB126, //HANGUL SYLLABLE NIEUN E SSANGKIYEOK
+ 0x86A8: 0xB127, //HANGUL SYLLABLE NIEUN E KIYEOKSIOS
+ 0x86A9: 0xB129, //HANGUL SYLLABLE NIEUN E NIEUNCIEUC
+ 0x86AA: 0xB12A, //HANGUL SYLLABLE NIEUN E NIEUNHIEUH
+ 0x86AB: 0xB12B, //HANGUL SYLLABLE NIEUN E TIKEUT
+ 0x86AC: 0xB12D, //HANGUL SYLLABLE NIEUN E RIEULKIYEOK
+ 0x86AD: 0xB12E, //HANGUL SYLLABLE NIEUN E RIEULMIEUM
+ 0x86AE: 0xB12F, //HANGUL SYLLABLE NIEUN E RIEULPIEUP
+ 0x86AF: 0xB130, //HANGUL SYLLABLE NIEUN E RIEULSIOS
+ 0x86B0: 0xB131, //HANGUL SYLLABLE NIEUN E RIEULTHIEUTH
+ 0x86B1: 0xB132, //HANGUL SYLLABLE NIEUN E RIEULPHIEUPH
+ 0x86B2: 0xB133, //HANGUL SYLLABLE NIEUN E RIEULHIEUH
+ 0x86B3: 0xB136, //HANGUL SYLLABLE NIEUN E PIEUPSIOS
+ 0x86B4: 0xB13A, //HANGUL SYLLABLE NIEUN E CIEUC
+ 0x86B5: 0xB13B, //HANGUL SYLLABLE NIEUN E CHIEUCH
+ 0x86B6: 0xB13C, //HANGUL SYLLABLE NIEUN E KHIEUKH
+ 0x86B7: 0xB13D, //HANGUL SYLLABLE NIEUN E THIEUTH
+ 0x86B8: 0xB13E, //HANGUL SYLLABLE NIEUN E PHIEUPH
+ 0x86B9: 0xB13F, //HANGUL SYLLABLE NIEUN E HIEUH
+ 0x86BA: 0xB142, //HANGUL SYLLABLE NIEUN YEO SSANGKIYEOK
+ 0x86BB: 0xB143, //HANGUL SYLLABLE NIEUN YEO KIYEOKSIOS
+ 0x86BC: 0xB145, //HANGUL SYLLABLE NIEUN YEO NIEUNCIEUC
+ 0x86BD: 0xB146, //HANGUL SYLLABLE NIEUN YEO NIEUNHIEUH
+ 0x86BE: 0xB147, //HANGUL SYLLABLE NIEUN YEO TIKEUT
+ 0x86BF: 0xB149, //HANGUL SYLLABLE NIEUN YEO RIEULKIYEOK
+ 0x86C0: 0xB14A, //HANGUL SYLLABLE NIEUN YEO RIEULMIEUM
+ 0x86C1: 0xB14B, //HANGUL SYLLABLE NIEUN YEO RIEULPIEUP
+ 0x86C2: 0xB14C, //HANGUL SYLLABLE NIEUN YEO RIEULSIOS
+ 0x86C3: 0xB14D, //HANGUL SYLLABLE NIEUN YEO RIEULTHIEUTH
+ 0x86C4: 0xB14E, //HANGUL SYLLABLE NIEUN YEO RIEULPHIEUPH
+ 0x86C5: 0xB14F, //HANGUL SYLLABLE NIEUN YEO RIEULHIEUH
+ 0x86C6: 0xB152, //HANGUL SYLLABLE NIEUN YEO PIEUPSIOS
+ 0x86C7: 0xB153, //HANGUL SYLLABLE NIEUN YEO SIOS
+ 0x86C8: 0xB156, //HANGUL SYLLABLE NIEUN YEO CIEUC
+ 0x86C9: 0xB157, //HANGUL SYLLABLE NIEUN YEO CHIEUCH
+ 0x86CA: 0xB159, //HANGUL SYLLABLE NIEUN YEO THIEUTH
+ 0x86CB: 0xB15A, //HANGUL SYLLABLE NIEUN YEO PHIEUPH
+ 0x86CC: 0xB15B, //HANGUL SYLLABLE NIEUN YEO HIEUH
+ 0x86CD: 0xB15D, //HANGUL SYLLABLE NIEUN YE KIYEOK
+ 0x86CE: 0xB15E, //HANGUL SYLLABLE NIEUN YE SSANGKIYEOK
+ 0x86CF: 0xB15F, //HANGUL SYLLABLE NIEUN YE KIYEOKSIOS
+ 0x86D0: 0xB161, //HANGUL SYLLABLE NIEUN YE NIEUNCIEUC
+ 0x86D1: 0xB162, //HANGUL SYLLABLE NIEUN YE NIEUNHIEUH
+ 0x86D2: 0xB163, //HANGUL SYLLABLE NIEUN YE TIKEUT
+ 0x86D3: 0xB164, //HANGUL SYLLABLE NIEUN YE RIEUL
+ 0x86D4: 0xB165, //HANGUL SYLLABLE NIEUN YE RIEULKIYEOK
+ 0x86D5: 0xB166, //HANGUL SYLLABLE NIEUN YE RIEULMIEUM
+ 0x86D6: 0xB167, //HANGUL SYLLABLE NIEUN YE RIEULPIEUP
+ 0x86D7: 0xB168, //HANGUL SYLLABLE NIEUN YE RIEULSIOS
+ 0x86D8: 0xB169, //HANGUL SYLLABLE NIEUN YE RIEULTHIEUTH
+ 0x86D9: 0xB16A, //HANGUL SYLLABLE NIEUN YE RIEULPHIEUPH
+ 0x86DA: 0xB16B, //HANGUL SYLLABLE NIEUN YE RIEULHIEUH
+ 0x86DB: 0xB16C, //HANGUL SYLLABLE NIEUN YE MIEUM
+ 0x86DC: 0xB16D, //HANGUL SYLLABLE NIEUN YE PIEUP
+ 0x86DD: 0xB16E, //HANGUL SYLLABLE NIEUN YE PIEUPSIOS
+ 0x86DE: 0xB16F, //HANGUL SYLLABLE NIEUN YE SIOS
+ 0x86DF: 0xB170, //HANGUL SYLLABLE NIEUN YE SSANGSIOS
+ 0x86E0: 0xB171, //HANGUL SYLLABLE NIEUN YE IEUNG
+ 0x86E1: 0xB172, //HANGUL SYLLABLE NIEUN YE CIEUC
+ 0x86E2: 0xB173, //HANGUL SYLLABLE NIEUN YE CHIEUCH
+ 0x86E3: 0xB174, //HANGUL SYLLABLE NIEUN YE KHIEUKH
+ 0x86E4: 0xB175, //HANGUL SYLLABLE NIEUN YE THIEUTH
+ 0x86E5: 0xB176, //HANGUL SYLLABLE NIEUN YE PHIEUPH
+ 0x86E6: 0xB177, //HANGUL SYLLABLE NIEUN YE HIEUH
+ 0x86E7: 0xB17A, //HANGUL SYLLABLE NIEUN O SSANGKIYEOK
+ 0x86E8: 0xB17B, //HANGUL SYLLABLE NIEUN O KIYEOKSIOS
+ 0x86E9: 0xB17D, //HANGUL SYLLABLE NIEUN O NIEUNCIEUC
+ 0x86EA: 0xB17E, //HANGUL SYLLABLE NIEUN O NIEUNHIEUH
+ 0x86EB: 0xB17F, //HANGUL SYLLABLE NIEUN O TIKEUT
+ 0x86EC: 0xB181, //HANGUL SYLLABLE NIEUN O RIEULKIYEOK
+ 0x86ED: 0xB183, //HANGUL SYLLABLE NIEUN O RIEULPIEUP
+ 0x86EE: 0xB184, //HANGUL SYLLABLE NIEUN O RIEULSIOS
+ 0x86EF: 0xB185, //HANGUL SYLLABLE NIEUN O RIEULTHIEUTH
+ 0x86F0: 0xB186, //HANGUL SYLLABLE NIEUN O RIEULPHIEUPH
+ 0x86F1: 0xB187, //HANGUL SYLLABLE NIEUN O RIEULHIEUH
+ 0x86F2: 0xB18A, //HANGUL SYLLABLE NIEUN O PIEUPSIOS
+ 0x86F3: 0xB18C, //HANGUL SYLLABLE NIEUN O SSANGSIOS
+ 0x86F4: 0xB18E, //HANGUL SYLLABLE NIEUN O CIEUC
+ 0x86F5: 0xB18F, //HANGUL SYLLABLE NIEUN O CHIEUCH
+ 0x86F6: 0xB190, //HANGUL SYLLABLE NIEUN O KHIEUKH
+ 0x86F7: 0xB191, //HANGUL SYLLABLE NIEUN O THIEUTH
+ 0x86F8: 0xB195, //HANGUL SYLLABLE NIEUN WA KIYEOK
+ 0x86F9: 0xB196, //HANGUL SYLLABLE NIEUN WA SSANGKIYEOK
+ 0x86FA: 0xB197, //HANGUL SYLLABLE NIEUN WA KIYEOKSIOS
+ 0x86FB: 0xB199, //HANGUL SYLLABLE NIEUN WA NIEUNCIEUC
+ 0x86FC: 0xB19A, //HANGUL SYLLABLE NIEUN WA NIEUNHIEUH
+ 0x86FD: 0xB19B, //HANGUL SYLLABLE NIEUN WA TIKEUT
+ 0x86FE: 0xB19D, //HANGUL SYLLABLE NIEUN WA RIEULKIYEOK
+ 0x8741: 0xB19E, //HANGUL SYLLABLE NIEUN WA RIEULMIEUM
+ 0x8742: 0xB19F, //HANGUL SYLLABLE NIEUN WA RIEULPIEUP
+ 0x8743: 0xB1A0, //HANGUL SYLLABLE NIEUN WA RIEULSIOS
+ 0x8744: 0xB1A1, //HANGUL SYLLABLE NIEUN WA RIEULTHIEUTH
+ 0x8745: 0xB1A2, //HANGUL SYLLABLE NIEUN WA RIEULPHIEUPH
+ 0x8746: 0xB1A3, //HANGUL SYLLABLE NIEUN WA RIEULHIEUH
+ 0x8747: 0xB1A4, //HANGUL SYLLABLE NIEUN WA MIEUM
+ 0x8748: 0xB1A5, //HANGUL SYLLABLE NIEUN WA PIEUP
+ 0x8749: 0xB1A6, //HANGUL SYLLABLE NIEUN WA PIEUPSIOS
+ 0x874A: 0xB1A7, //HANGUL SYLLABLE NIEUN WA SIOS
+ 0x874B: 0xB1A9, //HANGUL SYLLABLE NIEUN WA IEUNG
+ 0x874C: 0xB1AA, //HANGUL SYLLABLE NIEUN WA CIEUC
+ 0x874D: 0xB1AB, //HANGUL SYLLABLE NIEUN WA CHIEUCH
+ 0x874E: 0xB1AC, //HANGUL SYLLABLE NIEUN WA KHIEUKH
+ 0x874F: 0xB1AD, //HANGUL SYLLABLE NIEUN WA THIEUTH
+ 0x8750: 0xB1AE, //HANGUL SYLLABLE NIEUN WA PHIEUPH
+ 0x8751: 0xB1AF, //HANGUL SYLLABLE NIEUN WA HIEUH
+ 0x8752: 0xB1B0, //HANGUL SYLLABLE NIEUN WAE
+ 0x8753: 0xB1B1, //HANGUL SYLLABLE NIEUN WAE KIYEOK
+ 0x8754: 0xB1B2, //HANGUL SYLLABLE NIEUN WAE SSANGKIYEOK
+ 0x8755: 0xB1B3, //HANGUL SYLLABLE NIEUN WAE KIYEOKSIOS
+ 0x8756: 0xB1B4, //HANGUL SYLLABLE NIEUN WAE NIEUN
+ 0x8757: 0xB1B5, //HANGUL SYLLABLE NIEUN WAE NIEUNCIEUC
+ 0x8758: 0xB1B6, //HANGUL SYLLABLE NIEUN WAE NIEUNHIEUH
+ 0x8759: 0xB1B7, //HANGUL SYLLABLE NIEUN WAE TIKEUT
+ 0x875A: 0xB1B8, //HANGUL SYLLABLE NIEUN WAE RIEUL
+ 0x8761: 0xB1B9, //HANGUL SYLLABLE NIEUN WAE RIEULKIYEOK
+ 0x8762: 0xB1BA, //HANGUL SYLLABLE NIEUN WAE RIEULMIEUM
+ 0x8763: 0xB1BB, //HANGUL SYLLABLE NIEUN WAE RIEULPIEUP
+ 0x8764: 0xB1BC, //HANGUL SYLLABLE NIEUN WAE RIEULSIOS
+ 0x8765: 0xB1BD, //HANGUL SYLLABLE NIEUN WAE RIEULTHIEUTH
+ 0x8766: 0xB1BE, //HANGUL SYLLABLE NIEUN WAE RIEULPHIEUPH
+ 0x8767: 0xB1BF, //HANGUL SYLLABLE NIEUN WAE RIEULHIEUH
+ 0x8768: 0xB1C0, //HANGUL SYLLABLE NIEUN WAE MIEUM
+ 0x8769: 0xB1C1, //HANGUL SYLLABLE NIEUN WAE PIEUP
+ 0x876A: 0xB1C2, //HANGUL SYLLABLE NIEUN WAE PIEUPSIOS
+ 0x876B: 0xB1C3, //HANGUL SYLLABLE NIEUN WAE SIOS
+ 0x876C: 0xB1C4, //HANGUL SYLLABLE NIEUN WAE SSANGSIOS
+ 0x876D: 0xB1C5, //HANGUL SYLLABLE NIEUN WAE IEUNG
+ 0x876E: 0xB1C6, //HANGUL SYLLABLE NIEUN WAE CIEUC
+ 0x876F: 0xB1C7, //HANGUL SYLLABLE NIEUN WAE CHIEUCH
+ 0x8770: 0xB1C8, //HANGUL SYLLABLE NIEUN WAE KHIEUKH
+ 0x8771: 0xB1C9, //HANGUL SYLLABLE NIEUN WAE THIEUTH
+ 0x8772: 0xB1CA, //HANGUL SYLLABLE NIEUN WAE PHIEUPH
+ 0x8773: 0xB1CB, //HANGUL SYLLABLE NIEUN WAE HIEUH
+ 0x8774: 0xB1CD, //HANGUL SYLLABLE NIEUN OE KIYEOK
+ 0x8775: 0xB1CE, //HANGUL SYLLABLE NIEUN OE SSANGKIYEOK
+ 0x8776: 0xB1CF, //HANGUL SYLLABLE NIEUN OE KIYEOKSIOS
+ 0x8777: 0xB1D1, //HANGUL SYLLABLE NIEUN OE NIEUNCIEUC
+ 0x8778: 0xB1D2, //HANGUL SYLLABLE NIEUN OE NIEUNHIEUH
+ 0x8779: 0xB1D3, //HANGUL SYLLABLE NIEUN OE TIKEUT
+ 0x877A: 0xB1D5, //HANGUL SYLLABLE NIEUN OE RIEULKIYEOK
+ 0x8781: 0xB1D6, //HANGUL SYLLABLE NIEUN OE RIEULMIEUM
+ 0x8782: 0xB1D7, //HANGUL SYLLABLE NIEUN OE RIEULPIEUP
+ 0x8783: 0xB1D8, //HANGUL SYLLABLE NIEUN OE RIEULSIOS
+ 0x8784: 0xB1D9, //HANGUL SYLLABLE NIEUN OE RIEULTHIEUTH
+ 0x8785: 0xB1DA, //HANGUL SYLLABLE NIEUN OE RIEULPHIEUPH
+ 0x8786: 0xB1DB, //HANGUL SYLLABLE NIEUN OE RIEULHIEUH
+ 0x8787: 0xB1DE, //HANGUL SYLLABLE NIEUN OE PIEUPSIOS
+ 0x8788: 0xB1E0, //HANGUL SYLLABLE NIEUN OE SSANGSIOS
+ 0x8789: 0xB1E1, //HANGUL SYLLABLE NIEUN OE IEUNG
+ 0x878A: 0xB1E2, //HANGUL SYLLABLE NIEUN OE CIEUC
+ 0x878B: 0xB1E3, //HANGUL SYLLABLE NIEUN OE CHIEUCH
+ 0x878C: 0xB1E4, //HANGUL SYLLABLE NIEUN OE KHIEUKH
+ 0x878D: 0xB1E5, //HANGUL SYLLABLE NIEUN OE THIEUTH
+ 0x878E: 0xB1E6, //HANGUL SYLLABLE NIEUN OE PHIEUPH
+ 0x878F: 0xB1E7, //HANGUL SYLLABLE NIEUN OE HIEUH
+ 0x8790: 0xB1EA, //HANGUL SYLLABLE NIEUN YO SSANGKIYEOK
+ 0x8791: 0xB1EB, //HANGUL SYLLABLE NIEUN YO KIYEOKSIOS
+ 0x8792: 0xB1ED, //HANGUL SYLLABLE NIEUN YO NIEUNCIEUC
+ 0x8793: 0xB1EE, //HANGUL SYLLABLE NIEUN YO NIEUNHIEUH
+ 0x8794: 0xB1EF, //HANGUL SYLLABLE NIEUN YO TIKEUT
+ 0x8795: 0xB1F1, //HANGUL SYLLABLE NIEUN YO RIEULKIYEOK
+ 0x8796: 0xB1F2, //HANGUL SYLLABLE NIEUN YO RIEULMIEUM
+ 0x8797: 0xB1F3, //HANGUL SYLLABLE NIEUN YO RIEULPIEUP
+ 0x8798: 0xB1F4, //HANGUL SYLLABLE NIEUN YO RIEULSIOS
+ 0x8799: 0xB1F5, //HANGUL SYLLABLE NIEUN YO RIEULTHIEUTH
+ 0x879A: 0xB1F6, //HANGUL SYLLABLE NIEUN YO RIEULPHIEUPH
+ 0x879B: 0xB1F7, //HANGUL SYLLABLE NIEUN YO RIEULHIEUH
+ 0x879C: 0xB1F8, //HANGUL SYLLABLE NIEUN YO MIEUM
+ 0x879D: 0xB1FA, //HANGUL SYLLABLE NIEUN YO PIEUPSIOS
+ 0x879E: 0xB1FC, //HANGUL SYLLABLE NIEUN YO SSANGSIOS
+ 0x879F: 0xB1FE, //HANGUL SYLLABLE NIEUN YO CIEUC
+ 0x87A0: 0xB1FF, //HANGUL SYLLABLE NIEUN YO CHIEUCH
+ 0x87A1: 0xB200, //HANGUL SYLLABLE NIEUN YO KHIEUKH
+ 0x87A2: 0xB201, //HANGUL SYLLABLE NIEUN YO THIEUTH
+ 0x87A3: 0xB202, //HANGUL SYLLABLE NIEUN YO PHIEUPH
+ 0x87A4: 0xB203, //HANGUL SYLLABLE NIEUN YO HIEUH
+ 0x87A5: 0xB206, //HANGUL SYLLABLE NIEUN U SSANGKIYEOK
+ 0x87A6: 0xB207, //HANGUL SYLLABLE NIEUN U KIYEOKSIOS
+ 0x87A7: 0xB209, //HANGUL SYLLABLE NIEUN U NIEUNCIEUC
+ 0x87A8: 0xB20A, //HANGUL SYLLABLE NIEUN U NIEUNHIEUH
+ 0x87A9: 0xB20D, //HANGUL SYLLABLE NIEUN U RIEULKIYEOK
+ 0x87AA: 0xB20E, //HANGUL SYLLABLE NIEUN U RIEULMIEUM
+ 0x87AB: 0xB20F, //HANGUL SYLLABLE NIEUN U RIEULPIEUP
+ 0x87AC: 0xB210, //HANGUL SYLLABLE NIEUN U RIEULSIOS
+ 0x87AD: 0xB211, //HANGUL SYLLABLE NIEUN U RIEULTHIEUTH
+ 0x87AE: 0xB212, //HANGUL SYLLABLE NIEUN U RIEULPHIEUPH
+ 0x87AF: 0xB213, //HANGUL SYLLABLE NIEUN U RIEULHIEUH
+ 0x87B0: 0xB216, //HANGUL SYLLABLE NIEUN U PIEUPSIOS
+ 0x87B1: 0xB218, //HANGUL SYLLABLE NIEUN U SSANGSIOS
+ 0x87B2: 0xB21A, //HANGUL SYLLABLE NIEUN U CIEUC
+ 0x87B3: 0xB21B, //HANGUL SYLLABLE NIEUN U CHIEUCH
+ 0x87B4: 0xB21C, //HANGUL SYLLABLE NIEUN U KHIEUKH
+ 0x87B5: 0xB21D, //HANGUL SYLLABLE NIEUN U THIEUTH
+ 0x87B6: 0xB21E, //HANGUL SYLLABLE NIEUN U PHIEUPH
+ 0x87B7: 0xB21F, //HANGUL SYLLABLE NIEUN U HIEUH
+ 0x87B8: 0xB221, //HANGUL SYLLABLE NIEUN WEO KIYEOK
+ 0x87B9: 0xB222, //HANGUL SYLLABLE NIEUN WEO SSANGKIYEOK
+ 0x87BA: 0xB223, //HANGUL SYLLABLE NIEUN WEO KIYEOKSIOS
+ 0x87BB: 0xB224, //HANGUL SYLLABLE NIEUN WEO NIEUN
+ 0x87BC: 0xB225, //HANGUL SYLLABLE NIEUN WEO NIEUNCIEUC
+ 0x87BD: 0xB226, //HANGUL SYLLABLE NIEUN WEO NIEUNHIEUH
+ 0x87BE: 0xB227, //HANGUL SYLLABLE NIEUN WEO TIKEUT
+ 0x87BF: 0xB228, //HANGUL SYLLABLE NIEUN WEO RIEUL
+ 0x87C0: 0xB229, //HANGUL SYLLABLE NIEUN WEO RIEULKIYEOK
+ 0x87C1: 0xB22A, //HANGUL SYLLABLE NIEUN WEO RIEULMIEUM
+ 0x87C2: 0xB22B, //HANGUL SYLLABLE NIEUN WEO RIEULPIEUP
+ 0x87C3: 0xB22C, //HANGUL SYLLABLE NIEUN WEO RIEULSIOS
+ 0x87C4: 0xB22D, //HANGUL SYLLABLE NIEUN WEO RIEULTHIEUTH
+ 0x87C5: 0xB22E, //HANGUL SYLLABLE NIEUN WEO RIEULPHIEUPH
+ 0x87C6: 0xB22F, //HANGUL SYLLABLE NIEUN WEO RIEULHIEUH
+ 0x87C7: 0xB230, //HANGUL SYLLABLE NIEUN WEO MIEUM
+ 0x87C8: 0xB231, //HANGUL SYLLABLE NIEUN WEO PIEUP
+ 0x87C9: 0xB232, //HANGUL SYLLABLE NIEUN WEO PIEUPSIOS
+ 0x87CA: 0xB233, //HANGUL SYLLABLE NIEUN WEO SIOS
+ 0x87CB: 0xB235, //HANGUL SYLLABLE NIEUN WEO IEUNG
+ 0x87CC: 0xB236, //HANGUL SYLLABLE NIEUN WEO CIEUC
+ 0x87CD: 0xB237, //HANGUL SYLLABLE NIEUN WEO CHIEUCH
+ 0x87CE: 0xB238, //HANGUL SYLLABLE NIEUN WEO KHIEUKH
+ 0x87CF: 0xB239, //HANGUL SYLLABLE NIEUN WEO THIEUTH
+ 0x87D0: 0xB23A, //HANGUL SYLLABLE NIEUN WEO PHIEUPH
+ 0x87D1: 0xB23B, //HANGUL SYLLABLE NIEUN WEO HIEUH
+ 0x87D2: 0xB23D, //HANGUL SYLLABLE NIEUN WE KIYEOK
+ 0x87D3: 0xB23E, //HANGUL SYLLABLE NIEUN WE SSANGKIYEOK
+ 0x87D4: 0xB23F, //HANGUL SYLLABLE NIEUN WE KIYEOKSIOS
+ 0x87D5: 0xB240, //HANGUL SYLLABLE NIEUN WE NIEUN
+ 0x87D6: 0xB241, //HANGUL SYLLABLE NIEUN WE NIEUNCIEUC
+ 0x87D7: 0xB242, //HANGUL SYLLABLE NIEUN WE NIEUNHIEUH
+ 0x87D8: 0xB243, //HANGUL SYLLABLE NIEUN WE TIKEUT
+ 0x87D9: 0xB244, //HANGUL SYLLABLE NIEUN WE RIEUL
+ 0x87DA: 0xB245, //HANGUL SYLLABLE NIEUN WE RIEULKIYEOK
+ 0x87DB: 0xB246, //HANGUL SYLLABLE NIEUN WE RIEULMIEUM
+ 0x87DC: 0xB247, //HANGUL SYLLABLE NIEUN WE RIEULPIEUP
+ 0x87DD: 0xB248, //HANGUL SYLLABLE NIEUN WE RIEULSIOS
+ 0x87DE: 0xB249, //HANGUL SYLLABLE NIEUN WE RIEULTHIEUTH
+ 0x87DF: 0xB24A, //HANGUL SYLLABLE NIEUN WE RIEULPHIEUPH
+ 0x87E0: 0xB24B, //HANGUL SYLLABLE NIEUN WE RIEULHIEUH
+ 0x87E1: 0xB24C, //HANGUL SYLLABLE NIEUN WE MIEUM
+ 0x87E2: 0xB24D, //HANGUL SYLLABLE NIEUN WE PIEUP
+ 0x87E3: 0xB24E, //HANGUL SYLLABLE NIEUN WE PIEUPSIOS
+ 0x87E4: 0xB24F, //HANGUL SYLLABLE NIEUN WE SIOS
+ 0x87E5: 0xB250, //HANGUL SYLLABLE NIEUN WE SSANGSIOS
+ 0x87E6: 0xB251, //HANGUL SYLLABLE NIEUN WE IEUNG
+ 0x87E7: 0xB252, //HANGUL SYLLABLE NIEUN WE CIEUC
+ 0x87E8: 0xB253, //HANGUL SYLLABLE NIEUN WE CHIEUCH
+ 0x87E9: 0xB254, //HANGUL SYLLABLE NIEUN WE KHIEUKH
+ 0x87EA: 0xB255, //HANGUL SYLLABLE NIEUN WE THIEUTH
+ 0x87EB: 0xB256, //HANGUL SYLLABLE NIEUN WE PHIEUPH
+ 0x87EC: 0xB257, //HANGUL SYLLABLE NIEUN WE HIEUH
+ 0x87ED: 0xB259, //HANGUL SYLLABLE NIEUN WI KIYEOK
+ 0x87EE: 0xB25A, //HANGUL SYLLABLE NIEUN WI SSANGKIYEOK
+ 0x87EF: 0xB25B, //HANGUL SYLLABLE NIEUN WI KIYEOKSIOS
+ 0x87F0: 0xB25D, //HANGUL SYLLABLE NIEUN WI NIEUNCIEUC
+ 0x87F1: 0xB25E, //HANGUL SYLLABLE NIEUN WI NIEUNHIEUH
+ 0x87F2: 0xB25F, //HANGUL SYLLABLE NIEUN WI TIKEUT
+ 0x87F3: 0xB261, //HANGUL SYLLABLE NIEUN WI RIEULKIYEOK
+ 0x87F4: 0xB262, //HANGUL SYLLABLE NIEUN WI RIEULMIEUM
+ 0x87F5: 0xB263, //HANGUL SYLLABLE NIEUN WI RIEULPIEUP
+ 0x87F6: 0xB264, //HANGUL SYLLABLE NIEUN WI RIEULSIOS
+ 0x87F7: 0xB265, //HANGUL SYLLABLE NIEUN WI RIEULTHIEUTH
+ 0x87F8: 0xB266, //HANGUL SYLLABLE NIEUN WI RIEULPHIEUPH
+ 0x87F9: 0xB267, //HANGUL SYLLABLE NIEUN WI RIEULHIEUH
+ 0x87FA: 0xB26A, //HANGUL SYLLABLE NIEUN WI PIEUPSIOS
+ 0x87FB: 0xB26B, //HANGUL SYLLABLE NIEUN WI SIOS
+ 0x87FC: 0xB26C, //HANGUL SYLLABLE NIEUN WI SSANGSIOS
+ 0x87FD: 0xB26D, //HANGUL SYLLABLE NIEUN WI IEUNG
+ 0x87FE: 0xB26E, //HANGUL SYLLABLE NIEUN WI CIEUC
+ 0x8841: 0xB26F, //HANGUL SYLLABLE NIEUN WI CHIEUCH
+ 0x8842: 0xB270, //HANGUL SYLLABLE NIEUN WI KHIEUKH
+ 0x8843: 0xB271, //HANGUL SYLLABLE NIEUN WI THIEUTH
+ 0x8844: 0xB272, //HANGUL SYLLABLE NIEUN WI PHIEUPH
+ 0x8845: 0xB273, //HANGUL SYLLABLE NIEUN WI HIEUH
+ 0x8846: 0xB276, //HANGUL SYLLABLE NIEUN YU SSANGKIYEOK
+ 0x8847: 0xB277, //HANGUL SYLLABLE NIEUN YU KIYEOKSIOS
+ 0x8848: 0xB278, //HANGUL SYLLABLE NIEUN YU NIEUN
+ 0x8849: 0xB279, //HANGUL SYLLABLE NIEUN YU NIEUNCIEUC
+ 0x884A: 0xB27A, //HANGUL SYLLABLE NIEUN YU NIEUNHIEUH
+ 0x884B: 0xB27B, //HANGUL SYLLABLE NIEUN YU TIKEUT
+ 0x884C: 0xB27D, //HANGUL SYLLABLE NIEUN YU RIEULKIYEOK
+ 0x884D: 0xB27E, //HANGUL SYLLABLE NIEUN YU RIEULMIEUM
+ 0x884E: 0xB27F, //HANGUL SYLLABLE NIEUN YU RIEULPIEUP
+ 0x884F: 0xB280, //HANGUL SYLLABLE NIEUN YU RIEULSIOS
+ 0x8850: 0xB281, //HANGUL SYLLABLE NIEUN YU RIEULTHIEUTH
+ 0x8851: 0xB282, //HANGUL SYLLABLE NIEUN YU RIEULPHIEUPH
+ 0x8852: 0xB283, //HANGUL SYLLABLE NIEUN YU RIEULHIEUH
+ 0x8853: 0xB286, //HANGUL SYLLABLE NIEUN YU PIEUPSIOS
+ 0x8854: 0xB287, //HANGUL SYLLABLE NIEUN YU SIOS
+ 0x8855: 0xB288, //HANGUL SYLLABLE NIEUN YU SSANGSIOS
+ 0x8856: 0xB28A, //HANGUL SYLLABLE NIEUN YU CIEUC
+ 0x8857: 0xB28B, //HANGUL SYLLABLE NIEUN YU CHIEUCH
+ 0x8858: 0xB28C, //HANGUL SYLLABLE NIEUN YU KHIEUKH
+ 0x8859: 0xB28D, //HANGUL SYLLABLE NIEUN YU THIEUTH
+ 0x885A: 0xB28E, //HANGUL SYLLABLE NIEUN YU PHIEUPH
+ 0x8861: 0xB28F, //HANGUL SYLLABLE NIEUN YU HIEUH
+ 0x8862: 0xB292, //HANGUL SYLLABLE NIEUN EU SSANGKIYEOK
+ 0x8863: 0xB293, //HANGUL SYLLABLE NIEUN EU KIYEOKSIOS
+ 0x8864: 0xB295, //HANGUL SYLLABLE NIEUN EU NIEUNCIEUC
+ 0x8865: 0xB296, //HANGUL SYLLABLE NIEUN EU NIEUNHIEUH
+ 0x8866: 0xB297, //HANGUL SYLLABLE NIEUN EU TIKEUT
+ 0x8867: 0xB29B, //HANGUL SYLLABLE NIEUN EU RIEULPIEUP
+ 0x8868: 0xB29C, //HANGUL SYLLABLE NIEUN EU RIEULSIOS
+ 0x8869: 0xB29D, //HANGUL SYLLABLE NIEUN EU RIEULTHIEUTH
+ 0x886A: 0xB29E, //HANGUL SYLLABLE NIEUN EU RIEULPHIEUPH
+ 0x886B: 0xB29F, //HANGUL SYLLABLE NIEUN EU RIEULHIEUH
+ 0x886C: 0xB2A2, //HANGUL SYLLABLE NIEUN EU PIEUPSIOS
+ 0x886D: 0xB2A4, //HANGUL SYLLABLE NIEUN EU SSANGSIOS
+ 0x886E: 0xB2A7, //HANGUL SYLLABLE NIEUN EU CHIEUCH
+ 0x886F: 0xB2A8, //HANGUL SYLLABLE NIEUN EU KHIEUKH
+ 0x8870: 0xB2A9, //HANGUL SYLLABLE NIEUN EU THIEUTH
+ 0x8871: 0xB2AB, //HANGUL SYLLABLE NIEUN EU HIEUH
+ 0x8872: 0xB2AD, //HANGUL SYLLABLE NIEUN YI KIYEOK
+ 0x8873: 0xB2AE, //HANGUL SYLLABLE NIEUN YI SSANGKIYEOK
+ 0x8874: 0xB2AF, //HANGUL SYLLABLE NIEUN YI KIYEOKSIOS
+ 0x8875: 0xB2B1, //HANGUL SYLLABLE NIEUN YI NIEUNCIEUC
+ 0x8876: 0xB2B2, //HANGUL SYLLABLE NIEUN YI NIEUNHIEUH
+ 0x8877: 0xB2B3, //HANGUL SYLLABLE NIEUN YI TIKEUT
+ 0x8878: 0xB2B5, //HANGUL SYLLABLE NIEUN YI RIEULKIYEOK
+ 0x8879: 0xB2B6, //HANGUL SYLLABLE NIEUN YI RIEULMIEUM
+ 0x887A: 0xB2B7, //HANGUL SYLLABLE NIEUN YI RIEULPIEUP
+ 0x8881: 0xB2B8, //HANGUL SYLLABLE NIEUN YI RIEULSIOS
+ 0x8882: 0xB2B9, //HANGUL SYLLABLE NIEUN YI RIEULTHIEUTH
+ 0x8883: 0xB2BA, //HANGUL SYLLABLE NIEUN YI RIEULPHIEUPH
+ 0x8884: 0xB2BB, //HANGUL SYLLABLE NIEUN YI RIEULHIEUH
+ 0x8885: 0xB2BC, //HANGUL SYLLABLE NIEUN YI MIEUM
+ 0x8886: 0xB2BD, //HANGUL SYLLABLE NIEUN YI PIEUP
+ 0x8887: 0xB2BE, //HANGUL SYLLABLE NIEUN YI PIEUPSIOS
+ 0x8888: 0xB2BF, //HANGUL SYLLABLE NIEUN YI SIOS
+ 0x8889: 0xB2C0, //HANGUL SYLLABLE NIEUN YI SSANGSIOS
+ 0x888A: 0xB2C1, //HANGUL SYLLABLE NIEUN YI IEUNG
+ 0x888B: 0xB2C2, //HANGUL SYLLABLE NIEUN YI CIEUC
+ 0x888C: 0xB2C3, //HANGUL SYLLABLE NIEUN YI CHIEUCH
+ 0x888D: 0xB2C4, //HANGUL SYLLABLE NIEUN YI KHIEUKH
+ 0x888E: 0xB2C5, //HANGUL SYLLABLE NIEUN YI THIEUTH
+ 0x888F: 0xB2C6, //HANGUL SYLLABLE NIEUN YI PHIEUPH
+ 0x8890: 0xB2C7, //HANGUL SYLLABLE NIEUN YI HIEUH
+ 0x8891: 0xB2CA, //HANGUL SYLLABLE NIEUN I SSANGKIYEOK
+ 0x8892: 0xB2CB, //HANGUL SYLLABLE NIEUN I KIYEOKSIOS
+ 0x8893: 0xB2CD, //HANGUL SYLLABLE NIEUN I NIEUNCIEUC
+ 0x8894: 0xB2CE, //HANGUL SYLLABLE NIEUN I NIEUNHIEUH
+ 0x8895: 0xB2CF, //HANGUL SYLLABLE NIEUN I TIKEUT
+ 0x8896: 0xB2D1, //HANGUL SYLLABLE NIEUN I RIEULKIYEOK
+ 0x8897: 0xB2D3, //HANGUL SYLLABLE NIEUN I RIEULPIEUP
+ 0x8898: 0xB2D4, //HANGUL SYLLABLE NIEUN I RIEULSIOS
+ 0x8899: 0xB2D5, //HANGUL SYLLABLE NIEUN I RIEULTHIEUTH
+ 0x889A: 0xB2D6, //HANGUL SYLLABLE NIEUN I RIEULPHIEUPH
+ 0x889B: 0xB2D7, //HANGUL SYLLABLE NIEUN I RIEULHIEUH
+ 0x889C: 0xB2DA, //HANGUL SYLLABLE NIEUN I PIEUPSIOS
+ 0x889D: 0xB2DC, //HANGUL SYLLABLE NIEUN I SSANGSIOS
+ 0x889E: 0xB2DE, //HANGUL SYLLABLE NIEUN I CIEUC
+ 0x889F: 0xB2DF, //HANGUL SYLLABLE NIEUN I CHIEUCH
+ 0x88A0: 0xB2E0, //HANGUL SYLLABLE NIEUN I KHIEUKH
+ 0x88A1: 0xB2E1, //HANGUL SYLLABLE NIEUN I THIEUTH
+ 0x88A2: 0xB2E3, //HANGUL SYLLABLE NIEUN I HIEUH
+ 0x88A3: 0xB2E7, //HANGUL SYLLABLE TIKEUT A KIYEOKSIOS
+ 0x88A4: 0xB2E9, //HANGUL SYLLABLE TIKEUT A NIEUNCIEUC
+ 0x88A5: 0xB2EA, //HANGUL SYLLABLE TIKEUT A NIEUNHIEUH
+ 0x88A6: 0xB2F0, //HANGUL SYLLABLE TIKEUT A RIEULSIOS
+ 0x88A7: 0xB2F1, //HANGUL SYLLABLE TIKEUT A RIEULTHIEUTH
+ 0x88A8: 0xB2F2, //HANGUL SYLLABLE TIKEUT A RIEULPHIEUPH
+ 0x88A9: 0xB2F6, //HANGUL SYLLABLE TIKEUT A PIEUPSIOS
+ 0x88AA: 0xB2FC, //HANGUL SYLLABLE TIKEUT A KHIEUKH
+ 0x88AB: 0xB2FD, //HANGUL SYLLABLE TIKEUT A THIEUTH
+ 0x88AC: 0xB2FE, //HANGUL SYLLABLE TIKEUT A PHIEUPH
+ 0x88AD: 0xB302, //HANGUL SYLLABLE TIKEUT AE SSANGKIYEOK
+ 0x88AE: 0xB303, //HANGUL SYLLABLE TIKEUT AE KIYEOKSIOS
+ 0x88AF: 0xB305, //HANGUL SYLLABLE TIKEUT AE NIEUNCIEUC
+ 0x88B0: 0xB306, //HANGUL SYLLABLE TIKEUT AE NIEUNHIEUH
+ 0x88B1: 0xB307, //HANGUL SYLLABLE TIKEUT AE TIKEUT
+ 0x88B2: 0xB309, //HANGUL SYLLABLE TIKEUT AE RIEULKIYEOK
+ 0x88B3: 0xB30A, //HANGUL SYLLABLE TIKEUT AE RIEULMIEUM
+ 0x88B4: 0xB30B, //HANGUL SYLLABLE TIKEUT AE RIEULPIEUP
+ 0x88B5: 0xB30C, //HANGUL SYLLABLE TIKEUT AE RIEULSIOS
+ 0x88B6: 0xB30D, //HANGUL SYLLABLE TIKEUT AE RIEULTHIEUTH
+ 0x88B7: 0xB30E, //HANGUL SYLLABLE TIKEUT AE RIEULPHIEUPH
+ 0x88B8: 0xB30F, //HANGUL SYLLABLE TIKEUT AE RIEULHIEUH
+ 0x88B9: 0xB312, //HANGUL SYLLABLE TIKEUT AE PIEUPSIOS
+ 0x88BA: 0xB316, //HANGUL SYLLABLE TIKEUT AE CIEUC
+ 0x88BB: 0xB317, //HANGUL SYLLABLE TIKEUT AE CHIEUCH
+ 0x88BC: 0xB318, //HANGUL SYLLABLE TIKEUT AE KHIEUKH
+ 0x88BD: 0xB319, //HANGUL SYLLABLE TIKEUT AE THIEUTH
+ 0x88BE: 0xB31A, //HANGUL SYLLABLE TIKEUT AE PHIEUPH
+ 0x88BF: 0xB31B, //HANGUL SYLLABLE TIKEUT AE HIEUH
+ 0x88C0: 0xB31D, //HANGUL SYLLABLE TIKEUT YA KIYEOK
+ 0x88C1: 0xB31E, //HANGUL SYLLABLE TIKEUT YA SSANGKIYEOK
+ 0x88C2: 0xB31F, //HANGUL SYLLABLE TIKEUT YA KIYEOKSIOS
+ 0x88C3: 0xB320, //HANGUL SYLLABLE TIKEUT YA NIEUN
+ 0x88C4: 0xB321, //HANGUL SYLLABLE TIKEUT YA NIEUNCIEUC
+ 0x88C5: 0xB322, //HANGUL SYLLABLE TIKEUT YA NIEUNHIEUH
+ 0x88C6: 0xB323, //HANGUL SYLLABLE TIKEUT YA TIKEUT
+ 0x88C7: 0xB324, //HANGUL SYLLABLE TIKEUT YA RIEUL
+ 0x88C8: 0xB325, //HANGUL SYLLABLE TIKEUT YA RIEULKIYEOK
+ 0x88C9: 0xB326, //HANGUL SYLLABLE TIKEUT YA RIEULMIEUM
+ 0x88CA: 0xB327, //HANGUL SYLLABLE TIKEUT YA RIEULPIEUP
+ 0x88CB: 0xB328, //HANGUL SYLLABLE TIKEUT YA RIEULSIOS
+ 0x88CC: 0xB329, //HANGUL SYLLABLE TIKEUT YA RIEULTHIEUTH
+ 0x88CD: 0xB32A, //HANGUL SYLLABLE TIKEUT YA RIEULPHIEUPH
+ 0x88CE: 0xB32B, //HANGUL SYLLABLE TIKEUT YA RIEULHIEUH
+ 0x88CF: 0xB32C, //HANGUL SYLLABLE TIKEUT YA MIEUM
+ 0x88D0: 0xB32D, //HANGUL SYLLABLE TIKEUT YA PIEUP
+ 0x88D1: 0xB32E, //HANGUL SYLLABLE TIKEUT YA PIEUPSIOS
+ 0x88D2: 0xB32F, //HANGUL SYLLABLE TIKEUT YA SIOS
+ 0x88D3: 0xB330, //HANGUL SYLLABLE TIKEUT YA SSANGSIOS
+ 0x88D4: 0xB331, //HANGUL SYLLABLE TIKEUT YA IEUNG
+ 0x88D5: 0xB332, //HANGUL SYLLABLE TIKEUT YA CIEUC
+ 0x88D6: 0xB333, //HANGUL SYLLABLE TIKEUT YA CHIEUCH
+ 0x88D7: 0xB334, //HANGUL SYLLABLE TIKEUT YA KHIEUKH
+ 0x88D8: 0xB335, //HANGUL SYLLABLE TIKEUT YA THIEUTH
+ 0x88D9: 0xB336, //HANGUL SYLLABLE TIKEUT YA PHIEUPH
+ 0x88DA: 0xB337, //HANGUL SYLLABLE TIKEUT YA HIEUH
+ 0x88DB: 0xB338, //HANGUL SYLLABLE TIKEUT YAE
+ 0x88DC: 0xB339, //HANGUL SYLLABLE TIKEUT YAE KIYEOK
+ 0x88DD: 0xB33A, //HANGUL SYLLABLE TIKEUT YAE SSANGKIYEOK
+ 0x88DE: 0xB33B, //HANGUL SYLLABLE TIKEUT YAE KIYEOKSIOS
+ 0x88DF: 0xB33C, //HANGUL SYLLABLE TIKEUT YAE NIEUN
+ 0x88E0: 0xB33D, //HANGUL SYLLABLE TIKEUT YAE NIEUNCIEUC
+ 0x88E1: 0xB33E, //HANGUL SYLLABLE TIKEUT YAE NIEUNHIEUH
+ 0x88E2: 0xB33F, //HANGUL SYLLABLE TIKEUT YAE TIKEUT
+ 0x88E3: 0xB340, //HANGUL SYLLABLE TIKEUT YAE RIEUL
+ 0x88E4: 0xB341, //HANGUL SYLLABLE TIKEUT YAE RIEULKIYEOK
+ 0x88E5: 0xB342, //HANGUL SYLLABLE TIKEUT YAE RIEULMIEUM
+ 0x88E6: 0xB343, //HANGUL SYLLABLE TIKEUT YAE RIEULPIEUP
+ 0x88E7: 0xB344, //HANGUL SYLLABLE TIKEUT YAE RIEULSIOS
+ 0x88E8: 0xB345, //HANGUL SYLLABLE TIKEUT YAE RIEULTHIEUTH
+ 0x88E9: 0xB346, //HANGUL SYLLABLE TIKEUT YAE RIEULPHIEUPH
+ 0x88EA: 0xB347, //HANGUL SYLLABLE TIKEUT YAE RIEULHIEUH
+ 0x88EB: 0xB348, //HANGUL SYLLABLE TIKEUT YAE MIEUM
+ 0x88EC: 0xB349, //HANGUL SYLLABLE TIKEUT YAE PIEUP
+ 0x88ED: 0xB34A, //HANGUL SYLLABLE TIKEUT YAE PIEUPSIOS
+ 0x88EE: 0xB34B, //HANGUL SYLLABLE TIKEUT YAE SIOS
+ 0x88EF: 0xB34C, //HANGUL SYLLABLE TIKEUT YAE SSANGSIOS
+ 0x88F0: 0xB34D, //HANGUL SYLLABLE TIKEUT YAE IEUNG
+ 0x88F1: 0xB34E, //HANGUL SYLLABLE TIKEUT YAE CIEUC
+ 0x88F2: 0xB34F, //HANGUL SYLLABLE TIKEUT YAE CHIEUCH
+ 0x88F3: 0xB350, //HANGUL SYLLABLE TIKEUT YAE KHIEUKH
+ 0x88F4: 0xB351, //HANGUL SYLLABLE TIKEUT YAE THIEUTH
+ 0x88F5: 0xB352, //HANGUL SYLLABLE TIKEUT YAE PHIEUPH
+ 0x88F6: 0xB353, //HANGUL SYLLABLE TIKEUT YAE HIEUH
+ 0x88F7: 0xB357, //HANGUL SYLLABLE TIKEUT EO KIYEOKSIOS
+ 0x88F8: 0xB359, //HANGUL SYLLABLE TIKEUT EO NIEUNCIEUC
+ 0x88F9: 0xB35A, //HANGUL SYLLABLE TIKEUT EO NIEUNHIEUH
+ 0x88FA: 0xB35D, //HANGUL SYLLABLE TIKEUT EO RIEULKIYEOK
+ 0x88FB: 0xB360, //HANGUL SYLLABLE TIKEUT EO RIEULSIOS
+ 0x88FC: 0xB361, //HANGUL SYLLABLE TIKEUT EO RIEULTHIEUTH
+ 0x88FD: 0xB362, //HANGUL SYLLABLE TIKEUT EO RIEULPHIEUPH
+ 0x88FE: 0xB363, //HANGUL SYLLABLE TIKEUT EO RIEULHIEUH
+ 0x8941: 0xB366, //HANGUL SYLLABLE TIKEUT EO PIEUPSIOS
+ 0x8942: 0xB368, //HANGUL SYLLABLE TIKEUT EO SSANGSIOS
+ 0x8943: 0xB36A, //HANGUL SYLLABLE TIKEUT EO CIEUC
+ 0x8944: 0xB36C, //HANGUL SYLLABLE TIKEUT EO KHIEUKH
+ 0x8945: 0xB36D, //HANGUL SYLLABLE TIKEUT EO THIEUTH
+ 0x8946: 0xB36F, //HANGUL SYLLABLE TIKEUT EO HIEUH
+ 0x8947: 0xB372, //HANGUL SYLLABLE TIKEUT E SSANGKIYEOK
+ 0x8948: 0xB373, //HANGUL SYLLABLE TIKEUT E KIYEOKSIOS
+ 0x8949: 0xB375, //HANGUL SYLLABLE TIKEUT E NIEUNCIEUC
+ 0x894A: 0xB376, //HANGUL SYLLABLE TIKEUT E NIEUNHIEUH
+ 0x894B: 0xB377, //HANGUL SYLLABLE TIKEUT E TIKEUT
+ 0x894C: 0xB379, //HANGUL SYLLABLE TIKEUT E RIEULKIYEOK
+ 0x894D: 0xB37A, //HANGUL SYLLABLE TIKEUT E RIEULMIEUM
+ 0x894E: 0xB37B, //HANGUL SYLLABLE TIKEUT E RIEULPIEUP
+ 0x894F: 0xB37C, //HANGUL SYLLABLE TIKEUT E RIEULSIOS
+ 0x8950: 0xB37D, //HANGUL SYLLABLE TIKEUT E RIEULTHIEUTH
+ 0x8951: 0xB37E, //HANGUL SYLLABLE TIKEUT E RIEULPHIEUPH
+ 0x8952: 0xB37F, //HANGUL SYLLABLE TIKEUT E RIEULHIEUH
+ 0x8953: 0xB382, //HANGUL SYLLABLE TIKEUT E PIEUPSIOS
+ 0x8954: 0xB386, //HANGUL SYLLABLE TIKEUT E CIEUC
+ 0x8955: 0xB387, //HANGUL SYLLABLE TIKEUT E CHIEUCH
+ 0x8956: 0xB388, //HANGUL SYLLABLE TIKEUT E KHIEUKH
+ 0x8957: 0xB389, //HANGUL SYLLABLE TIKEUT E THIEUTH
+ 0x8958: 0xB38A, //HANGUL SYLLABLE TIKEUT E PHIEUPH
+ 0x8959: 0xB38B, //HANGUL SYLLABLE TIKEUT E HIEUH
+ 0x895A: 0xB38D, //HANGUL SYLLABLE TIKEUT YEO KIYEOK
+ 0x8961: 0xB38E, //HANGUL SYLLABLE TIKEUT YEO SSANGKIYEOK
+ 0x8962: 0xB38F, //HANGUL SYLLABLE TIKEUT YEO KIYEOKSIOS
+ 0x8963: 0xB391, //HANGUL SYLLABLE TIKEUT YEO NIEUNCIEUC
+ 0x8964: 0xB392, //HANGUL SYLLABLE TIKEUT YEO NIEUNHIEUH
+ 0x8965: 0xB393, //HANGUL SYLLABLE TIKEUT YEO TIKEUT
+ 0x8966: 0xB395, //HANGUL SYLLABLE TIKEUT YEO RIEULKIYEOK
+ 0x8967: 0xB396, //HANGUL SYLLABLE TIKEUT YEO RIEULMIEUM
+ 0x8968: 0xB397, //HANGUL SYLLABLE TIKEUT YEO RIEULPIEUP
+ 0x8969: 0xB398, //HANGUL SYLLABLE TIKEUT YEO RIEULSIOS
+ 0x896A: 0xB399, //HANGUL SYLLABLE TIKEUT YEO RIEULTHIEUTH
+ 0x896B: 0xB39A, //HANGUL SYLLABLE TIKEUT YEO RIEULPHIEUPH
+ 0x896C: 0xB39B, //HANGUL SYLLABLE TIKEUT YEO RIEULHIEUH
+ 0x896D: 0xB39C, //HANGUL SYLLABLE TIKEUT YEO MIEUM
+ 0x896E: 0xB39D, //HANGUL SYLLABLE TIKEUT YEO PIEUP
+ 0x896F: 0xB39E, //HANGUL SYLLABLE TIKEUT YEO PIEUPSIOS
+ 0x8970: 0xB39F, //HANGUL SYLLABLE TIKEUT YEO SIOS
+ 0x8971: 0xB3A2, //HANGUL SYLLABLE TIKEUT YEO CIEUC
+ 0x8972: 0xB3A3, //HANGUL SYLLABLE TIKEUT YEO CHIEUCH
+ 0x8973: 0xB3A4, //HANGUL SYLLABLE TIKEUT YEO KHIEUKH
+ 0x8974: 0xB3A5, //HANGUL SYLLABLE TIKEUT YEO THIEUTH
+ 0x8975: 0xB3A6, //HANGUL SYLLABLE TIKEUT YEO PHIEUPH
+ 0x8976: 0xB3A7, //HANGUL SYLLABLE TIKEUT YEO HIEUH
+ 0x8977: 0xB3A9, //HANGUL SYLLABLE TIKEUT YE KIYEOK
+ 0x8978: 0xB3AA, //HANGUL SYLLABLE TIKEUT YE SSANGKIYEOK
+ 0x8979: 0xB3AB, //HANGUL SYLLABLE TIKEUT YE KIYEOKSIOS
+ 0x897A: 0xB3AD, //HANGUL SYLLABLE TIKEUT YE NIEUNCIEUC
+ 0x8981: 0xB3AE, //HANGUL SYLLABLE TIKEUT YE NIEUNHIEUH
+ 0x8982: 0xB3AF, //HANGUL SYLLABLE TIKEUT YE TIKEUT
+ 0x8983: 0xB3B0, //HANGUL SYLLABLE TIKEUT YE RIEUL
+ 0x8984: 0xB3B1, //HANGUL SYLLABLE TIKEUT YE RIEULKIYEOK
+ 0x8985: 0xB3B2, //HANGUL SYLLABLE TIKEUT YE RIEULMIEUM
+ 0x8986: 0xB3B3, //HANGUL SYLLABLE TIKEUT YE RIEULPIEUP
+ 0x8987: 0xB3B4, //HANGUL SYLLABLE TIKEUT YE RIEULSIOS
+ 0x8988: 0xB3B5, //HANGUL SYLLABLE TIKEUT YE RIEULTHIEUTH
+ 0x8989: 0xB3B6, //HANGUL SYLLABLE TIKEUT YE RIEULPHIEUPH
+ 0x898A: 0xB3B7, //HANGUL SYLLABLE TIKEUT YE RIEULHIEUH
+ 0x898B: 0xB3B8, //HANGUL SYLLABLE TIKEUT YE MIEUM
+ 0x898C: 0xB3B9, //HANGUL SYLLABLE TIKEUT YE PIEUP
+ 0x898D: 0xB3BA, //HANGUL SYLLABLE TIKEUT YE PIEUPSIOS
+ 0x898E: 0xB3BB, //HANGUL SYLLABLE TIKEUT YE SIOS
+ 0x898F: 0xB3BC, //HANGUL SYLLABLE TIKEUT YE SSANGSIOS
+ 0x8990: 0xB3BD, //HANGUL SYLLABLE TIKEUT YE IEUNG
+ 0x8991: 0xB3BE, //HANGUL SYLLABLE TIKEUT YE CIEUC
+ 0x8992: 0xB3BF, //HANGUL SYLLABLE TIKEUT YE CHIEUCH
+ 0x8993: 0xB3C0, //HANGUL SYLLABLE TIKEUT YE KHIEUKH
+ 0x8994: 0xB3C1, //HANGUL SYLLABLE TIKEUT YE THIEUTH
+ 0x8995: 0xB3C2, //HANGUL SYLLABLE TIKEUT YE PHIEUPH
+ 0x8996: 0xB3C3, //HANGUL SYLLABLE TIKEUT YE HIEUH
+ 0x8997: 0xB3C6, //HANGUL SYLLABLE TIKEUT O SSANGKIYEOK
+ 0x8998: 0xB3C7, //HANGUL SYLLABLE TIKEUT O KIYEOKSIOS
+ 0x8999: 0xB3C9, //HANGUL SYLLABLE TIKEUT O NIEUNCIEUC
+ 0x899A: 0xB3CA, //HANGUL SYLLABLE TIKEUT O NIEUNHIEUH
+ 0x899B: 0xB3CD, //HANGUL SYLLABLE TIKEUT O RIEULKIYEOK
+ 0x899C: 0xB3CF, //HANGUL SYLLABLE TIKEUT O RIEULPIEUP
+ 0x899D: 0xB3D1, //HANGUL SYLLABLE TIKEUT O RIEULTHIEUTH
+ 0x899E: 0xB3D2, //HANGUL SYLLABLE TIKEUT O RIEULPHIEUPH
+ 0x899F: 0xB3D3, //HANGUL SYLLABLE TIKEUT O RIEULHIEUH
+ 0x89A0: 0xB3D6, //HANGUL SYLLABLE TIKEUT O PIEUPSIOS
+ 0x89A1: 0xB3D8, //HANGUL SYLLABLE TIKEUT O SSANGSIOS
+ 0x89A2: 0xB3DA, //HANGUL SYLLABLE TIKEUT O CIEUC
+ 0x89A3: 0xB3DC, //HANGUL SYLLABLE TIKEUT O KHIEUKH
+ 0x89A4: 0xB3DE, //HANGUL SYLLABLE TIKEUT O PHIEUPH
+ 0x89A5: 0xB3DF, //HANGUL SYLLABLE TIKEUT O HIEUH
+ 0x89A6: 0xB3E1, //HANGUL SYLLABLE TIKEUT WA KIYEOK
+ 0x89A7: 0xB3E2, //HANGUL SYLLABLE TIKEUT WA SSANGKIYEOK
+ 0x89A8: 0xB3E3, //HANGUL SYLLABLE TIKEUT WA KIYEOKSIOS
+ 0x89A9: 0xB3E5, //HANGUL SYLLABLE TIKEUT WA NIEUNCIEUC
+ 0x89AA: 0xB3E6, //HANGUL SYLLABLE TIKEUT WA NIEUNHIEUH
+ 0x89AB: 0xB3E7, //HANGUL SYLLABLE TIKEUT WA TIKEUT
+ 0x89AC: 0xB3E9, //HANGUL SYLLABLE TIKEUT WA RIEULKIYEOK
+ 0x89AD: 0xB3EA, //HANGUL SYLLABLE TIKEUT WA RIEULMIEUM
+ 0x89AE: 0xB3EB, //HANGUL SYLLABLE TIKEUT WA RIEULPIEUP
+ 0x89AF: 0xB3EC, //HANGUL SYLLABLE TIKEUT WA RIEULSIOS
+ 0x89B0: 0xB3ED, //HANGUL SYLLABLE TIKEUT WA RIEULTHIEUTH
+ 0x89B1: 0xB3EE, //HANGUL SYLLABLE TIKEUT WA RIEULPHIEUPH
+ 0x89B2: 0xB3EF, //HANGUL SYLLABLE TIKEUT WA RIEULHIEUH
+ 0x89B3: 0xB3F0, //HANGUL SYLLABLE TIKEUT WA MIEUM
+ 0x89B4: 0xB3F1, //HANGUL SYLLABLE TIKEUT WA PIEUP
+ 0x89B5: 0xB3F2, //HANGUL SYLLABLE TIKEUT WA PIEUPSIOS
+ 0x89B6: 0xB3F3, //HANGUL SYLLABLE TIKEUT WA SIOS
+ 0x89B7: 0xB3F4, //HANGUL SYLLABLE TIKEUT WA SSANGSIOS
+ 0x89B8: 0xB3F5, //HANGUL SYLLABLE TIKEUT WA IEUNG
+ 0x89B9: 0xB3F6, //HANGUL SYLLABLE TIKEUT WA CIEUC
+ 0x89BA: 0xB3F7, //HANGUL SYLLABLE TIKEUT WA CHIEUCH
+ 0x89BB: 0xB3F8, //HANGUL SYLLABLE TIKEUT WA KHIEUKH
+ 0x89BC: 0xB3F9, //HANGUL SYLLABLE TIKEUT WA THIEUTH
+ 0x89BD: 0xB3FA, //HANGUL SYLLABLE TIKEUT WA PHIEUPH
+ 0x89BE: 0xB3FB, //HANGUL SYLLABLE TIKEUT WA HIEUH
+ 0x89BF: 0xB3FD, //HANGUL SYLLABLE TIKEUT WAE KIYEOK
+ 0x89C0: 0xB3FE, //HANGUL SYLLABLE TIKEUT WAE SSANGKIYEOK
+ 0x89C1: 0xB3FF, //HANGUL SYLLABLE TIKEUT WAE KIYEOKSIOS
+ 0x89C2: 0xB400, //HANGUL SYLLABLE TIKEUT WAE NIEUN
+ 0x89C3: 0xB401, //HANGUL SYLLABLE TIKEUT WAE NIEUNCIEUC
+ 0x89C4: 0xB402, //HANGUL SYLLABLE TIKEUT WAE NIEUNHIEUH
+ 0x89C5: 0xB403, //HANGUL SYLLABLE TIKEUT WAE TIKEUT
+ 0x89C6: 0xB404, //HANGUL SYLLABLE TIKEUT WAE RIEUL
+ 0x89C7: 0xB405, //HANGUL SYLLABLE TIKEUT WAE RIEULKIYEOK
+ 0x89C8: 0xB406, //HANGUL SYLLABLE TIKEUT WAE RIEULMIEUM
+ 0x89C9: 0xB407, //HANGUL SYLLABLE TIKEUT WAE RIEULPIEUP
+ 0x89CA: 0xB408, //HANGUL SYLLABLE TIKEUT WAE RIEULSIOS
+ 0x89CB: 0xB409, //HANGUL SYLLABLE TIKEUT WAE RIEULTHIEUTH
+ 0x89CC: 0xB40A, //HANGUL SYLLABLE TIKEUT WAE RIEULPHIEUPH
+ 0x89CD: 0xB40B, //HANGUL SYLLABLE TIKEUT WAE RIEULHIEUH
+ 0x89CE: 0xB40C, //HANGUL SYLLABLE TIKEUT WAE MIEUM
+ 0x89CF: 0xB40D, //HANGUL SYLLABLE TIKEUT WAE PIEUP
+ 0x89D0: 0xB40E, //HANGUL SYLLABLE TIKEUT WAE PIEUPSIOS
+ 0x89D1: 0xB40F, //HANGUL SYLLABLE TIKEUT WAE SIOS
+ 0x89D2: 0xB411, //HANGUL SYLLABLE TIKEUT WAE IEUNG
+ 0x89D3: 0xB412, //HANGUL SYLLABLE TIKEUT WAE CIEUC
+ 0x89D4: 0xB413, //HANGUL SYLLABLE TIKEUT WAE CHIEUCH
+ 0x89D5: 0xB414, //HANGUL SYLLABLE TIKEUT WAE KHIEUKH
+ 0x89D6: 0xB415, //HANGUL SYLLABLE TIKEUT WAE THIEUTH
+ 0x89D7: 0xB416, //HANGUL SYLLABLE TIKEUT WAE PHIEUPH
+ 0x89D8: 0xB417, //HANGUL SYLLABLE TIKEUT WAE HIEUH
+ 0x89D9: 0xB419, //HANGUL SYLLABLE TIKEUT OE KIYEOK
+ 0x89DA: 0xB41A, //HANGUL SYLLABLE TIKEUT OE SSANGKIYEOK
+ 0x89DB: 0xB41B, //HANGUL SYLLABLE TIKEUT OE KIYEOKSIOS
+ 0x89DC: 0xB41D, //HANGUL SYLLABLE TIKEUT OE NIEUNCIEUC
+ 0x89DD: 0xB41E, //HANGUL SYLLABLE TIKEUT OE NIEUNHIEUH
+ 0x89DE: 0xB41F, //HANGUL SYLLABLE TIKEUT OE TIKEUT
+ 0x89DF: 0xB421, //HANGUL SYLLABLE TIKEUT OE RIEULKIYEOK
+ 0x89E0: 0xB422, //HANGUL SYLLABLE TIKEUT OE RIEULMIEUM
+ 0x89E1: 0xB423, //HANGUL SYLLABLE TIKEUT OE RIEULPIEUP
+ 0x89E2: 0xB424, //HANGUL SYLLABLE TIKEUT OE RIEULSIOS
+ 0x89E3: 0xB425, //HANGUL SYLLABLE TIKEUT OE RIEULTHIEUTH
+ 0x89E4: 0xB426, //HANGUL SYLLABLE TIKEUT OE RIEULPHIEUPH
+ 0x89E5: 0xB427, //HANGUL SYLLABLE TIKEUT OE RIEULHIEUH
+ 0x89E6: 0xB42A, //HANGUL SYLLABLE TIKEUT OE PIEUPSIOS
+ 0x89E7: 0xB42C, //HANGUL SYLLABLE TIKEUT OE SSANGSIOS
+ 0x89E8: 0xB42D, //HANGUL SYLLABLE TIKEUT OE IEUNG
+ 0x89E9: 0xB42E, //HANGUL SYLLABLE TIKEUT OE CIEUC
+ 0x89EA: 0xB42F, //HANGUL SYLLABLE TIKEUT OE CHIEUCH
+ 0x89EB: 0xB430, //HANGUL SYLLABLE TIKEUT OE KHIEUKH
+ 0x89EC: 0xB431, //HANGUL SYLLABLE TIKEUT OE THIEUTH
+ 0x89ED: 0xB432, //HANGUL SYLLABLE TIKEUT OE PHIEUPH
+ 0x89EE: 0xB433, //HANGUL SYLLABLE TIKEUT OE HIEUH
+ 0x89EF: 0xB435, //HANGUL SYLLABLE TIKEUT YO KIYEOK
+ 0x89F0: 0xB436, //HANGUL SYLLABLE TIKEUT YO SSANGKIYEOK
+ 0x89F1: 0xB437, //HANGUL SYLLABLE TIKEUT YO KIYEOKSIOS
+ 0x89F2: 0xB438, //HANGUL SYLLABLE TIKEUT YO NIEUN
+ 0x89F3: 0xB439, //HANGUL SYLLABLE TIKEUT YO NIEUNCIEUC
+ 0x89F4: 0xB43A, //HANGUL SYLLABLE TIKEUT YO NIEUNHIEUH
+ 0x89F5: 0xB43B, //HANGUL SYLLABLE TIKEUT YO TIKEUT
+ 0x89F6: 0xB43C, //HANGUL SYLLABLE TIKEUT YO RIEUL
+ 0x89F7: 0xB43D, //HANGUL SYLLABLE TIKEUT YO RIEULKIYEOK
+ 0x89F8: 0xB43E, //HANGUL SYLLABLE TIKEUT YO RIEULMIEUM
+ 0x89F9: 0xB43F, //HANGUL SYLLABLE TIKEUT YO RIEULPIEUP
+ 0x89FA: 0xB440, //HANGUL SYLLABLE TIKEUT YO RIEULSIOS
+ 0x89FB: 0xB441, //HANGUL SYLLABLE TIKEUT YO RIEULTHIEUTH
+ 0x89FC: 0xB442, //HANGUL SYLLABLE TIKEUT YO RIEULPHIEUPH
+ 0x89FD: 0xB443, //HANGUL SYLLABLE TIKEUT YO RIEULHIEUH
+ 0x89FE: 0xB444, //HANGUL SYLLABLE TIKEUT YO MIEUM
+ 0x8A41: 0xB445, //HANGUL SYLLABLE TIKEUT YO PIEUP
+ 0x8A42: 0xB446, //HANGUL SYLLABLE TIKEUT YO PIEUPSIOS
+ 0x8A43: 0xB447, //HANGUL SYLLABLE TIKEUT YO SIOS
+ 0x8A44: 0xB448, //HANGUL SYLLABLE TIKEUT YO SSANGSIOS
+ 0x8A45: 0xB449, //HANGUL SYLLABLE TIKEUT YO IEUNG
+ 0x8A46: 0xB44A, //HANGUL SYLLABLE TIKEUT YO CIEUC
+ 0x8A47: 0xB44B, //HANGUL SYLLABLE TIKEUT YO CHIEUCH
+ 0x8A48: 0xB44C, //HANGUL SYLLABLE TIKEUT YO KHIEUKH
+ 0x8A49: 0xB44D, //HANGUL SYLLABLE TIKEUT YO THIEUTH
+ 0x8A4A: 0xB44E, //HANGUL SYLLABLE TIKEUT YO PHIEUPH
+ 0x8A4B: 0xB44F, //HANGUL SYLLABLE TIKEUT YO HIEUH
+ 0x8A4C: 0xB452, //HANGUL SYLLABLE TIKEUT U SSANGKIYEOK
+ 0x8A4D: 0xB453, //HANGUL SYLLABLE TIKEUT U KIYEOKSIOS
+ 0x8A4E: 0xB455, //HANGUL SYLLABLE TIKEUT U NIEUNCIEUC
+ 0x8A4F: 0xB456, //HANGUL SYLLABLE TIKEUT U NIEUNHIEUH
+ 0x8A50: 0xB457, //HANGUL SYLLABLE TIKEUT U TIKEUT
+ 0x8A51: 0xB459, //HANGUL SYLLABLE TIKEUT U RIEULKIYEOK
+ 0x8A52: 0xB45A, //HANGUL SYLLABLE TIKEUT U RIEULMIEUM
+ 0x8A53: 0xB45B, //HANGUL SYLLABLE TIKEUT U RIEULPIEUP
+ 0x8A54: 0xB45C, //HANGUL SYLLABLE TIKEUT U RIEULSIOS
+ 0x8A55: 0xB45D, //HANGUL SYLLABLE TIKEUT U RIEULTHIEUTH
+ 0x8A56: 0xB45E, //HANGUL SYLLABLE TIKEUT U RIEULPHIEUPH
+ 0x8A57: 0xB45F, //HANGUL SYLLABLE TIKEUT U RIEULHIEUH
+ 0x8A58: 0xB462, //HANGUL SYLLABLE TIKEUT U PIEUPSIOS
+ 0x8A59: 0xB464, //HANGUL SYLLABLE TIKEUT U SSANGSIOS
+ 0x8A5A: 0xB466, //HANGUL SYLLABLE TIKEUT U CIEUC
+ 0x8A61: 0xB467, //HANGUL SYLLABLE TIKEUT U CHIEUCH
+ 0x8A62: 0xB468, //HANGUL SYLLABLE TIKEUT U KHIEUKH
+ 0x8A63: 0xB469, //HANGUL SYLLABLE TIKEUT U THIEUTH
+ 0x8A64: 0xB46A, //HANGUL SYLLABLE TIKEUT U PHIEUPH
+ 0x8A65: 0xB46B, //HANGUL SYLLABLE TIKEUT U HIEUH
+ 0x8A66: 0xB46D, //HANGUL SYLLABLE TIKEUT WEO KIYEOK
+ 0x8A67: 0xB46E, //HANGUL SYLLABLE TIKEUT WEO SSANGKIYEOK
+ 0x8A68: 0xB46F, //HANGUL SYLLABLE TIKEUT WEO KIYEOKSIOS
+ 0x8A69: 0xB470, //HANGUL SYLLABLE TIKEUT WEO NIEUN
+ 0x8A6A: 0xB471, //HANGUL SYLLABLE TIKEUT WEO NIEUNCIEUC
+ 0x8A6B: 0xB472, //HANGUL SYLLABLE TIKEUT WEO NIEUNHIEUH
+ 0x8A6C: 0xB473, //HANGUL SYLLABLE TIKEUT WEO TIKEUT
+ 0x8A6D: 0xB474, //HANGUL SYLLABLE TIKEUT WEO RIEUL
+ 0x8A6E: 0xB475, //HANGUL SYLLABLE TIKEUT WEO RIEULKIYEOK
+ 0x8A6F: 0xB476, //HANGUL SYLLABLE TIKEUT WEO RIEULMIEUM
+ 0x8A70: 0xB477, //HANGUL SYLLABLE TIKEUT WEO RIEULPIEUP
+ 0x8A71: 0xB478, //HANGUL SYLLABLE TIKEUT WEO RIEULSIOS
+ 0x8A72: 0xB479, //HANGUL SYLLABLE TIKEUT WEO RIEULTHIEUTH
+ 0x8A73: 0xB47A, //HANGUL SYLLABLE TIKEUT WEO RIEULPHIEUPH
+ 0x8A74: 0xB47B, //HANGUL SYLLABLE TIKEUT WEO RIEULHIEUH
+ 0x8A75: 0xB47C, //HANGUL SYLLABLE TIKEUT WEO MIEUM
+ 0x8A76: 0xB47D, //HANGUL SYLLABLE TIKEUT WEO PIEUP
+ 0x8A77: 0xB47E, //HANGUL SYLLABLE TIKEUT WEO PIEUPSIOS
+ 0x8A78: 0xB47F, //HANGUL SYLLABLE TIKEUT WEO SIOS
+ 0x8A79: 0xB481, //HANGUL SYLLABLE TIKEUT WEO IEUNG
+ 0x8A7A: 0xB482, //HANGUL SYLLABLE TIKEUT WEO CIEUC
+ 0x8A81: 0xB483, //HANGUL SYLLABLE TIKEUT WEO CHIEUCH
+ 0x8A82: 0xB484, //HANGUL SYLLABLE TIKEUT WEO KHIEUKH
+ 0x8A83: 0xB485, //HANGUL SYLLABLE TIKEUT WEO THIEUTH
+ 0x8A84: 0xB486, //HANGUL SYLLABLE TIKEUT WEO PHIEUPH
+ 0x8A85: 0xB487, //HANGUL SYLLABLE TIKEUT WEO HIEUH
+ 0x8A86: 0xB489, //HANGUL SYLLABLE TIKEUT WE KIYEOK
+ 0x8A87: 0xB48A, //HANGUL SYLLABLE TIKEUT WE SSANGKIYEOK
+ 0x8A88: 0xB48B, //HANGUL SYLLABLE TIKEUT WE KIYEOKSIOS
+ 0x8A89: 0xB48C, //HANGUL SYLLABLE TIKEUT WE NIEUN
+ 0x8A8A: 0xB48D, //HANGUL SYLLABLE TIKEUT WE NIEUNCIEUC
+ 0x8A8B: 0xB48E, //HANGUL SYLLABLE TIKEUT WE NIEUNHIEUH
+ 0x8A8C: 0xB48F, //HANGUL SYLLABLE TIKEUT WE TIKEUT
+ 0x8A8D: 0xB490, //HANGUL SYLLABLE TIKEUT WE RIEUL
+ 0x8A8E: 0xB491, //HANGUL SYLLABLE TIKEUT WE RIEULKIYEOK
+ 0x8A8F: 0xB492, //HANGUL SYLLABLE TIKEUT WE RIEULMIEUM
+ 0x8A90: 0xB493, //HANGUL SYLLABLE TIKEUT WE RIEULPIEUP
+ 0x8A91: 0xB494, //HANGUL SYLLABLE TIKEUT WE RIEULSIOS
+ 0x8A92: 0xB495, //HANGUL SYLLABLE TIKEUT WE RIEULTHIEUTH
+ 0x8A93: 0xB496, //HANGUL SYLLABLE TIKEUT WE RIEULPHIEUPH
+ 0x8A94: 0xB497, //HANGUL SYLLABLE TIKEUT WE RIEULHIEUH
+ 0x8A95: 0xB498, //HANGUL SYLLABLE TIKEUT WE MIEUM
+ 0x8A96: 0xB499, //HANGUL SYLLABLE TIKEUT WE PIEUP
+ 0x8A97: 0xB49A, //HANGUL SYLLABLE TIKEUT WE PIEUPSIOS
+ 0x8A98: 0xB49B, //HANGUL SYLLABLE TIKEUT WE SIOS
+ 0x8A99: 0xB49C, //HANGUL SYLLABLE TIKEUT WE SSANGSIOS
+ 0x8A9A: 0xB49E, //HANGUL SYLLABLE TIKEUT WE CIEUC
+ 0x8A9B: 0xB49F, //HANGUL SYLLABLE TIKEUT WE CHIEUCH
+ 0x8A9C: 0xB4A0, //HANGUL SYLLABLE TIKEUT WE KHIEUKH
+ 0x8A9D: 0xB4A1, //HANGUL SYLLABLE TIKEUT WE THIEUTH
+ 0x8A9E: 0xB4A2, //HANGUL SYLLABLE TIKEUT WE PHIEUPH
+ 0x8A9F: 0xB4A3, //HANGUL SYLLABLE TIKEUT WE HIEUH
+ 0x8AA0: 0xB4A5, //HANGUL SYLLABLE TIKEUT WI KIYEOK
+ 0x8AA1: 0xB4A6, //HANGUL SYLLABLE TIKEUT WI SSANGKIYEOK
+ 0x8AA2: 0xB4A7, //HANGUL SYLLABLE TIKEUT WI KIYEOKSIOS
+ 0x8AA3: 0xB4A9, //HANGUL SYLLABLE TIKEUT WI NIEUNCIEUC
+ 0x8AA4: 0xB4AA, //HANGUL SYLLABLE TIKEUT WI NIEUNHIEUH
+ 0x8AA5: 0xB4AB, //HANGUL SYLLABLE TIKEUT WI TIKEUT
+ 0x8AA6: 0xB4AD, //HANGUL SYLLABLE TIKEUT WI RIEULKIYEOK
+ 0x8AA7: 0xB4AE, //HANGUL SYLLABLE TIKEUT WI RIEULMIEUM
+ 0x8AA8: 0xB4AF, //HANGUL SYLLABLE TIKEUT WI RIEULPIEUP
+ 0x8AA9: 0xB4B0, //HANGUL SYLLABLE TIKEUT WI RIEULSIOS
+ 0x8AAA: 0xB4B1, //HANGUL SYLLABLE TIKEUT WI RIEULTHIEUTH
+ 0x8AAB: 0xB4B2, //HANGUL SYLLABLE TIKEUT WI RIEULPHIEUPH
+ 0x8AAC: 0xB4B3, //HANGUL SYLLABLE TIKEUT WI RIEULHIEUH
+ 0x8AAD: 0xB4B4, //HANGUL SYLLABLE TIKEUT WI MIEUM
+ 0x8AAE: 0xB4B6, //HANGUL SYLLABLE TIKEUT WI PIEUPSIOS
+ 0x8AAF: 0xB4B8, //HANGUL SYLLABLE TIKEUT WI SSANGSIOS
+ 0x8AB0: 0xB4BA, //HANGUL SYLLABLE TIKEUT WI CIEUC
+ 0x8AB1: 0xB4BB, //HANGUL SYLLABLE TIKEUT WI CHIEUCH
+ 0x8AB2: 0xB4BC, //HANGUL SYLLABLE TIKEUT WI KHIEUKH
+ 0x8AB3: 0xB4BD, //HANGUL SYLLABLE TIKEUT WI THIEUTH
+ 0x8AB4: 0xB4BE, //HANGUL SYLLABLE TIKEUT WI PHIEUPH
+ 0x8AB5: 0xB4BF, //HANGUL SYLLABLE TIKEUT WI HIEUH
+ 0x8AB6: 0xB4C1, //HANGUL SYLLABLE TIKEUT YU KIYEOK
+ 0x8AB7: 0xB4C2, //HANGUL SYLLABLE TIKEUT YU SSANGKIYEOK
+ 0x8AB8: 0xB4C3, //HANGUL SYLLABLE TIKEUT YU KIYEOKSIOS
+ 0x8AB9: 0xB4C5, //HANGUL SYLLABLE TIKEUT YU NIEUNCIEUC
+ 0x8ABA: 0xB4C6, //HANGUL SYLLABLE TIKEUT YU NIEUNHIEUH
+ 0x8ABB: 0xB4C7, //HANGUL SYLLABLE TIKEUT YU TIKEUT
+ 0x8ABC: 0xB4C9, //HANGUL SYLLABLE TIKEUT YU RIEULKIYEOK
+ 0x8ABD: 0xB4CA, //HANGUL SYLLABLE TIKEUT YU RIEULMIEUM
+ 0x8ABE: 0xB4CB, //HANGUL SYLLABLE TIKEUT YU RIEULPIEUP
+ 0x8ABF: 0xB4CC, //HANGUL SYLLABLE TIKEUT YU RIEULSIOS
+ 0x8AC0: 0xB4CD, //HANGUL SYLLABLE TIKEUT YU RIEULTHIEUTH
+ 0x8AC1: 0xB4CE, //HANGUL SYLLABLE TIKEUT YU RIEULPHIEUPH
+ 0x8AC2: 0xB4CF, //HANGUL SYLLABLE TIKEUT YU RIEULHIEUH
+ 0x8AC3: 0xB4D1, //HANGUL SYLLABLE TIKEUT YU PIEUP
+ 0x8AC4: 0xB4D2, //HANGUL SYLLABLE TIKEUT YU PIEUPSIOS
+ 0x8AC5: 0xB4D3, //HANGUL SYLLABLE TIKEUT YU SIOS
+ 0x8AC6: 0xB4D4, //HANGUL SYLLABLE TIKEUT YU SSANGSIOS
+ 0x8AC7: 0xB4D6, //HANGUL SYLLABLE TIKEUT YU CIEUC
+ 0x8AC8: 0xB4D7, //HANGUL SYLLABLE TIKEUT YU CHIEUCH
+ 0x8AC9: 0xB4D8, //HANGUL SYLLABLE TIKEUT YU KHIEUKH
+ 0x8ACA: 0xB4D9, //HANGUL SYLLABLE TIKEUT YU THIEUTH
+ 0x8ACB: 0xB4DA, //HANGUL SYLLABLE TIKEUT YU PHIEUPH
+ 0x8ACC: 0xB4DB, //HANGUL SYLLABLE TIKEUT YU HIEUH
+ 0x8ACD: 0xB4DE, //HANGUL SYLLABLE TIKEUT EU SSANGKIYEOK
+ 0x8ACE: 0xB4DF, //HANGUL SYLLABLE TIKEUT EU KIYEOKSIOS
+ 0x8ACF: 0xB4E1, //HANGUL SYLLABLE TIKEUT EU NIEUNCIEUC
+ 0x8AD0: 0xB4E2, //HANGUL SYLLABLE TIKEUT EU NIEUNHIEUH
+ 0x8AD1: 0xB4E5, //HANGUL SYLLABLE TIKEUT EU RIEULKIYEOK
+ 0x8AD2: 0xB4E7, //HANGUL SYLLABLE TIKEUT EU RIEULPIEUP
+ 0x8AD3: 0xB4E8, //HANGUL SYLLABLE TIKEUT EU RIEULSIOS
+ 0x8AD4: 0xB4E9, //HANGUL SYLLABLE TIKEUT EU RIEULTHIEUTH
+ 0x8AD5: 0xB4EA, //HANGUL SYLLABLE TIKEUT EU RIEULPHIEUPH
+ 0x8AD6: 0xB4EB, //HANGUL SYLLABLE TIKEUT EU RIEULHIEUH
+ 0x8AD7: 0xB4EE, //HANGUL SYLLABLE TIKEUT EU PIEUPSIOS
+ 0x8AD8: 0xB4F0, //HANGUL SYLLABLE TIKEUT EU SSANGSIOS
+ 0x8AD9: 0xB4F2, //HANGUL SYLLABLE TIKEUT EU CIEUC
+ 0x8ADA: 0xB4F3, //HANGUL SYLLABLE TIKEUT EU CHIEUCH
+ 0x8ADB: 0xB4F4, //HANGUL SYLLABLE TIKEUT EU KHIEUKH
+ 0x8ADC: 0xB4F5, //HANGUL SYLLABLE TIKEUT EU THIEUTH
+ 0x8ADD: 0xB4F6, //HANGUL SYLLABLE TIKEUT EU PHIEUPH
+ 0x8ADE: 0xB4F7, //HANGUL SYLLABLE TIKEUT EU HIEUH
+ 0x8ADF: 0xB4F9, //HANGUL SYLLABLE TIKEUT YI KIYEOK
+ 0x8AE0: 0xB4FA, //HANGUL SYLLABLE TIKEUT YI SSANGKIYEOK
+ 0x8AE1: 0xB4FB, //HANGUL SYLLABLE TIKEUT YI KIYEOKSIOS
+ 0x8AE2: 0xB4FC, //HANGUL SYLLABLE TIKEUT YI NIEUN
+ 0x8AE3: 0xB4FD, //HANGUL SYLLABLE TIKEUT YI NIEUNCIEUC
+ 0x8AE4: 0xB4FE, //HANGUL SYLLABLE TIKEUT YI NIEUNHIEUH
+ 0x8AE5: 0xB4FF, //HANGUL SYLLABLE TIKEUT YI TIKEUT
+ 0x8AE6: 0xB500, //HANGUL SYLLABLE TIKEUT YI RIEUL
+ 0x8AE7: 0xB501, //HANGUL SYLLABLE TIKEUT YI RIEULKIYEOK
+ 0x8AE8: 0xB502, //HANGUL SYLLABLE TIKEUT YI RIEULMIEUM
+ 0x8AE9: 0xB503, //HANGUL SYLLABLE TIKEUT YI RIEULPIEUP
+ 0x8AEA: 0xB504, //HANGUL SYLLABLE TIKEUT YI RIEULSIOS
+ 0x8AEB: 0xB505, //HANGUL SYLLABLE TIKEUT YI RIEULTHIEUTH
+ 0x8AEC: 0xB506, //HANGUL SYLLABLE TIKEUT YI RIEULPHIEUPH
+ 0x8AED: 0xB507, //HANGUL SYLLABLE TIKEUT YI RIEULHIEUH
+ 0x8AEE: 0xB508, //HANGUL SYLLABLE TIKEUT YI MIEUM
+ 0x8AEF: 0xB509, //HANGUL SYLLABLE TIKEUT YI PIEUP
+ 0x8AF0: 0xB50A, //HANGUL SYLLABLE TIKEUT YI PIEUPSIOS
+ 0x8AF1: 0xB50B, //HANGUL SYLLABLE TIKEUT YI SIOS
+ 0x8AF2: 0xB50C, //HANGUL SYLLABLE TIKEUT YI SSANGSIOS
+ 0x8AF3: 0xB50D, //HANGUL SYLLABLE TIKEUT YI IEUNG
+ 0x8AF4: 0xB50E, //HANGUL SYLLABLE TIKEUT YI CIEUC
+ 0x8AF5: 0xB50F, //HANGUL SYLLABLE TIKEUT YI CHIEUCH
+ 0x8AF6: 0xB510, //HANGUL SYLLABLE TIKEUT YI KHIEUKH
+ 0x8AF7: 0xB511, //HANGUL SYLLABLE TIKEUT YI THIEUTH
+ 0x8AF8: 0xB512, //HANGUL SYLLABLE TIKEUT YI PHIEUPH
+ 0x8AF9: 0xB513, //HANGUL SYLLABLE TIKEUT YI HIEUH
+ 0x8AFA: 0xB516, //HANGUL SYLLABLE TIKEUT I SSANGKIYEOK
+ 0x8AFB: 0xB517, //HANGUL SYLLABLE TIKEUT I KIYEOKSIOS
+ 0x8AFC: 0xB519, //HANGUL SYLLABLE TIKEUT I NIEUNCIEUC
+ 0x8AFD: 0xB51A, //HANGUL SYLLABLE TIKEUT I NIEUNHIEUH
+ 0x8AFE: 0xB51D, //HANGUL SYLLABLE TIKEUT I RIEULKIYEOK
+ 0x8B41: 0xB51E, //HANGUL SYLLABLE TIKEUT I RIEULMIEUM
+ 0x8B42: 0xB51F, //HANGUL SYLLABLE TIKEUT I RIEULPIEUP
+ 0x8B43: 0xB520, //HANGUL SYLLABLE TIKEUT I RIEULSIOS
+ 0x8B44: 0xB521, //HANGUL SYLLABLE TIKEUT I RIEULTHIEUTH
+ 0x8B45: 0xB522, //HANGUL SYLLABLE TIKEUT I RIEULPHIEUPH
+ 0x8B46: 0xB523, //HANGUL SYLLABLE TIKEUT I RIEULHIEUH
+ 0x8B47: 0xB526, //HANGUL SYLLABLE TIKEUT I PIEUPSIOS
+ 0x8B48: 0xB52B, //HANGUL SYLLABLE TIKEUT I CHIEUCH
+ 0x8B49: 0xB52C, //HANGUL SYLLABLE TIKEUT I KHIEUKH
+ 0x8B4A: 0xB52D, //HANGUL SYLLABLE TIKEUT I THIEUTH
+ 0x8B4B: 0xB52E, //HANGUL SYLLABLE TIKEUT I PHIEUPH
+ 0x8B4C: 0xB52F, //HANGUL SYLLABLE TIKEUT I HIEUH
+ 0x8B4D: 0xB532, //HANGUL SYLLABLE SSANGTIKEUT A SSANGKIYEOK
+ 0x8B4E: 0xB533, //HANGUL SYLLABLE SSANGTIKEUT A KIYEOKSIOS
+ 0x8B4F: 0xB535, //HANGUL SYLLABLE SSANGTIKEUT A NIEUNCIEUC
+ 0x8B50: 0xB536, //HANGUL SYLLABLE SSANGTIKEUT A NIEUNHIEUH
+ 0x8B51: 0xB537, //HANGUL SYLLABLE SSANGTIKEUT A TIKEUT
+ 0x8B52: 0xB539, //HANGUL SYLLABLE SSANGTIKEUT A RIEULKIYEOK
+ 0x8B53: 0xB53A, //HANGUL SYLLABLE SSANGTIKEUT A RIEULMIEUM
+ 0x8B54: 0xB53B, //HANGUL SYLLABLE SSANGTIKEUT A RIEULPIEUP
+ 0x8B55: 0xB53C, //HANGUL SYLLABLE SSANGTIKEUT A RIEULSIOS
+ 0x8B56: 0xB53D, //HANGUL SYLLABLE SSANGTIKEUT A RIEULTHIEUTH
+ 0x8B57: 0xB53E, //HANGUL SYLLABLE SSANGTIKEUT A RIEULPHIEUPH
+ 0x8B58: 0xB53F, //HANGUL SYLLABLE SSANGTIKEUT A RIEULHIEUH
+ 0x8B59: 0xB542, //HANGUL SYLLABLE SSANGTIKEUT A PIEUPSIOS
+ 0x8B5A: 0xB546, //HANGUL SYLLABLE SSANGTIKEUT A CIEUC
+ 0x8B61: 0xB547, //HANGUL SYLLABLE SSANGTIKEUT A CHIEUCH
+ 0x8B62: 0xB548, //HANGUL SYLLABLE SSANGTIKEUT A KHIEUKH
+ 0x8B63: 0xB549, //HANGUL SYLLABLE SSANGTIKEUT A THIEUTH
+ 0x8B64: 0xB54A, //HANGUL SYLLABLE SSANGTIKEUT A PHIEUPH
+ 0x8B65: 0xB54E, //HANGUL SYLLABLE SSANGTIKEUT AE SSANGKIYEOK
+ 0x8B66: 0xB54F, //HANGUL SYLLABLE SSANGTIKEUT AE KIYEOKSIOS
+ 0x8B67: 0xB551, //HANGUL SYLLABLE SSANGTIKEUT AE NIEUNCIEUC
+ 0x8B68: 0xB552, //HANGUL SYLLABLE SSANGTIKEUT AE NIEUNHIEUH
+ 0x8B69: 0xB553, //HANGUL SYLLABLE SSANGTIKEUT AE TIKEUT
+ 0x8B6A: 0xB555, //HANGUL SYLLABLE SSANGTIKEUT AE RIEULKIYEOK
+ 0x8B6B: 0xB556, //HANGUL SYLLABLE SSANGTIKEUT AE RIEULMIEUM
+ 0x8B6C: 0xB557, //HANGUL SYLLABLE SSANGTIKEUT AE RIEULPIEUP
+ 0x8B6D: 0xB558, //HANGUL SYLLABLE SSANGTIKEUT AE RIEULSIOS
+ 0x8B6E: 0xB559, //HANGUL SYLLABLE SSANGTIKEUT AE RIEULTHIEUTH
+ 0x8B6F: 0xB55A, //HANGUL SYLLABLE SSANGTIKEUT AE RIEULPHIEUPH
+ 0x8B70: 0xB55B, //HANGUL SYLLABLE SSANGTIKEUT AE RIEULHIEUH
+ 0x8B71: 0xB55E, //HANGUL SYLLABLE SSANGTIKEUT AE PIEUPSIOS
+ 0x8B72: 0xB562, //HANGUL SYLLABLE SSANGTIKEUT AE CIEUC
+ 0x8B73: 0xB563, //HANGUL SYLLABLE SSANGTIKEUT AE CHIEUCH
+ 0x8B74: 0xB564, //HANGUL SYLLABLE SSANGTIKEUT AE KHIEUKH
+ 0x8B75: 0xB565, //HANGUL SYLLABLE SSANGTIKEUT AE THIEUTH
+ 0x8B76: 0xB566, //HANGUL SYLLABLE SSANGTIKEUT AE PHIEUPH
+ 0x8B77: 0xB567, //HANGUL SYLLABLE SSANGTIKEUT AE HIEUH
+ 0x8B78: 0xB568, //HANGUL SYLLABLE SSANGTIKEUT YA
+ 0x8B79: 0xB569, //HANGUL SYLLABLE SSANGTIKEUT YA KIYEOK
+ 0x8B7A: 0xB56A, //HANGUL SYLLABLE SSANGTIKEUT YA SSANGKIYEOK
+ 0x8B81: 0xB56B, //HANGUL SYLLABLE SSANGTIKEUT YA KIYEOKSIOS
+ 0x8B82: 0xB56C, //HANGUL SYLLABLE SSANGTIKEUT YA NIEUN
+ 0x8B83: 0xB56D, //HANGUL SYLLABLE SSANGTIKEUT YA NIEUNCIEUC
+ 0x8B84: 0xB56E, //HANGUL SYLLABLE SSANGTIKEUT YA NIEUNHIEUH
+ 0x8B85: 0xB56F, //HANGUL SYLLABLE SSANGTIKEUT YA TIKEUT
+ 0x8B86: 0xB570, //HANGUL SYLLABLE SSANGTIKEUT YA RIEUL
+ 0x8B87: 0xB571, //HANGUL SYLLABLE SSANGTIKEUT YA RIEULKIYEOK
+ 0x8B88: 0xB572, //HANGUL SYLLABLE SSANGTIKEUT YA RIEULMIEUM
+ 0x8B89: 0xB573, //HANGUL SYLLABLE SSANGTIKEUT YA RIEULPIEUP
+ 0x8B8A: 0xB574, //HANGUL SYLLABLE SSANGTIKEUT YA RIEULSIOS
+ 0x8B8B: 0xB575, //HANGUL SYLLABLE SSANGTIKEUT YA RIEULTHIEUTH
+ 0x8B8C: 0xB576, //HANGUL SYLLABLE SSANGTIKEUT YA RIEULPHIEUPH
+ 0x8B8D: 0xB577, //HANGUL SYLLABLE SSANGTIKEUT YA RIEULHIEUH
+ 0x8B8E: 0xB578, //HANGUL SYLLABLE SSANGTIKEUT YA MIEUM
+ 0x8B8F: 0xB579, //HANGUL SYLLABLE SSANGTIKEUT YA PIEUP
+ 0x8B90: 0xB57A, //HANGUL SYLLABLE SSANGTIKEUT YA PIEUPSIOS
+ 0x8B91: 0xB57B, //HANGUL SYLLABLE SSANGTIKEUT YA SIOS
+ 0x8B92: 0xB57C, //HANGUL SYLLABLE SSANGTIKEUT YA SSANGSIOS
+ 0x8B93: 0xB57D, //HANGUL SYLLABLE SSANGTIKEUT YA IEUNG
+ 0x8B94: 0xB57E, //HANGUL SYLLABLE SSANGTIKEUT YA CIEUC
+ 0x8B95: 0xB57F, //HANGUL SYLLABLE SSANGTIKEUT YA CHIEUCH
+ 0x8B96: 0xB580, //HANGUL SYLLABLE SSANGTIKEUT YA KHIEUKH
+ 0x8B97: 0xB581, //HANGUL SYLLABLE SSANGTIKEUT YA THIEUTH
+ 0x8B98: 0xB582, //HANGUL SYLLABLE SSANGTIKEUT YA PHIEUPH
+ 0x8B99: 0xB583, //HANGUL SYLLABLE SSANGTIKEUT YA HIEUH
+ 0x8B9A: 0xB584, //HANGUL SYLLABLE SSANGTIKEUT YAE
+ 0x8B9B: 0xB585, //HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOK
+ 0x8B9C: 0xB586, //HANGUL SYLLABLE SSANGTIKEUT YAE SSANGKIYEOK
+ 0x8B9D: 0xB587, //HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOKSIOS
+ 0x8B9E: 0xB588, //HANGUL SYLLABLE SSANGTIKEUT YAE NIEUN
+ 0x8B9F: 0xB589, //HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNCIEUC
+ 0x8BA0: 0xB58A, //HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNHIEUH
+ 0x8BA1: 0xB58B, //HANGUL SYLLABLE SSANGTIKEUT YAE TIKEUT
+ 0x8BA2: 0xB58C, //HANGUL SYLLABLE SSANGTIKEUT YAE RIEUL
+ 0x8BA3: 0xB58D, //HANGUL SYLLABLE SSANGTIKEUT YAE RIEULKIYEOK
+ 0x8BA4: 0xB58E, //HANGUL SYLLABLE SSANGTIKEUT YAE RIEULMIEUM
+ 0x8BA5: 0xB58F, //HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPIEUP
+ 0x8BA6: 0xB590, //HANGUL SYLLABLE SSANGTIKEUT YAE RIEULSIOS
+ 0x8BA7: 0xB591, //HANGUL SYLLABLE SSANGTIKEUT YAE RIEULTHIEUTH
+ 0x8BA8: 0xB592, //HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPHIEUPH
+ 0x8BA9: 0xB593, //HANGUL SYLLABLE SSANGTIKEUT YAE RIEULHIEUH
+ 0x8BAA: 0xB594, //HANGUL SYLLABLE SSANGTIKEUT YAE MIEUM
+ 0x8BAB: 0xB595, //HANGUL SYLLABLE SSANGTIKEUT YAE PIEUP
+ 0x8BAC: 0xB596, //HANGUL SYLLABLE SSANGTIKEUT YAE PIEUPSIOS
+ 0x8BAD: 0xB597, //HANGUL SYLLABLE SSANGTIKEUT YAE SIOS
+ 0x8BAE: 0xB598, //HANGUL SYLLABLE SSANGTIKEUT YAE SSANGSIOS
+ 0x8BAF: 0xB599, //HANGUL SYLLABLE SSANGTIKEUT YAE IEUNG
+ 0x8BB0: 0xB59A, //HANGUL SYLLABLE SSANGTIKEUT YAE CIEUC
+ 0x8BB1: 0xB59B, //HANGUL SYLLABLE SSANGTIKEUT YAE CHIEUCH
+ 0x8BB2: 0xB59C, //HANGUL SYLLABLE SSANGTIKEUT YAE KHIEUKH
+ 0x8BB3: 0xB59D, //HANGUL SYLLABLE SSANGTIKEUT YAE THIEUTH
+ 0x8BB4: 0xB59E, //HANGUL SYLLABLE SSANGTIKEUT YAE PHIEUPH
+ 0x8BB5: 0xB59F, //HANGUL SYLLABLE SSANGTIKEUT YAE HIEUH
+ 0x8BB6: 0xB5A2, //HANGUL SYLLABLE SSANGTIKEUT EO SSANGKIYEOK
+ 0x8BB7: 0xB5A3, //HANGUL SYLLABLE SSANGTIKEUT EO KIYEOKSIOS
+ 0x8BB8: 0xB5A5, //HANGUL SYLLABLE SSANGTIKEUT EO NIEUNCIEUC
+ 0x8BB9: 0xB5A6, //HANGUL SYLLABLE SSANGTIKEUT EO NIEUNHIEUH
+ 0x8BBA: 0xB5A7, //HANGUL SYLLABLE SSANGTIKEUT EO TIKEUT
+ 0x8BBB: 0xB5A9, //HANGUL SYLLABLE SSANGTIKEUT EO RIEULKIYEOK
+ 0x8BBC: 0xB5AC, //HANGUL SYLLABLE SSANGTIKEUT EO RIEULSIOS
+ 0x8BBD: 0xB5AD, //HANGUL SYLLABLE SSANGTIKEUT EO RIEULTHIEUTH
+ 0x8BBE: 0xB5AE, //HANGUL SYLLABLE SSANGTIKEUT EO RIEULPHIEUPH
+ 0x8BBF: 0xB5AF, //HANGUL SYLLABLE SSANGTIKEUT EO RIEULHIEUH
+ 0x8BC0: 0xB5B2, //HANGUL SYLLABLE SSANGTIKEUT EO PIEUPSIOS
+ 0x8BC1: 0xB5B6, //HANGUL SYLLABLE SSANGTIKEUT EO CIEUC
+ 0x8BC2: 0xB5B7, //HANGUL SYLLABLE SSANGTIKEUT EO CHIEUCH
+ 0x8BC3: 0xB5B8, //HANGUL SYLLABLE SSANGTIKEUT EO KHIEUKH
+ 0x8BC4: 0xB5B9, //HANGUL SYLLABLE SSANGTIKEUT EO THIEUTH
+ 0x8BC5: 0xB5BA, //HANGUL SYLLABLE SSANGTIKEUT EO PHIEUPH
+ 0x8BC6: 0xB5BE, //HANGUL SYLLABLE SSANGTIKEUT E SSANGKIYEOK
+ 0x8BC7: 0xB5BF, //HANGUL SYLLABLE SSANGTIKEUT E KIYEOKSIOS
+ 0x8BC8: 0xB5C1, //HANGUL SYLLABLE SSANGTIKEUT E NIEUNCIEUC
+ 0x8BC9: 0xB5C2, //HANGUL SYLLABLE SSANGTIKEUT E NIEUNHIEUH
+ 0x8BCA: 0xB5C3, //HANGUL SYLLABLE SSANGTIKEUT E TIKEUT
+ 0x8BCB: 0xB5C5, //HANGUL SYLLABLE SSANGTIKEUT E RIEULKIYEOK
+ 0x8BCC: 0xB5C6, //HANGUL SYLLABLE SSANGTIKEUT E RIEULMIEUM
+ 0x8BCD: 0xB5C7, //HANGUL SYLLABLE SSANGTIKEUT E RIEULPIEUP
+ 0x8BCE: 0xB5C8, //HANGUL SYLLABLE SSANGTIKEUT E RIEULSIOS
+ 0x8BCF: 0xB5C9, //HANGUL SYLLABLE SSANGTIKEUT E RIEULTHIEUTH
+ 0x8BD0: 0xB5CA, //HANGUL SYLLABLE SSANGTIKEUT E RIEULPHIEUPH
+ 0x8BD1: 0xB5CB, //HANGUL SYLLABLE SSANGTIKEUT E RIEULHIEUH
+ 0x8BD2: 0xB5CE, //HANGUL SYLLABLE SSANGTIKEUT E PIEUPSIOS
+ 0x8BD3: 0xB5D2, //HANGUL SYLLABLE SSANGTIKEUT E CIEUC
+ 0x8BD4: 0xB5D3, //HANGUL SYLLABLE SSANGTIKEUT E CHIEUCH
+ 0x8BD5: 0xB5D4, //HANGUL SYLLABLE SSANGTIKEUT E KHIEUKH
+ 0x8BD6: 0xB5D5, //HANGUL SYLLABLE SSANGTIKEUT E THIEUTH
+ 0x8BD7: 0xB5D6, //HANGUL SYLLABLE SSANGTIKEUT E PHIEUPH
+ 0x8BD8: 0xB5D7, //HANGUL SYLLABLE SSANGTIKEUT E HIEUH
+ 0x8BD9: 0xB5D9, //HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOK
+ 0x8BDA: 0xB5DA, //HANGUL SYLLABLE SSANGTIKEUT YEO SSANGKIYEOK
+ 0x8BDB: 0xB5DB, //HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOKSIOS
+ 0x8BDC: 0xB5DC, //HANGUL SYLLABLE SSANGTIKEUT YEO NIEUN
+ 0x8BDD: 0xB5DD, //HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNCIEUC
+ 0x8BDE: 0xB5DE, //HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNHIEUH
+ 0x8BDF: 0xB5DF, //HANGUL SYLLABLE SSANGTIKEUT YEO TIKEUT
+ 0x8BE0: 0xB5E0, //HANGUL SYLLABLE SSANGTIKEUT YEO RIEUL
+ 0x8BE1: 0xB5E1, //HANGUL SYLLABLE SSANGTIKEUT YEO RIEULKIYEOK
+ 0x8BE2: 0xB5E2, //HANGUL SYLLABLE SSANGTIKEUT YEO RIEULMIEUM
+ 0x8BE3: 0xB5E3, //HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPIEUP
+ 0x8BE4: 0xB5E4, //HANGUL SYLLABLE SSANGTIKEUT YEO RIEULSIOS
+ 0x8BE5: 0xB5E5, //HANGUL SYLLABLE SSANGTIKEUT YEO RIEULTHIEUTH
+ 0x8BE6: 0xB5E6, //HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPHIEUPH
+ 0x8BE7: 0xB5E7, //HANGUL SYLLABLE SSANGTIKEUT YEO RIEULHIEUH
+ 0x8BE8: 0xB5E8, //HANGUL SYLLABLE SSANGTIKEUT YEO MIEUM
+ 0x8BE9: 0xB5E9, //HANGUL SYLLABLE SSANGTIKEUT YEO PIEUP
+ 0x8BEA: 0xB5EA, //HANGUL SYLLABLE SSANGTIKEUT YEO PIEUPSIOS
+ 0x8BEB: 0xB5EB, //HANGUL SYLLABLE SSANGTIKEUT YEO SIOS
+ 0x8BEC: 0xB5ED, //HANGUL SYLLABLE SSANGTIKEUT YEO IEUNG
+ 0x8BED: 0xB5EE, //HANGUL SYLLABLE SSANGTIKEUT YEO CIEUC
+ 0x8BEE: 0xB5EF, //HANGUL SYLLABLE SSANGTIKEUT YEO CHIEUCH
+ 0x8BEF: 0xB5F0, //HANGUL SYLLABLE SSANGTIKEUT YEO KHIEUKH
+ 0x8BF0: 0xB5F1, //HANGUL SYLLABLE SSANGTIKEUT YEO THIEUTH
+ 0x8BF1: 0xB5F2, //HANGUL SYLLABLE SSANGTIKEUT YEO PHIEUPH
+ 0x8BF2: 0xB5F3, //HANGUL SYLLABLE SSANGTIKEUT YEO HIEUH
+ 0x8BF3: 0xB5F4, //HANGUL SYLLABLE SSANGTIKEUT YE
+ 0x8BF4: 0xB5F5, //HANGUL SYLLABLE SSANGTIKEUT YE KIYEOK
+ 0x8BF5: 0xB5F6, //HANGUL SYLLABLE SSANGTIKEUT YE SSANGKIYEOK
+ 0x8BF6: 0xB5F7, //HANGUL SYLLABLE SSANGTIKEUT YE KIYEOKSIOS
+ 0x8BF7: 0xB5F8, //HANGUL SYLLABLE SSANGTIKEUT YE NIEUN
+ 0x8BF8: 0xB5F9, //HANGUL SYLLABLE SSANGTIKEUT YE NIEUNCIEUC
+ 0x8BF9: 0xB5FA, //HANGUL SYLLABLE SSANGTIKEUT YE NIEUNHIEUH
+ 0x8BFA: 0xB5FB, //HANGUL SYLLABLE SSANGTIKEUT YE TIKEUT
+ 0x8BFB: 0xB5FC, //HANGUL SYLLABLE SSANGTIKEUT YE RIEUL
+ 0x8BFC: 0xB5FD, //HANGUL SYLLABLE SSANGTIKEUT YE RIEULKIYEOK
+ 0x8BFD: 0xB5FE, //HANGUL SYLLABLE SSANGTIKEUT YE RIEULMIEUM
+ 0x8BFE: 0xB5FF, //HANGUL SYLLABLE SSANGTIKEUT YE RIEULPIEUP
+ 0x8C41: 0xB600, //HANGUL SYLLABLE SSANGTIKEUT YE RIEULSIOS
+ 0x8C42: 0xB601, //HANGUL SYLLABLE SSANGTIKEUT YE RIEULTHIEUTH
+ 0x8C43: 0xB602, //HANGUL SYLLABLE SSANGTIKEUT YE RIEULPHIEUPH
+ 0x8C44: 0xB603, //HANGUL SYLLABLE SSANGTIKEUT YE RIEULHIEUH
+ 0x8C45: 0xB604, //HANGUL SYLLABLE SSANGTIKEUT YE MIEUM
+ 0x8C46: 0xB605, //HANGUL SYLLABLE SSANGTIKEUT YE PIEUP
+ 0x8C47: 0xB606, //HANGUL SYLLABLE SSANGTIKEUT YE PIEUPSIOS
+ 0x8C48: 0xB607, //HANGUL SYLLABLE SSANGTIKEUT YE SIOS
+ 0x8C49: 0xB608, //HANGUL SYLLABLE SSANGTIKEUT YE SSANGSIOS
+ 0x8C4A: 0xB609, //HANGUL SYLLABLE SSANGTIKEUT YE IEUNG
+ 0x8C4B: 0xB60A, //HANGUL SYLLABLE SSANGTIKEUT YE CIEUC
+ 0x8C4C: 0xB60B, //HANGUL SYLLABLE SSANGTIKEUT YE CHIEUCH
+ 0x8C4D: 0xB60C, //HANGUL SYLLABLE SSANGTIKEUT YE KHIEUKH
+ 0x8C4E: 0xB60D, //HANGUL SYLLABLE SSANGTIKEUT YE THIEUTH
+ 0x8C4F: 0xB60E, //HANGUL SYLLABLE SSANGTIKEUT YE PHIEUPH
+ 0x8C50: 0xB60F, //HANGUL SYLLABLE SSANGTIKEUT YE HIEUH
+ 0x8C51: 0xB612, //HANGUL SYLLABLE SSANGTIKEUT O SSANGKIYEOK
+ 0x8C52: 0xB613, //HANGUL SYLLABLE SSANGTIKEUT O KIYEOKSIOS
+ 0x8C53: 0xB615, //HANGUL SYLLABLE SSANGTIKEUT O NIEUNCIEUC
+ 0x8C54: 0xB616, //HANGUL SYLLABLE SSANGTIKEUT O NIEUNHIEUH
+ 0x8C55: 0xB617, //HANGUL SYLLABLE SSANGTIKEUT O TIKEUT
+ 0x8C56: 0xB619, //HANGUL SYLLABLE SSANGTIKEUT O RIEULKIYEOK
+ 0x8C57: 0xB61A, //HANGUL SYLLABLE SSANGTIKEUT O RIEULMIEUM
+ 0x8C58: 0xB61B, //HANGUL SYLLABLE SSANGTIKEUT O RIEULPIEUP
+ 0x8C59: 0xB61C, //HANGUL SYLLABLE SSANGTIKEUT O RIEULSIOS
+ 0x8C5A: 0xB61D, //HANGUL SYLLABLE SSANGTIKEUT O RIEULTHIEUTH
+ 0x8C61: 0xB61E, //HANGUL SYLLABLE SSANGTIKEUT O RIEULPHIEUPH
+ 0x8C62: 0xB61F, //HANGUL SYLLABLE SSANGTIKEUT O RIEULHIEUH
+ 0x8C63: 0xB620, //HANGUL SYLLABLE SSANGTIKEUT O MIEUM
+ 0x8C64: 0xB621, //HANGUL SYLLABLE SSANGTIKEUT O PIEUP
+ 0x8C65: 0xB622, //HANGUL SYLLABLE SSANGTIKEUT O PIEUPSIOS
+ 0x8C66: 0xB623, //HANGUL SYLLABLE SSANGTIKEUT O SIOS
+ 0x8C67: 0xB624, //HANGUL SYLLABLE SSANGTIKEUT O SSANGSIOS
+ 0x8C68: 0xB626, //HANGUL SYLLABLE SSANGTIKEUT O CIEUC
+ 0x8C69: 0xB627, //HANGUL SYLLABLE SSANGTIKEUT O CHIEUCH
+ 0x8C6A: 0xB628, //HANGUL SYLLABLE SSANGTIKEUT O KHIEUKH
+ 0x8C6B: 0xB629, //HANGUL SYLLABLE SSANGTIKEUT O THIEUTH
+ 0x8C6C: 0xB62A, //HANGUL SYLLABLE SSANGTIKEUT O PHIEUPH
+ 0x8C6D: 0xB62B, //HANGUL SYLLABLE SSANGTIKEUT O HIEUH
+ 0x8C6E: 0xB62D, //HANGUL SYLLABLE SSANGTIKEUT WA KIYEOK
+ 0x8C6F: 0xB62E, //HANGUL SYLLABLE SSANGTIKEUT WA SSANGKIYEOK
+ 0x8C70: 0xB62F, //HANGUL SYLLABLE SSANGTIKEUT WA KIYEOKSIOS
+ 0x8C71: 0xB630, //HANGUL SYLLABLE SSANGTIKEUT WA NIEUN
+ 0x8C72: 0xB631, //HANGUL SYLLABLE SSANGTIKEUT WA NIEUNCIEUC
+ 0x8C73: 0xB632, //HANGUL SYLLABLE SSANGTIKEUT WA NIEUNHIEUH
+ 0x8C74: 0xB633, //HANGUL SYLLABLE SSANGTIKEUT WA TIKEUT
+ 0x8C75: 0xB635, //HANGUL SYLLABLE SSANGTIKEUT WA RIEULKIYEOK
+ 0x8C76: 0xB636, //HANGUL SYLLABLE SSANGTIKEUT WA RIEULMIEUM
+ 0x8C77: 0xB637, //HANGUL SYLLABLE SSANGTIKEUT WA RIEULPIEUP
+ 0x8C78: 0xB638, //HANGUL SYLLABLE SSANGTIKEUT WA RIEULSIOS
+ 0x8C79: 0xB639, //HANGUL SYLLABLE SSANGTIKEUT WA RIEULTHIEUTH
+ 0x8C7A: 0xB63A, //HANGUL SYLLABLE SSANGTIKEUT WA RIEULPHIEUPH
+ 0x8C81: 0xB63B, //HANGUL SYLLABLE SSANGTIKEUT WA RIEULHIEUH
+ 0x8C82: 0xB63C, //HANGUL SYLLABLE SSANGTIKEUT WA MIEUM
+ 0x8C83: 0xB63D, //HANGUL SYLLABLE SSANGTIKEUT WA PIEUP
+ 0x8C84: 0xB63E, //HANGUL SYLLABLE SSANGTIKEUT WA PIEUPSIOS
+ 0x8C85: 0xB63F, //HANGUL SYLLABLE SSANGTIKEUT WA SIOS
+ 0x8C86: 0xB640, //HANGUL SYLLABLE SSANGTIKEUT WA SSANGSIOS
+ 0x8C87: 0xB641, //HANGUL SYLLABLE SSANGTIKEUT WA IEUNG
+ 0x8C88: 0xB642, //HANGUL SYLLABLE SSANGTIKEUT WA CIEUC
+ 0x8C89: 0xB643, //HANGUL SYLLABLE SSANGTIKEUT WA CHIEUCH
+ 0x8C8A: 0xB644, //HANGUL SYLLABLE SSANGTIKEUT WA KHIEUKH
+ 0x8C8B: 0xB645, //HANGUL SYLLABLE SSANGTIKEUT WA THIEUTH
+ 0x8C8C: 0xB646, //HANGUL SYLLABLE SSANGTIKEUT WA PHIEUPH
+ 0x8C8D: 0xB647, //HANGUL SYLLABLE SSANGTIKEUT WA HIEUH
+ 0x8C8E: 0xB649, //HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOK
+ 0x8C8F: 0xB64A, //HANGUL SYLLABLE SSANGTIKEUT WAE SSANGKIYEOK
+ 0x8C90: 0xB64B, //HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOKSIOS
+ 0x8C91: 0xB64C, //HANGUL SYLLABLE SSANGTIKEUT WAE NIEUN
+ 0x8C92: 0xB64D, //HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNCIEUC
+ 0x8C93: 0xB64E, //HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNHIEUH
+ 0x8C94: 0xB64F, //HANGUL SYLLABLE SSANGTIKEUT WAE TIKEUT
+ 0x8C95: 0xB650, //HANGUL SYLLABLE SSANGTIKEUT WAE RIEUL
+ 0x8C96: 0xB651, //HANGUL SYLLABLE SSANGTIKEUT WAE RIEULKIYEOK
+ 0x8C97: 0xB652, //HANGUL SYLLABLE SSANGTIKEUT WAE RIEULMIEUM
+ 0x8C98: 0xB653, //HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPIEUP
+ 0x8C99: 0xB654, //HANGUL SYLLABLE SSANGTIKEUT WAE RIEULSIOS
+ 0x8C9A: 0xB655, //HANGUL SYLLABLE SSANGTIKEUT WAE RIEULTHIEUTH
+ 0x8C9B: 0xB656, //HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPHIEUPH
+ 0x8C9C: 0xB657, //HANGUL SYLLABLE SSANGTIKEUT WAE RIEULHIEUH
+ 0x8C9D: 0xB658, //HANGUL SYLLABLE SSANGTIKEUT WAE MIEUM
+ 0x8C9E: 0xB659, //HANGUL SYLLABLE SSANGTIKEUT WAE PIEUP
+ 0x8C9F: 0xB65A, //HANGUL SYLLABLE SSANGTIKEUT WAE PIEUPSIOS
+ 0x8CA0: 0xB65B, //HANGUL SYLLABLE SSANGTIKEUT WAE SIOS
+ 0x8CA1: 0xB65C, //HANGUL SYLLABLE SSANGTIKEUT WAE SSANGSIOS
+ 0x8CA2: 0xB65D, //HANGUL SYLLABLE SSANGTIKEUT WAE IEUNG
+ 0x8CA3: 0xB65E, //HANGUL SYLLABLE SSANGTIKEUT WAE CIEUC
+ 0x8CA4: 0xB65F, //HANGUL SYLLABLE SSANGTIKEUT WAE CHIEUCH
+ 0x8CA5: 0xB660, //HANGUL SYLLABLE SSANGTIKEUT WAE KHIEUKH
+ 0x8CA6: 0xB661, //HANGUL SYLLABLE SSANGTIKEUT WAE THIEUTH
+ 0x8CA7: 0xB662, //HANGUL SYLLABLE SSANGTIKEUT WAE PHIEUPH
+ 0x8CA8: 0xB663, //HANGUL SYLLABLE SSANGTIKEUT WAE HIEUH
+ 0x8CA9: 0xB665, //HANGUL SYLLABLE SSANGTIKEUT OE KIYEOK
+ 0x8CAA: 0xB666, //HANGUL SYLLABLE SSANGTIKEUT OE SSANGKIYEOK
+ 0x8CAB: 0xB667, //HANGUL SYLLABLE SSANGTIKEUT OE KIYEOKSIOS
+ 0x8CAC: 0xB669, //HANGUL SYLLABLE SSANGTIKEUT OE NIEUNCIEUC
+ 0x8CAD: 0xB66A, //HANGUL SYLLABLE SSANGTIKEUT OE NIEUNHIEUH
+ 0x8CAE: 0xB66B, //HANGUL SYLLABLE SSANGTIKEUT OE TIKEUT
+ 0x8CAF: 0xB66C, //HANGUL SYLLABLE SSANGTIKEUT OE RIEUL
+ 0x8CB0: 0xB66D, //HANGUL SYLLABLE SSANGTIKEUT OE RIEULKIYEOK
+ 0x8CB1: 0xB66E, //HANGUL SYLLABLE SSANGTIKEUT OE RIEULMIEUM
+ 0x8CB2: 0xB66F, //HANGUL SYLLABLE SSANGTIKEUT OE RIEULPIEUP
+ 0x8CB3: 0xB670, //HANGUL SYLLABLE SSANGTIKEUT OE RIEULSIOS
+ 0x8CB4: 0xB671, //HANGUL SYLLABLE SSANGTIKEUT OE RIEULTHIEUTH
+ 0x8CB5: 0xB672, //HANGUL SYLLABLE SSANGTIKEUT OE RIEULPHIEUPH
+ 0x8CB6: 0xB673, //HANGUL SYLLABLE SSANGTIKEUT OE RIEULHIEUH
+ 0x8CB7: 0xB674, //HANGUL SYLLABLE SSANGTIKEUT OE MIEUM
+ 0x8CB8: 0xB675, //HANGUL SYLLABLE SSANGTIKEUT OE PIEUP
+ 0x8CB9: 0xB676, //HANGUL SYLLABLE SSANGTIKEUT OE PIEUPSIOS
+ 0x8CBA: 0xB677, //HANGUL SYLLABLE SSANGTIKEUT OE SIOS
+ 0x8CBB: 0xB678, //HANGUL SYLLABLE SSANGTIKEUT OE SSANGSIOS
+ 0x8CBC: 0xB679, //HANGUL SYLLABLE SSANGTIKEUT OE IEUNG
+ 0x8CBD: 0xB67A, //HANGUL SYLLABLE SSANGTIKEUT OE CIEUC
+ 0x8CBE: 0xB67B, //HANGUL SYLLABLE SSANGTIKEUT OE CHIEUCH
+ 0x8CBF: 0xB67C, //HANGUL SYLLABLE SSANGTIKEUT OE KHIEUKH
+ 0x8CC0: 0xB67D, //HANGUL SYLLABLE SSANGTIKEUT OE THIEUTH
+ 0x8CC1: 0xB67E, //HANGUL SYLLABLE SSANGTIKEUT OE PHIEUPH
+ 0x8CC2: 0xB67F, //HANGUL SYLLABLE SSANGTIKEUT OE HIEUH
+ 0x8CC3: 0xB680, //HANGUL SYLLABLE SSANGTIKEUT YO
+ 0x8CC4: 0xB681, //HANGUL SYLLABLE SSANGTIKEUT YO KIYEOK
+ 0x8CC5: 0xB682, //HANGUL SYLLABLE SSANGTIKEUT YO SSANGKIYEOK
+ 0x8CC6: 0xB683, //HANGUL SYLLABLE SSANGTIKEUT YO KIYEOKSIOS
+ 0x8CC7: 0xB684, //HANGUL SYLLABLE SSANGTIKEUT YO NIEUN
+ 0x8CC8: 0xB685, //HANGUL SYLLABLE SSANGTIKEUT YO NIEUNCIEUC
+ 0x8CC9: 0xB686, //HANGUL SYLLABLE SSANGTIKEUT YO NIEUNHIEUH
+ 0x8CCA: 0xB687, //HANGUL SYLLABLE SSANGTIKEUT YO TIKEUT
+ 0x8CCB: 0xB688, //HANGUL SYLLABLE SSANGTIKEUT YO RIEUL
+ 0x8CCC: 0xB689, //HANGUL SYLLABLE SSANGTIKEUT YO RIEULKIYEOK
+ 0x8CCD: 0xB68A, //HANGUL SYLLABLE SSANGTIKEUT YO RIEULMIEUM
+ 0x8CCE: 0xB68B, //HANGUL SYLLABLE SSANGTIKEUT YO RIEULPIEUP
+ 0x8CCF: 0xB68C, //HANGUL SYLLABLE SSANGTIKEUT YO RIEULSIOS
+ 0x8CD0: 0xB68D, //HANGUL SYLLABLE SSANGTIKEUT YO RIEULTHIEUTH
+ 0x8CD1: 0xB68E, //HANGUL SYLLABLE SSANGTIKEUT YO RIEULPHIEUPH
+ 0x8CD2: 0xB68F, //HANGUL SYLLABLE SSANGTIKEUT YO RIEULHIEUH
+ 0x8CD3: 0xB690, //HANGUL SYLLABLE SSANGTIKEUT YO MIEUM
+ 0x8CD4: 0xB691, //HANGUL SYLLABLE SSANGTIKEUT YO PIEUP
+ 0x8CD5: 0xB692, //HANGUL SYLLABLE SSANGTIKEUT YO PIEUPSIOS
+ 0x8CD6: 0xB693, //HANGUL SYLLABLE SSANGTIKEUT YO SIOS
+ 0x8CD7: 0xB694, //HANGUL SYLLABLE SSANGTIKEUT YO SSANGSIOS
+ 0x8CD8: 0xB695, //HANGUL SYLLABLE SSANGTIKEUT YO IEUNG
+ 0x8CD9: 0xB696, //HANGUL SYLLABLE SSANGTIKEUT YO CIEUC
+ 0x8CDA: 0xB697, //HANGUL SYLLABLE SSANGTIKEUT YO CHIEUCH
+ 0x8CDB: 0xB698, //HANGUL SYLLABLE SSANGTIKEUT YO KHIEUKH
+ 0x8CDC: 0xB699, //HANGUL SYLLABLE SSANGTIKEUT YO THIEUTH
+ 0x8CDD: 0xB69A, //HANGUL SYLLABLE SSANGTIKEUT YO PHIEUPH
+ 0x8CDE: 0xB69B, //HANGUL SYLLABLE SSANGTIKEUT YO HIEUH
+ 0x8CDF: 0xB69E, //HANGUL SYLLABLE SSANGTIKEUT U SSANGKIYEOK
+ 0x8CE0: 0xB69F, //HANGUL SYLLABLE SSANGTIKEUT U KIYEOKSIOS
+ 0x8CE1: 0xB6A1, //HANGUL SYLLABLE SSANGTIKEUT U NIEUNCIEUC
+ 0x8CE2: 0xB6A2, //HANGUL SYLLABLE SSANGTIKEUT U NIEUNHIEUH
+ 0x8CE3: 0xB6A3, //HANGUL SYLLABLE SSANGTIKEUT U TIKEUT
+ 0x8CE4: 0xB6A5, //HANGUL SYLLABLE SSANGTIKEUT U RIEULKIYEOK
+ 0x8CE5: 0xB6A6, //HANGUL SYLLABLE SSANGTIKEUT U RIEULMIEUM
+ 0x8CE6: 0xB6A7, //HANGUL SYLLABLE SSANGTIKEUT U RIEULPIEUP
+ 0x8CE7: 0xB6A8, //HANGUL SYLLABLE SSANGTIKEUT U RIEULSIOS
+ 0x8CE8: 0xB6A9, //HANGUL SYLLABLE SSANGTIKEUT U RIEULTHIEUTH
+ 0x8CE9: 0xB6AA, //HANGUL SYLLABLE SSANGTIKEUT U RIEULPHIEUPH
+ 0x8CEA: 0xB6AD, //HANGUL SYLLABLE SSANGTIKEUT U PIEUP
+ 0x8CEB: 0xB6AE, //HANGUL SYLLABLE SSANGTIKEUT U PIEUPSIOS
+ 0x8CEC: 0xB6AF, //HANGUL SYLLABLE SSANGTIKEUT U SIOS
+ 0x8CED: 0xB6B0, //HANGUL SYLLABLE SSANGTIKEUT U SSANGSIOS
+ 0x8CEE: 0xB6B2, //HANGUL SYLLABLE SSANGTIKEUT U CIEUC
+ 0x8CEF: 0xB6B3, //HANGUL SYLLABLE SSANGTIKEUT U CHIEUCH
+ 0x8CF0: 0xB6B4, //HANGUL SYLLABLE SSANGTIKEUT U KHIEUKH
+ 0x8CF1: 0xB6B5, //HANGUL SYLLABLE SSANGTIKEUT U THIEUTH
+ 0x8CF2: 0xB6B6, //HANGUL SYLLABLE SSANGTIKEUT U PHIEUPH
+ 0x8CF3: 0xB6B7, //HANGUL SYLLABLE SSANGTIKEUT U HIEUH
+ 0x8CF4: 0xB6B8, //HANGUL SYLLABLE SSANGTIKEUT WEO
+ 0x8CF5: 0xB6B9, //HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOK
+ 0x8CF6: 0xB6BA, //HANGUL SYLLABLE SSANGTIKEUT WEO SSANGKIYEOK
+ 0x8CF7: 0xB6BB, //HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOKSIOS
+ 0x8CF8: 0xB6BC, //HANGUL SYLLABLE SSANGTIKEUT WEO NIEUN
+ 0x8CF9: 0xB6BD, //HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNCIEUC
+ 0x8CFA: 0xB6BE, //HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNHIEUH
+ 0x8CFB: 0xB6BF, //HANGUL SYLLABLE SSANGTIKEUT WEO TIKEUT
+ 0x8CFC: 0xB6C0, //HANGUL SYLLABLE SSANGTIKEUT WEO RIEUL
+ 0x8CFD: 0xB6C1, //HANGUL SYLLABLE SSANGTIKEUT WEO RIEULKIYEOK
+ 0x8CFE: 0xB6C2, //HANGUL SYLLABLE SSANGTIKEUT WEO RIEULMIEUM
+ 0x8D41: 0xB6C3, //HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPIEUP
+ 0x8D42: 0xB6C4, //HANGUL SYLLABLE SSANGTIKEUT WEO RIEULSIOS
+ 0x8D43: 0xB6C5, //HANGUL SYLLABLE SSANGTIKEUT WEO RIEULTHIEUTH
+ 0x8D44: 0xB6C6, //HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPHIEUPH
+ 0x8D45: 0xB6C7, //HANGUL SYLLABLE SSANGTIKEUT WEO RIEULHIEUH
+ 0x8D46: 0xB6C8, //HANGUL SYLLABLE SSANGTIKEUT WEO MIEUM
+ 0x8D47: 0xB6C9, //HANGUL SYLLABLE SSANGTIKEUT WEO PIEUP
+ 0x8D48: 0xB6CA, //HANGUL SYLLABLE SSANGTIKEUT WEO PIEUPSIOS
+ 0x8D49: 0xB6CB, //HANGUL SYLLABLE SSANGTIKEUT WEO SIOS
+ 0x8D4A: 0xB6CC, //HANGUL SYLLABLE SSANGTIKEUT WEO SSANGSIOS
+ 0x8D4B: 0xB6CD, //HANGUL SYLLABLE SSANGTIKEUT WEO IEUNG
+ 0x8D4C: 0xB6CE, //HANGUL SYLLABLE SSANGTIKEUT WEO CIEUC
+ 0x8D4D: 0xB6CF, //HANGUL SYLLABLE SSANGTIKEUT WEO CHIEUCH
+ 0x8D4E: 0xB6D0, //HANGUL SYLLABLE SSANGTIKEUT WEO KHIEUKH
+ 0x8D4F: 0xB6D1, //HANGUL SYLLABLE SSANGTIKEUT WEO THIEUTH
+ 0x8D50: 0xB6D2, //HANGUL SYLLABLE SSANGTIKEUT WEO PHIEUPH
+ 0x8D51: 0xB6D3, //HANGUL SYLLABLE SSANGTIKEUT WEO HIEUH
+ 0x8D52: 0xB6D5, //HANGUL SYLLABLE SSANGTIKEUT WE KIYEOK
+ 0x8D53: 0xB6D6, //HANGUL SYLLABLE SSANGTIKEUT WE SSANGKIYEOK
+ 0x8D54: 0xB6D7, //HANGUL SYLLABLE SSANGTIKEUT WE KIYEOKSIOS
+ 0x8D55: 0xB6D8, //HANGUL SYLLABLE SSANGTIKEUT WE NIEUN
+ 0x8D56: 0xB6D9, //HANGUL SYLLABLE SSANGTIKEUT WE NIEUNCIEUC
+ 0x8D57: 0xB6DA, //HANGUL SYLLABLE SSANGTIKEUT WE NIEUNHIEUH
+ 0x8D58: 0xB6DB, //HANGUL SYLLABLE SSANGTIKEUT WE TIKEUT
+ 0x8D59: 0xB6DC, //HANGUL SYLLABLE SSANGTIKEUT WE RIEUL
+ 0x8D5A: 0xB6DD, //HANGUL SYLLABLE SSANGTIKEUT WE RIEULKIYEOK
+ 0x8D61: 0xB6DE, //HANGUL SYLLABLE SSANGTIKEUT WE RIEULMIEUM
+ 0x8D62: 0xB6DF, //HANGUL SYLLABLE SSANGTIKEUT WE RIEULPIEUP
+ 0x8D63: 0xB6E0, //HANGUL SYLLABLE SSANGTIKEUT WE RIEULSIOS
+ 0x8D64: 0xB6E1, //HANGUL SYLLABLE SSANGTIKEUT WE RIEULTHIEUTH
+ 0x8D65: 0xB6E2, //HANGUL SYLLABLE SSANGTIKEUT WE RIEULPHIEUPH
+ 0x8D66: 0xB6E3, //HANGUL SYLLABLE SSANGTIKEUT WE RIEULHIEUH
+ 0x8D67: 0xB6E4, //HANGUL SYLLABLE SSANGTIKEUT WE MIEUM
+ 0x8D68: 0xB6E5, //HANGUL SYLLABLE SSANGTIKEUT WE PIEUP
+ 0x8D69: 0xB6E6, //HANGUL SYLLABLE SSANGTIKEUT WE PIEUPSIOS
+ 0x8D6A: 0xB6E7, //HANGUL SYLLABLE SSANGTIKEUT WE SIOS
+ 0x8D6B: 0xB6E8, //HANGUL SYLLABLE SSANGTIKEUT WE SSANGSIOS
+ 0x8D6C: 0xB6E9, //HANGUL SYLLABLE SSANGTIKEUT WE IEUNG
+ 0x8D6D: 0xB6EA, //HANGUL SYLLABLE SSANGTIKEUT WE CIEUC
+ 0x8D6E: 0xB6EB, //HANGUL SYLLABLE SSANGTIKEUT WE CHIEUCH
+ 0x8D6F: 0xB6EC, //HANGUL SYLLABLE SSANGTIKEUT WE KHIEUKH
+ 0x8D70: 0xB6ED, //HANGUL SYLLABLE SSANGTIKEUT WE THIEUTH
+ 0x8D71: 0xB6EE, //HANGUL SYLLABLE SSANGTIKEUT WE PHIEUPH
+ 0x8D72: 0xB6EF, //HANGUL SYLLABLE SSANGTIKEUT WE HIEUH
+ 0x8D73: 0xB6F1, //HANGUL SYLLABLE SSANGTIKEUT WI KIYEOK
+ 0x8D74: 0xB6F2, //HANGUL SYLLABLE SSANGTIKEUT WI SSANGKIYEOK
+ 0x8D75: 0xB6F3, //HANGUL SYLLABLE SSANGTIKEUT WI KIYEOKSIOS
+ 0x8D76: 0xB6F5, //HANGUL SYLLABLE SSANGTIKEUT WI NIEUNCIEUC
+ 0x8D77: 0xB6F6, //HANGUL SYLLABLE SSANGTIKEUT WI NIEUNHIEUH
+ 0x8D78: 0xB6F7, //HANGUL SYLLABLE SSANGTIKEUT WI TIKEUT
+ 0x8D79: 0xB6F9, //HANGUL SYLLABLE SSANGTIKEUT WI RIEULKIYEOK
+ 0x8D7A: 0xB6FA, //HANGUL SYLLABLE SSANGTIKEUT WI RIEULMIEUM
+ 0x8D81: 0xB6FB, //HANGUL SYLLABLE SSANGTIKEUT WI RIEULPIEUP
+ 0x8D82: 0xB6FC, //HANGUL SYLLABLE SSANGTIKEUT WI RIEULSIOS
+ 0x8D83: 0xB6FD, //HANGUL SYLLABLE SSANGTIKEUT WI RIEULTHIEUTH
+ 0x8D84: 0xB6FE, //HANGUL SYLLABLE SSANGTIKEUT WI RIEULPHIEUPH
+ 0x8D85: 0xB6FF, //HANGUL SYLLABLE SSANGTIKEUT WI RIEULHIEUH
+ 0x8D86: 0xB702, //HANGUL SYLLABLE SSANGTIKEUT WI PIEUPSIOS
+ 0x8D87: 0xB703, //HANGUL SYLLABLE SSANGTIKEUT WI SIOS
+ 0x8D88: 0xB704, //HANGUL SYLLABLE SSANGTIKEUT WI SSANGSIOS
+ 0x8D89: 0xB706, //HANGUL SYLLABLE SSANGTIKEUT WI CIEUC
+ 0x8D8A: 0xB707, //HANGUL SYLLABLE SSANGTIKEUT WI CHIEUCH
+ 0x8D8B: 0xB708, //HANGUL SYLLABLE SSANGTIKEUT WI KHIEUKH
+ 0x8D8C: 0xB709, //HANGUL SYLLABLE SSANGTIKEUT WI THIEUTH
+ 0x8D8D: 0xB70A, //HANGUL SYLLABLE SSANGTIKEUT WI PHIEUPH
+ 0x8D8E: 0xB70B, //HANGUL SYLLABLE SSANGTIKEUT WI HIEUH
+ 0x8D8F: 0xB70C, //HANGUL SYLLABLE SSANGTIKEUT YU
+ 0x8D90: 0xB70D, //HANGUL SYLLABLE SSANGTIKEUT YU KIYEOK
+ 0x8D91: 0xB70E, //HANGUL SYLLABLE SSANGTIKEUT YU SSANGKIYEOK
+ 0x8D92: 0xB70F, //HANGUL SYLLABLE SSANGTIKEUT YU KIYEOKSIOS
+ 0x8D93: 0xB710, //HANGUL SYLLABLE SSANGTIKEUT YU NIEUN
+ 0x8D94: 0xB711, //HANGUL SYLLABLE SSANGTIKEUT YU NIEUNCIEUC
+ 0x8D95: 0xB712, //HANGUL SYLLABLE SSANGTIKEUT YU NIEUNHIEUH
+ 0x8D96: 0xB713, //HANGUL SYLLABLE SSANGTIKEUT YU TIKEUT
+ 0x8D97: 0xB714, //HANGUL SYLLABLE SSANGTIKEUT YU RIEUL
+ 0x8D98: 0xB715, //HANGUL SYLLABLE SSANGTIKEUT YU RIEULKIYEOK
+ 0x8D99: 0xB716, //HANGUL SYLLABLE SSANGTIKEUT YU RIEULMIEUM
+ 0x8D9A: 0xB717, //HANGUL SYLLABLE SSANGTIKEUT YU RIEULPIEUP
+ 0x8D9B: 0xB718, //HANGUL SYLLABLE SSANGTIKEUT YU RIEULSIOS
+ 0x8D9C: 0xB719, //HANGUL SYLLABLE SSANGTIKEUT YU RIEULTHIEUTH
+ 0x8D9D: 0xB71A, //HANGUL SYLLABLE SSANGTIKEUT YU RIEULPHIEUPH
+ 0x8D9E: 0xB71B, //HANGUL SYLLABLE SSANGTIKEUT YU RIEULHIEUH
+ 0x8D9F: 0xB71C, //HANGUL SYLLABLE SSANGTIKEUT YU MIEUM
+ 0x8DA0: 0xB71D, //HANGUL SYLLABLE SSANGTIKEUT YU PIEUP
+ 0x8DA1: 0xB71E, //HANGUL SYLLABLE SSANGTIKEUT YU PIEUPSIOS
+ 0x8DA2: 0xB71F, //HANGUL SYLLABLE SSANGTIKEUT YU SIOS
+ 0x8DA3: 0xB720, //HANGUL SYLLABLE SSANGTIKEUT YU SSANGSIOS
+ 0x8DA4: 0xB721, //HANGUL SYLLABLE SSANGTIKEUT YU IEUNG
+ 0x8DA5: 0xB722, //HANGUL SYLLABLE SSANGTIKEUT YU CIEUC
+ 0x8DA6: 0xB723, //HANGUL SYLLABLE SSANGTIKEUT YU CHIEUCH
+ 0x8DA7: 0xB724, //HANGUL SYLLABLE SSANGTIKEUT YU KHIEUKH
+ 0x8DA8: 0xB725, //HANGUL SYLLABLE SSANGTIKEUT YU THIEUTH
+ 0x8DA9: 0xB726, //HANGUL SYLLABLE SSANGTIKEUT YU PHIEUPH
+ 0x8DAA: 0xB727, //HANGUL SYLLABLE SSANGTIKEUT YU HIEUH
+ 0x8DAB: 0xB72A, //HANGUL SYLLABLE SSANGTIKEUT EU SSANGKIYEOK
+ 0x8DAC: 0xB72B, //HANGUL SYLLABLE SSANGTIKEUT EU KIYEOKSIOS
+ 0x8DAD: 0xB72D, //HANGUL SYLLABLE SSANGTIKEUT EU NIEUNCIEUC
+ 0x8DAE: 0xB72E, //HANGUL SYLLABLE SSANGTIKEUT EU NIEUNHIEUH
+ 0x8DAF: 0xB731, //HANGUL SYLLABLE SSANGTIKEUT EU RIEULKIYEOK
+ 0x8DB0: 0xB732, //HANGUL SYLLABLE SSANGTIKEUT EU RIEULMIEUM
+ 0x8DB1: 0xB733, //HANGUL SYLLABLE SSANGTIKEUT EU RIEULPIEUP
+ 0x8DB2: 0xB734, //HANGUL SYLLABLE SSANGTIKEUT EU RIEULSIOS
+ 0x8DB3: 0xB735, //HANGUL SYLLABLE SSANGTIKEUT EU RIEULTHIEUTH
+ 0x8DB4: 0xB736, //HANGUL SYLLABLE SSANGTIKEUT EU RIEULPHIEUPH
+ 0x8DB5: 0xB737, //HANGUL SYLLABLE SSANGTIKEUT EU RIEULHIEUH
+ 0x8DB6: 0xB73A, //HANGUL SYLLABLE SSANGTIKEUT EU PIEUPSIOS
+ 0x8DB7: 0xB73C, //HANGUL SYLLABLE SSANGTIKEUT EU SSANGSIOS
+ 0x8DB8: 0xB73D, //HANGUL SYLLABLE SSANGTIKEUT EU IEUNG
+ 0x8DB9: 0xB73E, //HANGUL SYLLABLE SSANGTIKEUT EU CIEUC
+ 0x8DBA: 0xB73F, //HANGUL SYLLABLE SSANGTIKEUT EU CHIEUCH
+ 0x8DBB: 0xB740, //HANGUL SYLLABLE SSANGTIKEUT EU KHIEUKH
+ 0x8DBC: 0xB741, //HANGUL SYLLABLE SSANGTIKEUT EU THIEUTH
+ 0x8DBD: 0xB742, //HANGUL SYLLABLE SSANGTIKEUT EU PHIEUPH
+ 0x8DBE: 0xB743, //HANGUL SYLLABLE SSANGTIKEUT EU HIEUH
+ 0x8DBF: 0xB745, //HANGUL SYLLABLE SSANGTIKEUT YI KIYEOK
+ 0x8DC0: 0xB746, //HANGUL SYLLABLE SSANGTIKEUT YI SSANGKIYEOK
+ 0x8DC1: 0xB747, //HANGUL SYLLABLE SSANGTIKEUT YI KIYEOKSIOS
+ 0x8DC2: 0xB749, //HANGUL SYLLABLE SSANGTIKEUT YI NIEUNCIEUC
+ 0x8DC3: 0xB74A, //HANGUL SYLLABLE SSANGTIKEUT YI NIEUNHIEUH
+ 0x8DC4: 0xB74B, //HANGUL SYLLABLE SSANGTIKEUT YI TIKEUT
+ 0x8DC5: 0xB74D, //HANGUL SYLLABLE SSANGTIKEUT YI RIEULKIYEOK
+ 0x8DC6: 0xB74E, //HANGUL SYLLABLE SSANGTIKEUT YI RIEULMIEUM
+ 0x8DC7: 0xB74F, //HANGUL SYLLABLE SSANGTIKEUT YI RIEULPIEUP
+ 0x8DC8: 0xB750, //HANGUL SYLLABLE SSANGTIKEUT YI RIEULSIOS
+ 0x8DC9: 0xB751, //HANGUL SYLLABLE SSANGTIKEUT YI RIEULTHIEUTH
+ 0x8DCA: 0xB752, //HANGUL SYLLABLE SSANGTIKEUT YI RIEULPHIEUPH
+ 0x8DCB: 0xB753, //HANGUL SYLLABLE SSANGTIKEUT YI RIEULHIEUH
+ 0x8DCC: 0xB756, //HANGUL SYLLABLE SSANGTIKEUT YI PIEUPSIOS
+ 0x8DCD: 0xB757, //HANGUL SYLLABLE SSANGTIKEUT YI SIOS
+ 0x8DCE: 0xB758, //HANGUL SYLLABLE SSANGTIKEUT YI SSANGSIOS
+ 0x8DCF: 0xB759, //HANGUL SYLLABLE SSANGTIKEUT YI IEUNG
+ 0x8DD0: 0xB75A, //HANGUL SYLLABLE SSANGTIKEUT YI CIEUC
+ 0x8DD1: 0xB75B, //HANGUL SYLLABLE SSANGTIKEUT YI CHIEUCH
+ 0x8DD2: 0xB75C, //HANGUL SYLLABLE SSANGTIKEUT YI KHIEUKH
+ 0x8DD3: 0xB75D, //HANGUL SYLLABLE SSANGTIKEUT YI THIEUTH
+ 0x8DD4: 0xB75E, //HANGUL SYLLABLE SSANGTIKEUT YI PHIEUPH
+ 0x8DD5: 0xB75F, //HANGUL SYLLABLE SSANGTIKEUT YI HIEUH
+ 0x8DD6: 0xB761, //HANGUL SYLLABLE SSANGTIKEUT I KIYEOK
+ 0x8DD7: 0xB762, //HANGUL SYLLABLE SSANGTIKEUT I SSANGKIYEOK
+ 0x8DD8: 0xB763, //HANGUL SYLLABLE SSANGTIKEUT I KIYEOKSIOS
+ 0x8DD9: 0xB765, //HANGUL SYLLABLE SSANGTIKEUT I NIEUNCIEUC
+ 0x8DDA: 0xB766, //HANGUL SYLLABLE SSANGTIKEUT I NIEUNHIEUH
+ 0x8DDB: 0xB767, //HANGUL SYLLABLE SSANGTIKEUT I TIKEUT
+ 0x8DDC: 0xB769, //HANGUL SYLLABLE SSANGTIKEUT I RIEULKIYEOK
+ 0x8DDD: 0xB76A, //HANGUL SYLLABLE SSANGTIKEUT I RIEULMIEUM
+ 0x8DDE: 0xB76B, //HANGUL SYLLABLE SSANGTIKEUT I RIEULPIEUP
+ 0x8DDF: 0xB76C, //HANGUL SYLLABLE SSANGTIKEUT I RIEULSIOS
+ 0x8DE0: 0xB76D, //HANGUL SYLLABLE SSANGTIKEUT I RIEULTHIEUTH
+ 0x8DE1: 0xB76E, //HANGUL SYLLABLE SSANGTIKEUT I RIEULPHIEUPH
+ 0x8DE2: 0xB76F, //HANGUL SYLLABLE SSANGTIKEUT I RIEULHIEUH
+ 0x8DE3: 0xB772, //HANGUL SYLLABLE SSANGTIKEUT I PIEUPSIOS
+ 0x8DE4: 0xB774, //HANGUL SYLLABLE SSANGTIKEUT I SSANGSIOS
+ 0x8DE5: 0xB776, //HANGUL SYLLABLE SSANGTIKEUT I CIEUC
+ 0x8DE6: 0xB777, //HANGUL SYLLABLE SSANGTIKEUT I CHIEUCH
+ 0x8DE7: 0xB778, //HANGUL SYLLABLE SSANGTIKEUT I KHIEUKH
+ 0x8DE8: 0xB779, //HANGUL SYLLABLE SSANGTIKEUT I THIEUTH
+ 0x8DE9: 0xB77A, //HANGUL SYLLABLE SSANGTIKEUT I PHIEUPH
+ 0x8DEA: 0xB77B, //HANGUL SYLLABLE SSANGTIKEUT I HIEUH
+ 0x8DEB: 0xB77E, //HANGUL SYLLABLE RIEUL A SSANGKIYEOK
+ 0x8DEC: 0xB77F, //HANGUL SYLLABLE RIEUL A KIYEOKSIOS
+ 0x8DED: 0xB781, //HANGUL SYLLABLE RIEUL A NIEUNCIEUC
+ 0x8DEE: 0xB782, //HANGUL SYLLABLE RIEUL A NIEUNHIEUH
+ 0x8DEF: 0xB783, //HANGUL SYLLABLE RIEUL A TIKEUT
+ 0x8DF0: 0xB785, //HANGUL SYLLABLE RIEUL A RIEULKIYEOK
+ 0x8DF1: 0xB786, //HANGUL SYLLABLE RIEUL A RIEULMIEUM
+ 0x8DF2: 0xB787, //HANGUL SYLLABLE RIEUL A RIEULPIEUP
+ 0x8DF3: 0xB788, //HANGUL SYLLABLE RIEUL A RIEULSIOS
+ 0x8DF4: 0xB789, //HANGUL SYLLABLE RIEUL A RIEULTHIEUTH
+ 0x8DF5: 0xB78A, //HANGUL SYLLABLE RIEUL A RIEULPHIEUPH
+ 0x8DF6: 0xB78B, //HANGUL SYLLABLE RIEUL A RIEULHIEUH
+ 0x8DF7: 0xB78E, //HANGUL SYLLABLE RIEUL A PIEUPSIOS
+ 0x8DF8: 0xB793, //HANGUL SYLLABLE RIEUL A CHIEUCH
+ 0x8DF9: 0xB794, //HANGUL SYLLABLE RIEUL A KHIEUKH
+ 0x8DFA: 0xB795, //HANGUL SYLLABLE RIEUL A THIEUTH
+ 0x8DFB: 0xB79A, //HANGUL SYLLABLE RIEUL AE SSANGKIYEOK
+ 0x8DFC: 0xB79B, //HANGUL SYLLABLE RIEUL AE KIYEOKSIOS
+ 0x8DFD: 0xB79D, //HANGUL SYLLABLE RIEUL AE NIEUNCIEUC
+ 0x8DFE: 0xB79E, //HANGUL SYLLABLE RIEUL AE NIEUNHIEUH
+ 0x8E41: 0xB79F, //HANGUL SYLLABLE RIEUL AE TIKEUT
+ 0x8E42: 0xB7A1, //HANGUL SYLLABLE RIEUL AE RIEULKIYEOK
+ 0x8E43: 0xB7A2, //HANGUL SYLLABLE RIEUL AE RIEULMIEUM
+ 0x8E44: 0xB7A3, //HANGUL SYLLABLE RIEUL AE RIEULPIEUP
+ 0x8E45: 0xB7A4, //HANGUL SYLLABLE RIEUL AE RIEULSIOS
+ 0x8E46: 0xB7A5, //HANGUL SYLLABLE RIEUL AE RIEULTHIEUTH
+ 0x8E47: 0xB7A6, //HANGUL SYLLABLE RIEUL AE RIEULPHIEUPH
+ 0x8E48: 0xB7A7, //HANGUL SYLLABLE RIEUL AE RIEULHIEUH
+ 0x8E49: 0xB7AA, //HANGUL SYLLABLE RIEUL AE PIEUPSIOS
+ 0x8E4A: 0xB7AE, //HANGUL SYLLABLE RIEUL AE CIEUC
+ 0x8E4B: 0xB7AF, //HANGUL SYLLABLE RIEUL AE CHIEUCH
+ 0x8E4C: 0xB7B0, //HANGUL SYLLABLE RIEUL AE KHIEUKH
+ 0x8E4D: 0xB7B1, //HANGUL SYLLABLE RIEUL AE THIEUTH
+ 0x8E4E: 0xB7B2, //HANGUL SYLLABLE RIEUL AE PHIEUPH
+ 0x8E4F: 0xB7B3, //HANGUL SYLLABLE RIEUL AE HIEUH
+ 0x8E50: 0xB7B6, //HANGUL SYLLABLE RIEUL YA SSANGKIYEOK
+ 0x8E51: 0xB7B7, //HANGUL SYLLABLE RIEUL YA KIYEOKSIOS
+ 0x8E52: 0xB7B9, //HANGUL SYLLABLE RIEUL YA NIEUNCIEUC
+ 0x8E53: 0xB7BA, //HANGUL SYLLABLE RIEUL YA NIEUNHIEUH
+ 0x8E54: 0xB7BB, //HANGUL SYLLABLE RIEUL YA TIKEUT
+ 0x8E55: 0xB7BC, //HANGUL SYLLABLE RIEUL YA RIEUL
+ 0x8E56: 0xB7BD, //HANGUL SYLLABLE RIEUL YA RIEULKIYEOK
+ 0x8E57: 0xB7BE, //HANGUL SYLLABLE RIEUL YA RIEULMIEUM
+ 0x8E58: 0xB7BF, //HANGUL SYLLABLE RIEUL YA RIEULPIEUP
+ 0x8E59: 0xB7C0, //HANGUL SYLLABLE RIEUL YA RIEULSIOS
+ 0x8E5A: 0xB7C1, //HANGUL SYLLABLE RIEUL YA RIEULTHIEUTH
+ 0x8E61: 0xB7C2, //HANGUL SYLLABLE RIEUL YA RIEULPHIEUPH
+ 0x8E62: 0xB7C3, //HANGUL SYLLABLE RIEUL YA RIEULHIEUH
+ 0x8E63: 0xB7C4, //HANGUL SYLLABLE RIEUL YA MIEUM
+ 0x8E64: 0xB7C5, //HANGUL SYLLABLE RIEUL YA PIEUP
+ 0x8E65: 0xB7C6, //HANGUL SYLLABLE RIEUL YA PIEUPSIOS
+ 0x8E66: 0xB7C8, //HANGUL SYLLABLE RIEUL YA SSANGSIOS
+ 0x8E67: 0xB7CA, //HANGUL SYLLABLE RIEUL YA CIEUC
+ 0x8E68: 0xB7CB, //HANGUL SYLLABLE RIEUL YA CHIEUCH
+ 0x8E69: 0xB7CC, //HANGUL SYLLABLE RIEUL YA KHIEUKH
+ 0x8E6A: 0xB7CD, //HANGUL SYLLABLE RIEUL YA THIEUTH
+ 0x8E6B: 0xB7CE, //HANGUL SYLLABLE RIEUL YA PHIEUPH
+ 0x8E6C: 0xB7CF, //HANGUL SYLLABLE RIEUL YA HIEUH
+ 0x8E6D: 0xB7D0, //HANGUL SYLLABLE RIEUL YAE
+ 0x8E6E: 0xB7D1, //HANGUL SYLLABLE RIEUL YAE KIYEOK
+ 0x8E6F: 0xB7D2, //HANGUL SYLLABLE RIEUL YAE SSANGKIYEOK
+ 0x8E70: 0xB7D3, //HANGUL SYLLABLE RIEUL YAE KIYEOKSIOS
+ 0x8E71: 0xB7D4, //HANGUL SYLLABLE RIEUL YAE NIEUN
+ 0x8E72: 0xB7D5, //HANGUL SYLLABLE RIEUL YAE NIEUNCIEUC
+ 0x8E73: 0xB7D6, //HANGUL SYLLABLE RIEUL YAE NIEUNHIEUH
+ 0x8E74: 0xB7D7, //HANGUL SYLLABLE RIEUL YAE TIKEUT
+ 0x8E75: 0xB7D8, //HANGUL SYLLABLE RIEUL YAE RIEUL
+ 0x8E76: 0xB7D9, //HANGUL SYLLABLE RIEUL YAE RIEULKIYEOK
+ 0x8E77: 0xB7DA, //HANGUL SYLLABLE RIEUL YAE RIEULMIEUM
+ 0x8E78: 0xB7DB, //HANGUL SYLLABLE RIEUL YAE RIEULPIEUP
+ 0x8E79: 0xB7DC, //HANGUL SYLLABLE RIEUL YAE RIEULSIOS
+ 0x8E7A: 0xB7DD, //HANGUL SYLLABLE RIEUL YAE RIEULTHIEUTH
+ 0x8E81: 0xB7DE, //HANGUL SYLLABLE RIEUL YAE RIEULPHIEUPH
+ 0x8E82: 0xB7DF, //HANGUL SYLLABLE RIEUL YAE RIEULHIEUH
+ 0x8E83: 0xB7E0, //HANGUL SYLLABLE RIEUL YAE MIEUM
+ 0x8E84: 0xB7E1, //HANGUL SYLLABLE RIEUL YAE PIEUP
+ 0x8E85: 0xB7E2, //HANGUL SYLLABLE RIEUL YAE PIEUPSIOS
+ 0x8E86: 0xB7E3, //HANGUL SYLLABLE RIEUL YAE SIOS
+ 0x8E87: 0xB7E4, //HANGUL SYLLABLE RIEUL YAE SSANGSIOS
+ 0x8E88: 0xB7E5, //HANGUL SYLLABLE RIEUL YAE IEUNG
+ 0x8E89: 0xB7E6, //HANGUL SYLLABLE RIEUL YAE CIEUC
+ 0x8E8A: 0xB7E7, //HANGUL SYLLABLE RIEUL YAE CHIEUCH
+ 0x8E8B: 0xB7E8, //HANGUL SYLLABLE RIEUL YAE KHIEUKH
+ 0x8E8C: 0xB7E9, //HANGUL SYLLABLE RIEUL YAE THIEUTH
+ 0x8E8D: 0xB7EA, //HANGUL SYLLABLE RIEUL YAE PHIEUPH
+ 0x8E8E: 0xB7EB, //HANGUL SYLLABLE RIEUL YAE HIEUH
+ 0x8E8F: 0xB7EE, //HANGUL SYLLABLE RIEUL EO SSANGKIYEOK
+ 0x8E90: 0xB7EF, //HANGUL SYLLABLE RIEUL EO KIYEOKSIOS
+ 0x8E91: 0xB7F1, //HANGUL SYLLABLE RIEUL EO NIEUNCIEUC
+ 0x8E92: 0xB7F2, //HANGUL SYLLABLE RIEUL EO NIEUNHIEUH
+ 0x8E93: 0xB7F3, //HANGUL SYLLABLE RIEUL EO TIKEUT
+ 0x8E94: 0xB7F5, //HANGUL SYLLABLE RIEUL EO RIEULKIYEOK
+ 0x8E95: 0xB7F6, //HANGUL SYLLABLE RIEUL EO RIEULMIEUM
+ 0x8E96: 0xB7F7, //HANGUL SYLLABLE RIEUL EO RIEULPIEUP
+ 0x8E97: 0xB7F8, //HANGUL SYLLABLE RIEUL EO RIEULSIOS
+ 0x8E98: 0xB7F9, //HANGUL SYLLABLE RIEUL EO RIEULTHIEUTH
+ 0x8E99: 0xB7FA, //HANGUL SYLLABLE RIEUL EO RIEULPHIEUPH
+ 0x8E9A: 0xB7FB, //HANGUL SYLLABLE RIEUL EO RIEULHIEUH
+ 0x8E9B: 0xB7FE, //HANGUL SYLLABLE RIEUL EO PIEUPSIOS
+ 0x8E9C: 0xB802, //HANGUL SYLLABLE RIEUL EO CIEUC
+ 0x8E9D: 0xB803, //HANGUL SYLLABLE RIEUL EO CHIEUCH
+ 0x8E9E: 0xB804, //HANGUL SYLLABLE RIEUL EO KHIEUKH
+ 0x8E9F: 0xB805, //HANGUL SYLLABLE RIEUL EO THIEUTH
+ 0x8EA0: 0xB806, //HANGUL SYLLABLE RIEUL EO PHIEUPH
+ 0x8EA1: 0xB80A, //HANGUL SYLLABLE RIEUL E SSANGKIYEOK
+ 0x8EA2: 0xB80B, //HANGUL SYLLABLE RIEUL E KIYEOKSIOS
+ 0x8EA3: 0xB80D, //HANGUL SYLLABLE RIEUL E NIEUNCIEUC
+ 0x8EA4: 0xB80E, //HANGUL SYLLABLE RIEUL E NIEUNHIEUH
+ 0x8EA5: 0xB80F, //HANGUL SYLLABLE RIEUL E TIKEUT
+ 0x8EA6: 0xB811, //HANGUL SYLLABLE RIEUL E RIEULKIYEOK
+ 0x8EA7: 0xB812, //HANGUL SYLLABLE RIEUL E RIEULMIEUM
+ 0x8EA8: 0xB813, //HANGUL SYLLABLE RIEUL E RIEULPIEUP
+ 0x8EA9: 0xB814, //HANGUL SYLLABLE RIEUL E RIEULSIOS
+ 0x8EAA: 0xB815, //HANGUL SYLLABLE RIEUL E RIEULTHIEUTH
+ 0x8EAB: 0xB816, //HANGUL SYLLABLE RIEUL E RIEULPHIEUPH
+ 0x8EAC: 0xB817, //HANGUL SYLLABLE RIEUL E RIEULHIEUH
+ 0x8EAD: 0xB81A, //HANGUL SYLLABLE RIEUL E PIEUPSIOS
+ 0x8EAE: 0xB81C, //HANGUL SYLLABLE RIEUL E SSANGSIOS
+ 0x8EAF: 0xB81E, //HANGUL SYLLABLE RIEUL E CIEUC
+ 0x8EB0: 0xB81F, //HANGUL SYLLABLE RIEUL E CHIEUCH
+ 0x8EB1: 0xB820, //HANGUL SYLLABLE RIEUL E KHIEUKH
+ 0x8EB2: 0xB821, //HANGUL SYLLABLE RIEUL E THIEUTH
+ 0x8EB3: 0xB822, //HANGUL SYLLABLE RIEUL E PHIEUPH
+ 0x8EB4: 0xB823, //HANGUL SYLLABLE RIEUL E HIEUH
+ 0x8EB5: 0xB826, //HANGUL SYLLABLE RIEUL YEO SSANGKIYEOK
+ 0x8EB6: 0xB827, //HANGUL SYLLABLE RIEUL YEO KIYEOKSIOS
+ 0x8EB7: 0xB829, //HANGUL SYLLABLE RIEUL YEO NIEUNCIEUC
+ 0x8EB8: 0xB82A, //HANGUL SYLLABLE RIEUL YEO NIEUNHIEUH
+ 0x8EB9: 0xB82B, //HANGUL SYLLABLE RIEUL YEO TIKEUT
+ 0x8EBA: 0xB82D, //HANGUL SYLLABLE RIEUL YEO RIEULKIYEOK
+ 0x8EBB: 0xB82E, //HANGUL SYLLABLE RIEUL YEO RIEULMIEUM
+ 0x8EBC: 0xB82F, //HANGUL SYLLABLE RIEUL YEO RIEULPIEUP
+ 0x8EBD: 0xB830, //HANGUL SYLLABLE RIEUL YEO RIEULSIOS
+ 0x8EBE: 0xB831, //HANGUL SYLLABLE RIEUL YEO RIEULTHIEUTH
+ 0x8EBF: 0xB832, //HANGUL SYLLABLE RIEUL YEO RIEULPHIEUPH
+ 0x8EC0: 0xB833, //HANGUL SYLLABLE RIEUL YEO RIEULHIEUH
+ 0x8EC1: 0xB836, //HANGUL SYLLABLE RIEUL YEO PIEUPSIOS
+ 0x8EC2: 0xB83A, //HANGUL SYLLABLE RIEUL YEO CIEUC
+ 0x8EC3: 0xB83B, //HANGUL SYLLABLE RIEUL YEO CHIEUCH
+ 0x8EC4: 0xB83C, //HANGUL SYLLABLE RIEUL YEO KHIEUKH
+ 0x8EC5: 0xB83D, //HANGUL SYLLABLE RIEUL YEO THIEUTH
+ 0x8EC6: 0xB83E, //HANGUL SYLLABLE RIEUL YEO PHIEUPH
+ 0x8EC7: 0xB83F, //HANGUL SYLLABLE RIEUL YEO HIEUH
+ 0x8EC8: 0xB841, //HANGUL SYLLABLE RIEUL YE KIYEOK
+ 0x8EC9: 0xB842, //HANGUL SYLLABLE RIEUL YE SSANGKIYEOK
+ 0x8ECA: 0xB843, //HANGUL SYLLABLE RIEUL YE KIYEOKSIOS
+ 0x8ECB: 0xB845, //HANGUL SYLLABLE RIEUL YE NIEUNCIEUC
+ 0x8ECC: 0xB846, //HANGUL SYLLABLE RIEUL YE NIEUNHIEUH
+ 0x8ECD: 0xB847, //HANGUL SYLLABLE RIEUL YE TIKEUT
+ 0x8ECE: 0xB848, //HANGUL SYLLABLE RIEUL YE RIEUL
+ 0x8ECF: 0xB849, //HANGUL SYLLABLE RIEUL YE RIEULKIYEOK
+ 0x8ED0: 0xB84A, //HANGUL SYLLABLE RIEUL YE RIEULMIEUM
+ 0x8ED1: 0xB84B, //HANGUL SYLLABLE RIEUL YE RIEULPIEUP
+ 0x8ED2: 0xB84C, //HANGUL SYLLABLE RIEUL YE RIEULSIOS
+ 0x8ED3: 0xB84D, //HANGUL SYLLABLE RIEUL YE RIEULTHIEUTH
+ 0x8ED4: 0xB84E, //HANGUL SYLLABLE RIEUL YE RIEULPHIEUPH
+ 0x8ED5: 0xB84F, //HANGUL SYLLABLE RIEUL YE RIEULHIEUH
+ 0x8ED6: 0xB850, //HANGUL SYLLABLE RIEUL YE MIEUM
+ 0x8ED7: 0xB852, //HANGUL SYLLABLE RIEUL YE PIEUPSIOS
+ 0x8ED8: 0xB854, //HANGUL SYLLABLE RIEUL YE SSANGSIOS
+ 0x8ED9: 0xB855, //HANGUL SYLLABLE RIEUL YE IEUNG
+ 0x8EDA: 0xB856, //HANGUL SYLLABLE RIEUL YE CIEUC
+ 0x8EDB: 0xB857, //HANGUL SYLLABLE RIEUL YE CHIEUCH
+ 0x8EDC: 0xB858, //HANGUL SYLLABLE RIEUL YE KHIEUKH
+ 0x8EDD: 0xB859, //HANGUL SYLLABLE RIEUL YE THIEUTH
+ 0x8EDE: 0xB85A, //HANGUL SYLLABLE RIEUL YE PHIEUPH
+ 0x8EDF: 0xB85B, //HANGUL SYLLABLE RIEUL YE HIEUH
+ 0x8EE0: 0xB85E, //HANGUL SYLLABLE RIEUL O SSANGKIYEOK
+ 0x8EE1: 0xB85F, //HANGUL SYLLABLE RIEUL O KIYEOKSIOS
+ 0x8EE2: 0xB861, //HANGUL SYLLABLE RIEUL O NIEUNCIEUC
+ 0x8EE3: 0xB862, //HANGUL SYLLABLE RIEUL O NIEUNHIEUH
+ 0x8EE4: 0xB863, //HANGUL SYLLABLE RIEUL O TIKEUT
+ 0x8EE5: 0xB865, //HANGUL SYLLABLE RIEUL O RIEULKIYEOK
+ 0x8EE6: 0xB866, //HANGUL SYLLABLE RIEUL O RIEULMIEUM
+ 0x8EE7: 0xB867, //HANGUL SYLLABLE RIEUL O RIEULPIEUP
+ 0x8EE8: 0xB868, //HANGUL SYLLABLE RIEUL O RIEULSIOS
+ 0x8EE9: 0xB869, //HANGUL SYLLABLE RIEUL O RIEULTHIEUTH
+ 0x8EEA: 0xB86A, //HANGUL SYLLABLE RIEUL O RIEULPHIEUPH
+ 0x8EEB: 0xB86B, //HANGUL SYLLABLE RIEUL O RIEULHIEUH
+ 0x8EEC: 0xB86E, //HANGUL SYLLABLE RIEUL O PIEUPSIOS
+ 0x8EED: 0xB870, //HANGUL SYLLABLE RIEUL O SSANGSIOS
+ 0x8EEE: 0xB872, //HANGUL SYLLABLE RIEUL O CIEUC
+ 0x8EEF: 0xB873, //HANGUL SYLLABLE RIEUL O CHIEUCH
+ 0x8EF0: 0xB874, //HANGUL SYLLABLE RIEUL O KHIEUKH
+ 0x8EF1: 0xB875, //HANGUL SYLLABLE RIEUL O THIEUTH
+ 0x8EF2: 0xB876, //HANGUL SYLLABLE RIEUL O PHIEUPH
+ 0x8EF3: 0xB877, //HANGUL SYLLABLE RIEUL O HIEUH
+ 0x8EF4: 0xB879, //HANGUL SYLLABLE RIEUL WA KIYEOK
+ 0x8EF5: 0xB87A, //HANGUL SYLLABLE RIEUL WA SSANGKIYEOK
+ 0x8EF6: 0xB87B, //HANGUL SYLLABLE RIEUL WA KIYEOKSIOS
+ 0x8EF7: 0xB87D, //HANGUL SYLLABLE RIEUL WA NIEUNCIEUC
+ 0x8EF8: 0xB87E, //HANGUL SYLLABLE RIEUL WA NIEUNHIEUH
+ 0x8EF9: 0xB87F, //HANGUL SYLLABLE RIEUL WA TIKEUT
+ 0x8EFA: 0xB880, //HANGUL SYLLABLE RIEUL WA RIEUL
+ 0x8EFB: 0xB881, //HANGUL SYLLABLE RIEUL WA RIEULKIYEOK
+ 0x8EFC: 0xB882, //HANGUL SYLLABLE RIEUL WA RIEULMIEUM
+ 0x8EFD: 0xB883, //HANGUL SYLLABLE RIEUL WA RIEULPIEUP
+ 0x8EFE: 0xB884, //HANGUL SYLLABLE RIEUL WA RIEULSIOS
+ 0x8F41: 0xB885, //HANGUL SYLLABLE RIEUL WA RIEULTHIEUTH
+ 0x8F42: 0xB886, //HANGUL SYLLABLE RIEUL WA RIEULPHIEUPH
+ 0x8F43: 0xB887, //HANGUL SYLLABLE RIEUL WA RIEULHIEUH
+ 0x8F44: 0xB888, //HANGUL SYLLABLE RIEUL WA MIEUM
+ 0x8F45: 0xB889, //HANGUL SYLLABLE RIEUL WA PIEUP
+ 0x8F46: 0xB88A, //HANGUL SYLLABLE RIEUL WA PIEUPSIOS
+ 0x8F47: 0xB88B, //HANGUL SYLLABLE RIEUL WA SIOS
+ 0x8F48: 0xB88C, //HANGUL SYLLABLE RIEUL WA SSANGSIOS
+ 0x8F49: 0xB88E, //HANGUL SYLLABLE RIEUL WA CIEUC
+ 0x8F4A: 0xB88F, //HANGUL SYLLABLE RIEUL WA CHIEUCH
+ 0x8F4B: 0xB890, //HANGUL SYLLABLE RIEUL WA KHIEUKH
+ 0x8F4C: 0xB891, //HANGUL SYLLABLE RIEUL WA THIEUTH
+ 0x8F4D: 0xB892, //HANGUL SYLLABLE RIEUL WA PHIEUPH
+ 0x8F4E: 0xB893, //HANGUL SYLLABLE RIEUL WA HIEUH
+ 0x8F4F: 0xB894, //HANGUL SYLLABLE RIEUL WAE
+ 0x8F50: 0xB895, //HANGUL SYLLABLE RIEUL WAE KIYEOK
+ 0x8F51: 0xB896, //HANGUL SYLLABLE RIEUL WAE SSANGKIYEOK
+ 0x8F52: 0xB897, //HANGUL SYLLABLE RIEUL WAE KIYEOKSIOS
+ 0x8F53: 0xB898, //HANGUL SYLLABLE RIEUL WAE NIEUN
+ 0x8F54: 0xB899, //HANGUL SYLLABLE RIEUL WAE NIEUNCIEUC
+ 0x8F55: 0xB89A, //HANGUL SYLLABLE RIEUL WAE NIEUNHIEUH
+ 0x8F56: 0xB89B, //HANGUL SYLLABLE RIEUL WAE TIKEUT
+ 0x8F57: 0xB89C, //HANGUL SYLLABLE RIEUL WAE RIEUL
+ 0x8F58: 0xB89D, //HANGUL SYLLABLE RIEUL WAE RIEULKIYEOK
+ 0x8F59: 0xB89E, //HANGUL SYLLABLE RIEUL WAE RIEULMIEUM
+ 0x8F5A: 0xB89F, //HANGUL SYLLABLE RIEUL WAE RIEULPIEUP
+ 0x8F61: 0xB8A0, //HANGUL SYLLABLE RIEUL WAE RIEULSIOS
+ 0x8F62: 0xB8A1, //HANGUL SYLLABLE RIEUL WAE RIEULTHIEUTH
+ 0x8F63: 0xB8A2, //HANGUL SYLLABLE RIEUL WAE RIEULPHIEUPH
+ 0x8F64: 0xB8A3, //HANGUL SYLLABLE RIEUL WAE RIEULHIEUH
+ 0x8F65: 0xB8A4, //HANGUL SYLLABLE RIEUL WAE MIEUM
+ 0x8F66: 0xB8A5, //HANGUL SYLLABLE RIEUL WAE PIEUP
+ 0x8F67: 0xB8A6, //HANGUL SYLLABLE RIEUL WAE PIEUPSIOS
+ 0x8F68: 0xB8A7, //HANGUL SYLLABLE RIEUL WAE SIOS
+ 0x8F69: 0xB8A9, //HANGUL SYLLABLE RIEUL WAE IEUNG
+ 0x8F6A: 0xB8AA, //HANGUL SYLLABLE RIEUL WAE CIEUC
+ 0x8F6B: 0xB8AB, //HANGUL SYLLABLE RIEUL WAE CHIEUCH
+ 0x8F6C: 0xB8AC, //HANGUL SYLLABLE RIEUL WAE KHIEUKH
+ 0x8F6D: 0xB8AD, //HANGUL SYLLABLE RIEUL WAE THIEUTH
+ 0x8F6E: 0xB8AE, //HANGUL SYLLABLE RIEUL WAE PHIEUPH
+ 0x8F6F: 0xB8AF, //HANGUL SYLLABLE RIEUL WAE HIEUH
+ 0x8F70: 0xB8B1, //HANGUL SYLLABLE RIEUL OE KIYEOK
+ 0x8F71: 0xB8B2, //HANGUL SYLLABLE RIEUL OE SSANGKIYEOK
+ 0x8F72: 0xB8B3, //HANGUL SYLLABLE RIEUL OE KIYEOKSIOS
+ 0x8F73: 0xB8B5, //HANGUL SYLLABLE RIEUL OE NIEUNCIEUC
+ 0x8F74: 0xB8B6, //HANGUL SYLLABLE RIEUL OE NIEUNHIEUH
+ 0x8F75: 0xB8B7, //HANGUL SYLLABLE RIEUL OE TIKEUT
+ 0x8F76: 0xB8B9, //HANGUL SYLLABLE RIEUL OE RIEULKIYEOK
+ 0x8F77: 0xB8BA, //HANGUL SYLLABLE RIEUL OE RIEULMIEUM
+ 0x8F78: 0xB8BB, //HANGUL SYLLABLE RIEUL OE RIEULPIEUP
+ 0x8F79: 0xB8BC, //HANGUL SYLLABLE RIEUL OE RIEULSIOS
+ 0x8F7A: 0xB8BD, //HANGUL SYLLABLE RIEUL OE RIEULTHIEUTH
+ 0x8F81: 0xB8BE, //HANGUL SYLLABLE RIEUL OE RIEULPHIEUPH
+ 0x8F82: 0xB8BF, //HANGUL SYLLABLE RIEUL OE RIEULHIEUH
+ 0x8F83: 0xB8C2, //HANGUL SYLLABLE RIEUL OE PIEUPSIOS
+ 0x8F84: 0xB8C4, //HANGUL SYLLABLE RIEUL OE SSANGSIOS
+ 0x8F85: 0xB8C6, //HANGUL SYLLABLE RIEUL OE CIEUC
+ 0x8F86: 0xB8C7, //HANGUL SYLLABLE RIEUL OE CHIEUCH
+ 0x8F87: 0xB8C8, //HANGUL SYLLABLE RIEUL OE KHIEUKH
+ 0x8F88: 0xB8C9, //HANGUL SYLLABLE RIEUL OE THIEUTH
+ 0x8F89: 0xB8CA, //HANGUL SYLLABLE RIEUL OE PHIEUPH
+ 0x8F8A: 0xB8CB, //HANGUL SYLLABLE RIEUL OE HIEUH
+ 0x8F8B: 0xB8CD, //HANGUL SYLLABLE RIEUL YO KIYEOK
+ 0x8F8C: 0xB8CE, //HANGUL SYLLABLE RIEUL YO SSANGKIYEOK
+ 0x8F8D: 0xB8CF, //HANGUL SYLLABLE RIEUL YO KIYEOKSIOS
+ 0x8F8E: 0xB8D1, //HANGUL SYLLABLE RIEUL YO NIEUNCIEUC
+ 0x8F8F: 0xB8D2, //HANGUL SYLLABLE RIEUL YO NIEUNHIEUH
+ 0x8F90: 0xB8D3, //HANGUL SYLLABLE RIEUL YO TIKEUT
+ 0x8F91: 0xB8D5, //HANGUL SYLLABLE RIEUL YO RIEULKIYEOK
+ 0x8F92: 0xB8D6, //HANGUL SYLLABLE RIEUL YO RIEULMIEUM
+ 0x8F93: 0xB8D7, //HANGUL SYLLABLE RIEUL YO RIEULPIEUP
+ 0x8F94: 0xB8D8, //HANGUL SYLLABLE RIEUL YO RIEULSIOS
+ 0x8F95: 0xB8D9, //HANGUL SYLLABLE RIEUL YO RIEULTHIEUTH
+ 0x8F96: 0xB8DA, //HANGUL SYLLABLE RIEUL YO RIEULPHIEUPH
+ 0x8F97: 0xB8DB, //HANGUL SYLLABLE RIEUL YO RIEULHIEUH
+ 0x8F98: 0xB8DC, //HANGUL SYLLABLE RIEUL YO MIEUM
+ 0x8F99: 0xB8DE, //HANGUL SYLLABLE RIEUL YO PIEUPSIOS
+ 0x8F9A: 0xB8E0, //HANGUL SYLLABLE RIEUL YO SSANGSIOS
+ 0x8F9B: 0xB8E2, //HANGUL SYLLABLE RIEUL YO CIEUC
+ 0x8F9C: 0xB8E3, //HANGUL SYLLABLE RIEUL YO CHIEUCH
+ 0x8F9D: 0xB8E4, //HANGUL SYLLABLE RIEUL YO KHIEUKH
+ 0x8F9E: 0xB8E5, //HANGUL SYLLABLE RIEUL YO THIEUTH
+ 0x8F9F: 0xB8E6, //HANGUL SYLLABLE RIEUL YO PHIEUPH
+ 0x8FA0: 0xB8E7, //HANGUL SYLLABLE RIEUL YO HIEUH
+ 0x8FA1: 0xB8EA, //HANGUL SYLLABLE RIEUL U SSANGKIYEOK
+ 0x8FA2: 0xB8EB, //HANGUL SYLLABLE RIEUL U KIYEOKSIOS
+ 0x8FA3: 0xB8ED, //HANGUL SYLLABLE RIEUL U NIEUNCIEUC
+ 0x8FA4: 0xB8EE, //HANGUL SYLLABLE RIEUL U NIEUNHIEUH
+ 0x8FA5: 0xB8EF, //HANGUL SYLLABLE RIEUL U TIKEUT
+ 0x8FA6: 0xB8F1, //HANGUL SYLLABLE RIEUL U RIEULKIYEOK
+ 0x8FA7: 0xB8F2, //HANGUL SYLLABLE RIEUL U RIEULMIEUM
+ 0x8FA8: 0xB8F3, //HANGUL SYLLABLE RIEUL U RIEULPIEUP
+ 0x8FA9: 0xB8F4, //HANGUL SYLLABLE RIEUL U RIEULSIOS
+ 0x8FAA: 0xB8F5, //HANGUL SYLLABLE RIEUL U RIEULTHIEUTH
+ 0x8FAB: 0xB8F6, //HANGUL SYLLABLE RIEUL U RIEULPHIEUPH
+ 0x8FAC: 0xB8F7, //HANGUL SYLLABLE RIEUL U RIEULHIEUH
+ 0x8FAD: 0xB8FA, //HANGUL SYLLABLE RIEUL U PIEUPSIOS
+ 0x8FAE: 0xB8FC, //HANGUL SYLLABLE RIEUL U SSANGSIOS
+ 0x8FAF: 0xB8FE, //HANGUL SYLLABLE RIEUL U CIEUC
+ 0x8FB0: 0xB8FF, //HANGUL SYLLABLE RIEUL U CHIEUCH
+ 0x8FB1: 0xB900, //HANGUL SYLLABLE RIEUL U KHIEUKH
+ 0x8FB2: 0xB901, //HANGUL SYLLABLE RIEUL U THIEUTH
+ 0x8FB3: 0xB902, //HANGUL SYLLABLE RIEUL U PHIEUPH
+ 0x8FB4: 0xB903, //HANGUL SYLLABLE RIEUL U HIEUH
+ 0x8FB5: 0xB905, //HANGUL SYLLABLE RIEUL WEO KIYEOK
+ 0x8FB6: 0xB906, //HANGUL SYLLABLE RIEUL WEO SSANGKIYEOK
+ 0x8FB7: 0xB907, //HANGUL SYLLABLE RIEUL WEO KIYEOKSIOS
+ 0x8FB8: 0xB908, //HANGUL SYLLABLE RIEUL WEO NIEUN
+ 0x8FB9: 0xB909, //HANGUL SYLLABLE RIEUL WEO NIEUNCIEUC
+ 0x8FBA: 0xB90A, //HANGUL SYLLABLE RIEUL WEO NIEUNHIEUH
+ 0x8FBB: 0xB90B, //HANGUL SYLLABLE RIEUL WEO TIKEUT
+ 0x8FBC: 0xB90C, //HANGUL SYLLABLE RIEUL WEO RIEUL
+ 0x8FBD: 0xB90D, //HANGUL SYLLABLE RIEUL WEO RIEULKIYEOK
+ 0x8FBE: 0xB90E, //HANGUL SYLLABLE RIEUL WEO RIEULMIEUM
+ 0x8FBF: 0xB90F, //HANGUL SYLLABLE RIEUL WEO RIEULPIEUP
+ 0x8FC0: 0xB910, //HANGUL SYLLABLE RIEUL WEO RIEULSIOS
+ 0x8FC1: 0xB911, //HANGUL SYLLABLE RIEUL WEO RIEULTHIEUTH
+ 0x8FC2: 0xB912, //HANGUL SYLLABLE RIEUL WEO RIEULPHIEUPH
+ 0x8FC3: 0xB913, //HANGUL SYLLABLE RIEUL WEO RIEULHIEUH
+ 0x8FC4: 0xB914, //HANGUL SYLLABLE RIEUL WEO MIEUM
+ 0x8FC5: 0xB915, //HANGUL SYLLABLE RIEUL WEO PIEUP
+ 0x8FC6: 0xB916, //HANGUL SYLLABLE RIEUL WEO PIEUPSIOS
+ 0x8FC7: 0xB917, //HANGUL SYLLABLE RIEUL WEO SIOS
+ 0x8FC8: 0xB919, //HANGUL SYLLABLE RIEUL WEO IEUNG
+ 0x8FC9: 0xB91A, //HANGUL SYLLABLE RIEUL WEO CIEUC
+ 0x8FCA: 0xB91B, //HANGUL SYLLABLE RIEUL WEO CHIEUCH
+ 0x8FCB: 0xB91C, //HANGUL SYLLABLE RIEUL WEO KHIEUKH
+ 0x8FCC: 0xB91D, //HANGUL SYLLABLE RIEUL WEO THIEUTH
+ 0x8FCD: 0xB91E, //HANGUL SYLLABLE RIEUL WEO PHIEUPH
+ 0x8FCE: 0xB91F, //HANGUL SYLLABLE RIEUL WEO HIEUH
+ 0x8FCF: 0xB921, //HANGUL SYLLABLE RIEUL WE KIYEOK
+ 0x8FD0: 0xB922, //HANGUL SYLLABLE RIEUL WE SSANGKIYEOK
+ 0x8FD1: 0xB923, //HANGUL SYLLABLE RIEUL WE KIYEOKSIOS
+ 0x8FD2: 0xB924, //HANGUL SYLLABLE RIEUL WE NIEUN
+ 0x8FD3: 0xB925, //HANGUL SYLLABLE RIEUL WE NIEUNCIEUC
+ 0x8FD4: 0xB926, //HANGUL SYLLABLE RIEUL WE NIEUNHIEUH
+ 0x8FD5: 0xB927, //HANGUL SYLLABLE RIEUL WE TIKEUT
+ 0x8FD6: 0xB928, //HANGUL SYLLABLE RIEUL WE RIEUL
+ 0x8FD7: 0xB929, //HANGUL SYLLABLE RIEUL WE RIEULKIYEOK
+ 0x8FD8: 0xB92A, //HANGUL SYLLABLE RIEUL WE RIEULMIEUM
+ 0x8FD9: 0xB92B, //HANGUL SYLLABLE RIEUL WE RIEULPIEUP
+ 0x8FDA: 0xB92C, //HANGUL SYLLABLE RIEUL WE RIEULSIOS
+ 0x8FDB: 0xB92D, //HANGUL SYLLABLE RIEUL WE RIEULTHIEUTH
+ 0x8FDC: 0xB92E, //HANGUL SYLLABLE RIEUL WE RIEULPHIEUPH
+ 0x8FDD: 0xB92F, //HANGUL SYLLABLE RIEUL WE RIEULHIEUH
+ 0x8FDE: 0xB930, //HANGUL SYLLABLE RIEUL WE MIEUM
+ 0x8FDF: 0xB931, //HANGUL SYLLABLE RIEUL WE PIEUP
+ 0x8FE0: 0xB932, //HANGUL SYLLABLE RIEUL WE PIEUPSIOS
+ 0x8FE1: 0xB933, //HANGUL SYLLABLE RIEUL WE SIOS
+ 0x8FE2: 0xB934, //HANGUL SYLLABLE RIEUL WE SSANGSIOS
+ 0x8FE3: 0xB935, //HANGUL SYLLABLE RIEUL WE IEUNG
+ 0x8FE4: 0xB936, //HANGUL SYLLABLE RIEUL WE CIEUC
+ 0x8FE5: 0xB937, //HANGUL SYLLABLE RIEUL WE CHIEUCH
+ 0x8FE6: 0xB938, //HANGUL SYLLABLE RIEUL WE KHIEUKH
+ 0x8FE7: 0xB939, //HANGUL SYLLABLE RIEUL WE THIEUTH
+ 0x8FE8: 0xB93A, //HANGUL SYLLABLE RIEUL WE PHIEUPH
+ 0x8FE9: 0xB93B, //HANGUL SYLLABLE RIEUL WE HIEUH
+ 0x8FEA: 0xB93E, //HANGUL SYLLABLE RIEUL WI SSANGKIYEOK
+ 0x8FEB: 0xB93F, //HANGUL SYLLABLE RIEUL WI KIYEOKSIOS
+ 0x8FEC: 0xB941, //HANGUL SYLLABLE RIEUL WI NIEUNCIEUC
+ 0x8FED: 0xB942, //HANGUL SYLLABLE RIEUL WI NIEUNHIEUH
+ 0x8FEE: 0xB943, //HANGUL SYLLABLE RIEUL WI TIKEUT
+ 0x8FEF: 0xB945, //HANGUL SYLLABLE RIEUL WI RIEULKIYEOK
+ 0x8FF0: 0xB946, //HANGUL SYLLABLE RIEUL WI RIEULMIEUM
+ 0x8FF1: 0xB947, //HANGUL SYLLABLE RIEUL WI RIEULPIEUP
+ 0x8FF2: 0xB948, //HANGUL SYLLABLE RIEUL WI RIEULSIOS
+ 0x8FF3: 0xB949, //HANGUL SYLLABLE RIEUL WI RIEULTHIEUTH
+ 0x8FF4: 0xB94A, //HANGUL SYLLABLE RIEUL WI RIEULPHIEUPH
+ 0x8FF5: 0xB94B, //HANGUL SYLLABLE RIEUL WI RIEULHIEUH
+ 0x8FF6: 0xB94D, //HANGUL SYLLABLE RIEUL WI PIEUP
+ 0x8FF7: 0xB94E, //HANGUL SYLLABLE RIEUL WI PIEUPSIOS
+ 0x8FF8: 0xB950, //HANGUL SYLLABLE RIEUL WI SSANGSIOS
+ 0x8FF9: 0xB952, //HANGUL SYLLABLE RIEUL WI CIEUC
+ 0x8FFA: 0xB953, //HANGUL SYLLABLE RIEUL WI CHIEUCH
+ 0x8FFB: 0xB954, //HANGUL SYLLABLE RIEUL WI KHIEUKH
+ 0x8FFC: 0xB955, //HANGUL SYLLABLE RIEUL WI THIEUTH
+ 0x8FFD: 0xB956, //HANGUL SYLLABLE RIEUL WI PHIEUPH
+ 0x8FFE: 0xB957, //HANGUL SYLLABLE RIEUL WI HIEUH
+ 0x9041: 0xB95A, //HANGUL SYLLABLE RIEUL YU SSANGKIYEOK
+ 0x9042: 0xB95B, //HANGUL SYLLABLE RIEUL YU KIYEOKSIOS
+ 0x9043: 0xB95D, //HANGUL SYLLABLE RIEUL YU NIEUNCIEUC
+ 0x9044: 0xB95E, //HANGUL SYLLABLE RIEUL YU NIEUNHIEUH
+ 0x9045: 0xB95F, //HANGUL SYLLABLE RIEUL YU TIKEUT
+ 0x9046: 0xB961, //HANGUL SYLLABLE RIEUL YU RIEULKIYEOK
+ 0x9047: 0xB962, //HANGUL SYLLABLE RIEUL YU RIEULMIEUM
+ 0x9048: 0xB963, //HANGUL SYLLABLE RIEUL YU RIEULPIEUP
+ 0x9049: 0xB964, //HANGUL SYLLABLE RIEUL YU RIEULSIOS
+ 0x904A: 0xB965, //HANGUL SYLLABLE RIEUL YU RIEULTHIEUTH
+ 0x904B: 0xB966, //HANGUL SYLLABLE RIEUL YU RIEULPHIEUPH
+ 0x904C: 0xB967, //HANGUL SYLLABLE RIEUL YU RIEULHIEUH
+ 0x904D: 0xB96A, //HANGUL SYLLABLE RIEUL YU PIEUPSIOS
+ 0x904E: 0xB96C, //HANGUL SYLLABLE RIEUL YU SSANGSIOS
+ 0x904F: 0xB96E, //HANGUL SYLLABLE RIEUL YU CIEUC
+ 0x9050: 0xB96F, //HANGUL SYLLABLE RIEUL YU CHIEUCH
+ 0x9051: 0xB970, //HANGUL SYLLABLE RIEUL YU KHIEUKH
+ 0x9052: 0xB971, //HANGUL SYLLABLE RIEUL YU THIEUTH
+ 0x9053: 0xB972, //HANGUL SYLLABLE RIEUL YU PHIEUPH
+ 0x9054: 0xB973, //HANGUL SYLLABLE RIEUL YU HIEUH
+ 0x9055: 0xB976, //HANGUL SYLLABLE RIEUL EU SSANGKIYEOK
+ 0x9056: 0xB977, //HANGUL SYLLABLE RIEUL EU KIYEOKSIOS
+ 0x9057: 0xB979, //HANGUL SYLLABLE RIEUL EU NIEUNCIEUC
+ 0x9058: 0xB97A, //HANGUL SYLLABLE RIEUL EU NIEUNHIEUH
+ 0x9059: 0xB97B, //HANGUL SYLLABLE RIEUL EU TIKEUT
+ 0x905A: 0xB97D, //HANGUL SYLLABLE RIEUL EU RIEULKIYEOK
+ 0x9061: 0xB97E, //HANGUL SYLLABLE RIEUL EU RIEULMIEUM
+ 0x9062: 0xB97F, //HANGUL SYLLABLE RIEUL EU RIEULPIEUP
+ 0x9063: 0xB980, //HANGUL SYLLABLE RIEUL EU RIEULSIOS
+ 0x9064: 0xB981, //HANGUL SYLLABLE RIEUL EU RIEULTHIEUTH
+ 0x9065: 0xB982, //HANGUL SYLLABLE RIEUL EU RIEULPHIEUPH
+ 0x9066: 0xB983, //HANGUL SYLLABLE RIEUL EU RIEULHIEUH
+ 0x9067: 0xB986, //HANGUL SYLLABLE RIEUL EU PIEUPSIOS
+ 0x9068: 0xB988, //HANGUL SYLLABLE RIEUL EU SSANGSIOS
+ 0x9069: 0xB98B, //HANGUL SYLLABLE RIEUL EU CHIEUCH
+ 0x906A: 0xB98C, //HANGUL SYLLABLE RIEUL EU KHIEUKH
+ 0x906B: 0xB98F, //HANGUL SYLLABLE RIEUL EU HIEUH
+ 0x906C: 0xB990, //HANGUL SYLLABLE RIEUL YI
+ 0x906D: 0xB991, //HANGUL SYLLABLE RIEUL YI KIYEOK
+ 0x906E: 0xB992, //HANGUL SYLLABLE RIEUL YI SSANGKIYEOK
+ 0x906F: 0xB993, //HANGUL SYLLABLE RIEUL YI KIYEOKSIOS
+ 0x9070: 0xB994, //HANGUL SYLLABLE RIEUL YI NIEUN
+ 0x9071: 0xB995, //HANGUL SYLLABLE RIEUL YI NIEUNCIEUC
+ 0x9072: 0xB996, //HANGUL SYLLABLE RIEUL YI NIEUNHIEUH
+ 0x9073: 0xB997, //HANGUL SYLLABLE RIEUL YI TIKEUT
+ 0x9074: 0xB998, //HANGUL SYLLABLE RIEUL YI RIEUL
+ 0x9075: 0xB999, //HANGUL SYLLABLE RIEUL YI RIEULKIYEOK
+ 0x9076: 0xB99A, //HANGUL SYLLABLE RIEUL YI RIEULMIEUM
+ 0x9077: 0xB99B, //HANGUL SYLLABLE RIEUL YI RIEULPIEUP
+ 0x9078: 0xB99C, //HANGUL SYLLABLE RIEUL YI RIEULSIOS
+ 0x9079: 0xB99D, //HANGUL SYLLABLE RIEUL YI RIEULTHIEUTH
+ 0x907A: 0xB99E, //HANGUL SYLLABLE RIEUL YI RIEULPHIEUPH
+ 0x9081: 0xB99F, //HANGUL SYLLABLE RIEUL YI RIEULHIEUH
+ 0x9082: 0xB9A0, //HANGUL SYLLABLE RIEUL YI MIEUM
+ 0x9083: 0xB9A1, //HANGUL SYLLABLE RIEUL YI PIEUP
+ 0x9084: 0xB9A2, //HANGUL SYLLABLE RIEUL YI PIEUPSIOS
+ 0x9085: 0xB9A3, //HANGUL SYLLABLE RIEUL YI SIOS
+ 0x9086: 0xB9A4, //HANGUL SYLLABLE RIEUL YI SSANGSIOS
+ 0x9087: 0xB9A5, //HANGUL SYLLABLE RIEUL YI IEUNG
+ 0x9088: 0xB9A6, //HANGUL SYLLABLE RIEUL YI CIEUC
+ 0x9089: 0xB9A7, //HANGUL SYLLABLE RIEUL YI CHIEUCH
+ 0x908A: 0xB9A8, //HANGUL SYLLABLE RIEUL YI KHIEUKH
+ 0x908B: 0xB9A9, //HANGUL SYLLABLE RIEUL YI THIEUTH
+ 0x908C: 0xB9AA, //HANGUL SYLLABLE RIEUL YI PHIEUPH
+ 0x908D: 0xB9AB, //HANGUL SYLLABLE RIEUL YI HIEUH
+ 0x908E: 0xB9AE, //HANGUL SYLLABLE RIEUL I SSANGKIYEOK
+ 0x908F: 0xB9AF, //HANGUL SYLLABLE RIEUL I KIYEOKSIOS
+ 0x9090: 0xB9B1, //HANGUL SYLLABLE RIEUL I NIEUNCIEUC
+ 0x9091: 0xB9B2, //HANGUL SYLLABLE RIEUL I NIEUNHIEUH
+ 0x9092: 0xB9B3, //HANGUL SYLLABLE RIEUL I TIKEUT
+ 0x9093: 0xB9B5, //HANGUL SYLLABLE RIEUL I RIEULKIYEOK
+ 0x9094: 0xB9B6, //HANGUL SYLLABLE RIEUL I RIEULMIEUM
+ 0x9095: 0xB9B7, //HANGUL SYLLABLE RIEUL I RIEULPIEUP
+ 0x9096: 0xB9B8, //HANGUL SYLLABLE RIEUL I RIEULSIOS
+ 0x9097: 0xB9B9, //HANGUL SYLLABLE RIEUL I RIEULTHIEUTH
+ 0x9098: 0xB9BA, //HANGUL SYLLABLE RIEUL I RIEULPHIEUPH
+ 0x9099: 0xB9BB, //HANGUL SYLLABLE RIEUL I RIEULHIEUH
+ 0x909A: 0xB9BE, //HANGUL SYLLABLE RIEUL I PIEUPSIOS
+ 0x909B: 0xB9C0, //HANGUL SYLLABLE RIEUL I SSANGSIOS
+ 0x909C: 0xB9C2, //HANGUL SYLLABLE RIEUL I CIEUC
+ 0x909D: 0xB9C3, //HANGUL SYLLABLE RIEUL I CHIEUCH
+ 0x909E: 0xB9C4, //HANGUL SYLLABLE RIEUL I KHIEUKH
+ 0x909F: 0xB9C5, //HANGUL SYLLABLE RIEUL I THIEUTH
+ 0x90A0: 0xB9C6, //HANGUL SYLLABLE RIEUL I PHIEUPH
+ 0x90A1: 0xB9C7, //HANGUL SYLLABLE RIEUL I HIEUH
+ 0x90A2: 0xB9CA, //HANGUL SYLLABLE MIEUM A SSANGKIYEOK
+ 0x90A3: 0xB9CB, //HANGUL SYLLABLE MIEUM A KIYEOKSIOS
+ 0x90A4: 0xB9CD, //HANGUL SYLLABLE MIEUM A NIEUNCIEUC
+ 0x90A5: 0xB9D3, //HANGUL SYLLABLE MIEUM A RIEULPIEUP
+ 0x90A6: 0xB9D4, //HANGUL SYLLABLE MIEUM A RIEULSIOS
+ 0x90A7: 0xB9D5, //HANGUL SYLLABLE MIEUM A RIEULTHIEUTH
+ 0x90A8: 0xB9D6, //HANGUL SYLLABLE MIEUM A RIEULPHIEUPH
+ 0x90A9: 0xB9D7, //HANGUL SYLLABLE MIEUM A RIEULHIEUH
+ 0x90AA: 0xB9DA, //HANGUL SYLLABLE MIEUM A PIEUPSIOS
+ 0x90AB: 0xB9DC, //HANGUL SYLLABLE MIEUM A SSANGSIOS
+ 0x90AC: 0xB9DF, //HANGUL SYLLABLE MIEUM A CHIEUCH
+ 0x90AD: 0xB9E0, //HANGUL SYLLABLE MIEUM A KHIEUKH
+ 0x90AE: 0xB9E2, //HANGUL SYLLABLE MIEUM A PHIEUPH
+ 0x90AF: 0xB9E6, //HANGUL SYLLABLE MIEUM AE SSANGKIYEOK
+ 0x90B0: 0xB9E7, //HANGUL SYLLABLE MIEUM AE KIYEOKSIOS
+ 0x90B1: 0xB9E9, //HANGUL SYLLABLE MIEUM AE NIEUNCIEUC
+ 0x90B2: 0xB9EA, //HANGUL SYLLABLE MIEUM AE NIEUNHIEUH
+ 0x90B3: 0xB9EB, //HANGUL SYLLABLE MIEUM AE TIKEUT
+ 0x90B4: 0xB9ED, //HANGUL SYLLABLE MIEUM AE RIEULKIYEOK
+ 0x90B5: 0xB9EE, //HANGUL SYLLABLE MIEUM AE RIEULMIEUM
+ 0x90B6: 0xB9EF, //HANGUL SYLLABLE MIEUM AE RIEULPIEUP
+ 0x90B7: 0xB9F0, //HANGUL SYLLABLE MIEUM AE RIEULSIOS
+ 0x90B8: 0xB9F1, //HANGUL SYLLABLE MIEUM AE RIEULTHIEUTH
+ 0x90B9: 0xB9F2, //HANGUL SYLLABLE MIEUM AE RIEULPHIEUPH
+ 0x90BA: 0xB9F3, //HANGUL SYLLABLE MIEUM AE RIEULHIEUH
+ 0x90BB: 0xB9F6, //HANGUL SYLLABLE MIEUM AE PIEUPSIOS
+ 0x90BC: 0xB9FB, //HANGUL SYLLABLE MIEUM AE CHIEUCH
+ 0x90BD: 0xB9FC, //HANGUL SYLLABLE MIEUM AE KHIEUKH
+ 0x90BE: 0xB9FD, //HANGUL SYLLABLE MIEUM AE THIEUTH
+ 0x90BF: 0xB9FE, //HANGUL SYLLABLE MIEUM AE PHIEUPH
+ 0x90C0: 0xB9FF, //HANGUL SYLLABLE MIEUM AE HIEUH
+ 0x90C1: 0xBA02, //HANGUL SYLLABLE MIEUM YA SSANGKIYEOK
+ 0x90C2: 0xBA03, //HANGUL SYLLABLE MIEUM YA KIYEOKSIOS
+ 0x90C3: 0xBA04, //HANGUL SYLLABLE MIEUM YA NIEUN
+ 0x90C4: 0xBA05, //HANGUL SYLLABLE MIEUM YA NIEUNCIEUC
+ 0x90C5: 0xBA06, //HANGUL SYLLABLE MIEUM YA NIEUNHIEUH
+ 0x90C6: 0xBA07, //HANGUL SYLLABLE MIEUM YA TIKEUT
+ 0x90C7: 0xBA09, //HANGUL SYLLABLE MIEUM YA RIEULKIYEOK
+ 0x90C8: 0xBA0A, //HANGUL SYLLABLE MIEUM YA RIEULMIEUM
+ 0x90C9: 0xBA0B, //HANGUL SYLLABLE MIEUM YA RIEULPIEUP
+ 0x90CA: 0xBA0C, //HANGUL SYLLABLE MIEUM YA RIEULSIOS
+ 0x90CB: 0xBA0D, //HANGUL SYLLABLE MIEUM YA RIEULTHIEUTH
+ 0x90CC: 0xBA0E, //HANGUL SYLLABLE MIEUM YA RIEULPHIEUPH
+ 0x90CD: 0xBA0F, //HANGUL SYLLABLE MIEUM YA RIEULHIEUH
+ 0x90CE: 0xBA10, //HANGUL SYLLABLE MIEUM YA MIEUM
+ 0x90CF: 0xBA11, //HANGUL SYLLABLE MIEUM YA PIEUP
+ 0x90D0: 0xBA12, //HANGUL SYLLABLE MIEUM YA PIEUPSIOS
+ 0x90D1: 0xBA13, //HANGUL SYLLABLE MIEUM YA SIOS
+ 0x90D2: 0xBA14, //HANGUL SYLLABLE MIEUM YA SSANGSIOS
+ 0x90D3: 0xBA16, //HANGUL SYLLABLE MIEUM YA CIEUC
+ 0x90D4: 0xBA17, //HANGUL SYLLABLE MIEUM YA CHIEUCH
+ 0x90D5: 0xBA18, //HANGUL SYLLABLE MIEUM YA KHIEUKH
+ 0x90D6: 0xBA19, //HANGUL SYLLABLE MIEUM YA THIEUTH
+ 0x90D7: 0xBA1A, //HANGUL SYLLABLE MIEUM YA PHIEUPH
+ 0x90D8: 0xBA1B, //HANGUL SYLLABLE MIEUM YA HIEUH
+ 0x90D9: 0xBA1C, //HANGUL SYLLABLE MIEUM YAE
+ 0x90DA: 0xBA1D, //HANGUL SYLLABLE MIEUM YAE KIYEOK
+ 0x90DB: 0xBA1E, //HANGUL SYLLABLE MIEUM YAE SSANGKIYEOK
+ 0x90DC: 0xBA1F, //HANGUL SYLLABLE MIEUM YAE KIYEOKSIOS
+ 0x90DD: 0xBA20, //HANGUL SYLLABLE MIEUM YAE NIEUN
+ 0x90DE: 0xBA21, //HANGUL SYLLABLE MIEUM YAE NIEUNCIEUC
+ 0x90DF: 0xBA22, //HANGUL SYLLABLE MIEUM YAE NIEUNHIEUH
+ 0x90E0: 0xBA23, //HANGUL SYLLABLE MIEUM YAE TIKEUT
+ 0x90E1: 0xBA24, //HANGUL SYLLABLE MIEUM YAE RIEUL
+ 0x90E2: 0xBA25, //HANGUL SYLLABLE MIEUM YAE RIEULKIYEOK
+ 0x90E3: 0xBA26, //HANGUL SYLLABLE MIEUM YAE RIEULMIEUM
+ 0x90E4: 0xBA27, //HANGUL SYLLABLE MIEUM YAE RIEULPIEUP
+ 0x90E5: 0xBA28, //HANGUL SYLLABLE MIEUM YAE RIEULSIOS
+ 0x90E6: 0xBA29, //HANGUL SYLLABLE MIEUM YAE RIEULTHIEUTH
+ 0x90E7: 0xBA2A, //HANGUL SYLLABLE MIEUM YAE RIEULPHIEUPH
+ 0x90E8: 0xBA2B, //HANGUL SYLLABLE MIEUM YAE RIEULHIEUH
+ 0x90E9: 0xBA2C, //HANGUL SYLLABLE MIEUM YAE MIEUM
+ 0x90EA: 0xBA2D, //HANGUL SYLLABLE MIEUM YAE PIEUP
+ 0x90EB: 0xBA2E, //HANGUL SYLLABLE MIEUM YAE PIEUPSIOS
+ 0x90EC: 0xBA2F, //HANGUL SYLLABLE MIEUM YAE SIOS
+ 0x90ED: 0xBA30, //HANGUL SYLLABLE MIEUM YAE SSANGSIOS
+ 0x90EE: 0xBA31, //HANGUL SYLLABLE MIEUM YAE IEUNG
+ 0x90EF: 0xBA32, //HANGUL SYLLABLE MIEUM YAE CIEUC
+ 0x90F0: 0xBA33, //HANGUL SYLLABLE MIEUM YAE CHIEUCH
+ 0x90F1: 0xBA34, //HANGUL SYLLABLE MIEUM YAE KHIEUKH
+ 0x90F2: 0xBA35, //HANGUL SYLLABLE MIEUM YAE THIEUTH
+ 0x90F3: 0xBA36, //HANGUL SYLLABLE MIEUM YAE PHIEUPH
+ 0x90F4: 0xBA37, //HANGUL SYLLABLE MIEUM YAE HIEUH
+ 0x90F5: 0xBA3A, //HANGUL SYLLABLE MIEUM EO SSANGKIYEOK
+ 0x90F6: 0xBA3B, //HANGUL SYLLABLE MIEUM EO KIYEOKSIOS
+ 0x90F7: 0xBA3D, //HANGUL SYLLABLE MIEUM EO NIEUNCIEUC
+ 0x90F8: 0xBA3E, //HANGUL SYLLABLE MIEUM EO NIEUNHIEUH
+ 0x90F9: 0xBA3F, //HANGUL SYLLABLE MIEUM EO TIKEUT
+ 0x90FA: 0xBA41, //HANGUL SYLLABLE MIEUM EO RIEULKIYEOK
+ 0x90FB: 0xBA43, //HANGUL SYLLABLE MIEUM EO RIEULPIEUP
+ 0x90FC: 0xBA44, //HANGUL SYLLABLE MIEUM EO RIEULSIOS
+ 0x90FD: 0xBA45, //HANGUL SYLLABLE MIEUM EO RIEULTHIEUTH
+ 0x90FE: 0xBA46, //HANGUL SYLLABLE MIEUM EO RIEULPHIEUPH
+ 0x9141: 0xBA47, //HANGUL SYLLABLE MIEUM EO RIEULHIEUH
+ 0x9142: 0xBA4A, //HANGUL SYLLABLE MIEUM EO PIEUPSIOS
+ 0x9143: 0xBA4C, //HANGUL SYLLABLE MIEUM EO SSANGSIOS
+ 0x9144: 0xBA4F, //HANGUL SYLLABLE MIEUM EO CHIEUCH
+ 0x9145: 0xBA50, //HANGUL SYLLABLE MIEUM EO KHIEUKH
+ 0x9146: 0xBA51, //HANGUL SYLLABLE MIEUM EO THIEUTH
+ 0x9147: 0xBA52, //HANGUL SYLLABLE MIEUM EO PHIEUPH
+ 0x9148: 0xBA56, //HANGUL SYLLABLE MIEUM E SSANGKIYEOK
+ 0x9149: 0xBA57, //HANGUL SYLLABLE MIEUM E KIYEOKSIOS
+ 0x914A: 0xBA59, //HANGUL SYLLABLE MIEUM E NIEUNCIEUC
+ 0x914B: 0xBA5A, //HANGUL SYLLABLE MIEUM E NIEUNHIEUH
+ 0x914C: 0xBA5B, //HANGUL SYLLABLE MIEUM E TIKEUT
+ 0x914D: 0xBA5D, //HANGUL SYLLABLE MIEUM E RIEULKIYEOK
+ 0x914E: 0xBA5E, //HANGUL SYLLABLE MIEUM E RIEULMIEUM
+ 0x914F: 0xBA5F, //HANGUL SYLLABLE MIEUM E RIEULPIEUP
+ 0x9150: 0xBA60, //HANGUL SYLLABLE MIEUM E RIEULSIOS
+ 0x9151: 0xBA61, //HANGUL SYLLABLE MIEUM E RIEULTHIEUTH
+ 0x9152: 0xBA62, //HANGUL SYLLABLE MIEUM E RIEULPHIEUPH
+ 0x9153: 0xBA63, //HANGUL SYLLABLE MIEUM E RIEULHIEUH
+ 0x9154: 0xBA66, //HANGUL SYLLABLE MIEUM E PIEUPSIOS
+ 0x9155: 0xBA6A, //HANGUL SYLLABLE MIEUM E CIEUC
+ 0x9156: 0xBA6B, //HANGUL SYLLABLE MIEUM E CHIEUCH
+ 0x9157: 0xBA6C, //HANGUL SYLLABLE MIEUM E KHIEUKH
+ 0x9158: 0xBA6D, //HANGUL SYLLABLE MIEUM E THIEUTH
+ 0x9159: 0xBA6E, //HANGUL SYLLABLE MIEUM E PHIEUPH
+ 0x915A: 0xBA6F, //HANGUL SYLLABLE MIEUM E HIEUH
+ 0x9161: 0xBA72, //HANGUL SYLLABLE MIEUM YEO SSANGKIYEOK
+ 0x9162: 0xBA73, //HANGUL SYLLABLE MIEUM YEO KIYEOKSIOS
+ 0x9163: 0xBA75, //HANGUL SYLLABLE MIEUM YEO NIEUNCIEUC
+ 0x9164: 0xBA76, //HANGUL SYLLABLE MIEUM YEO NIEUNHIEUH
+ 0x9165: 0xBA77, //HANGUL SYLLABLE MIEUM YEO TIKEUT
+ 0x9166: 0xBA79, //HANGUL SYLLABLE MIEUM YEO RIEULKIYEOK
+ 0x9167: 0xBA7A, //HANGUL SYLLABLE MIEUM YEO RIEULMIEUM
+ 0x9168: 0xBA7B, //HANGUL SYLLABLE MIEUM YEO RIEULPIEUP
+ 0x9169: 0xBA7C, //HANGUL SYLLABLE MIEUM YEO RIEULSIOS
+ 0x916A: 0xBA7D, //HANGUL SYLLABLE MIEUM YEO RIEULTHIEUTH
+ 0x916B: 0xBA7E, //HANGUL SYLLABLE MIEUM YEO RIEULPHIEUPH
+ 0x916C: 0xBA7F, //HANGUL SYLLABLE MIEUM YEO RIEULHIEUH
+ 0x916D: 0xBA80, //HANGUL SYLLABLE MIEUM YEO MIEUM
+ 0x916E: 0xBA81, //HANGUL SYLLABLE MIEUM YEO PIEUP
+ 0x916F: 0xBA82, //HANGUL SYLLABLE MIEUM YEO PIEUPSIOS
+ 0x9170: 0xBA86, //HANGUL SYLLABLE MIEUM YEO CIEUC
+ 0x9171: 0xBA88, //HANGUL SYLLABLE MIEUM YEO KHIEUKH
+ 0x9172: 0xBA89, //HANGUL SYLLABLE MIEUM YEO THIEUTH
+ 0x9173: 0xBA8A, //HANGUL SYLLABLE MIEUM YEO PHIEUPH
+ 0x9174: 0xBA8B, //HANGUL SYLLABLE MIEUM YEO HIEUH
+ 0x9175: 0xBA8D, //HANGUL SYLLABLE MIEUM YE KIYEOK
+ 0x9176: 0xBA8E, //HANGUL SYLLABLE MIEUM YE SSANGKIYEOK
+ 0x9177: 0xBA8F, //HANGUL SYLLABLE MIEUM YE KIYEOKSIOS
+ 0x9178: 0xBA90, //HANGUL SYLLABLE MIEUM YE NIEUN
+ 0x9179: 0xBA91, //HANGUL SYLLABLE MIEUM YE NIEUNCIEUC
+ 0x917A: 0xBA92, //HANGUL SYLLABLE MIEUM YE NIEUNHIEUH
+ 0x9181: 0xBA93, //HANGUL SYLLABLE MIEUM YE TIKEUT
+ 0x9182: 0xBA94, //HANGUL SYLLABLE MIEUM YE RIEUL
+ 0x9183: 0xBA95, //HANGUL SYLLABLE MIEUM YE RIEULKIYEOK
+ 0x9184: 0xBA96, //HANGUL SYLLABLE MIEUM YE RIEULMIEUM
+ 0x9185: 0xBA97, //HANGUL SYLLABLE MIEUM YE RIEULPIEUP
+ 0x9186: 0xBA98, //HANGUL SYLLABLE MIEUM YE RIEULSIOS
+ 0x9187: 0xBA99, //HANGUL SYLLABLE MIEUM YE RIEULTHIEUTH
+ 0x9188: 0xBA9A, //HANGUL SYLLABLE MIEUM YE RIEULPHIEUPH
+ 0x9189: 0xBA9B, //HANGUL SYLLABLE MIEUM YE RIEULHIEUH
+ 0x918A: 0xBA9C, //HANGUL SYLLABLE MIEUM YE MIEUM
+ 0x918B: 0xBA9D, //HANGUL SYLLABLE MIEUM YE PIEUP
+ 0x918C: 0xBA9E, //HANGUL SYLLABLE MIEUM YE PIEUPSIOS
+ 0x918D: 0xBA9F, //HANGUL SYLLABLE MIEUM YE SIOS
+ 0x918E: 0xBAA0, //HANGUL SYLLABLE MIEUM YE SSANGSIOS
+ 0x918F: 0xBAA1, //HANGUL SYLLABLE MIEUM YE IEUNG
+ 0x9190: 0xBAA2, //HANGUL SYLLABLE MIEUM YE CIEUC
+ 0x9191: 0xBAA3, //HANGUL SYLLABLE MIEUM YE CHIEUCH
+ 0x9192: 0xBAA4, //HANGUL SYLLABLE MIEUM YE KHIEUKH
+ 0x9193: 0xBAA5, //HANGUL SYLLABLE MIEUM YE THIEUTH
+ 0x9194: 0xBAA6, //HANGUL SYLLABLE MIEUM YE PHIEUPH
+ 0x9195: 0xBAA7, //HANGUL SYLLABLE MIEUM YE HIEUH
+ 0x9196: 0xBAAA, //HANGUL SYLLABLE MIEUM O SSANGKIYEOK
+ 0x9197: 0xBAAD, //HANGUL SYLLABLE MIEUM O NIEUNCIEUC
+ 0x9198: 0xBAAE, //HANGUL SYLLABLE MIEUM O NIEUNHIEUH
+ 0x9199: 0xBAAF, //HANGUL SYLLABLE MIEUM O TIKEUT
+ 0x919A: 0xBAB1, //HANGUL SYLLABLE MIEUM O RIEULKIYEOK
+ 0x919B: 0xBAB3, //HANGUL SYLLABLE MIEUM O RIEULPIEUP
+ 0x919C: 0xBAB4, //HANGUL SYLLABLE MIEUM O RIEULSIOS
+ 0x919D: 0xBAB5, //HANGUL SYLLABLE MIEUM O RIEULTHIEUTH
+ 0x919E: 0xBAB6, //HANGUL SYLLABLE MIEUM O RIEULPHIEUPH
+ 0x919F: 0xBAB7, //HANGUL SYLLABLE MIEUM O RIEULHIEUH
+ 0x91A0: 0xBABA, //HANGUL SYLLABLE MIEUM O PIEUPSIOS
+ 0x91A1: 0xBABC, //HANGUL SYLLABLE MIEUM O SSANGSIOS
+ 0x91A2: 0xBABE, //HANGUL SYLLABLE MIEUM O CIEUC
+ 0x91A3: 0xBABF, //HANGUL SYLLABLE MIEUM O CHIEUCH
+ 0x91A4: 0xBAC0, //HANGUL SYLLABLE MIEUM O KHIEUKH
+ 0x91A5: 0xBAC1, //HANGUL SYLLABLE MIEUM O THIEUTH
+ 0x91A6: 0xBAC2, //HANGUL SYLLABLE MIEUM O PHIEUPH
+ 0x91A7: 0xBAC3, //HANGUL SYLLABLE MIEUM O HIEUH
+ 0x91A8: 0xBAC5, //HANGUL SYLLABLE MIEUM WA KIYEOK
+ 0x91A9: 0xBAC6, //HANGUL SYLLABLE MIEUM WA SSANGKIYEOK
+ 0x91AA: 0xBAC7, //HANGUL SYLLABLE MIEUM WA KIYEOKSIOS
+ 0x91AB: 0xBAC9, //HANGUL SYLLABLE MIEUM WA NIEUNCIEUC
+ 0x91AC: 0xBACA, //HANGUL SYLLABLE MIEUM WA NIEUNHIEUH
+ 0x91AD: 0xBACB, //HANGUL SYLLABLE MIEUM WA TIKEUT
+ 0x91AE: 0xBACC, //HANGUL SYLLABLE MIEUM WA RIEUL
+ 0x91AF: 0xBACD, //HANGUL SYLLABLE MIEUM WA RIEULKIYEOK
+ 0x91B0: 0xBACE, //HANGUL SYLLABLE MIEUM WA RIEULMIEUM
+ 0x91B1: 0xBACF, //HANGUL SYLLABLE MIEUM WA RIEULPIEUP
+ 0x91B2: 0xBAD0, //HANGUL SYLLABLE MIEUM WA RIEULSIOS
+ 0x91B3: 0xBAD1, //HANGUL SYLLABLE MIEUM WA RIEULTHIEUTH
+ 0x91B4: 0xBAD2, //HANGUL SYLLABLE MIEUM WA RIEULPHIEUPH
+ 0x91B5: 0xBAD3, //HANGUL SYLLABLE MIEUM WA RIEULHIEUH
+ 0x91B6: 0xBAD4, //HANGUL SYLLABLE MIEUM WA MIEUM
+ 0x91B7: 0xBAD5, //HANGUL SYLLABLE MIEUM WA PIEUP
+ 0x91B8: 0xBAD6, //HANGUL SYLLABLE MIEUM WA PIEUPSIOS
+ 0x91B9: 0xBAD7, //HANGUL SYLLABLE MIEUM WA SIOS
+ 0x91BA: 0xBADA, //HANGUL SYLLABLE MIEUM WA CIEUC
+ 0x91BB: 0xBADB, //HANGUL SYLLABLE MIEUM WA CHIEUCH
+ 0x91BC: 0xBADC, //HANGUL SYLLABLE MIEUM WA KHIEUKH
+ 0x91BD: 0xBADD, //HANGUL SYLLABLE MIEUM WA THIEUTH
+ 0x91BE: 0xBADE, //HANGUL SYLLABLE MIEUM WA PHIEUPH
+ 0x91BF: 0xBADF, //HANGUL SYLLABLE MIEUM WA HIEUH
+ 0x91C0: 0xBAE0, //HANGUL SYLLABLE MIEUM WAE
+ 0x91C1: 0xBAE1, //HANGUL SYLLABLE MIEUM WAE KIYEOK
+ 0x91C2: 0xBAE2, //HANGUL SYLLABLE MIEUM WAE SSANGKIYEOK
+ 0x91C3: 0xBAE3, //HANGUL SYLLABLE MIEUM WAE KIYEOKSIOS
+ 0x91C4: 0xBAE4, //HANGUL SYLLABLE MIEUM WAE NIEUN
+ 0x91C5: 0xBAE5, //HANGUL SYLLABLE MIEUM WAE NIEUNCIEUC
+ 0x91C6: 0xBAE6, //HANGUL SYLLABLE MIEUM WAE NIEUNHIEUH
+ 0x91C7: 0xBAE7, //HANGUL SYLLABLE MIEUM WAE TIKEUT
+ 0x91C8: 0xBAE8, //HANGUL SYLLABLE MIEUM WAE RIEUL
+ 0x91C9: 0xBAE9, //HANGUL SYLLABLE MIEUM WAE RIEULKIYEOK
+ 0x91CA: 0xBAEA, //HANGUL SYLLABLE MIEUM WAE RIEULMIEUM
+ 0x91CB: 0xBAEB, //HANGUL SYLLABLE MIEUM WAE RIEULPIEUP
+ 0x91CC: 0xBAEC, //HANGUL SYLLABLE MIEUM WAE RIEULSIOS
+ 0x91CD: 0xBAED, //HANGUL SYLLABLE MIEUM WAE RIEULTHIEUTH
+ 0x91CE: 0xBAEE, //HANGUL SYLLABLE MIEUM WAE RIEULPHIEUPH
+ 0x91CF: 0xBAEF, //HANGUL SYLLABLE MIEUM WAE RIEULHIEUH
+ 0x91D0: 0xBAF0, //HANGUL SYLLABLE MIEUM WAE MIEUM
+ 0x91D1: 0xBAF1, //HANGUL SYLLABLE MIEUM WAE PIEUP
+ 0x91D2: 0xBAF2, //HANGUL SYLLABLE MIEUM WAE PIEUPSIOS
+ 0x91D3: 0xBAF3, //HANGUL SYLLABLE MIEUM WAE SIOS
+ 0x91D4: 0xBAF4, //HANGUL SYLLABLE MIEUM WAE SSANGSIOS
+ 0x91D5: 0xBAF5, //HANGUL SYLLABLE MIEUM WAE IEUNG
+ 0x91D6: 0xBAF6, //HANGUL SYLLABLE MIEUM WAE CIEUC
+ 0x91D7: 0xBAF7, //HANGUL SYLLABLE MIEUM WAE CHIEUCH
+ 0x91D8: 0xBAF8, //HANGUL SYLLABLE MIEUM WAE KHIEUKH
+ 0x91D9: 0xBAF9, //HANGUL SYLLABLE MIEUM WAE THIEUTH
+ 0x91DA: 0xBAFA, //HANGUL SYLLABLE MIEUM WAE PHIEUPH
+ 0x91DB: 0xBAFB, //HANGUL SYLLABLE MIEUM WAE HIEUH
+ 0x91DC: 0xBAFD, //HANGUL SYLLABLE MIEUM OE KIYEOK
+ 0x91DD: 0xBAFE, //HANGUL SYLLABLE MIEUM OE SSANGKIYEOK
+ 0x91DE: 0xBAFF, //HANGUL SYLLABLE MIEUM OE KIYEOKSIOS
+ 0x91DF: 0xBB01, //HANGUL SYLLABLE MIEUM OE NIEUNCIEUC
+ 0x91E0: 0xBB02, //HANGUL SYLLABLE MIEUM OE NIEUNHIEUH
+ 0x91E1: 0xBB03, //HANGUL SYLLABLE MIEUM OE TIKEUT
+ 0x91E2: 0xBB05, //HANGUL SYLLABLE MIEUM OE RIEULKIYEOK
+ 0x91E3: 0xBB06, //HANGUL SYLLABLE MIEUM OE RIEULMIEUM
+ 0x91E4: 0xBB07, //HANGUL SYLLABLE MIEUM OE RIEULPIEUP
+ 0x91E5: 0xBB08, //HANGUL SYLLABLE MIEUM OE RIEULSIOS
+ 0x91E6: 0xBB09, //HANGUL SYLLABLE MIEUM OE RIEULTHIEUTH
+ 0x91E7: 0xBB0A, //HANGUL SYLLABLE MIEUM OE RIEULPHIEUPH
+ 0x91E8: 0xBB0B, //HANGUL SYLLABLE MIEUM OE RIEULHIEUH
+ 0x91E9: 0xBB0C, //HANGUL SYLLABLE MIEUM OE MIEUM
+ 0x91EA: 0xBB0E, //HANGUL SYLLABLE MIEUM OE PIEUPSIOS
+ 0x91EB: 0xBB10, //HANGUL SYLLABLE MIEUM OE SSANGSIOS
+ 0x91EC: 0xBB12, //HANGUL SYLLABLE MIEUM OE CIEUC
+ 0x91ED: 0xBB13, //HANGUL SYLLABLE MIEUM OE CHIEUCH
+ 0x91EE: 0xBB14, //HANGUL SYLLABLE MIEUM OE KHIEUKH
+ 0x91EF: 0xBB15, //HANGUL SYLLABLE MIEUM OE THIEUTH
+ 0x91F0: 0xBB16, //HANGUL SYLLABLE MIEUM OE PHIEUPH
+ 0x91F1: 0xBB17, //HANGUL SYLLABLE MIEUM OE HIEUH
+ 0x91F2: 0xBB19, //HANGUL SYLLABLE MIEUM YO KIYEOK
+ 0x91F3: 0xBB1A, //HANGUL SYLLABLE MIEUM YO SSANGKIYEOK
+ 0x91F4: 0xBB1B, //HANGUL SYLLABLE MIEUM YO KIYEOKSIOS
+ 0x91F5: 0xBB1D, //HANGUL SYLLABLE MIEUM YO NIEUNCIEUC
+ 0x91F6: 0xBB1E, //HANGUL SYLLABLE MIEUM YO NIEUNHIEUH
+ 0x91F7: 0xBB1F, //HANGUL SYLLABLE MIEUM YO TIKEUT
+ 0x91F8: 0xBB21, //HANGUL SYLLABLE MIEUM YO RIEULKIYEOK
+ 0x91F9: 0xBB22, //HANGUL SYLLABLE MIEUM YO RIEULMIEUM
+ 0x91FA: 0xBB23, //HANGUL SYLLABLE MIEUM YO RIEULPIEUP
+ 0x91FB: 0xBB24, //HANGUL SYLLABLE MIEUM YO RIEULSIOS
+ 0x91FC: 0xBB25, //HANGUL SYLLABLE MIEUM YO RIEULTHIEUTH
+ 0x91FD: 0xBB26, //HANGUL SYLLABLE MIEUM YO RIEULPHIEUPH
+ 0x91FE: 0xBB27, //HANGUL SYLLABLE MIEUM YO RIEULHIEUH
+ 0x9241: 0xBB28, //HANGUL SYLLABLE MIEUM YO MIEUM
+ 0x9242: 0xBB2A, //HANGUL SYLLABLE MIEUM YO PIEUPSIOS
+ 0x9243: 0xBB2C, //HANGUL SYLLABLE MIEUM YO SSANGSIOS
+ 0x9244: 0xBB2D, //HANGUL SYLLABLE MIEUM YO IEUNG
+ 0x9245: 0xBB2E, //HANGUL SYLLABLE MIEUM YO CIEUC
+ 0x9246: 0xBB2F, //HANGUL SYLLABLE MIEUM YO CHIEUCH
+ 0x9247: 0xBB30, //HANGUL SYLLABLE MIEUM YO KHIEUKH
+ 0x9248: 0xBB31, //HANGUL SYLLABLE MIEUM YO THIEUTH
+ 0x9249: 0xBB32, //HANGUL SYLLABLE MIEUM YO PHIEUPH
+ 0x924A: 0xBB33, //HANGUL SYLLABLE MIEUM YO HIEUH
+ 0x924B: 0xBB37, //HANGUL SYLLABLE MIEUM U KIYEOKSIOS
+ 0x924C: 0xBB39, //HANGUL SYLLABLE MIEUM U NIEUNCIEUC
+ 0x924D: 0xBB3A, //HANGUL SYLLABLE MIEUM U NIEUNHIEUH
+ 0x924E: 0xBB3F, //HANGUL SYLLABLE MIEUM U RIEULPIEUP
+ 0x924F: 0xBB40, //HANGUL SYLLABLE MIEUM U RIEULSIOS
+ 0x9250: 0xBB41, //HANGUL SYLLABLE MIEUM U RIEULTHIEUTH
+ 0x9251: 0xBB42, //HANGUL SYLLABLE MIEUM U RIEULPHIEUPH
+ 0x9252: 0xBB43, //HANGUL SYLLABLE MIEUM U RIEULHIEUH
+ 0x9253: 0xBB46, //HANGUL SYLLABLE MIEUM U PIEUPSIOS
+ 0x9254: 0xBB48, //HANGUL SYLLABLE MIEUM U SSANGSIOS
+ 0x9255: 0xBB4A, //HANGUL SYLLABLE MIEUM U CIEUC
+ 0x9256: 0xBB4B, //HANGUL SYLLABLE MIEUM U CHIEUCH
+ 0x9257: 0xBB4C, //HANGUL SYLLABLE MIEUM U KHIEUKH
+ 0x9258: 0xBB4E, //HANGUL SYLLABLE MIEUM U PHIEUPH
+ 0x9259: 0xBB51, //HANGUL SYLLABLE MIEUM WEO KIYEOK
+ 0x925A: 0xBB52, //HANGUL SYLLABLE MIEUM WEO SSANGKIYEOK
+ 0x9261: 0xBB53, //HANGUL SYLLABLE MIEUM WEO KIYEOKSIOS
+ 0x9262: 0xBB55, //HANGUL SYLLABLE MIEUM WEO NIEUNCIEUC
+ 0x9263: 0xBB56, //HANGUL SYLLABLE MIEUM WEO NIEUNHIEUH
+ 0x9264: 0xBB57, //HANGUL SYLLABLE MIEUM WEO TIKEUT
+ 0x9265: 0xBB59, //HANGUL SYLLABLE MIEUM WEO RIEULKIYEOK
+ 0x9266: 0xBB5A, //HANGUL SYLLABLE MIEUM WEO RIEULMIEUM
+ 0x9267: 0xBB5B, //HANGUL SYLLABLE MIEUM WEO RIEULPIEUP
+ 0x9268: 0xBB5C, //HANGUL SYLLABLE MIEUM WEO RIEULSIOS
+ 0x9269: 0xBB5D, //HANGUL SYLLABLE MIEUM WEO RIEULTHIEUTH
+ 0x926A: 0xBB5E, //HANGUL SYLLABLE MIEUM WEO RIEULPHIEUPH
+ 0x926B: 0xBB5F, //HANGUL SYLLABLE MIEUM WEO RIEULHIEUH
+ 0x926C: 0xBB60, //HANGUL SYLLABLE MIEUM WEO MIEUM
+ 0x926D: 0xBB62, //HANGUL SYLLABLE MIEUM WEO PIEUPSIOS
+ 0x926E: 0xBB64, //HANGUL SYLLABLE MIEUM WEO SSANGSIOS
+ 0x926F: 0xBB65, //HANGUL SYLLABLE MIEUM WEO IEUNG
+ 0x9270: 0xBB66, //HANGUL SYLLABLE MIEUM WEO CIEUC
+ 0x9271: 0xBB67, //HANGUL SYLLABLE MIEUM WEO CHIEUCH
+ 0x9272: 0xBB68, //HANGUL SYLLABLE MIEUM WEO KHIEUKH
+ 0x9273: 0xBB69, //HANGUL SYLLABLE MIEUM WEO THIEUTH
+ 0x9274: 0xBB6A, //HANGUL SYLLABLE MIEUM WEO PHIEUPH
+ 0x9275: 0xBB6B, //HANGUL SYLLABLE MIEUM WEO HIEUH
+ 0x9276: 0xBB6D, //HANGUL SYLLABLE MIEUM WE KIYEOK
+ 0x9277: 0xBB6E, //HANGUL SYLLABLE MIEUM WE SSANGKIYEOK
+ 0x9278: 0xBB6F, //HANGUL SYLLABLE MIEUM WE KIYEOKSIOS
+ 0x9279: 0xBB70, //HANGUL SYLLABLE MIEUM WE NIEUN
+ 0x927A: 0xBB71, //HANGUL SYLLABLE MIEUM WE NIEUNCIEUC
+ 0x9281: 0xBB72, //HANGUL SYLLABLE MIEUM WE NIEUNHIEUH
+ 0x9282: 0xBB73, //HANGUL SYLLABLE MIEUM WE TIKEUT
+ 0x9283: 0xBB74, //HANGUL SYLLABLE MIEUM WE RIEUL
+ 0x9284: 0xBB75, //HANGUL SYLLABLE MIEUM WE RIEULKIYEOK
+ 0x9285: 0xBB76, //HANGUL SYLLABLE MIEUM WE RIEULMIEUM
+ 0x9286: 0xBB77, //HANGUL SYLLABLE MIEUM WE RIEULPIEUP
+ 0x9287: 0xBB78, //HANGUL SYLLABLE MIEUM WE RIEULSIOS
+ 0x9288: 0xBB79, //HANGUL SYLLABLE MIEUM WE RIEULTHIEUTH
+ 0x9289: 0xBB7A, //HANGUL SYLLABLE MIEUM WE RIEULPHIEUPH
+ 0x928A: 0xBB7B, //HANGUL SYLLABLE MIEUM WE RIEULHIEUH
+ 0x928B: 0xBB7C, //HANGUL SYLLABLE MIEUM WE MIEUM
+ 0x928C: 0xBB7D, //HANGUL SYLLABLE MIEUM WE PIEUP
+ 0x928D: 0xBB7E, //HANGUL SYLLABLE MIEUM WE PIEUPSIOS
+ 0x928E: 0xBB7F, //HANGUL SYLLABLE MIEUM WE SIOS
+ 0x928F: 0xBB80, //HANGUL SYLLABLE MIEUM WE SSANGSIOS
+ 0x9290: 0xBB81, //HANGUL SYLLABLE MIEUM WE IEUNG
+ 0x9291: 0xBB82, //HANGUL SYLLABLE MIEUM WE CIEUC
+ 0x9292: 0xBB83, //HANGUL SYLLABLE MIEUM WE CHIEUCH
+ 0x9293: 0xBB84, //HANGUL SYLLABLE MIEUM WE KHIEUKH
+ 0x9294: 0xBB85, //HANGUL SYLLABLE MIEUM WE THIEUTH
+ 0x9295: 0xBB86, //HANGUL SYLLABLE MIEUM WE PHIEUPH
+ 0x9296: 0xBB87, //HANGUL SYLLABLE MIEUM WE HIEUH
+ 0x9297: 0xBB89, //HANGUL SYLLABLE MIEUM WI KIYEOK
+ 0x9298: 0xBB8A, //HANGUL SYLLABLE MIEUM WI SSANGKIYEOK
+ 0x9299: 0xBB8B, //HANGUL SYLLABLE MIEUM WI KIYEOKSIOS
+ 0x929A: 0xBB8D, //HANGUL SYLLABLE MIEUM WI NIEUNCIEUC
+ 0x929B: 0xBB8E, //HANGUL SYLLABLE MIEUM WI NIEUNHIEUH
+ 0x929C: 0xBB8F, //HANGUL SYLLABLE MIEUM WI TIKEUT
+ 0x929D: 0xBB91, //HANGUL SYLLABLE MIEUM WI RIEULKIYEOK
+ 0x929E: 0xBB92, //HANGUL SYLLABLE MIEUM WI RIEULMIEUM
+ 0x929F: 0xBB93, //HANGUL SYLLABLE MIEUM WI RIEULPIEUP
+ 0x92A0: 0xBB94, //HANGUL SYLLABLE MIEUM WI RIEULSIOS
+ 0x92A1: 0xBB95, //HANGUL SYLLABLE MIEUM WI RIEULTHIEUTH
+ 0x92A2: 0xBB96, //HANGUL SYLLABLE MIEUM WI RIEULPHIEUPH
+ 0x92A3: 0xBB97, //HANGUL SYLLABLE MIEUM WI RIEULHIEUH
+ 0x92A4: 0xBB98, //HANGUL SYLLABLE MIEUM WI MIEUM
+ 0x92A5: 0xBB99, //HANGUL SYLLABLE MIEUM WI PIEUP
+ 0x92A6: 0xBB9A, //HANGUL SYLLABLE MIEUM WI PIEUPSIOS
+ 0x92A7: 0xBB9B, //HANGUL SYLLABLE MIEUM WI SIOS
+ 0x92A8: 0xBB9C, //HANGUL SYLLABLE MIEUM WI SSANGSIOS
+ 0x92A9: 0xBB9D, //HANGUL SYLLABLE MIEUM WI IEUNG
+ 0x92AA: 0xBB9E, //HANGUL SYLLABLE MIEUM WI CIEUC
+ 0x92AB: 0xBB9F, //HANGUL SYLLABLE MIEUM WI CHIEUCH
+ 0x92AC: 0xBBA0, //HANGUL SYLLABLE MIEUM WI KHIEUKH
+ 0x92AD: 0xBBA1, //HANGUL SYLLABLE MIEUM WI THIEUTH
+ 0x92AE: 0xBBA2, //HANGUL SYLLABLE MIEUM WI PHIEUPH
+ 0x92AF: 0xBBA3, //HANGUL SYLLABLE MIEUM WI HIEUH
+ 0x92B0: 0xBBA5, //HANGUL SYLLABLE MIEUM YU KIYEOK
+ 0x92B1: 0xBBA6, //HANGUL SYLLABLE MIEUM YU SSANGKIYEOK
+ 0x92B2: 0xBBA7, //HANGUL SYLLABLE MIEUM YU KIYEOKSIOS
+ 0x92B3: 0xBBA9, //HANGUL SYLLABLE MIEUM YU NIEUNCIEUC
+ 0x92B4: 0xBBAA, //HANGUL SYLLABLE MIEUM YU NIEUNHIEUH
+ 0x92B5: 0xBBAB, //HANGUL SYLLABLE MIEUM YU TIKEUT
+ 0x92B6: 0xBBAD, //HANGUL SYLLABLE MIEUM YU RIEULKIYEOK
+ 0x92B7: 0xBBAE, //HANGUL SYLLABLE MIEUM YU RIEULMIEUM
+ 0x92B8: 0xBBAF, //HANGUL SYLLABLE MIEUM YU RIEULPIEUP
+ 0x92B9: 0xBBB0, //HANGUL SYLLABLE MIEUM YU RIEULSIOS
+ 0x92BA: 0xBBB1, //HANGUL SYLLABLE MIEUM YU RIEULTHIEUTH
+ 0x92BB: 0xBBB2, //HANGUL SYLLABLE MIEUM YU RIEULPHIEUPH
+ 0x92BC: 0xBBB3, //HANGUL SYLLABLE MIEUM YU RIEULHIEUH
+ 0x92BD: 0xBBB5, //HANGUL SYLLABLE MIEUM YU PIEUP
+ 0x92BE: 0xBBB6, //HANGUL SYLLABLE MIEUM YU PIEUPSIOS
+ 0x92BF: 0xBBB8, //HANGUL SYLLABLE MIEUM YU SSANGSIOS
+ 0x92C0: 0xBBB9, //HANGUL SYLLABLE MIEUM YU IEUNG
+ 0x92C1: 0xBBBA, //HANGUL SYLLABLE MIEUM YU CIEUC
+ 0x92C2: 0xBBBB, //HANGUL SYLLABLE MIEUM YU CHIEUCH
+ 0x92C3: 0xBBBC, //HANGUL SYLLABLE MIEUM YU KHIEUKH
+ 0x92C4: 0xBBBD, //HANGUL SYLLABLE MIEUM YU THIEUTH
+ 0x92C5: 0xBBBE, //HANGUL SYLLABLE MIEUM YU PHIEUPH
+ 0x92C6: 0xBBBF, //HANGUL SYLLABLE MIEUM YU HIEUH
+ 0x92C7: 0xBBC1, //HANGUL SYLLABLE MIEUM EU KIYEOK
+ 0x92C8: 0xBBC2, //HANGUL SYLLABLE MIEUM EU SSANGKIYEOK
+ 0x92C9: 0xBBC3, //HANGUL SYLLABLE MIEUM EU KIYEOKSIOS
+ 0x92CA: 0xBBC5, //HANGUL SYLLABLE MIEUM EU NIEUNCIEUC
+ 0x92CB: 0xBBC6, //HANGUL SYLLABLE MIEUM EU NIEUNHIEUH
+ 0x92CC: 0xBBC7, //HANGUL SYLLABLE MIEUM EU TIKEUT
+ 0x92CD: 0xBBC9, //HANGUL SYLLABLE MIEUM EU RIEULKIYEOK
+ 0x92CE: 0xBBCA, //HANGUL SYLLABLE MIEUM EU RIEULMIEUM
+ 0x92CF: 0xBBCB, //HANGUL SYLLABLE MIEUM EU RIEULPIEUP
+ 0x92D0: 0xBBCC, //HANGUL SYLLABLE MIEUM EU RIEULSIOS
+ 0x92D1: 0xBBCD, //HANGUL SYLLABLE MIEUM EU RIEULTHIEUTH
+ 0x92D2: 0xBBCE, //HANGUL SYLLABLE MIEUM EU RIEULPHIEUPH
+ 0x92D3: 0xBBCF, //HANGUL SYLLABLE MIEUM EU RIEULHIEUH
+ 0x92D4: 0xBBD1, //HANGUL SYLLABLE MIEUM EU PIEUP
+ 0x92D5: 0xBBD2, //HANGUL SYLLABLE MIEUM EU PIEUPSIOS
+ 0x92D6: 0xBBD4, //HANGUL SYLLABLE MIEUM EU SSANGSIOS
+ 0x92D7: 0xBBD5, //HANGUL SYLLABLE MIEUM EU IEUNG
+ 0x92D8: 0xBBD6, //HANGUL SYLLABLE MIEUM EU CIEUC
+ 0x92D9: 0xBBD7, //HANGUL SYLLABLE MIEUM EU CHIEUCH
+ 0x92DA: 0xBBD8, //HANGUL SYLLABLE MIEUM EU KHIEUKH
+ 0x92DB: 0xBBD9, //HANGUL SYLLABLE MIEUM EU THIEUTH
+ 0x92DC: 0xBBDA, //HANGUL SYLLABLE MIEUM EU PHIEUPH
+ 0x92DD: 0xBBDB, //HANGUL SYLLABLE MIEUM EU HIEUH
+ 0x92DE: 0xBBDC, //HANGUL SYLLABLE MIEUM YI
+ 0x92DF: 0xBBDD, //HANGUL SYLLABLE MIEUM YI KIYEOK
+ 0x92E0: 0xBBDE, //HANGUL SYLLABLE MIEUM YI SSANGKIYEOK
+ 0x92E1: 0xBBDF, //HANGUL SYLLABLE MIEUM YI KIYEOKSIOS
+ 0x92E2: 0xBBE0, //HANGUL SYLLABLE MIEUM YI NIEUN
+ 0x92E3: 0xBBE1, //HANGUL SYLLABLE MIEUM YI NIEUNCIEUC
+ 0x92E4: 0xBBE2, //HANGUL SYLLABLE MIEUM YI NIEUNHIEUH
+ 0x92E5: 0xBBE3, //HANGUL SYLLABLE MIEUM YI TIKEUT
+ 0x92E6: 0xBBE4, //HANGUL SYLLABLE MIEUM YI RIEUL
+ 0x92E7: 0xBBE5, //HANGUL SYLLABLE MIEUM YI RIEULKIYEOK
+ 0x92E8: 0xBBE6, //HANGUL SYLLABLE MIEUM YI RIEULMIEUM
+ 0x92E9: 0xBBE7, //HANGUL SYLLABLE MIEUM YI RIEULPIEUP
+ 0x92EA: 0xBBE8, //HANGUL SYLLABLE MIEUM YI RIEULSIOS
+ 0x92EB: 0xBBE9, //HANGUL SYLLABLE MIEUM YI RIEULTHIEUTH
+ 0x92EC: 0xBBEA, //HANGUL SYLLABLE MIEUM YI RIEULPHIEUPH
+ 0x92ED: 0xBBEB, //HANGUL SYLLABLE MIEUM YI RIEULHIEUH
+ 0x92EE: 0xBBEC, //HANGUL SYLLABLE MIEUM YI MIEUM
+ 0x92EF: 0xBBED, //HANGUL SYLLABLE MIEUM YI PIEUP
+ 0x92F0: 0xBBEE, //HANGUL SYLLABLE MIEUM YI PIEUPSIOS
+ 0x92F1: 0xBBEF, //HANGUL SYLLABLE MIEUM YI SIOS
+ 0x92F2: 0xBBF0, //HANGUL SYLLABLE MIEUM YI SSANGSIOS
+ 0x92F3: 0xBBF1, //HANGUL SYLLABLE MIEUM YI IEUNG
+ 0x92F4: 0xBBF2, //HANGUL SYLLABLE MIEUM YI CIEUC
+ 0x92F5: 0xBBF3, //HANGUL SYLLABLE MIEUM YI CHIEUCH
+ 0x92F6: 0xBBF4, //HANGUL SYLLABLE MIEUM YI KHIEUKH
+ 0x92F7: 0xBBF5, //HANGUL SYLLABLE MIEUM YI THIEUTH
+ 0x92F8: 0xBBF6, //HANGUL SYLLABLE MIEUM YI PHIEUPH
+ 0x92F9: 0xBBF7, //HANGUL SYLLABLE MIEUM YI HIEUH
+ 0x92FA: 0xBBFA, //HANGUL SYLLABLE MIEUM I SSANGKIYEOK
+ 0x92FB: 0xBBFB, //HANGUL SYLLABLE MIEUM I KIYEOKSIOS
+ 0x92FC: 0xBBFD, //HANGUL SYLLABLE MIEUM I NIEUNCIEUC
+ 0x92FD: 0xBBFE, //HANGUL SYLLABLE MIEUM I NIEUNHIEUH
+ 0x92FE: 0xBC01, //HANGUL SYLLABLE MIEUM I RIEULKIYEOK
+ 0x9341: 0xBC03, //HANGUL SYLLABLE MIEUM I RIEULPIEUP
+ 0x9342: 0xBC04, //HANGUL SYLLABLE MIEUM I RIEULSIOS
+ 0x9343: 0xBC05, //HANGUL SYLLABLE MIEUM I RIEULTHIEUTH
+ 0x9344: 0xBC06, //HANGUL SYLLABLE MIEUM I RIEULPHIEUPH
+ 0x9345: 0xBC07, //HANGUL SYLLABLE MIEUM I RIEULHIEUH
+ 0x9346: 0xBC0A, //HANGUL SYLLABLE MIEUM I PIEUPSIOS
+ 0x9347: 0xBC0E, //HANGUL SYLLABLE MIEUM I CIEUC
+ 0x9348: 0xBC10, //HANGUL SYLLABLE MIEUM I KHIEUKH
+ 0x9349: 0xBC12, //HANGUL SYLLABLE MIEUM I PHIEUPH
+ 0x934A: 0xBC13, //HANGUL SYLLABLE MIEUM I HIEUH
+ 0x934B: 0xBC19, //HANGUL SYLLABLE PIEUP A NIEUNCIEUC
+ 0x934C: 0xBC1A, //HANGUL SYLLABLE PIEUP A NIEUNHIEUH
+ 0x934D: 0xBC20, //HANGUL SYLLABLE PIEUP A RIEULSIOS
+ 0x934E: 0xBC21, //HANGUL SYLLABLE PIEUP A RIEULTHIEUTH
+ 0x934F: 0xBC22, //HANGUL SYLLABLE PIEUP A RIEULPHIEUPH
+ 0x9350: 0xBC23, //HANGUL SYLLABLE PIEUP A RIEULHIEUH
+ 0x9351: 0xBC26, //HANGUL SYLLABLE PIEUP A PIEUPSIOS
+ 0x9352: 0xBC28, //HANGUL SYLLABLE PIEUP A SSANGSIOS
+ 0x9353: 0xBC2A, //HANGUL SYLLABLE PIEUP A CIEUC
+ 0x9354: 0xBC2B, //HANGUL SYLLABLE PIEUP A CHIEUCH
+ 0x9355: 0xBC2C, //HANGUL SYLLABLE PIEUP A KHIEUKH
+ 0x9356: 0xBC2E, //HANGUL SYLLABLE PIEUP A PHIEUPH
+ 0x9357: 0xBC2F, //HANGUL SYLLABLE PIEUP A HIEUH
+ 0x9358: 0xBC32, //HANGUL SYLLABLE PIEUP AE SSANGKIYEOK
+ 0x9359: 0xBC33, //HANGUL SYLLABLE PIEUP AE KIYEOKSIOS
+ 0x935A: 0xBC35, //HANGUL SYLLABLE PIEUP AE NIEUNCIEUC
+ 0x9361: 0xBC36, //HANGUL SYLLABLE PIEUP AE NIEUNHIEUH
+ 0x9362: 0xBC37, //HANGUL SYLLABLE PIEUP AE TIKEUT
+ 0x9363: 0xBC39, //HANGUL SYLLABLE PIEUP AE RIEULKIYEOK
+ 0x9364: 0xBC3A, //HANGUL SYLLABLE PIEUP AE RIEULMIEUM
+ 0x9365: 0xBC3B, //HANGUL SYLLABLE PIEUP AE RIEULPIEUP
+ 0x9366: 0xBC3C, //HANGUL SYLLABLE PIEUP AE RIEULSIOS
+ 0x9367: 0xBC3D, //HANGUL SYLLABLE PIEUP AE RIEULTHIEUTH
+ 0x9368: 0xBC3E, //HANGUL SYLLABLE PIEUP AE RIEULPHIEUPH
+ 0x9369: 0xBC3F, //HANGUL SYLLABLE PIEUP AE RIEULHIEUH
+ 0x936A: 0xBC42, //HANGUL SYLLABLE PIEUP AE PIEUPSIOS
+ 0x936B: 0xBC46, //HANGUL SYLLABLE PIEUP AE CIEUC
+ 0x936C: 0xBC47, //HANGUL SYLLABLE PIEUP AE CHIEUCH
+ 0x936D: 0xBC48, //HANGUL SYLLABLE PIEUP AE KHIEUKH
+ 0x936E: 0xBC4A, //HANGUL SYLLABLE PIEUP AE PHIEUPH
+ 0x936F: 0xBC4B, //HANGUL SYLLABLE PIEUP AE HIEUH
+ 0x9370: 0xBC4E, //HANGUL SYLLABLE PIEUP YA SSANGKIYEOK
+ 0x9371: 0xBC4F, //HANGUL SYLLABLE PIEUP YA KIYEOKSIOS
+ 0x9372: 0xBC51, //HANGUL SYLLABLE PIEUP YA NIEUNCIEUC
+ 0x9373: 0xBC52, //HANGUL SYLLABLE PIEUP YA NIEUNHIEUH
+ 0x9374: 0xBC53, //HANGUL SYLLABLE PIEUP YA TIKEUT
+ 0x9375: 0xBC54, //HANGUL SYLLABLE PIEUP YA RIEUL
+ 0x9376: 0xBC55, //HANGUL SYLLABLE PIEUP YA RIEULKIYEOK
+ 0x9377: 0xBC56, //HANGUL SYLLABLE PIEUP YA RIEULMIEUM
+ 0x9378: 0xBC57, //HANGUL SYLLABLE PIEUP YA RIEULPIEUP
+ 0x9379: 0xBC58, //HANGUL SYLLABLE PIEUP YA RIEULSIOS
+ 0x937A: 0xBC59, //HANGUL SYLLABLE PIEUP YA RIEULTHIEUTH
+ 0x9381: 0xBC5A, //HANGUL SYLLABLE PIEUP YA RIEULPHIEUPH
+ 0x9382: 0xBC5B, //HANGUL SYLLABLE PIEUP YA RIEULHIEUH
+ 0x9383: 0xBC5C, //HANGUL SYLLABLE PIEUP YA MIEUM
+ 0x9384: 0xBC5E, //HANGUL SYLLABLE PIEUP YA PIEUPSIOS
+ 0x9385: 0xBC5F, //HANGUL SYLLABLE PIEUP YA SIOS
+ 0x9386: 0xBC60, //HANGUL SYLLABLE PIEUP YA SSANGSIOS
+ 0x9387: 0xBC61, //HANGUL SYLLABLE PIEUP YA IEUNG
+ 0x9388: 0xBC62, //HANGUL SYLLABLE PIEUP YA CIEUC
+ 0x9389: 0xBC63, //HANGUL SYLLABLE PIEUP YA CHIEUCH
+ 0x938A: 0xBC64, //HANGUL SYLLABLE PIEUP YA KHIEUKH
+ 0x938B: 0xBC65, //HANGUL SYLLABLE PIEUP YA THIEUTH
+ 0x938C: 0xBC66, //HANGUL SYLLABLE PIEUP YA PHIEUPH
+ 0x938D: 0xBC67, //HANGUL SYLLABLE PIEUP YA HIEUH
+ 0x938E: 0xBC68, //HANGUL SYLLABLE PIEUP YAE
+ 0x938F: 0xBC69, //HANGUL SYLLABLE PIEUP YAE KIYEOK
+ 0x9390: 0xBC6A, //HANGUL SYLLABLE PIEUP YAE SSANGKIYEOK
+ 0x9391: 0xBC6B, //HANGUL SYLLABLE PIEUP YAE KIYEOKSIOS
+ 0x9392: 0xBC6C, //HANGUL SYLLABLE PIEUP YAE NIEUN
+ 0x9393: 0xBC6D, //HANGUL SYLLABLE PIEUP YAE NIEUNCIEUC
+ 0x9394: 0xBC6E, //HANGUL SYLLABLE PIEUP YAE NIEUNHIEUH
+ 0x9395: 0xBC6F, //HANGUL SYLLABLE PIEUP YAE TIKEUT
+ 0x9396: 0xBC70, //HANGUL SYLLABLE PIEUP YAE RIEUL
+ 0x9397: 0xBC71, //HANGUL SYLLABLE PIEUP YAE RIEULKIYEOK
+ 0x9398: 0xBC72, //HANGUL SYLLABLE PIEUP YAE RIEULMIEUM
+ 0x9399: 0xBC73, //HANGUL SYLLABLE PIEUP YAE RIEULPIEUP
+ 0x939A: 0xBC74, //HANGUL SYLLABLE PIEUP YAE RIEULSIOS
+ 0x939B: 0xBC75, //HANGUL SYLLABLE PIEUP YAE RIEULTHIEUTH
+ 0x939C: 0xBC76, //HANGUL SYLLABLE PIEUP YAE RIEULPHIEUPH
+ 0x939D: 0xBC77, //HANGUL SYLLABLE PIEUP YAE RIEULHIEUH
+ 0x939E: 0xBC78, //HANGUL SYLLABLE PIEUP YAE MIEUM
+ 0x939F: 0xBC79, //HANGUL SYLLABLE PIEUP YAE PIEUP
+ 0x93A0: 0xBC7A, //HANGUL SYLLABLE PIEUP YAE PIEUPSIOS
+ 0x93A1: 0xBC7B, //HANGUL SYLLABLE PIEUP YAE SIOS
+ 0x93A2: 0xBC7C, //HANGUL SYLLABLE PIEUP YAE SSANGSIOS
+ 0x93A3: 0xBC7D, //HANGUL SYLLABLE PIEUP YAE IEUNG
+ 0x93A4: 0xBC7E, //HANGUL SYLLABLE PIEUP YAE CIEUC
+ 0x93A5: 0xBC7F, //HANGUL SYLLABLE PIEUP YAE CHIEUCH
+ 0x93A6: 0xBC80, //HANGUL SYLLABLE PIEUP YAE KHIEUKH
+ 0x93A7: 0xBC81, //HANGUL SYLLABLE PIEUP YAE THIEUTH
+ 0x93A8: 0xBC82, //HANGUL SYLLABLE PIEUP YAE PHIEUPH
+ 0x93A9: 0xBC83, //HANGUL SYLLABLE PIEUP YAE HIEUH
+ 0x93AA: 0xBC86, //HANGUL SYLLABLE PIEUP EO SSANGKIYEOK
+ 0x93AB: 0xBC87, //HANGUL SYLLABLE PIEUP EO KIYEOKSIOS
+ 0x93AC: 0xBC89, //HANGUL SYLLABLE PIEUP EO NIEUNCIEUC
+ 0x93AD: 0xBC8A, //HANGUL SYLLABLE PIEUP EO NIEUNHIEUH
+ 0x93AE: 0xBC8D, //HANGUL SYLLABLE PIEUP EO RIEULKIYEOK
+ 0x93AF: 0xBC8F, //HANGUL SYLLABLE PIEUP EO RIEULPIEUP
+ 0x93B0: 0xBC90, //HANGUL SYLLABLE PIEUP EO RIEULSIOS
+ 0x93B1: 0xBC91, //HANGUL SYLLABLE PIEUP EO RIEULTHIEUTH
+ 0x93B2: 0xBC92, //HANGUL SYLLABLE PIEUP EO RIEULPHIEUPH
+ 0x93B3: 0xBC93, //HANGUL SYLLABLE PIEUP EO RIEULHIEUH
+ 0x93B4: 0xBC96, //HANGUL SYLLABLE PIEUP EO PIEUPSIOS
+ 0x93B5: 0xBC98, //HANGUL SYLLABLE PIEUP EO SSANGSIOS
+ 0x93B6: 0xBC9B, //HANGUL SYLLABLE PIEUP EO CHIEUCH
+ 0x93B7: 0xBC9C, //HANGUL SYLLABLE PIEUP EO KHIEUKH
+ 0x93B8: 0xBC9D, //HANGUL SYLLABLE PIEUP EO THIEUTH
+ 0x93B9: 0xBC9E, //HANGUL SYLLABLE PIEUP EO PHIEUPH
+ 0x93BA: 0xBC9F, //HANGUL SYLLABLE PIEUP EO HIEUH
+ 0x93BB: 0xBCA2, //HANGUL SYLLABLE PIEUP E SSANGKIYEOK
+ 0x93BC: 0xBCA3, //HANGUL SYLLABLE PIEUP E KIYEOKSIOS
+ 0x93BD: 0xBCA5, //HANGUL SYLLABLE PIEUP E NIEUNCIEUC
+ 0x93BE: 0xBCA6, //HANGUL SYLLABLE PIEUP E NIEUNHIEUH
+ 0x93BF: 0xBCA9, //HANGUL SYLLABLE PIEUP E RIEULKIYEOK
+ 0x93C0: 0xBCAA, //HANGUL SYLLABLE PIEUP E RIEULMIEUM
+ 0x93C1: 0xBCAB, //HANGUL SYLLABLE PIEUP E RIEULPIEUP
+ 0x93C2: 0xBCAC, //HANGUL SYLLABLE PIEUP E RIEULSIOS
+ 0x93C3: 0xBCAD, //HANGUL SYLLABLE PIEUP E RIEULTHIEUTH
+ 0x93C4: 0xBCAE, //HANGUL SYLLABLE PIEUP E RIEULPHIEUPH
+ 0x93C5: 0xBCAF, //HANGUL SYLLABLE PIEUP E RIEULHIEUH
+ 0x93C6: 0xBCB2, //HANGUL SYLLABLE PIEUP E PIEUPSIOS
+ 0x93C7: 0xBCB6, //HANGUL SYLLABLE PIEUP E CIEUC
+ 0x93C8: 0xBCB7, //HANGUL SYLLABLE PIEUP E CHIEUCH
+ 0x93C9: 0xBCB8, //HANGUL SYLLABLE PIEUP E KHIEUKH
+ 0x93CA: 0xBCB9, //HANGUL SYLLABLE PIEUP E THIEUTH
+ 0x93CB: 0xBCBA, //HANGUL SYLLABLE PIEUP E PHIEUPH
+ 0x93CC: 0xBCBB, //HANGUL SYLLABLE PIEUP E HIEUH
+ 0x93CD: 0xBCBE, //HANGUL SYLLABLE PIEUP YEO SSANGKIYEOK
+ 0x93CE: 0xBCBF, //HANGUL SYLLABLE PIEUP YEO KIYEOKSIOS
+ 0x93CF: 0xBCC1, //HANGUL SYLLABLE PIEUP YEO NIEUNCIEUC
+ 0x93D0: 0xBCC2, //HANGUL SYLLABLE PIEUP YEO NIEUNHIEUH
+ 0x93D1: 0xBCC3, //HANGUL SYLLABLE PIEUP YEO TIKEUT
+ 0x93D2: 0xBCC5, //HANGUL SYLLABLE PIEUP YEO RIEULKIYEOK
+ 0x93D3: 0xBCC6, //HANGUL SYLLABLE PIEUP YEO RIEULMIEUM
+ 0x93D4: 0xBCC7, //HANGUL SYLLABLE PIEUP YEO RIEULPIEUP
+ 0x93D5: 0xBCC8, //HANGUL SYLLABLE PIEUP YEO RIEULSIOS
+ 0x93D6: 0xBCC9, //HANGUL SYLLABLE PIEUP YEO RIEULTHIEUTH
+ 0x93D7: 0xBCCA, //HANGUL SYLLABLE PIEUP YEO RIEULPHIEUPH
+ 0x93D8: 0xBCCB, //HANGUL SYLLABLE PIEUP YEO RIEULHIEUH
+ 0x93D9: 0xBCCC, //HANGUL SYLLABLE PIEUP YEO MIEUM
+ 0x93DA: 0xBCCE, //HANGUL SYLLABLE PIEUP YEO PIEUPSIOS
+ 0x93DB: 0xBCD2, //HANGUL SYLLABLE PIEUP YEO CIEUC
+ 0x93DC: 0xBCD3, //HANGUL SYLLABLE PIEUP YEO CHIEUCH
+ 0x93DD: 0xBCD4, //HANGUL SYLLABLE PIEUP YEO KHIEUKH
+ 0x93DE: 0xBCD6, //HANGUL SYLLABLE PIEUP YEO PHIEUPH
+ 0x93DF: 0xBCD7, //HANGUL SYLLABLE PIEUP YEO HIEUH
+ 0x93E0: 0xBCD9, //HANGUL SYLLABLE PIEUP YE KIYEOK
+ 0x93E1: 0xBCDA, //HANGUL SYLLABLE PIEUP YE SSANGKIYEOK
+ 0x93E2: 0xBCDB, //HANGUL SYLLABLE PIEUP YE KIYEOKSIOS
+ 0x93E3: 0xBCDD, //HANGUL SYLLABLE PIEUP YE NIEUNCIEUC
+ 0x93E4: 0xBCDE, //HANGUL SYLLABLE PIEUP YE NIEUNHIEUH
+ 0x93E5: 0xBCDF, //HANGUL SYLLABLE PIEUP YE TIKEUT
+ 0x93E6: 0xBCE0, //HANGUL SYLLABLE PIEUP YE RIEUL
+ 0x93E7: 0xBCE1, //HANGUL SYLLABLE PIEUP YE RIEULKIYEOK
+ 0x93E8: 0xBCE2, //HANGUL SYLLABLE PIEUP YE RIEULMIEUM
+ 0x93E9: 0xBCE3, //HANGUL SYLLABLE PIEUP YE RIEULPIEUP
+ 0x93EA: 0xBCE4, //HANGUL SYLLABLE PIEUP YE RIEULSIOS
+ 0x93EB: 0xBCE5, //HANGUL SYLLABLE PIEUP YE RIEULTHIEUTH
+ 0x93EC: 0xBCE6, //HANGUL SYLLABLE PIEUP YE RIEULPHIEUPH
+ 0x93ED: 0xBCE7, //HANGUL SYLLABLE PIEUP YE RIEULHIEUH
+ 0x93EE: 0xBCE8, //HANGUL SYLLABLE PIEUP YE MIEUM
+ 0x93EF: 0xBCE9, //HANGUL SYLLABLE PIEUP YE PIEUP
+ 0x93F0: 0xBCEA, //HANGUL SYLLABLE PIEUP YE PIEUPSIOS
+ 0x93F1: 0xBCEB, //HANGUL SYLLABLE PIEUP YE SIOS
+ 0x93F2: 0xBCEC, //HANGUL SYLLABLE PIEUP YE SSANGSIOS
+ 0x93F3: 0xBCED, //HANGUL SYLLABLE PIEUP YE IEUNG
+ 0x93F4: 0xBCEE, //HANGUL SYLLABLE PIEUP YE CIEUC
+ 0x93F5: 0xBCEF, //HANGUL SYLLABLE PIEUP YE CHIEUCH
+ 0x93F6: 0xBCF0, //HANGUL SYLLABLE PIEUP YE KHIEUKH
+ 0x93F7: 0xBCF1, //HANGUL SYLLABLE PIEUP YE THIEUTH
+ 0x93F8: 0xBCF2, //HANGUL SYLLABLE PIEUP YE PHIEUPH
+ 0x93F9: 0xBCF3, //HANGUL SYLLABLE PIEUP YE HIEUH
+ 0x93FA: 0xBCF7, //HANGUL SYLLABLE PIEUP O KIYEOKSIOS
+ 0x93FB: 0xBCF9, //HANGUL SYLLABLE PIEUP O NIEUNCIEUC
+ 0x93FC: 0xBCFA, //HANGUL SYLLABLE PIEUP O NIEUNHIEUH
+ 0x93FD: 0xBCFB, //HANGUL SYLLABLE PIEUP O TIKEUT
+ 0x93FE: 0xBCFD, //HANGUL SYLLABLE PIEUP O RIEULKIYEOK
+ 0x9441: 0xBCFE, //HANGUL SYLLABLE PIEUP O RIEULMIEUM
+ 0x9442: 0xBCFF, //HANGUL SYLLABLE PIEUP O RIEULPIEUP
+ 0x9443: 0xBD00, //HANGUL SYLLABLE PIEUP O RIEULSIOS
+ 0x9444: 0xBD01, //HANGUL SYLLABLE PIEUP O RIEULTHIEUTH
+ 0x9445: 0xBD02, //HANGUL SYLLABLE PIEUP O RIEULPHIEUPH
+ 0x9446: 0xBD03, //HANGUL SYLLABLE PIEUP O RIEULHIEUH
+ 0x9447: 0xBD06, //HANGUL SYLLABLE PIEUP O PIEUPSIOS
+ 0x9448: 0xBD08, //HANGUL SYLLABLE PIEUP O SSANGSIOS
+ 0x9449: 0xBD0A, //HANGUL SYLLABLE PIEUP O CIEUC
+ 0x944A: 0xBD0B, //HANGUL SYLLABLE PIEUP O CHIEUCH
+ 0x944B: 0xBD0C, //HANGUL SYLLABLE PIEUP O KHIEUKH
+ 0x944C: 0xBD0D, //HANGUL SYLLABLE PIEUP O THIEUTH
+ 0x944D: 0xBD0E, //HANGUL SYLLABLE PIEUP O PHIEUPH
+ 0x944E: 0xBD0F, //HANGUL SYLLABLE PIEUP O HIEUH
+ 0x944F: 0xBD11, //HANGUL SYLLABLE PIEUP WA KIYEOK
+ 0x9450: 0xBD12, //HANGUL SYLLABLE PIEUP WA SSANGKIYEOK
+ 0x9451: 0xBD13, //HANGUL SYLLABLE PIEUP WA KIYEOKSIOS
+ 0x9452: 0xBD15, //HANGUL SYLLABLE PIEUP WA NIEUNCIEUC
+ 0x9453: 0xBD16, //HANGUL SYLLABLE PIEUP WA NIEUNHIEUH
+ 0x9454: 0xBD17, //HANGUL SYLLABLE PIEUP WA TIKEUT
+ 0x9455: 0xBD18, //HANGUL SYLLABLE PIEUP WA RIEUL
+ 0x9456: 0xBD19, //HANGUL SYLLABLE PIEUP WA RIEULKIYEOK
+ 0x9457: 0xBD1A, //HANGUL SYLLABLE PIEUP WA RIEULMIEUM
+ 0x9458: 0xBD1B, //HANGUL SYLLABLE PIEUP WA RIEULPIEUP
+ 0x9459: 0xBD1C, //HANGUL SYLLABLE PIEUP WA RIEULSIOS
+ 0x945A: 0xBD1D, //HANGUL SYLLABLE PIEUP WA RIEULTHIEUTH
+ 0x9461: 0xBD1E, //HANGUL SYLLABLE PIEUP WA RIEULPHIEUPH
+ 0x9462: 0xBD1F, //HANGUL SYLLABLE PIEUP WA RIEULHIEUH
+ 0x9463: 0xBD20, //HANGUL SYLLABLE PIEUP WA MIEUM
+ 0x9464: 0xBD21, //HANGUL SYLLABLE PIEUP WA PIEUP
+ 0x9465: 0xBD22, //HANGUL SYLLABLE PIEUP WA PIEUPSIOS
+ 0x9466: 0xBD23, //HANGUL SYLLABLE PIEUP WA SIOS
+ 0x9467: 0xBD25, //HANGUL SYLLABLE PIEUP WA IEUNG
+ 0x9468: 0xBD26, //HANGUL SYLLABLE PIEUP WA CIEUC
+ 0x9469: 0xBD27, //HANGUL SYLLABLE PIEUP WA CHIEUCH
+ 0x946A: 0xBD28, //HANGUL SYLLABLE PIEUP WA KHIEUKH
+ 0x946B: 0xBD29, //HANGUL SYLLABLE PIEUP WA THIEUTH
+ 0x946C: 0xBD2A, //HANGUL SYLLABLE PIEUP WA PHIEUPH
+ 0x946D: 0xBD2B, //HANGUL SYLLABLE PIEUP WA HIEUH
+ 0x946E: 0xBD2D, //HANGUL SYLLABLE PIEUP WAE KIYEOK
+ 0x946F: 0xBD2E, //HANGUL SYLLABLE PIEUP WAE SSANGKIYEOK
+ 0x9470: 0xBD2F, //HANGUL SYLLABLE PIEUP WAE KIYEOKSIOS
+ 0x9471: 0xBD30, //HANGUL SYLLABLE PIEUP WAE NIEUN
+ 0x9472: 0xBD31, //HANGUL SYLLABLE PIEUP WAE NIEUNCIEUC
+ 0x9473: 0xBD32, //HANGUL SYLLABLE PIEUP WAE NIEUNHIEUH
+ 0x9474: 0xBD33, //HANGUL SYLLABLE PIEUP WAE TIKEUT
+ 0x9475: 0xBD34, //HANGUL SYLLABLE PIEUP WAE RIEUL
+ 0x9476: 0xBD35, //HANGUL SYLLABLE PIEUP WAE RIEULKIYEOK
+ 0x9477: 0xBD36, //HANGUL SYLLABLE PIEUP WAE RIEULMIEUM
+ 0x9478: 0xBD37, //HANGUL SYLLABLE PIEUP WAE RIEULPIEUP
+ 0x9479: 0xBD38, //HANGUL SYLLABLE PIEUP WAE RIEULSIOS
+ 0x947A: 0xBD39, //HANGUL SYLLABLE PIEUP WAE RIEULTHIEUTH
+ 0x9481: 0xBD3A, //HANGUL SYLLABLE PIEUP WAE RIEULPHIEUPH
+ 0x9482: 0xBD3B, //HANGUL SYLLABLE PIEUP WAE RIEULHIEUH
+ 0x9483: 0xBD3C, //HANGUL SYLLABLE PIEUP WAE MIEUM
+ 0x9484: 0xBD3D, //HANGUL SYLLABLE PIEUP WAE PIEUP
+ 0x9485: 0xBD3E, //HANGUL SYLLABLE PIEUP WAE PIEUPSIOS
+ 0x9486: 0xBD3F, //HANGUL SYLLABLE PIEUP WAE SIOS
+ 0x9487: 0xBD41, //HANGUL SYLLABLE PIEUP WAE IEUNG
+ 0x9488: 0xBD42, //HANGUL SYLLABLE PIEUP WAE CIEUC
+ 0x9489: 0xBD43, //HANGUL SYLLABLE PIEUP WAE CHIEUCH
+ 0x948A: 0xBD44, //HANGUL SYLLABLE PIEUP WAE KHIEUKH
+ 0x948B: 0xBD45, //HANGUL SYLLABLE PIEUP WAE THIEUTH
+ 0x948C: 0xBD46, //HANGUL SYLLABLE PIEUP WAE PHIEUPH
+ 0x948D: 0xBD47, //HANGUL SYLLABLE PIEUP WAE HIEUH
+ 0x948E: 0xBD4A, //HANGUL SYLLABLE PIEUP OE SSANGKIYEOK
+ 0x948F: 0xBD4B, //HANGUL SYLLABLE PIEUP OE KIYEOKSIOS
+ 0x9490: 0xBD4D, //HANGUL SYLLABLE PIEUP OE NIEUNCIEUC
+ 0x9491: 0xBD4E, //HANGUL SYLLABLE PIEUP OE NIEUNHIEUH
+ 0x9492: 0xBD4F, //HANGUL SYLLABLE PIEUP OE TIKEUT
+ 0x9493: 0xBD51, //HANGUL SYLLABLE PIEUP OE RIEULKIYEOK
+ 0x9494: 0xBD52, //HANGUL SYLLABLE PIEUP OE RIEULMIEUM
+ 0x9495: 0xBD53, //HANGUL SYLLABLE PIEUP OE RIEULPIEUP
+ 0x9496: 0xBD54, //HANGUL SYLLABLE PIEUP OE RIEULSIOS
+ 0x9497: 0xBD55, //HANGUL SYLLABLE PIEUP OE RIEULTHIEUTH
+ 0x9498: 0xBD56, //HANGUL SYLLABLE PIEUP OE RIEULPHIEUPH
+ 0x9499: 0xBD57, //HANGUL SYLLABLE PIEUP OE RIEULHIEUH
+ 0x949A: 0xBD5A, //HANGUL SYLLABLE PIEUP OE PIEUPSIOS
+ 0x949B: 0xBD5B, //HANGUL SYLLABLE PIEUP OE SIOS
+ 0x949C: 0xBD5C, //HANGUL SYLLABLE PIEUP OE SSANGSIOS
+ 0x949D: 0xBD5D, //HANGUL SYLLABLE PIEUP OE IEUNG
+ 0x949E: 0xBD5E, //HANGUL SYLLABLE PIEUP OE CIEUC
+ 0x949F: 0xBD5F, //HANGUL SYLLABLE PIEUP OE CHIEUCH
+ 0x94A0: 0xBD60, //HANGUL SYLLABLE PIEUP OE KHIEUKH
+ 0x94A1: 0xBD61, //HANGUL SYLLABLE PIEUP OE THIEUTH
+ 0x94A2: 0xBD62, //HANGUL SYLLABLE PIEUP OE PHIEUPH
+ 0x94A3: 0xBD63, //HANGUL SYLLABLE PIEUP OE HIEUH
+ 0x94A4: 0xBD65, //HANGUL SYLLABLE PIEUP YO KIYEOK
+ 0x94A5: 0xBD66, //HANGUL SYLLABLE PIEUP YO SSANGKIYEOK
+ 0x94A6: 0xBD67, //HANGUL SYLLABLE PIEUP YO KIYEOKSIOS
+ 0x94A7: 0xBD69, //HANGUL SYLLABLE PIEUP YO NIEUNCIEUC
+ 0x94A8: 0xBD6A, //HANGUL SYLLABLE PIEUP YO NIEUNHIEUH
+ 0x94A9: 0xBD6B, //HANGUL SYLLABLE PIEUP YO TIKEUT
+ 0x94AA: 0xBD6C, //HANGUL SYLLABLE PIEUP YO RIEUL
+ 0x94AB: 0xBD6D, //HANGUL SYLLABLE PIEUP YO RIEULKIYEOK
+ 0x94AC: 0xBD6E, //HANGUL SYLLABLE PIEUP YO RIEULMIEUM
+ 0x94AD: 0xBD6F, //HANGUL SYLLABLE PIEUP YO RIEULPIEUP
+ 0x94AE: 0xBD70, //HANGUL SYLLABLE PIEUP YO RIEULSIOS
+ 0x94AF: 0xBD71, //HANGUL SYLLABLE PIEUP YO RIEULTHIEUTH
+ 0x94B0: 0xBD72, //HANGUL SYLLABLE PIEUP YO RIEULPHIEUPH
+ 0x94B1: 0xBD73, //HANGUL SYLLABLE PIEUP YO RIEULHIEUH
+ 0x94B2: 0xBD74, //HANGUL SYLLABLE PIEUP YO MIEUM
+ 0x94B3: 0xBD75, //HANGUL SYLLABLE PIEUP YO PIEUP
+ 0x94B4: 0xBD76, //HANGUL SYLLABLE PIEUP YO PIEUPSIOS
+ 0x94B5: 0xBD77, //HANGUL SYLLABLE PIEUP YO SIOS
+ 0x94B6: 0xBD78, //HANGUL SYLLABLE PIEUP YO SSANGSIOS
+ 0x94B7: 0xBD79, //HANGUL SYLLABLE PIEUP YO IEUNG
+ 0x94B8: 0xBD7A, //HANGUL SYLLABLE PIEUP YO CIEUC
+ 0x94B9: 0xBD7B, //HANGUL SYLLABLE PIEUP YO CHIEUCH
+ 0x94BA: 0xBD7C, //HANGUL SYLLABLE PIEUP YO KHIEUKH
+ 0x94BB: 0xBD7D, //HANGUL SYLLABLE PIEUP YO THIEUTH
+ 0x94BC: 0xBD7E, //HANGUL SYLLABLE PIEUP YO PHIEUPH
+ 0x94BD: 0xBD7F, //HANGUL SYLLABLE PIEUP YO HIEUH
+ 0x94BE: 0xBD82, //HANGUL SYLLABLE PIEUP U SSANGKIYEOK
+ 0x94BF: 0xBD83, //HANGUL SYLLABLE PIEUP U KIYEOKSIOS
+ 0x94C0: 0xBD85, //HANGUL SYLLABLE PIEUP U NIEUNCIEUC
+ 0x94C1: 0xBD86, //HANGUL SYLLABLE PIEUP U NIEUNHIEUH
+ 0x94C2: 0xBD8B, //HANGUL SYLLABLE PIEUP U RIEULPIEUP
+ 0x94C3: 0xBD8C, //HANGUL SYLLABLE PIEUP U RIEULSIOS
+ 0x94C4: 0xBD8D, //HANGUL SYLLABLE PIEUP U RIEULTHIEUTH
+ 0x94C5: 0xBD8E, //HANGUL SYLLABLE PIEUP U RIEULPHIEUPH
+ 0x94C6: 0xBD8F, //HANGUL SYLLABLE PIEUP U RIEULHIEUH
+ 0x94C7: 0xBD92, //HANGUL SYLLABLE PIEUP U PIEUPSIOS
+ 0x94C8: 0xBD94, //HANGUL SYLLABLE PIEUP U SSANGSIOS
+ 0x94C9: 0xBD96, //HANGUL SYLLABLE PIEUP U CIEUC
+ 0x94CA: 0xBD97, //HANGUL SYLLABLE PIEUP U CHIEUCH
+ 0x94CB: 0xBD98, //HANGUL SYLLABLE PIEUP U KHIEUKH
+ 0x94CC: 0xBD9B, //HANGUL SYLLABLE PIEUP U HIEUH
+ 0x94CD: 0xBD9D, //HANGUL SYLLABLE PIEUP WEO KIYEOK
+ 0x94CE: 0xBD9E, //HANGUL SYLLABLE PIEUP WEO SSANGKIYEOK
+ 0x94CF: 0xBD9F, //HANGUL SYLLABLE PIEUP WEO KIYEOKSIOS
+ 0x94D0: 0xBDA0, //HANGUL SYLLABLE PIEUP WEO NIEUN
+ 0x94D1: 0xBDA1, //HANGUL SYLLABLE PIEUP WEO NIEUNCIEUC
+ 0x94D2: 0xBDA2, //HANGUL SYLLABLE PIEUP WEO NIEUNHIEUH
+ 0x94D3: 0xBDA3, //HANGUL SYLLABLE PIEUP WEO TIKEUT
+ 0x94D4: 0xBDA5, //HANGUL SYLLABLE PIEUP WEO RIEULKIYEOK
+ 0x94D5: 0xBDA6, //HANGUL SYLLABLE PIEUP WEO RIEULMIEUM
+ 0x94D6: 0xBDA7, //HANGUL SYLLABLE PIEUP WEO RIEULPIEUP
+ 0x94D7: 0xBDA8, //HANGUL SYLLABLE PIEUP WEO RIEULSIOS
+ 0x94D8: 0xBDA9, //HANGUL SYLLABLE PIEUP WEO RIEULTHIEUTH
+ 0x94D9: 0xBDAA, //HANGUL SYLLABLE PIEUP WEO RIEULPHIEUPH
+ 0x94DA: 0xBDAB, //HANGUL SYLLABLE PIEUP WEO RIEULHIEUH
+ 0x94DB: 0xBDAC, //HANGUL SYLLABLE PIEUP WEO MIEUM
+ 0x94DC: 0xBDAD, //HANGUL SYLLABLE PIEUP WEO PIEUP
+ 0x94DD: 0xBDAE, //HANGUL SYLLABLE PIEUP WEO PIEUPSIOS
+ 0x94DE: 0xBDAF, //HANGUL SYLLABLE PIEUP WEO SIOS
+ 0x94DF: 0xBDB1, //HANGUL SYLLABLE PIEUP WEO IEUNG
+ 0x94E0: 0xBDB2, //HANGUL SYLLABLE PIEUP WEO CIEUC
+ 0x94E1: 0xBDB3, //HANGUL SYLLABLE PIEUP WEO CHIEUCH
+ 0x94E2: 0xBDB4, //HANGUL SYLLABLE PIEUP WEO KHIEUKH
+ 0x94E3: 0xBDB5, //HANGUL SYLLABLE PIEUP WEO THIEUTH
+ 0x94E4: 0xBDB6, //HANGUL SYLLABLE PIEUP WEO PHIEUPH
+ 0x94E5: 0xBDB7, //HANGUL SYLLABLE PIEUP WEO HIEUH
+ 0x94E6: 0xBDB9, //HANGUL SYLLABLE PIEUP WE KIYEOK
+ 0x94E7: 0xBDBA, //HANGUL SYLLABLE PIEUP WE SSANGKIYEOK
+ 0x94E8: 0xBDBB, //HANGUL SYLLABLE PIEUP WE KIYEOKSIOS
+ 0x94E9: 0xBDBC, //HANGUL SYLLABLE PIEUP WE NIEUN
+ 0x94EA: 0xBDBD, //HANGUL SYLLABLE PIEUP WE NIEUNCIEUC
+ 0x94EB: 0xBDBE, //HANGUL SYLLABLE PIEUP WE NIEUNHIEUH
+ 0x94EC: 0xBDBF, //HANGUL SYLLABLE PIEUP WE TIKEUT
+ 0x94ED: 0xBDC0, //HANGUL SYLLABLE PIEUP WE RIEUL
+ 0x94EE: 0xBDC1, //HANGUL SYLLABLE PIEUP WE RIEULKIYEOK
+ 0x94EF: 0xBDC2, //HANGUL SYLLABLE PIEUP WE RIEULMIEUM
+ 0x94F0: 0xBDC3, //HANGUL SYLLABLE PIEUP WE RIEULPIEUP
+ 0x94F1: 0xBDC4, //HANGUL SYLLABLE PIEUP WE RIEULSIOS
+ 0x94F2: 0xBDC5, //HANGUL SYLLABLE PIEUP WE RIEULTHIEUTH
+ 0x94F3: 0xBDC6, //HANGUL SYLLABLE PIEUP WE RIEULPHIEUPH
+ 0x94F4: 0xBDC7, //HANGUL SYLLABLE PIEUP WE RIEULHIEUH
+ 0x94F5: 0xBDC8, //HANGUL SYLLABLE PIEUP WE MIEUM
+ 0x94F6: 0xBDC9, //HANGUL SYLLABLE PIEUP WE PIEUP
+ 0x94F7: 0xBDCA, //HANGUL SYLLABLE PIEUP WE PIEUPSIOS
+ 0x94F8: 0xBDCB, //HANGUL SYLLABLE PIEUP WE SIOS
+ 0x94F9: 0xBDCC, //HANGUL SYLLABLE PIEUP WE SSANGSIOS
+ 0x94FA: 0xBDCD, //HANGUL SYLLABLE PIEUP WE IEUNG
+ 0x94FB: 0xBDCE, //HANGUL SYLLABLE PIEUP WE CIEUC
+ 0x94FC: 0xBDCF, //HANGUL SYLLABLE PIEUP WE CHIEUCH
+ 0x94FD: 0xBDD0, //HANGUL SYLLABLE PIEUP WE KHIEUKH
+ 0x94FE: 0xBDD1, //HANGUL SYLLABLE PIEUP WE THIEUTH
+ 0x9541: 0xBDD2, //HANGUL SYLLABLE PIEUP WE PHIEUPH
+ 0x9542: 0xBDD3, //HANGUL SYLLABLE PIEUP WE HIEUH
+ 0x9543: 0xBDD6, //HANGUL SYLLABLE PIEUP WI SSANGKIYEOK
+ 0x9544: 0xBDD7, //HANGUL SYLLABLE PIEUP WI KIYEOKSIOS
+ 0x9545: 0xBDD9, //HANGUL SYLLABLE PIEUP WI NIEUNCIEUC
+ 0x9546: 0xBDDA, //HANGUL SYLLABLE PIEUP WI NIEUNHIEUH
+ 0x9547: 0xBDDB, //HANGUL SYLLABLE PIEUP WI TIKEUT
+ 0x9548: 0xBDDD, //HANGUL SYLLABLE PIEUP WI RIEULKIYEOK
+ 0x9549: 0xBDDE, //HANGUL SYLLABLE PIEUP WI RIEULMIEUM
+ 0x954A: 0xBDDF, //HANGUL SYLLABLE PIEUP WI RIEULPIEUP
+ 0x954B: 0xBDE0, //HANGUL SYLLABLE PIEUP WI RIEULSIOS
+ 0x954C: 0xBDE1, //HANGUL SYLLABLE PIEUP WI RIEULTHIEUTH
+ 0x954D: 0xBDE2, //HANGUL SYLLABLE PIEUP WI RIEULPHIEUPH
+ 0x954E: 0xBDE3, //HANGUL SYLLABLE PIEUP WI RIEULHIEUH
+ 0x954F: 0xBDE4, //HANGUL SYLLABLE PIEUP WI MIEUM
+ 0x9550: 0xBDE5, //HANGUL SYLLABLE PIEUP WI PIEUP
+ 0x9551: 0xBDE6, //HANGUL SYLLABLE PIEUP WI PIEUPSIOS
+ 0x9552: 0xBDE7, //HANGUL SYLLABLE PIEUP WI SIOS
+ 0x9553: 0xBDE8, //HANGUL SYLLABLE PIEUP WI SSANGSIOS
+ 0x9554: 0xBDEA, //HANGUL SYLLABLE PIEUP WI CIEUC
+ 0x9555: 0xBDEB, //HANGUL SYLLABLE PIEUP WI CHIEUCH
+ 0x9556: 0xBDEC, //HANGUL SYLLABLE PIEUP WI KHIEUKH
+ 0x9557: 0xBDED, //HANGUL SYLLABLE PIEUP WI THIEUTH
+ 0x9558: 0xBDEE, //HANGUL SYLLABLE PIEUP WI PHIEUPH
+ 0x9559: 0xBDEF, //HANGUL SYLLABLE PIEUP WI HIEUH
+ 0x955A: 0xBDF1, //HANGUL SYLLABLE PIEUP YU KIYEOK
+ 0x9561: 0xBDF2, //HANGUL SYLLABLE PIEUP YU SSANGKIYEOK
+ 0x9562: 0xBDF3, //HANGUL SYLLABLE PIEUP YU KIYEOKSIOS
+ 0x9563: 0xBDF5, //HANGUL SYLLABLE PIEUP YU NIEUNCIEUC
+ 0x9564: 0xBDF6, //HANGUL SYLLABLE PIEUP YU NIEUNHIEUH
+ 0x9565: 0xBDF7, //HANGUL SYLLABLE PIEUP YU TIKEUT
+ 0x9566: 0xBDF9, //HANGUL SYLLABLE PIEUP YU RIEULKIYEOK
+ 0x9567: 0xBDFA, //HANGUL SYLLABLE PIEUP YU RIEULMIEUM
+ 0x9568: 0xBDFB, //HANGUL SYLLABLE PIEUP YU RIEULPIEUP
+ 0x9569: 0xBDFC, //HANGUL SYLLABLE PIEUP YU RIEULSIOS
+ 0x956A: 0xBDFD, //HANGUL SYLLABLE PIEUP YU RIEULTHIEUTH
+ 0x956B: 0xBDFE, //HANGUL SYLLABLE PIEUP YU RIEULPHIEUPH
+ 0x956C: 0xBDFF, //HANGUL SYLLABLE PIEUP YU RIEULHIEUH
+ 0x956D: 0xBE01, //HANGUL SYLLABLE PIEUP YU PIEUP
+ 0x956E: 0xBE02, //HANGUL SYLLABLE PIEUP YU PIEUPSIOS
+ 0x956F: 0xBE04, //HANGUL SYLLABLE PIEUP YU SSANGSIOS
+ 0x9570: 0xBE06, //HANGUL SYLLABLE PIEUP YU CIEUC
+ 0x9571: 0xBE07, //HANGUL SYLLABLE PIEUP YU CHIEUCH
+ 0x9572: 0xBE08, //HANGUL SYLLABLE PIEUP YU KHIEUKH
+ 0x9573: 0xBE09, //HANGUL SYLLABLE PIEUP YU THIEUTH
+ 0x9574: 0xBE0A, //HANGUL SYLLABLE PIEUP YU PHIEUPH
+ 0x9575: 0xBE0B, //HANGUL SYLLABLE PIEUP YU HIEUH
+ 0x9576: 0xBE0E, //HANGUL SYLLABLE PIEUP EU SSANGKIYEOK
+ 0x9577: 0xBE0F, //HANGUL SYLLABLE PIEUP EU KIYEOKSIOS
+ 0x9578: 0xBE11, //HANGUL SYLLABLE PIEUP EU NIEUNCIEUC
+ 0x9579: 0xBE12, //HANGUL SYLLABLE PIEUP EU NIEUNHIEUH
+ 0x957A: 0xBE13, //HANGUL SYLLABLE PIEUP EU TIKEUT
+ 0x9581: 0xBE15, //HANGUL SYLLABLE PIEUP EU RIEULKIYEOK
+ 0x9582: 0xBE16, //HANGUL SYLLABLE PIEUP EU RIEULMIEUM
+ 0x9583: 0xBE17, //HANGUL SYLLABLE PIEUP EU RIEULPIEUP
+ 0x9584: 0xBE18, //HANGUL SYLLABLE PIEUP EU RIEULSIOS
+ 0x9585: 0xBE19, //HANGUL SYLLABLE PIEUP EU RIEULTHIEUTH
+ 0x9586: 0xBE1A, //HANGUL SYLLABLE PIEUP EU RIEULPHIEUPH
+ 0x9587: 0xBE1B, //HANGUL SYLLABLE PIEUP EU RIEULHIEUH
+ 0x9588: 0xBE1E, //HANGUL SYLLABLE PIEUP EU PIEUPSIOS
+ 0x9589: 0xBE20, //HANGUL SYLLABLE PIEUP EU SSANGSIOS
+ 0x958A: 0xBE21, //HANGUL SYLLABLE PIEUP EU IEUNG
+ 0x958B: 0xBE22, //HANGUL SYLLABLE PIEUP EU CIEUC
+ 0x958C: 0xBE23, //HANGUL SYLLABLE PIEUP EU CHIEUCH
+ 0x958D: 0xBE24, //HANGUL SYLLABLE PIEUP EU KHIEUKH
+ 0x958E: 0xBE25, //HANGUL SYLLABLE PIEUP EU THIEUTH
+ 0x958F: 0xBE26, //HANGUL SYLLABLE PIEUP EU PHIEUPH
+ 0x9590: 0xBE27, //HANGUL SYLLABLE PIEUP EU HIEUH
+ 0x9591: 0xBE28, //HANGUL SYLLABLE PIEUP YI
+ 0x9592: 0xBE29, //HANGUL SYLLABLE PIEUP YI KIYEOK
+ 0x9593: 0xBE2A, //HANGUL SYLLABLE PIEUP YI SSANGKIYEOK
+ 0x9594: 0xBE2B, //HANGUL SYLLABLE PIEUP YI KIYEOKSIOS
+ 0x9595: 0xBE2C, //HANGUL SYLLABLE PIEUP YI NIEUN
+ 0x9596: 0xBE2D, //HANGUL SYLLABLE PIEUP YI NIEUNCIEUC
+ 0x9597: 0xBE2E, //HANGUL SYLLABLE PIEUP YI NIEUNHIEUH
+ 0x9598: 0xBE2F, //HANGUL SYLLABLE PIEUP YI TIKEUT
+ 0x9599: 0xBE30, //HANGUL SYLLABLE PIEUP YI RIEUL
+ 0x959A: 0xBE31, //HANGUL SYLLABLE PIEUP YI RIEULKIYEOK
+ 0x959B: 0xBE32, //HANGUL SYLLABLE PIEUP YI RIEULMIEUM
+ 0x959C: 0xBE33, //HANGUL SYLLABLE PIEUP YI RIEULPIEUP
+ 0x959D: 0xBE34, //HANGUL SYLLABLE PIEUP YI RIEULSIOS
+ 0x959E: 0xBE35, //HANGUL SYLLABLE PIEUP YI RIEULTHIEUTH
+ 0x959F: 0xBE36, //HANGUL SYLLABLE PIEUP YI RIEULPHIEUPH
+ 0x95A0: 0xBE37, //HANGUL SYLLABLE PIEUP YI RIEULHIEUH
+ 0x95A1: 0xBE38, //HANGUL SYLLABLE PIEUP YI MIEUM
+ 0x95A2: 0xBE39, //HANGUL SYLLABLE PIEUP YI PIEUP
+ 0x95A3: 0xBE3A, //HANGUL SYLLABLE PIEUP YI PIEUPSIOS
+ 0x95A4: 0xBE3B, //HANGUL SYLLABLE PIEUP YI SIOS
+ 0x95A5: 0xBE3C, //HANGUL SYLLABLE PIEUP YI SSANGSIOS
+ 0x95A6: 0xBE3D, //HANGUL SYLLABLE PIEUP YI IEUNG
+ 0x95A7: 0xBE3E, //HANGUL SYLLABLE PIEUP YI CIEUC
+ 0x95A8: 0xBE3F, //HANGUL SYLLABLE PIEUP YI CHIEUCH
+ 0x95A9: 0xBE40, //HANGUL SYLLABLE PIEUP YI KHIEUKH
+ 0x95AA: 0xBE41, //HANGUL SYLLABLE PIEUP YI THIEUTH
+ 0x95AB: 0xBE42, //HANGUL SYLLABLE PIEUP YI PHIEUPH
+ 0x95AC: 0xBE43, //HANGUL SYLLABLE PIEUP YI HIEUH
+ 0x95AD: 0xBE46, //HANGUL SYLLABLE PIEUP I SSANGKIYEOK
+ 0x95AE: 0xBE47, //HANGUL SYLLABLE PIEUP I KIYEOKSIOS
+ 0x95AF: 0xBE49, //HANGUL SYLLABLE PIEUP I NIEUNCIEUC
+ 0x95B0: 0xBE4A, //HANGUL SYLLABLE PIEUP I NIEUNHIEUH
+ 0x95B1: 0xBE4B, //HANGUL SYLLABLE PIEUP I TIKEUT
+ 0x95B2: 0xBE4D, //HANGUL SYLLABLE PIEUP I RIEULKIYEOK
+ 0x95B3: 0xBE4F, //HANGUL SYLLABLE PIEUP I RIEULPIEUP
+ 0x95B4: 0xBE50, //HANGUL SYLLABLE PIEUP I RIEULSIOS
+ 0x95B5: 0xBE51, //HANGUL SYLLABLE PIEUP I RIEULTHIEUTH
+ 0x95B6: 0xBE52, //HANGUL SYLLABLE PIEUP I RIEULPHIEUPH
+ 0x95B7: 0xBE53, //HANGUL SYLLABLE PIEUP I RIEULHIEUH
+ 0x95B8: 0xBE56, //HANGUL SYLLABLE PIEUP I PIEUPSIOS
+ 0x95B9: 0xBE58, //HANGUL SYLLABLE PIEUP I SSANGSIOS
+ 0x95BA: 0xBE5C, //HANGUL SYLLABLE PIEUP I KHIEUKH
+ 0x95BB: 0xBE5D, //HANGUL SYLLABLE PIEUP I THIEUTH
+ 0x95BC: 0xBE5E, //HANGUL SYLLABLE PIEUP I PHIEUPH
+ 0x95BD: 0xBE5F, //HANGUL SYLLABLE PIEUP I HIEUH
+ 0x95BE: 0xBE62, //HANGUL SYLLABLE SSANGPIEUP A SSANGKIYEOK
+ 0x95BF: 0xBE63, //HANGUL SYLLABLE SSANGPIEUP A KIYEOKSIOS
+ 0x95C0: 0xBE65, //HANGUL SYLLABLE SSANGPIEUP A NIEUNCIEUC
+ 0x95C1: 0xBE66, //HANGUL SYLLABLE SSANGPIEUP A NIEUNHIEUH
+ 0x95C2: 0xBE67, //HANGUL SYLLABLE SSANGPIEUP A TIKEUT
+ 0x95C3: 0xBE69, //HANGUL SYLLABLE SSANGPIEUP A RIEULKIYEOK
+ 0x95C4: 0xBE6B, //HANGUL SYLLABLE SSANGPIEUP A RIEULPIEUP
+ 0x95C5: 0xBE6C, //HANGUL SYLLABLE SSANGPIEUP A RIEULSIOS
+ 0x95C6: 0xBE6D, //HANGUL SYLLABLE SSANGPIEUP A RIEULTHIEUTH
+ 0x95C7: 0xBE6E, //HANGUL SYLLABLE SSANGPIEUP A RIEULPHIEUPH
+ 0x95C8: 0xBE6F, //HANGUL SYLLABLE SSANGPIEUP A RIEULHIEUH
+ 0x95C9: 0xBE72, //HANGUL SYLLABLE SSANGPIEUP A PIEUPSIOS
+ 0x95CA: 0xBE76, //HANGUL SYLLABLE SSANGPIEUP A CIEUC
+ 0x95CB: 0xBE77, //HANGUL SYLLABLE SSANGPIEUP A CHIEUCH
+ 0x95CC: 0xBE78, //HANGUL SYLLABLE SSANGPIEUP A KHIEUKH
+ 0x95CD: 0xBE79, //HANGUL SYLLABLE SSANGPIEUP A THIEUTH
+ 0x95CE: 0xBE7A, //HANGUL SYLLABLE SSANGPIEUP A PHIEUPH
+ 0x95CF: 0xBE7E, //HANGUL SYLLABLE SSANGPIEUP AE SSANGKIYEOK
+ 0x95D0: 0xBE7F, //HANGUL SYLLABLE SSANGPIEUP AE KIYEOKSIOS
+ 0x95D1: 0xBE81, //HANGUL SYLLABLE SSANGPIEUP AE NIEUNCIEUC
+ 0x95D2: 0xBE82, //HANGUL SYLLABLE SSANGPIEUP AE NIEUNHIEUH
+ 0x95D3: 0xBE83, //HANGUL SYLLABLE SSANGPIEUP AE TIKEUT
+ 0x95D4: 0xBE85, //HANGUL SYLLABLE SSANGPIEUP AE RIEULKIYEOK
+ 0x95D5: 0xBE86, //HANGUL SYLLABLE SSANGPIEUP AE RIEULMIEUM
+ 0x95D6: 0xBE87, //HANGUL SYLLABLE SSANGPIEUP AE RIEULPIEUP
+ 0x95D7: 0xBE88, //HANGUL SYLLABLE SSANGPIEUP AE RIEULSIOS
+ 0x95D8: 0xBE89, //HANGUL SYLLABLE SSANGPIEUP AE RIEULTHIEUTH
+ 0x95D9: 0xBE8A, //HANGUL SYLLABLE SSANGPIEUP AE RIEULPHIEUPH
+ 0x95DA: 0xBE8B, //HANGUL SYLLABLE SSANGPIEUP AE RIEULHIEUH
+ 0x95DB: 0xBE8E, //HANGUL SYLLABLE SSANGPIEUP AE PIEUPSIOS
+ 0x95DC: 0xBE92, //HANGUL SYLLABLE SSANGPIEUP AE CIEUC
+ 0x95DD: 0xBE93, //HANGUL SYLLABLE SSANGPIEUP AE CHIEUCH
+ 0x95DE: 0xBE94, //HANGUL SYLLABLE SSANGPIEUP AE KHIEUKH
+ 0x95DF: 0xBE95, //HANGUL SYLLABLE SSANGPIEUP AE THIEUTH
+ 0x95E0: 0xBE96, //HANGUL SYLLABLE SSANGPIEUP AE PHIEUPH
+ 0x95E1: 0xBE97, //HANGUL SYLLABLE SSANGPIEUP AE HIEUH
+ 0x95E2: 0xBE9A, //HANGUL SYLLABLE SSANGPIEUP YA SSANGKIYEOK
+ 0x95E3: 0xBE9B, //HANGUL SYLLABLE SSANGPIEUP YA KIYEOKSIOS
+ 0x95E4: 0xBE9C, //HANGUL SYLLABLE SSANGPIEUP YA NIEUN
+ 0x95E5: 0xBE9D, //HANGUL SYLLABLE SSANGPIEUP YA NIEUNCIEUC
+ 0x95E6: 0xBE9E, //HANGUL SYLLABLE SSANGPIEUP YA NIEUNHIEUH
+ 0x95E7: 0xBE9F, //HANGUL SYLLABLE SSANGPIEUP YA TIKEUT
+ 0x95E8: 0xBEA0, //HANGUL SYLLABLE SSANGPIEUP YA RIEUL
+ 0x95E9: 0xBEA1, //HANGUL SYLLABLE SSANGPIEUP YA RIEULKIYEOK
+ 0x95EA: 0xBEA2, //HANGUL SYLLABLE SSANGPIEUP YA RIEULMIEUM
+ 0x95EB: 0xBEA3, //HANGUL SYLLABLE SSANGPIEUP YA RIEULPIEUP
+ 0x95EC: 0xBEA4, //HANGUL SYLLABLE SSANGPIEUP YA RIEULSIOS
+ 0x95ED: 0xBEA5, //HANGUL SYLLABLE SSANGPIEUP YA RIEULTHIEUTH
+ 0x95EE: 0xBEA6, //HANGUL SYLLABLE SSANGPIEUP YA RIEULPHIEUPH
+ 0x95EF: 0xBEA7, //HANGUL SYLLABLE SSANGPIEUP YA RIEULHIEUH
+ 0x95F0: 0xBEA9, //HANGUL SYLLABLE SSANGPIEUP YA PIEUP
+ 0x95F1: 0xBEAA, //HANGUL SYLLABLE SSANGPIEUP YA PIEUPSIOS
+ 0x95F2: 0xBEAB, //HANGUL SYLLABLE SSANGPIEUP YA SIOS
+ 0x95F3: 0xBEAC, //HANGUL SYLLABLE SSANGPIEUP YA SSANGSIOS
+ 0x95F4: 0xBEAD, //HANGUL SYLLABLE SSANGPIEUP YA IEUNG
+ 0x95F5: 0xBEAE, //HANGUL SYLLABLE SSANGPIEUP YA CIEUC
+ 0x95F6: 0xBEAF, //HANGUL SYLLABLE SSANGPIEUP YA CHIEUCH
+ 0x95F7: 0xBEB0, //HANGUL SYLLABLE SSANGPIEUP YA KHIEUKH
+ 0x95F8: 0xBEB1, //HANGUL SYLLABLE SSANGPIEUP YA THIEUTH
+ 0x95F9: 0xBEB2, //HANGUL SYLLABLE SSANGPIEUP YA PHIEUPH
+ 0x95FA: 0xBEB3, //HANGUL SYLLABLE SSANGPIEUP YA HIEUH
+ 0x95FB: 0xBEB4, //HANGUL SYLLABLE SSANGPIEUP YAE
+ 0x95FC: 0xBEB5, //HANGUL SYLLABLE SSANGPIEUP YAE KIYEOK
+ 0x95FD: 0xBEB6, //HANGUL SYLLABLE SSANGPIEUP YAE SSANGKIYEOK
+ 0x95FE: 0xBEB7, //HANGUL SYLLABLE SSANGPIEUP YAE KIYEOKSIOS
+ 0x9641: 0xBEB8, //HANGUL SYLLABLE SSANGPIEUP YAE NIEUN
+ 0x9642: 0xBEB9, //HANGUL SYLLABLE SSANGPIEUP YAE NIEUNCIEUC
+ 0x9643: 0xBEBA, //HANGUL SYLLABLE SSANGPIEUP YAE NIEUNHIEUH
+ 0x9644: 0xBEBB, //HANGUL SYLLABLE SSANGPIEUP YAE TIKEUT
+ 0x9645: 0xBEBC, //HANGUL SYLLABLE SSANGPIEUP YAE RIEUL
+ 0x9646: 0xBEBD, //HANGUL SYLLABLE SSANGPIEUP YAE RIEULKIYEOK
+ 0x9647: 0xBEBE, //HANGUL SYLLABLE SSANGPIEUP YAE RIEULMIEUM
+ 0x9648: 0xBEBF, //HANGUL SYLLABLE SSANGPIEUP YAE RIEULPIEUP
+ 0x9649: 0xBEC0, //HANGUL SYLLABLE SSANGPIEUP YAE RIEULSIOS
+ 0x964A: 0xBEC1, //HANGUL SYLLABLE SSANGPIEUP YAE RIEULTHIEUTH
+ 0x964B: 0xBEC2, //HANGUL SYLLABLE SSANGPIEUP YAE RIEULPHIEUPH
+ 0x964C: 0xBEC3, //HANGUL SYLLABLE SSANGPIEUP YAE RIEULHIEUH
+ 0x964D: 0xBEC4, //HANGUL SYLLABLE SSANGPIEUP YAE MIEUM
+ 0x964E: 0xBEC5, //HANGUL SYLLABLE SSANGPIEUP YAE PIEUP
+ 0x964F: 0xBEC6, //HANGUL SYLLABLE SSANGPIEUP YAE PIEUPSIOS
+ 0x9650: 0xBEC7, //HANGUL SYLLABLE SSANGPIEUP YAE SIOS
+ 0x9651: 0xBEC8, //HANGUL SYLLABLE SSANGPIEUP YAE SSANGSIOS
+ 0x9652: 0xBEC9, //HANGUL SYLLABLE SSANGPIEUP YAE IEUNG
+ 0x9653: 0xBECA, //HANGUL SYLLABLE SSANGPIEUP YAE CIEUC
+ 0x9654: 0xBECB, //HANGUL SYLLABLE SSANGPIEUP YAE CHIEUCH
+ 0x9655: 0xBECC, //HANGUL SYLLABLE SSANGPIEUP YAE KHIEUKH
+ 0x9656: 0xBECD, //HANGUL SYLLABLE SSANGPIEUP YAE THIEUTH
+ 0x9657: 0xBECE, //HANGUL SYLLABLE SSANGPIEUP YAE PHIEUPH
+ 0x9658: 0xBECF, //HANGUL SYLLABLE SSANGPIEUP YAE HIEUH
+ 0x9659: 0xBED2, //HANGUL SYLLABLE SSANGPIEUP EO SSANGKIYEOK
+ 0x965A: 0xBED3, //HANGUL SYLLABLE SSANGPIEUP EO KIYEOKSIOS
+ 0x9661: 0xBED5, //HANGUL SYLLABLE SSANGPIEUP EO NIEUNCIEUC
+ 0x9662: 0xBED6, //HANGUL SYLLABLE SSANGPIEUP EO NIEUNHIEUH
+ 0x9663: 0xBED9, //HANGUL SYLLABLE SSANGPIEUP EO RIEULKIYEOK
+ 0x9664: 0xBEDA, //HANGUL SYLLABLE SSANGPIEUP EO RIEULMIEUM
+ 0x9665: 0xBEDB, //HANGUL SYLLABLE SSANGPIEUP EO RIEULPIEUP
+ 0x9666: 0xBEDC, //HANGUL SYLLABLE SSANGPIEUP EO RIEULSIOS
+ 0x9667: 0xBEDD, //HANGUL SYLLABLE SSANGPIEUP EO RIEULTHIEUTH
+ 0x9668: 0xBEDE, //HANGUL SYLLABLE SSANGPIEUP EO RIEULPHIEUPH
+ 0x9669: 0xBEDF, //HANGUL SYLLABLE SSANGPIEUP EO RIEULHIEUH
+ 0x966A: 0xBEE1, //HANGUL SYLLABLE SSANGPIEUP EO PIEUP
+ 0x966B: 0xBEE2, //HANGUL SYLLABLE SSANGPIEUP EO PIEUPSIOS
+ 0x966C: 0xBEE6, //HANGUL SYLLABLE SSANGPIEUP EO CIEUC
+ 0x966D: 0xBEE7, //HANGUL SYLLABLE SSANGPIEUP EO CHIEUCH
+ 0x966E: 0xBEE8, //HANGUL SYLLABLE SSANGPIEUP EO KHIEUKH
+ 0x966F: 0xBEE9, //HANGUL SYLLABLE SSANGPIEUP EO THIEUTH
+ 0x9670: 0xBEEA, //HANGUL SYLLABLE SSANGPIEUP EO PHIEUPH
+ 0x9671: 0xBEEB, //HANGUL SYLLABLE SSANGPIEUP EO HIEUH
+ 0x9672: 0xBEED, //HANGUL SYLLABLE SSANGPIEUP E KIYEOK
+ 0x9673: 0xBEEE, //HANGUL SYLLABLE SSANGPIEUP E SSANGKIYEOK
+ 0x9674: 0xBEEF, //HANGUL SYLLABLE SSANGPIEUP E KIYEOKSIOS
+ 0x9675: 0xBEF0, //HANGUL SYLLABLE SSANGPIEUP E NIEUN
+ 0x9676: 0xBEF1, //HANGUL SYLLABLE SSANGPIEUP E NIEUNCIEUC
+ 0x9677: 0xBEF2, //HANGUL SYLLABLE SSANGPIEUP E NIEUNHIEUH
+ 0x9678: 0xBEF3, //HANGUL SYLLABLE SSANGPIEUP E TIKEUT
+ 0x9679: 0xBEF4, //HANGUL SYLLABLE SSANGPIEUP E RIEUL
+ 0x967A: 0xBEF5, //HANGUL SYLLABLE SSANGPIEUP E RIEULKIYEOK
+ 0x9681: 0xBEF6, //HANGUL SYLLABLE SSANGPIEUP E RIEULMIEUM
+ 0x9682: 0xBEF7, //HANGUL SYLLABLE SSANGPIEUP E RIEULPIEUP
+ 0x9683: 0xBEF8, //HANGUL SYLLABLE SSANGPIEUP E RIEULSIOS
+ 0x9684: 0xBEF9, //HANGUL SYLLABLE SSANGPIEUP E RIEULTHIEUTH
+ 0x9685: 0xBEFA, //HANGUL SYLLABLE SSANGPIEUP E RIEULPHIEUPH
+ 0x9686: 0xBEFB, //HANGUL SYLLABLE SSANGPIEUP E RIEULHIEUH
+ 0x9687: 0xBEFC, //HANGUL SYLLABLE SSANGPIEUP E MIEUM
+ 0x9688: 0xBEFD, //HANGUL SYLLABLE SSANGPIEUP E PIEUP
+ 0x9689: 0xBEFE, //HANGUL SYLLABLE SSANGPIEUP E PIEUPSIOS
+ 0x968A: 0xBEFF, //HANGUL SYLLABLE SSANGPIEUP E SIOS
+ 0x968B: 0xBF00, //HANGUL SYLLABLE SSANGPIEUP E SSANGSIOS
+ 0x968C: 0xBF02, //HANGUL SYLLABLE SSANGPIEUP E CIEUC
+ 0x968D: 0xBF03, //HANGUL SYLLABLE SSANGPIEUP E CHIEUCH
+ 0x968E: 0xBF04, //HANGUL SYLLABLE SSANGPIEUP E KHIEUKH
+ 0x968F: 0xBF05, //HANGUL SYLLABLE SSANGPIEUP E THIEUTH
+ 0x9690: 0xBF06, //HANGUL SYLLABLE SSANGPIEUP E PHIEUPH
+ 0x9691: 0xBF07, //HANGUL SYLLABLE SSANGPIEUP E HIEUH
+ 0x9692: 0xBF0A, //HANGUL SYLLABLE SSANGPIEUP YEO SSANGKIYEOK
+ 0x9693: 0xBF0B, //HANGUL SYLLABLE SSANGPIEUP YEO KIYEOKSIOS
+ 0x9694: 0xBF0C, //HANGUL SYLLABLE SSANGPIEUP YEO NIEUN
+ 0x9695: 0xBF0D, //HANGUL SYLLABLE SSANGPIEUP YEO NIEUNCIEUC
+ 0x9696: 0xBF0E, //HANGUL SYLLABLE SSANGPIEUP YEO NIEUNHIEUH
+ 0x9697: 0xBF0F, //HANGUL SYLLABLE SSANGPIEUP YEO TIKEUT
+ 0x9698: 0xBF10, //HANGUL SYLLABLE SSANGPIEUP YEO RIEUL
+ 0x9699: 0xBF11, //HANGUL SYLLABLE SSANGPIEUP YEO RIEULKIYEOK
+ 0x969A: 0xBF12, //HANGUL SYLLABLE SSANGPIEUP YEO RIEULMIEUM
+ 0x969B: 0xBF13, //HANGUL SYLLABLE SSANGPIEUP YEO RIEULPIEUP
+ 0x969C: 0xBF14, //HANGUL SYLLABLE SSANGPIEUP YEO RIEULSIOS
+ 0x969D: 0xBF15, //HANGUL SYLLABLE SSANGPIEUP YEO RIEULTHIEUTH
+ 0x969E: 0xBF16, //HANGUL SYLLABLE SSANGPIEUP YEO RIEULPHIEUPH
+ 0x969F: 0xBF17, //HANGUL SYLLABLE SSANGPIEUP YEO RIEULHIEUH
+ 0x96A0: 0xBF1A, //HANGUL SYLLABLE SSANGPIEUP YEO PIEUPSIOS
+ 0x96A1: 0xBF1E, //HANGUL SYLLABLE SSANGPIEUP YEO CIEUC
+ 0x96A2: 0xBF1F, //HANGUL SYLLABLE SSANGPIEUP YEO CHIEUCH
+ 0x96A3: 0xBF20, //HANGUL SYLLABLE SSANGPIEUP YEO KHIEUKH
+ 0x96A4: 0xBF21, //HANGUL SYLLABLE SSANGPIEUP YEO THIEUTH
+ 0x96A5: 0xBF22, //HANGUL SYLLABLE SSANGPIEUP YEO PHIEUPH
+ 0x96A6: 0xBF23, //HANGUL SYLLABLE SSANGPIEUP YEO HIEUH
+ 0x96A7: 0xBF24, //HANGUL SYLLABLE SSANGPIEUP YE
+ 0x96A8: 0xBF25, //HANGUL SYLLABLE SSANGPIEUP YE KIYEOK
+ 0x96A9: 0xBF26, //HANGUL SYLLABLE SSANGPIEUP YE SSANGKIYEOK
+ 0x96AA: 0xBF27, //HANGUL SYLLABLE SSANGPIEUP YE KIYEOKSIOS
+ 0x96AB: 0xBF28, //HANGUL SYLLABLE SSANGPIEUP YE NIEUN
+ 0x96AC: 0xBF29, //HANGUL SYLLABLE SSANGPIEUP YE NIEUNCIEUC
+ 0x96AD: 0xBF2A, //HANGUL SYLLABLE SSANGPIEUP YE NIEUNHIEUH
+ 0x96AE: 0xBF2B, //HANGUL SYLLABLE SSANGPIEUP YE TIKEUT
+ 0x96AF: 0xBF2C, //HANGUL SYLLABLE SSANGPIEUP YE RIEUL
+ 0x96B0: 0xBF2D, //HANGUL SYLLABLE SSANGPIEUP YE RIEULKIYEOK
+ 0x96B1: 0xBF2E, //HANGUL SYLLABLE SSANGPIEUP YE RIEULMIEUM
+ 0x96B2: 0xBF2F, //HANGUL SYLLABLE SSANGPIEUP YE RIEULPIEUP
+ 0x96B3: 0xBF30, //HANGUL SYLLABLE SSANGPIEUP YE RIEULSIOS
+ 0x96B4: 0xBF31, //HANGUL SYLLABLE SSANGPIEUP YE RIEULTHIEUTH
+ 0x96B5: 0xBF32, //HANGUL SYLLABLE SSANGPIEUP YE RIEULPHIEUPH
+ 0x96B6: 0xBF33, //HANGUL SYLLABLE SSANGPIEUP YE RIEULHIEUH
+ 0x96B7: 0xBF34, //HANGUL SYLLABLE SSANGPIEUP YE MIEUM
+ 0x96B8: 0xBF35, //HANGUL SYLLABLE SSANGPIEUP YE PIEUP
+ 0x96B9: 0xBF36, //HANGUL SYLLABLE SSANGPIEUP YE PIEUPSIOS
+ 0x96BA: 0xBF37, //HANGUL SYLLABLE SSANGPIEUP YE SIOS
+ 0x96BB: 0xBF38, //HANGUL SYLLABLE SSANGPIEUP YE SSANGSIOS
+ 0x96BC: 0xBF39, //HANGUL SYLLABLE SSANGPIEUP YE IEUNG
+ 0x96BD: 0xBF3A, //HANGUL SYLLABLE SSANGPIEUP YE CIEUC
+ 0x96BE: 0xBF3B, //HANGUL SYLLABLE SSANGPIEUP YE CHIEUCH
+ 0x96BF: 0xBF3C, //HANGUL SYLLABLE SSANGPIEUP YE KHIEUKH
+ 0x96C0: 0xBF3D, //HANGUL SYLLABLE SSANGPIEUP YE THIEUTH
+ 0x96C1: 0xBF3E, //HANGUL SYLLABLE SSANGPIEUP YE PHIEUPH
+ 0x96C2: 0xBF3F, //HANGUL SYLLABLE SSANGPIEUP YE HIEUH
+ 0x96C3: 0xBF42, //HANGUL SYLLABLE SSANGPIEUP O SSANGKIYEOK
+ 0x96C4: 0xBF43, //HANGUL SYLLABLE SSANGPIEUP O KIYEOKSIOS
+ 0x96C5: 0xBF45, //HANGUL SYLLABLE SSANGPIEUP O NIEUNCIEUC
+ 0x96C6: 0xBF46, //HANGUL SYLLABLE SSANGPIEUP O NIEUNHIEUH
+ 0x96C7: 0xBF47, //HANGUL SYLLABLE SSANGPIEUP O TIKEUT
+ 0x96C8: 0xBF49, //HANGUL SYLLABLE SSANGPIEUP O RIEULKIYEOK
+ 0x96C9: 0xBF4A, //HANGUL SYLLABLE SSANGPIEUP O RIEULMIEUM
+ 0x96CA: 0xBF4B, //HANGUL SYLLABLE SSANGPIEUP O RIEULPIEUP
+ 0x96CB: 0xBF4C, //HANGUL SYLLABLE SSANGPIEUP O RIEULSIOS
+ 0x96CC: 0xBF4D, //HANGUL SYLLABLE SSANGPIEUP O RIEULTHIEUTH
+ 0x96CD: 0xBF4E, //HANGUL SYLLABLE SSANGPIEUP O RIEULPHIEUPH
+ 0x96CE: 0xBF4F, //HANGUL SYLLABLE SSANGPIEUP O RIEULHIEUH
+ 0x96CF: 0xBF52, //HANGUL SYLLABLE SSANGPIEUP O PIEUPSIOS
+ 0x96D0: 0xBF53, //HANGUL SYLLABLE SSANGPIEUP O SIOS
+ 0x96D1: 0xBF54, //HANGUL SYLLABLE SSANGPIEUP O SSANGSIOS
+ 0x96D2: 0xBF56, //HANGUL SYLLABLE SSANGPIEUP O CIEUC
+ 0x96D3: 0xBF57, //HANGUL SYLLABLE SSANGPIEUP O CHIEUCH
+ 0x96D4: 0xBF58, //HANGUL SYLLABLE SSANGPIEUP O KHIEUKH
+ 0x96D5: 0xBF59, //HANGUL SYLLABLE SSANGPIEUP O THIEUTH
+ 0x96D6: 0xBF5A, //HANGUL SYLLABLE SSANGPIEUP O PHIEUPH
+ 0x96D7: 0xBF5B, //HANGUL SYLLABLE SSANGPIEUP O HIEUH
+ 0x96D8: 0xBF5C, //HANGUL SYLLABLE SSANGPIEUP WA
+ 0x96D9: 0xBF5D, //HANGUL SYLLABLE SSANGPIEUP WA KIYEOK
+ 0x96DA: 0xBF5E, //HANGUL SYLLABLE SSANGPIEUP WA SSANGKIYEOK
+ 0x96DB: 0xBF5F, //HANGUL SYLLABLE SSANGPIEUP WA KIYEOKSIOS
+ 0x96DC: 0xBF60, //HANGUL SYLLABLE SSANGPIEUP WA NIEUN
+ 0x96DD: 0xBF61, //HANGUL SYLLABLE SSANGPIEUP WA NIEUNCIEUC
+ 0x96DE: 0xBF62, //HANGUL SYLLABLE SSANGPIEUP WA NIEUNHIEUH
+ 0x96DF: 0xBF63, //HANGUL SYLLABLE SSANGPIEUP WA TIKEUT
+ 0x96E0: 0xBF64, //HANGUL SYLLABLE SSANGPIEUP WA RIEUL
+ 0x96E1: 0xBF65, //HANGUL SYLLABLE SSANGPIEUP WA RIEULKIYEOK
+ 0x96E2: 0xBF66, //HANGUL SYLLABLE SSANGPIEUP WA RIEULMIEUM
+ 0x96E3: 0xBF67, //HANGUL SYLLABLE SSANGPIEUP WA RIEULPIEUP
+ 0x96E4: 0xBF68, //HANGUL SYLLABLE SSANGPIEUP WA RIEULSIOS
+ 0x96E5: 0xBF69, //HANGUL SYLLABLE SSANGPIEUP WA RIEULTHIEUTH
+ 0x96E6: 0xBF6A, //HANGUL SYLLABLE SSANGPIEUP WA RIEULPHIEUPH
+ 0x96E7: 0xBF6B, //HANGUL SYLLABLE SSANGPIEUP WA RIEULHIEUH
+ 0x96E8: 0xBF6C, //HANGUL SYLLABLE SSANGPIEUP WA MIEUM
+ 0x96E9: 0xBF6D, //HANGUL SYLLABLE SSANGPIEUP WA PIEUP
+ 0x96EA: 0xBF6E, //HANGUL SYLLABLE SSANGPIEUP WA PIEUPSIOS
+ 0x96EB: 0xBF6F, //HANGUL SYLLABLE SSANGPIEUP WA SIOS
+ 0x96EC: 0xBF70, //HANGUL SYLLABLE SSANGPIEUP WA SSANGSIOS
+ 0x96ED: 0xBF71, //HANGUL SYLLABLE SSANGPIEUP WA IEUNG
+ 0x96EE: 0xBF72, //HANGUL SYLLABLE SSANGPIEUP WA CIEUC
+ 0x96EF: 0xBF73, //HANGUL SYLLABLE SSANGPIEUP WA CHIEUCH
+ 0x96F0: 0xBF74, //HANGUL SYLLABLE SSANGPIEUP WA KHIEUKH
+ 0x96F1: 0xBF75, //HANGUL SYLLABLE SSANGPIEUP WA THIEUTH
+ 0x96F2: 0xBF76, //HANGUL SYLLABLE SSANGPIEUP WA PHIEUPH
+ 0x96F3: 0xBF77, //HANGUL SYLLABLE SSANGPIEUP WA HIEUH
+ 0x96F4: 0xBF78, //HANGUL SYLLABLE SSANGPIEUP WAE
+ 0x96F5: 0xBF79, //HANGUL SYLLABLE SSANGPIEUP WAE KIYEOK
+ 0x96F6: 0xBF7A, //HANGUL SYLLABLE SSANGPIEUP WAE SSANGKIYEOK
+ 0x96F7: 0xBF7B, //HANGUL SYLLABLE SSANGPIEUP WAE KIYEOKSIOS
+ 0x96F8: 0xBF7C, //HANGUL SYLLABLE SSANGPIEUP WAE NIEUN
+ 0x96F9: 0xBF7D, //HANGUL SYLLABLE SSANGPIEUP WAE NIEUNCIEUC
+ 0x96FA: 0xBF7E, //HANGUL SYLLABLE SSANGPIEUP WAE NIEUNHIEUH
+ 0x96FB: 0xBF7F, //HANGUL SYLLABLE SSANGPIEUP WAE TIKEUT
+ 0x96FC: 0xBF80, //HANGUL SYLLABLE SSANGPIEUP WAE RIEUL
+ 0x96FD: 0xBF81, //HANGUL SYLLABLE SSANGPIEUP WAE RIEULKIYEOK
+ 0x96FE: 0xBF82, //HANGUL SYLLABLE SSANGPIEUP WAE RIEULMIEUM
+ 0x9741: 0xBF83, //HANGUL SYLLABLE SSANGPIEUP WAE RIEULPIEUP
+ 0x9742: 0xBF84, //HANGUL SYLLABLE SSANGPIEUP WAE RIEULSIOS
+ 0x9743: 0xBF85, //HANGUL SYLLABLE SSANGPIEUP WAE RIEULTHIEUTH
+ 0x9744: 0xBF86, //HANGUL SYLLABLE SSANGPIEUP WAE RIEULPHIEUPH
+ 0x9745: 0xBF87, //HANGUL SYLLABLE SSANGPIEUP WAE RIEULHIEUH
+ 0x9746: 0xBF88, //HANGUL SYLLABLE SSANGPIEUP WAE MIEUM
+ 0x9747: 0xBF89, //HANGUL SYLLABLE SSANGPIEUP WAE PIEUP
+ 0x9748: 0xBF8A, //HANGUL SYLLABLE SSANGPIEUP WAE PIEUPSIOS
+ 0x9749: 0xBF8B, //HANGUL SYLLABLE SSANGPIEUP WAE SIOS
+ 0x974A: 0xBF8C, //HANGUL SYLLABLE SSANGPIEUP WAE SSANGSIOS
+ 0x974B: 0xBF8D, //HANGUL SYLLABLE SSANGPIEUP WAE IEUNG
+ 0x974C: 0xBF8E, //HANGUL SYLLABLE SSANGPIEUP WAE CIEUC
+ 0x974D: 0xBF8F, //HANGUL SYLLABLE SSANGPIEUP WAE CHIEUCH
+ 0x974E: 0xBF90, //HANGUL SYLLABLE SSANGPIEUP WAE KHIEUKH
+ 0x974F: 0xBF91, //HANGUL SYLLABLE SSANGPIEUP WAE THIEUTH
+ 0x9750: 0xBF92, //HANGUL SYLLABLE SSANGPIEUP WAE PHIEUPH
+ 0x9751: 0xBF93, //HANGUL SYLLABLE SSANGPIEUP WAE HIEUH
+ 0x9752: 0xBF95, //HANGUL SYLLABLE SSANGPIEUP OE KIYEOK
+ 0x9753: 0xBF96, //HANGUL SYLLABLE SSANGPIEUP OE SSANGKIYEOK
+ 0x9754: 0xBF97, //HANGUL SYLLABLE SSANGPIEUP OE KIYEOKSIOS
+ 0x9755: 0xBF98, //HANGUL SYLLABLE SSANGPIEUP OE NIEUN
+ 0x9756: 0xBF99, //HANGUL SYLLABLE SSANGPIEUP OE NIEUNCIEUC
+ 0x9757: 0xBF9A, //HANGUL SYLLABLE SSANGPIEUP OE NIEUNHIEUH
+ 0x9758: 0xBF9B, //HANGUL SYLLABLE SSANGPIEUP OE TIKEUT
+ 0x9759: 0xBF9C, //HANGUL SYLLABLE SSANGPIEUP OE RIEUL
+ 0x975A: 0xBF9D, //HANGUL SYLLABLE SSANGPIEUP OE RIEULKIYEOK
+ 0x9761: 0xBF9E, //HANGUL SYLLABLE SSANGPIEUP OE RIEULMIEUM
+ 0x9762: 0xBF9F, //HANGUL SYLLABLE SSANGPIEUP OE RIEULPIEUP
+ 0x9763: 0xBFA0, //HANGUL SYLLABLE SSANGPIEUP OE RIEULSIOS
+ 0x9764: 0xBFA1, //HANGUL SYLLABLE SSANGPIEUP OE RIEULTHIEUTH
+ 0x9765: 0xBFA2, //HANGUL SYLLABLE SSANGPIEUP OE RIEULPHIEUPH
+ 0x9766: 0xBFA3, //HANGUL SYLLABLE SSANGPIEUP OE RIEULHIEUH
+ 0x9767: 0xBFA4, //HANGUL SYLLABLE SSANGPIEUP OE MIEUM
+ 0x9768: 0xBFA5, //HANGUL SYLLABLE SSANGPIEUP OE PIEUP
+ 0x9769: 0xBFA6, //HANGUL SYLLABLE SSANGPIEUP OE PIEUPSIOS
+ 0x976A: 0xBFA7, //HANGUL SYLLABLE SSANGPIEUP OE SIOS
+ 0x976B: 0xBFA8, //HANGUL SYLLABLE SSANGPIEUP OE SSANGSIOS
+ 0x976C: 0xBFA9, //HANGUL SYLLABLE SSANGPIEUP OE IEUNG
+ 0x976D: 0xBFAA, //HANGUL SYLLABLE SSANGPIEUP OE CIEUC
+ 0x976E: 0xBFAB, //HANGUL SYLLABLE SSANGPIEUP OE CHIEUCH
+ 0x976F: 0xBFAC, //HANGUL SYLLABLE SSANGPIEUP OE KHIEUKH
+ 0x9770: 0xBFAD, //HANGUL SYLLABLE SSANGPIEUP OE THIEUTH
+ 0x9771: 0xBFAE, //HANGUL SYLLABLE SSANGPIEUP OE PHIEUPH
+ 0x9772: 0xBFAF, //HANGUL SYLLABLE SSANGPIEUP OE HIEUH
+ 0x9773: 0xBFB1, //HANGUL SYLLABLE SSANGPIEUP YO KIYEOK
+ 0x9774: 0xBFB2, //HANGUL SYLLABLE SSANGPIEUP YO SSANGKIYEOK
+ 0x9775: 0xBFB3, //HANGUL SYLLABLE SSANGPIEUP YO KIYEOKSIOS
+ 0x9776: 0xBFB4, //HANGUL SYLLABLE SSANGPIEUP YO NIEUN
+ 0x9777: 0xBFB5, //HANGUL SYLLABLE SSANGPIEUP YO NIEUNCIEUC
+ 0x9778: 0xBFB6, //HANGUL SYLLABLE SSANGPIEUP YO NIEUNHIEUH
+ 0x9779: 0xBFB7, //HANGUL SYLLABLE SSANGPIEUP YO TIKEUT
+ 0x977A: 0xBFB8, //HANGUL SYLLABLE SSANGPIEUP YO RIEUL
+ 0x9781: 0xBFB9, //HANGUL SYLLABLE SSANGPIEUP YO RIEULKIYEOK
+ 0x9782: 0xBFBA, //HANGUL SYLLABLE SSANGPIEUP YO RIEULMIEUM
+ 0x9783: 0xBFBB, //HANGUL SYLLABLE SSANGPIEUP YO RIEULPIEUP
+ 0x9784: 0xBFBC, //HANGUL SYLLABLE SSANGPIEUP YO RIEULSIOS
+ 0x9785: 0xBFBD, //HANGUL SYLLABLE SSANGPIEUP YO RIEULTHIEUTH
+ 0x9786: 0xBFBE, //HANGUL SYLLABLE SSANGPIEUP YO RIEULPHIEUPH
+ 0x9787: 0xBFBF, //HANGUL SYLLABLE SSANGPIEUP YO RIEULHIEUH
+ 0x9788: 0xBFC0, //HANGUL SYLLABLE SSANGPIEUP YO MIEUM
+ 0x9789: 0xBFC1, //HANGUL SYLLABLE SSANGPIEUP YO PIEUP
+ 0x978A: 0xBFC2, //HANGUL SYLLABLE SSANGPIEUP YO PIEUPSIOS
+ 0x978B: 0xBFC3, //HANGUL SYLLABLE SSANGPIEUP YO SIOS
+ 0x978C: 0xBFC4, //HANGUL SYLLABLE SSANGPIEUP YO SSANGSIOS
+ 0x978D: 0xBFC6, //HANGUL SYLLABLE SSANGPIEUP YO CIEUC
+ 0x978E: 0xBFC7, //HANGUL SYLLABLE SSANGPIEUP YO CHIEUCH
+ 0x978F: 0xBFC8, //HANGUL SYLLABLE SSANGPIEUP YO KHIEUKH
+ 0x9790: 0xBFC9, //HANGUL SYLLABLE SSANGPIEUP YO THIEUTH
+ 0x9791: 0xBFCA, //HANGUL SYLLABLE SSANGPIEUP YO PHIEUPH
+ 0x9792: 0xBFCB, //HANGUL SYLLABLE SSANGPIEUP YO HIEUH
+ 0x9793: 0xBFCE, //HANGUL SYLLABLE SSANGPIEUP U SSANGKIYEOK
+ 0x9794: 0xBFCF, //HANGUL SYLLABLE SSANGPIEUP U KIYEOKSIOS
+ 0x9795: 0xBFD1, //HANGUL SYLLABLE SSANGPIEUP U NIEUNCIEUC
+ 0x9796: 0xBFD2, //HANGUL SYLLABLE SSANGPIEUP U NIEUNHIEUH
+ 0x9797: 0xBFD3, //HANGUL SYLLABLE SSANGPIEUP U TIKEUT
+ 0x9798: 0xBFD5, //HANGUL SYLLABLE SSANGPIEUP U RIEULKIYEOK
+ 0x9799: 0xBFD6, //HANGUL SYLLABLE SSANGPIEUP U RIEULMIEUM
+ 0x979A: 0xBFD7, //HANGUL SYLLABLE SSANGPIEUP U RIEULPIEUP
+ 0x979B: 0xBFD8, //HANGUL SYLLABLE SSANGPIEUP U RIEULSIOS
+ 0x979C: 0xBFD9, //HANGUL SYLLABLE SSANGPIEUP U RIEULTHIEUTH
+ 0x979D: 0xBFDA, //HANGUL SYLLABLE SSANGPIEUP U RIEULPHIEUPH
+ 0x979E: 0xBFDB, //HANGUL SYLLABLE SSANGPIEUP U RIEULHIEUH
+ 0x979F: 0xBFDD, //HANGUL SYLLABLE SSANGPIEUP U PIEUP
+ 0x97A0: 0xBFDE, //HANGUL SYLLABLE SSANGPIEUP U PIEUPSIOS
+ 0x97A1: 0xBFE0, //HANGUL SYLLABLE SSANGPIEUP U SSANGSIOS
+ 0x97A2: 0xBFE2, //HANGUL SYLLABLE SSANGPIEUP U CIEUC
+ 0x97A3: 0xBFE3, //HANGUL SYLLABLE SSANGPIEUP U CHIEUCH
+ 0x97A4: 0xBFE4, //HANGUL SYLLABLE SSANGPIEUP U KHIEUKH
+ 0x97A5: 0xBFE5, //HANGUL SYLLABLE SSANGPIEUP U THIEUTH
+ 0x97A6: 0xBFE6, //HANGUL SYLLABLE SSANGPIEUP U PHIEUPH
+ 0x97A7: 0xBFE7, //HANGUL SYLLABLE SSANGPIEUP U HIEUH
+ 0x97A8: 0xBFE8, //HANGUL SYLLABLE SSANGPIEUP WEO
+ 0x97A9: 0xBFE9, //HANGUL SYLLABLE SSANGPIEUP WEO KIYEOK
+ 0x97AA: 0xBFEA, //HANGUL SYLLABLE SSANGPIEUP WEO SSANGKIYEOK
+ 0x97AB: 0xBFEB, //HANGUL SYLLABLE SSANGPIEUP WEO KIYEOKSIOS
+ 0x97AC: 0xBFEC, //HANGUL SYLLABLE SSANGPIEUP WEO NIEUN
+ 0x97AD: 0xBFED, //HANGUL SYLLABLE SSANGPIEUP WEO NIEUNCIEUC
+ 0x97AE: 0xBFEE, //HANGUL SYLLABLE SSANGPIEUP WEO NIEUNHIEUH
+ 0x97AF: 0xBFEF, //HANGUL SYLLABLE SSANGPIEUP WEO TIKEUT
+ 0x97B0: 0xBFF0, //HANGUL SYLLABLE SSANGPIEUP WEO RIEUL
+ 0x97B1: 0xBFF1, //HANGUL SYLLABLE SSANGPIEUP WEO RIEULKIYEOK
+ 0x97B2: 0xBFF2, //HANGUL SYLLABLE SSANGPIEUP WEO RIEULMIEUM
+ 0x97B3: 0xBFF3, //HANGUL SYLLABLE SSANGPIEUP WEO RIEULPIEUP
+ 0x97B4: 0xBFF4, //HANGUL SYLLABLE SSANGPIEUP WEO RIEULSIOS
+ 0x97B5: 0xBFF5, //HANGUL SYLLABLE SSANGPIEUP WEO RIEULTHIEUTH
+ 0x97B6: 0xBFF6, //HANGUL SYLLABLE SSANGPIEUP WEO RIEULPHIEUPH
+ 0x97B7: 0xBFF7, //HANGUL SYLLABLE SSANGPIEUP WEO RIEULHIEUH
+ 0x97B8: 0xBFF8, //HANGUL SYLLABLE SSANGPIEUP WEO MIEUM
+ 0x97B9: 0xBFF9, //HANGUL SYLLABLE SSANGPIEUP WEO PIEUP
+ 0x97BA: 0xBFFA, //HANGUL SYLLABLE SSANGPIEUP WEO PIEUPSIOS
+ 0x97BB: 0xBFFB, //HANGUL SYLLABLE SSANGPIEUP WEO SIOS
+ 0x97BC: 0xBFFC, //HANGUL SYLLABLE SSANGPIEUP WEO SSANGSIOS
+ 0x97BD: 0xBFFD, //HANGUL SYLLABLE SSANGPIEUP WEO IEUNG
+ 0x97BE: 0xBFFE, //HANGUL SYLLABLE SSANGPIEUP WEO CIEUC
+ 0x97BF: 0xBFFF, //HANGUL SYLLABLE SSANGPIEUP WEO CHIEUCH
+ 0x97C0: 0xC000, //HANGUL SYLLABLE SSANGPIEUP WEO KHIEUKH
+ 0x97C1: 0xC001, //HANGUL SYLLABLE SSANGPIEUP WEO THIEUTH
+ 0x97C2: 0xC002, //HANGUL SYLLABLE SSANGPIEUP WEO PHIEUPH
+ 0x97C3: 0xC003, //HANGUL SYLLABLE SSANGPIEUP WEO HIEUH
+ 0x97C4: 0xC004, //HANGUL SYLLABLE SSANGPIEUP WE
+ 0x97C5: 0xC005, //HANGUL SYLLABLE SSANGPIEUP WE KIYEOK
+ 0x97C6: 0xC006, //HANGUL SYLLABLE SSANGPIEUP WE SSANGKIYEOK
+ 0x97C7: 0xC007, //HANGUL SYLLABLE SSANGPIEUP WE KIYEOKSIOS
+ 0x97C8: 0xC008, //HANGUL SYLLABLE SSANGPIEUP WE NIEUN
+ 0x97C9: 0xC009, //HANGUL SYLLABLE SSANGPIEUP WE NIEUNCIEUC
+ 0x97CA: 0xC00A, //HANGUL SYLLABLE SSANGPIEUP WE NIEUNHIEUH
+ 0x97CB: 0xC00B, //HANGUL SYLLABLE SSANGPIEUP WE TIKEUT
+ 0x97CC: 0xC00C, //HANGUL SYLLABLE SSANGPIEUP WE RIEUL
+ 0x97CD: 0xC00D, //HANGUL SYLLABLE SSANGPIEUP WE RIEULKIYEOK
+ 0x97CE: 0xC00E, //HANGUL SYLLABLE SSANGPIEUP WE RIEULMIEUM
+ 0x97CF: 0xC00F, //HANGUL SYLLABLE SSANGPIEUP WE RIEULPIEUP
+ 0x97D0: 0xC010, //HANGUL SYLLABLE SSANGPIEUP WE RIEULSIOS
+ 0x97D1: 0xC011, //HANGUL SYLLABLE SSANGPIEUP WE RIEULTHIEUTH
+ 0x97D2: 0xC012, //HANGUL SYLLABLE SSANGPIEUP WE RIEULPHIEUPH
+ 0x97D3: 0xC013, //HANGUL SYLLABLE SSANGPIEUP WE RIEULHIEUH
+ 0x97D4: 0xC014, //HANGUL SYLLABLE SSANGPIEUP WE MIEUM
+ 0x97D5: 0xC015, //HANGUL SYLLABLE SSANGPIEUP WE PIEUP
+ 0x97D6: 0xC016, //HANGUL SYLLABLE SSANGPIEUP WE PIEUPSIOS
+ 0x97D7: 0xC017, //HANGUL SYLLABLE SSANGPIEUP WE SIOS
+ 0x97D8: 0xC018, //HANGUL SYLLABLE SSANGPIEUP WE SSANGSIOS
+ 0x97D9: 0xC019, //HANGUL SYLLABLE SSANGPIEUP WE IEUNG
+ 0x97DA: 0xC01A, //HANGUL SYLLABLE SSANGPIEUP WE CIEUC
+ 0x97DB: 0xC01B, //HANGUL SYLLABLE SSANGPIEUP WE CHIEUCH
+ 0x97DC: 0xC01C, //HANGUL SYLLABLE SSANGPIEUP WE KHIEUKH
+ 0x97DD: 0xC01D, //HANGUL SYLLABLE SSANGPIEUP WE THIEUTH
+ 0x97DE: 0xC01E, //HANGUL SYLLABLE SSANGPIEUP WE PHIEUPH
+ 0x97DF: 0xC01F, //HANGUL SYLLABLE SSANGPIEUP WE HIEUH
+ 0x97E0: 0xC020, //HANGUL SYLLABLE SSANGPIEUP WI
+ 0x97E1: 0xC021, //HANGUL SYLLABLE SSANGPIEUP WI KIYEOK
+ 0x97E2: 0xC022, //HANGUL SYLLABLE SSANGPIEUP WI SSANGKIYEOK
+ 0x97E3: 0xC023, //HANGUL SYLLABLE SSANGPIEUP WI KIYEOKSIOS
+ 0x97E4: 0xC024, //HANGUL SYLLABLE SSANGPIEUP WI NIEUN
+ 0x97E5: 0xC025, //HANGUL SYLLABLE SSANGPIEUP WI NIEUNCIEUC
+ 0x97E6: 0xC026, //HANGUL SYLLABLE SSANGPIEUP WI NIEUNHIEUH
+ 0x97E7: 0xC027, //HANGUL SYLLABLE SSANGPIEUP WI TIKEUT
+ 0x97E8: 0xC028, //HANGUL SYLLABLE SSANGPIEUP WI RIEUL
+ 0x97E9: 0xC029, //HANGUL SYLLABLE SSANGPIEUP WI RIEULKIYEOK
+ 0x97EA: 0xC02A, //HANGUL SYLLABLE SSANGPIEUP WI RIEULMIEUM
+ 0x97EB: 0xC02B, //HANGUL SYLLABLE SSANGPIEUP WI RIEULPIEUP
+ 0x97EC: 0xC02C, //HANGUL SYLLABLE SSANGPIEUP WI RIEULSIOS
+ 0x97ED: 0xC02D, //HANGUL SYLLABLE SSANGPIEUP WI RIEULTHIEUTH
+ 0x97EE: 0xC02E, //HANGUL SYLLABLE SSANGPIEUP WI RIEULPHIEUPH
+ 0x97EF: 0xC02F, //HANGUL SYLLABLE SSANGPIEUP WI RIEULHIEUH
+ 0x97F0: 0xC030, //HANGUL SYLLABLE SSANGPIEUP WI MIEUM
+ 0x97F1: 0xC031, //HANGUL SYLLABLE SSANGPIEUP WI PIEUP
+ 0x97F2: 0xC032, //HANGUL SYLLABLE SSANGPIEUP WI PIEUPSIOS
+ 0x97F3: 0xC033, //HANGUL SYLLABLE SSANGPIEUP WI SIOS
+ 0x97F4: 0xC034, //HANGUL SYLLABLE SSANGPIEUP WI SSANGSIOS
+ 0x97F5: 0xC035, //HANGUL SYLLABLE SSANGPIEUP WI IEUNG
+ 0x97F6: 0xC036, //HANGUL SYLLABLE SSANGPIEUP WI CIEUC
+ 0x97F7: 0xC037, //HANGUL SYLLABLE SSANGPIEUP WI CHIEUCH
+ 0x97F8: 0xC038, //HANGUL SYLLABLE SSANGPIEUP WI KHIEUKH
+ 0x97F9: 0xC039, //HANGUL SYLLABLE SSANGPIEUP WI THIEUTH
+ 0x97FA: 0xC03A, //HANGUL SYLLABLE SSANGPIEUP WI PHIEUPH
+ 0x97FB: 0xC03B, //HANGUL SYLLABLE SSANGPIEUP WI HIEUH
+ 0x97FC: 0xC03D, //HANGUL SYLLABLE SSANGPIEUP YU KIYEOK
+ 0x97FD: 0xC03E, //HANGUL SYLLABLE SSANGPIEUP YU SSANGKIYEOK
+ 0x97FE: 0xC03F, //HANGUL SYLLABLE SSANGPIEUP YU KIYEOKSIOS
+ 0x9841: 0xC040, //HANGUL SYLLABLE SSANGPIEUP YU NIEUN
+ 0x9842: 0xC041, //HANGUL SYLLABLE SSANGPIEUP YU NIEUNCIEUC
+ 0x9843: 0xC042, //HANGUL SYLLABLE SSANGPIEUP YU NIEUNHIEUH
+ 0x9844: 0xC043, //HANGUL SYLLABLE SSANGPIEUP YU TIKEUT
+ 0x9845: 0xC044, //HANGUL SYLLABLE SSANGPIEUP YU RIEUL
+ 0x9846: 0xC045, //HANGUL SYLLABLE SSANGPIEUP YU RIEULKIYEOK
+ 0x9847: 0xC046, //HANGUL SYLLABLE SSANGPIEUP YU RIEULMIEUM
+ 0x9848: 0xC047, //HANGUL SYLLABLE SSANGPIEUP YU RIEULPIEUP
+ 0x9849: 0xC048, //HANGUL SYLLABLE SSANGPIEUP YU RIEULSIOS
+ 0x984A: 0xC049, //HANGUL SYLLABLE SSANGPIEUP YU RIEULTHIEUTH
+ 0x984B: 0xC04A, //HANGUL SYLLABLE SSANGPIEUP YU RIEULPHIEUPH
+ 0x984C: 0xC04B, //HANGUL SYLLABLE SSANGPIEUP YU RIEULHIEUH
+ 0x984D: 0xC04C, //HANGUL SYLLABLE SSANGPIEUP YU MIEUM
+ 0x984E: 0xC04D, //HANGUL SYLLABLE SSANGPIEUP YU PIEUP
+ 0x984F: 0xC04E, //HANGUL SYLLABLE SSANGPIEUP YU PIEUPSIOS
+ 0x9850: 0xC04F, //HANGUL SYLLABLE SSANGPIEUP YU SIOS
+ 0x9851: 0xC050, //HANGUL SYLLABLE SSANGPIEUP YU SSANGSIOS
+ 0x9852: 0xC052, //HANGUL SYLLABLE SSANGPIEUP YU CIEUC
+ 0x9853: 0xC053, //HANGUL SYLLABLE SSANGPIEUP YU CHIEUCH
+ 0x9854: 0xC054, //HANGUL SYLLABLE SSANGPIEUP YU KHIEUKH
+ 0x9855: 0xC055, //HANGUL SYLLABLE SSANGPIEUP YU THIEUTH
+ 0x9856: 0xC056, //HANGUL SYLLABLE SSANGPIEUP YU PHIEUPH
+ 0x9857: 0xC057, //HANGUL SYLLABLE SSANGPIEUP YU HIEUH
+ 0x9858: 0xC059, //HANGUL SYLLABLE SSANGPIEUP EU KIYEOK
+ 0x9859: 0xC05A, //HANGUL SYLLABLE SSANGPIEUP EU SSANGKIYEOK
+ 0x985A: 0xC05B, //HANGUL SYLLABLE SSANGPIEUP EU KIYEOKSIOS
+ 0x9861: 0xC05D, //HANGUL SYLLABLE SSANGPIEUP EU NIEUNCIEUC
+ 0x9862: 0xC05E, //HANGUL SYLLABLE SSANGPIEUP EU NIEUNHIEUH
+ 0x9863: 0xC05F, //HANGUL SYLLABLE SSANGPIEUP EU TIKEUT
+ 0x9864: 0xC061, //HANGUL SYLLABLE SSANGPIEUP EU RIEULKIYEOK
+ 0x9865: 0xC062, //HANGUL SYLLABLE SSANGPIEUP EU RIEULMIEUM
+ 0x9866: 0xC063, //HANGUL SYLLABLE SSANGPIEUP EU RIEULPIEUP
+ 0x9867: 0xC064, //HANGUL SYLLABLE SSANGPIEUP EU RIEULSIOS
+ 0x9868: 0xC065, //HANGUL SYLLABLE SSANGPIEUP EU RIEULTHIEUTH
+ 0x9869: 0xC066, //HANGUL SYLLABLE SSANGPIEUP EU RIEULPHIEUPH
+ 0x986A: 0xC067, //HANGUL SYLLABLE SSANGPIEUP EU RIEULHIEUH
+ 0x986B: 0xC06A, //HANGUL SYLLABLE SSANGPIEUP EU PIEUPSIOS
+ 0x986C: 0xC06B, //HANGUL SYLLABLE SSANGPIEUP EU SIOS
+ 0x986D: 0xC06C, //HANGUL SYLLABLE SSANGPIEUP EU SSANGSIOS
+ 0x986E: 0xC06D, //HANGUL SYLLABLE SSANGPIEUP EU IEUNG
+ 0x986F: 0xC06E, //HANGUL SYLLABLE SSANGPIEUP EU CIEUC
+ 0x9870: 0xC06F, //HANGUL SYLLABLE SSANGPIEUP EU CHIEUCH
+ 0x9871: 0xC070, //HANGUL SYLLABLE SSANGPIEUP EU KHIEUKH
+ 0x9872: 0xC071, //HANGUL SYLLABLE SSANGPIEUP EU THIEUTH
+ 0x9873: 0xC072, //HANGUL SYLLABLE SSANGPIEUP EU PHIEUPH
+ 0x9874: 0xC073, //HANGUL SYLLABLE SSANGPIEUP EU HIEUH
+ 0x9875: 0xC074, //HANGUL SYLLABLE SSANGPIEUP YI
+ 0x9876: 0xC075, //HANGUL SYLLABLE SSANGPIEUP YI KIYEOK
+ 0x9877: 0xC076, //HANGUL SYLLABLE SSANGPIEUP YI SSANGKIYEOK
+ 0x9878: 0xC077, //HANGUL SYLLABLE SSANGPIEUP YI KIYEOKSIOS
+ 0x9879: 0xC078, //HANGUL SYLLABLE SSANGPIEUP YI NIEUN
+ 0x987A: 0xC079, //HANGUL SYLLABLE SSANGPIEUP YI NIEUNCIEUC
+ 0x9881: 0xC07A, //HANGUL SYLLABLE SSANGPIEUP YI NIEUNHIEUH
+ 0x9882: 0xC07B, //HANGUL SYLLABLE SSANGPIEUP YI TIKEUT
+ 0x9883: 0xC07C, //HANGUL SYLLABLE SSANGPIEUP YI RIEUL
+ 0x9884: 0xC07D, //HANGUL SYLLABLE SSANGPIEUP YI RIEULKIYEOK
+ 0x9885: 0xC07E, //HANGUL SYLLABLE SSANGPIEUP YI RIEULMIEUM
+ 0x9886: 0xC07F, //HANGUL SYLLABLE SSANGPIEUP YI RIEULPIEUP
+ 0x9887: 0xC080, //HANGUL SYLLABLE SSANGPIEUP YI RIEULSIOS
+ 0x9888: 0xC081, //HANGUL SYLLABLE SSANGPIEUP YI RIEULTHIEUTH
+ 0x9889: 0xC082, //HANGUL SYLLABLE SSANGPIEUP YI RIEULPHIEUPH
+ 0x988A: 0xC083, //HANGUL SYLLABLE SSANGPIEUP YI RIEULHIEUH
+ 0x988B: 0xC084, //HANGUL SYLLABLE SSANGPIEUP YI MIEUM
+ 0x988C: 0xC085, //HANGUL SYLLABLE SSANGPIEUP YI PIEUP
+ 0x988D: 0xC086, //HANGUL SYLLABLE SSANGPIEUP YI PIEUPSIOS
+ 0x988E: 0xC087, //HANGUL SYLLABLE SSANGPIEUP YI SIOS
+ 0x988F: 0xC088, //HANGUL SYLLABLE SSANGPIEUP YI SSANGSIOS
+ 0x9890: 0xC089, //HANGUL SYLLABLE SSANGPIEUP YI IEUNG
+ 0x9891: 0xC08A, //HANGUL SYLLABLE SSANGPIEUP YI CIEUC
+ 0x9892: 0xC08B, //HANGUL SYLLABLE SSANGPIEUP YI CHIEUCH
+ 0x9893: 0xC08C, //HANGUL SYLLABLE SSANGPIEUP YI KHIEUKH
+ 0x9894: 0xC08D, //HANGUL SYLLABLE SSANGPIEUP YI THIEUTH
+ 0x9895: 0xC08E, //HANGUL SYLLABLE SSANGPIEUP YI PHIEUPH
+ 0x9896: 0xC08F, //HANGUL SYLLABLE SSANGPIEUP YI HIEUH
+ 0x9897: 0xC092, //HANGUL SYLLABLE SSANGPIEUP I SSANGKIYEOK
+ 0x9898: 0xC093, //HANGUL SYLLABLE SSANGPIEUP I KIYEOKSIOS
+ 0x9899: 0xC095, //HANGUL SYLLABLE SSANGPIEUP I NIEUNCIEUC
+ 0x989A: 0xC096, //HANGUL SYLLABLE SSANGPIEUP I NIEUNHIEUH
+ 0x989B: 0xC097, //HANGUL SYLLABLE SSANGPIEUP I TIKEUT
+ 0x989C: 0xC099, //HANGUL SYLLABLE SSANGPIEUP I RIEULKIYEOK
+ 0x989D: 0xC09A, //HANGUL SYLLABLE SSANGPIEUP I RIEULMIEUM
+ 0x989E: 0xC09B, //HANGUL SYLLABLE SSANGPIEUP I RIEULPIEUP
+ 0x989F: 0xC09C, //HANGUL SYLLABLE SSANGPIEUP I RIEULSIOS
+ 0x98A0: 0xC09D, //HANGUL SYLLABLE SSANGPIEUP I RIEULTHIEUTH
+ 0x98A1: 0xC09E, //HANGUL SYLLABLE SSANGPIEUP I RIEULPHIEUPH
+ 0x98A2: 0xC09F, //HANGUL SYLLABLE SSANGPIEUP I RIEULHIEUH
+ 0x98A3: 0xC0A2, //HANGUL SYLLABLE SSANGPIEUP I PIEUPSIOS
+ 0x98A4: 0xC0A4, //HANGUL SYLLABLE SSANGPIEUP I SSANGSIOS
+ 0x98A5: 0xC0A6, //HANGUL SYLLABLE SSANGPIEUP I CIEUC
+ 0x98A6: 0xC0A7, //HANGUL SYLLABLE SSANGPIEUP I CHIEUCH
+ 0x98A7: 0xC0A8, //HANGUL SYLLABLE SSANGPIEUP I KHIEUKH
+ 0x98A8: 0xC0A9, //HANGUL SYLLABLE SSANGPIEUP I THIEUTH
+ 0x98A9: 0xC0AA, //HANGUL SYLLABLE SSANGPIEUP I PHIEUPH
+ 0x98AA: 0xC0AB, //HANGUL SYLLABLE SSANGPIEUP I HIEUH
+ 0x98AB: 0xC0AE, //HANGUL SYLLABLE SIOS A SSANGKIYEOK
+ 0x98AC: 0xC0B1, //HANGUL SYLLABLE SIOS A NIEUNCIEUC
+ 0x98AD: 0xC0B2, //HANGUL SYLLABLE SIOS A NIEUNHIEUH
+ 0x98AE: 0xC0B7, //HANGUL SYLLABLE SIOS A RIEULPIEUP
+ 0x98AF: 0xC0B8, //HANGUL SYLLABLE SIOS A RIEULSIOS
+ 0x98B0: 0xC0B9, //HANGUL SYLLABLE SIOS A RIEULTHIEUTH
+ 0x98B1: 0xC0BA, //HANGUL SYLLABLE SIOS A RIEULPHIEUPH
+ 0x98B2: 0xC0BB, //HANGUL SYLLABLE SIOS A RIEULHIEUH
+ 0x98B3: 0xC0BE, //HANGUL SYLLABLE SIOS A PIEUPSIOS
+ 0x98B4: 0xC0C2, //HANGUL SYLLABLE SIOS A CIEUC
+ 0x98B5: 0xC0C3, //HANGUL SYLLABLE SIOS A CHIEUCH
+ 0x98B6: 0xC0C4, //HANGUL SYLLABLE SIOS A KHIEUKH
+ 0x98B7: 0xC0C6, //HANGUL SYLLABLE SIOS A PHIEUPH
+ 0x98B8: 0xC0C7, //HANGUL SYLLABLE SIOS A HIEUH
+ 0x98B9: 0xC0CA, //HANGUL SYLLABLE SIOS AE SSANGKIYEOK
+ 0x98BA: 0xC0CB, //HANGUL SYLLABLE SIOS AE KIYEOKSIOS
+ 0x98BB: 0xC0CD, //HANGUL SYLLABLE SIOS AE NIEUNCIEUC
+ 0x98BC: 0xC0CE, //HANGUL SYLLABLE SIOS AE NIEUNHIEUH
+ 0x98BD: 0xC0CF, //HANGUL SYLLABLE SIOS AE TIKEUT
+ 0x98BE: 0xC0D1, //HANGUL SYLLABLE SIOS AE RIEULKIYEOK
+ 0x98BF: 0xC0D2, //HANGUL SYLLABLE SIOS AE RIEULMIEUM
+ 0x98C0: 0xC0D3, //HANGUL SYLLABLE SIOS AE RIEULPIEUP
+ 0x98C1: 0xC0D4, //HANGUL SYLLABLE SIOS AE RIEULSIOS
+ 0x98C2: 0xC0D5, //HANGUL SYLLABLE SIOS AE RIEULTHIEUTH
+ 0x98C3: 0xC0D6, //HANGUL SYLLABLE SIOS AE RIEULPHIEUPH
+ 0x98C4: 0xC0D7, //HANGUL SYLLABLE SIOS AE RIEULHIEUH
+ 0x98C5: 0xC0DA, //HANGUL SYLLABLE SIOS AE PIEUPSIOS
+ 0x98C6: 0xC0DE, //HANGUL SYLLABLE SIOS AE CIEUC
+ 0x98C7: 0xC0DF, //HANGUL SYLLABLE SIOS AE CHIEUCH
+ 0x98C8: 0xC0E0, //HANGUL SYLLABLE SIOS AE KHIEUKH
+ 0x98C9: 0xC0E1, //HANGUL SYLLABLE SIOS AE THIEUTH
+ 0x98CA: 0xC0E2, //HANGUL SYLLABLE SIOS AE PHIEUPH
+ 0x98CB: 0xC0E3, //HANGUL SYLLABLE SIOS AE HIEUH
+ 0x98CC: 0xC0E6, //HANGUL SYLLABLE SIOS YA SSANGKIYEOK
+ 0x98CD: 0xC0E7, //HANGUL SYLLABLE SIOS YA KIYEOKSIOS
+ 0x98CE: 0xC0E9, //HANGUL SYLLABLE SIOS YA NIEUNCIEUC
+ 0x98CF: 0xC0EA, //HANGUL SYLLABLE SIOS YA NIEUNHIEUH
+ 0x98D0: 0xC0EB, //HANGUL SYLLABLE SIOS YA TIKEUT
+ 0x98D1: 0xC0ED, //HANGUL SYLLABLE SIOS YA RIEULKIYEOK
+ 0x98D2: 0xC0EE, //HANGUL SYLLABLE SIOS YA RIEULMIEUM
+ 0x98D3: 0xC0EF, //HANGUL SYLLABLE SIOS YA RIEULPIEUP
+ 0x98D4: 0xC0F0, //HANGUL SYLLABLE SIOS YA RIEULSIOS
+ 0x98D5: 0xC0F1, //HANGUL SYLLABLE SIOS YA RIEULTHIEUTH
+ 0x98D6: 0xC0F2, //HANGUL SYLLABLE SIOS YA RIEULPHIEUPH
+ 0x98D7: 0xC0F3, //HANGUL SYLLABLE SIOS YA RIEULHIEUH
+ 0x98D8: 0xC0F6, //HANGUL SYLLABLE SIOS YA PIEUPSIOS
+ 0x98D9: 0xC0F8, //HANGUL SYLLABLE SIOS YA SSANGSIOS
+ 0x98DA: 0xC0FA, //HANGUL SYLLABLE SIOS YA CIEUC
+ 0x98DB: 0xC0FB, //HANGUL SYLLABLE SIOS YA CHIEUCH
+ 0x98DC: 0xC0FC, //HANGUL SYLLABLE SIOS YA KHIEUKH
+ 0x98DD: 0xC0FD, //HANGUL SYLLABLE SIOS YA THIEUTH
+ 0x98DE: 0xC0FE, //HANGUL SYLLABLE SIOS YA PHIEUPH
+ 0x98DF: 0xC0FF, //HANGUL SYLLABLE SIOS YA HIEUH
+ 0x98E0: 0xC101, //HANGUL SYLLABLE SIOS YAE KIYEOK
+ 0x98E1: 0xC102, //HANGUL SYLLABLE SIOS YAE SSANGKIYEOK
+ 0x98E2: 0xC103, //HANGUL SYLLABLE SIOS YAE KIYEOKSIOS
+ 0x98E3: 0xC105, //HANGUL SYLLABLE SIOS YAE NIEUNCIEUC
+ 0x98E4: 0xC106, //HANGUL SYLLABLE SIOS YAE NIEUNHIEUH
+ 0x98E5: 0xC107, //HANGUL SYLLABLE SIOS YAE TIKEUT
+ 0x98E6: 0xC109, //HANGUL SYLLABLE SIOS YAE RIEULKIYEOK
+ 0x98E7: 0xC10A, //HANGUL SYLLABLE SIOS YAE RIEULMIEUM
+ 0x98E8: 0xC10B, //HANGUL SYLLABLE SIOS YAE RIEULPIEUP
+ 0x98E9: 0xC10C, //HANGUL SYLLABLE SIOS YAE RIEULSIOS
+ 0x98EA: 0xC10D, //HANGUL SYLLABLE SIOS YAE RIEULTHIEUTH
+ 0x98EB: 0xC10E, //HANGUL SYLLABLE SIOS YAE RIEULPHIEUPH
+ 0x98EC: 0xC10F, //HANGUL SYLLABLE SIOS YAE RIEULHIEUH
+ 0x98ED: 0xC111, //HANGUL SYLLABLE SIOS YAE PIEUP
+ 0x98EE: 0xC112, //HANGUL SYLLABLE SIOS YAE PIEUPSIOS
+ 0x98EF: 0xC113, //HANGUL SYLLABLE SIOS YAE SIOS
+ 0x98F0: 0xC114, //HANGUL SYLLABLE SIOS YAE SSANGSIOS
+ 0x98F1: 0xC116, //HANGUL SYLLABLE SIOS YAE CIEUC
+ 0x98F2: 0xC117, //HANGUL SYLLABLE SIOS YAE CHIEUCH
+ 0x98F3: 0xC118, //HANGUL SYLLABLE SIOS YAE KHIEUKH
+ 0x98F4: 0xC119, //HANGUL SYLLABLE SIOS YAE THIEUTH
+ 0x98F5: 0xC11A, //HANGUL SYLLABLE SIOS YAE PHIEUPH
+ 0x98F6: 0xC11B, //HANGUL SYLLABLE SIOS YAE HIEUH
+ 0x98F7: 0xC121, //HANGUL SYLLABLE SIOS EO NIEUNCIEUC
+ 0x98F8: 0xC122, //HANGUL SYLLABLE SIOS EO NIEUNHIEUH
+ 0x98F9: 0xC125, //HANGUL SYLLABLE SIOS EO RIEULKIYEOK
+ 0x98FA: 0xC128, //HANGUL SYLLABLE SIOS EO RIEULSIOS
+ 0x98FB: 0xC129, //HANGUL SYLLABLE SIOS EO RIEULTHIEUTH
+ 0x98FC: 0xC12A, //HANGUL SYLLABLE SIOS EO RIEULPHIEUPH
+ 0x98FD: 0xC12B, //HANGUL SYLLABLE SIOS EO RIEULHIEUH
+ 0x98FE: 0xC12E, //HANGUL SYLLABLE SIOS EO PIEUPSIOS
+ 0x9941: 0xC132, //HANGUL SYLLABLE SIOS EO CIEUC
+ 0x9942: 0xC133, //HANGUL SYLLABLE SIOS EO CHIEUCH
+ 0x9943: 0xC134, //HANGUL SYLLABLE SIOS EO KHIEUKH
+ 0x9944: 0xC135, //HANGUL SYLLABLE SIOS EO THIEUTH
+ 0x9945: 0xC137, //HANGUL SYLLABLE SIOS EO HIEUH
+ 0x9946: 0xC13A, //HANGUL SYLLABLE SIOS E SSANGKIYEOK
+ 0x9947: 0xC13B, //HANGUL SYLLABLE SIOS E KIYEOKSIOS
+ 0x9948: 0xC13D, //HANGUL SYLLABLE SIOS E NIEUNCIEUC
+ 0x9949: 0xC13E, //HANGUL SYLLABLE SIOS E NIEUNHIEUH
+ 0x994A: 0xC13F, //HANGUL SYLLABLE SIOS E TIKEUT
+ 0x994B: 0xC141, //HANGUL SYLLABLE SIOS E RIEULKIYEOK
+ 0x994C: 0xC142, //HANGUL SYLLABLE SIOS E RIEULMIEUM
+ 0x994D: 0xC143, //HANGUL SYLLABLE SIOS E RIEULPIEUP
+ 0x994E: 0xC144, //HANGUL SYLLABLE SIOS E RIEULSIOS
+ 0x994F: 0xC145, //HANGUL SYLLABLE SIOS E RIEULTHIEUTH
+ 0x9950: 0xC146, //HANGUL SYLLABLE SIOS E RIEULPHIEUPH
+ 0x9951: 0xC147, //HANGUL SYLLABLE SIOS E RIEULHIEUH
+ 0x9952: 0xC14A, //HANGUL SYLLABLE SIOS E PIEUPSIOS
+ 0x9953: 0xC14E, //HANGUL SYLLABLE SIOS E CIEUC
+ 0x9954: 0xC14F, //HANGUL SYLLABLE SIOS E CHIEUCH
+ 0x9955: 0xC150, //HANGUL SYLLABLE SIOS E KHIEUKH
+ 0x9956: 0xC151, //HANGUL SYLLABLE SIOS E THIEUTH
+ 0x9957: 0xC152, //HANGUL SYLLABLE SIOS E PHIEUPH
+ 0x9958: 0xC153, //HANGUL SYLLABLE SIOS E HIEUH
+ 0x9959: 0xC156, //HANGUL SYLLABLE SIOS YEO SSANGKIYEOK
+ 0x995A: 0xC157, //HANGUL SYLLABLE SIOS YEO KIYEOKSIOS
+ 0x9961: 0xC159, //HANGUL SYLLABLE SIOS YEO NIEUNCIEUC
+ 0x9962: 0xC15A, //HANGUL SYLLABLE SIOS YEO NIEUNHIEUH
+ 0x9963: 0xC15B, //HANGUL SYLLABLE SIOS YEO TIKEUT
+ 0x9964: 0xC15D, //HANGUL SYLLABLE SIOS YEO RIEULKIYEOK
+ 0x9965: 0xC15E, //HANGUL SYLLABLE SIOS YEO RIEULMIEUM
+ 0x9966: 0xC15F, //HANGUL SYLLABLE SIOS YEO RIEULPIEUP
+ 0x9967: 0xC160, //HANGUL SYLLABLE SIOS YEO RIEULSIOS
+ 0x9968: 0xC161, //HANGUL SYLLABLE SIOS YEO RIEULTHIEUTH
+ 0x9969: 0xC162, //HANGUL SYLLABLE SIOS YEO RIEULPHIEUPH
+ 0x996A: 0xC163, //HANGUL SYLLABLE SIOS YEO RIEULHIEUH
+ 0x996B: 0xC166, //HANGUL SYLLABLE SIOS YEO PIEUPSIOS
+ 0x996C: 0xC16A, //HANGUL SYLLABLE SIOS YEO CIEUC
+ 0x996D: 0xC16B, //HANGUL SYLLABLE SIOS YEO CHIEUCH
+ 0x996E: 0xC16C, //HANGUL SYLLABLE SIOS YEO KHIEUKH
+ 0x996F: 0xC16D, //HANGUL SYLLABLE SIOS YEO THIEUTH
+ 0x9970: 0xC16E, //HANGUL SYLLABLE SIOS YEO PHIEUPH
+ 0x9971: 0xC16F, //HANGUL SYLLABLE SIOS YEO HIEUH
+ 0x9972: 0xC171, //HANGUL SYLLABLE SIOS YE KIYEOK
+ 0x9973: 0xC172, //HANGUL SYLLABLE SIOS YE SSANGKIYEOK
+ 0x9974: 0xC173, //HANGUL SYLLABLE SIOS YE KIYEOKSIOS
+ 0x9975: 0xC175, //HANGUL SYLLABLE SIOS YE NIEUNCIEUC
+ 0x9976: 0xC176, //HANGUL SYLLABLE SIOS YE NIEUNHIEUH
+ 0x9977: 0xC177, //HANGUL SYLLABLE SIOS YE TIKEUT
+ 0x9978: 0xC179, //HANGUL SYLLABLE SIOS YE RIEULKIYEOK
+ 0x9979: 0xC17A, //HANGUL SYLLABLE SIOS YE RIEULMIEUM
+ 0x997A: 0xC17B, //HANGUL SYLLABLE SIOS YE RIEULPIEUP
+ 0x9981: 0xC17C, //HANGUL SYLLABLE SIOS YE RIEULSIOS
+ 0x9982: 0xC17D, //HANGUL SYLLABLE SIOS YE RIEULTHIEUTH
+ 0x9983: 0xC17E, //HANGUL SYLLABLE SIOS YE RIEULPHIEUPH
+ 0x9984: 0xC17F, //HANGUL SYLLABLE SIOS YE RIEULHIEUH
+ 0x9985: 0xC180, //HANGUL SYLLABLE SIOS YE MIEUM
+ 0x9986: 0xC181, //HANGUL SYLLABLE SIOS YE PIEUP
+ 0x9987: 0xC182, //HANGUL SYLLABLE SIOS YE PIEUPSIOS
+ 0x9988: 0xC183, //HANGUL SYLLABLE SIOS YE SIOS
+ 0x9989: 0xC184, //HANGUL SYLLABLE SIOS YE SSANGSIOS
+ 0x998A: 0xC186, //HANGUL SYLLABLE SIOS YE CIEUC
+ 0x998B: 0xC187, //HANGUL SYLLABLE SIOS YE CHIEUCH
+ 0x998C: 0xC188, //HANGUL SYLLABLE SIOS YE KHIEUKH
+ 0x998D: 0xC189, //HANGUL SYLLABLE SIOS YE THIEUTH
+ 0x998E: 0xC18A, //HANGUL SYLLABLE SIOS YE PHIEUPH
+ 0x998F: 0xC18B, //HANGUL SYLLABLE SIOS YE HIEUH
+ 0x9990: 0xC18F, //HANGUL SYLLABLE SIOS O KIYEOKSIOS
+ 0x9991: 0xC191, //HANGUL SYLLABLE SIOS O NIEUNCIEUC
+ 0x9992: 0xC192, //HANGUL SYLLABLE SIOS O NIEUNHIEUH
+ 0x9993: 0xC193, //HANGUL SYLLABLE SIOS O TIKEUT
+ 0x9994: 0xC195, //HANGUL SYLLABLE SIOS O RIEULKIYEOK
+ 0x9995: 0xC197, //HANGUL SYLLABLE SIOS O RIEULPIEUP
+ 0x9996: 0xC198, //HANGUL SYLLABLE SIOS O RIEULSIOS
+ 0x9997: 0xC199, //HANGUL SYLLABLE SIOS O RIEULTHIEUTH
+ 0x9998: 0xC19A, //HANGUL SYLLABLE SIOS O RIEULPHIEUPH
+ 0x9999: 0xC19B, //HANGUL SYLLABLE SIOS O RIEULHIEUH
+ 0x999A: 0xC19E, //HANGUL SYLLABLE SIOS O PIEUPSIOS
+ 0x999B: 0xC1A0, //HANGUL SYLLABLE SIOS O SSANGSIOS
+ 0x999C: 0xC1A2, //HANGUL SYLLABLE SIOS O CIEUC
+ 0x999D: 0xC1A3, //HANGUL SYLLABLE SIOS O CHIEUCH
+ 0x999E: 0xC1A4, //HANGUL SYLLABLE SIOS O KHIEUKH
+ 0x999F: 0xC1A6, //HANGUL SYLLABLE SIOS O PHIEUPH
+ 0x99A0: 0xC1A7, //HANGUL SYLLABLE SIOS O HIEUH
+ 0x99A1: 0xC1AA, //HANGUL SYLLABLE SIOS WA SSANGKIYEOK
+ 0x99A2: 0xC1AB, //HANGUL SYLLABLE SIOS WA KIYEOKSIOS
+ 0x99A3: 0xC1AD, //HANGUL SYLLABLE SIOS WA NIEUNCIEUC
+ 0x99A4: 0xC1AE, //HANGUL SYLLABLE SIOS WA NIEUNHIEUH
+ 0x99A5: 0xC1AF, //HANGUL SYLLABLE SIOS WA TIKEUT
+ 0x99A6: 0xC1B1, //HANGUL SYLLABLE SIOS WA RIEULKIYEOK
+ 0x99A7: 0xC1B2, //HANGUL SYLLABLE SIOS WA RIEULMIEUM
+ 0x99A8: 0xC1B3, //HANGUL SYLLABLE SIOS WA RIEULPIEUP
+ 0x99A9: 0xC1B4, //HANGUL SYLLABLE SIOS WA RIEULSIOS
+ 0x99AA: 0xC1B5, //HANGUL SYLLABLE SIOS WA RIEULTHIEUTH
+ 0x99AB: 0xC1B6, //HANGUL SYLLABLE SIOS WA RIEULPHIEUPH
+ 0x99AC: 0xC1B7, //HANGUL SYLLABLE SIOS WA RIEULHIEUH
+ 0x99AD: 0xC1B8, //HANGUL SYLLABLE SIOS WA MIEUM
+ 0x99AE: 0xC1B9, //HANGUL SYLLABLE SIOS WA PIEUP
+ 0x99AF: 0xC1BA, //HANGUL SYLLABLE SIOS WA PIEUPSIOS
+ 0x99B0: 0xC1BB, //HANGUL SYLLABLE SIOS WA SIOS
+ 0x99B1: 0xC1BC, //HANGUL SYLLABLE SIOS WA SSANGSIOS
+ 0x99B2: 0xC1BE, //HANGUL SYLLABLE SIOS WA CIEUC
+ 0x99B3: 0xC1BF, //HANGUL SYLLABLE SIOS WA CHIEUCH
+ 0x99B4: 0xC1C0, //HANGUL SYLLABLE SIOS WA KHIEUKH
+ 0x99B5: 0xC1C1, //HANGUL SYLLABLE SIOS WA THIEUTH
+ 0x99B6: 0xC1C2, //HANGUL SYLLABLE SIOS WA PHIEUPH
+ 0x99B7: 0xC1C3, //HANGUL SYLLABLE SIOS WA HIEUH
+ 0x99B8: 0xC1C5, //HANGUL SYLLABLE SIOS WAE KIYEOK
+ 0x99B9: 0xC1C6, //HANGUL SYLLABLE SIOS WAE SSANGKIYEOK
+ 0x99BA: 0xC1C7, //HANGUL SYLLABLE SIOS WAE KIYEOKSIOS
+ 0x99BB: 0xC1C9, //HANGUL SYLLABLE SIOS WAE NIEUNCIEUC
+ 0x99BC: 0xC1CA, //HANGUL SYLLABLE SIOS WAE NIEUNHIEUH
+ 0x99BD: 0xC1CB, //HANGUL SYLLABLE SIOS WAE TIKEUT
+ 0x99BE: 0xC1CD, //HANGUL SYLLABLE SIOS WAE RIEULKIYEOK
+ 0x99BF: 0xC1CE, //HANGUL SYLLABLE SIOS WAE RIEULMIEUM
+ 0x99C0: 0xC1CF, //HANGUL SYLLABLE SIOS WAE RIEULPIEUP
+ 0x99C1: 0xC1D0, //HANGUL SYLLABLE SIOS WAE RIEULSIOS
+ 0x99C2: 0xC1D1, //HANGUL SYLLABLE SIOS WAE RIEULTHIEUTH
+ 0x99C3: 0xC1D2, //HANGUL SYLLABLE SIOS WAE RIEULPHIEUPH
+ 0x99C4: 0xC1D3, //HANGUL SYLLABLE SIOS WAE RIEULHIEUH
+ 0x99C5: 0xC1D5, //HANGUL SYLLABLE SIOS WAE PIEUP
+ 0x99C6: 0xC1D6, //HANGUL SYLLABLE SIOS WAE PIEUPSIOS
+ 0x99C7: 0xC1D9, //HANGUL SYLLABLE SIOS WAE IEUNG
+ 0x99C8: 0xC1DA, //HANGUL SYLLABLE SIOS WAE CIEUC
+ 0x99C9: 0xC1DB, //HANGUL SYLLABLE SIOS WAE CHIEUCH
+ 0x99CA: 0xC1DC, //HANGUL SYLLABLE SIOS WAE KHIEUKH
+ 0x99CB: 0xC1DD, //HANGUL SYLLABLE SIOS WAE THIEUTH
+ 0x99CC: 0xC1DE, //HANGUL SYLLABLE SIOS WAE PHIEUPH
+ 0x99CD: 0xC1DF, //HANGUL SYLLABLE SIOS WAE HIEUH
+ 0x99CE: 0xC1E1, //HANGUL SYLLABLE SIOS OE KIYEOK
+ 0x99CF: 0xC1E2, //HANGUL SYLLABLE SIOS OE SSANGKIYEOK
+ 0x99D0: 0xC1E3, //HANGUL SYLLABLE SIOS OE KIYEOKSIOS
+ 0x99D1: 0xC1E5, //HANGUL SYLLABLE SIOS OE NIEUNCIEUC
+ 0x99D2: 0xC1E6, //HANGUL SYLLABLE SIOS OE NIEUNHIEUH
+ 0x99D3: 0xC1E7, //HANGUL SYLLABLE SIOS OE TIKEUT
+ 0x99D4: 0xC1E9, //HANGUL SYLLABLE SIOS OE RIEULKIYEOK
+ 0x99D5: 0xC1EA, //HANGUL SYLLABLE SIOS OE RIEULMIEUM
+ 0x99D6: 0xC1EB, //HANGUL SYLLABLE SIOS OE RIEULPIEUP
+ 0x99D7: 0xC1EC, //HANGUL SYLLABLE SIOS OE RIEULSIOS
+ 0x99D8: 0xC1ED, //HANGUL SYLLABLE SIOS OE RIEULTHIEUTH
+ 0x99D9: 0xC1EE, //HANGUL SYLLABLE SIOS OE RIEULPHIEUPH
+ 0x99DA: 0xC1EF, //HANGUL SYLLABLE SIOS OE RIEULHIEUH
+ 0x99DB: 0xC1F2, //HANGUL SYLLABLE SIOS OE PIEUPSIOS
+ 0x99DC: 0xC1F4, //HANGUL SYLLABLE SIOS OE SSANGSIOS
+ 0x99DD: 0xC1F5, //HANGUL SYLLABLE SIOS OE IEUNG
+ 0x99DE: 0xC1F6, //HANGUL SYLLABLE SIOS OE CIEUC
+ 0x99DF: 0xC1F7, //HANGUL SYLLABLE SIOS OE CHIEUCH
+ 0x99E0: 0xC1F8, //HANGUL SYLLABLE SIOS OE KHIEUKH
+ 0x99E1: 0xC1F9, //HANGUL SYLLABLE SIOS OE THIEUTH
+ 0x99E2: 0xC1FA, //HANGUL SYLLABLE SIOS OE PHIEUPH
+ 0x99E3: 0xC1FB, //HANGUL SYLLABLE SIOS OE HIEUH
+ 0x99E4: 0xC1FE, //HANGUL SYLLABLE SIOS YO SSANGKIYEOK
+ 0x99E5: 0xC1FF, //HANGUL SYLLABLE SIOS YO KIYEOKSIOS
+ 0x99E6: 0xC201, //HANGUL SYLLABLE SIOS YO NIEUNCIEUC
+ 0x99E7: 0xC202, //HANGUL SYLLABLE SIOS YO NIEUNHIEUH
+ 0x99E8: 0xC203, //HANGUL SYLLABLE SIOS YO TIKEUT
+ 0x99E9: 0xC205, //HANGUL SYLLABLE SIOS YO RIEULKIYEOK
+ 0x99EA: 0xC206, //HANGUL SYLLABLE SIOS YO RIEULMIEUM
+ 0x99EB: 0xC207, //HANGUL SYLLABLE SIOS YO RIEULPIEUP
+ 0x99EC: 0xC208, //HANGUL SYLLABLE SIOS YO RIEULSIOS
+ 0x99ED: 0xC209, //HANGUL SYLLABLE SIOS YO RIEULTHIEUTH
+ 0x99EE: 0xC20A, //HANGUL SYLLABLE SIOS YO RIEULPHIEUPH
+ 0x99EF: 0xC20B, //HANGUL SYLLABLE SIOS YO RIEULHIEUH
+ 0x99F0: 0xC20E, //HANGUL SYLLABLE SIOS YO PIEUPSIOS
+ 0x99F1: 0xC210, //HANGUL SYLLABLE SIOS YO SSANGSIOS
+ 0x99F2: 0xC212, //HANGUL SYLLABLE SIOS YO CIEUC
+ 0x99F3: 0xC213, //HANGUL SYLLABLE SIOS YO CHIEUCH
+ 0x99F4: 0xC214, //HANGUL SYLLABLE SIOS YO KHIEUKH
+ 0x99F5: 0xC215, //HANGUL SYLLABLE SIOS YO THIEUTH
+ 0x99F6: 0xC216, //HANGUL SYLLABLE SIOS YO PHIEUPH
+ 0x99F7: 0xC217, //HANGUL SYLLABLE SIOS YO HIEUH
+ 0x99F8: 0xC21A, //HANGUL SYLLABLE SIOS U SSANGKIYEOK
+ 0x99F9: 0xC21B, //HANGUL SYLLABLE SIOS U KIYEOKSIOS
+ 0x99FA: 0xC21D, //HANGUL SYLLABLE SIOS U NIEUNCIEUC
+ 0x99FB: 0xC21E, //HANGUL SYLLABLE SIOS U NIEUNHIEUH
+ 0x99FC: 0xC221, //HANGUL SYLLABLE SIOS U RIEULKIYEOK
+ 0x99FD: 0xC222, //HANGUL SYLLABLE SIOS U RIEULMIEUM
+ 0x99FE: 0xC223, //HANGUL SYLLABLE SIOS U RIEULPIEUP
+ 0x9A41: 0xC224, //HANGUL SYLLABLE SIOS U RIEULSIOS
+ 0x9A42: 0xC225, //HANGUL SYLLABLE SIOS U RIEULTHIEUTH
+ 0x9A43: 0xC226, //HANGUL SYLLABLE SIOS U RIEULPHIEUPH
+ 0x9A44: 0xC227, //HANGUL SYLLABLE SIOS U RIEULHIEUH
+ 0x9A45: 0xC22A, //HANGUL SYLLABLE SIOS U PIEUPSIOS
+ 0x9A46: 0xC22C, //HANGUL SYLLABLE SIOS U SSANGSIOS
+ 0x9A47: 0xC22E, //HANGUL SYLLABLE SIOS U CIEUC
+ 0x9A48: 0xC230, //HANGUL SYLLABLE SIOS U KHIEUKH
+ 0x9A49: 0xC233, //HANGUL SYLLABLE SIOS U HIEUH
+ 0x9A4A: 0xC235, //HANGUL SYLLABLE SIOS WEO KIYEOK
+ 0x9A4B: 0xC236, //HANGUL SYLLABLE SIOS WEO SSANGKIYEOK
+ 0x9A4C: 0xC237, //HANGUL SYLLABLE SIOS WEO KIYEOKSIOS
+ 0x9A4D: 0xC238, //HANGUL SYLLABLE SIOS WEO NIEUN
+ 0x9A4E: 0xC239, //HANGUL SYLLABLE SIOS WEO NIEUNCIEUC
+ 0x9A4F: 0xC23A, //HANGUL SYLLABLE SIOS WEO NIEUNHIEUH
+ 0x9A50: 0xC23B, //HANGUL SYLLABLE SIOS WEO TIKEUT
+ 0x9A51: 0xC23C, //HANGUL SYLLABLE SIOS WEO RIEUL
+ 0x9A52: 0xC23D, //HANGUL SYLLABLE SIOS WEO RIEULKIYEOK
+ 0x9A53: 0xC23E, //HANGUL SYLLABLE SIOS WEO RIEULMIEUM
+ 0x9A54: 0xC23F, //HANGUL SYLLABLE SIOS WEO RIEULPIEUP
+ 0x9A55: 0xC240, //HANGUL SYLLABLE SIOS WEO RIEULSIOS
+ 0x9A56: 0xC241, //HANGUL SYLLABLE SIOS WEO RIEULTHIEUTH
+ 0x9A57: 0xC242, //HANGUL SYLLABLE SIOS WEO RIEULPHIEUPH
+ 0x9A58: 0xC243, //HANGUL SYLLABLE SIOS WEO RIEULHIEUH
+ 0x9A59: 0xC244, //HANGUL SYLLABLE SIOS WEO MIEUM
+ 0x9A5A: 0xC245, //HANGUL SYLLABLE SIOS WEO PIEUP
+ 0x9A61: 0xC246, //HANGUL SYLLABLE SIOS WEO PIEUPSIOS
+ 0x9A62: 0xC247, //HANGUL SYLLABLE SIOS WEO SIOS
+ 0x9A63: 0xC249, //HANGUL SYLLABLE SIOS WEO IEUNG
+ 0x9A64: 0xC24A, //HANGUL SYLLABLE SIOS WEO CIEUC
+ 0x9A65: 0xC24B, //HANGUL SYLLABLE SIOS WEO CHIEUCH
+ 0x9A66: 0xC24C, //HANGUL SYLLABLE SIOS WEO KHIEUKH
+ 0x9A67: 0xC24D, //HANGUL SYLLABLE SIOS WEO THIEUTH
+ 0x9A68: 0xC24E, //HANGUL SYLLABLE SIOS WEO PHIEUPH
+ 0x9A69: 0xC24F, //HANGUL SYLLABLE SIOS WEO HIEUH
+ 0x9A6A: 0xC252, //HANGUL SYLLABLE SIOS WE SSANGKIYEOK
+ 0x9A6B: 0xC253, //HANGUL SYLLABLE SIOS WE KIYEOKSIOS
+ 0x9A6C: 0xC255, //HANGUL SYLLABLE SIOS WE NIEUNCIEUC
+ 0x9A6D: 0xC256, //HANGUL SYLLABLE SIOS WE NIEUNHIEUH
+ 0x9A6E: 0xC257, //HANGUL SYLLABLE SIOS WE TIKEUT
+ 0x9A6F: 0xC259, //HANGUL SYLLABLE SIOS WE RIEULKIYEOK
+ 0x9A70: 0xC25A, //HANGUL SYLLABLE SIOS WE RIEULMIEUM
+ 0x9A71: 0xC25B, //HANGUL SYLLABLE SIOS WE RIEULPIEUP
+ 0x9A72: 0xC25C, //HANGUL SYLLABLE SIOS WE RIEULSIOS
+ 0x9A73: 0xC25D, //HANGUL SYLLABLE SIOS WE RIEULTHIEUTH
+ 0x9A74: 0xC25E, //HANGUL SYLLABLE SIOS WE RIEULPHIEUPH
+ 0x9A75: 0xC25F, //HANGUL SYLLABLE SIOS WE RIEULHIEUH
+ 0x9A76: 0xC261, //HANGUL SYLLABLE SIOS WE PIEUP
+ 0x9A77: 0xC262, //HANGUL SYLLABLE SIOS WE PIEUPSIOS
+ 0x9A78: 0xC263, //HANGUL SYLLABLE SIOS WE SIOS
+ 0x9A79: 0xC264, //HANGUL SYLLABLE SIOS WE SSANGSIOS
+ 0x9A7A: 0xC266, //HANGUL SYLLABLE SIOS WE CIEUC
+ 0x9A81: 0xC267, //HANGUL SYLLABLE SIOS WE CHIEUCH
+ 0x9A82: 0xC268, //HANGUL SYLLABLE SIOS WE KHIEUKH
+ 0x9A83: 0xC269, //HANGUL SYLLABLE SIOS WE THIEUTH
+ 0x9A84: 0xC26A, //HANGUL SYLLABLE SIOS WE PHIEUPH
+ 0x9A85: 0xC26B, //HANGUL SYLLABLE SIOS WE HIEUH
+ 0x9A86: 0xC26E, //HANGUL SYLLABLE SIOS WI SSANGKIYEOK
+ 0x9A87: 0xC26F, //HANGUL SYLLABLE SIOS WI KIYEOKSIOS
+ 0x9A88: 0xC271, //HANGUL SYLLABLE SIOS WI NIEUNCIEUC
+ 0x9A89: 0xC272, //HANGUL SYLLABLE SIOS WI NIEUNHIEUH
+ 0x9A8A: 0xC273, //HANGUL SYLLABLE SIOS WI TIKEUT
+ 0x9A8B: 0xC275, //HANGUL SYLLABLE SIOS WI RIEULKIYEOK
+ 0x9A8C: 0xC276, //HANGUL SYLLABLE SIOS WI RIEULMIEUM
+ 0x9A8D: 0xC277, //HANGUL SYLLABLE SIOS WI RIEULPIEUP
+ 0x9A8E: 0xC278, //HANGUL SYLLABLE SIOS WI RIEULSIOS
+ 0x9A8F: 0xC279, //HANGUL SYLLABLE SIOS WI RIEULTHIEUTH
+ 0x9A90: 0xC27A, //HANGUL SYLLABLE SIOS WI RIEULPHIEUPH
+ 0x9A91: 0xC27B, //HANGUL SYLLABLE SIOS WI RIEULHIEUH
+ 0x9A92: 0xC27E, //HANGUL SYLLABLE SIOS WI PIEUPSIOS
+ 0x9A93: 0xC280, //HANGUL SYLLABLE SIOS WI SSANGSIOS
+ 0x9A94: 0xC282, //HANGUL SYLLABLE SIOS WI CIEUC
+ 0x9A95: 0xC283, //HANGUL SYLLABLE SIOS WI CHIEUCH
+ 0x9A96: 0xC284, //HANGUL SYLLABLE SIOS WI KHIEUKH
+ 0x9A97: 0xC285, //HANGUL SYLLABLE SIOS WI THIEUTH
+ 0x9A98: 0xC286, //HANGUL SYLLABLE SIOS WI PHIEUPH
+ 0x9A99: 0xC287, //HANGUL SYLLABLE SIOS WI HIEUH
+ 0x9A9A: 0xC28A, //HANGUL SYLLABLE SIOS YU SSANGKIYEOK
+ 0x9A9B: 0xC28B, //HANGUL SYLLABLE SIOS YU KIYEOKSIOS
+ 0x9A9C: 0xC28C, //HANGUL SYLLABLE SIOS YU NIEUN
+ 0x9A9D: 0xC28D, //HANGUL SYLLABLE SIOS YU NIEUNCIEUC
+ 0x9A9E: 0xC28E, //HANGUL SYLLABLE SIOS YU NIEUNHIEUH
+ 0x9A9F: 0xC28F, //HANGUL SYLLABLE SIOS YU TIKEUT
+ 0x9AA0: 0xC291, //HANGUL SYLLABLE SIOS YU RIEULKIYEOK
+ 0x9AA1: 0xC292, //HANGUL SYLLABLE SIOS YU RIEULMIEUM
+ 0x9AA2: 0xC293, //HANGUL SYLLABLE SIOS YU RIEULPIEUP
+ 0x9AA3: 0xC294, //HANGUL SYLLABLE SIOS YU RIEULSIOS
+ 0x9AA4: 0xC295, //HANGUL SYLLABLE SIOS YU RIEULTHIEUTH
+ 0x9AA5: 0xC296, //HANGUL SYLLABLE SIOS YU RIEULPHIEUPH
+ 0x9AA6: 0xC297, //HANGUL SYLLABLE SIOS YU RIEULHIEUH
+ 0x9AA7: 0xC299, //HANGUL SYLLABLE SIOS YU PIEUP
+ 0x9AA8: 0xC29A, //HANGUL SYLLABLE SIOS YU PIEUPSIOS
+ 0x9AA9: 0xC29C, //HANGUL SYLLABLE SIOS YU SSANGSIOS
+ 0x9AAA: 0xC29E, //HANGUL SYLLABLE SIOS YU CIEUC
+ 0x9AAB: 0xC29F, //HANGUL SYLLABLE SIOS YU CHIEUCH
+ 0x9AAC: 0xC2A0, //HANGUL SYLLABLE SIOS YU KHIEUKH
+ 0x9AAD: 0xC2A1, //HANGUL SYLLABLE SIOS YU THIEUTH
+ 0x9AAE: 0xC2A2, //HANGUL SYLLABLE SIOS YU PHIEUPH
+ 0x9AAF: 0xC2A3, //HANGUL SYLLABLE SIOS YU HIEUH
+ 0x9AB0: 0xC2A6, //HANGUL SYLLABLE SIOS EU SSANGKIYEOK
+ 0x9AB1: 0xC2A7, //HANGUL SYLLABLE SIOS EU KIYEOKSIOS
+ 0x9AB2: 0xC2A9, //HANGUL SYLLABLE SIOS EU NIEUNCIEUC
+ 0x9AB3: 0xC2AA, //HANGUL SYLLABLE SIOS EU NIEUNHIEUH
+ 0x9AB4: 0xC2AB, //HANGUL SYLLABLE SIOS EU TIKEUT
+ 0x9AB5: 0xC2AE, //HANGUL SYLLABLE SIOS EU RIEULMIEUM
+ 0x9AB6: 0xC2AF, //HANGUL SYLLABLE SIOS EU RIEULPIEUP
+ 0x9AB7: 0xC2B0, //HANGUL SYLLABLE SIOS EU RIEULSIOS
+ 0x9AB8: 0xC2B1, //HANGUL SYLLABLE SIOS EU RIEULTHIEUTH
+ 0x9AB9: 0xC2B2, //HANGUL SYLLABLE SIOS EU RIEULPHIEUPH
+ 0x9ABA: 0xC2B3, //HANGUL SYLLABLE SIOS EU RIEULHIEUH
+ 0x9ABB: 0xC2B6, //HANGUL SYLLABLE SIOS EU PIEUPSIOS
+ 0x9ABC: 0xC2B8, //HANGUL SYLLABLE SIOS EU SSANGSIOS
+ 0x9ABD: 0xC2BA, //HANGUL SYLLABLE SIOS EU CIEUC
+ 0x9ABE: 0xC2BB, //HANGUL SYLLABLE SIOS EU CHIEUCH
+ 0x9ABF: 0xC2BC, //HANGUL SYLLABLE SIOS EU KHIEUKH
+ 0x9AC0: 0xC2BD, //HANGUL SYLLABLE SIOS EU THIEUTH
+ 0x9AC1: 0xC2BE, //HANGUL SYLLABLE SIOS EU PHIEUPH
+ 0x9AC2: 0xC2BF, //HANGUL SYLLABLE SIOS EU HIEUH
+ 0x9AC3: 0xC2C0, //HANGUL SYLLABLE SIOS YI
+ 0x9AC4: 0xC2C1, //HANGUL SYLLABLE SIOS YI KIYEOK
+ 0x9AC5: 0xC2C2, //HANGUL SYLLABLE SIOS YI SSANGKIYEOK
+ 0x9AC6: 0xC2C3, //HANGUL SYLLABLE SIOS YI KIYEOKSIOS
+ 0x9AC7: 0xC2C4, //HANGUL SYLLABLE SIOS YI NIEUN
+ 0x9AC8: 0xC2C5, //HANGUL SYLLABLE SIOS YI NIEUNCIEUC
+ 0x9AC9: 0xC2C6, //HANGUL SYLLABLE SIOS YI NIEUNHIEUH
+ 0x9ACA: 0xC2C7, //HANGUL SYLLABLE SIOS YI TIKEUT
+ 0x9ACB: 0xC2C8, //HANGUL SYLLABLE SIOS YI RIEUL
+ 0x9ACC: 0xC2C9, //HANGUL SYLLABLE SIOS YI RIEULKIYEOK
+ 0x9ACD: 0xC2CA, //HANGUL SYLLABLE SIOS YI RIEULMIEUM
+ 0x9ACE: 0xC2CB, //HANGUL SYLLABLE SIOS YI RIEULPIEUP
+ 0x9ACF: 0xC2CC, //HANGUL SYLLABLE SIOS YI RIEULSIOS
+ 0x9AD0: 0xC2CD, //HANGUL SYLLABLE SIOS YI RIEULTHIEUTH
+ 0x9AD1: 0xC2CE, //HANGUL SYLLABLE SIOS YI RIEULPHIEUPH
+ 0x9AD2: 0xC2CF, //HANGUL SYLLABLE SIOS YI RIEULHIEUH
+ 0x9AD3: 0xC2D0, //HANGUL SYLLABLE SIOS YI MIEUM
+ 0x9AD4: 0xC2D1, //HANGUL SYLLABLE SIOS YI PIEUP
+ 0x9AD5: 0xC2D2, //HANGUL SYLLABLE SIOS YI PIEUPSIOS
+ 0x9AD6: 0xC2D3, //HANGUL SYLLABLE SIOS YI SIOS
+ 0x9AD7: 0xC2D4, //HANGUL SYLLABLE SIOS YI SSANGSIOS
+ 0x9AD8: 0xC2D5, //HANGUL SYLLABLE SIOS YI IEUNG
+ 0x9AD9: 0xC2D6, //HANGUL SYLLABLE SIOS YI CIEUC
+ 0x9ADA: 0xC2D7, //HANGUL SYLLABLE SIOS YI CHIEUCH
+ 0x9ADB: 0xC2D8, //HANGUL SYLLABLE SIOS YI KHIEUKH
+ 0x9ADC: 0xC2D9, //HANGUL SYLLABLE SIOS YI THIEUTH
+ 0x9ADD: 0xC2DA, //HANGUL SYLLABLE SIOS YI PHIEUPH
+ 0x9ADE: 0xC2DB, //HANGUL SYLLABLE SIOS YI HIEUH
+ 0x9ADF: 0xC2DE, //HANGUL SYLLABLE SIOS I SSANGKIYEOK
+ 0x9AE0: 0xC2DF, //HANGUL SYLLABLE SIOS I KIYEOKSIOS
+ 0x9AE1: 0xC2E1, //HANGUL SYLLABLE SIOS I NIEUNCIEUC
+ 0x9AE2: 0xC2E2, //HANGUL SYLLABLE SIOS I NIEUNHIEUH
+ 0x9AE3: 0xC2E5, //HANGUL SYLLABLE SIOS I RIEULKIYEOK
+ 0x9AE4: 0xC2E6, //HANGUL SYLLABLE SIOS I RIEULMIEUM
+ 0x9AE5: 0xC2E7, //HANGUL SYLLABLE SIOS I RIEULPIEUP
+ 0x9AE6: 0xC2E8, //HANGUL SYLLABLE SIOS I RIEULSIOS
+ 0x9AE7: 0xC2E9, //HANGUL SYLLABLE SIOS I RIEULTHIEUTH
+ 0x9AE8: 0xC2EA, //HANGUL SYLLABLE SIOS I RIEULPHIEUPH
+ 0x9AE9: 0xC2EE, //HANGUL SYLLABLE SIOS I PIEUPSIOS
+ 0x9AEA: 0xC2F0, //HANGUL SYLLABLE SIOS I SSANGSIOS
+ 0x9AEB: 0xC2F2, //HANGUL SYLLABLE SIOS I CIEUC
+ 0x9AEC: 0xC2F3, //HANGUL SYLLABLE SIOS I CHIEUCH
+ 0x9AED: 0xC2F4, //HANGUL SYLLABLE SIOS I KHIEUKH
+ 0x9AEE: 0xC2F5, //HANGUL SYLLABLE SIOS I THIEUTH
+ 0x9AEF: 0xC2F7, //HANGUL SYLLABLE SIOS I HIEUH
+ 0x9AF0: 0xC2FA, //HANGUL SYLLABLE SSANGSIOS A SSANGKIYEOK
+ 0x9AF1: 0xC2FD, //HANGUL SYLLABLE SSANGSIOS A NIEUNCIEUC
+ 0x9AF2: 0xC2FE, //HANGUL SYLLABLE SSANGSIOS A NIEUNHIEUH
+ 0x9AF3: 0xC2FF, //HANGUL SYLLABLE SSANGSIOS A TIKEUT
+ 0x9AF4: 0xC301, //HANGUL SYLLABLE SSANGSIOS A RIEULKIYEOK
+ 0x9AF5: 0xC302, //HANGUL SYLLABLE SSANGSIOS A RIEULMIEUM
+ 0x9AF6: 0xC303, //HANGUL SYLLABLE SSANGSIOS A RIEULPIEUP
+ 0x9AF7: 0xC304, //HANGUL SYLLABLE SSANGSIOS A RIEULSIOS
+ 0x9AF8: 0xC305, //HANGUL SYLLABLE SSANGSIOS A RIEULTHIEUTH
+ 0x9AF9: 0xC306, //HANGUL SYLLABLE SSANGSIOS A RIEULPHIEUPH
+ 0x9AFA: 0xC307, //HANGUL SYLLABLE SSANGSIOS A RIEULHIEUH
+ 0x9AFB: 0xC30A, //HANGUL SYLLABLE SSANGSIOS A PIEUPSIOS
+ 0x9AFC: 0xC30B, //HANGUL SYLLABLE SSANGSIOS A SIOS
+ 0x9AFD: 0xC30E, //HANGUL SYLLABLE SSANGSIOS A CIEUC
+ 0x9AFE: 0xC30F, //HANGUL SYLLABLE SSANGSIOS A CHIEUCH
+ 0x9B41: 0xC310, //HANGUL SYLLABLE SSANGSIOS A KHIEUKH
+ 0x9B42: 0xC311, //HANGUL SYLLABLE SSANGSIOS A THIEUTH
+ 0x9B43: 0xC312, //HANGUL SYLLABLE SSANGSIOS A PHIEUPH
+ 0x9B44: 0xC316, //HANGUL SYLLABLE SSANGSIOS AE SSANGKIYEOK
+ 0x9B45: 0xC317, //HANGUL SYLLABLE SSANGSIOS AE KIYEOKSIOS
+ 0x9B46: 0xC319, //HANGUL SYLLABLE SSANGSIOS AE NIEUNCIEUC
+ 0x9B47: 0xC31A, //HANGUL SYLLABLE SSANGSIOS AE NIEUNHIEUH
+ 0x9B48: 0xC31B, //HANGUL SYLLABLE SSANGSIOS AE TIKEUT
+ 0x9B49: 0xC31D, //HANGUL SYLLABLE SSANGSIOS AE RIEULKIYEOK
+ 0x9B4A: 0xC31E, //HANGUL SYLLABLE SSANGSIOS AE RIEULMIEUM
+ 0x9B4B: 0xC31F, //HANGUL SYLLABLE SSANGSIOS AE RIEULPIEUP
+ 0x9B4C: 0xC320, //HANGUL SYLLABLE SSANGSIOS AE RIEULSIOS
+ 0x9B4D: 0xC321, //HANGUL SYLLABLE SSANGSIOS AE RIEULTHIEUTH
+ 0x9B4E: 0xC322, //HANGUL SYLLABLE SSANGSIOS AE RIEULPHIEUPH
+ 0x9B4F: 0xC323, //HANGUL SYLLABLE SSANGSIOS AE RIEULHIEUH
+ 0x9B50: 0xC326, //HANGUL SYLLABLE SSANGSIOS AE PIEUPSIOS
+ 0x9B51: 0xC327, //HANGUL SYLLABLE SSANGSIOS AE SIOS
+ 0x9B52: 0xC32A, //HANGUL SYLLABLE SSANGSIOS AE CIEUC
+ 0x9B53: 0xC32B, //HANGUL SYLLABLE SSANGSIOS AE CHIEUCH
+ 0x9B54: 0xC32C, //HANGUL SYLLABLE SSANGSIOS AE KHIEUKH
+ 0x9B55: 0xC32D, //HANGUL SYLLABLE SSANGSIOS AE THIEUTH
+ 0x9B56: 0xC32E, //HANGUL SYLLABLE SSANGSIOS AE PHIEUPH
+ 0x9B57: 0xC32F, //HANGUL SYLLABLE SSANGSIOS AE HIEUH
+ 0x9B58: 0xC330, //HANGUL SYLLABLE SSANGSIOS YA
+ 0x9B59: 0xC331, //HANGUL SYLLABLE SSANGSIOS YA KIYEOK
+ 0x9B5A: 0xC332, //HANGUL SYLLABLE SSANGSIOS YA SSANGKIYEOK
+ 0x9B61: 0xC333, //HANGUL SYLLABLE SSANGSIOS YA KIYEOKSIOS
+ 0x9B62: 0xC334, //HANGUL SYLLABLE SSANGSIOS YA NIEUN
+ 0x9B63: 0xC335, //HANGUL SYLLABLE SSANGSIOS YA NIEUNCIEUC
+ 0x9B64: 0xC336, //HANGUL SYLLABLE SSANGSIOS YA NIEUNHIEUH
+ 0x9B65: 0xC337, //HANGUL SYLLABLE SSANGSIOS YA TIKEUT
+ 0x9B66: 0xC338, //HANGUL SYLLABLE SSANGSIOS YA RIEUL
+ 0x9B67: 0xC339, //HANGUL SYLLABLE SSANGSIOS YA RIEULKIYEOK
+ 0x9B68: 0xC33A, //HANGUL SYLLABLE SSANGSIOS YA RIEULMIEUM
+ 0x9B69: 0xC33B, //HANGUL SYLLABLE SSANGSIOS YA RIEULPIEUP
+ 0x9B6A: 0xC33C, //HANGUL SYLLABLE SSANGSIOS YA RIEULSIOS
+ 0x9B6B: 0xC33D, //HANGUL SYLLABLE SSANGSIOS YA RIEULTHIEUTH
+ 0x9B6C: 0xC33E, //HANGUL SYLLABLE SSANGSIOS YA RIEULPHIEUPH
+ 0x9B6D: 0xC33F, //HANGUL SYLLABLE SSANGSIOS YA RIEULHIEUH
+ 0x9B6E: 0xC340, //HANGUL SYLLABLE SSANGSIOS YA MIEUM
+ 0x9B6F: 0xC341, //HANGUL SYLLABLE SSANGSIOS YA PIEUP
+ 0x9B70: 0xC342, //HANGUL SYLLABLE SSANGSIOS YA PIEUPSIOS
+ 0x9B71: 0xC343, //HANGUL SYLLABLE SSANGSIOS YA SIOS
+ 0x9B72: 0xC344, //HANGUL SYLLABLE SSANGSIOS YA SSANGSIOS
+ 0x9B73: 0xC346, //HANGUL SYLLABLE SSANGSIOS YA CIEUC
+ 0x9B74: 0xC347, //HANGUL SYLLABLE SSANGSIOS YA CHIEUCH
+ 0x9B75: 0xC348, //HANGUL SYLLABLE SSANGSIOS YA KHIEUKH
+ 0x9B76: 0xC349, //HANGUL SYLLABLE SSANGSIOS YA THIEUTH
+ 0x9B77: 0xC34A, //HANGUL SYLLABLE SSANGSIOS YA PHIEUPH
+ 0x9B78: 0xC34B, //HANGUL SYLLABLE SSANGSIOS YA HIEUH
+ 0x9B79: 0xC34C, //HANGUL SYLLABLE SSANGSIOS YAE
+ 0x9B7A: 0xC34D, //HANGUL SYLLABLE SSANGSIOS YAE KIYEOK
+ 0x9B81: 0xC34E, //HANGUL SYLLABLE SSANGSIOS YAE SSANGKIYEOK
+ 0x9B82: 0xC34F, //HANGUL SYLLABLE SSANGSIOS YAE KIYEOKSIOS
+ 0x9B83: 0xC350, //HANGUL SYLLABLE SSANGSIOS YAE NIEUN
+ 0x9B84: 0xC351, //HANGUL SYLLABLE SSANGSIOS YAE NIEUNCIEUC
+ 0x9B85: 0xC352, //HANGUL SYLLABLE SSANGSIOS YAE NIEUNHIEUH
+ 0x9B86: 0xC353, //HANGUL SYLLABLE SSANGSIOS YAE TIKEUT
+ 0x9B87: 0xC354, //HANGUL SYLLABLE SSANGSIOS YAE RIEUL
+ 0x9B88: 0xC355, //HANGUL SYLLABLE SSANGSIOS YAE RIEULKIYEOK
+ 0x9B89: 0xC356, //HANGUL SYLLABLE SSANGSIOS YAE RIEULMIEUM
+ 0x9B8A: 0xC357, //HANGUL SYLLABLE SSANGSIOS YAE RIEULPIEUP
+ 0x9B8B: 0xC358, //HANGUL SYLLABLE SSANGSIOS YAE RIEULSIOS
+ 0x9B8C: 0xC359, //HANGUL SYLLABLE SSANGSIOS YAE RIEULTHIEUTH
+ 0x9B8D: 0xC35A, //HANGUL SYLLABLE SSANGSIOS YAE RIEULPHIEUPH
+ 0x9B8E: 0xC35B, //HANGUL SYLLABLE SSANGSIOS YAE RIEULHIEUH
+ 0x9B8F: 0xC35C, //HANGUL SYLLABLE SSANGSIOS YAE MIEUM
+ 0x9B90: 0xC35D, //HANGUL SYLLABLE SSANGSIOS YAE PIEUP
+ 0x9B91: 0xC35E, //HANGUL SYLLABLE SSANGSIOS YAE PIEUPSIOS
+ 0x9B92: 0xC35F, //HANGUL SYLLABLE SSANGSIOS YAE SIOS
+ 0x9B93: 0xC360, //HANGUL SYLLABLE SSANGSIOS YAE SSANGSIOS
+ 0x9B94: 0xC361, //HANGUL SYLLABLE SSANGSIOS YAE IEUNG
+ 0x9B95: 0xC362, //HANGUL SYLLABLE SSANGSIOS YAE CIEUC
+ 0x9B96: 0xC363, //HANGUL SYLLABLE SSANGSIOS YAE CHIEUCH
+ 0x9B97: 0xC364, //HANGUL SYLLABLE SSANGSIOS YAE KHIEUKH
+ 0x9B98: 0xC365, //HANGUL SYLLABLE SSANGSIOS YAE THIEUTH
+ 0x9B99: 0xC366, //HANGUL SYLLABLE SSANGSIOS YAE PHIEUPH
+ 0x9B9A: 0xC367, //HANGUL SYLLABLE SSANGSIOS YAE HIEUH
+ 0x9B9B: 0xC36A, //HANGUL SYLLABLE SSANGSIOS EO SSANGKIYEOK
+ 0x9B9C: 0xC36B, //HANGUL SYLLABLE SSANGSIOS EO KIYEOKSIOS
+ 0x9B9D: 0xC36D, //HANGUL SYLLABLE SSANGSIOS EO NIEUNCIEUC
+ 0x9B9E: 0xC36E, //HANGUL SYLLABLE SSANGSIOS EO NIEUNHIEUH
+ 0x9B9F: 0xC36F, //HANGUL SYLLABLE SSANGSIOS EO TIKEUT
+ 0x9BA0: 0xC371, //HANGUL SYLLABLE SSANGSIOS EO RIEULKIYEOK
+ 0x9BA1: 0xC373, //HANGUL SYLLABLE SSANGSIOS EO RIEULPIEUP
+ 0x9BA2: 0xC374, //HANGUL SYLLABLE SSANGSIOS EO RIEULSIOS
+ 0x9BA3: 0xC375, //HANGUL SYLLABLE SSANGSIOS EO RIEULTHIEUTH
+ 0x9BA4: 0xC376, //HANGUL SYLLABLE SSANGSIOS EO RIEULPHIEUPH
+ 0x9BA5: 0xC377, //HANGUL SYLLABLE SSANGSIOS EO RIEULHIEUH
+ 0x9BA6: 0xC37A, //HANGUL SYLLABLE SSANGSIOS EO PIEUPSIOS
+ 0x9BA7: 0xC37B, //HANGUL SYLLABLE SSANGSIOS EO SIOS
+ 0x9BA8: 0xC37E, //HANGUL SYLLABLE SSANGSIOS EO CIEUC
+ 0x9BA9: 0xC37F, //HANGUL SYLLABLE SSANGSIOS EO CHIEUCH
+ 0x9BAA: 0xC380, //HANGUL SYLLABLE SSANGSIOS EO KHIEUKH
+ 0x9BAB: 0xC381, //HANGUL SYLLABLE SSANGSIOS EO THIEUTH
+ 0x9BAC: 0xC382, //HANGUL SYLLABLE SSANGSIOS EO PHIEUPH
+ 0x9BAD: 0xC383, //HANGUL SYLLABLE SSANGSIOS EO HIEUH
+ 0x9BAE: 0xC385, //HANGUL SYLLABLE SSANGSIOS E KIYEOK
+ 0x9BAF: 0xC386, //HANGUL SYLLABLE SSANGSIOS E SSANGKIYEOK
+ 0x9BB0: 0xC387, //HANGUL SYLLABLE SSANGSIOS E KIYEOKSIOS
+ 0x9BB1: 0xC389, //HANGUL SYLLABLE SSANGSIOS E NIEUNCIEUC
+ 0x9BB2: 0xC38A, //HANGUL SYLLABLE SSANGSIOS E NIEUNHIEUH
+ 0x9BB3: 0xC38B, //HANGUL SYLLABLE SSANGSIOS E TIKEUT
+ 0x9BB4: 0xC38D, //HANGUL SYLLABLE SSANGSIOS E RIEULKIYEOK
+ 0x9BB5: 0xC38E, //HANGUL SYLLABLE SSANGSIOS E RIEULMIEUM
+ 0x9BB6: 0xC38F, //HANGUL SYLLABLE SSANGSIOS E RIEULPIEUP
+ 0x9BB7: 0xC390, //HANGUL SYLLABLE SSANGSIOS E RIEULSIOS
+ 0x9BB8: 0xC391, //HANGUL SYLLABLE SSANGSIOS E RIEULTHIEUTH
+ 0x9BB9: 0xC392, //HANGUL SYLLABLE SSANGSIOS E RIEULPHIEUPH
+ 0x9BBA: 0xC393, //HANGUL SYLLABLE SSANGSIOS E RIEULHIEUH
+ 0x9BBB: 0xC394, //HANGUL SYLLABLE SSANGSIOS E MIEUM
+ 0x9BBC: 0xC395, //HANGUL SYLLABLE SSANGSIOS E PIEUP
+ 0x9BBD: 0xC396, //HANGUL SYLLABLE SSANGSIOS E PIEUPSIOS
+ 0x9BBE: 0xC397, //HANGUL SYLLABLE SSANGSIOS E SIOS
+ 0x9BBF: 0xC398, //HANGUL SYLLABLE SSANGSIOS E SSANGSIOS
+ 0x9BC0: 0xC399, //HANGUL SYLLABLE SSANGSIOS E IEUNG
+ 0x9BC1: 0xC39A, //HANGUL SYLLABLE SSANGSIOS E CIEUC
+ 0x9BC2: 0xC39B, //HANGUL SYLLABLE SSANGSIOS E CHIEUCH
+ 0x9BC3: 0xC39C, //HANGUL SYLLABLE SSANGSIOS E KHIEUKH
+ 0x9BC4: 0xC39D, //HANGUL SYLLABLE SSANGSIOS E THIEUTH
+ 0x9BC5: 0xC39E, //HANGUL SYLLABLE SSANGSIOS E PHIEUPH
+ 0x9BC6: 0xC39F, //HANGUL SYLLABLE SSANGSIOS E HIEUH
+ 0x9BC7: 0xC3A0, //HANGUL SYLLABLE SSANGSIOS YEO
+ 0x9BC8: 0xC3A1, //HANGUL SYLLABLE SSANGSIOS YEO KIYEOK
+ 0x9BC9: 0xC3A2, //HANGUL SYLLABLE SSANGSIOS YEO SSANGKIYEOK
+ 0x9BCA: 0xC3A3, //HANGUL SYLLABLE SSANGSIOS YEO KIYEOKSIOS
+ 0x9BCB: 0xC3A4, //HANGUL SYLLABLE SSANGSIOS YEO NIEUN
+ 0x9BCC: 0xC3A5, //HANGUL SYLLABLE SSANGSIOS YEO NIEUNCIEUC
+ 0x9BCD: 0xC3A6, //HANGUL SYLLABLE SSANGSIOS YEO NIEUNHIEUH
+ 0x9BCE: 0xC3A7, //HANGUL SYLLABLE SSANGSIOS YEO TIKEUT
+ 0x9BCF: 0xC3A8, //HANGUL SYLLABLE SSANGSIOS YEO RIEUL
+ 0x9BD0: 0xC3A9, //HANGUL SYLLABLE SSANGSIOS YEO RIEULKIYEOK
+ 0x9BD1: 0xC3AA, //HANGUL SYLLABLE SSANGSIOS YEO RIEULMIEUM
+ 0x9BD2: 0xC3AB, //HANGUL SYLLABLE SSANGSIOS YEO RIEULPIEUP
+ 0x9BD3: 0xC3AC, //HANGUL SYLLABLE SSANGSIOS YEO RIEULSIOS
+ 0x9BD4: 0xC3AD, //HANGUL SYLLABLE SSANGSIOS YEO RIEULTHIEUTH
+ 0x9BD5: 0xC3AE, //HANGUL SYLLABLE SSANGSIOS YEO RIEULPHIEUPH
+ 0x9BD6: 0xC3AF, //HANGUL SYLLABLE SSANGSIOS YEO RIEULHIEUH
+ 0x9BD7: 0xC3B0, //HANGUL SYLLABLE SSANGSIOS YEO MIEUM
+ 0x9BD8: 0xC3B1, //HANGUL SYLLABLE SSANGSIOS YEO PIEUP
+ 0x9BD9: 0xC3B2, //HANGUL SYLLABLE SSANGSIOS YEO PIEUPSIOS
+ 0x9BDA: 0xC3B3, //HANGUL SYLLABLE SSANGSIOS YEO SIOS
+ 0x9BDB: 0xC3B4, //HANGUL SYLLABLE SSANGSIOS YEO SSANGSIOS
+ 0x9BDC: 0xC3B5, //HANGUL SYLLABLE SSANGSIOS YEO IEUNG
+ 0x9BDD: 0xC3B6, //HANGUL SYLLABLE SSANGSIOS YEO CIEUC
+ 0x9BDE: 0xC3B7, //HANGUL SYLLABLE SSANGSIOS YEO CHIEUCH
+ 0x9BDF: 0xC3B8, //HANGUL SYLLABLE SSANGSIOS YEO KHIEUKH
+ 0x9BE0: 0xC3B9, //HANGUL SYLLABLE SSANGSIOS YEO THIEUTH
+ 0x9BE1: 0xC3BA, //HANGUL SYLLABLE SSANGSIOS YEO PHIEUPH
+ 0x9BE2: 0xC3BB, //HANGUL SYLLABLE SSANGSIOS YEO HIEUH
+ 0x9BE3: 0xC3BC, //HANGUL SYLLABLE SSANGSIOS YE
+ 0x9BE4: 0xC3BD, //HANGUL SYLLABLE SSANGSIOS YE KIYEOK
+ 0x9BE5: 0xC3BE, //HANGUL SYLLABLE SSANGSIOS YE SSANGKIYEOK
+ 0x9BE6: 0xC3BF, //HANGUL SYLLABLE SSANGSIOS YE KIYEOKSIOS
+ 0x9BE7: 0xC3C1, //HANGUL SYLLABLE SSANGSIOS YE NIEUNCIEUC
+ 0x9BE8: 0xC3C2, //HANGUL SYLLABLE SSANGSIOS YE NIEUNHIEUH
+ 0x9BE9: 0xC3C3, //HANGUL SYLLABLE SSANGSIOS YE TIKEUT
+ 0x9BEA: 0xC3C4, //HANGUL SYLLABLE SSANGSIOS YE RIEUL
+ 0x9BEB: 0xC3C5, //HANGUL SYLLABLE SSANGSIOS YE RIEULKIYEOK
+ 0x9BEC: 0xC3C6, //HANGUL SYLLABLE SSANGSIOS YE RIEULMIEUM
+ 0x9BED: 0xC3C7, //HANGUL SYLLABLE SSANGSIOS YE RIEULPIEUP
+ 0x9BEE: 0xC3C8, //HANGUL SYLLABLE SSANGSIOS YE RIEULSIOS
+ 0x9BEF: 0xC3C9, //HANGUL SYLLABLE SSANGSIOS YE RIEULTHIEUTH
+ 0x9BF0: 0xC3CA, //HANGUL SYLLABLE SSANGSIOS YE RIEULPHIEUPH
+ 0x9BF1: 0xC3CB, //HANGUL SYLLABLE SSANGSIOS YE RIEULHIEUH
+ 0x9BF2: 0xC3CC, //HANGUL SYLLABLE SSANGSIOS YE MIEUM
+ 0x9BF3: 0xC3CD, //HANGUL SYLLABLE SSANGSIOS YE PIEUP
+ 0x9BF4: 0xC3CE, //HANGUL SYLLABLE SSANGSIOS YE PIEUPSIOS
+ 0x9BF5: 0xC3CF, //HANGUL SYLLABLE SSANGSIOS YE SIOS
+ 0x9BF6: 0xC3D0, //HANGUL SYLLABLE SSANGSIOS YE SSANGSIOS
+ 0x9BF7: 0xC3D1, //HANGUL SYLLABLE SSANGSIOS YE IEUNG
+ 0x9BF8: 0xC3D2, //HANGUL SYLLABLE SSANGSIOS YE CIEUC
+ 0x9BF9: 0xC3D3, //HANGUL SYLLABLE SSANGSIOS YE CHIEUCH
+ 0x9BFA: 0xC3D4, //HANGUL SYLLABLE SSANGSIOS YE KHIEUKH
+ 0x9BFB: 0xC3D5, //HANGUL SYLLABLE SSANGSIOS YE THIEUTH
+ 0x9BFC: 0xC3D6, //HANGUL SYLLABLE SSANGSIOS YE PHIEUPH
+ 0x9BFD: 0xC3D7, //HANGUL SYLLABLE SSANGSIOS YE HIEUH
+ 0x9BFE: 0xC3DA, //HANGUL SYLLABLE SSANGSIOS O SSANGKIYEOK
+ 0x9C41: 0xC3DB, //HANGUL SYLLABLE SSANGSIOS O KIYEOKSIOS
+ 0x9C42: 0xC3DD, //HANGUL SYLLABLE SSANGSIOS O NIEUNCIEUC
+ 0x9C43: 0xC3DE, //HANGUL SYLLABLE SSANGSIOS O NIEUNHIEUH
+ 0x9C44: 0xC3E1, //HANGUL SYLLABLE SSANGSIOS O RIEULKIYEOK
+ 0x9C45: 0xC3E3, //HANGUL SYLLABLE SSANGSIOS O RIEULPIEUP
+ 0x9C46: 0xC3E4, //HANGUL SYLLABLE SSANGSIOS O RIEULSIOS
+ 0x9C47: 0xC3E5, //HANGUL SYLLABLE SSANGSIOS O RIEULTHIEUTH
+ 0x9C48: 0xC3E6, //HANGUL SYLLABLE SSANGSIOS O RIEULPHIEUPH
+ 0x9C49: 0xC3E7, //HANGUL SYLLABLE SSANGSIOS O RIEULHIEUH
+ 0x9C4A: 0xC3EA, //HANGUL SYLLABLE SSANGSIOS O PIEUPSIOS
+ 0x9C4B: 0xC3EB, //HANGUL SYLLABLE SSANGSIOS O SIOS
+ 0x9C4C: 0xC3EC, //HANGUL SYLLABLE SSANGSIOS O SSANGSIOS
+ 0x9C4D: 0xC3EE, //HANGUL SYLLABLE SSANGSIOS O CIEUC
+ 0x9C4E: 0xC3EF, //HANGUL SYLLABLE SSANGSIOS O CHIEUCH
+ 0x9C4F: 0xC3F0, //HANGUL SYLLABLE SSANGSIOS O KHIEUKH
+ 0x9C50: 0xC3F1, //HANGUL SYLLABLE SSANGSIOS O THIEUTH
+ 0x9C51: 0xC3F2, //HANGUL SYLLABLE SSANGSIOS O PHIEUPH
+ 0x9C52: 0xC3F3, //HANGUL SYLLABLE SSANGSIOS O HIEUH
+ 0x9C53: 0xC3F6, //HANGUL SYLLABLE SSANGSIOS WA SSANGKIYEOK
+ 0x9C54: 0xC3F7, //HANGUL SYLLABLE SSANGSIOS WA KIYEOKSIOS
+ 0x9C55: 0xC3F9, //HANGUL SYLLABLE SSANGSIOS WA NIEUNCIEUC
+ 0x9C56: 0xC3FA, //HANGUL SYLLABLE SSANGSIOS WA NIEUNHIEUH
+ 0x9C57: 0xC3FB, //HANGUL SYLLABLE SSANGSIOS WA TIKEUT
+ 0x9C58: 0xC3FC, //HANGUL SYLLABLE SSANGSIOS WA RIEUL
+ 0x9C59: 0xC3FD, //HANGUL SYLLABLE SSANGSIOS WA RIEULKIYEOK
+ 0x9C5A: 0xC3FE, //HANGUL SYLLABLE SSANGSIOS WA RIEULMIEUM
+ 0x9C61: 0xC3FF, //HANGUL SYLLABLE SSANGSIOS WA RIEULPIEUP
+ 0x9C62: 0xC400, //HANGUL SYLLABLE SSANGSIOS WA RIEULSIOS
+ 0x9C63: 0xC401, //HANGUL SYLLABLE SSANGSIOS WA RIEULTHIEUTH
+ 0x9C64: 0xC402, //HANGUL SYLLABLE SSANGSIOS WA RIEULPHIEUPH
+ 0x9C65: 0xC403, //HANGUL SYLLABLE SSANGSIOS WA RIEULHIEUH
+ 0x9C66: 0xC404, //HANGUL SYLLABLE SSANGSIOS WA MIEUM
+ 0x9C67: 0xC405, //HANGUL SYLLABLE SSANGSIOS WA PIEUP
+ 0x9C68: 0xC406, //HANGUL SYLLABLE SSANGSIOS WA PIEUPSIOS
+ 0x9C69: 0xC407, //HANGUL SYLLABLE SSANGSIOS WA SIOS
+ 0x9C6A: 0xC409, //HANGUL SYLLABLE SSANGSIOS WA IEUNG
+ 0x9C6B: 0xC40A, //HANGUL SYLLABLE SSANGSIOS WA CIEUC
+ 0x9C6C: 0xC40B, //HANGUL SYLLABLE SSANGSIOS WA CHIEUCH
+ 0x9C6D: 0xC40C, //HANGUL SYLLABLE SSANGSIOS WA KHIEUKH
+ 0x9C6E: 0xC40D, //HANGUL SYLLABLE SSANGSIOS WA THIEUTH
+ 0x9C6F: 0xC40E, //HANGUL SYLLABLE SSANGSIOS WA PHIEUPH
+ 0x9C70: 0xC40F, //HANGUL SYLLABLE SSANGSIOS WA HIEUH
+ 0x9C71: 0xC411, //HANGUL SYLLABLE SSANGSIOS WAE KIYEOK
+ 0x9C72: 0xC412, //HANGUL SYLLABLE SSANGSIOS WAE SSANGKIYEOK
+ 0x9C73: 0xC413, //HANGUL SYLLABLE SSANGSIOS WAE KIYEOKSIOS
+ 0x9C74: 0xC414, //HANGUL SYLLABLE SSANGSIOS WAE NIEUN
+ 0x9C75: 0xC415, //HANGUL SYLLABLE SSANGSIOS WAE NIEUNCIEUC
+ 0x9C76: 0xC416, //HANGUL SYLLABLE SSANGSIOS WAE NIEUNHIEUH
+ 0x9C77: 0xC417, //HANGUL SYLLABLE SSANGSIOS WAE TIKEUT
+ 0x9C78: 0xC418, //HANGUL SYLLABLE SSANGSIOS WAE RIEUL
+ 0x9C79: 0xC419, //HANGUL SYLLABLE SSANGSIOS WAE RIEULKIYEOK
+ 0x9C7A: 0xC41A, //HANGUL SYLLABLE SSANGSIOS WAE RIEULMIEUM
+ 0x9C81: 0xC41B, //HANGUL SYLLABLE SSANGSIOS WAE RIEULPIEUP
+ 0x9C82: 0xC41C, //HANGUL SYLLABLE SSANGSIOS WAE RIEULSIOS
+ 0x9C83: 0xC41D, //HANGUL SYLLABLE SSANGSIOS WAE RIEULTHIEUTH
+ 0x9C84: 0xC41E, //HANGUL SYLLABLE SSANGSIOS WAE RIEULPHIEUPH
+ 0x9C85: 0xC41F, //HANGUL SYLLABLE SSANGSIOS WAE RIEULHIEUH
+ 0x9C86: 0xC420, //HANGUL SYLLABLE SSANGSIOS WAE MIEUM
+ 0x9C87: 0xC421, //HANGUL SYLLABLE SSANGSIOS WAE PIEUP
+ 0x9C88: 0xC422, //HANGUL SYLLABLE SSANGSIOS WAE PIEUPSIOS
+ 0x9C89: 0xC423, //HANGUL SYLLABLE SSANGSIOS WAE SIOS
+ 0x9C8A: 0xC425, //HANGUL SYLLABLE SSANGSIOS WAE IEUNG
+ 0x9C8B: 0xC426, //HANGUL SYLLABLE SSANGSIOS WAE CIEUC
+ 0x9C8C: 0xC427, //HANGUL SYLLABLE SSANGSIOS WAE CHIEUCH
+ 0x9C8D: 0xC428, //HANGUL SYLLABLE SSANGSIOS WAE KHIEUKH
+ 0x9C8E: 0xC429, //HANGUL SYLLABLE SSANGSIOS WAE THIEUTH
+ 0x9C8F: 0xC42A, //HANGUL SYLLABLE SSANGSIOS WAE PHIEUPH
+ 0x9C90: 0xC42B, //HANGUL SYLLABLE SSANGSIOS WAE HIEUH
+ 0x9C91: 0xC42D, //HANGUL SYLLABLE SSANGSIOS OE KIYEOK
+ 0x9C92: 0xC42E, //HANGUL SYLLABLE SSANGSIOS OE SSANGKIYEOK
+ 0x9C93: 0xC42F, //HANGUL SYLLABLE SSANGSIOS OE KIYEOKSIOS
+ 0x9C94: 0xC431, //HANGUL SYLLABLE SSANGSIOS OE NIEUNCIEUC
+ 0x9C95: 0xC432, //HANGUL SYLLABLE SSANGSIOS OE NIEUNHIEUH
+ 0x9C96: 0xC433, //HANGUL SYLLABLE SSANGSIOS OE TIKEUT
+ 0x9C97: 0xC435, //HANGUL SYLLABLE SSANGSIOS OE RIEULKIYEOK
+ 0x9C98: 0xC436, //HANGUL SYLLABLE SSANGSIOS OE RIEULMIEUM
+ 0x9C99: 0xC437, //HANGUL SYLLABLE SSANGSIOS OE RIEULPIEUP
+ 0x9C9A: 0xC438, //HANGUL SYLLABLE SSANGSIOS OE RIEULSIOS
+ 0x9C9B: 0xC439, //HANGUL SYLLABLE SSANGSIOS OE RIEULTHIEUTH
+ 0x9C9C: 0xC43A, //HANGUL SYLLABLE SSANGSIOS OE RIEULPHIEUPH
+ 0x9C9D: 0xC43B, //HANGUL SYLLABLE SSANGSIOS OE RIEULHIEUH
+ 0x9C9E: 0xC43E, //HANGUL SYLLABLE SSANGSIOS OE PIEUPSIOS
+ 0x9C9F: 0xC43F, //HANGUL SYLLABLE SSANGSIOS OE SIOS
+ 0x9CA0: 0xC440, //HANGUL SYLLABLE SSANGSIOS OE SSANGSIOS
+ 0x9CA1: 0xC441, //HANGUL SYLLABLE SSANGSIOS OE IEUNG
+ 0x9CA2: 0xC442, //HANGUL SYLLABLE SSANGSIOS OE CIEUC
+ 0x9CA3: 0xC443, //HANGUL SYLLABLE SSANGSIOS OE CHIEUCH
+ 0x9CA4: 0xC444, //HANGUL SYLLABLE SSANGSIOS OE KHIEUKH
+ 0x9CA5: 0xC445, //HANGUL SYLLABLE SSANGSIOS OE THIEUTH
+ 0x9CA6: 0xC446, //HANGUL SYLLABLE SSANGSIOS OE PHIEUPH
+ 0x9CA7: 0xC447, //HANGUL SYLLABLE SSANGSIOS OE HIEUH
+ 0x9CA8: 0xC449, //HANGUL SYLLABLE SSANGSIOS YO KIYEOK
+ 0x9CA9: 0xC44A, //HANGUL SYLLABLE SSANGSIOS YO SSANGKIYEOK
+ 0x9CAA: 0xC44B, //HANGUL SYLLABLE SSANGSIOS YO KIYEOKSIOS
+ 0x9CAB: 0xC44C, //HANGUL SYLLABLE SSANGSIOS YO NIEUN
+ 0x9CAC: 0xC44D, //HANGUL SYLLABLE SSANGSIOS YO NIEUNCIEUC
+ 0x9CAD: 0xC44E, //HANGUL SYLLABLE SSANGSIOS YO NIEUNHIEUH
+ 0x9CAE: 0xC44F, //HANGUL SYLLABLE SSANGSIOS YO TIKEUT
+ 0x9CAF: 0xC450, //HANGUL SYLLABLE SSANGSIOS YO RIEUL
+ 0x9CB0: 0xC451, //HANGUL SYLLABLE SSANGSIOS YO RIEULKIYEOK
+ 0x9CB1: 0xC452, //HANGUL SYLLABLE SSANGSIOS YO RIEULMIEUM
+ 0x9CB2: 0xC453, //HANGUL SYLLABLE SSANGSIOS YO RIEULPIEUP
+ 0x9CB3: 0xC454, //HANGUL SYLLABLE SSANGSIOS YO RIEULSIOS
+ 0x9CB4: 0xC455, //HANGUL SYLLABLE SSANGSIOS YO RIEULTHIEUTH
+ 0x9CB5: 0xC456, //HANGUL SYLLABLE SSANGSIOS YO RIEULPHIEUPH
+ 0x9CB6: 0xC457, //HANGUL SYLLABLE SSANGSIOS YO RIEULHIEUH
+ 0x9CB7: 0xC458, //HANGUL SYLLABLE SSANGSIOS YO MIEUM
+ 0x9CB8: 0xC459, //HANGUL SYLLABLE SSANGSIOS YO PIEUP
+ 0x9CB9: 0xC45A, //HANGUL SYLLABLE SSANGSIOS YO PIEUPSIOS
+ 0x9CBA: 0xC45B, //HANGUL SYLLABLE SSANGSIOS YO SIOS
+ 0x9CBB: 0xC45C, //HANGUL SYLLABLE SSANGSIOS YO SSANGSIOS
+ 0x9CBC: 0xC45D, //HANGUL SYLLABLE SSANGSIOS YO IEUNG
+ 0x9CBD: 0xC45E, //HANGUL SYLLABLE SSANGSIOS YO CIEUC
+ 0x9CBE: 0xC45F, //HANGUL SYLLABLE SSANGSIOS YO CHIEUCH
+ 0x9CBF: 0xC460, //HANGUL SYLLABLE SSANGSIOS YO KHIEUKH
+ 0x9CC0: 0xC461, //HANGUL SYLLABLE SSANGSIOS YO THIEUTH
+ 0x9CC1: 0xC462, //HANGUL SYLLABLE SSANGSIOS YO PHIEUPH
+ 0x9CC2: 0xC463, //HANGUL SYLLABLE SSANGSIOS YO HIEUH
+ 0x9CC3: 0xC466, //HANGUL SYLLABLE SSANGSIOS U SSANGKIYEOK
+ 0x9CC4: 0xC467, //HANGUL SYLLABLE SSANGSIOS U KIYEOKSIOS
+ 0x9CC5: 0xC469, //HANGUL SYLLABLE SSANGSIOS U NIEUNCIEUC
+ 0x9CC6: 0xC46A, //HANGUL SYLLABLE SSANGSIOS U NIEUNHIEUH
+ 0x9CC7: 0xC46B, //HANGUL SYLLABLE SSANGSIOS U TIKEUT
+ 0x9CC8: 0xC46D, //HANGUL SYLLABLE SSANGSIOS U RIEULKIYEOK
+ 0x9CC9: 0xC46E, //HANGUL SYLLABLE SSANGSIOS U RIEULMIEUM
+ 0x9CCA: 0xC46F, //HANGUL SYLLABLE SSANGSIOS U RIEULPIEUP
+ 0x9CCB: 0xC470, //HANGUL SYLLABLE SSANGSIOS U RIEULSIOS
+ 0x9CCC: 0xC471, //HANGUL SYLLABLE SSANGSIOS U RIEULTHIEUTH
+ 0x9CCD: 0xC472, //HANGUL SYLLABLE SSANGSIOS U RIEULPHIEUPH
+ 0x9CCE: 0xC473, //HANGUL SYLLABLE SSANGSIOS U RIEULHIEUH
+ 0x9CCF: 0xC476, //HANGUL SYLLABLE SSANGSIOS U PIEUPSIOS
+ 0x9CD0: 0xC477, //HANGUL SYLLABLE SSANGSIOS U SIOS
+ 0x9CD1: 0xC478, //HANGUL SYLLABLE SSANGSIOS U SSANGSIOS
+ 0x9CD2: 0xC47A, //HANGUL SYLLABLE SSANGSIOS U CIEUC
+ 0x9CD3: 0xC47B, //HANGUL SYLLABLE SSANGSIOS U CHIEUCH
+ 0x9CD4: 0xC47C, //HANGUL SYLLABLE SSANGSIOS U KHIEUKH
+ 0x9CD5: 0xC47D, //HANGUL SYLLABLE SSANGSIOS U THIEUTH
+ 0x9CD6: 0xC47E, //HANGUL SYLLABLE SSANGSIOS U PHIEUPH
+ 0x9CD7: 0xC47F, //HANGUL SYLLABLE SSANGSIOS U HIEUH
+ 0x9CD8: 0xC481, //HANGUL SYLLABLE SSANGSIOS WEO KIYEOK
+ 0x9CD9: 0xC482, //HANGUL SYLLABLE SSANGSIOS WEO SSANGKIYEOK
+ 0x9CDA: 0xC483, //HANGUL SYLLABLE SSANGSIOS WEO KIYEOKSIOS
+ 0x9CDB: 0xC484, //HANGUL SYLLABLE SSANGSIOS WEO NIEUN
+ 0x9CDC: 0xC485, //HANGUL SYLLABLE SSANGSIOS WEO NIEUNCIEUC
+ 0x9CDD: 0xC486, //HANGUL SYLLABLE SSANGSIOS WEO NIEUNHIEUH
+ 0x9CDE: 0xC487, //HANGUL SYLLABLE SSANGSIOS WEO TIKEUT
+ 0x9CDF: 0xC488, //HANGUL SYLLABLE SSANGSIOS WEO RIEUL
+ 0x9CE0: 0xC489, //HANGUL SYLLABLE SSANGSIOS WEO RIEULKIYEOK
+ 0x9CE1: 0xC48A, //HANGUL SYLLABLE SSANGSIOS WEO RIEULMIEUM
+ 0x9CE2: 0xC48B, //HANGUL SYLLABLE SSANGSIOS WEO RIEULPIEUP
+ 0x9CE3: 0xC48C, //HANGUL SYLLABLE SSANGSIOS WEO RIEULSIOS
+ 0x9CE4: 0xC48D, //HANGUL SYLLABLE SSANGSIOS WEO RIEULTHIEUTH
+ 0x9CE5: 0xC48E, //HANGUL SYLLABLE SSANGSIOS WEO RIEULPHIEUPH
+ 0x9CE6: 0xC48F, //HANGUL SYLLABLE SSANGSIOS WEO RIEULHIEUH
+ 0x9CE7: 0xC490, //HANGUL SYLLABLE SSANGSIOS WEO MIEUM
+ 0x9CE8: 0xC491, //HANGUL SYLLABLE SSANGSIOS WEO PIEUP
+ 0x9CE9: 0xC492, //HANGUL SYLLABLE SSANGSIOS WEO PIEUPSIOS
+ 0x9CEA: 0xC493, //HANGUL SYLLABLE SSANGSIOS WEO SIOS
+ 0x9CEB: 0xC495, //HANGUL SYLLABLE SSANGSIOS WEO IEUNG
+ 0x9CEC: 0xC496, //HANGUL SYLLABLE SSANGSIOS WEO CIEUC
+ 0x9CED: 0xC497, //HANGUL SYLLABLE SSANGSIOS WEO CHIEUCH
+ 0x9CEE: 0xC498, //HANGUL SYLLABLE SSANGSIOS WEO KHIEUKH
+ 0x9CEF: 0xC499, //HANGUL SYLLABLE SSANGSIOS WEO THIEUTH
+ 0x9CF0: 0xC49A, //HANGUL SYLLABLE SSANGSIOS WEO PHIEUPH
+ 0x9CF1: 0xC49B, //HANGUL SYLLABLE SSANGSIOS WEO HIEUH
+ 0x9CF2: 0xC49D, //HANGUL SYLLABLE SSANGSIOS WE KIYEOK
+ 0x9CF3: 0xC49E, //HANGUL SYLLABLE SSANGSIOS WE SSANGKIYEOK
+ 0x9CF4: 0xC49F, //HANGUL SYLLABLE SSANGSIOS WE KIYEOKSIOS
+ 0x9CF5: 0xC4A0, //HANGUL SYLLABLE SSANGSIOS WE NIEUN
+ 0x9CF6: 0xC4A1, //HANGUL SYLLABLE SSANGSIOS WE NIEUNCIEUC
+ 0x9CF7: 0xC4A2, //HANGUL SYLLABLE SSANGSIOS WE NIEUNHIEUH
+ 0x9CF8: 0xC4A3, //HANGUL SYLLABLE SSANGSIOS WE TIKEUT
+ 0x9CF9: 0xC4A4, //HANGUL SYLLABLE SSANGSIOS WE RIEUL
+ 0x9CFA: 0xC4A5, //HANGUL SYLLABLE SSANGSIOS WE RIEULKIYEOK
+ 0x9CFB: 0xC4A6, //HANGUL SYLLABLE SSANGSIOS WE RIEULMIEUM
+ 0x9CFC: 0xC4A7, //HANGUL SYLLABLE SSANGSIOS WE RIEULPIEUP
+ 0x9CFD: 0xC4A8, //HANGUL SYLLABLE SSANGSIOS WE RIEULSIOS
+ 0x9CFE: 0xC4A9, //HANGUL SYLLABLE SSANGSIOS WE RIEULTHIEUTH
+ 0x9D41: 0xC4AA, //HANGUL SYLLABLE SSANGSIOS WE RIEULPHIEUPH
+ 0x9D42: 0xC4AB, //HANGUL SYLLABLE SSANGSIOS WE RIEULHIEUH
+ 0x9D43: 0xC4AC, //HANGUL SYLLABLE SSANGSIOS WE MIEUM
+ 0x9D44: 0xC4AD, //HANGUL SYLLABLE SSANGSIOS WE PIEUP
+ 0x9D45: 0xC4AE, //HANGUL SYLLABLE SSANGSIOS WE PIEUPSIOS
+ 0x9D46: 0xC4AF, //HANGUL SYLLABLE SSANGSIOS WE SIOS
+ 0x9D47: 0xC4B0, //HANGUL SYLLABLE SSANGSIOS WE SSANGSIOS
+ 0x9D48: 0xC4B1, //HANGUL SYLLABLE SSANGSIOS WE IEUNG
+ 0x9D49: 0xC4B2, //HANGUL SYLLABLE SSANGSIOS WE CIEUC
+ 0x9D4A: 0xC4B3, //HANGUL SYLLABLE SSANGSIOS WE CHIEUCH
+ 0x9D4B: 0xC4B4, //HANGUL SYLLABLE SSANGSIOS WE KHIEUKH
+ 0x9D4C: 0xC4B5, //HANGUL SYLLABLE SSANGSIOS WE THIEUTH
+ 0x9D4D: 0xC4B6, //HANGUL SYLLABLE SSANGSIOS WE PHIEUPH
+ 0x9D4E: 0xC4B7, //HANGUL SYLLABLE SSANGSIOS WE HIEUH
+ 0x9D4F: 0xC4B9, //HANGUL SYLLABLE SSANGSIOS WI KIYEOK
+ 0x9D50: 0xC4BA, //HANGUL SYLLABLE SSANGSIOS WI SSANGKIYEOK
+ 0x9D51: 0xC4BB, //HANGUL SYLLABLE SSANGSIOS WI KIYEOKSIOS
+ 0x9D52: 0xC4BD, //HANGUL SYLLABLE SSANGSIOS WI NIEUNCIEUC
+ 0x9D53: 0xC4BE, //HANGUL SYLLABLE SSANGSIOS WI NIEUNHIEUH
+ 0x9D54: 0xC4BF, //HANGUL SYLLABLE SSANGSIOS WI TIKEUT
+ 0x9D55: 0xC4C0, //HANGUL SYLLABLE SSANGSIOS WI RIEUL
+ 0x9D56: 0xC4C1, //HANGUL SYLLABLE SSANGSIOS WI RIEULKIYEOK
+ 0x9D57: 0xC4C2, //HANGUL SYLLABLE SSANGSIOS WI RIEULMIEUM
+ 0x9D58: 0xC4C3, //HANGUL SYLLABLE SSANGSIOS WI RIEULPIEUP
+ 0x9D59: 0xC4C4, //HANGUL SYLLABLE SSANGSIOS WI RIEULSIOS
+ 0x9D5A: 0xC4C5, //HANGUL SYLLABLE SSANGSIOS WI RIEULTHIEUTH
+ 0x9D61: 0xC4C6, //HANGUL SYLLABLE SSANGSIOS WI RIEULPHIEUPH
+ 0x9D62: 0xC4C7, //HANGUL SYLLABLE SSANGSIOS WI RIEULHIEUH
+ 0x9D63: 0xC4C8, //HANGUL SYLLABLE SSANGSIOS WI MIEUM
+ 0x9D64: 0xC4C9, //HANGUL SYLLABLE SSANGSIOS WI PIEUP
+ 0x9D65: 0xC4CA, //HANGUL SYLLABLE SSANGSIOS WI PIEUPSIOS
+ 0x9D66: 0xC4CB, //HANGUL SYLLABLE SSANGSIOS WI SIOS
+ 0x9D67: 0xC4CC, //HANGUL SYLLABLE SSANGSIOS WI SSANGSIOS
+ 0x9D68: 0xC4CD, //HANGUL SYLLABLE SSANGSIOS WI IEUNG
+ 0x9D69: 0xC4CE, //HANGUL SYLLABLE SSANGSIOS WI CIEUC
+ 0x9D6A: 0xC4CF, //HANGUL SYLLABLE SSANGSIOS WI CHIEUCH
+ 0x9D6B: 0xC4D0, //HANGUL SYLLABLE SSANGSIOS WI KHIEUKH
+ 0x9D6C: 0xC4D1, //HANGUL SYLLABLE SSANGSIOS WI THIEUTH
+ 0x9D6D: 0xC4D2, //HANGUL SYLLABLE SSANGSIOS WI PHIEUPH
+ 0x9D6E: 0xC4D3, //HANGUL SYLLABLE SSANGSIOS WI HIEUH
+ 0x9D6F: 0xC4D4, //HANGUL SYLLABLE SSANGSIOS YU
+ 0x9D70: 0xC4D5, //HANGUL SYLLABLE SSANGSIOS YU KIYEOK
+ 0x9D71: 0xC4D6, //HANGUL SYLLABLE SSANGSIOS YU SSANGKIYEOK
+ 0x9D72: 0xC4D7, //HANGUL SYLLABLE SSANGSIOS YU KIYEOKSIOS
+ 0x9D73: 0xC4D8, //HANGUL SYLLABLE SSANGSIOS YU NIEUN
+ 0x9D74: 0xC4D9, //HANGUL SYLLABLE SSANGSIOS YU NIEUNCIEUC
+ 0x9D75: 0xC4DA, //HANGUL SYLLABLE SSANGSIOS YU NIEUNHIEUH
+ 0x9D76: 0xC4DB, //HANGUL SYLLABLE SSANGSIOS YU TIKEUT
+ 0x9D77: 0xC4DC, //HANGUL SYLLABLE SSANGSIOS YU RIEUL
+ 0x9D78: 0xC4DD, //HANGUL SYLLABLE SSANGSIOS YU RIEULKIYEOK
+ 0x9D79: 0xC4DE, //HANGUL SYLLABLE SSANGSIOS YU RIEULMIEUM
+ 0x9D7A: 0xC4DF, //HANGUL SYLLABLE SSANGSIOS YU RIEULPIEUP
+ 0x9D81: 0xC4E0, //HANGUL SYLLABLE SSANGSIOS YU RIEULSIOS
+ 0x9D82: 0xC4E1, //HANGUL SYLLABLE SSANGSIOS YU RIEULTHIEUTH
+ 0x9D83: 0xC4E2, //HANGUL SYLLABLE SSANGSIOS YU RIEULPHIEUPH
+ 0x9D84: 0xC4E3, //HANGUL SYLLABLE SSANGSIOS YU RIEULHIEUH
+ 0x9D85: 0xC4E4, //HANGUL SYLLABLE SSANGSIOS YU MIEUM
+ 0x9D86: 0xC4E5, //HANGUL SYLLABLE SSANGSIOS YU PIEUP
+ 0x9D87: 0xC4E6, //HANGUL SYLLABLE SSANGSIOS YU PIEUPSIOS
+ 0x9D88: 0xC4E7, //HANGUL SYLLABLE SSANGSIOS YU SIOS
+ 0x9D89: 0xC4E8, //HANGUL SYLLABLE SSANGSIOS YU SSANGSIOS
+ 0x9D8A: 0xC4EA, //HANGUL SYLLABLE SSANGSIOS YU CIEUC
+ 0x9D8B: 0xC4EB, //HANGUL SYLLABLE SSANGSIOS YU CHIEUCH
+ 0x9D8C: 0xC4EC, //HANGUL SYLLABLE SSANGSIOS YU KHIEUKH
+ 0x9D8D: 0xC4ED, //HANGUL SYLLABLE SSANGSIOS YU THIEUTH
+ 0x9D8E: 0xC4EE, //HANGUL SYLLABLE SSANGSIOS YU PHIEUPH
+ 0x9D8F: 0xC4EF, //HANGUL SYLLABLE SSANGSIOS YU HIEUH
+ 0x9D90: 0xC4F2, //HANGUL SYLLABLE SSANGSIOS EU SSANGKIYEOK
+ 0x9D91: 0xC4F3, //HANGUL SYLLABLE SSANGSIOS EU KIYEOKSIOS
+ 0x9D92: 0xC4F5, //HANGUL SYLLABLE SSANGSIOS EU NIEUNCIEUC
+ 0x9D93: 0xC4F6, //HANGUL SYLLABLE SSANGSIOS EU NIEUNHIEUH
+ 0x9D94: 0xC4F7, //HANGUL SYLLABLE SSANGSIOS EU TIKEUT
+ 0x9D95: 0xC4F9, //HANGUL SYLLABLE SSANGSIOS EU RIEULKIYEOK
+ 0x9D96: 0xC4FB, //HANGUL SYLLABLE SSANGSIOS EU RIEULPIEUP
+ 0x9D97: 0xC4FC, //HANGUL SYLLABLE SSANGSIOS EU RIEULSIOS
+ 0x9D98: 0xC4FD, //HANGUL SYLLABLE SSANGSIOS EU RIEULTHIEUTH
+ 0x9D99: 0xC4FE, //HANGUL SYLLABLE SSANGSIOS EU RIEULPHIEUPH
+ 0x9D9A: 0xC502, //HANGUL SYLLABLE SSANGSIOS EU PIEUPSIOS
+ 0x9D9B: 0xC503, //HANGUL SYLLABLE SSANGSIOS EU SIOS
+ 0x9D9C: 0xC504, //HANGUL SYLLABLE SSANGSIOS EU SSANGSIOS
+ 0x9D9D: 0xC505, //HANGUL SYLLABLE SSANGSIOS EU IEUNG
+ 0x9D9E: 0xC506, //HANGUL SYLLABLE SSANGSIOS EU CIEUC
+ 0x9D9F: 0xC507, //HANGUL SYLLABLE SSANGSIOS EU CHIEUCH
+ 0x9DA0: 0xC508, //HANGUL SYLLABLE SSANGSIOS EU KHIEUKH
+ 0x9DA1: 0xC509, //HANGUL SYLLABLE SSANGSIOS EU THIEUTH
+ 0x9DA2: 0xC50A, //HANGUL SYLLABLE SSANGSIOS EU PHIEUPH
+ 0x9DA3: 0xC50B, //HANGUL SYLLABLE SSANGSIOS EU HIEUH
+ 0x9DA4: 0xC50D, //HANGUL SYLLABLE SSANGSIOS YI KIYEOK
+ 0x9DA5: 0xC50E, //HANGUL SYLLABLE SSANGSIOS YI SSANGKIYEOK
+ 0x9DA6: 0xC50F, //HANGUL SYLLABLE SSANGSIOS YI KIYEOKSIOS
+ 0x9DA7: 0xC511, //HANGUL SYLLABLE SSANGSIOS YI NIEUNCIEUC
+ 0x9DA8: 0xC512, //HANGUL SYLLABLE SSANGSIOS YI NIEUNHIEUH
+ 0x9DA9: 0xC513, //HANGUL SYLLABLE SSANGSIOS YI TIKEUT
+ 0x9DAA: 0xC515, //HANGUL SYLLABLE SSANGSIOS YI RIEULKIYEOK
+ 0x9DAB: 0xC516, //HANGUL SYLLABLE SSANGSIOS YI RIEULMIEUM
+ 0x9DAC: 0xC517, //HANGUL SYLLABLE SSANGSIOS YI RIEULPIEUP
+ 0x9DAD: 0xC518, //HANGUL SYLLABLE SSANGSIOS YI RIEULSIOS
+ 0x9DAE: 0xC519, //HANGUL SYLLABLE SSANGSIOS YI RIEULTHIEUTH
+ 0x9DAF: 0xC51A, //HANGUL SYLLABLE SSANGSIOS YI RIEULPHIEUPH
+ 0x9DB0: 0xC51B, //HANGUL SYLLABLE SSANGSIOS YI RIEULHIEUH
+ 0x9DB1: 0xC51D, //HANGUL SYLLABLE SSANGSIOS YI PIEUP
+ 0x9DB2: 0xC51E, //HANGUL SYLLABLE SSANGSIOS YI PIEUPSIOS
+ 0x9DB3: 0xC51F, //HANGUL SYLLABLE SSANGSIOS YI SIOS
+ 0x9DB4: 0xC520, //HANGUL SYLLABLE SSANGSIOS YI SSANGSIOS
+ 0x9DB5: 0xC521, //HANGUL SYLLABLE SSANGSIOS YI IEUNG
+ 0x9DB6: 0xC522, //HANGUL SYLLABLE SSANGSIOS YI CIEUC
+ 0x9DB7: 0xC523, //HANGUL SYLLABLE SSANGSIOS YI CHIEUCH
+ 0x9DB8: 0xC524, //HANGUL SYLLABLE SSANGSIOS YI KHIEUKH
+ 0x9DB9: 0xC525, //HANGUL SYLLABLE SSANGSIOS YI THIEUTH
+ 0x9DBA: 0xC526, //HANGUL SYLLABLE SSANGSIOS YI PHIEUPH
+ 0x9DBB: 0xC527, //HANGUL SYLLABLE SSANGSIOS YI HIEUH
+ 0x9DBC: 0xC52A, //HANGUL SYLLABLE SSANGSIOS I SSANGKIYEOK
+ 0x9DBD: 0xC52B, //HANGUL SYLLABLE SSANGSIOS I KIYEOKSIOS
+ 0x9DBE: 0xC52D, //HANGUL SYLLABLE SSANGSIOS I NIEUNCIEUC
+ 0x9DBF: 0xC52E, //HANGUL SYLLABLE SSANGSIOS I NIEUNHIEUH
+ 0x9DC0: 0xC52F, //HANGUL SYLLABLE SSANGSIOS I TIKEUT
+ 0x9DC1: 0xC531, //HANGUL SYLLABLE SSANGSIOS I RIEULKIYEOK
+ 0x9DC2: 0xC532, //HANGUL SYLLABLE SSANGSIOS I RIEULMIEUM
+ 0x9DC3: 0xC533, //HANGUL SYLLABLE SSANGSIOS I RIEULPIEUP
+ 0x9DC4: 0xC534, //HANGUL SYLLABLE SSANGSIOS I RIEULSIOS
+ 0x9DC5: 0xC535, //HANGUL SYLLABLE SSANGSIOS I RIEULTHIEUTH
+ 0x9DC6: 0xC536, //HANGUL SYLLABLE SSANGSIOS I RIEULPHIEUPH
+ 0x9DC7: 0xC537, //HANGUL SYLLABLE SSANGSIOS I RIEULHIEUH
+ 0x9DC8: 0xC53A, //HANGUL SYLLABLE SSANGSIOS I PIEUPSIOS
+ 0x9DC9: 0xC53C, //HANGUL SYLLABLE SSANGSIOS I SSANGSIOS
+ 0x9DCA: 0xC53E, //HANGUL SYLLABLE SSANGSIOS I CIEUC
+ 0x9DCB: 0xC53F, //HANGUL SYLLABLE SSANGSIOS I CHIEUCH
+ 0x9DCC: 0xC540, //HANGUL SYLLABLE SSANGSIOS I KHIEUKH
+ 0x9DCD: 0xC541, //HANGUL SYLLABLE SSANGSIOS I THIEUTH
+ 0x9DCE: 0xC542, //HANGUL SYLLABLE SSANGSIOS I PHIEUPH
+ 0x9DCF: 0xC543, //HANGUL SYLLABLE SSANGSIOS I HIEUH
+ 0x9DD0: 0xC546, //HANGUL SYLLABLE IEUNG A SSANGKIYEOK
+ 0x9DD1: 0xC547, //HANGUL SYLLABLE IEUNG A KIYEOKSIOS
+ 0x9DD2: 0xC54B, //HANGUL SYLLABLE IEUNG A TIKEUT
+ 0x9DD3: 0xC54F, //HANGUL SYLLABLE IEUNG A RIEULPIEUP
+ 0x9DD4: 0xC550, //HANGUL SYLLABLE IEUNG A RIEULSIOS
+ 0x9DD5: 0xC551, //HANGUL SYLLABLE IEUNG A RIEULTHIEUTH
+ 0x9DD6: 0xC552, //HANGUL SYLLABLE IEUNG A RIEULPHIEUPH
+ 0x9DD7: 0xC556, //HANGUL SYLLABLE IEUNG A PIEUPSIOS
+ 0x9DD8: 0xC55A, //HANGUL SYLLABLE IEUNG A CIEUC
+ 0x9DD9: 0xC55B, //HANGUL SYLLABLE IEUNG A CHIEUCH
+ 0x9DDA: 0xC55C, //HANGUL SYLLABLE IEUNG A KHIEUKH
+ 0x9DDB: 0xC55F, //HANGUL SYLLABLE IEUNG A HIEUH
+ 0x9DDC: 0xC562, //HANGUL SYLLABLE IEUNG AE SSANGKIYEOK
+ 0x9DDD: 0xC563, //HANGUL SYLLABLE IEUNG AE KIYEOKSIOS
+ 0x9DDE: 0xC565, //HANGUL SYLLABLE IEUNG AE NIEUNCIEUC
+ 0x9DDF: 0xC566, //HANGUL SYLLABLE IEUNG AE NIEUNHIEUH
+ 0x9DE0: 0xC567, //HANGUL SYLLABLE IEUNG AE TIKEUT
+ 0x9DE1: 0xC569, //HANGUL SYLLABLE IEUNG AE RIEULKIYEOK
+ 0x9DE2: 0xC56A, //HANGUL SYLLABLE IEUNG AE RIEULMIEUM
+ 0x9DE3: 0xC56B, //HANGUL SYLLABLE IEUNG AE RIEULPIEUP
+ 0x9DE4: 0xC56C, //HANGUL SYLLABLE IEUNG AE RIEULSIOS
+ 0x9DE5: 0xC56D, //HANGUL SYLLABLE IEUNG AE RIEULTHIEUTH
+ 0x9DE6: 0xC56E, //HANGUL SYLLABLE IEUNG AE RIEULPHIEUPH
+ 0x9DE7: 0xC56F, //HANGUL SYLLABLE IEUNG AE RIEULHIEUH
+ 0x9DE8: 0xC572, //HANGUL SYLLABLE IEUNG AE PIEUPSIOS
+ 0x9DE9: 0xC576, //HANGUL SYLLABLE IEUNG AE CIEUC
+ 0x9DEA: 0xC577, //HANGUL SYLLABLE IEUNG AE CHIEUCH
+ 0x9DEB: 0xC578, //HANGUL SYLLABLE IEUNG AE KHIEUKH
+ 0x9DEC: 0xC579, //HANGUL SYLLABLE IEUNG AE THIEUTH
+ 0x9DED: 0xC57A, //HANGUL SYLLABLE IEUNG AE PHIEUPH
+ 0x9DEE: 0xC57B, //HANGUL SYLLABLE IEUNG AE HIEUH
+ 0x9DEF: 0xC57E, //HANGUL SYLLABLE IEUNG YA SSANGKIYEOK
+ 0x9DF0: 0xC57F, //HANGUL SYLLABLE IEUNG YA KIYEOKSIOS
+ 0x9DF1: 0xC581, //HANGUL SYLLABLE IEUNG YA NIEUNCIEUC
+ 0x9DF2: 0xC582, //HANGUL SYLLABLE IEUNG YA NIEUNHIEUH
+ 0x9DF3: 0xC583, //HANGUL SYLLABLE IEUNG YA TIKEUT
+ 0x9DF4: 0xC585, //HANGUL SYLLABLE IEUNG YA RIEULKIYEOK
+ 0x9DF5: 0xC586, //HANGUL SYLLABLE IEUNG YA RIEULMIEUM
+ 0x9DF6: 0xC588, //HANGUL SYLLABLE IEUNG YA RIEULSIOS
+ 0x9DF7: 0xC589, //HANGUL SYLLABLE IEUNG YA RIEULTHIEUTH
+ 0x9DF8: 0xC58A, //HANGUL SYLLABLE IEUNG YA RIEULPHIEUPH
+ 0x9DF9: 0xC58B, //HANGUL SYLLABLE IEUNG YA RIEULHIEUH
+ 0x9DFA: 0xC58E, //HANGUL SYLLABLE IEUNG YA PIEUPSIOS
+ 0x9DFB: 0xC590, //HANGUL SYLLABLE IEUNG YA SSANGSIOS
+ 0x9DFC: 0xC592, //HANGUL SYLLABLE IEUNG YA CIEUC
+ 0x9DFD: 0xC593, //HANGUL SYLLABLE IEUNG YA CHIEUCH
+ 0x9DFE: 0xC594, //HANGUL SYLLABLE IEUNG YA KHIEUKH
+ 0x9E41: 0xC596, //HANGUL SYLLABLE IEUNG YA PHIEUPH
+ 0x9E42: 0xC599, //HANGUL SYLLABLE IEUNG YAE KIYEOK
+ 0x9E43: 0xC59A, //HANGUL SYLLABLE IEUNG YAE SSANGKIYEOK
+ 0x9E44: 0xC59B, //HANGUL SYLLABLE IEUNG YAE KIYEOKSIOS
+ 0x9E45: 0xC59D, //HANGUL SYLLABLE IEUNG YAE NIEUNCIEUC
+ 0x9E46: 0xC59E, //HANGUL SYLLABLE IEUNG YAE NIEUNHIEUH
+ 0x9E47: 0xC59F, //HANGUL SYLLABLE IEUNG YAE TIKEUT
+ 0x9E48: 0xC5A1, //HANGUL SYLLABLE IEUNG YAE RIEULKIYEOK
+ 0x9E49: 0xC5A2, //HANGUL SYLLABLE IEUNG YAE RIEULMIEUM
+ 0x9E4A: 0xC5A3, //HANGUL SYLLABLE IEUNG YAE RIEULPIEUP
+ 0x9E4B: 0xC5A4, //HANGUL SYLLABLE IEUNG YAE RIEULSIOS
+ 0x9E4C: 0xC5A5, //HANGUL SYLLABLE IEUNG YAE RIEULTHIEUTH
+ 0x9E4D: 0xC5A6, //HANGUL SYLLABLE IEUNG YAE RIEULPHIEUPH
+ 0x9E4E: 0xC5A7, //HANGUL SYLLABLE IEUNG YAE RIEULHIEUH
+ 0x9E4F: 0xC5A8, //HANGUL SYLLABLE IEUNG YAE MIEUM
+ 0x9E50: 0xC5AA, //HANGUL SYLLABLE IEUNG YAE PIEUPSIOS
+ 0x9E51: 0xC5AB, //HANGUL SYLLABLE IEUNG YAE SIOS
+ 0x9E52: 0xC5AC, //HANGUL SYLLABLE IEUNG YAE SSANGSIOS
+ 0x9E53: 0xC5AD, //HANGUL SYLLABLE IEUNG YAE IEUNG
+ 0x9E54: 0xC5AE, //HANGUL SYLLABLE IEUNG YAE CIEUC
+ 0x9E55: 0xC5AF, //HANGUL SYLLABLE IEUNG YAE CHIEUCH
+ 0x9E56: 0xC5B0, //HANGUL SYLLABLE IEUNG YAE KHIEUKH
+ 0x9E57: 0xC5B1, //HANGUL SYLLABLE IEUNG YAE THIEUTH
+ 0x9E58: 0xC5B2, //HANGUL SYLLABLE IEUNG YAE PHIEUPH
+ 0x9E59: 0xC5B3, //HANGUL SYLLABLE IEUNG YAE HIEUH
+ 0x9E5A: 0xC5B6, //HANGUL SYLLABLE IEUNG EO SSANGKIYEOK
+ 0x9E61: 0xC5B7, //HANGUL SYLLABLE IEUNG EO KIYEOKSIOS
+ 0x9E62: 0xC5BA, //HANGUL SYLLABLE IEUNG EO NIEUNHIEUH
+ 0x9E63: 0xC5BF, //HANGUL SYLLABLE IEUNG EO RIEULPIEUP
+ 0x9E64: 0xC5C0, //HANGUL SYLLABLE IEUNG EO RIEULSIOS
+ 0x9E65: 0xC5C1, //HANGUL SYLLABLE IEUNG EO RIEULTHIEUTH
+ 0x9E66: 0xC5C2, //HANGUL SYLLABLE IEUNG EO RIEULPHIEUPH
+ 0x9E67: 0xC5C3, //HANGUL SYLLABLE IEUNG EO RIEULHIEUH
+ 0x9E68: 0xC5CB, //HANGUL SYLLABLE IEUNG EO CHIEUCH
+ 0x9E69: 0xC5CD, //HANGUL SYLLABLE IEUNG EO THIEUTH
+ 0x9E6A: 0xC5CF, //HANGUL SYLLABLE IEUNG EO HIEUH
+ 0x9E6B: 0xC5D2, //HANGUL SYLLABLE IEUNG E SSANGKIYEOK
+ 0x9E6C: 0xC5D3, //HANGUL SYLLABLE IEUNG E KIYEOKSIOS
+ 0x9E6D: 0xC5D5, //HANGUL SYLLABLE IEUNG E NIEUNCIEUC
+ 0x9E6E: 0xC5D6, //HANGUL SYLLABLE IEUNG E NIEUNHIEUH
+ 0x9E6F: 0xC5D7, //HANGUL SYLLABLE IEUNG E TIKEUT
+ 0x9E70: 0xC5D9, //HANGUL SYLLABLE IEUNG E RIEULKIYEOK
+ 0x9E71: 0xC5DA, //HANGUL SYLLABLE IEUNG E RIEULMIEUM
+ 0x9E72: 0xC5DB, //HANGUL SYLLABLE IEUNG E RIEULPIEUP
+ 0x9E73: 0xC5DC, //HANGUL SYLLABLE IEUNG E RIEULSIOS
+ 0x9E74: 0xC5DD, //HANGUL SYLLABLE IEUNG E RIEULTHIEUTH
+ 0x9E75: 0xC5DE, //HANGUL SYLLABLE IEUNG E RIEULPHIEUPH
+ 0x9E76: 0xC5DF, //HANGUL SYLLABLE IEUNG E RIEULHIEUH
+ 0x9E77: 0xC5E2, //HANGUL SYLLABLE IEUNG E PIEUPSIOS
+ 0x9E78: 0xC5E4, //HANGUL SYLLABLE IEUNG E SSANGSIOS
+ 0x9E79: 0xC5E6, //HANGUL SYLLABLE IEUNG E CIEUC
+ 0x9E7A: 0xC5E7, //HANGUL SYLLABLE IEUNG E CHIEUCH
+ 0x9E81: 0xC5E8, //HANGUL SYLLABLE IEUNG E KHIEUKH
+ 0x9E82: 0xC5E9, //HANGUL SYLLABLE IEUNG E THIEUTH
+ 0x9E83: 0xC5EA, //HANGUL SYLLABLE IEUNG E PHIEUPH
+ 0x9E84: 0xC5EB, //HANGUL SYLLABLE IEUNG E HIEUH
+ 0x9E85: 0xC5EF, //HANGUL SYLLABLE IEUNG YEO KIYEOKSIOS
+ 0x9E86: 0xC5F1, //HANGUL SYLLABLE IEUNG YEO NIEUNCIEUC
+ 0x9E87: 0xC5F2, //HANGUL SYLLABLE IEUNG YEO NIEUNHIEUH
+ 0x9E88: 0xC5F3, //HANGUL SYLLABLE IEUNG YEO TIKEUT
+ 0x9E89: 0xC5F5, //HANGUL SYLLABLE IEUNG YEO RIEULKIYEOK
+ 0x9E8A: 0xC5F8, //HANGUL SYLLABLE IEUNG YEO RIEULSIOS
+ 0x9E8B: 0xC5F9, //HANGUL SYLLABLE IEUNG YEO RIEULTHIEUTH
+ 0x9E8C: 0xC5FA, //HANGUL SYLLABLE IEUNG YEO RIEULPHIEUPH
+ 0x9E8D: 0xC5FB, //HANGUL SYLLABLE IEUNG YEO RIEULHIEUH
+ 0x9E8E: 0xC602, //HANGUL SYLLABLE IEUNG YEO CIEUC
+ 0x9E8F: 0xC603, //HANGUL SYLLABLE IEUNG YEO CHIEUCH
+ 0x9E90: 0xC604, //HANGUL SYLLABLE IEUNG YEO KHIEUKH
+ 0x9E91: 0xC609, //HANGUL SYLLABLE IEUNG YE KIYEOK
+ 0x9E92: 0xC60A, //HANGUL SYLLABLE IEUNG YE SSANGKIYEOK
+ 0x9E93: 0xC60B, //HANGUL SYLLABLE IEUNG YE KIYEOKSIOS
+ 0x9E94: 0xC60D, //HANGUL SYLLABLE IEUNG YE NIEUNCIEUC
+ 0x9E95: 0xC60E, //HANGUL SYLLABLE IEUNG YE NIEUNHIEUH
+ 0x9E96: 0xC60F, //HANGUL SYLLABLE IEUNG YE TIKEUT
+ 0x9E97: 0xC611, //HANGUL SYLLABLE IEUNG YE RIEULKIYEOK
+ 0x9E98: 0xC612, //HANGUL SYLLABLE IEUNG YE RIEULMIEUM
+ 0x9E99: 0xC613, //HANGUL SYLLABLE IEUNG YE RIEULPIEUP
+ 0x9E9A: 0xC614, //HANGUL SYLLABLE IEUNG YE RIEULSIOS
+ 0x9E9B: 0xC615, //HANGUL SYLLABLE IEUNG YE RIEULTHIEUTH
+ 0x9E9C: 0xC616, //HANGUL SYLLABLE IEUNG YE RIEULPHIEUPH
+ 0x9E9D: 0xC617, //HANGUL SYLLABLE IEUNG YE RIEULHIEUH
+ 0x9E9E: 0xC61A, //HANGUL SYLLABLE IEUNG YE PIEUPSIOS
+ 0x9E9F: 0xC61D, //HANGUL SYLLABLE IEUNG YE IEUNG
+ 0x9EA0: 0xC61E, //HANGUL SYLLABLE IEUNG YE CIEUC
+ 0x9EA1: 0xC61F, //HANGUL SYLLABLE IEUNG YE CHIEUCH
+ 0x9EA2: 0xC620, //HANGUL SYLLABLE IEUNG YE KHIEUKH
+ 0x9EA3: 0xC621, //HANGUL SYLLABLE IEUNG YE THIEUTH
+ 0x9EA4: 0xC622, //HANGUL SYLLABLE IEUNG YE PHIEUPH
+ 0x9EA5: 0xC623, //HANGUL SYLLABLE IEUNG YE HIEUH
+ 0x9EA6: 0xC626, //HANGUL SYLLABLE IEUNG O SSANGKIYEOK
+ 0x9EA7: 0xC627, //HANGUL SYLLABLE IEUNG O KIYEOKSIOS
+ 0x9EA8: 0xC629, //HANGUL SYLLABLE IEUNG O NIEUNCIEUC
+ 0x9EA9: 0xC62A, //HANGUL SYLLABLE IEUNG O NIEUNHIEUH
+ 0x9EAA: 0xC62B, //HANGUL SYLLABLE IEUNG O TIKEUT
+ 0x9EAB: 0xC62F, //HANGUL SYLLABLE IEUNG O RIEULPIEUP
+ 0x9EAC: 0xC631, //HANGUL SYLLABLE IEUNG O RIEULTHIEUTH
+ 0x9EAD: 0xC632, //HANGUL SYLLABLE IEUNG O RIEULPHIEUPH
+ 0x9EAE: 0xC636, //HANGUL SYLLABLE IEUNG O PIEUPSIOS
+ 0x9EAF: 0xC638, //HANGUL SYLLABLE IEUNG O SSANGSIOS
+ 0x9EB0: 0xC63A, //HANGUL SYLLABLE IEUNG O CIEUC
+ 0x9EB1: 0xC63C, //HANGUL SYLLABLE IEUNG O KHIEUKH
+ 0x9EB2: 0xC63D, //HANGUL SYLLABLE IEUNG O THIEUTH
+ 0x9EB3: 0xC63E, //HANGUL SYLLABLE IEUNG O PHIEUPH
+ 0x9EB4: 0xC63F, //HANGUL SYLLABLE IEUNG O HIEUH
+ 0x9EB5: 0xC642, //HANGUL SYLLABLE IEUNG WA SSANGKIYEOK
+ 0x9EB6: 0xC643, //HANGUL SYLLABLE IEUNG WA KIYEOKSIOS
+ 0x9EB7: 0xC645, //HANGUL SYLLABLE IEUNG WA NIEUNCIEUC
+ 0x9EB8: 0xC646, //HANGUL SYLLABLE IEUNG WA NIEUNHIEUH
+ 0x9EB9: 0xC647, //HANGUL SYLLABLE IEUNG WA TIKEUT
+ 0x9EBA: 0xC649, //HANGUL SYLLABLE IEUNG WA RIEULKIYEOK
+ 0x9EBB: 0xC64A, //HANGUL SYLLABLE IEUNG WA RIEULMIEUM
+ 0x9EBC: 0xC64B, //HANGUL SYLLABLE IEUNG WA RIEULPIEUP
+ 0x9EBD: 0xC64C, //HANGUL SYLLABLE IEUNG WA RIEULSIOS
+ 0x9EBE: 0xC64D, //HANGUL SYLLABLE IEUNG WA RIEULTHIEUTH
+ 0x9EBF: 0xC64E, //HANGUL SYLLABLE IEUNG WA RIEULPHIEUPH
+ 0x9EC0: 0xC64F, //HANGUL SYLLABLE IEUNG WA RIEULHIEUH
+ 0x9EC1: 0xC652, //HANGUL SYLLABLE IEUNG WA PIEUPSIOS
+ 0x9EC2: 0xC656, //HANGUL SYLLABLE IEUNG WA CIEUC
+ 0x9EC3: 0xC657, //HANGUL SYLLABLE IEUNG WA CHIEUCH
+ 0x9EC4: 0xC658, //HANGUL SYLLABLE IEUNG WA KHIEUKH
+ 0x9EC5: 0xC659, //HANGUL SYLLABLE IEUNG WA THIEUTH
+ 0x9EC6: 0xC65A, //HANGUL SYLLABLE IEUNG WA PHIEUPH
+ 0x9EC7: 0xC65B, //HANGUL SYLLABLE IEUNG WA HIEUH
+ 0x9EC8: 0xC65E, //HANGUL SYLLABLE IEUNG WAE SSANGKIYEOK
+ 0x9EC9: 0xC65F, //HANGUL SYLLABLE IEUNG WAE KIYEOKSIOS
+ 0x9ECA: 0xC661, //HANGUL SYLLABLE IEUNG WAE NIEUNCIEUC
+ 0x9ECB: 0xC662, //HANGUL SYLLABLE IEUNG WAE NIEUNHIEUH
+ 0x9ECC: 0xC663, //HANGUL SYLLABLE IEUNG WAE TIKEUT
+ 0x9ECD: 0xC664, //HANGUL SYLLABLE IEUNG WAE RIEUL
+ 0x9ECE: 0xC665, //HANGUL SYLLABLE IEUNG WAE RIEULKIYEOK
+ 0x9ECF: 0xC666, //HANGUL SYLLABLE IEUNG WAE RIEULMIEUM
+ 0x9ED0: 0xC667, //HANGUL SYLLABLE IEUNG WAE RIEULPIEUP
+ 0x9ED1: 0xC668, //HANGUL SYLLABLE IEUNG WAE RIEULSIOS
+ 0x9ED2: 0xC669, //HANGUL SYLLABLE IEUNG WAE RIEULTHIEUTH
+ 0x9ED3: 0xC66A, //HANGUL SYLLABLE IEUNG WAE RIEULPHIEUPH
+ 0x9ED4: 0xC66B, //HANGUL SYLLABLE IEUNG WAE RIEULHIEUH
+ 0x9ED5: 0xC66D, //HANGUL SYLLABLE IEUNG WAE PIEUP
+ 0x9ED6: 0xC66E, //HANGUL SYLLABLE IEUNG WAE PIEUPSIOS
+ 0x9ED7: 0xC670, //HANGUL SYLLABLE IEUNG WAE SSANGSIOS
+ 0x9ED8: 0xC672, //HANGUL SYLLABLE IEUNG WAE CIEUC
+ 0x9ED9: 0xC673, //HANGUL SYLLABLE IEUNG WAE CHIEUCH
+ 0x9EDA: 0xC674, //HANGUL SYLLABLE IEUNG WAE KHIEUKH
+ 0x9EDB: 0xC675, //HANGUL SYLLABLE IEUNG WAE THIEUTH
+ 0x9EDC: 0xC676, //HANGUL SYLLABLE IEUNG WAE PHIEUPH
+ 0x9EDD: 0xC677, //HANGUL SYLLABLE IEUNG WAE HIEUH
+ 0x9EDE: 0xC67A, //HANGUL SYLLABLE IEUNG OE SSANGKIYEOK
+ 0x9EDF: 0xC67B, //HANGUL SYLLABLE IEUNG OE KIYEOKSIOS
+ 0x9EE0: 0xC67D, //HANGUL SYLLABLE IEUNG OE NIEUNCIEUC
+ 0x9EE1: 0xC67E, //HANGUL SYLLABLE IEUNG OE NIEUNHIEUH
+ 0x9EE2: 0xC67F, //HANGUL SYLLABLE IEUNG OE TIKEUT
+ 0x9EE3: 0xC681, //HANGUL SYLLABLE IEUNG OE RIEULKIYEOK
+ 0x9EE4: 0xC682, //HANGUL SYLLABLE IEUNG OE RIEULMIEUM
+ 0x9EE5: 0xC683, //HANGUL SYLLABLE IEUNG OE RIEULPIEUP
+ 0x9EE6: 0xC684, //HANGUL SYLLABLE IEUNG OE RIEULSIOS
+ 0x9EE7: 0xC685, //HANGUL SYLLABLE IEUNG OE RIEULTHIEUTH
+ 0x9EE8: 0xC686, //HANGUL SYLLABLE IEUNG OE RIEULPHIEUPH
+ 0x9EE9: 0xC687, //HANGUL SYLLABLE IEUNG OE RIEULHIEUH
+ 0x9EEA: 0xC68A, //HANGUL SYLLABLE IEUNG OE PIEUPSIOS
+ 0x9EEB: 0xC68C, //HANGUL SYLLABLE IEUNG OE SSANGSIOS
+ 0x9EEC: 0xC68E, //HANGUL SYLLABLE IEUNG OE CIEUC
+ 0x9EED: 0xC68F, //HANGUL SYLLABLE IEUNG OE CHIEUCH
+ 0x9EEE: 0xC690, //HANGUL SYLLABLE IEUNG OE KHIEUKH
+ 0x9EEF: 0xC691, //HANGUL SYLLABLE IEUNG OE THIEUTH
+ 0x9EF0: 0xC692, //HANGUL SYLLABLE IEUNG OE PHIEUPH
+ 0x9EF1: 0xC693, //HANGUL SYLLABLE IEUNG OE HIEUH
+ 0x9EF2: 0xC696, //HANGUL SYLLABLE IEUNG YO SSANGKIYEOK
+ 0x9EF3: 0xC697, //HANGUL SYLLABLE IEUNG YO KIYEOKSIOS
+ 0x9EF4: 0xC699, //HANGUL SYLLABLE IEUNG YO NIEUNCIEUC
+ 0x9EF5: 0xC69A, //HANGUL SYLLABLE IEUNG YO NIEUNHIEUH
+ 0x9EF6: 0xC69B, //HANGUL SYLLABLE IEUNG YO TIKEUT
+ 0x9EF7: 0xC69D, //HANGUL SYLLABLE IEUNG YO RIEULKIYEOK
+ 0x9EF8: 0xC69E, //HANGUL SYLLABLE IEUNG YO RIEULMIEUM
+ 0x9EF9: 0xC69F, //HANGUL SYLLABLE IEUNG YO RIEULPIEUP
+ 0x9EFA: 0xC6A0, //HANGUL SYLLABLE IEUNG YO RIEULSIOS
+ 0x9EFB: 0xC6A1, //HANGUL SYLLABLE IEUNG YO RIEULTHIEUTH
+ 0x9EFC: 0xC6A2, //HANGUL SYLLABLE IEUNG YO RIEULPHIEUPH
+ 0x9EFD: 0xC6A3, //HANGUL SYLLABLE IEUNG YO RIEULHIEUH
+ 0x9EFE: 0xC6A6, //HANGUL SYLLABLE IEUNG YO PIEUPSIOS
+ 0x9F41: 0xC6A8, //HANGUL SYLLABLE IEUNG YO SSANGSIOS
+ 0x9F42: 0xC6AA, //HANGUL SYLLABLE IEUNG YO CIEUC
+ 0x9F43: 0xC6AB, //HANGUL SYLLABLE IEUNG YO CHIEUCH
+ 0x9F44: 0xC6AC, //HANGUL SYLLABLE IEUNG YO KHIEUKH
+ 0x9F45: 0xC6AD, //HANGUL SYLLABLE IEUNG YO THIEUTH
+ 0x9F46: 0xC6AE, //HANGUL SYLLABLE IEUNG YO PHIEUPH
+ 0x9F47: 0xC6AF, //HANGUL SYLLABLE IEUNG YO HIEUH
+ 0x9F48: 0xC6B2, //HANGUL SYLLABLE IEUNG U SSANGKIYEOK
+ 0x9F49: 0xC6B3, //HANGUL SYLLABLE IEUNG U KIYEOKSIOS
+ 0x9F4A: 0xC6B5, //HANGUL SYLLABLE IEUNG U NIEUNCIEUC
+ 0x9F4B: 0xC6B6, //HANGUL SYLLABLE IEUNG U NIEUNHIEUH
+ 0x9F4C: 0xC6B7, //HANGUL SYLLABLE IEUNG U TIKEUT
+ 0x9F4D: 0xC6BB, //HANGUL SYLLABLE IEUNG U RIEULPIEUP
+ 0x9F4E: 0xC6BC, //HANGUL SYLLABLE IEUNG U RIEULSIOS
+ 0x9F4F: 0xC6BD, //HANGUL SYLLABLE IEUNG U RIEULTHIEUTH
+ 0x9F50: 0xC6BE, //HANGUL SYLLABLE IEUNG U RIEULPHIEUPH
+ 0x9F51: 0xC6BF, //HANGUL SYLLABLE IEUNG U RIEULHIEUH
+ 0x9F52: 0xC6C2, //HANGUL SYLLABLE IEUNG U PIEUPSIOS
+ 0x9F53: 0xC6C4, //HANGUL SYLLABLE IEUNG U SSANGSIOS
+ 0x9F54: 0xC6C6, //HANGUL SYLLABLE IEUNG U CIEUC
+ 0x9F55: 0xC6C7, //HANGUL SYLLABLE IEUNG U CHIEUCH
+ 0x9F56: 0xC6C8, //HANGUL SYLLABLE IEUNG U KHIEUKH
+ 0x9F57: 0xC6C9, //HANGUL SYLLABLE IEUNG U THIEUTH
+ 0x9F58: 0xC6CA, //HANGUL SYLLABLE IEUNG U PHIEUPH
+ 0x9F59: 0xC6CB, //HANGUL SYLLABLE IEUNG U HIEUH
+ 0x9F5A: 0xC6CE, //HANGUL SYLLABLE IEUNG WEO SSANGKIYEOK
+ 0x9F61: 0xC6CF, //HANGUL SYLLABLE IEUNG WEO KIYEOKSIOS
+ 0x9F62: 0xC6D1, //HANGUL SYLLABLE IEUNG WEO NIEUNCIEUC
+ 0x9F63: 0xC6D2, //HANGUL SYLLABLE IEUNG WEO NIEUNHIEUH
+ 0x9F64: 0xC6D3, //HANGUL SYLLABLE IEUNG WEO TIKEUT
+ 0x9F65: 0xC6D5, //HANGUL SYLLABLE IEUNG WEO RIEULKIYEOK
+ 0x9F66: 0xC6D6, //HANGUL SYLLABLE IEUNG WEO RIEULMIEUM
+ 0x9F67: 0xC6D7, //HANGUL SYLLABLE IEUNG WEO RIEULPIEUP
+ 0x9F68: 0xC6D8, //HANGUL SYLLABLE IEUNG WEO RIEULSIOS
+ 0x9F69: 0xC6D9, //HANGUL SYLLABLE IEUNG WEO RIEULTHIEUTH
+ 0x9F6A: 0xC6DA, //HANGUL SYLLABLE IEUNG WEO RIEULPHIEUPH
+ 0x9F6B: 0xC6DB, //HANGUL SYLLABLE IEUNG WEO RIEULHIEUH
+ 0x9F6C: 0xC6DE, //HANGUL SYLLABLE IEUNG WEO PIEUPSIOS
+ 0x9F6D: 0xC6DF, //HANGUL SYLLABLE IEUNG WEO SIOS
+ 0x9F6E: 0xC6E2, //HANGUL SYLLABLE IEUNG WEO CIEUC
+ 0x9F6F: 0xC6E3, //HANGUL SYLLABLE IEUNG WEO CHIEUCH
+ 0x9F70: 0xC6E4, //HANGUL SYLLABLE IEUNG WEO KHIEUKH
+ 0x9F71: 0xC6E5, //HANGUL SYLLABLE IEUNG WEO THIEUTH
+ 0x9F72: 0xC6E6, //HANGUL SYLLABLE IEUNG WEO PHIEUPH
+ 0x9F73: 0xC6E7, //HANGUL SYLLABLE IEUNG WEO HIEUH
+ 0x9F74: 0xC6EA, //HANGUL SYLLABLE IEUNG WE SSANGKIYEOK
+ 0x9F75: 0xC6EB, //HANGUL SYLLABLE IEUNG WE KIYEOKSIOS
+ 0x9F76: 0xC6ED, //HANGUL SYLLABLE IEUNG WE NIEUNCIEUC
+ 0x9F77: 0xC6EE, //HANGUL SYLLABLE IEUNG WE NIEUNHIEUH
+ 0x9F78: 0xC6EF, //HANGUL SYLLABLE IEUNG WE TIKEUT
+ 0x9F79: 0xC6F1, //HANGUL SYLLABLE IEUNG WE RIEULKIYEOK
+ 0x9F7A: 0xC6F2, //HANGUL SYLLABLE IEUNG WE RIEULMIEUM
+ 0x9F81: 0xC6F3, //HANGUL SYLLABLE IEUNG WE RIEULPIEUP
+ 0x9F82: 0xC6F4, //HANGUL SYLLABLE IEUNG WE RIEULSIOS
+ 0x9F83: 0xC6F5, //HANGUL SYLLABLE IEUNG WE RIEULTHIEUTH
+ 0x9F84: 0xC6F6, //HANGUL SYLLABLE IEUNG WE RIEULPHIEUPH
+ 0x9F85: 0xC6F7, //HANGUL SYLLABLE IEUNG WE RIEULHIEUH
+ 0x9F86: 0xC6FA, //HANGUL SYLLABLE IEUNG WE PIEUPSIOS
+ 0x9F87: 0xC6FB, //HANGUL SYLLABLE IEUNG WE SIOS
+ 0x9F88: 0xC6FC, //HANGUL SYLLABLE IEUNG WE SSANGSIOS
+ 0x9F89: 0xC6FE, //HANGUL SYLLABLE IEUNG WE CIEUC
+ 0x9F8A: 0xC6FF, //HANGUL SYLLABLE IEUNG WE CHIEUCH
+ 0x9F8B: 0xC700, //HANGUL SYLLABLE IEUNG WE KHIEUKH
+ 0x9F8C: 0xC701, //HANGUL SYLLABLE IEUNG WE THIEUTH
+ 0x9F8D: 0xC702, //HANGUL SYLLABLE IEUNG WE PHIEUPH
+ 0x9F8E: 0xC703, //HANGUL SYLLABLE IEUNG WE HIEUH
+ 0x9F8F: 0xC706, //HANGUL SYLLABLE IEUNG WI SSANGKIYEOK
+ 0x9F90: 0xC707, //HANGUL SYLLABLE IEUNG WI KIYEOKSIOS
+ 0x9F91: 0xC709, //HANGUL SYLLABLE IEUNG WI NIEUNCIEUC
+ 0x9F92: 0xC70A, //HANGUL SYLLABLE IEUNG WI NIEUNHIEUH
+ 0x9F93: 0xC70B, //HANGUL SYLLABLE IEUNG WI TIKEUT
+ 0x9F94: 0xC70D, //HANGUL SYLLABLE IEUNG WI RIEULKIYEOK
+ 0x9F95: 0xC70E, //HANGUL SYLLABLE IEUNG WI RIEULMIEUM
+ 0x9F96: 0xC70F, //HANGUL SYLLABLE IEUNG WI RIEULPIEUP
+ 0x9F97: 0xC710, //HANGUL SYLLABLE IEUNG WI RIEULSIOS
+ 0x9F98: 0xC711, //HANGUL SYLLABLE IEUNG WI RIEULTHIEUTH
+ 0x9F99: 0xC712, //HANGUL SYLLABLE IEUNG WI RIEULPHIEUPH
+ 0x9F9A: 0xC713, //HANGUL SYLLABLE IEUNG WI RIEULHIEUH
+ 0x9F9B: 0xC716, //HANGUL SYLLABLE IEUNG WI PIEUPSIOS
+ 0x9F9C: 0xC718, //HANGUL SYLLABLE IEUNG WI SSANGSIOS
+ 0x9F9D: 0xC71A, //HANGUL SYLLABLE IEUNG WI CIEUC
+ 0x9F9E: 0xC71B, //HANGUL SYLLABLE IEUNG WI CHIEUCH
+ 0x9F9F: 0xC71C, //HANGUL SYLLABLE IEUNG WI KHIEUKH
+ 0x9FA0: 0xC71D, //HANGUL SYLLABLE IEUNG WI THIEUTH
+ 0x9FA1: 0xC71E, //HANGUL SYLLABLE IEUNG WI PHIEUPH
+ 0x9FA2: 0xC71F, //HANGUL SYLLABLE IEUNG WI HIEUH
+ 0x9FA3: 0xC722, //HANGUL SYLLABLE IEUNG YU SSANGKIYEOK
+ 0x9FA4: 0xC723, //HANGUL SYLLABLE IEUNG YU KIYEOKSIOS
+ 0x9FA5: 0xC725, //HANGUL SYLLABLE IEUNG YU NIEUNCIEUC
+ 0x9FA6: 0xC726, //HANGUL SYLLABLE IEUNG YU NIEUNHIEUH
+ 0x9FA7: 0xC727, //HANGUL SYLLABLE IEUNG YU TIKEUT
+ 0x9FA8: 0xC729, //HANGUL SYLLABLE IEUNG YU RIEULKIYEOK
+ 0x9FA9: 0xC72A, //HANGUL SYLLABLE IEUNG YU RIEULMIEUM
+ 0x9FAA: 0xC72B, //HANGUL SYLLABLE IEUNG YU RIEULPIEUP
+ 0x9FAB: 0xC72C, //HANGUL SYLLABLE IEUNG YU RIEULSIOS
+ 0x9FAC: 0xC72D, //HANGUL SYLLABLE IEUNG YU RIEULTHIEUTH
+ 0x9FAD: 0xC72E, //HANGUL SYLLABLE IEUNG YU RIEULPHIEUPH
+ 0x9FAE: 0xC72F, //HANGUL SYLLABLE IEUNG YU RIEULHIEUH
+ 0x9FAF: 0xC732, //HANGUL SYLLABLE IEUNG YU PIEUPSIOS
+ 0x9FB0: 0xC734, //HANGUL SYLLABLE IEUNG YU SSANGSIOS
+ 0x9FB1: 0xC736, //HANGUL SYLLABLE IEUNG YU CIEUC
+ 0x9FB2: 0xC738, //HANGUL SYLLABLE IEUNG YU KHIEUKH
+ 0x9FB3: 0xC739, //HANGUL SYLLABLE IEUNG YU THIEUTH
+ 0x9FB4: 0xC73A, //HANGUL SYLLABLE IEUNG YU PHIEUPH
+ 0x9FB5: 0xC73B, //HANGUL SYLLABLE IEUNG YU HIEUH
+ 0x9FB6: 0xC73E, //HANGUL SYLLABLE IEUNG EU SSANGKIYEOK
+ 0x9FB7: 0xC73F, //HANGUL SYLLABLE IEUNG EU KIYEOKSIOS
+ 0x9FB8: 0xC741, //HANGUL SYLLABLE IEUNG EU NIEUNCIEUC
+ 0x9FB9: 0xC742, //HANGUL SYLLABLE IEUNG EU NIEUNHIEUH
+ 0x9FBA: 0xC743, //HANGUL SYLLABLE IEUNG EU TIKEUT
+ 0x9FBB: 0xC745, //HANGUL SYLLABLE IEUNG EU RIEULKIYEOK
+ 0x9FBC: 0xC746, //HANGUL SYLLABLE IEUNG EU RIEULMIEUM
+ 0x9FBD: 0xC747, //HANGUL SYLLABLE IEUNG EU RIEULPIEUP
+ 0x9FBE: 0xC748, //HANGUL SYLLABLE IEUNG EU RIEULSIOS
+ 0x9FBF: 0xC749, //HANGUL SYLLABLE IEUNG EU RIEULTHIEUTH
+ 0x9FC0: 0xC74B, //HANGUL SYLLABLE IEUNG EU RIEULHIEUH
+ 0x9FC1: 0xC74E, //HANGUL SYLLABLE IEUNG EU PIEUPSIOS
+ 0x9FC2: 0xC750, //HANGUL SYLLABLE IEUNG EU SSANGSIOS
+ 0x9FC3: 0xC759, //HANGUL SYLLABLE IEUNG YI KIYEOK
+ 0x9FC4: 0xC75A, //HANGUL SYLLABLE IEUNG YI SSANGKIYEOK
+ 0x9FC5: 0xC75B, //HANGUL SYLLABLE IEUNG YI KIYEOKSIOS
+ 0x9FC6: 0xC75D, //HANGUL SYLLABLE IEUNG YI NIEUNCIEUC
+ 0x9FC7: 0xC75E, //HANGUL SYLLABLE IEUNG YI NIEUNHIEUH
+ 0x9FC8: 0xC75F, //HANGUL SYLLABLE IEUNG YI TIKEUT
+ 0x9FC9: 0xC761, //HANGUL SYLLABLE IEUNG YI RIEULKIYEOK
+ 0x9FCA: 0xC762, //HANGUL SYLLABLE IEUNG YI RIEULMIEUM
+ 0x9FCB: 0xC763, //HANGUL SYLLABLE IEUNG YI RIEULPIEUP
+ 0x9FCC: 0xC764, //HANGUL SYLLABLE IEUNG YI RIEULSIOS
+ 0x9FCD: 0xC765, //HANGUL SYLLABLE IEUNG YI RIEULTHIEUTH
+ 0x9FCE: 0xC766, //HANGUL SYLLABLE IEUNG YI RIEULPHIEUPH
+ 0x9FCF: 0xC767, //HANGUL SYLLABLE IEUNG YI RIEULHIEUH
+ 0x9FD0: 0xC769, //HANGUL SYLLABLE IEUNG YI PIEUP
+ 0x9FD1: 0xC76A, //HANGUL SYLLABLE IEUNG YI PIEUPSIOS
+ 0x9FD2: 0xC76C, //HANGUL SYLLABLE IEUNG YI SSANGSIOS
+ 0x9FD3: 0xC76D, //HANGUL SYLLABLE IEUNG YI IEUNG
+ 0x9FD4: 0xC76E, //HANGUL SYLLABLE IEUNG YI CIEUC
+ 0x9FD5: 0xC76F, //HANGUL SYLLABLE IEUNG YI CHIEUCH
+ 0x9FD6: 0xC770, //HANGUL SYLLABLE IEUNG YI KHIEUKH
+ 0x9FD7: 0xC771, //HANGUL SYLLABLE IEUNG YI THIEUTH
+ 0x9FD8: 0xC772, //HANGUL SYLLABLE IEUNG YI PHIEUPH
+ 0x9FD9: 0xC773, //HANGUL SYLLABLE IEUNG YI HIEUH
+ 0x9FDA: 0xC776, //HANGUL SYLLABLE IEUNG I SSANGKIYEOK
+ 0x9FDB: 0xC777, //HANGUL SYLLABLE IEUNG I KIYEOKSIOS
+ 0x9FDC: 0xC779, //HANGUL SYLLABLE IEUNG I NIEUNCIEUC
+ 0x9FDD: 0xC77A, //HANGUL SYLLABLE IEUNG I NIEUNHIEUH
+ 0x9FDE: 0xC77B, //HANGUL SYLLABLE IEUNG I TIKEUT
+ 0x9FDF: 0xC77F, //HANGUL SYLLABLE IEUNG I RIEULPIEUP
+ 0x9FE0: 0xC780, //HANGUL SYLLABLE IEUNG I RIEULSIOS
+ 0x9FE1: 0xC781, //HANGUL SYLLABLE IEUNG I RIEULTHIEUTH
+ 0x9FE2: 0xC782, //HANGUL SYLLABLE IEUNG I RIEULPHIEUPH
+ 0x9FE3: 0xC786, //HANGUL SYLLABLE IEUNG I PIEUPSIOS
+ 0x9FE4: 0xC78B, //HANGUL SYLLABLE IEUNG I CHIEUCH
+ 0x9FE5: 0xC78C, //HANGUL SYLLABLE IEUNG I KHIEUKH
+ 0x9FE6: 0xC78D, //HANGUL SYLLABLE IEUNG I THIEUTH
+ 0x9FE7: 0xC78F, //HANGUL SYLLABLE IEUNG I HIEUH
+ 0x9FE8: 0xC792, //HANGUL SYLLABLE CIEUC A SSANGKIYEOK
+ 0x9FE9: 0xC793, //HANGUL SYLLABLE CIEUC A KIYEOKSIOS
+ 0x9FEA: 0xC795, //HANGUL SYLLABLE CIEUC A NIEUNCIEUC
+ 0x9FEB: 0xC799, //HANGUL SYLLABLE CIEUC A RIEULKIYEOK
+ 0x9FEC: 0xC79B, //HANGUL SYLLABLE CIEUC A RIEULPIEUP
+ 0x9FED: 0xC79C, //HANGUL SYLLABLE CIEUC A RIEULSIOS
+ 0x9FEE: 0xC79D, //HANGUL SYLLABLE CIEUC A RIEULTHIEUTH
+ 0x9FEF: 0xC79E, //HANGUL SYLLABLE CIEUC A RIEULPHIEUPH
+ 0x9FF0: 0xC79F, //HANGUL SYLLABLE CIEUC A RIEULHIEUH
+ 0x9FF1: 0xC7A2, //HANGUL SYLLABLE CIEUC A PIEUPSIOS
+ 0x9FF2: 0xC7A7, //HANGUL SYLLABLE CIEUC A CHIEUCH
+ 0x9FF3: 0xC7A8, //HANGUL SYLLABLE CIEUC A KHIEUKH
+ 0x9FF4: 0xC7A9, //HANGUL SYLLABLE CIEUC A THIEUTH
+ 0x9FF5: 0xC7AA, //HANGUL SYLLABLE CIEUC A PHIEUPH
+ 0x9FF6: 0xC7AB, //HANGUL SYLLABLE CIEUC A HIEUH
+ 0x9FF7: 0xC7AE, //HANGUL SYLLABLE CIEUC AE SSANGKIYEOK
+ 0x9FF8: 0xC7AF, //HANGUL SYLLABLE CIEUC AE KIYEOKSIOS
+ 0x9FF9: 0xC7B1, //HANGUL SYLLABLE CIEUC AE NIEUNCIEUC
+ 0x9FFA: 0xC7B2, //HANGUL SYLLABLE CIEUC AE NIEUNHIEUH
+ 0x9FFB: 0xC7B3, //HANGUL SYLLABLE CIEUC AE TIKEUT
+ 0x9FFC: 0xC7B5, //HANGUL SYLLABLE CIEUC AE RIEULKIYEOK
+ 0x9FFD: 0xC7B6, //HANGUL SYLLABLE CIEUC AE RIEULMIEUM
+ 0x9FFE: 0xC7B7, //HANGUL SYLLABLE CIEUC AE RIEULPIEUP
+ 0xA041: 0xC7B8, //HANGUL SYLLABLE CIEUC AE RIEULSIOS
+ 0xA042: 0xC7B9, //HANGUL SYLLABLE CIEUC AE RIEULTHIEUTH
+ 0xA043: 0xC7BA, //HANGUL SYLLABLE CIEUC AE RIEULPHIEUPH
+ 0xA044: 0xC7BB, //HANGUL SYLLABLE CIEUC AE RIEULHIEUH
+ 0xA045: 0xC7BE, //HANGUL SYLLABLE CIEUC AE PIEUPSIOS
+ 0xA046: 0xC7C2, //HANGUL SYLLABLE CIEUC AE CIEUC
+ 0xA047: 0xC7C3, //HANGUL SYLLABLE CIEUC AE CHIEUCH
+ 0xA048: 0xC7C4, //HANGUL SYLLABLE CIEUC AE KHIEUKH
+ 0xA049: 0xC7C5, //HANGUL SYLLABLE CIEUC AE THIEUTH
+ 0xA04A: 0xC7C6, //HANGUL SYLLABLE CIEUC AE PHIEUPH
+ 0xA04B: 0xC7C7, //HANGUL SYLLABLE CIEUC AE HIEUH
+ 0xA04C: 0xC7CA, //HANGUL SYLLABLE CIEUC YA SSANGKIYEOK
+ 0xA04D: 0xC7CB, //HANGUL SYLLABLE CIEUC YA KIYEOKSIOS
+ 0xA04E: 0xC7CD, //HANGUL SYLLABLE CIEUC YA NIEUNCIEUC
+ 0xA04F: 0xC7CF, //HANGUL SYLLABLE CIEUC YA TIKEUT
+ 0xA050: 0xC7D1, //HANGUL SYLLABLE CIEUC YA RIEULKIYEOK
+ 0xA051: 0xC7D2, //HANGUL SYLLABLE CIEUC YA RIEULMIEUM
+ 0xA052: 0xC7D3, //HANGUL SYLLABLE CIEUC YA RIEULPIEUP
+ 0xA053: 0xC7D4, //HANGUL SYLLABLE CIEUC YA RIEULSIOS
+ 0xA054: 0xC7D5, //HANGUL SYLLABLE CIEUC YA RIEULTHIEUTH
+ 0xA055: 0xC7D6, //HANGUL SYLLABLE CIEUC YA RIEULPHIEUPH
+ 0xA056: 0xC7D7, //HANGUL SYLLABLE CIEUC YA RIEULHIEUH
+ 0xA057: 0xC7D9, //HANGUL SYLLABLE CIEUC YA PIEUP
+ 0xA058: 0xC7DA, //HANGUL SYLLABLE CIEUC YA PIEUPSIOS
+ 0xA059: 0xC7DB, //HANGUL SYLLABLE CIEUC YA SIOS
+ 0xA05A: 0xC7DC, //HANGUL SYLLABLE CIEUC YA SSANGSIOS
+ 0xA061: 0xC7DE, //HANGUL SYLLABLE CIEUC YA CIEUC
+ 0xA062: 0xC7DF, //HANGUL SYLLABLE CIEUC YA CHIEUCH
+ 0xA063: 0xC7E0, //HANGUL SYLLABLE CIEUC YA KHIEUKH
+ 0xA064: 0xC7E1, //HANGUL SYLLABLE CIEUC YA THIEUTH
+ 0xA065: 0xC7E2, //HANGUL SYLLABLE CIEUC YA PHIEUPH
+ 0xA066: 0xC7E3, //HANGUL SYLLABLE CIEUC YA HIEUH
+ 0xA067: 0xC7E5, //HANGUL SYLLABLE CIEUC YAE KIYEOK
+ 0xA068: 0xC7E6, //HANGUL SYLLABLE CIEUC YAE SSANGKIYEOK
+ 0xA069: 0xC7E7, //HANGUL SYLLABLE CIEUC YAE KIYEOKSIOS
+ 0xA06A: 0xC7E9, //HANGUL SYLLABLE CIEUC YAE NIEUNCIEUC
+ 0xA06B: 0xC7EA, //HANGUL SYLLABLE CIEUC YAE NIEUNHIEUH
+ 0xA06C: 0xC7EB, //HANGUL SYLLABLE CIEUC YAE TIKEUT
+ 0xA06D: 0xC7ED, //HANGUL SYLLABLE CIEUC YAE RIEULKIYEOK
+ 0xA06E: 0xC7EE, //HANGUL SYLLABLE CIEUC YAE RIEULMIEUM
+ 0xA06F: 0xC7EF, //HANGUL SYLLABLE CIEUC YAE RIEULPIEUP
+ 0xA070: 0xC7F0, //HANGUL SYLLABLE CIEUC YAE RIEULSIOS
+ 0xA071: 0xC7F1, //HANGUL SYLLABLE CIEUC YAE RIEULTHIEUTH
+ 0xA072: 0xC7F2, //HANGUL SYLLABLE CIEUC YAE RIEULPHIEUPH
+ 0xA073: 0xC7F3, //HANGUL SYLLABLE CIEUC YAE RIEULHIEUH
+ 0xA074: 0xC7F4, //HANGUL SYLLABLE CIEUC YAE MIEUM
+ 0xA075: 0xC7F5, //HANGUL SYLLABLE CIEUC YAE PIEUP
+ 0xA076: 0xC7F6, //HANGUL SYLLABLE CIEUC YAE PIEUPSIOS
+ 0xA077: 0xC7F7, //HANGUL SYLLABLE CIEUC YAE SIOS
+ 0xA078: 0xC7F8, //HANGUL SYLLABLE CIEUC YAE SSANGSIOS
+ 0xA079: 0xC7F9, //HANGUL SYLLABLE CIEUC YAE IEUNG
+ 0xA07A: 0xC7FA, //HANGUL SYLLABLE CIEUC YAE CIEUC
+ 0xA081: 0xC7FB, //HANGUL SYLLABLE CIEUC YAE CHIEUCH
+ 0xA082: 0xC7FC, //HANGUL SYLLABLE CIEUC YAE KHIEUKH
+ 0xA083: 0xC7FD, //HANGUL SYLLABLE CIEUC YAE THIEUTH
+ 0xA084: 0xC7FE, //HANGUL SYLLABLE CIEUC YAE PHIEUPH
+ 0xA085: 0xC7FF, //HANGUL SYLLABLE CIEUC YAE HIEUH
+ 0xA086: 0xC802, //HANGUL SYLLABLE CIEUC EO SSANGKIYEOK
+ 0xA087: 0xC803, //HANGUL SYLLABLE CIEUC EO KIYEOKSIOS
+ 0xA088: 0xC805, //HANGUL SYLLABLE CIEUC EO NIEUNCIEUC
+ 0xA089: 0xC806, //HANGUL SYLLABLE CIEUC EO NIEUNHIEUH
+ 0xA08A: 0xC807, //HANGUL SYLLABLE CIEUC EO TIKEUT
+ 0xA08B: 0xC809, //HANGUL SYLLABLE CIEUC EO RIEULKIYEOK
+ 0xA08C: 0xC80B, //HANGUL SYLLABLE CIEUC EO RIEULPIEUP
+ 0xA08D: 0xC80C, //HANGUL SYLLABLE CIEUC EO RIEULSIOS
+ 0xA08E: 0xC80D, //HANGUL SYLLABLE CIEUC EO RIEULTHIEUTH
+ 0xA08F: 0xC80E, //HANGUL SYLLABLE CIEUC EO RIEULPHIEUPH
+ 0xA090: 0xC80F, //HANGUL SYLLABLE CIEUC EO RIEULHIEUH
+ 0xA091: 0xC812, //HANGUL SYLLABLE CIEUC EO PIEUPSIOS
+ 0xA092: 0xC814, //HANGUL SYLLABLE CIEUC EO SSANGSIOS
+ 0xA093: 0xC817, //HANGUL SYLLABLE CIEUC EO CHIEUCH
+ 0xA094: 0xC818, //HANGUL SYLLABLE CIEUC EO KHIEUKH
+ 0xA095: 0xC819, //HANGUL SYLLABLE CIEUC EO THIEUTH
+ 0xA096: 0xC81A, //HANGUL SYLLABLE CIEUC EO PHIEUPH
+ 0xA097: 0xC81B, //HANGUL SYLLABLE CIEUC EO HIEUH
+ 0xA098: 0xC81E, //HANGUL SYLLABLE CIEUC E SSANGKIYEOK
+ 0xA099: 0xC81F, //HANGUL SYLLABLE CIEUC E KIYEOKSIOS
+ 0xA09A: 0xC821, //HANGUL SYLLABLE CIEUC E NIEUNCIEUC
+ 0xA09B: 0xC822, //HANGUL SYLLABLE CIEUC E NIEUNHIEUH
+ 0xA09C: 0xC823, //HANGUL SYLLABLE CIEUC E TIKEUT
+ 0xA09D: 0xC825, //HANGUL SYLLABLE CIEUC E RIEULKIYEOK
+ 0xA09E: 0xC826, //HANGUL SYLLABLE CIEUC E RIEULMIEUM
+ 0xA09F: 0xC827, //HANGUL SYLLABLE CIEUC E RIEULPIEUP
+ 0xA0A0: 0xC828, //HANGUL SYLLABLE CIEUC E RIEULSIOS
+ 0xA0A1: 0xC829, //HANGUL SYLLABLE CIEUC E RIEULTHIEUTH
+ 0xA0A2: 0xC82A, //HANGUL SYLLABLE CIEUC E RIEULPHIEUPH
+ 0xA0A3: 0xC82B, //HANGUL SYLLABLE CIEUC E RIEULHIEUH
+ 0xA0A4: 0xC82E, //HANGUL SYLLABLE CIEUC E PIEUPSIOS
+ 0xA0A5: 0xC830, //HANGUL SYLLABLE CIEUC E SSANGSIOS
+ 0xA0A6: 0xC832, //HANGUL SYLLABLE CIEUC E CIEUC
+ 0xA0A7: 0xC833, //HANGUL SYLLABLE CIEUC E CHIEUCH
+ 0xA0A8: 0xC834, //HANGUL SYLLABLE CIEUC E KHIEUKH
+ 0xA0A9: 0xC835, //HANGUL SYLLABLE CIEUC E THIEUTH
+ 0xA0AA: 0xC836, //HANGUL SYLLABLE CIEUC E PHIEUPH
+ 0xA0AB: 0xC837, //HANGUL SYLLABLE CIEUC E HIEUH
+ 0xA0AC: 0xC839, //HANGUL SYLLABLE CIEUC YEO KIYEOK
+ 0xA0AD: 0xC83A, //HANGUL SYLLABLE CIEUC YEO SSANGKIYEOK
+ 0xA0AE: 0xC83B, //HANGUL SYLLABLE CIEUC YEO KIYEOKSIOS
+ 0xA0AF: 0xC83D, //HANGUL SYLLABLE CIEUC YEO NIEUNCIEUC
+ 0xA0B0: 0xC83E, //HANGUL SYLLABLE CIEUC YEO NIEUNHIEUH
+ 0xA0B1: 0xC83F, //HANGUL SYLLABLE CIEUC YEO TIKEUT
+ 0xA0B2: 0xC841, //HANGUL SYLLABLE CIEUC YEO RIEULKIYEOK
+ 0xA0B3: 0xC842, //HANGUL SYLLABLE CIEUC YEO RIEULMIEUM
+ 0xA0B4: 0xC843, //HANGUL SYLLABLE CIEUC YEO RIEULPIEUP
+ 0xA0B5: 0xC844, //HANGUL SYLLABLE CIEUC YEO RIEULSIOS
+ 0xA0B6: 0xC845, //HANGUL SYLLABLE CIEUC YEO RIEULTHIEUTH
+ 0xA0B7: 0xC846, //HANGUL SYLLABLE CIEUC YEO RIEULPHIEUPH
+ 0xA0B8: 0xC847, //HANGUL SYLLABLE CIEUC YEO RIEULHIEUH
+ 0xA0B9: 0xC84A, //HANGUL SYLLABLE CIEUC YEO PIEUPSIOS
+ 0xA0BA: 0xC84B, //HANGUL SYLLABLE CIEUC YEO SIOS
+ 0xA0BB: 0xC84E, //HANGUL SYLLABLE CIEUC YEO CIEUC
+ 0xA0BC: 0xC84F, //HANGUL SYLLABLE CIEUC YEO CHIEUCH
+ 0xA0BD: 0xC850, //HANGUL SYLLABLE CIEUC YEO KHIEUKH
+ 0xA0BE: 0xC851, //HANGUL SYLLABLE CIEUC YEO THIEUTH
+ 0xA0BF: 0xC852, //HANGUL SYLLABLE CIEUC YEO PHIEUPH
+ 0xA0C0: 0xC853, //HANGUL SYLLABLE CIEUC YEO HIEUH
+ 0xA0C1: 0xC855, //HANGUL SYLLABLE CIEUC YE KIYEOK
+ 0xA0C2: 0xC856, //HANGUL SYLLABLE CIEUC YE SSANGKIYEOK
+ 0xA0C3: 0xC857, //HANGUL SYLLABLE CIEUC YE KIYEOKSIOS
+ 0xA0C4: 0xC858, //HANGUL SYLLABLE CIEUC YE NIEUN
+ 0xA0C5: 0xC859, //HANGUL SYLLABLE CIEUC YE NIEUNCIEUC
+ 0xA0C6: 0xC85A, //HANGUL SYLLABLE CIEUC YE NIEUNHIEUH
+ 0xA0C7: 0xC85B, //HANGUL SYLLABLE CIEUC YE TIKEUT
+ 0xA0C8: 0xC85C, //HANGUL SYLLABLE CIEUC YE RIEUL
+ 0xA0C9: 0xC85D, //HANGUL SYLLABLE CIEUC YE RIEULKIYEOK
+ 0xA0CA: 0xC85E, //HANGUL SYLLABLE CIEUC YE RIEULMIEUM
+ 0xA0CB: 0xC85F, //HANGUL SYLLABLE CIEUC YE RIEULPIEUP
+ 0xA0CC: 0xC860, //HANGUL SYLLABLE CIEUC YE RIEULSIOS
+ 0xA0CD: 0xC861, //HANGUL SYLLABLE CIEUC YE RIEULTHIEUTH
+ 0xA0CE: 0xC862, //HANGUL SYLLABLE CIEUC YE RIEULPHIEUPH
+ 0xA0CF: 0xC863, //HANGUL SYLLABLE CIEUC YE RIEULHIEUH
+ 0xA0D0: 0xC864, //HANGUL SYLLABLE CIEUC YE MIEUM
+ 0xA0D1: 0xC865, //HANGUL SYLLABLE CIEUC YE PIEUP
+ 0xA0D2: 0xC866, //HANGUL SYLLABLE CIEUC YE PIEUPSIOS
+ 0xA0D3: 0xC867, //HANGUL SYLLABLE CIEUC YE SIOS
+ 0xA0D4: 0xC868, //HANGUL SYLLABLE CIEUC YE SSANGSIOS
+ 0xA0D5: 0xC869, //HANGUL SYLLABLE CIEUC YE IEUNG
+ 0xA0D6: 0xC86A, //HANGUL SYLLABLE CIEUC YE CIEUC
+ 0xA0D7: 0xC86B, //HANGUL SYLLABLE CIEUC YE CHIEUCH
+ 0xA0D8: 0xC86C, //HANGUL SYLLABLE CIEUC YE KHIEUKH
+ 0xA0D9: 0xC86D, //HANGUL SYLLABLE CIEUC YE THIEUTH
+ 0xA0DA: 0xC86E, //HANGUL SYLLABLE CIEUC YE PHIEUPH
+ 0xA0DB: 0xC86F, //HANGUL SYLLABLE CIEUC YE HIEUH
+ 0xA0DC: 0xC872, //HANGUL SYLLABLE CIEUC O SSANGKIYEOK
+ 0xA0DD: 0xC873, //HANGUL SYLLABLE CIEUC O KIYEOKSIOS
+ 0xA0DE: 0xC875, //HANGUL SYLLABLE CIEUC O NIEUNCIEUC
+ 0xA0DF: 0xC876, //HANGUL SYLLABLE CIEUC O NIEUNHIEUH
+ 0xA0E0: 0xC877, //HANGUL SYLLABLE CIEUC O TIKEUT
+ 0xA0E1: 0xC879, //HANGUL SYLLABLE CIEUC O RIEULKIYEOK
+ 0xA0E2: 0xC87B, //HANGUL SYLLABLE CIEUC O RIEULPIEUP
+ 0xA0E3: 0xC87C, //HANGUL SYLLABLE CIEUC O RIEULSIOS
+ 0xA0E4: 0xC87D, //HANGUL SYLLABLE CIEUC O RIEULTHIEUTH
+ 0xA0E5: 0xC87E, //HANGUL SYLLABLE CIEUC O RIEULPHIEUPH
+ 0xA0E6: 0xC87F, //HANGUL SYLLABLE CIEUC O RIEULHIEUH
+ 0xA0E7: 0xC882, //HANGUL SYLLABLE CIEUC O PIEUPSIOS
+ 0xA0E8: 0xC884, //HANGUL SYLLABLE CIEUC O SSANGSIOS
+ 0xA0E9: 0xC888, //HANGUL SYLLABLE CIEUC O KHIEUKH
+ 0xA0EA: 0xC889, //HANGUL SYLLABLE CIEUC O THIEUTH
+ 0xA0EB: 0xC88A, //HANGUL SYLLABLE CIEUC O PHIEUPH
+ 0xA0EC: 0xC88E, //HANGUL SYLLABLE CIEUC WA SSANGKIYEOK
+ 0xA0ED: 0xC88F, //HANGUL SYLLABLE CIEUC WA KIYEOKSIOS
+ 0xA0EE: 0xC890, //HANGUL SYLLABLE CIEUC WA NIEUN
+ 0xA0EF: 0xC891, //HANGUL SYLLABLE CIEUC WA NIEUNCIEUC
+ 0xA0F0: 0xC892, //HANGUL SYLLABLE CIEUC WA NIEUNHIEUH
+ 0xA0F1: 0xC893, //HANGUL SYLLABLE CIEUC WA TIKEUT
+ 0xA0F2: 0xC895, //HANGUL SYLLABLE CIEUC WA RIEULKIYEOK
+ 0xA0F3: 0xC896, //HANGUL SYLLABLE CIEUC WA RIEULMIEUM
+ 0xA0F4: 0xC897, //HANGUL SYLLABLE CIEUC WA RIEULPIEUP
+ 0xA0F5: 0xC898, //HANGUL SYLLABLE CIEUC WA RIEULSIOS
+ 0xA0F6: 0xC899, //HANGUL SYLLABLE CIEUC WA RIEULTHIEUTH
+ 0xA0F7: 0xC89A, //HANGUL SYLLABLE CIEUC WA RIEULPHIEUPH
+ 0xA0F8: 0xC89B, //HANGUL SYLLABLE CIEUC WA RIEULHIEUH
+ 0xA0F9: 0xC89C, //HANGUL SYLLABLE CIEUC WA MIEUM
+ 0xA0FA: 0xC89E, //HANGUL SYLLABLE CIEUC WA PIEUPSIOS
+ 0xA0FB: 0xC8A0, //HANGUL SYLLABLE CIEUC WA SSANGSIOS
+ 0xA0FC: 0xC8A2, //HANGUL SYLLABLE CIEUC WA CIEUC
+ 0xA0FD: 0xC8A3, //HANGUL SYLLABLE CIEUC WA CHIEUCH
+ 0xA0FE: 0xC8A4, //HANGUL SYLLABLE CIEUC WA KHIEUKH
+ 0xA141: 0xC8A5, //HANGUL SYLLABLE CIEUC WA THIEUTH
+ 0xA142: 0xC8A6, //HANGUL SYLLABLE CIEUC WA PHIEUPH
+ 0xA143: 0xC8A7, //HANGUL SYLLABLE CIEUC WA HIEUH
+ 0xA144: 0xC8A9, //HANGUL SYLLABLE CIEUC WAE KIYEOK
+ 0xA145: 0xC8AA, //HANGUL SYLLABLE CIEUC WAE SSANGKIYEOK
+ 0xA146: 0xC8AB, //HANGUL SYLLABLE CIEUC WAE KIYEOKSIOS
+ 0xA147: 0xC8AC, //HANGUL SYLLABLE CIEUC WAE NIEUN
+ 0xA148: 0xC8AD, //HANGUL SYLLABLE CIEUC WAE NIEUNCIEUC
+ 0xA149: 0xC8AE, //HANGUL SYLLABLE CIEUC WAE NIEUNHIEUH
+ 0xA14A: 0xC8AF, //HANGUL SYLLABLE CIEUC WAE TIKEUT
+ 0xA14B: 0xC8B0, //HANGUL SYLLABLE CIEUC WAE RIEUL
+ 0xA14C: 0xC8B1, //HANGUL SYLLABLE CIEUC WAE RIEULKIYEOK
+ 0xA14D: 0xC8B2, //HANGUL SYLLABLE CIEUC WAE RIEULMIEUM
+ 0xA14E: 0xC8B3, //HANGUL SYLLABLE CIEUC WAE RIEULPIEUP
+ 0xA14F: 0xC8B4, //HANGUL SYLLABLE CIEUC WAE RIEULSIOS
+ 0xA150: 0xC8B5, //HANGUL SYLLABLE CIEUC WAE RIEULTHIEUTH
+ 0xA151: 0xC8B6, //HANGUL SYLLABLE CIEUC WAE RIEULPHIEUPH
+ 0xA152: 0xC8B7, //HANGUL SYLLABLE CIEUC WAE RIEULHIEUH
+ 0xA153: 0xC8B8, //HANGUL SYLLABLE CIEUC WAE MIEUM
+ 0xA154: 0xC8B9, //HANGUL SYLLABLE CIEUC WAE PIEUP
+ 0xA155: 0xC8BA, //HANGUL SYLLABLE CIEUC WAE PIEUPSIOS
+ 0xA156: 0xC8BB, //HANGUL SYLLABLE CIEUC WAE SIOS
+ 0xA157: 0xC8BE, //HANGUL SYLLABLE CIEUC WAE CIEUC
+ 0xA158: 0xC8BF, //HANGUL SYLLABLE CIEUC WAE CHIEUCH
+ 0xA159: 0xC8C0, //HANGUL SYLLABLE CIEUC WAE KHIEUKH
+ 0xA15A: 0xC8C1, //HANGUL SYLLABLE CIEUC WAE THIEUTH
+ 0xA161: 0xC8C2, //HANGUL SYLLABLE CIEUC WAE PHIEUPH
+ 0xA162: 0xC8C3, //HANGUL SYLLABLE CIEUC WAE HIEUH
+ 0xA163: 0xC8C5, //HANGUL SYLLABLE CIEUC OE KIYEOK
+ 0xA164: 0xC8C6, //HANGUL SYLLABLE CIEUC OE SSANGKIYEOK
+ 0xA165: 0xC8C7, //HANGUL SYLLABLE CIEUC OE KIYEOKSIOS
+ 0xA166: 0xC8C9, //HANGUL SYLLABLE CIEUC OE NIEUNCIEUC
+ 0xA167: 0xC8CA, //HANGUL SYLLABLE CIEUC OE NIEUNHIEUH
+ 0xA168: 0xC8CB, //HANGUL SYLLABLE CIEUC OE TIKEUT
+ 0xA169: 0xC8CD, //HANGUL SYLLABLE CIEUC OE RIEULKIYEOK
+ 0xA16A: 0xC8CE, //HANGUL SYLLABLE CIEUC OE RIEULMIEUM
+ 0xA16B: 0xC8CF, //HANGUL SYLLABLE CIEUC OE RIEULPIEUP
+ 0xA16C: 0xC8D0, //HANGUL SYLLABLE CIEUC OE RIEULSIOS
+ 0xA16D: 0xC8D1, //HANGUL SYLLABLE CIEUC OE RIEULTHIEUTH
+ 0xA16E: 0xC8D2, //HANGUL SYLLABLE CIEUC OE RIEULPHIEUPH
+ 0xA16F: 0xC8D3, //HANGUL SYLLABLE CIEUC OE RIEULHIEUH
+ 0xA170: 0xC8D6, //HANGUL SYLLABLE CIEUC OE PIEUPSIOS
+ 0xA171: 0xC8D8, //HANGUL SYLLABLE CIEUC OE SSANGSIOS
+ 0xA172: 0xC8DA, //HANGUL SYLLABLE CIEUC OE CIEUC
+ 0xA173: 0xC8DB, //HANGUL SYLLABLE CIEUC OE CHIEUCH
+ 0xA174: 0xC8DC, //HANGUL SYLLABLE CIEUC OE KHIEUKH
+ 0xA175: 0xC8DD, //HANGUL SYLLABLE CIEUC OE THIEUTH
+ 0xA176: 0xC8DE, //HANGUL SYLLABLE CIEUC OE PHIEUPH
+ 0xA177: 0xC8DF, //HANGUL SYLLABLE CIEUC OE HIEUH
+ 0xA178: 0xC8E2, //HANGUL SYLLABLE CIEUC YO SSANGKIYEOK
+ 0xA179: 0xC8E3, //HANGUL SYLLABLE CIEUC YO KIYEOKSIOS
+ 0xA17A: 0xC8E5, //HANGUL SYLLABLE CIEUC YO NIEUNCIEUC
+ 0xA181: 0xC8E6, //HANGUL SYLLABLE CIEUC YO NIEUNHIEUH
+ 0xA182: 0xC8E7, //HANGUL SYLLABLE CIEUC YO TIKEUT
+ 0xA183: 0xC8E8, //HANGUL SYLLABLE CIEUC YO RIEUL
+ 0xA184: 0xC8E9, //HANGUL SYLLABLE CIEUC YO RIEULKIYEOK
+ 0xA185: 0xC8EA, //HANGUL SYLLABLE CIEUC YO RIEULMIEUM
+ 0xA186: 0xC8EB, //HANGUL SYLLABLE CIEUC YO RIEULPIEUP
+ 0xA187: 0xC8EC, //HANGUL SYLLABLE CIEUC YO RIEULSIOS
+ 0xA188: 0xC8ED, //HANGUL SYLLABLE CIEUC YO RIEULTHIEUTH
+ 0xA189: 0xC8EE, //HANGUL SYLLABLE CIEUC YO RIEULPHIEUPH
+ 0xA18A: 0xC8EF, //HANGUL SYLLABLE CIEUC YO RIEULHIEUH
+ 0xA18B: 0xC8F0, //HANGUL SYLLABLE CIEUC YO MIEUM
+ 0xA18C: 0xC8F1, //HANGUL SYLLABLE CIEUC YO PIEUP
+ 0xA18D: 0xC8F2, //HANGUL SYLLABLE CIEUC YO PIEUPSIOS
+ 0xA18E: 0xC8F3, //HANGUL SYLLABLE CIEUC YO SIOS
+ 0xA18F: 0xC8F4, //HANGUL SYLLABLE CIEUC YO SSANGSIOS
+ 0xA190: 0xC8F6, //HANGUL SYLLABLE CIEUC YO CIEUC
+ 0xA191: 0xC8F7, //HANGUL SYLLABLE CIEUC YO CHIEUCH
+ 0xA192: 0xC8F8, //HANGUL SYLLABLE CIEUC YO KHIEUKH
+ 0xA193: 0xC8F9, //HANGUL SYLLABLE CIEUC YO THIEUTH
+ 0xA194: 0xC8FA, //HANGUL SYLLABLE CIEUC YO PHIEUPH
+ 0xA195: 0xC8FB, //HANGUL SYLLABLE CIEUC YO HIEUH
+ 0xA196: 0xC8FE, //HANGUL SYLLABLE CIEUC U SSANGKIYEOK
+ 0xA197: 0xC8FF, //HANGUL SYLLABLE CIEUC U KIYEOKSIOS
+ 0xA198: 0xC901, //HANGUL SYLLABLE CIEUC U NIEUNCIEUC
+ 0xA199: 0xC902, //HANGUL SYLLABLE CIEUC U NIEUNHIEUH
+ 0xA19A: 0xC903, //HANGUL SYLLABLE CIEUC U TIKEUT
+ 0xA19B: 0xC907, //HANGUL SYLLABLE CIEUC U RIEULPIEUP
+ 0xA19C: 0xC908, //HANGUL SYLLABLE CIEUC U RIEULSIOS
+ 0xA19D: 0xC909, //HANGUL SYLLABLE CIEUC U RIEULTHIEUTH
+ 0xA19E: 0xC90A, //HANGUL SYLLABLE CIEUC U RIEULPHIEUPH
+ 0xA19F: 0xC90B, //HANGUL SYLLABLE CIEUC U RIEULHIEUH
+ 0xA1A0: 0xC90E, //HANGUL SYLLABLE CIEUC U PIEUPSIOS
+ 0xA1A1: 0x3000, //IDEOGRAPHIC SPACE
+ 0xA1A2: 0x3001, //IDEOGRAPHIC COMMA
+ 0xA1A3: 0x3002, //IDEOGRAPHIC FULL STOP
+ 0xA1A4: 0x00B7, //MIDDLE DOT
+ 0xA1A5: 0x2025, //TWO DOT LEADER
+ 0xA1A6: 0x2026, //HORIZONTAL ELLIPSIS
+ 0xA1A7: 0x00A8, //DIAERESIS
+ 0xA1A8: 0x3003, //DITTO MARK
+ 0xA1A9: 0x00AD, //SOFT HYPHEN
+ 0xA1AA: 0x2015, //HORIZONTAL BAR
+ 0xA1AB: 0x2225, //PARALLEL TO
+ 0xA1AC: 0xFF3C, //FULLWIDTH REVERSE SOLIDUS
+ 0xA1AD: 0x223C, //TILDE OPERATOR
+ 0xA1AE: 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0xA1AF: 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0xA1B0: 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0xA1B1: 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0xA1B2: 0x3014, //LEFT TORTOISE SHELL BRACKET
+ 0xA1B3: 0x3015, //RIGHT TORTOISE SHELL BRACKET
+ 0xA1B4: 0x3008, //LEFT ANGLE BRACKET
+ 0xA1B5: 0x3009, //RIGHT ANGLE BRACKET
+ 0xA1B6: 0x300A, //LEFT DOUBLE ANGLE BRACKET
+ 0xA1B7: 0x300B, //RIGHT DOUBLE ANGLE BRACKET
+ 0xA1B8: 0x300C, //LEFT CORNER BRACKET
+ 0xA1B9: 0x300D, //RIGHT CORNER BRACKET
+ 0xA1BA: 0x300E, //LEFT WHITE CORNER BRACKET
+ 0xA1BB: 0x300F, //RIGHT WHITE CORNER BRACKET
+ 0xA1BC: 0x3010, //LEFT BLACK LENTICULAR BRACKET
+ 0xA1BD: 0x3011, //RIGHT BLACK LENTICULAR BRACKET
+ 0xA1BE: 0x00B1, //PLUS-MINUS SIGN
+ 0xA1BF: 0x00D7, //MULTIPLICATION SIGN
+ 0xA1C0: 0x00F7, //DIVISION SIGN
+ 0xA1C1: 0x2260, //NOT EQUAL TO
+ 0xA1C2: 0x2264, //LESS-THAN OR EQUAL TO
+ 0xA1C3: 0x2265, //GREATER-THAN OR EQUAL TO
+ 0xA1C4: 0x221E, //INFINITY
+ 0xA1C5: 0x2234, //THEREFORE
+ 0xA1C6: 0x00B0, //DEGREE SIGN
+ 0xA1C7: 0x2032, //PRIME
+ 0xA1C8: 0x2033, //DOUBLE PRIME
+ 0xA1C9: 0x2103, //DEGREE CELSIUS
+ 0xA1CA: 0x212B, //ANGSTROM SIGN
+ 0xA1CB: 0xFFE0, //FULLWIDTH CENT SIGN
+ 0xA1CC: 0xFFE1, //FULLWIDTH POUND SIGN
+ 0xA1CD: 0xFFE5, //FULLWIDTH YEN SIGN
+ 0xA1CE: 0x2642, //MALE SIGN
+ 0xA1CF: 0x2640, //FEMALE SIGN
+ 0xA1D0: 0x2220, //ANGLE
+ 0xA1D1: 0x22A5, //UP TACK
+ 0xA1D2: 0x2312, //ARC
+ 0xA1D3: 0x2202, //PARTIAL DIFFERENTIAL
+ 0xA1D4: 0x2207, //NABLA
+ 0xA1D5: 0x2261, //IDENTICAL TO
+ 0xA1D6: 0x2252, //APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ 0xA1D7: 0x00A7, //SECTION SIGN
+ 0xA1D8: 0x203B, //REFERENCE MARK
+ 0xA1D9: 0x2606, //WHITE STAR
+ 0xA1DA: 0x2605, //BLACK STAR
+ 0xA1DB: 0x25CB, //WHITE CIRCLE
+ 0xA1DC: 0x25CF, //BLACK CIRCLE
+ 0xA1DD: 0x25CE, //BULLSEYE
+ 0xA1DE: 0x25C7, //WHITE DIAMOND
+ 0xA1DF: 0x25C6, //BLACK DIAMOND
+ 0xA1E0: 0x25A1, //WHITE SQUARE
+ 0xA1E1: 0x25A0, //BLACK SQUARE
+ 0xA1E2: 0x25B3, //WHITE UP-POINTING TRIANGLE
+ 0xA1E3: 0x25B2, //BLACK UP-POINTING TRIANGLE
+ 0xA1E4: 0x25BD, //WHITE DOWN-POINTING TRIANGLE
+ 0xA1E5: 0x25BC, //BLACK DOWN-POINTING TRIANGLE
+ 0xA1E6: 0x2192, //RIGHTWARDS ARROW
+ 0xA1E7: 0x2190, //LEFTWARDS ARROW
+ 0xA1E8: 0x2191, //UPWARDS ARROW
+ 0xA1E9: 0x2193, //DOWNWARDS ARROW
+ 0xA1EA: 0x2194, //LEFT RIGHT ARROW
+ 0xA1EB: 0x3013, //GETA MARK
+ 0xA1EC: 0x226A, //MUCH LESS-THAN
+ 0xA1ED: 0x226B, //MUCH GREATER-THAN
+ 0xA1EE: 0x221A, //SQUARE ROOT
+ 0xA1EF: 0x223D, //REVERSED TILDE
+ 0xA1F0: 0x221D, //PROPORTIONAL TO
+ 0xA1F1: 0x2235, //BECAUSE
+ 0xA1F2: 0x222B, //INTEGRAL
+ 0xA1F3: 0x222C, //DOUBLE INTEGRAL
+ 0xA1F4: 0x2208, //ELEMENT OF
+ 0xA1F5: 0x220B, //CONTAINS AS MEMBER
+ 0xA1F6: 0x2286, //SUBSET OF OR EQUAL TO
+ 0xA1F7: 0x2287, //SUPERSET OF OR EQUAL TO
+ 0xA1F8: 0x2282, //SUBSET OF
+ 0xA1F9: 0x2283, //SUPERSET OF
+ 0xA1FA: 0x222A, //UNION
+ 0xA1FB: 0x2229, //INTERSECTION
+ 0xA1FC: 0x2227, //LOGICAL AND
+ 0xA1FD: 0x2228, //LOGICAL OR
+ 0xA1FE: 0xFFE2, //FULLWIDTH NOT SIGN
+ 0xA241: 0xC910, //HANGUL SYLLABLE CIEUC U SSANGSIOS
+ 0xA242: 0xC912, //HANGUL SYLLABLE CIEUC U CIEUC
+ 0xA243: 0xC913, //HANGUL SYLLABLE CIEUC U CHIEUCH
+ 0xA244: 0xC914, //HANGUL SYLLABLE CIEUC U KHIEUKH
+ 0xA245: 0xC915, //HANGUL SYLLABLE CIEUC U THIEUTH
+ 0xA246: 0xC916, //HANGUL SYLLABLE CIEUC U PHIEUPH
+ 0xA247: 0xC917, //HANGUL SYLLABLE CIEUC U HIEUH
+ 0xA248: 0xC919, //HANGUL SYLLABLE CIEUC WEO KIYEOK
+ 0xA249: 0xC91A, //HANGUL SYLLABLE CIEUC WEO SSANGKIYEOK
+ 0xA24A: 0xC91B, //HANGUL SYLLABLE CIEUC WEO KIYEOKSIOS
+ 0xA24B: 0xC91C, //HANGUL SYLLABLE CIEUC WEO NIEUN
+ 0xA24C: 0xC91D, //HANGUL SYLLABLE CIEUC WEO NIEUNCIEUC
+ 0xA24D: 0xC91E, //HANGUL SYLLABLE CIEUC WEO NIEUNHIEUH
+ 0xA24E: 0xC91F, //HANGUL SYLLABLE CIEUC WEO TIKEUT
+ 0xA24F: 0xC920, //HANGUL SYLLABLE CIEUC WEO RIEUL
+ 0xA250: 0xC921, //HANGUL SYLLABLE CIEUC WEO RIEULKIYEOK
+ 0xA251: 0xC922, //HANGUL SYLLABLE CIEUC WEO RIEULMIEUM
+ 0xA252: 0xC923, //HANGUL SYLLABLE CIEUC WEO RIEULPIEUP
+ 0xA253: 0xC924, //HANGUL SYLLABLE CIEUC WEO RIEULSIOS
+ 0xA254: 0xC925, //HANGUL SYLLABLE CIEUC WEO RIEULTHIEUTH
+ 0xA255: 0xC926, //HANGUL SYLLABLE CIEUC WEO RIEULPHIEUPH
+ 0xA256: 0xC927, //HANGUL SYLLABLE CIEUC WEO RIEULHIEUH
+ 0xA257: 0xC928, //HANGUL SYLLABLE CIEUC WEO MIEUM
+ 0xA258: 0xC929, //HANGUL SYLLABLE CIEUC WEO PIEUP
+ 0xA259: 0xC92A, //HANGUL SYLLABLE CIEUC WEO PIEUPSIOS
+ 0xA25A: 0xC92B, //HANGUL SYLLABLE CIEUC WEO SIOS
+ 0xA261: 0xC92D, //HANGUL SYLLABLE CIEUC WEO IEUNG
+ 0xA262: 0xC92E, //HANGUL SYLLABLE CIEUC WEO CIEUC
+ 0xA263: 0xC92F, //HANGUL SYLLABLE CIEUC WEO CHIEUCH
+ 0xA264: 0xC930, //HANGUL SYLLABLE CIEUC WEO KHIEUKH
+ 0xA265: 0xC931, //HANGUL SYLLABLE CIEUC WEO THIEUTH
+ 0xA266: 0xC932, //HANGUL SYLLABLE CIEUC WEO PHIEUPH
+ 0xA267: 0xC933, //HANGUL SYLLABLE CIEUC WEO HIEUH
+ 0xA268: 0xC935, //HANGUL SYLLABLE CIEUC WE KIYEOK
+ 0xA269: 0xC936, //HANGUL SYLLABLE CIEUC WE SSANGKIYEOK
+ 0xA26A: 0xC937, //HANGUL SYLLABLE CIEUC WE KIYEOKSIOS
+ 0xA26B: 0xC938, //HANGUL SYLLABLE CIEUC WE NIEUN
+ 0xA26C: 0xC939, //HANGUL SYLLABLE CIEUC WE NIEUNCIEUC
+ 0xA26D: 0xC93A, //HANGUL SYLLABLE CIEUC WE NIEUNHIEUH
+ 0xA26E: 0xC93B, //HANGUL SYLLABLE CIEUC WE TIKEUT
+ 0xA26F: 0xC93C, //HANGUL SYLLABLE CIEUC WE RIEUL
+ 0xA270: 0xC93D, //HANGUL SYLLABLE CIEUC WE RIEULKIYEOK
+ 0xA271: 0xC93E, //HANGUL SYLLABLE CIEUC WE RIEULMIEUM
+ 0xA272: 0xC93F, //HANGUL SYLLABLE CIEUC WE RIEULPIEUP
+ 0xA273: 0xC940, //HANGUL SYLLABLE CIEUC WE RIEULSIOS
+ 0xA274: 0xC941, //HANGUL SYLLABLE CIEUC WE RIEULTHIEUTH
+ 0xA275: 0xC942, //HANGUL SYLLABLE CIEUC WE RIEULPHIEUPH
+ 0xA276: 0xC943, //HANGUL SYLLABLE CIEUC WE RIEULHIEUH
+ 0xA277: 0xC944, //HANGUL SYLLABLE CIEUC WE MIEUM
+ 0xA278: 0xC945, //HANGUL SYLLABLE CIEUC WE PIEUP
+ 0xA279: 0xC946, //HANGUL SYLLABLE CIEUC WE PIEUPSIOS
+ 0xA27A: 0xC947, //HANGUL SYLLABLE CIEUC WE SIOS
+ 0xA281: 0xC948, //HANGUL SYLLABLE CIEUC WE SSANGSIOS
+ 0xA282: 0xC949, //HANGUL SYLLABLE CIEUC WE IEUNG
+ 0xA283: 0xC94A, //HANGUL SYLLABLE CIEUC WE CIEUC
+ 0xA284: 0xC94B, //HANGUL SYLLABLE CIEUC WE CHIEUCH
+ 0xA285: 0xC94C, //HANGUL SYLLABLE CIEUC WE KHIEUKH
+ 0xA286: 0xC94D, //HANGUL SYLLABLE CIEUC WE THIEUTH
+ 0xA287: 0xC94E, //HANGUL SYLLABLE CIEUC WE PHIEUPH
+ 0xA288: 0xC94F, //HANGUL SYLLABLE CIEUC WE HIEUH
+ 0xA289: 0xC952, //HANGUL SYLLABLE CIEUC WI SSANGKIYEOK
+ 0xA28A: 0xC953, //HANGUL SYLLABLE CIEUC WI KIYEOKSIOS
+ 0xA28B: 0xC955, //HANGUL SYLLABLE CIEUC WI NIEUNCIEUC
+ 0xA28C: 0xC956, //HANGUL SYLLABLE CIEUC WI NIEUNHIEUH
+ 0xA28D: 0xC957, //HANGUL SYLLABLE CIEUC WI TIKEUT
+ 0xA28E: 0xC959, //HANGUL SYLLABLE CIEUC WI RIEULKIYEOK
+ 0xA28F: 0xC95A, //HANGUL SYLLABLE CIEUC WI RIEULMIEUM
+ 0xA290: 0xC95B, //HANGUL SYLLABLE CIEUC WI RIEULPIEUP
+ 0xA291: 0xC95C, //HANGUL SYLLABLE CIEUC WI RIEULSIOS
+ 0xA292: 0xC95D, //HANGUL SYLLABLE CIEUC WI RIEULTHIEUTH
+ 0xA293: 0xC95E, //HANGUL SYLLABLE CIEUC WI RIEULPHIEUPH
+ 0xA294: 0xC95F, //HANGUL SYLLABLE CIEUC WI RIEULHIEUH
+ 0xA295: 0xC962, //HANGUL SYLLABLE CIEUC WI PIEUPSIOS
+ 0xA296: 0xC964, //HANGUL SYLLABLE CIEUC WI SSANGSIOS
+ 0xA297: 0xC965, //HANGUL SYLLABLE CIEUC WI IEUNG
+ 0xA298: 0xC966, //HANGUL SYLLABLE CIEUC WI CIEUC
+ 0xA299: 0xC967, //HANGUL SYLLABLE CIEUC WI CHIEUCH
+ 0xA29A: 0xC968, //HANGUL SYLLABLE CIEUC WI KHIEUKH
+ 0xA29B: 0xC969, //HANGUL SYLLABLE CIEUC WI THIEUTH
+ 0xA29C: 0xC96A, //HANGUL SYLLABLE CIEUC WI PHIEUPH
+ 0xA29D: 0xC96B, //HANGUL SYLLABLE CIEUC WI HIEUH
+ 0xA29E: 0xC96D, //HANGUL SYLLABLE CIEUC YU KIYEOK
+ 0xA29F: 0xC96E, //HANGUL SYLLABLE CIEUC YU SSANGKIYEOK
+ 0xA2A0: 0xC96F, //HANGUL SYLLABLE CIEUC YU KIYEOKSIOS
+ 0xA2A1: 0x21D2, //RIGHTWARDS DOUBLE ARROW
+ 0xA2A2: 0x21D4, //LEFT RIGHT DOUBLE ARROW
+ 0xA2A3: 0x2200, //FOR ALL
+ 0xA2A4: 0x2203, //THERE EXISTS
+ 0xA2A5: 0x00B4, //ACUTE ACCENT
+ 0xA2A6: 0xFF5E, //FULLWIDTH TILDE
+ 0xA2A7: 0x02C7, //CARON
+ 0xA2A8: 0x02D8, //BREVE
+ 0xA2A9: 0x02DD, //DOUBLE ACUTE ACCENT
+ 0xA2AA: 0x02DA, //RING ABOVE
+ 0xA2AB: 0x02D9, //DOT ABOVE
+ 0xA2AC: 0x00B8, //CEDILLA
+ 0xA2AD: 0x02DB, //OGONEK
+ 0xA2AE: 0x00A1, //INVERTED EXCLAMATION MARK
+ 0xA2AF: 0x00BF, //INVERTED QUESTION MARK
+ 0xA2B0: 0x02D0, //MODIFIER LETTER TRIANGULAR COLON
+ 0xA2B1: 0x222E, //CONTOUR INTEGRAL
+ 0xA2B2: 0x2211, //N-ARY SUMMATION
+ 0xA2B3: 0x220F, //N-ARY PRODUCT
+ 0xA2B4: 0x00A4, //CURRENCY SIGN
+ 0xA2B5: 0x2109, //DEGREE FAHRENHEIT
+ 0xA2B6: 0x2030, //PER MILLE SIGN
+ 0xA2B7: 0x25C1, //WHITE LEFT-POINTING TRIANGLE
+ 0xA2B8: 0x25C0, //BLACK LEFT-POINTING TRIANGLE
+ 0xA2B9: 0x25B7, //WHITE RIGHT-POINTING TRIANGLE
+ 0xA2BA: 0x25B6, //BLACK RIGHT-POINTING TRIANGLE
+ 0xA2BB: 0x2664, //WHITE SPADE SUIT
+ 0xA2BC: 0x2660, //BLACK SPADE SUIT
+ 0xA2BD: 0x2661, //WHITE HEART SUIT
+ 0xA2BE: 0x2665, //BLACK HEART SUIT
+ 0xA2BF: 0x2667, //WHITE CLUB SUIT
+ 0xA2C0: 0x2663, //BLACK CLUB SUIT
+ 0xA2C1: 0x2299, //CIRCLED DOT OPERATOR
+ 0xA2C2: 0x25C8, //WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+ 0xA2C3: 0x25A3, //WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+ 0xA2C4: 0x25D0, //CIRCLE WITH LEFT HALF BLACK
+ 0xA2C5: 0x25D1, //CIRCLE WITH RIGHT HALF BLACK
+ 0xA2C6: 0x2592, //MEDIUM SHADE
+ 0xA2C7: 0x25A4, //SQUARE WITH HORIZONTAL FILL
+ 0xA2C8: 0x25A5, //SQUARE WITH VERTICAL FILL
+ 0xA2C9: 0x25A8, //SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+ 0xA2CA: 0x25A7, //SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+ 0xA2CB: 0x25A6, //SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+ 0xA2CC: 0x25A9, //SQUARE WITH DIAGONAL CROSSHATCH FILL
+ 0xA2CD: 0x2668, //HOT SPRINGS
+ 0xA2CE: 0x260F, //WHITE TELEPHONE
+ 0xA2CF: 0x260E, //BLACK TELEPHONE
+ 0xA2D0: 0x261C, //WHITE LEFT POINTING INDEX
+ 0xA2D1: 0x261E, //WHITE RIGHT POINTING INDEX
+ 0xA2D2: 0x00B6, //PILCROW SIGN
+ 0xA2D3: 0x2020, //DAGGER
+ 0xA2D4: 0x2021, //DOUBLE DAGGER
+ 0xA2D5: 0x2195, //UP DOWN ARROW
+ 0xA2D6: 0x2197, //NORTH EAST ARROW
+ 0xA2D7: 0x2199, //SOUTH WEST ARROW
+ 0xA2D8: 0x2196, //NORTH WEST ARROW
+ 0xA2D9: 0x2198, //SOUTH EAST ARROW
+ 0xA2DA: 0x266D, //MUSIC FLAT SIGN
+ 0xA2DB: 0x2669, //QUARTER NOTE
+ 0xA2DC: 0x266A, //EIGHTH NOTE
+ 0xA2DD: 0x266C, //BEAMED SIXTEENTH NOTES
+ 0xA2DE: 0x327F, //KOREAN STANDARD SYMBOL
+ 0xA2DF: 0x321C, //PARENTHESIZED HANGUL CIEUC U
+ 0xA2E0: 0x2116, //NUMERO SIGN
+ 0xA2E1: 0x33C7, //SQUARE CO
+ 0xA2E2: 0x2122, //TRADE MARK SIGN
+ 0xA2E3: 0x33C2, //SQUARE AM
+ 0xA2E4: 0x33D8, //SQUARE PM
+ 0xA2E5: 0x2121, //TELEPHONE SIGN
+ 0xA2E6: 0x20AC, //EURO SIGN
+ 0xA2E7: 0x00AE, //REGISTERED SIGN
+ 0xA341: 0xC971, //HANGUL SYLLABLE CIEUC YU NIEUNCIEUC
+ 0xA342: 0xC972, //HANGUL SYLLABLE CIEUC YU NIEUNHIEUH
+ 0xA343: 0xC973, //HANGUL SYLLABLE CIEUC YU TIKEUT
+ 0xA344: 0xC975, //HANGUL SYLLABLE CIEUC YU RIEULKIYEOK
+ 0xA345: 0xC976, //HANGUL SYLLABLE CIEUC YU RIEULMIEUM
+ 0xA346: 0xC977, //HANGUL SYLLABLE CIEUC YU RIEULPIEUP
+ 0xA347: 0xC978, //HANGUL SYLLABLE CIEUC YU RIEULSIOS
+ 0xA348: 0xC979, //HANGUL SYLLABLE CIEUC YU RIEULTHIEUTH
+ 0xA349: 0xC97A, //HANGUL SYLLABLE CIEUC YU RIEULPHIEUPH
+ 0xA34A: 0xC97B, //HANGUL SYLLABLE CIEUC YU RIEULHIEUH
+ 0xA34B: 0xC97D, //HANGUL SYLLABLE CIEUC YU PIEUP
+ 0xA34C: 0xC97E, //HANGUL SYLLABLE CIEUC YU PIEUPSIOS
+ 0xA34D: 0xC97F, //HANGUL SYLLABLE CIEUC YU SIOS
+ 0xA34E: 0xC980, //HANGUL SYLLABLE CIEUC YU SSANGSIOS
+ 0xA34F: 0xC981, //HANGUL SYLLABLE CIEUC YU IEUNG
+ 0xA350: 0xC982, //HANGUL SYLLABLE CIEUC YU CIEUC
+ 0xA351: 0xC983, //HANGUL SYLLABLE CIEUC YU CHIEUCH
+ 0xA352: 0xC984, //HANGUL SYLLABLE CIEUC YU KHIEUKH
+ 0xA353: 0xC985, //HANGUL SYLLABLE CIEUC YU THIEUTH
+ 0xA354: 0xC986, //HANGUL SYLLABLE CIEUC YU PHIEUPH
+ 0xA355: 0xC987, //HANGUL SYLLABLE CIEUC YU HIEUH
+ 0xA356: 0xC98A, //HANGUL SYLLABLE CIEUC EU SSANGKIYEOK
+ 0xA357: 0xC98B, //HANGUL SYLLABLE CIEUC EU KIYEOKSIOS
+ 0xA358: 0xC98D, //HANGUL SYLLABLE CIEUC EU NIEUNCIEUC
+ 0xA359: 0xC98E, //HANGUL SYLLABLE CIEUC EU NIEUNHIEUH
+ 0xA35A: 0xC98F, //HANGUL SYLLABLE CIEUC EU TIKEUT
+ 0xA361: 0xC991, //HANGUL SYLLABLE CIEUC EU RIEULKIYEOK
+ 0xA362: 0xC992, //HANGUL SYLLABLE CIEUC EU RIEULMIEUM
+ 0xA363: 0xC993, //HANGUL SYLLABLE CIEUC EU RIEULPIEUP
+ 0xA364: 0xC994, //HANGUL SYLLABLE CIEUC EU RIEULSIOS
+ 0xA365: 0xC995, //HANGUL SYLLABLE CIEUC EU RIEULTHIEUTH
+ 0xA366: 0xC996, //HANGUL SYLLABLE CIEUC EU RIEULPHIEUPH
+ 0xA367: 0xC997, //HANGUL SYLLABLE CIEUC EU RIEULHIEUH
+ 0xA368: 0xC99A, //HANGUL SYLLABLE CIEUC EU PIEUPSIOS
+ 0xA369: 0xC99C, //HANGUL SYLLABLE CIEUC EU SSANGSIOS
+ 0xA36A: 0xC99E, //HANGUL SYLLABLE CIEUC EU CIEUC
+ 0xA36B: 0xC99F, //HANGUL SYLLABLE CIEUC EU CHIEUCH
+ 0xA36C: 0xC9A0, //HANGUL SYLLABLE CIEUC EU KHIEUKH
+ 0xA36D: 0xC9A1, //HANGUL SYLLABLE CIEUC EU THIEUTH
+ 0xA36E: 0xC9A2, //HANGUL SYLLABLE CIEUC EU PHIEUPH
+ 0xA36F: 0xC9A3, //HANGUL SYLLABLE CIEUC EU HIEUH
+ 0xA370: 0xC9A4, //HANGUL SYLLABLE CIEUC YI
+ 0xA371: 0xC9A5, //HANGUL SYLLABLE CIEUC YI KIYEOK
+ 0xA372: 0xC9A6, //HANGUL SYLLABLE CIEUC YI SSANGKIYEOK
+ 0xA373: 0xC9A7, //HANGUL SYLLABLE CIEUC YI KIYEOKSIOS
+ 0xA374: 0xC9A8, //HANGUL SYLLABLE CIEUC YI NIEUN
+ 0xA375: 0xC9A9, //HANGUL SYLLABLE CIEUC YI NIEUNCIEUC
+ 0xA376: 0xC9AA, //HANGUL SYLLABLE CIEUC YI NIEUNHIEUH
+ 0xA377: 0xC9AB, //HANGUL SYLLABLE CIEUC YI TIKEUT
+ 0xA378: 0xC9AC, //HANGUL SYLLABLE CIEUC YI RIEUL
+ 0xA379: 0xC9AD, //HANGUL SYLLABLE CIEUC YI RIEULKIYEOK
+ 0xA37A: 0xC9AE, //HANGUL SYLLABLE CIEUC YI RIEULMIEUM
+ 0xA381: 0xC9AF, //HANGUL SYLLABLE CIEUC YI RIEULPIEUP
+ 0xA382: 0xC9B0, //HANGUL SYLLABLE CIEUC YI RIEULSIOS
+ 0xA383: 0xC9B1, //HANGUL SYLLABLE CIEUC YI RIEULTHIEUTH
+ 0xA384: 0xC9B2, //HANGUL SYLLABLE CIEUC YI RIEULPHIEUPH
+ 0xA385: 0xC9B3, //HANGUL SYLLABLE CIEUC YI RIEULHIEUH
+ 0xA386: 0xC9B4, //HANGUL SYLLABLE CIEUC YI MIEUM
+ 0xA387: 0xC9B5, //HANGUL SYLLABLE CIEUC YI PIEUP
+ 0xA388: 0xC9B6, //HANGUL SYLLABLE CIEUC YI PIEUPSIOS
+ 0xA389: 0xC9B7, //HANGUL SYLLABLE CIEUC YI SIOS
+ 0xA38A: 0xC9B8, //HANGUL SYLLABLE CIEUC YI SSANGSIOS
+ 0xA38B: 0xC9B9, //HANGUL SYLLABLE CIEUC YI IEUNG
+ 0xA38C: 0xC9BA, //HANGUL SYLLABLE CIEUC YI CIEUC
+ 0xA38D: 0xC9BB, //HANGUL SYLLABLE CIEUC YI CHIEUCH
+ 0xA38E: 0xC9BC, //HANGUL SYLLABLE CIEUC YI KHIEUKH
+ 0xA38F: 0xC9BD, //HANGUL SYLLABLE CIEUC YI THIEUTH
+ 0xA390: 0xC9BE, //HANGUL SYLLABLE CIEUC YI PHIEUPH
+ 0xA391: 0xC9BF, //HANGUL SYLLABLE CIEUC YI HIEUH
+ 0xA392: 0xC9C2, //HANGUL SYLLABLE CIEUC I SSANGKIYEOK
+ 0xA393: 0xC9C3, //HANGUL SYLLABLE CIEUC I KIYEOKSIOS
+ 0xA394: 0xC9C5, //HANGUL SYLLABLE CIEUC I NIEUNCIEUC
+ 0xA395: 0xC9C6, //HANGUL SYLLABLE CIEUC I NIEUNHIEUH
+ 0xA396: 0xC9C9, //HANGUL SYLLABLE CIEUC I RIEULKIYEOK
+ 0xA397: 0xC9CB, //HANGUL SYLLABLE CIEUC I RIEULPIEUP
+ 0xA398: 0xC9CC, //HANGUL SYLLABLE CIEUC I RIEULSIOS
+ 0xA399: 0xC9CD, //HANGUL SYLLABLE CIEUC I RIEULTHIEUTH
+ 0xA39A: 0xC9CE, //HANGUL SYLLABLE CIEUC I RIEULPHIEUPH
+ 0xA39B: 0xC9CF, //HANGUL SYLLABLE CIEUC I RIEULHIEUH
+ 0xA39C: 0xC9D2, //HANGUL SYLLABLE CIEUC I PIEUPSIOS
+ 0xA39D: 0xC9D4, //HANGUL SYLLABLE CIEUC I SSANGSIOS
+ 0xA39E: 0xC9D7, //HANGUL SYLLABLE CIEUC I CHIEUCH
+ 0xA39F: 0xC9D8, //HANGUL SYLLABLE CIEUC I KHIEUKH
+ 0xA3A0: 0xC9DB, //HANGUL SYLLABLE CIEUC I HIEUH
+ 0xA3A1: 0xFF01, //FULLWIDTH EXCLAMATION MARK
+ 0xA3A2: 0xFF02, //FULLWIDTH QUOTATION MARK
+ 0xA3A3: 0xFF03, //FULLWIDTH NUMBER SIGN
+ 0xA3A4: 0xFF04, //FULLWIDTH DOLLAR SIGN
+ 0xA3A5: 0xFF05, //FULLWIDTH PERCENT SIGN
+ 0xA3A6: 0xFF06, //FULLWIDTH AMPERSAND
+ 0xA3A7: 0xFF07, //FULLWIDTH APOSTROPHE
+ 0xA3A8: 0xFF08, //FULLWIDTH LEFT PARENTHESIS
+ 0xA3A9: 0xFF09, //FULLWIDTH RIGHT PARENTHESIS
+ 0xA3AA: 0xFF0A, //FULLWIDTH ASTERISK
+ 0xA3AB: 0xFF0B, //FULLWIDTH PLUS SIGN
+ 0xA3AC: 0xFF0C, //FULLWIDTH COMMA
+ 0xA3AD: 0xFF0D, //FULLWIDTH HYPHEN-MINUS
+ 0xA3AE: 0xFF0E, //FULLWIDTH FULL STOP
+ 0xA3AF: 0xFF0F, //FULLWIDTH SOLIDUS
+ 0xA3B0: 0xFF10, //FULLWIDTH DIGIT ZERO
+ 0xA3B1: 0xFF11, //FULLWIDTH DIGIT ONE
+ 0xA3B2: 0xFF12, //FULLWIDTH DIGIT TWO
+ 0xA3B3: 0xFF13, //FULLWIDTH DIGIT THREE
+ 0xA3B4: 0xFF14, //FULLWIDTH DIGIT FOUR
+ 0xA3B5: 0xFF15, //FULLWIDTH DIGIT FIVE
+ 0xA3B6: 0xFF16, //FULLWIDTH DIGIT SIX
+ 0xA3B7: 0xFF17, //FULLWIDTH DIGIT SEVEN
+ 0xA3B8: 0xFF18, //FULLWIDTH DIGIT EIGHT
+ 0xA3B9: 0xFF19, //FULLWIDTH DIGIT NINE
+ 0xA3BA: 0xFF1A, //FULLWIDTH COLON
+ 0xA3BB: 0xFF1B, //FULLWIDTH SEMICOLON
+ 0xA3BC: 0xFF1C, //FULLWIDTH LESS-THAN SIGN
+ 0xA3BD: 0xFF1D, //FULLWIDTH EQUALS SIGN
+ 0xA3BE: 0xFF1E, //FULLWIDTH GREATER-THAN SIGN
+ 0xA3BF: 0xFF1F, //FULLWIDTH QUESTION MARK
+ 0xA3C0: 0xFF20, //FULLWIDTH COMMERCIAL AT
+ 0xA3C1: 0xFF21, //FULLWIDTH LATIN CAPITAL LETTER A
+ 0xA3C2: 0xFF22, //FULLWIDTH LATIN CAPITAL LETTER B
+ 0xA3C3: 0xFF23, //FULLWIDTH LATIN CAPITAL LETTER C
+ 0xA3C4: 0xFF24, //FULLWIDTH LATIN CAPITAL LETTER D
+ 0xA3C5: 0xFF25, //FULLWIDTH LATIN CAPITAL LETTER E
+ 0xA3C6: 0xFF26, //FULLWIDTH LATIN CAPITAL LETTER F
+ 0xA3C7: 0xFF27, //FULLWIDTH LATIN CAPITAL LETTER G
+ 0xA3C8: 0xFF28, //FULLWIDTH LATIN CAPITAL LETTER H
+ 0xA3C9: 0xFF29, //FULLWIDTH LATIN CAPITAL LETTER I
+ 0xA3CA: 0xFF2A, //FULLWIDTH LATIN CAPITAL LETTER J
+ 0xA3CB: 0xFF2B, //FULLWIDTH LATIN CAPITAL LETTER K
+ 0xA3CC: 0xFF2C, //FULLWIDTH LATIN CAPITAL LETTER L
+ 0xA3CD: 0xFF2D, //FULLWIDTH LATIN CAPITAL LETTER M
+ 0xA3CE: 0xFF2E, //FULLWIDTH LATIN CAPITAL LETTER N
+ 0xA3CF: 0xFF2F, //FULLWIDTH LATIN CAPITAL LETTER O
+ 0xA3D0: 0xFF30, //FULLWIDTH LATIN CAPITAL LETTER P
+ 0xA3D1: 0xFF31, //FULLWIDTH LATIN CAPITAL LETTER Q
+ 0xA3D2: 0xFF32, //FULLWIDTH LATIN CAPITAL LETTER R
+ 0xA3D3: 0xFF33, //FULLWIDTH LATIN CAPITAL LETTER S
+ 0xA3D4: 0xFF34, //FULLWIDTH LATIN CAPITAL LETTER T
+ 0xA3D5: 0xFF35, //FULLWIDTH LATIN CAPITAL LETTER U
+ 0xA3D6: 0xFF36, //FULLWIDTH LATIN CAPITAL LETTER V
+ 0xA3D7: 0xFF37, //FULLWIDTH LATIN CAPITAL LETTER W
+ 0xA3D8: 0xFF38, //FULLWIDTH LATIN CAPITAL LETTER X
+ 0xA3D9: 0xFF39, //FULLWIDTH LATIN CAPITAL LETTER Y
+ 0xA3DA: 0xFF3A, //FULLWIDTH LATIN CAPITAL LETTER Z
+ 0xA3DB: 0xFF3B, //FULLWIDTH LEFT SQUARE BRACKET
+ 0xA3DC: 0xFFE6, //FULLWIDTH WON SIGN
+ 0xA3DD: 0xFF3D, //FULLWIDTH RIGHT SQUARE BRACKET
+ 0xA3DE: 0xFF3E, //FULLWIDTH CIRCUMFLEX ACCENT
+ 0xA3DF: 0xFF3F, //FULLWIDTH LOW LINE
+ 0xA3E0: 0xFF40, //FULLWIDTH GRAVE ACCENT
+ 0xA3E1: 0xFF41, //FULLWIDTH LATIN SMALL LETTER A
+ 0xA3E2: 0xFF42, //FULLWIDTH LATIN SMALL LETTER B
+ 0xA3E3: 0xFF43, //FULLWIDTH LATIN SMALL LETTER C
+ 0xA3E4: 0xFF44, //FULLWIDTH LATIN SMALL LETTER D
+ 0xA3E5: 0xFF45, //FULLWIDTH LATIN SMALL LETTER E
+ 0xA3E6: 0xFF46, //FULLWIDTH LATIN SMALL LETTER F
+ 0xA3E7: 0xFF47, //FULLWIDTH LATIN SMALL LETTER G
+ 0xA3E8: 0xFF48, //FULLWIDTH LATIN SMALL LETTER H
+ 0xA3E9: 0xFF49, //FULLWIDTH LATIN SMALL LETTER I
+ 0xA3EA: 0xFF4A, //FULLWIDTH LATIN SMALL LETTER J
+ 0xA3EB: 0xFF4B, //FULLWIDTH LATIN SMALL LETTER K
+ 0xA3EC: 0xFF4C, //FULLWIDTH LATIN SMALL LETTER L
+ 0xA3ED: 0xFF4D, //FULLWIDTH LATIN SMALL LETTER M
+ 0xA3EE: 0xFF4E, //FULLWIDTH LATIN SMALL LETTER N
+ 0xA3EF: 0xFF4F, //FULLWIDTH LATIN SMALL LETTER O
+ 0xA3F0: 0xFF50, //FULLWIDTH LATIN SMALL LETTER P
+ 0xA3F1: 0xFF51, //FULLWIDTH LATIN SMALL LETTER Q
+ 0xA3F2: 0xFF52, //FULLWIDTH LATIN SMALL LETTER R
+ 0xA3F3: 0xFF53, //FULLWIDTH LATIN SMALL LETTER S
+ 0xA3F4: 0xFF54, //FULLWIDTH LATIN SMALL LETTER T
+ 0xA3F5: 0xFF55, //FULLWIDTH LATIN SMALL LETTER U
+ 0xA3F6: 0xFF56, //FULLWIDTH LATIN SMALL LETTER V
+ 0xA3F7: 0xFF57, //FULLWIDTH LATIN SMALL LETTER W
+ 0xA3F8: 0xFF58, //FULLWIDTH LATIN SMALL LETTER X
+ 0xA3F9: 0xFF59, //FULLWIDTH LATIN SMALL LETTER Y
+ 0xA3FA: 0xFF5A, //FULLWIDTH LATIN SMALL LETTER Z
+ 0xA3FB: 0xFF5B, //FULLWIDTH LEFT CURLY BRACKET
+ 0xA3FC: 0xFF5C, //FULLWIDTH VERTICAL LINE
+ 0xA3FD: 0xFF5D, //FULLWIDTH RIGHT CURLY BRACKET
+ 0xA3FE: 0xFFE3, //FULLWIDTH MACRON
+ 0xA441: 0xC9DE, //HANGUL SYLLABLE SSANGCIEUC A SSANGKIYEOK
+ 0xA442: 0xC9DF, //HANGUL SYLLABLE SSANGCIEUC A KIYEOKSIOS
+ 0xA443: 0xC9E1, //HANGUL SYLLABLE SSANGCIEUC A NIEUNCIEUC
+ 0xA444: 0xC9E3, //HANGUL SYLLABLE SSANGCIEUC A TIKEUT
+ 0xA445: 0xC9E5, //HANGUL SYLLABLE SSANGCIEUC A RIEULKIYEOK
+ 0xA446: 0xC9E6, //HANGUL SYLLABLE SSANGCIEUC A RIEULMIEUM
+ 0xA447: 0xC9E8, //HANGUL SYLLABLE SSANGCIEUC A RIEULSIOS
+ 0xA448: 0xC9E9, //HANGUL SYLLABLE SSANGCIEUC A RIEULTHIEUTH
+ 0xA449: 0xC9EA, //HANGUL SYLLABLE SSANGCIEUC A RIEULPHIEUPH
+ 0xA44A: 0xC9EB, //HANGUL SYLLABLE SSANGCIEUC A RIEULHIEUH
+ 0xA44B: 0xC9EE, //HANGUL SYLLABLE SSANGCIEUC A PIEUPSIOS
+ 0xA44C: 0xC9F2, //HANGUL SYLLABLE SSANGCIEUC A CIEUC
+ 0xA44D: 0xC9F3, //HANGUL SYLLABLE SSANGCIEUC A CHIEUCH
+ 0xA44E: 0xC9F4, //HANGUL SYLLABLE SSANGCIEUC A KHIEUKH
+ 0xA44F: 0xC9F5, //HANGUL SYLLABLE SSANGCIEUC A THIEUTH
+ 0xA450: 0xC9F6, //HANGUL SYLLABLE SSANGCIEUC A PHIEUPH
+ 0xA451: 0xC9F7, //HANGUL SYLLABLE SSANGCIEUC A HIEUH
+ 0xA452: 0xC9FA, //HANGUL SYLLABLE SSANGCIEUC AE SSANGKIYEOK
+ 0xA453: 0xC9FB, //HANGUL SYLLABLE SSANGCIEUC AE KIYEOKSIOS
+ 0xA454: 0xC9FD, //HANGUL SYLLABLE SSANGCIEUC AE NIEUNCIEUC
+ 0xA455: 0xC9FE, //HANGUL SYLLABLE SSANGCIEUC AE NIEUNHIEUH
+ 0xA456: 0xC9FF, //HANGUL SYLLABLE SSANGCIEUC AE TIKEUT
+ 0xA457: 0xCA01, //HANGUL SYLLABLE SSANGCIEUC AE RIEULKIYEOK
+ 0xA458: 0xCA02, //HANGUL SYLLABLE SSANGCIEUC AE RIEULMIEUM
+ 0xA459: 0xCA03, //HANGUL SYLLABLE SSANGCIEUC AE RIEULPIEUP
+ 0xA45A: 0xCA04, //HANGUL SYLLABLE SSANGCIEUC AE RIEULSIOS
+ 0xA461: 0xCA05, //HANGUL SYLLABLE SSANGCIEUC AE RIEULTHIEUTH
+ 0xA462: 0xCA06, //HANGUL SYLLABLE SSANGCIEUC AE RIEULPHIEUPH
+ 0xA463: 0xCA07, //HANGUL SYLLABLE SSANGCIEUC AE RIEULHIEUH
+ 0xA464: 0xCA0A, //HANGUL SYLLABLE SSANGCIEUC AE PIEUPSIOS
+ 0xA465: 0xCA0E, //HANGUL SYLLABLE SSANGCIEUC AE CIEUC
+ 0xA466: 0xCA0F, //HANGUL SYLLABLE SSANGCIEUC AE CHIEUCH
+ 0xA467: 0xCA10, //HANGUL SYLLABLE SSANGCIEUC AE KHIEUKH
+ 0xA468: 0xCA11, //HANGUL SYLLABLE SSANGCIEUC AE THIEUTH
+ 0xA469: 0xCA12, //HANGUL SYLLABLE SSANGCIEUC AE PHIEUPH
+ 0xA46A: 0xCA13, //HANGUL SYLLABLE SSANGCIEUC AE HIEUH
+ 0xA46B: 0xCA15, //HANGUL SYLLABLE SSANGCIEUC YA KIYEOK
+ 0xA46C: 0xCA16, //HANGUL SYLLABLE SSANGCIEUC YA SSANGKIYEOK
+ 0xA46D: 0xCA17, //HANGUL SYLLABLE SSANGCIEUC YA KIYEOKSIOS
+ 0xA46E: 0xCA19, //HANGUL SYLLABLE SSANGCIEUC YA NIEUNCIEUC
+ 0xA46F: 0xCA1A, //HANGUL SYLLABLE SSANGCIEUC YA NIEUNHIEUH
+ 0xA470: 0xCA1B, //HANGUL SYLLABLE SSANGCIEUC YA TIKEUT
+ 0xA471: 0xCA1C, //HANGUL SYLLABLE SSANGCIEUC YA RIEUL
+ 0xA472: 0xCA1D, //HANGUL SYLLABLE SSANGCIEUC YA RIEULKIYEOK
+ 0xA473: 0xCA1E, //HANGUL SYLLABLE SSANGCIEUC YA RIEULMIEUM
+ 0xA474: 0xCA1F, //HANGUL SYLLABLE SSANGCIEUC YA RIEULPIEUP
+ 0xA475: 0xCA20, //HANGUL SYLLABLE SSANGCIEUC YA RIEULSIOS
+ 0xA476: 0xCA21, //HANGUL SYLLABLE SSANGCIEUC YA RIEULTHIEUTH
+ 0xA477: 0xCA22, //HANGUL SYLLABLE SSANGCIEUC YA RIEULPHIEUPH
+ 0xA478: 0xCA23, //HANGUL SYLLABLE SSANGCIEUC YA RIEULHIEUH
+ 0xA479: 0xCA24, //HANGUL SYLLABLE SSANGCIEUC YA MIEUM
+ 0xA47A: 0xCA25, //HANGUL SYLLABLE SSANGCIEUC YA PIEUP
+ 0xA481: 0xCA26, //HANGUL SYLLABLE SSANGCIEUC YA PIEUPSIOS
+ 0xA482: 0xCA27, //HANGUL SYLLABLE SSANGCIEUC YA SIOS
+ 0xA483: 0xCA28, //HANGUL SYLLABLE SSANGCIEUC YA SSANGSIOS
+ 0xA484: 0xCA2A, //HANGUL SYLLABLE SSANGCIEUC YA CIEUC
+ 0xA485: 0xCA2B, //HANGUL SYLLABLE SSANGCIEUC YA CHIEUCH
+ 0xA486: 0xCA2C, //HANGUL SYLLABLE SSANGCIEUC YA KHIEUKH
+ 0xA487: 0xCA2D, //HANGUL SYLLABLE SSANGCIEUC YA THIEUTH
+ 0xA488: 0xCA2E, //HANGUL SYLLABLE SSANGCIEUC YA PHIEUPH
+ 0xA489: 0xCA2F, //HANGUL SYLLABLE SSANGCIEUC YA HIEUH
+ 0xA48A: 0xCA30, //HANGUL SYLLABLE SSANGCIEUC YAE
+ 0xA48B: 0xCA31, //HANGUL SYLLABLE SSANGCIEUC YAE KIYEOK
+ 0xA48C: 0xCA32, //HANGUL SYLLABLE SSANGCIEUC YAE SSANGKIYEOK
+ 0xA48D: 0xCA33, //HANGUL SYLLABLE SSANGCIEUC YAE KIYEOKSIOS
+ 0xA48E: 0xCA34, //HANGUL SYLLABLE SSANGCIEUC YAE NIEUN
+ 0xA48F: 0xCA35, //HANGUL SYLLABLE SSANGCIEUC YAE NIEUNCIEUC
+ 0xA490: 0xCA36, //HANGUL SYLLABLE SSANGCIEUC YAE NIEUNHIEUH
+ 0xA491: 0xCA37, //HANGUL SYLLABLE SSANGCIEUC YAE TIKEUT
+ 0xA492: 0xCA38, //HANGUL SYLLABLE SSANGCIEUC YAE RIEUL
+ 0xA493: 0xCA39, //HANGUL SYLLABLE SSANGCIEUC YAE RIEULKIYEOK
+ 0xA494: 0xCA3A, //HANGUL SYLLABLE SSANGCIEUC YAE RIEULMIEUM
+ 0xA495: 0xCA3B, //HANGUL SYLLABLE SSANGCIEUC YAE RIEULPIEUP
+ 0xA496: 0xCA3C, //HANGUL SYLLABLE SSANGCIEUC YAE RIEULSIOS
+ 0xA497: 0xCA3D, //HANGUL SYLLABLE SSANGCIEUC YAE RIEULTHIEUTH
+ 0xA498: 0xCA3E, //HANGUL SYLLABLE SSANGCIEUC YAE RIEULPHIEUPH
+ 0xA499: 0xCA3F, //HANGUL SYLLABLE SSANGCIEUC YAE RIEULHIEUH
+ 0xA49A: 0xCA40, //HANGUL SYLLABLE SSANGCIEUC YAE MIEUM
+ 0xA49B: 0xCA41, //HANGUL SYLLABLE SSANGCIEUC YAE PIEUP
+ 0xA49C: 0xCA42, //HANGUL SYLLABLE SSANGCIEUC YAE PIEUPSIOS
+ 0xA49D: 0xCA43, //HANGUL SYLLABLE SSANGCIEUC YAE SIOS
+ 0xA49E: 0xCA44, //HANGUL SYLLABLE SSANGCIEUC YAE SSANGSIOS
+ 0xA49F: 0xCA45, //HANGUL SYLLABLE SSANGCIEUC YAE IEUNG
+ 0xA4A0: 0xCA46, //HANGUL SYLLABLE SSANGCIEUC YAE CIEUC
+ 0xA4A1: 0x3131, //HANGUL LETTER KIYEOK
+ 0xA4A2: 0x3132, //HANGUL LETTER SSANGKIYEOK
+ 0xA4A3: 0x3133, //HANGUL LETTER KIYEOK-SIOS
+ 0xA4A4: 0x3134, //HANGUL LETTER NIEUN
+ 0xA4A5: 0x3135, //HANGUL LETTER NIEUN-CIEUC
+ 0xA4A6: 0x3136, //HANGUL LETTER NIEUN-HIEUH
+ 0xA4A7: 0x3137, //HANGUL LETTER TIKEUT
+ 0xA4A8: 0x3138, //HANGUL LETTER SSANGTIKEUT
+ 0xA4A9: 0x3139, //HANGUL LETTER RIEUL
+ 0xA4AA: 0x313A, //HANGUL LETTER RIEUL-KIYEOK
+ 0xA4AB: 0x313B, //HANGUL LETTER RIEUL-MIEUM
+ 0xA4AC: 0x313C, //HANGUL LETTER RIEUL-PIEUP
+ 0xA4AD: 0x313D, //HANGUL LETTER RIEUL-SIOS
+ 0xA4AE: 0x313E, //HANGUL LETTER RIEUL-THIEUTH
+ 0xA4AF: 0x313F, //HANGUL LETTER RIEUL-PHIEUPH
+ 0xA4B0: 0x3140, //HANGUL LETTER RIEUL-HIEUH
+ 0xA4B1: 0x3141, //HANGUL LETTER MIEUM
+ 0xA4B2: 0x3142, //HANGUL LETTER PIEUP
+ 0xA4B3: 0x3143, //HANGUL LETTER SSANGPIEUP
+ 0xA4B4: 0x3144, //HANGUL LETTER PIEUP-SIOS
+ 0xA4B5: 0x3145, //HANGUL LETTER SIOS
+ 0xA4B6: 0x3146, //HANGUL LETTER SSANGSIOS
+ 0xA4B7: 0x3147, //HANGUL LETTER IEUNG
+ 0xA4B8: 0x3148, //HANGUL LETTER CIEUC
+ 0xA4B9: 0x3149, //HANGUL LETTER SSANGCIEUC
+ 0xA4BA: 0x314A, //HANGUL LETTER CHIEUCH
+ 0xA4BB: 0x314B, //HANGUL LETTER KHIEUKH
+ 0xA4BC: 0x314C, //HANGUL LETTER THIEUTH
+ 0xA4BD: 0x314D, //HANGUL LETTER PHIEUPH
+ 0xA4BE: 0x314E, //HANGUL LETTER HIEUH
+ 0xA4BF: 0x314F, //HANGUL LETTER A
+ 0xA4C0: 0x3150, //HANGUL LETTER AE
+ 0xA4C1: 0x3151, //HANGUL LETTER YA
+ 0xA4C2: 0x3152, //HANGUL LETTER YAE
+ 0xA4C3: 0x3153, //HANGUL LETTER EO
+ 0xA4C4: 0x3154, //HANGUL LETTER E
+ 0xA4C5: 0x3155, //HANGUL LETTER YEO
+ 0xA4C6: 0x3156, //HANGUL LETTER YE
+ 0xA4C7: 0x3157, //HANGUL LETTER O
+ 0xA4C8: 0x3158, //HANGUL LETTER WA
+ 0xA4C9: 0x3159, //HANGUL LETTER WAE
+ 0xA4CA: 0x315A, //HANGUL LETTER OE
+ 0xA4CB: 0x315B, //HANGUL LETTER YO
+ 0xA4CC: 0x315C, //HANGUL LETTER U
+ 0xA4CD: 0x315D, //HANGUL LETTER WEO
+ 0xA4CE: 0x315E, //HANGUL LETTER WE
+ 0xA4CF: 0x315F, //HANGUL LETTER WI
+ 0xA4D0: 0x3160, //HANGUL LETTER YU
+ 0xA4D1: 0x3161, //HANGUL LETTER EU
+ 0xA4D2: 0x3162, //HANGUL LETTER YI
+ 0xA4D3: 0x3163, //HANGUL LETTER I
+ 0xA4D4: 0x3164, //HANGUL FILLER
+ 0xA4D5: 0x3165, //HANGUL LETTER SSANGNIEUN
+ 0xA4D6: 0x3166, //HANGUL LETTER NIEUN-TIKEUT
+ 0xA4D7: 0x3167, //HANGUL LETTER NIEUN-SIOS
+ 0xA4D8: 0x3168, //HANGUL LETTER NIEUN-PANSIOS
+ 0xA4D9: 0x3169, //HANGUL LETTER RIEUL-KIYEOK-SIOS
+ 0xA4DA: 0x316A, //HANGUL LETTER RIEUL-TIKEUT
+ 0xA4DB: 0x316B, //HANGUL LETTER RIEUL-PIEUP-SIOS
+ 0xA4DC: 0x316C, //HANGUL LETTER RIEUL-PANSIOS
+ 0xA4DD: 0x316D, //HANGUL LETTER RIEUL-YEORINHIEUH
+ 0xA4DE: 0x316E, //HANGUL LETTER MIEUM-PIEUP
+ 0xA4DF: 0x316F, //HANGUL LETTER MIEUM-SIOS
+ 0xA4E0: 0x3170, //HANGUL LETTER MIEUM-PANSIOS
+ 0xA4E1: 0x3171, //HANGUL LETTER KAPYEOUNMIEUM
+ 0xA4E2: 0x3172, //HANGUL LETTER PIEUP-KIYEOK
+ 0xA4E3: 0x3173, //HANGUL LETTER PIEUP-TIKEUT
+ 0xA4E4: 0x3174, //HANGUL LETTER PIEUP-SIOS-KIYEOK
+ 0xA4E5: 0x3175, //HANGUL LETTER PIEUP-SIOS-TIKEUT
+ 0xA4E6: 0x3176, //HANGUL LETTER PIEUP-CIEUC
+ 0xA4E7: 0x3177, //HANGUL LETTER PIEUP-THIEUTH
+ 0xA4E8: 0x3178, //HANGUL LETTER KAPYEOUNPIEUP
+ 0xA4E9: 0x3179, //HANGUL LETTER KAPYEOUNSSANGPIEUP
+ 0xA4EA: 0x317A, //HANGUL LETTER SIOS-KIYEOK
+ 0xA4EB: 0x317B, //HANGUL LETTER SIOS-NIEUN
+ 0xA4EC: 0x317C, //HANGUL LETTER SIOS-TIKEUT
+ 0xA4ED: 0x317D, //HANGUL LETTER SIOS-PIEUP
+ 0xA4EE: 0x317E, //HANGUL LETTER SIOS-CIEUC
+ 0xA4EF: 0x317F, //HANGUL LETTER PANSIOS
+ 0xA4F0: 0x3180, //HANGUL LETTER SSANGIEUNG
+ 0xA4F1: 0x3181, //HANGUL LETTER YESIEUNG
+ 0xA4F2: 0x3182, //HANGUL LETTER YESIEUNG-SIOS
+ 0xA4F3: 0x3183, //HANGUL LETTER YESIEUNG-PANSIOS
+ 0xA4F4: 0x3184, //HANGUL LETTER KAPYEOUNPHIEUPH
+ 0xA4F5: 0x3185, //HANGUL LETTER SSANGHIEUH
+ 0xA4F6: 0x3186, //HANGUL LETTER YEORINHIEUH
+ 0xA4F7: 0x3187, //HANGUL LETTER YO-YA
+ 0xA4F8: 0x3188, //HANGUL LETTER YO-YAE
+ 0xA4F9: 0x3189, //HANGUL LETTER YO-I
+ 0xA4FA: 0x318A, //HANGUL LETTER YU-YEO
+ 0xA4FB: 0x318B, //HANGUL LETTER YU-YE
+ 0xA4FC: 0x318C, //HANGUL LETTER YU-I
+ 0xA4FD: 0x318D, //HANGUL LETTER ARAEA
+ 0xA4FE: 0x318E, //HANGUL LETTER ARAEAE
+ 0xA541: 0xCA47, //HANGUL SYLLABLE SSANGCIEUC YAE CHIEUCH
+ 0xA542: 0xCA48, //HANGUL SYLLABLE SSANGCIEUC YAE KHIEUKH
+ 0xA543: 0xCA49, //HANGUL SYLLABLE SSANGCIEUC YAE THIEUTH
+ 0xA544: 0xCA4A, //HANGUL SYLLABLE SSANGCIEUC YAE PHIEUPH
+ 0xA545: 0xCA4B, //HANGUL SYLLABLE SSANGCIEUC YAE HIEUH
+ 0xA546: 0xCA4E, //HANGUL SYLLABLE SSANGCIEUC EO SSANGKIYEOK
+ 0xA547: 0xCA4F, //HANGUL SYLLABLE SSANGCIEUC EO KIYEOKSIOS
+ 0xA548: 0xCA51, //HANGUL SYLLABLE SSANGCIEUC EO NIEUNCIEUC
+ 0xA549: 0xCA52, //HANGUL SYLLABLE SSANGCIEUC EO NIEUNHIEUH
+ 0xA54A: 0xCA53, //HANGUL SYLLABLE SSANGCIEUC EO TIKEUT
+ 0xA54B: 0xCA55, //HANGUL SYLLABLE SSANGCIEUC EO RIEULKIYEOK
+ 0xA54C: 0xCA56, //HANGUL SYLLABLE SSANGCIEUC EO RIEULMIEUM
+ 0xA54D: 0xCA57, //HANGUL SYLLABLE SSANGCIEUC EO RIEULPIEUP
+ 0xA54E: 0xCA58, //HANGUL SYLLABLE SSANGCIEUC EO RIEULSIOS
+ 0xA54F: 0xCA59, //HANGUL SYLLABLE SSANGCIEUC EO RIEULTHIEUTH
+ 0xA550: 0xCA5A, //HANGUL SYLLABLE SSANGCIEUC EO RIEULPHIEUPH
+ 0xA551: 0xCA5B, //HANGUL SYLLABLE SSANGCIEUC EO RIEULHIEUH
+ 0xA552: 0xCA5E, //HANGUL SYLLABLE SSANGCIEUC EO PIEUPSIOS
+ 0xA553: 0xCA62, //HANGUL SYLLABLE SSANGCIEUC EO CIEUC
+ 0xA554: 0xCA63, //HANGUL SYLLABLE SSANGCIEUC EO CHIEUCH
+ 0xA555: 0xCA64, //HANGUL SYLLABLE SSANGCIEUC EO KHIEUKH
+ 0xA556: 0xCA65, //HANGUL SYLLABLE SSANGCIEUC EO THIEUTH
+ 0xA557: 0xCA66, //HANGUL SYLLABLE SSANGCIEUC EO PHIEUPH
+ 0xA558: 0xCA67, //HANGUL SYLLABLE SSANGCIEUC EO HIEUH
+ 0xA559: 0xCA69, //HANGUL SYLLABLE SSANGCIEUC E KIYEOK
+ 0xA55A: 0xCA6A, //HANGUL SYLLABLE SSANGCIEUC E SSANGKIYEOK
+ 0xA561: 0xCA6B, //HANGUL SYLLABLE SSANGCIEUC E KIYEOKSIOS
+ 0xA562: 0xCA6C, //HANGUL SYLLABLE SSANGCIEUC E NIEUN
+ 0xA563: 0xCA6D, //HANGUL SYLLABLE SSANGCIEUC E NIEUNCIEUC
+ 0xA564: 0xCA6E, //HANGUL SYLLABLE SSANGCIEUC E NIEUNHIEUH
+ 0xA565: 0xCA6F, //HANGUL SYLLABLE SSANGCIEUC E TIKEUT
+ 0xA566: 0xCA70, //HANGUL SYLLABLE SSANGCIEUC E RIEUL
+ 0xA567: 0xCA71, //HANGUL SYLLABLE SSANGCIEUC E RIEULKIYEOK
+ 0xA568: 0xCA72, //HANGUL SYLLABLE SSANGCIEUC E RIEULMIEUM
+ 0xA569: 0xCA73, //HANGUL SYLLABLE SSANGCIEUC E RIEULPIEUP
+ 0xA56A: 0xCA74, //HANGUL SYLLABLE SSANGCIEUC E RIEULSIOS
+ 0xA56B: 0xCA75, //HANGUL SYLLABLE SSANGCIEUC E RIEULTHIEUTH
+ 0xA56C: 0xCA76, //HANGUL SYLLABLE SSANGCIEUC E RIEULPHIEUPH
+ 0xA56D: 0xCA77, //HANGUL SYLLABLE SSANGCIEUC E RIEULHIEUH
+ 0xA56E: 0xCA78, //HANGUL SYLLABLE SSANGCIEUC E MIEUM
+ 0xA56F: 0xCA79, //HANGUL SYLLABLE SSANGCIEUC E PIEUP
+ 0xA570: 0xCA7A, //HANGUL SYLLABLE SSANGCIEUC E PIEUPSIOS
+ 0xA571: 0xCA7B, //HANGUL SYLLABLE SSANGCIEUC E SIOS
+ 0xA572: 0xCA7C, //HANGUL SYLLABLE SSANGCIEUC E SSANGSIOS
+ 0xA573: 0xCA7E, //HANGUL SYLLABLE SSANGCIEUC E CIEUC
+ 0xA574: 0xCA7F, //HANGUL SYLLABLE SSANGCIEUC E CHIEUCH
+ 0xA575: 0xCA80, //HANGUL SYLLABLE SSANGCIEUC E KHIEUKH
+ 0xA576: 0xCA81, //HANGUL SYLLABLE SSANGCIEUC E THIEUTH
+ 0xA577: 0xCA82, //HANGUL SYLLABLE SSANGCIEUC E PHIEUPH
+ 0xA578: 0xCA83, //HANGUL SYLLABLE SSANGCIEUC E HIEUH
+ 0xA579: 0xCA85, //HANGUL SYLLABLE SSANGCIEUC YEO KIYEOK
+ 0xA57A: 0xCA86, //HANGUL SYLLABLE SSANGCIEUC YEO SSANGKIYEOK
+ 0xA581: 0xCA87, //HANGUL SYLLABLE SSANGCIEUC YEO KIYEOKSIOS
+ 0xA582: 0xCA88, //HANGUL SYLLABLE SSANGCIEUC YEO NIEUN
+ 0xA583: 0xCA89, //HANGUL SYLLABLE SSANGCIEUC YEO NIEUNCIEUC
+ 0xA584: 0xCA8A, //HANGUL SYLLABLE SSANGCIEUC YEO NIEUNHIEUH
+ 0xA585: 0xCA8B, //HANGUL SYLLABLE SSANGCIEUC YEO TIKEUT
+ 0xA586: 0xCA8C, //HANGUL SYLLABLE SSANGCIEUC YEO RIEUL
+ 0xA587: 0xCA8D, //HANGUL SYLLABLE SSANGCIEUC YEO RIEULKIYEOK
+ 0xA588: 0xCA8E, //HANGUL SYLLABLE SSANGCIEUC YEO RIEULMIEUM
+ 0xA589: 0xCA8F, //HANGUL SYLLABLE SSANGCIEUC YEO RIEULPIEUP
+ 0xA58A: 0xCA90, //HANGUL SYLLABLE SSANGCIEUC YEO RIEULSIOS
+ 0xA58B: 0xCA91, //HANGUL SYLLABLE SSANGCIEUC YEO RIEULTHIEUTH
+ 0xA58C: 0xCA92, //HANGUL SYLLABLE SSANGCIEUC YEO RIEULPHIEUPH
+ 0xA58D: 0xCA93, //HANGUL SYLLABLE SSANGCIEUC YEO RIEULHIEUH
+ 0xA58E: 0xCA94, //HANGUL SYLLABLE SSANGCIEUC YEO MIEUM
+ 0xA58F: 0xCA95, //HANGUL SYLLABLE SSANGCIEUC YEO PIEUP
+ 0xA590: 0xCA96, //HANGUL SYLLABLE SSANGCIEUC YEO PIEUPSIOS
+ 0xA591: 0xCA97, //HANGUL SYLLABLE SSANGCIEUC YEO SIOS
+ 0xA592: 0xCA99, //HANGUL SYLLABLE SSANGCIEUC YEO IEUNG
+ 0xA593: 0xCA9A, //HANGUL SYLLABLE SSANGCIEUC YEO CIEUC
+ 0xA594: 0xCA9B, //HANGUL SYLLABLE SSANGCIEUC YEO CHIEUCH
+ 0xA595: 0xCA9C, //HANGUL SYLLABLE SSANGCIEUC YEO KHIEUKH
+ 0xA596: 0xCA9D, //HANGUL SYLLABLE SSANGCIEUC YEO THIEUTH
+ 0xA597: 0xCA9E, //HANGUL SYLLABLE SSANGCIEUC YEO PHIEUPH
+ 0xA598: 0xCA9F, //HANGUL SYLLABLE SSANGCIEUC YEO HIEUH
+ 0xA599: 0xCAA0, //HANGUL SYLLABLE SSANGCIEUC YE
+ 0xA59A: 0xCAA1, //HANGUL SYLLABLE SSANGCIEUC YE KIYEOK
+ 0xA59B: 0xCAA2, //HANGUL SYLLABLE SSANGCIEUC YE SSANGKIYEOK
+ 0xA59C: 0xCAA3, //HANGUL SYLLABLE SSANGCIEUC YE KIYEOKSIOS
+ 0xA59D: 0xCAA4, //HANGUL SYLLABLE SSANGCIEUC YE NIEUN
+ 0xA59E: 0xCAA5, //HANGUL SYLLABLE SSANGCIEUC YE NIEUNCIEUC
+ 0xA59F: 0xCAA6, //HANGUL SYLLABLE SSANGCIEUC YE NIEUNHIEUH
+ 0xA5A0: 0xCAA7, //HANGUL SYLLABLE SSANGCIEUC YE TIKEUT
+ 0xA5A1: 0x2170, //SMALL ROMAN NUMERAL ONE
+ 0xA5A2: 0x2171, //SMALL ROMAN NUMERAL TWO
+ 0xA5A3: 0x2172, //SMALL ROMAN NUMERAL THREE
+ 0xA5A4: 0x2173, //SMALL ROMAN NUMERAL FOUR
+ 0xA5A5: 0x2174, //SMALL ROMAN NUMERAL FIVE
+ 0xA5A6: 0x2175, //SMALL ROMAN NUMERAL SIX
+ 0xA5A7: 0x2176, //SMALL ROMAN NUMERAL SEVEN
+ 0xA5A8: 0x2177, //SMALL ROMAN NUMERAL EIGHT
+ 0xA5A9: 0x2178, //SMALL ROMAN NUMERAL NINE
+ 0xA5AA: 0x2179, //SMALL ROMAN NUMERAL TEN
+ 0xA5B0: 0x2160, //ROMAN NUMERAL ONE
+ 0xA5B1: 0x2161, //ROMAN NUMERAL TWO
+ 0xA5B2: 0x2162, //ROMAN NUMERAL THREE
+ 0xA5B3: 0x2163, //ROMAN NUMERAL FOUR
+ 0xA5B4: 0x2164, //ROMAN NUMERAL FIVE
+ 0xA5B5: 0x2165, //ROMAN NUMERAL SIX
+ 0xA5B6: 0x2166, //ROMAN NUMERAL SEVEN
+ 0xA5B7: 0x2167, //ROMAN NUMERAL EIGHT
+ 0xA5B8: 0x2168, //ROMAN NUMERAL NINE
+ 0xA5B9: 0x2169, //ROMAN NUMERAL TEN
+ 0xA5C1: 0x0391, //GREEK CAPITAL LETTER ALPHA
+ 0xA5C2: 0x0392, //GREEK CAPITAL LETTER BETA
+ 0xA5C3: 0x0393, //GREEK CAPITAL LETTER GAMMA
+ 0xA5C4: 0x0394, //GREEK CAPITAL LETTER DELTA
+ 0xA5C5: 0x0395, //GREEK CAPITAL LETTER EPSILON
+ 0xA5C6: 0x0396, //GREEK CAPITAL LETTER ZETA
+ 0xA5C7: 0x0397, //GREEK CAPITAL LETTER ETA
+ 0xA5C8: 0x0398, //GREEK CAPITAL LETTER THETA
+ 0xA5C9: 0x0399, //GREEK CAPITAL LETTER IOTA
+ 0xA5CA: 0x039A, //GREEK CAPITAL LETTER KAPPA
+ 0xA5CB: 0x039B, //GREEK CAPITAL LETTER LAMDA
+ 0xA5CC: 0x039C, //GREEK CAPITAL LETTER MU
+ 0xA5CD: 0x039D, //GREEK CAPITAL LETTER NU
+ 0xA5CE: 0x039E, //GREEK CAPITAL LETTER XI
+ 0xA5CF: 0x039F, //GREEK CAPITAL LETTER OMICRON
+ 0xA5D0: 0x03A0, //GREEK CAPITAL LETTER PI
+ 0xA5D1: 0x03A1, //GREEK CAPITAL LETTER RHO
+ 0xA5D2: 0x03A3, //GREEK CAPITAL LETTER SIGMA
+ 0xA5D3: 0x03A4, //GREEK CAPITAL LETTER TAU
+ 0xA5D4: 0x03A5, //GREEK CAPITAL LETTER UPSILON
+ 0xA5D5: 0x03A6, //GREEK CAPITAL LETTER PHI
+ 0xA5D6: 0x03A7, //GREEK CAPITAL LETTER CHI
+ 0xA5D7: 0x03A8, //GREEK CAPITAL LETTER PSI
+ 0xA5D8: 0x03A9, //GREEK CAPITAL LETTER OMEGA
+ 0xA5E1: 0x03B1, //GREEK SMALL LETTER ALPHA
+ 0xA5E2: 0x03B2, //GREEK SMALL LETTER BETA
+ 0xA5E3: 0x03B3, //GREEK SMALL LETTER GAMMA
+ 0xA5E4: 0x03B4, //GREEK SMALL LETTER DELTA
+ 0xA5E5: 0x03B5, //GREEK SMALL LETTER EPSILON
+ 0xA5E6: 0x03B6, //GREEK SMALL LETTER ZETA
+ 0xA5E7: 0x03B7, //GREEK SMALL LETTER ETA
+ 0xA5E8: 0x03B8, //GREEK SMALL LETTER THETA
+ 0xA5E9: 0x03B9, //GREEK SMALL LETTER IOTA
+ 0xA5EA: 0x03BA, //GREEK SMALL LETTER KAPPA
+ 0xA5EB: 0x03BB, //GREEK SMALL LETTER LAMDA
+ 0xA5EC: 0x03BC, //GREEK SMALL LETTER MU
+ 0xA5ED: 0x03BD, //GREEK SMALL LETTER NU
+ 0xA5EE: 0x03BE, //GREEK SMALL LETTER XI
+ 0xA5EF: 0x03BF, //GREEK SMALL LETTER OMICRON
+ 0xA5F0: 0x03C0, //GREEK SMALL LETTER PI
+ 0xA5F1: 0x03C1, //GREEK SMALL LETTER RHO
+ 0xA5F2: 0x03C3, //GREEK SMALL LETTER SIGMA
+ 0xA5F3: 0x03C4, //GREEK SMALL LETTER TAU
+ 0xA5F4: 0x03C5, //GREEK SMALL LETTER UPSILON
+ 0xA5F5: 0x03C6, //GREEK SMALL LETTER PHI
+ 0xA5F6: 0x03C7, //GREEK SMALL LETTER CHI
+ 0xA5F7: 0x03C8, //GREEK SMALL LETTER PSI
+ 0xA5F8: 0x03C9, //GREEK SMALL LETTER OMEGA
+ 0xA641: 0xCAA8, //HANGUL SYLLABLE SSANGCIEUC YE RIEUL
+ 0xA642: 0xCAA9, //HANGUL SYLLABLE SSANGCIEUC YE RIEULKIYEOK
+ 0xA643: 0xCAAA, //HANGUL SYLLABLE SSANGCIEUC YE RIEULMIEUM
+ 0xA644: 0xCAAB, //HANGUL SYLLABLE SSANGCIEUC YE RIEULPIEUP
+ 0xA645: 0xCAAC, //HANGUL SYLLABLE SSANGCIEUC YE RIEULSIOS
+ 0xA646: 0xCAAD, //HANGUL SYLLABLE SSANGCIEUC YE RIEULTHIEUTH
+ 0xA647: 0xCAAE, //HANGUL SYLLABLE SSANGCIEUC YE RIEULPHIEUPH
+ 0xA648: 0xCAAF, //HANGUL SYLLABLE SSANGCIEUC YE RIEULHIEUH
+ 0xA649: 0xCAB0, //HANGUL SYLLABLE SSANGCIEUC YE MIEUM
+ 0xA64A: 0xCAB1, //HANGUL SYLLABLE SSANGCIEUC YE PIEUP
+ 0xA64B: 0xCAB2, //HANGUL SYLLABLE SSANGCIEUC YE PIEUPSIOS
+ 0xA64C: 0xCAB3, //HANGUL SYLLABLE SSANGCIEUC YE SIOS
+ 0xA64D: 0xCAB4, //HANGUL SYLLABLE SSANGCIEUC YE SSANGSIOS
+ 0xA64E: 0xCAB5, //HANGUL SYLLABLE SSANGCIEUC YE IEUNG
+ 0xA64F: 0xCAB6, //HANGUL SYLLABLE SSANGCIEUC YE CIEUC
+ 0xA650: 0xCAB7, //HANGUL SYLLABLE SSANGCIEUC YE CHIEUCH
+ 0xA651: 0xCAB8, //HANGUL SYLLABLE SSANGCIEUC YE KHIEUKH
+ 0xA652: 0xCAB9, //HANGUL SYLLABLE SSANGCIEUC YE THIEUTH
+ 0xA653: 0xCABA, //HANGUL SYLLABLE SSANGCIEUC YE PHIEUPH
+ 0xA654: 0xCABB, //HANGUL SYLLABLE SSANGCIEUC YE HIEUH
+ 0xA655: 0xCABE, //HANGUL SYLLABLE SSANGCIEUC O SSANGKIYEOK
+ 0xA656: 0xCABF, //HANGUL SYLLABLE SSANGCIEUC O KIYEOKSIOS
+ 0xA657: 0xCAC1, //HANGUL SYLLABLE SSANGCIEUC O NIEUNCIEUC
+ 0xA658: 0xCAC2, //HANGUL SYLLABLE SSANGCIEUC O NIEUNHIEUH
+ 0xA659: 0xCAC3, //HANGUL SYLLABLE SSANGCIEUC O TIKEUT
+ 0xA65A: 0xCAC5, //HANGUL SYLLABLE SSANGCIEUC O RIEULKIYEOK
+ 0xA661: 0xCAC6, //HANGUL SYLLABLE SSANGCIEUC O RIEULMIEUM
+ 0xA662: 0xCAC7, //HANGUL SYLLABLE SSANGCIEUC O RIEULPIEUP
+ 0xA663: 0xCAC8, //HANGUL SYLLABLE SSANGCIEUC O RIEULSIOS
+ 0xA664: 0xCAC9, //HANGUL SYLLABLE SSANGCIEUC O RIEULTHIEUTH
+ 0xA665: 0xCACA, //HANGUL SYLLABLE SSANGCIEUC O RIEULPHIEUPH
+ 0xA666: 0xCACB, //HANGUL SYLLABLE SSANGCIEUC O RIEULHIEUH
+ 0xA667: 0xCACE, //HANGUL SYLLABLE SSANGCIEUC O PIEUPSIOS
+ 0xA668: 0xCAD0, //HANGUL SYLLABLE SSANGCIEUC O SSANGSIOS
+ 0xA669: 0xCAD2, //HANGUL SYLLABLE SSANGCIEUC O CIEUC
+ 0xA66A: 0xCAD4, //HANGUL SYLLABLE SSANGCIEUC O KHIEUKH
+ 0xA66B: 0xCAD5, //HANGUL SYLLABLE SSANGCIEUC O THIEUTH
+ 0xA66C: 0xCAD6, //HANGUL SYLLABLE SSANGCIEUC O PHIEUPH
+ 0xA66D: 0xCAD7, //HANGUL SYLLABLE SSANGCIEUC O HIEUH
+ 0xA66E: 0xCADA, //HANGUL SYLLABLE SSANGCIEUC WA SSANGKIYEOK
+ 0xA66F: 0xCADB, //HANGUL SYLLABLE SSANGCIEUC WA KIYEOKSIOS
+ 0xA670: 0xCADC, //HANGUL SYLLABLE SSANGCIEUC WA NIEUN
+ 0xA671: 0xCADD, //HANGUL SYLLABLE SSANGCIEUC WA NIEUNCIEUC
+ 0xA672: 0xCADE, //HANGUL SYLLABLE SSANGCIEUC WA NIEUNHIEUH
+ 0xA673: 0xCADF, //HANGUL SYLLABLE SSANGCIEUC WA TIKEUT
+ 0xA674: 0xCAE1, //HANGUL SYLLABLE SSANGCIEUC WA RIEULKIYEOK
+ 0xA675: 0xCAE2, //HANGUL SYLLABLE SSANGCIEUC WA RIEULMIEUM
+ 0xA676: 0xCAE3, //HANGUL SYLLABLE SSANGCIEUC WA RIEULPIEUP
+ 0xA677: 0xCAE4, //HANGUL SYLLABLE SSANGCIEUC WA RIEULSIOS
+ 0xA678: 0xCAE5, //HANGUL SYLLABLE SSANGCIEUC WA RIEULTHIEUTH
+ 0xA679: 0xCAE6, //HANGUL SYLLABLE SSANGCIEUC WA RIEULPHIEUPH
+ 0xA67A: 0xCAE7, //HANGUL SYLLABLE SSANGCIEUC WA RIEULHIEUH
+ 0xA681: 0xCAE8, //HANGUL SYLLABLE SSANGCIEUC WA MIEUM
+ 0xA682: 0xCAE9, //HANGUL SYLLABLE SSANGCIEUC WA PIEUP
+ 0xA683: 0xCAEA, //HANGUL SYLLABLE SSANGCIEUC WA PIEUPSIOS
+ 0xA684: 0xCAEB, //HANGUL SYLLABLE SSANGCIEUC WA SIOS
+ 0xA685: 0xCAED, //HANGUL SYLLABLE SSANGCIEUC WA IEUNG
+ 0xA686: 0xCAEE, //HANGUL SYLLABLE SSANGCIEUC WA CIEUC
+ 0xA687: 0xCAEF, //HANGUL SYLLABLE SSANGCIEUC WA CHIEUCH
+ 0xA688: 0xCAF0, //HANGUL SYLLABLE SSANGCIEUC WA KHIEUKH
+ 0xA689: 0xCAF1, //HANGUL SYLLABLE SSANGCIEUC WA THIEUTH
+ 0xA68A: 0xCAF2, //HANGUL SYLLABLE SSANGCIEUC WA PHIEUPH
+ 0xA68B: 0xCAF3, //HANGUL SYLLABLE SSANGCIEUC WA HIEUH
+ 0xA68C: 0xCAF5, //HANGUL SYLLABLE SSANGCIEUC WAE KIYEOK
+ 0xA68D: 0xCAF6, //HANGUL SYLLABLE SSANGCIEUC WAE SSANGKIYEOK
+ 0xA68E: 0xCAF7, //HANGUL SYLLABLE SSANGCIEUC WAE KIYEOKSIOS
+ 0xA68F: 0xCAF8, //HANGUL SYLLABLE SSANGCIEUC WAE NIEUN
+ 0xA690: 0xCAF9, //HANGUL SYLLABLE SSANGCIEUC WAE NIEUNCIEUC
+ 0xA691: 0xCAFA, //HANGUL SYLLABLE SSANGCIEUC WAE NIEUNHIEUH
+ 0xA692: 0xCAFB, //HANGUL SYLLABLE SSANGCIEUC WAE TIKEUT
+ 0xA693: 0xCAFC, //HANGUL SYLLABLE SSANGCIEUC WAE RIEUL
+ 0xA694: 0xCAFD, //HANGUL SYLLABLE SSANGCIEUC WAE RIEULKIYEOK
+ 0xA695: 0xCAFE, //HANGUL SYLLABLE SSANGCIEUC WAE RIEULMIEUM
+ 0xA696: 0xCAFF, //HANGUL SYLLABLE SSANGCIEUC WAE RIEULPIEUP
+ 0xA697: 0xCB00, //HANGUL SYLLABLE SSANGCIEUC WAE RIEULSIOS
+ 0xA698: 0xCB01, //HANGUL SYLLABLE SSANGCIEUC WAE RIEULTHIEUTH
+ 0xA699: 0xCB02, //HANGUL SYLLABLE SSANGCIEUC WAE RIEULPHIEUPH
+ 0xA69A: 0xCB03, //HANGUL SYLLABLE SSANGCIEUC WAE RIEULHIEUH
+ 0xA69B: 0xCB04, //HANGUL SYLLABLE SSANGCIEUC WAE MIEUM
+ 0xA69C: 0xCB05, //HANGUL SYLLABLE SSANGCIEUC WAE PIEUP
+ 0xA69D: 0xCB06, //HANGUL SYLLABLE SSANGCIEUC WAE PIEUPSIOS
+ 0xA69E: 0xCB07, //HANGUL SYLLABLE SSANGCIEUC WAE SIOS
+ 0xA69F: 0xCB09, //HANGUL SYLLABLE SSANGCIEUC WAE IEUNG
+ 0xA6A0: 0xCB0A, //HANGUL SYLLABLE SSANGCIEUC WAE CIEUC
+ 0xA6A1: 0x2500, //BOX DRAWINGS LIGHT HORIZONTAL
+ 0xA6A2: 0x2502, //BOX DRAWINGS LIGHT VERTICAL
+ 0xA6A3: 0x250C, //BOX DRAWINGS LIGHT DOWN AND RIGHT
+ 0xA6A4: 0x2510, //BOX DRAWINGS LIGHT DOWN AND LEFT
+ 0xA6A5: 0x2518, //BOX DRAWINGS LIGHT UP AND LEFT
+ 0xA6A6: 0x2514, //BOX DRAWINGS LIGHT UP AND RIGHT
+ 0xA6A7: 0x251C, //BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ 0xA6A8: 0x252C, //BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ 0xA6A9: 0x2524, //BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ 0xA6AA: 0x2534, //BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ 0xA6AB: 0x253C, //BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ 0xA6AC: 0x2501, //BOX DRAWINGS HEAVY HORIZONTAL
+ 0xA6AD: 0x2503, //BOX DRAWINGS HEAVY VERTICAL
+ 0xA6AE: 0x250F, //BOX DRAWINGS HEAVY DOWN AND RIGHT
+ 0xA6AF: 0x2513, //BOX DRAWINGS HEAVY DOWN AND LEFT
+ 0xA6B0: 0x251B, //BOX DRAWINGS HEAVY UP AND LEFT
+ 0xA6B1: 0x2517, //BOX DRAWINGS HEAVY UP AND RIGHT
+ 0xA6B2: 0x2523, //BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ 0xA6B3: 0x2533, //BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ 0xA6B4: 0x252B, //BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ 0xA6B5: 0x253B, //BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ 0xA6B6: 0x254B, //BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ 0xA6B7: 0x2520, //BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ 0xA6B8: 0x252F, //BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ 0xA6B9: 0x2528, //BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ 0xA6BA: 0x2537, //BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ 0xA6BB: 0x253F, //BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ 0xA6BC: 0x251D, //BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ 0xA6BD: 0x2530, //BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ 0xA6BE: 0x2525, //BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ 0xA6BF: 0x2538, //BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ 0xA6C0: 0x2542, //BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ 0xA6C1: 0x2512, //BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+ 0xA6C2: 0x2511, //BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+ 0xA6C3: 0x251A, //BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+ 0xA6C4: 0x2519, //BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+ 0xA6C5: 0x2516, //BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+ 0xA6C6: 0x2515, //BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+ 0xA6C7: 0x250E, //BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+ 0xA6C8: 0x250D, //BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+ 0xA6C9: 0x251E, //BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+ 0xA6CA: 0x251F, //BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+ 0xA6CB: 0x2521, //BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+ 0xA6CC: 0x2522, //BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+ 0xA6CD: 0x2526, //BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+ 0xA6CE: 0x2527, //BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+ 0xA6CF: 0x2529, //BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+ 0xA6D0: 0x252A, //BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+ 0xA6D1: 0x252D, //BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+ 0xA6D2: 0x252E, //BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+ 0xA6D3: 0x2531, //BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+ 0xA6D4: 0x2532, //BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+ 0xA6D5: 0x2535, //BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+ 0xA6D6: 0x2536, //BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+ 0xA6D7: 0x2539, //BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+ 0xA6D8: 0x253A, //BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+ 0xA6D9: 0x253D, //BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+ 0xA6DA: 0x253E, //BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+ 0xA6DB: 0x2540, //BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+ 0xA6DC: 0x2541, //BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+ 0xA6DD: 0x2543, //BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+ 0xA6DE: 0x2544, //BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+ 0xA6DF: 0x2545, //BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+ 0xA6E0: 0x2546, //BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+ 0xA6E1: 0x2547, //BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+ 0xA6E2: 0x2548, //BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+ 0xA6E3: 0x2549, //BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+ 0xA6E4: 0x254A, //BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+ 0xA741: 0xCB0B, //HANGUL SYLLABLE SSANGCIEUC WAE CHIEUCH
+ 0xA742: 0xCB0C, //HANGUL SYLLABLE SSANGCIEUC WAE KHIEUKH
+ 0xA743: 0xCB0D, //HANGUL SYLLABLE SSANGCIEUC WAE THIEUTH
+ 0xA744: 0xCB0E, //HANGUL SYLLABLE SSANGCIEUC WAE PHIEUPH
+ 0xA745: 0xCB0F, //HANGUL SYLLABLE SSANGCIEUC WAE HIEUH
+ 0xA746: 0xCB11, //HANGUL SYLLABLE SSANGCIEUC OE KIYEOK
+ 0xA747: 0xCB12, //HANGUL SYLLABLE SSANGCIEUC OE SSANGKIYEOK
+ 0xA748: 0xCB13, //HANGUL SYLLABLE SSANGCIEUC OE KIYEOKSIOS
+ 0xA749: 0xCB15, //HANGUL SYLLABLE SSANGCIEUC OE NIEUNCIEUC
+ 0xA74A: 0xCB16, //HANGUL SYLLABLE SSANGCIEUC OE NIEUNHIEUH
+ 0xA74B: 0xCB17, //HANGUL SYLLABLE SSANGCIEUC OE TIKEUT
+ 0xA74C: 0xCB19, //HANGUL SYLLABLE SSANGCIEUC OE RIEULKIYEOK
+ 0xA74D: 0xCB1A, //HANGUL SYLLABLE SSANGCIEUC OE RIEULMIEUM
+ 0xA74E: 0xCB1B, //HANGUL SYLLABLE SSANGCIEUC OE RIEULPIEUP
+ 0xA74F: 0xCB1C, //HANGUL SYLLABLE SSANGCIEUC OE RIEULSIOS
+ 0xA750: 0xCB1D, //HANGUL SYLLABLE SSANGCIEUC OE RIEULTHIEUTH
+ 0xA751: 0xCB1E, //HANGUL SYLLABLE SSANGCIEUC OE RIEULPHIEUPH
+ 0xA752: 0xCB1F, //HANGUL SYLLABLE SSANGCIEUC OE RIEULHIEUH
+ 0xA753: 0xCB22, //HANGUL SYLLABLE SSANGCIEUC OE PIEUPSIOS
+ 0xA754: 0xCB23, //HANGUL SYLLABLE SSANGCIEUC OE SIOS
+ 0xA755: 0xCB24, //HANGUL SYLLABLE SSANGCIEUC OE SSANGSIOS
+ 0xA756: 0xCB25, //HANGUL SYLLABLE SSANGCIEUC OE IEUNG
+ 0xA757: 0xCB26, //HANGUL SYLLABLE SSANGCIEUC OE CIEUC
+ 0xA758: 0xCB27, //HANGUL SYLLABLE SSANGCIEUC OE CHIEUCH
+ 0xA759: 0xCB28, //HANGUL SYLLABLE SSANGCIEUC OE KHIEUKH
+ 0xA75A: 0xCB29, //HANGUL SYLLABLE SSANGCIEUC OE THIEUTH
+ 0xA761: 0xCB2A, //HANGUL SYLLABLE SSANGCIEUC OE PHIEUPH
+ 0xA762: 0xCB2B, //HANGUL SYLLABLE SSANGCIEUC OE HIEUH
+ 0xA763: 0xCB2C, //HANGUL SYLLABLE SSANGCIEUC YO
+ 0xA764: 0xCB2D, //HANGUL SYLLABLE SSANGCIEUC YO KIYEOK
+ 0xA765: 0xCB2E, //HANGUL SYLLABLE SSANGCIEUC YO SSANGKIYEOK
+ 0xA766: 0xCB2F, //HANGUL SYLLABLE SSANGCIEUC YO KIYEOKSIOS
+ 0xA767: 0xCB30, //HANGUL SYLLABLE SSANGCIEUC YO NIEUN
+ 0xA768: 0xCB31, //HANGUL SYLLABLE SSANGCIEUC YO NIEUNCIEUC
+ 0xA769: 0xCB32, //HANGUL SYLLABLE SSANGCIEUC YO NIEUNHIEUH
+ 0xA76A: 0xCB33, //HANGUL SYLLABLE SSANGCIEUC YO TIKEUT
+ 0xA76B: 0xCB34, //HANGUL SYLLABLE SSANGCIEUC YO RIEUL
+ 0xA76C: 0xCB35, //HANGUL SYLLABLE SSANGCIEUC YO RIEULKIYEOK
+ 0xA76D: 0xCB36, //HANGUL SYLLABLE SSANGCIEUC YO RIEULMIEUM
+ 0xA76E: 0xCB37, //HANGUL SYLLABLE SSANGCIEUC YO RIEULPIEUP
+ 0xA76F: 0xCB38, //HANGUL SYLLABLE SSANGCIEUC YO RIEULSIOS
+ 0xA770: 0xCB39, //HANGUL SYLLABLE SSANGCIEUC YO RIEULTHIEUTH
+ 0xA771: 0xCB3A, //HANGUL SYLLABLE SSANGCIEUC YO RIEULPHIEUPH
+ 0xA772: 0xCB3B, //HANGUL SYLLABLE SSANGCIEUC YO RIEULHIEUH
+ 0xA773: 0xCB3C, //HANGUL SYLLABLE SSANGCIEUC YO MIEUM
+ 0xA774: 0xCB3D, //HANGUL SYLLABLE SSANGCIEUC YO PIEUP
+ 0xA775: 0xCB3E, //HANGUL SYLLABLE SSANGCIEUC YO PIEUPSIOS
+ 0xA776: 0xCB3F, //HANGUL SYLLABLE SSANGCIEUC YO SIOS
+ 0xA777: 0xCB40, //HANGUL SYLLABLE SSANGCIEUC YO SSANGSIOS
+ 0xA778: 0xCB42, //HANGUL SYLLABLE SSANGCIEUC YO CIEUC
+ 0xA779: 0xCB43, //HANGUL SYLLABLE SSANGCIEUC YO CHIEUCH
+ 0xA77A: 0xCB44, //HANGUL SYLLABLE SSANGCIEUC YO KHIEUKH
+ 0xA781: 0xCB45, //HANGUL SYLLABLE SSANGCIEUC YO THIEUTH
+ 0xA782: 0xCB46, //HANGUL SYLLABLE SSANGCIEUC YO PHIEUPH
+ 0xA783: 0xCB47, //HANGUL SYLLABLE SSANGCIEUC YO HIEUH
+ 0xA784: 0xCB4A, //HANGUL SYLLABLE SSANGCIEUC U SSANGKIYEOK
+ 0xA785: 0xCB4B, //HANGUL SYLLABLE SSANGCIEUC U KIYEOKSIOS
+ 0xA786: 0xCB4D, //HANGUL SYLLABLE SSANGCIEUC U NIEUNCIEUC
+ 0xA787: 0xCB4E, //HANGUL SYLLABLE SSANGCIEUC U NIEUNHIEUH
+ 0xA788: 0xCB4F, //HANGUL SYLLABLE SSANGCIEUC U TIKEUT
+ 0xA789: 0xCB51, //HANGUL SYLLABLE SSANGCIEUC U RIEULKIYEOK
+ 0xA78A: 0xCB52, //HANGUL SYLLABLE SSANGCIEUC U RIEULMIEUM
+ 0xA78B: 0xCB53, //HANGUL SYLLABLE SSANGCIEUC U RIEULPIEUP
+ 0xA78C: 0xCB54, //HANGUL SYLLABLE SSANGCIEUC U RIEULSIOS
+ 0xA78D: 0xCB55, //HANGUL SYLLABLE SSANGCIEUC U RIEULTHIEUTH
+ 0xA78E: 0xCB56, //HANGUL SYLLABLE SSANGCIEUC U RIEULPHIEUPH
+ 0xA78F: 0xCB57, //HANGUL SYLLABLE SSANGCIEUC U RIEULHIEUH
+ 0xA790: 0xCB5A, //HANGUL SYLLABLE SSANGCIEUC U PIEUPSIOS
+ 0xA791: 0xCB5B, //HANGUL SYLLABLE SSANGCIEUC U SIOS
+ 0xA792: 0xCB5C, //HANGUL SYLLABLE SSANGCIEUC U SSANGSIOS
+ 0xA793: 0xCB5E, //HANGUL SYLLABLE SSANGCIEUC U CIEUC
+ 0xA794: 0xCB5F, //HANGUL SYLLABLE SSANGCIEUC U CHIEUCH
+ 0xA795: 0xCB60, //HANGUL SYLLABLE SSANGCIEUC U KHIEUKH
+ 0xA796: 0xCB61, //HANGUL SYLLABLE SSANGCIEUC U THIEUTH
+ 0xA797: 0xCB62, //HANGUL SYLLABLE SSANGCIEUC U PHIEUPH
+ 0xA798: 0xCB63, //HANGUL SYLLABLE SSANGCIEUC U HIEUH
+ 0xA799: 0xCB65, //HANGUL SYLLABLE SSANGCIEUC WEO KIYEOK
+ 0xA79A: 0xCB66, //HANGUL SYLLABLE SSANGCIEUC WEO SSANGKIYEOK
+ 0xA79B: 0xCB67, //HANGUL SYLLABLE SSANGCIEUC WEO KIYEOKSIOS
+ 0xA79C: 0xCB68, //HANGUL SYLLABLE SSANGCIEUC WEO NIEUN
+ 0xA79D: 0xCB69, //HANGUL SYLLABLE SSANGCIEUC WEO NIEUNCIEUC
+ 0xA79E: 0xCB6A, //HANGUL SYLLABLE SSANGCIEUC WEO NIEUNHIEUH
+ 0xA79F: 0xCB6B, //HANGUL SYLLABLE SSANGCIEUC WEO TIKEUT
+ 0xA7A0: 0xCB6C, //HANGUL SYLLABLE SSANGCIEUC WEO RIEUL
+ 0xA7A1: 0x3395, //SQUARE MU L
+ 0xA7A2: 0x3396, //SQUARE ML
+ 0xA7A3: 0x3397, //SQUARE DL
+ 0xA7A4: 0x2113, //SCRIPT SMALL L
+ 0xA7A5: 0x3398, //SQUARE KL
+ 0xA7A6: 0x33C4, //SQUARE CC
+ 0xA7A7: 0x33A3, //SQUARE MM CUBED
+ 0xA7A8: 0x33A4, //SQUARE CM CUBED
+ 0xA7A9: 0x33A5, //SQUARE M CUBED
+ 0xA7AA: 0x33A6, //SQUARE KM CUBED
+ 0xA7AB: 0x3399, //SQUARE FM
+ 0xA7AC: 0x339A, //SQUARE NM
+ 0xA7AD: 0x339B, //SQUARE MU M
+ 0xA7AE: 0x339C, //SQUARE MM
+ 0xA7AF: 0x339D, //SQUARE CM
+ 0xA7B0: 0x339E, //SQUARE KM
+ 0xA7B1: 0x339F, //SQUARE MM SQUARED
+ 0xA7B2: 0x33A0, //SQUARE CM SQUARED
+ 0xA7B3: 0x33A1, //SQUARE M SQUARED
+ 0xA7B4: 0x33A2, //SQUARE KM SQUARED
+ 0xA7B5: 0x33CA, //SQUARE HA
+ 0xA7B6: 0x338D, //SQUARE MU G
+ 0xA7B7: 0x338E, //SQUARE MG
+ 0xA7B8: 0x338F, //SQUARE KG
+ 0xA7B9: 0x33CF, //SQUARE KT
+ 0xA7BA: 0x3388, //SQUARE CAL
+ 0xA7BB: 0x3389, //SQUARE KCAL
+ 0xA7BC: 0x33C8, //SQUARE DB
+ 0xA7BD: 0x33A7, //SQUARE M OVER S
+ 0xA7BE: 0x33A8, //SQUARE M OVER S SQUARED
+ 0xA7BF: 0x33B0, //SQUARE PS
+ 0xA7C0: 0x33B1, //SQUARE NS
+ 0xA7C1: 0x33B2, //SQUARE MU S
+ 0xA7C2: 0x33B3, //SQUARE MS
+ 0xA7C3: 0x33B4, //SQUARE PV
+ 0xA7C4: 0x33B5, //SQUARE NV
+ 0xA7C5: 0x33B6, //SQUARE MU V
+ 0xA7C6: 0x33B7, //SQUARE MV
+ 0xA7C7: 0x33B8, //SQUARE KV
+ 0xA7C8: 0x33B9, //SQUARE MV MEGA
+ 0xA7C9: 0x3380, //SQUARE PA AMPS
+ 0xA7CA: 0x3381, //SQUARE NA
+ 0xA7CB: 0x3382, //SQUARE MU A
+ 0xA7CC: 0x3383, //SQUARE MA
+ 0xA7CD: 0x3384, //SQUARE KA
+ 0xA7CE: 0x33BA, //SQUARE PW
+ 0xA7CF: 0x33BB, //SQUARE NW
+ 0xA7D0: 0x33BC, //SQUARE MU W
+ 0xA7D1: 0x33BD, //SQUARE MW
+ 0xA7D2: 0x33BE, //SQUARE KW
+ 0xA7D3: 0x33BF, //SQUARE MW MEGA
+ 0xA7D4: 0x3390, //SQUARE HZ
+ 0xA7D5: 0x3391, //SQUARE KHZ
+ 0xA7D6: 0x3392, //SQUARE MHZ
+ 0xA7D7: 0x3393, //SQUARE GHZ
+ 0xA7D8: 0x3394, //SQUARE THZ
+ 0xA7D9: 0x2126, //OHM SIGN
+ 0xA7DA: 0x33C0, //SQUARE K OHM
+ 0xA7DB: 0x33C1, //SQUARE M OHM
+ 0xA7DC: 0x338A, //SQUARE PF
+ 0xA7DD: 0x338B, //SQUARE NF
+ 0xA7DE: 0x338C, //SQUARE MU F
+ 0xA7DF: 0x33D6, //SQUARE MOL
+ 0xA7E0: 0x33C5, //SQUARE CD
+ 0xA7E1: 0x33AD, //SQUARE RAD
+ 0xA7E2: 0x33AE, //SQUARE RAD OVER S
+ 0xA7E3: 0x33AF, //SQUARE RAD OVER S SQUARED
+ 0xA7E4: 0x33DB, //SQUARE SR
+ 0xA7E5: 0x33A9, //SQUARE PA
+ 0xA7E6: 0x33AA, //SQUARE KPA
+ 0xA7E7: 0x33AB, //SQUARE MPA
+ 0xA7E8: 0x33AC, //SQUARE GPA
+ 0xA7E9: 0x33DD, //SQUARE WB
+ 0xA7EA: 0x33D0, //SQUARE LM
+ 0xA7EB: 0x33D3, //SQUARE LX
+ 0xA7EC: 0x33C3, //SQUARE BQ
+ 0xA7ED: 0x33C9, //SQUARE GY
+ 0xA7EE: 0x33DC, //SQUARE SV
+ 0xA7EF: 0x33C6, //SQUARE C OVER KG
+ 0xA841: 0xCB6D, //HANGUL SYLLABLE SSANGCIEUC WEO RIEULKIYEOK
+ 0xA842: 0xCB6E, //HANGUL SYLLABLE SSANGCIEUC WEO RIEULMIEUM
+ 0xA843: 0xCB6F, //HANGUL SYLLABLE SSANGCIEUC WEO RIEULPIEUP
+ 0xA844: 0xCB70, //HANGUL SYLLABLE SSANGCIEUC WEO RIEULSIOS
+ 0xA845: 0xCB71, //HANGUL SYLLABLE SSANGCIEUC WEO RIEULTHIEUTH
+ 0xA846: 0xCB72, //HANGUL SYLLABLE SSANGCIEUC WEO RIEULPHIEUPH
+ 0xA847: 0xCB73, //HANGUL SYLLABLE SSANGCIEUC WEO RIEULHIEUH
+ 0xA848: 0xCB74, //HANGUL SYLLABLE SSANGCIEUC WEO MIEUM
+ 0xA849: 0xCB75, //HANGUL SYLLABLE SSANGCIEUC WEO PIEUP
+ 0xA84A: 0xCB76, //HANGUL SYLLABLE SSANGCIEUC WEO PIEUPSIOS
+ 0xA84B: 0xCB77, //HANGUL SYLLABLE SSANGCIEUC WEO SIOS
+ 0xA84C: 0xCB7A, //HANGUL SYLLABLE SSANGCIEUC WEO CIEUC
+ 0xA84D: 0xCB7B, //HANGUL SYLLABLE SSANGCIEUC WEO CHIEUCH
+ 0xA84E: 0xCB7C, //HANGUL SYLLABLE SSANGCIEUC WEO KHIEUKH
+ 0xA84F: 0xCB7D, //HANGUL SYLLABLE SSANGCIEUC WEO THIEUTH
+ 0xA850: 0xCB7E, //HANGUL SYLLABLE SSANGCIEUC WEO PHIEUPH
+ 0xA851: 0xCB7F, //HANGUL SYLLABLE SSANGCIEUC WEO HIEUH
+ 0xA852: 0xCB80, //HANGUL SYLLABLE SSANGCIEUC WE
+ 0xA853: 0xCB81, //HANGUL SYLLABLE SSANGCIEUC WE KIYEOK
+ 0xA854: 0xCB82, //HANGUL SYLLABLE SSANGCIEUC WE SSANGKIYEOK
+ 0xA855: 0xCB83, //HANGUL SYLLABLE SSANGCIEUC WE KIYEOKSIOS
+ 0xA856: 0xCB84, //HANGUL SYLLABLE SSANGCIEUC WE NIEUN
+ 0xA857: 0xCB85, //HANGUL SYLLABLE SSANGCIEUC WE NIEUNCIEUC
+ 0xA858: 0xCB86, //HANGUL SYLLABLE SSANGCIEUC WE NIEUNHIEUH
+ 0xA859: 0xCB87, //HANGUL SYLLABLE SSANGCIEUC WE TIKEUT
+ 0xA85A: 0xCB88, //HANGUL SYLLABLE SSANGCIEUC WE RIEUL
+ 0xA861: 0xCB89, //HANGUL SYLLABLE SSANGCIEUC WE RIEULKIYEOK
+ 0xA862: 0xCB8A, //HANGUL SYLLABLE SSANGCIEUC WE RIEULMIEUM
+ 0xA863: 0xCB8B, //HANGUL SYLLABLE SSANGCIEUC WE RIEULPIEUP
+ 0xA864: 0xCB8C, //HANGUL SYLLABLE SSANGCIEUC WE RIEULSIOS
+ 0xA865: 0xCB8D, //HANGUL SYLLABLE SSANGCIEUC WE RIEULTHIEUTH
+ 0xA866: 0xCB8E, //HANGUL SYLLABLE SSANGCIEUC WE RIEULPHIEUPH
+ 0xA867: 0xCB8F, //HANGUL SYLLABLE SSANGCIEUC WE RIEULHIEUH
+ 0xA868: 0xCB90, //HANGUL SYLLABLE SSANGCIEUC WE MIEUM
+ 0xA869: 0xCB91, //HANGUL SYLLABLE SSANGCIEUC WE PIEUP
+ 0xA86A: 0xCB92, //HANGUL SYLLABLE SSANGCIEUC WE PIEUPSIOS
+ 0xA86B: 0xCB93, //HANGUL SYLLABLE SSANGCIEUC WE SIOS
+ 0xA86C: 0xCB94, //HANGUL SYLLABLE SSANGCIEUC WE SSANGSIOS
+ 0xA86D: 0xCB95, //HANGUL SYLLABLE SSANGCIEUC WE IEUNG
+ 0xA86E: 0xCB96, //HANGUL SYLLABLE SSANGCIEUC WE CIEUC
+ 0xA86F: 0xCB97, //HANGUL SYLLABLE SSANGCIEUC WE CHIEUCH
+ 0xA870: 0xCB98, //HANGUL SYLLABLE SSANGCIEUC WE KHIEUKH
+ 0xA871: 0xCB99, //HANGUL SYLLABLE SSANGCIEUC WE THIEUTH
+ 0xA872: 0xCB9A, //HANGUL SYLLABLE SSANGCIEUC WE PHIEUPH
+ 0xA873: 0xCB9B, //HANGUL SYLLABLE SSANGCIEUC WE HIEUH
+ 0xA874: 0xCB9D, //HANGUL SYLLABLE SSANGCIEUC WI KIYEOK
+ 0xA875: 0xCB9E, //HANGUL SYLLABLE SSANGCIEUC WI SSANGKIYEOK
+ 0xA876: 0xCB9F, //HANGUL SYLLABLE SSANGCIEUC WI KIYEOKSIOS
+ 0xA877: 0xCBA0, //HANGUL SYLLABLE SSANGCIEUC WI NIEUN
+ 0xA878: 0xCBA1, //HANGUL SYLLABLE SSANGCIEUC WI NIEUNCIEUC
+ 0xA879: 0xCBA2, //HANGUL SYLLABLE SSANGCIEUC WI NIEUNHIEUH
+ 0xA87A: 0xCBA3, //HANGUL SYLLABLE SSANGCIEUC WI TIKEUT
+ 0xA881: 0xCBA4, //HANGUL SYLLABLE SSANGCIEUC WI RIEUL
+ 0xA882: 0xCBA5, //HANGUL SYLLABLE SSANGCIEUC WI RIEULKIYEOK
+ 0xA883: 0xCBA6, //HANGUL SYLLABLE SSANGCIEUC WI RIEULMIEUM
+ 0xA884: 0xCBA7, //HANGUL SYLLABLE SSANGCIEUC WI RIEULPIEUP
+ 0xA885: 0xCBA8, //HANGUL SYLLABLE SSANGCIEUC WI RIEULSIOS
+ 0xA886: 0xCBA9, //HANGUL SYLLABLE SSANGCIEUC WI RIEULTHIEUTH
+ 0xA887: 0xCBAA, //HANGUL SYLLABLE SSANGCIEUC WI RIEULPHIEUPH
+ 0xA888: 0xCBAB, //HANGUL SYLLABLE SSANGCIEUC WI RIEULHIEUH
+ 0xA889: 0xCBAC, //HANGUL SYLLABLE SSANGCIEUC WI MIEUM
+ 0xA88A: 0xCBAD, //HANGUL SYLLABLE SSANGCIEUC WI PIEUP
+ 0xA88B: 0xCBAE, //HANGUL SYLLABLE SSANGCIEUC WI PIEUPSIOS
+ 0xA88C: 0xCBAF, //HANGUL SYLLABLE SSANGCIEUC WI SIOS
+ 0xA88D: 0xCBB0, //HANGUL SYLLABLE SSANGCIEUC WI SSANGSIOS
+ 0xA88E: 0xCBB1, //HANGUL SYLLABLE SSANGCIEUC WI IEUNG
+ 0xA88F: 0xCBB2, //HANGUL SYLLABLE SSANGCIEUC WI CIEUC
+ 0xA890: 0xCBB3, //HANGUL SYLLABLE SSANGCIEUC WI CHIEUCH
+ 0xA891: 0xCBB4, //HANGUL SYLLABLE SSANGCIEUC WI KHIEUKH
+ 0xA892: 0xCBB5, //HANGUL SYLLABLE SSANGCIEUC WI THIEUTH
+ 0xA893: 0xCBB6, //HANGUL SYLLABLE SSANGCIEUC WI PHIEUPH
+ 0xA894: 0xCBB7, //HANGUL SYLLABLE SSANGCIEUC WI HIEUH
+ 0xA895: 0xCBB9, //HANGUL SYLLABLE SSANGCIEUC YU KIYEOK
+ 0xA896: 0xCBBA, //HANGUL SYLLABLE SSANGCIEUC YU SSANGKIYEOK
+ 0xA897: 0xCBBB, //HANGUL SYLLABLE SSANGCIEUC YU KIYEOKSIOS
+ 0xA898: 0xCBBC, //HANGUL SYLLABLE SSANGCIEUC YU NIEUN
+ 0xA899: 0xCBBD, //HANGUL SYLLABLE SSANGCIEUC YU NIEUNCIEUC
+ 0xA89A: 0xCBBE, //HANGUL SYLLABLE SSANGCIEUC YU NIEUNHIEUH
+ 0xA89B: 0xCBBF, //HANGUL SYLLABLE SSANGCIEUC YU TIKEUT
+ 0xA89C: 0xCBC0, //HANGUL SYLLABLE SSANGCIEUC YU RIEUL
+ 0xA89D: 0xCBC1, //HANGUL SYLLABLE SSANGCIEUC YU RIEULKIYEOK
+ 0xA89E: 0xCBC2, //HANGUL SYLLABLE SSANGCIEUC YU RIEULMIEUM
+ 0xA89F: 0xCBC3, //HANGUL SYLLABLE SSANGCIEUC YU RIEULPIEUP
+ 0xA8A0: 0xCBC4, //HANGUL SYLLABLE SSANGCIEUC YU RIEULSIOS
+ 0xA8A1: 0x00C6, //LATIN CAPITAL LETTER AE
+ 0xA8A2: 0x00D0, //LATIN CAPITAL LETTER ETH
+ 0xA8A3: 0x00AA, //FEMININE ORDINAL INDICATOR
+ 0xA8A4: 0x0126, //LATIN CAPITAL LETTER H WITH STROKE
+ 0xA8A6: 0x0132, //LATIN CAPITAL LIGATURE IJ
+ 0xA8A8: 0x013F, //LATIN CAPITAL LETTER L WITH MIDDLE DOT
+ 0xA8A9: 0x0141, //LATIN CAPITAL LETTER L WITH STROKE
+ 0xA8AA: 0x00D8, //LATIN CAPITAL LETTER O WITH STROKE
+ 0xA8AB: 0x0152, //LATIN CAPITAL LIGATURE OE
+ 0xA8AC: 0x00BA, //MASCULINE ORDINAL INDICATOR
+ 0xA8AD: 0x00DE, //LATIN CAPITAL LETTER THORN
+ 0xA8AE: 0x0166, //LATIN CAPITAL LETTER T WITH STROKE
+ 0xA8AF: 0x014A, //LATIN CAPITAL LETTER ENG
+ 0xA8B1: 0x3260, //CIRCLED HANGUL KIYEOK
+ 0xA8B2: 0x3261, //CIRCLED HANGUL NIEUN
+ 0xA8B3: 0x3262, //CIRCLED HANGUL TIKEUT
+ 0xA8B4: 0x3263, //CIRCLED HANGUL RIEUL
+ 0xA8B5: 0x3264, //CIRCLED HANGUL MIEUM
+ 0xA8B6: 0x3265, //CIRCLED HANGUL PIEUP
+ 0xA8B7: 0x3266, //CIRCLED HANGUL SIOS
+ 0xA8B8: 0x3267, //CIRCLED HANGUL IEUNG
+ 0xA8B9: 0x3268, //CIRCLED HANGUL CIEUC
+ 0xA8BA: 0x3269, //CIRCLED HANGUL CHIEUCH
+ 0xA8BB: 0x326A, //CIRCLED HANGUL KHIEUKH
+ 0xA8BC: 0x326B, //CIRCLED HANGUL THIEUTH
+ 0xA8BD: 0x326C, //CIRCLED HANGUL PHIEUPH
+ 0xA8BE: 0x326D, //CIRCLED HANGUL HIEUH
+ 0xA8BF: 0x326E, //CIRCLED HANGUL KIYEOK A
+ 0xA8C0: 0x326F, //CIRCLED HANGUL NIEUN A
+ 0xA8C1: 0x3270, //CIRCLED HANGUL TIKEUT A
+ 0xA8C2: 0x3271, //CIRCLED HANGUL RIEUL A
+ 0xA8C3: 0x3272, //CIRCLED HANGUL MIEUM A
+ 0xA8C4: 0x3273, //CIRCLED HANGUL PIEUP A
+ 0xA8C5: 0x3274, //CIRCLED HANGUL SIOS A
+ 0xA8C6: 0x3275, //CIRCLED HANGUL IEUNG A
+ 0xA8C7: 0x3276, //CIRCLED HANGUL CIEUC A
+ 0xA8C8: 0x3277, //CIRCLED HANGUL CHIEUCH A
+ 0xA8C9: 0x3278, //CIRCLED HANGUL KHIEUKH A
+ 0xA8CA: 0x3279, //CIRCLED HANGUL THIEUTH A
+ 0xA8CB: 0x327A, //CIRCLED HANGUL PHIEUPH A
+ 0xA8CC: 0x327B, //CIRCLED HANGUL HIEUH A
+ 0xA8CD: 0x24D0, //CIRCLED LATIN SMALL LETTER A
+ 0xA8CE: 0x24D1, //CIRCLED LATIN SMALL LETTER B
+ 0xA8CF: 0x24D2, //CIRCLED LATIN SMALL LETTER C
+ 0xA8D0: 0x24D3, //CIRCLED LATIN SMALL LETTER D
+ 0xA8D1: 0x24D4, //CIRCLED LATIN SMALL LETTER E
+ 0xA8D2: 0x24D5, //CIRCLED LATIN SMALL LETTER F
+ 0xA8D3: 0x24D6, //CIRCLED LATIN SMALL LETTER G
+ 0xA8D4: 0x24D7, //CIRCLED LATIN SMALL LETTER H
+ 0xA8D5: 0x24D8, //CIRCLED LATIN SMALL LETTER I
+ 0xA8D6: 0x24D9, //CIRCLED LATIN SMALL LETTER J
+ 0xA8D7: 0x24DA, //CIRCLED LATIN SMALL LETTER K
+ 0xA8D8: 0x24DB, //CIRCLED LATIN SMALL LETTER L
+ 0xA8D9: 0x24DC, //CIRCLED LATIN SMALL LETTER M
+ 0xA8DA: 0x24DD, //CIRCLED LATIN SMALL LETTER N
+ 0xA8DB: 0x24DE, //CIRCLED LATIN SMALL LETTER O
+ 0xA8DC: 0x24DF, //CIRCLED LATIN SMALL LETTER P
+ 0xA8DD: 0x24E0, //CIRCLED LATIN SMALL LETTER Q
+ 0xA8DE: 0x24E1, //CIRCLED LATIN SMALL LETTER R
+ 0xA8DF: 0x24E2, //CIRCLED LATIN SMALL LETTER S
+ 0xA8E0: 0x24E3, //CIRCLED LATIN SMALL LETTER T
+ 0xA8E1: 0x24E4, //CIRCLED LATIN SMALL LETTER U
+ 0xA8E2: 0x24E5, //CIRCLED LATIN SMALL LETTER V
+ 0xA8E3: 0x24E6, //CIRCLED LATIN SMALL LETTER W
+ 0xA8E4: 0x24E7, //CIRCLED LATIN SMALL LETTER X
+ 0xA8E5: 0x24E8, //CIRCLED LATIN SMALL LETTER Y
+ 0xA8E6: 0x24E9, //CIRCLED LATIN SMALL LETTER Z
+ 0xA8E7: 0x2460, //CIRCLED DIGIT ONE
+ 0xA8E8: 0x2461, //CIRCLED DIGIT TWO
+ 0xA8E9: 0x2462, //CIRCLED DIGIT THREE
+ 0xA8EA: 0x2463, //CIRCLED DIGIT FOUR
+ 0xA8EB: 0x2464, //CIRCLED DIGIT FIVE
+ 0xA8EC: 0x2465, //CIRCLED DIGIT SIX
+ 0xA8ED: 0x2466, //CIRCLED DIGIT SEVEN
+ 0xA8EE: 0x2467, //CIRCLED DIGIT EIGHT
+ 0xA8EF: 0x2468, //CIRCLED DIGIT NINE
+ 0xA8F0: 0x2469, //CIRCLED NUMBER TEN
+ 0xA8F1: 0x246A, //CIRCLED NUMBER ELEVEN
+ 0xA8F2: 0x246B, //CIRCLED NUMBER TWELVE
+ 0xA8F3: 0x246C, //CIRCLED NUMBER THIRTEEN
+ 0xA8F4: 0x246D, //CIRCLED NUMBER FOURTEEN
+ 0xA8F5: 0x246E, //CIRCLED NUMBER FIFTEEN
+ 0xA8F6: 0x00BD, //VULGAR FRACTION ONE HALF
+ 0xA8F7: 0x2153, //VULGAR FRACTION ONE THIRD
+ 0xA8F8: 0x2154, //VULGAR FRACTION TWO THIRDS
+ 0xA8F9: 0x00BC, //VULGAR FRACTION ONE QUARTER
+ 0xA8FA: 0x00BE, //VULGAR FRACTION THREE QUARTERS
+ 0xA8FB: 0x215B, //VULGAR FRACTION ONE EIGHTH
+ 0xA8FC: 0x215C, //VULGAR FRACTION THREE EIGHTHS
+ 0xA8FD: 0x215D, //VULGAR FRACTION FIVE EIGHTHS
+ 0xA8FE: 0x215E, //VULGAR FRACTION SEVEN EIGHTHS
+ 0xA941: 0xCBC5, //HANGUL SYLLABLE SSANGCIEUC YU RIEULTHIEUTH
+ 0xA942: 0xCBC6, //HANGUL SYLLABLE SSANGCIEUC YU RIEULPHIEUPH
+ 0xA943: 0xCBC7, //HANGUL SYLLABLE SSANGCIEUC YU RIEULHIEUH
+ 0xA944: 0xCBC8, //HANGUL SYLLABLE SSANGCIEUC YU MIEUM
+ 0xA945: 0xCBC9, //HANGUL SYLLABLE SSANGCIEUC YU PIEUP
+ 0xA946: 0xCBCA, //HANGUL SYLLABLE SSANGCIEUC YU PIEUPSIOS
+ 0xA947: 0xCBCB, //HANGUL SYLLABLE SSANGCIEUC YU SIOS
+ 0xA948: 0xCBCC, //HANGUL SYLLABLE SSANGCIEUC YU SSANGSIOS
+ 0xA949: 0xCBCD, //HANGUL SYLLABLE SSANGCIEUC YU IEUNG
+ 0xA94A: 0xCBCE, //HANGUL SYLLABLE SSANGCIEUC YU CIEUC
+ 0xA94B: 0xCBCF, //HANGUL SYLLABLE SSANGCIEUC YU CHIEUCH
+ 0xA94C: 0xCBD0, //HANGUL SYLLABLE SSANGCIEUC YU KHIEUKH
+ 0xA94D: 0xCBD1, //HANGUL SYLLABLE SSANGCIEUC YU THIEUTH
+ 0xA94E: 0xCBD2, //HANGUL SYLLABLE SSANGCIEUC YU PHIEUPH
+ 0xA94F: 0xCBD3, //HANGUL SYLLABLE SSANGCIEUC YU HIEUH
+ 0xA950: 0xCBD5, //HANGUL SYLLABLE SSANGCIEUC EU KIYEOK
+ 0xA951: 0xCBD6, //HANGUL SYLLABLE SSANGCIEUC EU SSANGKIYEOK
+ 0xA952: 0xCBD7, //HANGUL SYLLABLE SSANGCIEUC EU KIYEOKSIOS
+ 0xA953: 0xCBD8, //HANGUL SYLLABLE SSANGCIEUC EU NIEUN
+ 0xA954: 0xCBD9, //HANGUL SYLLABLE SSANGCIEUC EU NIEUNCIEUC
+ 0xA955: 0xCBDA, //HANGUL SYLLABLE SSANGCIEUC EU NIEUNHIEUH
+ 0xA956: 0xCBDB, //HANGUL SYLLABLE SSANGCIEUC EU TIKEUT
+ 0xA957: 0xCBDC, //HANGUL SYLLABLE SSANGCIEUC EU RIEUL
+ 0xA958: 0xCBDD, //HANGUL SYLLABLE SSANGCIEUC EU RIEULKIYEOK
+ 0xA959: 0xCBDE, //HANGUL SYLLABLE SSANGCIEUC EU RIEULMIEUM
+ 0xA95A: 0xCBDF, //HANGUL SYLLABLE SSANGCIEUC EU RIEULPIEUP
+ 0xA961: 0xCBE0, //HANGUL SYLLABLE SSANGCIEUC EU RIEULSIOS
+ 0xA962: 0xCBE1, //HANGUL SYLLABLE SSANGCIEUC EU RIEULTHIEUTH
+ 0xA963: 0xCBE2, //HANGUL SYLLABLE SSANGCIEUC EU RIEULPHIEUPH
+ 0xA964: 0xCBE3, //HANGUL SYLLABLE SSANGCIEUC EU RIEULHIEUH
+ 0xA965: 0xCBE5, //HANGUL SYLLABLE SSANGCIEUC EU PIEUP
+ 0xA966: 0xCBE6, //HANGUL SYLLABLE SSANGCIEUC EU PIEUPSIOS
+ 0xA967: 0xCBE8, //HANGUL SYLLABLE SSANGCIEUC EU SSANGSIOS
+ 0xA968: 0xCBEA, //HANGUL SYLLABLE SSANGCIEUC EU CIEUC
+ 0xA969: 0xCBEB, //HANGUL SYLLABLE SSANGCIEUC EU CHIEUCH
+ 0xA96A: 0xCBEC, //HANGUL SYLLABLE SSANGCIEUC EU KHIEUKH
+ 0xA96B: 0xCBED, //HANGUL SYLLABLE SSANGCIEUC EU THIEUTH
+ 0xA96C: 0xCBEE, //HANGUL SYLLABLE SSANGCIEUC EU PHIEUPH
+ 0xA96D: 0xCBEF, //HANGUL SYLLABLE SSANGCIEUC EU HIEUH
+ 0xA96E: 0xCBF0, //HANGUL SYLLABLE SSANGCIEUC YI
+ 0xA96F: 0xCBF1, //HANGUL SYLLABLE SSANGCIEUC YI KIYEOK
+ 0xA970: 0xCBF2, //HANGUL SYLLABLE SSANGCIEUC YI SSANGKIYEOK
+ 0xA971: 0xCBF3, //HANGUL SYLLABLE SSANGCIEUC YI KIYEOKSIOS
+ 0xA972: 0xCBF4, //HANGUL SYLLABLE SSANGCIEUC YI NIEUN
+ 0xA973: 0xCBF5, //HANGUL SYLLABLE SSANGCIEUC YI NIEUNCIEUC
+ 0xA974: 0xCBF6, //HANGUL SYLLABLE SSANGCIEUC YI NIEUNHIEUH
+ 0xA975: 0xCBF7, //HANGUL SYLLABLE SSANGCIEUC YI TIKEUT
+ 0xA976: 0xCBF8, //HANGUL SYLLABLE SSANGCIEUC YI RIEUL
+ 0xA977: 0xCBF9, //HANGUL SYLLABLE SSANGCIEUC YI RIEULKIYEOK
+ 0xA978: 0xCBFA, //HANGUL SYLLABLE SSANGCIEUC YI RIEULMIEUM
+ 0xA979: 0xCBFB, //HANGUL SYLLABLE SSANGCIEUC YI RIEULPIEUP
+ 0xA97A: 0xCBFC, //HANGUL SYLLABLE SSANGCIEUC YI RIEULSIOS
+ 0xA981: 0xCBFD, //HANGUL SYLLABLE SSANGCIEUC YI RIEULTHIEUTH
+ 0xA982: 0xCBFE, //HANGUL SYLLABLE SSANGCIEUC YI RIEULPHIEUPH
+ 0xA983: 0xCBFF, //HANGUL SYLLABLE SSANGCIEUC YI RIEULHIEUH
+ 0xA984: 0xCC00, //HANGUL SYLLABLE SSANGCIEUC YI MIEUM
+ 0xA985: 0xCC01, //HANGUL SYLLABLE SSANGCIEUC YI PIEUP
+ 0xA986: 0xCC02, //HANGUL SYLLABLE SSANGCIEUC YI PIEUPSIOS
+ 0xA987: 0xCC03, //HANGUL SYLLABLE SSANGCIEUC YI SIOS
+ 0xA988: 0xCC04, //HANGUL SYLLABLE SSANGCIEUC YI SSANGSIOS
+ 0xA989: 0xCC05, //HANGUL SYLLABLE SSANGCIEUC YI IEUNG
+ 0xA98A: 0xCC06, //HANGUL SYLLABLE SSANGCIEUC YI CIEUC
+ 0xA98B: 0xCC07, //HANGUL SYLLABLE SSANGCIEUC YI CHIEUCH
+ 0xA98C: 0xCC08, //HANGUL SYLLABLE SSANGCIEUC YI KHIEUKH
+ 0xA98D: 0xCC09, //HANGUL SYLLABLE SSANGCIEUC YI THIEUTH
+ 0xA98E: 0xCC0A, //HANGUL SYLLABLE SSANGCIEUC YI PHIEUPH
+ 0xA98F: 0xCC0B, //HANGUL SYLLABLE SSANGCIEUC YI HIEUH
+ 0xA990: 0xCC0E, //HANGUL SYLLABLE SSANGCIEUC I SSANGKIYEOK
+ 0xA991: 0xCC0F, //HANGUL SYLLABLE SSANGCIEUC I KIYEOKSIOS
+ 0xA992: 0xCC11, //HANGUL SYLLABLE SSANGCIEUC I NIEUNCIEUC
+ 0xA993: 0xCC12, //HANGUL SYLLABLE SSANGCIEUC I NIEUNHIEUH
+ 0xA994: 0xCC13, //HANGUL SYLLABLE SSANGCIEUC I TIKEUT
+ 0xA995: 0xCC15, //HANGUL SYLLABLE SSANGCIEUC I RIEULKIYEOK
+ 0xA996: 0xCC16, //HANGUL SYLLABLE SSANGCIEUC I RIEULMIEUM
+ 0xA997: 0xCC17, //HANGUL SYLLABLE SSANGCIEUC I RIEULPIEUP
+ 0xA998: 0xCC18, //HANGUL SYLLABLE SSANGCIEUC I RIEULSIOS
+ 0xA999: 0xCC19, //HANGUL SYLLABLE SSANGCIEUC I RIEULTHIEUTH
+ 0xA99A: 0xCC1A, //HANGUL SYLLABLE SSANGCIEUC I RIEULPHIEUPH
+ 0xA99B: 0xCC1B, //HANGUL SYLLABLE SSANGCIEUC I RIEULHIEUH
+ 0xA99C: 0xCC1E, //HANGUL SYLLABLE SSANGCIEUC I PIEUPSIOS
+ 0xA99D: 0xCC1F, //HANGUL SYLLABLE SSANGCIEUC I SIOS
+ 0xA99E: 0xCC20, //HANGUL SYLLABLE SSANGCIEUC I SSANGSIOS
+ 0xA99F: 0xCC23, //HANGUL SYLLABLE SSANGCIEUC I CHIEUCH
+ 0xA9A0: 0xCC24, //HANGUL SYLLABLE SSANGCIEUC I KHIEUKH
+ 0xA9A1: 0x00E6, //LATIN SMALL LETTER AE
+ 0xA9A2: 0x0111, //LATIN SMALL LETTER D WITH STROKE
+ 0xA9A3: 0x00F0, //LATIN SMALL LETTER ETH
+ 0xA9A4: 0x0127, //LATIN SMALL LETTER H WITH STROKE
+ 0xA9A5: 0x0131, //LATIN SMALL LETTER DOTLESS I
+ 0xA9A6: 0x0133, //LATIN SMALL LIGATURE IJ
+ 0xA9A7: 0x0138, //LATIN SMALL LETTER KRA
+ 0xA9A8: 0x0140, //LATIN SMALL LETTER L WITH MIDDLE DOT
+ 0xA9A9: 0x0142, //LATIN SMALL LETTER L WITH STROKE
+ 0xA9AA: 0x00F8, //LATIN SMALL LETTER O WITH STROKE
+ 0xA9AB: 0x0153, //LATIN SMALL LIGATURE OE
+ 0xA9AC: 0x00DF, //LATIN SMALL LETTER SHARP S
+ 0xA9AD: 0x00FE, //LATIN SMALL LETTER THORN
+ 0xA9AE: 0x0167, //LATIN SMALL LETTER T WITH STROKE
+ 0xA9AF: 0x014B, //LATIN SMALL LETTER ENG
+ 0xA9B0: 0x0149, //LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ 0xA9B1: 0x3200, //PARENTHESIZED HANGUL KIYEOK
+ 0xA9B2: 0x3201, //PARENTHESIZED HANGUL NIEUN
+ 0xA9B3: 0x3202, //PARENTHESIZED HANGUL TIKEUT
+ 0xA9B4: 0x3203, //PARENTHESIZED HANGUL RIEUL
+ 0xA9B5: 0x3204, //PARENTHESIZED HANGUL MIEUM
+ 0xA9B6: 0x3205, //PARENTHESIZED HANGUL PIEUP
+ 0xA9B7: 0x3206, //PARENTHESIZED HANGUL SIOS
+ 0xA9B8: 0x3207, //PARENTHESIZED HANGUL IEUNG
+ 0xA9B9: 0x3208, //PARENTHESIZED HANGUL CIEUC
+ 0xA9BA: 0x3209, //PARENTHESIZED HANGUL CHIEUCH
+ 0xA9BB: 0x320A, //PARENTHESIZED HANGUL KHIEUKH
+ 0xA9BC: 0x320B, //PARENTHESIZED HANGUL THIEUTH
+ 0xA9BD: 0x320C, //PARENTHESIZED HANGUL PHIEUPH
+ 0xA9BE: 0x320D, //PARENTHESIZED HANGUL HIEUH
+ 0xA9BF: 0x320E, //PARENTHESIZED HANGUL KIYEOK A
+ 0xA9C0: 0x320F, //PARENTHESIZED HANGUL NIEUN A
+ 0xA9C1: 0x3210, //PARENTHESIZED HANGUL TIKEUT A
+ 0xA9C2: 0x3211, //PARENTHESIZED HANGUL RIEUL A
+ 0xA9C3: 0x3212, //PARENTHESIZED HANGUL MIEUM A
+ 0xA9C4: 0x3213, //PARENTHESIZED HANGUL PIEUP A
+ 0xA9C5: 0x3214, //PARENTHESIZED HANGUL SIOS A
+ 0xA9C6: 0x3215, //PARENTHESIZED HANGUL IEUNG A
+ 0xA9C7: 0x3216, //PARENTHESIZED HANGUL CIEUC A
+ 0xA9C8: 0x3217, //PARENTHESIZED HANGUL CHIEUCH A
+ 0xA9C9: 0x3218, //PARENTHESIZED HANGUL KHIEUKH A
+ 0xA9CA: 0x3219, //PARENTHESIZED HANGUL THIEUTH A
+ 0xA9CB: 0x321A, //PARENTHESIZED HANGUL PHIEUPH A
+ 0xA9CC: 0x321B, //PARENTHESIZED HANGUL HIEUH A
+ 0xA9CD: 0x249C, //PARENTHESIZED LATIN SMALL LETTER A
+ 0xA9CE: 0x249D, //PARENTHESIZED LATIN SMALL LETTER B
+ 0xA9CF: 0x249E, //PARENTHESIZED LATIN SMALL LETTER C
+ 0xA9D0: 0x249F, //PARENTHESIZED LATIN SMALL LETTER D
+ 0xA9D1: 0x24A0, //PARENTHESIZED LATIN SMALL LETTER E
+ 0xA9D2: 0x24A1, //PARENTHESIZED LATIN SMALL LETTER F
+ 0xA9D3: 0x24A2, //PARENTHESIZED LATIN SMALL LETTER G
+ 0xA9D4: 0x24A3, //PARENTHESIZED LATIN SMALL LETTER H
+ 0xA9D5: 0x24A4, //PARENTHESIZED LATIN SMALL LETTER I
+ 0xA9D6: 0x24A5, //PARENTHESIZED LATIN SMALL LETTER J
+ 0xA9D7: 0x24A6, //PARENTHESIZED LATIN SMALL LETTER K
+ 0xA9D8: 0x24A7, //PARENTHESIZED LATIN SMALL LETTER L
+ 0xA9D9: 0x24A8, //PARENTHESIZED LATIN SMALL LETTER M
+ 0xA9DA: 0x24A9, //PARENTHESIZED LATIN SMALL LETTER N
+ 0xA9DB: 0x24AA, //PARENTHESIZED LATIN SMALL LETTER O
+ 0xA9DC: 0x24AB, //PARENTHESIZED LATIN SMALL LETTER P
+ 0xA9DD: 0x24AC, //PARENTHESIZED LATIN SMALL LETTER Q
+ 0xA9DE: 0x24AD, //PARENTHESIZED LATIN SMALL LETTER R
+ 0xA9DF: 0x24AE, //PARENTHESIZED LATIN SMALL LETTER S
+ 0xA9E0: 0x24AF, //PARENTHESIZED LATIN SMALL LETTER T
+ 0xA9E1: 0x24B0, //PARENTHESIZED LATIN SMALL LETTER U
+ 0xA9E2: 0x24B1, //PARENTHESIZED LATIN SMALL LETTER V
+ 0xA9E3: 0x24B2, //PARENTHESIZED LATIN SMALL LETTER W
+ 0xA9E4: 0x24B3, //PARENTHESIZED LATIN SMALL LETTER X
+ 0xA9E5: 0x24B4, //PARENTHESIZED LATIN SMALL LETTER Y
+ 0xA9E6: 0x24B5, //PARENTHESIZED LATIN SMALL LETTER Z
+ 0xA9E7: 0x2474, //PARENTHESIZED DIGIT ONE
+ 0xA9E8: 0x2475, //PARENTHESIZED DIGIT TWO
+ 0xA9E9: 0x2476, //PARENTHESIZED DIGIT THREE
+ 0xA9EA: 0x2477, //PARENTHESIZED DIGIT FOUR
+ 0xA9EB: 0x2478, //PARENTHESIZED DIGIT FIVE
+ 0xA9EC: 0x2479, //PARENTHESIZED DIGIT SIX
+ 0xA9ED: 0x247A, //PARENTHESIZED DIGIT SEVEN
+ 0xA9EE: 0x247B, //PARENTHESIZED DIGIT EIGHT
+ 0xA9EF: 0x247C, //PARENTHESIZED DIGIT NINE
+ 0xA9F0: 0x247D, //PARENTHESIZED NUMBER TEN
+ 0xA9F1: 0x247E, //PARENTHESIZED NUMBER ELEVEN
+ 0xA9F2: 0x247F, //PARENTHESIZED NUMBER TWELVE
+ 0xA9F3: 0x2480, //PARENTHESIZED NUMBER THIRTEEN
+ 0xA9F4: 0x2481, //PARENTHESIZED NUMBER FOURTEEN
+ 0xA9F5: 0x2482, //PARENTHESIZED NUMBER FIFTEEN
+ 0xA9F6: 0x00B9, //SUPERSCRIPT ONE
+ 0xA9F7: 0x00B2, //SUPERSCRIPT TWO
+ 0xA9F8: 0x00B3, //SUPERSCRIPT THREE
+ 0xA9F9: 0x2074, //SUPERSCRIPT FOUR
+ 0xA9FA: 0x207F, //SUPERSCRIPT LATIN SMALL LETTER N
+ 0xA9FB: 0x2081, //SUBSCRIPT ONE
+ 0xA9FC: 0x2082, //SUBSCRIPT TWO
+ 0xA9FD: 0x2083, //SUBSCRIPT THREE
+ 0xA9FE: 0x2084, //SUBSCRIPT FOUR
+ 0xAA41: 0xCC25, //HANGUL SYLLABLE SSANGCIEUC I THIEUTH
+ 0xAA42: 0xCC26, //HANGUL SYLLABLE SSANGCIEUC I PHIEUPH
+ 0xAA43: 0xCC2A, //HANGUL SYLLABLE CHIEUCH A SSANGKIYEOK
+ 0xAA44: 0xCC2B, //HANGUL SYLLABLE CHIEUCH A KIYEOKSIOS
+ 0xAA45: 0xCC2D, //HANGUL SYLLABLE CHIEUCH A NIEUNCIEUC
+ 0xAA46: 0xCC2F, //HANGUL SYLLABLE CHIEUCH A TIKEUT
+ 0xAA47: 0xCC31, //HANGUL SYLLABLE CHIEUCH A RIEULKIYEOK
+ 0xAA48: 0xCC32, //HANGUL SYLLABLE CHIEUCH A RIEULMIEUM
+ 0xAA49: 0xCC33, //HANGUL SYLLABLE CHIEUCH A RIEULPIEUP
+ 0xAA4A: 0xCC34, //HANGUL SYLLABLE CHIEUCH A RIEULSIOS
+ 0xAA4B: 0xCC35, //HANGUL SYLLABLE CHIEUCH A RIEULTHIEUTH
+ 0xAA4C: 0xCC36, //HANGUL SYLLABLE CHIEUCH A RIEULPHIEUPH
+ 0xAA4D: 0xCC37, //HANGUL SYLLABLE CHIEUCH A RIEULHIEUH
+ 0xAA4E: 0xCC3A, //HANGUL SYLLABLE CHIEUCH A PIEUPSIOS
+ 0xAA4F: 0xCC3F, //HANGUL SYLLABLE CHIEUCH A CHIEUCH
+ 0xAA50: 0xCC40, //HANGUL SYLLABLE CHIEUCH A KHIEUKH
+ 0xAA51: 0xCC41, //HANGUL SYLLABLE CHIEUCH A THIEUTH
+ 0xAA52: 0xCC42, //HANGUL SYLLABLE CHIEUCH A PHIEUPH
+ 0xAA53: 0xCC43, //HANGUL SYLLABLE CHIEUCH A HIEUH
+ 0xAA54: 0xCC46, //HANGUL SYLLABLE CHIEUCH AE SSANGKIYEOK
+ 0xAA55: 0xCC47, //HANGUL SYLLABLE CHIEUCH AE KIYEOKSIOS
+ 0xAA56: 0xCC49, //HANGUL SYLLABLE CHIEUCH AE NIEUNCIEUC
+ 0xAA57: 0xCC4A, //HANGUL SYLLABLE CHIEUCH AE NIEUNHIEUH
+ 0xAA58: 0xCC4B, //HANGUL SYLLABLE CHIEUCH AE TIKEUT
+ 0xAA59: 0xCC4D, //HANGUL SYLLABLE CHIEUCH AE RIEULKIYEOK
+ 0xAA5A: 0xCC4E, //HANGUL SYLLABLE CHIEUCH AE RIEULMIEUM
+ 0xAA61: 0xCC4F, //HANGUL SYLLABLE CHIEUCH AE RIEULPIEUP
+ 0xAA62: 0xCC50, //HANGUL SYLLABLE CHIEUCH AE RIEULSIOS
+ 0xAA63: 0xCC51, //HANGUL SYLLABLE CHIEUCH AE RIEULTHIEUTH
+ 0xAA64: 0xCC52, //HANGUL SYLLABLE CHIEUCH AE RIEULPHIEUPH
+ 0xAA65: 0xCC53, //HANGUL SYLLABLE CHIEUCH AE RIEULHIEUH
+ 0xAA66: 0xCC56, //HANGUL SYLLABLE CHIEUCH AE PIEUPSIOS
+ 0xAA67: 0xCC5A, //HANGUL SYLLABLE CHIEUCH AE CIEUC
+ 0xAA68: 0xCC5B, //HANGUL SYLLABLE CHIEUCH AE CHIEUCH
+ 0xAA69: 0xCC5C, //HANGUL SYLLABLE CHIEUCH AE KHIEUKH
+ 0xAA6A: 0xCC5D, //HANGUL SYLLABLE CHIEUCH AE THIEUTH
+ 0xAA6B: 0xCC5E, //HANGUL SYLLABLE CHIEUCH AE PHIEUPH
+ 0xAA6C: 0xCC5F, //HANGUL SYLLABLE CHIEUCH AE HIEUH
+ 0xAA6D: 0xCC61, //HANGUL SYLLABLE CHIEUCH YA KIYEOK
+ 0xAA6E: 0xCC62, //HANGUL SYLLABLE CHIEUCH YA SSANGKIYEOK
+ 0xAA6F: 0xCC63, //HANGUL SYLLABLE CHIEUCH YA KIYEOKSIOS
+ 0xAA70: 0xCC65, //HANGUL SYLLABLE CHIEUCH YA NIEUNCIEUC
+ 0xAA71: 0xCC67, //HANGUL SYLLABLE CHIEUCH YA TIKEUT
+ 0xAA72: 0xCC69, //HANGUL SYLLABLE CHIEUCH YA RIEULKIYEOK
+ 0xAA73: 0xCC6A, //HANGUL SYLLABLE CHIEUCH YA RIEULMIEUM
+ 0xAA74: 0xCC6B, //HANGUL SYLLABLE CHIEUCH YA RIEULPIEUP
+ 0xAA75: 0xCC6C, //HANGUL SYLLABLE CHIEUCH YA RIEULSIOS
+ 0xAA76: 0xCC6D, //HANGUL SYLLABLE CHIEUCH YA RIEULTHIEUTH
+ 0xAA77: 0xCC6E, //HANGUL SYLLABLE CHIEUCH YA RIEULPHIEUPH
+ 0xAA78: 0xCC6F, //HANGUL SYLLABLE CHIEUCH YA RIEULHIEUH
+ 0xAA79: 0xCC71, //HANGUL SYLLABLE CHIEUCH YA PIEUP
+ 0xAA7A: 0xCC72, //HANGUL SYLLABLE CHIEUCH YA PIEUPSIOS
+ 0xAA81: 0xCC73, //HANGUL SYLLABLE CHIEUCH YA SIOS
+ 0xAA82: 0xCC74, //HANGUL SYLLABLE CHIEUCH YA SSANGSIOS
+ 0xAA83: 0xCC76, //HANGUL SYLLABLE CHIEUCH YA CIEUC
+ 0xAA84: 0xCC77, //HANGUL SYLLABLE CHIEUCH YA CHIEUCH
+ 0xAA85: 0xCC78, //HANGUL SYLLABLE CHIEUCH YA KHIEUKH
+ 0xAA86: 0xCC79, //HANGUL SYLLABLE CHIEUCH YA THIEUTH
+ 0xAA87: 0xCC7A, //HANGUL SYLLABLE CHIEUCH YA PHIEUPH
+ 0xAA88: 0xCC7B, //HANGUL SYLLABLE CHIEUCH YA HIEUH
+ 0xAA89: 0xCC7C, //HANGUL SYLLABLE CHIEUCH YAE
+ 0xAA8A: 0xCC7D, //HANGUL SYLLABLE CHIEUCH YAE KIYEOK
+ 0xAA8B: 0xCC7E, //HANGUL SYLLABLE CHIEUCH YAE SSANGKIYEOK
+ 0xAA8C: 0xCC7F, //HANGUL SYLLABLE CHIEUCH YAE KIYEOKSIOS
+ 0xAA8D: 0xCC80, //HANGUL SYLLABLE CHIEUCH YAE NIEUN
+ 0xAA8E: 0xCC81, //HANGUL SYLLABLE CHIEUCH YAE NIEUNCIEUC
+ 0xAA8F: 0xCC82, //HANGUL SYLLABLE CHIEUCH YAE NIEUNHIEUH
+ 0xAA90: 0xCC83, //HANGUL SYLLABLE CHIEUCH YAE TIKEUT
+ 0xAA91: 0xCC84, //HANGUL SYLLABLE CHIEUCH YAE RIEUL
+ 0xAA92: 0xCC85, //HANGUL SYLLABLE CHIEUCH YAE RIEULKIYEOK
+ 0xAA93: 0xCC86, //HANGUL SYLLABLE CHIEUCH YAE RIEULMIEUM
+ 0xAA94: 0xCC87, //HANGUL SYLLABLE CHIEUCH YAE RIEULPIEUP
+ 0xAA95: 0xCC88, //HANGUL SYLLABLE CHIEUCH YAE RIEULSIOS
+ 0xAA96: 0xCC89, //HANGUL SYLLABLE CHIEUCH YAE RIEULTHIEUTH
+ 0xAA97: 0xCC8A, //HANGUL SYLLABLE CHIEUCH YAE RIEULPHIEUPH
+ 0xAA98: 0xCC8B, //HANGUL SYLLABLE CHIEUCH YAE RIEULHIEUH
+ 0xAA99: 0xCC8C, //HANGUL SYLLABLE CHIEUCH YAE MIEUM
+ 0xAA9A: 0xCC8D, //HANGUL SYLLABLE CHIEUCH YAE PIEUP
+ 0xAA9B: 0xCC8E, //HANGUL SYLLABLE CHIEUCH YAE PIEUPSIOS
+ 0xAA9C: 0xCC8F, //HANGUL SYLLABLE CHIEUCH YAE SIOS
+ 0xAA9D: 0xCC90, //HANGUL SYLLABLE CHIEUCH YAE SSANGSIOS
+ 0xAA9E: 0xCC91, //HANGUL SYLLABLE CHIEUCH YAE IEUNG
+ 0xAA9F: 0xCC92, //HANGUL SYLLABLE CHIEUCH YAE CIEUC
+ 0xAAA0: 0xCC93, //HANGUL SYLLABLE CHIEUCH YAE CHIEUCH
+ 0xAAA1: 0x3041, //HIRAGANA LETTER SMALL A
+ 0xAAA2: 0x3042, //HIRAGANA LETTER A
+ 0xAAA3: 0x3043, //HIRAGANA LETTER SMALL I
+ 0xAAA4: 0x3044, //HIRAGANA LETTER I
+ 0xAAA5: 0x3045, //HIRAGANA LETTER SMALL U
+ 0xAAA6: 0x3046, //HIRAGANA LETTER U
+ 0xAAA7: 0x3047, //HIRAGANA LETTER SMALL E
+ 0xAAA8: 0x3048, //HIRAGANA LETTER E
+ 0xAAA9: 0x3049, //HIRAGANA LETTER SMALL O
+ 0xAAAA: 0x304A, //HIRAGANA LETTER O
+ 0xAAAB: 0x304B, //HIRAGANA LETTER KA
+ 0xAAAC: 0x304C, //HIRAGANA LETTER GA
+ 0xAAAD: 0x304D, //HIRAGANA LETTER KI
+ 0xAAAE: 0x304E, //HIRAGANA LETTER GI
+ 0xAAAF: 0x304F, //HIRAGANA LETTER KU
+ 0xAAB0: 0x3050, //HIRAGANA LETTER GU
+ 0xAAB1: 0x3051, //HIRAGANA LETTER KE
+ 0xAAB2: 0x3052, //HIRAGANA LETTER GE
+ 0xAAB3: 0x3053, //HIRAGANA LETTER KO
+ 0xAAB4: 0x3054, //HIRAGANA LETTER GO
+ 0xAAB5: 0x3055, //HIRAGANA LETTER SA
+ 0xAAB6: 0x3056, //HIRAGANA LETTER ZA
+ 0xAAB7: 0x3057, //HIRAGANA LETTER SI
+ 0xAAB8: 0x3058, //HIRAGANA LETTER ZI
+ 0xAAB9: 0x3059, //HIRAGANA LETTER SU
+ 0xAABA: 0x305A, //HIRAGANA LETTER ZU
+ 0xAABB: 0x305B, //HIRAGANA LETTER SE
+ 0xAABC: 0x305C, //HIRAGANA LETTER ZE
+ 0xAABD: 0x305D, //HIRAGANA LETTER SO
+ 0xAABE: 0x305E, //HIRAGANA LETTER ZO
+ 0xAABF: 0x305F, //HIRAGANA LETTER TA
+ 0xAAC0: 0x3060, //HIRAGANA LETTER DA
+ 0xAAC1: 0x3061, //HIRAGANA LETTER TI
+ 0xAAC2: 0x3062, //HIRAGANA LETTER DI
+ 0xAAC3: 0x3063, //HIRAGANA LETTER SMALL TU
+ 0xAAC4: 0x3064, //HIRAGANA LETTER TU
+ 0xAAC5: 0x3065, //HIRAGANA LETTER DU
+ 0xAAC6: 0x3066, //HIRAGANA LETTER TE
+ 0xAAC7: 0x3067, //HIRAGANA LETTER DE
+ 0xAAC8: 0x3068, //HIRAGANA LETTER TO
+ 0xAAC9: 0x3069, //HIRAGANA LETTER DO
+ 0xAACA: 0x306A, //HIRAGANA LETTER NA
+ 0xAACB: 0x306B, //HIRAGANA LETTER NI
+ 0xAACC: 0x306C, //HIRAGANA LETTER NU
+ 0xAACD: 0x306D, //HIRAGANA LETTER NE
+ 0xAACE: 0x306E, //HIRAGANA LETTER NO
+ 0xAACF: 0x306F, //HIRAGANA LETTER HA
+ 0xAAD0: 0x3070, //HIRAGANA LETTER BA
+ 0xAAD1: 0x3071, //HIRAGANA LETTER PA
+ 0xAAD2: 0x3072, //HIRAGANA LETTER HI
+ 0xAAD3: 0x3073, //HIRAGANA LETTER BI
+ 0xAAD4: 0x3074, //HIRAGANA LETTER PI
+ 0xAAD5: 0x3075, //HIRAGANA LETTER HU
+ 0xAAD6: 0x3076, //HIRAGANA LETTER BU
+ 0xAAD7: 0x3077, //HIRAGANA LETTER PU
+ 0xAAD8: 0x3078, //HIRAGANA LETTER HE
+ 0xAAD9: 0x3079, //HIRAGANA LETTER BE
+ 0xAADA: 0x307A, //HIRAGANA LETTER PE
+ 0xAADB: 0x307B, //HIRAGANA LETTER HO
+ 0xAADC: 0x307C, //HIRAGANA LETTER BO
+ 0xAADD: 0x307D, //HIRAGANA LETTER PO
+ 0xAADE: 0x307E, //HIRAGANA LETTER MA
+ 0xAADF: 0x307F, //HIRAGANA LETTER MI
+ 0xAAE0: 0x3080, //HIRAGANA LETTER MU
+ 0xAAE1: 0x3081, //HIRAGANA LETTER ME
+ 0xAAE2: 0x3082, //HIRAGANA LETTER MO
+ 0xAAE3: 0x3083, //HIRAGANA LETTER SMALL YA
+ 0xAAE4: 0x3084, //HIRAGANA LETTER YA
+ 0xAAE5: 0x3085, //HIRAGANA LETTER SMALL YU
+ 0xAAE6: 0x3086, //HIRAGANA LETTER YU
+ 0xAAE7: 0x3087, //HIRAGANA LETTER SMALL YO
+ 0xAAE8: 0x3088, //HIRAGANA LETTER YO
+ 0xAAE9: 0x3089, //HIRAGANA LETTER RA
+ 0xAAEA: 0x308A, //HIRAGANA LETTER RI
+ 0xAAEB: 0x308B, //HIRAGANA LETTER RU
+ 0xAAEC: 0x308C, //HIRAGANA LETTER RE
+ 0xAAED: 0x308D, //HIRAGANA LETTER RO
+ 0xAAEE: 0x308E, //HIRAGANA LETTER SMALL WA
+ 0xAAEF: 0x308F, //HIRAGANA LETTER WA
+ 0xAAF0: 0x3090, //HIRAGANA LETTER WI
+ 0xAAF1: 0x3091, //HIRAGANA LETTER WE
+ 0xAAF2: 0x3092, //HIRAGANA LETTER WO
+ 0xAAF3: 0x3093, //HIRAGANA LETTER N
+ 0xAB41: 0xCC94, //HANGUL SYLLABLE CHIEUCH YAE KHIEUKH
+ 0xAB42: 0xCC95, //HANGUL SYLLABLE CHIEUCH YAE THIEUTH
+ 0xAB43: 0xCC96, //HANGUL SYLLABLE CHIEUCH YAE PHIEUPH
+ 0xAB44: 0xCC97, //HANGUL SYLLABLE CHIEUCH YAE HIEUH
+ 0xAB45: 0xCC9A, //HANGUL SYLLABLE CHIEUCH EO SSANGKIYEOK
+ 0xAB46: 0xCC9B, //HANGUL SYLLABLE CHIEUCH EO KIYEOKSIOS
+ 0xAB47: 0xCC9D, //HANGUL SYLLABLE CHIEUCH EO NIEUNCIEUC
+ 0xAB48: 0xCC9E, //HANGUL SYLLABLE CHIEUCH EO NIEUNHIEUH
+ 0xAB49: 0xCC9F, //HANGUL SYLLABLE CHIEUCH EO TIKEUT
+ 0xAB4A: 0xCCA1, //HANGUL SYLLABLE CHIEUCH EO RIEULKIYEOK
+ 0xAB4B: 0xCCA2, //HANGUL SYLLABLE CHIEUCH EO RIEULMIEUM
+ 0xAB4C: 0xCCA3, //HANGUL SYLLABLE CHIEUCH EO RIEULPIEUP
+ 0xAB4D: 0xCCA4, //HANGUL SYLLABLE CHIEUCH EO RIEULSIOS
+ 0xAB4E: 0xCCA5, //HANGUL SYLLABLE CHIEUCH EO RIEULTHIEUTH
+ 0xAB4F: 0xCCA6, //HANGUL SYLLABLE CHIEUCH EO RIEULPHIEUPH
+ 0xAB50: 0xCCA7, //HANGUL SYLLABLE CHIEUCH EO RIEULHIEUH
+ 0xAB51: 0xCCAA, //HANGUL SYLLABLE CHIEUCH EO PIEUPSIOS
+ 0xAB52: 0xCCAE, //HANGUL SYLLABLE CHIEUCH EO CIEUC
+ 0xAB53: 0xCCAF, //HANGUL SYLLABLE CHIEUCH EO CHIEUCH
+ 0xAB54: 0xCCB0, //HANGUL SYLLABLE CHIEUCH EO KHIEUKH
+ 0xAB55: 0xCCB1, //HANGUL SYLLABLE CHIEUCH EO THIEUTH
+ 0xAB56: 0xCCB2, //HANGUL SYLLABLE CHIEUCH EO PHIEUPH
+ 0xAB57: 0xCCB3, //HANGUL SYLLABLE CHIEUCH EO HIEUH
+ 0xAB58: 0xCCB6, //HANGUL SYLLABLE CHIEUCH E SSANGKIYEOK
+ 0xAB59: 0xCCB7, //HANGUL SYLLABLE CHIEUCH E KIYEOKSIOS
+ 0xAB5A: 0xCCB9, //HANGUL SYLLABLE CHIEUCH E NIEUNCIEUC
+ 0xAB61: 0xCCBA, //HANGUL SYLLABLE CHIEUCH E NIEUNHIEUH
+ 0xAB62: 0xCCBB, //HANGUL SYLLABLE CHIEUCH E TIKEUT
+ 0xAB63: 0xCCBD, //HANGUL SYLLABLE CHIEUCH E RIEULKIYEOK
+ 0xAB64: 0xCCBE, //HANGUL SYLLABLE CHIEUCH E RIEULMIEUM
+ 0xAB65: 0xCCBF, //HANGUL SYLLABLE CHIEUCH E RIEULPIEUP
+ 0xAB66: 0xCCC0, //HANGUL SYLLABLE CHIEUCH E RIEULSIOS
+ 0xAB67: 0xCCC1, //HANGUL SYLLABLE CHIEUCH E RIEULTHIEUTH
+ 0xAB68: 0xCCC2, //HANGUL SYLLABLE CHIEUCH E RIEULPHIEUPH
+ 0xAB69: 0xCCC3, //HANGUL SYLLABLE CHIEUCH E RIEULHIEUH
+ 0xAB6A: 0xCCC6, //HANGUL SYLLABLE CHIEUCH E PIEUPSIOS
+ 0xAB6B: 0xCCC8, //HANGUL SYLLABLE CHIEUCH E SSANGSIOS
+ 0xAB6C: 0xCCCA, //HANGUL SYLLABLE CHIEUCH E CIEUC
+ 0xAB6D: 0xCCCB, //HANGUL SYLLABLE CHIEUCH E CHIEUCH
+ 0xAB6E: 0xCCCC, //HANGUL SYLLABLE CHIEUCH E KHIEUKH
+ 0xAB6F: 0xCCCD, //HANGUL SYLLABLE CHIEUCH E THIEUTH
+ 0xAB70: 0xCCCE, //HANGUL SYLLABLE CHIEUCH E PHIEUPH
+ 0xAB71: 0xCCCF, //HANGUL SYLLABLE CHIEUCH E HIEUH
+ 0xAB72: 0xCCD1, //HANGUL SYLLABLE CHIEUCH YEO KIYEOK
+ 0xAB73: 0xCCD2, //HANGUL SYLLABLE CHIEUCH YEO SSANGKIYEOK
+ 0xAB74: 0xCCD3, //HANGUL SYLLABLE CHIEUCH YEO KIYEOKSIOS
+ 0xAB75: 0xCCD5, //HANGUL SYLLABLE CHIEUCH YEO NIEUNCIEUC
+ 0xAB76: 0xCCD6, //HANGUL SYLLABLE CHIEUCH YEO NIEUNHIEUH
+ 0xAB77: 0xCCD7, //HANGUL SYLLABLE CHIEUCH YEO TIKEUT
+ 0xAB78: 0xCCD8, //HANGUL SYLLABLE CHIEUCH YEO RIEUL
+ 0xAB79: 0xCCD9, //HANGUL SYLLABLE CHIEUCH YEO RIEULKIYEOK
+ 0xAB7A: 0xCCDA, //HANGUL SYLLABLE CHIEUCH YEO RIEULMIEUM
+ 0xAB81: 0xCCDB, //HANGUL SYLLABLE CHIEUCH YEO RIEULPIEUP
+ 0xAB82: 0xCCDC, //HANGUL SYLLABLE CHIEUCH YEO RIEULSIOS
+ 0xAB83: 0xCCDD, //HANGUL SYLLABLE CHIEUCH YEO RIEULTHIEUTH
+ 0xAB84: 0xCCDE, //HANGUL SYLLABLE CHIEUCH YEO RIEULPHIEUPH
+ 0xAB85: 0xCCDF, //HANGUL SYLLABLE CHIEUCH YEO RIEULHIEUH
+ 0xAB86: 0xCCE0, //HANGUL SYLLABLE CHIEUCH YEO MIEUM
+ 0xAB87: 0xCCE1, //HANGUL SYLLABLE CHIEUCH YEO PIEUP
+ 0xAB88: 0xCCE2, //HANGUL SYLLABLE CHIEUCH YEO PIEUPSIOS
+ 0xAB89: 0xCCE3, //HANGUL SYLLABLE CHIEUCH YEO SIOS
+ 0xAB8A: 0xCCE5, //HANGUL SYLLABLE CHIEUCH YEO IEUNG
+ 0xAB8B: 0xCCE6, //HANGUL SYLLABLE CHIEUCH YEO CIEUC
+ 0xAB8C: 0xCCE7, //HANGUL SYLLABLE CHIEUCH YEO CHIEUCH
+ 0xAB8D: 0xCCE8, //HANGUL SYLLABLE CHIEUCH YEO KHIEUKH
+ 0xAB8E: 0xCCE9, //HANGUL SYLLABLE CHIEUCH YEO THIEUTH
+ 0xAB8F: 0xCCEA, //HANGUL SYLLABLE CHIEUCH YEO PHIEUPH
+ 0xAB90: 0xCCEB, //HANGUL SYLLABLE CHIEUCH YEO HIEUH
+ 0xAB91: 0xCCED, //HANGUL SYLLABLE CHIEUCH YE KIYEOK
+ 0xAB92: 0xCCEE, //HANGUL SYLLABLE CHIEUCH YE SSANGKIYEOK
+ 0xAB93: 0xCCEF, //HANGUL SYLLABLE CHIEUCH YE KIYEOKSIOS
+ 0xAB94: 0xCCF1, //HANGUL SYLLABLE CHIEUCH YE NIEUNCIEUC
+ 0xAB95: 0xCCF2, //HANGUL SYLLABLE CHIEUCH YE NIEUNHIEUH
+ 0xAB96: 0xCCF3, //HANGUL SYLLABLE CHIEUCH YE TIKEUT
+ 0xAB97: 0xCCF4, //HANGUL SYLLABLE CHIEUCH YE RIEUL
+ 0xAB98: 0xCCF5, //HANGUL SYLLABLE CHIEUCH YE RIEULKIYEOK
+ 0xAB99: 0xCCF6, //HANGUL SYLLABLE CHIEUCH YE RIEULMIEUM
+ 0xAB9A: 0xCCF7, //HANGUL SYLLABLE CHIEUCH YE RIEULPIEUP
+ 0xAB9B: 0xCCF8, //HANGUL SYLLABLE CHIEUCH YE RIEULSIOS
+ 0xAB9C: 0xCCF9, //HANGUL SYLLABLE CHIEUCH YE RIEULTHIEUTH
+ 0xAB9D: 0xCCFA, //HANGUL SYLLABLE CHIEUCH YE RIEULPHIEUPH
+ 0xAB9E: 0xCCFB, //HANGUL SYLLABLE CHIEUCH YE RIEULHIEUH
+ 0xAB9F: 0xCCFC, //HANGUL SYLLABLE CHIEUCH YE MIEUM
+ 0xABA0: 0xCCFD, //HANGUL SYLLABLE CHIEUCH YE PIEUP
+ 0xABA1: 0x30A1, //KATAKANA LETTER SMALL A
+ 0xABA2: 0x30A2, //KATAKANA LETTER A
+ 0xABA3: 0x30A3, //KATAKANA LETTER SMALL I
+ 0xABA4: 0x30A4, //KATAKANA LETTER I
+ 0xABA5: 0x30A5, //KATAKANA LETTER SMALL U
+ 0xABA6: 0x30A6, //KATAKANA LETTER U
+ 0xABA7: 0x30A7, //KATAKANA LETTER SMALL E
+ 0xABA8: 0x30A8, //KATAKANA LETTER E
+ 0xABA9: 0x30A9, //KATAKANA LETTER SMALL O
+ 0xABAA: 0x30AA, //KATAKANA LETTER O
+ 0xABAB: 0x30AB, //KATAKANA LETTER KA
+ 0xABAC: 0x30AC, //KATAKANA LETTER GA
+ 0xABAD: 0x30AD, //KATAKANA LETTER KI
+ 0xABAE: 0x30AE, //KATAKANA LETTER GI
+ 0xABAF: 0x30AF, //KATAKANA LETTER KU
+ 0xABB0: 0x30B0, //KATAKANA LETTER GU
+ 0xABB1: 0x30B1, //KATAKANA LETTER KE
+ 0xABB2: 0x30B2, //KATAKANA LETTER GE
+ 0xABB3: 0x30B3, //KATAKANA LETTER KO
+ 0xABB4: 0x30B4, //KATAKANA LETTER GO
+ 0xABB5: 0x30B5, //KATAKANA LETTER SA
+ 0xABB6: 0x30B6, //KATAKANA LETTER ZA
+ 0xABB7: 0x30B7, //KATAKANA LETTER SI
+ 0xABB8: 0x30B8, //KATAKANA LETTER ZI
+ 0xABB9: 0x30B9, //KATAKANA LETTER SU
+ 0xABBA: 0x30BA, //KATAKANA LETTER ZU
+ 0xABBB: 0x30BB, //KATAKANA LETTER SE
+ 0xABBC: 0x30BC, //KATAKANA LETTER ZE
+ 0xABBD: 0x30BD, //KATAKANA LETTER SO
+ 0xABBE: 0x30BE, //KATAKANA LETTER ZO
+ 0xABBF: 0x30BF, //KATAKANA LETTER TA
+ 0xABC0: 0x30C0, //KATAKANA LETTER DA
+ 0xABC1: 0x30C1, //KATAKANA LETTER TI
+ 0xABC2: 0x30C2, //KATAKANA LETTER DI
+ 0xABC3: 0x30C3, //KATAKANA LETTER SMALL TU
+ 0xABC4: 0x30C4, //KATAKANA LETTER TU
+ 0xABC5: 0x30C5, //KATAKANA LETTER DU
+ 0xABC6: 0x30C6, //KATAKANA LETTER TE
+ 0xABC7: 0x30C7, //KATAKANA LETTER DE
+ 0xABC8: 0x30C8, //KATAKANA LETTER TO
+ 0xABC9: 0x30C9, //KATAKANA LETTER DO
+ 0xABCA: 0x30CA, //KATAKANA LETTER NA
+ 0xABCB: 0x30CB, //KATAKANA LETTER NI
+ 0xABCC: 0x30CC, //KATAKANA LETTER NU
+ 0xABCD: 0x30CD, //KATAKANA LETTER NE
+ 0xABCE: 0x30CE, //KATAKANA LETTER NO
+ 0xABCF: 0x30CF, //KATAKANA LETTER HA
+ 0xABD0: 0x30D0, //KATAKANA LETTER BA
+ 0xABD1: 0x30D1, //KATAKANA LETTER PA
+ 0xABD2: 0x30D2, //KATAKANA LETTER HI
+ 0xABD3: 0x30D3, //KATAKANA LETTER BI
+ 0xABD4: 0x30D4, //KATAKANA LETTER PI
+ 0xABD5: 0x30D5, //KATAKANA LETTER HU
+ 0xABD6: 0x30D6, //KATAKANA LETTER BU
+ 0xABD7: 0x30D7, //KATAKANA LETTER PU
+ 0xABD8: 0x30D8, //KATAKANA LETTER HE
+ 0xABD9: 0x30D9, //KATAKANA LETTER BE
+ 0xABDA: 0x30DA, //KATAKANA LETTER PE
+ 0xABDB: 0x30DB, //KATAKANA LETTER HO
+ 0xABDC: 0x30DC, //KATAKANA LETTER BO
+ 0xABDD: 0x30DD, //KATAKANA LETTER PO
+ 0xABDE: 0x30DE, //KATAKANA LETTER MA
+ 0xABDF: 0x30DF, //KATAKANA LETTER MI
+ 0xABE0: 0x30E0, //KATAKANA LETTER MU
+ 0xABE1: 0x30E1, //KATAKANA LETTER ME
+ 0xABE2: 0x30E2, //KATAKANA LETTER MO
+ 0xABE3: 0x30E3, //KATAKANA LETTER SMALL YA
+ 0xABE4: 0x30E4, //KATAKANA LETTER YA
+ 0xABE5: 0x30E5, //KATAKANA LETTER SMALL YU
+ 0xABE6: 0x30E6, //KATAKANA LETTER YU
+ 0xABE7: 0x30E7, //KATAKANA LETTER SMALL YO
+ 0xABE8: 0x30E8, //KATAKANA LETTER YO
+ 0xABE9: 0x30E9, //KATAKANA LETTER RA
+ 0xABEA: 0x30EA, //KATAKANA LETTER RI
+ 0xABEB: 0x30EB, //KATAKANA LETTER RU
+ 0xABEC: 0x30EC, //KATAKANA LETTER RE
+ 0xABED: 0x30ED, //KATAKANA LETTER RO
+ 0xABEE: 0x30EE, //KATAKANA LETTER SMALL WA
+ 0xABEF: 0x30EF, //KATAKANA LETTER WA
+ 0xABF0: 0x30F0, //KATAKANA LETTER WI
+ 0xABF1: 0x30F1, //KATAKANA LETTER WE
+ 0xABF2: 0x30F2, //KATAKANA LETTER WO
+ 0xABF3: 0x30F3, //KATAKANA LETTER N
+ 0xABF4: 0x30F4, //KATAKANA LETTER VU
+ 0xABF5: 0x30F5, //KATAKANA LETTER SMALL KA
+ 0xABF6: 0x30F6, //KATAKANA LETTER SMALL KE
+ 0xAC41: 0xCCFE, //HANGUL SYLLABLE CHIEUCH YE PIEUPSIOS
+ 0xAC42: 0xCCFF, //HANGUL SYLLABLE CHIEUCH YE SIOS
+ 0xAC43: 0xCD00, //HANGUL SYLLABLE CHIEUCH YE SSANGSIOS
+ 0xAC44: 0xCD02, //HANGUL SYLLABLE CHIEUCH YE CIEUC
+ 0xAC45: 0xCD03, //HANGUL SYLLABLE CHIEUCH YE CHIEUCH
+ 0xAC46: 0xCD04, //HANGUL SYLLABLE CHIEUCH YE KHIEUKH
+ 0xAC47: 0xCD05, //HANGUL SYLLABLE CHIEUCH YE THIEUTH
+ 0xAC48: 0xCD06, //HANGUL SYLLABLE CHIEUCH YE PHIEUPH
+ 0xAC49: 0xCD07, //HANGUL SYLLABLE CHIEUCH YE HIEUH
+ 0xAC4A: 0xCD0A, //HANGUL SYLLABLE CHIEUCH O SSANGKIYEOK
+ 0xAC4B: 0xCD0B, //HANGUL SYLLABLE CHIEUCH O KIYEOKSIOS
+ 0xAC4C: 0xCD0D, //HANGUL SYLLABLE CHIEUCH O NIEUNCIEUC
+ 0xAC4D: 0xCD0E, //HANGUL SYLLABLE CHIEUCH O NIEUNHIEUH
+ 0xAC4E: 0xCD0F, //HANGUL SYLLABLE CHIEUCH O TIKEUT
+ 0xAC4F: 0xCD11, //HANGUL SYLLABLE CHIEUCH O RIEULKIYEOK
+ 0xAC50: 0xCD12, //HANGUL SYLLABLE CHIEUCH O RIEULMIEUM
+ 0xAC51: 0xCD13, //HANGUL SYLLABLE CHIEUCH O RIEULPIEUP
+ 0xAC52: 0xCD14, //HANGUL SYLLABLE CHIEUCH O RIEULSIOS
+ 0xAC53: 0xCD15, //HANGUL SYLLABLE CHIEUCH O RIEULTHIEUTH
+ 0xAC54: 0xCD16, //HANGUL SYLLABLE CHIEUCH O RIEULPHIEUPH
+ 0xAC55: 0xCD17, //HANGUL SYLLABLE CHIEUCH O RIEULHIEUH
+ 0xAC56: 0xCD1A, //HANGUL SYLLABLE CHIEUCH O PIEUPSIOS
+ 0xAC57: 0xCD1C, //HANGUL SYLLABLE CHIEUCH O SSANGSIOS
+ 0xAC58: 0xCD1E, //HANGUL SYLLABLE CHIEUCH O CIEUC
+ 0xAC59: 0xCD1F, //HANGUL SYLLABLE CHIEUCH O CHIEUCH
+ 0xAC5A: 0xCD20, //HANGUL SYLLABLE CHIEUCH O KHIEUKH
+ 0xAC61: 0xCD21, //HANGUL SYLLABLE CHIEUCH O THIEUTH
+ 0xAC62: 0xCD22, //HANGUL SYLLABLE CHIEUCH O PHIEUPH
+ 0xAC63: 0xCD23, //HANGUL SYLLABLE CHIEUCH O HIEUH
+ 0xAC64: 0xCD25, //HANGUL SYLLABLE CHIEUCH WA KIYEOK
+ 0xAC65: 0xCD26, //HANGUL SYLLABLE CHIEUCH WA SSANGKIYEOK
+ 0xAC66: 0xCD27, //HANGUL SYLLABLE CHIEUCH WA KIYEOKSIOS
+ 0xAC67: 0xCD29, //HANGUL SYLLABLE CHIEUCH WA NIEUNCIEUC
+ 0xAC68: 0xCD2A, //HANGUL SYLLABLE CHIEUCH WA NIEUNHIEUH
+ 0xAC69: 0xCD2B, //HANGUL SYLLABLE CHIEUCH WA TIKEUT
+ 0xAC6A: 0xCD2D, //HANGUL SYLLABLE CHIEUCH WA RIEULKIYEOK
+ 0xAC6B: 0xCD2E, //HANGUL SYLLABLE CHIEUCH WA RIEULMIEUM
+ 0xAC6C: 0xCD2F, //HANGUL SYLLABLE CHIEUCH WA RIEULPIEUP
+ 0xAC6D: 0xCD30, //HANGUL SYLLABLE CHIEUCH WA RIEULSIOS
+ 0xAC6E: 0xCD31, //HANGUL SYLLABLE CHIEUCH WA RIEULTHIEUTH
+ 0xAC6F: 0xCD32, //HANGUL SYLLABLE CHIEUCH WA RIEULPHIEUPH
+ 0xAC70: 0xCD33, //HANGUL SYLLABLE CHIEUCH WA RIEULHIEUH
+ 0xAC71: 0xCD34, //HANGUL SYLLABLE CHIEUCH WA MIEUM
+ 0xAC72: 0xCD35, //HANGUL SYLLABLE CHIEUCH WA PIEUP
+ 0xAC73: 0xCD36, //HANGUL SYLLABLE CHIEUCH WA PIEUPSIOS
+ 0xAC74: 0xCD37, //HANGUL SYLLABLE CHIEUCH WA SIOS
+ 0xAC75: 0xCD38, //HANGUL SYLLABLE CHIEUCH WA SSANGSIOS
+ 0xAC76: 0xCD3A, //HANGUL SYLLABLE CHIEUCH WA CIEUC
+ 0xAC77: 0xCD3B, //HANGUL SYLLABLE CHIEUCH WA CHIEUCH
+ 0xAC78: 0xCD3C, //HANGUL SYLLABLE CHIEUCH WA KHIEUKH
+ 0xAC79: 0xCD3D, //HANGUL SYLLABLE CHIEUCH WA THIEUTH
+ 0xAC7A: 0xCD3E, //HANGUL SYLLABLE CHIEUCH WA PHIEUPH
+ 0xAC81: 0xCD3F, //HANGUL SYLLABLE CHIEUCH WA HIEUH
+ 0xAC82: 0xCD40, //HANGUL SYLLABLE CHIEUCH WAE
+ 0xAC83: 0xCD41, //HANGUL SYLLABLE CHIEUCH WAE KIYEOK
+ 0xAC84: 0xCD42, //HANGUL SYLLABLE CHIEUCH WAE SSANGKIYEOK
+ 0xAC85: 0xCD43, //HANGUL SYLLABLE CHIEUCH WAE KIYEOKSIOS
+ 0xAC86: 0xCD44, //HANGUL SYLLABLE CHIEUCH WAE NIEUN
+ 0xAC87: 0xCD45, //HANGUL SYLLABLE CHIEUCH WAE NIEUNCIEUC
+ 0xAC88: 0xCD46, //HANGUL SYLLABLE CHIEUCH WAE NIEUNHIEUH
+ 0xAC89: 0xCD47, //HANGUL SYLLABLE CHIEUCH WAE TIKEUT
+ 0xAC8A: 0xCD48, //HANGUL SYLLABLE CHIEUCH WAE RIEUL
+ 0xAC8B: 0xCD49, //HANGUL SYLLABLE CHIEUCH WAE RIEULKIYEOK
+ 0xAC8C: 0xCD4A, //HANGUL SYLLABLE CHIEUCH WAE RIEULMIEUM
+ 0xAC8D: 0xCD4B, //HANGUL SYLLABLE CHIEUCH WAE RIEULPIEUP
+ 0xAC8E: 0xCD4C, //HANGUL SYLLABLE CHIEUCH WAE RIEULSIOS
+ 0xAC8F: 0xCD4D, //HANGUL SYLLABLE CHIEUCH WAE RIEULTHIEUTH
+ 0xAC90: 0xCD4E, //HANGUL SYLLABLE CHIEUCH WAE RIEULPHIEUPH
+ 0xAC91: 0xCD4F, //HANGUL SYLLABLE CHIEUCH WAE RIEULHIEUH
+ 0xAC92: 0xCD50, //HANGUL SYLLABLE CHIEUCH WAE MIEUM
+ 0xAC93: 0xCD51, //HANGUL SYLLABLE CHIEUCH WAE PIEUP
+ 0xAC94: 0xCD52, //HANGUL SYLLABLE CHIEUCH WAE PIEUPSIOS
+ 0xAC95: 0xCD53, //HANGUL SYLLABLE CHIEUCH WAE SIOS
+ 0xAC96: 0xCD54, //HANGUL SYLLABLE CHIEUCH WAE SSANGSIOS
+ 0xAC97: 0xCD55, //HANGUL SYLLABLE CHIEUCH WAE IEUNG
+ 0xAC98: 0xCD56, //HANGUL SYLLABLE CHIEUCH WAE CIEUC
+ 0xAC99: 0xCD57, //HANGUL SYLLABLE CHIEUCH WAE CHIEUCH
+ 0xAC9A: 0xCD58, //HANGUL SYLLABLE CHIEUCH WAE KHIEUKH
+ 0xAC9B: 0xCD59, //HANGUL SYLLABLE CHIEUCH WAE THIEUTH
+ 0xAC9C: 0xCD5A, //HANGUL SYLLABLE CHIEUCH WAE PHIEUPH
+ 0xAC9D: 0xCD5B, //HANGUL SYLLABLE CHIEUCH WAE HIEUH
+ 0xAC9E: 0xCD5D, //HANGUL SYLLABLE CHIEUCH OE KIYEOK
+ 0xAC9F: 0xCD5E, //HANGUL SYLLABLE CHIEUCH OE SSANGKIYEOK
+ 0xACA0: 0xCD5F, //HANGUL SYLLABLE CHIEUCH OE KIYEOKSIOS
+ 0xACA1: 0x0410, //CYRILLIC CAPITAL LETTER A
+ 0xACA2: 0x0411, //CYRILLIC CAPITAL LETTER BE
+ 0xACA3: 0x0412, //CYRILLIC CAPITAL LETTER VE
+ 0xACA4: 0x0413, //CYRILLIC CAPITAL LETTER GHE
+ 0xACA5: 0x0414, //CYRILLIC CAPITAL LETTER DE
+ 0xACA6: 0x0415, //CYRILLIC CAPITAL LETTER IE
+ 0xACA7: 0x0401, //CYRILLIC CAPITAL LETTER IO
+ 0xACA8: 0x0416, //CYRILLIC CAPITAL LETTER ZHE
+ 0xACA9: 0x0417, //CYRILLIC CAPITAL LETTER ZE
+ 0xACAA: 0x0418, //CYRILLIC CAPITAL LETTER I
+ 0xACAB: 0x0419, //CYRILLIC CAPITAL LETTER SHORT I
+ 0xACAC: 0x041A, //CYRILLIC CAPITAL LETTER KA
+ 0xACAD: 0x041B, //CYRILLIC CAPITAL LETTER EL
+ 0xACAE: 0x041C, //CYRILLIC CAPITAL LETTER EM
+ 0xACAF: 0x041D, //CYRILLIC CAPITAL LETTER EN
+ 0xACB0: 0x041E, //CYRILLIC CAPITAL LETTER O
+ 0xACB1: 0x041F, //CYRILLIC CAPITAL LETTER PE
+ 0xACB2: 0x0420, //CYRILLIC CAPITAL LETTER ER
+ 0xACB3: 0x0421, //CYRILLIC CAPITAL LETTER ES
+ 0xACB4: 0x0422, //CYRILLIC CAPITAL LETTER TE
+ 0xACB5: 0x0423, //CYRILLIC CAPITAL LETTER U
+ 0xACB6: 0x0424, //CYRILLIC CAPITAL LETTER EF
+ 0xACB7: 0x0425, //CYRILLIC CAPITAL LETTER HA
+ 0xACB8: 0x0426, //CYRILLIC CAPITAL LETTER TSE
+ 0xACB9: 0x0427, //CYRILLIC CAPITAL LETTER CHE
+ 0xACBA: 0x0428, //CYRILLIC CAPITAL LETTER SHA
+ 0xACBB: 0x0429, //CYRILLIC CAPITAL LETTER SHCHA
+ 0xACBC: 0x042A, //CYRILLIC CAPITAL LETTER HARD SIGN
+ 0xACBD: 0x042B, //CYRILLIC CAPITAL LETTER YERU
+ 0xACBE: 0x042C, //CYRILLIC CAPITAL LETTER SOFT SIGN
+ 0xACBF: 0x042D, //CYRILLIC CAPITAL LETTER E
+ 0xACC0: 0x042E, //CYRILLIC CAPITAL LETTER YU
+ 0xACC1: 0x042F, //CYRILLIC CAPITAL LETTER YA
+ 0xACD1: 0x0430, //CYRILLIC SMALL LETTER A
+ 0xACD2: 0x0431, //CYRILLIC SMALL LETTER BE
+ 0xACD3: 0x0432, //CYRILLIC SMALL LETTER VE
+ 0xACD4: 0x0433, //CYRILLIC SMALL LETTER GHE
+ 0xACD5: 0x0434, //CYRILLIC SMALL LETTER DE
+ 0xACD6: 0x0435, //CYRILLIC SMALL LETTER IE
+ 0xACD7: 0x0451, //CYRILLIC SMALL LETTER IO
+ 0xACD8: 0x0436, //CYRILLIC SMALL LETTER ZHE
+ 0xACD9: 0x0437, //CYRILLIC SMALL LETTER ZE
+ 0xACDA: 0x0438, //CYRILLIC SMALL LETTER I
+ 0xACDB: 0x0439, //CYRILLIC SMALL LETTER SHORT I
+ 0xACDC: 0x043A, //CYRILLIC SMALL LETTER KA
+ 0xACDD: 0x043B, //CYRILLIC SMALL LETTER EL
+ 0xACDE: 0x043C, //CYRILLIC SMALL LETTER EM
+ 0xACDF: 0x043D, //CYRILLIC SMALL LETTER EN
+ 0xACE0: 0x043E, //CYRILLIC SMALL LETTER O
+ 0xACE1: 0x043F, //CYRILLIC SMALL LETTER PE
+ 0xACE2: 0x0440, //CYRILLIC SMALL LETTER ER
+ 0xACE3: 0x0441, //CYRILLIC SMALL LETTER ES
+ 0xACE4: 0x0442, //CYRILLIC SMALL LETTER TE
+ 0xACE5: 0x0443, //CYRILLIC SMALL LETTER U
+ 0xACE6: 0x0444, //CYRILLIC SMALL LETTER EF
+ 0xACE7: 0x0445, //CYRILLIC SMALL LETTER HA
+ 0xACE8: 0x0446, //CYRILLIC SMALL LETTER TSE
+ 0xACE9: 0x0447, //CYRILLIC SMALL LETTER CHE
+ 0xACEA: 0x0448, //CYRILLIC SMALL LETTER SHA
+ 0xACEB: 0x0449, //CYRILLIC SMALL LETTER SHCHA
+ 0xACEC: 0x044A, //CYRILLIC SMALL LETTER HARD SIGN
+ 0xACED: 0x044B, //CYRILLIC SMALL LETTER YERU
+ 0xACEE: 0x044C, //CYRILLIC SMALL LETTER SOFT SIGN
+ 0xACEF: 0x044D, //CYRILLIC SMALL LETTER E
+ 0xACF0: 0x044E, //CYRILLIC SMALL LETTER YU
+ 0xACF1: 0x044F, //CYRILLIC SMALL LETTER YA
+ 0xAD41: 0xCD61, //HANGUL SYLLABLE CHIEUCH OE NIEUNCIEUC
+ 0xAD42: 0xCD62, //HANGUL SYLLABLE CHIEUCH OE NIEUNHIEUH
+ 0xAD43: 0xCD63, //HANGUL SYLLABLE CHIEUCH OE TIKEUT
+ 0xAD44: 0xCD65, //HANGUL SYLLABLE CHIEUCH OE RIEULKIYEOK
+ 0xAD45: 0xCD66, //HANGUL SYLLABLE CHIEUCH OE RIEULMIEUM
+ 0xAD46: 0xCD67, //HANGUL SYLLABLE CHIEUCH OE RIEULPIEUP
+ 0xAD47: 0xCD68, //HANGUL SYLLABLE CHIEUCH OE RIEULSIOS
+ 0xAD48: 0xCD69, //HANGUL SYLLABLE CHIEUCH OE RIEULTHIEUTH
+ 0xAD49: 0xCD6A, //HANGUL SYLLABLE CHIEUCH OE RIEULPHIEUPH
+ 0xAD4A: 0xCD6B, //HANGUL SYLLABLE CHIEUCH OE RIEULHIEUH
+ 0xAD4B: 0xCD6E, //HANGUL SYLLABLE CHIEUCH OE PIEUPSIOS
+ 0xAD4C: 0xCD70, //HANGUL SYLLABLE CHIEUCH OE SSANGSIOS
+ 0xAD4D: 0xCD72, //HANGUL SYLLABLE CHIEUCH OE CIEUC
+ 0xAD4E: 0xCD73, //HANGUL SYLLABLE CHIEUCH OE CHIEUCH
+ 0xAD4F: 0xCD74, //HANGUL SYLLABLE CHIEUCH OE KHIEUKH
+ 0xAD50: 0xCD75, //HANGUL SYLLABLE CHIEUCH OE THIEUTH
+ 0xAD51: 0xCD76, //HANGUL SYLLABLE CHIEUCH OE PHIEUPH
+ 0xAD52: 0xCD77, //HANGUL SYLLABLE CHIEUCH OE HIEUH
+ 0xAD53: 0xCD79, //HANGUL SYLLABLE CHIEUCH YO KIYEOK
+ 0xAD54: 0xCD7A, //HANGUL SYLLABLE CHIEUCH YO SSANGKIYEOK
+ 0xAD55: 0xCD7B, //HANGUL SYLLABLE CHIEUCH YO KIYEOKSIOS
+ 0xAD56: 0xCD7C, //HANGUL SYLLABLE CHIEUCH YO NIEUN
+ 0xAD57: 0xCD7D, //HANGUL SYLLABLE CHIEUCH YO NIEUNCIEUC
+ 0xAD58: 0xCD7E, //HANGUL SYLLABLE CHIEUCH YO NIEUNHIEUH
+ 0xAD59: 0xCD7F, //HANGUL SYLLABLE CHIEUCH YO TIKEUT
+ 0xAD5A: 0xCD80, //HANGUL SYLLABLE CHIEUCH YO RIEUL
+ 0xAD61: 0xCD81, //HANGUL SYLLABLE CHIEUCH YO RIEULKIYEOK
+ 0xAD62: 0xCD82, //HANGUL SYLLABLE CHIEUCH YO RIEULMIEUM
+ 0xAD63: 0xCD83, //HANGUL SYLLABLE CHIEUCH YO RIEULPIEUP
+ 0xAD64: 0xCD84, //HANGUL SYLLABLE CHIEUCH YO RIEULSIOS
+ 0xAD65: 0xCD85, //HANGUL SYLLABLE CHIEUCH YO RIEULTHIEUTH
+ 0xAD66: 0xCD86, //HANGUL SYLLABLE CHIEUCH YO RIEULPHIEUPH
+ 0xAD67: 0xCD87, //HANGUL SYLLABLE CHIEUCH YO RIEULHIEUH
+ 0xAD68: 0xCD89, //HANGUL SYLLABLE CHIEUCH YO PIEUP
+ 0xAD69: 0xCD8A, //HANGUL SYLLABLE CHIEUCH YO PIEUPSIOS
+ 0xAD6A: 0xCD8B, //HANGUL SYLLABLE CHIEUCH YO SIOS
+ 0xAD6B: 0xCD8C, //HANGUL SYLLABLE CHIEUCH YO SSANGSIOS
+ 0xAD6C: 0xCD8D, //HANGUL SYLLABLE CHIEUCH YO IEUNG
+ 0xAD6D: 0xCD8E, //HANGUL SYLLABLE CHIEUCH YO CIEUC
+ 0xAD6E: 0xCD8F, //HANGUL SYLLABLE CHIEUCH YO CHIEUCH
+ 0xAD6F: 0xCD90, //HANGUL SYLLABLE CHIEUCH YO KHIEUKH
+ 0xAD70: 0xCD91, //HANGUL SYLLABLE CHIEUCH YO THIEUTH
+ 0xAD71: 0xCD92, //HANGUL SYLLABLE CHIEUCH YO PHIEUPH
+ 0xAD72: 0xCD93, //HANGUL SYLLABLE CHIEUCH YO HIEUH
+ 0xAD73: 0xCD96, //HANGUL SYLLABLE CHIEUCH U SSANGKIYEOK
+ 0xAD74: 0xCD97, //HANGUL SYLLABLE CHIEUCH U KIYEOKSIOS
+ 0xAD75: 0xCD99, //HANGUL SYLLABLE CHIEUCH U NIEUNCIEUC
+ 0xAD76: 0xCD9A, //HANGUL SYLLABLE CHIEUCH U NIEUNHIEUH
+ 0xAD77: 0xCD9B, //HANGUL SYLLABLE CHIEUCH U TIKEUT
+ 0xAD78: 0xCD9D, //HANGUL SYLLABLE CHIEUCH U RIEULKIYEOK
+ 0xAD79: 0xCD9E, //HANGUL SYLLABLE CHIEUCH U RIEULMIEUM
+ 0xAD7A: 0xCD9F, //HANGUL SYLLABLE CHIEUCH U RIEULPIEUP
+ 0xAD81: 0xCDA0, //HANGUL SYLLABLE CHIEUCH U RIEULSIOS
+ 0xAD82: 0xCDA1, //HANGUL SYLLABLE CHIEUCH U RIEULTHIEUTH
+ 0xAD83: 0xCDA2, //HANGUL SYLLABLE CHIEUCH U RIEULPHIEUPH
+ 0xAD84: 0xCDA3, //HANGUL SYLLABLE CHIEUCH U RIEULHIEUH
+ 0xAD85: 0xCDA6, //HANGUL SYLLABLE CHIEUCH U PIEUPSIOS
+ 0xAD86: 0xCDA8, //HANGUL SYLLABLE CHIEUCH U SSANGSIOS
+ 0xAD87: 0xCDAA, //HANGUL SYLLABLE CHIEUCH U CIEUC
+ 0xAD88: 0xCDAB, //HANGUL SYLLABLE CHIEUCH U CHIEUCH
+ 0xAD89: 0xCDAC, //HANGUL SYLLABLE CHIEUCH U KHIEUKH
+ 0xAD8A: 0xCDAD, //HANGUL SYLLABLE CHIEUCH U THIEUTH
+ 0xAD8B: 0xCDAE, //HANGUL SYLLABLE CHIEUCH U PHIEUPH
+ 0xAD8C: 0xCDAF, //HANGUL SYLLABLE CHIEUCH U HIEUH
+ 0xAD8D: 0xCDB1, //HANGUL SYLLABLE CHIEUCH WEO KIYEOK
+ 0xAD8E: 0xCDB2, //HANGUL SYLLABLE CHIEUCH WEO SSANGKIYEOK
+ 0xAD8F: 0xCDB3, //HANGUL SYLLABLE CHIEUCH WEO KIYEOKSIOS
+ 0xAD90: 0xCDB4, //HANGUL SYLLABLE CHIEUCH WEO NIEUN
+ 0xAD91: 0xCDB5, //HANGUL SYLLABLE CHIEUCH WEO NIEUNCIEUC
+ 0xAD92: 0xCDB6, //HANGUL SYLLABLE CHIEUCH WEO NIEUNHIEUH
+ 0xAD93: 0xCDB7, //HANGUL SYLLABLE CHIEUCH WEO TIKEUT
+ 0xAD94: 0xCDB8, //HANGUL SYLLABLE CHIEUCH WEO RIEUL
+ 0xAD95: 0xCDB9, //HANGUL SYLLABLE CHIEUCH WEO RIEULKIYEOK
+ 0xAD96: 0xCDBA, //HANGUL SYLLABLE CHIEUCH WEO RIEULMIEUM
+ 0xAD97: 0xCDBB, //HANGUL SYLLABLE CHIEUCH WEO RIEULPIEUP
+ 0xAD98: 0xCDBC, //HANGUL SYLLABLE CHIEUCH WEO RIEULSIOS
+ 0xAD99: 0xCDBD, //HANGUL SYLLABLE CHIEUCH WEO RIEULTHIEUTH
+ 0xAD9A: 0xCDBE, //HANGUL SYLLABLE CHIEUCH WEO RIEULPHIEUPH
+ 0xAD9B: 0xCDBF, //HANGUL SYLLABLE CHIEUCH WEO RIEULHIEUH
+ 0xAD9C: 0xCDC0, //HANGUL SYLLABLE CHIEUCH WEO MIEUM
+ 0xAD9D: 0xCDC1, //HANGUL SYLLABLE CHIEUCH WEO PIEUP
+ 0xAD9E: 0xCDC2, //HANGUL SYLLABLE CHIEUCH WEO PIEUPSIOS
+ 0xAD9F: 0xCDC3, //HANGUL SYLLABLE CHIEUCH WEO SIOS
+ 0xADA0: 0xCDC5, //HANGUL SYLLABLE CHIEUCH WEO IEUNG
+ 0xAE41: 0xCDC6, //HANGUL SYLLABLE CHIEUCH WEO CIEUC
+ 0xAE42: 0xCDC7, //HANGUL SYLLABLE CHIEUCH WEO CHIEUCH
+ 0xAE43: 0xCDC8, //HANGUL SYLLABLE CHIEUCH WEO KHIEUKH
+ 0xAE44: 0xCDC9, //HANGUL SYLLABLE CHIEUCH WEO THIEUTH
+ 0xAE45: 0xCDCA, //HANGUL SYLLABLE CHIEUCH WEO PHIEUPH
+ 0xAE46: 0xCDCB, //HANGUL SYLLABLE CHIEUCH WEO HIEUH
+ 0xAE47: 0xCDCD, //HANGUL SYLLABLE CHIEUCH WE KIYEOK
+ 0xAE48: 0xCDCE, //HANGUL SYLLABLE CHIEUCH WE SSANGKIYEOK
+ 0xAE49: 0xCDCF, //HANGUL SYLLABLE CHIEUCH WE KIYEOKSIOS
+ 0xAE4A: 0xCDD1, //HANGUL SYLLABLE CHIEUCH WE NIEUNCIEUC
+ 0xAE4B: 0xCDD2, //HANGUL SYLLABLE CHIEUCH WE NIEUNHIEUH
+ 0xAE4C: 0xCDD3, //HANGUL SYLLABLE CHIEUCH WE TIKEUT
+ 0xAE4D: 0xCDD4, //HANGUL SYLLABLE CHIEUCH WE RIEUL
+ 0xAE4E: 0xCDD5, //HANGUL SYLLABLE CHIEUCH WE RIEULKIYEOK
+ 0xAE4F: 0xCDD6, //HANGUL SYLLABLE CHIEUCH WE RIEULMIEUM
+ 0xAE50: 0xCDD7, //HANGUL SYLLABLE CHIEUCH WE RIEULPIEUP
+ 0xAE51: 0xCDD8, //HANGUL SYLLABLE CHIEUCH WE RIEULSIOS
+ 0xAE52: 0xCDD9, //HANGUL SYLLABLE CHIEUCH WE RIEULTHIEUTH
+ 0xAE53: 0xCDDA, //HANGUL SYLLABLE CHIEUCH WE RIEULPHIEUPH
+ 0xAE54: 0xCDDB, //HANGUL SYLLABLE CHIEUCH WE RIEULHIEUH
+ 0xAE55: 0xCDDC, //HANGUL SYLLABLE CHIEUCH WE MIEUM
+ 0xAE56: 0xCDDD, //HANGUL SYLLABLE CHIEUCH WE PIEUP
+ 0xAE57: 0xCDDE, //HANGUL SYLLABLE CHIEUCH WE PIEUPSIOS
+ 0xAE58: 0xCDDF, //HANGUL SYLLABLE CHIEUCH WE SIOS
+ 0xAE59: 0xCDE0, //HANGUL SYLLABLE CHIEUCH WE SSANGSIOS
+ 0xAE5A: 0xCDE1, //HANGUL SYLLABLE CHIEUCH WE IEUNG
+ 0xAE61: 0xCDE2, //HANGUL SYLLABLE CHIEUCH WE CIEUC
+ 0xAE62: 0xCDE3, //HANGUL SYLLABLE CHIEUCH WE CHIEUCH
+ 0xAE63: 0xCDE4, //HANGUL SYLLABLE CHIEUCH WE KHIEUKH
+ 0xAE64: 0xCDE5, //HANGUL SYLLABLE CHIEUCH WE THIEUTH
+ 0xAE65: 0xCDE6, //HANGUL SYLLABLE CHIEUCH WE PHIEUPH
+ 0xAE66: 0xCDE7, //HANGUL SYLLABLE CHIEUCH WE HIEUH
+ 0xAE67: 0xCDE9, //HANGUL SYLLABLE CHIEUCH WI KIYEOK
+ 0xAE68: 0xCDEA, //HANGUL SYLLABLE CHIEUCH WI SSANGKIYEOK
+ 0xAE69: 0xCDEB, //HANGUL SYLLABLE CHIEUCH WI KIYEOKSIOS
+ 0xAE6A: 0xCDED, //HANGUL SYLLABLE CHIEUCH WI NIEUNCIEUC
+ 0xAE6B: 0xCDEE, //HANGUL SYLLABLE CHIEUCH WI NIEUNHIEUH
+ 0xAE6C: 0xCDEF, //HANGUL SYLLABLE CHIEUCH WI TIKEUT
+ 0xAE6D: 0xCDF1, //HANGUL SYLLABLE CHIEUCH WI RIEULKIYEOK
+ 0xAE6E: 0xCDF2, //HANGUL SYLLABLE CHIEUCH WI RIEULMIEUM
+ 0xAE6F: 0xCDF3, //HANGUL SYLLABLE CHIEUCH WI RIEULPIEUP
+ 0xAE70: 0xCDF4, //HANGUL SYLLABLE CHIEUCH WI RIEULSIOS
+ 0xAE71: 0xCDF5, //HANGUL SYLLABLE CHIEUCH WI RIEULTHIEUTH
+ 0xAE72: 0xCDF6, //HANGUL SYLLABLE CHIEUCH WI RIEULPHIEUPH
+ 0xAE73: 0xCDF7, //HANGUL SYLLABLE CHIEUCH WI RIEULHIEUH
+ 0xAE74: 0xCDFA, //HANGUL SYLLABLE CHIEUCH WI PIEUPSIOS
+ 0xAE75: 0xCDFC, //HANGUL SYLLABLE CHIEUCH WI SSANGSIOS
+ 0xAE76: 0xCDFE, //HANGUL SYLLABLE CHIEUCH WI CIEUC
+ 0xAE77: 0xCDFF, //HANGUL SYLLABLE CHIEUCH WI CHIEUCH
+ 0xAE78: 0xCE00, //HANGUL SYLLABLE CHIEUCH WI KHIEUKH
+ 0xAE79: 0xCE01, //HANGUL SYLLABLE CHIEUCH WI THIEUTH
+ 0xAE7A: 0xCE02, //HANGUL SYLLABLE CHIEUCH WI PHIEUPH
+ 0xAE81: 0xCE03, //HANGUL SYLLABLE CHIEUCH WI HIEUH
+ 0xAE82: 0xCE05, //HANGUL SYLLABLE CHIEUCH YU KIYEOK
+ 0xAE83: 0xCE06, //HANGUL SYLLABLE CHIEUCH YU SSANGKIYEOK
+ 0xAE84: 0xCE07, //HANGUL SYLLABLE CHIEUCH YU KIYEOKSIOS
+ 0xAE85: 0xCE09, //HANGUL SYLLABLE CHIEUCH YU NIEUNCIEUC
+ 0xAE86: 0xCE0A, //HANGUL SYLLABLE CHIEUCH YU NIEUNHIEUH
+ 0xAE87: 0xCE0B, //HANGUL SYLLABLE CHIEUCH YU TIKEUT
+ 0xAE88: 0xCE0D, //HANGUL SYLLABLE CHIEUCH YU RIEULKIYEOK
+ 0xAE89: 0xCE0E, //HANGUL SYLLABLE CHIEUCH YU RIEULMIEUM
+ 0xAE8A: 0xCE0F, //HANGUL SYLLABLE CHIEUCH YU RIEULPIEUP
+ 0xAE8B: 0xCE10, //HANGUL SYLLABLE CHIEUCH YU RIEULSIOS
+ 0xAE8C: 0xCE11, //HANGUL SYLLABLE CHIEUCH YU RIEULTHIEUTH
+ 0xAE8D: 0xCE12, //HANGUL SYLLABLE CHIEUCH YU RIEULPHIEUPH
+ 0xAE8E: 0xCE13, //HANGUL SYLLABLE CHIEUCH YU RIEULHIEUH
+ 0xAE8F: 0xCE15, //HANGUL SYLLABLE CHIEUCH YU PIEUP
+ 0xAE90: 0xCE16, //HANGUL SYLLABLE CHIEUCH YU PIEUPSIOS
+ 0xAE91: 0xCE17, //HANGUL SYLLABLE CHIEUCH YU SIOS
+ 0xAE92: 0xCE18, //HANGUL SYLLABLE CHIEUCH YU SSANGSIOS
+ 0xAE93: 0xCE1A, //HANGUL SYLLABLE CHIEUCH YU CIEUC
+ 0xAE94: 0xCE1B, //HANGUL SYLLABLE CHIEUCH YU CHIEUCH
+ 0xAE95: 0xCE1C, //HANGUL SYLLABLE CHIEUCH YU KHIEUKH
+ 0xAE96: 0xCE1D, //HANGUL SYLLABLE CHIEUCH YU THIEUTH
+ 0xAE97: 0xCE1E, //HANGUL SYLLABLE CHIEUCH YU PHIEUPH
+ 0xAE98: 0xCE1F, //HANGUL SYLLABLE CHIEUCH YU HIEUH
+ 0xAE99: 0xCE22, //HANGUL SYLLABLE CHIEUCH EU SSANGKIYEOK
+ 0xAE9A: 0xCE23, //HANGUL SYLLABLE CHIEUCH EU KIYEOKSIOS
+ 0xAE9B: 0xCE25, //HANGUL SYLLABLE CHIEUCH EU NIEUNCIEUC
+ 0xAE9C: 0xCE26, //HANGUL SYLLABLE CHIEUCH EU NIEUNHIEUH
+ 0xAE9D: 0xCE27, //HANGUL SYLLABLE CHIEUCH EU TIKEUT
+ 0xAE9E: 0xCE29, //HANGUL SYLLABLE CHIEUCH EU RIEULKIYEOK
+ 0xAE9F: 0xCE2A, //HANGUL SYLLABLE CHIEUCH EU RIEULMIEUM
+ 0xAEA0: 0xCE2B, //HANGUL SYLLABLE CHIEUCH EU RIEULPIEUP
+ 0xAF41: 0xCE2C, //HANGUL SYLLABLE CHIEUCH EU RIEULSIOS
+ 0xAF42: 0xCE2D, //HANGUL SYLLABLE CHIEUCH EU RIEULTHIEUTH
+ 0xAF43: 0xCE2E, //HANGUL SYLLABLE CHIEUCH EU RIEULPHIEUPH
+ 0xAF44: 0xCE2F, //HANGUL SYLLABLE CHIEUCH EU RIEULHIEUH
+ 0xAF45: 0xCE32, //HANGUL SYLLABLE CHIEUCH EU PIEUPSIOS
+ 0xAF46: 0xCE34, //HANGUL SYLLABLE CHIEUCH EU SSANGSIOS
+ 0xAF47: 0xCE36, //HANGUL SYLLABLE CHIEUCH EU CIEUC
+ 0xAF48: 0xCE37, //HANGUL SYLLABLE CHIEUCH EU CHIEUCH
+ 0xAF49: 0xCE38, //HANGUL SYLLABLE CHIEUCH EU KHIEUKH
+ 0xAF4A: 0xCE39, //HANGUL SYLLABLE CHIEUCH EU THIEUTH
+ 0xAF4B: 0xCE3A, //HANGUL SYLLABLE CHIEUCH EU PHIEUPH
+ 0xAF4C: 0xCE3B, //HANGUL SYLLABLE CHIEUCH EU HIEUH
+ 0xAF4D: 0xCE3C, //HANGUL SYLLABLE CHIEUCH YI
+ 0xAF4E: 0xCE3D, //HANGUL SYLLABLE CHIEUCH YI KIYEOK
+ 0xAF4F: 0xCE3E, //HANGUL SYLLABLE CHIEUCH YI SSANGKIYEOK
+ 0xAF50: 0xCE3F, //HANGUL SYLLABLE CHIEUCH YI KIYEOKSIOS
+ 0xAF51: 0xCE40, //HANGUL SYLLABLE CHIEUCH YI NIEUN
+ 0xAF52: 0xCE41, //HANGUL SYLLABLE CHIEUCH YI NIEUNCIEUC
+ 0xAF53: 0xCE42, //HANGUL SYLLABLE CHIEUCH YI NIEUNHIEUH
+ 0xAF54: 0xCE43, //HANGUL SYLLABLE CHIEUCH YI TIKEUT
+ 0xAF55: 0xCE44, //HANGUL SYLLABLE CHIEUCH YI RIEUL
+ 0xAF56: 0xCE45, //HANGUL SYLLABLE CHIEUCH YI RIEULKIYEOK
+ 0xAF57: 0xCE46, //HANGUL SYLLABLE CHIEUCH YI RIEULMIEUM
+ 0xAF58: 0xCE47, //HANGUL SYLLABLE CHIEUCH YI RIEULPIEUP
+ 0xAF59: 0xCE48, //HANGUL SYLLABLE CHIEUCH YI RIEULSIOS
+ 0xAF5A: 0xCE49, //HANGUL SYLLABLE CHIEUCH YI RIEULTHIEUTH
+ 0xAF61: 0xCE4A, //HANGUL SYLLABLE CHIEUCH YI RIEULPHIEUPH
+ 0xAF62: 0xCE4B, //HANGUL SYLLABLE CHIEUCH YI RIEULHIEUH
+ 0xAF63: 0xCE4C, //HANGUL SYLLABLE CHIEUCH YI MIEUM
+ 0xAF64: 0xCE4D, //HANGUL SYLLABLE CHIEUCH YI PIEUP
+ 0xAF65: 0xCE4E, //HANGUL SYLLABLE CHIEUCH YI PIEUPSIOS
+ 0xAF66: 0xCE4F, //HANGUL SYLLABLE CHIEUCH YI SIOS
+ 0xAF67: 0xCE50, //HANGUL SYLLABLE CHIEUCH YI SSANGSIOS
+ 0xAF68: 0xCE51, //HANGUL SYLLABLE CHIEUCH YI IEUNG
+ 0xAF69: 0xCE52, //HANGUL SYLLABLE CHIEUCH YI CIEUC
+ 0xAF6A: 0xCE53, //HANGUL SYLLABLE CHIEUCH YI CHIEUCH
+ 0xAF6B: 0xCE54, //HANGUL SYLLABLE CHIEUCH YI KHIEUKH
+ 0xAF6C: 0xCE55, //HANGUL SYLLABLE CHIEUCH YI THIEUTH
+ 0xAF6D: 0xCE56, //HANGUL SYLLABLE CHIEUCH YI PHIEUPH
+ 0xAF6E: 0xCE57, //HANGUL SYLLABLE CHIEUCH YI HIEUH
+ 0xAF6F: 0xCE5A, //HANGUL SYLLABLE CHIEUCH I SSANGKIYEOK
+ 0xAF70: 0xCE5B, //HANGUL SYLLABLE CHIEUCH I KIYEOKSIOS
+ 0xAF71: 0xCE5D, //HANGUL SYLLABLE CHIEUCH I NIEUNCIEUC
+ 0xAF72: 0xCE5E, //HANGUL SYLLABLE CHIEUCH I NIEUNHIEUH
+ 0xAF73: 0xCE62, //HANGUL SYLLABLE CHIEUCH I RIEULMIEUM
+ 0xAF74: 0xCE63, //HANGUL SYLLABLE CHIEUCH I RIEULPIEUP
+ 0xAF75: 0xCE64, //HANGUL SYLLABLE CHIEUCH I RIEULSIOS
+ 0xAF76: 0xCE65, //HANGUL SYLLABLE CHIEUCH I RIEULTHIEUTH
+ 0xAF77: 0xCE66, //HANGUL SYLLABLE CHIEUCH I RIEULPHIEUPH
+ 0xAF78: 0xCE67, //HANGUL SYLLABLE CHIEUCH I RIEULHIEUH
+ 0xAF79: 0xCE6A, //HANGUL SYLLABLE CHIEUCH I PIEUPSIOS
+ 0xAF7A: 0xCE6C, //HANGUL SYLLABLE CHIEUCH I SSANGSIOS
+ 0xAF81: 0xCE6E, //HANGUL SYLLABLE CHIEUCH I CIEUC
+ 0xAF82: 0xCE6F, //HANGUL SYLLABLE CHIEUCH I CHIEUCH
+ 0xAF83: 0xCE70, //HANGUL SYLLABLE CHIEUCH I KHIEUKH
+ 0xAF84: 0xCE71, //HANGUL SYLLABLE CHIEUCH I THIEUTH
+ 0xAF85: 0xCE72, //HANGUL SYLLABLE CHIEUCH I PHIEUPH
+ 0xAF86: 0xCE73, //HANGUL SYLLABLE CHIEUCH I HIEUH
+ 0xAF87: 0xCE76, //HANGUL SYLLABLE KHIEUKH A SSANGKIYEOK
+ 0xAF88: 0xCE77, //HANGUL SYLLABLE KHIEUKH A KIYEOKSIOS
+ 0xAF89: 0xCE79, //HANGUL SYLLABLE KHIEUKH A NIEUNCIEUC
+ 0xAF8A: 0xCE7A, //HANGUL SYLLABLE KHIEUKH A NIEUNHIEUH
+ 0xAF8B: 0xCE7B, //HANGUL SYLLABLE KHIEUKH A TIKEUT
+ 0xAF8C: 0xCE7D, //HANGUL SYLLABLE KHIEUKH A RIEULKIYEOK
+ 0xAF8D: 0xCE7E, //HANGUL SYLLABLE KHIEUKH A RIEULMIEUM
+ 0xAF8E: 0xCE7F, //HANGUL SYLLABLE KHIEUKH A RIEULPIEUP
+ 0xAF8F: 0xCE80, //HANGUL SYLLABLE KHIEUKH A RIEULSIOS
+ 0xAF90: 0xCE81, //HANGUL SYLLABLE KHIEUKH A RIEULTHIEUTH
+ 0xAF91: 0xCE82, //HANGUL SYLLABLE KHIEUKH A RIEULPHIEUPH
+ 0xAF92: 0xCE83, //HANGUL SYLLABLE KHIEUKH A RIEULHIEUH
+ 0xAF93: 0xCE86, //HANGUL SYLLABLE KHIEUKH A PIEUPSIOS
+ 0xAF94: 0xCE88, //HANGUL SYLLABLE KHIEUKH A SSANGSIOS
+ 0xAF95: 0xCE8A, //HANGUL SYLLABLE KHIEUKH A CIEUC
+ 0xAF96: 0xCE8B, //HANGUL SYLLABLE KHIEUKH A CHIEUCH
+ 0xAF97: 0xCE8C, //HANGUL SYLLABLE KHIEUKH A KHIEUKH
+ 0xAF98: 0xCE8D, //HANGUL SYLLABLE KHIEUKH A THIEUTH
+ 0xAF99: 0xCE8E, //HANGUL SYLLABLE KHIEUKH A PHIEUPH
+ 0xAF9A: 0xCE8F, //HANGUL SYLLABLE KHIEUKH A HIEUH
+ 0xAF9B: 0xCE92, //HANGUL SYLLABLE KHIEUKH AE SSANGKIYEOK
+ 0xAF9C: 0xCE93, //HANGUL SYLLABLE KHIEUKH AE KIYEOKSIOS
+ 0xAF9D: 0xCE95, //HANGUL SYLLABLE KHIEUKH AE NIEUNCIEUC
+ 0xAF9E: 0xCE96, //HANGUL SYLLABLE KHIEUKH AE NIEUNHIEUH
+ 0xAF9F: 0xCE97, //HANGUL SYLLABLE KHIEUKH AE TIKEUT
+ 0xAFA0: 0xCE99, //HANGUL SYLLABLE KHIEUKH AE RIEULKIYEOK
+ 0xB041: 0xCE9A, //HANGUL SYLLABLE KHIEUKH AE RIEULMIEUM
+ 0xB042: 0xCE9B, //HANGUL SYLLABLE KHIEUKH AE RIEULPIEUP
+ 0xB043: 0xCE9C, //HANGUL SYLLABLE KHIEUKH AE RIEULSIOS
+ 0xB044: 0xCE9D, //HANGUL SYLLABLE KHIEUKH AE RIEULTHIEUTH
+ 0xB045: 0xCE9E, //HANGUL SYLLABLE KHIEUKH AE RIEULPHIEUPH
+ 0xB046: 0xCE9F, //HANGUL SYLLABLE KHIEUKH AE RIEULHIEUH
+ 0xB047: 0xCEA2, //HANGUL SYLLABLE KHIEUKH AE PIEUPSIOS
+ 0xB048: 0xCEA6, //HANGUL SYLLABLE KHIEUKH AE CIEUC
+ 0xB049: 0xCEA7, //HANGUL SYLLABLE KHIEUKH AE CHIEUCH
+ 0xB04A: 0xCEA8, //HANGUL SYLLABLE KHIEUKH AE KHIEUKH
+ 0xB04B: 0xCEA9, //HANGUL SYLLABLE KHIEUKH AE THIEUTH
+ 0xB04C: 0xCEAA, //HANGUL SYLLABLE KHIEUKH AE PHIEUPH
+ 0xB04D: 0xCEAB, //HANGUL SYLLABLE KHIEUKH AE HIEUH
+ 0xB04E: 0xCEAE, //HANGUL SYLLABLE KHIEUKH YA SSANGKIYEOK
+ 0xB04F: 0xCEAF, //HANGUL SYLLABLE KHIEUKH YA KIYEOKSIOS
+ 0xB050: 0xCEB0, //HANGUL SYLLABLE KHIEUKH YA NIEUN
+ 0xB051: 0xCEB1, //HANGUL SYLLABLE KHIEUKH YA NIEUNCIEUC
+ 0xB052: 0xCEB2, //HANGUL SYLLABLE KHIEUKH YA NIEUNHIEUH
+ 0xB053: 0xCEB3, //HANGUL SYLLABLE KHIEUKH YA TIKEUT
+ 0xB054: 0xCEB4, //HANGUL SYLLABLE KHIEUKH YA RIEUL
+ 0xB055: 0xCEB5, //HANGUL SYLLABLE KHIEUKH YA RIEULKIYEOK
+ 0xB056: 0xCEB6, //HANGUL SYLLABLE KHIEUKH YA RIEULMIEUM
+ 0xB057: 0xCEB7, //HANGUL SYLLABLE KHIEUKH YA RIEULPIEUP
+ 0xB058: 0xCEB8, //HANGUL SYLLABLE KHIEUKH YA RIEULSIOS
+ 0xB059: 0xCEB9, //HANGUL SYLLABLE KHIEUKH YA RIEULTHIEUTH
+ 0xB05A: 0xCEBA, //HANGUL SYLLABLE KHIEUKH YA RIEULPHIEUPH
+ 0xB061: 0xCEBB, //HANGUL SYLLABLE KHIEUKH YA RIEULHIEUH
+ 0xB062: 0xCEBC, //HANGUL SYLLABLE KHIEUKH YA MIEUM
+ 0xB063: 0xCEBD, //HANGUL SYLLABLE KHIEUKH YA PIEUP
+ 0xB064: 0xCEBE, //HANGUL SYLLABLE KHIEUKH YA PIEUPSIOS
+ 0xB065: 0xCEBF, //HANGUL SYLLABLE KHIEUKH YA SIOS
+ 0xB066: 0xCEC0, //HANGUL SYLLABLE KHIEUKH YA SSANGSIOS
+ 0xB067: 0xCEC2, //HANGUL SYLLABLE KHIEUKH YA CIEUC
+ 0xB068: 0xCEC3, //HANGUL SYLLABLE KHIEUKH YA CHIEUCH
+ 0xB069: 0xCEC4, //HANGUL SYLLABLE KHIEUKH YA KHIEUKH
+ 0xB06A: 0xCEC5, //HANGUL SYLLABLE KHIEUKH YA THIEUTH
+ 0xB06B: 0xCEC6, //HANGUL SYLLABLE KHIEUKH YA PHIEUPH
+ 0xB06C: 0xCEC7, //HANGUL SYLLABLE KHIEUKH YA HIEUH
+ 0xB06D: 0xCEC8, //HANGUL SYLLABLE KHIEUKH YAE
+ 0xB06E: 0xCEC9, //HANGUL SYLLABLE KHIEUKH YAE KIYEOK
+ 0xB06F: 0xCECA, //HANGUL SYLLABLE KHIEUKH YAE SSANGKIYEOK
+ 0xB070: 0xCECB, //HANGUL SYLLABLE KHIEUKH YAE KIYEOKSIOS
+ 0xB071: 0xCECC, //HANGUL SYLLABLE KHIEUKH YAE NIEUN
+ 0xB072: 0xCECD, //HANGUL SYLLABLE KHIEUKH YAE NIEUNCIEUC
+ 0xB073: 0xCECE, //HANGUL SYLLABLE KHIEUKH YAE NIEUNHIEUH
+ 0xB074: 0xCECF, //HANGUL SYLLABLE KHIEUKH YAE TIKEUT
+ 0xB075: 0xCED0, //HANGUL SYLLABLE KHIEUKH YAE RIEUL
+ 0xB076: 0xCED1, //HANGUL SYLLABLE KHIEUKH YAE RIEULKIYEOK
+ 0xB077: 0xCED2, //HANGUL SYLLABLE KHIEUKH YAE RIEULMIEUM
+ 0xB078: 0xCED3, //HANGUL SYLLABLE KHIEUKH YAE RIEULPIEUP
+ 0xB079: 0xCED4, //HANGUL SYLLABLE KHIEUKH YAE RIEULSIOS
+ 0xB07A: 0xCED5, //HANGUL SYLLABLE KHIEUKH YAE RIEULTHIEUTH
+ 0xB081: 0xCED6, //HANGUL SYLLABLE KHIEUKH YAE RIEULPHIEUPH
+ 0xB082: 0xCED7, //HANGUL SYLLABLE KHIEUKH YAE RIEULHIEUH
+ 0xB083: 0xCED8, //HANGUL SYLLABLE KHIEUKH YAE MIEUM
+ 0xB084: 0xCED9, //HANGUL SYLLABLE KHIEUKH YAE PIEUP
+ 0xB085: 0xCEDA, //HANGUL SYLLABLE KHIEUKH YAE PIEUPSIOS
+ 0xB086: 0xCEDB, //HANGUL SYLLABLE KHIEUKH YAE SIOS
+ 0xB087: 0xCEDC, //HANGUL SYLLABLE KHIEUKH YAE SSANGSIOS
+ 0xB088: 0xCEDD, //HANGUL SYLLABLE KHIEUKH YAE IEUNG
+ 0xB089: 0xCEDE, //HANGUL SYLLABLE KHIEUKH YAE CIEUC
+ 0xB08A: 0xCEDF, //HANGUL SYLLABLE KHIEUKH YAE CHIEUCH
+ 0xB08B: 0xCEE0, //HANGUL SYLLABLE KHIEUKH YAE KHIEUKH
+ 0xB08C: 0xCEE1, //HANGUL SYLLABLE KHIEUKH YAE THIEUTH
+ 0xB08D: 0xCEE2, //HANGUL SYLLABLE KHIEUKH YAE PHIEUPH
+ 0xB08E: 0xCEE3, //HANGUL SYLLABLE KHIEUKH YAE HIEUH
+ 0xB08F: 0xCEE6, //HANGUL SYLLABLE KHIEUKH EO SSANGKIYEOK
+ 0xB090: 0xCEE7, //HANGUL SYLLABLE KHIEUKH EO KIYEOKSIOS
+ 0xB091: 0xCEE9, //HANGUL SYLLABLE KHIEUKH EO NIEUNCIEUC
+ 0xB092: 0xCEEA, //HANGUL SYLLABLE KHIEUKH EO NIEUNHIEUH
+ 0xB093: 0xCEED, //HANGUL SYLLABLE KHIEUKH EO RIEULKIYEOK
+ 0xB094: 0xCEEE, //HANGUL SYLLABLE KHIEUKH EO RIEULMIEUM
+ 0xB095: 0xCEEF, //HANGUL SYLLABLE KHIEUKH EO RIEULPIEUP
+ 0xB096: 0xCEF0, //HANGUL SYLLABLE KHIEUKH EO RIEULSIOS
+ 0xB097: 0xCEF1, //HANGUL SYLLABLE KHIEUKH EO RIEULTHIEUTH
+ 0xB098: 0xCEF2, //HANGUL SYLLABLE KHIEUKH EO RIEULPHIEUPH
+ 0xB099: 0xCEF3, //HANGUL SYLLABLE KHIEUKH EO RIEULHIEUH
+ 0xB09A: 0xCEF6, //HANGUL SYLLABLE KHIEUKH EO PIEUPSIOS
+ 0xB09B: 0xCEFA, //HANGUL SYLLABLE KHIEUKH EO CIEUC
+ 0xB09C: 0xCEFB, //HANGUL SYLLABLE KHIEUKH EO CHIEUCH
+ 0xB09D: 0xCEFC, //HANGUL SYLLABLE KHIEUKH EO KHIEUKH
+ 0xB09E: 0xCEFD, //HANGUL SYLLABLE KHIEUKH EO THIEUTH
+ 0xB09F: 0xCEFE, //HANGUL SYLLABLE KHIEUKH EO PHIEUPH
+ 0xB0A0: 0xCEFF, //HANGUL SYLLABLE KHIEUKH EO HIEUH
+ 0xB0A1: 0xAC00, //HANGUL SYLLABLE KIYEOK A
+ 0xB0A2: 0xAC01, //HANGUL SYLLABLE KIYEOK A KIYEOK
+ 0xB0A3: 0xAC04, //HANGUL SYLLABLE KIYEOK A NIEUN
+ 0xB0A4: 0xAC07, //HANGUL SYLLABLE KIYEOK A TIKEUT
+ 0xB0A5: 0xAC08, //HANGUL SYLLABLE KIYEOK A RIEUL
+ 0xB0A6: 0xAC09, //HANGUL SYLLABLE KIYEOK A RIEULKIYEOK
+ 0xB0A7: 0xAC0A, //HANGUL SYLLABLE KIYEOK A RIEULMIEUM
+ 0xB0A8: 0xAC10, //HANGUL SYLLABLE KIYEOK A MIEUM
+ 0xB0A9: 0xAC11, //HANGUL SYLLABLE KIYEOK A PIEUP
+ 0xB0AA: 0xAC12, //HANGUL SYLLABLE KIYEOK A PIEUPSIOS
+ 0xB0AB: 0xAC13, //HANGUL SYLLABLE KIYEOK A SIOS
+ 0xB0AC: 0xAC14, //HANGUL SYLLABLE KIYEOK A SSANGSIOS
+ 0xB0AD: 0xAC15, //HANGUL SYLLABLE KIYEOK A IEUNG
+ 0xB0AE: 0xAC16, //HANGUL SYLLABLE KIYEOK A CIEUC
+ 0xB0AF: 0xAC17, //HANGUL SYLLABLE KIYEOK A CHIEUCH
+ 0xB0B0: 0xAC19, //HANGUL SYLLABLE KIYEOK A THIEUTH
+ 0xB0B1: 0xAC1A, //HANGUL SYLLABLE KIYEOK A PHIEUPH
+ 0xB0B2: 0xAC1B, //HANGUL SYLLABLE KIYEOK A HIEUH
+ 0xB0B3: 0xAC1C, //HANGUL SYLLABLE KIYEOK AE
+ 0xB0B4: 0xAC1D, //HANGUL SYLLABLE KIYEOK AE KIYEOK
+ 0xB0B5: 0xAC20, //HANGUL SYLLABLE KIYEOK AE NIEUN
+ 0xB0B6: 0xAC24, //HANGUL SYLLABLE KIYEOK AE RIEUL
+ 0xB0B7: 0xAC2C, //HANGUL SYLLABLE KIYEOK AE MIEUM
+ 0xB0B8: 0xAC2D, //HANGUL SYLLABLE KIYEOK AE PIEUP
+ 0xB0B9: 0xAC2F, //HANGUL SYLLABLE KIYEOK AE SIOS
+ 0xB0BA: 0xAC30, //HANGUL SYLLABLE KIYEOK AE SSANGSIOS
+ 0xB0BB: 0xAC31, //HANGUL SYLLABLE KIYEOK AE IEUNG
+ 0xB0BC: 0xAC38, //HANGUL SYLLABLE KIYEOK YA
+ 0xB0BD: 0xAC39, //HANGUL SYLLABLE KIYEOK YA KIYEOK
+ 0xB0BE: 0xAC3C, //HANGUL SYLLABLE KIYEOK YA NIEUN
+ 0xB0BF: 0xAC40, //HANGUL SYLLABLE KIYEOK YA RIEUL
+ 0xB0C0: 0xAC4B, //HANGUL SYLLABLE KIYEOK YA SIOS
+ 0xB0C1: 0xAC4D, //HANGUL SYLLABLE KIYEOK YA IEUNG
+ 0xB0C2: 0xAC54, //HANGUL SYLLABLE KIYEOK YAE
+ 0xB0C3: 0xAC58, //HANGUL SYLLABLE KIYEOK YAE NIEUN
+ 0xB0C4: 0xAC5C, //HANGUL SYLLABLE KIYEOK YAE RIEUL
+ 0xB0C5: 0xAC70, //HANGUL SYLLABLE KIYEOK EO
+ 0xB0C6: 0xAC71, //HANGUL SYLLABLE KIYEOK EO KIYEOK
+ 0xB0C7: 0xAC74, //HANGUL SYLLABLE KIYEOK EO NIEUN
+ 0xB0C8: 0xAC77, //HANGUL SYLLABLE KIYEOK EO TIKEUT
+ 0xB0C9: 0xAC78, //HANGUL SYLLABLE KIYEOK EO RIEUL
+ 0xB0CA: 0xAC7A, //HANGUL SYLLABLE KIYEOK EO RIEULMIEUM
+ 0xB0CB: 0xAC80, //HANGUL SYLLABLE KIYEOK EO MIEUM
+ 0xB0CC: 0xAC81, //HANGUL SYLLABLE KIYEOK EO PIEUP
+ 0xB0CD: 0xAC83, //HANGUL SYLLABLE KIYEOK EO SIOS
+ 0xB0CE: 0xAC84, //HANGUL SYLLABLE KIYEOK EO SSANGSIOS
+ 0xB0CF: 0xAC85, //HANGUL SYLLABLE KIYEOK EO IEUNG
+ 0xB0D0: 0xAC86, //HANGUL SYLLABLE KIYEOK EO CIEUC
+ 0xB0D1: 0xAC89, //HANGUL SYLLABLE KIYEOK EO THIEUTH
+ 0xB0D2: 0xAC8A, //HANGUL SYLLABLE KIYEOK EO PHIEUPH
+ 0xB0D3: 0xAC8B, //HANGUL SYLLABLE KIYEOK EO HIEUH
+ 0xB0D4: 0xAC8C, //HANGUL SYLLABLE KIYEOK E
+ 0xB0D5: 0xAC90, //HANGUL SYLLABLE KIYEOK E NIEUN
+ 0xB0D6: 0xAC94, //HANGUL SYLLABLE KIYEOK E RIEUL
+ 0xB0D7: 0xAC9C, //HANGUL SYLLABLE KIYEOK E MIEUM
+ 0xB0D8: 0xAC9D, //HANGUL SYLLABLE KIYEOK E PIEUP
+ 0xB0D9: 0xAC9F, //HANGUL SYLLABLE KIYEOK E SIOS
+ 0xB0DA: 0xACA0, //HANGUL SYLLABLE KIYEOK E SSANGSIOS
+ 0xB0DB: 0xACA1, //HANGUL SYLLABLE KIYEOK E IEUNG
+ 0xB0DC: 0xACA8, //HANGUL SYLLABLE KIYEOK YEO
+ 0xB0DD: 0xACA9, //HANGUL SYLLABLE KIYEOK YEO KIYEOK
+ 0xB0DE: 0xACAA, //HANGUL SYLLABLE KIYEOK YEO SSANGKIYEOK
+ 0xB0DF: 0xACAC, //HANGUL SYLLABLE KIYEOK YEO NIEUN
+ 0xB0E0: 0xACAF, //HANGUL SYLLABLE KIYEOK YEO TIKEUT
+ 0xB0E1: 0xACB0, //HANGUL SYLLABLE KIYEOK YEO RIEUL
+ 0xB0E2: 0xACB8, //HANGUL SYLLABLE KIYEOK YEO MIEUM
+ 0xB0E3: 0xACB9, //HANGUL SYLLABLE KIYEOK YEO PIEUP
+ 0xB0E4: 0xACBB, //HANGUL SYLLABLE KIYEOK YEO SIOS
+ 0xB0E5: 0xACBC, //HANGUL SYLLABLE KIYEOK YEO SSANGSIOS
+ 0xB0E6: 0xACBD, //HANGUL SYLLABLE KIYEOK YEO IEUNG
+ 0xB0E7: 0xACC1, //HANGUL SYLLABLE KIYEOK YEO THIEUTH
+ 0xB0E8: 0xACC4, //HANGUL SYLLABLE KIYEOK YE
+ 0xB0E9: 0xACC8, //HANGUL SYLLABLE KIYEOK YE NIEUN
+ 0xB0EA: 0xACCC, //HANGUL SYLLABLE KIYEOK YE RIEUL
+ 0xB0EB: 0xACD5, //HANGUL SYLLABLE KIYEOK YE PIEUP
+ 0xB0EC: 0xACD7, //HANGUL SYLLABLE KIYEOK YE SIOS
+ 0xB0ED: 0xACE0, //HANGUL SYLLABLE KIYEOK O
+ 0xB0EE: 0xACE1, //HANGUL SYLLABLE KIYEOK O KIYEOK
+ 0xB0EF: 0xACE4, //HANGUL SYLLABLE KIYEOK O NIEUN
+ 0xB0F0: 0xACE7, //HANGUL SYLLABLE KIYEOK O TIKEUT
+ 0xB0F1: 0xACE8, //HANGUL SYLLABLE KIYEOK O RIEUL
+ 0xB0F2: 0xACEA, //HANGUL SYLLABLE KIYEOK O RIEULMIEUM
+ 0xB0F3: 0xACEC, //HANGUL SYLLABLE KIYEOK O RIEULSIOS
+ 0xB0F4: 0xACEF, //HANGUL SYLLABLE KIYEOK O RIEULHIEUH
+ 0xB0F5: 0xACF0, //HANGUL SYLLABLE KIYEOK O MIEUM
+ 0xB0F6: 0xACF1, //HANGUL SYLLABLE KIYEOK O PIEUP
+ 0xB0F7: 0xACF3, //HANGUL SYLLABLE KIYEOK O SIOS
+ 0xB0F8: 0xACF5, //HANGUL SYLLABLE KIYEOK O IEUNG
+ 0xB0F9: 0xACF6, //HANGUL SYLLABLE KIYEOK O CIEUC
+ 0xB0FA: 0xACFC, //HANGUL SYLLABLE KIYEOK WA
+ 0xB0FB: 0xACFD, //HANGUL SYLLABLE KIYEOK WA KIYEOK
+ 0xB0FC: 0xAD00, //HANGUL SYLLABLE KIYEOK WA NIEUN
+ 0xB0FD: 0xAD04, //HANGUL SYLLABLE KIYEOK WA RIEUL
+ 0xB0FE: 0xAD06, //HANGUL SYLLABLE KIYEOK WA RIEULMIEUM
+ 0xB141: 0xCF02, //HANGUL SYLLABLE KHIEUKH E SSANGKIYEOK
+ 0xB142: 0xCF03, //HANGUL SYLLABLE KHIEUKH E KIYEOKSIOS
+ 0xB143: 0xCF05, //HANGUL SYLLABLE KHIEUKH E NIEUNCIEUC
+ 0xB144: 0xCF06, //HANGUL SYLLABLE KHIEUKH E NIEUNHIEUH
+ 0xB145: 0xCF07, //HANGUL SYLLABLE KHIEUKH E TIKEUT
+ 0xB146: 0xCF09, //HANGUL SYLLABLE KHIEUKH E RIEULKIYEOK
+ 0xB147: 0xCF0A, //HANGUL SYLLABLE KHIEUKH E RIEULMIEUM
+ 0xB148: 0xCF0B, //HANGUL SYLLABLE KHIEUKH E RIEULPIEUP
+ 0xB149: 0xCF0C, //HANGUL SYLLABLE KHIEUKH E RIEULSIOS
+ 0xB14A: 0xCF0D, //HANGUL SYLLABLE KHIEUKH E RIEULTHIEUTH
+ 0xB14B: 0xCF0E, //HANGUL SYLLABLE KHIEUKH E RIEULPHIEUPH
+ 0xB14C: 0xCF0F, //HANGUL SYLLABLE KHIEUKH E RIEULHIEUH
+ 0xB14D: 0xCF12, //HANGUL SYLLABLE KHIEUKH E PIEUPSIOS
+ 0xB14E: 0xCF14, //HANGUL SYLLABLE KHIEUKH E SSANGSIOS
+ 0xB14F: 0xCF16, //HANGUL SYLLABLE KHIEUKH E CIEUC
+ 0xB150: 0xCF17, //HANGUL SYLLABLE KHIEUKH E CHIEUCH
+ 0xB151: 0xCF18, //HANGUL SYLLABLE KHIEUKH E KHIEUKH
+ 0xB152: 0xCF19, //HANGUL SYLLABLE KHIEUKH E THIEUTH
+ 0xB153: 0xCF1A, //HANGUL SYLLABLE KHIEUKH E PHIEUPH
+ 0xB154: 0xCF1B, //HANGUL SYLLABLE KHIEUKH E HIEUH
+ 0xB155: 0xCF1D, //HANGUL SYLLABLE KHIEUKH YEO KIYEOK
+ 0xB156: 0xCF1E, //HANGUL SYLLABLE KHIEUKH YEO SSANGKIYEOK
+ 0xB157: 0xCF1F, //HANGUL SYLLABLE KHIEUKH YEO KIYEOKSIOS
+ 0xB158: 0xCF21, //HANGUL SYLLABLE KHIEUKH YEO NIEUNCIEUC
+ 0xB159: 0xCF22, //HANGUL SYLLABLE KHIEUKH YEO NIEUNHIEUH
+ 0xB15A: 0xCF23, //HANGUL SYLLABLE KHIEUKH YEO TIKEUT
+ 0xB161: 0xCF25, //HANGUL SYLLABLE KHIEUKH YEO RIEULKIYEOK
+ 0xB162: 0xCF26, //HANGUL SYLLABLE KHIEUKH YEO RIEULMIEUM
+ 0xB163: 0xCF27, //HANGUL SYLLABLE KHIEUKH YEO RIEULPIEUP
+ 0xB164: 0xCF28, //HANGUL SYLLABLE KHIEUKH YEO RIEULSIOS
+ 0xB165: 0xCF29, //HANGUL SYLLABLE KHIEUKH YEO RIEULTHIEUTH
+ 0xB166: 0xCF2A, //HANGUL SYLLABLE KHIEUKH YEO RIEULPHIEUPH
+ 0xB167: 0xCF2B, //HANGUL SYLLABLE KHIEUKH YEO RIEULHIEUH
+ 0xB168: 0xCF2E, //HANGUL SYLLABLE KHIEUKH YEO PIEUPSIOS
+ 0xB169: 0xCF32, //HANGUL SYLLABLE KHIEUKH YEO CIEUC
+ 0xB16A: 0xCF33, //HANGUL SYLLABLE KHIEUKH YEO CHIEUCH
+ 0xB16B: 0xCF34, //HANGUL SYLLABLE KHIEUKH YEO KHIEUKH
+ 0xB16C: 0xCF35, //HANGUL SYLLABLE KHIEUKH YEO THIEUTH
+ 0xB16D: 0xCF36, //HANGUL SYLLABLE KHIEUKH YEO PHIEUPH
+ 0xB16E: 0xCF37, //HANGUL SYLLABLE KHIEUKH YEO HIEUH
+ 0xB16F: 0xCF39, //HANGUL SYLLABLE KHIEUKH YE KIYEOK
+ 0xB170: 0xCF3A, //HANGUL SYLLABLE KHIEUKH YE SSANGKIYEOK
+ 0xB171: 0xCF3B, //HANGUL SYLLABLE KHIEUKH YE KIYEOKSIOS
+ 0xB172: 0xCF3C, //HANGUL SYLLABLE KHIEUKH YE NIEUN
+ 0xB173: 0xCF3D, //HANGUL SYLLABLE KHIEUKH YE NIEUNCIEUC
+ 0xB174: 0xCF3E, //HANGUL SYLLABLE KHIEUKH YE NIEUNHIEUH
+ 0xB175: 0xCF3F, //HANGUL SYLLABLE KHIEUKH YE TIKEUT
+ 0xB176: 0xCF40, //HANGUL SYLLABLE KHIEUKH YE RIEUL
+ 0xB177: 0xCF41, //HANGUL SYLLABLE KHIEUKH YE RIEULKIYEOK
+ 0xB178: 0xCF42, //HANGUL SYLLABLE KHIEUKH YE RIEULMIEUM
+ 0xB179: 0xCF43, //HANGUL SYLLABLE KHIEUKH YE RIEULPIEUP
+ 0xB17A: 0xCF44, //HANGUL SYLLABLE KHIEUKH YE RIEULSIOS
+ 0xB181: 0xCF45, //HANGUL SYLLABLE KHIEUKH YE RIEULTHIEUTH
+ 0xB182: 0xCF46, //HANGUL SYLLABLE KHIEUKH YE RIEULPHIEUPH
+ 0xB183: 0xCF47, //HANGUL SYLLABLE KHIEUKH YE RIEULHIEUH
+ 0xB184: 0xCF48, //HANGUL SYLLABLE KHIEUKH YE MIEUM
+ 0xB185: 0xCF49, //HANGUL SYLLABLE KHIEUKH YE PIEUP
+ 0xB186: 0xCF4A, //HANGUL SYLLABLE KHIEUKH YE PIEUPSIOS
+ 0xB187: 0xCF4B, //HANGUL SYLLABLE KHIEUKH YE SIOS
+ 0xB188: 0xCF4C, //HANGUL SYLLABLE KHIEUKH YE SSANGSIOS
+ 0xB189: 0xCF4D, //HANGUL SYLLABLE KHIEUKH YE IEUNG
+ 0xB18A: 0xCF4E, //HANGUL SYLLABLE KHIEUKH YE CIEUC
+ 0xB18B: 0xCF4F, //HANGUL SYLLABLE KHIEUKH YE CHIEUCH
+ 0xB18C: 0xCF50, //HANGUL SYLLABLE KHIEUKH YE KHIEUKH
+ 0xB18D: 0xCF51, //HANGUL SYLLABLE KHIEUKH YE THIEUTH
+ 0xB18E: 0xCF52, //HANGUL SYLLABLE KHIEUKH YE PHIEUPH
+ 0xB18F: 0xCF53, //HANGUL SYLLABLE KHIEUKH YE HIEUH
+ 0xB190: 0xCF56, //HANGUL SYLLABLE KHIEUKH O SSANGKIYEOK
+ 0xB191: 0xCF57, //HANGUL SYLLABLE KHIEUKH O KIYEOKSIOS
+ 0xB192: 0xCF59, //HANGUL SYLLABLE KHIEUKH O NIEUNCIEUC
+ 0xB193: 0xCF5A, //HANGUL SYLLABLE KHIEUKH O NIEUNHIEUH
+ 0xB194: 0xCF5B, //HANGUL SYLLABLE KHIEUKH O TIKEUT
+ 0xB195: 0xCF5D, //HANGUL SYLLABLE KHIEUKH O RIEULKIYEOK
+ 0xB196: 0xCF5E, //HANGUL SYLLABLE KHIEUKH O RIEULMIEUM
+ 0xB197: 0xCF5F, //HANGUL SYLLABLE KHIEUKH O RIEULPIEUP
+ 0xB198: 0xCF60, //HANGUL SYLLABLE KHIEUKH O RIEULSIOS
+ 0xB199: 0xCF61, //HANGUL SYLLABLE KHIEUKH O RIEULTHIEUTH
+ 0xB19A: 0xCF62, //HANGUL SYLLABLE KHIEUKH O RIEULPHIEUPH
+ 0xB19B: 0xCF63, //HANGUL SYLLABLE KHIEUKH O RIEULHIEUH
+ 0xB19C: 0xCF66, //HANGUL SYLLABLE KHIEUKH O PIEUPSIOS
+ 0xB19D: 0xCF68, //HANGUL SYLLABLE KHIEUKH O SSANGSIOS
+ 0xB19E: 0xCF6A, //HANGUL SYLLABLE KHIEUKH O CIEUC
+ 0xB19F: 0xCF6B, //HANGUL SYLLABLE KHIEUKH O CHIEUCH
+ 0xB1A0: 0xCF6C, //HANGUL SYLLABLE KHIEUKH O KHIEUKH
+ 0xB1A1: 0xAD0C, //HANGUL SYLLABLE KIYEOK WA MIEUM
+ 0xB1A2: 0xAD0D, //HANGUL SYLLABLE KIYEOK WA PIEUP
+ 0xB1A3: 0xAD0F, //HANGUL SYLLABLE KIYEOK WA SIOS
+ 0xB1A4: 0xAD11, //HANGUL SYLLABLE KIYEOK WA IEUNG
+ 0xB1A5: 0xAD18, //HANGUL SYLLABLE KIYEOK WAE
+ 0xB1A6: 0xAD1C, //HANGUL SYLLABLE KIYEOK WAE NIEUN
+ 0xB1A7: 0xAD20, //HANGUL SYLLABLE KIYEOK WAE RIEUL
+ 0xB1A8: 0xAD29, //HANGUL SYLLABLE KIYEOK WAE PIEUP
+ 0xB1A9: 0xAD2C, //HANGUL SYLLABLE KIYEOK WAE SSANGSIOS
+ 0xB1AA: 0xAD2D, //HANGUL SYLLABLE KIYEOK WAE IEUNG
+ 0xB1AB: 0xAD34, //HANGUL SYLLABLE KIYEOK OE
+ 0xB1AC: 0xAD35, //HANGUL SYLLABLE KIYEOK OE KIYEOK
+ 0xB1AD: 0xAD38, //HANGUL SYLLABLE KIYEOK OE NIEUN
+ 0xB1AE: 0xAD3C, //HANGUL SYLLABLE KIYEOK OE RIEUL
+ 0xB1AF: 0xAD44, //HANGUL SYLLABLE KIYEOK OE MIEUM
+ 0xB1B0: 0xAD45, //HANGUL SYLLABLE KIYEOK OE PIEUP
+ 0xB1B1: 0xAD47, //HANGUL SYLLABLE KIYEOK OE SIOS
+ 0xB1B2: 0xAD49, //HANGUL SYLLABLE KIYEOK OE IEUNG
+ 0xB1B3: 0xAD50, //HANGUL SYLLABLE KIYEOK YO
+ 0xB1B4: 0xAD54, //HANGUL SYLLABLE KIYEOK YO NIEUN
+ 0xB1B5: 0xAD58, //HANGUL SYLLABLE KIYEOK YO RIEUL
+ 0xB1B6: 0xAD61, //HANGUL SYLLABLE KIYEOK YO PIEUP
+ 0xB1B7: 0xAD63, //HANGUL SYLLABLE KIYEOK YO SIOS
+ 0xB1B8: 0xAD6C, //HANGUL SYLLABLE KIYEOK U
+ 0xB1B9: 0xAD6D, //HANGUL SYLLABLE KIYEOK U KIYEOK
+ 0xB1BA: 0xAD70, //HANGUL SYLLABLE KIYEOK U NIEUN
+ 0xB1BB: 0xAD73, //HANGUL SYLLABLE KIYEOK U TIKEUT
+ 0xB1BC: 0xAD74, //HANGUL SYLLABLE KIYEOK U RIEUL
+ 0xB1BD: 0xAD75, //HANGUL SYLLABLE KIYEOK U RIEULKIYEOK
+ 0xB1BE: 0xAD76, //HANGUL SYLLABLE KIYEOK U RIEULMIEUM
+ 0xB1BF: 0xAD7B, //HANGUL SYLLABLE KIYEOK U RIEULHIEUH
+ 0xB1C0: 0xAD7C, //HANGUL SYLLABLE KIYEOK U MIEUM
+ 0xB1C1: 0xAD7D, //HANGUL SYLLABLE KIYEOK U PIEUP
+ 0xB1C2: 0xAD7F, //HANGUL SYLLABLE KIYEOK U SIOS
+ 0xB1C3: 0xAD81, //HANGUL SYLLABLE KIYEOK U IEUNG
+ 0xB1C4: 0xAD82, //HANGUL SYLLABLE KIYEOK U CIEUC
+ 0xB1C5: 0xAD88, //HANGUL SYLLABLE KIYEOK WEO
+ 0xB1C6: 0xAD89, //HANGUL SYLLABLE KIYEOK WEO KIYEOK
+ 0xB1C7: 0xAD8C, //HANGUL SYLLABLE KIYEOK WEO NIEUN
+ 0xB1C8: 0xAD90, //HANGUL SYLLABLE KIYEOK WEO RIEUL
+ 0xB1C9: 0xAD9C, //HANGUL SYLLABLE KIYEOK WEO SSANGSIOS
+ 0xB1CA: 0xAD9D, //HANGUL SYLLABLE KIYEOK WEO IEUNG
+ 0xB1CB: 0xADA4, //HANGUL SYLLABLE KIYEOK WE
+ 0xB1CC: 0xADB7, //HANGUL SYLLABLE KIYEOK WE SIOS
+ 0xB1CD: 0xADC0, //HANGUL SYLLABLE KIYEOK WI
+ 0xB1CE: 0xADC1, //HANGUL SYLLABLE KIYEOK WI KIYEOK
+ 0xB1CF: 0xADC4, //HANGUL SYLLABLE KIYEOK WI NIEUN
+ 0xB1D0: 0xADC8, //HANGUL SYLLABLE KIYEOK WI RIEUL
+ 0xB1D1: 0xADD0, //HANGUL SYLLABLE KIYEOK WI MIEUM
+ 0xB1D2: 0xADD1, //HANGUL SYLLABLE KIYEOK WI PIEUP
+ 0xB1D3: 0xADD3, //HANGUL SYLLABLE KIYEOK WI SIOS
+ 0xB1D4: 0xADDC, //HANGUL SYLLABLE KIYEOK YU
+ 0xB1D5: 0xADE0, //HANGUL SYLLABLE KIYEOK YU NIEUN
+ 0xB1D6: 0xADE4, //HANGUL SYLLABLE KIYEOK YU RIEUL
+ 0xB1D7: 0xADF8, //HANGUL SYLLABLE KIYEOK EU
+ 0xB1D8: 0xADF9, //HANGUL SYLLABLE KIYEOK EU KIYEOK
+ 0xB1D9: 0xADFC, //HANGUL SYLLABLE KIYEOK EU NIEUN
+ 0xB1DA: 0xADFF, //HANGUL SYLLABLE KIYEOK EU TIKEUT
+ 0xB1DB: 0xAE00, //HANGUL SYLLABLE KIYEOK EU RIEUL
+ 0xB1DC: 0xAE01, //HANGUL SYLLABLE KIYEOK EU RIEULKIYEOK
+ 0xB1DD: 0xAE08, //HANGUL SYLLABLE KIYEOK EU MIEUM
+ 0xB1DE: 0xAE09, //HANGUL SYLLABLE KIYEOK EU PIEUP
+ 0xB1DF: 0xAE0B, //HANGUL SYLLABLE KIYEOK EU SIOS
+ 0xB1E0: 0xAE0D, //HANGUL SYLLABLE KIYEOK EU IEUNG
+ 0xB1E1: 0xAE14, //HANGUL SYLLABLE KIYEOK YI
+ 0xB1E2: 0xAE30, //HANGUL SYLLABLE KIYEOK I
+ 0xB1E3: 0xAE31, //HANGUL SYLLABLE KIYEOK I KIYEOK
+ 0xB1E4: 0xAE34, //HANGUL SYLLABLE KIYEOK I NIEUN
+ 0xB1E5: 0xAE37, //HANGUL SYLLABLE KIYEOK I TIKEUT
+ 0xB1E6: 0xAE38, //HANGUL SYLLABLE KIYEOK I RIEUL
+ 0xB1E7: 0xAE3A, //HANGUL SYLLABLE KIYEOK I RIEULMIEUM
+ 0xB1E8: 0xAE40, //HANGUL SYLLABLE KIYEOK I MIEUM
+ 0xB1E9: 0xAE41, //HANGUL SYLLABLE KIYEOK I PIEUP
+ 0xB1EA: 0xAE43, //HANGUL SYLLABLE KIYEOK I SIOS
+ 0xB1EB: 0xAE45, //HANGUL SYLLABLE KIYEOK I IEUNG
+ 0xB1EC: 0xAE46, //HANGUL SYLLABLE KIYEOK I CIEUC
+ 0xB1ED: 0xAE4A, //HANGUL SYLLABLE KIYEOK I PHIEUPH
+ 0xB1EE: 0xAE4C, //HANGUL SYLLABLE SSANGKIYEOK A
+ 0xB1EF: 0xAE4D, //HANGUL SYLLABLE SSANGKIYEOK A KIYEOK
+ 0xB1F0: 0xAE4E, //HANGUL SYLLABLE SSANGKIYEOK A SSANGKIYEOK
+ 0xB1F1: 0xAE50, //HANGUL SYLLABLE SSANGKIYEOK A NIEUN
+ 0xB1F2: 0xAE54, //HANGUL SYLLABLE SSANGKIYEOK A RIEUL
+ 0xB1F3: 0xAE56, //HANGUL SYLLABLE SSANGKIYEOK A RIEULMIEUM
+ 0xB1F4: 0xAE5C, //HANGUL SYLLABLE SSANGKIYEOK A MIEUM
+ 0xB1F5: 0xAE5D, //HANGUL SYLLABLE SSANGKIYEOK A PIEUP
+ 0xB1F6: 0xAE5F, //HANGUL SYLLABLE SSANGKIYEOK A SIOS
+ 0xB1F7: 0xAE60, //HANGUL SYLLABLE SSANGKIYEOK A SSANGSIOS
+ 0xB1F8: 0xAE61, //HANGUL SYLLABLE SSANGKIYEOK A IEUNG
+ 0xB1F9: 0xAE65, //HANGUL SYLLABLE SSANGKIYEOK A THIEUTH
+ 0xB1FA: 0xAE68, //HANGUL SYLLABLE SSANGKIYEOK AE
+ 0xB1FB: 0xAE69, //HANGUL SYLLABLE SSANGKIYEOK AE KIYEOK
+ 0xB1FC: 0xAE6C, //HANGUL SYLLABLE SSANGKIYEOK AE NIEUN
+ 0xB1FD: 0xAE70, //HANGUL SYLLABLE SSANGKIYEOK AE RIEUL
+ 0xB1FE: 0xAE78, //HANGUL SYLLABLE SSANGKIYEOK AE MIEUM
+ 0xB241: 0xCF6D, //HANGUL SYLLABLE KHIEUKH O THIEUTH
+ 0xB242: 0xCF6E, //HANGUL SYLLABLE KHIEUKH O PHIEUPH
+ 0xB243: 0xCF6F, //HANGUL SYLLABLE KHIEUKH O HIEUH
+ 0xB244: 0xCF72, //HANGUL SYLLABLE KHIEUKH WA SSANGKIYEOK
+ 0xB245: 0xCF73, //HANGUL SYLLABLE KHIEUKH WA KIYEOKSIOS
+ 0xB246: 0xCF75, //HANGUL SYLLABLE KHIEUKH WA NIEUNCIEUC
+ 0xB247: 0xCF76, //HANGUL SYLLABLE KHIEUKH WA NIEUNHIEUH
+ 0xB248: 0xCF77, //HANGUL SYLLABLE KHIEUKH WA TIKEUT
+ 0xB249: 0xCF79, //HANGUL SYLLABLE KHIEUKH WA RIEULKIYEOK
+ 0xB24A: 0xCF7A, //HANGUL SYLLABLE KHIEUKH WA RIEULMIEUM
+ 0xB24B: 0xCF7B, //HANGUL SYLLABLE KHIEUKH WA RIEULPIEUP
+ 0xB24C: 0xCF7C, //HANGUL SYLLABLE KHIEUKH WA RIEULSIOS
+ 0xB24D: 0xCF7D, //HANGUL SYLLABLE KHIEUKH WA RIEULTHIEUTH
+ 0xB24E: 0xCF7E, //HANGUL SYLLABLE KHIEUKH WA RIEULPHIEUPH
+ 0xB24F: 0xCF7F, //HANGUL SYLLABLE KHIEUKH WA RIEULHIEUH
+ 0xB250: 0xCF81, //HANGUL SYLLABLE KHIEUKH WA PIEUP
+ 0xB251: 0xCF82, //HANGUL SYLLABLE KHIEUKH WA PIEUPSIOS
+ 0xB252: 0xCF83, //HANGUL SYLLABLE KHIEUKH WA SIOS
+ 0xB253: 0xCF84, //HANGUL SYLLABLE KHIEUKH WA SSANGSIOS
+ 0xB254: 0xCF86, //HANGUL SYLLABLE KHIEUKH WA CIEUC
+ 0xB255: 0xCF87, //HANGUL SYLLABLE KHIEUKH WA CHIEUCH
+ 0xB256: 0xCF88, //HANGUL SYLLABLE KHIEUKH WA KHIEUKH
+ 0xB257: 0xCF89, //HANGUL SYLLABLE KHIEUKH WA THIEUTH
+ 0xB258: 0xCF8A, //HANGUL SYLLABLE KHIEUKH WA PHIEUPH
+ 0xB259: 0xCF8B, //HANGUL SYLLABLE KHIEUKH WA HIEUH
+ 0xB25A: 0xCF8D, //HANGUL SYLLABLE KHIEUKH WAE KIYEOK
+ 0xB261: 0xCF8E, //HANGUL SYLLABLE KHIEUKH WAE SSANGKIYEOK
+ 0xB262: 0xCF8F, //HANGUL SYLLABLE KHIEUKH WAE KIYEOKSIOS
+ 0xB263: 0xCF90, //HANGUL SYLLABLE KHIEUKH WAE NIEUN
+ 0xB264: 0xCF91, //HANGUL SYLLABLE KHIEUKH WAE NIEUNCIEUC
+ 0xB265: 0xCF92, //HANGUL SYLLABLE KHIEUKH WAE NIEUNHIEUH
+ 0xB266: 0xCF93, //HANGUL SYLLABLE KHIEUKH WAE TIKEUT
+ 0xB267: 0xCF94, //HANGUL SYLLABLE KHIEUKH WAE RIEUL
+ 0xB268: 0xCF95, //HANGUL SYLLABLE KHIEUKH WAE RIEULKIYEOK
+ 0xB269: 0xCF96, //HANGUL SYLLABLE KHIEUKH WAE RIEULMIEUM
+ 0xB26A: 0xCF97, //HANGUL SYLLABLE KHIEUKH WAE RIEULPIEUP
+ 0xB26B: 0xCF98, //HANGUL SYLLABLE KHIEUKH WAE RIEULSIOS
+ 0xB26C: 0xCF99, //HANGUL SYLLABLE KHIEUKH WAE RIEULTHIEUTH
+ 0xB26D: 0xCF9A, //HANGUL SYLLABLE KHIEUKH WAE RIEULPHIEUPH
+ 0xB26E: 0xCF9B, //HANGUL SYLLABLE KHIEUKH WAE RIEULHIEUH
+ 0xB26F: 0xCF9C, //HANGUL SYLLABLE KHIEUKH WAE MIEUM
+ 0xB270: 0xCF9D, //HANGUL SYLLABLE KHIEUKH WAE PIEUP
+ 0xB271: 0xCF9E, //HANGUL SYLLABLE KHIEUKH WAE PIEUPSIOS
+ 0xB272: 0xCF9F, //HANGUL SYLLABLE KHIEUKH WAE SIOS
+ 0xB273: 0xCFA0, //HANGUL SYLLABLE KHIEUKH WAE SSANGSIOS
+ 0xB274: 0xCFA2, //HANGUL SYLLABLE KHIEUKH WAE CIEUC
+ 0xB275: 0xCFA3, //HANGUL SYLLABLE KHIEUKH WAE CHIEUCH
+ 0xB276: 0xCFA4, //HANGUL SYLLABLE KHIEUKH WAE KHIEUKH
+ 0xB277: 0xCFA5, //HANGUL SYLLABLE KHIEUKH WAE THIEUTH
+ 0xB278: 0xCFA6, //HANGUL SYLLABLE KHIEUKH WAE PHIEUPH
+ 0xB279: 0xCFA7, //HANGUL SYLLABLE KHIEUKH WAE HIEUH
+ 0xB27A: 0xCFA9, //HANGUL SYLLABLE KHIEUKH OE KIYEOK
+ 0xB281: 0xCFAA, //HANGUL SYLLABLE KHIEUKH OE SSANGKIYEOK
+ 0xB282: 0xCFAB, //HANGUL SYLLABLE KHIEUKH OE KIYEOKSIOS
+ 0xB283: 0xCFAC, //HANGUL SYLLABLE KHIEUKH OE NIEUN
+ 0xB284: 0xCFAD, //HANGUL SYLLABLE KHIEUKH OE NIEUNCIEUC
+ 0xB285: 0xCFAE, //HANGUL SYLLABLE KHIEUKH OE NIEUNHIEUH
+ 0xB286: 0xCFAF, //HANGUL SYLLABLE KHIEUKH OE TIKEUT
+ 0xB287: 0xCFB1, //HANGUL SYLLABLE KHIEUKH OE RIEULKIYEOK
+ 0xB288: 0xCFB2, //HANGUL SYLLABLE KHIEUKH OE RIEULMIEUM
+ 0xB289: 0xCFB3, //HANGUL SYLLABLE KHIEUKH OE RIEULPIEUP
+ 0xB28A: 0xCFB4, //HANGUL SYLLABLE KHIEUKH OE RIEULSIOS
+ 0xB28B: 0xCFB5, //HANGUL SYLLABLE KHIEUKH OE RIEULTHIEUTH
+ 0xB28C: 0xCFB6, //HANGUL SYLLABLE KHIEUKH OE RIEULPHIEUPH
+ 0xB28D: 0xCFB7, //HANGUL SYLLABLE KHIEUKH OE RIEULHIEUH
+ 0xB28E: 0xCFB8, //HANGUL SYLLABLE KHIEUKH OE MIEUM
+ 0xB28F: 0xCFB9, //HANGUL SYLLABLE KHIEUKH OE PIEUP
+ 0xB290: 0xCFBA, //HANGUL SYLLABLE KHIEUKH OE PIEUPSIOS
+ 0xB291: 0xCFBB, //HANGUL SYLLABLE KHIEUKH OE SIOS
+ 0xB292: 0xCFBC, //HANGUL SYLLABLE KHIEUKH OE SSANGSIOS
+ 0xB293: 0xCFBD, //HANGUL SYLLABLE KHIEUKH OE IEUNG
+ 0xB294: 0xCFBE, //HANGUL SYLLABLE KHIEUKH OE CIEUC
+ 0xB295: 0xCFBF, //HANGUL SYLLABLE KHIEUKH OE CHIEUCH
+ 0xB296: 0xCFC0, //HANGUL SYLLABLE KHIEUKH OE KHIEUKH
+ 0xB297: 0xCFC1, //HANGUL SYLLABLE KHIEUKH OE THIEUTH
+ 0xB298: 0xCFC2, //HANGUL SYLLABLE KHIEUKH OE PHIEUPH
+ 0xB299: 0xCFC3, //HANGUL SYLLABLE KHIEUKH OE HIEUH
+ 0xB29A: 0xCFC5, //HANGUL SYLLABLE KHIEUKH YO KIYEOK
+ 0xB29B: 0xCFC6, //HANGUL SYLLABLE KHIEUKH YO SSANGKIYEOK
+ 0xB29C: 0xCFC7, //HANGUL SYLLABLE KHIEUKH YO KIYEOKSIOS
+ 0xB29D: 0xCFC8, //HANGUL SYLLABLE KHIEUKH YO NIEUN
+ 0xB29E: 0xCFC9, //HANGUL SYLLABLE KHIEUKH YO NIEUNCIEUC
+ 0xB29F: 0xCFCA, //HANGUL SYLLABLE KHIEUKH YO NIEUNHIEUH
+ 0xB2A0: 0xCFCB, //HANGUL SYLLABLE KHIEUKH YO TIKEUT
+ 0xB2A1: 0xAE79, //HANGUL SYLLABLE SSANGKIYEOK AE PIEUP
+ 0xB2A2: 0xAE7B, //HANGUL SYLLABLE SSANGKIYEOK AE SIOS
+ 0xB2A3: 0xAE7C, //HANGUL SYLLABLE SSANGKIYEOK AE SSANGSIOS
+ 0xB2A4: 0xAE7D, //HANGUL SYLLABLE SSANGKIYEOK AE IEUNG
+ 0xB2A5: 0xAE84, //HANGUL SYLLABLE SSANGKIYEOK YA
+ 0xB2A6: 0xAE85, //HANGUL SYLLABLE SSANGKIYEOK YA KIYEOK
+ 0xB2A7: 0xAE8C, //HANGUL SYLLABLE SSANGKIYEOK YA RIEUL
+ 0xB2A8: 0xAEBC, //HANGUL SYLLABLE SSANGKIYEOK EO
+ 0xB2A9: 0xAEBD, //HANGUL SYLLABLE SSANGKIYEOK EO KIYEOK
+ 0xB2AA: 0xAEBE, //HANGUL SYLLABLE SSANGKIYEOK EO SSANGKIYEOK
+ 0xB2AB: 0xAEC0, //HANGUL SYLLABLE SSANGKIYEOK EO NIEUN
+ 0xB2AC: 0xAEC4, //HANGUL SYLLABLE SSANGKIYEOK EO RIEUL
+ 0xB2AD: 0xAECC, //HANGUL SYLLABLE SSANGKIYEOK EO MIEUM
+ 0xB2AE: 0xAECD, //HANGUL SYLLABLE SSANGKIYEOK EO PIEUP
+ 0xB2AF: 0xAECF, //HANGUL SYLLABLE SSANGKIYEOK EO SIOS
+ 0xB2B0: 0xAED0, //HANGUL SYLLABLE SSANGKIYEOK EO SSANGSIOS
+ 0xB2B1: 0xAED1, //HANGUL SYLLABLE SSANGKIYEOK EO IEUNG
+ 0xB2B2: 0xAED8, //HANGUL SYLLABLE SSANGKIYEOK E
+ 0xB2B3: 0xAED9, //HANGUL SYLLABLE SSANGKIYEOK E KIYEOK
+ 0xB2B4: 0xAEDC, //HANGUL SYLLABLE SSANGKIYEOK E NIEUN
+ 0xB2B5: 0xAEE8, //HANGUL SYLLABLE SSANGKIYEOK E MIEUM
+ 0xB2B6: 0xAEEB, //HANGUL SYLLABLE SSANGKIYEOK E SIOS
+ 0xB2B7: 0xAEED, //HANGUL SYLLABLE SSANGKIYEOK E IEUNG
+ 0xB2B8: 0xAEF4, //HANGUL SYLLABLE SSANGKIYEOK YEO
+ 0xB2B9: 0xAEF8, //HANGUL SYLLABLE SSANGKIYEOK YEO NIEUN
+ 0xB2BA: 0xAEFC, //HANGUL SYLLABLE SSANGKIYEOK YEO RIEUL
+ 0xB2BB: 0xAF07, //HANGUL SYLLABLE SSANGKIYEOK YEO SIOS
+ 0xB2BC: 0xAF08, //HANGUL SYLLABLE SSANGKIYEOK YEO SSANGSIOS
+ 0xB2BD: 0xAF0D, //HANGUL SYLLABLE SSANGKIYEOK YEO THIEUTH
+ 0xB2BE: 0xAF10, //HANGUL SYLLABLE SSANGKIYEOK YE
+ 0xB2BF: 0xAF2C, //HANGUL SYLLABLE SSANGKIYEOK O
+ 0xB2C0: 0xAF2D, //HANGUL SYLLABLE SSANGKIYEOK O KIYEOK
+ 0xB2C1: 0xAF30, //HANGUL SYLLABLE SSANGKIYEOK O NIEUN
+ 0xB2C2: 0xAF32, //HANGUL SYLLABLE SSANGKIYEOK O NIEUNHIEUH
+ 0xB2C3: 0xAF34, //HANGUL SYLLABLE SSANGKIYEOK O RIEUL
+ 0xB2C4: 0xAF3C, //HANGUL SYLLABLE SSANGKIYEOK O MIEUM
+ 0xB2C5: 0xAF3D, //HANGUL SYLLABLE SSANGKIYEOK O PIEUP
+ 0xB2C6: 0xAF3F, //HANGUL SYLLABLE SSANGKIYEOK O SIOS
+ 0xB2C7: 0xAF41, //HANGUL SYLLABLE SSANGKIYEOK O IEUNG
+ 0xB2C8: 0xAF42, //HANGUL SYLLABLE SSANGKIYEOK O CIEUC
+ 0xB2C9: 0xAF43, //HANGUL SYLLABLE SSANGKIYEOK O CHIEUCH
+ 0xB2CA: 0xAF48, //HANGUL SYLLABLE SSANGKIYEOK WA
+ 0xB2CB: 0xAF49, //HANGUL SYLLABLE SSANGKIYEOK WA KIYEOK
+ 0xB2CC: 0xAF50, //HANGUL SYLLABLE SSANGKIYEOK WA RIEUL
+ 0xB2CD: 0xAF5C, //HANGUL SYLLABLE SSANGKIYEOK WA SSANGSIOS
+ 0xB2CE: 0xAF5D, //HANGUL SYLLABLE SSANGKIYEOK WA IEUNG
+ 0xB2CF: 0xAF64, //HANGUL SYLLABLE SSANGKIYEOK WAE
+ 0xB2D0: 0xAF65, //HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOK
+ 0xB2D1: 0xAF79, //HANGUL SYLLABLE SSANGKIYEOK WAE IEUNG
+ 0xB2D2: 0xAF80, //HANGUL SYLLABLE SSANGKIYEOK OE
+ 0xB2D3: 0xAF84, //HANGUL SYLLABLE SSANGKIYEOK OE NIEUN
+ 0xB2D4: 0xAF88, //HANGUL SYLLABLE SSANGKIYEOK OE RIEUL
+ 0xB2D5: 0xAF90, //HANGUL SYLLABLE SSANGKIYEOK OE MIEUM
+ 0xB2D6: 0xAF91, //HANGUL SYLLABLE SSANGKIYEOK OE PIEUP
+ 0xB2D7: 0xAF95, //HANGUL SYLLABLE SSANGKIYEOK OE IEUNG
+ 0xB2D8: 0xAF9C, //HANGUL SYLLABLE SSANGKIYEOK YO
+ 0xB2D9: 0xAFB8, //HANGUL SYLLABLE SSANGKIYEOK U
+ 0xB2DA: 0xAFB9, //HANGUL SYLLABLE SSANGKIYEOK U KIYEOK
+ 0xB2DB: 0xAFBC, //HANGUL SYLLABLE SSANGKIYEOK U NIEUN
+ 0xB2DC: 0xAFC0, //HANGUL SYLLABLE SSANGKIYEOK U RIEUL
+ 0xB2DD: 0xAFC7, //HANGUL SYLLABLE SSANGKIYEOK U RIEULHIEUH
+ 0xB2DE: 0xAFC8, //HANGUL SYLLABLE SSANGKIYEOK U MIEUM
+ 0xB2DF: 0xAFC9, //HANGUL SYLLABLE SSANGKIYEOK U PIEUP
+ 0xB2E0: 0xAFCB, //HANGUL SYLLABLE SSANGKIYEOK U SIOS
+ 0xB2E1: 0xAFCD, //HANGUL SYLLABLE SSANGKIYEOK U IEUNG
+ 0xB2E2: 0xAFCE, //HANGUL SYLLABLE SSANGKIYEOK U CIEUC
+ 0xB2E3: 0xAFD4, //HANGUL SYLLABLE SSANGKIYEOK WEO
+ 0xB2E4: 0xAFDC, //HANGUL SYLLABLE SSANGKIYEOK WEO RIEUL
+ 0xB2E5: 0xAFE8, //HANGUL SYLLABLE SSANGKIYEOK WEO SSANGSIOS
+ 0xB2E6: 0xAFE9, //HANGUL SYLLABLE SSANGKIYEOK WEO IEUNG
+ 0xB2E7: 0xAFF0, //HANGUL SYLLABLE SSANGKIYEOK WE
+ 0xB2E8: 0xAFF1, //HANGUL SYLLABLE SSANGKIYEOK WE KIYEOK
+ 0xB2E9: 0xAFF4, //HANGUL SYLLABLE SSANGKIYEOK WE NIEUN
+ 0xB2EA: 0xAFF8, //HANGUL SYLLABLE SSANGKIYEOK WE RIEUL
+ 0xB2EB: 0xB000, //HANGUL SYLLABLE SSANGKIYEOK WE MIEUM
+ 0xB2EC: 0xB001, //HANGUL SYLLABLE SSANGKIYEOK WE PIEUP
+ 0xB2ED: 0xB004, //HANGUL SYLLABLE SSANGKIYEOK WE SSANGSIOS
+ 0xB2EE: 0xB00C, //HANGUL SYLLABLE SSANGKIYEOK WI
+ 0xB2EF: 0xB010, //HANGUL SYLLABLE SSANGKIYEOK WI NIEUN
+ 0xB2F0: 0xB014, //HANGUL SYLLABLE SSANGKIYEOK WI RIEUL
+ 0xB2F1: 0xB01C, //HANGUL SYLLABLE SSANGKIYEOK WI MIEUM
+ 0xB2F2: 0xB01D, //HANGUL SYLLABLE SSANGKIYEOK WI PIEUP
+ 0xB2F3: 0xB028, //HANGUL SYLLABLE SSANGKIYEOK YU
+ 0xB2F4: 0xB044, //HANGUL SYLLABLE SSANGKIYEOK EU
+ 0xB2F5: 0xB045, //HANGUL SYLLABLE SSANGKIYEOK EU KIYEOK
+ 0xB2F6: 0xB048, //HANGUL SYLLABLE SSANGKIYEOK EU NIEUN
+ 0xB2F7: 0xB04A, //HANGUL SYLLABLE SSANGKIYEOK EU NIEUNHIEUH
+ 0xB2F8: 0xB04C, //HANGUL SYLLABLE SSANGKIYEOK EU RIEUL
+ 0xB2F9: 0xB04E, //HANGUL SYLLABLE SSANGKIYEOK EU RIEULMIEUM
+ 0xB2FA: 0xB053, //HANGUL SYLLABLE SSANGKIYEOK EU RIEULHIEUH
+ 0xB2FB: 0xB054, //HANGUL SYLLABLE SSANGKIYEOK EU MIEUM
+ 0xB2FC: 0xB055, //HANGUL SYLLABLE SSANGKIYEOK EU PIEUP
+ 0xB2FD: 0xB057, //HANGUL SYLLABLE SSANGKIYEOK EU SIOS
+ 0xB2FE: 0xB059, //HANGUL SYLLABLE SSANGKIYEOK EU IEUNG
+ 0xB341: 0xCFCC, //HANGUL SYLLABLE KHIEUKH YO RIEUL
+ 0xB342: 0xCFCD, //HANGUL SYLLABLE KHIEUKH YO RIEULKIYEOK
+ 0xB343: 0xCFCE, //HANGUL SYLLABLE KHIEUKH YO RIEULMIEUM
+ 0xB344: 0xCFCF, //HANGUL SYLLABLE KHIEUKH YO RIEULPIEUP
+ 0xB345: 0xCFD0, //HANGUL SYLLABLE KHIEUKH YO RIEULSIOS
+ 0xB346: 0xCFD1, //HANGUL SYLLABLE KHIEUKH YO RIEULTHIEUTH
+ 0xB347: 0xCFD2, //HANGUL SYLLABLE KHIEUKH YO RIEULPHIEUPH
+ 0xB348: 0xCFD3, //HANGUL SYLLABLE KHIEUKH YO RIEULHIEUH
+ 0xB349: 0xCFD4, //HANGUL SYLLABLE KHIEUKH YO MIEUM
+ 0xB34A: 0xCFD5, //HANGUL SYLLABLE KHIEUKH YO PIEUP
+ 0xB34B: 0xCFD6, //HANGUL SYLLABLE KHIEUKH YO PIEUPSIOS
+ 0xB34C: 0xCFD7, //HANGUL SYLLABLE KHIEUKH YO SIOS
+ 0xB34D: 0xCFD8, //HANGUL SYLLABLE KHIEUKH YO SSANGSIOS
+ 0xB34E: 0xCFD9, //HANGUL SYLLABLE KHIEUKH YO IEUNG
+ 0xB34F: 0xCFDA, //HANGUL SYLLABLE KHIEUKH YO CIEUC
+ 0xB350: 0xCFDB, //HANGUL SYLLABLE KHIEUKH YO CHIEUCH
+ 0xB351: 0xCFDC, //HANGUL SYLLABLE KHIEUKH YO KHIEUKH
+ 0xB352: 0xCFDD, //HANGUL SYLLABLE KHIEUKH YO THIEUTH
+ 0xB353: 0xCFDE, //HANGUL SYLLABLE KHIEUKH YO PHIEUPH
+ 0xB354: 0xCFDF, //HANGUL SYLLABLE KHIEUKH YO HIEUH
+ 0xB355: 0xCFE2, //HANGUL SYLLABLE KHIEUKH U SSANGKIYEOK
+ 0xB356: 0xCFE3, //HANGUL SYLLABLE KHIEUKH U KIYEOKSIOS
+ 0xB357: 0xCFE5, //HANGUL SYLLABLE KHIEUKH U NIEUNCIEUC
+ 0xB358: 0xCFE6, //HANGUL SYLLABLE KHIEUKH U NIEUNHIEUH
+ 0xB359: 0xCFE7, //HANGUL SYLLABLE KHIEUKH U TIKEUT
+ 0xB35A: 0xCFE9, //HANGUL SYLLABLE KHIEUKH U RIEULKIYEOK
+ 0xB361: 0xCFEA, //HANGUL SYLLABLE KHIEUKH U RIEULMIEUM
+ 0xB362: 0xCFEB, //HANGUL SYLLABLE KHIEUKH U RIEULPIEUP
+ 0xB363: 0xCFEC, //HANGUL SYLLABLE KHIEUKH U RIEULSIOS
+ 0xB364: 0xCFED, //HANGUL SYLLABLE KHIEUKH U RIEULTHIEUTH
+ 0xB365: 0xCFEE, //HANGUL SYLLABLE KHIEUKH U RIEULPHIEUPH
+ 0xB366: 0xCFEF, //HANGUL SYLLABLE KHIEUKH U RIEULHIEUH
+ 0xB367: 0xCFF2, //HANGUL SYLLABLE KHIEUKH U PIEUPSIOS
+ 0xB368: 0xCFF4, //HANGUL SYLLABLE KHIEUKH U SSANGSIOS
+ 0xB369: 0xCFF6, //HANGUL SYLLABLE KHIEUKH U CIEUC
+ 0xB36A: 0xCFF7, //HANGUL SYLLABLE KHIEUKH U CHIEUCH
+ 0xB36B: 0xCFF8, //HANGUL SYLLABLE KHIEUKH U KHIEUKH
+ 0xB36C: 0xCFF9, //HANGUL SYLLABLE KHIEUKH U THIEUTH
+ 0xB36D: 0xCFFA, //HANGUL SYLLABLE KHIEUKH U PHIEUPH
+ 0xB36E: 0xCFFB, //HANGUL SYLLABLE KHIEUKH U HIEUH
+ 0xB36F: 0xCFFD, //HANGUL SYLLABLE KHIEUKH WEO KIYEOK
+ 0xB370: 0xCFFE, //HANGUL SYLLABLE KHIEUKH WEO SSANGKIYEOK
+ 0xB371: 0xCFFF, //HANGUL SYLLABLE KHIEUKH WEO KIYEOKSIOS
+ 0xB372: 0xD001, //HANGUL SYLLABLE KHIEUKH WEO NIEUNCIEUC
+ 0xB373: 0xD002, //HANGUL SYLLABLE KHIEUKH WEO NIEUNHIEUH
+ 0xB374: 0xD003, //HANGUL SYLLABLE KHIEUKH WEO TIKEUT
+ 0xB375: 0xD005, //HANGUL SYLLABLE KHIEUKH WEO RIEULKIYEOK
+ 0xB376: 0xD006, //HANGUL SYLLABLE KHIEUKH WEO RIEULMIEUM
+ 0xB377: 0xD007, //HANGUL SYLLABLE KHIEUKH WEO RIEULPIEUP
+ 0xB378: 0xD008, //HANGUL SYLLABLE KHIEUKH WEO RIEULSIOS
+ 0xB379: 0xD009, //HANGUL SYLLABLE KHIEUKH WEO RIEULTHIEUTH
+ 0xB37A: 0xD00A, //HANGUL SYLLABLE KHIEUKH WEO RIEULPHIEUPH
+ 0xB381: 0xD00B, //HANGUL SYLLABLE KHIEUKH WEO RIEULHIEUH
+ 0xB382: 0xD00C, //HANGUL SYLLABLE KHIEUKH WEO MIEUM
+ 0xB383: 0xD00D, //HANGUL SYLLABLE KHIEUKH WEO PIEUP
+ 0xB384: 0xD00E, //HANGUL SYLLABLE KHIEUKH WEO PIEUPSIOS
+ 0xB385: 0xD00F, //HANGUL SYLLABLE KHIEUKH WEO SIOS
+ 0xB386: 0xD010, //HANGUL SYLLABLE KHIEUKH WEO SSANGSIOS
+ 0xB387: 0xD012, //HANGUL SYLLABLE KHIEUKH WEO CIEUC
+ 0xB388: 0xD013, //HANGUL SYLLABLE KHIEUKH WEO CHIEUCH
+ 0xB389: 0xD014, //HANGUL SYLLABLE KHIEUKH WEO KHIEUKH
+ 0xB38A: 0xD015, //HANGUL SYLLABLE KHIEUKH WEO THIEUTH
+ 0xB38B: 0xD016, //HANGUL SYLLABLE KHIEUKH WEO PHIEUPH
+ 0xB38C: 0xD017, //HANGUL SYLLABLE KHIEUKH WEO HIEUH
+ 0xB38D: 0xD019, //HANGUL SYLLABLE KHIEUKH WE KIYEOK
+ 0xB38E: 0xD01A, //HANGUL SYLLABLE KHIEUKH WE SSANGKIYEOK
+ 0xB38F: 0xD01B, //HANGUL SYLLABLE KHIEUKH WE KIYEOKSIOS
+ 0xB390: 0xD01C, //HANGUL SYLLABLE KHIEUKH WE NIEUN
+ 0xB391: 0xD01D, //HANGUL SYLLABLE KHIEUKH WE NIEUNCIEUC
+ 0xB392: 0xD01E, //HANGUL SYLLABLE KHIEUKH WE NIEUNHIEUH
+ 0xB393: 0xD01F, //HANGUL SYLLABLE KHIEUKH WE TIKEUT
+ 0xB394: 0xD020, //HANGUL SYLLABLE KHIEUKH WE RIEUL
+ 0xB395: 0xD021, //HANGUL SYLLABLE KHIEUKH WE RIEULKIYEOK
+ 0xB396: 0xD022, //HANGUL SYLLABLE KHIEUKH WE RIEULMIEUM
+ 0xB397: 0xD023, //HANGUL SYLLABLE KHIEUKH WE RIEULPIEUP
+ 0xB398: 0xD024, //HANGUL SYLLABLE KHIEUKH WE RIEULSIOS
+ 0xB399: 0xD025, //HANGUL SYLLABLE KHIEUKH WE RIEULTHIEUTH
+ 0xB39A: 0xD026, //HANGUL SYLLABLE KHIEUKH WE RIEULPHIEUPH
+ 0xB39B: 0xD027, //HANGUL SYLLABLE KHIEUKH WE RIEULHIEUH
+ 0xB39C: 0xD028, //HANGUL SYLLABLE KHIEUKH WE MIEUM
+ 0xB39D: 0xD029, //HANGUL SYLLABLE KHIEUKH WE PIEUP
+ 0xB39E: 0xD02A, //HANGUL SYLLABLE KHIEUKH WE PIEUPSIOS
+ 0xB39F: 0xD02B, //HANGUL SYLLABLE KHIEUKH WE SIOS
+ 0xB3A0: 0xD02C, //HANGUL SYLLABLE KHIEUKH WE SSANGSIOS
+ 0xB3A1: 0xB05D, //HANGUL SYLLABLE SSANGKIYEOK EU THIEUTH
+ 0xB3A2: 0xB07C, //HANGUL SYLLABLE SSANGKIYEOK I
+ 0xB3A3: 0xB07D, //HANGUL SYLLABLE SSANGKIYEOK I KIYEOK
+ 0xB3A4: 0xB080, //HANGUL SYLLABLE SSANGKIYEOK I NIEUN
+ 0xB3A5: 0xB084, //HANGUL SYLLABLE SSANGKIYEOK I RIEUL
+ 0xB3A6: 0xB08C, //HANGUL SYLLABLE SSANGKIYEOK I MIEUM
+ 0xB3A7: 0xB08D, //HANGUL SYLLABLE SSANGKIYEOK I PIEUP
+ 0xB3A8: 0xB08F, //HANGUL SYLLABLE SSANGKIYEOK I SIOS
+ 0xB3A9: 0xB091, //HANGUL SYLLABLE SSANGKIYEOK I IEUNG
+ 0xB3AA: 0xB098, //HANGUL SYLLABLE NIEUN A
+ 0xB3AB: 0xB099, //HANGUL SYLLABLE NIEUN A KIYEOK
+ 0xB3AC: 0xB09A, //HANGUL SYLLABLE NIEUN A SSANGKIYEOK
+ 0xB3AD: 0xB09C, //HANGUL SYLLABLE NIEUN A NIEUN
+ 0xB3AE: 0xB09F, //HANGUL SYLLABLE NIEUN A TIKEUT
+ 0xB3AF: 0xB0A0, //HANGUL SYLLABLE NIEUN A RIEUL
+ 0xB3B0: 0xB0A1, //HANGUL SYLLABLE NIEUN A RIEULKIYEOK
+ 0xB3B1: 0xB0A2, //HANGUL SYLLABLE NIEUN A RIEULMIEUM
+ 0xB3B2: 0xB0A8, //HANGUL SYLLABLE NIEUN A MIEUM
+ 0xB3B3: 0xB0A9, //HANGUL SYLLABLE NIEUN A PIEUP
+ 0xB3B4: 0xB0AB, //HANGUL SYLLABLE NIEUN A SIOS
+ 0xB3B5: 0xB0AC, //HANGUL SYLLABLE NIEUN A SSANGSIOS
+ 0xB3B6: 0xB0AD, //HANGUL SYLLABLE NIEUN A IEUNG
+ 0xB3B7: 0xB0AE, //HANGUL SYLLABLE NIEUN A CIEUC
+ 0xB3B8: 0xB0AF, //HANGUL SYLLABLE NIEUN A CHIEUCH
+ 0xB3B9: 0xB0B1, //HANGUL SYLLABLE NIEUN A THIEUTH
+ 0xB3BA: 0xB0B3, //HANGUL SYLLABLE NIEUN A HIEUH
+ 0xB3BB: 0xB0B4, //HANGUL SYLLABLE NIEUN AE
+ 0xB3BC: 0xB0B5, //HANGUL SYLLABLE NIEUN AE KIYEOK
+ 0xB3BD: 0xB0B8, //HANGUL SYLLABLE NIEUN AE NIEUN
+ 0xB3BE: 0xB0BC, //HANGUL SYLLABLE NIEUN AE RIEUL
+ 0xB3BF: 0xB0C4, //HANGUL SYLLABLE NIEUN AE MIEUM
+ 0xB3C0: 0xB0C5, //HANGUL SYLLABLE NIEUN AE PIEUP
+ 0xB3C1: 0xB0C7, //HANGUL SYLLABLE NIEUN AE SIOS
+ 0xB3C2: 0xB0C8, //HANGUL SYLLABLE NIEUN AE SSANGSIOS
+ 0xB3C3: 0xB0C9, //HANGUL SYLLABLE NIEUN AE IEUNG
+ 0xB3C4: 0xB0D0, //HANGUL SYLLABLE NIEUN YA
+ 0xB3C5: 0xB0D1, //HANGUL SYLLABLE NIEUN YA KIYEOK
+ 0xB3C6: 0xB0D4, //HANGUL SYLLABLE NIEUN YA NIEUN
+ 0xB3C7: 0xB0D8, //HANGUL SYLLABLE NIEUN YA RIEUL
+ 0xB3C8: 0xB0E0, //HANGUL SYLLABLE NIEUN YA MIEUM
+ 0xB3C9: 0xB0E5, //HANGUL SYLLABLE NIEUN YA IEUNG
+ 0xB3CA: 0xB108, //HANGUL SYLLABLE NIEUN EO
+ 0xB3CB: 0xB109, //HANGUL SYLLABLE NIEUN EO KIYEOK
+ 0xB3CC: 0xB10B, //HANGUL SYLLABLE NIEUN EO KIYEOKSIOS
+ 0xB3CD: 0xB10C, //HANGUL SYLLABLE NIEUN EO NIEUN
+ 0xB3CE: 0xB110, //HANGUL SYLLABLE NIEUN EO RIEUL
+ 0xB3CF: 0xB112, //HANGUL SYLLABLE NIEUN EO RIEULMIEUM
+ 0xB3D0: 0xB113, //HANGUL SYLLABLE NIEUN EO RIEULPIEUP
+ 0xB3D1: 0xB118, //HANGUL SYLLABLE NIEUN EO MIEUM
+ 0xB3D2: 0xB119, //HANGUL SYLLABLE NIEUN EO PIEUP
+ 0xB3D3: 0xB11B, //HANGUL SYLLABLE NIEUN EO SIOS
+ 0xB3D4: 0xB11C, //HANGUL SYLLABLE NIEUN EO SSANGSIOS
+ 0xB3D5: 0xB11D, //HANGUL SYLLABLE NIEUN EO IEUNG
+ 0xB3D6: 0xB123, //HANGUL SYLLABLE NIEUN EO HIEUH
+ 0xB3D7: 0xB124, //HANGUL SYLLABLE NIEUN E
+ 0xB3D8: 0xB125, //HANGUL SYLLABLE NIEUN E KIYEOK
+ 0xB3D9: 0xB128, //HANGUL SYLLABLE NIEUN E NIEUN
+ 0xB3DA: 0xB12C, //HANGUL SYLLABLE NIEUN E RIEUL
+ 0xB3DB: 0xB134, //HANGUL SYLLABLE NIEUN E MIEUM
+ 0xB3DC: 0xB135, //HANGUL SYLLABLE NIEUN E PIEUP
+ 0xB3DD: 0xB137, //HANGUL SYLLABLE NIEUN E SIOS
+ 0xB3DE: 0xB138, //HANGUL SYLLABLE NIEUN E SSANGSIOS
+ 0xB3DF: 0xB139, //HANGUL SYLLABLE NIEUN E IEUNG
+ 0xB3E0: 0xB140, //HANGUL SYLLABLE NIEUN YEO
+ 0xB3E1: 0xB141, //HANGUL SYLLABLE NIEUN YEO KIYEOK
+ 0xB3E2: 0xB144, //HANGUL SYLLABLE NIEUN YEO NIEUN
+ 0xB3E3: 0xB148, //HANGUL SYLLABLE NIEUN YEO RIEUL
+ 0xB3E4: 0xB150, //HANGUL SYLLABLE NIEUN YEO MIEUM
+ 0xB3E5: 0xB151, //HANGUL SYLLABLE NIEUN YEO PIEUP
+ 0xB3E6: 0xB154, //HANGUL SYLLABLE NIEUN YEO SSANGSIOS
+ 0xB3E7: 0xB155, //HANGUL SYLLABLE NIEUN YEO IEUNG
+ 0xB3E8: 0xB158, //HANGUL SYLLABLE NIEUN YEO KHIEUKH
+ 0xB3E9: 0xB15C, //HANGUL SYLLABLE NIEUN YE
+ 0xB3EA: 0xB160, //HANGUL SYLLABLE NIEUN YE NIEUN
+ 0xB3EB: 0xB178, //HANGUL SYLLABLE NIEUN O
+ 0xB3EC: 0xB179, //HANGUL SYLLABLE NIEUN O KIYEOK
+ 0xB3ED: 0xB17C, //HANGUL SYLLABLE NIEUN O NIEUN
+ 0xB3EE: 0xB180, //HANGUL SYLLABLE NIEUN O RIEUL
+ 0xB3EF: 0xB182, //HANGUL SYLLABLE NIEUN O RIEULMIEUM
+ 0xB3F0: 0xB188, //HANGUL SYLLABLE NIEUN O MIEUM
+ 0xB3F1: 0xB189, //HANGUL SYLLABLE NIEUN O PIEUP
+ 0xB3F2: 0xB18B, //HANGUL SYLLABLE NIEUN O SIOS
+ 0xB3F3: 0xB18D, //HANGUL SYLLABLE NIEUN O IEUNG
+ 0xB3F4: 0xB192, //HANGUL SYLLABLE NIEUN O PHIEUPH
+ 0xB3F5: 0xB193, //HANGUL SYLLABLE NIEUN O HIEUH
+ 0xB3F6: 0xB194, //HANGUL SYLLABLE NIEUN WA
+ 0xB3F7: 0xB198, //HANGUL SYLLABLE NIEUN WA NIEUN
+ 0xB3F8: 0xB19C, //HANGUL SYLLABLE NIEUN WA RIEUL
+ 0xB3F9: 0xB1A8, //HANGUL SYLLABLE NIEUN WA SSANGSIOS
+ 0xB3FA: 0xB1CC, //HANGUL SYLLABLE NIEUN OE
+ 0xB3FB: 0xB1D0, //HANGUL SYLLABLE NIEUN OE NIEUN
+ 0xB3FC: 0xB1D4, //HANGUL SYLLABLE NIEUN OE RIEUL
+ 0xB3FD: 0xB1DC, //HANGUL SYLLABLE NIEUN OE MIEUM
+ 0xB3FE: 0xB1DD, //HANGUL SYLLABLE NIEUN OE PIEUP
+ 0xB441: 0xD02E, //HANGUL SYLLABLE KHIEUKH WE CIEUC
+ 0xB442: 0xD02F, //HANGUL SYLLABLE KHIEUKH WE CHIEUCH
+ 0xB443: 0xD030, //HANGUL SYLLABLE KHIEUKH WE KHIEUKH
+ 0xB444: 0xD031, //HANGUL SYLLABLE KHIEUKH WE THIEUTH
+ 0xB445: 0xD032, //HANGUL SYLLABLE KHIEUKH WE PHIEUPH
+ 0xB446: 0xD033, //HANGUL SYLLABLE KHIEUKH WE HIEUH
+ 0xB447: 0xD036, //HANGUL SYLLABLE KHIEUKH WI SSANGKIYEOK
+ 0xB448: 0xD037, //HANGUL SYLLABLE KHIEUKH WI KIYEOKSIOS
+ 0xB449: 0xD039, //HANGUL SYLLABLE KHIEUKH WI NIEUNCIEUC
+ 0xB44A: 0xD03A, //HANGUL SYLLABLE KHIEUKH WI NIEUNHIEUH
+ 0xB44B: 0xD03B, //HANGUL SYLLABLE KHIEUKH WI TIKEUT
+ 0xB44C: 0xD03D, //HANGUL SYLLABLE KHIEUKH WI RIEULKIYEOK
+ 0xB44D: 0xD03E, //HANGUL SYLLABLE KHIEUKH WI RIEULMIEUM
+ 0xB44E: 0xD03F, //HANGUL SYLLABLE KHIEUKH WI RIEULPIEUP
+ 0xB44F: 0xD040, //HANGUL SYLLABLE KHIEUKH WI RIEULSIOS
+ 0xB450: 0xD041, //HANGUL SYLLABLE KHIEUKH WI RIEULTHIEUTH
+ 0xB451: 0xD042, //HANGUL SYLLABLE KHIEUKH WI RIEULPHIEUPH
+ 0xB452: 0xD043, //HANGUL SYLLABLE KHIEUKH WI RIEULHIEUH
+ 0xB453: 0xD046, //HANGUL SYLLABLE KHIEUKH WI PIEUPSIOS
+ 0xB454: 0xD048, //HANGUL SYLLABLE KHIEUKH WI SSANGSIOS
+ 0xB455: 0xD04A, //HANGUL SYLLABLE KHIEUKH WI CIEUC
+ 0xB456: 0xD04B, //HANGUL SYLLABLE KHIEUKH WI CHIEUCH
+ 0xB457: 0xD04C, //HANGUL SYLLABLE KHIEUKH WI KHIEUKH
+ 0xB458: 0xD04D, //HANGUL SYLLABLE KHIEUKH WI THIEUTH
+ 0xB459: 0xD04E, //HANGUL SYLLABLE KHIEUKH WI PHIEUPH
+ 0xB45A: 0xD04F, //HANGUL SYLLABLE KHIEUKH WI HIEUH
+ 0xB461: 0xD051, //HANGUL SYLLABLE KHIEUKH YU KIYEOK
+ 0xB462: 0xD052, //HANGUL SYLLABLE KHIEUKH YU SSANGKIYEOK
+ 0xB463: 0xD053, //HANGUL SYLLABLE KHIEUKH YU KIYEOKSIOS
+ 0xB464: 0xD055, //HANGUL SYLLABLE KHIEUKH YU NIEUNCIEUC
+ 0xB465: 0xD056, //HANGUL SYLLABLE KHIEUKH YU NIEUNHIEUH
+ 0xB466: 0xD057, //HANGUL SYLLABLE KHIEUKH YU TIKEUT
+ 0xB467: 0xD059, //HANGUL SYLLABLE KHIEUKH YU RIEULKIYEOK
+ 0xB468: 0xD05A, //HANGUL SYLLABLE KHIEUKH YU RIEULMIEUM
+ 0xB469: 0xD05B, //HANGUL SYLLABLE KHIEUKH YU RIEULPIEUP
+ 0xB46A: 0xD05C, //HANGUL SYLLABLE KHIEUKH YU RIEULSIOS
+ 0xB46B: 0xD05D, //HANGUL SYLLABLE KHIEUKH YU RIEULTHIEUTH
+ 0xB46C: 0xD05E, //HANGUL SYLLABLE KHIEUKH YU RIEULPHIEUPH
+ 0xB46D: 0xD05F, //HANGUL SYLLABLE KHIEUKH YU RIEULHIEUH
+ 0xB46E: 0xD061, //HANGUL SYLLABLE KHIEUKH YU PIEUP
+ 0xB46F: 0xD062, //HANGUL SYLLABLE KHIEUKH YU PIEUPSIOS
+ 0xB470: 0xD063, //HANGUL SYLLABLE KHIEUKH YU SIOS
+ 0xB471: 0xD064, //HANGUL SYLLABLE KHIEUKH YU SSANGSIOS
+ 0xB472: 0xD065, //HANGUL SYLLABLE KHIEUKH YU IEUNG
+ 0xB473: 0xD066, //HANGUL SYLLABLE KHIEUKH YU CIEUC
+ 0xB474: 0xD067, //HANGUL SYLLABLE KHIEUKH YU CHIEUCH
+ 0xB475: 0xD068, //HANGUL SYLLABLE KHIEUKH YU KHIEUKH
+ 0xB476: 0xD069, //HANGUL SYLLABLE KHIEUKH YU THIEUTH
+ 0xB477: 0xD06A, //HANGUL SYLLABLE KHIEUKH YU PHIEUPH
+ 0xB478: 0xD06B, //HANGUL SYLLABLE KHIEUKH YU HIEUH
+ 0xB479: 0xD06E, //HANGUL SYLLABLE KHIEUKH EU SSANGKIYEOK
+ 0xB47A: 0xD06F, //HANGUL SYLLABLE KHIEUKH EU KIYEOKSIOS
+ 0xB481: 0xD071, //HANGUL SYLLABLE KHIEUKH EU NIEUNCIEUC
+ 0xB482: 0xD072, //HANGUL SYLLABLE KHIEUKH EU NIEUNHIEUH
+ 0xB483: 0xD073, //HANGUL SYLLABLE KHIEUKH EU TIKEUT
+ 0xB484: 0xD075, //HANGUL SYLLABLE KHIEUKH EU RIEULKIYEOK
+ 0xB485: 0xD076, //HANGUL SYLLABLE KHIEUKH EU RIEULMIEUM
+ 0xB486: 0xD077, //HANGUL SYLLABLE KHIEUKH EU RIEULPIEUP
+ 0xB487: 0xD078, //HANGUL SYLLABLE KHIEUKH EU RIEULSIOS
+ 0xB488: 0xD079, //HANGUL SYLLABLE KHIEUKH EU RIEULTHIEUTH
+ 0xB489: 0xD07A, //HANGUL SYLLABLE KHIEUKH EU RIEULPHIEUPH
+ 0xB48A: 0xD07B, //HANGUL SYLLABLE KHIEUKH EU RIEULHIEUH
+ 0xB48B: 0xD07E, //HANGUL SYLLABLE KHIEUKH EU PIEUPSIOS
+ 0xB48C: 0xD07F, //HANGUL SYLLABLE KHIEUKH EU SIOS
+ 0xB48D: 0xD080, //HANGUL SYLLABLE KHIEUKH EU SSANGSIOS
+ 0xB48E: 0xD082, //HANGUL SYLLABLE KHIEUKH EU CIEUC
+ 0xB48F: 0xD083, //HANGUL SYLLABLE KHIEUKH EU CHIEUCH
+ 0xB490: 0xD084, //HANGUL SYLLABLE KHIEUKH EU KHIEUKH
+ 0xB491: 0xD085, //HANGUL SYLLABLE KHIEUKH EU THIEUTH
+ 0xB492: 0xD086, //HANGUL SYLLABLE KHIEUKH EU PHIEUPH
+ 0xB493: 0xD087, //HANGUL SYLLABLE KHIEUKH EU HIEUH
+ 0xB494: 0xD088, //HANGUL SYLLABLE KHIEUKH YI
+ 0xB495: 0xD089, //HANGUL SYLLABLE KHIEUKH YI KIYEOK
+ 0xB496: 0xD08A, //HANGUL SYLLABLE KHIEUKH YI SSANGKIYEOK
+ 0xB497: 0xD08B, //HANGUL SYLLABLE KHIEUKH YI KIYEOKSIOS
+ 0xB498: 0xD08C, //HANGUL SYLLABLE KHIEUKH YI NIEUN
+ 0xB499: 0xD08D, //HANGUL SYLLABLE KHIEUKH YI NIEUNCIEUC
+ 0xB49A: 0xD08E, //HANGUL SYLLABLE KHIEUKH YI NIEUNHIEUH
+ 0xB49B: 0xD08F, //HANGUL SYLLABLE KHIEUKH YI TIKEUT
+ 0xB49C: 0xD090, //HANGUL SYLLABLE KHIEUKH YI RIEUL
+ 0xB49D: 0xD091, //HANGUL SYLLABLE KHIEUKH YI RIEULKIYEOK
+ 0xB49E: 0xD092, //HANGUL SYLLABLE KHIEUKH YI RIEULMIEUM
+ 0xB49F: 0xD093, //HANGUL SYLLABLE KHIEUKH YI RIEULPIEUP
+ 0xB4A0: 0xD094, //HANGUL SYLLABLE KHIEUKH YI RIEULSIOS
+ 0xB4A1: 0xB1DF, //HANGUL SYLLABLE NIEUN OE SIOS
+ 0xB4A2: 0xB1E8, //HANGUL SYLLABLE NIEUN YO
+ 0xB4A3: 0xB1E9, //HANGUL SYLLABLE NIEUN YO KIYEOK
+ 0xB4A4: 0xB1EC, //HANGUL SYLLABLE NIEUN YO NIEUN
+ 0xB4A5: 0xB1F0, //HANGUL SYLLABLE NIEUN YO RIEUL
+ 0xB4A6: 0xB1F9, //HANGUL SYLLABLE NIEUN YO PIEUP
+ 0xB4A7: 0xB1FB, //HANGUL SYLLABLE NIEUN YO SIOS
+ 0xB4A8: 0xB1FD, //HANGUL SYLLABLE NIEUN YO IEUNG
+ 0xB4A9: 0xB204, //HANGUL SYLLABLE NIEUN U
+ 0xB4AA: 0xB205, //HANGUL SYLLABLE NIEUN U KIYEOK
+ 0xB4AB: 0xB208, //HANGUL SYLLABLE NIEUN U NIEUN
+ 0xB4AC: 0xB20B, //HANGUL SYLLABLE NIEUN U TIKEUT
+ 0xB4AD: 0xB20C, //HANGUL SYLLABLE NIEUN U RIEUL
+ 0xB4AE: 0xB214, //HANGUL SYLLABLE NIEUN U MIEUM
+ 0xB4AF: 0xB215, //HANGUL SYLLABLE NIEUN U PIEUP
+ 0xB4B0: 0xB217, //HANGUL SYLLABLE NIEUN U SIOS
+ 0xB4B1: 0xB219, //HANGUL SYLLABLE NIEUN U IEUNG
+ 0xB4B2: 0xB220, //HANGUL SYLLABLE NIEUN WEO
+ 0xB4B3: 0xB234, //HANGUL SYLLABLE NIEUN WEO SSANGSIOS
+ 0xB4B4: 0xB23C, //HANGUL SYLLABLE NIEUN WE
+ 0xB4B5: 0xB258, //HANGUL SYLLABLE NIEUN WI
+ 0xB4B6: 0xB25C, //HANGUL SYLLABLE NIEUN WI NIEUN
+ 0xB4B7: 0xB260, //HANGUL SYLLABLE NIEUN WI RIEUL
+ 0xB4B8: 0xB268, //HANGUL SYLLABLE NIEUN WI MIEUM
+ 0xB4B9: 0xB269, //HANGUL SYLLABLE NIEUN WI PIEUP
+ 0xB4BA: 0xB274, //HANGUL SYLLABLE NIEUN YU
+ 0xB4BB: 0xB275, //HANGUL SYLLABLE NIEUN YU KIYEOK
+ 0xB4BC: 0xB27C, //HANGUL SYLLABLE NIEUN YU RIEUL
+ 0xB4BD: 0xB284, //HANGUL SYLLABLE NIEUN YU MIEUM
+ 0xB4BE: 0xB285, //HANGUL SYLLABLE NIEUN YU PIEUP
+ 0xB4BF: 0xB289, //HANGUL SYLLABLE NIEUN YU IEUNG
+ 0xB4C0: 0xB290, //HANGUL SYLLABLE NIEUN EU
+ 0xB4C1: 0xB291, //HANGUL SYLLABLE NIEUN EU KIYEOK
+ 0xB4C2: 0xB294, //HANGUL SYLLABLE NIEUN EU NIEUN
+ 0xB4C3: 0xB298, //HANGUL SYLLABLE NIEUN EU RIEUL
+ 0xB4C4: 0xB299, //HANGUL SYLLABLE NIEUN EU RIEULKIYEOK
+ 0xB4C5: 0xB29A, //HANGUL SYLLABLE NIEUN EU RIEULMIEUM
+ 0xB4C6: 0xB2A0, //HANGUL SYLLABLE NIEUN EU MIEUM
+ 0xB4C7: 0xB2A1, //HANGUL SYLLABLE NIEUN EU PIEUP
+ 0xB4C8: 0xB2A3, //HANGUL SYLLABLE NIEUN EU SIOS
+ 0xB4C9: 0xB2A5, //HANGUL SYLLABLE NIEUN EU IEUNG
+ 0xB4CA: 0xB2A6, //HANGUL SYLLABLE NIEUN EU CIEUC
+ 0xB4CB: 0xB2AA, //HANGUL SYLLABLE NIEUN EU PHIEUPH
+ 0xB4CC: 0xB2AC, //HANGUL SYLLABLE NIEUN YI
+ 0xB4CD: 0xB2B0, //HANGUL SYLLABLE NIEUN YI NIEUN
+ 0xB4CE: 0xB2B4, //HANGUL SYLLABLE NIEUN YI RIEUL
+ 0xB4CF: 0xB2C8, //HANGUL SYLLABLE NIEUN I
+ 0xB4D0: 0xB2C9, //HANGUL SYLLABLE NIEUN I KIYEOK
+ 0xB4D1: 0xB2CC, //HANGUL SYLLABLE NIEUN I NIEUN
+ 0xB4D2: 0xB2D0, //HANGUL SYLLABLE NIEUN I RIEUL
+ 0xB4D3: 0xB2D2, //HANGUL SYLLABLE NIEUN I RIEULMIEUM
+ 0xB4D4: 0xB2D8, //HANGUL SYLLABLE NIEUN I MIEUM
+ 0xB4D5: 0xB2D9, //HANGUL SYLLABLE NIEUN I PIEUP
+ 0xB4D6: 0xB2DB, //HANGUL SYLLABLE NIEUN I SIOS
+ 0xB4D7: 0xB2DD, //HANGUL SYLLABLE NIEUN I IEUNG
+ 0xB4D8: 0xB2E2, //HANGUL SYLLABLE NIEUN I PHIEUPH
+ 0xB4D9: 0xB2E4, //HANGUL SYLLABLE TIKEUT A
+ 0xB4DA: 0xB2E5, //HANGUL SYLLABLE TIKEUT A KIYEOK
+ 0xB4DB: 0xB2E6, //HANGUL SYLLABLE TIKEUT A SSANGKIYEOK
+ 0xB4DC: 0xB2E8, //HANGUL SYLLABLE TIKEUT A NIEUN
+ 0xB4DD: 0xB2EB, //HANGUL SYLLABLE TIKEUT A TIKEUT
+ 0xB4DE: 0xB2EC, //HANGUL SYLLABLE TIKEUT A RIEUL
+ 0xB4DF: 0xB2ED, //HANGUL SYLLABLE TIKEUT A RIEULKIYEOK
+ 0xB4E0: 0xB2EE, //HANGUL SYLLABLE TIKEUT A RIEULMIEUM
+ 0xB4E1: 0xB2EF, //HANGUL SYLLABLE TIKEUT A RIEULPIEUP
+ 0xB4E2: 0xB2F3, //HANGUL SYLLABLE TIKEUT A RIEULHIEUH
+ 0xB4E3: 0xB2F4, //HANGUL SYLLABLE TIKEUT A MIEUM
+ 0xB4E4: 0xB2F5, //HANGUL SYLLABLE TIKEUT A PIEUP
+ 0xB4E5: 0xB2F7, //HANGUL SYLLABLE TIKEUT A SIOS
+ 0xB4E6: 0xB2F8, //HANGUL SYLLABLE TIKEUT A SSANGSIOS
+ 0xB4E7: 0xB2F9, //HANGUL SYLLABLE TIKEUT A IEUNG
+ 0xB4E8: 0xB2FA, //HANGUL SYLLABLE TIKEUT A CIEUC
+ 0xB4E9: 0xB2FB, //HANGUL SYLLABLE TIKEUT A CHIEUCH
+ 0xB4EA: 0xB2FF, //HANGUL SYLLABLE TIKEUT A HIEUH
+ 0xB4EB: 0xB300, //HANGUL SYLLABLE TIKEUT AE
+ 0xB4EC: 0xB301, //HANGUL SYLLABLE TIKEUT AE KIYEOK
+ 0xB4ED: 0xB304, //HANGUL SYLLABLE TIKEUT AE NIEUN
+ 0xB4EE: 0xB308, //HANGUL SYLLABLE TIKEUT AE RIEUL
+ 0xB4EF: 0xB310, //HANGUL SYLLABLE TIKEUT AE MIEUM
+ 0xB4F0: 0xB311, //HANGUL SYLLABLE TIKEUT AE PIEUP
+ 0xB4F1: 0xB313, //HANGUL SYLLABLE TIKEUT AE SIOS
+ 0xB4F2: 0xB314, //HANGUL SYLLABLE TIKEUT AE SSANGSIOS
+ 0xB4F3: 0xB315, //HANGUL SYLLABLE TIKEUT AE IEUNG
+ 0xB4F4: 0xB31C, //HANGUL SYLLABLE TIKEUT YA
+ 0xB4F5: 0xB354, //HANGUL SYLLABLE TIKEUT EO
+ 0xB4F6: 0xB355, //HANGUL SYLLABLE TIKEUT EO KIYEOK
+ 0xB4F7: 0xB356, //HANGUL SYLLABLE TIKEUT EO SSANGKIYEOK
+ 0xB4F8: 0xB358, //HANGUL SYLLABLE TIKEUT EO NIEUN
+ 0xB4F9: 0xB35B, //HANGUL SYLLABLE TIKEUT EO TIKEUT
+ 0xB4FA: 0xB35C, //HANGUL SYLLABLE TIKEUT EO RIEUL
+ 0xB4FB: 0xB35E, //HANGUL SYLLABLE TIKEUT EO RIEULMIEUM
+ 0xB4FC: 0xB35F, //HANGUL SYLLABLE TIKEUT EO RIEULPIEUP
+ 0xB4FD: 0xB364, //HANGUL SYLLABLE TIKEUT EO MIEUM
+ 0xB4FE: 0xB365, //HANGUL SYLLABLE TIKEUT EO PIEUP
+ 0xB541: 0xD095, //HANGUL SYLLABLE KHIEUKH YI RIEULTHIEUTH
+ 0xB542: 0xD096, //HANGUL SYLLABLE KHIEUKH YI RIEULPHIEUPH
+ 0xB543: 0xD097, //HANGUL SYLLABLE KHIEUKH YI RIEULHIEUH
+ 0xB544: 0xD098, //HANGUL SYLLABLE KHIEUKH YI MIEUM
+ 0xB545: 0xD099, //HANGUL SYLLABLE KHIEUKH YI PIEUP
+ 0xB546: 0xD09A, //HANGUL SYLLABLE KHIEUKH YI PIEUPSIOS
+ 0xB547: 0xD09B, //HANGUL SYLLABLE KHIEUKH YI SIOS
+ 0xB548: 0xD09C, //HANGUL SYLLABLE KHIEUKH YI SSANGSIOS
+ 0xB549: 0xD09D, //HANGUL SYLLABLE KHIEUKH YI IEUNG
+ 0xB54A: 0xD09E, //HANGUL SYLLABLE KHIEUKH YI CIEUC
+ 0xB54B: 0xD09F, //HANGUL SYLLABLE KHIEUKH YI CHIEUCH
+ 0xB54C: 0xD0A0, //HANGUL SYLLABLE KHIEUKH YI KHIEUKH
+ 0xB54D: 0xD0A1, //HANGUL SYLLABLE KHIEUKH YI THIEUTH
+ 0xB54E: 0xD0A2, //HANGUL SYLLABLE KHIEUKH YI PHIEUPH
+ 0xB54F: 0xD0A3, //HANGUL SYLLABLE KHIEUKH YI HIEUH
+ 0xB550: 0xD0A6, //HANGUL SYLLABLE KHIEUKH I SSANGKIYEOK
+ 0xB551: 0xD0A7, //HANGUL SYLLABLE KHIEUKH I KIYEOKSIOS
+ 0xB552: 0xD0A9, //HANGUL SYLLABLE KHIEUKH I NIEUNCIEUC
+ 0xB553: 0xD0AA, //HANGUL SYLLABLE KHIEUKH I NIEUNHIEUH
+ 0xB554: 0xD0AB, //HANGUL SYLLABLE KHIEUKH I TIKEUT
+ 0xB555: 0xD0AD, //HANGUL SYLLABLE KHIEUKH I RIEULKIYEOK
+ 0xB556: 0xD0AE, //HANGUL SYLLABLE KHIEUKH I RIEULMIEUM
+ 0xB557: 0xD0AF, //HANGUL SYLLABLE KHIEUKH I RIEULPIEUP
+ 0xB558: 0xD0B0, //HANGUL SYLLABLE KHIEUKH I RIEULSIOS
+ 0xB559: 0xD0B1, //HANGUL SYLLABLE KHIEUKH I RIEULTHIEUTH
+ 0xB55A: 0xD0B2, //HANGUL SYLLABLE KHIEUKH I RIEULPHIEUPH
+ 0xB561: 0xD0B3, //HANGUL SYLLABLE KHIEUKH I RIEULHIEUH
+ 0xB562: 0xD0B6, //HANGUL SYLLABLE KHIEUKH I PIEUPSIOS
+ 0xB563: 0xD0B8, //HANGUL SYLLABLE KHIEUKH I SSANGSIOS
+ 0xB564: 0xD0BA, //HANGUL SYLLABLE KHIEUKH I CIEUC
+ 0xB565: 0xD0BB, //HANGUL SYLLABLE KHIEUKH I CHIEUCH
+ 0xB566: 0xD0BC, //HANGUL SYLLABLE KHIEUKH I KHIEUKH
+ 0xB567: 0xD0BD, //HANGUL SYLLABLE KHIEUKH I THIEUTH
+ 0xB568: 0xD0BE, //HANGUL SYLLABLE KHIEUKH I PHIEUPH
+ 0xB569: 0xD0BF, //HANGUL SYLLABLE KHIEUKH I HIEUH
+ 0xB56A: 0xD0C2, //HANGUL SYLLABLE THIEUTH A SSANGKIYEOK
+ 0xB56B: 0xD0C3, //HANGUL SYLLABLE THIEUTH A KIYEOKSIOS
+ 0xB56C: 0xD0C5, //HANGUL SYLLABLE THIEUTH A NIEUNCIEUC
+ 0xB56D: 0xD0C6, //HANGUL SYLLABLE THIEUTH A NIEUNHIEUH
+ 0xB56E: 0xD0C7, //HANGUL SYLLABLE THIEUTH A TIKEUT
+ 0xB56F: 0xD0CA, //HANGUL SYLLABLE THIEUTH A RIEULMIEUM
+ 0xB570: 0xD0CB, //HANGUL SYLLABLE THIEUTH A RIEULPIEUP
+ 0xB571: 0xD0CC, //HANGUL SYLLABLE THIEUTH A RIEULSIOS
+ 0xB572: 0xD0CD, //HANGUL SYLLABLE THIEUTH A RIEULTHIEUTH
+ 0xB573: 0xD0CE, //HANGUL SYLLABLE THIEUTH A RIEULPHIEUPH
+ 0xB574: 0xD0CF, //HANGUL SYLLABLE THIEUTH A RIEULHIEUH
+ 0xB575: 0xD0D2, //HANGUL SYLLABLE THIEUTH A PIEUPSIOS
+ 0xB576: 0xD0D6, //HANGUL SYLLABLE THIEUTH A CIEUC
+ 0xB577: 0xD0D7, //HANGUL SYLLABLE THIEUTH A CHIEUCH
+ 0xB578: 0xD0D8, //HANGUL SYLLABLE THIEUTH A KHIEUKH
+ 0xB579: 0xD0D9, //HANGUL SYLLABLE THIEUTH A THIEUTH
+ 0xB57A: 0xD0DA, //HANGUL SYLLABLE THIEUTH A PHIEUPH
+ 0xB581: 0xD0DB, //HANGUL SYLLABLE THIEUTH A HIEUH
+ 0xB582: 0xD0DE, //HANGUL SYLLABLE THIEUTH AE SSANGKIYEOK
+ 0xB583: 0xD0DF, //HANGUL SYLLABLE THIEUTH AE KIYEOKSIOS
+ 0xB584: 0xD0E1, //HANGUL SYLLABLE THIEUTH AE NIEUNCIEUC
+ 0xB585: 0xD0E2, //HANGUL SYLLABLE THIEUTH AE NIEUNHIEUH
+ 0xB586: 0xD0E3, //HANGUL SYLLABLE THIEUTH AE TIKEUT
+ 0xB587: 0xD0E5, //HANGUL SYLLABLE THIEUTH AE RIEULKIYEOK
+ 0xB588: 0xD0E6, //HANGUL SYLLABLE THIEUTH AE RIEULMIEUM
+ 0xB589: 0xD0E7, //HANGUL SYLLABLE THIEUTH AE RIEULPIEUP
+ 0xB58A: 0xD0E8, //HANGUL SYLLABLE THIEUTH AE RIEULSIOS
+ 0xB58B: 0xD0E9, //HANGUL SYLLABLE THIEUTH AE RIEULTHIEUTH
+ 0xB58C: 0xD0EA, //HANGUL SYLLABLE THIEUTH AE RIEULPHIEUPH
+ 0xB58D: 0xD0EB, //HANGUL SYLLABLE THIEUTH AE RIEULHIEUH
+ 0xB58E: 0xD0EE, //HANGUL SYLLABLE THIEUTH AE PIEUPSIOS
+ 0xB58F: 0xD0F2, //HANGUL SYLLABLE THIEUTH AE CIEUC
+ 0xB590: 0xD0F3, //HANGUL SYLLABLE THIEUTH AE CHIEUCH
+ 0xB591: 0xD0F4, //HANGUL SYLLABLE THIEUTH AE KHIEUKH
+ 0xB592: 0xD0F5, //HANGUL SYLLABLE THIEUTH AE THIEUTH
+ 0xB593: 0xD0F6, //HANGUL SYLLABLE THIEUTH AE PHIEUPH
+ 0xB594: 0xD0F7, //HANGUL SYLLABLE THIEUTH AE HIEUH
+ 0xB595: 0xD0F9, //HANGUL SYLLABLE THIEUTH YA KIYEOK
+ 0xB596: 0xD0FA, //HANGUL SYLLABLE THIEUTH YA SSANGKIYEOK
+ 0xB597: 0xD0FB, //HANGUL SYLLABLE THIEUTH YA KIYEOKSIOS
+ 0xB598: 0xD0FC, //HANGUL SYLLABLE THIEUTH YA NIEUN
+ 0xB599: 0xD0FD, //HANGUL SYLLABLE THIEUTH YA NIEUNCIEUC
+ 0xB59A: 0xD0FE, //HANGUL SYLLABLE THIEUTH YA NIEUNHIEUH
+ 0xB59B: 0xD0FF, //HANGUL SYLLABLE THIEUTH YA TIKEUT
+ 0xB59C: 0xD100, //HANGUL SYLLABLE THIEUTH YA RIEUL
+ 0xB59D: 0xD101, //HANGUL SYLLABLE THIEUTH YA RIEULKIYEOK
+ 0xB59E: 0xD102, //HANGUL SYLLABLE THIEUTH YA RIEULMIEUM
+ 0xB59F: 0xD103, //HANGUL SYLLABLE THIEUTH YA RIEULPIEUP
+ 0xB5A0: 0xD104, //HANGUL SYLLABLE THIEUTH YA RIEULSIOS
+ 0xB5A1: 0xB367, //HANGUL SYLLABLE TIKEUT EO SIOS
+ 0xB5A2: 0xB369, //HANGUL SYLLABLE TIKEUT EO IEUNG
+ 0xB5A3: 0xB36B, //HANGUL SYLLABLE TIKEUT EO CHIEUCH
+ 0xB5A4: 0xB36E, //HANGUL SYLLABLE TIKEUT EO PHIEUPH
+ 0xB5A5: 0xB370, //HANGUL SYLLABLE TIKEUT E
+ 0xB5A6: 0xB371, //HANGUL SYLLABLE TIKEUT E KIYEOK
+ 0xB5A7: 0xB374, //HANGUL SYLLABLE TIKEUT E NIEUN
+ 0xB5A8: 0xB378, //HANGUL SYLLABLE TIKEUT E RIEUL
+ 0xB5A9: 0xB380, //HANGUL SYLLABLE TIKEUT E MIEUM
+ 0xB5AA: 0xB381, //HANGUL SYLLABLE TIKEUT E PIEUP
+ 0xB5AB: 0xB383, //HANGUL SYLLABLE TIKEUT E SIOS
+ 0xB5AC: 0xB384, //HANGUL SYLLABLE TIKEUT E SSANGSIOS
+ 0xB5AD: 0xB385, //HANGUL SYLLABLE TIKEUT E IEUNG
+ 0xB5AE: 0xB38C, //HANGUL SYLLABLE TIKEUT YEO
+ 0xB5AF: 0xB390, //HANGUL SYLLABLE TIKEUT YEO NIEUN
+ 0xB5B0: 0xB394, //HANGUL SYLLABLE TIKEUT YEO RIEUL
+ 0xB5B1: 0xB3A0, //HANGUL SYLLABLE TIKEUT YEO SSANGSIOS
+ 0xB5B2: 0xB3A1, //HANGUL SYLLABLE TIKEUT YEO IEUNG
+ 0xB5B3: 0xB3A8, //HANGUL SYLLABLE TIKEUT YE
+ 0xB5B4: 0xB3AC, //HANGUL SYLLABLE TIKEUT YE NIEUN
+ 0xB5B5: 0xB3C4, //HANGUL SYLLABLE TIKEUT O
+ 0xB5B6: 0xB3C5, //HANGUL SYLLABLE TIKEUT O KIYEOK
+ 0xB5B7: 0xB3C8, //HANGUL SYLLABLE TIKEUT O NIEUN
+ 0xB5B8: 0xB3CB, //HANGUL SYLLABLE TIKEUT O TIKEUT
+ 0xB5B9: 0xB3CC, //HANGUL SYLLABLE TIKEUT O RIEUL
+ 0xB5BA: 0xB3CE, //HANGUL SYLLABLE TIKEUT O RIEULMIEUM
+ 0xB5BB: 0xB3D0, //HANGUL SYLLABLE TIKEUT O RIEULSIOS
+ 0xB5BC: 0xB3D4, //HANGUL SYLLABLE TIKEUT O MIEUM
+ 0xB5BD: 0xB3D5, //HANGUL SYLLABLE TIKEUT O PIEUP
+ 0xB5BE: 0xB3D7, //HANGUL SYLLABLE TIKEUT O SIOS
+ 0xB5BF: 0xB3D9, //HANGUL SYLLABLE TIKEUT O IEUNG
+ 0xB5C0: 0xB3DB, //HANGUL SYLLABLE TIKEUT O CHIEUCH
+ 0xB5C1: 0xB3DD, //HANGUL SYLLABLE TIKEUT O THIEUTH
+ 0xB5C2: 0xB3E0, //HANGUL SYLLABLE TIKEUT WA
+ 0xB5C3: 0xB3E4, //HANGUL SYLLABLE TIKEUT WA NIEUN
+ 0xB5C4: 0xB3E8, //HANGUL SYLLABLE TIKEUT WA RIEUL
+ 0xB5C5: 0xB3FC, //HANGUL SYLLABLE TIKEUT WAE
+ 0xB5C6: 0xB410, //HANGUL SYLLABLE TIKEUT WAE SSANGSIOS
+ 0xB5C7: 0xB418, //HANGUL SYLLABLE TIKEUT OE
+ 0xB5C8: 0xB41C, //HANGUL SYLLABLE TIKEUT OE NIEUN
+ 0xB5C9: 0xB420, //HANGUL SYLLABLE TIKEUT OE RIEUL
+ 0xB5CA: 0xB428, //HANGUL SYLLABLE TIKEUT OE MIEUM
+ 0xB5CB: 0xB429, //HANGUL SYLLABLE TIKEUT OE PIEUP
+ 0xB5CC: 0xB42B, //HANGUL SYLLABLE TIKEUT OE SIOS
+ 0xB5CD: 0xB434, //HANGUL SYLLABLE TIKEUT YO
+ 0xB5CE: 0xB450, //HANGUL SYLLABLE TIKEUT U
+ 0xB5CF: 0xB451, //HANGUL SYLLABLE TIKEUT U KIYEOK
+ 0xB5D0: 0xB454, //HANGUL SYLLABLE TIKEUT U NIEUN
+ 0xB5D1: 0xB458, //HANGUL SYLLABLE TIKEUT U RIEUL
+ 0xB5D2: 0xB460, //HANGUL SYLLABLE TIKEUT U MIEUM
+ 0xB5D3: 0xB461, //HANGUL SYLLABLE TIKEUT U PIEUP
+ 0xB5D4: 0xB463, //HANGUL SYLLABLE TIKEUT U SIOS
+ 0xB5D5: 0xB465, //HANGUL SYLLABLE TIKEUT U IEUNG
+ 0xB5D6: 0xB46C, //HANGUL SYLLABLE TIKEUT WEO
+ 0xB5D7: 0xB480, //HANGUL SYLLABLE TIKEUT WEO SSANGSIOS
+ 0xB5D8: 0xB488, //HANGUL SYLLABLE TIKEUT WE
+ 0xB5D9: 0xB49D, //HANGUL SYLLABLE TIKEUT WE IEUNG
+ 0xB5DA: 0xB4A4, //HANGUL SYLLABLE TIKEUT WI
+ 0xB5DB: 0xB4A8, //HANGUL SYLLABLE TIKEUT WI NIEUN
+ 0xB5DC: 0xB4AC, //HANGUL SYLLABLE TIKEUT WI RIEUL
+ 0xB5DD: 0xB4B5, //HANGUL SYLLABLE TIKEUT WI PIEUP
+ 0xB5DE: 0xB4B7, //HANGUL SYLLABLE TIKEUT WI SIOS
+ 0xB5DF: 0xB4B9, //HANGUL SYLLABLE TIKEUT WI IEUNG
+ 0xB5E0: 0xB4C0, //HANGUL SYLLABLE TIKEUT YU
+ 0xB5E1: 0xB4C4, //HANGUL SYLLABLE TIKEUT YU NIEUN
+ 0xB5E2: 0xB4C8, //HANGUL SYLLABLE TIKEUT YU RIEUL
+ 0xB5E3: 0xB4D0, //HANGUL SYLLABLE TIKEUT YU MIEUM
+ 0xB5E4: 0xB4D5, //HANGUL SYLLABLE TIKEUT YU IEUNG
+ 0xB5E5: 0xB4DC, //HANGUL SYLLABLE TIKEUT EU
+ 0xB5E6: 0xB4DD, //HANGUL SYLLABLE TIKEUT EU KIYEOK
+ 0xB5E7: 0xB4E0, //HANGUL SYLLABLE TIKEUT EU NIEUN
+ 0xB5E8: 0xB4E3, //HANGUL SYLLABLE TIKEUT EU TIKEUT
+ 0xB5E9: 0xB4E4, //HANGUL SYLLABLE TIKEUT EU RIEUL
+ 0xB5EA: 0xB4E6, //HANGUL SYLLABLE TIKEUT EU RIEULMIEUM
+ 0xB5EB: 0xB4EC, //HANGUL SYLLABLE TIKEUT EU MIEUM
+ 0xB5EC: 0xB4ED, //HANGUL SYLLABLE TIKEUT EU PIEUP
+ 0xB5ED: 0xB4EF, //HANGUL SYLLABLE TIKEUT EU SIOS
+ 0xB5EE: 0xB4F1, //HANGUL SYLLABLE TIKEUT EU IEUNG
+ 0xB5EF: 0xB4F8, //HANGUL SYLLABLE TIKEUT YI
+ 0xB5F0: 0xB514, //HANGUL SYLLABLE TIKEUT I
+ 0xB5F1: 0xB515, //HANGUL SYLLABLE TIKEUT I KIYEOK
+ 0xB5F2: 0xB518, //HANGUL SYLLABLE TIKEUT I NIEUN
+ 0xB5F3: 0xB51B, //HANGUL SYLLABLE TIKEUT I TIKEUT
+ 0xB5F4: 0xB51C, //HANGUL SYLLABLE TIKEUT I RIEUL
+ 0xB5F5: 0xB524, //HANGUL SYLLABLE TIKEUT I MIEUM
+ 0xB5F6: 0xB525, //HANGUL SYLLABLE TIKEUT I PIEUP
+ 0xB5F7: 0xB527, //HANGUL SYLLABLE TIKEUT I SIOS
+ 0xB5F8: 0xB528, //HANGUL SYLLABLE TIKEUT I SSANGSIOS
+ 0xB5F9: 0xB529, //HANGUL SYLLABLE TIKEUT I IEUNG
+ 0xB5FA: 0xB52A, //HANGUL SYLLABLE TIKEUT I CIEUC
+ 0xB5FB: 0xB530, //HANGUL SYLLABLE SSANGTIKEUT A
+ 0xB5FC: 0xB531, //HANGUL SYLLABLE SSANGTIKEUT A KIYEOK
+ 0xB5FD: 0xB534, //HANGUL SYLLABLE SSANGTIKEUT A NIEUN
+ 0xB5FE: 0xB538, //HANGUL SYLLABLE SSANGTIKEUT A RIEUL
+ 0xB641: 0xD105, //HANGUL SYLLABLE THIEUTH YA RIEULTHIEUTH
+ 0xB642: 0xD106, //HANGUL SYLLABLE THIEUTH YA RIEULPHIEUPH
+ 0xB643: 0xD107, //HANGUL SYLLABLE THIEUTH YA RIEULHIEUH
+ 0xB644: 0xD108, //HANGUL SYLLABLE THIEUTH YA MIEUM
+ 0xB645: 0xD109, //HANGUL SYLLABLE THIEUTH YA PIEUP
+ 0xB646: 0xD10A, //HANGUL SYLLABLE THIEUTH YA PIEUPSIOS
+ 0xB647: 0xD10B, //HANGUL SYLLABLE THIEUTH YA SIOS
+ 0xB648: 0xD10C, //HANGUL SYLLABLE THIEUTH YA SSANGSIOS
+ 0xB649: 0xD10E, //HANGUL SYLLABLE THIEUTH YA CIEUC
+ 0xB64A: 0xD10F, //HANGUL SYLLABLE THIEUTH YA CHIEUCH
+ 0xB64B: 0xD110, //HANGUL SYLLABLE THIEUTH YA KHIEUKH
+ 0xB64C: 0xD111, //HANGUL SYLLABLE THIEUTH YA THIEUTH
+ 0xB64D: 0xD112, //HANGUL SYLLABLE THIEUTH YA PHIEUPH
+ 0xB64E: 0xD113, //HANGUL SYLLABLE THIEUTH YA HIEUH
+ 0xB64F: 0xD114, //HANGUL SYLLABLE THIEUTH YAE
+ 0xB650: 0xD115, //HANGUL SYLLABLE THIEUTH YAE KIYEOK
+ 0xB651: 0xD116, //HANGUL SYLLABLE THIEUTH YAE SSANGKIYEOK
+ 0xB652: 0xD117, //HANGUL SYLLABLE THIEUTH YAE KIYEOKSIOS
+ 0xB653: 0xD118, //HANGUL SYLLABLE THIEUTH YAE NIEUN
+ 0xB654: 0xD119, //HANGUL SYLLABLE THIEUTH YAE NIEUNCIEUC
+ 0xB655: 0xD11A, //HANGUL SYLLABLE THIEUTH YAE NIEUNHIEUH
+ 0xB656: 0xD11B, //HANGUL SYLLABLE THIEUTH YAE TIKEUT
+ 0xB657: 0xD11C, //HANGUL SYLLABLE THIEUTH YAE RIEUL
+ 0xB658: 0xD11D, //HANGUL SYLLABLE THIEUTH YAE RIEULKIYEOK
+ 0xB659: 0xD11E, //HANGUL SYLLABLE THIEUTH YAE RIEULMIEUM
+ 0xB65A: 0xD11F, //HANGUL SYLLABLE THIEUTH YAE RIEULPIEUP
+ 0xB661: 0xD120, //HANGUL SYLLABLE THIEUTH YAE RIEULSIOS
+ 0xB662: 0xD121, //HANGUL SYLLABLE THIEUTH YAE RIEULTHIEUTH
+ 0xB663: 0xD122, //HANGUL SYLLABLE THIEUTH YAE RIEULPHIEUPH
+ 0xB664: 0xD123, //HANGUL SYLLABLE THIEUTH YAE RIEULHIEUH
+ 0xB665: 0xD124, //HANGUL SYLLABLE THIEUTH YAE MIEUM
+ 0xB666: 0xD125, //HANGUL SYLLABLE THIEUTH YAE PIEUP
+ 0xB667: 0xD126, //HANGUL SYLLABLE THIEUTH YAE PIEUPSIOS
+ 0xB668: 0xD127, //HANGUL SYLLABLE THIEUTH YAE SIOS
+ 0xB669: 0xD128, //HANGUL SYLLABLE THIEUTH YAE SSANGSIOS
+ 0xB66A: 0xD129, //HANGUL SYLLABLE THIEUTH YAE IEUNG
+ 0xB66B: 0xD12A, //HANGUL SYLLABLE THIEUTH YAE CIEUC
+ 0xB66C: 0xD12B, //HANGUL SYLLABLE THIEUTH YAE CHIEUCH
+ 0xB66D: 0xD12C, //HANGUL SYLLABLE THIEUTH YAE KHIEUKH
+ 0xB66E: 0xD12D, //HANGUL SYLLABLE THIEUTH YAE THIEUTH
+ 0xB66F: 0xD12E, //HANGUL SYLLABLE THIEUTH YAE PHIEUPH
+ 0xB670: 0xD12F, //HANGUL SYLLABLE THIEUTH YAE HIEUH
+ 0xB671: 0xD132, //HANGUL SYLLABLE THIEUTH EO SSANGKIYEOK
+ 0xB672: 0xD133, //HANGUL SYLLABLE THIEUTH EO KIYEOKSIOS
+ 0xB673: 0xD135, //HANGUL SYLLABLE THIEUTH EO NIEUNCIEUC
+ 0xB674: 0xD136, //HANGUL SYLLABLE THIEUTH EO NIEUNHIEUH
+ 0xB675: 0xD137, //HANGUL SYLLABLE THIEUTH EO TIKEUT
+ 0xB676: 0xD139, //HANGUL SYLLABLE THIEUTH EO RIEULKIYEOK
+ 0xB677: 0xD13B, //HANGUL SYLLABLE THIEUTH EO RIEULPIEUP
+ 0xB678: 0xD13C, //HANGUL SYLLABLE THIEUTH EO RIEULSIOS
+ 0xB679: 0xD13D, //HANGUL SYLLABLE THIEUTH EO RIEULTHIEUTH
+ 0xB67A: 0xD13E, //HANGUL SYLLABLE THIEUTH EO RIEULPHIEUPH
+ 0xB681: 0xD13F, //HANGUL SYLLABLE THIEUTH EO RIEULHIEUH
+ 0xB682: 0xD142, //HANGUL SYLLABLE THIEUTH EO PIEUPSIOS
+ 0xB683: 0xD146, //HANGUL SYLLABLE THIEUTH EO CIEUC
+ 0xB684: 0xD147, //HANGUL SYLLABLE THIEUTH EO CHIEUCH
+ 0xB685: 0xD148, //HANGUL SYLLABLE THIEUTH EO KHIEUKH
+ 0xB686: 0xD149, //HANGUL SYLLABLE THIEUTH EO THIEUTH
+ 0xB687: 0xD14A, //HANGUL SYLLABLE THIEUTH EO PHIEUPH
+ 0xB688: 0xD14B, //HANGUL SYLLABLE THIEUTH EO HIEUH
+ 0xB689: 0xD14E, //HANGUL SYLLABLE THIEUTH E SSANGKIYEOK
+ 0xB68A: 0xD14F, //HANGUL SYLLABLE THIEUTH E KIYEOKSIOS
+ 0xB68B: 0xD151, //HANGUL SYLLABLE THIEUTH E NIEUNCIEUC
+ 0xB68C: 0xD152, //HANGUL SYLLABLE THIEUTH E NIEUNHIEUH
+ 0xB68D: 0xD153, //HANGUL SYLLABLE THIEUTH E TIKEUT
+ 0xB68E: 0xD155, //HANGUL SYLLABLE THIEUTH E RIEULKIYEOK
+ 0xB68F: 0xD156, //HANGUL SYLLABLE THIEUTH E RIEULMIEUM
+ 0xB690: 0xD157, //HANGUL SYLLABLE THIEUTH E RIEULPIEUP
+ 0xB691: 0xD158, //HANGUL SYLLABLE THIEUTH E RIEULSIOS
+ 0xB692: 0xD159, //HANGUL SYLLABLE THIEUTH E RIEULTHIEUTH
+ 0xB693: 0xD15A, //HANGUL SYLLABLE THIEUTH E RIEULPHIEUPH
+ 0xB694: 0xD15B, //HANGUL SYLLABLE THIEUTH E RIEULHIEUH
+ 0xB695: 0xD15E, //HANGUL SYLLABLE THIEUTH E PIEUPSIOS
+ 0xB696: 0xD160, //HANGUL SYLLABLE THIEUTH E SSANGSIOS
+ 0xB697: 0xD162, //HANGUL SYLLABLE THIEUTH E CIEUC
+ 0xB698: 0xD163, //HANGUL SYLLABLE THIEUTH E CHIEUCH
+ 0xB699: 0xD164, //HANGUL SYLLABLE THIEUTH E KHIEUKH
+ 0xB69A: 0xD165, //HANGUL SYLLABLE THIEUTH E THIEUTH
+ 0xB69B: 0xD166, //HANGUL SYLLABLE THIEUTH E PHIEUPH
+ 0xB69C: 0xD167, //HANGUL SYLLABLE THIEUTH E HIEUH
+ 0xB69D: 0xD169, //HANGUL SYLLABLE THIEUTH YEO KIYEOK
+ 0xB69E: 0xD16A, //HANGUL SYLLABLE THIEUTH YEO SSANGKIYEOK
+ 0xB69F: 0xD16B, //HANGUL SYLLABLE THIEUTH YEO KIYEOKSIOS
+ 0xB6A0: 0xD16D, //HANGUL SYLLABLE THIEUTH YEO NIEUNCIEUC
+ 0xB6A1: 0xB540, //HANGUL SYLLABLE SSANGTIKEUT A MIEUM
+ 0xB6A2: 0xB541, //HANGUL SYLLABLE SSANGTIKEUT A PIEUP
+ 0xB6A3: 0xB543, //HANGUL SYLLABLE SSANGTIKEUT A SIOS
+ 0xB6A4: 0xB544, //HANGUL SYLLABLE SSANGTIKEUT A SSANGSIOS
+ 0xB6A5: 0xB545, //HANGUL SYLLABLE SSANGTIKEUT A IEUNG
+ 0xB6A6: 0xB54B, //HANGUL SYLLABLE SSANGTIKEUT A HIEUH
+ 0xB6A7: 0xB54C, //HANGUL SYLLABLE SSANGTIKEUT AE
+ 0xB6A8: 0xB54D, //HANGUL SYLLABLE SSANGTIKEUT AE KIYEOK
+ 0xB6A9: 0xB550, //HANGUL SYLLABLE SSANGTIKEUT AE NIEUN
+ 0xB6AA: 0xB554, //HANGUL SYLLABLE SSANGTIKEUT AE RIEUL
+ 0xB6AB: 0xB55C, //HANGUL SYLLABLE SSANGTIKEUT AE MIEUM
+ 0xB6AC: 0xB55D, //HANGUL SYLLABLE SSANGTIKEUT AE PIEUP
+ 0xB6AD: 0xB55F, //HANGUL SYLLABLE SSANGTIKEUT AE SIOS
+ 0xB6AE: 0xB560, //HANGUL SYLLABLE SSANGTIKEUT AE SSANGSIOS
+ 0xB6AF: 0xB561, //HANGUL SYLLABLE SSANGTIKEUT AE IEUNG
+ 0xB6B0: 0xB5A0, //HANGUL SYLLABLE SSANGTIKEUT EO
+ 0xB6B1: 0xB5A1, //HANGUL SYLLABLE SSANGTIKEUT EO KIYEOK
+ 0xB6B2: 0xB5A4, //HANGUL SYLLABLE SSANGTIKEUT EO NIEUN
+ 0xB6B3: 0xB5A8, //HANGUL SYLLABLE SSANGTIKEUT EO RIEUL
+ 0xB6B4: 0xB5AA, //HANGUL SYLLABLE SSANGTIKEUT EO RIEULMIEUM
+ 0xB6B5: 0xB5AB, //HANGUL SYLLABLE SSANGTIKEUT EO RIEULPIEUP
+ 0xB6B6: 0xB5B0, //HANGUL SYLLABLE SSANGTIKEUT EO MIEUM
+ 0xB6B7: 0xB5B1, //HANGUL SYLLABLE SSANGTIKEUT EO PIEUP
+ 0xB6B8: 0xB5B3, //HANGUL SYLLABLE SSANGTIKEUT EO SIOS
+ 0xB6B9: 0xB5B4, //HANGUL SYLLABLE SSANGTIKEUT EO SSANGSIOS
+ 0xB6BA: 0xB5B5, //HANGUL SYLLABLE SSANGTIKEUT EO IEUNG
+ 0xB6BB: 0xB5BB, //HANGUL SYLLABLE SSANGTIKEUT EO HIEUH
+ 0xB6BC: 0xB5BC, //HANGUL SYLLABLE SSANGTIKEUT E
+ 0xB6BD: 0xB5BD, //HANGUL SYLLABLE SSANGTIKEUT E KIYEOK
+ 0xB6BE: 0xB5C0, //HANGUL SYLLABLE SSANGTIKEUT E NIEUN
+ 0xB6BF: 0xB5C4, //HANGUL SYLLABLE SSANGTIKEUT E RIEUL
+ 0xB6C0: 0xB5CC, //HANGUL SYLLABLE SSANGTIKEUT E MIEUM
+ 0xB6C1: 0xB5CD, //HANGUL SYLLABLE SSANGTIKEUT E PIEUP
+ 0xB6C2: 0xB5CF, //HANGUL SYLLABLE SSANGTIKEUT E SIOS
+ 0xB6C3: 0xB5D0, //HANGUL SYLLABLE SSANGTIKEUT E SSANGSIOS
+ 0xB6C4: 0xB5D1, //HANGUL SYLLABLE SSANGTIKEUT E IEUNG
+ 0xB6C5: 0xB5D8, //HANGUL SYLLABLE SSANGTIKEUT YEO
+ 0xB6C6: 0xB5EC, //HANGUL SYLLABLE SSANGTIKEUT YEO SSANGSIOS
+ 0xB6C7: 0xB610, //HANGUL SYLLABLE SSANGTIKEUT O
+ 0xB6C8: 0xB611, //HANGUL SYLLABLE SSANGTIKEUT O KIYEOK
+ 0xB6C9: 0xB614, //HANGUL SYLLABLE SSANGTIKEUT O NIEUN
+ 0xB6CA: 0xB618, //HANGUL SYLLABLE SSANGTIKEUT O RIEUL
+ 0xB6CB: 0xB625, //HANGUL SYLLABLE SSANGTIKEUT O IEUNG
+ 0xB6CC: 0xB62C, //HANGUL SYLLABLE SSANGTIKEUT WA
+ 0xB6CD: 0xB634, //HANGUL SYLLABLE SSANGTIKEUT WA RIEUL
+ 0xB6CE: 0xB648, //HANGUL SYLLABLE SSANGTIKEUT WAE
+ 0xB6CF: 0xB664, //HANGUL SYLLABLE SSANGTIKEUT OE
+ 0xB6D0: 0xB668, //HANGUL SYLLABLE SSANGTIKEUT OE NIEUN
+ 0xB6D1: 0xB69C, //HANGUL SYLLABLE SSANGTIKEUT U
+ 0xB6D2: 0xB69D, //HANGUL SYLLABLE SSANGTIKEUT U KIYEOK
+ 0xB6D3: 0xB6A0, //HANGUL SYLLABLE SSANGTIKEUT U NIEUN
+ 0xB6D4: 0xB6A4, //HANGUL SYLLABLE SSANGTIKEUT U RIEUL
+ 0xB6D5: 0xB6AB, //HANGUL SYLLABLE SSANGTIKEUT U RIEULHIEUH
+ 0xB6D6: 0xB6AC, //HANGUL SYLLABLE SSANGTIKEUT U MIEUM
+ 0xB6D7: 0xB6B1, //HANGUL SYLLABLE SSANGTIKEUT U IEUNG
+ 0xB6D8: 0xB6D4, //HANGUL SYLLABLE SSANGTIKEUT WE
+ 0xB6D9: 0xB6F0, //HANGUL SYLLABLE SSANGTIKEUT WI
+ 0xB6DA: 0xB6F4, //HANGUL SYLLABLE SSANGTIKEUT WI NIEUN
+ 0xB6DB: 0xB6F8, //HANGUL SYLLABLE SSANGTIKEUT WI RIEUL
+ 0xB6DC: 0xB700, //HANGUL SYLLABLE SSANGTIKEUT WI MIEUM
+ 0xB6DD: 0xB701, //HANGUL SYLLABLE SSANGTIKEUT WI PIEUP
+ 0xB6DE: 0xB705, //HANGUL SYLLABLE SSANGTIKEUT WI IEUNG
+ 0xB6DF: 0xB728, //HANGUL SYLLABLE SSANGTIKEUT EU
+ 0xB6E0: 0xB729, //HANGUL SYLLABLE SSANGTIKEUT EU KIYEOK
+ 0xB6E1: 0xB72C, //HANGUL SYLLABLE SSANGTIKEUT EU NIEUN
+ 0xB6E2: 0xB72F, //HANGUL SYLLABLE SSANGTIKEUT EU TIKEUT
+ 0xB6E3: 0xB730, //HANGUL SYLLABLE SSANGTIKEUT EU RIEUL
+ 0xB6E4: 0xB738, //HANGUL SYLLABLE SSANGTIKEUT EU MIEUM
+ 0xB6E5: 0xB739, //HANGUL SYLLABLE SSANGTIKEUT EU PIEUP
+ 0xB6E6: 0xB73B, //HANGUL SYLLABLE SSANGTIKEUT EU SIOS
+ 0xB6E7: 0xB744, //HANGUL SYLLABLE SSANGTIKEUT YI
+ 0xB6E8: 0xB748, //HANGUL SYLLABLE SSANGTIKEUT YI NIEUN
+ 0xB6E9: 0xB74C, //HANGUL SYLLABLE SSANGTIKEUT YI RIEUL
+ 0xB6EA: 0xB754, //HANGUL SYLLABLE SSANGTIKEUT YI MIEUM
+ 0xB6EB: 0xB755, //HANGUL SYLLABLE SSANGTIKEUT YI PIEUP
+ 0xB6EC: 0xB760, //HANGUL SYLLABLE SSANGTIKEUT I
+ 0xB6ED: 0xB764, //HANGUL SYLLABLE SSANGTIKEUT I NIEUN
+ 0xB6EE: 0xB768, //HANGUL SYLLABLE SSANGTIKEUT I RIEUL
+ 0xB6EF: 0xB770, //HANGUL SYLLABLE SSANGTIKEUT I MIEUM
+ 0xB6F0: 0xB771, //HANGUL SYLLABLE SSANGTIKEUT I PIEUP
+ 0xB6F1: 0xB773, //HANGUL SYLLABLE SSANGTIKEUT I SIOS
+ 0xB6F2: 0xB775, //HANGUL SYLLABLE SSANGTIKEUT I IEUNG
+ 0xB6F3: 0xB77C, //HANGUL SYLLABLE RIEUL A
+ 0xB6F4: 0xB77D, //HANGUL SYLLABLE RIEUL A KIYEOK
+ 0xB6F5: 0xB780, //HANGUL SYLLABLE RIEUL A NIEUN
+ 0xB6F6: 0xB784, //HANGUL SYLLABLE RIEUL A RIEUL
+ 0xB6F7: 0xB78C, //HANGUL SYLLABLE RIEUL A MIEUM
+ 0xB6F8: 0xB78D, //HANGUL SYLLABLE RIEUL A PIEUP
+ 0xB6F9: 0xB78F, //HANGUL SYLLABLE RIEUL A SIOS
+ 0xB6FA: 0xB790, //HANGUL SYLLABLE RIEUL A SSANGSIOS
+ 0xB6FB: 0xB791, //HANGUL SYLLABLE RIEUL A IEUNG
+ 0xB6FC: 0xB792, //HANGUL SYLLABLE RIEUL A CIEUC
+ 0xB6FD: 0xB796, //HANGUL SYLLABLE RIEUL A PHIEUPH
+ 0xB6FE: 0xB797, //HANGUL SYLLABLE RIEUL A HIEUH
+ 0xB741: 0xD16E, //HANGUL SYLLABLE THIEUTH YEO NIEUNHIEUH
+ 0xB742: 0xD16F, //HANGUL SYLLABLE THIEUTH YEO TIKEUT
+ 0xB743: 0xD170, //HANGUL SYLLABLE THIEUTH YEO RIEUL
+ 0xB744: 0xD171, //HANGUL SYLLABLE THIEUTH YEO RIEULKIYEOK
+ 0xB745: 0xD172, //HANGUL SYLLABLE THIEUTH YEO RIEULMIEUM
+ 0xB746: 0xD173, //HANGUL SYLLABLE THIEUTH YEO RIEULPIEUP
+ 0xB747: 0xD174, //HANGUL SYLLABLE THIEUTH YEO RIEULSIOS
+ 0xB748: 0xD175, //HANGUL SYLLABLE THIEUTH YEO RIEULTHIEUTH
+ 0xB749: 0xD176, //HANGUL SYLLABLE THIEUTH YEO RIEULPHIEUPH
+ 0xB74A: 0xD177, //HANGUL SYLLABLE THIEUTH YEO RIEULHIEUH
+ 0xB74B: 0xD178, //HANGUL SYLLABLE THIEUTH YEO MIEUM
+ 0xB74C: 0xD179, //HANGUL SYLLABLE THIEUTH YEO PIEUP
+ 0xB74D: 0xD17A, //HANGUL SYLLABLE THIEUTH YEO PIEUPSIOS
+ 0xB74E: 0xD17B, //HANGUL SYLLABLE THIEUTH YEO SIOS
+ 0xB74F: 0xD17D, //HANGUL SYLLABLE THIEUTH YEO IEUNG
+ 0xB750: 0xD17E, //HANGUL SYLLABLE THIEUTH YEO CIEUC
+ 0xB751: 0xD17F, //HANGUL SYLLABLE THIEUTH YEO CHIEUCH
+ 0xB752: 0xD180, //HANGUL SYLLABLE THIEUTH YEO KHIEUKH
+ 0xB753: 0xD181, //HANGUL SYLLABLE THIEUTH YEO THIEUTH
+ 0xB754: 0xD182, //HANGUL SYLLABLE THIEUTH YEO PHIEUPH
+ 0xB755: 0xD183, //HANGUL SYLLABLE THIEUTH YEO HIEUH
+ 0xB756: 0xD185, //HANGUL SYLLABLE THIEUTH YE KIYEOK
+ 0xB757: 0xD186, //HANGUL SYLLABLE THIEUTH YE SSANGKIYEOK
+ 0xB758: 0xD187, //HANGUL SYLLABLE THIEUTH YE KIYEOKSIOS
+ 0xB759: 0xD189, //HANGUL SYLLABLE THIEUTH YE NIEUNCIEUC
+ 0xB75A: 0xD18A, //HANGUL SYLLABLE THIEUTH YE NIEUNHIEUH
+ 0xB761: 0xD18B, //HANGUL SYLLABLE THIEUTH YE TIKEUT
+ 0xB762: 0xD18C, //HANGUL SYLLABLE THIEUTH YE RIEUL
+ 0xB763: 0xD18D, //HANGUL SYLLABLE THIEUTH YE RIEULKIYEOK
+ 0xB764: 0xD18E, //HANGUL SYLLABLE THIEUTH YE RIEULMIEUM
+ 0xB765: 0xD18F, //HANGUL SYLLABLE THIEUTH YE RIEULPIEUP
+ 0xB766: 0xD190, //HANGUL SYLLABLE THIEUTH YE RIEULSIOS
+ 0xB767: 0xD191, //HANGUL SYLLABLE THIEUTH YE RIEULTHIEUTH
+ 0xB768: 0xD192, //HANGUL SYLLABLE THIEUTH YE RIEULPHIEUPH
+ 0xB769: 0xD193, //HANGUL SYLLABLE THIEUTH YE RIEULHIEUH
+ 0xB76A: 0xD194, //HANGUL SYLLABLE THIEUTH YE MIEUM
+ 0xB76B: 0xD195, //HANGUL SYLLABLE THIEUTH YE PIEUP
+ 0xB76C: 0xD196, //HANGUL SYLLABLE THIEUTH YE PIEUPSIOS
+ 0xB76D: 0xD197, //HANGUL SYLLABLE THIEUTH YE SIOS
+ 0xB76E: 0xD198, //HANGUL SYLLABLE THIEUTH YE SSANGSIOS
+ 0xB76F: 0xD199, //HANGUL SYLLABLE THIEUTH YE IEUNG
+ 0xB770: 0xD19A, //HANGUL SYLLABLE THIEUTH YE CIEUC
+ 0xB771: 0xD19B, //HANGUL SYLLABLE THIEUTH YE CHIEUCH
+ 0xB772: 0xD19C, //HANGUL SYLLABLE THIEUTH YE KHIEUKH
+ 0xB773: 0xD19D, //HANGUL SYLLABLE THIEUTH YE THIEUTH
+ 0xB774: 0xD19E, //HANGUL SYLLABLE THIEUTH YE PHIEUPH
+ 0xB775: 0xD19F, //HANGUL SYLLABLE THIEUTH YE HIEUH
+ 0xB776: 0xD1A2, //HANGUL SYLLABLE THIEUTH O SSANGKIYEOK
+ 0xB777: 0xD1A3, //HANGUL SYLLABLE THIEUTH O KIYEOKSIOS
+ 0xB778: 0xD1A5, //HANGUL SYLLABLE THIEUTH O NIEUNCIEUC
+ 0xB779: 0xD1A6, //HANGUL SYLLABLE THIEUTH O NIEUNHIEUH
+ 0xB77A: 0xD1A7, //HANGUL SYLLABLE THIEUTH O TIKEUT
+ 0xB781: 0xD1A9, //HANGUL SYLLABLE THIEUTH O RIEULKIYEOK
+ 0xB782: 0xD1AA, //HANGUL SYLLABLE THIEUTH O RIEULMIEUM
+ 0xB783: 0xD1AB, //HANGUL SYLLABLE THIEUTH O RIEULPIEUP
+ 0xB784: 0xD1AC, //HANGUL SYLLABLE THIEUTH O RIEULSIOS
+ 0xB785: 0xD1AD, //HANGUL SYLLABLE THIEUTH O RIEULTHIEUTH
+ 0xB786: 0xD1AE, //HANGUL SYLLABLE THIEUTH O RIEULPHIEUPH
+ 0xB787: 0xD1AF, //HANGUL SYLLABLE THIEUTH O RIEULHIEUH
+ 0xB788: 0xD1B2, //HANGUL SYLLABLE THIEUTH O PIEUPSIOS
+ 0xB789: 0xD1B4, //HANGUL SYLLABLE THIEUTH O SSANGSIOS
+ 0xB78A: 0xD1B6, //HANGUL SYLLABLE THIEUTH O CIEUC
+ 0xB78B: 0xD1B7, //HANGUL SYLLABLE THIEUTH O CHIEUCH
+ 0xB78C: 0xD1B8, //HANGUL SYLLABLE THIEUTH O KHIEUKH
+ 0xB78D: 0xD1B9, //HANGUL SYLLABLE THIEUTH O THIEUTH
+ 0xB78E: 0xD1BB, //HANGUL SYLLABLE THIEUTH O HIEUH
+ 0xB78F: 0xD1BD, //HANGUL SYLLABLE THIEUTH WA KIYEOK
+ 0xB790: 0xD1BE, //HANGUL SYLLABLE THIEUTH WA SSANGKIYEOK
+ 0xB791: 0xD1BF, //HANGUL SYLLABLE THIEUTH WA KIYEOKSIOS
+ 0xB792: 0xD1C1, //HANGUL SYLLABLE THIEUTH WA NIEUNCIEUC
+ 0xB793: 0xD1C2, //HANGUL SYLLABLE THIEUTH WA NIEUNHIEUH
+ 0xB794: 0xD1C3, //HANGUL SYLLABLE THIEUTH WA TIKEUT
+ 0xB795: 0xD1C4, //HANGUL SYLLABLE THIEUTH WA RIEUL
+ 0xB796: 0xD1C5, //HANGUL SYLLABLE THIEUTH WA RIEULKIYEOK
+ 0xB797: 0xD1C6, //HANGUL SYLLABLE THIEUTH WA RIEULMIEUM
+ 0xB798: 0xD1C7, //HANGUL SYLLABLE THIEUTH WA RIEULPIEUP
+ 0xB799: 0xD1C8, //HANGUL SYLLABLE THIEUTH WA RIEULSIOS
+ 0xB79A: 0xD1C9, //HANGUL SYLLABLE THIEUTH WA RIEULTHIEUTH
+ 0xB79B: 0xD1CA, //HANGUL SYLLABLE THIEUTH WA RIEULPHIEUPH
+ 0xB79C: 0xD1CB, //HANGUL SYLLABLE THIEUTH WA RIEULHIEUH
+ 0xB79D: 0xD1CC, //HANGUL SYLLABLE THIEUTH WA MIEUM
+ 0xB79E: 0xD1CD, //HANGUL SYLLABLE THIEUTH WA PIEUP
+ 0xB79F: 0xD1CE, //HANGUL SYLLABLE THIEUTH WA PIEUPSIOS
+ 0xB7A0: 0xD1CF, //HANGUL SYLLABLE THIEUTH WA SIOS
+ 0xB7A1: 0xB798, //HANGUL SYLLABLE RIEUL AE
+ 0xB7A2: 0xB799, //HANGUL SYLLABLE RIEUL AE KIYEOK
+ 0xB7A3: 0xB79C, //HANGUL SYLLABLE RIEUL AE NIEUN
+ 0xB7A4: 0xB7A0, //HANGUL SYLLABLE RIEUL AE RIEUL
+ 0xB7A5: 0xB7A8, //HANGUL SYLLABLE RIEUL AE MIEUM
+ 0xB7A6: 0xB7A9, //HANGUL SYLLABLE RIEUL AE PIEUP
+ 0xB7A7: 0xB7AB, //HANGUL SYLLABLE RIEUL AE SIOS
+ 0xB7A8: 0xB7AC, //HANGUL SYLLABLE RIEUL AE SSANGSIOS
+ 0xB7A9: 0xB7AD, //HANGUL SYLLABLE RIEUL AE IEUNG
+ 0xB7AA: 0xB7B4, //HANGUL SYLLABLE RIEUL YA
+ 0xB7AB: 0xB7B5, //HANGUL SYLLABLE RIEUL YA KIYEOK
+ 0xB7AC: 0xB7B8, //HANGUL SYLLABLE RIEUL YA NIEUN
+ 0xB7AD: 0xB7C7, //HANGUL SYLLABLE RIEUL YA SIOS
+ 0xB7AE: 0xB7C9, //HANGUL SYLLABLE RIEUL YA IEUNG
+ 0xB7AF: 0xB7EC, //HANGUL SYLLABLE RIEUL EO
+ 0xB7B0: 0xB7ED, //HANGUL SYLLABLE RIEUL EO KIYEOK
+ 0xB7B1: 0xB7F0, //HANGUL SYLLABLE RIEUL EO NIEUN
+ 0xB7B2: 0xB7F4, //HANGUL SYLLABLE RIEUL EO RIEUL
+ 0xB7B3: 0xB7FC, //HANGUL SYLLABLE RIEUL EO MIEUM
+ 0xB7B4: 0xB7FD, //HANGUL SYLLABLE RIEUL EO PIEUP
+ 0xB7B5: 0xB7FF, //HANGUL SYLLABLE RIEUL EO SIOS
+ 0xB7B6: 0xB800, //HANGUL SYLLABLE RIEUL EO SSANGSIOS
+ 0xB7B7: 0xB801, //HANGUL SYLLABLE RIEUL EO IEUNG
+ 0xB7B8: 0xB807, //HANGUL SYLLABLE RIEUL EO HIEUH
+ 0xB7B9: 0xB808, //HANGUL SYLLABLE RIEUL E
+ 0xB7BA: 0xB809, //HANGUL SYLLABLE RIEUL E KIYEOK
+ 0xB7BB: 0xB80C, //HANGUL SYLLABLE RIEUL E NIEUN
+ 0xB7BC: 0xB810, //HANGUL SYLLABLE RIEUL E RIEUL
+ 0xB7BD: 0xB818, //HANGUL SYLLABLE RIEUL E MIEUM
+ 0xB7BE: 0xB819, //HANGUL SYLLABLE RIEUL E PIEUP
+ 0xB7BF: 0xB81B, //HANGUL SYLLABLE RIEUL E SIOS
+ 0xB7C0: 0xB81D, //HANGUL SYLLABLE RIEUL E IEUNG
+ 0xB7C1: 0xB824, //HANGUL SYLLABLE RIEUL YEO
+ 0xB7C2: 0xB825, //HANGUL SYLLABLE RIEUL YEO KIYEOK
+ 0xB7C3: 0xB828, //HANGUL SYLLABLE RIEUL YEO NIEUN
+ 0xB7C4: 0xB82C, //HANGUL SYLLABLE RIEUL YEO RIEUL
+ 0xB7C5: 0xB834, //HANGUL SYLLABLE RIEUL YEO MIEUM
+ 0xB7C6: 0xB835, //HANGUL SYLLABLE RIEUL YEO PIEUP
+ 0xB7C7: 0xB837, //HANGUL SYLLABLE RIEUL YEO SIOS
+ 0xB7C8: 0xB838, //HANGUL SYLLABLE RIEUL YEO SSANGSIOS
+ 0xB7C9: 0xB839, //HANGUL SYLLABLE RIEUL YEO IEUNG
+ 0xB7CA: 0xB840, //HANGUL SYLLABLE RIEUL YE
+ 0xB7CB: 0xB844, //HANGUL SYLLABLE RIEUL YE NIEUN
+ 0xB7CC: 0xB851, //HANGUL SYLLABLE RIEUL YE PIEUP
+ 0xB7CD: 0xB853, //HANGUL SYLLABLE RIEUL YE SIOS
+ 0xB7CE: 0xB85C, //HANGUL SYLLABLE RIEUL O
+ 0xB7CF: 0xB85D, //HANGUL SYLLABLE RIEUL O KIYEOK
+ 0xB7D0: 0xB860, //HANGUL SYLLABLE RIEUL O NIEUN
+ 0xB7D1: 0xB864, //HANGUL SYLLABLE RIEUL O RIEUL
+ 0xB7D2: 0xB86C, //HANGUL SYLLABLE RIEUL O MIEUM
+ 0xB7D3: 0xB86D, //HANGUL SYLLABLE RIEUL O PIEUP
+ 0xB7D4: 0xB86F, //HANGUL SYLLABLE RIEUL O SIOS
+ 0xB7D5: 0xB871, //HANGUL SYLLABLE RIEUL O IEUNG
+ 0xB7D6: 0xB878, //HANGUL SYLLABLE RIEUL WA
+ 0xB7D7: 0xB87C, //HANGUL SYLLABLE RIEUL WA NIEUN
+ 0xB7D8: 0xB88D, //HANGUL SYLLABLE RIEUL WA IEUNG
+ 0xB7D9: 0xB8A8, //HANGUL SYLLABLE RIEUL WAE SSANGSIOS
+ 0xB7DA: 0xB8B0, //HANGUL SYLLABLE RIEUL OE
+ 0xB7DB: 0xB8B4, //HANGUL SYLLABLE RIEUL OE NIEUN
+ 0xB7DC: 0xB8B8, //HANGUL SYLLABLE RIEUL OE RIEUL
+ 0xB7DD: 0xB8C0, //HANGUL SYLLABLE RIEUL OE MIEUM
+ 0xB7DE: 0xB8C1, //HANGUL SYLLABLE RIEUL OE PIEUP
+ 0xB7DF: 0xB8C3, //HANGUL SYLLABLE RIEUL OE SIOS
+ 0xB7E0: 0xB8C5, //HANGUL SYLLABLE RIEUL OE IEUNG
+ 0xB7E1: 0xB8CC, //HANGUL SYLLABLE RIEUL YO
+ 0xB7E2: 0xB8D0, //HANGUL SYLLABLE RIEUL YO NIEUN
+ 0xB7E3: 0xB8D4, //HANGUL SYLLABLE RIEUL YO RIEUL
+ 0xB7E4: 0xB8DD, //HANGUL SYLLABLE RIEUL YO PIEUP
+ 0xB7E5: 0xB8DF, //HANGUL SYLLABLE RIEUL YO SIOS
+ 0xB7E6: 0xB8E1, //HANGUL SYLLABLE RIEUL YO IEUNG
+ 0xB7E7: 0xB8E8, //HANGUL SYLLABLE RIEUL U
+ 0xB7E8: 0xB8E9, //HANGUL SYLLABLE RIEUL U KIYEOK
+ 0xB7E9: 0xB8EC, //HANGUL SYLLABLE RIEUL U NIEUN
+ 0xB7EA: 0xB8F0, //HANGUL SYLLABLE RIEUL U RIEUL
+ 0xB7EB: 0xB8F8, //HANGUL SYLLABLE RIEUL U MIEUM
+ 0xB7EC: 0xB8F9, //HANGUL SYLLABLE RIEUL U PIEUP
+ 0xB7ED: 0xB8FB, //HANGUL SYLLABLE RIEUL U SIOS
+ 0xB7EE: 0xB8FD, //HANGUL SYLLABLE RIEUL U IEUNG
+ 0xB7EF: 0xB904, //HANGUL SYLLABLE RIEUL WEO
+ 0xB7F0: 0xB918, //HANGUL SYLLABLE RIEUL WEO SSANGSIOS
+ 0xB7F1: 0xB920, //HANGUL SYLLABLE RIEUL WE
+ 0xB7F2: 0xB93C, //HANGUL SYLLABLE RIEUL WI
+ 0xB7F3: 0xB93D, //HANGUL SYLLABLE RIEUL WI KIYEOK
+ 0xB7F4: 0xB940, //HANGUL SYLLABLE RIEUL WI NIEUN
+ 0xB7F5: 0xB944, //HANGUL SYLLABLE RIEUL WI RIEUL
+ 0xB7F6: 0xB94C, //HANGUL SYLLABLE RIEUL WI MIEUM
+ 0xB7F7: 0xB94F, //HANGUL SYLLABLE RIEUL WI SIOS
+ 0xB7F8: 0xB951, //HANGUL SYLLABLE RIEUL WI IEUNG
+ 0xB7F9: 0xB958, //HANGUL SYLLABLE RIEUL YU
+ 0xB7FA: 0xB959, //HANGUL SYLLABLE RIEUL YU KIYEOK
+ 0xB7FB: 0xB95C, //HANGUL SYLLABLE RIEUL YU NIEUN
+ 0xB7FC: 0xB960, //HANGUL SYLLABLE RIEUL YU RIEUL
+ 0xB7FD: 0xB968, //HANGUL SYLLABLE RIEUL YU MIEUM
+ 0xB7FE: 0xB969, //HANGUL SYLLABLE RIEUL YU PIEUP
+ 0xB841: 0xD1D0, //HANGUL SYLLABLE THIEUTH WA SSANGSIOS
+ 0xB842: 0xD1D1, //HANGUL SYLLABLE THIEUTH WA IEUNG
+ 0xB843: 0xD1D2, //HANGUL SYLLABLE THIEUTH WA CIEUC
+ 0xB844: 0xD1D3, //HANGUL SYLLABLE THIEUTH WA CHIEUCH
+ 0xB845: 0xD1D4, //HANGUL SYLLABLE THIEUTH WA KHIEUKH
+ 0xB846: 0xD1D5, //HANGUL SYLLABLE THIEUTH WA THIEUTH
+ 0xB847: 0xD1D6, //HANGUL SYLLABLE THIEUTH WA PHIEUPH
+ 0xB848: 0xD1D7, //HANGUL SYLLABLE THIEUTH WA HIEUH
+ 0xB849: 0xD1D9, //HANGUL SYLLABLE THIEUTH WAE KIYEOK
+ 0xB84A: 0xD1DA, //HANGUL SYLLABLE THIEUTH WAE SSANGKIYEOK
+ 0xB84B: 0xD1DB, //HANGUL SYLLABLE THIEUTH WAE KIYEOKSIOS
+ 0xB84C: 0xD1DC, //HANGUL SYLLABLE THIEUTH WAE NIEUN
+ 0xB84D: 0xD1DD, //HANGUL SYLLABLE THIEUTH WAE NIEUNCIEUC
+ 0xB84E: 0xD1DE, //HANGUL SYLLABLE THIEUTH WAE NIEUNHIEUH
+ 0xB84F: 0xD1DF, //HANGUL SYLLABLE THIEUTH WAE TIKEUT
+ 0xB850: 0xD1E0, //HANGUL SYLLABLE THIEUTH WAE RIEUL
+ 0xB851: 0xD1E1, //HANGUL SYLLABLE THIEUTH WAE RIEULKIYEOK
+ 0xB852: 0xD1E2, //HANGUL SYLLABLE THIEUTH WAE RIEULMIEUM
+ 0xB853: 0xD1E3, //HANGUL SYLLABLE THIEUTH WAE RIEULPIEUP
+ 0xB854: 0xD1E4, //HANGUL SYLLABLE THIEUTH WAE RIEULSIOS
+ 0xB855: 0xD1E5, //HANGUL SYLLABLE THIEUTH WAE RIEULTHIEUTH
+ 0xB856: 0xD1E6, //HANGUL SYLLABLE THIEUTH WAE RIEULPHIEUPH
+ 0xB857: 0xD1E7, //HANGUL SYLLABLE THIEUTH WAE RIEULHIEUH
+ 0xB858: 0xD1E8, //HANGUL SYLLABLE THIEUTH WAE MIEUM
+ 0xB859: 0xD1E9, //HANGUL SYLLABLE THIEUTH WAE PIEUP
+ 0xB85A: 0xD1EA, //HANGUL SYLLABLE THIEUTH WAE PIEUPSIOS
+ 0xB861: 0xD1EB, //HANGUL SYLLABLE THIEUTH WAE SIOS
+ 0xB862: 0xD1EC, //HANGUL SYLLABLE THIEUTH WAE SSANGSIOS
+ 0xB863: 0xD1ED, //HANGUL SYLLABLE THIEUTH WAE IEUNG
+ 0xB864: 0xD1EE, //HANGUL SYLLABLE THIEUTH WAE CIEUC
+ 0xB865: 0xD1EF, //HANGUL SYLLABLE THIEUTH WAE CHIEUCH
+ 0xB866: 0xD1F0, //HANGUL SYLLABLE THIEUTH WAE KHIEUKH
+ 0xB867: 0xD1F1, //HANGUL SYLLABLE THIEUTH WAE THIEUTH
+ 0xB868: 0xD1F2, //HANGUL SYLLABLE THIEUTH WAE PHIEUPH
+ 0xB869: 0xD1F3, //HANGUL SYLLABLE THIEUTH WAE HIEUH
+ 0xB86A: 0xD1F5, //HANGUL SYLLABLE THIEUTH OE KIYEOK
+ 0xB86B: 0xD1F6, //HANGUL SYLLABLE THIEUTH OE SSANGKIYEOK
+ 0xB86C: 0xD1F7, //HANGUL SYLLABLE THIEUTH OE KIYEOKSIOS
+ 0xB86D: 0xD1F9, //HANGUL SYLLABLE THIEUTH OE NIEUNCIEUC
+ 0xB86E: 0xD1FA, //HANGUL SYLLABLE THIEUTH OE NIEUNHIEUH
+ 0xB86F: 0xD1FB, //HANGUL SYLLABLE THIEUTH OE TIKEUT
+ 0xB870: 0xD1FC, //HANGUL SYLLABLE THIEUTH OE RIEUL
+ 0xB871: 0xD1FD, //HANGUL SYLLABLE THIEUTH OE RIEULKIYEOK
+ 0xB872: 0xD1FE, //HANGUL SYLLABLE THIEUTH OE RIEULMIEUM
+ 0xB873: 0xD1FF, //HANGUL SYLLABLE THIEUTH OE RIEULPIEUP
+ 0xB874: 0xD200, //HANGUL SYLLABLE THIEUTH OE RIEULSIOS
+ 0xB875: 0xD201, //HANGUL SYLLABLE THIEUTH OE RIEULTHIEUTH
+ 0xB876: 0xD202, //HANGUL SYLLABLE THIEUTH OE RIEULPHIEUPH
+ 0xB877: 0xD203, //HANGUL SYLLABLE THIEUTH OE RIEULHIEUH
+ 0xB878: 0xD204, //HANGUL SYLLABLE THIEUTH OE MIEUM
+ 0xB879: 0xD205, //HANGUL SYLLABLE THIEUTH OE PIEUP
+ 0xB87A: 0xD206, //HANGUL SYLLABLE THIEUTH OE PIEUPSIOS
+ 0xB881: 0xD208, //HANGUL SYLLABLE THIEUTH OE SSANGSIOS
+ 0xB882: 0xD20A, //HANGUL SYLLABLE THIEUTH OE CIEUC
+ 0xB883: 0xD20B, //HANGUL SYLLABLE THIEUTH OE CHIEUCH
+ 0xB884: 0xD20C, //HANGUL SYLLABLE THIEUTH OE KHIEUKH
+ 0xB885: 0xD20D, //HANGUL SYLLABLE THIEUTH OE THIEUTH
+ 0xB886: 0xD20E, //HANGUL SYLLABLE THIEUTH OE PHIEUPH
+ 0xB887: 0xD20F, //HANGUL SYLLABLE THIEUTH OE HIEUH
+ 0xB888: 0xD211, //HANGUL SYLLABLE THIEUTH YO KIYEOK
+ 0xB889: 0xD212, //HANGUL SYLLABLE THIEUTH YO SSANGKIYEOK
+ 0xB88A: 0xD213, //HANGUL SYLLABLE THIEUTH YO KIYEOKSIOS
+ 0xB88B: 0xD214, //HANGUL SYLLABLE THIEUTH YO NIEUN
+ 0xB88C: 0xD215, //HANGUL SYLLABLE THIEUTH YO NIEUNCIEUC
+ 0xB88D: 0xD216, //HANGUL SYLLABLE THIEUTH YO NIEUNHIEUH
+ 0xB88E: 0xD217, //HANGUL SYLLABLE THIEUTH YO TIKEUT
+ 0xB88F: 0xD218, //HANGUL SYLLABLE THIEUTH YO RIEUL
+ 0xB890: 0xD219, //HANGUL SYLLABLE THIEUTH YO RIEULKIYEOK
+ 0xB891: 0xD21A, //HANGUL SYLLABLE THIEUTH YO RIEULMIEUM
+ 0xB892: 0xD21B, //HANGUL SYLLABLE THIEUTH YO RIEULPIEUP
+ 0xB893: 0xD21C, //HANGUL SYLLABLE THIEUTH YO RIEULSIOS
+ 0xB894: 0xD21D, //HANGUL SYLLABLE THIEUTH YO RIEULTHIEUTH
+ 0xB895: 0xD21E, //HANGUL SYLLABLE THIEUTH YO RIEULPHIEUPH
+ 0xB896: 0xD21F, //HANGUL SYLLABLE THIEUTH YO RIEULHIEUH
+ 0xB897: 0xD220, //HANGUL SYLLABLE THIEUTH YO MIEUM
+ 0xB898: 0xD221, //HANGUL SYLLABLE THIEUTH YO PIEUP
+ 0xB899: 0xD222, //HANGUL SYLLABLE THIEUTH YO PIEUPSIOS
+ 0xB89A: 0xD223, //HANGUL SYLLABLE THIEUTH YO SIOS
+ 0xB89B: 0xD224, //HANGUL SYLLABLE THIEUTH YO SSANGSIOS
+ 0xB89C: 0xD225, //HANGUL SYLLABLE THIEUTH YO IEUNG
+ 0xB89D: 0xD226, //HANGUL SYLLABLE THIEUTH YO CIEUC
+ 0xB89E: 0xD227, //HANGUL SYLLABLE THIEUTH YO CHIEUCH
+ 0xB89F: 0xD228, //HANGUL SYLLABLE THIEUTH YO KHIEUKH
+ 0xB8A0: 0xD229, //HANGUL SYLLABLE THIEUTH YO THIEUTH
+ 0xB8A1: 0xB96B, //HANGUL SYLLABLE RIEUL YU SIOS
+ 0xB8A2: 0xB96D, //HANGUL SYLLABLE RIEUL YU IEUNG
+ 0xB8A3: 0xB974, //HANGUL SYLLABLE RIEUL EU
+ 0xB8A4: 0xB975, //HANGUL SYLLABLE RIEUL EU KIYEOK
+ 0xB8A5: 0xB978, //HANGUL SYLLABLE RIEUL EU NIEUN
+ 0xB8A6: 0xB97C, //HANGUL SYLLABLE RIEUL EU RIEUL
+ 0xB8A7: 0xB984, //HANGUL SYLLABLE RIEUL EU MIEUM
+ 0xB8A8: 0xB985, //HANGUL SYLLABLE RIEUL EU PIEUP
+ 0xB8A9: 0xB987, //HANGUL SYLLABLE RIEUL EU SIOS
+ 0xB8AA: 0xB989, //HANGUL SYLLABLE RIEUL EU IEUNG
+ 0xB8AB: 0xB98A, //HANGUL SYLLABLE RIEUL EU CIEUC
+ 0xB8AC: 0xB98D, //HANGUL SYLLABLE RIEUL EU THIEUTH
+ 0xB8AD: 0xB98E, //HANGUL SYLLABLE RIEUL EU PHIEUPH
+ 0xB8AE: 0xB9AC, //HANGUL SYLLABLE RIEUL I
+ 0xB8AF: 0xB9AD, //HANGUL SYLLABLE RIEUL I KIYEOK
+ 0xB8B0: 0xB9B0, //HANGUL SYLLABLE RIEUL I NIEUN
+ 0xB8B1: 0xB9B4, //HANGUL SYLLABLE RIEUL I RIEUL
+ 0xB8B2: 0xB9BC, //HANGUL SYLLABLE RIEUL I MIEUM
+ 0xB8B3: 0xB9BD, //HANGUL SYLLABLE RIEUL I PIEUP
+ 0xB8B4: 0xB9BF, //HANGUL SYLLABLE RIEUL I SIOS
+ 0xB8B5: 0xB9C1, //HANGUL SYLLABLE RIEUL I IEUNG
+ 0xB8B6: 0xB9C8, //HANGUL SYLLABLE MIEUM A
+ 0xB8B7: 0xB9C9, //HANGUL SYLLABLE MIEUM A KIYEOK
+ 0xB8B8: 0xB9CC, //HANGUL SYLLABLE MIEUM A NIEUN
+ 0xB8B9: 0xB9CE, //HANGUL SYLLABLE MIEUM A NIEUNHIEUH
+ 0xB8BA: 0xB9CF, //HANGUL SYLLABLE MIEUM A TIKEUT
+ 0xB8BB: 0xB9D0, //HANGUL SYLLABLE MIEUM A RIEUL
+ 0xB8BC: 0xB9D1, //HANGUL SYLLABLE MIEUM A RIEULKIYEOK
+ 0xB8BD: 0xB9D2, //HANGUL SYLLABLE MIEUM A RIEULMIEUM
+ 0xB8BE: 0xB9D8, //HANGUL SYLLABLE MIEUM A MIEUM
+ 0xB8BF: 0xB9D9, //HANGUL SYLLABLE MIEUM A PIEUP
+ 0xB8C0: 0xB9DB, //HANGUL SYLLABLE MIEUM A SIOS
+ 0xB8C1: 0xB9DD, //HANGUL SYLLABLE MIEUM A IEUNG
+ 0xB8C2: 0xB9DE, //HANGUL SYLLABLE MIEUM A CIEUC
+ 0xB8C3: 0xB9E1, //HANGUL SYLLABLE MIEUM A THIEUTH
+ 0xB8C4: 0xB9E3, //HANGUL SYLLABLE MIEUM A HIEUH
+ 0xB8C5: 0xB9E4, //HANGUL SYLLABLE MIEUM AE
+ 0xB8C6: 0xB9E5, //HANGUL SYLLABLE MIEUM AE KIYEOK
+ 0xB8C7: 0xB9E8, //HANGUL SYLLABLE MIEUM AE NIEUN
+ 0xB8C8: 0xB9EC, //HANGUL SYLLABLE MIEUM AE RIEUL
+ 0xB8C9: 0xB9F4, //HANGUL SYLLABLE MIEUM AE MIEUM
+ 0xB8CA: 0xB9F5, //HANGUL SYLLABLE MIEUM AE PIEUP
+ 0xB8CB: 0xB9F7, //HANGUL SYLLABLE MIEUM AE SIOS
+ 0xB8CC: 0xB9F8, //HANGUL SYLLABLE MIEUM AE SSANGSIOS
+ 0xB8CD: 0xB9F9, //HANGUL SYLLABLE MIEUM AE IEUNG
+ 0xB8CE: 0xB9FA, //HANGUL SYLLABLE MIEUM AE CIEUC
+ 0xB8CF: 0xBA00, //HANGUL SYLLABLE MIEUM YA
+ 0xB8D0: 0xBA01, //HANGUL SYLLABLE MIEUM YA KIYEOK
+ 0xB8D1: 0xBA08, //HANGUL SYLLABLE MIEUM YA RIEUL
+ 0xB8D2: 0xBA15, //HANGUL SYLLABLE MIEUM YA IEUNG
+ 0xB8D3: 0xBA38, //HANGUL SYLLABLE MIEUM EO
+ 0xB8D4: 0xBA39, //HANGUL SYLLABLE MIEUM EO KIYEOK
+ 0xB8D5: 0xBA3C, //HANGUL SYLLABLE MIEUM EO NIEUN
+ 0xB8D6: 0xBA40, //HANGUL SYLLABLE MIEUM EO RIEUL
+ 0xB8D7: 0xBA42, //HANGUL SYLLABLE MIEUM EO RIEULMIEUM
+ 0xB8D8: 0xBA48, //HANGUL SYLLABLE MIEUM EO MIEUM
+ 0xB8D9: 0xBA49, //HANGUL SYLLABLE MIEUM EO PIEUP
+ 0xB8DA: 0xBA4B, //HANGUL SYLLABLE MIEUM EO SIOS
+ 0xB8DB: 0xBA4D, //HANGUL SYLLABLE MIEUM EO IEUNG
+ 0xB8DC: 0xBA4E, //HANGUL SYLLABLE MIEUM EO CIEUC
+ 0xB8DD: 0xBA53, //HANGUL SYLLABLE MIEUM EO HIEUH
+ 0xB8DE: 0xBA54, //HANGUL SYLLABLE MIEUM E
+ 0xB8DF: 0xBA55, //HANGUL SYLLABLE MIEUM E KIYEOK
+ 0xB8E0: 0xBA58, //HANGUL SYLLABLE MIEUM E NIEUN
+ 0xB8E1: 0xBA5C, //HANGUL SYLLABLE MIEUM E RIEUL
+ 0xB8E2: 0xBA64, //HANGUL SYLLABLE MIEUM E MIEUM
+ 0xB8E3: 0xBA65, //HANGUL SYLLABLE MIEUM E PIEUP
+ 0xB8E4: 0xBA67, //HANGUL SYLLABLE MIEUM E SIOS
+ 0xB8E5: 0xBA68, //HANGUL SYLLABLE MIEUM E SSANGSIOS
+ 0xB8E6: 0xBA69, //HANGUL SYLLABLE MIEUM E IEUNG
+ 0xB8E7: 0xBA70, //HANGUL SYLLABLE MIEUM YEO
+ 0xB8E8: 0xBA71, //HANGUL SYLLABLE MIEUM YEO KIYEOK
+ 0xB8E9: 0xBA74, //HANGUL SYLLABLE MIEUM YEO NIEUN
+ 0xB8EA: 0xBA78, //HANGUL SYLLABLE MIEUM YEO RIEUL
+ 0xB8EB: 0xBA83, //HANGUL SYLLABLE MIEUM YEO SIOS
+ 0xB8EC: 0xBA84, //HANGUL SYLLABLE MIEUM YEO SSANGSIOS
+ 0xB8ED: 0xBA85, //HANGUL SYLLABLE MIEUM YEO IEUNG
+ 0xB8EE: 0xBA87, //HANGUL SYLLABLE MIEUM YEO CHIEUCH
+ 0xB8EF: 0xBA8C, //HANGUL SYLLABLE MIEUM YE
+ 0xB8F0: 0xBAA8, //HANGUL SYLLABLE MIEUM O
+ 0xB8F1: 0xBAA9, //HANGUL SYLLABLE MIEUM O KIYEOK
+ 0xB8F2: 0xBAAB, //HANGUL SYLLABLE MIEUM O KIYEOKSIOS
+ 0xB8F3: 0xBAAC, //HANGUL SYLLABLE MIEUM O NIEUN
+ 0xB8F4: 0xBAB0, //HANGUL SYLLABLE MIEUM O RIEUL
+ 0xB8F5: 0xBAB2, //HANGUL SYLLABLE MIEUM O RIEULMIEUM
+ 0xB8F6: 0xBAB8, //HANGUL SYLLABLE MIEUM O MIEUM
+ 0xB8F7: 0xBAB9, //HANGUL SYLLABLE MIEUM O PIEUP
+ 0xB8F8: 0xBABB, //HANGUL SYLLABLE MIEUM O SIOS
+ 0xB8F9: 0xBABD, //HANGUL SYLLABLE MIEUM O IEUNG
+ 0xB8FA: 0xBAC4, //HANGUL SYLLABLE MIEUM WA
+ 0xB8FB: 0xBAC8, //HANGUL SYLLABLE MIEUM WA NIEUN
+ 0xB8FC: 0xBAD8, //HANGUL SYLLABLE MIEUM WA SSANGSIOS
+ 0xB8FD: 0xBAD9, //HANGUL SYLLABLE MIEUM WA IEUNG
+ 0xB8FE: 0xBAFC, //HANGUL SYLLABLE MIEUM OE
+ 0xB941: 0xD22A, //HANGUL SYLLABLE THIEUTH YO PHIEUPH
+ 0xB942: 0xD22B, //HANGUL SYLLABLE THIEUTH YO HIEUH
+ 0xB943: 0xD22E, //HANGUL SYLLABLE THIEUTH U SSANGKIYEOK
+ 0xB944: 0xD22F, //HANGUL SYLLABLE THIEUTH U KIYEOKSIOS
+ 0xB945: 0xD231, //HANGUL SYLLABLE THIEUTH U NIEUNCIEUC
+ 0xB946: 0xD232, //HANGUL SYLLABLE THIEUTH U NIEUNHIEUH
+ 0xB947: 0xD233, //HANGUL SYLLABLE THIEUTH U TIKEUT
+ 0xB948: 0xD235, //HANGUL SYLLABLE THIEUTH U RIEULKIYEOK
+ 0xB949: 0xD236, //HANGUL SYLLABLE THIEUTH U RIEULMIEUM
+ 0xB94A: 0xD237, //HANGUL SYLLABLE THIEUTH U RIEULPIEUP
+ 0xB94B: 0xD238, //HANGUL SYLLABLE THIEUTH U RIEULSIOS
+ 0xB94C: 0xD239, //HANGUL SYLLABLE THIEUTH U RIEULTHIEUTH
+ 0xB94D: 0xD23A, //HANGUL SYLLABLE THIEUTH U RIEULPHIEUPH
+ 0xB94E: 0xD23B, //HANGUL SYLLABLE THIEUTH U RIEULHIEUH
+ 0xB94F: 0xD23E, //HANGUL SYLLABLE THIEUTH U PIEUPSIOS
+ 0xB950: 0xD240, //HANGUL SYLLABLE THIEUTH U SSANGSIOS
+ 0xB951: 0xD242, //HANGUL SYLLABLE THIEUTH U CIEUC
+ 0xB952: 0xD243, //HANGUL SYLLABLE THIEUTH U CHIEUCH
+ 0xB953: 0xD244, //HANGUL SYLLABLE THIEUTH U KHIEUKH
+ 0xB954: 0xD245, //HANGUL SYLLABLE THIEUTH U THIEUTH
+ 0xB955: 0xD246, //HANGUL SYLLABLE THIEUTH U PHIEUPH
+ 0xB956: 0xD247, //HANGUL SYLLABLE THIEUTH U HIEUH
+ 0xB957: 0xD249, //HANGUL SYLLABLE THIEUTH WEO KIYEOK
+ 0xB958: 0xD24A, //HANGUL SYLLABLE THIEUTH WEO SSANGKIYEOK
+ 0xB959: 0xD24B, //HANGUL SYLLABLE THIEUTH WEO KIYEOKSIOS
+ 0xB95A: 0xD24C, //HANGUL SYLLABLE THIEUTH WEO NIEUN
+ 0xB961: 0xD24D, //HANGUL SYLLABLE THIEUTH WEO NIEUNCIEUC
+ 0xB962: 0xD24E, //HANGUL SYLLABLE THIEUTH WEO NIEUNHIEUH
+ 0xB963: 0xD24F, //HANGUL SYLLABLE THIEUTH WEO TIKEUT
+ 0xB964: 0xD250, //HANGUL SYLLABLE THIEUTH WEO RIEUL
+ 0xB965: 0xD251, //HANGUL SYLLABLE THIEUTH WEO RIEULKIYEOK
+ 0xB966: 0xD252, //HANGUL SYLLABLE THIEUTH WEO RIEULMIEUM
+ 0xB967: 0xD253, //HANGUL SYLLABLE THIEUTH WEO RIEULPIEUP
+ 0xB968: 0xD254, //HANGUL SYLLABLE THIEUTH WEO RIEULSIOS
+ 0xB969: 0xD255, //HANGUL SYLLABLE THIEUTH WEO RIEULTHIEUTH
+ 0xB96A: 0xD256, //HANGUL SYLLABLE THIEUTH WEO RIEULPHIEUPH
+ 0xB96B: 0xD257, //HANGUL SYLLABLE THIEUTH WEO RIEULHIEUH
+ 0xB96C: 0xD258, //HANGUL SYLLABLE THIEUTH WEO MIEUM
+ 0xB96D: 0xD259, //HANGUL SYLLABLE THIEUTH WEO PIEUP
+ 0xB96E: 0xD25A, //HANGUL SYLLABLE THIEUTH WEO PIEUPSIOS
+ 0xB96F: 0xD25B, //HANGUL SYLLABLE THIEUTH WEO SIOS
+ 0xB970: 0xD25D, //HANGUL SYLLABLE THIEUTH WEO IEUNG
+ 0xB971: 0xD25E, //HANGUL SYLLABLE THIEUTH WEO CIEUC
+ 0xB972: 0xD25F, //HANGUL SYLLABLE THIEUTH WEO CHIEUCH
+ 0xB973: 0xD260, //HANGUL SYLLABLE THIEUTH WEO KHIEUKH
+ 0xB974: 0xD261, //HANGUL SYLLABLE THIEUTH WEO THIEUTH
+ 0xB975: 0xD262, //HANGUL SYLLABLE THIEUTH WEO PHIEUPH
+ 0xB976: 0xD263, //HANGUL SYLLABLE THIEUTH WEO HIEUH
+ 0xB977: 0xD265, //HANGUL SYLLABLE THIEUTH WE KIYEOK
+ 0xB978: 0xD266, //HANGUL SYLLABLE THIEUTH WE SSANGKIYEOK
+ 0xB979: 0xD267, //HANGUL SYLLABLE THIEUTH WE KIYEOKSIOS
+ 0xB97A: 0xD268, //HANGUL SYLLABLE THIEUTH WE NIEUN
+ 0xB981: 0xD269, //HANGUL SYLLABLE THIEUTH WE NIEUNCIEUC
+ 0xB982: 0xD26A, //HANGUL SYLLABLE THIEUTH WE NIEUNHIEUH
+ 0xB983: 0xD26B, //HANGUL SYLLABLE THIEUTH WE TIKEUT
+ 0xB984: 0xD26C, //HANGUL SYLLABLE THIEUTH WE RIEUL
+ 0xB985: 0xD26D, //HANGUL SYLLABLE THIEUTH WE RIEULKIYEOK
+ 0xB986: 0xD26E, //HANGUL SYLLABLE THIEUTH WE RIEULMIEUM
+ 0xB987: 0xD26F, //HANGUL SYLLABLE THIEUTH WE RIEULPIEUP
+ 0xB988: 0xD270, //HANGUL SYLLABLE THIEUTH WE RIEULSIOS
+ 0xB989: 0xD271, //HANGUL SYLLABLE THIEUTH WE RIEULTHIEUTH
+ 0xB98A: 0xD272, //HANGUL SYLLABLE THIEUTH WE RIEULPHIEUPH
+ 0xB98B: 0xD273, //HANGUL SYLLABLE THIEUTH WE RIEULHIEUH
+ 0xB98C: 0xD274, //HANGUL SYLLABLE THIEUTH WE MIEUM
+ 0xB98D: 0xD275, //HANGUL SYLLABLE THIEUTH WE PIEUP
+ 0xB98E: 0xD276, //HANGUL SYLLABLE THIEUTH WE PIEUPSIOS
+ 0xB98F: 0xD277, //HANGUL SYLLABLE THIEUTH WE SIOS
+ 0xB990: 0xD278, //HANGUL SYLLABLE THIEUTH WE SSANGSIOS
+ 0xB991: 0xD279, //HANGUL SYLLABLE THIEUTH WE IEUNG
+ 0xB992: 0xD27A, //HANGUL SYLLABLE THIEUTH WE CIEUC
+ 0xB993: 0xD27B, //HANGUL SYLLABLE THIEUTH WE CHIEUCH
+ 0xB994: 0xD27C, //HANGUL SYLLABLE THIEUTH WE KHIEUKH
+ 0xB995: 0xD27D, //HANGUL SYLLABLE THIEUTH WE THIEUTH
+ 0xB996: 0xD27E, //HANGUL SYLLABLE THIEUTH WE PHIEUPH
+ 0xB997: 0xD27F, //HANGUL SYLLABLE THIEUTH WE HIEUH
+ 0xB998: 0xD282, //HANGUL SYLLABLE THIEUTH WI SSANGKIYEOK
+ 0xB999: 0xD283, //HANGUL SYLLABLE THIEUTH WI KIYEOKSIOS
+ 0xB99A: 0xD285, //HANGUL SYLLABLE THIEUTH WI NIEUNCIEUC
+ 0xB99B: 0xD286, //HANGUL SYLLABLE THIEUTH WI NIEUNHIEUH
+ 0xB99C: 0xD287, //HANGUL SYLLABLE THIEUTH WI TIKEUT
+ 0xB99D: 0xD289, //HANGUL SYLLABLE THIEUTH WI RIEULKIYEOK
+ 0xB99E: 0xD28A, //HANGUL SYLLABLE THIEUTH WI RIEULMIEUM
+ 0xB99F: 0xD28B, //HANGUL SYLLABLE THIEUTH WI RIEULPIEUP
+ 0xB9A0: 0xD28C, //HANGUL SYLLABLE THIEUTH WI RIEULSIOS
+ 0xB9A1: 0xBB00, //HANGUL SYLLABLE MIEUM OE NIEUN
+ 0xB9A2: 0xBB04, //HANGUL SYLLABLE MIEUM OE RIEUL
+ 0xB9A3: 0xBB0D, //HANGUL SYLLABLE MIEUM OE PIEUP
+ 0xB9A4: 0xBB0F, //HANGUL SYLLABLE MIEUM OE SIOS
+ 0xB9A5: 0xBB11, //HANGUL SYLLABLE MIEUM OE IEUNG
+ 0xB9A6: 0xBB18, //HANGUL SYLLABLE MIEUM YO
+ 0xB9A7: 0xBB1C, //HANGUL SYLLABLE MIEUM YO NIEUN
+ 0xB9A8: 0xBB20, //HANGUL SYLLABLE MIEUM YO RIEUL
+ 0xB9A9: 0xBB29, //HANGUL SYLLABLE MIEUM YO PIEUP
+ 0xB9AA: 0xBB2B, //HANGUL SYLLABLE MIEUM YO SIOS
+ 0xB9AB: 0xBB34, //HANGUL SYLLABLE MIEUM U
+ 0xB9AC: 0xBB35, //HANGUL SYLLABLE MIEUM U KIYEOK
+ 0xB9AD: 0xBB36, //HANGUL SYLLABLE MIEUM U SSANGKIYEOK
+ 0xB9AE: 0xBB38, //HANGUL SYLLABLE MIEUM U NIEUN
+ 0xB9AF: 0xBB3B, //HANGUL SYLLABLE MIEUM U TIKEUT
+ 0xB9B0: 0xBB3C, //HANGUL SYLLABLE MIEUM U RIEUL
+ 0xB9B1: 0xBB3D, //HANGUL SYLLABLE MIEUM U RIEULKIYEOK
+ 0xB9B2: 0xBB3E, //HANGUL SYLLABLE MIEUM U RIEULMIEUM
+ 0xB9B3: 0xBB44, //HANGUL SYLLABLE MIEUM U MIEUM
+ 0xB9B4: 0xBB45, //HANGUL SYLLABLE MIEUM U PIEUP
+ 0xB9B5: 0xBB47, //HANGUL SYLLABLE MIEUM U SIOS
+ 0xB9B6: 0xBB49, //HANGUL SYLLABLE MIEUM U IEUNG
+ 0xB9B7: 0xBB4D, //HANGUL SYLLABLE MIEUM U THIEUTH
+ 0xB9B8: 0xBB4F, //HANGUL SYLLABLE MIEUM U HIEUH
+ 0xB9B9: 0xBB50, //HANGUL SYLLABLE MIEUM WEO
+ 0xB9BA: 0xBB54, //HANGUL SYLLABLE MIEUM WEO NIEUN
+ 0xB9BB: 0xBB58, //HANGUL SYLLABLE MIEUM WEO RIEUL
+ 0xB9BC: 0xBB61, //HANGUL SYLLABLE MIEUM WEO PIEUP
+ 0xB9BD: 0xBB63, //HANGUL SYLLABLE MIEUM WEO SIOS
+ 0xB9BE: 0xBB6C, //HANGUL SYLLABLE MIEUM WE
+ 0xB9BF: 0xBB88, //HANGUL SYLLABLE MIEUM WI
+ 0xB9C0: 0xBB8C, //HANGUL SYLLABLE MIEUM WI NIEUN
+ 0xB9C1: 0xBB90, //HANGUL SYLLABLE MIEUM WI RIEUL
+ 0xB9C2: 0xBBA4, //HANGUL SYLLABLE MIEUM YU
+ 0xB9C3: 0xBBA8, //HANGUL SYLLABLE MIEUM YU NIEUN
+ 0xB9C4: 0xBBAC, //HANGUL SYLLABLE MIEUM YU RIEUL
+ 0xB9C5: 0xBBB4, //HANGUL SYLLABLE MIEUM YU MIEUM
+ 0xB9C6: 0xBBB7, //HANGUL SYLLABLE MIEUM YU SIOS
+ 0xB9C7: 0xBBC0, //HANGUL SYLLABLE MIEUM EU
+ 0xB9C8: 0xBBC4, //HANGUL SYLLABLE MIEUM EU NIEUN
+ 0xB9C9: 0xBBC8, //HANGUL SYLLABLE MIEUM EU RIEUL
+ 0xB9CA: 0xBBD0, //HANGUL SYLLABLE MIEUM EU MIEUM
+ 0xB9CB: 0xBBD3, //HANGUL SYLLABLE MIEUM EU SIOS
+ 0xB9CC: 0xBBF8, //HANGUL SYLLABLE MIEUM I
+ 0xB9CD: 0xBBF9, //HANGUL SYLLABLE MIEUM I KIYEOK
+ 0xB9CE: 0xBBFC, //HANGUL SYLLABLE MIEUM I NIEUN
+ 0xB9CF: 0xBBFF, //HANGUL SYLLABLE MIEUM I TIKEUT
+ 0xB9D0: 0xBC00, //HANGUL SYLLABLE MIEUM I RIEUL
+ 0xB9D1: 0xBC02, //HANGUL SYLLABLE MIEUM I RIEULMIEUM
+ 0xB9D2: 0xBC08, //HANGUL SYLLABLE MIEUM I MIEUM
+ 0xB9D3: 0xBC09, //HANGUL SYLLABLE MIEUM I PIEUP
+ 0xB9D4: 0xBC0B, //HANGUL SYLLABLE MIEUM I SIOS
+ 0xB9D5: 0xBC0C, //HANGUL SYLLABLE MIEUM I SSANGSIOS
+ 0xB9D6: 0xBC0D, //HANGUL SYLLABLE MIEUM I IEUNG
+ 0xB9D7: 0xBC0F, //HANGUL SYLLABLE MIEUM I CHIEUCH
+ 0xB9D8: 0xBC11, //HANGUL SYLLABLE MIEUM I THIEUTH
+ 0xB9D9: 0xBC14, //HANGUL SYLLABLE PIEUP A
+ 0xB9DA: 0xBC15, //HANGUL SYLLABLE PIEUP A KIYEOK
+ 0xB9DB: 0xBC16, //HANGUL SYLLABLE PIEUP A SSANGKIYEOK
+ 0xB9DC: 0xBC17, //HANGUL SYLLABLE PIEUP A KIYEOKSIOS
+ 0xB9DD: 0xBC18, //HANGUL SYLLABLE PIEUP A NIEUN
+ 0xB9DE: 0xBC1B, //HANGUL SYLLABLE PIEUP A TIKEUT
+ 0xB9DF: 0xBC1C, //HANGUL SYLLABLE PIEUP A RIEUL
+ 0xB9E0: 0xBC1D, //HANGUL SYLLABLE PIEUP A RIEULKIYEOK
+ 0xB9E1: 0xBC1E, //HANGUL SYLLABLE PIEUP A RIEULMIEUM
+ 0xB9E2: 0xBC1F, //HANGUL SYLLABLE PIEUP A RIEULPIEUP
+ 0xB9E3: 0xBC24, //HANGUL SYLLABLE PIEUP A MIEUM
+ 0xB9E4: 0xBC25, //HANGUL SYLLABLE PIEUP A PIEUP
+ 0xB9E5: 0xBC27, //HANGUL SYLLABLE PIEUP A SIOS
+ 0xB9E6: 0xBC29, //HANGUL SYLLABLE PIEUP A IEUNG
+ 0xB9E7: 0xBC2D, //HANGUL SYLLABLE PIEUP A THIEUTH
+ 0xB9E8: 0xBC30, //HANGUL SYLLABLE PIEUP AE
+ 0xB9E9: 0xBC31, //HANGUL SYLLABLE PIEUP AE KIYEOK
+ 0xB9EA: 0xBC34, //HANGUL SYLLABLE PIEUP AE NIEUN
+ 0xB9EB: 0xBC38, //HANGUL SYLLABLE PIEUP AE RIEUL
+ 0xB9EC: 0xBC40, //HANGUL SYLLABLE PIEUP AE MIEUM
+ 0xB9ED: 0xBC41, //HANGUL SYLLABLE PIEUP AE PIEUP
+ 0xB9EE: 0xBC43, //HANGUL SYLLABLE PIEUP AE SIOS
+ 0xB9EF: 0xBC44, //HANGUL SYLLABLE PIEUP AE SSANGSIOS
+ 0xB9F0: 0xBC45, //HANGUL SYLLABLE PIEUP AE IEUNG
+ 0xB9F1: 0xBC49, //HANGUL SYLLABLE PIEUP AE THIEUTH
+ 0xB9F2: 0xBC4C, //HANGUL SYLLABLE PIEUP YA
+ 0xB9F3: 0xBC4D, //HANGUL SYLLABLE PIEUP YA KIYEOK
+ 0xB9F4: 0xBC50, //HANGUL SYLLABLE PIEUP YA NIEUN
+ 0xB9F5: 0xBC5D, //HANGUL SYLLABLE PIEUP YA PIEUP
+ 0xB9F6: 0xBC84, //HANGUL SYLLABLE PIEUP EO
+ 0xB9F7: 0xBC85, //HANGUL SYLLABLE PIEUP EO KIYEOK
+ 0xB9F8: 0xBC88, //HANGUL SYLLABLE PIEUP EO NIEUN
+ 0xB9F9: 0xBC8B, //HANGUL SYLLABLE PIEUP EO TIKEUT
+ 0xB9FA: 0xBC8C, //HANGUL SYLLABLE PIEUP EO RIEUL
+ 0xB9FB: 0xBC8E, //HANGUL SYLLABLE PIEUP EO RIEULMIEUM
+ 0xB9FC: 0xBC94, //HANGUL SYLLABLE PIEUP EO MIEUM
+ 0xB9FD: 0xBC95, //HANGUL SYLLABLE PIEUP EO PIEUP
+ 0xB9FE: 0xBC97, //HANGUL SYLLABLE PIEUP EO SIOS
+ 0xBA41: 0xD28D, //HANGUL SYLLABLE THIEUTH WI RIEULTHIEUTH
+ 0xBA42: 0xD28E, //HANGUL SYLLABLE THIEUTH WI RIEULPHIEUPH
+ 0xBA43: 0xD28F, //HANGUL SYLLABLE THIEUTH WI RIEULHIEUH
+ 0xBA44: 0xD292, //HANGUL SYLLABLE THIEUTH WI PIEUPSIOS
+ 0xBA45: 0xD293, //HANGUL SYLLABLE THIEUTH WI SIOS
+ 0xBA46: 0xD294, //HANGUL SYLLABLE THIEUTH WI SSANGSIOS
+ 0xBA47: 0xD296, //HANGUL SYLLABLE THIEUTH WI CIEUC
+ 0xBA48: 0xD297, //HANGUL SYLLABLE THIEUTH WI CHIEUCH
+ 0xBA49: 0xD298, //HANGUL SYLLABLE THIEUTH WI KHIEUKH
+ 0xBA4A: 0xD299, //HANGUL SYLLABLE THIEUTH WI THIEUTH
+ 0xBA4B: 0xD29A, //HANGUL SYLLABLE THIEUTH WI PHIEUPH
+ 0xBA4C: 0xD29B, //HANGUL SYLLABLE THIEUTH WI HIEUH
+ 0xBA4D: 0xD29D, //HANGUL SYLLABLE THIEUTH YU KIYEOK
+ 0xBA4E: 0xD29E, //HANGUL SYLLABLE THIEUTH YU SSANGKIYEOK
+ 0xBA4F: 0xD29F, //HANGUL SYLLABLE THIEUTH YU KIYEOKSIOS
+ 0xBA50: 0xD2A1, //HANGUL SYLLABLE THIEUTH YU NIEUNCIEUC
+ 0xBA51: 0xD2A2, //HANGUL SYLLABLE THIEUTH YU NIEUNHIEUH
+ 0xBA52: 0xD2A3, //HANGUL SYLLABLE THIEUTH YU TIKEUT
+ 0xBA53: 0xD2A5, //HANGUL SYLLABLE THIEUTH YU RIEULKIYEOK
+ 0xBA54: 0xD2A6, //HANGUL SYLLABLE THIEUTH YU RIEULMIEUM
+ 0xBA55: 0xD2A7, //HANGUL SYLLABLE THIEUTH YU RIEULPIEUP
+ 0xBA56: 0xD2A8, //HANGUL SYLLABLE THIEUTH YU RIEULSIOS
+ 0xBA57: 0xD2A9, //HANGUL SYLLABLE THIEUTH YU RIEULTHIEUTH
+ 0xBA58: 0xD2AA, //HANGUL SYLLABLE THIEUTH YU RIEULPHIEUPH
+ 0xBA59: 0xD2AB, //HANGUL SYLLABLE THIEUTH YU RIEULHIEUH
+ 0xBA5A: 0xD2AD, //HANGUL SYLLABLE THIEUTH YU PIEUP
+ 0xBA61: 0xD2AE, //HANGUL SYLLABLE THIEUTH YU PIEUPSIOS
+ 0xBA62: 0xD2AF, //HANGUL SYLLABLE THIEUTH YU SIOS
+ 0xBA63: 0xD2B0, //HANGUL SYLLABLE THIEUTH YU SSANGSIOS
+ 0xBA64: 0xD2B2, //HANGUL SYLLABLE THIEUTH YU CIEUC
+ 0xBA65: 0xD2B3, //HANGUL SYLLABLE THIEUTH YU CHIEUCH
+ 0xBA66: 0xD2B4, //HANGUL SYLLABLE THIEUTH YU KHIEUKH
+ 0xBA67: 0xD2B5, //HANGUL SYLLABLE THIEUTH YU THIEUTH
+ 0xBA68: 0xD2B6, //HANGUL SYLLABLE THIEUTH YU PHIEUPH
+ 0xBA69: 0xD2B7, //HANGUL SYLLABLE THIEUTH YU HIEUH
+ 0xBA6A: 0xD2BA, //HANGUL SYLLABLE THIEUTH EU SSANGKIYEOK
+ 0xBA6B: 0xD2BB, //HANGUL SYLLABLE THIEUTH EU KIYEOKSIOS
+ 0xBA6C: 0xD2BD, //HANGUL SYLLABLE THIEUTH EU NIEUNCIEUC
+ 0xBA6D: 0xD2BE, //HANGUL SYLLABLE THIEUTH EU NIEUNHIEUH
+ 0xBA6E: 0xD2C1, //HANGUL SYLLABLE THIEUTH EU RIEULKIYEOK
+ 0xBA6F: 0xD2C3, //HANGUL SYLLABLE THIEUTH EU RIEULPIEUP
+ 0xBA70: 0xD2C4, //HANGUL SYLLABLE THIEUTH EU RIEULSIOS
+ 0xBA71: 0xD2C5, //HANGUL SYLLABLE THIEUTH EU RIEULTHIEUTH
+ 0xBA72: 0xD2C6, //HANGUL SYLLABLE THIEUTH EU RIEULPHIEUPH
+ 0xBA73: 0xD2C7, //HANGUL SYLLABLE THIEUTH EU RIEULHIEUH
+ 0xBA74: 0xD2CA, //HANGUL SYLLABLE THIEUTH EU PIEUPSIOS
+ 0xBA75: 0xD2CC, //HANGUL SYLLABLE THIEUTH EU SSANGSIOS
+ 0xBA76: 0xD2CD, //HANGUL SYLLABLE THIEUTH EU IEUNG
+ 0xBA77: 0xD2CE, //HANGUL SYLLABLE THIEUTH EU CIEUC
+ 0xBA78: 0xD2CF, //HANGUL SYLLABLE THIEUTH EU CHIEUCH
+ 0xBA79: 0xD2D0, //HANGUL SYLLABLE THIEUTH EU KHIEUKH
+ 0xBA7A: 0xD2D1, //HANGUL SYLLABLE THIEUTH EU THIEUTH
+ 0xBA81: 0xD2D2, //HANGUL SYLLABLE THIEUTH EU PHIEUPH
+ 0xBA82: 0xD2D3, //HANGUL SYLLABLE THIEUTH EU HIEUH
+ 0xBA83: 0xD2D5, //HANGUL SYLLABLE THIEUTH YI KIYEOK
+ 0xBA84: 0xD2D6, //HANGUL SYLLABLE THIEUTH YI SSANGKIYEOK
+ 0xBA85: 0xD2D7, //HANGUL SYLLABLE THIEUTH YI KIYEOKSIOS
+ 0xBA86: 0xD2D9, //HANGUL SYLLABLE THIEUTH YI NIEUNCIEUC
+ 0xBA87: 0xD2DA, //HANGUL SYLLABLE THIEUTH YI NIEUNHIEUH
+ 0xBA88: 0xD2DB, //HANGUL SYLLABLE THIEUTH YI TIKEUT
+ 0xBA89: 0xD2DD, //HANGUL SYLLABLE THIEUTH YI RIEULKIYEOK
+ 0xBA8A: 0xD2DE, //HANGUL SYLLABLE THIEUTH YI RIEULMIEUM
+ 0xBA8B: 0xD2DF, //HANGUL SYLLABLE THIEUTH YI RIEULPIEUP
+ 0xBA8C: 0xD2E0, //HANGUL SYLLABLE THIEUTH YI RIEULSIOS
+ 0xBA8D: 0xD2E1, //HANGUL SYLLABLE THIEUTH YI RIEULTHIEUTH
+ 0xBA8E: 0xD2E2, //HANGUL SYLLABLE THIEUTH YI RIEULPHIEUPH
+ 0xBA8F: 0xD2E3, //HANGUL SYLLABLE THIEUTH YI RIEULHIEUH
+ 0xBA90: 0xD2E6, //HANGUL SYLLABLE THIEUTH YI PIEUPSIOS
+ 0xBA91: 0xD2E7, //HANGUL SYLLABLE THIEUTH YI SIOS
+ 0xBA92: 0xD2E8, //HANGUL SYLLABLE THIEUTH YI SSANGSIOS
+ 0xBA93: 0xD2E9, //HANGUL SYLLABLE THIEUTH YI IEUNG
+ 0xBA94: 0xD2EA, //HANGUL SYLLABLE THIEUTH YI CIEUC
+ 0xBA95: 0xD2EB, //HANGUL SYLLABLE THIEUTH YI CHIEUCH
+ 0xBA96: 0xD2EC, //HANGUL SYLLABLE THIEUTH YI KHIEUKH
+ 0xBA97: 0xD2ED, //HANGUL SYLLABLE THIEUTH YI THIEUTH
+ 0xBA98: 0xD2EE, //HANGUL SYLLABLE THIEUTH YI PHIEUPH
+ 0xBA99: 0xD2EF, //HANGUL SYLLABLE THIEUTH YI HIEUH
+ 0xBA9A: 0xD2F2, //HANGUL SYLLABLE THIEUTH I SSANGKIYEOK
+ 0xBA9B: 0xD2F3, //HANGUL SYLLABLE THIEUTH I KIYEOKSIOS
+ 0xBA9C: 0xD2F5, //HANGUL SYLLABLE THIEUTH I NIEUNCIEUC
+ 0xBA9D: 0xD2F6, //HANGUL SYLLABLE THIEUTH I NIEUNHIEUH
+ 0xBA9E: 0xD2F7, //HANGUL SYLLABLE THIEUTH I TIKEUT
+ 0xBA9F: 0xD2F9, //HANGUL SYLLABLE THIEUTH I RIEULKIYEOK
+ 0xBAA0: 0xD2FA, //HANGUL SYLLABLE THIEUTH I RIEULMIEUM
+ 0xBAA1: 0xBC99, //HANGUL SYLLABLE PIEUP EO IEUNG
+ 0xBAA2: 0xBC9A, //HANGUL SYLLABLE PIEUP EO CIEUC
+ 0xBAA3: 0xBCA0, //HANGUL SYLLABLE PIEUP E
+ 0xBAA4: 0xBCA1, //HANGUL SYLLABLE PIEUP E KIYEOK
+ 0xBAA5: 0xBCA4, //HANGUL SYLLABLE PIEUP E NIEUN
+ 0xBAA6: 0xBCA7, //HANGUL SYLLABLE PIEUP E TIKEUT
+ 0xBAA7: 0xBCA8, //HANGUL SYLLABLE PIEUP E RIEUL
+ 0xBAA8: 0xBCB0, //HANGUL SYLLABLE PIEUP E MIEUM
+ 0xBAA9: 0xBCB1, //HANGUL SYLLABLE PIEUP E PIEUP
+ 0xBAAA: 0xBCB3, //HANGUL SYLLABLE PIEUP E SIOS
+ 0xBAAB: 0xBCB4, //HANGUL SYLLABLE PIEUP E SSANGSIOS
+ 0xBAAC: 0xBCB5, //HANGUL SYLLABLE PIEUP E IEUNG
+ 0xBAAD: 0xBCBC, //HANGUL SYLLABLE PIEUP YEO
+ 0xBAAE: 0xBCBD, //HANGUL SYLLABLE PIEUP YEO KIYEOK
+ 0xBAAF: 0xBCC0, //HANGUL SYLLABLE PIEUP YEO NIEUN
+ 0xBAB0: 0xBCC4, //HANGUL SYLLABLE PIEUP YEO RIEUL
+ 0xBAB1: 0xBCCD, //HANGUL SYLLABLE PIEUP YEO PIEUP
+ 0xBAB2: 0xBCCF, //HANGUL SYLLABLE PIEUP YEO SIOS
+ 0xBAB3: 0xBCD0, //HANGUL SYLLABLE PIEUP YEO SSANGSIOS
+ 0xBAB4: 0xBCD1, //HANGUL SYLLABLE PIEUP YEO IEUNG
+ 0xBAB5: 0xBCD5, //HANGUL SYLLABLE PIEUP YEO THIEUTH
+ 0xBAB6: 0xBCD8, //HANGUL SYLLABLE PIEUP YE
+ 0xBAB7: 0xBCDC, //HANGUL SYLLABLE PIEUP YE NIEUN
+ 0xBAB8: 0xBCF4, //HANGUL SYLLABLE PIEUP O
+ 0xBAB9: 0xBCF5, //HANGUL SYLLABLE PIEUP O KIYEOK
+ 0xBABA: 0xBCF6, //HANGUL SYLLABLE PIEUP O SSANGKIYEOK
+ 0xBABB: 0xBCF8, //HANGUL SYLLABLE PIEUP O NIEUN
+ 0xBABC: 0xBCFC, //HANGUL SYLLABLE PIEUP O RIEUL
+ 0xBABD: 0xBD04, //HANGUL SYLLABLE PIEUP O MIEUM
+ 0xBABE: 0xBD05, //HANGUL SYLLABLE PIEUP O PIEUP
+ 0xBABF: 0xBD07, //HANGUL SYLLABLE PIEUP O SIOS
+ 0xBAC0: 0xBD09, //HANGUL SYLLABLE PIEUP O IEUNG
+ 0xBAC1: 0xBD10, //HANGUL SYLLABLE PIEUP WA
+ 0xBAC2: 0xBD14, //HANGUL SYLLABLE PIEUP WA NIEUN
+ 0xBAC3: 0xBD24, //HANGUL SYLLABLE PIEUP WA SSANGSIOS
+ 0xBAC4: 0xBD2C, //HANGUL SYLLABLE PIEUP WAE
+ 0xBAC5: 0xBD40, //HANGUL SYLLABLE PIEUP WAE SSANGSIOS
+ 0xBAC6: 0xBD48, //HANGUL SYLLABLE PIEUP OE
+ 0xBAC7: 0xBD49, //HANGUL SYLLABLE PIEUP OE KIYEOK
+ 0xBAC8: 0xBD4C, //HANGUL SYLLABLE PIEUP OE NIEUN
+ 0xBAC9: 0xBD50, //HANGUL SYLLABLE PIEUP OE RIEUL
+ 0xBACA: 0xBD58, //HANGUL SYLLABLE PIEUP OE MIEUM
+ 0xBACB: 0xBD59, //HANGUL SYLLABLE PIEUP OE PIEUP
+ 0xBACC: 0xBD64, //HANGUL SYLLABLE PIEUP YO
+ 0xBACD: 0xBD68, //HANGUL SYLLABLE PIEUP YO NIEUN
+ 0xBACE: 0xBD80, //HANGUL SYLLABLE PIEUP U
+ 0xBACF: 0xBD81, //HANGUL SYLLABLE PIEUP U KIYEOK
+ 0xBAD0: 0xBD84, //HANGUL SYLLABLE PIEUP U NIEUN
+ 0xBAD1: 0xBD87, //HANGUL SYLLABLE PIEUP U TIKEUT
+ 0xBAD2: 0xBD88, //HANGUL SYLLABLE PIEUP U RIEUL
+ 0xBAD3: 0xBD89, //HANGUL SYLLABLE PIEUP U RIEULKIYEOK
+ 0xBAD4: 0xBD8A, //HANGUL SYLLABLE PIEUP U RIEULMIEUM
+ 0xBAD5: 0xBD90, //HANGUL SYLLABLE PIEUP U MIEUM
+ 0xBAD6: 0xBD91, //HANGUL SYLLABLE PIEUP U PIEUP
+ 0xBAD7: 0xBD93, //HANGUL SYLLABLE PIEUP U SIOS
+ 0xBAD8: 0xBD95, //HANGUL SYLLABLE PIEUP U IEUNG
+ 0xBAD9: 0xBD99, //HANGUL SYLLABLE PIEUP U THIEUTH
+ 0xBADA: 0xBD9A, //HANGUL SYLLABLE PIEUP U PHIEUPH
+ 0xBADB: 0xBD9C, //HANGUL SYLLABLE PIEUP WEO
+ 0xBADC: 0xBDA4, //HANGUL SYLLABLE PIEUP WEO RIEUL
+ 0xBADD: 0xBDB0, //HANGUL SYLLABLE PIEUP WEO SSANGSIOS
+ 0xBADE: 0xBDB8, //HANGUL SYLLABLE PIEUP WE
+ 0xBADF: 0xBDD4, //HANGUL SYLLABLE PIEUP WI
+ 0xBAE0: 0xBDD5, //HANGUL SYLLABLE PIEUP WI KIYEOK
+ 0xBAE1: 0xBDD8, //HANGUL SYLLABLE PIEUP WI NIEUN
+ 0xBAE2: 0xBDDC, //HANGUL SYLLABLE PIEUP WI RIEUL
+ 0xBAE3: 0xBDE9, //HANGUL SYLLABLE PIEUP WI IEUNG
+ 0xBAE4: 0xBDF0, //HANGUL SYLLABLE PIEUP YU
+ 0xBAE5: 0xBDF4, //HANGUL SYLLABLE PIEUP YU NIEUN
+ 0xBAE6: 0xBDF8, //HANGUL SYLLABLE PIEUP YU RIEUL
+ 0xBAE7: 0xBE00, //HANGUL SYLLABLE PIEUP YU MIEUM
+ 0xBAE8: 0xBE03, //HANGUL SYLLABLE PIEUP YU SIOS
+ 0xBAE9: 0xBE05, //HANGUL SYLLABLE PIEUP YU IEUNG
+ 0xBAEA: 0xBE0C, //HANGUL SYLLABLE PIEUP EU
+ 0xBAEB: 0xBE0D, //HANGUL SYLLABLE PIEUP EU KIYEOK
+ 0xBAEC: 0xBE10, //HANGUL SYLLABLE PIEUP EU NIEUN
+ 0xBAED: 0xBE14, //HANGUL SYLLABLE PIEUP EU RIEUL
+ 0xBAEE: 0xBE1C, //HANGUL SYLLABLE PIEUP EU MIEUM
+ 0xBAEF: 0xBE1D, //HANGUL SYLLABLE PIEUP EU PIEUP
+ 0xBAF0: 0xBE1F, //HANGUL SYLLABLE PIEUP EU SIOS
+ 0xBAF1: 0xBE44, //HANGUL SYLLABLE PIEUP I
+ 0xBAF2: 0xBE45, //HANGUL SYLLABLE PIEUP I KIYEOK
+ 0xBAF3: 0xBE48, //HANGUL SYLLABLE PIEUP I NIEUN
+ 0xBAF4: 0xBE4C, //HANGUL SYLLABLE PIEUP I RIEUL
+ 0xBAF5: 0xBE4E, //HANGUL SYLLABLE PIEUP I RIEULMIEUM
+ 0xBAF6: 0xBE54, //HANGUL SYLLABLE PIEUP I MIEUM
+ 0xBAF7: 0xBE55, //HANGUL SYLLABLE PIEUP I PIEUP
+ 0xBAF8: 0xBE57, //HANGUL SYLLABLE PIEUP I SIOS
+ 0xBAF9: 0xBE59, //HANGUL SYLLABLE PIEUP I IEUNG
+ 0xBAFA: 0xBE5A, //HANGUL SYLLABLE PIEUP I CIEUC
+ 0xBAFB: 0xBE5B, //HANGUL SYLLABLE PIEUP I CHIEUCH
+ 0xBAFC: 0xBE60, //HANGUL SYLLABLE SSANGPIEUP A
+ 0xBAFD: 0xBE61, //HANGUL SYLLABLE SSANGPIEUP A KIYEOK
+ 0xBAFE: 0xBE64, //HANGUL SYLLABLE SSANGPIEUP A NIEUN
+ 0xBB41: 0xD2FB, //HANGUL SYLLABLE THIEUTH I RIEULPIEUP
+ 0xBB42: 0xD2FC, //HANGUL SYLLABLE THIEUTH I RIEULSIOS
+ 0xBB43: 0xD2FD, //HANGUL SYLLABLE THIEUTH I RIEULTHIEUTH
+ 0xBB44: 0xD2FE, //HANGUL SYLLABLE THIEUTH I RIEULPHIEUPH
+ 0xBB45: 0xD2FF, //HANGUL SYLLABLE THIEUTH I RIEULHIEUH
+ 0xBB46: 0xD302, //HANGUL SYLLABLE THIEUTH I PIEUPSIOS
+ 0xBB47: 0xD304, //HANGUL SYLLABLE THIEUTH I SSANGSIOS
+ 0xBB48: 0xD306, //HANGUL SYLLABLE THIEUTH I CIEUC
+ 0xBB49: 0xD307, //HANGUL SYLLABLE THIEUTH I CHIEUCH
+ 0xBB4A: 0xD308, //HANGUL SYLLABLE THIEUTH I KHIEUKH
+ 0xBB4B: 0xD309, //HANGUL SYLLABLE THIEUTH I THIEUTH
+ 0xBB4C: 0xD30A, //HANGUL SYLLABLE THIEUTH I PHIEUPH
+ 0xBB4D: 0xD30B, //HANGUL SYLLABLE THIEUTH I HIEUH
+ 0xBB4E: 0xD30F, //HANGUL SYLLABLE PHIEUPH A KIYEOKSIOS
+ 0xBB4F: 0xD311, //HANGUL SYLLABLE PHIEUPH A NIEUNCIEUC
+ 0xBB50: 0xD312, //HANGUL SYLLABLE PHIEUPH A NIEUNHIEUH
+ 0xBB51: 0xD313, //HANGUL SYLLABLE PHIEUPH A TIKEUT
+ 0xBB52: 0xD315, //HANGUL SYLLABLE PHIEUPH A RIEULKIYEOK
+ 0xBB53: 0xD317, //HANGUL SYLLABLE PHIEUPH A RIEULPIEUP
+ 0xBB54: 0xD318, //HANGUL SYLLABLE PHIEUPH A RIEULSIOS
+ 0xBB55: 0xD319, //HANGUL SYLLABLE PHIEUPH A RIEULTHIEUTH
+ 0xBB56: 0xD31A, //HANGUL SYLLABLE PHIEUPH A RIEULPHIEUPH
+ 0xBB57: 0xD31B, //HANGUL SYLLABLE PHIEUPH A RIEULHIEUH
+ 0xBB58: 0xD31E, //HANGUL SYLLABLE PHIEUPH A PIEUPSIOS
+ 0xBB59: 0xD322, //HANGUL SYLLABLE PHIEUPH A CIEUC
+ 0xBB5A: 0xD323, //HANGUL SYLLABLE PHIEUPH A CHIEUCH
+ 0xBB61: 0xD324, //HANGUL SYLLABLE PHIEUPH A KHIEUKH
+ 0xBB62: 0xD326, //HANGUL SYLLABLE PHIEUPH A PHIEUPH
+ 0xBB63: 0xD327, //HANGUL SYLLABLE PHIEUPH A HIEUH
+ 0xBB64: 0xD32A, //HANGUL SYLLABLE PHIEUPH AE SSANGKIYEOK
+ 0xBB65: 0xD32B, //HANGUL SYLLABLE PHIEUPH AE KIYEOKSIOS
+ 0xBB66: 0xD32D, //HANGUL SYLLABLE PHIEUPH AE NIEUNCIEUC
+ 0xBB67: 0xD32E, //HANGUL SYLLABLE PHIEUPH AE NIEUNHIEUH
+ 0xBB68: 0xD32F, //HANGUL SYLLABLE PHIEUPH AE TIKEUT
+ 0xBB69: 0xD331, //HANGUL SYLLABLE PHIEUPH AE RIEULKIYEOK
+ 0xBB6A: 0xD332, //HANGUL SYLLABLE PHIEUPH AE RIEULMIEUM
+ 0xBB6B: 0xD333, //HANGUL SYLLABLE PHIEUPH AE RIEULPIEUP
+ 0xBB6C: 0xD334, //HANGUL SYLLABLE PHIEUPH AE RIEULSIOS
+ 0xBB6D: 0xD335, //HANGUL SYLLABLE PHIEUPH AE RIEULTHIEUTH
+ 0xBB6E: 0xD336, //HANGUL SYLLABLE PHIEUPH AE RIEULPHIEUPH
+ 0xBB6F: 0xD337, //HANGUL SYLLABLE PHIEUPH AE RIEULHIEUH
+ 0xBB70: 0xD33A, //HANGUL SYLLABLE PHIEUPH AE PIEUPSIOS
+ 0xBB71: 0xD33E, //HANGUL SYLLABLE PHIEUPH AE CIEUC
+ 0xBB72: 0xD33F, //HANGUL SYLLABLE PHIEUPH AE CHIEUCH
+ 0xBB73: 0xD340, //HANGUL SYLLABLE PHIEUPH AE KHIEUKH
+ 0xBB74: 0xD341, //HANGUL SYLLABLE PHIEUPH AE THIEUTH
+ 0xBB75: 0xD342, //HANGUL SYLLABLE PHIEUPH AE PHIEUPH
+ 0xBB76: 0xD343, //HANGUL SYLLABLE PHIEUPH AE HIEUH
+ 0xBB77: 0xD346, //HANGUL SYLLABLE PHIEUPH YA SSANGKIYEOK
+ 0xBB78: 0xD347, //HANGUL SYLLABLE PHIEUPH YA KIYEOKSIOS
+ 0xBB79: 0xD348, //HANGUL SYLLABLE PHIEUPH YA NIEUN
+ 0xBB7A: 0xD349, //HANGUL SYLLABLE PHIEUPH YA NIEUNCIEUC
+ 0xBB81: 0xD34A, //HANGUL SYLLABLE PHIEUPH YA NIEUNHIEUH
+ 0xBB82: 0xD34B, //HANGUL SYLLABLE PHIEUPH YA TIKEUT
+ 0xBB83: 0xD34C, //HANGUL SYLLABLE PHIEUPH YA RIEUL
+ 0xBB84: 0xD34D, //HANGUL SYLLABLE PHIEUPH YA RIEULKIYEOK
+ 0xBB85: 0xD34E, //HANGUL SYLLABLE PHIEUPH YA RIEULMIEUM
+ 0xBB86: 0xD34F, //HANGUL SYLLABLE PHIEUPH YA RIEULPIEUP
+ 0xBB87: 0xD350, //HANGUL SYLLABLE PHIEUPH YA RIEULSIOS
+ 0xBB88: 0xD351, //HANGUL SYLLABLE PHIEUPH YA RIEULTHIEUTH
+ 0xBB89: 0xD352, //HANGUL SYLLABLE PHIEUPH YA RIEULPHIEUPH
+ 0xBB8A: 0xD353, //HANGUL SYLLABLE PHIEUPH YA RIEULHIEUH
+ 0xBB8B: 0xD354, //HANGUL SYLLABLE PHIEUPH YA MIEUM
+ 0xBB8C: 0xD355, //HANGUL SYLLABLE PHIEUPH YA PIEUP
+ 0xBB8D: 0xD356, //HANGUL SYLLABLE PHIEUPH YA PIEUPSIOS
+ 0xBB8E: 0xD357, //HANGUL SYLLABLE PHIEUPH YA SIOS
+ 0xBB8F: 0xD358, //HANGUL SYLLABLE PHIEUPH YA SSANGSIOS
+ 0xBB90: 0xD359, //HANGUL SYLLABLE PHIEUPH YA IEUNG
+ 0xBB91: 0xD35A, //HANGUL SYLLABLE PHIEUPH YA CIEUC
+ 0xBB92: 0xD35B, //HANGUL SYLLABLE PHIEUPH YA CHIEUCH
+ 0xBB93: 0xD35C, //HANGUL SYLLABLE PHIEUPH YA KHIEUKH
+ 0xBB94: 0xD35D, //HANGUL SYLLABLE PHIEUPH YA THIEUTH
+ 0xBB95: 0xD35E, //HANGUL SYLLABLE PHIEUPH YA PHIEUPH
+ 0xBB96: 0xD35F, //HANGUL SYLLABLE PHIEUPH YA HIEUH
+ 0xBB97: 0xD360, //HANGUL SYLLABLE PHIEUPH YAE
+ 0xBB98: 0xD361, //HANGUL SYLLABLE PHIEUPH YAE KIYEOK
+ 0xBB99: 0xD362, //HANGUL SYLLABLE PHIEUPH YAE SSANGKIYEOK
+ 0xBB9A: 0xD363, //HANGUL SYLLABLE PHIEUPH YAE KIYEOKSIOS
+ 0xBB9B: 0xD364, //HANGUL SYLLABLE PHIEUPH YAE NIEUN
+ 0xBB9C: 0xD365, //HANGUL SYLLABLE PHIEUPH YAE NIEUNCIEUC
+ 0xBB9D: 0xD366, //HANGUL SYLLABLE PHIEUPH YAE NIEUNHIEUH
+ 0xBB9E: 0xD367, //HANGUL SYLLABLE PHIEUPH YAE TIKEUT
+ 0xBB9F: 0xD368, //HANGUL SYLLABLE PHIEUPH YAE RIEUL
+ 0xBBA0: 0xD369, //HANGUL SYLLABLE PHIEUPH YAE RIEULKIYEOK
+ 0xBBA1: 0xBE68, //HANGUL SYLLABLE SSANGPIEUP A RIEUL
+ 0xBBA2: 0xBE6A, //HANGUL SYLLABLE SSANGPIEUP A RIEULMIEUM
+ 0xBBA3: 0xBE70, //HANGUL SYLLABLE SSANGPIEUP A MIEUM
+ 0xBBA4: 0xBE71, //HANGUL SYLLABLE SSANGPIEUP A PIEUP
+ 0xBBA5: 0xBE73, //HANGUL SYLLABLE SSANGPIEUP A SIOS
+ 0xBBA6: 0xBE74, //HANGUL SYLLABLE SSANGPIEUP A SSANGSIOS
+ 0xBBA7: 0xBE75, //HANGUL SYLLABLE SSANGPIEUP A IEUNG
+ 0xBBA8: 0xBE7B, //HANGUL SYLLABLE SSANGPIEUP A HIEUH
+ 0xBBA9: 0xBE7C, //HANGUL SYLLABLE SSANGPIEUP AE
+ 0xBBAA: 0xBE7D, //HANGUL SYLLABLE SSANGPIEUP AE KIYEOK
+ 0xBBAB: 0xBE80, //HANGUL SYLLABLE SSANGPIEUP AE NIEUN
+ 0xBBAC: 0xBE84, //HANGUL SYLLABLE SSANGPIEUP AE RIEUL
+ 0xBBAD: 0xBE8C, //HANGUL SYLLABLE SSANGPIEUP AE MIEUM
+ 0xBBAE: 0xBE8D, //HANGUL SYLLABLE SSANGPIEUP AE PIEUP
+ 0xBBAF: 0xBE8F, //HANGUL SYLLABLE SSANGPIEUP AE SIOS
+ 0xBBB0: 0xBE90, //HANGUL SYLLABLE SSANGPIEUP AE SSANGSIOS
+ 0xBBB1: 0xBE91, //HANGUL SYLLABLE SSANGPIEUP AE IEUNG
+ 0xBBB2: 0xBE98, //HANGUL SYLLABLE SSANGPIEUP YA
+ 0xBBB3: 0xBE99, //HANGUL SYLLABLE SSANGPIEUP YA KIYEOK
+ 0xBBB4: 0xBEA8, //HANGUL SYLLABLE SSANGPIEUP YA MIEUM
+ 0xBBB5: 0xBED0, //HANGUL SYLLABLE SSANGPIEUP EO
+ 0xBBB6: 0xBED1, //HANGUL SYLLABLE SSANGPIEUP EO KIYEOK
+ 0xBBB7: 0xBED4, //HANGUL SYLLABLE SSANGPIEUP EO NIEUN
+ 0xBBB8: 0xBED7, //HANGUL SYLLABLE SSANGPIEUP EO TIKEUT
+ 0xBBB9: 0xBED8, //HANGUL SYLLABLE SSANGPIEUP EO RIEUL
+ 0xBBBA: 0xBEE0, //HANGUL SYLLABLE SSANGPIEUP EO MIEUM
+ 0xBBBB: 0xBEE3, //HANGUL SYLLABLE SSANGPIEUP EO SIOS
+ 0xBBBC: 0xBEE4, //HANGUL SYLLABLE SSANGPIEUP EO SSANGSIOS
+ 0xBBBD: 0xBEE5, //HANGUL SYLLABLE SSANGPIEUP EO IEUNG
+ 0xBBBE: 0xBEEC, //HANGUL SYLLABLE SSANGPIEUP E
+ 0xBBBF: 0xBF01, //HANGUL SYLLABLE SSANGPIEUP E IEUNG
+ 0xBBC0: 0xBF08, //HANGUL SYLLABLE SSANGPIEUP YEO
+ 0xBBC1: 0xBF09, //HANGUL SYLLABLE SSANGPIEUP YEO KIYEOK
+ 0xBBC2: 0xBF18, //HANGUL SYLLABLE SSANGPIEUP YEO MIEUM
+ 0xBBC3: 0xBF19, //HANGUL SYLLABLE SSANGPIEUP YEO PIEUP
+ 0xBBC4: 0xBF1B, //HANGUL SYLLABLE SSANGPIEUP YEO SIOS
+ 0xBBC5: 0xBF1C, //HANGUL SYLLABLE SSANGPIEUP YEO SSANGSIOS
+ 0xBBC6: 0xBF1D, //HANGUL SYLLABLE SSANGPIEUP YEO IEUNG
+ 0xBBC7: 0xBF40, //HANGUL SYLLABLE SSANGPIEUP O
+ 0xBBC8: 0xBF41, //HANGUL SYLLABLE SSANGPIEUP O KIYEOK
+ 0xBBC9: 0xBF44, //HANGUL SYLLABLE SSANGPIEUP O NIEUN
+ 0xBBCA: 0xBF48, //HANGUL SYLLABLE SSANGPIEUP O RIEUL
+ 0xBBCB: 0xBF50, //HANGUL SYLLABLE SSANGPIEUP O MIEUM
+ 0xBBCC: 0xBF51, //HANGUL SYLLABLE SSANGPIEUP O PIEUP
+ 0xBBCD: 0xBF55, //HANGUL SYLLABLE SSANGPIEUP O IEUNG
+ 0xBBCE: 0xBF94, //HANGUL SYLLABLE SSANGPIEUP OE
+ 0xBBCF: 0xBFB0, //HANGUL SYLLABLE SSANGPIEUP YO
+ 0xBBD0: 0xBFC5, //HANGUL SYLLABLE SSANGPIEUP YO IEUNG
+ 0xBBD1: 0xBFCC, //HANGUL SYLLABLE SSANGPIEUP U
+ 0xBBD2: 0xBFCD, //HANGUL SYLLABLE SSANGPIEUP U KIYEOK
+ 0xBBD3: 0xBFD0, //HANGUL SYLLABLE SSANGPIEUP U NIEUN
+ 0xBBD4: 0xBFD4, //HANGUL SYLLABLE SSANGPIEUP U RIEUL
+ 0xBBD5: 0xBFDC, //HANGUL SYLLABLE SSANGPIEUP U MIEUM
+ 0xBBD6: 0xBFDF, //HANGUL SYLLABLE SSANGPIEUP U SIOS
+ 0xBBD7: 0xBFE1, //HANGUL SYLLABLE SSANGPIEUP U IEUNG
+ 0xBBD8: 0xC03C, //HANGUL SYLLABLE SSANGPIEUP YU
+ 0xBBD9: 0xC051, //HANGUL SYLLABLE SSANGPIEUP YU IEUNG
+ 0xBBDA: 0xC058, //HANGUL SYLLABLE SSANGPIEUP EU
+ 0xBBDB: 0xC05C, //HANGUL SYLLABLE SSANGPIEUP EU NIEUN
+ 0xBBDC: 0xC060, //HANGUL SYLLABLE SSANGPIEUP EU RIEUL
+ 0xBBDD: 0xC068, //HANGUL SYLLABLE SSANGPIEUP EU MIEUM
+ 0xBBDE: 0xC069, //HANGUL SYLLABLE SSANGPIEUP EU PIEUP
+ 0xBBDF: 0xC090, //HANGUL SYLLABLE SSANGPIEUP I
+ 0xBBE0: 0xC091, //HANGUL SYLLABLE SSANGPIEUP I KIYEOK
+ 0xBBE1: 0xC094, //HANGUL SYLLABLE SSANGPIEUP I NIEUN
+ 0xBBE2: 0xC098, //HANGUL SYLLABLE SSANGPIEUP I RIEUL
+ 0xBBE3: 0xC0A0, //HANGUL SYLLABLE SSANGPIEUP I MIEUM
+ 0xBBE4: 0xC0A1, //HANGUL SYLLABLE SSANGPIEUP I PIEUP
+ 0xBBE5: 0xC0A3, //HANGUL SYLLABLE SSANGPIEUP I SIOS
+ 0xBBE6: 0xC0A5, //HANGUL SYLLABLE SSANGPIEUP I IEUNG
+ 0xBBE7: 0xC0AC, //HANGUL SYLLABLE SIOS A
+ 0xBBE8: 0xC0AD, //HANGUL SYLLABLE SIOS A KIYEOK
+ 0xBBE9: 0xC0AF, //HANGUL SYLLABLE SIOS A KIYEOKSIOS
+ 0xBBEA: 0xC0B0, //HANGUL SYLLABLE SIOS A NIEUN
+ 0xBBEB: 0xC0B3, //HANGUL SYLLABLE SIOS A TIKEUT
+ 0xBBEC: 0xC0B4, //HANGUL SYLLABLE SIOS A RIEUL
+ 0xBBED: 0xC0B5, //HANGUL SYLLABLE SIOS A RIEULKIYEOK
+ 0xBBEE: 0xC0B6, //HANGUL SYLLABLE SIOS A RIEULMIEUM
+ 0xBBEF: 0xC0BC, //HANGUL SYLLABLE SIOS A MIEUM
+ 0xBBF0: 0xC0BD, //HANGUL SYLLABLE SIOS A PIEUP
+ 0xBBF1: 0xC0BF, //HANGUL SYLLABLE SIOS A SIOS
+ 0xBBF2: 0xC0C0, //HANGUL SYLLABLE SIOS A SSANGSIOS
+ 0xBBF3: 0xC0C1, //HANGUL SYLLABLE SIOS A IEUNG
+ 0xBBF4: 0xC0C5, //HANGUL SYLLABLE SIOS A THIEUTH
+ 0xBBF5: 0xC0C8, //HANGUL SYLLABLE SIOS AE
+ 0xBBF6: 0xC0C9, //HANGUL SYLLABLE SIOS AE KIYEOK
+ 0xBBF7: 0xC0CC, //HANGUL SYLLABLE SIOS AE NIEUN
+ 0xBBF8: 0xC0D0, //HANGUL SYLLABLE SIOS AE RIEUL
+ 0xBBF9: 0xC0D8, //HANGUL SYLLABLE SIOS AE MIEUM
+ 0xBBFA: 0xC0D9, //HANGUL SYLLABLE SIOS AE PIEUP
+ 0xBBFB: 0xC0DB, //HANGUL SYLLABLE SIOS AE SIOS
+ 0xBBFC: 0xC0DC, //HANGUL SYLLABLE SIOS AE SSANGSIOS
+ 0xBBFD: 0xC0DD, //HANGUL SYLLABLE SIOS AE IEUNG
+ 0xBBFE: 0xC0E4, //HANGUL SYLLABLE SIOS YA
+ 0xBC41: 0xD36A, //HANGUL SYLLABLE PHIEUPH YAE RIEULMIEUM
+ 0xBC42: 0xD36B, //HANGUL SYLLABLE PHIEUPH YAE RIEULPIEUP
+ 0xBC43: 0xD36C, //HANGUL SYLLABLE PHIEUPH YAE RIEULSIOS
+ 0xBC44: 0xD36D, //HANGUL SYLLABLE PHIEUPH YAE RIEULTHIEUTH
+ 0xBC45: 0xD36E, //HANGUL SYLLABLE PHIEUPH YAE RIEULPHIEUPH
+ 0xBC46: 0xD36F, //HANGUL SYLLABLE PHIEUPH YAE RIEULHIEUH
+ 0xBC47: 0xD370, //HANGUL SYLLABLE PHIEUPH YAE MIEUM
+ 0xBC48: 0xD371, //HANGUL SYLLABLE PHIEUPH YAE PIEUP
+ 0xBC49: 0xD372, //HANGUL SYLLABLE PHIEUPH YAE PIEUPSIOS
+ 0xBC4A: 0xD373, //HANGUL SYLLABLE PHIEUPH YAE SIOS
+ 0xBC4B: 0xD374, //HANGUL SYLLABLE PHIEUPH YAE SSANGSIOS
+ 0xBC4C: 0xD375, //HANGUL SYLLABLE PHIEUPH YAE IEUNG
+ 0xBC4D: 0xD376, //HANGUL SYLLABLE PHIEUPH YAE CIEUC
+ 0xBC4E: 0xD377, //HANGUL SYLLABLE PHIEUPH YAE CHIEUCH
+ 0xBC4F: 0xD378, //HANGUL SYLLABLE PHIEUPH YAE KHIEUKH
+ 0xBC50: 0xD379, //HANGUL SYLLABLE PHIEUPH YAE THIEUTH
+ 0xBC51: 0xD37A, //HANGUL SYLLABLE PHIEUPH YAE PHIEUPH
+ 0xBC52: 0xD37B, //HANGUL SYLLABLE PHIEUPH YAE HIEUH
+ 0xBC53: 0xD37E, //HANGUL SYLLABLE PHIEUPH EO SSANGKIYEOK
+ 0xBC54: 0xD37F, //HANGUL SYLLABLE PHIEUPH EO KIYEOKSIOS
+ 0xBC55: 0xD381, //HANGUL SYLLABLE PHIEUPH EO NIEUNCIEUC
+ 0xBC56: 0xD382, //HANGUL SYLLABLE PHIEUPH EO NIEUNHIEUH
+ 0xBC57: 0xD383, //HANGUL SYLLABLE PHIEUPH EO TIKEUT
+ 0xBC58: 0xD385, //HANGUL SYLLABLE PHIEUPH EO RIEULKIYEOK
+ 0xBC59: 0xD386, //HANGUL SYLLABLE PHIEUPH EO RIEULMIEUM
+ 0xBC5A: 0xD387, //HANGUL SYLLABLE PHIEUPH EO RIEULPIEUP
+ 0xBC61: 0xD388, //HANGUL SYLLABLE PHIEUPH EO RIEULSIOS
+ 0xBC62: 0xD389, //HANGUL SYLLABLE PHIEUPH EO RIEULTHIEUTH
+ 0xBC63: 0xD38A, //HANGUL SYLLABLE PHIEUPH EO RIEULPHIEUPH
+ 0xBC64: 0xD38B, //HANGUL SYLLABLE PHIEUPH EO RIEULHIEUH
+ 0xBC65: 0xD38E, //HANGUL SYLLABLE PHIEUPH EO PIEUPSIOS
+ 0xBC66: 0xD392, //HANGUL SYLLABLE PHIEUPH EO CIEUC
+ 0xBC67: 0xD393, //HANGUL SYLLABLE PHIEUPH EO CHIEUCH
+ 0xBC68: 0xD394, //HANGUL SYLLABLE PHIEUPH EO KHIEUKH
+ 0xBC69: 0xD395, //HANGUL SYLLABLE PHIEUPH EO THIEUTH
+ 0xBC6A: 0xD396, //HANGUL SYLLABLE PHIEUPH EO PHIEUPH
+ 0xBC6B: 0xD397, //HANGUL SYLLABLE PHIEUPH EO HIEUH
+ 0xBC6C: 0xD39A, //HANGUL SYLLABLE PHIEUPH E SSANGKIYEOK
+ 0xBC6D: 0xD39B, //HANGUL SYLLABLE PHIEUPH E KIYEOKSIOS
+ 0xBC6E: 0xD39D, //HANGUL SYLLABLE PHIEUPH E NIEUNCIEUC
+ 0xBC6F: 0xD39E, //HANGUL SYLLABLE PHIEUPH E NIEUNHIEUH
+ 0xBC70: 0xD39F, //HANGUL SYLLABLE PHIEUPH E TIKEUT
+ 0xBC71: 0xD3A1, //HANGUL SYLLABLE PHIEUPH E RIEULKIYEOK
+ 0xBC72: 0xD3A2, //HANGUL SYLLABLE PHIEUPH E RIEULMIEUM
+ 0xBC73: 0xD3A3, //HANGUL SYLLABLE PHIEUPH E RIEULPIEUP
+ 0xBC74: 0xD3A4, //HANGUL SYLLABLE PHIEUPH E RIEULSIOS
+ 0xBC75: 0xD3A5, //HANGUL SYLLABLE PHIEUPH E RIEULTHIEUTH
+ 0xBC76: 0xD3A6, //HANGUL SYLLABLE PHIEUPH E RIEULPHIEUPH
+ 0xBC77: 0xD3A7, //HANGUL SYLLABLE PHIEUPH E RIEULHIEUH
+ 0xBC78: 0xD3AA, //HANGUL SYLLABLE PHIEUPH E PIEUPSIOS
+ 0xBC79: 0xD3AC, //HANGUL SYLLABLE PHIEUPH E SSANGSIOS
+ 0xBC7A: 0xD3AE, //HANGUL SYLLABLE PHIEUPH E CIEUC
+ 0xBC81: 0xD3AF, //HANGUL SYLLABLE PHIEUPH E CHIEUCH
+ 0xBC82: 0xD3B0, //HANGUL SYLLABLE PHIEUPH E KHIEUKH
+ 0xBC83: 0xD3B1, //HANGUL SYLLABLE PHIEUPH E THIEUTH
+ 0xBC84: 0xD3B2, //HANGUL SYLLABLE PHIEUPH E PHIEUPH
+ 0xBC85: 0xD3B3, //HANGUL SYLLABLE PHIEUPH E HIEUH
+ 0xBC86: 0xD3B5, //HANGUL SYLLABLE PHIEUPH YEO KIYEOK
+ 0xBC87: 0xD3B6, //HANGUL SYLLABLE PHIEUPH YEO SSANGKIYEOK
+ 0xBC88: 0xD3B7, //HANGUL SYLLABLE PHIEUPH YEO KIYEOKSIOS
+ 0xBC89: 0xD3B9, //HANGUL SYLLABLE PHIEUPH YEO NIEUNCIEUC
+ 0xBC8A: 0xD3BA, //HANGUL SYLLABLE PHIEUPH YEO NIEUNHIEUH
+ 0xBC8B: 0xD3BB, //HANGUL SYLLABLE PHIEUPH YEO TIKEUT
+ 0xBC8C: 0xD3BD, //HANGUL SYLLABLE PHIEUPH YEO RIEULKIYEOK
+ 0xBC8D: 0xD3BE, //HANGUL SYLLABLE PHIEUPH YEO RIEULMIEUM
+ 0xBC8E: 0xD3BF, //HANGUL SYLLABLE PHIEUPH YEO RIEULPIEUP
+ 0xBC8F: 0xD3C0, //HANGUL SYLLABLE PHIEUPH YEO RIEULSIOS
+ 0xBC90: 0xD3C1, //HANGUL SYLLABLE PHIEUPH YEO RIEULTHIEUTH
+ 0xBC91: 0xD3C2, //HANGUL SYLLABLE PHIEUPH YEO RIEULPHIEUPH
+ 0xBC92: 0xD3C3, //HANGUL SYLLABLE PHIEUPH YEO RIEULHIEUH
+ 0xBC93: 0xD3C6, //HANGUL SYLLABLE PHIEUPH YEO PIEUPSIOS
+ 0xBC94: 0xD3C7, //HANGUL SYLLABLE PHIEUPH YEO SIOS
+ 0xBC95: 0xD3CA, //HANGUL SYLLABLE PHIEUPH YEO CIEUC
+ 0xBC96: 0xD3CB, //HANGUL SYLLABLE PHIEUPH YEO CHIEUCH
+ 0xBC97: 0xD3CC, //HANGUL SYLLABLE PHIEUPH YEO KHIEUKH
+ 0xBC98: 0xD3CD, //HANGUL SYLLABLE PHIEUPH YEO THIEUTH
+ 0xBC99: 0xD3CE, //HANGUL SYLLABLE PHIEUPH YEO PHIEUPH
+ 0xBC9A: 0xD3CF, //HANGUL SYLLABLE PHIEUPH YEO HIEUH
+ 0xBC9B: 0xD3D1, //HANGUL SYLLABLE PHIEUPH YE KIYEOK
+ 0xBC9C: 0xD3D2, //HANGUL SYLLABLE PHIEUPH YE SSANGKIYEOK
+ 0xBC9D: 0xD3D3, //HANGUL SYLLABLE PHIEUPH YE KIYEOKSIOS
+ 0xBC9E: 0xD3D4, //HANGUL SYLLABLE PHIEUPH YE NIEUN
+ 0xBC9F: 0xD3D5, //HANGUL SYLLABLE PHIEUPH YE NIEUNCIEUC
+ 0xBCA0: 0xD3D6, //HANGUL SYLLABLE PHIEUPH YE NIEUNHIEUH
+ 0xBCA1: 0xC0E5, //HANGUL SYLLABLE SIOS YA KIYEOK
+ 0xBCA2: 0xC0E8, //HANGUL SYLLABLE SIOS YA NIEUN
+ 0xBCA3: 0xC0EC, //HANGUL SYLLABLE SIOS YA RIEUL
+ 0xBCA4: 0xC0F4, //HANGUL SYLLABLE SIOS YA MIEUM
+ 0xBCA5: 0xC0F5, //HANGUL SYLLABLE SIOS YA PIEUP
+ 0xBCA6: 0xC0F7, //HANGUL SYLLABLE SIOS YA SIOS
+ 0xBCA7: 0xC0F9, //HANGUL SYLLABLE SIOS YA IEUNG
+ 0xBCA8: 0xC100, //HANGUL SYLLABLE SIOS YAE
+ 0xBCA9: 0xC104, //HANGUL SYLLABLE SIOS YAE NIEUN
+ 0xBCAA: 0xC108, //HANGUL SYLLABLE SIOS YAE RIEUL
+ 0xBCAB: 0xC110, //HANGUL SYLLABLE SIOS YAE MIEUM
+ 0xBCAC: 0xC115, //HANGUL SYLLABLE SIOS YAE IEUNG
+ 0xBCAD: 0xC11C, //HANGUL SYLLABLE SIOS EO
+ 0xBCAE: 0xC11D, //HANGUL SYLLABLE SIOS EO KIYEOK
+ 0xBCAF: 0xC11E, //HANGUL SYLLABLE SIOS EO SSANGKIYEOK
+ 0xBCB0: 0xC11F, //HANGUL SYLLABLE SIOS EO KIYEOKSIOS
+ 0xBCB1: 0xC120, //HANGUL SYLLABLE SIOS EO NIEUN
+ 0xBCB2: 0xC123, //HANGUL SYLLABLE SIOS EO TIKEUT
+ 0xBCB3: 0xC124, //HANGUL SYLLABLE SIOS EO RIEUL
+ 0xBCB4: 0xC126, //HANGUL SYLLABLE SIOS EO RIEULMIEUM
+ 0xBCB5: 0xC127, //HANGUL SYLLABLE SIOS EO RIEULPIEUP
+ 0xBCB6: 0xC12C, //HANGUL SYLLABLE SIOS EO MIEUM
+ 0xBCB7: 0xC12D, //HANGUL SYLLABLE SIOS EO PIEUP
+ 0xBCB8: 0xC12F, //HANGUL SYLLABLE SIOS EO SIOS
+ 0xBCB9: 0xC130, //HANGUL SYLLABLE SIOS EO SSANGSIOS
+ 0xBCBA: 0xC131, //HANGUL SYLLABLE SIOS EO IEUNG
+ 0xBCBB: 0xC136, //HANGUL SYLLABLE SIOS EO PHIEUPH
+ 0xBCBC: 0xC138, //HANGUL SYLLABLE SIOS E
+ 0xBCBD: 0xC139, //HANGUL SYLLABLE SIOS E KIYEOK
+ 0xBCBE: 0xC13C, //HANGUL SYLLABLE SIOS E NIEUN
+ 0xBCBF: 0xC140, //HANGUL SYLLABLE SIOS E RIEUL
+ 0xBCC0: 0xC148, //HANGUL SYLLABLE SIOS E MIEUM
+ 0xBCC1: 0xC149, //HANGUL SYLLABLE SIOS E PIEUP
+ 0xBCC2: 0xC14B, //HANGUL SYLLABLE SIOS E SIOS
+ 0xBCC3: 0xC14C, //HANGUL SYLLABLE SIOS E SSANGSIOS
+ 0xBCC4: 0xC14D, //HANGUL SYLLABLE SIOS E IEUNG
+ 0xBCC5: 0xC154, //HANGUL SYLLABLE SIOS YEO
+ 0xBCC6: 0xC155, //HANGUL SYLLABLE SIOS YEO KIYEOK
+ 0xBCC7: 0xC158, //HANGUL SYLLABLE SIOS YEO NIEUN
+ 0xBCC8: 0xC15C, //HANGUL SYLLABLE SIOS YEO RIEUL
+ 0xBCC9: 0xC164, //HANGUL SYLLABLE SIOS YEO MIEUM
+ 0xBCCA: 0xC165, //HANGUL SYLLABLE SIOS YEO PIEUP
+ 0xBCCB: 0xC167, //HANGUL SYLLABLE SIOS YEO SIOS
+ 0xBCCC: 0xC168, //HANGUL SYLLABLE SIOS YEO SSANGSIOS
+ 0xBCCD: 0xC169, //HANGUL SYLLABLE SIOS YEO IEUNG
+ 0xBCCE: 0xC170, //HANGUL SYLLABLE SIOS YE
+ 0xBCCF: 0xC174, //HANGUL SYLLABLE SIOS YE NIEUN
+ 0xBCD0: 0xC178, //HANGUL SYLLABLE SIOS YE RIEUL
+ 0xBCD1: 0xC185, //HANGUL SYLLABLE SIOS YE IEUNG
+ 0xBCD2: 0xC18C, //HANGUL SYLLABLE SIOS O
+ 0xBCD3: 0xC18D, //HANGUL SYLLABLE SIOS O KIYEOK
+ 0xBCD4: 0xC18E, //HANGUL SYLLABLE SIOS O SSANGKIYEOK
+ 0xBCD5: 0xC190, //HANGUL SYLLABLE SIOS O NIEUN
+ 0xBCD6: 0xC194, //HANGUL SYLLABLE SIOS O RIEUL
+ 0xBCD7: 0xC196, //HANGUL SYLLABLE SIOS O RIEULMIEUM
+ 0xBCD8: 0xC19C, //HANGUL SYLLABLE SIOS O MIEUM
+ 0xBCD9: 0xC19D, //HANGUL SYLLABLE SIOS O PIEUP
+ 0xBCDA: 0xC19F, //HANGUL SYLLABLE SIOS O SIOS
+ 0xBCDB: 0xC1A1, //HANGUL SYLLABLE SIOS O IEUNG
+ 0xBCDC: 0xC1A5, //HANGUL SYLLABLE SIOS O THIEUTH
+ 0xBCDD: 0xC1A8, //HANGUL SYLLABLE SIOS WA
+ 0xBCDE: 0xC1A9, //HANGUL SYLLABLE SIOS WA KIYEOK
+ 0xBCDF: 0xC1AC, //HANGUL SYLLABLE SIOS WA NIEUN
+ 0xBCE0: 0xC1B0, //HANGUL SYLLABLE SIOS WA RIEUL
+ 0xBCE1: 0xC1BD, //HANGUL SYLLABLE SIOS WA IEUNG
+ 0xBCE2: 0xC1C4, //HANGUL SYLLABLE SIOS WAE
+ 0xBCE3: 0xC1C8, //HANGUL SYLLABLE SIOS WAE NIEUN
+ 0xBCE4: 0xC1CC, //HANGUL SYLLABLE SIOS WAE RIEUL
+ 0xBCE5: 0xC1D4, //HANGUL SYLLABLE SIOS WAE MIEUM
+ 0xBCE6: 0xC1D7, //HANGUL SYLLABLE SIOS WAE SIOS
+ 0xBCE7: 0xC1D8, //HANGUL SYLLABLE SIOS WAE SSANGSIOS
+ 0xBCE8: 0xC1E0, //HANGUL SYLLABLE SIOS OE
+ 0xBCE9: 0xC1E4, //HANGUL SYLLABLE SIOS OE NIEUN
+ 0xBCEA: 0xC1E8, //HANGUL SYLLABLE SIOS OE RIEUL
+ 0xBCEB: 0xC1F0, //HANGUL SYLLABLE SIOS OE MIEUM
+ 0xBCEC: 0xC1F1, //HANGUL SYLLABLE SIOS OE PIEUP
+ 0xBCED: 0xC1F3, //HANGUL SYLLABLE SIOS OE SIOS
+ 0xBCEE: 0xC1FC, //HANGUL SYLLABLE SIOS YO
+ 0xBCEF: 0xC1FD, //HANGUL SYLLABLE SIOS YO KIYEOK
+ 0xBCF0: 0xC200, //HANGUL SYLLABLE SIOS YO NIEUN
+ 0xBCF1: 0xC204, //HANGUL SYLLABLE SIOS YO RIEUL
+ 0xBCF2: 0xC20C, //HANGUL SYLLABLE SIOS YO MIEUM
+ 0xBCF3: 0xC20D, //HANGUL SYLLABLE SIOS YO PIEUP
+ 0xBCF4: 0xC20F, //HANGUL SYLLABLE SIOS YO SIOS
+ 0xBCF5: 0xC211, //HANGUL SYLLABLE SIOS YO IEUNG
+ 0xBCF6: 0xC218, //HANGUL SYLLABLE SIOS U
+ 0xBCF7: 0xC219, //HANGUL SYLLABLE SIOS U KIYEOK
+ 0xBCF8: 0xC21C, //HANGUL SYLLABLE SIOS U NIEUN
+ 0xBCF9: 0xC21F, //HANGUL SYLLABLE SIOS U TIKEUT
+ 0xBCFA: 0xC220, //HANGUL SYLLABLE SIOS U RIEUL
+ 0xBCFB: 0xC228, //HANGUL SYLLABLE SIOS U MIEUM
+ 0xBCFC: 0xC229, //HANGUL SYLLABLE SIOS U PIEUP
+ 0xBCFD: 0xC22B, //HANGUL SYLLABLE SIOS U SIOS
+ 0xBCFE: 0xC22D, //HANGUL SYLLABLE SIOS U IEUNG
+ 0xBD41: 0xD3D7, //HANGUL SYLLABLE PHIEUPH YE TIKEUT
+ 0xBD42: 0xD3D9, //HANGUL SYLLABLE PHIEUPH YE RIEULKIYEOK
+ 0xBD43: 0xD3DA, //HANGUL SYLLABLE PHIEUPH YE RIEULMIEUM
+ 0xBD44: 0xD3DB, //HANGUL SYLLABLE PHIEUPH YE RIEULPIEUP
+ 0xBD45: 0xD3DC, //HANGUL SYLLABLE PHIEUPH YE RIEULSIOS
+ 0xBD46: 0xD3DD, //HANGUL SYLLABLE PHIEUPH YE RIEULTHIEUTH
+ 0xBD47: 0xD3DE, //HANGUL SYLLABLE PHIEUPH YE RIEULPHIEUPH
+ 0xBD48: 0xD3DF, //HANGUL SYLLABLE PHIEUPH YE RIEULHIEUH
+ 0xBD49: 0xD3E0, //HANGUL SYLLABLE PHIEUPH YE MIEUM
+ 0xBD4A: 0xD3E2, //HANGUL SYLLABLE PHIEUPH YE PIEUPSIOS
+ 0xBD4B: 0xD3E4, //HANGUL SYLLABLE PHIEUPH YE SSANGSIOS
+ 0xBD4C: 0xD3E5, //HANGUL SYLLABLE PHIEUPH YE IEUNG
+ 0xBD4D: 0xD3E6, //HANGUL SYLLABLE PHIEUPH YE CIEUC
+ 0xBD4E: 0xD3E7, //HANGUL SYLLABLE PHIEUPH YE CHIEUCH
+ 0xBD4F: 0xD3E8, //HANGUL SYLLABLE PHIEUPH YE KHIEUKH
+ 0xBD50: 0xD3E9, //HANGUL SYLLABLE PHIEUPH YE THIEUTH
+ 0xBD51: 0xD3EA, //HANGUL SYLLABLE PHIEUPH YE PHIEUPH
+ 0xBD52: 0xD3EB, //HANGUL SYLLABLE PHIEUPH YE HIEUH
+ 0xBD53: 0xD3EE, //HANGUL SYLLABLE PHIEUPH O SSANGKIYEOK
+ 0xBD54: 0xD3EF, //HANGUL SYLLABLE PHIEUPH O KIYEOKSIOS
+ 0xBD55: 0xD3F1, //HANGUL SYLLABLE PHIEUPH O NIEUNCIEUC
+ 0xBD56: 0xD3F2, //HANGUL SYLLABLE PHIEUPH O NIEUNHIEUH
+ 0xBD57: 0xD3F3, //HANGUL SYLLABLE PHIEUPH O TIKEUT
+ 0xBD58: 0xD3F5, //HANGUL SYLLABLE PHIEUPH O RIEULKIYEOK
+ 0xBD59: 0xD3F6, //HANGUL SYLLABLE PHIEUPH O RIEULMIEUM
+ 0xBD5A: 0xD3F7, //HANGUL SYLLABLE PHIEUPH O RIEULPIEUP
+ 0xBD61: 0xD3F8, //HANGUL SYLLABLE PHIEUPH O RIEULSIOS
+ 0xBD62: 0xD3F9, //HANGUL SYLLABLE PHIEUPH O RIEULTHIEUTH
+ 0xBD63: 0xD3FA, //HANGUL SYLLABLE PHIEUPH O RIEULPHIEUPH
+ 0xBD64: 0xD3FB, //HANGUL SYLLABLE PHIEUPH O RIEULHIEUH
+ 0xBD65: 0xD3FE, //HANGUL SYLLABLE PHIEUPH O PIEUPSIOS
+ 0xBD66: 0xD400, //HANGUL SYLLABLE PHIEUPH O SSANGSIOS
+ 0xBD67: 0xD402, //HANGUL SYLLABLE PHIEUPH O CIEUC
+ 0xBD68: 0xD403, //HANGUL SYLLABLE PHIEUPH O CHIEUCH
+ 0xBD69: 0xD404, //HANGUL SYLLABLE PHIEUPH O KHIEUKH
+ 0xBD6A: 0xD405, //HANGUL SYLLABLE PHIEUPH O THIEUTH
+ 0xBD6B: 0xD406, //HANGUL SYLLABLE PHIEUPH O PHIEUPH
+ 0xBD6C: 0xD407, //HANGUL SYLLABLE PHIEUPH O HIEUH
+ 0xBD6D: 0xD409, //HANGUL SYLLABLE PHIEUPH WA KIYEOK
+ 0xBD6E: 0xD40A, //HANGUL SYLLABLE PHIEUPH WA SSANGKIYEOK
+ 0xBD6F: 0xD40B, //HANGUL SYLLABLE PHIEUPH WA KIYEOKSIOS
+ 0xBD70: 0xD40C, //HANGUL SYLLABLE PHIEUPH WA NIEUN
+ 0xBD71: 0xD40D, //HANGUL SYLLABLE PHIEUPH WA NIEUNCIEUC
+ 0xBD72: 0xD40E, //HANGUL SYLLABLE PHIEUPH WA NIEUNHIEUH
+ 0xBD73: 0xD40F, //HANGUL SYLLABLE PHIEUPH WA TIKEUT
+ 0xBD74: 0xD410, //HANGUL SYLLABLE PHIEUPH WA RIEUL
+ 0xBD75: 0xD411, //HANGUL SYLLABLE PHIEUPH WA RIEULKIYEOK
+ 0xBD76: 0xD412, //HANGUL SYLLABLE PHIEUPH WA RIEULMIEUM
+ 0xBD77: 0xD413, //HANGUL SYLLABLE PHIEUPH WA RIEULPIEUP
+ 0xBD78: 0xD414, //HANGUL SYLLABLE PHIEUPH WA RIEULSIOS
+ 0xBD79: 0xD415, //HANGUL SYLLABLE PHIEUPH WA RIEULTHIEUTH
+ 0xBD7A: 0xD416, //HANGUL SYLLABLE PHIEUPH WA RIEULPHIEUPH
+ 0xBD81: 0xD417, //HANGUL SYLLABLE PHIEUPH WA RIEULHIEUH
+ 0xBD82: 0xD418, //HANGUL SYLLABLE PHIEUPH WA MIEUM
+ 0xBD83: 0xD419, //HANGUL SYLLABLE PHIEUPH WA PIEUP
+ 0xBD84: 0xD41A, //HANGUL SYLLABLE PHIEUPH WA PIEUPSIOS
+ 0xBD85: 0xD41B, //HANGUL SYLLABLE PHIEUPH WA SIOS
+ 0xBD86: 0xD41C, //HANGUL SYLLABLE PHIEUPH WA SSANGSIOS
+ 0xBD87: 0xD41E, //HANGUL SYLLABLE PHIEUPH WA CIEUC
+ 0xBD88: 0xD41F, //HANGUL SYLLABLE PHIEUPH WA CHIEUCH
+ 0xBD89: 0xD420, //HANGUL SYLLABLE PHIEUPH WA KHIEUKH
+ 0xBD8A: 0xD421, //HANGUL SYLLABLE PHIEUPH WA THIEUTH
+ 0xBD8B: 0xD422, //HANGUL SYLLABLE PHIEUPH WA PHIEUPH
+ 0xBD8C: 0xD423, //HANGUL SYLLABLE PHIEUPH WA HIEUH
+ 0xBD8D: 0xD424, //HANGUL SYLLABLE PHIEUPH WAE
+ 0xBD8E: 0xD425, //HANGUL SYLLABLE PHIEUPH WAE KIYEOK
+ 0xBD8F: 0xD426, //HANGUL SYLLABLE PHIEUPH WAE SSANGKIYEOK
+ 0xBD90: 0xD427, //HANGUL SYLLABLE PHIEUPH WAE KIYEOKSIOS
+ 0xBD91: 0xD428, //HANGUL SYLLABLE PHIEUPH WAE NIEUN
+ 0xBD92: 0xD429, //HANGUL SYLLABLE PHIEUPH WAE NIEUNCIEUC
+ 0xBD93: 0xD42A, //HANGUL SYLLABLE PHIEUPH WAE NIEUNHIEUH
+ 0xBD94: 0xD42B, //HANGUL SYLLABLE PHIEUPH WAE TIKEUT
+ 0xBD95: 0xD42C, //HANGUL SYLLABLE PHIEUPH WAE RIEUL
+ 0xBD96: 0xD42D, //HANGUL SYLLABLE PHIEUPH WAE RIEULKIYEOK
+ 0xBD97: 0xD42E, //HANGUL SYLLABLE PHIEUPH WAE RIEULMIEUM
+ 0xBD98: 0xD42F, //HANGUL SYLLABLE PHIEUPH WAE RIEULPIEUP
+ 0xBD99: 0xD430, //HANGUL SYLLABLE PHIEUPH WAE RIEULSIOS
+ 0xBD9A: 0xD431, //HANGUL SYLLABLE PHIEUPH WAE RIEULTHIEUTH
+ 0xBD9B: 0xD432, //HANGUL SYLLABLE PHIEUPH WAE RIEULPHIEUPH
+ 0xBD9C: 0xD433, //HANGUL SYLLABLE PHIEUPH WAE RIEULHIEUH
+ 0xBD9D: 0xD434, //HANGUL SYLLABLE PHIEUPH WAE MIEUM
+ 0xBD9E: 0xD435, //HANGUL SYLLABLE PHIEUPH WAE PIEUP
+ 0xBD9F: 0xD436, //HANGUL SYLLABLE PHIEUPH WAE PIEUPSIOS
+ 0xBDA0: 0xD437, //HANGUL SYLLABLE PHIEUPH WAE SIOS
+ 0xBDA1: 0xC22F, //HANGUL SYLLABLE SIOS U CHIEUCH
+ 0xBDA2: 0xC231, //HANGUL SYLLABLE SIOS U THIEUTH
+ 0xBDA3: 0xC232, //HANGUL SYLLABLE SIOS U PHIEUPH
+ 0xBDA4: 0xC234, //HANGUL SYLLABLE SIOS WEO
+ 0xBDA5: 0xC248, //HANGUL SYLLABLE SIOS WEO SSANGSIOS
+ 0xBDA6: 0xC250, //HANGUL SYLLABLE SIOS WE
+ 0xBDA7: 0xC251, //HANGUL SYLLABLE SIOS WE KIYEOK
+ 0xBDA8: 0xC254, //HANGUL SYLLABLE SIOS WE NIEUN
+ 0xBDA9: 0xC258, //HANGUL SYLLABLE SIOS WE RIEUL
+ 0xBDAA: 0xC260, //HANGUL SYLLABLE SIOS WE MIEUM
+ 0xBDAB: 0xC265, //HANGUL SYLLABLE SIOS WE IEUNG
+ 0xBDAC: 0xC26C, //HANGUL SYLLABLE SIOS WI
+ 0xBDAD: 0xC26D, //HANGUL SYLLABLE SIOS WI KIYEOK
+ 0xBDAE: 0xC270, //HANGUL SYLLABLE SIOS WI NIEUN
+ 0xBDAF: 0xC274, //HANGUL SYLLABLE SIOS WI RIEUL
+ 0xBDB0: 0xC27C, //HANGUL SYLLABLE SIOS WI MIEUM
+ 0xBDB1: 0xC27D, //HANGUL SYLLABLE SIOS WI PIEUP
+ 0xBDB2: 0xC27F, //HANGUL SYLLABLE SIOS WI SIOS
+ 0xBDB3: 0xC281, //HANGUL SYLLABLE SIOS WI IEUNG
+ 0xBDB4: 0xC288, //HANGUL SYLLABLE SIOS YU
+ 0xBDB5: 0xC289, //HANGUL SYLLABLE SIOS YU KIYEOK
+ 0xBDB6: 0xC290, //HANGUL SYLLABLE SIOS YU RIEUL
+ 0xBDB7: 0xC298, //HANGUL SYLLABLE SIOS YU MIEUM
+ 0xBDB8: 0xC29B, //HANGUL SYLLABLE SIOS YU SIOS
+ 0xBDB9: 0xC29D, //HANGUL SYLLABLE SIOS YU IEUNG
+ 0xBDBA: 0xC2A4, //HANGUL SYLLABLE SIOS EU
+ 0xBDBB: 0xC2A5, //HANGUL SYLLABLE SIOS EU KIYEOK
+ 0xBDBC: 0xC2A8, //HANGUL SYLLABLE SIOS EU NIEUN
+ 0xBDBD: 0xC2AC, //HANGUL SYLLABLE SIOS EU RIEUL
+ 0xBDBE: 0xC2AD, //HANGUL SYLLABLE SIOS EU RIEULKIYEOK
+ 0xBDBF: 0xC2B4, //HANGUL SYLLABLE SIOS EU MIEUM
+ 0xBDC0: 0xC2B5, //HANGUL SYLLABLE SIOS EU PIEUP
+ 0xBDC1: 0xC2B7, //HANGUL SYLLABLE SIOS EU SIOS
+ 0xBDC2: 0xC2B9, //HANGUL SYLLABLE SIOS EU IEUNG
+ 0xBDC3: 0xC2DC, //HANGUL SYLLABLE SIOS I
+ 0xBDC4: 0xC2DD, //HANGUL SYLLABLE SIOS I KIYEOK
+ 0xBDC5: 0xC2E0, //HANGUL SYLLABLE SIOS I NIEUN
+ 0xBDC6: 0xC2E3, //HANGUL SYLLABLE SIOS I TIKEUT
+ 0xBDC7: 0xC2E4, //HANGUL SYLLABLE SIOS I RIEUL
+ 0xBDC8: 0xC2EB, //HANGUL SYLLABLE SIOS I RIEULHIEUH
+ 0xBDC9: 0xC2EC, //HANGUL SYLLABLE SIOS I MIEUM
+ 0xBDCA: 0xC2ED, //HANGUL SYLLABLE SIOS I PIEUP
+ 0xBDCB: 0xC2EF, //HANGUL SYLLABLE SIOS I SIOS
+ 0xBDCC: 0xC2F1, //HANGUL SYLLABLE SIOS I IEUNG
+ 0xBDCD: 0xC2F6, //HANGUL SYLLABLE SIOS I PHIEUPH
+ 0xBDCE: 0xC2F8, //HANGUL SYLLABLE SSANGSIOS A
+ 0xBDCF: 0xC2F9, //HANGUL SYLLABLE SSANGSIOS A KIYEOK
+ 0xBDD0: 0xC2FB, //HANGUL SYLLABLE SSANGSIOS A KIYEOKSIOS
+ 0xBDD1: 0xC2FC, //HANGUL SYLLABLE SSANGSIOS A NIEUN
+ 0xBDD2: 0xC300, //HANGUL SYLLABLE SSANGSIOS A RIEUL
+ 0xBDD3: 0xC308, //HANGUL SYLLABLE SSANGSIOS A MIEUM
+ 0xBDD4: 0xC309, //HANGUL SYLLABLE SSANGSIOS A PIEUP
+ 0xBDD5: 0xC30C, //HANGUL SYLLABLE SSANGSIOS A SSANGSIOS
+ 0xBDD6: 0xC30D, //HANGUL SYLLABLE SSANGSIOS A IEUNG
+ 0xBDD7: 0xC313, //HANGUL SYLLABLE SSANGSIOS A HIEUH
+ 0xBDD8: 0xC314, //HANGUL SYLLABLE SSANGSIOS AE
+ 0xBDD9: 0xC315, //HANGUL SYLLABLE SSANGSIOS AE KIYEOK
+ 0xBDDA: 0xC318, //HANGUL SYLLABLE SSANGSIOS AE NIEUN
+ 0xBDDB: 0xC31C, //HANGUL SYLLABLE SSANGSIOS AE RIEUL
+ 0xBDDC: 0xC324, //HANGUL SYLLABLE SSANGSIOS AE MIEUM
+ 0xBDDD: 0xC325, //HANGUL SYLLABLE SSANGSIOS AE PIEUP
+ 0xBDDE: 0xC328, //HANGUL SYLLABLE SSANGSIOS AE SSANGSIOS
+ 0xBDDF: 0xC329, //HANGUL SYLLABLE SSANGSIOS AE IEUNG
+ 0xBDE0: 0xC345, //HANGUL SYLLABLE SSANGSIOS YA IEUNG
+ 0xBDE1: 0xC368, //HANGUL SYLLABLE SSANGSIOS EO
+ 0xBDE2: 0xC369, //HANGUL SYLLABLE SSANGSIOS EO KIYEOK
+ 0xBDE3: 0xC36C, //HANGUL SYLLABLE SSANGSIOS EO NIEUN
+ 0xBDE4: 0xC370, //HANGUL SYLLABLE SSANGSIOS EO RIEUL
+ 0xBDE5: 0xC372, //HANGUL SYLLABLE SSANGSIOS EO RIEULMIEUM
+ 0xBDE6: 0xC378, //HANGUL SYLLABLE SSANGSIOS EO MIEUM
+ 0xBDE7: 0xC379, //HANGUL SYLLABLE SSANGSIOS EO PIEUP
+ 0xBDE8: 0xC37C, //HANGUL SYLLABLE SSANGSIOS EO SSANGSIOS
+ 0xBDE9: 0xC37D, //HANGUL SYLLABLE SSANGSIOS EO IEUNG
+ 0xBDEA: 0xC384, //HANGUL SYLLABLE SSANGSIOS E
+ 0xBDEB: 0xC388, //HANGUL SYLLABLE SSANGSIOS E NIEUN
+ 0xBDEC: 0xC38C, //HANGUL SYLLABLE SSANGSIOS E RIEUL
+ 0xBDED: 0xC3C0, //HANGUL SYLLABLE SSANGSIOS YE NIEUN
+ 0xBDEE: 0xC3D8, //HANGUL SYLLABLE SSANGSIOS O
+ 0xBDEF: 0xC3D9, //HANGUL SYLLABLE SSANGSIOS O KIYEOK
+ 0xBDF0: 0xC3DC, //HANGUL SYLLABLE SSANGSIOS O NIEUN
+ 0xBDF1: 0xC3DF, //HANGUL SYLLABLE SSANGSIOS O TIKEUT
+ 0xBDF2: 0xC3E0, //HANGUL SYLLABLE SSANGSIOS O RIEUL
+ 0xBDF3: 0xC3E2, //HANGUL SYLLABLE SSANGSIOS O RIEULMIEUM
+ 0xBDF4: 0xC3E8, //HANGUL SYLLABLE SSANGSIOS O MIEUM
+ 0xBDF5: 0xC3E9, //HANGUL SYLLABLE SSANGSIOS O PIEUP
+ 0xBDF6: 0xC3ED, //HANGUL SYLLABLE SSANGSIOS O IEUNG
+ 0xBDF7: 0xC3F4, //HANGUL SYLLABLE SSANGSIOS WA
+ 0xBDF8: 0xC3F5, //HANGUL SYLLABLE SSANGSIOS WA KIYEOK
+ 0xBDF9: 0xC3F8, //HANGUL SYLLABLE SSANGSIOS WA NIEUN
+ 0xBDFA: 0xC408, //HANGUL SYLLABLE SSANGSIOS WA SSANGSIOS
+ 0xBDFB: 0xC410, //HANGUL SYLLABLE SSANGSIOS WAE
+ 0xBDFC: 0xC424, //HANGUL SYLLABLE SSANGSIOS WAE SSANGSIOS
+ 0xBDFD: 0xC42C, //HANGUL SYLLABLE SSANGSIOS OE
+ 0xBDFE: 0xC430, //HANGUL SYLLABLE SSANGSIOS OE NIEUN
+ 0xBE41: 0xD438, //HANGUL SYLLABLE PHIEUPH WAE SSANGSIOS
+ 0xBE42: 0xD439, //HANGUL SYLLABLE PHIEUPH WAE IEUNG
+ 0xBE43: 0xD43A, //HANGUL SYLLABLE PHIEUPH WAE CIEUC
+ 0xBE44: 0xD43B, //HANGUL SYLLABLE PHIEUPH WAE CHIEUCH
+ 0xBE45: 0xD43C, //HANGUL SYLLABLE PHIEUPH WAE KHIEUKH
+ 0xBE46: 0xD43D, //HANGUL SYLLABLE PHIEUPH WAE THIEUTH
+ 0xBE47: 0xD43E, //HANGUL SYLLABLE PHIEUPH WAE PHIEUPH
+ 0xBE48: 0xD43F, //HANGUL SYLLABLE PHIEUPH WAE HIEUH
+ 0xBE49: 0xD441, //HANGUL SYLLABLE PHIEUPH OE KIYEOK
+ 0xBE4A: 0xD442, //HANGUL SYLLABLE PHIEUPH OE SSANGKIYEOK
+ 0xBE4B: 0xD443, //HANGUL SYLLABLE PHIEUPH OE KIYEOKSIOS
+ 0xBE4C: 0xD445, //HANGUL SYLLABLE PHIEUPH OE NIEUNCIEUC
+ 0xBE4D: 0xD446, //HANGUL SYLLABLE PHIEUPH OE NIEUNHIEUH
+ 0xBE4E: 0xD447, //HANGUL SYLLABLE PHIEUPH OE TIKEUT
+ 0xBE4F: 0xD448, //HANGUL SYLLABLE PHIEUPH OE RIEUL
+ 0xBE50: 0xD449, //HANGUL SYLLABLE PHIEUPH OE RIEULKIYEOK
+ 0xBE51: 0xD44A, //HANGUL SYLLABLE PHIEUPH OE RIEULMIEUM
+ 0xBE52: 0xD44B, //HANGUL SYLLABLE PHIEUPH OE RIEULPIEUP
+ 0xBE53: 0xD44C, //HANGUL SYLLABLE PHIEUPH OE RIEULSIOS
+ 0xBE54: 0xD44D, //HANGUL SYLLABLE PHIEUPH OE RIEULTHIEUTH
+ 0xBE55: 0xD44E, //HANGUL SYLLABLE PHIEUPH OE RIEULPHIEUPH
+ 0xBE56: 0xD44F, //HANGUL SYLLABLE PHIEUPH OE RIEULHIEUH
+ 0xBE57: 0xD450, //HANGUL SYLLABLE PHIEUPH OE MIEUM
+ 0xBE58: 0xD451, //HANGUL SYLLABLE PHIEUPH OE PIEUP
+ 0xBE59: 0xD452, //HANGUL SYLLABLE PHIEUPH OE PIEUPSIOS
+ 0xBE5A: 0xD453, //HANGUL SYLLABLE PHIEUPH OE SIOS
+ 0xBE61: 0xD454, //HANGUL SYLLABLE PHIEUPH OE SSANGSIOS
+ 0xBE62: 0xD455, //HANGUL SYLLABLE PHIEUPH OE IEUNG
+ 0xBE63: 0xD456, //HANGUL SYLLABLE PHIEUPH OE CIEUC
+ 0xBE64: 0xD457, //HANGUL SYLLABLE PHIEUPH OE CHIEUCH
+ 0xBE65: 0xD458, //HANGUL SYLLABLE PHIEUPH OE KHIEUKH
+ 0xBE66: 0xD459, //HANGUL SYLLABLE PHIEUPH OE THIEUTH
+ 0xBE67: 0xD45A, //HANGUL SYLLABLE PHIEUPH OE PHIEUPH
+ 0xBE68: 0xD45B, //HANGUL SYLLABLE PHIEUPH OE HIEUH
+ 0xBE69: 0xD45D, //HANGUL SYLLABLE PHIEUPH YO KIYEOK
+ 0xBE6A: 0xD45E, //HANGUL SYLLABLE PHIEUPH YO SSANGKIYEOK
+ 0xBE6B: 0xD45F, //HANGUL SYLLABLE PHIEUPH YO KIYEOKSIOS
+ 0xBE6C: 0xD461, //HANGUL SYLLABLE PHIEUPH YO NIEUNCIEUC
+ 0xBE6D: 0xD462, //HANGUL SYLLABLE PHIEUPH YO NIEUNHIEUH
+ 0xBE6E: 0xD463, //HANGUL SYLLABLE PHIEUPH YO TIKEUT
+ 0xBE6F: 0xD465, //HANGUL SYLLABLE PHIEUPH YO RIEULKIYEOK
+ 0xBE70: 0xD466, //HANGUL SYLLABLE PHIEUPH YO RIEULMIEUM
+ 0xBE71: 0xD467, //HANGUL SYLLABLE PHIEUPH YO RIEULPIEUP
+ 0xBE72: 0xD468, //HANGUL SYLLABLE PHIEUPH YO RIEULSIOS
+ 0xBE73: 0xD469, //HANGUL SYLLABLE PHIEUPH YO RIEULTHIEUTH
+ 0xBE74: 0xD46A, //HANGUL SYLLABLE PHIEUPH YO RIEULPHIEUPH
+ 0xBE75: 0xD46B, //HANGUL SYLLABLE PHIEUPH YO RIEULHIEUH
+ 0xBE76: 0xD46C, //HANGUL SYLLABLE PHIEUPH YO MIEUM
+ 0xBE77: 0xD46E, //HANGUL SYLLABLE PHIEUPH YO PIEUPSIOS
+ 0xBE78: 0xD470, //HANGUL SYLLABLE PHIEUPH YO SSANGSIOS
+ 0xBE79: 0xD471, //HANGUL SYLLABLE PHIEUPH YO IEUNG
+ 0xBE7A: 0xD472, //HANGUL SYLLABLE PHIEUPH YO CIEUC
+ 0xBE81: 0xD473, //HANGUL SYLLABLE PHIEUPH YO CHIEUCH
+ 0xBE82: 0xD474, //HANGUL SYLLABLE PHIEUPH YO KHIEUKH
+ 0xBE83: 0xD475, //HANGUL SYLLABLE PHIEUPH YO THIEUTH
+ 0xBE84: 0xD476, //HANGUL SYLLABLE PHIEUPH YO PHIEUPH
+ 0xBE85: 0xD477, //HANGUL SYLLABLE PHIEUPH YO HIEUH
+ 0xBE86: 0xD47A, //HANGUL SYLLABLE PHIEUPH U SSANGKIYEOK
+ 0xBE87: 0xD47B, //HANGUL SYLLABLE PHIEUPH U KIYEOKSIOS
+ 0xBE88: 0xD47D, //HANGUL SYLLABLE PHIEUPH U NIEUNCIEUC
+ 0xBE89: 0xD47E, //HANGUL SYLLABLE PHIEUPH U NIEUNHIEUH
+ 0xBE8A: 0xD481, //HANGUL SYLLABLE PHIEUPH U RIEULKIYEOK
+ 0xBE8B: 0xD483, //HANGUL SYLLABLE PHIEUPH U RIEULPIEUP
+ 0xBE8C: 0xD484, //HANGUL SYLLABLE PHIEUPH U RIEULSIOS
+ 0xBE8D: 0xD485, //HANGUL SYLLABLE PHIEUPH U RIEULTHIEUTH
+ 0xBE8E: 0xD486, //HANGUL SYLLABLE PHIEUPH U RIEULPHIEUPH
+ 0xBE8F: 0xD487, //HANGUL SYLLABLE PHIEUPH U RIEULHIEUH
+ 0xBE90: 0xD48A, //HANGUL SYLLABLE PHIEUPH U PIEUPSIOS
+ 0xBE91: 0xD48C, //HANGUL SYLLABLE PHIEUPH U SSANGSIOS
+ 0xBE92: 0xD48E, //HANGUL SYLLABLE PHIEUPH U CIEUC
+ 0xBE93: 0xD48F, //HANGUL SYLLABLE PHIEUPH U CHIEUCH
+ 0xBE94: 0xD490, //HANGUL SYLLABLE PHIEUPH U KHIEUKH
+ 0xBE95: 0xD491, //HANGUL SYLLABLE PHIEUPH U THIEUTH
+ 0xBE96: 0xD492, //HANGUL SYLLABLE PHIEUPH U PHIEUPH
+ 0xBE97: 0xD493, //HANGUL SYLLABLE PHIEUPH U HIEUH
+ 0xBE98: 0xD495, //HANGUL SYLLABLE PHIEUPH WEO KIYEOK
+ 0xBE99: 0xD496, //HANGUL SYLLABLE PHIEUPH WEO SSANGKIYEOK
+ 0xBE9A: 0xD497, //HANGUL SYLLABLE PHIEUPH WEO KIYEOKSIOS
+ 0xBE9B: 0xD498, //HANGUL SYLLABLE PHIEUPH WEO NIEUN
+ 0xBE9C: 0xD499, //HANGUL SYLLABLE PHIEUPH WEO NIEUNCIEUC
+ 0xBE9D: 0xD49A, //HANGUL SYLLABLE PHIEUPH WEO NIEUNHIEUH
+ 0xBE9E: 0xD49B, //HANGUL SYLLABLE PHIEUPH WEO TIKEUT
+ 0xBE9F: 0xD49C, //HANGUL SYLLABLE PHIEUPH WEO RIEUL
+ 0xBEA0: 0xD49D, //HANGUL SYLLABLE PHIEUPH WEO RIEULKIYEOK
+ 0xBEA1: 0xC434, //HANGUL SYLLABLE SSANGSIOS OE RIEUL
+ 0xBEA2: 0xC43C, //HANGUL SYLLABLE SSANGSIOS OE MIEUM
+ 0xBEA3: 0xC43D, //HANGUL SYLLABLE SSANGSIOS OE PIEUP
+ 0xBEA4: 0xC448, //HANGUL SYLLABLE SSANGSIOS YO
+ 0xBEA5: 0xC464, //HANGUL SYLLABLE SSANGSIOS U
+ 0xBEA6: 0xC465, //HANGUL SYLLABLE SSANGSIOS U KIYEOK
+ 0xBEA7: 0xC468, //HANGUL SYLLABLE SSANGSIOS U NIEUN
+ 0xBEA8: 0xC46C, //HANGUL SYLLABLE SSANGSIOS U RIEUL
+ 0xBEA9: 0xC474, //HANGUL SYLLABLE SSANGSIOS U MIEUM
+ 0xBEAA: 0xC475, //HANGUL SYLLABLE SSANGSIOS U PIEUP
+ 0xBEAB: 0xC479, //HANGUL SYLLABLE SSANGSIOS U IEUNG
+ 0xBEAC: 0xC480, //HANGUL SYLLABLE SSANGSIOS WEO
+ 0xBEAD: 0xC494, //HANGUL SYLLABLE SSANGSIOS WEO SSANGSIOS
+ 0xBEAE: 0xC49C, //HANGUL SYLLABLE SSANGSIOS WE
+ 0xBEAF: 0xC4B8, //HANGUL SYLLABLE SSANGSIOS WI
+ 0xBEB0: 0xC4BC, //HANGUL SYLLABLE SSANGSIOS WI NIEUN
+ 0xBEB1: 0xC4E9, //HANGUL SYLLABLE SSANGSIOS YU IEUNG
+ 0xBEB2: 0xC4F0, //HANGUL SYLLABLE SSANGSIOS EU
+ 0xBEB3: 0xC4F1, //HANGUL SYLLABLE SSANGSIOS EU KIYEOK
+ 0xBEB4: 0xC4F4, //HANGUL SYLLABLE SSANGSIOS EU NIEUN
+ 0xBEB5: 0xC4F8, //HANGUL SYLLABLE SSANGSIOS EU RIEUL
+ 0xBEB6: 0xC4FA, //HANGUL SYLLABLE SSANGSIOS EU RIEULMIEUM
+ 0xBEB7: 0xC4FF, //HANGUL SYLLABLE SSANGSIOS EU RIEULHIEUH
+ 0xBEB8: 0xC500, //HANGUL SYLLABLE SSANGSIOS EU MIEUM
+ 0xBEB9: 0xC501, //HANGUL SYLLABLE SSANGSIOS EU PIEUP
+ 0xBEBA: 0xC50C, //HANGUL SYLLABLE SSANGSIOS YI
+ 0xBEBB: 0xC510, //HANGUL SYLLABLE SSANGSIOS YI NIEUN
+ 0xBEBC: 0xC514, //HANGUL SYLLABLE SSANGSIOS YI RIEUL
+ 0xBEBD: 0xC51C, //HANGUL SYLLABLE SSANGSIOS YI MIEUM
+ 0xBEBE: 0xC528, //HANGUL SYLLABLE SSANGSIOS I
+ 0xBEBF: 0xC529, //HANGUL SYLLABLE SSANGSIOS I KIYEOK
+ 0xBEC0: 0xC52C, //HANGUL SYLLABLE SSANGSIOS I NIEUN
+ 0xBEC1: 0xC530, //HANGUL SYLLABLE SSANGSIOS I RIEUL
+ 0xBEC2: 0xC538, //HANGUL SYLLABLE SSANGSIOS I MIEUM
+ 0xBEC3: 0xC539, //HANGUL SYLLABLE SSANGSIOS I PIEUP
+ 0xBEC4: 0xC53B, //HANGUL SYLLABLE SSANGSIOS I SIOS
+ 0xBEC5: 0xC53D, //HANGUL SYLLABLE SSANGSIOS I IEUNG
+ 0xBEC6: 0xC544, //HANGUL SYLLABLE IEUNG A
+ 0xBEC7: 0xC545, //HANGUL SYLLABLE IEUNG A KIYEOK
+ 0xBEC8: 0xC548, //HANGUL SYLLABLE IEUNG A NIEUN
+ 0xBEC9: 0xC549, //HANGUL SYLLABLE IEUNG A NIEUNCIEUC
+ 0xBECA: 0xC54A, //HANGUL SYLLABLE IEUNG A NIEUNHIEUH
+ 0xBECB: 0xC54C, //HANGUL SYLLABLE IEUNG A RIEUL
+ 0xBECC: 0xC54D, //HANGUL SYLLABLE IEUNG A RIEULKIYEOK
+ 0xBECD: 0xC54E, //HANGUL SYLLABLE IEUNG A RIEULMIEUM
+ 0xBECE: 0xC553, //HANGUL SYLLABLE IEUNG A RIEULHIEUH
+ 0xBECF: 0xC554, //HANGUL SYLLABLE IEUNG A MIEUM
+ 0xBED0: 0xC555, //HANGUL SYLLABLE IEUNG A PIEUP
+ 0xBED1: 0xC557, //HANGUL SYLLABLE IEUNG A SIOS
+ 0xBED2: 0xC558, //HANGUL SYLLABLE IEUNG A SSANGSIOS
+ 0xBED3: 0xC559, //HANGUL SYLLABLE IEUNG A IEUNG
+ 0xBED4: 0xC55D, //HANGUL SYLLABLE IEUNG A THIEUTH
+ 0xBED5: 0xC55E, //HANGUL SYLLABLE IEUNG A PHIEUPH
+ 0xBED6: 0xC560, //HANGUL SYLLABLE IEUNG AE
+ 0xBED7: 0xC561, //HANGUL SYLLABLE IEUNG AE KIYEOK
+ 0xBED8: 0xC564, //HANGUL SYLLABLE IEUNG AE NIEUN
+ 0xBED9: 0xC568, //HANGUL SYLLABLE IEUNG AE RIEUL
+ 0xBEDA: 0xC570, //HANGUL SYLLABLE IEUNG AE MIEUM
+ 0xBEDB: 0xC571, //HANGUL SYLLABLE IEUNG AE PIEUP
+ 0xBEDC: 0xC573, //HANGUL SYLLABLE IEUNG AE SIOS
+ 0xBEDD: 0xC574, //HANGUL SYLLABLE IEUNG AE SSANGSIOS
+ 0xBEDE: 0xC575, //HANGUL SYLLABLE IEUNG AE IEUNG
+ 0xBEDF: 0xC57C, //HANGUL SYLLABLE IEUNG YA
+ 0xBEE0: 0xC57D, //HANGUL SYLLABLE IEUNG YA KIYEOK
+ 0xBEE1: 0xC580, //HANGUL SYLLABLE IEUNG YA NIEUN
+ 0xBEE2: 0xC584, //HANGUL SYLLABLE IEUNG YA RIEUL
+ 0xBEE3: 0xC587, //HANGUL SYLLABLE IEUNG YA RIEULPIEUP
+ 0xBEE4: 0xC58C, //HANGUL SYLLABLE IEUNG YA MIEUM
+ 0xBEE5: 0xC58D, //HANGUL SYLLABLE IEUNG YA PIEUP
+ 0xBEE6: 0xC58F, //HANGUL SYLLABLE IEUNG YA SIOS
+ 0xBEE7: 0xC591, //HANGUL SYLLABLE IEUNG YA IEUNG
+ 0xBEE8: 0xC595, //HANGUL SYLLABLE IEUNG YA THIEUTH
+ 0xBEE9: 0xC597, //HANGUL SYLLABLE IEUNG YA HIEUH
+ 0xBEEA: 0xC598, //HANGUL SYLLABLE IEUNG YAE
+ 0xBEEB: 0xC59C, //HANGUL SYLLABLE IEUNG YAE NIEUN
+ 0xBEEC: 0xC5A0, //HANGUL SYLLABLE IEUNG YAE RIEUL
+ 0xBEED: 0xC5A9, //HANGUL SYLLABLE IEUNG YAE PIEUP
+ 0xBEEE: 0xC5B4, //HANGUL SYLLABLE IEUNG EO
+ 0xBEEF: 0xC5B5, //HANGUL SYLLABLE IEUNG EO KIYEOK
+ 0xBEF0: 0xC5B8, //HANGUL SYLLABLE IEUNG EO NIEUN
+ 0xBEF1: 0xC5B9, //HANGUL SYLLABLE IEUNG EO NIEUNCIEUC
+ 0xBEF2: 0xC5BB, //HANGUL SYLLABLE IEUNG EO TIKEUT
+ 0xBEF3: 0xC5BC, //HANGUL SYLLABLE IEUNG EO RIEUL
+ 0xBEF4: 0xC5BD, //HANGUL SYLLABLE IEUNG EO RIEULKIYEOK
+ 0xBEF5: 0xC5BE, //HANGUL SYLLABLE IEUNG EO RIEULMIEUM
+ 0xBEF6: 0xC5C4, //HANGUL SYLLABLE IEUNG EO MIEUM
+ 0xBEF7: 0xC5C5, //HANGUL SYLLABLE IEUNG EO PIEUP
+ 0xBEF8: 0xC5C6, //HANGUL SYLLABLE IEUNG EO PIEUPSIOS
+ 0xBEF9: 0xC5C7, //HANGUL SYLLABLE IEUNG EO SIOS
+ 0xBEFA: 0xC5C8, //HANGUL SYLLABLE IEUNG EO SSANGSIOS
+ 0xBEFB: 0xC5C9, //HANGUL SYLLABLE IEUNG EO IEUNG
+ 0xBEFC: 0xC5CA, //HANGUL SYLLABLE IEUNG EO CIEUC
+ 0xBEFD: 0xC5CC, //HANGUL SYLLABLE IEUNG EO KHIEUKH
+ 0xBEFE: 0xC5CE, //HANGUL SYLLABLE IEUNG EO PHIEUPH
+ 0xBF41: 0xD49E, //HANGUL SYLLABLE PHIEUPH WEO RIEULMIEUM
+ 0xBF42: 0xD49F, //HANGUL SYLLABLE PHIEUPH WEO RIEULPIEUP
+ 0xBF43: 0xD4A0, //HANGUL SYLLABLE PHIEUPH WEO RIEULSIOS
+ 0xBF44: 0xD4A1, //HANGUL SYLLABLE PHIEUPH WEO RIEULTHIEUTH
+ 0xBF45: 0xD4A2, //HANGUL SYLLABLE PHIEUPH WEO RIEULPHIEUPH
+ 0xBF46: 0xD4A3, //HANGUL SYLLABLE PHIEUPH WEO RIEULHIEUH
+ 0xBF47: 0xD4A4, //HANGUL SYLLABLE PHIEUPH WEO MIEUM
+ 0xBF48: 0xD4A5, //HANGUL SYLLABLE PHIEUPH WEO PIEUP
+ 0xBF49: 0xD4A6, //HANGUL SYLLABLE PHIEUPH WEO PIEUPSIOS
+ 0xBF4A: 0xD4A7, //HANGUL SYLLABLE PHIEUPH WEO SIOS
+ 0xBF4B: 0xD4A8, //HANGUL SYLLABLE PHIEUPH WEO SSANGSIOS
+ 0xBF4C: 0xD4AA, //HANGUL SYLLABLE PHIEUPH WEO CIEUC
+ 0xBF4D: 0xD4AB, //HANGUL SYLLABLE PHIEUPH WEO CHIEUCH
+ 0xBF4E: 0xD4AC, //HANGUL SYLLABLE PHIEUPH WEO KHIEUKH
+ 0xBF4F: 0xD4AD, //HANGUL SYLLABLE PHIEUPH WEO THIEUTH
+ 0xBF50: 0xD4AE, //HANGUL SYLLABLE PHIEUPH WEO PHIEUPH
+ 0xBF51: 0xD4AF, //HANGUL SYLLABLE PHIEUPH WEO HIEUH
+ 0xBF52: 0xD4B0, //HANGUL SYLLABLE PHIEUPH WE
+ 0xBF53: 0xD4B1, //HANGUL SYLLABLE PHIEUPH WE KIYEOK
+ 0xBF54: 0xD4B2, //HANGUL SYLLABLE PHIEUPH WE SSANGKIYEOK
+ 0xBF55: 0xD4B3, //HANGUL SYLLABLE PHIEUPH WE KIYEOKSIOS
+ 0xBF56: 0xD4B4, //HANGUL SYLLABLE PHIEUPH WE NIEUN
+ 0xBF57: 0xD4B5, //HANGUL SYLLABLE PHIEUPH WE NIEUNCIEUC
+ 0xBF58: 0xD4B6, //HANGUL SYLLABLE PHIEUPH WE NIEUNHIEUH
+ 0xBF59: 0xD4B7, //HANGUL SYLLABLE PHIEUPH WE TIKEUT
+ 0xBF5A: 0xD4B8, //HANGUL SYLLABLE PHIEUPH WE RIEUL
+ 0xBF61: 0xD4B9, //HANGUL SYLLABLE PHIEUPH WE RIEULKIYEOK
+ 0xBF62: 0xD4BA, //HANGUL SYLLABLE PHIEUPH WE RIEULMIEUM
+ 0xBF63: 0xD4BB, //HANGUL SYLLABLE PHIEUPH WE RIEULPIEUP
+ 0xBF64: 0xD4BC, //HANGUL SYLLABLE PHIEUPH WE RIEULSIOS
+ 0xBF65: 0xD4BD, //HANGUL SYLLABLE PHIEUPH WE RIEULTHIEUTH
+ 0xBF66: 0xD4BE, //HANGUL SYLLABLE PHIEUPH WE RIEULPHIEUPH
+ 0xBF67: 0xD4BF, //HANGUL SYLLABLE PHIEUPH WE RIEULHIEUH
+ 0xBF68: 0xD4C0, //HANGUL SYLLABLE PHIEUPH WE MIEUM
+ 0xBF69: 0xD4C1, //HANGUL SYLLABLE PHIEUPH WE PIEUP
+ 0xBF6A: 0xD4C2, //HANGUL SYLLABLE PHIEUPH WE PIEUPSIOS
+ 0xBF6B: 0xD4C3, //HANGUL SYLLABLE PHIEUPH WE SIOS
+ 0xBF6C: 0xD4C4, //HANGUL SYLLABLE PHIEUPH WE SSANGSIOS
+ 0xBF6D: 0xD4C5, //HANGUL SYLLABLE PHIEUPH WE IEUNG
+ 0xBF6E: 0xD4C6, //HANGUL SYLLABLE PHIEUPH WE CIEUC
+ 0xBF6F: 0xD4C7, //HANGUL SYLLABLE PHIEUPH WE CHIEUCH
+ 0xBF70: 0xD4C8, //HANGUL SYLLABLE PHIEUPH WE KHIEUKH
+ 0xBF71: 0xD4C9, //HANGUL SYLLABLE PHIEUPH WE THIEUTH
+ 0xBF72: 0xD4CA, //HANGUL SYLLABLE PHIEUPH WE PHIEUPH
+ 0xBF73: 0xD4CB, //HANGUL SYLLABLE PHIEUPH WE HIEUH
+ 0xBF74: 0xD4CD, //HANGUL SYLLABLE PHIEUPH WI KIYEOK
+ 0xBF75: 0xD4CE, //HANGUL SYLLABLE PHIEUPH WI SSANGKIYEOK
+ 0xBF76: 0xD4CF, //HANGUL SYLLABLE PHIEUPH WI KIYEOKSIOS
+ 0xBF77: 0xD4D1, //HANGUL SYLLABLE PHIEUPH WI NIEUNCIEUC
+ 0xBF78: 0xD4D2, //HANGUL SYLLABLE PHIEUPH WI NIEUNHIEUH
+ 0xBF79: 0xD4D3, //HANGUL SYLLABLE PHIEUPH WI TIKEUT
+ 0xBF7A: 0xD4D5, //HANGUL SYLLABLE PHIEUPH WI RIEULKIYEOK
+ 0xBF81: 0xD4D6, //HANGUL SYLLABLE PHIEUPH WI RIEULMIEUM
+ 0xBF82: 0xD4D7, //HANGUL SYLLABLE PHIEUPH WI RIEULPIEUP
+ 0xBF83: 0xD4D8, //HANGUL SYLLABLE PHIEUPH WI RIEULSIOS
+ 0xBF84: 0xD4D9, //HANGUL SYLLABLE PHIEUPH WI RIEULTHIEUTH
+ 0xBF85: 0xD4DA, //HANGUL SYLLABLE PHIEUPH WI RIEULPHIEUPH
+ 0xBF86: 0xD4DB, //HANGUL SYLLABLE PHIEUPH WI RIEULHIEUH
+ 0xBF87: 0xD4DD, //HANGUL SYLLABLE PHIEUPH WI PIEUP
+ 0xBF88: 0xD4DE, //HANGUL SYLLABLE PHIEUPH WI PIEUPSIOS
+ 0xBF89: 0xD4E0, //HANGUL SYLLABLE PHIEUPH WI SSANGSIOS
+ 0xBF8A: 0xD4E1, //HANGUL SYLLABLE PHIEUPH WI IEUNG
+ 0xBF8B: 0xD4E2, //HANGUL SYLLABLE PHIEUPH WI CIEUC
+ 0xBF8C: 0xD4E3, //HANGUL SYLLABLE PHIEUPH WI CHIEUCH
+ 0xBF8D: 0xD4E4, //HANGUL SYLLABLE PHIEUPH WI KHIEUKH
+ 0xBF8E: 0xD4E5, //HANGUL SYLLABLE PHIEUPH WI THIEUTH
+ 0xBF8F: 0xD4E6, //HANGUL SYLLABLE PHIEUPH WI PHIEUPH
+ 0xBF90: 0xD4E7, //HANGUL SYLLABLE PHIEUPH WI HIEUH
+ 0xBF91: 0xD4E9, //HANGUL SYLLABLE PHIEUPH YU KIYEOK
+ 0xBF92: 0xD4EA, //HANGUL SYLLABLE PHIEUPH YU SSANGKIYEOK
+ 0xBF93: 0xD4EB, //HANGUL SYLLABLE PHIEUPH YU KIYEOKSIOS
+ 0xBF94: 0xD4ED, //HANGUL SYLLABLE PHIEUPH YU NIEUNCIEUC
+ 0xBF95: 0xD4EE, //HANGUL SYLLABLE PHIEUPH YU NIEUNHIEUH
+ 0xBF96: 0xD4EF, //HANGUL SYLLABLE PHIEUPH YU TIKEUT
+ 0xBF97: 0xD4F1, //HANGUL SYLLABLE PHIEUPH YU RIEULKIYEOK
+ 0xBF98: 0xD4F2, //HANGUL SYLLABLE PHIEUPH YU RIEULMIEUM
+ 0xBF99: 0xD4F3, //HANGUL SYLLABLE PHIEUPH YU RIEULPIEUP
+ 0xBF9A: 0xD4F4, //HANGUL SYLLABLE PHIEUPH YU RIEULSIOS
+ 0xBF9B: 0xD4F5, //HANGUL SYLLABLE PHIEUPH YU RIEULTHIEUTH
+ 0xBF9C: 0xD4F6, //HANGUL SYLLABLE PHIEUPH YU RIEULPHIEUPH
+ 0xBF9D: 0xD4F7, //HANGUL SYLLABLE PHIEUPH YU RIEULHIEUH
+ 0xBF9E: 0xD4F9, //HANGUL SYLLABLE PHIEUPH YU PIEUP
+ 0xBF9F: 0xD4FA, //HANGUL SYLLABLE PHIEUPH YU PIEUPSIOS
+ 0xBFA0: 0xD4FC, //HANGUL SYLLABLE PHIEUPH YU SSANGSIOS
+ 0xBFA1: 0xC5D0, //HANGUL SYLLABLE IEUNG E
+ 0xBFA2: 0xC5D1, //HANGUL SYLLABLE IEUNG E KIYEOK
+ 0xBFA3: 0xC5D4, //HANGUL SYLLABLE IEUNG E NIEUN
+ 0xBFA4: 0xC5D8, //HANGUL SYLLABLE IEUNG E RIEUL
+ 0xBFA5: 0xC5E0, //HANGUL SYLLABLE IEUNG E MIEUM
+ 0xBFA6: 0xC5E1, //HANGUL SYLLABLE IEUNG E PIEUP
+ 0xBFA7: 0xC5E3, //HANGUL SYLLABLE IEUNG E SIOS
+ 0xBFA8: 0xC5E5, //HANGUL SYLLABLE IEUNG E IEUNG
+ 0xBFA9: 0xC5EC, //HANGUL SYLLABLE IEUNG YEO
+ 0xBFAA: 0xC5ED, //HANGUL SYLLABLE IEUNG YEO KIYEOK
+ 0xBFAB: 0xC5EE, //HANGUL SYLLABLE IEUNG YEO SSANGKIYEOK
+ 0xBFAC: 0xC5F0, //HANGUL SYLLABLE IEUNG YEO NIEUN
+ 0xBFAD: 0xC5F4, //HANGUL SYLLABLE IEUNG YEO RIEUL
+ 0xBFAE: 0xC5F6, //HANGUL SYLLABLE IEUNG YEO RIEULMIEUM
+ 0xBFAF: 0xC5F7, //HANGUL SYLLABLE IEUNG YEO RIEULPIEUP
+ 0xBFB0: 0xC5FC, //HANGUL SYLLABLE IEUNG YEO MIEUM
+ 0xBFB1: 0xC5FD, //HANGUL SYLLABLE IEUNG YEO PIEUP
+ 0xBFB2: 0xC5FE, //HANGUL SYLLABLE IEUNG YEO PIEUPSIOS
+ 0xBFB3: 0xC5FF, //HANGUL SYLLABLE IEUNG YEO SIOS
+ 0xBFB4: 0xC600, //HANGUL SYLLABLE IEUNG YEO SSANGSIOS
+ 0xBFB5: 0xC601, //HANGUL SYLLABLE IEUNG YEO IEUNG
+ 0xBFB6: 0xC605, //HANGUL SYLLABLE IEUNG YEO THIEUTH
+ 0xBFB7: 0xC606, //HANGUL SYLLABLE IEUNG YEO PHIEUPH
+ 0xBFB8: 0xC607, //HANGUL SYLLABLE IEUNG YEO HIEUH
+ 0xBFB9: 0xC608, //HANGUL SYLLABLE IEUNG YE
+ 0xBFBA: 0xC60C, //HANGUL SYLLABLE IEUNG YE NIEUN
+ 0xBFBB: 0xC610, //HANGUL SYLLABLE IEUNG YE RIEUL
+ 0xBFBC: 0xC618, //HANGUL SYLLABLE IEUNG YE MIEUM
+ 0xBFBD: 0xC619, //HANGUL SYLLABLE IEUNG YE PIEUP
+ 0xBFBE: 0xC61B, //HANGUL SYLLABLE IEUNG YE SIOS
+ 0xBFBF: 0xC61C, //HANGUL SYLLABLE IEUNG YE SSANGSIOS
+ 0xBFC0: 0xC624, //HANGUL SYLLABLE IEUNG O
+ 0xBFC1: 0xC625, //HANGUL SYLLABLE IEUNG O KIYEOK
+ 0xBFC2: 0xC628, //HANGUL SYLLABLE IEUNG O NIEUN
+ 0xBFC3: 0xC62C, //HANGUL SYLLABLE IEUNG O RIEUL
+ 0xBFC4: 0xC62D, //HANGUL SYLLABLE IEUNG O RIEULKIYEOK
+ 0xBFC5: 0xC62E, //HANGUL SYLLABLE IEUNG O RIEULMIEUM
+ 0xBFC6: 0xC630, //HANGUL SYLLABLE IEUNG O RIEULSIOS
+ 0xBFC7: 0xC633, //HANGUL SYLLABLE IEUNG O RIEULHIEUH
+ 0xBFC8: 0xC634, //HANGUL SYLLABLE IEUNG O MIEUM
+ 0xBFC9: 0xC635, //HANGUL SYLLABLE IEUNG O PIEUP
+ 0xBFCA: 0xC637, //HANGUL SYLLABLE IEUNG O SIOS
+ 0xBFCB: 0xC639, //HANGUL SYLLABLE IEUNG O IEUNG
+ 0xBFCC: 0xC63B, //HANGUL SYLLABLE IEUNG O CHIEUCH
+ 0xBFCD: 0xC640, //HANGUL SYLLABLE IEUNG WA
+ 0xBFCE: 0xC641, //HANGUL SYLLABLE IEUNG WA KIYEOK
+ 0xBFCF: 0xC644, //HANGUL SYLLABLE IEUNG WA NIEUN
+ 0xBFD0: 0xC648, //HANGUL SYLLABLE IEUNG WA RIEUL
+ 0xBFD1: 0xC650, //HANGUL SYLLABLE IEUNG WA MIEUM
+ 0xBFD2: 0xC651, //HANGUL SYLLABLE IEUNG WA PIEUP
+ 0xBFD3: 0xC653, //HANGUL SYLLABLE IEUNG WA SIOS
+ 0xBFD4: 0xC654, //HANGUL SYLLABLE IEUNG WA SSANGSIOS
+ 0xBFD5: 0xC655, //HANGUL SYLLABLE IEUNG WA IEUNG
+ 0xBFD6: 0xC65C, //HANGUL SYLLABLE IEUNG WAE
+ 0xBFD7: 0xC65D, //HANGUL SYLLABLE IEUNG WAE KIYEOK
+ 0xBFD8: 0xC660, //HANGUL SYLLABLE IEUNG WAE NIEUN
+ 0xBFD9: 0xC66C, //HANGUL SYLLABLE IEUNG WAE MIEUM
+ 0xBFDA: 0xC66F, //HANGUL SYLLABLE IEUNG WAE SIOS
+ 0xBFDB: 0xC671, //HANGUL SYLLABLE IEUNG WAE IEUNG
+ 0xBFDC: 0xC678, //HANGUL SYLLABLE IEUNG OE
+ 0xBFDD: 0xC679, //HANGUL SYLLABLE IEUNG OE KIYEOK
+ 0xBFDE: 0xC67C, //HANGUL SYLLABLE IEUNG OE NIEUN
+ 0xBFDF: 0xC680, //HANGUL SYLLABLE IEUNG OE RIEUL
+ 0xBFE0: 0xC688, //HANGUL SYLLABLE IEUNG OE MIEUM
+ 0xBFE1: 0xC689, //HANGUL SYLLABLE IEUNG OE PIEUP
+ 0xBFE2: 0xC68B, //HANGUL SYLLABLE IEUNG OE SIOS
+ 0xBFE3: 0xC68D, //HANGUL SYLLABLE IEUNG OE IEUNG
+ 0xBFE4: 0xC694, //HANGUL SYLLABLE IEUNG YO
+ 0xBFE5: 0xC695, //HANGUL SYLLABLE IEUNG YO KIYEOK
+ 0xBFE6: 0xC698, //HANGUL SYLLABLE IEUNG YO NIEUN
+ 0xBFE7: 0xC69C, //HANGUL SYLLABLE IEUNG YO RIEUL
+ 0xBFE8: 0xC6A4, //HANGUL SYLLABLE IEUNG YO MIEUM
+ 0xBFE9: 0xC6A5, //HANGUL SYLLABLE IEUNG YO PIEUP
+ 0xBFEA: 0xC6A7, //HANGUL SYLLABLE IEUNG YO SIOS
+ 0xBFEB: 0xC6A9, //HANGUL SYLLABLE IEUNG YO IEUNG
+ 0xBFEC: 0xC6B0, //HANGUL SYLLABLE IEUNG U
+ 0xBFED: 0xC6B1, //HANGUL SYLLABLE IEUNG U KIYEOK
+ 0xBFEE: 0xC6B4, //HANGUL SYLLABLE IEUNG U NIEUN
+ 0xBFEF: 0xC6B8, //HANGUL SYLLABLE IEUNG U RIEUL
+ 0xBFF0: 0xC6B9, //HANGUL SYLLABLE IEUNG U RIEULKIYEOK
+ 0xBFF1: 0xC6BA, //HANGUL SYLLABLE IEUNG U RIEULMIEUM
+ 0xBFF2: 0xC6C0, //HANGUL SYLLABLE IEUNG U MIEUM
+ 0xBFF3: 0xC6C1, //HANGUL SYLLABLE IEUNG U PIEUP
+ 0xBFF4: 0xC6C3, //HANGUL SYLLABLE IEUNG U SIOS
+ 0xBFF5: 0xC6C5, //HANGUL SYLLABLE IEUNG U IEUNG
+ 0xBFF6: 0xC6CC, //HANGUL SYLLABLE IEUNG WEO
+ 0xBFF7: 0xC6CD, //HANGUL SYLLABLE IEUNG WEO KIYEOK
+ 0xBFF8: 0xC6D0, //HANGUL SYLLABLE IEUNG WEO NIEUN
+ 0xBFF9: 0xC6D4, //HANGUL SYLLABLE IEUNG WEO RIEUL
+ 0xBFFA: 0xC6DC, //HANGUL SYLLABLE IEUNG WEO MIEUM
+ 0xBFFB: 0xC6DD, //HANGUL SYLLABLE IEUNG WEO PIEUP
+ 0xBFFC: 0xC6E0, //HANGUL SYLLABLE IEUNG WEO SSANGSIOS
+ 0xBFFD: 0xC6E1, //HANGUL SYLLABLE IEUNG WEO IEUNG
+ 0xBFFE: 0xC6E8, //HANGUL SYLLABLE IEUNG WE
+ 0xC041: 0xD4FE, //HANGUL SYLLABLE PHIEUPH YU CIEUC
+ 0xC042: 0xD4FF, //HANGUL SYLLABLE PHIEUPH YU CHIEUCH
+ 0xC043: 0xD500, //HANGUL SYLLABLE PHIEUPH YU KHIEUKH
+ 0xC044: 0xD501, //HANGUL SYLLABLE PHIEUPH YU THIEUTH
+ 0xC045: 0xD502, //HANGUL SYLLABLE PHIEUPH YU PHIEUPH
+ 0xC046: 0xD503, //HANGUL SYLLABLE PHIEUPH YU HIEUH
+ 0xC047: 0xD505, //HANGUL SYLLABLE PHIEUPH EU KIYEOK
+ 0xC048: 0xD506, //HANGUL SYLLABLE PHIEUPH EU SSANGKIYEOK
+ 0xC049: 0xD507, //HANGUL SYLLABLE PHIEUPH EU KIYEOKSIOS
+ 0xC04A: 0xD509, //HANGUL SYLLABLE PHIEUPH EU NIEUNCIEUC
+ 0xC04B: 0xD50A, //HANGUL SYLLABLE PHIEUPH EU NIEUNHIEUH
+ 0xC04C: 0xD50B, //HANGUL SYLLABLE PHIEUPH EU TIKEUT
+ 0xC04D: 0xD50D, //HANGUL SYLLABLE PHIEUPH EU RIEULKIYEOK
+ 0xC04E: 0xD50E, //HANGUL SYLLABLE PHIEUPH EU RIEULMIEUM
+ 0xC04F: 0xD50F, //HANGUL SYLLABLE PHIEUPH EU RIEULPIEUP
+ 0xC050: 0xD510, //HANGUL SYLLABLE PHIEUPH EU RIEULSIOS
+ 0xC051: 0xD511, //HANGUL SYLLABLE PHIEUPH EU RIEULTHIEUTH
+ 0xC052: 0xD512, //HANGUL SYLLABLE PHIEUPH EU RIEULPHIEUPH
+ 0xC053: 0xD513, //HANGUL SYLLABLE PHIEUPH EU RIEULHIEUH
+ 0xC054: 0xD516, //HANGUL SYLLABLE PHIEUPH EU PIEUPSIOS
+ 0xC055: 0xD518, //HANGUL SYLLABLE PHIEUPH EU SSANGSIOS
+ 0xC056: 0xD519, //HANGUL SYLLABLE PHIEUPH EU IEUNG
+ 0xC057: 0xD51A, //HANGUL SYLLABLE PHIEUPH EU CIEUC
+ 0xC058: 0xD51B, //HANGUL SYLLABLE PHIEUPH EU CHIEUCH
+ 0xC059: 0xD51C, //HANGUL SYLLABLE PHIEUPH EU KHIEUKH
+ 0xC05A: 0xD51D, //HANGUL SYLLABLE PHIEUPH EU THIEUTH
+ 0xC061: 0xD51E, //HANGUL SYLLABLE PHIEUPH EU PHIEUPH
+ 0xC062: 0xD51F, //HANGUL SYLLABLE PHIEUPH EU HIEUH
+ 0xC063: 0xD520, //HANGUL SYLLABLE PHIEUPH YI
+ 0xC064: 0xD521, //HANGUL SYLLABLE PHIEUPH YI KIYEOK
+ 0xC065: 0xD522, //HANGUL SYLLABLE PHIEUPH YI SSANGKIYEOK
+ 0xC066: 0xD523, //HANGUL SYLLABLE PHIEUPH YI KIYEOKSIOS
+ 0xC067: 0xD524, //HANGUL SYLLABLE PHIEUPH YI NIEUN
+ 0xC068: 0xD525, //HANGUL SYLLABLE PHIEUPH YI NIEUNCIEUC
+ 0xC069: 0xD526, //HANGUL SYLLABLE PHIEUPH YI NIEUNHIEUH
+ 0xC06A: 0xD527, //HANGUL SYLLABLE PHIEUPH YI TIKEUT
+ 0xC06B: 0xD528, //HANGUL SYLLABLE PHIEUPH YI RIEUL
+ 0xC06C: 0xD529, //HANGUL SYLLABLE PHIEUPH YI RIEULKIYEOK
+ 0xC06D: 0xD52A, //HANGUL SYLLABLE PHIEUPH YI RIEULMIEUM
+ 0xC06E: 0xD52B, //HANGUL SYLLABLE PHIEUPH YI RIEULPIEUP
+ 0xC06F: 0xD52C, //HANGUL SYLLABLE PHIEUPH YI RIEULSIOS
+ 0xC070: 0xD52D, //HANGUL SYLLABLE PHIEUPH YI RIEULTHIEUTH
+ 0xC071: 0xD52E, //HANGUL SYLLABLE PHIEUPH YI RIEULPHIEUPH
+ 0xC072: 0xD52F, //HANGUL SYLLABLE PHIEUPH YI RIEULHIEUH
+ 0xC073: 0xD530, //HANGUL SYLLABLE PHIEUPH YI MIEUM
+ 0xC074: 0xD531, //HANGUL SYLLABLE PHIEUPH YI PIEUP
+ 0xC075: 0xD532, //HANGUL SYLLABLE PHIEUPH YI PIEUPSIOS
+ 0xC076: 0xD533, //HANGUL SYLLABLE PHIEUPH YI SIOS
+ 0xC077: 0xD534, //HANGUL SYLLABLE PHIEUPH YI SSANGSIOS
+ 0xC078: 0xD535, //HANGUL SYLLABLE PHIEUPH YI IEUNG
+ 0xC079: 0xD536, //HANGUL SYLLABLE PHIEUPH YI CIEUC
+ 0xC07A: 0xD537, //HANGUL SYLLABLE PHIEUPH YI CHIEUCH
+ 0xC081: 0xD538, //HANGUL SYLLABLE PHIEUPH YI KHIEUKH
+ 0xC082: 0xD539, //HANGUL SYLLABLE PHIEUPH YI THIEUTH
+ 0xC083: 0xD53A, //HANGUL SYLLABLE PHIEUPH YI PHIEUPH
+ 0xC084: 0xD53B, //HANGUL SYLLABLE PHIEUPH YI HIEUH
+ 0xC085: 0xD53E, //HANGUL SYLLABLE PHIEUPH I SSANGKIYEOK
+ 0xC086: 0xD53F, //HANGUL SYLLABLE PHIEUPH I KIYEOKSIOS
+ 0xC087: 0xD541, //HANGUL SYLLABLE PHIEUPH I NIEUNCIEUC
+ 0xC088: 0xD542, //HANGUL SYLLABLE PHIEUPH I NIEUNHIEUH
+ 0xC089: 0xD543, //HANGUL SYLLABLE PHIEUPH I TIKEUT
+ 0xC08A: 0xD545, //HANGUL SYLLABLE PHIEUPH I RIEULKIYEOK
+ 0xC08B: 0xD546, //HANGUL SYLLABLE PHIEUPH I RIEULMIEUM
+ 0xC08C: 0xD547, //HANGUL SYLLABLE PHIEUPH I RIEULPIEUP
+ 0xC08D: 0xD548, //HANGUL SYLLABLE PHIEUPH I RIEULSIOS
+ 0xC08E: 0xD549, //HANGUL SYLLABLE PHIEUPH I RIEULTHIEUTH
+ 0xC08F: 0xD54A, //HANGUL SYLLABLE PHIEUPH I RIEULPHIEUPH
+ 0xC090: 0xD54B, //HANGUL SYLLABLE PHIEUPH I RIEULHIEUH
+ 0xC091: 0xD54E, //HANGUL SYLLABLE PHIEUPH I PIEUPSIOS
+ 0xC092: 0xD550, //HANGUL SYLLABLE PHIEUPH I SSANGSIOS
+ 0xC093: 0xD552, //HANGUL SYLLABLE PHIEUPH I CIEUC
+ 0xC094: 0xD553, //HANGUL SYLLABLE PHIEUPH I CHIEUCH
+ 0xC095: 0xD554, //HANGUL SYLLABLE PHIEUPH I KHIEUKH
+ 0xC096: 0xD555, //HANGUL SYLLABLE PHIEUPH I THIEUTH
+ 0xC097: 0xD556, //HANGUL SYLLABLE PHIEUPH I PHIEUPH
+ 0xC098: 0xD557, //HANGUL SYLLABLE PHIEUPH I HIEUH
+ 0xC099: 0xD55A, //HANGUL SYLLABLE HIEUH A SSANGKIYEOK
+ 0xC09A: 0xD55B, //HANGUL SYLLABLE HIEUH A KIYEOKSIOS
+ 0xC09B: 0xD55D, //HANGUL SYLLABLE HIEUH A NIEUNCIEUC
+ 0xC09C: 0xD55E, //HANGUL SYLLABLE HIEUH A NIEUNHIEUH
+ 0xC09D: 0xD55F, //HANGUL SYLLABLE HIEUH A TIKEUT
+ 0xC09E: 0xD561, //HANGUL SYLLABLE HIEUH A RIEULKIYEOK
+ 0xC09F: 0xD562, //HANGUL SYLLABLE HIEUH A RIEULMIEUM
+ 0xC0A0: 0xD563, //HANGUL SYLLABLE HIEUH A RIEULPIEUP
+ 0xC0A1: 0xC6E9, //HANGUL SYLLABLE IEUNG WE KIYEOK
+ 0xC0A2: 0xC6EC, //HANGUL SYLLABLE IEUNG WE NIEUN
+ 0xC0A3: 0xC6F0, //HANGUL SYLLABLE IEUNG WE RIEUL
+ 0xC0A4: 0xC6F8, //HANGUL SYLLABLE IEUNG WE MIEUM
+ 0xC0A5: 0xC6F9, //HANGUL SYLLABLE IEUNG WE PIEUP
+ 0xC0A6: 0xC6FD, //HANGUL SYLLABLE IEUNG WE IEUNG
+ 0xC0A7: 0xC704, //HANGUL SYLLABLE IEUNG WI
+ 0xC0A8: 0xC705, //HANGUL SYLLABLE IEUNG WI KIYEOK
+ 0xC0A9: 0xC708, //HANGUL SYLLABLE IEUNG WI NIEUN
+ 0xC0AA: 0xC70C, //HANGUL SYLLABLE IEUNG WI RIEUL
+ 0xC0AB: 0xC714, //HANGUL SYLLABLE IEUNG WI MIEUM
+ 0xC0AC: 0xC715, //HANGUL SYLLABLE IEUNG WI PIEUP
+ 0xC0AD: 0xC717, //HANGUL SYLLABLE IEUNG WI SIOS
+ 0xC0AE: 0xC719, //HANGUL SYLLABLE IEUNG WI IEUNG
+ 0xC0AF: 0xC720, //HANGUL SYLLABLE IEUNG YU
+ 0xC0B0: 0xC721, //HANGUL SYLLABLE IEUNG YU KIYEOK
+ 0xC0B1: 0xC724, //HANGUL SYLLABLE IEUNG YU NIEUN
+ 0xC0B2: 0xC728, //HANGUL SYLLABLE IEUNG YU RIEUL
+ 0xC0B3: 0xC730, //HANGUL SYLLABLE IEUNG YU MIEUM
+ 0xC0B4: 0xC731, //HANGUL SYLLABLE IEUNG YU PIEUP
+ 0xC0B5: 0xC733, //HANGUL SYLLABLE IEUNG YU SIOS
+ 0xC0B6: 0xC735, //HANGUL SYLLABLE IEUNG YU IEUNG
+ 0xC0B7: 0xC737, //HANGUL SYLLABLE IEUNG YU CHIEUCH
+ 0xC0B8: 0xC73C, //HANGUL SYLLABLE IEUNG EU
+ 0xC0B9: 0xC73D, //HANGUL SYLLABLE IEUNG EU KIYEOK
+ 0xC0BA: 0xC740, //HANGUL SYLLABLE IEUNG EU NIEUN
+ 0xC0BB: 0xC744, //HANGUL SYLLABLE IEUNG EU RIEUL
+ 0xC0BC: 0xC74A, //HANGUL SYLLABLE IEUNG EU RIEULPHIEUPH
+ 0xC0BD: 0xC74C, //HANGUL SYLLABLE IEUNG EU MIEUM
+ 0xC0BE: 0xC74D, //HANGUL SYLLABLE IEUNG EU PIEUP
+ 0xC0BF: 0xC74F, //HANGUL SYLLABLE IEUNG EU SIOS
+ 0xC0C0: 0xC751, //HANGUL SYLLABLE IEUNG EU IEUNG
+ 0xC0C1: 0xC752, //HANGUL SYLLABLE IEUNG EU CIEUC
+ 0xC0C2: 0xC753, //HANGUL SYLLABLE IEUNG EU CHIEUCH
+ 0xC0C3: 0xC754, //HANGUL SYLLABLE IEUNG EU KHIEUKH
+ 0xC0C4: 0xC755, //HANGUL SYLLABLE IEUNG EU THIEUTH
+ 0xC0C5: 0xC756, //HANGUL SYLLABLE IEUNG EU PHIEUPH
+ 0xC0C6: 0xC757, //HANGUL SYLLABLE IEUNG EU HIEUH
+ 0xC0C7: 0xC758, //HANGUL SYLLABLE IEUNG YI
+ 0xC0C8: 0xC75C, //HANGUL SYLLABLE IEUNG YI NIEUN
+ 0xC0C9: 0xC760, //HANGUL SYLLABLE IEUNG YI RIEUL
+ 0xC0CA: 0xC768, //HANGUL SYLLABLE IEUNG YI MIEUM
+ 0xC0CB: 0xC76B, //HANGUL SYLLABLE IEUNG YI SIOS
+ 0xC0CC: 0xC774, //HANGUL SYLLABLE IEUNG I
+ 0xC0CD: 0xC775, //HANGUL SYLLABLE IEUNG I KIYEOK
+ 0xC0CE: 0xC778, //HANGUL SYLLABLE IEUNG I NIEUN
+ 0xC0CF: 0xC77C, //HANGUL SYLLABLE IEUNG I RIEUL
+ 0xC0D0: 0xC77D, //HANGUL SYLLABLE IEUNG I RIEULKIYEOK
+ 0xC0D1: 0xC77E, //HANGUL SYLLABLE IEUNG I RIEULMIEUM
+ 0xC0D2: 0xC783, //HANGUL SYLLABLE IEUNG I RIEULHIEUH
+ 0xC0D3: 0xC784, //HANGUL SYLLABLE IEUNG I MIEUM
+ 0xC0D4: 0xC785, //HANGUL SYLLABLE IEUNG I PIEUP
+ 0xC0D5: 0xC787, //HANGUL SYLLABLE IEUNG I SIOS
+ 0xC0D6: 0xC788, //HANGUL SYLLABLE IEUNG I SSANGSIOS
+ 0xC0D7: 0xC789, //HANGUL SYLLABLE IEUNG I IEUNG
+ 0xC0D8: 0xC78A, //HANGUL SYLLABLE IEUNG I CIEUC
+ 0xC0D9: 0xC78E, //HANGUL SYLLABLE IEUNG I PHIEUPH
+ 0xC0DA: 0xC790, //HANGUL SYLLABLE CIEUC A
+ 0xC0DB: 0xC791, //HANGUL SYLLABLE CIEUC A KIYEOK
+ 0xC0DC: 0xC794, //HANGUL SYLLABLE CIEUC A NIEUN
+ 0xC0DD: 0xC796, //HANGUL SYLLABLE CIEUC A NIEUNHIEUH
+ 0xC0DE: 0xC797, //HANGUL SYLLABLE CIEUC A TIKEUT
+ 0xC0DF: 0xC798, //HANGUL SYLLABLE CIEUC A RIEUL
+ 0xC0E0: 0xC79A, //HANGUL SYLLABLE CIEUC A RIEULMIEUM
+ 0xC0E1: 0xC7A0, //HANGUL SYLLABLE CIEUC A MIEUM
+ 0xC0E2: 0xC7A1, //HANGUL SYLLABLE CIEUC A PIEUP
+ 0xC0E3: 0xC7A3, //HANGUL SYLLABLE CIEUC A SIOS
+ 0xC0E4: 0xC7A4, //HANGUL SYLLABLE CIEUC A SSANGSIOS
+ 0xC0E5: 0xC7A5, //HANGUL SYLLABLE CIEUC A IEUNG
+ 0xC0E6: 0xC7A6, //HANGUL SYLLABLE CIEUC A CIEUC
+ 0xC0E7: 0xC7AC, //HANGUL SYLLABLE CIEUC AE
+ 0xC0E8: 0xC7AD, //HANGUL SYLLABLE CIEUC AE KIYEOK
+ 0xC0E9: 0xC7B0, //HANGUL SYLLABLE CIEUC AE NIEUN
+ 0xC0EA: 0xC7B4, //HANGUL SYLLABLE CIEUC AE RIEUL
+ 0xC0EB: 0xC7BC, //HANGUL SYLLABLE CIEUC AE MIEUM
+ 0xC0EC: 0xC7BD, //HANGUL SYLLABLE CIEUC AE PIEUP
+ 0xC0ED: 0xC7BF, //HANGUL SYLLABLE CIEUC AE SIOS
+ 0xC0EE: 0xC7C0, //HANGUL SYLLABLE CIEUC AE SSANGSIOS
+ 0xC0EF: 0xC7C1, //HANGUL SYLLABLE CIEUC AE IEUNG
+ 0xC0F0: 0xC7C8, //HANGUL SYLLABLE CIEUC YA
+ 0xC0F1: 0xC7C9, //HANGUL SYLLABLE CIEUC YA KIYEOK
+ 0xC0F2: 0xC7CC, //HANGUL SYLLABLE CIEUC YA NIEUN
+ 0xC0F3: 0xC7CE, //HANGUL SYLLABLE CIEUC YA NIEUNHIEUH
+ 0xC0F4: 0xC7D0, //HANGUL SYLLABLE CIEUC YA RIEUL
+ 0xC0F5: 0xC7D8, //HANGUL SYLLABLE CIEUC YA MIEUM
+ 0xC0F6: 0xC7DD, //HANGUL SYLLABLE CIEUC YA IEUNG
+ 0xC0F7: 0xC7E4, //HANGUL SYLLABLE CIEUC YAE
+ 0xC0F8: 0xC7E8, //HANGUL SYLLABLE CIEUC YAE NIEUN
+ 0xC0F9: 0xC7EC, //HANGUL SYLLABLE CIEUC YAE RIEUL
+ 0xC0FA: 0xC800, //HANGUL SYLLABLE CIEUC EO
+ 0xC0FB: 0xC801, //HANGUL SYLLABLE CIEUC EO KIYEOK
+ 0xC0FC: 0xC804, //HANGUL SYLLABLE CIEUC EO NIEUN
+ 0xC0FD: 0xC808, //HANGUL SYLLABLE CIEUC EO RIEUL
+ 0xC0FE: 0xC80A, //HANGUL SYLLABLE CIEUC EO RIEULMIEUM
+ 0xC141: 0xD564, //HANGUL SYLLABLE HIEUH A RIEULSIOS
+ 0xC142: 0xD566, //HANGUL SYLLABLE HIEUH A RIEULPHIEUPH
+ 0xC143: 0xD567, //HANGUL SYLLABLE HIEUH A RIEULHIEUH
+ 0xC144: 0xD56A, //HANGUL SYLLABLE HIEUH A PIEUPSIOS
+ 0xC145: 0xD56C, //HANGUL SYLLABLE HIEUH A SSANGSIOS
+ 0xC146: 0xD56E, //HANGUL SYLLABLE HIEUH A CIEUC
+ 0xC147: 0xD56F, //HANGUL SYLLABLE HIEUH A CHIEUCH
+ 0xC148: 0xD570, //HANGUL SYLLABLE HIEUH A KHIEUKH
+ 0xC149: 0xD571, //HANGUL SYLLABLE HIEUH A THIEUTH
+ 0xC14A: 0xD572, //HANGUL SYLLABLE HIEUH A PHIEUPH
+ 0xC14B: 0xD573, //HANGUL SYLLABLE HIEUH A HIEUH
+ 0xC14C: 0xD576, //HANGUL SYLLABLE HIEUH AE SSANGKIYEOK
+ 0xC14D: 0xD577, //HANGUL SYLLABLE HIEUH AE KIYEOKSIOS
+ 0xC14E: 0xD579, //HANGUL SYLLABLE HIEUH AE NIEUNCIEUC
+ 0xC14F: 0xD57A, //HANGUL SYLLABLE HIEUH AE NIEUNHIEUH
+ 0xC150: 0xD57B, //HANGUL SYLLABLE HIEUH AE TIKEUT
+ 0xC151: 0xD57D, //HANGUL SYLLABLE HIEUH AE RIEULKIYEOK
+ 0xC152: 0xD57E, //HANGUL SYLLABLE HIEUH AE RIEULMIEUM
+ 0xC153: 0xD57F, //HANGUL SYLLABLE HIEUH AE RIEULPIEUP
+ 0xC154: 0xD580, //HANGUL SYLLABLE HIEUH AE RIEULSIOS
+ 0xC155: 0xD581, //HANGUL SYLLABLE HIEUH AE RIEULTHIEUTH
+ 0xC156: 0xD582, //HANGUL SYLLABLE HIEUH AE RIEULPHIEUPH
+ 0xC157: 0xD583, //HANGUL SYLLABLE HIEUH AE RIEULHIEUH
+ 0xC158: 0xD586, //HANGUL SYLLABLE HIEUH AE PIEUPSIOS
+ 0xC159: 0xD58A, //HANGUL SYLLABLE HIEUH AE CIEUC
+ 0xC15A: 0xD58B, //HANGUL SYLLABLE HIEUH AE CHIEUCH
+ 0xC161: 0xD58C, //HANGUL SYLLABLE HIEUH AE KHIEUKH
+ 0xC162: 0xD58D, //HANGUL SYLLABLE HIEUH AE THIEUTH
+ 0xC163: 0xD58E, //HANGUL SYLLABLE HIEUH AE PHIEUPH
+ 0xC164: 0xD58F, //HANGUL SYLLABLE HIEUH AE HIEUH
+ 0xC165: 0xD591, //HANGUL SYLLABLE HIEUH YA KIYEOK
+ 0xC166: 0xD592, //HANGUL SYLLABLE HIEUH YA SSANGKIYEOK
+ 0xC167: 0xD593, //HANGUL SYLLABLE HIEUH YA KIYEOKSIOS
+ 0xC168: 0xD594, //HANGUL SYLLABLE HIEUH YA NIEUN
+ 0xC169: 0xD595, //HANGUL SYLLABLE HIEUH YA NIEUNCIEUC
+ 0xC16A: 0xD596, //HANGUL SYLLABLE HIEUH YA NIEUNHIEUH
+ 0xC16B: 0xD597, //HANGUL SYLLABLE HIEUH YA TIKEUT
+ 0xC16C: 0xD598, //HANGUL SYLLABLE HIEUH YA RIEUL
+ 0xC16D: 0xD599, //HANGUL SYLLABLE HIEUH YA RIEULKIYEOK
+ 0xC16E: 0xD59A, //HANGUL SYLLABLE HIEUH YA RIEULMIEUM
+ 0xC16F: 0xD59B, //HANGUL SYLLABLE HIEUH YA RIEULPIEUP
+ 0xC170: 0xD59C, //HANGUL SYLLABLE HIEUH YA RIEULSIOS
+ 0xC171: 0xD59D, //HANGUL SYLLABLE HIEUH YA RIEULTHIEUTH
+ 0xC172: 0xD59E, //HANGUL SYLLABLE HIEUH YA RIEULPHIEUPH
+ 0xC173: 0xD59F, //HANGUL SYLLABLE HIEUH YA RIEULHIEUH
+ 0xC174: 0xD5A0, //HANGUL SYLLABLE HIEUH YA MIEUM
+ 0xC175: 0xD5A1, //HANGUL SYLLABLE HIEUH YA PIEUP
+ 0xC176: 0xD5A2, //HANGUL SYLLABLE HIEUH YA PIEUPSIOS
+ 0xC177: 0xD5A3, //HANGUL SYLLABLE HIEUH YA SIOS
+ 0xC178: 0xD5A4, //HANGUL SYLLABLE HIEUH YA SSANGSIOS
+ 0xC179: 0xD5A6, //HANGUL SYLLABLE HIEUH YA CIEUC
+ 0xC17A: 0xD5A7, //HANGUL SYLLABLE HIEUH YA CHIEUCH
+ 0xC181: 0xD5A8, //HANGUL SYLLABLE HIEUH YA KHIEUKH
+ 0xC182: 0xD5A9, //HANGUL SYLLABLE HIEUH YA THIEUTH
+ 0xC183: 0xD5AA, //HANGUL SYLLABLE HIEUH YA PHIEUPH
+ 0xC184: 0xD5AB, //HANGUL SYLLABLE HIEUH YA HIEUH
+ 0xC185: 0xD5AC, //HANGUL SYLLABLE HIEUH YAE
+ 0xC186: 0xD5AD, //HANGUL SYLLABLE HIEUH YAE KIYEOK
+ 0xC187: 0xD5AE, //HANGUL SYLLABLE HIEUH YAE SSANGKIYEOK
+ 0xC188: 0xD5AF, //HANGUL SYLLABLE HIEUH YAE KIYEOKSIOS
+ 0xC189: 0xD5B0, //HANGUL SYLLABLE HIEUH YAE NIEUN
+ 0xC18A: 0xD5B1, //HANGUL SYLLABLE HIEUH YAE NIEUNCIEUC
+ 0xC18B: 0xD5B2, //HANGUL SYLLABLE HIEUH YAE NIEUNHIEUH
+ 0xC18C: 0xD5B3, //HANGUL SYLLABLE HIEUH YAE TIKEUT
+ 0xC18D: 0xD5B4, //HANGUL SYLLABLE HIEUH YAE RIEUL
+ 0xC18E: 0xD5B5, //HANGUL SYLLABLE HIEUH YAE RIEULKIYEOK
+ 0xC18F: 0xD5B6, //HANGUL SYLLABLE HIEUH YAE RIEULMIEUM
+ 0xC190: 0xD5B7, //HANGUL SYLLABLE HIEUH YAE RIEULPIEUP
+ 0xC191: 0xD5B8, //HANGUL SYLLABLE HIEUH YAE RIEULSIOS
+ 0xC192: 0xD5B9, //HANGUL SYLLABLE HIEUH YAE RIEULTHIEUTH
+ 0xC193: 0xD5BA, //HANGUL SYLLABLE HIEUH YAE RIEULPHIEUPH
+ 0xC194: 0xD5BB, //HANGUL SYLLABLE HIEUH YAE RIEULHIEUH
+ 0xC195: 0xD5BC, //HANGUL SYLLABLE HIEUH YAE MIEUM
+ 0xC196: 0xD5BD, //HANGUL SYLLABLE HIEUH YAE PIEUP
+ 0xC197: 0xD5BE, //HANGUL SYLLABLE HIEUH YAE PIEUPSIOS
+ 0xC198: 0xD5BF, //HANGUL SYLLABLE HIEUH YAE SIOS
+ 0xC199: 0xD5C0, //HANGUL SYLLABLE HIEUH YAE SSANGSIOS
+ 0xC19A: 0xD5C1, //HANGUL SYLLABLE HIEUH YAE IEUNG
+ 0xC19B: 0xD5C2, //HANGUL SYLLABLE HIEUH YAE CIEUC
+ 0xC19C: 0xD5C3, //HANGUL SYLLABLE HIEUH YAE CHIEUCH
+ 0xC19D: 0xD5C4, //HANGUL SYLLABLE HIEUH YAE KHIEUKH
+ 0xC19E: 0xD5C5, //HANGUL SYLLABLE HIEUH YAE THIEUTH
+ 0xC19F: 0xD5C6, //HANGUL SYLLABLE HIEUH YAE PHIEUPH
+ 0xC1A0: 0xD5C7, //HANGUL SYLLABLE HIEUH YAE HIEUH
+ 0xC1A1: 0xC810, //HANGUL SYLLABLE CIEUC EO MIEUM
+ 0xC1A2: 0xC811, //HANGUL SYLLABLE CIEUC EO PIEUP
+ 0xC1A3: 0xC813, //HANGUL SYLLABLE CIEUC EO SIOS
+ 0xC1A4: 0xC815, //HANGUL SYLLABLE CIEUC EO IEUNG
+ 0xC1A5: 0xC816, //HANGUL SYLLABLE CIEUC EO CIEUC
+ 0xC1A6: 0xC81C, //HANGUL SYLLABLE CIEUC E
+ 0xC1A7: 0xC81D, //HANGUL SYLLABLE CIEUC E KIYEOK
+ 0xC1A8: 0xC820, //HANGUL SYLLABLE CIEUC E NIEUN
+ 0xC1A9: 0xC824, //HANGUL SYLLABLE CIEUC E RIEUL
+ 0xC1AA: 0xC82C, //HANGUL SYLLABLE CIEUC E MIEUM
+ 0xC1AB: 0xC82D, //HANGUL SYLLABLE CIEUC E PIEUP
+ 0xC1AC: 0xC82F, //HANGUL SYLLABLE CIEUC E SIOS
+ 0xC1AD: 0xC831, //HANGUL SYLLABLE CIEUC E IEUNG
+ 0xC1AE: 0xC838, //HANGUL SYLLABLE CIEUC YEO
+ 0xC1AF: 0xC83C, //HANGUL SYLLABLE CIEUC YEO NIEUN
+ 0xC1B0: 0xC840, //HANGUL SYLLABLE CIEUC YEO RIEUL
+ 0xC1B1: 0xC848, //HANGUL SYLLABLE CIEUC YEO MIEUM
+ 0xC1B2: 0xC849, //HANGUL SYLLABLE CIEUC YEO PIEUP
+ 0xC1B3: 0xC84C, //HANGUL SYLLABLE CIEUC YEO SSANGSIOS
+ 0xC1B4: 0xC84D, //HANGUL SYLLABLE CIEUC YEO IEUNG
+ 0xC1B5: 0xC854, //HANGUL SYLLABLE CIEUC YE
+ 0xC1B6: 0xC870, //HANGUL SYLLABLE CIEUC O
+ 0xC1B7: 0xC871, //HANGUL SYLLABLE CIEUC O KIYEOK
+ 0xC1B8: 0xC874, //HANGUL SYLLABLE CIEUC O NIEUN
+ 0xC1B9: 0xC878, //HANGUL SYLLABLE CIEUC O RIEUL
+ 0xC1BA: 0xC87A, //HANGUL SYLLABLE CIEUC O RIEULMIEUM
+ 0xC1BB: 0xC880, //HANGUL SYLLABLE CIEUC O MIEUM
+ 0xC1BC: 0xC881, //HANGUL SYLLABLE CIEUC O PIEUP
+ 0xC1BD: 0xC883, //HANGUL SYLLABLE CIEUC O SIOS
+ 0xC1BE: 0xC885, //HANGUL SYLLABLE CIEUC O IEUNG
+ 0xC1BF: 0xC886, //HANGUL SYLLABLE CIEUC O CIEUC
+ 0xC1C0: 0xC887, //HANGUL SYLLABLE CIEUC O CHIEUCH
+ 0xC1C1: 0xC88B, //HANGUL SYLLABLE CIEUC O HIEUH
+ 0xC1C2: 0xC88C, //HANGUL SYLLABLE CIEUC WA
+ 0xC1C3: 0xC88D, //HANGUL SYLLABLE CIEUC WA KIYEOK
+ 0xC1C4: 0xC894, //HANGUL SYLLABLE CIEUC WA RIEUL
+ 0xC1C5: 0xC89D, //HANGUL SYLLABLE CIEUC WA PIEUP
+ 0xC1C6: 0xC89F, //HANGUL SYLLABLE CIEUC WA SIOS
+ 0xC1C7: 0xC8A1, //HANGUL SYLLABLE CIEUC WA IEUNG
+ 0xC1C8: 0xC8A8, //HANGUL SYLLABLE CIEUC WAE
+ 0xC1C9: 0xC8BC, //HANGUL SYLLABLE CIEUC WAE SSANGSIOS
+ 0xC1CA: 0xC8BD, //HANGUL SYLLABLE CIEUC WAE IEUNG
+ 0xC1CB: 0xC8C4, //HANGUL SYLLABLE CIEUC OE
+ 0xC1CC: 0xC8C8, //HANGUL SYLLABLE CIEUC OE NIEUN
+ 0xC1CD: 0xC8CC, //HANGUL SYLLABLE CIEUC OE RIEUL
+ 0xC1CE: 0xC8D4, //HANGUL SYLLABLE CIEUC OE MIEUM
+ 0xC1CF: 0xC8D5, //HANGUL SYLLABLE CIEUC OE PIEUP
+ 0xC1D0: 0xC8D7, //HANGUL SYLLABLE CIEUC OE SIOS
+ 0xC1D1: 0xC8D9, //HANGUL SYLLABLE CIEUC OE IEUNG
+ 0xC1D2: 0xC8E0, //HANGUL SYLLABLE CIEUC YO
+ 0xC1D3: 0xC8E1, //HANGUL SYLLABLE CIEUC YO KIYEOK
+ 0xC1D4: 0xC8E4, //HANGUL SYLLABLE CIEUC YO NIEUN
+ 0xC1D5: 0xC8F5, //HANGUL SYLLABLE CIEUC YO IEUNG
+ 0xC1D6: 0xC8FC, //HANGUL SYLLABLE CIEUC U
+ 0xC1D7: 0xC8FD, //HANGUL SYLLABLE CIEUC U KIYEOK
+ 0xC1D8: 0xC900, //HANGUL SYLLABLE CIEUC U NIEUN
+ 0xC1D9: 0xC904, //HANGUL SYLLABLE CIEUC U RIEUL
+ 0xC1DA: 0xC905, //HANGUL SYLLABLE CIEUC U RIEULKIYEOK
+ 0xC1DB: 0xC906, //HANGUL SYLLABLE CIEUC U RIEULMIEUM
+ 0xC1DC: 0xC90C, //HANGUL SYLLABLE CIEUC U MIEUM
+ 0xC1DD: 0xC90D, //HANGUL SYLLABLE CIEUC U PIEUP
+ 0xC1DE: 0xC90F, //HANGUL SYLLABLE CIEUC U SIOS
+ 0xC1DF: 0xC911, //HANGUL SYLLABLE CIEUC U IEUNG
+ 0xC1E0: 0xC918, //HANGUL SYLLABLE CIEUC WEO
+ 0xC1E1: 0xC92C, //HANGUL SYLLABLE CIEUC WEO SSANGSIOS
+ 0xC1E2: 0xC934, //HANGUL SYLLABLE CIEUC WE
+ 0xC1E3: 0xC950, //HANGUL SYLLABLE CIEUC WI
+ 0xC1E4: 0xC951, //HANGUL SYLLABLE CIEUC WI KIYEOK
+ 0xC1E5: 0xC954, //HANGUL SYLLABLE CIEUC WI NIEUN
+ 0xC1E6: 0xC958, //HANGUL SYLLABLE CIEUC WI RIEUL
+ 0xC1E7: 0xC960, //HANGUL SYLLABLE CIEUC WI MIEUM
+ 0xC1E8: 0xC961, //HANGUL SYLLABLE CIEUC WI PIEUP
+ 0xC1E9: 0xC963, //HANGUL SYLLABLE CIEUC WI SIOS
+ 0xC1EA: 0xC96C, //HANGUL SYLLABLE CIEUC YU
+ 0xC1EB: 0xC970, //HANGUL SYLLABLE CIEUC YU NIEUN
+ 0xC1EC: 0xC974, //HANGUL SYLLABLE CIEUC YU RIEUL
+ 0xC1ED: 0xC97C, //HANGUL SYLLABLE CIEUC YU MIEUM
+ 0xC1EE: 0xC988, //HANGUL SYLLABLE CIEUC EU
+ 0xC1EF: 0xC989, //HANGUL SYLLABLE CIEUC EU KIYEOK
+ 0xC1F0: 0xC98C, //HANGUL SYLLABLE CIEUC EU NIEUN
+ 0xC1F1: 0xC990, //HANGUL SYLLABLE CIEUC EU RIEUL
+ 0xC1F2: 0xC998, //HANGUL SYLLABLE CIEUC EU MIEUM
+ 0xC1F3: 0xC999, //HANGUL SYLLABLE CIEUC EU PIEUP
+ 0xC1F4: 0xC99B, //HANGUL SYLLABLE CIEUC EU SIOS
+ 0xC1F5: 0xC99D, //HANGUL SYLLABLE CIEUC EU IEUNG
+ 0xC1F6: 0xC9C0, //HANGUL SYLLABLE CIEUC I
+ 0xC1F7: 0xC9C1, //HANGUL SYLLABLE CIEUC I KIYEOK
+ 0xC1F8: 0xC9C4, //HANGUL SYLLABLE CIEUC I NIEUN
+ 0xC1F9: 0xC9C7, //HANGUL SYLLABLE CIEUC I TIKEUT
+ 0xC1FA: 0xC9C8, //HANGUL SYLLABLE CIEUC I RIEUL
+ 0xC1FB: 0xC9CA, //HANGUL SYLLABLE CIEUC I RIEULMIEUM
+ 0xC1FC: 0xC9D0, //HANGUL SYLLABLE CIEUC I MIEUM
+ 0xC1FD: 0xC9D1, //HANGUL SYLLABLE CIEUC I PIEUP
+ 0xC1FE: 0xC9D3, //HANGUL SYLLABLE CIEUC I SIOS
+ 0xC241: 0xD5CA, //HANGUL SYLLABLE HIEUH EO SSANGKIYEOK
+ 0xC242: 0xD5CB, //HANGUL SYLLABLE HIEUH EO KIYEOKSIOS
+ 0xC243: 0xD5CD, //HANGUL SYLLABLE HIEUH EO NIEUNCIEUC
+ 0xC244: 0xD5CE, //HANGUL SYLLABLE HIEUH EO NIEUNHIEUH
+ 0xC245: 0xD5CF, //HANGUL SYLLABLE HIEUH EO TIKEUT
+ 0xC246: 0xD5D1, //HANGUL SYLLABLE HIEUH EO RIEULKIYEOK
+ 0xC247: 0xD5D3, //HANGUL SYLLABLE HIEUH EO RIEULPIEUP
+ 0xC248: 0xD5D4, //HANGUL SYLLABLE HIEUH EO RIEULSIOS
+ 0xC249: 0xD5D5, //HANGUL SYLLABLE HIEUH EO RIEULTHIEUTH
+ 0xC24A: 0xD5D6, //HANGUL SYLLABLE HIEUH EO RIEULPHIEUPH
+ 0xC24B: 0xD5D7, //HANGUL SYLLABLE HIEUH EO RIEULHIEUH
+ 0xC24C: 0xD5DA, //HANGUL SYLLABLE HIEUH EO PIEUPSIOS
+ 0xC24D: 0xD5DC, //HANGUL SYLLABLE HIEUH EO SSANGSIOS
+ 0xC24E: 0xD5DE, //HANGUL SYLLABLE HIEUH EO CIEUC
+ 0xC24F: 0xD5DF, //HANGUL SYLLABLE HIEUH EO CHIEUCH
+ 0xC250: 0xD5E0, //HANGUL SYLLABLE HIEUH EO KHIEUKH
+ 0xC251: 0xD5E1, //HANGUL SYLLABLE HIEUH EO THIEUTH
+ 0xC252: 0xD5E2, //HANGUL SYLLABLE HIEUH EO PHIEUPH
+ 0xC253: 0xD5E3, //HANGUL SYLLABLE HIEUH EO HIEUH
+ 0xC254: 0xD5E6, //HANGUL SYLLABLE HIEUH E SSANGKIYEOK
+ 0xC255: 0xD5E7, //HANGUL SYLLABLE HIEUH E KIYEOKSIOS
+ 0xC256: 0xD5E9, //HANGUL SYLLABLE HIEUH E NIEUNCIEUC
+ 0xC257: 0xD5EA, //HANGUL SYLLABLE HIEUH E NIEUNHIEUH
+ 0xC258: 0xD5EB, //HANGUL SYLLABLE HIEUH E TIKEUT
+ 0xC259: 0xD5ED, //HANGUL SYLLABLE HIEUH E RIEULKIYEOK
+ 0xC25A: 0xD5EE, //HANGUL SYLLABLE HIEUH E RIEULMIEUM
+ 0xC261: 0xD5EF, //HANGUL SYLLABLE HIEUH E RIEULPIEUP
+ 0xC262: 0xD5F0, //HANGUL SYLLABLE HIEUH E RIEULSIOS
+ 0xC263: 0xD5F1, //HANGUL SYLLABLE HIEUH E RIEULTHIEUTH
+ 0xC264: 0xD5F2, //HANGUL SYLLABLE HIEUH E RIEULPHIEUPH
+ 0xC265: 0xD5F3, //HANGUL SYLLABLE HIEUH E RIEULHIEUH
+ 0xC266: 0xD5F6, //HANGUL SYLLABLE HIEUH E PIEUPSIOS
+ 0xC267: 0xD5F8, //HANGUL SYLLABLE HIEUH E SSANGSIOS
+ 0xC268: 0xD5FA, //HANGUL SYLLABLE HIEUH E CIEUC
+ 0xC269: 0xD5FB, //HANGUL SYLLABLE HIEUH E CHIEUCH
+ 0xC26A: 0xD5FC, //HANGUL SYLLABLE HIEUH E KHIEUKH
+ 0xC26B: 0xD5FD, //HANGUL SYLLABLE HIEUH E THIEUTH
+ 0xC26C: 0xD5FE, //HANGUL SYLLABLE HIEUH E PHIEUPH
+ 0xC26D: 0xD5FF, //HANGUL SYLLABLE HIEUH E HIEUH
+ 0xC26E: 0xD602, //HANGUL SYLLABLE HIEUH YEO SSANGKIYEOK
+ 0xC26F: 0xD603, //HANGUL SYLLABLE HIEUH YEO KIYEOKSIOS
+ 0xC270: 0xD605, //HANGUL SYLLABLE HIEUH YEO NIEUNCIEUC
+ 0xC271: 0xD606, //HANGUL SYLLABLE HIEUH YEO NIEUNHIEUH
+ 0xC272: 0xD607, //HANGUL SYLLABLE HIEUH YEO TIKEUT
+ 0xC273: 0xD609, //HANGUL SYLLABLE HIEUH YEO RIEULKIYEOK
+ 0xC274: 0xD60A, //HANGUL SYLLABLE HIEUH YEO RIEULMIEUM
+ 0xC275: 0xD60B, //HANGUL SYLLABLE HIEUH YEO RIEULPIEUP
+ 0xC276: 0xD60C, //HANGUL SYLLABLE HIEUH YEO RIEULSIOS
+ 0xC277: 0xD60D, //HANGUL SYLLABLE HIEUH YEO RIEULTHIEUTH
+ 0xC278: 0xD60E, //HANGUL SYLLABLE HIEUH YEO RIEULPHIEUPH
+ 0xC279: 0xD60F, //HANGUL SYLLABLE HIEUH YEO RIEULHIEUH
+ 0xC27A: 0xD612, //HANGUL SYLLABLE HIEUH YEO PIEUPSIOS
+ 0xC281: 0xD616, //HANGUL SYLLABLE HIEUH YEO CIEUC
+ 0xC282: 0xD617, //HANGUL SYLLABLE HIEUH YEO CHIEUCH
+ 0xC283: 0xD618, //HANGUL SYLLABLE HIEUH YEO KHIEUKH
+ 0xC284: 0xD619, //HANGUL SYLLABLE HIEUH YEO THIEUTH
+ 0xC285: 0xD61A, //HANGUL SYLLABLE HIEUH YEO PHIEUPH
+ 0xC286: 0xD61B, //HANGUL SYLLABLE HIEUH YEO HIEUH
+ 0xC287: 0xD61D, //HANGUL SYLLABLE HIEUH YE KIYEOK
+ 0xC288: 0xD61E, //HANGUL SYLLABLE HIEUH YE SSANGKIYEOK
+ 0xC289: 0xD61F, //HANGUL SYLLABLE HIEUH YE KIYEOKSIOS
+ 0xC28A: 0xD621, //HANGUL SYLLABLE HIEUH YE NIEUNCIEUC
+ 0xC28B: 0xD622, //HANGUL SYLLABLE HIEUH YE NIEUNHIEUH
+ 0xC28C: 0xD623, //HANGUL SYLLABLE HIEUH YE TIKEUT
+ 0xC28D: 0xD625, //HANGUL SYLLABLE HIEUH YE RIEULKIYEOK
+ 0xC28E: 0xD626, //HANGUL SYLLABLE HIEUH YE RIEULMIEUM
+ 0xC28F: 0xD627, //HANGUL SYLLABLE HIEUH YE RIEULPIEUP
+ 0xC290: 0xD628, //HANGUL SYLLABLE HIEUH YE RIEULSIOS
+ 0xC291: 0xD629, //HANGUL SYLLABLE HIEUH YE RIEULTHIEUTH
+ 0xC292: 0xD62A, //HANGUL SYLLABLE HIEUH YE RIEULPHIEUPH
+ 0xC293: 0xD62B, //HANGUL SYLLABLE HIEUH YE RIEULHIEUH
+ 0xC294: 0xD62C, //HANGUL SYLLABLE HIEUH YE MIEUM
+ 0xC295: 0xD62E, //HANGUL SYLLABLE HIEUH YE PIEUPSIOS
+ 0xC296: 0xD62F, //HANGUL SYLLABLE HIEUH YE SIOS
+ 0xC297: 0xD630, //HANGUL SYLLABLE HIEUH YE SSANGSIOS
+ 0xC298: 0xD631, //HANGUL SYLLABLE HIEUH YE IEUNG
+ 0xC299: 0xD632, //HANGUL SYLLABLE HIEUH YE CIEUC
+ 0xC29A: 0xD633, //HANGUL SYLLABLE HIEUH YE CHIEUCH
+ 0xC29B: 0xD634, //HANGUL SYLLABLE HIEUH YE KHIEUKH
+ 0xC29C: 0xD635, //HANGUL SYLLABLE HIEUH YE THIEUTH
+ 0xC29D: 0xD636, //HANGUL SYLLABLE HIEUH YE PHIEUPH
+ 0xC29E: 0xD637, //HANGUL SYLLABLE HIEUH YE HIEUH
+ 0xC29F: 0xD63A, //HANGUL SYLLABLE HIEUH O SSANGKIYEOK
+ 0xC2A0: 0xD63B, //HANGUL SYLLABLE HIEUH O KIYEOKSIOS
+ 0xC2A1: 0xC9D5, //HANGUL SYLLABLE CIEUC I IEUNG
+ 0xC2A2: 0xC9D6, //HANGUL SYLLABLE CIEUC I CIEUC
+ 0xC2A3: 0xC9D9, //HANGUL SYLLABLE CIEUC I THIEUTH
+ 0xC2A4: 0xC9DA, //HANGUL SYLLABLE CIEUC I PHIEUPH
+ 0xC2A5: 0xC9DC, //HANGUL SYLLABLE SSANGCIEUC A
+ 0xC2A6: 0xC9DD, //HANGUL SYLLABLE SSANGCIEUC A KIYEOK
+ 0xC2A7: 0xC9E0, //HANGUL SYLLABLE SSANGCIEUC A NIEUN
+ 0xC2A8: 0xC9E2, //HANGUL SYLLABLE SSANGCIEUC A NIEUNHIEUH
+ 0xC2A9: 0xC9E4, //HANGUL SYLLABLE SSANGCIEUC A RIEUL
+ 0xC2AA: 0xC9E7, //HANGUL SYLLABLE SSANGCIEUC A RIEULPIEUP
+ 0xC2AB: 0xC9EC, //HANGUL SYLLABLE SSANGCIEUC A MIEUM
+ 0xC2AC: 0xC9ED, //HANGUL SYLLABLE SSANGCIEUC A PIEUP
+ 0xC2AD: 0xC9EF, //HANGUL SYLLABLE SSANGCIEUC A SIOS
+ 0xC2AE: 0xC9F0, //HANGUL SYLLABLE SSANGCIEUC A SSANGSIOS
+ 0xC2AF: 0xC9F1, //HANGUL SYLLABLE SSANGCIEUC A IEUNG
+ 0xC2B0: 0xC9F8, //HANGUL SYLLABLE SSANGCIEUC AE
+ 0xC2B1: 0xC9F9, //HANGUL SYLLABLE SSANGCIEUC AE KIYEOK
+ 0xC2B2: 0xC9FC, //HANGUL SYLLABLE SSANGCIEUC AE NIEUN
+ 0xC2B3: 0xCA00, //HANGUL SYLLABLE SSANGCIEUC AE RIEUL
+ 0xC2B4: 0xCA08, //HANGUL SYLLABLE SSANGCIEUC AE MIEUM
+ 0xC2B5: 0xCA09, //HANGUL SYLLABLE SSANGCIEUC AE PIEUP
+ 0xC2B6: 0xCA0B, //HANGUL SYLLABLE SSANGCIEUC AE SIOS
+ 0xC2B7: 0xCA0C, //HANGUL SYLLABLE SSANGCIEUC AE SSANGSIOS
+ 0xC2B8: 0xCA0D, //HANGUL SYLLABLE SSANGCIEUC AE IEUNG
+ 0xC2B9: 0xCA14, //HANGUL SYLLABLE SSANGCIEUC YA
+ 0xC2BA: 0xCA18, //HANGUL SYLLABLE SSANGCIEUC YA NIEUN
+ 0xC2BB: 0xCA29, //HANGUL SYLLABLE SSANGCIEUC YA IEUNG
+ 0xC2BC: 0xCA4C, //HANGUL SYLLABLE SSANGCIEUC EO
+ 0xC2BD: 0xCA4D, //HANGUL SYLLABLE SSANGCIEUC EO KIYEOK
+ 0xC2BE: 0xCA50, //HANGUL SYLLABLE SSANGCIEUC EO NIEUN
+ 0xC2BF: 0xCA54, //HANGUL SYLLABLE SSANGCIEUC EO RIEUL
+ 0xC2C0: 0xCA5C, //HANGUL SYLLABLE SSANGCIEUC EO MIEUM
+ 0xC2C1: 0xCA5D, //HANGUL SYLLABLE SSANGCIEUC EO PIEUP
+ 0xC2C2: 0xCA5F, //HANGUL SYLLABLE SSANGCIEUC EO SIOS
+ 0xC2C3: 0xCA60, //HANGUL SYLLABLE SSANGCIEUC EO SSANGSIOS
+ 0xC2C4: 0xCA61, //HANGUL SYLLABLE SSANGCIEUC EO IEUNG
+ 0xC2C5: 0xCA68, //HANGUL SYLLABLE SSANGCIEUC E
+ 0xC2C6: 0xCA7D, //HANGUL SYLLABLE SSANGCIEUC E IEUNG
+ 0xC2C7: 0xCA84, //HANGUL SYLLABLE SSANGCIEUC YEO
+ 0xC2C8: 0xCA98, //HANGUL SYLLABLE SSANGCIEUC YEO SSANGSIOS
+ 0xC2C9: 0xCABC, //HANGUL SYLLABLE SSANGCIEUC O
+ 0xC2CA: 0xCABD, //HANGUL SYLLABLE SSANGCIEUC O KIYEOK
+ 0xC2CB: 0xCAC0, //HANGUL SYLLABLE SSANGCIEUC O NIEUN
+ 0xC2CC: 0xCAC4, //HANGUL SYLLABLE SSANGCIEUC O RIEUL
+ 0xC2CD: 0xCACC, //HANGUL SYLLABLE SSANGCIEUC O MIEUM
+ 0xC2CE: 0xCACD, //HANGUL SYLLABLE SSANGCIEUC O PIEUP
+ 0xC2CF: 0xCACF, //HANGUL SYLLABLE SSANGCIEUC O SIOS
+ 0xC2D0: 0xCAD1, //HANGUL SYLLABLE SSANGCIEUC O IEUNG
+ 0xC2D1: 0xCAD3, //HANGUL SYLLABLE SSANGCIEUC O CHIEUCH
+ 0xC2D2: 0xCAD8, //HANGUL SYLLABLE SSANGCIEUC WA
+ 0xC2D3: 0xCAD9, //HANGUL SYLLABLE SSANGCIEUC WA KIYEOK
+ 0xC2D4: 0xCAE0, //HANGUL SYLLABLE SSANGCIEUC WA RIEUL
+ 0xC2D5: 0xCAEC, //HANGUL SYLLABLE SSANGCIEUC WA SSANGSIOS
+ 0xC2D6: 0xCAF4, //HANGUL SYLLABLE SSANGCIEUC WAE
+ 0xC2D7: 0xCB08, //HANGUL SYLLABLE SSANGCIEUC WAE SSANGSIOS
+ 0xC2D8: 0xCB10, //HANGUL SYLLABLE SSANGCIEUC OE
+ 0xC2D9: 0xCB14, //HANGUL SYLLABLE SSANGCIEUC OE NIEUN
+ 0xC2DA: 0xCB18, //HANGUL SYLLABLE SSANGCIEUC OE RIEUL
+ 0xC2DB: 0xCB20, //HANGUL SYLLABLE SSANGCIEUC OE MIEUM
+ 0xC2DC: 0xCB21, //HANGUL SYLLABLE SSANGCIEUC OE PIEUP
+ 0xC2DD: 0xCB41, //HANGUL SYLLABLE SSANGCIEUC YO IEUNG
+ 0xC2DE: 0xCB48, //HANGUL SYLLABLE SSANGCIEUC U
+ 0xC2DF: 0xCB49, //HANGUL SYLLABLE SSANGCIEUC U KIYEOK
+ 0xC2E0: 0xCB4C, //HANGUL SYLLABLE SSANGCIEUC U NIEUN
+ 0xC2E1: 0xCB50, //HANGUL SYLLABLE SSANGCIEUC U RIEUL
+ 0xC2E2: 0xCB58, //HANGUL SYLLABLE SSANGCIEUC U MIEUM
+ 0xC2E3: 0xCB59, //HANGUL SYLLABLE SSANGCIEUC U PIEUP
+ 0xC2E4: 0xCB5D, //HANGUL SYLLABLE SSANGCIEUC U IEUNG
+ 0xC2E5: 0xCB64, //HANGUL SYLLABLE SSANGCIEUC WEO
+ 0xC2E6: 0xCB78, //HANGUL SYLLABLE SSANGCIEUC WEO SSANGSIOS
+ 0xC2E7: 0xCB79, //HANGUL SYLLABLE SSANGCIEUC WEO IEUNG
+ 0xC2E8: 0xCB9C, //HANGUL SYLLABLE SSANGCIEUC WI
+ 0xC2E9: 0xCBB8, //HANGUL SYLLABLE SSANGCIEUC YU
+ 0xC2EA: 0xCBD4, //HANGUL SYLLABLE SSANGCIEUC EU
+ 0xC2EB: 0xCBE4, //HANGUL SYLLABLE SSANGCIEUC EU MIEUM
+ 0xC2EC: 0xCBE7, //HANGUL SYLLABLE SSANGCIEUC EU SIOS
+ 0xC2ED: 0xCBE9, //HANGUL SYLLABLE SSANGCIEUC EU IEUNG
+ 0xC2EE: 0xCC0C, //HANGUL SYLLABLE SSANGCIEUC I
+ 0xC2EF: 0xCC0D, //HANGUL SYLLABLE SSANGCIEUC I KIYEOK
+ 0xC2F0: 0xCC10, //HANGUL SYLLABLE SSANGCIEUC I NIEUN
+ 0xC2F1: 0xCC14, //HANGUL SYLLABLE SSANGCIEUC I RIEUL
+ 0xC2F2: 0xCC1C, //HANGUL SYLLABLE SSANGCIEUC I MIEUM
+ 0xC2F3: 0xCC1D, //HANGUL SYLLABLE SSANGCIEUC I PIEUP
+ 0xC2F4: 0xCC21, //HANGUL SYLLABLE SSANGCIEUC I IEUNG
+ 0xC2F5: 0xCC22, //HANGUL SYLLABLE SSANGCIEUC I CIEUC
+ 0xC2F6: 0xCC27, //HANGUL SYLLABLE SSANGCIEUC I HIEUH
+ 0xC2F7: 0xCC28, //HANGUL SYLLABLE CHIEUCH A
+ 0xC2F8: 0xCC29, //HANGUL SYLLABLE CHIEUCH A KIYEOK
+ 0xC2F9: 0xCC2C, //HANGUL SYLLABLE CHIEUCH A NIEUN
+ 0xC2FA: 0xCC2E, //HANGUL SYLLABLE CHIEUCH A NIEUNHIEUH
+ 0xC2FB: 0xCC30, //HANGUL SYLLABLE CHIEUCH A RIEUL
+ 0xC2FC: 0xCC38, //HANGUL SYLLABLE CHIEUCH A MIEUM
+ 0xC2FD: 0xCC39, //HANGUL SYLLABLE CHIEUCH A PIEUP
+ 0xC2FE: 0xCC3B, //HANGUL SYLLABLE CHIEUCH A SIOS
+ 0xC341: 0xD63D, //HANGUL SYLLABLE HIEUH O NIEUNCIEUC
+ 0xC342: 0xD63E, //HANGUL SYLLABLE HIEUH O NIEUNHIEUH
+ 0xC343: 0xD63F, //HANGUL SYLLABLE HIEUH O TIKEUT
+ 0xC344: 0xD641, //HANGUL SYLLABLE HIEUH O RIEULKIYEOK
+ 0xC345: 0xD642, //HANGUL SYLLABLE HIEUH O RIEULMIEUM
+ 0xC346: 0xD643, //HANGUL SYLLABLE HIEUH O RIEULPIEUP
+ 0xC347: 0xD644, //HANGUL SYLLABLE HIEUH O RIEULSIOS
+ 0xC348: 0xD646, //HANGUL SYLLABLE HIEUH O RIEULPHIEUPH
+ 0xC349: 0xD647, //HANGUL SYLLABLE HIEUH O RIEULHIEUH
+ 0xC34A: 0xD64A, //HANGUL SYLLABLE HIEUH O PIEUPSIOS
+ 0xC34B: 0xD64C, //HANGUL SYLLABLE HIEUH O SSANGSIOS
+ 0xC34C: 0xD64E, //HANGUL SYLLABLE HIEUH O CIEUC
+ 0xC34D: 0xD64F, //HANGUL SYLLABLE HIEUH O CHIEUCH
+ 0xC34E: 0xD650, //HANGUL SYLLABLE HIEUH O KHIEUKH
+ 0xC34F: 0xD652, //HANGUL SYLLABLE HIEUH O PHIEUPH
+ 0xC350: 0xD653, //HANGUL SYLLABLE HIEUH O HIEUH
+ 0xC351: 0xD656, //HANGUL SYLLABLE HIEUH WA SSANGKIYEOK
+ 0xC352: 0xD657, //HANGUL SYLLABLE HIEUH WA KIYEOKSIOS
+ 0xC353: 0xD659, //HANGUL SYLLABLE HIEUH WA NIEUNCIEUC
+ 0xC354: 0xD65A, //HANGUL SYLLABLE HIEUH WA NIEUNHIEUH
+ 0xC355: 0xD65B, //HANGUL SYLLABLE HIEUH WA TIKEUT
+ 0xC356: 0xD65D, //HANGUL SYLLABLE HIEUH WA RIEULKIYEOK
+ 0xC357: 0xD65E, //HANGUL SYLLABLE HIEUH WA RIEULMIEUM
+ 0xC358: 0xD65F, //HANGUL SYLLABLE HIEUH WA RIEULPIEUP
+ 0xC359: 0xD660, //HANGUL SYLLABLE HIEUH WA RIEULSIOS
+ 0xC35A: 0xD661, //HANGUL SYLLABLE HIEUH WA RIEULTHIEUTH
+ 0xC361: 0xD662, //HANGUL SYLLABLE HIEUH WA RIEULPHIEUPH
+ 0xC362: 0xD663, //HANGUL SYLLABLE HIEUH WA RIEULHIEUH
+ 0xC363: 0xD664, //HANGUL SYLLABLE HIEUH WA MIEUM
+ 0xC364: 0xD665, //HANGUL SYLLABLE HIEUH WA PIEUP
+ 0xC365: 0xD666, //HANGUL SYLLABLE HIEUH WA PIEUPSIOS
+ 0xC366: 0xD668, //HANGUL SYLLABLE HIEUH WA SSANGSIOS
+ 0xC367: 0xD66A, //HANGUL SYLLABLE HIEUH WA CIEUC
+ 0xC368: 0xD66B, //HANGUL SYLLABLE HIEUH WA CHIEUCH
+ 0xC369: 0xD66C, //HANGUL SYLLABLE HIEUH WA KHIEUKH
+ 0xC36A: 0xD66D, //HANGUL SYLLABLE HIEUH WA THIEUTH
+ 0xC36B: 0xD66E, //HANGUL SYLLABLE HIEUH WA PHIEUPH
+ 0xC36C: 0xD66F, //HANGUL SYLLABLE HIEUH WA HIEUH
+ 0xC36D: 0xD672, //HANGUL SYLLABLE HIEUH WAE SSANGKIYEOK
+ 0xC36E: 0xD673, //HANGUL SYLLABLE HIEUH WAE KIYEOKSIOS
+ 0xC36F: 0xD675, //HANGUL SYLLABLE HIEUH WAE NIEUNCIEUC
+ 0xC370: 0xD676, //HANGUL SYLLABLE HIEUH WAE NIEUNHIEUH
+ 0xC371: 0xD677, //HANGUL SYLLABLE HIEUH WAE TIKEUT
+ 0xC372: 0xD678, //HANGUL SYLLABLE HIEUH WAE RIEUL
+ 0xC373: 0xD679, //HANGUL SYLLABLE HIEUH WAE RIEULKIYEOK
+ 0xC374: 0xD67A, //HANGUL SYLLABLE HIEUH WAE RIEULMIEUM
+ 0xC375: 0xD67B, //HANGUL SYLLABLE HIEUH WAE RIEULPIEUP
+ 0xC376: 0xD67C, //HANGUL SYLLABLE HIEUH WAE RIEULSIOS
+ 0xC377: 0xD67D, //HANGUL SYLLABLE HIEUH WAE RIEULTHIEUTH
+ 0xC378: 0xD67E, //HANGUL SYLLABLE HIEUH WAE RIEULPHIEUPH
+ 0xC379: 0xD67F, //HANGUL SYLLABLE HIEUH WAE RIEULHIEUH
+ 0xC37A: 0xD680, //HANGUL SYLLABLE HIEUH WAE MIEUM
+ 0xC381: 0xD681, //HANGUL SYLLABLE HIEUH WAE PIEUP
+ 0xC382: 0xD682, //HANGUL SYLLABLE HIEUH WAE PIEUPSIOS
+ 0xC383: 0xD684, //HANGUL SYLLABLE HIEUH WAE SSANGSIOS
+ 0xC384: 0xD686, //HANGUL SYLLABLE HIEUH WAE CIEUC
+ 0xC385: 0xD687, //HANGUL SYLLABLE HIEUH WAE CHIEUCH
+ 0xC386: 0xD688, //HANGUL SYLLABLE HIEUH WAE KHIEUKH
+ 0xC387: 0xD689, //HANGUL SYLLABLE HIEUH WAE THIEUTH
+ 0xC388: 0xD68A, //HANGUL SYLLABLE HIEUH WAE PHIEUPH
+ 0xC389: 0xD68B, //HANGUL SYLLABLE HIEUH WAE HIEUH
+ 0xC38A: 0xD68E, //HANGUL SYLLABLE HIEUH OE SSANGKIYEOK
+ 0xC38B: 0xD68F, //HANGUL SYLLABLE HIEUH OE KIYEOKSIOS
+ 0xC38C: 0xD691, //HANGUL SYLLABLE HIEUH OE NIEUNCIEUC
+ 0xC38D: 0xD692, //HANGUL SYLLABLE HIEUH OE NIEUNHIEUH
+ 0xC38E: 0xD693, //HANGUL SYLLABLE HIEUH OE TIKEUT
+ 0xC38F: 0xD695, //HANGUL SYLLABLE HIEUH OE RIEULKIYEOK
+ 0xC390: 0xD696, //HANGUL SYLLABLE HIEUH OE RIEULMIEUM
+ 0xC391: 0xD697, //HANGUL SYLLABLE HIEUH OE RIEULPIEUP
+ 0xC392: 0xD698, //HANGUL SYLLABLE HIEUH OE RIEULSIOS
+ 0xC393: 0xD699, //HANGUL SYLLABLE HIEUH OE RIEULTHIEUTH
+ 0xC394: 0xD69A, //HANGUL SYLLABLE HIEUH OE RIEULPHIEUPH
+ 0xC395: 0xD69B, //HANGUL SYLLABLE HIEUH OE RIEULHIEUH
+ 0xC396: 0xD69C, //HANGUL SYLLABLE HIEUH OE MIEUM
+ 0xC397: 0xD69E, //HANGUL SYLLABLE HIEUH OE PIEUPSIOS
+ 0xC398: 0xD6A0, //HANGUL SYLLABLE HIEUH OE SSANGSIOS
+ 0xC399: 0xD6A2, //HANGUL SYLLABLE HIEUH OE CIEUC
+ 0xC39A: 0xD6A3, //HANGUL SYLLABLE HIEUH OE CHIEUCH
+ 0xC39B: 0xD6A4, //HANGUL SYLLABLE HIEUH OE KHIEUKH
+ 0xC39C: 0xD6A5, //HANGUL SYLLABLE HIEUH OE THIEUTH
+ 0xC39D: 0xD6A6, //HANGUL SYLLABLE HIEUH OE PHIEUPH
+ 0xC39E: 0xD6A7, //HANGUL SYLLABLE HIEUH OE HIEUH
+ 0xC39F: 0xD6A9, //HANGUL SYLLABLE HIEUH YO KIYEOK
+ 0xC3A0: 0xD6AA, //HANGUL SYLLABLE HIEUH YO SSANGKIYEOK
+ 0xC3A1: 0xCC3C, //HANGUL SYLLABLE CHIEUCH A SSANGSIOS
+ 0xC3A2: 0xCC3D, //HANGUL SYLLABLE CHIEUCH A IEUNG
+ 0xC3A3: 0xCC3E, //HANGUL SYLLABLE CHIEUCH A CIEUC
+ 0xC3A4: 0xCC44, //HANGUL SYLLABLE CHIEUCH AE
+ 0xC3A5: 0xCC45, //HANGUL SYLLABLE CHIEUCH AE KIYEOK
+ 0xC3A6: 0xCC48, //HANGUL SYLLABLE CHIEUCH AE NIEUN
+ 0xC3A7: 0xCC4C, //HANGUL SYLLABLE CHIEUCH AE RIEUL
+ 0xC3A8: 0xCC54, //HANGUL SYLLABLE CHIEUCH AE MIEUM
+ 0xC3A9: 0xCC55, //HANGUL SYLLABLE CHIEUCH AE PIEUP
+ 0xC3AA: 0xCC57, //HANGUL SYLLABLE CHIEUCH AE SIOS
+ 0xC3AB: 0xCC58, //HANGUL SYLLABLE CHIEUCH AE SSANGSIOS
+ 0xC3AC: 0xCC59, //HANGUL SYLLABLE CHIEUCH AE IEUNG
+ 0xC3AD: 0xCC60, //HANGUL SYLLABLE CHIEUCH YA
+ 0xC3AE: 0xCC64, //HANGUL SYLLABLE CHIEUCH YA NIEUN
+ 0xC3AF: 0xCC66, //HANGUL SYLLABLE CHIEUCH YA NIEUNHIEUH
+ 0xC3B0: 0xCC68, //HANGUL SYLLABLE CHIEUCH YA RIEUL
+ 0xC3B1: 0xCC70, //HANGUL SYLLABLE CHIEUCH YA MIEUM
+ 0xC3B2: 0xCC75, //HANGUL SYLLABLE CHIEUCH YA IEUNG
+ 0xC3B3: 0xCC98, //HANGUL SYLLABLE CHIEUCH EO
+ 0xC3B4: 0xCC99, //HANGUL SYLLABLE CHIEUCH EO KIYEOK
+ 0xC3B5: 0xCC9C, //HANGUL SYLLABLE CHIEUCH EO NIEUN
+ 0xC3B6: 0xCCA0, //HANGUL SYLLABLE CHIEUCH EO RIEUL
+ 0xC3B7: 0xCCA8, //HANGUL SYLLABLE CHIEUCH EO MIEUM
+ 0xC3B8: 0xCCA9, //HANGUL SYLLABLE CHIEUCH EO PIEUP
+ 0xC3B9: 0xCCAB, //HANGUL SYLLABLE CHIEUCH EO SIOS
+ 0xC3BA: 0xCCAC, //HANGUL SYLLABLE CHIEUCH EO SSANGSIOS
+ 0xC3BB: 0xCCAD, //HANGUL SYLLABLE CHIEUCH EO IEUNG
+ 0xC3BC: 0xCCB4, //HANGUL SYLLABLE CHIEUCH E
+ 0xC3BD: 0xCCB5, //HANGUL SYLLABLE CHIEUCH E KIYEOK
+ 0xC3BE: 0xCCB8, //HANGUL SYLLABLE CHIEUCH E NIEUN
+ 0xC3BF: 0xCCBC, //HANGUL SYLLABLE CHIEUCH E RIEUL
+ 0xC3C0: 0xCCC4, //HANGUL SYLLABLE CHIEUCH E MIEUM
+ 0xC3C1: 0xCCC5, //HANGUL SYLLABLE CHIEUCH E PIEUP
+ 0xC3C2: 0xCCC7, //HANGUL SYLLABLE CHIEUCH E SIOS
+ 0xC3C3: 0xCCC9, //HANGUL SYLLABLE CHIEUCH E IEUNG
+ 0xC3C4: 0xCCD0, //HANGUL SYLLABLE CHIEUCH YEO
+ 0xC3C5: 0xCCD4, //HANGUL SYLLABLE CHIEUCH YEO NIEUN
+ 0xC3C6: 0xCCE4, //HANGUL SYLLABLE CHIEUCH YEO SSANGSIOS
+ 0xC3C7: 0xCCEC, //HANGUL SYLLABLE CHIEUCH YE
+ 0xC3C8: 0xCCF0, //HANGUL SYLLABLE CHIEUCH YE NIEUN
+ 0xC3C9: 0xCD01, //HANGUL SYLLABLE CHIEUCH YE IEUNG
+ 0xC3CA: 0xCD08, //HANGUL SYLLABLE CHIEUCH O
+ 0xC3CB: 0xCD09, //HANGUL SYLLABLE CHIEUCH O KIYEOK
+ 0xC3CC: 0xCD0C, //HANGUL SYLLABLE CHIEUCH O NIEUN
+ 0xC3CD: 0xCD10, //HANGUL SYLLABLE CHIEUCH O RIEUL
+ 0xC3CE: 0xCD18, //HANGUL SYLLABLE CHIEUCH O MIEUM
+ 0xC3CF: 0xCD19, //HANGUL SYLLABLE CHIEUCH O PIEUP
+ 0xC3D0: 0xCD1B, //HANGUL SYLLABLE CHIEUCH O SIOS
+ 0xC3D1: 0xCD1D, //HANGUL SYLLABLE CHIEUCH O IEUNG
+ 0xC3D2: 0xCD24, //HANGUL SYLLABLE CHIEUCH WA
+ 0xC3D3: 0xCD28, //HANGUL SYLLABLE CHIEUCH WA NIEUN
+ 0xC3D4: 0xCD2C, //HANGUL SYLLABLE CHIEUCH WA RIEUL
+ 0xC3D5: 0xCD39, //HANGUL SYLLABLE CHIEUCH WA IEUNG
+ 0xC3D6: 0xCD5C, //HANGUL SYLLABLE CHIEUCH OE
+ 0xC3D7: 0xCD60, //HANGUL SYLLABLE CHIEUCH OE NIEUN
+ 0xC3D8: 0xCD64, //HANGUL SYLLABLE CHIEUCH OE RIEUL
+ 0xC3D9: 0xCD6C, //HANGUL SYLLABLE CHIEUCH OE MIEUM
+ 0xC3DA: 0xCD6D, //HANGUL SYLLABLE CHIEUCH OE PIEUP
+ 0xC3DB: 0xCD6F, //HANGUL SYLLABLE CHIEUCH OE SIOS
+ 0xC3DC: 0xCD71, //HANGUL SYLLABLE CHIEUCH OE IEUNG
+ 0xC3DD: 0xCD78, //HANGUL SYLLABLE CHIEUCH YO
+ 0xC3DE: 0xCD88, //HANGUL SYLLABLE CHIEUCH YO MIEUM
+ 0xC3DF: 0xCD94, //HANGUL SYLLABLE CHIEUCH U
+ 0xC3E0: 0xCD95, //HANGUL SYLLABLE CHIEUCH U KIYEOK
+ 0xC3E1: 0xCD98, //HANGUL SYLLABLE CHIEUCH U NIEUN
+ 0xC3E2: 0xCD9C, //HANGUL SYLLABLE CHIEUCH U RIEUL
+ 0xC3E3: 0xCDA4, //HANGUL SYLLABLE CHIEUCH U MIEUM
+ 0xC3E4: 0xCDA5, //HANGUL SYLLABLE CHIEUCH U PIEUP
+ 0xC3E5: 0xCDA7, //HANGUL SYLLABLE CHIEUCH U SIOS
+ 0xC3E6: 0xCDA9, //HANGUL SYLLABLE CHIEUCH U IEUNG
+ 0xC3E7: 0xCDB0, //HANGUL SYLLABLE CHIEUCH WEO
+ 0xC3E8: 0xCDC4, //HANGUL SYLLABLE CHIEUCH WEO SSANGSIOS
+ 0xC3E9: 0xCDCC, //HANGUL SYLLABLE CHIEUCH WE
+ 0xC3EA: 0xCDD0, //HANGUL SYLLABLE CHIEUCH WE NIEUN
+ 0xC3EB: 0xCDE8, //HANGUL SYLLABLE CHIEUCH WI
+ 0xC3EC: 0xCDEC, //HANGUL SYLLABLE CHIEUCH WI NIEUN
+ 0xC3ED: 0xCDF0, //HANGUL SYLLABLE CHIEUCH WI RIEUL
+ 0xC3EE: 0xCDF8, //HANGUL SYLLABLE CHIEUCH WI MIEUM
+ 0xC3EF: 0xCDF9, //HANGUL SYLLABLE CHIEUCH WI PIEUP
+ 0xC3F0: 0xCDFB, //HANGUL SYLLABLE CHIEUCH WI SIOS
+ 0xC3F1: 0xCDFD, //HANGUL SYLLABLE CHIEUCH WI IEUNG
+ 0xC3F2: 0xCE04, //HANGUL SYLLABLE CHIEUCH YU
+ 0xC3F3: 0xCE08, //HANGUL SYLLABLE CHIEUCH YU NIEUN
+ 0xC3F4: 0xCE0C, //HANGUL SYLLABLE CHIEUCH YU RIEUL
+ 0xC3F5: 0xCE14, //HANGUL SYLLABLE CHIEUCH YU MIEUM
+ 0xC3F6: 0xCE19, //HANGUL SYLLABLE CHIEUCH YU IEUNG
+ 0xC3F7: 0xCE20, //HANGUL SYLLABLE CHIEUCH EU
+ 0xC3F8: 0xCE21, //HANGUL SYLLABLE CHIEUCH EU KIYEOK
+ 0xC3F9: 0xCE24, //HANGUL SYLLABLE CHIEUCH EU NIEUN
+ 0xC3FA: 0xCE28, //HANGUL SYLLABLE CHIEUCH EU RIEUL
+ 0xC3FB: 0xCE30, //HANGUL SYLLABLE CHIEUCH EU MIEUM
+ 0xC3FC: 0xCE31, //HANGUL SYLLABLE CHIEUCH EU PIEUP
+ 0xC3FD: 0xCE33, //HANGUL SYLLABLE CHIEUCH EU SIOS
+ 0xC3FE: 0xCE35, //HANGUL SYLLABLE CHIEUCH EU IEUNG
+ 0xC441: 0xD6AB, //HANGUL SYLLABLE HIEUH YO KIYEOKSIOS
+ 0xC442: 0xD6AD, //HANGUL SYLLABLE HIEUH YO NIEUNCIEUC
+ 0xC443: 0xD6AE, //HANGUL SYLLABLE HIEUH YO NIEUNHIEUH
+ 0xC444: 0xD6AF, //HANGUL SYLLABLE HIEUH YO TIKEUT
+ 0xC445: 0xD6B1, //HANGUL SYLLABLE HIEUH YO RIEULKIYEOK
+ 0xC446: 0xD6B2, //HANGUL SYLLABLE HIEUH YO RIEULMIEUM
+ 0xC447: 0xD6B3, //HANGUL SYLLABLE HIEUH YO RIEULPIEUP
+ 0xC448: 0xD6B4, //HANGUL SYLLABLE HIEUH YO RIEULSIOS
+ 0xC449: 0xD6B5, //HANGUL SYLLABLE HIEUH YO RIEULTHIEUTH
+ 0xC44A: 0xD6B6, //HANGUL SYLLABLE HIEUH YO RIEULPHIEUPH
+ 0xC44B: 0xD6B7, //HANGUL SYLLABLE HIEUH YO RIEULHIEUH
+ 0xC44C: 0xD6B8, //HANGUL SYLLABLE HIEUH YO MIEUM
+ 0xC44D: 0xD6BA, //HANGUL SYLLABLE HIEUH YO PIEUPSIOS
+ 0xC44E: 0xD6BC, //HANGUL SYLLABLE HIEUH YO SSANGSIOS
+ 0xC44F: 0xD6BD, //HANGUL SYLLABLE HIEUH YO IEUNG
+ 0xC450: 0xD6BE, //HANGUL SYLLABLE HIEUH YO CIEUC
+ 0xC451: 0xD6BF, //HANGUL SYLLABLE HIEUH YO CHIEUCH
+ 0xC452: 0xD6C0, //HANGUL SYLLABLE HIEUH YO KHIEUKH
+ 0xC453: 0xD6C1, //HANGUL SYLLABLE HIEUH YO THIEUTH
+ 0xC454: 0xD6C2, //HANGUL SYLLABLE HIEUH YO PHIEUPH
+ 0xC455: 0xD6C3, //HANGUL SYLLABLE HIEUH YO HIEUH
+ 0xC456: 0xD6C6, //HANGUL SYLLABLE HIEUH U SSANGKIYEOK
+ 0xC457: 0xD6C7, //HANGUL SYLLABLE HIEUH U KIYEOKSIOS
+ 0xC458: 0xD6C9, //HANGUL SYLLABLE HIEUH U NIEUNCIEUC
+ 0xC459: 0xD6CA, //HANGUL SYLLABLE HIEUH U NIEUNHIEUH
+ 0xC45A: 0xD6CB, //HANGUL SYLLABLE HIEUH U TIKEUT
+ 0xC461: 0xD6CD, //HANGUL SYLLABLE HIEUH U RIEULKIYEOK
+ 0xC462: 0xD6CE, //HANGUL SYLLABLE HIEUH U RIEULMIEUM
+ 0xC463: 0xD6CF, //HANGUL SYLLABLE HIEUH U RIEULPIEUP
+ 0xC464: 0xD6D0, //HANGUL SYLLABLE HIEUH U RIEULSIOS
+ 0xC465: 0xD6D2, //HANGUL SYLLABLE HIEUH U RIEULPHIEUPH
+ 0xC466: 0xD6D3, //HANGUL SYLLABLE HIEUH U RIEULHIEUH
+ 0xC467: 0xD6D5, //HANGUL SYLLABLE HIEUH U PIEUP
+ 0xC468: 0xD6D6, //HANGUL SYLLABLE HIEUH U PIEUPSIOS
+ 0xC469: 0xD6D8, //HANGUL SYLLABLE HIEUH U SSANGSIOS
+ 0xC46A: 0xD6DA, //HANGUL SYLLABLE HIEUH U CIEUC
+ 0xC46B: 0xD6DB, //HANGUL SYLLABLE HIEUH U CHIEUCH
+ 0xC46C: 0xD6DC, //HANGUL SYLLABLE HIEUH U KHIEUKH
+ 0xC46D: 0xD6DD, //HANGUL SYLLABLE HIEUH U THIEUTH
+ 0xC46E: 0xD6DE, //HANGUL SYLLABLE HIEUH U PHIEUPH
+ 0xC46F: 0xD6DF, //HANGUL SYLLABLE HIEUH U HIEUH
+ 0xC470: 0xD6E1, //HANGUL SYLLABLE HIEUH WEO KIYEOK
+ 0xC471: 0xD6E2, //HANGUL SYLLABLE HIEUH WEO SSANGKIYEOK
+ 0xC472: 0xD6E3, //HANGUL SYLLABLE HIEUH WEO KIYEOKSIOS
+ 0xC473: 0xD6E5, //HANGUL SYLLABLE HIEUH WEO NIEUNCIEUC
+ 0xC474: 0xD6E6, //HANGUL SYLLABLE HIEUH WEO NIEUNHIEUH
+ 0xC475: 0xD6E7, //HANGUL SYLLABLE HIEUH WEO TIKEUT
+ 0xC476: 0xD6E9, //HANGUL SYLLABLE HIEUH WEO RIEULKIYEOK
+ 0xC477: 0xD6EA, //HANGUL SYLLABLE HIEUH WEO RIEULMIEUM
+ 0xC478: 0xD6EB, //HANGUL SYLLABLE HIEUH WEO RIEULPIEUP
+ 0xC479: 0xD6EC, //HANGUL SYLLABLE HIEUH WEO RIEULSIOS
+ 0xC47A: 0xD6ED, //HANGUL SYLLABLE HIEUH WEO RIEULTHIEUTH
+ 0xC481: 0xD6EE, //HANGUL SYLLABLE HIEUH WEO RIEULPHIEUPH
+ 0xC482: 0xD6EF, //HANGUL SYLLABLE HIEUH WEO RIEULHIEUH
+ 0xC483: 0xD6F1, //HANGUL SYLLABLE HIEUH WEO PIEUP
+ 0xC484: 0xD6F2, //HANGUL SYLLABLE HIEUH WEO PIEUPSIOS
+ 0xC485: 0xD6F3, //HANGUL SYLLABLE HIEUH WEO SIOS
+ 0xC486: 0xD6F4, //HANGUL SYLLABLE HIEUH WEO SSANGSIOS
+ 0xC487: 0xD6F6, //HANGUL SYLLABLE HIEUH WEO CIEUC
+ 0xC488: 0xD6F7, //HANGUL SYLLABLE HIEUH WEO CHIEUCH
+ 0xC489: 0xD6F8, //HANGUL SYLLABLE HIEUH WEO KHIEUKH
+ 0xC48A: 0xD6F9, //HANGUL SYLLABLE HIEUH WEO THIEUTH
+ 0xC48B: 0xD6FA, //HANGUL SYLLABLE HIEUH WEO PHIEUPH
+ 0xC48C: 0xD6FB, //HANGUL SYLLABLE HIEUH WEO HIEUH
+ 0xC48D: 0xD6FE, //HANGUL SYLLABLE HIEUH WE SSANGKIYEOK
+ 0xC48E: 0xD6FF, //HANGUL SYLLABLE HIEUH WE KIYEOKSIOS
+ 0xC48F: 0xD701, //HANGUL SYLLABLE HIEUH WE NIEUNCIEUC
+ 0xC490: 0xD702, //HANGUL SYLLABLE HIEUH WE NIEUNHIEUH
+ 0xC491: 0xD703, //HANGUL SYLLABLE HIEUH WE TIKEUT
+ 0xC492: 0xD705, //HANGUL SYLLABLE HIEUH WE RIEULKIYEOK
+ 0xC493: 0xD706, //HANGUL SYLLABLE HIEUH WE RIEULMIEUM
+ 0xC494: 0xD707, //HANGUL SYLLABLE HIEUH WE RIEULPIEUP
+ 0xC495: 0xD708, //HANGUL SYLLABLE HIEUH WE RIEULSIOS
+ 0xC496: 0xD709, //HANGUL SYLLABLE HIEUH WE RIEULTHIEUTH
+ 0xC497: 0xD70A, //HANGUL SYLLABLE HIEUH WE RIEULPHIEUPH
+ 0xC498: 0xD70B, //HANGUL SYLLABLE HIEUH WE RIEULHIEUH
+ 0xC499: 0xD70C, //HANGUL SYLLABLE HIEUH WE MIEUM
+ 0xC49A: 0xD70D, //HANGUL SYLLABLE HIEUH WE PIEUP
+ 0xC49B: 0xD70E, //HANGUL SYLLABLE HIEUH WE PIEUPSIOS
+ 0xC49C: 0xD70F, //HANGUL SYLLABLE HIEUH WE SIOS
+ 0xC49D: 0xD710, //HANGUL SYLLABLE HIEUH WE SSANGSIOS
+ 0xC49E: 0xD712, //HANGUL SYLLABLE HIEUH WE CIEUC
+ 0xC49F: 0xD713, //HANGUL SYLLABLE HIEUH WE CHIEUCH
+ 0xC4A0: 0xD714, //HANGUL SYLLABLE HIEUH WE KHIEUKH
+ 0xC4A1: 0xCE58, //HANGUL SYLLABLE CHIEUCH I
+ 0xC4A2: 0xCE59, //HANGUL SYLLABLE CHIEUCH I KIYEOK
+ 0xC4A3: 0xCE5C, //HANGUL SYLLABLE CHIEUCH I NIEUN
+ 0xC4A4: 0xCE5F, //HANGUL SYLLABLE CHIEUCH I TIKEUT
+ 0xC4A5: 0xCE60, //HANGUL SYLLABLE CHIEUCH I RIEUL
+ 0xC4A6: 0xCE61, //HANGUL SYLLABLE CHIEUCH I RIEULKIYEOK
+ 0xC4A7: 0xCE68, //HANGUL SYLLABLE CHIEUCH I MIEUM
+ 0xC4A8: 0xCE69, //HANGUL SYLLABLE CHIEUCH I PIEUP
+ 0xC4A9: 0xCE6B, //HANGUL SYLLABLE CHIEUCH I SIOS
+ 0xC4AA: 0xCE6D, //HANGUL SYLLABLE CHIEUCH I IEUNG
+ 0xC4AB: 0xCE74, //HANGUL SYLLABLE KHIEUKH A
+ 0xC4AC: 0xCE75, //HANGUL SYLLABLE KHIEUKH A KIYEOK
+ 0xC4AD: 0xCE78, //HANGUL SYLLABLE KHIEUKH A NIEUN
+ 0xC4AE: 0xCE7C, //HANGUL SYLLABLE KHIEUKH A RIEUL
+ 0xC4AF: 0xCE84, //HANGUL SYLLABLE KHIEUKH A MIEUM
+ 0xC4B0: 0xCE85, //HANGUL SYLLABLE KHIEUKH A PIEUP
+ 0xC4B1: 0xCE87, //HANGUL SYLLABLE KHIEUKH A SIOS
+ 0xC4B2: 0xCE89, //HANGUL SYLLABLE KHIEUKH A IEUNG
+ 0xC4B3: 0xCE90, //HANGUL SYLLABLE KHIEUKH AE
+ 0xC4B4: 0xCE91, //HANGUL SYLLABLE KHIEUKH AE KIYEOK
+ 0xC4B5: 0xCE94, //HANGUL SYLLABLE KHIEUKH AE NIEUN
+ 0xC4B6: 0xCE98, //HANGUL SYLLABLE KHIEUKH AE RIEUL
+ 0xC4B7: 0xCEA0, //HANGUL SYLLABLE KHIEUKH AE MIEUM
+ 0xC4B8: 0xCEA1, //HANGUL SYLLABLE KHIEUKH AE PIEUP
+ 0xC4B9: 0xCEA3, //HANGUL SYLLABLE KHIEUKH AE SIOS
+ 0xC4BA: 0xCEA4, //HANGUL SYLLABLE KHIEUKH AE SSANGSIOS
+ 0xC4BB: 0xCEA5, //HANGUL SYLLABLE KHIEUKH AE IEUNG
+ 0xC4BC: 0xCEAC, //HANGUL SYLLABLE KHIEUKH YA
+ 0xC4BD: 0xCEAD, //HANGUL SYLLABLE KHIEUKH YA KIYEOK
+ 0xC4BE: 0xCEC1, //HANGUL SYLLABLE KHIEUKH YA IEUNG
+ 0xC4BF: 0xCEE4, //HANGUL SYLLABLE KHIEUKH EO
+ 0xC4C0: 0xCEE5, //HANGUL SYLLABLE KHIEUKH EO KIYEOK
+ 0xC4C1: 0xCEE8, //HANGUL SYLLABLE KHIEUKH EO NIEUN
+ 0xC4C2: 0xCEEB, //HANGUL SYLLABLE KHIEUKH EO TIKEUT
+ 0xC4C3: 0xCEEC, //HANGUL SYLLABLE KHIEUKH EO RIEUL
+ 0xC4C4: 0xCEF4, //HANGUL SYLLABLE KHIEUKH EO MIEUM
+ 0xC4C5: 0xCEF5, //HANGUL SYLLABLE KHIEUKH EO PIEUP
+ 0xC4C6: 0xCEF7, //HANGUL SYLLABLE KHIEUKH EO SIOS
+ 0xC4C7: 0xCEF8, //HANGUL SYLLABLE KHIEUKH EO SSANGSIOS
+ 0xC4C8: 0xCEF9, //HANGUL SYLLABLE KHIEUKH EO IEUNG
+ 0xC4C9: 0xCF00, //HANGUL SYLLABLE KHIEUKH E
+ 0xC4CA: 0xCF01, //HANGUL SYLLABLE KHIEUKH E KIYEOK
+ 0xC4CB: 0xCF04, //HANGUL SYLLABLE KHIEUKH E NIEUN
+ 0xC4CC: 0xCF08, //HANGUL SYLLABLE KHIEUKH E RIEUL
+ 0xC4CD: 0xCF10, //HANGUL SYLLABLE KHIEUKH E MIEUM
+ 0xC4CE: 0xCF11, //HANGUL SYLLABLE KHIEUKH E PIEUP
+ 0xC4CF: 0xCF13, //HANGUL SYLLABLE KHIEUKH E SIOS
+ 0xC4D0: 0xCF15, //HANGUL SYLLABLE KHIEUKH E IEUNG
+ 0xC4D1: 0xCF1C, //HANGUL SYLLABLE KHIEUKH YEO
+ 0xC4D2: 0xCF20, //HANGUL SYLLABLE KHIEUKH YEO NIEUN
+ 0xC4D3: 0xCF24, //HANGUL SYLLABLE KHIEUKH YEO RIEUL
+ 0xC4D4: 0xCF2C, //HANGUL SYLLABLE KHIEUKH YEO MIEUM
+ 0xC4D5: 0xCF2D, //HANGUL SYLLABLE KHIEUKH YEO PIEUP
+ 0xC4D6: 0xCF2F, //HANGUL SYLLABLE KHIEUKH YEO SIOS
+ 0xC4D7: 0xCF30, //HANGUL SYLLABLE KHIEUKH YEO SSANGSIOS
+ 0xC4D8: 0xCF31, //HANGUL SYLLABLE KHIEUKH YEO IEUNG
+ 0xC4D9: 0xCF38, //HANGUL SYLLABLE KHIEUKH YE
+ 0xC4DA: 0xCF54, //HANGUL SYLLABLE KHIEUKH O
+ 0xC4DB: 0xCF55, //HANGUL SYLLABLE KHIEUKH O KIYEOK
+ 0xC4DC: 0xCF58, //HANGUL SYLLABLE KHIEUKH O NIEUN
+ 0xC4DD: 0xCF5C, //HANGUL SYLLABLE KHIEUKH O RIEUL
+ 0xC4DE: 0xCF64, //HANGUL SYLLABLE KHIEUKH O MIEUM
+ 0xC4DF: 0xCF65, //HANGUL SYLLABLE KHIEUKH O PIEUP
+ 0xC4E0: 0xCF67, //HANGUL SYLLABLE KHIEUKH O SIOS
+ 0xC4E1: 0xCF69, //HANGUL SYLLABLE KHIEUKH O IEUNG
+ 0xC4E2: 0xCF70, //HANGUL SYLLABLE KHIEUKH WA
+ 0xC4E3: 0xCF71, //HANGUL SYLLABLE KHIEUKH WA KIYEOK
+ 0xC4E4: 0xCF74, //HANGUL SYLLABLE KHIEUKH WA NIEUN
+ 0xC4E5: 0xCF78, //HANGUL SYLLABLE KHIEUKH WA RIEUL
+ 0xC4E6: 0xCF80, //HANGUL SYLLABLE KHIEUKH WA MIEUM
+ 0xC4E7: 0xCF85, //HANGUL SYLLABLE KHIEUKH WA IEUNG
+ 0xC4E8: 0xCF8C, //HANGUL SYLLABLE KHIEUKH WAE
+ 0xC4E9: 0xCFA1, //HANGUL SYLLABLE KHIEUKH WAE IEUNG
+ 0xC4EA: 0xCFA8, //HANGUL SYLLABLE KHIEUKH OE
+ 0xC4EB: 0xCFB0, //HANGUL SYLLABLE KHIEUKH OE RIEUL
+ 0xC4EC: 0xCFC4, //HANGUL SYLLABLE KHIEUKH YO
+ 0xC4ED: 0xCFE0, //HANGUL SYLLABLE KHIEUKH U
+ 0xC4EE: 0xCFE1, //HANGUL SYLLABLE KHIEUKH U KIYEOK
+ 0xC4EF: 0xCFE4, //HANGUL SYLLABLE KHIEUKH U NIEUN
+ 0xC4F0: 0xCFE8, //HANGUL SYLLABLE KHIEUKH U RIEUL
+ 0xC4F1: 0xCFF0, //HANGUL SYLLABLE KHIEUKH U MIEUM
+ 0xC4F2: 0xCFF1, //HANGUL SYLLABLE KHIEUKH U PIEUP
+ 0xC4F3: 0xCFF3, //HANGUL SYLLABLE KHIEUKH U SIOS
+ 0xC4F4: 0xCFF5, //HANGUL SYLLABLE KHIEUKH U IEUNG
+ 0xC4F5: 0xCFFC, //HANGUL SYLLABLE KHIEUKH WEO
+ 0xC4F6: 0xD000, //HANGUL SYLLABLE KHIEUKH WEO NIEUN
+ 0xC4F7: 0xD004, //HANGUL SYLLABLE KHIEUKH WEO RIEUL
+ 0xC4F8: 0xD011, //HANGUL SYLLABLE KHIEUKH WEO IEUNG
+ 0xC4F9: 0xD018, //HANGUL SYLLABLE KHIEUKH WE
+ 0xC4FA: 0xD02D, //HANGUL SYLLABLE KHIEUKH WE IEUNG
+ 0xC4FB: 0xD034, //HANGUL SYLLABLE KHIEUKH WI
+ 0xC4FC: 0xD035, //HANGUL SYLLABLE KHIEUKH WI KIYEOK
+ 0xC4FD: 0xD038, //HANGUL SYLLABLE KHIEUKH WI NIEUN
+ 0xC4FE: 0xD03C, //HANGUL SYLLABLE KHIEUKH WI RIEUL
+ 0xC541: 0xD715, //HANGUL SYLLABLE HIEUH WE THIEUTH
+ 0xC542: 0xD716, //HANGUL SYLLABLE HIEUH WE PHIEUPH
+ 0xC543: 0xD717, //HANGUL SYLLABLE HIEUH WE HIEUH
+ 0xC544: 0xD71A, //HANGUL SYLLABLE HIEUH WI SSANGKIYEOK
+ 0xC545: 0xD71B, //HANGUL SYLLABLE HIEUH WI KIYEOKSIOS
+ 0xC546: 0xD71D, //HANGUL SYLLABLE HIEUH WI NIEUNCIEUC
+ 0xC547: 0xD71E, //HANGUL SYLLABLE HIEUH WI NIEUNHIEUH
+ 0xC548: 0xD71F, //HANGUL SYLLABLE HIEUH WI TIKEUT
+ 0xC549: 0xD721, //HANGUL SYLLABLE HIEUH WI RIEULKIYEOK
+ 0xC54A: 0xD722, //HANGUL SYLLABLE HIEUH WI RIEULMIEUM
+ 0xC54B: 0xD723, //HANGUL SYLLABLE HIEUH WI RIEULPIEUP
+ 0xC54C: 0xD724, //HANGUL SYLLABLE HIEUH WI RIEULSIOS
+ 0xC54D: 0xD725, //HANGUL SYLLABLE HIEUH WI RIEULTHIEUTH
+ 0xC54E: 0xD726, //HANGUL SYLLABLE HIEUH WI RIEULPHIEUPH
+ 0xC54F: 0xD727, //HANGUL SYLLABLE HIEUH WI RIEULHIEUH
+ 0xC550: 0xD72A, //HANGUL SYLLABLE HIEUH WI PIEUPSIOS
+ 0xC551: 0xD72C, //HANGUL SYLLABLE HIEUH WI SSANGSIOS
+ 0xC552: 0xD72E, //HANGUL SYLLABLE HIEUH WI CIEUC
+ 0xC553: 0xD72F, //HANGUL SYLLABLE HIEUH WI CHIEUCH
+ 0xC554: 0xD730, //HANGUL SYLLABLE HIEUH WI KHIEUKH
+ 0xC555: 0xD731, //HANGUL SYLLABLE HIEUH WI THIEUTH
+ 0xC556: 0xD732, //HANGUL SYLLABLE HIEUH WI PHIEUPH
+ 0xC557: 0xD733, //HANGUL SYLLABLE HIEUH WI HIEUH
+ 0xC558: 0xD736, //HANGUL SYLLABLE HIEUH YU SSANGKIYEOK
+ 0xC559: 0xD737, //HANGUL SYLLABLE HIEUH YU KIYEOKSIOS
+ 0xC55A: 0xD739, //HANGUL SYLLABLE HIEUH YU NIEUNCIEUC
+ 0xC561: 0xD73A, //HANGUL SYLLABLE HIEUH YU NIEUNHIEUH
+ 0xC562: 0xD73B, //HANGUL SYLLABLE HIEUH YU TIKEUT
+ 0xC563: 0xD73D, //HANGUL SYLLABLE HIEUH YU RIEULKIYEOK
+ 0xC564: 0xD73E, //HANGUL SYLLABLE HIEUH YU RIEULMIEUM
+ 0xC565: 0xD73F, //HANGUL SYLLABLE HIEUH YU RIEULPIEUP
+ 0xC566: 0xD740, //HANGUL SYLLABLE HIEUH YU RIEULSIOS
+ 0xC567: 0xD741, //HANGUL SYLLABLE HIEUH YU RIEULTHIEUTH
+ 0xC568: 0xD742, //HANGUL SYLLABLE HIEUH YU RIEULPHIEUPH
+ 0xC569: 0xD743, //HANGUL SYLLABLE HIEUH YU RIEULHIEUH
+ 0xC56A: 0xD745, //HANGUL SYLLABLE HIEUH YU PIEUP
+ 0xC56B: 0xD746, //HANGUL SYLLABLE HIEUH YU PIEUPSIOS
+ 0xC56C: 0xD748, //HANGUL SYLLABLE HIEUH YU SSANGSIOS
+ 0xC56D: 0xD74A, //HANGUL SYLLABLE HIEUH YU CIEUC
+ 0xC56E: 0xD74B, //HANGUL SYLLABLE HIEUH YU CHIEUCH
+ 0xC56F: 0xD74C, //HANGUL SYLLABLE HIEUH YU KHIEUKH
+ 0xC570: 0xD74D, //HANGUL SYLLABLE HIEUH YU THIEUTH
+ 0xC571: 0xD74E, //HANGUL SYLLABLE HIEUH YU PHIEUPH
+ 0xC572: 0xD74F, //HANGUL SYLLABLE HIEUH YU HIEUH
+ 0xC573: 0xD752, //HANGUL SYLLABLE HIEUH EU SSANGKIYEOK
+ 0xC574: 0xD753, //HANGUL SYLLABLE HIEUH EU KIYEOKSIOS
+ 0xC575: 0xD755, //HANGUL SYLLABLE HIEUH EU NIEUNCIEUC
+ 0xC576: 0xD75A, //HANGUL SYLLABLE HIEUH EU RIEULMIEUM
+ 0xC577: 0xD75B, //HANGUL SYLLABLE HIEUH EU RIEULPIEUP
+ 0xC578: 0xD75C, //HANGUL SYLLABLE HIEUH EU RIEULSIOS
+ 0xC579: 0xD75D, //HANGUL SYLLABLE HIEUH EU RIEULTHIEUTH
+ 0xC57A: 0xD75E, //HANGUL SYLLABLE HIEUH EU RIEULPHIEUPH
+ 0xC581: 0xD75F, //HANGUL SYLLABLE HIEUH EU RIEULHIEUH
+ 0xC582: 0xD762, //HANGUL SYLLABLE HIEUH EU PIEUPSIOS
+ 0xC583: 0xD764, //HANGUL SYLLABLE HIEUH EU SSANGSIOS
+ 0xC584: 0xD766, //HANGUL SYLLABLE HIEUH EU CIEUC
+ 0xC585: 0xD767, //HANGUL SYLLABLE HIEUH EU CHIEUCH
+ 0xC586: 0xD768, //HANGUL SYLLABLE HIEUH EU KHIEUKH
+ 0xC587: 0xD76A, //HANGUL SYLLABLE HIEUH EU PHIEUPH
+ 0xC588: 0xD76B, //HANGUL SYLLABLE HIEUH EU HIEUH
+ 0xC589: 0xD76D, //HANGUL SYLLABLE HIEUH YI KIYEOK
+ 0xC58A: 0xD76E, //HANGUL SYLLABLE HIEUH YI SSANGKIYEOK
+ 0xC58B: 0xD76F, //HANGUL SYLLABLE HIEUH YI KIYEOKSIOS
+ 0xC58C: 0xD771, //HANGUL SYLLABLE HIEUH YI NIEUNCIEUC
+ 0xC58D: 0xD772, //HANGUL SYLLABLE HIEUH YI NIEUNHIEUH
+ 0xC58E: 0xD773, //HANGUL SYLLABLE HIEUH YI TIKEUT
+ 0xC58F: 0xD775, //HANGUL SYLLABLE HIEUH YI RIEULKIYEOK
+ 0xC590: 0xD776, //HANGUL SYLLABLE HIEUH YI RIEULMIEUM
+ 0xC591: 0xD777, //HANGUL SYLLABLE HIEUH YI RIEULPIEUP
+ 0xC592: 0xD778, //HANGUL SYLLABLE HIEUH YI RIEULSIOS
+ 0xC593: 0xD779, //HANGUL SYLLABLE HIEUH YI RIEULTHIEUTH
+ 0xC594: 0xD77A, //HANGUL SYLLABLE HIEUH YI RIEULPHIEUPH
+ 0xC595: 0xD77B, //HANGUL SYLLABLE HIEUH YI RIEULHIEUH
+ 0xC596: 0xD77E, //HANGUL SYLLABLE HIEUH YI PIEUPSIOS
+ 0xC597: 0xD77F, //HANGUL SYLLABLE HIEUH YI SIOS
+ 0xC598: 0xD780, //HANGUL SYLLABLE HIEUH YI SSANGSIOS
+ 0xC599: 0xD782, //HANGUL SYLLABLE HIEUH YI CIEUC
+ 0xC59A: 0xD783, //HANGUL SYLLABLE HIEUH YI CHIEUCH
+ 0xC59B: 0xD784, //HANGUL SYLLABLE HIEUH YI KHIEUKH
+ 0xC59C: 0xD785, //HANGUL SYLLABLE HIEUH YI THIEUTH
+ 0xC59D: 0xD786, //HANGUL SYLLABLE HIEUH YI PHIEUPH
+ 0xC59E: 0xD787, //HANGUL SYLLABLE HIEUH YI HIEUH
+ 0xC59F: 0xD78A, //HANGUL SYLLABLE HIEUH I SSANGKIYEOK
+ 0xC5A0: 0xD78B, //HANGUL SYLLABLE HIEUH I KIYEOKSIOS
+ 0xC5A1: 0xD044, //HANGUL SYLLABLE KHIEUKH WI MIEUM
+ 0xC5A2: 0xD045, //HANGUL SYLLABLE KHIEUKH WI PIEUP
+ 0xC5A3: 0xD047, //HANGUL SYLLABLE KHIEUKH WI SIOS
+ 0xC5A4: 0xD049, //HANGUL SYLLABLE KHIEUKH WI IEUNG
+ 0xC5A5: 0xD050, //HANGUL SYLLABLE KHIEUKH YU
+ 0xC5A6: 0xD054, //HANGUL SYLLABLE KHIEUKH YU NIEUN
+ 0xC5A7: 0xD058, //HANGUL SYLLABLE KHIEUKH YU RIEUL
+ 0xC5A8: 0xD060, //HANGUL SYLLABLE KHIEUKH YU MIEUM
+ 0xC5A9: 0xD06C, //HANGUL SYLLABLE KHIEUKH EU
+ 0xC5AA: 0xD06D, //HANGUL SYLLABLE KHIEUKH EU KIYEOK
+ 0xC5AB: 0xD070, //HANGUL SYLLABLE KHIEUKH EU NIEUN
+ 0xC5AC: 0xD074, //HANGUL SYLLABLE KHIEUKH EU RIEUL
+ 0xC5AD: 0xD07C, //HANGUL SYLLABLE KHIEUKH EU MIEUM
+ 0xC5AE: 0xD07D, //HANGUL SYLLABLE KHIEUKH EU PIEUP
+ 0xC5AF: 0xD081, //HANGUL SYLLABLE KHIEUKH EU IEUNG
+ 0xC5B0: 0xD0A4, //HANGUL SYLLABLE KHIEUKH I
+ 0xC5B1: 0xD0A5, //HANGUL SYLLABLE KHIEUKH I KIYEOK
+ 0xC5B2: 0xD0A8, //HANGUL SYLLABLE KHIEUKH I NIEUN
+ 0xC5B3: 0xD0AC, //HANGUL SYLLABLE KHIEUKH I RIEUL
+ 0xC5B4: 0xD0B4, //HANGUL SYLLABLE KHIEUKH I MIEUM
+ 0xC5B5: 0xD0B5, //HANGUL SYLLABLE KHIEUKH I PIEUP
+ 0xC5B6: 0xD0B7, //HANGUL SYLLABLE KHIEUKH I SIOS
+ 0xC5B7: 0xD0B9, //HANGUL SYLLABLE KHIEUKH I IEUNG
+ 0xC5B8: 0xD0C0, //HANGUL SYLLABLE THIEUTH A
+ 0xC5B9: 0xD0C1, //HANGUL SYLLABLE THIEUTH A KIYEOK
+ 0xC5BA: 0xD0C4, //HANGUL SYLLABLE THIEUTH A NIEUN
+ 0xC5BB: 0xD0C8, //HANGUL SYLLABLE THIEUTH A RIEUL
+ 0xC5BC: 0xD0C9, //HANGUL SYLLABLE THIEUTH A RIEULKIYEOK
+ 0xC5BD: 0xD0D0, //HANGUL SYLLABLE THIEUTH A MIEUM
+ 0xC5BE: 0xD0D1, //HANGUL SYLLABLE THIEUTH A PIEUP
+ 0xC5BF: 0xD0D3, //HANGUL SYLLABLE THIEUTH A SIOS
+ 0xC5C0: 0xD0D4, //HANGUL SYLLABLE THIEUTH A SSANGSIOS
+ 0xC5C1: 0xD0D5, //HANGUL SYLLABLE THIEUTH A IEUNG
+ 0xC5C2: 0xD0DC, //HANGUL SYLLABLE THIEUTH AE
+ 0xC5C3: 0xD0DD, //HANGUL SYLLABLE THIEUTH AE KIYEOK
+ 0xC5C4: 0xD0E0, //HANGUL SYLLABLE THIEUTH AE NIEUN
+ 0xC5C5: 0xD0E4, //HANGUL SYLLABLE THIEUTH AE RIEUL
+ 0xC5C6: 0xD0EC, //HANGUL SYLLABLE THIEUTH AE MIEUM
+ 0xC5C7: 0xD0ED, //HANGUL SYLLABLE THIEUTH AE PIEUP
+ 0xC5C8: 0xD0EF, //HANGUL SYLLABLE THIEUTH AE SIOS
+ 0xC5C9: 0xD0F0, //HANGUL SYLLABLE THIEUTH AE SSANGSIOS
+ 0xC5CA: 0xD0F1, //HANGUL SYLLABLE THIEUTH AE IEUNG
+ 0xC5CB: 0xD0F8, //HANGUL SYLLABLE THIEUTH YA
+ 0xC5CC: 0xD10D, //HANGUL SYLLABLE THIEUTH YA IEUNG
+ 0xC5CD: 0xD130, //HANGUL SYLLABLE THIEUTH EO
+ 0xC5CE: 0xD131, //HANGUL SYLLABLE THIEUTH EO KIYEOK
+ 0xC5CF: 0xD134, //HANGUL SYLLABLE THIEUTH EO NIEUN
+ 0xC5D0: 0xD138, //HANGUL SYLLABLE THIEUTH EO RIEUL
+ 0xC5D1: 0xD13A, //HANGUL SYLLABLE THIEUTH EO RIEULMIEUM
+ 0xC5D2: 0xD140, //HANGUL SYLLABLE THIEUTH EO MIEUM
+ 0xC5D3: 0xD141, //HANGUL SYLLABLE THIEUTH EO PIEUP
+ 0xC5D4: 0xD143, //HANGUL SYLLABLE THIEUTH EO SIOS
+ 0xC5D5: 0xD144, //HANGUL SYLLABLE THIEUTH EO SSANGSIOS
+ 0xC5D6: 0xD145, //HANGUL SYLLABLE THIEUTH EO IEUNG
+ 0xC5D7: 0xD14C, //HANGUL SYLLABLE THIEUTH E
+ 0xC5D8: 0xD14D, //HANGUL SYLLABLE THIEUTH E KIYEOK
+ 0xC5D9: 0xD150, //HANGUL SYLLABLE THIEUTH E NIEUN
+ 0xC5DA: 0xD154, //HANGUL SYLLABLE THIEUTH E RIEUL
+ 0xC5DB: 0xD15C, //HANGUL SYLLABLE THIEUTH E MIEUM
+ 0xC5DC: 0xD15D, //HANGUL SYLLABLE THIEUTH E PIEUP
+ 0xC5DD: 0xD15F, //HANGUL SYLLABLE THIEUTH E SIOS
+ 0xC5DE: 0xD161, //HANGUL SYLLABLE THIEUTH E IEUNG
+ 0xC5DF: 0xD168, //HANGUL SYLLABLE THIEUTH YEO
+ 0xC5E0: 0xD16C, //HANGUL SYLLABLE THIEUTH YEO NIEUN
+ 0xC5E1: 0xD17C, //HANGUL SYLLABLE THIEUTH YEO SSANGSIOS
+ 0xC5E2: 0xD184, //HANGUL SYLLABLE THIEUTH YE
+ 0xC5E3: 0xD188, //HANGUL SYLLABLE THIEUTH YE NIEUN
+ 0xC5E4: 0xD1A0, //HANGUL SYLLABLE THIEUTH O
+ 0xC5E5: 0xD1A1, //HANGUL SYLLABLE THIEUTH O KIYEOK
+ 0xC5E6: 0xD1A4, //HANGUL SYLLABLE THIEUTH O NIEUN
+ 0xC5E7: 0xD1A8, //HANGUL SYLLABLE THIEUTH O RIEUL
+ 0xC5E8: 0xD1B0, //HANGUL SYLLABLE THIEUTH O MIEUM
+ 0xC5E9: 0xD1B1, //HANGUL SYLLABLE THIEUTH O PIEUP
+ 0xC5EA: 0xD1B3, //HANGUL SYLLABLE THIEUTH O SIOS
+ 0xC5EB: 0xD1B5, //HANGUL SYLLABLE THIEUTH O IEUNG
+ 0xC5EC: 0xD1BA, //HANGUL SYLLABLE THIEUTH O PHIEUPH
+ 0xC5ED: 0xD1BC, //HANGUL SYLLABLE THIEUTH WA
+ 0xC5EE: 0xD1C0, //HANGUL SYLLABLE THIEUTH WA NIEUN
+ 0xC5EF: 0xD1D8, //HANGUL SYLLABLE THIEUTH WAE
+ 0xC5F0: 0xD1F4, //HANGUL SYLLABLE THIEUTH OE
+ 0xC5F1: 0xD1F8, //HANGUL SYLLABLE THIEUTH OE NIEUN
+ 0xC5F2: 0xD207, //HANGUL SYLLABLE THIEUTH OE SIOS
+ 0xC5F3: 0xD209, //HANGUL SYLLABLE THIEUTH OE IEUNG
+ 0xC5F4: 0xD210, //HANGUL SYLLABLE THIEUTH YO
+ 0xC5F5: 0xD22C, //HANGUL SYLLABLE THIEUTH U
+ 0xC5F6: 0xD22D, //HANGUL SYLLABLE THIEUTH U KIYEOK
+ 0xC5F7: 0xD230, //HANGUL SYLLABLE THIEUTH U NIEUN
+ 0xC5F8: 0xD234, //HANGUL SYLLABLE THIEUTH U RIEUL
+ 0xC5F9: 0xD23C, //HANGUL SYLLABLE THIEUTH U MIEUM
+ 0xC5FA: 0xD23D, //HANGUL SYLLABLE THIEUTH U PIEUP
+ 0xC5FB: 0xD23F, //HANGUL SYLLABLE THIEUTH U SIOS
+ 0xC5FC: 0xD241, //HANGUL SYLLABLE THIEUTH U IEUNG
+ 0xC5FD: 0xD248, //HANGUL SYLLABLE THIEUTH WEO
+ 0xC5FE: 0xD25C, //HANGUL SYLLABLE THIEUTH WEO SSANGSIOS
+ 0xC641: 0xD78D, //HANGUL SYLLABLE HIEUH I NIEUNCIEUC
+ 0xC642: 0xD78E, //HANGUL SYLLABLE HIEUH I NIEUNHIEUH
+ 0xC643: 0xD78F, //HANGUL SYLLABLE HIEUH I TIKEUT
+ 0xC644: 0xD791, //HANGUL SYLLABLE HIEUH I RIEULKIYEOK
+ 0xC645: 0xD792, //HANGUL SYLLABLE HIEUH I RIEULMIEUM
+ 0xC646: 0xD793, //HANGUL SYLLABLE HIEUH I RIEULPIEUP
+ 0xC647: 0xD794, //HANGUL SYLLABLE HIEUH I RIEULSIOS
+ 0xC648: 0xD795, //HANGUL SYLLABLE HIEUH I RIEULTHIEUTH
+ 0xC649: 0xD796, //HANGUL SYLLABLE HIEUH I RIEULPHIEUPH
+ 0xC64A: 0xD797, //HANGUL SYLLABLE HIEUH I RIEULHIEUH
+ 0xC64B: 0xD79A, //HANGUL SYLLABLE HIEUH I PIEUPSIOS
+ 0xC64C: 0xD79C, //HANGUL SYLLABLE HIEUH I SSANGSIOS
+ 0xC64D: 0xD79E, //HANGUL SYLLABLE HIEUH I CIEUC
+ 0xC64E: 0xD79F, //HANGUL SYLLABLE HIEUH I CHIEUCH
+ 0xC64F: 0xD7A0, //HANGUL SYLLABLE HIEUH I KHIEUKH
+ 0xC650: 0xD7A1, //HANGUL SYLLABLE HIEUH I THIEUTH
+ 0xC651: 0xD7A2, //HANGUL SYLLABLE HIEUH I PHIEUPH
+ 0xC652: 0xD7A3, //HANGUL SYLLABLE HIEUH I HIEUH
+ 0xC6A1: 0xD264, //HANGUL SYLLABLE THIEUTH WE
+ 0xC6A2: 0xD280, //HANGUL SYLLABLE THIEUTH WI
+ 0xC6A3: 0xD281, //HANGUL SYLLABLE THIEUTH WI KIYEOK
+ 0xC6A4: 0xD284, //HANGUL SYLLABLE THIEUTH WI NIEUN
+ 0xC6A5: 0xD288, //HANGUL SYLLABLE THIEUTH WI RIEUL
+ 0xC6A6: 0xD290, //HANGUL SYLLABLE THIEUTH WI MIEUM
+ 0xC6A7: 0xD291, //HANGUL SYLLABLE THIEUTH WI PIEUP
+ 0xC6A8: 0xD295, //HANGUL SYLLABLE THIEUTH WI IEUNG
+ 0xC6A9: 0xD29C, //HANGUL SYLLABLE THIEUTH YU
+ 0xC6AA: 0xD2A0, //HANGUL SYLLABLE THIEUTH YU NIEUN
+ 0xC6AB: 0xD2A4, //HANGUL SYLLABLE THIEUTH YU RIEUL
+ 0xC6AC: 0xD2AC, //HANGUL SYLLABLE THIEUTH YU MIEUM
+ 0xC6AD: 0xD2B1, //HANGUL SYLLABLE THIEUTH YU IEUNG
+ 0xC6AE: 0xD2B8, //HANGUL SYLLABLE THIEUTH EU
+ 0xC6AF: 0xD2B9, //HANGUL SYLLABLE THIEUTH EU KIYEOK
+ 0xC6B0: 0xD2BC, //HANGUL SYLLABLE THIEUTH EU NIEUN
+ 0xC6B1: 0xD2BF, //HANGUL SYLLABLE THIEUTH EU TIKEUT
+ 0xC6B2: 0xD2C0, //HANGUL SYLLABLE THIEUTH EU RIEUL
+ 0xC6B3: 0xD2C2, //HANGUL SYLLABLE THIEUTH EU RIEULMIEUM
+ 0xC6B4: 0xD2C8, //HANGUL SYLLABLE THIEUTH EU MIEUM
+ 0xC6B5: 0xD2C9, //HANGUL SYLLABLE THIEUTH EU PIEUP
+ 0xC6B6: 0xD2CB, //HANGUL SYLLABLE THIEUTH EU SIOS
+ 0xC6B7: 0xD2D4, //HANGUL SYLLABLE THIEUTH YI
+ 0xC6B8: 0xD2D8, //HANGUL SYLLABLE THIEUTH YI NIEUN
+ 0xC6B9: 0xD2DC, //HANGUL SYLLABLE THIEUTH YI RIEUL
+ 0xC6BA: 0xD2E4, //HANGUL SYLLABLE THIEUTH YI MIEUM
+ 0xC6BB: 0xD2E5, //HANGUL SYLLABLE THIEUTH YI PIEUP
+ 0xC6BC: 0xD2F0, //HANGUL SYLLABLE THIEUTH I
+ 0xC6BD: 0xD2F1, //HANGUL SYLLABLE THIEUTH I KIYEOK
+ 0xC6BE: 0xD2F4, //HANGUL SYLLABLE THIEUTH I NIEUN
+ 0xC6BF: 0xD2F8, //HANGUL SYLLABLE THIEUTH I RIEUL
+ 0xC6C0: 0xD300, //HANGUL SYLLABLE THIEUTH I MIEUM
+ 0xC6C1: 0xD301, //HANGUL SYLLABLE THIEUTH I PIEUP
+ 0xC6C2: 0xD303, //HANGUL SYLLABLE THIEUTH I SIOS
+ 0xC6C3: 0xD305, //HANGUL SYLLABLE THIEUTH I IEUNG
+ 0xC6C4: 0xD30C, //HANGUL SYLLABLE PHIEUPH A
+ 0xC6C5: 0xD30D, //HANGUL SYLLABLE PHIEUPH A KIYEOK
+ 0xC6C6: 0xD30E, //HANGUL SYLLABLE PHIEUPH A SSANGKIYEOK
+ 0xC6C7: 0xD310, //HANGUL SYLLABLE PHIEUPH A NIEUN
+ 0xC6C8: 0xD314, //HANGUL SYLLABLE PHIEUPH A RIEUL
+ 0xC6C9: 0xD316, //HANGUL SYLLABLE PHIEUPH A RIEULMIEUM
+ 0xC6CA: 0xD31C, //HANGUL SYLLABLE PHIEUPH A MIEUM
+ 0xC6CB: 0xD31D, //HANGUL SYLLABLE PHIEUPH A PIEUP
+ 0xC6CC: 0xD31F, //HANGUL SYLLABLE PHIEUPH A SIOS
+ 0xC6CD: 0xD320, //HANGUL SYLLABLE PHIEUPH A SSANGSIOS
+ 0xC6CE: 0xD321, //HANGUL SYLLABLE PHIEUPH A IEUNG
+ 0xC6CF: 0xD325, //HANGUL SYLLABLE PHIEUPH A THIEUTH
+ 0xC6D0: 0xD328, //HANGUL SYLLABLE PHIEUPH AE
+ 0xC6D1: 0xD329, //HANGUL SYLLABLE PHIEUPH AE KIYEOK
+ 0xC6D2: 0xD32C, //HANGUL SYLLABLE PHIEUPH AE NIEUN
+ 0xC6D3: 0xD330, //HANGUL SYLLABLE PHIEUPH AE RIEUL
+ 0xC6D4: 0xD338, //HANGUL SYLLABLE PHIEUPH AE MIEUM
+ 0xC6D5: 0xD339, //HANGUL SYLLABLE PHIEUPH AE PIEUP
+ 0xC6D6: 0xD33B, //HANGUL SYLLABLE PHIEUPH AE SIOS
+ 0xC6D7: 0xD33C, //HANGUL SYLLABLE PHIEUPH AE SSANGSIOS
+ 0xC6D8: 0xD33D, //HANGUL SYLLABLE PHIEUPH AE IEUNG
+ 0xC6D9: 0xD344, //HANGUL SYLLABLE PHIEUPH YA
+ 0xC6DA: 0xD345, //HANGUL SYLLABLE PHIEUPH YA KIYEOK
+ 0xC6DB: 0xD37C, //HANGUL SYLLABLE PHIEUPH EO
+ 0xC6DC: 0xD37D, //HANGUL SYLLABLE PHIEUPH EO KIYEOK
+ 0xC6DD: 0xD380, //HANGUL SYLLABLE PHIEUPH EO NIEUN
+ 0xC6DE: 0xD384, //HANGUL SYLLABLE PHIEUPH EO RIEUL
+ 0xC6DF: 0xD38C, //HANGUL SYLLABLE PHIEUPH EO MIEUM
+ 0xC6E0: 0xD38D, //HANGUL SYLLABLE PHIEUPH EO PIEUP
+ 0xC6E1: 0xD38F, //HANGUL SYLLABLE PHIEUPH EO SIOS
+ 0xC6E2: 0xD390, //HANGUL SYLLABLE PHIEUPH EO SSANGSIOS
+ 0xC6E3: 0xD391, //HANGUL SYLLABLE PHIEUPH EO IEUNG
+ 0xC6E4: 0xD398, //HANGUL SYLLABLE PHIEUPH E
+ 0xC6E5: 0xD399, //HANGUL SYLLABLE PHIEUPH E KIYEOK
+ 0xC6E6: 0xD39C, //HANGUL SYLLABLE PHIEUPH E NIEUN
+ 0xC6E7: 0xD3A0, //HANGUL SYLLABLE PHIEUPH E RIEUL
+ 0xC6E8: 0xD3A8, //HANGUL SYLLABLE PHIEUPH E MIEUM
+ 0xC6E9: 0xD3A9, //HANGUL SYLLABLE PHIEUPH E PIEUP
+ 0xC6EA: 0xD3AB, //HANGUL SYLLABLE PHIEUPH E SIOS
+ 0xC6EB: 0xD3AD, //HANGUL SYLLABLE PHIEUPH E IEUNG
+ 0xC6EC: 0xD3B4, //HANGUL SYLLABLE PHIEUPH YEO
+ 0xC6ED: 0xD3B8, //HANGUL SYLLABLE PHIEUPH YEO NIEUN
+ 0xC6EE: 0xD3BC, //HANGUL SYLLABLE PHIEUPH YEO RIEUL
+ 0xC6EF: 0xD3C4, //HANGUL SYLLABLE PHIEUPH YEO MIEUM
+ 0xC6F0: 0xD3C5, //HANGUL SYLLABLE PHIEUPH YEO PIEUP
+ 0xC6F1: 0xD3C8, //HANGUL SYLLABLE PHIEUPH YEO SSANGSIOS
+ 0xC6F2: 0xD3C9, //HANGUL SYLLABLE PHIEUPH YEO IEUNG
+ 0xC6F3: 0xD3D0, //HANGUL SYLLABLE PHIEUPH YE
+ 0xC6F4: 0xD3D8, //HANGUL SYLLABLE PHIEUPH YE RIEUL
+ 0xC6F5: 0xD3E1, //HANGUL SYLLABLE PHIEUPH YE PIEUP
+ 0xC6F6: 0xD3E3, //HANGUL SYLLABLE PHIEUPH YE SIOS
+ 0xC6F7: 0xD3EC, //HANGUL SYLLABLE PHIEUPH O
+ 0xC6F8: 0xD3ED, //HANGUL SYLLABLE PHIEUPH O KIYEOK
+ 0xC6F9: 0xD3F0, //HANGUL SYLLABLE PHIEUPH O NIEUN
+ 0xC6FA: 0xD3F4, //HANGUL SYLLABLE PHIEUPH O RIEUL
+ 0xC6FB: 0xD3FC, //HANGUL SYLLABLE PHIEUPH O MIEUM
+ 0xC6FC: 0xD3FD, //HANGUL SYLLABLE PHIEUPH O PIEUP
+ 0xC6FD: 0xD3FF, //HANGUL SYLLABLE PHIEUPH O SIOS
+ 0xC6FE: 0xD401, //HANGUL SYLLABLE PHIEUPH O IEUNG
+ 0xC7A1: 0xD408, //HANGUL SYLLABLE PHIEUPH WA
+ 0xC7A2: 0xD41D, //HANGUL SYLLABLE PHIEUPH WA IEUNG
+ 0xC7A3: 0xD440, //HANGUL SYLLABLE PHIEUPH OE
+ 0xC7A4: 0xD444, //HANGUL SYLLABLE PHIEUPH OE NIEUN
+ 0xC7A5: 0xD45C, //HANGUL SYLLABLE PHIEUPH YO
+ 0xC7A6: 0xD460, //HANGUL SYLLABLE PHIEUPH YO NIEUN
+ 0xC7A7: 0xD464, //HANGUL SYLLABLE PHIEUPH YO RIEUL
+ 0xC7A8: 0xD46D, //HANGUL SYLLABLE PHIEUPH YO PIEUP
+ 0xC7A9: 0xD46F, //HANGUL SYLLABLE PHIEUPH YO SIOS
+ 0xC7AA: 0xD478, //HANGUL SYLLABLE PHIEUPH U
+ 0xC7AB: 0xD479, //HANGUL SYLLABLE PHIEUPH U KIYEOK
+ 0xC7AC: 0xD47C, //HANGUL SYLLABLE PHIEUPH U NIEUN
+ 0xC7AD: 0xD47F, //HANGUL SYLLABLE PHIEUPH U TIKEUT
+ 0xC7AE: 0xD480, //HANGUL SYLLABLE PHIEUPH U RIEUL
+ 0xC7AF: 0xD482, //HANGUL SYLLABLE PHIEUPH U RIEULMIEUM
+ 0xC7B0: 0xD488, //HANGUL SYLLABLE PHIEUPH U MIEUM
+ 0xC7B1: 0xD489, //HANGUL SYLLABLE PHIEUPH U PIEUP
+ 0xC7B2: 0xD48B, //HANGUL SYLLABLE PHIEUPH U SIOS
+ 0xC7B3: 0xD48D, //HANGUL SYLLABLE PHIEUPH U IEUNG
+ 0xC7B4: 0xD494, //HANGUL SYLLABLE PHIEUPH WEO
+ 0xC7B5: 0xD4A9, //HANGUL SYLLABLE PHIEUPH WEO IEUNG
+ 0xC7B6: 0xD4CC, //HANGUL SYLLABLE PHIEUPH WI
+ 0xC7B7: 0xD4D0, //HANGUL SYLLABLE PHIEUPH WI NIEUN
+ 0xC7B8: 0xD4D4, //HANGUL SYLLABLE PHIEUPH WI RIEUL
+ 0xC7B9: 0xD4DC, //HANGUL SYLLABLE PHIEUPH WI MIEUM
+ 0xC7BA: 0xD4DF, //HANGUL SYLLABLE PHIEUPH WI SIOS
+ 0xC7BB: 0xD4E8, //HANGUL SYLLABLE PHIEUPH YU
+ 0xC7BC: 0xD4EC, //HANGUL SYLLABLE PHIEUPH YU NIEUN
+ 0xC7BD: 0xD4F0, //HANGUL SYLLABLE PHIEUPH YU RIEUL
+ 0xC7BE: 0xD4F8, //HANGUL SYLLABLE PHIEUPH YU MIEUM
+ 0xC7BF: 0xD4FB, //HANGUL SYLLABLE PHIEUPH YU SIOS
+ 0xC7C0: 0xD4FD, //HANGUL SYLLABLE PHIEUPH YU IEUNG
+ 0xC7C1: 0xD504, //HANGUL SYLLABLE PHIEUPH EU
+ 0xC7C2: 0xD508, //HANGUL SYLLABLE PHIEUPH EU NIEUN
+ 0xC7C3: 0xD50C, //HANGUL SYLLABLE PHIEUPH EU RIEUL
+ 0xC7C4: 0xD514, //HANGUL SYLLABLE PHIEUPH EU MIEUM
+ 0xC7C5: 0xD515, //HANGUL SYLLABLE PHIEUPH EU PIEUP
+ 0xC7C6: 0xD517, //HANGUL SYLLABLE PHIEUPH EU SIOS
+ 0xC7C7: 0xD53C, //HANGUL SYLLABLE PHIEUPH I
+ 0xC7C8: 0xD53D, //HANGUL SYLLABLE PHIEUPH I KIYEOK
+ 0xC7C9: 0xD540, //HANGUL SYLLABLE PHIEUPH I NIEUN
+ 0xC7CA: 0xD544, //HANGUL SYLLABLE PHIEUPH I RIEUL
+ 0xC7CB: 0xD54C, //HANGUL SYLLABLE PHIEUPH I MIEUM
+ 0xC7CC: 0xD54D, //HANGUL SYLLABLE PHIEUPH I PIEUP
+ 0xC7CD: 0xD54F, //HANGUL SYLLABLE PHIEUPH I SIOS
+ 0xC7CE: 0xD551, //HANGUL SYLLABLE PHIEUPH I IEUNG
+ 0xC7CF: 0xD558, //HANGUL SYLLABLE HIEUH A
+ 0xC7D0: 0xD559, //HANGUL SYLLABLE HIEUH A KIYEOK
+ 0xC7D1: 0xD55C, //HANGUL SYLLABLE HIEUH A NIEUN
+ 0xC7D2: 0xD560, //HANGUL SYLLABLE HIEUH A RIEUL
+ 0xC7D3: 0xD565, //HANGUL SYLLABLE HIEUH A RIEULTHIEUTH
+ 0xC7D4: 0xD568, //HANGUL SYLLABLE HIEUH A MIEUM
+ 0xC7D5: 0xD569, //HANGUL SYLLABLE HIEUH A PIEUP
+ 0xC7D6: 0xD56B, //HANGUL SYLLABLE HIEUH A SIOS
+ 0xC7D7: 0xD56D, //HANGUL SYLLABLE HIEUH A IEUNG
+ 0xC7D8: 0xD574, //HANGUL SYLLABLE HIEUH AE
+ 0xC7D9: 0xD575, //HANGUL SYLLABLE HIEUH AE KIYEOK
+ 0xC7DA: 0xD578, //HANGUL SYLLABLE HIEUH AE NIEUN
+ 0xC7DB: 0xD57C, //HANGUL SYLLABLE HIEUH AE RIEUL
+ 0xC7DC: 0xD584, //HANGUL SYLLABLE HIEUH AE MIEUM
+ 0xC7DD: 0xD585, //HANGUL SYLLABLE HIEUH AE PIEUP
+ 0xC7DE: 0xD587, //HANGUL SYLLABLE HIEUH AE SIOS
+ 0xC7DF: 0xD588, //HANGUL SYLLABLE HIEUH AE SSANGSIOS
+ 0xC7E0: 0xD589, //HANGUL SYLLABLE HIEUH AE IEUNG
+ 0xC7E1: 0xD590, //HANGUL SYLLABLE HIEUH YA
+ 0xC7E2: 0xD5A5, //HANGUL SYLLABLE HIEUH YA IEUNG
+ 0xC7E3: 0xD5C8, //HANGUL SYLLABLE HIEUH EO
+ 0xC7E4: 0xD5C9, //HANGUL SYLLABLE HIEUH EO KIYEOK
+ 0xC7E5: 0xD5CC, //HANGUL SYLLABLE HIEUH EO NIEUN
+ 0xC7E6: 0xD5D0, //HANGUL SYLLABLE HIEUH EO RIEUL
+ 0xC7E7: 0xD5D2, //HANGUL SYLLABLE HIEUH EO RIEULMIEUM
+ 0xC7E8: 0xD5D8, //HANGUL SYLLABLE HIEUH EO MIEUM
+ 0xC7E9: 0xD5D9, //HANGUL SYLLABLE HIEUH EO PIEUP
+ 0xC7EA: 0xD5DB, //HANGUL SYLLABLE HIEUH EO SIOS
+ 0xC7EB: 0xD5DD, //HANGUL SYLLABLE HIEUH EO IEUNG
+ 0xC7EC: 0xD5E4, //HANGUL SYLLABLE HIEUH E
+ 0xC7ED: 0xD5E5, //HANGUL SYLLABLE HIEUH E KIYEOK
+ 0xC7EE: 0xD5E8, //HANGUL SYLLABLE HIEUH E NIEUN
+ 0xC7EF: 0xD5EC, //HANGUL SYLLABLE HIEUH E RIEUL
+ 0xC7F0: 0xD5F4, //HANGUL SYLLABLE HIEUH E MIEUM
+ 0xC7F1: 0xD5F5, //HANGUL SYLLABLE HIEUH E PIEUP
+ 0xC7F2: 0xD5F7, //HANGUL SYLLABLE HIEUH E SIOS
+ 0xC7F3: 0xD5F9, //HANGUL SYLLABLE HIEUH E IEUNG
+ 0xC7F4: 0xD600, //HANGUL SYLLABLE HIEUH YEO
+ 0xC7F5: 0xD601, //HANGUL SYLLABLE HIEUH YEO KIYEOK
+ 0xC7F6: 0xD604, //HANGUL SYLLABLE HIEUH YEO NIEUN
+ 0xC7F7: 0xD608, //HANGUL SYLLABLE HIEUH YEO RIEUL
+ 0xC7F8: 0xD610, //HANGUL SYLLABLE HIEUH YEO MIEUM
+ 0xC7F9: 0xD611, //HANGUL SYLLABLE HIEUH YEO PIEUP
+ 0xC7FA: 0xD613, //HANGUL SYLLABLE HIEUH YEO SIOS
+ 0xC7FB: 0xD614, //HANGUL SYLLABLE HIEUH YEO SSANGSIOS
+ 0xC7FC: 0xD615, //HANGUL SYLLABLE HIEUH YEO IEUNG
+ 0xC7FD: 0xD61C, //HANGUL SYLLABLE HIEUH YE
+ 0xC7FE: 0xD620, //HANGUL SYLLABLE HIEUH YE NIEUN
+ 0xC8A1: 0xD624, //HANGUL SYLLABLE HIEUH YE RIEUL
+ 0xC8A2: 0xD62D, //HANGUL SYLLABLE HIEUH YE PIEUP
+ 0xC8A3: 0xD638, //HANGUL SYLLABLE HIEUH O
+ 0xC8A4: 0xD639, //HANGUL SYLLABLE HIEUH O KIYEOK
+ 0xC8A5: 0xD63C, //HANGUL SYLLABLE HIEUH O NIEUN
+ 0xC8A6: 0xD640, //HANGUL SYLLABLE HIEUH O RIEUL
+ 0xC8A7: 0xD645, //HANGUL SYLLABLE HIEUH O RIEULTHIEUTH
+ 0xC8A8: 0xD648, //HANGUL SYLLABLE HIEUH O MIEUM
+ 0xC8A9: 0xD649, //HANGUL SYLLABLE HIEUH O PIEUP
+ 0xC8AA: 0xD64B, //HANGUL SYLLABLE HIEUH O SIOS
+ 0xC8AB: 0xD64D, //HANGUL SYLLABLE HIEUH O IEUNG
+ 0xC8AC: 0xD651, //HANGUL SYLLABLE HIEUH O THIEUTH
+ 0xC8AD: 0xD654, //HANGUL SYLLABLE HIEUH WA
+ 0xC8AE: 0xD655, //HANGUL SYLLABLE HIEUH WA KIYEOK
+ 0xC8AF: 0xD658, //HANGUL SYLLABLE HIEUH WA NIEUN
+ 0xC8B0: 0xD65C, //HANGUL SYLLABLE HIEUH WA RIEUL
+ 0xC8B1: 0xD667, //HANGUL SYLLABLE HIEUH WA SIOS
+ 0xC8B2: 0xD669, //HANGUL SYLLABLE HIEUH WA IEUNG
+ 0xC8B3: 0xD670, //HANGUL SYLLABLE HIEUH WAE
+ 0xC8B4: 0xD671, //HANGUL SYLLABLE HIEUH WAE KIYEOK
+ 0xC8B5: 0xD674, //HANGUL SYLLABLE HIEUH WAE NIEUN
+ 0xC8B6: 0xD683, //HANGUL SYLLABLE HIEUH WAE SIOS
+ 0xC8B7: 0xD685, //HANGUL SYLLABLE HIEUH WAE IEUNG
+ 0xC8B8: 0xD68C, //HANGUL SYLLABLE HIEUH OE
+ 0xC8B9: 0xD68D, //HANGUL SYLLABLE HIEUH OE KIYEOK
+ 0xC8BA: 0xD690, //HANGUL SYLLABLE HIEUH OE NIEUN
+ 0xC8BB: 0xD694, //HANGUL SYLLABLE HIEUH OE RIEUL
+ 0xC8BC: 0xD69D, //HANGUL SYLLABLE HIEUH OE PIEUP
+ 0xC8BD: 0xD69F, //HANGUL SYLLABLE HIEUH OE SIOS
+ 0xC8BE: 0xD6A1, //HANGUL SYLLABLE HIEUH OE IEUNG
+ 0xC8BF: 0xD6A8, //HANGUL SYLLABLE HIEUH YO
+ 0xC8C0: 0xD6AC, //HANGUL SYLLABLE HIEUH YO NIEUN
+ 0xC8C1: 0xD6B0, //HANGUL SYLLABLE HIEUH YO RIEUL
+ 0xC8C2: 0xD6B9, //HANGUL SYLLABLE HIEUH YO PIEUP
+ 0xC8C3: 0xD6BB, //HANGUL SYLLABLE HIEUH YO SIOS
+ 0xC8C4: 0xD6C4, //HANGUL SYLLABLE HIEUH U
+ 0xC8C5: 0xD6C5, //HANGUL SYLLABLE HIEUH U KIYEOK
+ 0xC8C6: 0xD6C8, //HANGUL SYLLABLE HIEUH U NIEUN
+ 0xC8C7: 0xD6CC, //HANGUL SYLLABLE HIEUH U RIEUL
+ 0xC8C8: 0xD6D1, //HANGUL SYLLABLE HIEUH U RIEULTHIEUTH
+ 0xC8C9: 0xD6D4, //HANGUL SYLLABLE HIEUH U MIEUM
+ 0xC8CA: 0xD6D7, //HANGUL SYLLABLE HIEUH U SIOS
+ 0xC8CB: 0xD6D9, //HANGUL SYLLABLE HIEUH U IEUNG
+ 0xC8CC: 0xD6E0, //HANGUL SYLLABLE HIEUH WEO
+ 0xC8CD: 0xD6E4, //HANGUL SYLLABLE HIEUH WEO NIEUN
+ 0xC8CE: 0xD6E8, //HANGUL SYLLABLE HIEUH WEO RIEUL
+ 0xC8CF: 0xD6F0, //HANGUL SYLLABLE HIEUH WEO MIEUM
+ 0xC8D0: 0xD6F5, //HANGUL SYLLABLE HIEUH WEO IEUNG
+ 0xC8D1: 0xD6FC, //HANGUL SYLLABLE HIEUH WE
+ 0xC8D2: 0xD6FD, //HANGUL SYLLABLE HIEUH WE KIYEOK
+ 0xC8D3: 0xD700, //HANGUL SYLLABLE HIEUH WE NIEUN
+ 0xC8D4: 0xD704, //HANGUL SYLLABLE HIEUH WE RIEUL
+ 0xC8D5: 0xD711, //HANGUL SYLLABLE HIEUH WE IEUNG
+ 0xC8D6: 0xD718, //HANGUL SYLLABLE HIEUH WI
+ 0xC8D7: 0xD719, //HANGUL SYLLABLE HIEUH WI KIYEOK
+ 0xC8D8: 0xD71C, //HANGUL SYLLABLE HIEUH WI NIEUN
+ 0xC8D9: 0xD720, //HANGUL SYLLABLE HIEUH WI RIEUL
+ 0xC8DA: 0xD728, //HANGUL SYLLABLE HIEUH WI MIEUM
+ 0xC8DB: 0xD729, //HANGUL SYLLABLE HIEUH WI PIEUP
+ 0xC8DC: 0xD72B, //HANGUL SYLLABLE HIEUH WI SIOS
+ 0xC8DD: 0xD72D, //HANGUL SYLLABLE HIEUH WI IEUNG
+ 0xC8DE: 0xD734, //HANGUL SYLLABLE HIEUH YU
+ 0xC8DF: 0xD735, //HANGUL SYLLABLE HIEUH YU KIYEOK
+ 0xC8E0: 0xD738, //HANGUL SYLLABLE HIEUH YU NIEUN
+ 0xC8E1: 0xD73C, //HANGUL SYLLABLE HIEUH YU RIEUL
+ 0xC8E2: 0xD744, //HANGUL SYLLABLE HIEUH YU MIEUM
+ 0xC8E3: 0xD747, //HANGUL SYLLABLE HIEUH YU SIOS
+ 0xC8E4: 0xD749, //HANGUL SYLLABLE HIEUH YU IEUNG
+ 0xC8E5: 0xD750, //HANGUL SYLLABLE HIEUH EU
+ 0xC8E6: 0xD751, //HANGUL SYLLABLE HIEUH EU KIYEOK
+ 0xC8E7: 0xD754, //HANGUL SYLLABLE HIEUH EU NIEUN
+ 0xC8E8: 0xD756, //HANGUL SYLLABLE HIEUH EU NIEUNHIEUH
+ 0xC8E9: 0xD757, //HANGUL SYLLABLE HIEUH EU TIKEUT
+ 0xC8EA: 0xD758, //HANGUL SYLLABLE HIEUH EU RIEUL
+ 0xC8EB: 0xD759, //HANGUL SYLLABLE HIEUH EU RIEULKIYEOK
+ 0xC8EC: 0xD760, //HANGUL SYLLABLE HIEUH EU MIEUM
+ 0xC8ED: 0xD761, //HANGUL SYLLABLE HIEUH EU PIEUP
+ 0xC8EE: 0xD763, //HANGUL SYLLABLE HIEUH EU SIOS
+ 0xC8EF: 0xD765, //HANGUL SYLLABLE HIEUH EU IEUNG
+ 0xC8F0: 0xD769, //HANGUL SYLLABLE HIEUH EU THIEUTH
+ 0xC8F1: 0xD76C, //HANGUL SYLLABLE HIEUH YI
+ 0xC8F2: 0xD770, //HANGUL SYLLABLE HIEUH YI NIEUN
+ 0xC8F3: 0xD774, //HANGUL SYLLABLE HIEUH YI RIEUL
+ 0xC8F4: 0xD77C, //HANGUL SYLLABLE HIEUH YI MIEUM
+ 0xC8F5: 0xD77D, //HANGUL SYLLABLE HIEUH YI PIEUP
+ 0xC8F6: 0xD781, //HANGUL SYLLABLE HIEUH YI IEUNG
+ 0xC8F7: 0xD788, //HANGUL SYLLABLE HIEUH I
+ 0xC8F8: 0xD789, //HANGUL SYLLABLE HIEUH I KIYEOK
+ 0xC8F9: 0xD78C, //HANGUL SYLLABLE HIEUH I NIEUN
+ 0xC8FA: 0xD790, //HANGUL SYLLABLE HIEUH I RIEUL
+ 0xC8FB: 0xD798, //HANGUL SYLLABLE HIEUH I MIEUM
+ 0xC8FC: 0xD799, //HANGUL SYLLABLE HIEUH I PIEUP
+ 0xC8FD: 0xD79B, //HANGUL SYLLABLE HIEUH I SIOS
+ 0xC8FE: 0xD79D, //HANGUL SYLLABLE HIEUH I IEUNG
+ 0xCAA1: 0x4F3D, //CJK UNIFIED IDEOGRAPH
+ 0xCAA2: 0x4F73, //CJK UNIFIED IDEOGRAPH
+ 0xCAA3: 0x5047, //CJK UNIFIED IDEOGRAPH
+ 0xCAA4: 0x50F9, //CJK UNIFIED IDEOGRAPH
+ 0xCAA5: 0x52A0, //CJK UNIFIED IDEOGRAPH
+ 0xCAA6: 0x53EF, //CJK UNIFIED IDEOGRAPH
+ 0xCAA7: 0x5475, //CJK UNIFIED IDEOGRAPH
+ 0xCAA8: 0x54E5, //CJK UNIFIED IDEOGRAPH
+ 0xCAA9: 0x5609, //CJK UNIFIED IDEOGRAPH
+ 0xCAAA: 0x5AC1, //CJK UNIFIED IDEOGRAPH
+ 0xCAAB: 0x5BB6, //CJK UNIFIED IDEOGRAPH
+ 0xCAAC: 0x6687, //CJK UNIFIED IDEOGRAPH
+ 0xCAAD: 0x67B6, //CJK UNIFIED IDEOGRAPH
+ 0xCAAE: 0x67B7, //CJK UNIFIED IDEOGRAPH
+ 0xCAAF: 0x67EF, //CJK UNIFIED IDEOGRAPH
+ 0xCAB0: 0x6B4C, //CJK UNIFIED IDEOGRAPH
+ 0xCAB1: 0x73C2, //CJK UNIFIED IDEOGRAPH
+ 0xCAB2: 0x75C2, //CJK UNIFIED IDEOGRAPH
+ 0xCAB3: 0x7A3C, //CJK UNIFIED IDEOGRAPH
+ 0xCAB4: 0x82DB, //CJK UNIFIED IDEOGRAPH
+ 0xCAB5: 0x8304, //CJK UNIFIED IDEOGRAPH
+ 0xCAB6: 0x8857, //CJK UNIFIED IDEOGRAPH
+ 0xCAB7: 0x8888, //CJK UNIFIED IDEOGRAPH
+ 0xCAB8: 0x8A36, //CJK UNIFIED IDEOGRAPH
+ 0xCAB9: 0x8CC8, //CJK UNIFIED IDEOGRAPH
+ 0xCABA: 0x8DCF, //CJK UNIFIED IDEOGRAPH
+ 0xCABB: 0x8EFB, //CJK UNIFIED IDEOGRAPH
+ 0xCABC: 0x8FE6, //CJK UNIFIED IDEOGRAPH
+ 0xCABD: 0x99D5, //CJK UNIFIED IDEOGRAPH
+ 0xCABE: 0x523B, //CJK UNIFIED IDEOGRAPH
+ 0xCABF: 0x5374, //CJK UNIFIED IDEOGRAPH
+ 0xCAC0: 0x5404, //CJK UNIFIED IDEOGRAPH
+ 0xCAC1: 0x606A, //CJK UNIFIED IDEOGRAPH
+ 0xCAC2: 0x6164, //CJK UNIFIED IDEOGRAPH
+ 0xCAC3: 0x6BBC, //CJK UNIFIED IDEOGRAPH
+ 0xCAC4: 0x73CF, //CJK UNIFIED IDEOGRAPH
+ 0xCAC5: 0x811A, //CJK UNIFIED IDEOGRAPH
+ 0xCAC6: 0x89BA, //CJK UNIFIED IDEOGRAPH
+ 0xCAC7: 0x89D2, //CJK UNIFIED IDEOGRAPH
+ 0xCAC8: 0x95A3, //CJK UNIFIED IDEOGRAPH
+ 0xCAC9: 0x4F83, //CJK UNIFIED IDEOGRAPH
+ 0xCACA: 0x520A, //CJK UNIFIED IDEOGRAPH
+ 0xCACB: 0x58BE, //CJK UNIFIED IDEOGRAPH
+ 0xCACC: 0x5978, //CJK UNIFIED IDEOGRAPH
+ 0xCACD: 0x59E6, //CJK UNIFIED IDEOGRAPH
+ 0xCACE: 0x5E72, //CJK UNIFIED IDEOGRAPH
+ 0xCACF: 0x5E79, //CJK UNIFIED IDEOGRAPH
+ 0xCAD0: 0x61C7, //CJK UNIFIED IDEOGRAPH
+ 0xCAD1: 0x63C0, //CJK UNIFIED IDEOGRAPH
+ 0xCAD2: 0x6746, //CJK UNIFIED IDEOGRAPH
+ 0xCAD3: 0x67EC, //CJK UNIFIED IDEOGRAPH
+ 0xCAD4: 0x687F, //CJK UNIFIED IDEOGRAPH
+ 0xCAD5: 0x6F97, //CJK UNIFIED IDEOGRAPH
+ 0xCAD6: 0x764E, //CJK UNIFIED IDEOGRAPH
+ 0xCAD7: 0x770B, //CJK UNIFIED IDEOGRAPH
+ 0xCAD8: 0x78F5, //CJK UNIFIED IDEOGRAPH
+ 0xCAD9: 0x7A08, //CJK UNIFIED IDEOGRAPH
+ 0xCADA: 0x7AFF, //CJK UNIFIED IDEOGRAPH
+ 0xCADB: 0x7C21, //CJK UNIFIED IDEOGRAPH
+ 0xCADC: 0x809D, //CJK UNIFIED IDEOGRAPH
+ 0xCADD: 0x826E, //CJK UNIFIED IDEOGRAPH
+ 0xCADE: 0x8271, //CJK UNIFIED IDEOGRAPH
+ 0xCADF: 0x8AEB, //CJK UNIFIED IDEOGRAPH
+ 0xCAE0: 0x9593, //CJK UNIFIED IDEOGRAPH
+ 0xCAE1: 0x4E6B, //CJK UNIFIED IDEOGRAPH
+ 0xCAE2: 0x559D, //CJK UNIFIED IDEOGRAPH
+ 0xCAE3: 0x66F7, //CJK UNIFIED IDEOGRAPH
+ 0xCAE4: 0x6E34, //CJK UNIFIED IDEOGRAPH
+ 0xCAE5: 0x78A3, //CJK UNIFIED IDEOGRAPH
+ 0xCAE6: 0x7AED, //CJK UNIFIED IDEOGRAPH
+ 0xCAE7: 0x845B, //CJK UNIFIED IDEOGRAPH
+ 0xCAE8: 0x8910, //CJK UNIFIED IDEOGRAPH
+ 0xCAE9: 0x874E, //CJK UNIFIED IDEOGRAPH
+ 0xCAEA: 0x97A8, //CJK UNIFIED IDEOGRAPH
+ 0xCAEB: 0x52D8, //CJK UNIFIED IDEOGRAPH
+ 0xCAEC: 0x574E, //CJK UNIFIED IDEOGRAPH
+ 0xCAED: 0x582A, //CJK UNIFIED IDEOGRAPH
+ 0xCAEE: 0x5D4C, //CJK UNIFIED IDEOGRAPH
+ 0xCAEF: 0x611F, //CJK UNIFIED IDEOGRAPH
+ 0xCAF0: 0x61BE, //CJK UNIFIED IDEOGRAPH
+ 0xCAF1: 0x6221, //CJK UNIFIED IDEOGRAPH
+ 0xCAF2: 0x6562, //CJK UNIFIED IDEOGRAPH
+ 0xCAF3: 0x67D1, //CJK UNIFIED IDEOGRAPH
+ 0xCAF4: 0x6A44, //CJK UNIFIED IDEOGRAPH
+ 0xCAF5: 0x6E1B, //CJK UNIFIED IDEOGRAPH
+ 0xCAF6: 0x7518, //CJK UNIFIED IDEOGRAPH
+ 0xCAF7: 0x75B3, //CJK UNIFIED IDEOGRAPH
+ 0xCAF8: 0x76E3, //CJK UNIFIED IDEOGRAPH
+ 0xCAF9: 0x77B0, //CJK UNIFIED IDEOGRAPH
+ 0xCAFA: 0x7D3A, //CJK UNIFIED IDEOGRAPH
+ 0xCAFB: 0x90AF, //CJK UNIFIED IDEOGRAPH
+ 0xCAFC: 0x9451, //CJK UNIFIED IDEOGRAPH
+ 0xCAFD: 0x9452, //CJK UNIFIED IDEOGRAPH
+ 0xCAFE: 0x9F95, //CJK UNIFIED IDEOGRAPH
+ 0xCBA1: 0x5323, //CJK UNIFIED IDEOGRAPH
+ 0xCBA2: 0x5CAC, //CJK UNIFIED IDEOGRAPH
+ 0xCBA3: 0x7532, //CJK UNIFIED IDEOGRAPH
+ 0xCBA4: 0x80DB, //CJK UNIFIED IDEOGRAPH
+ 0xCBA5: 0x9240, //CJK UNIFIED IDEOGRAPH
+ 0xCBA6: 0x9598, //CJK UNIFIED IDEOGRAPH
+ 0xCBA7: 0x525B, //CJK UNIFIED IDEOGRAPH
+ 0xCBA8: 0x5808, //CJK UNIFIED IDEOGRAPH
+ 0xCBA9: 0x59DC, //CJK UNIFIED IDEOGRAPH
+ 0xCBAA: 0x5CA1, //CJK UNIFIED IDEOGRAPH
+ 0xCBAB: 0x5D17, //CJK UNIFIED IDEOGRAPH
+ 0xCBAC: 0x5EB7, //CJK UNIFIED IDEOGRAPH
+ 0xCBAD: 0x5F3A, //CJK UNIFIED IDEOGRAPH
+ 0xCBAE: 0x5F4A, //CJK UNIFIED IDEOGRAPH
+ 0xCBAF: 0x6177, //CJK UNIFIED IDEOGRAPH
+ 0xCBB0: 0x6C5F, //CJK UNIFIED IDEOGRAPH
+ 0xCBB1: 0x757A, //CJK UNIFIED IDEOGRAPH
+ 0xCBB2: 0x7586, //CJK UNIFIED IDEOGRAPH
+ 0xCBB3: 0x7CE0, //CJK UNIFIED IDEOGRAPH
+ 0xCBB4: 0x7D73, //CJK UNIFIED IDEOGRAPH
+ 0xCBB5: 0x7DB1, //CJK UNIFIED IDEOGRAPH
+ 0xCBB6: 0x7F8C, //CJK UNIFIED IDEOGRAPH
+ 0xCBB7: 0x8154, //CJK UNIFIED IDEOGRAPH
+ 0xCBB8: 0x8221, //CJK UNIFIED IDEOGRAPH
+ 0xCBB9: 0x8591, //CJK UNIFIED IDEOGRAPH
+ 0xCBBA: 0x8941, //CJK UNIFIED IDEOGRAPH
+ 0xCBBB: 0x8B1B, //CJK UNIFIED IDEOGRAPH
+ 0xCBBC: 0x92FC, //CJK UNIFIED IDEOGRAPH
+ 0xCBBD: 0x964D, //CJK UNIFIED IDEOGRAPH
+ 0xCBBE: 0x9C47, //CJK UNIFIED IDEOGRAPH
+ 0xCBBF: 0x4ECB, //CJK UNIFIED IDEOGRAPH
+ 0xCBC0: 0x4EF7, //CJK UNIFIED IDEOGRAPH
+ 0xCBC1: 0x500B, //CJK UNIFIED IDEOGRAPH
+ 0xCBC2: 0x51F1, //CJK UNIFIED IDEOGRAPH
+ 0xCBC3: 0x584F, //CJK UNIFIED IDEOGRAPH
+ 0xCBC4: 0x6137, //CJK UNIFIED IDEOGRAPH
+ 0xCBC5: 0x613E, //CJK UNIFIED IDEOGRAPH
+ 0xCBC6: 0x6168, //CJK UNIFIED IDEOGRAPH
+ 0xCBC7: 0x6539, //CJK UNIFIED IDEOGRAPH
+ 0xCBC8: 0x69EA, //CJK UNIFIED IDEOGRAPH
+ 0xCBC9: 0x6F11, //CJK UNIFIED IDEOGRAPH
+ 0xCBCA: 0x75A5, //CJK UNIFIED IDEOGRAPH
+ 0xCBCB: 0x7686, //CJK UNIFIED IDEOGRAPH
+ 0xCBCC: 0x76D6, //CJK UNIFIED IDEOGRAPH
+ 0xCBCD: 0x7B87, //CJK UNIFIED IDEOGRAPH
+ 0xCBCE: 0x82A5, //CJK UNIFIED IDEOGRAPH
+ 0xCBCF: 0x84CB, //CJK UNIFIED IDEOGRAPH
+ 0xCBD0: 0xF900, //CJK COMPATIBILITY IDEOGRAPH
+ 0xCBD1: 0x93A7, //CJK UNIFIED IDEOGRAPH
+ 0xCBD2: 0x958B, //CJK UNIFIED IDEOGRAPH
+ 0xCBD3: 0x5580, //CJK UNIFIED IDEOGRAPH
+ 0xCBD4: 0x5BA2, //CJK UNIFIED IDEOGRAPH
+ 0xCBD5: 0x5751, //CJK UNIFIED IDEOGRAPH
+ 0xCBD6: 0xF901, //CJK COMPATIBILITY IDEOGRAPH
+ 0xCBD7: 0x7CB3, //CJK UNIFIED IDEOGRAPH
+ 0xCBD8: 0x7FB9, //CJK UNIFIED IDEOGRAPH
+ 0xCBD9: 0x91B5, //CJK UNIFIED IDEOGRAPH
+ 0xCBDA: 0x5028, //CJK UNIFIED IDEOGRAPH
+ 0xCBDB: 0x53BB, //CJK UNIFIED IDEOGRAPH
+ 0xCBDC: 0x5C45, //CJK UNIFIED IDEOGRAPH
+ 0xCBDD: 0x5DE8, //CJK UNIFIED IDEOGRAPH
+ 0xCBDE: 0x62D2, //CJK UNIFIED IDEOGRAPH
+ 0xCBDF: 0x636E, //CJK UNIFIED IDEOGRAPH
+ 0xCBE0: 0x64DA, //CJK UNIFIED IDEOGRAPH
+ 0xCBE1: 0x64E7, //CJK UNIFIED IDEOGRAPH
+ 0xCBE2: 0x6E20, //CJK UNIFIED IDEOGRAPH
+ 0xCBE3: 0x70AC, //CJK UNIFIED IDEOGRAPH
+ 0xCBE4: 0x795B, //CJK UNIFIED IDEOGRAPH
+ 0xCBE5: 0x8DDD, //CJK UNIFIED IDEOGRAPH
+ 0xCBE6: 0x8E1E, //CJK UNIFIED IDEOGRAPH
+ 0xCBE7: 0xF902, //CJK COMPATIBILITY IDEOGRAPH
+ 0xCBE8: 0x907D, //CJK UNIFIED IDEOGRAPH
+ 0xCBE9: 0x9245, //CJK UNIFIED IDEOGRAPH
+ 0xCBEA: 0x92F8, //CJK UNIFIED IDEOGRAPH
+ 0xCBEB: 0x4E7E, //CJK UNIFIED IDEOGRAPH
+ 0xCBEC: 0x4EF6, //CJK UNIFIED IDEOGRAPH
+ 0xCBED: 0x5065, //CJK UNIFIED IDEOGRAPH
+ 0xCBEE: 0x5DFE, //CJK UNIFIED IDEOGRAPH
+ 0xCBEF: 0x5EFA, //CJK UNIFIED IDEOGRAPH
+ 0xCBF0: 0x6106, //CJK UNIFIED IDEOGRAPH
+ 0xCBF1: 0x6957, //CJK UNIFIED IDEOGRAPH
+ 0xCBF2: 0x8171, //CJK UNIFIED IDEOGRAPH
+ 0xCBF3: 0x8654, //CJK UNIFIED IDEOGRAPH
+ 0xCBF4: 0x8E47, //CJK UNIFIED IDEOGRAPH
+ 0xCBF5: 0x9375, //CJK UNIFIED IDEOGRAPH
+ 0xCBF6: 0x9A2B, //CJK UNIFIED IDEOGRAPH
+ 0xCBF7: 0x4E5E, //CJK UNIFIED IDEOGRAPH
+ 0xCBF8: 0x5091, //CJK UNIFIED IDEOGRAPH
+ 0xCBF9: 0x6770, //CJK UNIFIED IDEOGRAPH
+ 0xCBFA: 0x6840, //CJK UNIFIED IDEOGRAPH
+ 0xCBFB: 0x5109, //CJK UNIFIED IDEOGRAPH
+ 0xCBFC: 0x528D, //CJK UNIFIED IDEOGRAPH
+ 0xCBFD: 0x5292, //CJK UNIFIED IDEOGRAPH
+ 0xCBFE: 0x6AA2, //CJK UNIFIED IDEOGRAPH
+ 0xCCA1: 0x77BC, //CJK UNIFIED IDEOGRAPH
+ 0xCCA2: 0x9210, //CJK UNIFIED IDEOGRAPH
+ 0xCCA3: 0x9ED4, //CJK UNIFIED IDEOGRAPH
+ 0xCCA4: 0x52AB, //CJK UNIFIED IDEOGRAPH
+ 0xCCA5: 0x602F, //CJK UNIFIED IDEOGRAPH
+ 0xCCA6: 0x8FF2, //CJK UNIFIED IDEOGRAPH
+ 0xCCA7: 0x5048, //CJK UNIFIED IDEOGRAPH
+ 0xCCA8: 0x61A9, //CJK UNIFIED IDEOGRAPH
+ 0xCCA9: 0x63ED, //CJK UNIFIED IDEOGRAPH
+ 0xCCAA: 0x64CA, //CJK UNIFIED IDEOGRAPH
+ 0xCCAB: 0x683C, //CJK UNIFIED IDEOGRAPH
+ 0xCCAC: 0x6A84, //CJK UNIFIED IDEOGRAPH
+ 0xCCAD: 0x6FC0, //CJK UNIFIED IDEOGRAPH
+ 0xCCAE: 0x8188, //CJK UNIFIED IDEOGRAPH
+ 0xCCAF: 0x89A1, //CJK UNIFIED IDEOGRAPH
+ 0xCCB0: 0x9694, //CJK UNIFIED IDEOGRAPH
+ 0xCCB1: 0x5805, //CJK UNIFIED IDEOGRAPH
+ 0xCCB2: 0x727D, //CJK UNIFIED IDEOGRAPH
+ 0xCCB3: 0x72AC, //CJK UNIFIED IDEOGRAPH
+ 0xCCB4: 0x7504, //CJK UNIFIED IDEOGRAPH
+ 0xCCB5: 0x7D79, //CJK UNIFIED IDEOGRAPH
+ 0xCCB6: 0x7E6D, //CJK UNIFIED IDEOGRAPH
+ 0xCCB7: 0x80A9, //CJK UNIFIED IDEOGRAPH
+ 0xCCB8: 0x898B, //CJK UNIFIED IDEOGRAPH
+ 0xCCB9: 0x8B74, //CJK UNIFIED IDEOGRAPH
+ 0xCCBA: 0x9063, //CJK UNIFIED IDEOGRAPH
+ 0xCCBB: 0x9D51, //CJK UNIFIED IDEOGRAPH
+ 0xCCBC: 0x6289, //CJK UNIFIED IDEOGRAPH
+ 0xCCBD: 0x6C7A, //CJK UNIFIED IDEOGRAPH
+ 0xCCBE: 0x6F54, //CJK UNIFIED IDEOGRAPH
+ 0xCCBF: 0x7D50, //CJK UNIFIED IDEOGRAPH
+ 0xCCC0: 0x7F3A, //CJK UNIFIED IDEOGRAPH
+ 0xCCC1: 0x8A23, //CJK UNIFIED IDEOGRAPH
+ 0xCCC2: 0x517C, //CJK UNIFIED IDEOGRAPH
+ 0xCCC3: 0x614A, //CJK UNIFIED IDEOGRAPH
+ 0xCCC4: 0x7B9D, //CJK UNIFIED IDEOGRAPH
+ 0xCCC5: 0x8B19, //CJK UNIFIED IDEOGRAPH
+ 0xCCC6: 0x9257, //CJK UNIFIED IDEOGRAPH
+ 0xCCC7: 0x938C, //CJK UNIFIED IDEOGRAPH
+ 0xCCC8: 0x4EAC, //CJK UNIFIED IDEOGRAPH
+ 0xCCC9: 0x4FD3, //CJK UNIFIED IDEOGRAPH
+ 0xCCCA: 0x501E, //CJK UNIFIED IDEOGRAPH
+ 0xCCCB: 0x50BE, //CJK UNIFIED IDEOGRAPH
+ 0xCCCC: 0x5106, //CJK UNIFIED IDEOGRAPH
+ 0xCCCD: 0x52C1, //CJK UNIFIED IDEOGRAPH
+ 0xCCCE: 0x52CD, //CJK UNIFIED IDEOGRAPH
+ 0xCCCF: 0x537F, //CJK UNIFIED IDEOGRAPH
+ 0xCCD0: 0x5770, //CJK UNIFIED IDEOGRAPH
+ 0xCCD1: 0x5883, //CJK UNIFIED IDEOGRAPH
+ 0xCCD2: 0x5E9A, //CJK UNIFIED IDEOGRAPH
+ 0xCCD3: 0x5F91, //CJK UNIFIED IDEOGRAPH
+ 0xCCD4: 0x6176, //CJK UNIFIED IDEOGRAPH
+ 0xCCD5: 0x61AC, //CJK UNIFIED IDEOGRAPH
+ 0xCCD6: 0x64CE, //CJK UNIFIED IDEOGRAPH
+ 0xCCD7: 0x656C, //CJK UNIFIED IDEOGRAPH
+ 0xCCD8: 0x666F, //CJK UNIFIED IDEOGRAPH
+ 0xCCD9: 0x66BB, //CJK UNIFIED IDEOGRAPH
+ 0xCCDA: 0x66F4, //CJK UNIFIED IDEOGRAPH
+ 0xCCDB: 0x6897, //CJK UNIFIED IDEOGRAPH
+ 0xCCDC: 0x6D87, //CJK UNIFIED IDEOGRAPH
+ 0xCCDD: 0x7085, //CJK UNIFIED IDEOGRAPH
+ 0xCCDE: 0x70F1, //CJK UNIFIED IDEOGRAPH
+ 0xCCDF: 0x749F, //CJK UNIFIED IDEOGRAPH
+ 0xCCE0: 0x74A5, //CJK UNIFIED IDEOGRAPH
+ 0xCCE1: 0x74CA, //CJK UNIFIED IDEOGRAPH
+ 0xCCE2: 0x75D9, //CJK UNIFIED IDEOGRAPH
+ 0xCCE3: 0x786C, //CJK UNIFIED IDEOGRAPH
+ 0xCCE4: 0x78EC, //CJK UNIFIED IDEOGRAPH
+ 0xCCE5: 0x7ADF, //CJK UNIFIED IDEOGRAPH
+ 0xCCE6: 0x7AF6, //CJK UNIFIED IDEOGRAPH
+ 0xCCE7: 0x7D45, //CJK UNIFIED IDEOGRAPH
+ 0xCCE8: 0x7D93, //CJK UNIFIED IDEOGRAPH
+ 0xCCE9: 0x8015, //CJK UNIFIED IDEOGRAPH
+ 0xCCEA: 0x803F, //CJK UNIFIED IDEOGRAPH
+ 0xCCEB: 0x811B, //CJK UNIFIED IDEOGRAPH
+ 0xCCEC: 0x8396, //CJK UNIFIED IDEOGRAPH
+ 0xCCED: 0x8B66, //CJK UNIFIED IDEOGRAPH
+ 0xCCEE: 0x8F15, //CJK UNIFIED IDEOGRAPH
+ 0xCCEF: 0x9015, //CJK UNIFIED IDEOGRAPH
+ 0xCCF0: 0x93E1, //CJK UNIFIED IDEOGRAPH
+ 0xCCF1: 0x9803, //CJK UNIFIED IDEOGRAPH
+ 0xCCF2: 0x9838, //CJK UNIFIED IDEOGRAPH
+ 0xCCF3: 0x9A5A, //CJK UNIFIED IDEOGRAPH
+ 0xCCF4: 0x9BE8, //CJK UNIFIED IDEOGRAPH
+ 0xCCF5: 0x4FC2, //CJK UNIFIED IDEOGRAPH
+ 0xCCF6: 0x5553, //CJK UNIFIED IDEOGRAPH
+ 0xCCF7: 0x583A, //CJK UNIFIED IDEOGRAPH
+ 0xCCF8: 0x5951, //CJK UNIFIED IDEOGRAPH
+ 0xCCF9: 0x5B63, //CJK UNIFIED IDEOGRAPH
+ 0xCCFA: 0x5C46, //CJK UNIFIED IDEOGRAPH
+ 0xCCFB: 0x60B8, //CJK UNIFIED IDEOGRAPH
+ 0xCCFC: 0x6212, //CJK UNIFIED IDEOGRAPH
+ 0xCCFD: 0x6842, //CJK UNIFIED IDEOGRAPH
+ 0xCCFE: 0x68B0, //CJK UNIFIED IDEOGRAPH
+ 0xCDA1: 0x68E8, //CJK UNIFIED IDEOGRAPH
+ 0xCDA2: 0x6EAA, //CJK UNIFIED IDEOGRAPH
+ 0xCDA3: 0x754C, //CJK UNIFIED IDEOGRAPH
+ 0xCDA4: 0x7678, //CJK UNIFIED IDEOGRAPH
+ 0xCDA5: 0x78CE, //CJK UNIFIED IDEOGRAPH
+ 0xCDA6: 0x7A3D, //CJK UNIFIED IDEOGRAPH
+ 0xCDA7: 0x7CFB, //CJK UNIFIED IDEOGRAPH
+ 0xCDA8: 0x7E6B, //CJK UNIFIED IDEOGRAPH
+ 0xCDA9: 0x7E7C, //CJK UNIFIED IDEOGRAPH
+ 0xCDAA: 0x8A08, //CJK UNIFIED IDEOGRAPH
+ 0xCDAB: 0x8AA1, //CJK UNIFIED IDEOGRAPH
+ 0xCDAC: 0x8C3F, //CJK UNIFIED IDEOGRAPH
+ 0xCDAD: 0x968E, //CJK UNIFIED IDEOGRAPH
+ 0xCDAE: 0x9DC4, //CJK UNIFIED IDEOGRAPH
+ 0xCDAF: 0x53E4, //CJK UNIFIED IDEOGRAPH
+ 0xCDB0: 0x53E9, //CJK UNIFIED IDEOGRAPH
+ 0xCDB1: 0x544A, //CJK UNIFIED IDEOGRAPH
+ 0xCDB2: 0x5471, //CJK UNIFIED IDEOGRAPH
+ 0xCDB3: 0x56FA, //CJK UNIFIED IDEOGRAPH
+ 0xCDB4: 0x59D1, //CJK UNIFIED IDEOGRAPH
+ 0xCDB5: 0x5B64, //CJK UNIFIED IDEOGRAPH
+ 0xCDB6: 0x5C3B, //CJK UNIFIED IDEOGRAPH
+ 0xCDB7: 0x5EAB, //CJK UNIFIED IDEOGRAPH
+ 0xCDB8: 0x62F7, //CJK UNIFIED IDEOGRAPH
+ 0xCDB9: 0x6537, //CJK UNIFIED IDEOGRAPH
+ 0xCDBA: 0x6545, //CJK UNIFIED IDEOGRAPH
+ 0xCDBB: 0x6572, //CJK UNIFIED IDEOGRAPH
+ 0xCDBC: 0x66A0, //CJK UNIFIED IDEOGRAPH
+ 0xCDBD: 0x67AF, //CJK UNIFIED IDEOGRAPH
+ 0xCDBE: 0x69C1, //CJK UNIFIED IDEOGRAPH
+ 0xCDBF: 0x6CBD, //CJK UNIFIED IDEOGRAPH
+ 0xCDC0: 0x75FC, //CJK UNIFIED IDEOGRAPH
+ 0xCDC1: 0x7690, //CJK UNIFIED IDEOGRAPH
+ 0xCDC2: 0x777E, //CJK UNIFIED IDEOGRAPH
+ 0xCDC3: 0x7A3F, //CJK UNIFIED IDEOGRAPH
+ 0xCDC4: 0x7F94, //CJK UNIFIED IDEOGRAPH
+ 0xCDC5: 0x8003, //CJK UNIFIED IDEOGRAPH
+ 0xCDC6: 0x80A1, //CJK UNIFIED IDEOGRAPH
+ 0xCDC7: 0x818F, //CJK UNIFIED IDEOGRAPH
+ 0xCDC8: 0x82E6, //CJK UNIFIED IDEOGRAPH
+ 0xCDC9: 0x82FD, //CJK UNIFIED IDEOGRAPH
+ 0xCDCA: 0x83F0, //CJK UNIFIED IDEOGRAPH
+ 0xCDCB: 0x85C1, //CJK UNIFIED IDEOGRAPH
+ 0xCDCC: 0x8831, //CJK UNIFIED IDEOGRAPH
+ 0xCDCD: 0x88B4, //CJK UNIFIED IDEOGRAPH
+ 0xCDCE: 0x8AA5, //CJK UNIFIED IDEOGRAPH
+ 0xCDCF: 0xF903, //CJK COMPATIBILITY IDEOGRAPH
+ 0xCDD0: 0x8F9C, //CJK UNIFIED IDEOGRAPH
+ 0xCDD1: 0x932E, //CJK UNIFIED IDEOGRAPH
+ 0xCDD2: 0x96C7, //CJK UNIFIED IDEOGRAPH
+ 0xCDD3: 0x9867, //CJK UNIFIED IDEOGRAPH
+ 0xCDD4: 0x9AD8, //CJK UNIFIED IDEOGRAPH
+ 0xCDD5: 0x9F13, //CJK UNIFIED IDEOGRAPH
+ 0xCDD6: 0x54ED, //CJK UNIFIED IDEOGRAPH
+ 0xCDD7: 0x659B, //CJK UNIFIED IDEOGRAPH
+ 0xCDD8: 0x66F2, //CJK UNIFIED IDEOGRAPH
+ 0xCDD9: 0x688F, //CJK UNIFIED IDEOGRAPH
+ 0xCDDA: 0x7A40, //CJK UNIFIED IDEOGRAPH
+ 0xCDDB: 0x8C37, //CJK UNIFIED IDEOGRAPH
+ 0xCDDC: 0x9D60, //CJK UNIFIED IDEOGRAPH
+ 0xCDDD: 0x56F0, //CJK UNIFIED IDEOGRAPH
+ 0xCDDE: 0x5764, //CJK UNIFIED IDEOGRAPH
+ 0xCDDF: 0x5D11, //CJK UNIFIED IDEOGRAPH
+ 0xCDE0: 0x6606, //CJK UNIFIED IDEOGRAPH
+ 0xCDE1: 0x68B1, //CJK UNIFIED IDEOGRAPH
+ 0xCDE2: 0x68CD, //CJK UNIFIED IDEOGRAPH
+ 0xCDE3: 0x6EFE, //CJK UNIFIED IDEOGRAPH
+ 0xCDE4: 0x7428, //CJK UNIFIED IDEOGRAPH
+ 0xCDE5: 0x889E, //CJK UNIFIED IDEOGRAPH
+ 0xCDE6: 0x9BE4, //CJK UNIFIED IDEOGRAPH
+ 0xCDE7: 0x6C68, //CJK UNIFIED IDEOGRAPH
+ 0xCDE8: 0xF904, //CJK COMPATIBILITY IDEOGRAPH
+ 0xCDE9: 0x9AA8, //CJK UNIFIED IDEOGRAPH
+ 0xCDEA: 0x4F9B, //CJK UNIFIED IDEOGRAPH
+ 0xCDEB: 0x516C, //CJK UNIFIED IDEOGRAPH
+ 0xCDEC: 0x5171, //CJK UNIFIED IDEOGRAPH
+ 0xCDED: 0x529F, //CJK UNIFIED IDEOGRAPH
+ 0xCDEE: 0x5B54, //CJK UNIFIED IDEOGRAPH
+ 0xCDEF: 0x5DE5, //CJK UNIFIED IDEOGRAPH
+ 0xCDF0: 0x6050, //CJK UNIFIED IDEOGRAPH
+ 0xCDF1: 0x606D, //CJK UNIFIED IDEOGRAPH
+ 0xCDF2: 0x62F1, //CJK UNIFIED IDEOGRAPH
+ 0xCDF3: 0x63A7, //CJK UNIFIED IDEOGRAPH
+ 0xCDF4: 0x653B, //CJK UNIFIED IDEOGRAPH
+ 0xCDF5: 0x73D9, //CJK UNIFIED IDEOGRAPH
+ 0xCDF6: 0x7A7A, //CJK UNIFIED IDEOGRAPH
+ 0xCDF7: 0x86A3, //CJK UNIFIED IDEOGRAPH
+ 0xCDF8: 0x8CA2, //CJK UNIFIED IDEOGRAPH
+ 0xCDF9: 0x978F, //CJK UNIFIED IDEOGRAPH
+ 0xCDFA: 0x4E32, //CJK UNIFIED IDEOGRAPH
+ 0xCDFB: 0x5BE1, //CJK UNIFIED IDEOGRAPH
+ 0xCDFC: 0x6208, //CJK UNIFIED IDEOGRAPH
+ 0xCDFD: 0x679C, //CJK UNIFIED IDEOGRAPH
+ 0xCDFE: 0x74DC, //CJK UNIFIED IDEOGRAPH
+ 0xCEA1: 0x79D1, //CJK UNIFIED IDEOGRAPH
+ 0xCEA2: 0x83D3, //CJK UNIFIED IDEOGRAPH
+ 0xCEA3: 0x8A87, //CJK UNIFIED IDEOGRAPH
+ 0xCEA4: 0x8AB2, //CJK UNIFIED IDEOGRAPH
+ 0xCEA5: 0x8DE8, //CJK UNIFIED IDEOGRAPH
+ 0xCEA6: 0x904E, //CJK UNIFIED IDEOGRAPH
+ 0xCEA7: 0x934B, //CJK UNIFIED IDEOGRAPH
+ 0xCEA8: 0x9846, //CJK UNIFIED IDEOGRAPH
+ 0xCEA9: 0x5ED3, //CJK UNIFIED IDEOGRAPH
+ 0xCEAA: 0x69E8, //CJK UNIFIED IDEOGRAPH
+ 0xCEAB: 0x85FF, //CJK UNIFIED IDEOGRAPH
+ 0xCEAC: 0x90ED, //CJK UNIFIED IDEOGRAPH
+ 0xCEAD: 0xF905, //CJK COMPATIBILITY IDEOGRAPH
+ 0xCEAE: 0x51A0, //CJK UNIFIED IDEOGRAPH
+ 0xCEAF: 0x5B98, //CJK UNIFIED IDEOGRAPH
+ 0xCEB0: 0x5BEC, //CJK UNIFIED IDEOGRAPH
+ 0xCEB1: 0x6163, //CJK UNIFIED IDEOGRAPH
+ 0xCEB2: 0x68FA, //CJK UNIFIED IDEOGRAPH
+ 0xCEB3: 0x6B3E, //CJK UNIFIED IDEOGRAPH
+ 0xCEB4: 0x704C, //CJK UNIFIED IDEOGRAPH
+ 0xCEB5: 0x742F, //CJK UNIFIED IDEOGRAPH
+ 0xCEB6: 0x74D8, //CJK UNIFIED IDEOGRAPH
+ 0xCEB7: 0x7BA1, //CJK UNIFIED IDEOGRAPH
+ 0xCEB8: 0x7F50, //CJK UNIFIED IDEOGRAPH
+ 0xCEB9: 0x83C5, //CJK UNIFIED IDEOGRAPH
+ 0xCEBA: 0x89C0, //CJK UNIFIED IDEOGRAPH
+ 0xCEBB: 0x8CAB, //CJK UNIFIED IDEOGRAPH
+ 0xCEBC: 0x95DC, //CJK UNIFIED IDEOGRAPH
+ 0xCEBD: 0x9928, //CJK UNIFIED IDEOGRAPH
+ 0xCEBE: 0x522E, //CJK UNIFIED IDEOGRAPH
+ 0xCEBF: 0x605D, //CJK UNIFIED IDEOGRAPH
+ 0xCEC0: 0x62EC, //CJK UNIFIED IDEOGRAPH
+ 0xCEC1: 0x9002, //CJK UNIFIED IDEOGRAPH
+ 0xCEC2: 0x4F8A, //CJK UNIFIED IDEOGRAPH
+ 0xCEC3: 0x5149, //CJK UNIFIED IDEOGRAPH
+ 0xCEC4: 0x5321, //CJK UNIFIED IDEOGRAPH
+ 0xCEC5: 0x58D9, //CJK UNIFIED IDEOGRAPH
+ 0xCEC6: 0x5EE3, //CJK UNIFIED IDEOGRAPH
+ 0xCEC7: 0x66E0, //CJK UNIFIED IDEOGRAPH
+ 0xCEC8: 0x6D38, //CJK UNIFIED IDEOGRAPH
+ 0xCEC9: 0x709A, //CJK UNIFIED IDEOGRAPH
+ 0xCECA: 0x72C2, //CJK UNIFIED IDEOGRAPH
+ 0xCECB: 0x73D6, //CJK UNIFIED IDEOGRAPH
+ 0xCECC: 0x7B50, //CJK UNIFIED IDEOGRAPH
+ 0xCECD: 0x80F1, //CJK UNIFIED IDEOGRAPH
+ 0xCECE: 0x945B, //CJK UNIFIED IDEOGRAPH
+ 0xCECF: 0x5366, //CJK UNIFIED IDEOGRAPH
+ 0xCED0: 0x639B, //CJK UNIFIED IDEOGRAPH
+ 0xCED1: 0x7F6B, //CJK UNIFIED IDEOGRAPH
+ 0xCED2: 0x4E56, //CJK UNIFIED IDEOGRAPH
+ 0xCED3: 0x5080, //CJK UNIFIED IDEOGRAPH
+ 0xCED4: 0x584A, //CJK UNIFIED IDEOGRAPH
+ 0xCED5: 0x58DE, //CJK UNIFIED IDEOGRAPH
+ 0xCED6: 0x602A, //CJK UNIFIED IDEOGRAPH
+ 0xCED7: 0x6127, //CJK UNIFIED IDEOGRAPH
+ 0xCED8: 0x62D0, //CJK UNIFIED IDEOGRAPH
+ 0xCED9: 0x69D0, //CJK UNIFIED IDEOGRAPH
+ 0xCEDA: 0x9B41, //CJK UNIFIED IDEOGRAPH
+ 0xCEDB: 0x5B8F, //CJK UNIFIED IDEOGRAPH
+ 0xCEDC: 0x7D18, //CJK UNIFIED IDEOGRAPH
+ 0xCEDD: 0x80B1, //CJK UNIFIED IDEOGRAPH
+ 0xCEDE: 0x8F5F, //CJK UNIFIED IDEOGRAPH
+ 0xCEDF: 0x4EA4, //CJK UNIFIED IDEOGRAPH
+ 0xCEE0: 0x50D1, //CJK UNIFIED IDEOGRAPH
+ 0xCEE1: 0x54AC, //CJK UNIFIED IDEOGRAPH
+ 0xCEE2: 0x55AC, //CJK UNIFIED IDEOGRAPH
+ 0xCEE3: 0x5B0C, //CJK UNIFIED IDEOGRAPH
+ 0xCEE4: 0x5DA0, //CJK UNIFIED IDEOGRAPH
+ 0xCEE5: 0x5DE7, //CJK UNIFIED IDEOGRAPH
+ 0xCEE6: 0x652A, //CJK UNIFIED IDEOGRAPH
+ 0xCEE7: 0x654E, //CJK UNIFIED IDEOGRAPH
+ 0xCEE8: 0x6821, //CJK UNIFIED IDEOGRAPH
+ 0xCEE9: 0x6A4B, //CJK UNIFIED IDEOGRAPH
+ 0xCEEA: 0x72E1, //CJK UNIFIED IDEOGRAPH
+ 0xCEEB: 0x768E, //CJK UNIFIED IDEOGRAPH
+ 0xCEEC: 0x77EF, //CJK UNIFIED IDEOGRAPH
+ 0xCEED: 0x7D5E, //CJK UNIFIED IDEOGRAPH
+ 0xCEEE: 0x7FF9, //CJK UNIFIED IDEOGRAPH
+ 0xCEEF: 0x81A0, //CJK UNIFIED IDEOGRAPH
+ 0xCEF0: 0x854E, //CJK UNIFIED IDEOGRAPH
+ 0xCEF1: 0x86DF, //CJK UNIFIED IDEOGRAPH
+ 0xCEF2: 0x8F03, //CJK UNIFIED IDEOGRAPH
+ 0xCEF3: 0x8F4E, //CJK UNIFIED IDEOGRAPH
+ 0xCEF4: 0x90CA, //CJK UNIFIED IDEOGRAPH
+ 0xCEF5: 0x9903, //CJK UNIFIED IDEOGRAPH
+ 0xCEF6: 0x9A55, //CJK UNIFIED IDEOGRAPH
+ 0xCEF7: 0x9BAB, //CJK UNIFIED IDEOGRAPH
+ 0xCEF8: 0x4E18, //CJK UNIFIED IDEOGRAPH
+ 0xCEF9: 0x4E45, //CJK UNIFIED IDEOGRAPH
+ 0xCEFA: 0x4E5D, //CJK UNIFIED IDEOGRAPH
+ 0xCEFB: 0x4EC7, //CJK UNIFIED IDEOGRAPH
+ 0xCEFC: 0x4FF1, //CJK UNIFIED IDEOGRAPH
+ 0xCEFD: 0x5177, //CJK UNIFIED IDEOGRAPH
+ 0xCEFE: 0x52FE, //CJK UNIFIED IDEOGRAPH
+ 0xCFA1: 0x5340, //CJK UNIFIED IDEOGRAPH
+ 0xCFA2: 0x53E3, //CJK UNIFIED IDEOGRAPH
+ 0xCFA3: 0x53E5, //CJK UNIFIED IDEOGRAPH
+ 0xCFA4: 0x548E, //CJK UNIFIED IDEOGRAPH
+ 0xCFA5: 0x5614, //CJK UNIFIED IDEOGRAPH
+ 0xCFA6: 0x5775, //CJK UNIFIED IDEOGRAPH
+ 0xCFA7: 0x57A2, //CJK UNIFIED IDEOGRAPH
+ 0xCFA8: 0x5BC7, //CJK UNIFIED IDEOGRAPH
+ 0xCFA9: 0x5D87, //CJK UNIFIED IDEOGRAPH
+ 0xCFAA: 0x5ED0, //CJK UNIFIED IDEOGRAPH
+ 0xCFAB: 0x61FC, //CJK UNIFIED IDEOGRAPH
+ 0xCFAC: 0x62D8, //CJK UNIFIED IDEOGRAPH
+ 0xCFAD: 0x6551, //CJK UNIFIED IDEOGRAPH
+ 0xCFAE: 0x67B8, //CJK UNIFIED IDEOGRAPH
+ 0xCFAF: 0x67E9, //CJK UNIFIED IDEOGRAPH
+ 0xCFB0: 0x69CB, //CJK UNIFIED IDEOGRAPH
+ 0xCFB1: 0x6B50, //CJK UNIFIED IDEOGRAPH
+ 0xCFB2: 0x6BC6, //CJK UNIFIED IDEOGRAPH
+ 0xCFB3: 0x6BEC, //CJK UNIFIED IDEOGRAPH
+ 0xCFB4: 0x6C42, //CJK UNIFIED IDEOGRAPH
+ 0xCFB5: 0x6E9D, //CJK UNIFIED IDEOGRAPH
+ 0xCFB6: 0x7078, //CJK UNIFIED IDEOGRAPH
+ 0xCFB7: 0x72D7, //CJK UNIFIED IDEOGRAPH
+ 0xCFB8: 0x7396, //CJK UNIFIED IDEOGRAPH
+ 0xCFB9: 0x7403, //CJK UNIFIED IDEOGRAPH
+ 0xCFBA: 0x77BF, //CJK UNIFIED IDEOGRAPH
+ 0xCFBB: 0x77E9, //CJK UNIFIED IDEOGRAPH
+ 0xCFBC: 0x7A76, //CJK UNIFIED IDEOGRAPH
+ 0xCFBD: 0x7D7F, //CJK UNIFIED IDEOGRAPH
+ 0xCFBE: 0x8009, //CJK UNIFIED IDEOGRAPH
+ 0xCFBF: 0x81FC, //CJK UNIFIED IDEOGRAPH
+ 0xCFC0: 0x8205, //CJK UNIFIED IDEOGRAPH
+ 0xCFC1: 0x820A, //CJK UNIFIED IDEOGRAPH
+ 0xCFC2: 0x82DF, //CJK UNIFIED IDEOGRAPH
+ 0xCFC3: 0x8862, //CJK UNIFIED IDEOGRAPH
+ 0xCFC4: 0x8B33, //CJK UNIFIED IDEOGRAPH
+ 0xCFC5: 0x8CFC, //CJK UNIFIED IDEOGRAPH
+ 0xCFC6: 0x8EC0, //CJK UNIFIED IDEOGRAPH
+ 0xCFC7: 0x9011, //CJK UNIFIED IDEOGRAPH
+ 0xCFC8: 0x90B1, //CJK UNIFIED IDEOGRAPH
+ 0xCFC9: 0x9264, //CJK UNIFIED IDEOGRAPH
+ 0xCFCA: 0x92B6, //CJK UNIFIED IDEOGRAPH
+ 0xCFCB: 0x99D2, //CJK UNIFIED IDEOGRAPH
+ 0xCFCC: 0x9A45, //CJK UNIFIED IDEOGRAPH
+ 0xCFCD: 0x9CE9, //CJK UNIFIED IDEOGRAPH
+ 0xCFCE: 0x9DD7, //CJK UNIFIED IDEOGRAPH
+ 0xCFCF: 0x9F9C, //CJK UNIFIED IDEOGRAPH
+ 0xCFD0: 0x570B, //CJK UNIFIED IDEOGRAPH
+ 0xCFD1: 0x5C40, //CJK UNIFIED IDEOGRAPH
+ 0xCFD2: 0x83CA, //CJK UNIFIED IDEOGRAPH
+ 0xCFD3: 0x97A0, //CJK UNIFIED IDEOGRAPH
+ 0xCFD4: 0x97AB, //CJK UNIFIED IDEOGRAPH
+ 0xCFD5: 0x9EB4, //CJK UNIFIED IDEOGRAPH
+ 0xCFD6: 0x541B, //CJK UNIFIED IDEOGRAPH
+ 0xCFD7: 0x7A98, //CJK UNIFIED IDEOGRAPH
+ 0xCFD8: 0x7FA4, //CJK UNIFIED IDEOGRAPH
+ 0xCFD9: 0x88D9, //CJK UNIFIED IDEOGRAPH
+ 0xCFDA: 0x8ECD, //CJK UNIFIED IDEOGRAPH
+ 0xCFDB: 0x90E1, //CJK UNIFIED IDEOGRAPH
+ 0xCFDC: 0x5800, //CJK UNIFIED IDEOGRAPH
+ 0xCFDD: 0x5C48, //CJK UNIFIED IDEOGRAPH
+ 0xCFDE: 0x6398, //CJK UNIFIED IDEOGRAPH
+ 0xCFDF: 0x7A9F, //CJK UNIFIED IDEOGRAPH
+ 0xCFE0: 0x5BAE, //CJK UNIFIED IDEOGRAPH
+ 0xCFE1: 0x5F13, //CJK UNIFIED IDEOGRAPH
+ 0xCFE2: 0x7A79, //CJK UNIFIED IDEOGRAPH
+ 0xCFE3: 0x7AAE, //CJK UNIFIED IDEOGRAPH
+ 0xCFE4: 0x828E, //CJK UNIFIED IDEOGRAPH
+ 0xCFE5: 0x8EAC, //CJK UNIFIED IDEOGRAPH
+ 0xCFE6: 0x5026, //CJK UNIFIED IDEOGRAPH
+ 0xCFE7: 0x5238, //CJK UNIFIED IDEOGRAPH
+ 0xCFE8: 0x52F8, //CJK UNIFIED IDEOGRAPH
+ 0xCFE9: 0x5377, //CJK UNIFIED IDEOGRAPH
+ 0xCFEA: 0x5708, //CJK UNIFIED IDEOGRAPH
+ 0xCFEB: 0x62F3, //CJK UNIFIED IDEOGRAPH
+ 0xCFEC: 0x6372, //CJK UNIFIED IDEOGRAPH
+ 0xCFED: 0x6B0A, //CJK UNIFIED IDEOGRAPH
+ 0xCFEE: 0x6DC3, //CJK UNIFIED IDEOGRAPH
+ 0xCFEF: 0x7737, //CJK UNIFIED IDEOGRAPH
+ 0xCFF0: 0x53A5, //CJK UNIFIED IDEOGRAPH
+ 0xCFF1: 0x7357, //CJK UNIFIED IDEOGRAPH
+ 0xCFF2: 0x8568, //CJK UNIFIED IDEOGRAPH
+ 0xCFF3: 0x8E76, //CJK UNIFIED IDEOGRAPH
+ 0xCFF4: 0x95D5, //CJK UNIFIED IDEOGRAPH
+ 0xCFF5: 0x673A, //CJK UNIFIED IDEOGRAPH
+ 0xCFF6: 0x6AC3, //CJK UNIFIED IDEOGRAPH
+ 0xCFF7: 0x6F70, //CJK UNIFIED IDEOGRAPH
+ 0xCFF8: 0x8A6D, //CJK UNIFIED IDEOGRAPH
+ 0xCFF9: 0x8ECC, //CJK UNIFIED IDEOGRAPH
+ 0xCFFA: 0x994B, //CJK UNIFIED IDEOGRAPH
+ 0xCFFB: 0xF906, //CJK COMPATIBILITY IDEOGRAPH
+ 0xCFFC: 0x6677, //CJK UNIFIED IDEOGRAPH
+ 0xCFFD: 0x6B78, //CJK UNIFIED IDEOGRAPH
+ 0xCFFE: 0x8CB4, //CJK UNIFIED IDEOGRAPH
+ 0xD0A1: 0x9B3C, //CJK UNIFIED IDEOGRAPH
+ 0xD0A2: 0xF907, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD0A3: 0x53EB, //CJK UNIFIED IDEOGRAPH
+ 0xD0A4: 0x572D, //CJK UNIFIED IDEOGRAPH
+ 0xD0A5: 0x594E, //CJK UNIFIED IDEOGRAPH
+ 0xD0A6: 0x63C6, //CJK UNIFIED IDEOGRAPH
+ 0xD0A7: 0x69FB, //CJK UNIFIED IDEOGRAPH
+ 0xD0A8: 0x73EA, //CJK UNIFIED IDEOGRAPH
+ 0xD0A9: 0x7845, //CJK UNIFIED IDEOGRAPH
+ 0xD0AA: 0x7ABA, //CJK UNIFIED IDEOGRAPH
+ 0xD0AB: 0x7AC5, //CJK UNIFIED IDEOGRAPH
+ 0xD0AC: 0x7CFE, //CJK UNIFIED IDEOGRAPH
+ 0xD0AD: 0x8475, //CJK UNIFIED IDEOGRAPH
+ 0xD0AE: 0x898F, //CJK UNIFIED IDEOGRAPH
+ 0xD0AF: 0x8D73, //CJK UNIFIED IDEOGRAPH
+ 0xD0B0: 0x9035, //CJK UNIFIED IDEOGRAPH
+ 0xD0B1: 0x95A8, //CJK UNIFIED IDEOGRAPH
+ 0xD0B2: 0x52FB, //CJK UNIFIED IDEOGRAPH
+ 0xD0B3: 0x5747, //CJK UNIFIED IDEOGRAPH
+ 0xD0B4: 0x7547, //CJK UNIFIED IDEOGRAPH
+ 0xD0B5: 0x7B60, //CJK UNIFIED IDEOGRAPH
+ 0xD0B6: 0x83CC, //CJK UNIFIED IDEOGRAPH
+ 0xD0B7: 0x921E, //CJK UNIFIED IDEOGRAPH
+ 0xD0B8: 0xF908, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD0B9: 0x6A58, //CJK UNIFIED IDEOGRAPH
+ 0xD0BA: 0x514B, //CJK UNIFIED IDEOGRAPH
+ 0xD0BB: 0x524B, //CJK UNIFIED IDEOGRAPH
+ 0xD0BC: 0x5287, //CJK UNIFIED IDEOGRAPH
+ 0xD0BD: 0x621F, //CJK UNIFIED IDEOGRAPH
+ 0xD0BE: 0x68D8, //CJK UNIFIED IDEOGRAPH
+ 0xD0BF: 0x6975, //CJK UNIFIED IDEOGRAPH
+ 0xD0C0: 0x9699, //CJK UNIFIED IDEOGRAPH
+ 0xD0C1: 0x50C5, //CJK UNIFIED IDEOGRAPH
+ 0xD0C2: 0x52A4, //CJK UNIFIED IDEOGRAPH
+ 0xD0C3: 0x52E4, //CJK UNIFIED IDEOGRAPH
+ 0xD0C4: 0x61C3, //CJK UNIFIED IDEOGRAPH
+ 0xD0C5: 0x65A4, //CJK UNIFIED IDEOGRAPH
+ 0xD0C6: 0x6839, //CJK UNIFIED IDEOGRAPH
+ 0xD0C7: 0x69FF, //CJK UNIFIED IDEOGRAPH
+ 0xD0C8: 0x747E, //CJK UNIFIED IDEOGRAPH
+ 0xD0C9: 0x7B4B, //CJK UNIFIED IDEOGRAPH
+ 0xD0CA: 0x82B9, //CJK UNIFIED IDEOGRAPH
+ 0xD0CB: 0x83EB, //CJK UNIFIED IDEOGRAPH
+ 0xD0CC: 0x89B2, //CJK UNIFIED IDEOGRAPH
+ 0xD0CD: 0x8B39, //CJK UNIFIED IDEOGRAPH
+ 0xD0CE: 0x8FD1, //CJK UNIFIED IDEOGRAPH
+ 0xD0CF: 0x9949, //CJK UNIFIED IDEOGRAPH
+ 0xD0D0: 0xF909, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD0D1: 0x4ECA, //CJK UNIFIED IDEOGRAPH
+ 0xD0D2: 0x5997, //CJK UNIFIED IDEOGRAPH
+ 0xD0D3: 0x64D2, //CJK UNIFIED IDEOGRAPH
+ 0xD0D4: 0x6611, //CJK UNIFIED IDEOGRAPH
+ 0xD0D5: 0x6A8E, //CJK UNIFIED IDEOGRAPH
+ 0xD0D6: 0x7434, //CJK UNIFIED IDEOGRAPH
+ 0xD0D7: 0x7981, //CJK UNIFIED IDEOGRAPH
+ 0xD0D8: 0x79BD, //CJK UNIFIED IDEOGRAPH
+ 0xD0D9: 0x82A9, //CJK UNIFIED IDEOGRAPH
+ 0xD0DA: 0x887E, //CJK UNIFIED IDEOGRAPH
+ 0xD0DB: 0x887F, //CJK UNIFIED IDEOGRAPH
+ 0xD0DC: 0x895F, //CJK UNIFIED IDEOGRAPH
+ 0xD0DD: 0xF90A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD0DE: 0x9326, //CJK UNIFIED IDEOGRAPH
+ 0xD0DF: 0x4F0B, //CJK UNIFIED IDEOGRAPH
+ 0xD0E0: 0x53CA, //CJK UNIFIED IDEOGRAPH
+ 0xD0E1: 0x6025, //CJK UNIFIED IDEOGRAPH
+ 0xD0E2: 0x6271, //CJK UNIFIED IDEOGRAPH
+ 0xD0E3: 0x6C72, //CJK UNIFIED IDEOGRAPH
+ 0xD0E4: 0x7D1A, //CJK UNIFIED IDEOGRAPH
+ 0xD0E5: 0x7D66, //CJK UNIFIED IDEOGRAPH
+ 0xD0E6: 0x4E98, //CJK UNIFIED IDEOGRAPH
+ 0xD0E7: 0x5162, //CJK UNIFIED IDEOGRAPH
+ 0xD0E8: 0x77DC, //CJK UNIFIED IDEOGRAPH
+ 0xD0E9: 0x80AF, //CJK UNIFIED IDEOGRAPH
+ 0xD0EA: 0x4F01, //CJK UNIFIED IDEOGRAPH
+ 0xD0EB: 0x4F0E, //CJK UNIFIED IDEOGRAPH
+ 0xD0EC: 0x5176, //CJK UNIFIED IDEOGRAPH
+ 0xD0ED: 0x5180, //CJK UNIFIED IDEOGRAPH
+ 0xD0EE: 0x55DC, //CJK UNIFIED IDEOGRAPH
+ 0xD0EF: 0x5668, //CJK UNIFIED IDEOGRAPH
+ 0xD0F0: 0x573B, //CJK UNIFIED IDEOGRAPH
+ 0xD0F1: 0x57FA, //CJK UNIFIED IDEOGRAPH
+ 0xD0F2: 0x57FC, //CJK UNIFIED IDEOGRAPH
+ 0xD0F3: 0x5914, //CJK UNIFIED IDEOGRAPH
+ 0xD0F4: 0x5947, //CJK UNIFIED IDEOGRAPH
+ 0xD0F5: 0x5993, //CJK UNIFIED IDEOGRAPH
+ 0xD0F6: 0x5BC4, //CJK UNIFIED IDEOGRAPH
+ 0xD0F7: 0x5C90, //CJK UNIFIED IDEOGRAPH
+ 0xD0F8: 0x5D0E, //CJK UNIFIED IDEOGRAPH
+ 0xD0F9: 0x5DF1, //CJK UNIFIED IDEOGRAPH
+ 0xD0FA: 0x5E7E, //CJK UNIFIED IDEOGRAPH
+ 0xD0FB: 0x5FCC, //CJK UNIFIED IDEOGRAPH
+ 0xD0FC: 0x6280, //CJK UNIFIED IDEOGRAPH
+ 0xD0FD: 0x65D7, //CJK UNIFIED IDEOGRAPH
+ 0xD0FE: 0x65E3, //CJK UNIFIED IDEOGRAPH
+ 0xD1A1: 0x671E, //CJK UNIFIED IDEOGRAPH
+ 0xD1A2: 0x671F, //CJK UNIFIED IDEOGRAPH
+ 0xD1A3: 0x675E, //CJK UNIFIED IDEOGRAPH
+ 0xD1A4: 0x68CB, //CJK UNIFIED IDEOGRAPH
+ 0xD1A5: 0x68C4, //CJK UNIFIED IDEOGRAPH
+ 0xD1A6: 0x6A5F, //CJK UNIFIED IDEOGRAPH
+ 0xD1A7: 0x6B3A, //CJK UNIFIED IDEOGRAPH
+ 0xD1A8: 0x6C23, //CJK UNIFIED IDEOGRAPH
+ 0xD1A9: 0x6C7D, //CJK UNIFIED IDEOGRAPH
+ 0xD1AA: 0x6C82, //CJK UNIFIED IDEOGRAPH
+ 0xD1AB: 0x6DC7, //CJK UNIFIED IDEOGRAPH
+ 0xD1AC: 0x7398, //CJK UNIFIED IDEOGRAPH
+ 0xD1AD: 0x7426, //CJK UNIFIED IDEOGRAPH
+ 0xD1AE: 0x742A, //CJK UNIFIED IDEOGRAPH
+ 0xD1AF: 0x7482, //CJK UNIFIED IDEOGRAPH
+ 0xD1B0: 0x74A3, //CJK UNIFIED IDEOGRAPH
+ 0xD1B1: 0x7578, //CJK UNIFIED IDEOGRAPH
+ 0xD1B2: 0x757F, //CJK UNIFIED IDEOGRAPH
+ 0xD1B3: 0x7881, //CJK UNIFIED IDEOGRAPH
+ 0xD1B4: 0x78EF, //CJK UNIFIED IDEOGRAPH
+ 0xD1B5: 0x7941, //CJK UNIFIED IDEOGRAPH
+ 0xD1B6: 0x7947, //CJK UNIFIED IDEOGRAPH
+ 0xD1B7: 0x7948, //CJK UNIFIED IDEOGRAPH
+ 0xD1B8: 0x797A, //CJK UNIFIED IDEOGRAPH
+ 0xD1B9: 0x7B95, //CJK UNIFIED IDEOGRAPH
+ 0xD1BA: 0x7D00, //CJK UNIFIED IDEOGRAPH
+ 0xD1BB: 0x7DBA, //CJK UNIFIED IDEOGRAPH
+ 0xD1BC: 0x7F88, //CJK UNIFIED IDEOGRAPH
+ 0xD1BD: 0x8006, //CJK UNIFIED IDEOGRAPH
+ 0xD1BE: 0x802D, //CJK UNIFIED IDEOGRAPH
+ 0xD1BF: 0x808C, //CJK UNIFIED IDEOGRAPH
+ 0xD1C0: 0x8A18, //CJK UNIFIED IDEOGRAPH
+ 0xD1C1: 0x8B4F, //CJK UNIFIED IDEOGRAPH
+ 0xD1C2: 0x8C48, //CJK UNIFIED IDEOGRAPH
+ 0xD1C3: 0x8D77, //CJK UNIFIED IDEOGRAPH
+ 0xD1C4: 0x9321, //CJK UNIFIED IDEOGRAPH
+ 0xD1C5: 0x9324, //CJK UNIFIED IDEOGRAPH
+ 0xD1C6: 0x98E2, //CJK UNIFIED IDEOGRAPH
+ 0xD1C7: 0x9951, //CJK UNIFIED IDEOGRAPH
+ 0xD1C8: 0x9A0E, //CJK UNIFIED IDEOGRAPH
+ 0xD1C9: 0x9A0F, //CJK UNIFIED IDEOGRAPH
+ 0xD1CA: 0x9A65, //CJK UNIFIED IDEOGRAPH
+ 0xD1CB: 0x9E92, //CJK UNIFIED IDEOGRAPH
+ 0xD1CC: 0x7DCA, //CJK UNIFIED IDEOGRAPH
+ 0xD1CD: 0x4F76, //CJK UNIFIED IDEOGRAPH
+ 0xD1CE: 0x5409, //CJK UNIFIED IDEOGRAPH
+ 0xD1CF: 0x62EE, //CJK UNIFIED IDEOGRAPH
+ 0xD1D0: 0x6854, //CJK UNIFIED IDEOGRAPH
+ 0xD1D1: 0x91D1, //CJK UNIFIED IDEOGRAPH
+ 0xD1D2: 0x55AB, //CJK UNIFIED IDEOGRAPH
+ 0xD1D3: 0x513A, //CJK UNIFIED IDEOGRAPH
+ 0xD1D4: 0xF90B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1D5: 0xF90C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1D6: 0x5A1C, //CJK UNIFIED IDEOGRAPH
+ 0xD1D7: 0x61E6, //CJK UNIFIED IDEOGRAPH
+ 0xD1D8: 0xF90D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1D9: 0x62CF, //CJK UNIFIED IDEOGRAPH
+ 0xD1DA: 0x62FF, //CJK UNIFIED IDEOGRAPH
+ 0xD1DB: 0xF90E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1DC: 0xF90F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1DD: 0xF910, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1DE: 0xF911, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1DF: 0xF912, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1E0: 0xF913, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1E1: 0x90A3, //CJK UNIFIED IDEOGRAPH
+ 0xD1E2: 0xF914, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1E3: 0xF915, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1E4: 0xF916, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1E5: 0xF917, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1E6: 0xF918, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1E7: 0x8AFE, //CJK UNIFIED IDEOGRAPH
+ 0xD1E8: 0xF919, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1E9: 0xF91A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1EA: 0xF91B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1EB: 0xF91C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1EC: 0x6696, //CJK UNIFIED IDEOGRAPH
+ 0xD1ED: 0xF91D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1EE: 0x7156, //CJK UNIFIED IDEOGRAPH
+ 0xD1EF: 0xF91E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1F0: 0xF91F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1F1: 0x96E3, //CJK UNIFIED IDEOGRAPH
+ 0xD1F2: 0xF920, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1F3: 0x634F, //CJK UNIFIED IDEOGRAPH
+ 0xD1F4: 0x637A, //CJK UNIFIED IDEOGRAPH
+ 0xD1F5: 0x5357, //CJK UNIFIED IDEOGRAPH
+ 0xD1F6: 0xF921, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1F7: 0x678F, //CJK UNIFIED IDEOGRAPH
+ 0xD1F8: 0x6960, //CJK UNIFIED IDEOGRAPH
+ 0xD1F9: 0x6E73, //CJK UNIFIED IDEOGRAPH
+ 0xD1FA: 0xF922, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1FB: 0x7537, //CJK UNIFIED IDEOGRAPH
+ 0xD1FC: 0xF923, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1FD: 0xF924, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD1FE: 0xF925, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2A1: 0x7D0D, //CJK UNIFIED IDEOGRAPH
+ 0xD2A2: 0xF926, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2A3: 0xF927, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2A4: 0x8872, //CJK UNIFIED IDEOGRAPH
+ 0xD2A5: 0x56CA, //CJK UNIFIED IDEOGRAPH
+ 0xD2A6: 0x5A18, //CJK UNIFIED IDEOGRAPH
+ 0xD2A7: 0xF928, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2A8: 0xF929, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2A9: 0xF92A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2AA: 0xF92B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2AB: 0xF92C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2AC: 0x4E43, //CJK UNIFIED IDEOGRAPH
+ 0xD2AD: 0xF92D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2AE: 0x5167, //CJK UNIFIED IDEOGRAPH
+ 0xD2AF: 0x5948, //CJK UNIFIED IDEOGRAPH
+ 0xD2B0: 0x67F0, //CJK UNIFIED IDEOGRAPH
+ 0xD2B1: 0x8010, //CJK UNIFIED IDEOGRAPH
+ 0xD2B2: 0xF92E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2B3: 0x5973, //CJK UNIFIED IDEOGRAPH
+ 0xD2B4: 0x5E74, //CJK UNIFIED IDEOGRAPH
+ 0xD2B5: 0x649A, //CJK UNIFIED IDEOGRAPH
+ 0xD2B6: 0x79CA, //CJK UNIFIED IDEOGRAPH
+ 0xD2B7: 0x5FF5, //CJK UNIFIED IDEOGRAPH
+ 0xD2B8: 0x606C, //CJK UNIFIED IDEOGRAPH
+ 0xD2B9: 0x62C8, //CJK UNIFIED IDEOGRAPH
+ 0xD2BA: 0x637B, //CJK UNIFIED IDEOGRAPH
+ 0xD2BB: 0x5BE7, //CJK UNIFIED IDEOGRAPH
+ 0xD2BC: 0x5BD7, //CJK UNIFIED IDEOGRAPH
+ 0xD2BD: 0x52AA, //CJK UNIFIED IDEOGRAPH
+ 0xD2BE: 0xF92F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2BF: 0x5974, //CJK UNIFIED IDEOGRAPH
+ 0xD2C0: 0x5F29, //CJK UNIFIED IDEOGRAPH
+ 0xD2C1: 0x6012, //CJK UNIFIED IDEOGRAPH
+ 0xD2C2: 0xF930, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2C3: 0xF931, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2C4: 0xF932, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2C5: 0x7459, //CJK UNIFIED IDEOGRAPH
+ 0xD2C6: 0xF933, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2C7: 0xF934, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2C8: 0xF935, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2C9: 0xF936, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2CA: 0xF937, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2CB: 0xF938, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2CC: 0x99D1, //CJK UNIFIED IDEOGRAPH
+ 0xD2CD: 0xF939, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2CE: 0xF93A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2CF: 0xF93B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D0: 0xF93C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D1: 0xF93D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D2: 0xF93E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D3: 0xF93F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D4: 0xF940, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D5: 0xF941, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D6: 0xF942, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D7: 0xF943, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2D8: 0x6FC3, //CJK UNIFIED IDEOGRAPH
+ 0xD2D9: 0xF944, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2DA: 0xF945, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2DB: 0x81BF, //CJK UNIFIED IDEOGRAPH
+ 0xD2DC: 0x8FB2, //CJK UNIFIED IDEOGRAPH
+ 0xD2DD: 0x60F1, //CJK UNIFIED IDEOGRAPH
+ 0xD2DE: 0xF946, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2DF: 0xF947, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2E0: 0x8166, //CJK UNIFIED IDEOGRAPH
+ 0xD2E1: 0xF948, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2E2: 0xF949, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2E3: 0x5C3F, //CJK UNIFIED IDEOGRAPH
+ 0xD2E4: 0xF94A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2E5: 0xF94B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2E6: 0xF94C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2E7: 0xF94D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2E8: 0xF94E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2E9: 0xF94F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2EA: 0xF950, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2EB: 0xF951, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2EC: 0x5AE9, //CJK UNIFIED IDEOGRAPH
+ 0xD2ED: 0x8A25, //CJK UNIFIED IDEOGRAPH
+ 0xD2EE: 0x677B, //CJK UNIFIED IDEOGRAPH
+ 0xD2EF: 0x7D10, //CJK UNIFIED IDEOGRAPH
+ 0xD2F0: 0xF952, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2F1: 0xF953, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2F2: 0xF954, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2F3: 0xF955, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2F4: 0xF956, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2F5: 0xF957, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2F6: 0x80FD, //CJK UNIFIED IDEOGRAPH
+ 0xD2F7: 0xF958, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2F8: 0xF959, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD2F9: 0x5C3C, //CJK UNIFIED IDEOGRAPH
+ 0xD2FA: 0x6CE5, //CJK UNIFIED IDEOGRAPH
+ 0xD2FB: 0x533F, //CJK UNIFIED IDEOGRAPH
+ 0xD2FC: 0x6EBA, //CJK UNIFIED IDEOGRAPH
+ 0xD2FD: 0x591A, //CJK UNIFIED IDEOGRAPH
+ 0xD2FE: 0x8336, //CJK UNIFIED IDEOGRAPH
+ 0xD3A1: 0x4E39, //CJK UNIFIED IDEOGRAPH
+ 0xD3A2: 0x4EB6, //CJK UNIFIED IDEOGRAPH
+ 0xD3A3: 0x4F46, //CJK UNIFIED IDEOGRAPH
+ 0xD3A4: 0x55AE, //CJK UNIFIED IDEOGRAPH
+ 0xD3A5: 0x5718, //CJK UNIFIED IDEOGRAPH
+ 0xD3A6: 0x58C7, //CJK UNIFIED IDEOGRAPH
+ 0xD3A7: 0x5F56, //CJK UNIFIED IDEOGRAPH
+ 0xD3A8: 0x65B7, //CJK UNIFIED IDEOGRAPH
+ 0xD3A9: 0x65E6, //CJK UNIFIED IDEOGRAPH
+ 0xD3AA: 0x6A80, //CJK UNIFIED IDEOGRAPH
+ 0xD3AB: 0x6BB5, //CJK UNIFIED IDEOGRAPH
+ 0xD3AC: 0x6E4D, //CJK UNIFIED IDEOGRAPH
+ 0xD3AD: 0x77ED, //CJK UNIFIED IDEOGRAPH
+ 0xD3AE: 0x7AEF, //CJK UNIFIED IDEOGRAPH
+ 0xD3AF: 0x7C1E, //CJK UNIFIED IDEOGRAPH
+ 0xD3B0: 0x7DDE, //CJK UNIFIED IDEOGRAPH
+ 0xD3B1: 0x86CB, //CJK UNIFIED IDEOGRAPH
+ 0xD3B2: 0x8892, //CJK UNIFIED IDEOGRAPH
+ 0xD3B3: 0x9132, //CJK UNIFIED IDEOGRAPH
+ 0xD3B4: 0x935B, //CJK UNIFIED IDEOGRAPH
+ 0xD3B5: 0x64BB, //CJK UNIFIED IDEOGRAPH
+ 0xD3B6: 0x6FBE, //CJK UNIFIED IDEOGRAPH
+ 0xD3B7: 0x737A, //CJK UNIFIED IDEOGRAPH
+ 0xD3B8: 0x75B8, //CJK UNIFIED IDEOGRAPH
+ 0xD3B9: 0x9054, //CJK UNIFIED IDEOGRAPH
+ 0xD3BA: 0x5556, //CJK UNIFIED IDEOGRAPH
+ 0xD3BB: 0x574D, //CJK UNIFIED IDEOGRAPH
+ 0xD3BC: 0x61BA, //CJK UNIFIED IDEOGRAPH
+ 0xD3BD: 0x64D4, //CJK UNIFIED IDEOGRAPH
+ 0xD3BE: 0x66C7, //CJK UNIFIED IDEOGRAPH
+ 0xD3BF: 0x6DE1, //CJK UNIFIED IDEOGRAPH
+ 0xD3C0: 0x6E5B, //CJK UNIFIED IDEOGRAPH
+ 0xD3C1: 0x6F6D, //CJK UNIFIED IDEOGRAPH
+ 0xD3C2: 0x6FB9, //CJK UNIFIED IDEOGRAPH
+ 0xD3C3: 0x75F0, //CJK UNIFIED IDEOGRAPH
+ 0xD3C4: 0x8043, //CJK UNIFIED IDEOGRAPH
+ 0xD3C5: 0x81BD, //CJK UNIFIED IDEOGRAPH
+ 0xD3C6: 0x8541, //CJK UNIFIED IDEOGRAPH
+ 0xD3C7: 0x8983, //CJK UNIFIED IDEOGRAPH
+ 0xD3C8: 0x8AC7, //CJK UNIFIED IDEOGRAPH
+ 0xD3C9: 0x8B5A, //CJK UNIFIED IDEOGRAPH
+ 0xD3CA: 0x931F, //CJK UNIFIED IDEOGRAPH
+ 0xD3CB: 0x6C93, //CJK UNIFIED IDEOGRAPH
+ 0xD3CC: 0x7553, //CJK UNIFIED IDEOGRAPH
+ 0xD3CD: 0x7B54, //CJK UNIFIED IDEOGRAPH
+ 0xD3CE: 0x8E0F, //CJK UNIFIED IDEOGRAPH
+ 0xD3CF: 0x905D, //CJK UNIFIED IDEOGRAPH
+ 0xD3D0: 0x5510, //CJK UNIFIED IDEOGRAPH
+ 0xD3D1: 0x5802, //CJK UNIFIED IDEOGRAPH
+ 0xD3D2: 0x5858, //CJK UNIFIED IDEOGRAPH
+ 0xD3D3: 0x5E62, //CJK UNIFIED IDEOGRAPH
+ 0xD3D4: 0x6207, //CJK UNIFIED IDEOGRAPH
+ 0xD3D5: 0x649E, //CJK UNIFIED IDEOGRAPH
+ 0xD3D6: 0x68E0, //CJK UNIFIED IDEOGRAPH
+ 0xD3D7: 0x7576, //CJK UNIFIED IDEOGRAPH
+ 0xD3D8: 0x7CD6, //CJK UNIFIED IDEOGRAPH
+ 0xD3D9: 0x87B3, //CJK UNIFIED IDEOGRAPH
+ 0xD3DA: 0x9EE8, //CJK UNIFIED IDEOGRAPH
+ 0xD3DB: 0x4EE3, //CJK UNIFIED IDEOGRAPH
+ 0xD3DC: 0x5788, //CJK UNIFIED IDEOGRAPH
+ 0xD3DD: 0x576E, //CJK UNIFIED IDEOGRAPH
+ 0xD3DE: 0x5927, //CJK UNIFIED IDEOGRAPH
+ 0xD3DF: 0x5C0D, //CJK UNIFIED IDEOGRAPH
+ 0xD3E0: 0x5CB1, //CJK UNIFIED IDEOGRAPH
+ 0xD3E1: 0x5E36, //CJK UNIFIED IDEOGRAPH
+ 0xD3E2: 0x5F85, //CJK UNIFIED IDEOGRAPH
+ 0xD3E3: 0x6234, //CJK UNIFIED IDEOGRAPH
+ 0xD3E4: 0x64E1, //CJK UNIFIED IDEOGRAPH
+ 0xD3E5: 0x73B3, //CJK UNIFIED IDEOGRAPH
+ 0xD3E6: 0x81FA, //CJK UNIFIED IDEOGRAPH
+ 0xD3E7: 0x888B, //CJK UNIFIED IDEOGRAPH
+ 0xD3E8: 0x8CB8, //CJK UNIFIED IDEOGRAPH
+ 0xD3E9: 0x968A, //CJK UNIFIED IDEOGRAPH
+ 0xD3EA: 0x9EDB, //CJK UNIFIED IDEOGRAPH
+ 0xD3EB: 0x5B85, //CJK UNIFIED IDEOGRAPH
+ 0xD3EC: 0x5FB7, //CJK UNIFIED IDEOGRAPH
+ 0xD3ED: 0x60B3, //CJK UNIFIED IDEOGRAPH
+ 0xD3EE: 0x5012, //CJK UNIFIED IDEOGRAPH
+ 0xD3EF: 0x5200, //CJK UNIFIED IDEOGRAPH
+ 0xD3F0: 0x5230, //CJK UNIFIED IDEOGRAPH
+ 0xD3F1: 0x5716, //CJK UNIFIED IDEOGRAPH
+ 0xD3F2: 0x5835, //CJK UNIFIED IDEOGRAPH
+ 0xD3F3: 0x5857, //CJK UNIFIED IDEOGRAPH
+ 0xD3F4: 0x5C0E, //CJK UNIFIED IDEOGRAPH
+ 0xD3F5: 0x5C60, //CJK UNIFIED IDEOGRAPH
+ 0xD3F6: 0x5CF6, //CJK UNIFIED IDEOGRAPH
+ 0xD3F7: 0x5D8B, //CJK UNIFIED IDEOGRAPH
+ 0xD3F8: 0x5EA6, //CJK UNIFIED IDEOGRAPH
+ 0xD3F9: 0x5F92, //CJK UNIFIED IDEOGRAPH
+ 0xD3FA: 0x60BC, //CJK UNIFIED IDEOGRAPH
+ 0xD3FB: 0x6311, //CJK UNIFIED IDEOGRAPH
+ 0xD3FC: 0x6389, //CJK UNIFIED IDEOGRAPH
+ 0xD3FD: 0x6417, //CJK UNIFIED IDEOGRAPH
+ 0xD3FE: 0x6843, //CJK UNIFIED IDEOGRAPH
+ 0xD4A1: 0x68F9, //CJK UNIFIED IDEOGRAPH
+ 0xD4A2: 0x6AC2, //CJK UNIFIED IDEOGRAPH
+ 0xD4A3: 0x6DD8, //CJK UNIFIED IDEOGRAPH
+ 0xD4A4: 0x6E21, //CJK UNIFIED IDEOGRAPH
+ 0xD4A5: 0x6ED4, //CJK UNIFIED IDEOGRAPH
+ 0xD4A6: 0x6FE4, //CJK UNIFIED IDEOGRAPH
+ 0xD4A7: 0x71FE, //CJK UNIFIED IDEOGRAPH
+ 0xD4A8: 0x76DC, //CJK UNIFIED IDEOGRAPH
+ 0xD4A9: 0x7779, //CJK UNIFIED IDEOGRAPH
+ 0xD4AA: 0x79B1, //CJK UNIFIED IDEOGRAPH
+ 0xD4AB: 0x7A3B, //CJK UNIFIED IDEOGRAPH
+ 0xD4AC: 0x8404, //CJK UNIFIED IDEOGRAPH
+ 0xD4AD: 0x89A9, //CJK UNIFIED IDEOGRAPH
+ 0xD4AE: 0x8CED, //CJK UNIFIED IDEOGRAPH
+ 0xD4AF: 0x8DF3, //CJK UNIFIED IDEOGRAPH
+ 0xD4B0: 0x8E48, //CJK UNIFIED IDEOGRAPH
+ 0xD4B1: 0x9003, //CJK UNIFIED IDEOGRAPH
+ 0xD4B2: 0x9014, //CJK UNIFIED IDEOGRAPH
+ 0xD4B3: 0x9053, //CJK UNIFIED IDEOGRAPH
+ 0xD4B4: 0x90FD, //CJK UNIFIED IDEOGRAPH
+ 0xD4B5: 0x934D, //CJK UNIFIED IDEOGRAPH
+ 0xD4B6: 0x9676, //CJK UNIFIED IDEOGRAPH
+ 0xD4B7: 0x97DC, //CJK UNIFIED IDEOGRAPH
+ 0xD4B8: 0x6BD2, //CJK UNIFIED IDEOGRAPH
+ 0xD4B9: 0x7006, //CJK UNIFIED IDEOGRAPH
+ 0xD4BA: 0x7258, //CJK UNIFIED IDEOGRAPH
+ 0xD4BB: 0x72A2, //CJK UNIFIED IDEOGRAPH
+ 0xD4BC: 0x7368, //CJK UNIFIED IDEOGRAPH
+ 0xD4BD: 0x7763, //CJK UNIFIED IDEOGRAPH
+ 0xD4BE: 0x79BF, //CJK UNIFIED IDEOGRAPH
+ 0xD4BF: 0x7BE4, //CJK UNIFIED IDEOGRAPH
+ 0xD4C0: 0x7E9B, //CJK UNIFIED IDEOGRAPH
+ 0xD4C1: 0x8B80, //CJK UNIFIED IDEOGRAPH
+ 0xD4C2: 0x58A9, //CJK UNIFIED IDEOGRAPH
+ 0xD4C3: 0x60C7, //CJK UNIFIED IDEOGRAPH
+ 0xD4C4: 0x6566, //CJK UNIFIED IDEOGRAPH
+ 0xD4C5: 0x65FD, //CJK UNIFIED IDEOGRAPH
+ 0xD4C6: 0x66BE, //CJK UNIFIED IDEOGRAPH
+ 0xD4C7: 0x6C8C, //CJK UNIFIED IDEOGRAPH
+ 0xD4C8: 0x711E, //CJK UNIFIED IDEOGRAPH
+ 0xD4C9: 0x71C9, //CJK UNIFIED IDEOGRAPH
+ 0xD4CA: 0x8C5A, //CJK UNIFIED IDEOGRAPH
+ 0xD4CB: 0x9813, //CJK UNIFIED IDEOGRAPH
+ 0xD4CC: 0x4E6D, //CJK UNIFIED IDEOGRAPH
+ 0xD4CD: 0x7A81, //CJK UNIFIED IDEOGRAPH
+ 0xD4CE: 0x4EDD, //CJK UNIFIED IDEOGRAPH
+ 0xD4CF: 0x51AC, //CJK UNIFIED IDEOGRAPH
+ 0xD4D0: 0x51CD, //CJK UNIFIED IDEOGRAPH
+ 0xD4D1: 0x52D5, //CJK UNIFIED IDEOGRAPH
+ 0xD4D2: 0x540C, //CJK UNIFIED IDEOGRAPH
+ 0xD4D3: 0x61A7, //CJK UNIFIED IDEOGRAPH
+ 0xD4D4: 0x6771, //CJK UNIFIED IDEOGRAPH
+ 0xD4D5: 0x6850, //CJK UNIFIED IDEOGRAPH
+ 0xD4D6: 0x68DF, //CJK UNIFIED IDEOGRAPH
+ 0xD4D7: 0x6D1E, //CJK UNIFIED IDEOGRAPH
+ 0xD4D8: 0x6F7C, //CJK UNIFIED IDEOGRAPH
+ 0xD4D9: 0x75BC, //CJK UNIFIED IDEOGRAPH
+ 0xD4DA: 0x77B3, //CJK UNIFIED IDEOGRAPH
+ 0xD4DB: 0x7AE5, //CJK UNIFIED IDEOGRAPH
+ 0xD4DC: 0x80F4, //CJK UNIFIED IDEOGRAPH
+ 0xD4DD: 0x8463, //CJK UNIFIED IDEOGRAPH
+ 0xD4DE: 0x9285, //CJK UNIFIED IDEOGRAPH
+ 0xD4DF: 0x515C, //CJK UNIFIED IDEOGRAPH
+ 0xD4E0: 0x6597, //CJK UNIFIED IDEOGRAPH
+ 0xD4E1: 0x675C, //CJK UNIFIED IDEOGRAPH
+ 0xD4E2: 0x6793, //CJK UNIFIED IDEOGRAPH
+ 0xD4E3: 0x75D8, //CJK UNIFIED IDEOGRAPH
+ 0xD4E4: 0x7AC7, //CJK UNIFIED IDEOGRAPH
+ 0xD4E5: 0x8373, //CJK UNIFIED IDEOGRAPH
+ 0xD4E6: 0xF95A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD4E7: 0x8C46, //CJK UNIFIED IDEOGRAPH
+ 0xD4E8: 0x9017, //CJK UNIFIED IDEOGRAPH
+ 0xD4E9: 0x982D, //CJK UNIFIED IDEOGRAPH
+ 0xD4EA: 0x5C6F, //CJK UNIFIED IDEOGRAPH
+ 0xD4EB: 0x81C0, //CJK UNIFIED IDEOGRAPH
+ 0xD4EC: 0x829A, //CJK UNIFIED IDEOGRAPH
+ 0xD4ED: 0x9041, //CJK UNIFIED IDEOGRAPH
+ 0xD4EE: 0x906F, //CJK UNIFIED IDEOGRAPH
+ 0xD4EF: 0x920D, //CJK UNIFIED IDEOGRAPH
+ 0xD4F0: 0x5F97, //CJK UNIFIED IDEOGRAPH
+ 0xD4F1: 0x5D9D, //CJK UNIFIED IDEOGRAPH
+ 0xD4F2: 0x6A59, //CJK UNIFIED IDEOGRAPH
+ 0xD4F3: 0x71C8, //CJK UNIFIED IDEOGRAPH
+ 0xD4F4: 0x767B, //CJK UNIFIED IDEOGRAPH
+ 0xD4F5: 0x7B49, //CJK UNIFIED IDEOGRAPH
+ 0xD4F6: 0x85E4, //CJK UNIFIED IDEOGRAPH
+ 0xD4F7: 0x8B04, //CJK UNIFIED IDEOGRAPH
+ 0xD4F8: 0x9127, //CJK UNIFIED IDEOGRAPH
+ 0xD4F9: 0x9A30, //CJK UNIFIED IDEOGRAPH
+ 0xD4FA: 0x5587, //CJK UNIFIED IDEOGRAPH
+ 0xD4FB: 0x61F6, //CJK UNIFIED IDEOGRAPH
+ 0xD4FC: 0xF95B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD4FD: 0x7669, //CJK UNIFIED IDEOGRAPH
+ 0xD4FE: 0x7F85, //CJK UNIFIED IDEOGRAPH
+ 0xD5A1: 0x863F, //CJK UNIFIED IDEOGRAPH
+ 0xD5A2: 0x87BA, //CJK UNIFIED IDEOGRAPH
+ 0xD5A3: 0x88F8, //CJK UNIFIED IDEOGRAPH
+ 0xD5A4: 0x908F, //CJK UNIFIED IDEOGRAPH
+ 0xD5A5: 0xF95C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD5A6: 0x6D1B, //CJK UNIFIED IDEOGRAPH
+ 0xD5A7: 0x70D9, //CJK UNIFIED IDEOGRAPH
+ 0xD5A8: 0x73DE, //CJK UNIFIED IDEOGRAPH
+ 0xD5A9: 0x7D61, //CJK UNIFIED IDEOGRAPH
+ 0xD5AA: 0x843D, //CJK UNIFIED IDEOGRAPH
+ 0xD5AB: 0xF95D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD5AC: 0x916A, //CJK UNIFIED IDEOGRAPH
+ 0xD5AD: 0x99F1, //CJK UNIFIED IDEOGRAPH
+ 0xD5AE: 0xF95E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD5AF: 0x4E82, //CJK UNIFIED IDEOGRAPH
+ 0xD5B0: 0x5375, //CJK UNIFIED IDEOGRAPH
+ 0xD5B1: 0x6B04, //CJK UNIFIED IDEOGRAPH
+ 0xD5B2: 0x6B12, //CJK UNIFIED IDEOGRAPH
+ 0xD5B3: 0x703E, //CJK UNIFIED IDEOGRAPH
+ 0xD5B4: 0x721B, //CJK UNIFIED IDEOGRAPH
+ 0xD5B5: 0x862D, //CJK UNIFIED IDEOGRAPH
+ 0xD5B6: 0x9E1E, //CJK UNIFIED IDEOGRAPH
+ 0xD5B7: 0x524C, //CJK UNIFIED IDEOGRAPH
+ 0xD5B8: 0x8FA3, //CJK UNIFIED IDEOGRAPH
+ 0xD5B9: 0x5D50, //CJK UNIFIED IDEOGRAPH
+ 0xD5BA: 0x64E5, //CJK UNIFIED IDEOGRAPH
+ 0xD5BB: 0x652C, //CJK UNIFIED IDEOGRAPH
+ 0xD5BC: 0x6B16, //CJK UNIFIED IDEOGRAPH
+ 0xD5BD: 0x6FEB, //CJK UNIFIED IDEOGRAPH
+ 0xD5BE: 0x7C43, //CJK UNIFIED IDEOGRAPH
+ 0xD5BF: 0x7E9C, //CJK UNIFIED IDEOGRAPH
+ 0xD5C0: 0x85CD, //CJK UNIFIED IDEOGRAPH
+ 0xD5C1: 0x8964, //CJK UNIFIED IDEOGRAPH
+ 0xD5C2: 0x89BD, //CJK UNIFIED IDEOGRAPH
+ 0xD5C3: 0x62C9, //CJK UNIFIED IDEOGRAPH
+ 0xD5C4: 0x81D8, //CJK UNIFIED IDEOGRAPH
+ 0xD5C5: 0x881F, //CJK UNIFIED IDEOGRAPH
+ 0xD5C6: 0x5ECA, //CJK UNIFIED IDEOGRAPH
+ 0xD5C7: 0x6717, //CJK UNIFIED IDEOGRAPH
+ 0xD5C8: 0x6D6A, //CJK UNIFIED IDEOGRAPH
+ 0xD5C9: 0x72FC, //CJK UNIFIED IDEOGRAPH
+ 0xD5CA: 0x7405, //CJK UNIFIED IDEOGRAPH
+ 0xD5CB: 0x746F, //CJK UNIFIED IDEOGRAPH
+ 0xD5CC: 0x8782, //CJK UNIFIED IDEOGRAPH
+ 0xD5CD: 0x90DE, //CJK UNIFIED IDEOGRAPH
+ 0xD5CE: 0x4F86, //CJK UNIFIED IDEOGRAPH
+ 0xD5CF: 0x5D0D, //CJK UNIFIED IDEOGRAPH
+ 0xD5D0: 0x5FA0, //CJK UNIFIED IDEOGRAPH
+ 0xD5D1: 0x840A, //CJK UNIFIED IDEOGRAPH
+ 0xD5D2: 0x51B7, //CJK UNIFIED IDEOGRAPH
+ 0xD5D3: 0x63A0, //CJK UNIFIED IDEOGRAPH
+ 0xD5D4: 0x7565, //CJK UNIFIED IDEOGRAPH
+ 0xD5D5: 0x4EAE, //CJK UNIFIED IDEOGRAPH
+ 0xD5D6: 0x5006, //CJK UNIFIED IDEOGRAPH
+ 0xD5D7: 0x5169, //CJK UNIFIED IDEOGRAPH
+ 0xD5D8: 0x51C9, //CJK UNIFIED IDEOGRAPH
+ 0xD5D9: 0x6881, //CJK UNIFIED IDEOGRAPH
+ 0xD5DA: 0x6A11, //CJK UNIFIED IDEOGRAPH
+ 0xD5DB: 0x7CAE, //CJK UNIFIED IDEOGRAPH
+ 0xD5DC: 0x7CB1, //CJK UNIFIED IDEOGRAPH
+ 0xD5DD: 0x7CE7, //CJK UNIFIED IDEOGRAPH
+ 0xD5DE: 0x826F, //CJK UNIFIED IDEOGRAPH
+ 0xD5DF: 0x8AD2, //CJK UNIFIED IDEOGRAPH
+ 0xD5E0: 0x8F1B, //CJK UNIFIED IDEOGRAPH
+ 0xD5E1: 0x91CF, //CJK UNIFIED IDEOGRAPH
+ 0xD5E2: 0x4FB6, //CJK UNIFIED IDEOGRAPH
+ 0xD5E3: 0x5137, //CJK UNIFIED IDEOGRAPH
+ 0xD5E4: 0x52F5, //CJK UNIFIED IDEOGRAPH
+ 0xD5E5: 0x5442, //CJK UNIFIED IDEOGRAPH
+ 0xD5E6: 0x5EEC, //CJK UNIFIED IDEOGRAPH
+ 0xD5E7: 0x616E, //CJK UNIFIED IDEOGRAPH
+ 0xD5E8: 0x623E, //CJK UNIFIED IDEOGRAPH
+ 0xD5E9: 0x65C5, //CJK UNIFIED IDEOGRAPH
+ 0xD5EA: 0x6ADA, //CJK UNIFIED IDEOGRAPH
+ 0xD5EB: 0x6FFE, //CJK UNIFIED IDEOGRAPH
+ 0xD5EC: 0x792A, //CJK UNIFIED IDEOGRAPH
+ 0xD5ED: 0x85DC, //CJK UNIFIED IDEOGRAPH
+ 0xD5EE: 0x8823, //CJK UNIFIED IDEOGRAPH
+ 0xD5EF: 0x95AD, //CJK UNIFIED IDEOGRAPH
+ 0xD5F0: 0x9A62, //CJK UNIFIED IDEOGRAPH
+ 0xD5F1: 0x9A6A, //CJK UNIFIED IDEOGRAPH
+ 0xD5F2: 0x9E97, //CJK UNIFIED IDEOGRAPH
+ 0xD5F3: 0x9ECE, //CJK UNIFIED IDEOGRAPH
+ 0xD5F4: 0x529B, //CJK UNIFIED IDEOGRAPH
+ 0xD5F5: 0x66C6, //CJK UNIFIED IDEOGRAPH
+ 0xD5F6: 0x6B77, //CJK UNIFIED IDEOGRAPH
+ 0xD5F7: 0x701D, //CJK UNIFIED IDEOGRAPH
+ 0xD5F8: 0x792B, //CJK UNIFIED IDEOGRAPH
+ 0xD5F9: 0x8F62, //CJK UNIFIED IDEOGRAPH
+ 0xD5FA: 0x9742, //CJK UNIFIED IDEOGRAPH
+ 0xD5FB: 0x6190, //CJK UNIFIED IDEOGRAPH
+ 0xD5FC: 0x6200, //CJK UNIFIED IDEOGRAPH
+ 0xD5FD: 0x6523, //CJK UNIFIED IDEOGRAPH
+ 0xD5FE: 0x6F23, //CJK UNIFIED IDEOGRAPH
+ 0xD6A1: 0x7149, //CJK UNIFIED IDEOGRAPH
+ 0xD6A2: 0x7489, //CJK UNIFIED IDEOGRAPH
+ 0xD6A3: 0x7DF4, //CJK UNIFIED IDEOGRAPH
+ 0xD6A4: 0x806F, //CJK UNIFIED IDEOGRAPH
+ 0xD6A5: 0x84EE, //CJK UNIFIED IDEOGRAPH
+ 0xD6A6: 0x8F26, //CJK UNIFIED IDEOGRAPH
+ 0xD6A7: 0x9023, //CJK UNIFIED IDEOGRAPH
+ 0xD6A8: 0x934A, //CJK UNIFIED IDEOGRAPH
+ 0xD6A9: 0x51BD, //CJK UNIFIED IDEOGRAPH
+ 0xD6AA: 0x5217, //CJK UNIFIED IDEOGRAPH
+ 0xD6AB: 0x52A3, //CJK UNIFIED IDEOGRAPH
+ 0xD6AC: 0x6D0C, //CJK UNIFIED IDEOGRAPH
+ 0xD6AD: 0x70C8, //CJK UNIFIED IDEOGRAPH
+ 0xD6AE: 0x88C2, //CJK UNIFIED IDEOGRAPH
+ 0xD6AF: 0x5EC9, //CJK UNIFIED IDEOGRAPH
+ 0xD6B0: 0x6582, //CJK UNIFIED IDEOGRAPH
+ 0xD6B1: 0x6BAE, //CJK UNIFIED IDEOGRAPH
+ 0xD6B2: 0x6FC2, //CJK UNIFIED IDEOGRAPH
+ 0xD6B3: 0x7C3E, //CJK UNIFIED IDEOGRAPH
+ 0xD6B4: 0x7375, //CJK UNIFIED IDEOGRAPH
+ 0xD6B5: 0x4EE4, //CJK UNIFIED IDEOGRAPH
+ 0xD6B6: 0x4F36, //CJK UNIFIED IDEOGRAPH
+ 0xD6B7: 0x56F9, //CJK UNIFIED IDEOGRAPH
+ 0xD6B8: 0xF95F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD6B9: 0x5CBA, //CJK UNIFIED IDEOGRAPH
+ 0xD6BA: 0x5DBA, //CJK UNIFIED IDEOGRAPH
+ 0xD6BB: 0x601C, //CJK UNIFIED IDEOGRAPH
+ 0xD6BC: 0x73B2, //CJK UNIFIED IDEOGRAPH
+ 0xD6BD: 0x7B2D, //CJK UNIFIED IDEOGRAPH
+ 0xD6BE: 0x7F9A, //CJK UNIFIED IDEOGRAPH
+ 0xD6BF: 0x7FCE, //CJK UNIFIED IDEOGRAPH
+ 0xD6C0: 0x8046, //CJK UNIFIED IDEOGRAPH
+ 0xD6C1: 0x901E, //CJK UNIFIED IDEOGRAPH
+ 0xD6C2: 0x9234, //CJK UNIFIED IDEOGRAPH
+ 0xD6C3: 0x96F6, //CJK UNIFIED IDEOGRAPH
+ 0xD6C4: 0x9748, //CJK UNIFIED IDEOGRAPH
+ 0xD6C5: 0x9818, //CJK UNIFIED IDEOGRAPH
+ 0xD6C6: 0x9F61, //CJK UNIFIED IDEOGRAPH
+ 0xD6C7: 0x4F8B, //CJK UNIFIED IDEOGRAPH
+ 0xD6C8: 0x6FA7, //CJK UNIFIED IDEOGRAPH
+ 0xD6C9: 0x79AE, //CJK UNIFIED IDEOGRAPH
+ 0xD6CA: 0x91B4, //CJK UNIFIED IDEOGRAPH
+ 0xD6CB: 0x96B7, //CJK UNIFIED IDEOGRAPH
+ 0xD6CC: 0x52DE, //CJK UNIFIED IDEOGRAPH
+ 0xD6CD: 0xF960, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD6CE: 0x6488, //CJK UNIFIED IDEOGRAPH
+ 0xD6CF: 0x64C4, //CJK UNIFIED IDEOGRAPH
+ 0xD6D0: 0x6AD3, //CJK UNIFIED IDEOGRAPH
+ 0xD6D1: 0x6F5E, //CJK UNIFIED IDEOGRAPH
+ 0xD6D2: 0x7018, //CJK UNIFIED IDEOGRAPH
+ 0xD6D3: 0x7210, //CJK UNIFIED IDEOGRAPH
+ 0xD6D4: 0x76E7, //CJK UNIFIED IDEOGRAPH
+ 0xD6D5: 0x8001, //CJK UNIFIED IDEOGRAPH
+ 0xD6D6: 0x8606, //CJK UNIFIED IDEOGRAPH
+ 0xD6D7: 0x865C, //CJK UNIFIED IDEOGRAPH
+ 0xD6D8: 0x8DEF, //CJK UNIFIED IDEOGRAPH
+ 0xD6D9: 0x8F05, //CJK UNIFIED IDEOGRAPH
+ 0xD6DA: 0x9732, //CJK UNIFIED IDEOGRAPH
+ 0xD6DB: 0x9B6F, //CJK UNIFIED IDEOGRAPH
+ 0xD6DC: 0x9DFA, //CJK UNIFIED IDEOGRAPH
+ 0xD6DD: 0x9E75, //CJK UNIFIED IDEOGRAPH
+ 0xD6DE: 0x788C, //CJK UNIFIED IDEOGRAPH
+ 0xD6DF: 0x797F, //CJK UNIFIED IDEOGRAPH
+ 0xD6E0: 0x7DA0, //CJK UNIFIED IDEOGRAPH
+ 0xD6E1: 0x83C9, //CJK UNIFIED IDEOGRAPH
+ 0xD6E2: 0x9304, //CJK UNIFIED IDEOGRAPH
+ 0xD6E3: 0x9E7F, //CJK UNIFIED IDEOGRAPH
+ 0xD6E4: 0x9E93, //CJK UNIFIED IDEOGRAPH
+ 0xD6E5: 0x8AD6, //CJK UNIFIED IDEOGRAPH
+ 0xD6E6: 0x58DF, //CJK UNIFIED IDEOGRAPH
+ 0xD6E7: 0x5F04, //CJK UNIFIED IDEOGRAPH
+ 0xD6E8: 0x6727, //CJK UNIFIED IDEOGRAPH
+ 0xD6E9: 0x7027, //CJK UNIFIED IDEOGRAPH
+ 0xD6EA: 0x74CF, //CJK UNIFIED IDEOGRAPH
+ 0xD6EB: 0x7C60, //CJK UNIFIED IDEOGRAPH
+ 0xD6EC: 0x807E, //CJK UNIFIED IDEOGRAPH
+ 0xD6ED: 0x5121, //CJK UNIFIED IDEOGRAPH
+ 0xD6EE: 0x7028, //CJK UNIFIED IDEOGRAPH
+ 0xD6EF: 0x7262, //CJK UNIFIED IDEOGRAPH
+ 0xD6F0: 0x78CA, //CJK UNIFIED IDEOGRAPH
+ 0xD6F1: 0x8CC2, //CJK UNIFIED IDEOGRAPH
+ 0xD6F2: 0x8CDA, //CJK UNIFIED IDEOGRAPH
+ 0xD6F3: 0x8CF4, //CJK UNIFIED IDEOGRAPH
+ 0xD6F4: 0x96F7, //CJK UNIFIED IDEOGRAPH
+ 0xD6F5: 0x4E86, //CJK UNIFIED IDEOGRAPH
+ 0xD6F6: 0x50DA, //CJK UNIFIED IDEOGRAPH
+ 0xD6F7: 0x5BEE, //CJK UNIFIED IDEOGRAPH
+ 0xD6F8: 0x5ED6, //CJK UNIFIED IDEOGRAPH
+ 0xD6F9: 0x6599, //CJK UNIFIED IDEOGRAPH
+ 0xD6FA: 0x71CE, //CJK UNIFIED IDEOGRAPH
+ 0xD6FB: 0x7642, //CJK UNIFIED IDEOGRAPH
+ 0xD6FC: 0x77AD, //CJK UNIFIED IDEOGRAPH
+ 0xD6FD: 0x804A, //CJK UNIFIED IDEOGRAPH
+ 0xD6FE: 0x84FC, //CJK UNIFIED IDEOGRAPH
+ 0xD7A1: 0x907C, //CJK UNIFIED IDEOGRAPH
+ 0xD7A2: 0x9B27, //CJK UNIFIED IDEOGRAPH
+ 0xD7A3: 0x9F8D, //CJK UNIFIED IDEOGRAPH
+ 0xD7A4: 0x58D8, //CJK UNIFIED IDEOGRAPH
+ 0xD7A5: 0x5A41, //CJK UNIFIED IDEOGRAPH
+ 0xD7A6: 0x5C62, //CJK UNIFIED IDEOGRAPH
+ 0xD7A7: 0x6A13, //CJK UNIFIED IDEOGRAPH
+ 0xD7A8: 0x6DDA, //CJK UNIFIED IDEOGRAPH
+ 0xD7A9: 0x6F0F, //CJK UNIFIED IDEOGRAPH
+ 0xD7AA: 0x763B, //CJK UNIFIED IDEOGRAPH
+ 0xD7AB: 0x7D2F, //CJK UNIFIED IDEOGRAPH
+ 0xD7AC: 0x7E37, //CJK UNIFIED IDEOGRAPH
+ 0xD7AD: 0x851E, //CJK UNIFIED IDEOGRAPH
+ 0xD7AE: 0x8938, //CJK UNIFIED IDEOGRAPH
+ 0xD7AF: 0x93E4, //CJK UNIFIED IDEOGRAPH
+ 0xD7B0: 0x964B, //CJK UNIFIED IDEOGRAPH
+ 0xD7B1: 0x5289, //CJK UNIFIED IDEOGRAPH
+ 0xD7B2: 0x65D2, //CJK UNIFIED IDEOGRAPH
+ 0xD7B3: 0x67F3, //CJK UNIFIED IDEOGRAPH
+ 0xD7B4: 0x69B4, //CJK UNIFIED IDEOGRAPH
+ 0xD7B5: 0x6D41, //CJK UNIFIED IDEOGRAPH
+ 0xD7B6: 0x6E9C, //CJK UNIFIED IDEOGRAPH
+ 0xD7B7: 0x700F, //CJK UNIFIED IDEOGRAPH
+ 0xD7B8: 0x7409, //CJK UNIFIED IDEOGRAPH
+ 0xD7B9: 0x7460, //CJK UNIFIED IDEOGRAPH
+ 0xD7BA: 0x7559, //CJK UNIFIED IDEOGRAPH
+ 0xD7BB: 0x7624, //CJK UNIFIED IDEOGRAPH
+ 0xD7BC: 0x786B, //CJK UNIFIED IDEOGRAPH
+ 0xD7BD: 0x8B2C, //CJK UNIFIED IDEOGRAPH
+ 0xD7BE: 0x985E, //CJK UNIFIED IDEOGRAPH
+ 0xD7BF: 0x516D, //CJK UNIFIED IDEOGRAPH
+ 0xD7C0: 0x622E, //CJK UNIFIED IDEOGRAPH
+ 0xD7C1: 0x9678, //CJK UNIFIED IDEOGRAPH
+ 0xD7C2: 0x4F96, //CJK UNIFIED IDEOGRAPH
+ 0xD7C3: 0x502B, //CJK UNIFIED IDEOGRAPH
+ 0xD7C4: 0x5D19, //CJK UNIFIED IDEOGRAPH
+ 0xD7C5: 0x6DEA, //CJK UNIFIED IDEOGRAPH
+ 0xD7C6: 0x7DB8, //CJK UNIFIED IDEOGRAPH
+ 0xD7C7: 0x8F2A, //CJK UNIFIED IDEOGRAPH
+ 0xD7C8: 0x5F8B, //CJK UNIFIED IDEOGRAPH
+ 0xD7C9: 0x6144, //CJK UNIFIED IDEOGRAPH
+ 0xD7CA: 0x6817, //CJK UNIFIED IDEOGRAPH
+ 0xD7CB: 0xF961, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD7CC: 0x9686, //CJK UNIFIED IDEOGRAPH
+ 0xD7CD: 0x52D2, //CJK UNIFIED IDEOGRAPH
+ 0xD7CE: 0x808B, //CJK UNIFIED IDEOGRAPH
+ 0xD7CF: 0x51DC, //CJK UNIFIED IDEOGRAPH
+ 0xD7D0: 0x51CC, //CJK UNIFIED IDEOGRAPH
+ 0xD7D1: 0x695E, //CJK UNIFIED IDEOGRAPH
+ 0xD7D2: 0x7A1C, //CJK UNIFIED IDEOGRAPH
+ 0xD7D3: 0x7DBE, //CJK UNIFIED IDEOGRAPH
+ 0xD7D4: 0x83F1, //CJK UNIFIED IDEOGRAPH
+ 0xD7D5: 0x9675, //CJK UNIFIED IDEOGRAPH
+ 0xD7D6: 0x4FDA, //CJK UNIFIED IDEOGRAPH
+ 0xD7D7: 0x5229, //CJK UNIFIED IDEOGRAPH
+ 0xD7D8: 0x5398, //CJK UNIFIED IDEOGRAPH
+ 0xD7D9: 0x540F, //CJK UNIFIED IDEOGRAPH
+ 0xD7DA: 0x550E, //CJK UNIFIED IDEOGRAPH
+ 0xD7DB: 0x5C65, //CJK UNIFIED IDEOGRAPH
+ 0xD7DC: 0x60A7, //CJK UNIFIED IDEOGRAPH
+ 0xD7DD: 0x674E, //CJK UNIFIED IDEOGRAPH
+ 0xD7DE: 0x68A8, //CJK UNIFIED IDEOGRAPH
+ 0xD7DF: 0x6D6C, //CJK UNIFIED IDEOGRAPH
+ 0xD7E0: 0x7281, //CJK UNIFIED IDEOGRAPH
+ 0xD7E1: 0x72F8, //CJK UNIFIED IDEOGRAPH
+ 0xD7E2: 0x7406, //CJK UNIFIED IDEOGRAPH
+ 0xD7E3: 0x7483, //CJK UNIFIED IDEOGRAPH
+ 0xD7E4: 0xF962, //CJK COMPATIBILITY IDEOGRAPH
+ 0xD7E5: 0x75E2, //CJK UNIFIED IDEOGRAPH
+ 0xD7E6: 0x7C6C, //CJK UNIFIED IDEOGRAPH
+ 0xD7E7: 0x7F79, //CJK UNIFIED IDEOGRAPH
+ 0xD7E8: 0x7FB8, //CJK UNIFIED IDEOGRAPH
+ 0xD7E9: 0x8389, //CJK UNIFIED IDEOGRAPH
+ 0xD7EA: 0x88CF, //CJK UNIFIED IDEOGRAPH
+ 0xD7EB: 0x88E1, //CJK UNIFIED IDEOGRAPH
+ 0xD7EC: 0x91CC, //CJK UNIFIED IDEOGRAPH
+ 0xD7ED: 0x91D0, //CJK UNIFIED IDEOGRAPH
+ 0xD7EE: 0x96E2, //CJK UNIFIED IDEOGRAPH
+ 0xD7EF: 0x9BC9, //CJK UNIFIED IDEOGRAPH
+ 0xD7F0: 0x541D, //CJK UNIFIED IDEOGRAPH
+ 0xD7F1: 0x6F7E, //CJK UNIFIED IDEOGRAPH
+ 0xD7F2: 0x71D0, //CJK UNIFIED IDEOGRAPH
+ 0xD7F3: 0x7498, //CJK UNIFIED IDEOGRAPH
+ 0xD7F4: 0x85FA, //CJK UNIFIED IDEOGRAPH
+ 0xD7F5: 0x8EAA, //CJK UNIFIED IDEOGRAPH
+ 0xD7F6: 0x96A3, //CJK UNIFIED IDEOGRAPH
+ 0xD7F7: 0x9C57, //CJK UNIFIED IDEOGRAPH
+ 0xD7F8: 0x9E9F, //CJK UNIFIED IDEOGRAPH
+ 0xD7F9: 0x6797, //CJK UNIFIED IDEOGRAPH
+ 0xD7FA: 0x6DCB, //CJK UNIFIED IDEOGRAPH
+ 0xD7FB: 0x7433, //CJK UNIFIED IDEOGRAPH
+ 0xD7FC: 0x81E8, //CJK UNIFIED IDEOGRAPH
+ 0xD7FD: 0x9716, //CJK UNIFIED IDEOGRAPH
+ 0xD7FE: 0x782C, //CJK UNIFIED IDEOGRAPH
+ 0xD8A1: 0x7ACB, //CJK UNIFIED IDEOGRAPH
+ 0xD8A2: 0x7B20, //CJK UNIFIED IDEOGRAPH
+ 0xD8A3: 0x7C92, //CJK UNIFIED IDEOGRAPH
+ 0xD8A4: 0x6469, //CJK UNIFIED IDEOGRAPH
+ 0xD8A5: 0x746A, //CJK UNIFIED IDEOGRAPH
+ 0xD8A6: 0x75F2, //CJK UNIFIED IDEOGRAPH
+ 0xD8A7: 0x78BC, //CJK UNIFIED IDEOGRAPH
+ 0xD8A8: 0x78E8, //CJK UNIFIED IDEOGRAPH
+ 0xD8A9: 0x99AC, //CJK UNIFIED IDEOGRAPH
+ 0xD8AA: 0x9B54, //CJK UNIFIED IDEOGRAPH
+ 0xD8AB: 0x9EBB, //CJK UNIFIED IDEOGRAPH
+ 0xD8AC: 0x5BDE, //CJK UNIFIED IDEOGRAPH
+ 0xD8AD: 0x5E55, //CJK UNIFIED IDEOGRAPH
+ 0xD8AE: 0x6F20, //CJK UNIFIED IDEOGRAPH
+ 0xD8AF: 0x819C, //CJK UNIFIED IDEOGRAPH
+ 0xD8B0: 0x83AB, //CJK UNIFIED IDEOGRAPH
+ 0xD8B1: 0x9088, //CJK UNIFIED IDEOGRAPH
+ 0xD8B2: 0x4E07, //CJK UNIFIED IDEOGRAPH
+ 0xD8B3: 0x534D, //CJK UNIFIED IDEOGRAPH
+ 0xD8B4: 0x5A29, //CJK UNIFIED IDEOGRAPH
+ 0xD8B5: 0x5DD2, //CJK UNIFIED IDEOGRAPH
+ 0xD8B6: 0x5F4E, //CJK UNIFIED IDEOGRAPH
+ 0xD8B7: 0x6162, //CJK UNIFIED IDEOGRAPH
+ 0xD8B8: 0x633D, //CJK UNIFIED IDEOGRAPH
+ 0xD8B9: 0x6669, //CJK UNIFIED IDEOGRAPH
+ 0xD8BA: 0x66FC, //CJK UNIFIED IDEOGRAPH
+ 0xD8BB: 0x6EFF, //CJK UNIFIED IDEOGRAPH
+ 0xD8BC: 0x6F2B, //CJK UNIFIED IDEOGRAPH
+ 0xD8BD: 0x7063, //CJK UNIFIED IDEOGRAPH
+ 0xD8BE: 0x779E, //CJK UNIFIED IDEOGRAPH
+ 0xD8BF: 0x842C, //CJK UNIFIED IDEOGRAPH
+ 0xD8C0: 0x8513, //CJK UNIFIED IDEOGRAPH
+ 0xD8C1: 0x883B, //CJK UNIFIED IDEOGRAPH
+ 0xD8C2: 0x8F13, //CJK UNIFIED IDEOGRAPH
+ 0xD8C3: 0x9945, //CJK UNIFIED IDEOGRAPH
+ 0xD8C4: 0x9C3B, //CJK UNIFIED IDEOGRAPH
+ 0xD8C5: 0x551C, //CJK UNIFIED IDEOGRAPH
+ 0xD8C6: 0x62B9, //CJK UNIFIED IDEOGRAPH
+ 0xD8C7: 0x672B, //CJK UNIFIED IDEOGRAPH
+ 0xD8C8: 0x6CAB, //CJK UNIFIED IDEOGRAPH
+ 0xD8C9: 0x8309, //CJK UNIFIED IDEOGRAPH
+ 0xD8CA: 0x896A, //CJK UNIFIED IDEOGRAPH
+ 0xD8CB: 0x977A, //CJK UNIFIED IDEOGRAPH
+ 0xD8CC: 0x4EA1, //CJK UNIFIED IDEOGRAPH
+ 0xD8CD: 0x5984, //CJK UNIFIED IDEOGRAPH
+ 0xD8CE: 0x5FD8, //CJK UNIFIED IDEOGRAPH
+ 0xD8CF: 0x5FD9, //CJK UNIFIED IDEOGRAPH
+ 0xD8D0: 0x671B, //CJK UNIFIED IDEOGRAPH
+ 0xD8D1: 0x7DB2, //CJK UNIFIED IDEOGRAPH
+ 0xD8D2: 0x7F54, //CJK UNIFIED IDEOGRAPH
+ 0xD8D3: 0x8292, //CJK UNIFIED IDEOGRAPH
+ 0xD8D4: 0x832B, //CJK UNIFIED IDEOGRAPH
+ 0xD8D5: 0x83BD, //CJK UNIFIED IDEOGRAPH
+ 0xD8D6: 0x8F1E, //CJK UNIFIED IDEOGRAPH
+ 0xD8D7: 0x9099, //CJK UNIFIED IDEOGRAPH
+ 0xD8D8: 0x57CB, //CJK UNIFIED IDEOGRAPH
+ 0xD8D9: 0x59B9, //CJK UNIFIED IDEOGRAPH
+ 0xD8DA: 0x5A92, //CJK UNIFIED IDEOGRAPH
+ 0xD8DB: 0x5BD0, //CJK UNIFIED IDEOGRAPH
+ 0xD8DC: 0x6627, //CJK UNIFIED IDEOGRAPH
+ 0xD8DD: 0x679A, //CJK UNIFIED IDEOGRAPH
+ 0xD8DE: 0x6885, //CJK UNIFIED IDEOGRAPH
+ 0xD8DF: 0x6BCF, //CJK UNIFIED IDEOGRAPH
+ 0xD8E0: 0x7164, //CJK UNIFIED IDEOGRAPH
+ 0xD8E1: 0x7F75, //CJK UNIFIED IDEOGRAPH
+ 0xD8E2: 0x8CB7, //CJK UNIFIED IDEOGRAPH
+ 0xD8E3: 0x8CE3, //CJK UNIFIED IDEOGRAPH
+ 0xD8E4: 0x9081, //CJK UNIFIED IDEOGRAPH
+ 0xD8E5: 0x9B45, //CJK UNIFIED IDEOGRAPH
+ 0xD8E6: 0x8108, //CJK UNIFIED IDEOGRAPH
+ 0xD8E7: 0x8C8A, //CJK UNIFIED IDEOGRAPH
+ 0xD8E8: 0x964C, //CJK UNIFIED IDEOGRAPH
+ 0xD8E9: 0x9A40, //CJK UNIFIED IDEOGRAPH
+ 0xD8EA: 0x9EA5, //CJK UNIFIED IDEOGRAPH
+ 0xD8EB: 0x5B5F, //CJK UNIFIED IDEOGRAPH
+ 0xD8EC: 0x6C13, //CJK UNIFIED IDEOGRAPH
+ 0xD8ED: 0x731B, //CJK UNIFIED IDEOGRAPH
+ 0xD8EE: 0x76F2, //CJK UNIFIED IDEOGRAPH
+ 0xD8EF: 0x76DF, //CJK UNIFIED IDEOGRAPH
+ 0xD8F0: 0x840C, //CJK UNIFIED IDEOGRAPH
+ 0xD8F1: 0x51AA, //CJK UNIFIED IDEOGRAPH
+ 0xD8F2: 0x8993, //CJK UNIFIED IDEOGRAPH
+ 0xD8F3: 0x514D, //CJK UNIFIED IDEOGRAPH
+ 0xD8F4: 0x5195, //CJK UNIFIED IDEOGRAPH
+ 0xD8F5: 0x52C9, //CJK UNIFIED IDEOGRAPH
+ 0xD8F6: 0x68C9, //CJK UNIFIED IDEOGRAPH
+ 0xD8F7: 0x6C94, //CJK UNIFIED IDEOGRAPH
+ 0xD8F8: 0x7704, //CJK UNIFIED IDEOGRAPH
+ 0xD8F9: 0x7720, //CJK UNIFIED IDEOGRAPH
+ 0xD8FA: 0x7DBF, //CJK UNIFIED IDEOGRAPH
+ 0xD8FB: 0x7DEC, //CJK UNIFIED IDEOGRAPH
+ 0xD8FC: 0x9762, //CJK UNIFIED IDEOGRAPH
+ 0xD8FD: 0x9EB5, //CJK UNIFIED IDEOGRAPH
+ 0xD8FE: 0x6EC5, //CJK UNIFIED IDEOGRAPH
+ 0xD9A1: 0x8511, //CJK UNIFIED IDEOGRAPH
+ 0xD9A2: 0x51A5, //CJK UNIFIED IDEOGRAPH
+ 0xD9A3: 0x540D, //CJK UNIFIED IDEOGRAPH
+ 0xD9A4: 0x547D, //CJK UNIFIED IDEOGRAPH
+ 0xD9A5: 0x660E, //CJK UNIFIED IDEOGRAPH
+ 0xD9A6: 0x669D, //CJK UNIFIED IDEOGRAPH
+ 0xD9A7: 0x6927, //CJK UNIFIED IDEOGRAPH
+ 0xD9A8: 0x6E9F, //CJK UNIFIED IDEOGRAPH
+ 0xD9A9: 0x76BF, //CJK UNIFIED IDEOGRAPH
+ 0xD9AA: 0x7791, //CJK UNIFIED IDEOGRAPH
+ 0xD9AB: 0x8317, //CJK UNIFIED IDEOGRAPH
+ 0xD9AC: 0x84C2, //CJK UNIFIED IDEOGRAPH
+ 0xD9AD: 0x879F, //CJK UNIFIED IDEOGRAPH
+ 0xD9AE: 0x9169, //CJK UNIFIED IDEOGRAPH
+ 0xD9AF: 0x9298, //CJK UNIFIED IDEOGRAPH
+ 0xD9B0: 0x9CF4, //CJK UNIFIED IDEOGRAPH
+ 0xD9B1: 0x8882, //CJK UNIFIED IDEOGRAPH
+ 0xD9B2: 0x4FAE, //CJK UNIFIED IDEOGRAPH
+ 0xD9B3: 0x5192, //CJK UNIFIED IDEOGRAPH
+ 0xD9B4: 0x52DF, //CJK UNIFIED IDEOGRAPH
+ 0xD9B5: 0x59C6, //CJK UNIFIED IDEOGRAPH
+ 0xD9B6: 0x5E3D, //CJK UNIFIED IDEOGRAPH
+ 0xD9B7: 0x6155, //CJK UNIFIED IDEOGRAPH
+ 0xD9B8: 0x6478, //CJK UNIFIED IDEOGRAPH
+ 0xD9B9: 0x6479, //CJK UNIFIED IDEOGRAPH
+ 0xD9BA: 0x66AE, //CJK UNIFIED IDEOGRAPH
+ 0xD9BB: 0x67D0, //CJK UNIFIED IDEOGRAPH
+ 0xD9BC: 0x6A21, //CJK UNIFIED IDEOGRAPH
+ 0xD9BD: 0x6BCD, //CJK UNIFIED IDEOGRAPH
+ 0xD9BE: 0x6BDB, //CJK UNIFIED IDEOGRAPH
+ 0xD9BF: 0x725F, //CJK UNIFIED IDEOGRAPH
+ 0xD9C0: 0x7261, //CJK UNIFIED IDEOGRAPH
+ 0xD9C1: 0x7441, //CJK UNIFIED IDEOGRAPH
+ 0xD9C2: 0x7738, //CJK UNIFIED IDEOGRAPH
+ 0xD9C3: 0x77DB, //CJK UNIFIED IDEOGRAPH
+ 0xD9C4: 0x8017, //CJK UNIFIED IDEOGRAPH
+ 0xD9C5: 0x82BC, //CJK UNIFIED IDEOGRAPH
+ 0xD9C6: 0x8305, //CJK UNIFIED IDEOGRAPH
+ 0xD9C7: 0x8B00, //CJK UNIFIED IDEOGRAPH
+ 0xD9C8: 0x8B28, //CJK UNIFIED IDEOGRAPH
+ 0xD9C9: 0x8C8C, //CJK UNIFIED IDEOGRAPH
+ 0xD9CA: 0x6728, //CJK UNIFIED IDEOGRAPH
+ 0xD9CB: 0x6C90, //CJK UNIFIED IDEOGRAPH
+ 0xD9CC: 0x7267, //CJK UNIFIED IDEOGRAPH
+ 0xD9CD: 0x76EE, //CJK UNIFIED IDEOGRAPH
+ 0xD9CE: 0x7766, //CJK UNIFIED IDEOGRAPH
+ 0xD9CF: 0x7A46, //CJK UNIFIED IDEOGRAPH
+ 0xD9D0: 0x9DA9, //CJK UNIFIED IDEOGRAPH
+ 0xD9D1: 0x6B7F, //CJK UNIFIED IDEOGRAPH
+ 0xD9D2: 0x6C92, //CJK UNIFIED IDEOGRAPH
+ 0xD9D3: 0x5922, //CJK UNIFIED IDEOGRAPH
+ 0xD9D4: 0x6726, //CJK UNIFIED IDEOGRAPH
+ 0xD9D5: 0x8499, //CJK UNIFIED IDEOGRAPH
+ 0xD9D6: 0x536F, //CJK UNIFIED IDEOGRAPH
+ 0xD9D7: 0x5893, //CJK UNIFIED IDEOGRAPH
+ 0xD9D8: 0x5999, //CJK UNIFIED IDEOGRAPH
+ 0xD9D9: 0x5EDF, //CJK UNIFIED IDEOGRAPH
+ 0xD9DA: 0x63CF, //CJK UNIFIED IDEOGRAPH
+ 0xD9DB: 0x6634, //CJK UNIFIED IDEOGRAPH
+ 0xD9DC: 0x6773, //CJK UNIFIED IDEOGRAPH
+ 0xD9DD: 0x6E3A, //CJK UNIFIED IDEOGRAPH
+ 0xD9DE: 0x732B, //CJK UNIFIED IDEOGRAPH
+ 0xD9DF: 0x7AD7, //CJK UNIFIED IDEOGRAPH
+ 0xD9E0: 0x82D7, //CJK UNIFIED IDEOGRAPH
+ 0xD9E1: 0x9328, //CJK UNIFIED IDEOGRAPH
+ 0xD9E2: 0x52D9, //CJK UNIFIED IDEOGRAPH
+ 0xD9E3: 0x5DEB, //CJK UNIFIED IDEOGRAPH
+ 0xD9E4: 0x61AE, //CJK UNIFIED IDEOGRAPH
+ 0xD9E5: 0x61CB, //CJK UNIFIED IDEOGRAPH
+ 0xD9E6: 0x620A, //CJK UNIFIED IDEOGRAPH
+ 0xD9E7: 0x62C7, //CJK UNIFIED IDEOGRAPH
+ 0xD9E8: 0x64AB, //CJK UNIFIED IDEOGRAPH
+ 0xD9E9: 0x65E0, //CJK UNIFIED IDEOGRAPH
+ 0xD9EA: 0x6959, //CJK UNIFIED IDEOGRAPH
+ 0xD9EB: 0x6B66, //CJK UNIFIED IDEOGRAPH
+ 0xD9EC: 0x6BCB, //CJK UNIFIED IDEOGRAPH
+ 0xD9ED: 0x7121, //CJK UNIFIED IDEOGRAPH
+ 0xD9EE: 0x73F7, //CJK UNIFIED IDEOGRAPH
+ 0xD9EF: 0x755D, //CJK UNIFIED IDEOGRAPH
+ 0xD9F0: 0x7E46, //CJK UNIFIED IDEOGRAPH
+ 0xD9F1: 0x821E, //CJK UNIFIED IDEOGRAPH
+ 0xD9F2: 0x8302, //CJK UNIFIED IDEOGRAPH
+ 0xD9F3: 0x856A, //CJK UNIFIED IDEOGRAPH
+ 0xD9F4: 0x8AA3, //CJK UNIFIED IDEOGRAPH
+ 0xD9F5: 0x8CBF, //CJK UNIFIED IDEOGRAPH
+ 0xD9F6: 0x9727, //CJK UNIFIED IDEOGRAPH
+ 0xD9F7: 0x9D61, //CJK UNIFIED IDEOGRAPH
+ 0xD9F8: 0x58A8, //CJK UNIFIED IDEOGRAPH
+ 0xD9F9: 0x9ED8, //CJK UNIFIED IDEOGRAPH
+ 0xD9FA: 0x5011, //CJK UNIFIED IDEOGRAPH
+ 0xD9FB: 0x520E, //CJK UNIFIED IDEOGRAPH
+ 0xD9FC: 0x543B, //CJK UNIFIED IDEOGRAPH
+ 0xD9FD: 0x554F, //CJK UNIFIED IDEOGRAPH
+ 0xD9FE: 0x6587, //CJK UNIFIED IDEOGRAPH
+ 0xDAA1: 0x6C76, //CJK UNIFIED IDEOGRAPH
+ 0xDAA2: 0x7D0A, //CJK UNIFIED IDEOGRAPH
+ 0xDAA3: 0x7D0B, //CJK UNIFIED IDEOGRAPH
+ 0xDAA4: 0x805E, //CJK UNIFIED IDEOGRAPH
+ 0xDAA5: 0x868A, //CJK UNIFIED IDEOGRAPH
+ 0xDAA6: 0x9580, //CJK UNIFIED IDEOGRAPH
+ 0xDAA7: 0x96EF, //CJK UNIFIED IDEOGRAPH
+ 0xDAA8: 0x52FF, //CJK UNIFIED IDEOGRAPH
+ 0xDAA9: 0x6C95, //CJK UNIFIED IDEOGRAPH
+ 0xDAAA: 0x7269, //CJK UNIFIED IDEOGRAPH
+ 0xDAAB: 0x5473, //CJK UNIFIED IDEOGRAPH
+ 0xDAAC: 0x5A9A, //CJK UNIFIED IDEOGRAPH
+ 0xDAAD: 0x5C3E, //CJK UNIFIED IDEOGRAPH
+ 0xDAAE: 0x5D4B, //CJK UNIFIED IDEOGRAPH
+ 0xDAAF: 0x5F4C, //CJK UNIFIED IDEOGRAPH
+ 0xDAB0: 0x5FAE, //CJK UNIFIED IDEOGRAPH
+ 0xDAB1: 0x672A, //CJK UNIFIED IDEOGRAPH
+ 0xDAB2: 0x68B6, //CJK UNIFIED IDEOGRAPH
+ 0xDAB3: 0x6963, //CJK UNIFIED IDEOGRAPH
+ 0xDAB4: 0x6E3C, //CJK UNIFIED IDEOGRAPH
+ 0xDAB5: 0x6E44, //CJK UNIFIED IDEOGRAPH
+ 0xDAB6: 0x7709, //CJK UNIFIED IDEOGRAPH
+ 0xDAB7: 0x7C73, //CJK UNIFIED IDEOGRAPH
+ 0xDAB8: 0x7F8E, //CJK UNIFIED IDEOGRAPH
+ 0xDAB9: 0x8587, //CJK UNIFIED IDEOGRAPH
+ 0xDABA: 0x8B0E, //CJK UNIFIED IDEOGRAPH
+ 0xDABB: 0x8FF7, //CJK UNIFIED IDEOGRAPH
+ 0xDABC: 0x9761, //CJK UNIFIED IDEOGRAPH
+ 0xDABD: 0x9EF4, //CJK UNIFIED IDEOGRAPH
+ 0xDABE: 0x5CB7, //CJK UNIFIED IDEOGRAPH
+ 0xDABF: 0x60B6, //CJK UNIFIED IDEOGRAPH
+ 0xDAC0: 0x610D, //CJK UNIFIED IDEOGRAPH
+ 0xDAC1: 0x61AB, //CJK UNIFIED IDEOGRAPH
+ 0xDAC2: 0x654F, //CJK UNIFIED IDEOGRAPH
+ 0xDAC3: 0x65FB, //CJK UNIFIED IDEOGRAPH
+ 0xDAC4: 0x65FC, //CJK UNIFIED IDEOGRAPH
+ 0xDAC5: 0x6C11, //CJK UNIFIED IDEOGRAPH
+ 0xDAC6: 0x6CEF, //CJK UNIFIED IDEOGRAPH
+ 0xDAC7: 0x739F, //CJK UNIFIED IDEOGRAPH
+ 0xDAC8: 0x73C9, //CJK UNIFIED IDEOGRAPH
+ 0xDAC9: 0x7DE1, //CJK UNIFIED IDEOGRAPH
+ 0xDACA: 0x9594, //CJK UNIFIED IDEOGRAPH
+ 0xDACB: 0x5BC6, //CJK UNIFIED IDEOGRAPH
+ 0xDACC: 0x871C, //CJK UNIFIED IDEOGRAPH
+ 0xDACD: 0x8B10, //CJK UNIFIED IDEOGRAPH
+ 0xDACE: 0x525D, //CJK UNIFIED IDEOGRAPH
+ 0xDACF: 0x535A, //CJK UNIFIED IDEOGRAPH
+ 0xDAD0: 0x62CD, //CJK UNIFIED IDEOGRAPH
+ 0xDAD1: 0x640F, //CJK UNIFIED IDEOGRAPH
+ 0xDAD2: 0x64B2, //CJK UNIFIED IDEOGRAPH
+ 0xDAD3: 0x6734, //CJK UNIFIED IDEOGRAPH
+ 0xDAD4: 0x6A38, //CJK UNIFIED IDEOGRAPH
+ 0xDAD5: 0x6CCA, //CJK UNIFIED IDEOGRAPH
+ 0xDAD6: 0x73C0, //CJK UNIFIED IDEOGRAPH
+ 0xDAD7: 0x749E, //CJK UNIFIED IDEOGRAPH
+ 0xDAD8: 0x7B94, //CJK UNIFIED IDEOGRAPH
+ 0xDAD9: 0x7C95, //CJK UNIFIED IDEOGRAPH
+ 0xDADA: 0x7E1B, //CJK UNIFIED IDEOGRAPH
+ 0xDADB: 0x818A, //CJK UNIFIED IDEOGRAPH
+ 0xDADC: 0x8236, //CJK UNIFIED IDEOGRAPH
+ 0xDADD: 0x8584, //CJK UNIFIED IDEOGRAPH
+ 0xDADE: 0x8FEB, //CJK UNIFIED IDEOGRAPH
+ 0xDADF: 0x96F9, //CJK UNIFIED IDEOGRAPH
+ 0xDAE0: 0x99C1, //CJK UNIFIED IDEOGRAPH
+ 0xDAE1: 0x4F34, //CJK UNIFIED IDEOGRAPH
+ 0xDAE2: 0x534A, //CJK UNIFIED IDEOGRAPH
+ 0xDAE3: 0x53CD, //CJK UNIFIED IDEOGRAPH
+ 0xDAE4: 0x53DB, //CJK UNIFIED IDEOGRAPH
+ 0xDAE5: 0x62CC, //CJK UNIFIED IDEOGRAPH
+ 0xDAE6: 0x642C, //CJK UNIFIED IDEOGRAPH
+ 0xDAE7: 0x6500, //CJK UNIFIED IDEOGRAPH
+ 0xDAE8: 0x6591, //CJK UNIFIED IDEOGRAPH
+ 0xDAE9: 0x69C3, //CJK UNIFIED IDEOGRAPH
+ 0xDAEA: 0x6CEE, //CJK UNIFIED IDEOGRAPH
+ 0xDAEB: 0x6F58, //CJK UNIFIED IDEOGRAPH
+ 0xDAEC: 0x73ED, //CJK UNIFIED IDEOGRAPH
+ 0xDAED: 0x7554, //CJK UNIFIED IDEOGRAPH
+ 0xDAEE: 0x7622, //CJK UNIFIED IDEOGRAPH
+ 0xDAEF: 0x76E4, //CJK UNIFIED IDEOGRAPH
+ 0xDAF0: 0x76FC, //CJK UNIFIED IDEOGRAPH
+ 0xDAF1: 0x78D0, //CJK UNIFIED IDEOGRAPH
+ 0xDAF2: 0x78FB, //CJK UNIFIED IDEOGRAPH
+ 0xDAF3: 0x792C, //CJK UNIFIED IDEOGRAPH
+ 0xDAF4: 0x7D46, //CJK UNIFIED IDEOGRAPH
+ 0xDAF5: 0x822C, //CJK UNIFIED IDEOGRAPH
+ 0xDAF6: 0x87E0, //CJK UNIFIED IDEOGRAPH
+ 0xDAF7: 0x8FD4, //CJK UNIFIED IDEOGRAPH
+ 0xDAF8: 0x9812, //CJK UNIFIED IDEOGRAPH
+ 0xDAF9: 0x98EF, //CJK UNIFIED IDEOGRAPH
+ 0xDAFA: 0x52C3, //CJK UNIFIED IDEOGRAPH
+ 0xDAFB: 0x62D4, //CJK UNIFIED IDEOGRAPH
+ 0xDAFC: 0x64A5, //CJK UNIFIED IDEOGRAPH
+ 0xDAFD: 0x6E24, //CJK UNIFIED IDEOGRAPH
+ 0xDAFE: 0x6F51, //CJK UNIFIED IDEOGRAPH
+ 0xDBA1: 0x767C, //CJK UNIFIED IDEOGRAPH
+ 0xDBA2: 0x8DCB, //CJK UNIFIED IDEOGRAPH
+ 0xDBA3: 0x91B1, //CJK UNIFIED IDEOGRAPH
+ 0xDBA4: 0x9262, //CJK UNIFIED IDEOGRAPH
+ 0xDBA5: 0x9AEE, //CJK UNIFIED IDEOGRAPH
+ 0xDBA6: 0x9B43, //CJK UNIFIED IDEOGRAPH
+ 0xDBA7: 0x5023, //CJK UNIFIED IDEOGRAPH
+ 0xDBA8: 0x508D, //CJK UNIFIED IDEOGRAPH
+ 0xDBA9: 0x574A, //CJK UNIFIED IDEOGRAPH
+ 0xDBAA: 0x59A8, //CJK UNIFIED IDEOGRAPH
+ 0xDBAB: 0x5C28, //CJK UNIFIED IDEOGRAPH
+ 0xDBAC: 0x5E47, //CJK UNIFIED IDEOGRAPH
+ 0xDBAD: 0x5F77, //CJK UNIFIED IDEOGRAPH
+ 0xDBAE: 0x623F, //CJK UNIFIED IDEOGRAPH
+ 0xDBAF: 0x653E, //CJK UNIFIED IDEOGRAPH
+ 0xDBB0: 0x65B9, //CJK UNIFIED IDEOGRAPH
+ 0xDBB1: 0x65C1, //CJK UNIFIED IDEOGRAPH
+ 0xDBB2: 0x6609, //CJK UNIFIED IDEOGRAPH
+ 0xDBB3: 0x678B, //CJK UNIFIED IDEOGRAPH
+ 0xDBB4: 0x699C, //CJK UNIFIED IDEOGRAPH
+ 0xDBB5: 0x6EC2, //CJK UNIFIED IDEOGRAPH
+ 0xDBB6: 0x78C5, //CJK UNIFIED IDEOGRAPH
+ 0xDBB7: 0x7D21, //CJK UNIFIED IDEOGRAPH
+ 0xDBB8: 0x80AA, //CJK UNIFIED IDEOGRAPH
+ 0xDBB9: 0x8180, //CJK UNIFIED IDEOGRAPH
+ 0xDBBA: 0x822B, //CJK UNIFIED IDEOGRAPH
+ 0xDBBB: 0x82B3, //CJK UNIFIED IDEOGRAPH
+ 0xDBBC: 0x84A1, //CJK UNIFIED IDEOGRAPH
+ 0xDBBD: 0x868C, //CJK UNIFIED IDEOGRAPH
+ 0xDBBE: 0x8A2A, //CJK UNIFIED IDEOGRAPH
+ 0xDBBF: 0x8B17, //CJK UNIFIED IDEOGRAPH
+ 0xDBC0: 0x90A6, //CJK UNIFIED IDEOGRAPH
+ 0xDBC1: 0x9632, //CJK UNIFIED IDEOGRAPH
+ 0xDBC2: 0x9F90, //CJK UNIFIED IDEOGRAPH
+ 0xDBC3: 0x500D, //CJK UNIFIED IDEOGRAPH
+ 0xDBC4: 0x4FF3, //CJK UNIFIED IDEOGRAPH
+ 0xDBC5: 0xF963, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDBC6: 0x57F9, //CJK UNIFIED IDEOGRAPH
+ 0xDBC7: 0x5F98, //CJK UNIFIED IDEOGRAPH
+ 0xDBC8: 0x62DC, //CJK UNIFIED IDEOGRAPH
+ 0xDBC9: 0x6392, //CJK UNIFIED IDEOGRAPH
+ 0xDBCA: 0x676F, //CJK UNIFIED IDEOGRAPH
+ 0xDBCB: 0x6E43, //CJK UNIFIED IDEOGRAPH
+ 0xDBCC: 0x7119, //CJK UNIFIED IDEOGRAPH
+ 0xDBCD: 0x76C3, //CJK UNIFIED IDEOGRAPH
+ 0xDBCE: 0x80CC, //CJK UNIFIED IDEOGRAPH
+ 0xDBCF: 0x80DA, //CJK UNIFIED IDEOGRAPH
+ 0xDBD0: 0x88F4, //CJK UNIFIED IDEOGRAPH
+ 0xDBD1: 0x88F5, //CJK UNIFIED IDEOGRAPH
+ 0xDBD2: 0x8919, //CJK UNIFIED IDEOGRAPH
+ 0xDBD3: 0x8CE0, //CJK UNIFIED IDEOGRAPH
+ 0xDBD4: 0x8F29, //CJK UNIFIED IDEOGRAPH
+ 0xDBD5: 0x914D, //CJK UNIFIED IDEOGRAPH
+ 0xDBD6: 0x966A, //CJK UNIFIED IDEOGRAPH
+ 0xDBD7: 0x4F2F, //CJK UNIFIED IDEOGRAPH
+ 0xDBD8: 0x4F70, //CJK UNIFIED IDEOGRAPH
+ 0xDBD9: 0x5E1B, //CJK UNIFIED IDEOGRAPH
+ 0xDBDA: 0x67CF, //CJK UNIFIED IDEOGRAPH
+ 0xDBDB: 0x6822, //CJK UNIFIED IDEOGRAPH
+ 0xDBDC: 0x767D, //CJK UNIFIED IDEOGRAPH
+ 0xDBDD: 0x767E, //CJK UNIFIED IDEOGRAPH
+ 0xDBDE: 0x9B44, //CJK UNIFIED IDEOGRAPH
+ 0xDBDF: 0x5E61, //CJK UNIFIED IDEOGRAPH
+ 0xDBE0: 0x6A0A, //CJK UNIFIED IDEOGRAPH
+ 0xDBE1: 0x7169, //CJK UNIFIED IDEOGRAPH
+ 0xDBE2: 0x71D4, //CJK UNIFIED IDEOGRAPH
+ 0xDBE3: 0x756A, //CJK UNIFIED IDEOGRAPH
+ 0xDBE4: 0xF964, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDBE5: 0x7E41, //CJK UNIFIED IDEOGRAPH
+ 0xDBE6: 0x8543, //CJK UNIFIED IDEOGRAPH
+ 0xDBE7: 0x85E9, //CJK UNIFIED IDEOGRAPH
+ 0xDBE8: 0x98DC, //CJK UNIFIED IDEOGRAPH
+ 0xDBE9: 0x4F10, //CJK UNIFIED IDEOGRAPH
+ 0xDBEA: 0x7B4F, //CJK UNIFIED IDEOGRAPH
+ 0xDBEB: 0x7F70, //CJK UNIFIED IDEOGRAPH
+ 0xDBEC: 0x95A5, //CJK UNIFIED IDEOGRAPH
+ 0xDBED: 0x51E1, //CJK UNIFIED IDEOGRAPH
+ 0xDBEE: 0x5E06, //CJK UNIFIED IDEOGRAPH
+ 0xDBEF: 0x68B5, //CJK UNIFIED IDEOGRAPH
+ 0xDBF0: 0x6C3E, //CJK UNIFIED IDEOGRAPH
+ 0xDBF1: 0x6C4E, //CJK UNIFIED IDEOGRAPH
+ 0xDBF2: 0x6CDB, //CJK UNIFIED IDEOGRAPH
+ 0xDBF3: 0x72AF, //CJK UNIFIED IDEOGRAPH
+ 0xDBF4: 0x7BC4, //CJK UNIFIED IDEOGRAPH
+ 0xDBF5: 0x8303, //CJK UNIFIED IDEOGRAPH
+ 0xDBF6: 0x6CD5, //CJK UNIFIED IDEOGRAPH
+ 0xDBF7: 0x743A, //CJK UNIFIED IDEOGRAPH
+ 0xDBF8: 0x50FB, //CJK UNIFIED IDEOGRAPH
+ 0xDBF9: 0x5288, //CJK UNIFIED IDEOGRAPH
+ 0xDBFA: 0x58C1, //CJK UNIFIED IDEOGRAPH
+ 0xDBFB: 0x64D8, //CJK UNIFIED IDEOGRAPH
+ 0xDBFC: 0x6A97, //CJK UNIFIED IDEOGRAPH
+ 0xDBFD: 0x74A7, //CJK UNIFIED IDEOGRAPH
+ 0xDBFE: 0x7656, //CJK UNIFIED IDEOGRAPH
+ 0xDCA1: 0x78A7, //CJK UNIFIED IDEOGRAPH
+ 0xDCA2: 0x8617, //CJK UNIFIED IDEOGRAPH
+ 0xDCA3: 0x95E2, //CJK UNIFIED IDEOGRAPH
+ 0xDCA4: 0x9739, //CJK UNIFIED IDEOGRAPH
+ 0xDCA5: 0xF965, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDCA6: 0x535E, //CJK UNIFIED IDEOGRAPH
+ 0xDCA7: 0x5F01, //CJK UNIFIED IDEOGRAPH
+ 0xDCA8: 0x8B8A, //CJK UNIFIED IDEOGRAPH
+ 0xDCA9: 0x8FA8, //CJK UNIFIED IDEOGRAPH
+ 0xDCAA: 0x8FAF, //CJK UNIFIED IDEOGRAPH
+ 0xDCAB: 0x908A, //CJK UNIFIED IDEOGRAPH
+ 0xDCAC: 0x5225, //CJK UNIFIED IDEOGRAPH
+ 0xDCAD: 0x77A5, //CJK UNIFIED IDEOGRAPH
+ 0xDCAE: 0x9C49, //CJK UNIFIED IDEOGRAPH
+ 0xDCAF: 0x9F08, //CJK UNIFIED IDEOGRAPH
+ 0xDCB0: 0x4E19, //CJK UNIFIED IDEOGRAPH
+ 0xDCB1: 0x5002, //CJK UNIFIED IDEOGRAPH
+ 0xDCB2: 0x5175, //CJK UNIFIED IDEOGRAPH
+ 0xDCB3: 0x5C5B, //CJK UNIFIED IDEOGRAPH
+ 0xDCB4: 0x5E77, //CJK UNIFIED IDEOGRAPH
+ 0xDCB5: 0x661E, //CJK UNIFIED IDEOGRAPH
+ 0xDCB6: 0x663A, //CJK UNIFIED IDEOGRAPH
+ 0xDCB7: 0x67C4, //CJK UNIFIED IDEOGRAPH
+ 0xDCB8: 0x68C5, //CJK UNIFIED IDEOGRAPH
+ 0xDCB9: 0x70B3, //CJK UNIFIED IDEOGRAPH
+ 0xDCBA: 0x7501, //CJK UNIFIED IDEOGRAPH
+ 0xDCBB: 0x75C5, //CJK UNIFIED IDEOGRAPH
+ 0xDCBC: 0x79C9, //CJK UNIFIED IDEOGRAPH
+ 0xDCBD: 0x7ADD, //CJK UNIFIED IDEOGRAPH
+ 0xDCBE: 0x8F27, //CJK UNIFIED IDEOGRAPH
+ 0xDCBF: 0x9920, //CJK UNIFIED IDEOGRAPH
+ 0xDCC0: 0x9A08, //CJK UNIFIED IDEOGRAPH
+ 0xDCC1: 0x4FDD, //CJK UNIFIED IDEOGRAPH
+ 0xDCC2: 0x5821, //CJK UNIFIED IDEOGRAPH
+ 0xDCC3: 0x5831, //CJK UNIFIED IDEOGRAPH
+ 0xDCC4: 0x5BF6, //CJK UNIFIED IDEOGRAPH
+ 0xDCC5: 0x666E, //CJK UNIFIED IDEOGRAPH
+ 0xDCC6: 0x6B65, //CJK UNIFIED IDEOGRAPH
+ 0xDCC7: 0x6D11, //CJK UNIFIED IDEOGRAPH
+ 0xDCC8: 0x6E7A, //CJK UNIFIED IDEOGRAPH
+ 0xDCC9: 0x6F7D, //CJK UNIFIED IDEOGRAPH
+ 0xDCCA: 0x73E4, //CJK UNIFIED IDEOGRAPH
+ 0xDCCB: 0x752B, //CJK UNIFIED IDEOGRAPH
+ 0xDCCC: 0x83E9, //CJK UNIFIED IDEOGRAPH
+ 0xDCCD: 0x88DC, //CJK UNIFIED IDEOGRAPH
+ 0xDCCE: 0x8913, //CJK UNIFIED IDEOGRAPH
+ 0xDCCF: 0x8B5C, //CJK UNIFIED IDEOGRAPH
+ 0xDCD0: 0x8F14, //CJK UNIFIED IDEOGRAPH
+ 0xDCD1: 0x4F0F, //CJK UNIFIED IDEOGRAPH
+ 0xDCD2: 0x50D5, //CJK UNIFIED IDEOGRAPH
+ 0xDCD3: 0x5310, //CJK UNIFIED IDEOGRAPH
+ 0xDCD4: 0x535C, //CJK UNIFIED IDEOGRAPH
+ 0xDCD5: 0x5B93, //CJK UNIFIED IDEOGRAPH
+ 0xDCD6: 0x5FA9, //CJK UNIFIED IDEOGRAPH
+ 0xDCD7: 0x670D, //CJK UNIFIED IDEOGRAPH
+ 0xDCD8: 0x798F, //CJK UNIFIED IDEOGRAPH
+ 0xDCD9: 0x8179, //CJK UNIFIED IDEOGRAPH
+ 0xDCDA: 0x832F, //CJK UNIFIED IDEOGRAPH
+ 0xDCDB: 0x8514, //CJK UNIFIED IDEOGRAPH
+ 0xDCDC: 0x8907, //CJK UNIFIED IDEOGRAPH
+ 0xDCDD: 0x8986, //CJK UNIFIED IDEOGRAPH
+ 0xDCDE: 0x8F39, //CJK UNIFIED IDEOGRAPH
+ 0xDCDF: 0x8F3B, //CJK UNIFIED IDEOGRAPH
+ 0xDCE0: 0x99A5, //CJK UNIFIED IDEOGRAPH
+ 0xDCE1: 0x9C12, //CJK UNIFIED IDEOGRAPH
+ 0xDCE2: 0x672C, //CJK UNIFIED IDEOGRAPH
+ 0xDCE3: 0x4E76, //CJK UNIFIED IDEOGRAPH
+ 0xDCE4: 0x4FF8, //CJK UNIFIED IDEOGRAPH
+ 0xDCE5: 0x5949, //CJK UNIFIED IDEOGRAPH
+ 0xDCE6: 0x5C01, //CJK UNIFIED IDEOGRAPH
+ 0xDCE7: 0x5CEF, //CJK UNIFIED IDEOGRAPH
+ 0xDCE8: 0x5CF0, //CJK UNIFIED IDEOGRAPH
+ 0xDCE9: 0x6367, //CJK UNIFIED IDEOGRAPH
+ 0xDCEA: 0x68D2, //CJK UNIFIED IDEOGRAPH
+ 0xDCEB: 0x70FD, //CJK UNIFIED IDEOGRAPH
+ 0xDCEC: 0x71A2, //CJK UNIFIED IDEOGRAPH
+ 0xDCED: 0x742B, //CJK UNIFIED IDEOGRAPH
+ 0xDCEE: 0x7E2B, //CJK UNIFIED IDEOGRAPH
+ 0xDCEF: 0x84EC, //CJK UNIFIED IDEOGRAPH
+ 0xDCF0: 0x8702, //CJK UNIFIED IDEOGRAPH
+ 0xDCF1: 0x9022, //CJK UNIFIED IDEOGRAPH
+ 0xDCF2: 0x92D2, //CJK UNIFIED IDEOGRAPH
+ 0xDCF3: 0x9CF3, //CJK UNIFIED IDEOGRAPH
+ 0xDCF4: 0x4E0D, //CJK UNIFIED IDEOGRAPH
+ 0xDCF5: 0x4ED8, //CJK UNIFIED IDEOGRAPH
+ 0xDCF6: 0x4FEF, //CJK UNIFIED IDEOGRAPH
+ 0xDCF7: 0x5085, //CJK UNIFIED IDEOGRAPH
+ 0xDCF8: 0x5256, //CJK UNIFIED IDEOGRAPH
+ 0xDCF9: 0x526F, //CJK UNIFIED IDEOGRAPH
+ 0xDCFA: 0x5426, //CJK UNIFIED IDEOGRAPH
+ 0xDCFB: 0x5490, //CJK UNIFIED IDEOGRAPH
+ 0xDCFC: 0x57E0, //CJK UNIFIED IDEOGRAPH
+ 0xDCFD: 0x592B, //CJK UNIFIED IDEOGRAPH
+ 0xDCFE: 0x5A66, //CJK UNIFIED IDEOGRAPH
+ 0xDDA1: 0x5B5A, //CJK UNIFIED IDEOGRAPH
+ 0xDDA2: 0x5B75, //CJK UNIFIED IDEOGRAPH
+ 0xDDA3: 0x5BCC, //CJK UNIFIED IDEOGRAPH
+ 0xDDA4: 0x5E9C, //CJK UNIFIED IDEOGRAPH
+ 0xDDA5: 0xF966, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDDA6: 0x6276, //CJK UNIFIED IDEOGRAPH
+ 0xDDA7: 0x6577, //CJK UNIFIED IDEOGRAPH
+ 0xDDA8: 0x65A7, //CJK UNIFIED IDEOGRAPH
+ 0xDDA9: 0x6D6E, //CJK UNIFIED IDEOGRAPH
+ 0xDDAA: 0x6EA5, //CJK UNIFIED IDEOGRAPH
+ 0xDDAB: 0x7236, //CJK UNIFIED IDEOGRAPH
+ 0xDDAC: 0x7B26, //CJK UNIFIED IDEOGRAPH
+ 0xDDAD: 0x7C3F, //CJK UNIFIED IDEOGRAPH
+ 0xDDAE: 0x7F36, //CJK UNIFIED IDEOGRAPH
+ 0xDDAF: 0x8150, //CJK UNIFIED IDEOGRAPH
+ 0xDDB0: 0x8151, //CJK UNIFIED IDEOGRAPH
+ 0xDDB1: 0x819A, //CJK UNIFIED IDEOGRAPH
+ 0xDDB2: 0x8240, //CJK UNIFIED IDEOGRAPH
+ 0xDDB3: 0x8299, //CJK UNIFIED IDEOGRAPH
+ 0xDDB4: 0x83A9, //CJK UNIFIED IDEOGRAPH
+ 0xDDB5: 0x8A03, //CJK UNIFIED IDEOGRAPH
+ 0xDDB6: 0x8CA0, //CJK UNIFIED IDEOGRAPH
+ 0xDDB7: 0x8CE6, //CJK UNIFIED IDEOGRAPH
+ 0xDDB8: 0x8CFB, //CJK UNIFIED IDEOGRAPH
+ 0xDDB9: 0x8D74, //CJK UNIFIED IDEOGRAPH
+ 0xDDBA: 0x8DBA, //CJK UNIFIED IDEOGRAPH
+ 0xDDBB: 0x90E8, //CJK UNIFIED IDEOGRAPH
+ 0xDDBC: 0x91DC, //CJK UNIFIED IDEOGRAPH
+ 0xDDBD: 0x961C, //CJK UNIFIED IDEOGRAPH
+ 0xDDBE: 0x9644, //CJK UNIFIED IDEOGRAPH
+ 0xDDBF: 0x99D9, //CJK UNIFIED IDEOGRAPH
+ 0xDDC0: 0x9CE7, //CJK UNIFIED IDEOGRAPH
+ 0xDDC1: 0x5317, //CJK UNIFIED IDEOGRAPH
+ 0xDDC2: 0x5206, //CJK UNIFIED IDEOGRAPH
+ 0xDDC3: 0x5429, //CJK UNIFIED IDEOGRAPH
+ 0xDDC4: 0x5674, //CJK UNIFIED IDEOGRAPH
+ 0xDDC5: 0x58B3, //CJK UNIFIED IDEOGRAPH
+ 0xDDC6: 0x5954, //CJK UNIFIED IDEOGRAPH
+ 0xDDC7: 0x596E, //CJK UNIFIED IDEOGRAPH
+ 0xDDC8: 0x5FFF, //CJK UNIFIED IDEOGRAPH
+ 0xDDC9: 0x61A4, //CJK UNIFIED IDEOGRAPH
+ 0xDDCA: 0x626E, //CJK UNIFIED IDEOGRAPH
+ 0xDDCB: 0x6610, //CJK UNIFIED IDEOGRAPH
+ 0xDDCC: 0x6C7E, //CJK UNIFIED IDEOGRAPH
+ 0xDDCD: 0x711A, //CJK UNIFIED IDEOGRAPH
+ 0xDDCE: 0x76C6, //CJK UNIFIED IDEOGRAPH
+ 0xDDCF: 0x7C89, //CJK UNIFIED IDEOGRAPH
+ 0xDDD0: 0x7CDE, //CJK UNIFIED IDEOGRAPH
+ 0xDDD1: 0x7D1B, //CJK UNIFIED IDEOGRAPH
+ 0xDDD2: 0x82AC, //CJK UNIFIED IDEOGRAPH
+ 0xDDD3: 0x8CC1, //CJK UNIFIED IDEOGRAPH
+ 0xDDD4: 0x96F0, //CJK UNIFIED IDEOGRAPH
+ 0xDDD5: 0xF967, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDDD6: 0x4F5B, //CJK UNIFIED IDEOGRAPH
+ 0xDDD7: 0x5F17, //CJK UNIFIED IDEOGRAPH
+ 0xDDD8: 0x5F7F, //CJK UNIFIED IDEOGRAPH
+ 0xDDD9: 0x62C2, //CJK UNIFIED IDEOGRAPH
+ 0xDDDA: 0x5D29, //CJK UNIFIED IDEOGRAPH
+ 0xDDDB: 0x670B, //CJK UNIFIED IDEOGRAPH
+ 0xDDDC: 0x68DA, //CJK UNIFIED IDEOGRAPH
+ 0xDDDD: 0x787C, //CJK UNIFIED IDEOGRAPH
+ 0xDDDE: 0x7E43, //CJK UNIFIED IDEOGRAPH
+ 0xDDDF: 0x9D6C, //CJK UNIFIED IDEOGRAPH
+ 0xDDE0: 0x4E15, //CJK UNIFIED IDEOGRAPH
+ 0xDDE1: 0x5099, //CJK UNIFIED IDEOGRAPH
+ 0xDDE2: 0x5315, //CJK UNIFIED IDEOGRAPH
+ 0xDDE3: 0x532A, //CJK UNIFIED IDEOGRAPH
+ 0xDDE4: 0x5351, //CJK UNIFIED IDEOGRAPH
+ 0xDDE5: 0x5983, //CJK UNIFIED IDEOGRAPH
+ 0xDDE6: 0x5A62, //CJK UNIFIED IDEOGRAPH
+ 0xDDE7: 0x5E87, //CJK UNIFIED IDEOGRAPH
+ 0xDDE8: 0x60B2, //CJK UNIFIED IDEOGRAPH
+ 0xDDE9: 0x618A, //CJK UNIFIED IDEOGRAPH
+ 0xDDEA: 0x6249, //CJK UNIFIED IDEOGRAPH
+ 0xDDEB: 0x6279, //CJK UNIFIED IDEOGRAPH
+ 0xDDEC: 0x6590, //CJK UNIFIED IDEOGRAPH
+ 0xDDED: 0x6787, //CJK UNIFIED IDEOGRAPH
+ 0xDDEE: 0x69A7, //CJK UNIFIED IDEOGRAPH
+ 0xDDEF: 0x6BD4, //CJK UNIFIED IDEOGRAPH
+ 0xDDF0: 0x6BD6, //CJK UNIFIED IDEOGRAPH
+ 0xDDF1: 0x6BD7, //CJK UNIFIED IDEOGRAPH
+ 0xDDF2: 0x6BD8, //CJK UNIFIED IDEOGRAPH
+ 0xDDF3: 0x6CB8, //CJK UNIFIED IDEOGRAPH
+ 0xDDF4: 0xF968, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDDF5: 0x7435, //CJK UNIFIED IDEOGRAPH
+ 0xDDF6: 0x75FA, //CJK UNIFIED IDEOGRAPH
+ 0xDDF7: 0x7812, //CJK UNIFIED IDEOGRAPH
+ 0xDDF8: 0x7891, //CJK UNIFIED IDEOGRAPH
+ 0xDDF9: 0x79D5, //CJK UNIFIED IDEOGRAPH
+ 0xDDFA: 0x79D8, //CJK UNIFIED IDEOGRAPH
+ 0xDDFB: 0x7C83, //CJK UNIFIED IDEOGRAPH
+ 0xDDFC: 0x7DCB, //CJK UNIFIED IDEOGRAPH
+ 0xDDFD: 0x7FE1, //CJK UNIFIED IDEOGRAPH
+ 0xDDFE: 0x80A5, //CJK UNIFIED IDEOGRAPH
+ 0xDEA1: 0x813E, //CJK UNIFIED IDEOGRAPH
+ 0xDEA2: 0x81C2, //CJK UNIFIED IDEOGRAPH
+ 0xDEA3: 0x83F2, //CJK UNIFIED IDEOGRAPH
+ 0xDEA4: 0x871A, //CJK UNIFIED IDEOGRAPH
+ 0xDEA5: 0x88E8, //CJK UNIFIED IDEOGRAPH
+ 0xDEA6: 0x8AB9, //CJK UNIFIED IDEOGRAPH
+ 0xDEA7: 0x8B6C, //CJK UNIFIED IDEOGRAPH
+ 0xDEA8: 0x8CBB, //CJK UNIFIED IDEOGRAPH
+ 0xDEA9: 0x9119, //CJK UNIFIED IDEOGRAPH
+ 0xDEAA: 0x975E, //CJK UNIFIED IDEOGRAPH
+ 0xDEAB: 0x98DB, //CJK UNIFIED IDEOGRAPH
+ 0xDEAC: 0x9F3B, //CJK UNIFIED IDEOGRAPH
+ 0xDEAD: 0x56AC, //CJK UNIFIED IDEOGRAPH
+ 0xDEAE: 0x5B2A, //CJK UNIFIED IDEOGRAPH
+ 0xDEAF: 0x5F6C, //CJK UNIFIED IDEOGRAPH
+ 0xDEB0: 0x658C, //CJK UNIFIED IDEOGRAPH
+ 0xDEB1: 0x6AB3, //CJK UNIFIED IDEOGRAPH
+ 0xDEB2: 0x6BAF, //CJK UNIFIED IDEOGRAPH
+ 0xDEB3: 0x6D5C, //CJK UNIFIED IDEOGRAPH
+ 0xDEB4: 0x6FF1, //CJK UNIFIED IDEOGRAPH
+ 0xDEB5: 0x7015, //CJK UNIFIED IDEOGRAPH
+ 0xDEB6: 0x725D, //CJK UNIFIED IDEOGRAPH
+ 0xDEB7: 0x73AD, //CJK UNIFIED IDEOGRAPH
+ 0xDEB8: 0x8CA7, //CJK UNIFIED IDEOGRAPH
+ 0xDEB9: 0x8CD3, //CJK UNIFIED IDEOGRAPH
+ 0xDEBA: 0x983B, //CJK UNIFIED IDEOGRAPH
+ 0xDEBB: 0x6191, //CJK UNIFIED IDEOGRAPH
+ 0xDEBC: 0x6C37, //CJK UNIFIED IDEOGRAPH
+ 0xDEBD: 0x8058, //CJK UNIFIED IDEOGRAPH
+ 0xDEBE: 0x9A01, //CJK UNIFIED IDEOGRAPH
+ 0xDEBF: 0x4E4D, //CJK UNIFIED IDEOGRAPH
+ 0xDEC0: 0x4E8B, //CJK UNIFIED IDEOGRAPH
+ 0xDEC1: 0x4E9B, //CJK UNIFIED IDEOGRAPH
+ 0xDEC2: 0x4ED5, //CJK UNIFIED IDEOGRAPH
+ 0xDEC3: 0x4F3A, //CJK UNIFIED IDEOGRAPH
+ 0xDEC4: 0x4F3C, //CJK UNIFIED IDEOGRAPH
+ 0xDEC5: 0x4F7F, //CJK UNIFIED IDEOGRAPH
+ 0xDEC6: 0x4FDF, //CJK UNIFIED IDEOGRAPH
+ 0xDEC7: 0x50FF, //CJK UNIFIED IDEOGRAPH
+ 0xDEC8: 0x53F2, //CJK UNIFIED IDEOGRAPH
+ 0xDEC9: 0x53F8, //CJK UNIFIED IDEOGRAPH
+ 0xDECA: 0x5506, //CJK UNIFIED IDEOGRAPH
+ 0xDECB: 0x55E3, //CJK UNIFIED IDEOGRAPH
+ 0xDECC: 0x56DB, //CJK UNIFIED IDEOGRAPH
+ 0xDECD: 0x58EB, //CJK UNIFIED IDEOGRAPH
+ 0xDECE: 0x5962, //CJK UNIFIED IDEOGRAPH
+ 0xDECF: 0x5A11, //CJK UNIFIED IDEOGRAPH
+ 0xDED0: 0x5BEB, //CJK UNIFIED IDEOGRAPH
+ 0xDED1: 0x5BFA, //CJK UNIFIED IDEOGRAPH
+ 0xDED2: 0x5C04, //CJK UNIFIED IDEOGRAPH
+ 0xDED3: 0x5DF3, //CJK UNIFIED IDEOGRAPH
+ 0xDED4: 0x5E2B, //CJK UNIFIED IDEOGRAPH
+ 0xDED5: 0x5F99, //CJK UNIFIED IDEOGRAPH
+ 0xDED6: 0x601D, //CJK UNIFIED IDEOGRAPH
+ 0xDED7: 0x6368, //CJK UNIFIED IDEOGRAPH
+ 0xDED8: 0x659C, //CJK UNIFIED IDEOGRAPH
+ 0xDED9: 0x65AF, //CJK UNIFIED IDEOGRAPH
+ 0xDEDA: 0x67F6, //CJK UNIFIED IDEOGRAPH
+ 0xDEDB: 0x67FB, //CJK UNIFIED IDEOGRAPH
+ 0xDEDC: 0x68AD, //CJK UNIFIED IDEOGRAPH
+ 0xDEDD: 0x6B7B, //CJK UNIFIED IDEOGRAPH
+ 0xDEDE: 0x6C99, //CJK UNIFIED IDEOGRAPH
+ 0xDEDF: 0x6CD7, //CJK UNIFIED IDEOGRAPH
+ 0xDEE0: 0x6E23, //CJK UNIFIED IDEOGRAPH
+ 0xDEE1: 0x7009, //CJK UNIFIED IDEOGRAPH
+ 0xDEE2: 0x7345, //CJK UNIFIED IDEOGRAPH
+ 0xDEE3: 0x7802, //CJK UNIFIED IDEOGRAPH
+ 0xDEE4: 0x793E, //CJK UNIFIED IDEOGRAPH
+ 0xDEE5: 0x7940, //CJK UNIFIED IDEOGRAPH
+ 0xDEE6: 0x7960, //CJK UNIFIED IDEOGRAPH
+ 0xDEE7: 0x79C1, //CJK UNIFIED IDEOGRAPH
+ 0xDEE8: 0x7BE9, //CJK UNIFIED IDEOGRAPH
+ 0xDEE9: 0x7D17, //CJK UNIFIED IDEOGRAPH
+ 0xDEEA: 0x7D72, //CJK UNIFIED IDEOGRAPH
+ 0xDEEB: 0x8086, //CJK UNIFIED IDEOGRAPH
+ 0xDEEC: 0x820D, //CJK UNIFIED IDEOGRAPH
+ 0xDEED: 0x838E, //CJK UNIFIED IDEOGRAPH
+ 0xDEEE: 0x84D1, //CJK UNIFIED IDEOGRAPH
+ 0xDEEF: 0x86C7, //CJK UNIFIED IDEOGRAPH
+ 0xDEF0: 0x88DF, //CJK UNIFIED IDEOGRAPH
+ 0xDEF1: 0x8A50, //CJK UNIFIED IDEOGRAPH
+ 0xDEF2: 0x8A5E, //CJK UNIFIED IDEOGRAPH
+ 0xDEF3: 0x8B1D, //CJK UNIFIED IDEOGRAPH
+ 0xDEF4: 0x8CDC, //CJK UNIFIED IDEOGRAPH
+ 0xDEF5: 0x8D66, //CJK UNIFIED IDEOGRAPH
+ 0xDEF6: 0x8FAD, //CJK UNIFIED IDEOGRAPH
+ 0xDEF7: 0x90AA, //CJK UNIFIED IDEOGRAPH
+ 0xDEF8: 0x98FC, //CJK UNIFIED IDEOGRAPH
+ 0xDEF9: 0x99DF, //CJK UNIFIED IDEOGRAPH
+ 0xDEFA: 0x9E9D, //CJK UNIFIED IDEOGRAPH
+ 0xDEFB: 0x524A, //CJK UNIFIED IDEOGRAPH
+ 0xDEFC: 0xF969, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDEFD: 0x6714, //CJK UNIFIED IDEOGRAPH
+ 0xDEFE: 0xF96A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDFA1: 0x5098, //CJK UNIFIED IDEOGRAPH
+ 0xDFA2: 0x522A, //CJK UNIFIED IDEOGRAPH
+ 0xDFA3: 0x5C71, //CJK UNIFIED IDEOGRAPH
+ 0xDFA4: 0x6563, //CJK UNIFIED IDEOGRAPH
+ 0xDFA5: 0x6C55, //CJK UNIFIED IDEOGRAPH
+ 0xDFA6: 0x73CA, //CJK UNIFIED IDEOGRAPH
+ 0xDFA7: 0x7523, //CJK UNIFIED IDEOGRAPH
+ 0xDFA8: 0x759D, //CJK UNIFIED IDEOGRAPH
+ 0xDFA9: 0x7B97, //CJK UNIFIED IDEOGRAPH
+ 0xDFAA: 0x849C, //CJK UNIFIED IDEOGRAPH
+ 0xDFAB: 0x9178, //CJK UNIFIED IDEOGRAPH
+ 0xDFAC: 0x9730, //CJK UNIFIED IDEOGRAPH
+ 0xDFAD: 0x4E77, //CJK UNIFIED IDEOGRAPH
+ 0xDFAE: 0x6492, //CJK UNIFIED IDEOGRAPH
+ 0xDFAF: 0x6BBA, //CJK UNIFIED IDEOGRAPH
+ 0xDFB0: 0x715E, //CJK UNIFIED IDEOGRAPH
+ 0xDFB1: 0x85A9, //CJK UNIFIED IDEOGRAPH
+ 0xDFB2: 0x4E09, //CJK UNIFIED IDEOGRAPH
+ 0xDFB3: 0xF96B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDFB4: 0x6749, //CJK UNIFIED IDEOGRAPH
+ 0xDFB5: 0x68EE, //CJK UNIFIED IDEOGRAPH
+ 0xDFB6: 0x6E17, //CJK UNIFIED IDEOGRAPH
+ 0xDFB7: 0x829F, //CJK UNIFIED IDEOGRAPH
+ 0xDFB8: 0x8518, //CJK UNIFIED IDEOGRAPH
+ 0xDFB9: 0x886B, //CJK UNIFIED IDEOGRAPH
+ 0xDFBA: 0x63F7, //CJK UNIFIED IDEOGRAPH
+ 0xDFBB: 0x6F81, //CJK UNIFIED IDEOGRAPH
+ 0xDFBC: 0x9212, //CJK UNIFIED IDEOGRAPH
+ 0xDFBD: 0x98AF, //CJK UNIFIED IDEOGRAPH
+ 0xDFBE: 0x4E0A, //CJK UNIFIED IDEOGRAPH
+ 0xDFBF: 0x50B7, //CJK UNIFIED IDEOGRAPH
+ 0xDFC0: 0x50CF, //CJK UNIFIED IDEOGRAPH
+ 0xDFC1: 0x511F, //CJK UNIFIED IDEOGRAPH
+ 0xDFC2: 0x5546, //CJK UNIFIED IDEOGRAPH
+ 0xDFC3: 0x55AA, //CJK UNIFIED IDEOGRAPH
+ 0xDFC4: 0x5617, //CJK UNIFIED IDEOGRAPH
+ 0xDFC5: 0x5B40, //CJK UNIFIED IDEOGRAPH
+ 0xDFC6: 0x5C19, //CJK UNIFIED IDEOGRAPH
+ 0xDFC7: 0x5CE0, //CJK UNIFIED IDEOGRAPH
+ 0xDFC8: 0x5E38, //CJK UNIFIED IDEOGRAPH
+ 0xDFC9: 0x5E8A, //CJK UNIFIED IDEOGRAPH
+ 0xDFCA: 0x5EA0, //CJK UNIFIED IDEOGRAPH
+ 0xDFCB: 0x5EC2, //CJK UNIFIED IDEOGRAPH
+ 0xDFCC: 0x60F3, //CJK UNIFIED IDEOGRAPH
+ 0xDFCD: 0x6851, //CJK UNIFIED IDEOGRAPH
+ 0xDFCE: 0x6A61, //CJK UNIFIED IDEOGRAPH
+ 0xDFCF: 0x6E58, //CJK UNIFIED IDEOGRAPH
+ 0xDFD0: 0x723D, //CJK UNIFIED IDEOGRAPH
+ 0xDFD1: 0x7240, //CJK UNIFIED IDEOGRAPH
+ 0xDFD2: 0x72C0, //CJK UNIFIED IDEOGRAPH
+ 0xDFD3: 0x76F8, //CJK UNIFIED IDEOGRAPH
+ 0xDFD4: 0x7965, //CJK UNIFIED IDEOGRAPH
+ 0xDFD5: 0x7BB1, //CJK UNIFIED IDEOGRAPH
+ 0xDFD6: 0x7FD4, //CJK UNIFIED IDEOGRAPH
+ 0xDFD7: 0x88F3, //CJK UNIFIED IDEOGRAPH
+ 0xDFD8: 0x89F4, //CJK UNIFIED IDEOGRAPH
+ 0xDFD9: 0x8A73, //CJK UNIFIED IDEOGRAPH
+ 0xDFDA: 0x8C61, //CJK UNIFIED IDEOGRAPH
+ 0xDFDB: 0x8CDE, //CJK UNIFIED IDEOGRAPH
+ 0xDFDC: 0x971C, //CJK UNIFIED IDEOGRAPH
+ 0xDFDD: 0x585E, //CJK UNIFIED IDEOGRAPH
+ 0xDFDE: 0x74BD, //CJK UNIFIED IDEOGRAPH
+ 0xDFDF: 0x8CFD, //CJK UNIFIED IDEOGRAPH
+ 0xDFE0: 0x55C7, //CJK UNIFIED IDEOGRAPH
+ 0xDFE1: 0xF96C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDFE2: 0x7A61, //CJK UNIFIED IDEOGRAPH
+ 0xDFE3: 0x7D22, //CJK UNIFIED IDEOGRAPH
+ 0xDFE4: 0x8272, //CJK UNIFIED IDEOGRAPH
+ 0xDFE5: 0x7272, //CJK UNIFIED IDEOGRAPH
+ 0xDFE6: 0x751F, //CJK UNIFIED IDEOGRAPH
+ 0xDFE7: 0x7525, //CJK UNIFIED IDEOGRAPH
+ 0xDFE8: 0xF96D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDFE9: 0x7B19, //CJK UNIFIED IDEOGRAPH
+ 0xDFEA: 0x5885, //CJK UNIFIED IDEOGRAPH
+ 0xDFEB: 0x58FB, //CJK UNIFIED IDEOGRAPH
+ 0xDFEC: 0x5DBC, //CJK UNIFIED IDEOGRAPH
+ 0xDFED: 0x5E8F, //CJK UNIFIED IDEOGRAPH
+ 0xDFEE: 0x5EB6, //CJK UNIFIED IDEOGRAPH
+ 0xDFEF: 0x5F90, //CJK UNIFIED IDEOGRAPH
+ 0xDFF0: 0x6055, //CJK UNIFIED IDEOGRAPH
+ 0xDFF1: 0x6292, //CJK UNIFIED IDEOGRAPH
+ 0xDFF2: 0x637F, //CJK UNIFIED IDEOGRAPH
+ 0xDFF3: 0x654D, //CJK UNIFIED IDEOGRAPH
+ 0xDFF4: 0x6691, //CJK UNIFIED IDEOGRAPH
+ 0xDFF5: 0x66D9, //CJK UNIFIED IDEOGRAPH
+ 0xDFF6: 0x66F8, //CJK UNIFIED IDEOGRAPH
+ 0xDFF7: 0x6816, //CJK UNIFIED IDEOGRAPH
+ 0xDFF8: 0x68F2, //CJK UNIFIED IDEOGRAPH
+ 0xDFF9: 0x7280, //CJK UNIFIED IDEOGRAPH
+ 0xDFFA: 0x745E, //CJK UNIFIED IDEOGRAPH
+ 0xDFFB: 0x7B6E, //CJK UNIFIED IDEOGRAPH
+ 0xDFFC: 0x7D6E, //CJK UNIFIED IDEOGRAPH
+ 0xDFFD: 0x7DD6, //CJK UNIFIED IDEOGRAPH
+ 0xDFFE: 0x7F72, //CJK UNIFIED IDEOGRAPH
+ 0xE0A1: 0x80E5, //CJK UNIFIED IDEOGRAPH
+ 0xE0A2: 0x8212, //CJK UNIFIED IDEOGRAPH
+ 0xE0A3: 0x85AF, //CJK UNIFIED IDEOGRAPH
+ 0xE0A4: 0x897F, //CJK UNIFIED IDEOGRAPH
+ 0xE0A5: 0x8A93, //CJK UNIFIED IDEOGRAPH
+ 0xE0A6: 0x901D, //CJK UNIFIED IDEOGRAPH
+ 0xE0A7: 0x92E4, //CJK UNIFIED IDEOGRAPH
+ 0xE0A8: 0x9ECD, //CJK UNIFIED IDEOGRAPH
+ 0xE0A9: 0x9F20, //CJK UNIFIED IDEOGRAPH
+ 0xE0AA: 0x5915, //CJK UNIFIED IDEOGRAPH
+ 0xE0AB: 0x596D, //CJK UNIFIED IDEOGRAPH
+ 0xE0AC: 0x5E2D, //CJK UNIFIED IDEOGRAPH
+ 0xE0AD: 0x60DC, //CJK UNIFIED IDEOGRAPH
+ 0xE0AE: 0x6614, //CJK UNIFIED IDEOGRAPH
+ 0xE0AF: 0x6673, //CJK UNIFIED IDEOGRAPH
+ 0xE0B0: 0x6790, //CJK UNIFIED IDEOGRAPH
+ 0xE0B1: 0x6C50, //CJK UNIFIED IDEOGRAPH
+ 0xE0B2: 0x6DC5, //CJK UNIFIED IDEOGRAPH
+ 0xE0B3: 0x6F5F, //CJK UNIFIED IDEOGRAPH
+ 0xE0B4: 0x77F3, //CJK UNIFIED IDEOGRAPH
+ 0xE0B5: 0x78A9, //CJK UNIFIED IDEOGRAPH
+ 0xE0B6: 0x84C6, //CJK UNIFIED IDEOGRAPH
+ 0xE0B7: 0x91CB, //CJK UNIFIED IDEOGRAPH
+ 0xE0B8: 0x932B, //CJK UNIFIED IDEOGRAPH
+ 0xE0B9: 0x4ED9, //CJK UNIFIED IDEOGRAPH
+ 0xE0BA: 0x50CA, //CJK UNIFIED IDEOGRAPH
+ 0xE0BB: 0x5148, //CJK UNIFIED IDEOGRAPH
+ 0xE0BC: 0x5584, //CJK UNIFIED IDEOGRAPH
+ 0xE0BD: 0x5B0B, //CJK UNIFIED IDEOGRAPH
+ 0xE0BE: 0x5BA3, //CJK UNIFIED IDEOGRAPH
+ 0xE0BF: 0x6247, //CJK UNIFIED IDEOGRAPH
+ 0xE0C0: 0x657E, //CJK UNIFIED IDEOGRAPH
+ 0xE0C1: 0x65CB, //CJK UNIFIED IDEOGRAPH
+ 0xE0C2: 0x6E32, //CJK UNIFIED IDEOGRAPH
+ 0xE0C3: 0x717D, //CJK UNIFIED IDEOGRAPH
+ 0xE0C4: 0x7401, //CJK UNIFIED IDEOGRAPH
+ 0xE0C5: 0x7444, //CJK UNIFIED IDEOGRAPH
+ 0xE0C6: 0x7487, //CJK UNIFIED IDEOGRAPH
+ 0xE0C7: 0x74BF, //CJK UNIFIED IDEOGRAPH
+ 0xE0C8: 0x766C, //CJK UNIFIED IDEOGRAPH
+ 0xE0C9: 0x79AA, //CJK UNIFIED IDEOGRAPH
+ 0xE0CA: 0x7DDA, //CJK UNIFIED IDEOGRAPH
+ 0xE0CB: 0x7E55, //CJK UNIFIED IDEOGRAPH
+ 0xE0CC: 0x7FA8, //CJK UNIFIED IDEOGRAPH
+ 0xE0CD: 0x817A, //CJK UNIFIED IDEOGRAPH
+ 0xE0CE: 0x81B3, //CJK UNIFIED IDEOGRAPH
+ 0xE0CF: 0x8239, //CJK UNIFIED IDEOGRAPH
+ 0xE0D0: 0x861A, //CJK UNIFIED IDEOGRAPH
+ 0xE0D1: 0x87EC, //CJK UNIFIED IDEOGRAPH
+ 0xE0D2: 0x8A75, //CJK UNIFIED IDEOGRAPH
+ 0xE0D3: 0x8DE3, //CJK UNIFIED IDEOGRAPH
+ 0xE0D4: 0x9078, //CJK UNIFIED IDEOGRAPH
+ 0xE0D5: 0x9291, //CJK UNIFIED IDEOGRAPH
+ 0xE0D6: 0x9425, //CJK UNIFIED IDEOGRAPH
+ 0xE0D7: 0x994D, //CJK UNIFIED IDEOGRAPH
+ 0xE0D8: 0x9BAE, //CJK UNIFIED IDEOGRAPH
+ 0xE0D9: 0x5368, //CJK UNIFIED IDEOGRAPH
+ 0xE0DA: 0x5C51, //CJK UNIFIED IDEOGRAPH
+ 0xE0DB: 0x6954, //CJK UNIFIED IDEOGRAPH
+ 0xE0DC: 0x6CC4, //CJK UNIFIED IDEOGRAPH
+ 0xE0DD: 0x6D29, //CJK UNIFIED IDEOGRAPH
+ 0xE0DE: 0x6E2B, //CJK UNIFIED IDEOGRAPH
+ 0xE0DF: 0x820C, //CJK UNIFIED IDEOGRAPH
+ 0xE0E0: 0x859B, //CJK UNIFIED IDEOGRAPH
+ 0xE0E1: 0x893B, //CJK UNIFIED IDEOGRAPH
+ 0xE0E2: 0x8A2D, //CJK UNIFIED IDEOGRAPH
+ 0xE0E3: 0x8AAA, //CJK UNIFIED IDEOGRAPH
+ 0xE0E4: 0x96EA, //CJK UNIFIED IDEOGRAPH
+ 0xE0E5: 0x9F67, //CJK UNIFIED IDEOGRAPH
+ 0xE0E6: 0x5261, //CJK UNIFIED IDEOGRAPH
+ 0xE0E7: 0x66B9, //CJK UNIFIED IDEOGRAPH
+ 0xE0E8: 0x6BB2, //CJK UNIFIED IDEOGRAPH
+ 0xE0E9: 0x7E96, //CJK UNIFIED IDEOGRAPH
+ 0xE0EA: 0x87FE, //CJK UNIFIED IDEOGRAPH
+ 0xE0EB: 0x8D0D, //CJK UNIFIED IDEOGRAPH
+ 0xE0EC: 0x9583, //CJK UNIFIED IDEOGRAPH
+ 0xE0ED: 0x965D, //CJK UNIFIED IDEOGRAPH
+ 0xE0EE: 0x651D, //CJK UNIFIED IDEOGRAPH
+ 0xE0EF: 0x6D89, //CJK UNIFIED IDEOGRAPH
+ 0xE0F0: 0x71EE, //CJK UNIFIED IDEOGRAPH
+ 0xE0F1: 0xF96E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE0F2: 0x57CE, //CJK UNIFIED IDEOGRAPH
+ 0xE0F3: 0x59D3, //CJK UNIFIED IDEOGRAPH
+ 0xE0F4: 0x5BAC, //CJK UNIFIED IDEOGRAPH
+ 0xE0F5: 0x6027, //CJK UNIFIED IDEOGRAPH
+ 0xE0F6: 0x60FA, //CJK UNIFIED IDEOGRAPH
+ 0xE0F7: 0x6210, //CJK UNIFIED IDEOGRAPH
+ 0xE0F8: 0x661F, //CJK UNIFIED IDEOGRAPH
+ 0xE0F9: 0x665F, //CJK UNIFIED IDEOGRAPH
+ 0xE0FA: 0x7329, //CJK UNIFIED IDEOGRAPH
+ 0xE0FB: 0x73F9, //CJK UNIFIED IDEOGRAPH
+ 0xE0FC: 0x76DB, //CJK UNIFIED IDEOGRAPH
+ 0xE0FD: 0x7701, //CJK UNIFIED IDEOGRAPH
+ 0xE0FE: 0x7B6C, //CJK UNIFIED IDEOGRAPH
+ 0xE1A1: 0x8056, //CJK UNIFIED IDEOGRAPH
+ 0xE1A2: 0x8072, //CJK UNIFIED IDEOGRAPH
+ 0xE1A3: 0x8165, //CJK UNIFIED IDEOGRAPH
+ 0xE1A4: 0x8AA0, //CJK UNIFIED IDEOGRAPH
+ 0xE1A5: 0x9192, //CJK UNIFIED IDEOGRAPH
+ 0xE1A6: 0x4E16, //CJK UNIFIED IDEOGRAPH
+ 0xE1A7: 0x52E2, //CJK UNIFIED IDEOGRAPH
+ 0xE1A8: 0x6B72, //CJK UNIFIED IDEOGRAPH
+ 0xE1A9: 0x6D17, //CJK UNIFIED IDEOGRAPH
+ 0xE1AA: 0x7A05, //CJK UNIFIED IDEOGRAPH
+ 0xE1AB: 0x7B39, //CJK UNIFIED IDEOGRAPH
+ 0xE1AC: 0x7D30, //CJK UNIFIED IDEOGRAPH
+ 0xE1AD: 0xF96F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE1AE: 0x8CB0, //CJK UNIFIED IDEOGRAPH
+ 0xE1AF: 0x53EC, //CJK UNIFIED IDEOGRAPH
+ 0xE1B0: 0x562F, //CJK UNIFIED IDEOGRAPH
+ 0xE1B1: 0x5851, //CJK UNIFIED IDEOGRAPH
+ 0xE1B2: 0x5BB5, //CJK UNIFIED IDEOGRAPH
+ 0xE1B3: 0x5C0F, //CJK UNIFIED IDEOGRAPH
+ 0xE1B4: 0x5C11, //CJK UNIFIED IDEOGRAPH
+ 0xE1B5: 0x5DE2, //CJK UNIFIED IDEOGRAPH
+ 0xE1B6: 0x6240, //CJK UNIFIED IDEOGRAPH
+ 0xE1B7: 0x6383, //CJK UNIFIED IDEOGRAPH
+ 0xE1B8: 0x6414, //CJK UNIFIED IDEOGRAPH
+ 0xE1B9: 0x662D, //CJK UNIFIED IDEOGRAPH
+ 0xE1BA: 0x68B3, //CJK UNIFIED IDEOGRAPH
+ 0xE1BB: 0x6CBC, //CJK UNIFIED IDEOGRAPH
+ 0xE1BC: 0x6D88, //CJK UNIFIED IDEOGRAPH
+ 0xE1BD: 0x6EAF, //CJK UNIFIED IDEOGRAPH
+ 0xE1BE: 0x701F, //CJK UNIFIED IDEOGRAPH
+ 0xE1BF: 0x70A4, //CJK UNIFIED IDEOGRAPH
+ 0xE1C0: 0x71D2, //CJK UNIFIED IDEOGRAPH
+ 0xE1C1: 0x7526, //CJK UNIFIED IDEOGRAPH
+ 0xE1C2: 0x758F, //CJK UNIFIED IDEOGRAPH
+ 0xE1C3: 0x758E, //CJK UNIFIED IDEOGRAPH
+ 0xE1C4: 0x7619, //CJK UNIFIED IDEOGRAPH
+ 0xE1C5: 0x7B11, //CJK UNIFIED IDEOGRAPH
+ 0xE1C6: 0x7BE0, //CJK UNIFIED IDEOGRAPH
+ 0xE1C7: 0x7C2B, //CJK UNIFIED IDEOGRAPH
+ 0xE1C8: 0x7D20, //CJK UNIFIED IDEOGRAPH
+ 0xE1C9: 0x7D39, //CJK UNIFIED IDEOGRAPH
+ 0xE1CA: 0x852C, //CJK UNIFIED IDEOGRAPH
+ 0xE1CB: 0x856D, //CJK UNIFIED IDEOGRAPH
+ 0xE1CC: 0x8607, //CJK UNIFIED IDEOGRAPH
+ 0xE1CD: 0x8A34, //CJK UNIFIED IDEOGRAPH
+ 0xE1CE: 0x900D, //CJK UNIFIED IDEOGRAPH
+ 0xE1CF: 0x9061, //CJK UNIFIED IDEOGRAPH
+ 0xE1D0: 0x90B5, //CJK UNIFIED IDEOGRAPH
+ 0xE1D1: 0x92B7, //CJK UNIFIED IDEOGRAPH
+ 0xE1D2: 0x97F6, //CJK UNIFIED IDEOGRAPH
+ 0xE1D3: 0x9A37, //CJK UNIFIED IDEOGRAPH
+ 0xE1D4: 0x4FD7, //CJK UNIFIED IDEOGRAPH
+ 0xE1D5: 0x5C6C, //CJK UNIFIED IDEOGRAPH
+ 0xE1D6: 0x675F, //CJK UNIFIED IDEOGRAPH
+ 0xE1D7: 0x6D91, //CJK UNIFIED IDEOGRAPH
+ 0xE1D8: 0x7C9F, //CJK UNIFIED IDEOGRAPH
+ 0xE1D9: 0x7E8C, //CJK UNIFIED IDEOGRAPH
+ 0xE1DA: 0x8B16, //CJK UNIFIED IDEOGRAPH
+ 0xE1DB: 0x8D16, //CJK UNIFIED IDEOGRAPH
+ 0xE1DC: 0x901F, //CJK UNIFIED IDEOGRAPH
+ 0xE1DD: 0x5B6B, //CJK UNIFIED IDEOGRAPH
+ 0xE1DE: 0x5DFD, //CJK UNIFIED IDEOGRAPH
+ 0xE1DF: 0x640D, //CJK UNIFIED IDEOGRAPH
+ 0xE1E0: 0x84C0, //CJK UNIFIED IDEOGRAPH
+ 0xE1E1: 0x905C, //CJK UNIFIED IDEOGRAPH
+ 0xE1E2: 0x98E1, //CJK UNIFIED IDEOGRAPH
+ 0xE1E3: 0x7387, //CJK UNIFIED IDEOGRAPH
+ 0xE1E4: 0x5B8B, //CJK UNIFIED IDEOGRAPH
+ 0xE1E5: 0x609A, //CJK UNIFIED IDEOGRAPH
+ 0xE1E6: 0x677E, //CJK UNIFIED IDEOGRAPH
+ 0xE1E7: 0x6DDE, //CJK UNIFIED IDEOGRAPH
+ 0xE1E8: 0x8A1F, //CJK UNIFIED IDEOGRAPH
+ 0xE1E9: 0x8AA6, //CJK UNIFIED IDEOGRAPH
+ 0xE1EA: 0x9001, //CJK UNIFIED IDEOGRAPH
+ 0xE1EB: 0x980C, //CJK UNIFIED IDEOGRAPH
+ 0xE1EC: 0x5237, //CJK UNIFIED IDEOGRAPH
+ 0xE1ED: 0xF970, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE1EE: 0x7051, //CJK UNIFIED IDEOGRAPH
+ 0xE1EF: 0x788E, //CJK UNIFIED IDEOGRAPH
+ 0xE1F0: 0x9396, //CJK UNIFIED IDEOGRAPH
+ 0xE1F1: 0x8870, //CJK UNIFIED IDEOGRAPH
+ 0xE1F2: 0x91D7, //CJK UNIFIED IDEOGRAPH
+ 0xE1F3: 0x4FEE, //CJK UNIFIED IDEOGRAPH
+ 0xE1F4: 0x53D7, //CJK UNIFIED IDEOGRAPH
+ 0xE1F5: 0x55FD, //CJK UNIFIED IDEOGRAPH
+ 0xE1F6: 0x56DA, //CJK UNIFIED IDEOGRAPH
+ 0xE1F7: 0x5782, //CJK UNIFIED IDEOGRAPH
+ 0xE1F8: 0x58FD, //CJK UNIFIED IDEOGRAPH
+ 0xE1F9: 0x5AC2, //CJK UNIFIED IDEOGRAPH
+ 0xE1FA: 0x5B88, //CJK UNIFIED IDEOGRAPH
+ 0xE1FB: 0x5CAB, //CJK UNIFIED IDEOGRAPH
+ 0xE1FC: 0x5CC0, //CJK UNIFIED IDEOGRAPH
+ 0xE1FD: 0x5E25, //CJK UNIFIED IDEOGRAPH
+ 0xE1FE: 0x6101, //CJK UNIFIED IDEOGRAPH
+ 0xE2A1: 0x620D, //CJK UNIFIED IDEOGRAPH
+ 0xE2A2: 0x624B, //CJK UNIFIED IDEOGRAPH
+ 0xE2A3: 0x6388, //CJK UNIFIED IDEOGRAPH
+ 0xE2A4: 0x641C, //CJK UNIFIED IDEOGRAPH
+ 0xE2A5: 0x6536, //CJK UNIFIED IDEOGRAPH
+ 0xE2A6: 0x6578, //CJK UNIFIED IDEOGRAPH
+ 0xE2A7: 0x6A39, //CJK UNIFIED IDEOGRAPH
+ 0xE2A8: 0x6B8A, //CJK UNIFIED IDEOGRAPH
+ 0xE2A9: 0x6C34, //CJK UNIFIED IDEOGRAPH
+ 0xE2AA: 0x6D19, //CJK UNIFIED IDEOGRAPH
+ 0xE2AB: 0x6F31, //CJK UNIFIED IDEOGRAPH
+ 0xE2AC: 0x71E7, //CJK UNIFIED IDEOGRAPH
+ 0xE2AD: 0x72E9, //CJK UNIFIED IDEOGRAPH
+ 0xE2AE: 0x7378, //CJK UNIFIED IDEOGRAPH
+ 0xE2AF: 0x7407, //CJK UNIFIED IDEOGRAPH
+ 0xE2B0: 0x74B2, //CJK UNIFIED IDEOGRAPH
+ 0xE2B1: 0x7626, //CJK UNIFIED IDEOGRAPH
+ 0xE2B2: 0x7761, //CJK UNIFIED IDEOGRAPH
+ 0xE2B3: 0x79C0, //CJK UNIFIED IDEOGRAPH
+ 0xE2B4: 0x7A57, //CJK UNIFIED IDEOGRAPH
+ 0xE2B5: 0x7AEA, //CJK UNIFIED IDEOGRAPH
+ 0xE2B6: 0x7CB9, //CJK UNIFIED IDEOGRAPH
+ 0xE2B7: 0x7D8F, //CJK UNIFIED IDEOGRAPH
+ 0xE2B8: 0x7DAC, //CJK UNIFIED IDEOGRAPH
+ 0xE2B9: 0x7E61, //CJK UNIFIED IDEOGRAPH
+ 0xE2BA: 0x7F9E, //CJK UNIFIED IDEOGRAPH
+ 0xE2BB: 0x8129, //CJK UNIFIED IDEOGRAPH
+ 0xE2BC: 0x8331, //CJK UNIFIED IDEOGRAPH
+ 0xE2BD: 0x8490, //CJK UNIFIED IDEOGRAPH
+ 0xE2BE: 0x84DA, //CJK UNIFIED IDEOGRAPH
+ 0xE2BF: 0x85EA, //CJK UNIFIED IDEOGRAPH
+ 0xE2C0: 0x8896, //CJK UNIFIED IDEOGRAPH
+ 0xE2C1: 0x8AB0, //CJK UNIFIED IDEOGRAPH
+ 0xE2C2: 0x8B90, //CJK UNIFIED IDEOGRAPH
+ 0xE2C3: 0x8F38, //CJK UNIFIED IDEOGRAPH
+ 0xE2C4: 0x9042, //CJK UNIFIED IDEOGRAPH
+ 0xE2C5: 0x9083, //CJK UNIFIED IDEOGRAPH
+ 0xE2C6: 0x916C, //CJK UNIFIED IDEOGRAPH
+ 0xE2C7: 0x9296, //CJK UNIFIED IDEOGRAPH
+ 0xE2C8: 0x92B9, //CJK UNIFIED IDEOGRAPH
+ 0xE2C9: 0x968B, //CJK UNIFIED IDEOGRAPH
+ 0xE2CA: 0x96A7, //CJK UNIFIED IDEOGRAPH
+ 0xE2CB: 0x96A8, //CJK UNIFIED IDEOGRAPH
+ 0xE2CC: 0x96D6, //CJK UNIFIED IDEOGRAPH
+ 0xE2CD: 0x9700, //CJK UNIFIED IDEOGRAPH
+ 0xE2CE: 0x9808, //CJK UNIFIED IDEOGRAPH
+ 0xE2CF: 0x9996, //CJK UNIFIED IDEOGRAPH
+ 0xE2D0: 0x9AD3, //CJK UNIFIED IDEOGRAPH
+ 0xE2D1: 0x9B1A, //CJK UNIFIED IDEOGRAPH
+ 0xE2D2: 0x53D4, //CJK UNIFIED IDEOGRAPH
+ 0xE2D3: 0x587E, //CJK UNIFIED IDEOGRAPH
+ 0xE2D4: 0x5919, //CJK UNIFIED IDEOGRAPH
+ 0xE2D5: 0x5B70, //CJK UNIFIED IDEOGRAPH
+ 0xE2D6: 0x5BBF, //CJK UNIFIED IDEOGRAPH
+ 0xE2D7: 0x6DD1, //CJK UNIFIED IDEOGRAPH
+ 0xE2D8: 0x6F5A, //CJK UNIFIED IDEOGRAPH
+ 0xE2D9: 0x719F, //CJK UNIFIED IDEOGRAPH
+ 0xE2DA: 0x7421, //CJK UNIFIED IDEOGRAPH
+ 0xE2DB: 0x74B9, //CJK UNIFIED IDEOGRAPH
+ 0xE2DC: 0x8085, //CJK UNIFIED IDEOGRAPH
+ 0xE2DD: 0x83FD, //CJK UNIFIED IDEOGRAPH
+ 0xE2DE: 0x5DE1, //CJK UNIFIED IDEOGRAPH
+ 0xE2DF: 0x5F87, //CJK UNIFIED IDEOGRAPH
+ 0xE2E0: 0x5FAA, //CJK UNIFIED IDEOGRAPH
+ 0xE2E1: 0x6042, //CJK UNIFIED IDEOGRAPH
+ 0xE2E2: 0x65EC, //CJK UNIFIED IDEOGRAPH
+ 0xE2E3: 0x6812, //CJK UNIFIED IDEOGRAPH
+ 0xE2E4: 0x696F, //CJK UNIFIED IDEOGRAPH
+ 0xE2E5: 0x6A53, //CJK UNIFIED IDEOGRAPH
+ 0xE2E6: 0x6B89, //CJK UNIFIED IDEOGRAPH
+ 0xE2E7: 0x6D35, //CJK UNIFIED IDEOGRAPH
+ 0xE2E8: 0x6DF3, //CJK UNIFIED IDEOGRAPH
+ 0xE2E9: 0x73E3, //CJK UNIFIED IDEOGRAPH
+ 0xE2EA: 0x76FE, //CJK UNIFIED IDEOGRAPH
+ 0xE2EB: 0x77AC, //CJK UNIFIED IDEOGRAPH
+ 0xE2EC: 0x7B4D, //CJK UNIFIED IDEOGRAPH
+ 0xE2ED: 0x7D14, //CJK UNIFIED IDEOGRAPH
+ 0xE2EE: 0x8123, //CJK UNIFIED IDEOGRAPH
+ 0xE2EF: 0x821C, //CJK UNIFIED IDEOGRAPH
+ 0xE2F0: 0x8340, //CJK UNIFIED IDEOGRAPH
+ 0xE2F1: 0x84F4, //CJK UNIFIED IDEOGRAPH
+ 0xE2F2: 0x8563, //CJK UNIFIED IDEOGRAPH
+ 0xE2F3: 0x8A62, //CJK UNIFIED IDEOGRAPH
+ 0xE2F4: 0x8AC4, //CJK UNIFIED IDEOGRAPH
+ 0xE2F5: 0x9187, //CJK UNIFIED IDEOGRAPH
+ 0xE2F6: 0x931E, //CJK UNIFIED IDEOGRAPH
+ 0xE2F7: 0x9806, //CJK UNIFIED IDEOGRAPH
+ 0xE2F8: 0x99B4, //CJK UNIFIED IDEOGRAPH
+ 0xE2F9: 0x620C, //CJK UNIFIED IDEOGRAPH
+ 0xE2FA: 0x8853, //CJK UNIFIED IDEOGRAPH
+ 0xE2FB: 0x8FF0, //CJK UNIFIED IDEOGRAPH
+ 0xE2FC: 0x9265, //CJK UNIFIED IDEOGRAPH
+ 0xE2FD: 0x5D07, //CJK UNIFIED IDEOGRAPH
+ 0xE2FE: 0x5D27, //CJK UNIFIED IDEOGRAPH
+ 0xE3A1: 0x5D69, //CJK UNIFIED IDEOGRAPH
+ 0xE3A2: 0x745F, //CJK UNIFIED IDEOGRAPH
+ 0xE3A3: 0x819D, //CJK UNIFIED IDEOGRAPH
+ 0xE3A4: 0x8768, //CJK UNIFIED IDEOGRAPH
+ 0xE3A5: 0x6FD5, //CJK UNIFIED IDEOGRAPH
+ 0xE3A6: 0x62FE, //CJK UNIFIED IDEOGRAPH
+ 0xE3A7: 0x7FD2, //CJK UNIFIED IDEOGRAPH
+ 0xE3A8: 0x8936, //CJK UNIFIED IDEOGRAPH
+ 0xE3A9: 0x8972, //CJK UNIFIED IDEOGRAPH
+ 0xE3AA: 0x4E1E, //CJK UNIFIED IDEOGRAPH
+ 0xE3AB: 0x4E58, //CJK UNIFIED IDEOGRAPH
+ 0xE3AC: 0x50E7, //CJK UNIFIED IDEOGRAPH
+ 0xE3AD: 0x52DD, //CJK UNIFIED IDEOGRAPH
+ 0xE3AE: 0x5347, //CJK UNIFIED IDEOGRAPH
+ 0xE3AF: 0x627F, //CJK UNIFIED IDEOGRAPH
+ 0xE3B0: 0x6607, //CJK UNIFIED IDEOGRAPH
+ 0xE3B1: 0x7E69, //CJK UNIFIED IDEOGRAPH
+ 0xE3B2: 0x8805, //CJK UNIFIED IDEOGRAPH
+ 0xE3B3: 0x965E, //CJK UNIFIED IDEOGRAPH
+ 0xE3B4: 0x4F8D, //CJK UNIFIED IDEOGRAPH
+ 0xE3B5: 0x5319, //CJK UNIFIED IDEOGRAPH
+ 0xE3B6: 0x5636, //CJK UNIFIED IDEOGRAPH
+ 0xE3B7: 0x59CB, //CJK UNIFIED IDEOGRAPH
+ 0xE3B8: 0x5AA4, //CJK UNIFIED IDEOGRAPH
+ 0xE3B9: 0x5C38, //CJK UNIFIED IDEOGRAPH
+ 0xE3BA: 0x5C4E, //CJK UNIFIED IDEOGRAPH
+ 0xE3BB: 0x5C4D, //CJK UNIFIED IDEOGRAPH
+ 0xE3BC: 0x5E02, //CJK UNIFIED IDEOGRAPH
+ 0xE3BD: 0x5F11, //CJK UNIFIED IDEOGRAPH
+ 0xE3BE: 0x6043, //CJK UNIFIED IDEOGRAPH
+ 0xE3BF: 0x65BD, //CJK UNIFIED IDEOGRAPH
+ 0xE3C0: 0x662F, //CJK UNIFIED IDEOGRAPH
+ 0xE3C1: 0x6642, //CJK UNIFIED IDEOGRAPH
+ 0xE3C2: 0x67BE, //CJK UNIFIED IDEOGRAPH
+ 0xE3C3: 0x67F4, //CJK UNIFIED IDEOGRAPH
+ 0xE3C4: 0x731C, //CJK UNIFIED IDEOGRAPH
+ 0xE3C5: 0x77E2, //CJK UNIFIED IDEOGRAPH
+ 0xE3C6: 0x793A, //CJK UNIFIED IDEOGRAPH
+ 0xE3C7: 0x7FC5, //CJK UNIFIED IDEOGRAPH
+ 0xE3C8: 0x8494, //CJK UNIFIED IDEOGRAPH
+ 0xE3C9: 0x84CD, //CJK UNIFIED IDEOGRAPH
+ 0xE3CA: 0x8996, //CJK UNIFIED IDEOGRAPH
+ 0xE3CB: 0x8A66, //CJK UNIFIED IDEOGRAPH
+ 0xE3CC: 0x8A69, //CJK UNIFIED IDEOGRAPH
+ 0xE3CD: 0x8AE1, //CJK UNIFIED IDEOGRAPH
+ 0xE3CE: 0x8C55, //CJK UNIFIED IDEOGRAPH
+ 0xE3CF: 0x8C7A, //CJK UNIFIED IDEOGRAPH
+ 0xE3D0: 0x57F4, //CJK UNIFIED IDEOGRAPH
+ 0xE3D1: 0x5BD4, //CJK UNIFIED IDEOGRAPH
+ 0xE3D2: 0x5F0F, //CJK UNIFIED IDEOGRAPH
+ 0xE3D3: 0x606F, //CJK UNIFIED IDEOGRAPH
+ 0xE3D4: 0x62ED, //CJK UNIFIED IDEOGRAPH
+ 0xE3D5: 0x690D, //CJK UNIFIED IDEOGRAPH
+ 0xE3D6: 0x6B96, //CJK UNIFIED IDEOGRAPH
+ 0xE3D7: 0x6E5C, //CJK UNIFIED IDEOGRAPH
+ 0xE3D8: 0x7184, //CJK UNIFIED IDEOGRAPH
+ 0xE3D9: 0x7BD2, //CJK UNIFIED IDEOGRAPH
+ 0xE3DA: 0x8755, //CJK UNIFIED IDEOGRAPH
+ 0xE3DB: 0x8B58, //CJK UNIFIED IDEOGRAPH
+ 0xE3DC: 0x8EFE, //CJK UNIFIED IDEOGRAPH
+ 0xE3DD: 0x98DF, //CJK UNIFIED IDEOGRAPH
+ 0xE3DE: 0x98FE, //CJK UNIFIED IDEOGRAPH
+ 0xE3DF: 0x4F38, //CJK UNIFIED IDEOGRAPH
+ 0xE3E0: 0x4F81, //CJK UNIFIED IDEOGRAPH
+ 0xE3E1: 0x4FE1, //CJK UNIFIED IDEOGRAPH
+ 0xE3E2: 0x547B, //CJK UNIFIED IDEOGRAPH
+ 0xE3E3: 0x5A20, //CJK UNIFIED IDEOGRAPH
+ 0xE3E4: 0x5BB8, //CJK UNIFIED IDEOGRAPH
+ 0xE3E5: 0x613C, //CJK UNIFIED IDEOGRAPH
+ 0xE3E6: 0x65B0, //CJK UNIFIED IDEOGRAPH
+ 0xE3E7: 0x6668, //CJK UNIFIED IDEOGRAPH
+ 0xE3E8: 0x71FC, //CJK UNIFIED IDEOGRAPH
+ 0xE3E9: 0x7533, //CJK UNIFIED IDEOGRAPH
+ 0xE3EA: 0x795E, //CJK UNIFIED IDEOGRAPH
+ 0xE3EB: 0x7D33, //CJK UNIFIED IDEOGRAPH
+ 0xE3EC: 0x814E, //CJK UNIFIED IDEOGRAPH
+ 0xE3ED: 0x81E3, //CJK UNIFIED IDEOGRAPH
+ 0xE3EE: 0x8398, //CJK UNIFIED IDEOGRAPH
+ 0xE3EF: 0x85AA, //CJK UNIFIED IDEOGRAPH
+ 0xE3F0: 0x85CE, //CJK UNIFIED IDEOGRAPH
+ 0xE3F1: 0x8703, //CJK UNIFIED IDEOGRAPH
+ 0xE3F2: 0x8A0A, //CJK UNIFIED IDEOGRAPH
+ 0xE3F3: 0x8EAB, //CJK UNIFIED IDEOGRAPH
+ 0xE3F4: 0x8F9B, //CJK UNIFIED IDEOGRAPH
+ 0xE3F5: 0xF971, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE3F6: 0x8FC5, //CJK UNIFIED IDEOGRAPH
+ 0xE3F7: 0x5931, //CJK UNIFIED IDEOGRAPH
+ 0xE3F8: 0x5BA4, //CJK UNIFIED IDEOGRAPH
+ 0xE3F9: 0x5BE6, //CJK UNIFIED IDEOGRAPH
+ 0xE3FA: 0x6089, //CJK UNIFIED IDEOGRAPH
+ 0xE3FB: 0x5BE9, //CJK UNIFIED IDEOGRAPH
+ 0xE3FC: 0x5C0B, //CJK UNIFIED IDEOGRAPH
+ 0xE3FD: 0x5FC3, //CJK UNIFIED IDEOGRAPH
+ 0xE3FE: 0x6C81, //CJK UNIFIED IDEOGRAPH
+ 0xE4A1: 0xF972, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE4A2: 0x6DF1, //CJK UNIFIED IDEOGRAPH
+ 0xE4A3: 0x700B, //CJK UNIFIED IDEOGRAPH
+ 0xE4A4: 0x751A, //CJK UNIFIED IDEOGRAPH
+ 0xE4A5: 0x82AF, //CJK UNIFIED IDEOGRAPH
+ 0xE4A6: 0x8AF6, //CJK UNIFIED IDEOGRAPH
+ 0xE4A7: 0x4EC0, //CJK UNIFIED IDEOGRAPH
+ 0xE4A8: 0x5341, //CJK UNIFIED IDEOGRAPH
+ 0xE4A9: 0xF973, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE4AA: 0x96D9, //CJK UNIFIED IDEOGRAPH
+ 0xE4AB: 0x6C0F, //CJK UNIFIED IDEOGRAPH
+ 0xE4AC: 0x4E9E, //CJK UNIFIED IDEOGRAPH
+ 0xE4AD: 0x4FC4, //CJK UNIFIED IDEOGRAPH
+ 0xE4AE: 0x5152, //CJK UNIFIED IDEOGRAPH
+ 0xE4AF: 0x555E, //CJK UNIFIED IDEOGRAPH
+ 0xE4B0: 0x5A25, //CJK UNIFIED IDEOGRAPH
+ 0xE4B1: 0x5CE8, //CJK UNIFIED IDEOGRAPH
+ 0xE4B2: 0x6211, //CJK UNIFIED IDEOGRAPH
+ 0xE4B3: 0x7259, //CJK UNIFIED IDEOGRAPH
+ 0xE4B4: 0x82BD, //CJK UNIFIED IDEOGRAPH
+ 0xE4B5: 0x83AA, //CJK UNIFIED IDEOGRAPH
+ 0xE4B6: 0x86FE, //CJK UNIFIED IDEOGRAPH
+ 0xE4B7: 0x8859, //CJK UNIFIED IDEOGRAPH
+ 0xE4B8: 0x8A1D, //CJK UNIFIED IDEOGRAPH
+ 0xE4B9: 0x963F, //CJK UNIFIED IDEOGRAPH
+ 0xE4BA: 0x96C5, //CJK UNIFIED IDEOGRAPH
+ 0xE4BB: 0x9913, //CJK UNIFIED IDEOGRAPH
+ 0xE4BC: 0x9D09, //CJK UNIFIED IDEOGRAPH
+ 0xE4BD: 0x9D5D, //CJK UNIFIED IDEOGRAPH
+ 0xE4BE: 0x580A, //CJK UNIFIED IDEOGRAPH
+ 0xE4BF: 0x5CB3, //CJK UNIFIED IDEOGRAPH
+ 0xE4C0: 0x5DBD, //CJK UNIFIED IDEOGRAPH
+ 0xE4C1: 0x5E44, //CJK UNIFIED IDEOGRAPH
+ 0xE4C2: 0x60E1, //CJK UNIFIED IDEOGRAPH
+ 0xE4C3: 0x6115, //CJK UNIFIED IDEOGRAPH
+ 0xE4C4: 0x63E1, //CJK UNIFIED IDEOGRAPH
+ 0xE4C5: 0x6A02, //CJK UNIFIED IDEOGRAPH
+ 0xE4C6: 0x6E25, //CJK UNIFIED IDEOGRAPH
+ 0xE4C7: 0x9102, //CJK UNIFIED IDEOGRAPH
+ 0xE4C8: 0x9354, //CJK UNIFIED IDEOGRAPH
+ 0xE4C9: 0x984E, //CJK UNIFIED IDEOGRAPH
+ 0xE4CA: 0x9C10, //CJK UNIFIED IDEOGRAPH
+ 0xE4CB: 0x9F77, //CJK UNIFIED IDEOGRAPH
+ 0xE4CC: 0x5B89, //CJK UNIFIED IDEOGRAPH
+ 0xE4CD: 0x5CB8, //CJK UNIFIED IDEOGRAPH
+ 0xE4CE: 0x6309, //CJK UNIFIED IDEOGRAPH
+ 0xE4CF: 0x664F, //CJK UNIFIED IDEOGRAPH
+ 0xE4D0: 0x6848, //CJK UNIFIED IDEOGRAPH
+ 0xE4D1: 0x773C, //CJK UNIFIED IDEOGRAPH
+ 0xE4D2: 0x96C1, //CJK UNIFIED IDEOGRAPH
+ 0xE4D3: 0x978D, //CJK UNIFIED IDEOGRAPH
+ 0xE4D4: 0x9854, //CJK UNIFIED IDEOGRAPH
+ 0xE4D5: 0x9B9F, //CJK UNIFIED IDEOGRAPH
+ 0xE4D6: 0x65A1, //CJK UNIFIED IDEOGRAPH
+ 0xE4D7: 0x8B01, //CJK UNIFIED IDEOGRAPH
+ 0xE4D8: 0x8ECB, //CJK UNIFIED IDEOGRAPH
+ 0xE4D9: 0x95BC, //CJK UNIFIED IDEOGRAPH
+ 0xE4DA: 0x5535, //CJK UNIFIED IDEOGRAPH
+ 0xE4DB: 0x5CA9, //CJK UNIFIED IDEOGRAPH
+ 0xE4DC: 0x5DD6, //CJK UNIFIED IDEOGRAPH
+ 0xE4DD: 0x5EB5, //CJK UNIFIED IDEOGRAPH
+ 0xE4DE: 0x6697, //CJK UNIFIED IDEOGRAPH
+ 0xE4DF: 0x764C, //CJK UNIFIED IDEOGRAPH
+ 0xE4E0: 0x83F4, //CJK UNIFIED IDEOGRAPH
+ 0xE4E1: 0x95C7, //CJK UNIFIED IDEOGRAPH
+ 0xE4E2: 0x58D3, //CJK UNIFIED IDEOGRAPH
+ 0xE4E3: 0x62BC, //CJK UNIFIED IDEOGRAPH
+ 0xE4E4: 0x72CE, //CJK UNIFIED IDEOGRAPH
+ 0xE4E5: 0x9D28, //CJK UNIFIED IDEOGRAPH
+ 0xE4E6: 0x4EF0, //CJK UNIFIED IDEOGRAPH
+ 0xE4E7: 0x592E, //CJK UNIFIED IDEOGRAPH
+ 0xE4E8: 0x600F, //CJK UNIFIED IDEOGRAPH
+ 0xE4E9: 0x663B, //CJK UNIFIED IDEOGRAPH
+ 0xE4EA: 0x6B83, //CJK UNIFIED IDEOGRAPH
+ 0xE4EB: 0x79E7, //CJK UNIFIED IDEOGRAPH
+ 0xE4EC: 0x9D26, //CJK UNIFIED IDEOGRAPH
+ 0xE4ED: 0x5393, //CJK UNIFIED IDEOGRAPH
+ 0xE4EE: 0x54C0, //CJK UNIFIED IDEOGRAPH
+ 0xE4EF: 0x57C3, //CJK UNIFIED IDEOGRAPH
+ 0xE4F0: 0x5D16, //CJK UNIFIED IDEOGRAPH
+ 0xE4F1: 0x611B, //CJK UNIFIED IDEOGRAPH
+ 0xE4F2: 0x66D6, //CJK UNIFIED IDEOGRAPH
+ 0xE4F3: 0x6DAF, //CJK UNIFIED IDEOGRAPH
+ 0xE4F4: 0x788D, //CJK UNIFIED IDEOGRAPH
+ 0xE4F5: 0x827E, //CJK UNIFIED IDEOGRAPH
+ 0xE4F6: 0x9698, //CJK UNIFIED IDEOGRAPH
+ 0xE4F7: 0x9744, //CJK UNIFIED IDEOGRAPH
+ 0xE4F8: 0x5384, //CJK UNIFIED IDEOGRAPH
+ 0xE4F9: 0x627C, //CJK UNIFIED IDEOGRAPH
+ 0xE4FA: 0x6396, //CJK UNIFIED IDEOGRAPH
+ 0xE4FB: 0x6DB2, //CJK UNIFIED IDEOGRAPH
+ 0xE4FC: 0x7E0A, //CJK UNIFIED IDEOGRAPH
+ 0xE4FD: 0x814B, //CJK UNIFIED IDEOGRAPH
+ 0xE4FE: 0x984D, //CJK UNIFIED IDEOGRAPH
+ 0xE5A1: 0x6AFB, //CJK UNIFIED IDEOGRAPH
+ 0xE5A2: 0x7F4C, //CJK UNIFIED IDEOGRAPH
+ 0xE5A3: 0x9DAF, //CJK UNIFIED IDEOGRAPH
+ 0xE5A4: 0x9E1A, //CJK UNIFIED IDEOGRAPH
+ 0xE5A5: 0x4E5F, //CJK UNIFIED IDEOGRAPH
+ 0xE5A6: 0x503B, //CJK UNIFIED IDEOGRAPH
+ 0xE5A7: 0x51B6, //CJK UNIFIED IDEOGRAPH
+ 0xE5A8: 0x591C, //CJK UNIFIED IDEOGRAPH
+ 0xE5A9: 0x60F9, //CJK UNIFIED IDEOGRAPH
+ 0xE5AA: 0x63F6, //CJK UNIFIED IDEOGRAPH
+ 0xE5AB: 0x6930, //CJK UNIFIED IDEOGRAPH
+ 0xE5AC: 0x723A, //CJK UNIFIED IDEOGRAPH
+ 0xE5AD: 0x8036, //CJK UNIFIED IDEOGRAPH
+ 0xE5AE: 0xF974, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5AF: 0x91CE, //CJK UNIFIED IDEOGRAPH
+ 0xE5B0: 0x5F31, //CJK UNIFIED IDEOGRAPH
+ 0xE5B1: 0xF975, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5B2: 0xF976, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5B3: 0x7D04, //CJK UNIFIED IDEOGRAPH
+ 0xE5B4: 0x82E5, //CJK UNIFIED IDEOGRAPH
+ 0xE5B5: 0x846F, //CJK UNIFIED IDEOGRAPH
+ 0xE5B6: 0x84BB, //CJK UNIFIED IDEOGRAPH
+ 0xE5B7: 0x85E5, //CJK UNIFIED IDEOGRAPH
+ 0xE5B8: 0x8E8D, //CJK UNIFIED IDEOGRAPH
+ 0xE5B9: 0xF977, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5BA: 0x4F6F, //CJK UNIFIED IDEOGRAPH
+ 0xE5BB: 0xF978, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5BC: 0xF979, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5BD: 0x58E4, //CJK UNIFIED IDEOGRAPH
+ 0xE5BE: 0x5B43, //CJK UNIFIED IDEOGRAPH
+ 0xE5BF: 0x6059, //CJK UNIFIED IDEOGRAPH
+ 0xE5C0: 0x63DA, //CJK UNIFIED IDEOGRAPH
+ 0xE5C1: 0x6518, //CJK UNIFIED IDEOGRAPH
+ 0xE5C2: 0x656D, //CJK UNIFIED IDEOGRAPH
+ 0xE5C3: 0x6698, //CJK UNIFIED IDEOGRAPH
+ 0xE5C4: 0xF97A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5C5: 0x694A, //CJK UNIFIED IDEOGRAPH
+ 0xE5C6: 0x6A23, //CJK UNIFIED IDEOGRAPH
+ 0xE5C7: 0x6D0B, //CJK UNIFIED IDEOGRAPH
+ 0xE5C8: 0x7001, //CJK UNIFIED IDEOGRAPH
+ 0xE5C9: 0x716C, //CJK UNIFIED IDEOGRAPH
+ 0xE5CA: 0x75D2, //CJK UNIFIED IDEOGRAPH
+ 0xE5CB: 0x760D, //CJK UNIFIED IDEOGRAPH
+ 0xE5CC: 0x79B3, //CJK UNIFIED IDEOGRAPH
+ 0xE5CD: 0x7A70, //CJK UNIFIED IDEOGRAPH
+ 0xE5CE: 0xF97B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5CF: 0x7F8A, //CJK UNIFIED IDEOGRAPH
+ 0xE5D0: 0xF97C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5D1: 0x8944, //CJK UNIFIED IDEOGRAPH
+ 0xE5D2: 0xF97D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5D3: 0x8B93, //CJK UNIFIED IDEOGRAPH
+ 0xE5D4: 0x91C0, //CJK UNIFIED IDEOGRAPH
+ 0xE5D5: 0x967D, //CJK UNIFIED IDEOGRAPH
+ 0xE5D6: 0xF97E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5D7: 0x990A, //CJK UNIFIED IDEOGRAPH
+ 0xE5D8: 0x5704, //CJK UNIFIED IDEOGRAPH
+ 0xE5D9: 0x5FA1, //CJK UNIFIED IDEOGRAPH
+ 0xE5DA: 0x65BC, //CJK UNIFIED IDEOGRAPH
+ 0xE5DB: 0x6F01, //CJK UNIFIED IDEOGRAPH
+ 0xE5DC: 0x7600, //CJK UNIFIED IDEOGRAPH
+ 0xE5DD: 0x79A6, //CJK UNIFIED IDEOGRAPH
+ 0xE5DE: 0x8A9E, //CJK UNIFIED IDEOGRAPH
+ 0xE5DF: 0x99AD, //CJK UNIFIED IDEOGRAPH
+ 0xE5E0: 0x9B5A, //CJK UNIFIED IDEOGRAPH
+ 0xE5E1: 0x9F6C, //CJK UNIFIED IDEOGRAPH
+ 0xE5E2: 0x5104, //CJK UNIFIED IDEOGRAPH
+ 0xE5E3: 0x61B6, //CJK UNIFIED IDEOGRAPH
+ 0xE5E4: 0x6291, //CJK UNIFIED IDEOGRAPH
+ 0xE5E5: 0x6A8D, //CJK UNIFIED IDEOGRAPH
+ 0xE5E6: 0x81C6, //CJK UNIFIED IDEOGRAPH
+ 0xE5E7: 0x5043, //CJK UNIFIED IDEOGRAPH
+ 0xE5E8: 0x5830, //CJK UNIFIED IDEOGRAPH
+ 0xE5E9: 0x5F66, //CJK UNIFIED IDEOGRAPH
+ 0xE5EA: 0x7109, //CJK UNIFIED IDEOGRAPH
+ 0xE5EB: 0x8A00, //CJK UNIFIED IDEOGRAPH
+ 0xE5EC: 0x8AFA, //CJK UNIFIED IDEOGRAPH
+ 0xE5ED: 0x5B7C, //CJK UNIFIED IDEOGRAPH
+ 0xE5EE: 0x8616, //CJK UNIFIED IDEOGRAPH
+ 0xE5EF: 0x4FFA, //CJK UNIFIED IDEOGRAPH
+ 0xE5F0: 0x513C, //CJK UNIFIED IDEOGRAPH
+ 0xE5F1: 0x56B4, //CJK UNIFIED IDEOGRAPH
+ 0xE5F2: 0x5944, //CJK UNIFIED IDEOGRAPH
+ 0xE5F3: 0x63A9, //CJK UNIFIED IDEOGRAPH
+ 0xE5F4: 0x6DF9, //CJK UNIFIED IDEOGRAPH
+ 0xE5F5: 0x5DAA, //CJK UNIFIED IDEOGRAPH
+ 0xE5F6: 0x696D, //CJK UNIFIED IDEOGRAPH
+ 0xE5F7: 0x5186, //CJK UNIFIED IDEOGRAPH
+ 0xE5F8: 0x4E88, //CJK UNIFIED IDEOGRAPH
+ 0xE5F9: 0x4F59, //CJK UNIFIED IDEOGRAPH
+ 0xE5FA: 0xF97F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5FB: 0xF980, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5FC: 0xF981, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE5FD: 0x5982, //CJK UNIFIED IDEOGRAPH
+ 0xE5FE: 0xF982, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6A1: 0xF983, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6A2: 0x6B5F, //CJK UNIFIED IDEOGRAPH
+ 0xE6A3: 0x6C5D, //CJK UNIFIED IDEOGRAPH
+ 0xE6A4: 0xF984, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6A5: 0x74B5, //CJK UNIFIED IDEOGRAPH
+ 0xE6A6: 0x7916, //CJK UNIFIED IDEOGRAPH
+ 0xE6A7: 0xF985, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6A8: 0x8207, //CJK UNIFIED IDEOGRAPH
+ 0xE6A9: 0x8245, //CJK UNIFIED IDEOGRAPH
+ 0xE6AA: 0x8339, //CJK UNIFIED IDEOGRAPH
+ 0xE6AB: 0x8F3F, //CJK UNIFIED IDEOGRAPH
+ 0xE6AC: 0x8F5D, //CJK UNIFIED IDEOGRAPH
+ 0xE6AD: 0xF986, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6AE: 0x9918, //CJK UNIFIED IDEOGRAPH
+ 0xE6AF: 0xF987, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6B0: 0xF988, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6B1: 0xF989, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6B2: 0x4EA6, //CJK UNIFIED IDEOGRAPH
+ 0xE6B3: 0xF98A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6B4: 0x57DF, //CJK UNIFIED IDEOGRAPH
+ 0xE6B5: 0x5F79, //CJK UNIFIED IDEOGRAPH
+ 0xE6B6: 0x6613, //CJK UNIFIED IDEOGRAPH
+ 0xE6B7: 0xF98B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6B8: 0xF98C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6B9: 0x75AB, //CJK UNIFIED IDEOGRAPH
+ 0xE6BA: 0x7E79, //CJK UNIFIED IDEOGRAPH
+ 0xE6BB: 0x8B6F, //CJK UNIFIED IDEOGRAPH
+ 0xE6BC: 0xF98D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6BD: 0x9006, //CJK UNIFIED IDEOGRAPH
+ 0xE6BE: 0x9A5B, //CJK UNIFIED IDEOGRAPH
+ 0xE6BF: 0x56A5, //CJK UNIFIED IDEOGRAPH
+ 0xE6C0: 0x5827, //CJK UNIFIED IDEOGRAPH
+ 0xE6C1: 0x59F8, //CJK UNIFIED IDEOGRAPH
+ 0xE6C2: 0x5A1F, //CJK UNIFIED IDEOGRAPH
+ 0xE6C3: 0x5BB4, //CJK UNIFIED IDEOGRAPH
+ 0xE6C4: 0xF98E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6C5: 0x5EF6, //CJK UNIFIED IDEOGRAPH
+ 0xE6C6: 0xF98F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6C7: 0xF990, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6C8: 0x6350, //CJK UNIFIED IDEOGRAPH
+ 0xE6C9: 0x633B, //CJK UNIFIED IDEOGRAPH
+ 0xE6CA: 0xF991, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6CB: 0x693D, //CJK UNIFIED IDEOGRAPH
+ 0xE6CC: 0x6C87, //CJK UNIFIED IDEOGRAPH
+ 0xE6CD: 0x6CBF, //CJK UNIFIED IDEOGRAPH
+ 0xE6CE: 0x6D8E, //CJK UNIFIED IDEOGRAPH
+ 0xE6CF: 0x6D93, //CJK UNIFIED IDEOGRAPH
+ 0xE6D0: 0x6DF5, //CJK UNIFIED IDEOGRAPH
+ 0xE6D1: 0x6F14, //CJK UNIFIED IDEOGRAPH
+ 0xE6D2: 0xF992, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6D3: 0x70DF, //CJK UNIFIED IDEOGRAPH
+ 0xE6D4: 0x7136, //CJK UNIFIED IDEOGRAPH
+ 0xE6D5: 0x7159, //CJK UNIFIED IDEOGRAPH
+ 0xE6D6: 0xF993, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6D7: 0x71C3, //CJK UNIFIED IDEOGRAPH
+ 0xE6D8: 0x71D5, //CJK UNIFIED IDEOGRAPH
+ 0xE6D9: 0xF994, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6DA: 0x784F, //CJK UNIFIED IDEOGRAPH
+ 0xE6DB: 0x786F, //CJK UNIFIED IDEOGRAPH
+ 0xE6DC: 0xF995, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6DD: 0x7B75, //CJK UNIFIED IDEOGRAPH
+ 0xE6DE: 0x7DE3, //CJK UNIFIED IDEOGRAPH
+ 0xE6DF: 0xF996, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6E0: 0x7E2F, //CJK UNIFIED IDEOGRAPH
+ 0xE6E1: 0xF997, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6E2: 0x884D, //CJK UNIFIED IDEOGRAPH
+ 0xE6E3: 0x8EDF, //CJK UNIFIED IDEOGRAPH
+ 0xE6E4: 0xF998, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6E5: 0xF999, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6E6: 0xF99A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6E7: 0x925B, //CJK UNIFIED IDEOGRAPH
+ 0xE6E8: 0xF99B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6E9: 0x9CF6, //CJK UNIFIED IDEOGRAPH
+ 0xE6EA: 0xF99C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6EB: 0xF99D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6EC: 0xF99E, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6ED: 0x6085, //CJK UNIFIED IDEOGRAPH
+ 0xE6EE: 0x6D85, //CJK UNIFIED IDEOGRAPH
+ 0xE6EF: 0xF99F, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6F0: 0x71B1, //CJK UNIFIED IDEOGRAPH
+ 0xE6F1: 0xF9A0, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6F2: 0xF9A1, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6F3: 0x95B1, //CJK UNIFIED IDEOGRAPH
+ 0xE6F4: 0x53AD, //CJK UNIFIED IDEOGRAPH
+ 0xE6F5: 0xF9A2, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6F6: 0xF9A3, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6F7: 0xF9A4, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6F8: 0x67D3, //CJK UNIFIED IDEOGRAPH
+ 0xE6F9: 0xF9A5, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE6FA: 0x708E, //CJK UNIFIED IDEOGRAPH
+ 0xE6FB: 0x7130, //CJK UNIFIED IDEOGRAPH
+ 0xE6FC: 0x7430, //CJK UNIFIED IDEOGRAPH
+ 0xE6FD: 0x8276, //CJK UNIFIED IDEOGRAPH
+ 0xE6FE: 0x82D2, //CJK UNIFIED IDEOGRAPH
+ 0xE7A1: 0xF9A6, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7A2: 0x95BB, //CJK UNIFIED IDEOGRAPH
+ 0xE7A3: 0x9AE5, //CJK UNIFIED IDEOGRAPH
+ 0xE7A4: 0x9E7D, //CJK UNIFIED IDEOGRAPH
+ 0xE7A5: 0x66C4, //CJK UNIFIED IDEOGRAPH
+ 0xE7A6: 0xF9A7, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7A7: 0x71C1, //CJK UNIFIED IDEOGRAPH
+ 0xE7A8: 0x8449, //CJK UNIFIED IDEOGRAPH
+ 0xE7A9: 0xF9A8, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7AA: 0xF9A9, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7AB: 0x584B, //CJK UNIFIED IDEOGRAPH
+ 0xE7AC: 0xF9AA, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7AD: 0xF9AB, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7AE: 0x5DB8, //CJK UNIFIED IDEOGRAPH
+ 0xE7AF: 0x5F71, //CJK UNIFIED IDEOGRAPH
+ 0xE7B0: 0xF9AC, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7B1: 0x6620, //CJK UNIFIED IDEOGRAPH
+ 0xE7B2: 0x668E, //CJK UNIFIED IDEOGRAPH
+ 0xE7B3: 0x6979, //CJK UNIFIED IDEOGRAPH
+ 0xE7B4: 0x69AE, //CJK UNIFIED IDEOGRAPH
+ 0xE7B5: 0x6C38, //CJK UNIFIED IDEOGRAPH
+ 0xE7B6: 0x6CF3, //CJK UNIFIED IDEOGRAPH
+ 0xE7B7: 0x6E36, //CJK UNIFIED IDEOGRAPH
+ 0xE7B8: 0x6F41, //CJK UNIFIED IDEOGRAPH
+ 0xE7B9: 0x6FDA, //CJK UNIFIED IDEOGRAPH
+ 0xE7BA: 0x701B, //CJK UNIFIED IDEOGRAPH
+ 0xE7BB: 0x702F, //CJK UNIFIED IDEOGRAPH
+ 0xE7BC: 0x7150, //CJK UNIFIED IDEOGRAPH
+ 0xE7BD: 0x71DF, //CJK UNIFIED IDEOGRAPH
+ 0xE7BE: 0x7370, //CJK UNIFIED IDEOGRAPH
+ 0xE7BF: 0xF9AD, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7C0: 0x745B, //CJK UNIFIED IDEOGRAPH
+ 0xE7C1: 0xF9AE, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7C2: 0x74D4, //CJK UNIFIED IDEOGRAPH
+ 0xE7C3: 0x76C8, //CJK UNIFIED IDEOGRAPH
+ 0xE7C4: 0x7A4E, //CJK UNIFIED IDEOGRAPH
+ 0xE7C5: 0x7E93, //CJK UNIFIED IDEOGRAPH
+ 0xE7C6: 0xF9AF, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7C7: 0xF9B0, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7C8: 0x82F1, //CJK UNIFIED IDEOGRAPH
+ 0xE7C9: 0x8A60, //CJK UNIFIED IDEOGRAPH
+ 0xE7CA: 0x8FCE, //CJK UNIFIED IDEOGRAPH
+ 0xE7CB: 0xF9B1, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7CC: 0x9348, //CJK UNIFIED IDEOGRAPH
+ 0xE7CD: 0xF9B2, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7CE: 0x9719, //CJK UNIFIED IDEOGRAPH
+ 0xE7CF: 0xF9B3, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7D0: 0xF9B4, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7D1: 0x4E42, //CJK UNIFIED IDEOGRAPH
+ 0xE7D2: 0x502A, //CJK UNIFIED IDEOGRAPH
+ 0xE7D3: 0xF9B5, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7D4: 0x5208, //CJK UNIFIED IDEOGRAPH
+ 0xE7D5: 0x53E1, //CJK UNIFIED IDEOGRAPH
+ 0xE7D6: 0x66F3, //CJK UNIFIED IDEOGRAPH
+ 0xE7D7: 0x6C6D, //CJK UNIFIED IDEOGRAPH
+ 0xE7D8: 0x6FCA, //CJK UNIFIED IDEOGRAPH
+ 0xE7D9: 0x730A, //CJK UNIFIED IDEOGRAPH
+ 0xE7DA: 0x777F, //CJK UNIFIED IDEOGRAPH
+ 0xE7DB: 0x7A62, //CJK UNIFIED IDEOGRAPH
+ 0xE7DC: 0x82AE, //CJK UNIFIED IDEOGRAPH
+ 0xE7DD: 0x85DD, //CJK UNIFIED IDEOGRAPH
+ 0xE7DE: 0x8602, //CJK UNIFIED IDEOGRAPH
+ 0xE7DF: 0xF9B6, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7E0: 0x88D4, //CJK UNIFIED IDEOGRAPH
+ 0xE7E1: 0x8A63, //CJK UNIFIED IDEOGRAPH
+ 0xE7E2: 0x8B7D, //CJK UNIFIED IDEOGRAPH
+ 0xE7E3: 0x8C6B, //CJK UNIFIED IDEOGRAPH
+ 0xE7E4: 0xF9B7, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7E5: 0x92B3, //CJK UNIFIED IDEOGRAPH
+ 0xE7E6: 0xF9B8, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7E7: 0x9713, //CJK UNIFIED IDEOGRAPH
+ 0xE7E8: 0x9810, //CJK UNIFIED IDEOGRAPH
+ 0xE7E9: 0x4E94, //CJK UNIFIED IDEOGRAPH
+ 0xE7EA: 0x4F0D, //CJK UNIFIED IDEOGRAPH
+ 0xE7EB: 0x4FC9, //CJK UNIFIED IDEOGRAPH
+ 0xE7EC: 0x50B2, //CJK UNIFIED IDEOGRAPH
+ 0xE7ED: 0x5348, //CJK UNIFIED IDEOGRAPH
+ 0xE7EE: 0x543E, //CJK UNIFIED IDEOGRAPH
+ 0xE7EF: 0x5433, //CJK UNIFIED IDEOGRAPH
+ 0xE7F0: 0x55DA, //CJK UNIFIED IDEOGRAPH
+ 0xE7F1: 0x5862, //CJK UNIFIED IDEOGRAPH
+ 0xE7F2: 0x58BA, //CJK UNIFIED IDEOGRAPH
+ 0xE7F3: 0x5967, //CJK UNIFIED IDEOGRAPH
+ 0xE7F4: 0x5A1B, //CJK UNIFIED IDEOGRAPH
+ 0xE7F5: 0x5BE4, //CJK UNIFIED IDEOGRAPH
+ 0xE7F6: 0x609F, //CJK UNIFIED IDEOGRAPH
+ 0xE7F7: 0xF9B9, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE7F8: 0x61CA, //CJK UNIFIED IDEOGRAPH
+ 0xE7F9: 0x6556, //CJK UNIFIED IDEOGRAPH
+ 0xE7FA: 0x65FF, //CJK UNIFIED IDEOGRAPH
+ 0xE7FB: 0x6664, //CJK UNIFIED IDEOGRAPH
+ 0xE7FC: 0x68A7, //CJK UNIFIED IDEOGRAPH
+ 0xE7FD: 0x6C5A, //CJK UNIFIED IDEOGRAPH
+ 0xE7FE: 0x6FB3, //CJK UNIFIED IDEOGRAPH
+ 0xE8A1: 0x70CF, //CJK UNIFIED IDEOGRAPH
+ 0xE8A2: 0x71AC, //CJK UNIFIED IDEOGRAPH
+ 0xE8A3: 0x7352, //CJK UNIFIED IDEOGRAPH
+ 0xE8A4: 0x7B7D, //CJK UNIFIED IDEOGRAPH
+ 0xE8A5: 0x8708, //CJK UNIFIED IDEOGRAPH
+ 0xE8A6: 0x8AA4, //CJK UNIFIED IDEOGRAPH
+ 0xE8A7: 0x9C32, //CJK UNIFIED IDEOGRAPH
+ 0xE8A8: 0x9F07, //CJK UNIFIED IDEOGRAPH
+ 0xE8A9: 0x5C4B, //CJK UNIFIED IDEOGRAPH
+ 0xE8AA: 0x6C83, //CJK UNIFIED IDEOGRAPH
+ 0xE8AB: 0x7344, //CJK UNIFIED IDEOGRAPH
+ 0xE8AC: 0x7389, //CJK UNIFIED IDEOGRAPH
+ 0xE8AD: 0x923A, //CJK UNIFIED IDEOGRAPH
+ 0xE8AE: 0x6EAB, //CJK UNIFIED IDEOGRAPH
+ 0xE8AF: 0x7465, //CJK UNIFIED IDEOGRAPH
+ 0xE8B0: 0x761F, //CJK UNIFIED IDEOGRAPH
+ 0xE8B1: 0x7A69, //CJK UNIFIED IDEOGRAPH
+ 0xE8B2: 0x7E15, //CJK UNIFIED IDEOGRAPH
+ 0xE8B3: 0x860A, //CJK UNIFIED IDEOGRAPH
+ 0xE8B4: 0x5140, //CJK UNIFIED IDEOGRAPH
+ 0xE8B5: 0x58C5, //CJK UNIFIED IDEOGRAPH
+ 0xE8B6: 0x64C1, //CJK UNIFIED IDEOGRAPH
+ 0xE8B7: 0x74EE, //CJK UNIFIED IDEOGRAPH
+ 0xE8B8: 0x7515, //CJK UNIFIED IDEOGRAPH
+ 0xE8B9: 0x7670, //CJK UNIFIED IDEOGRAPH
+ 0xE8BA: 0x7FC1, //CJK UNIFIED IDEOGRAPH
+ 0xE8BB: 0x9095, //CJK UNIFIED IDEOGRAPH
+ 0xE8BC: 0x96CD, //CJK UNIFIED IDEOGRAPH
+ 0xE8BD: 0x9954, //CJK UNIFIED IDEOGRAPH
+ 0xE8BE: 0x6E26, //CJK UNIFIED IDEOGRAPH
+ 0xE8BF: 0x74E6, //CJK UNIFIED IDEOGRAPH
+ 0xE8C0: 0x7AA9, //CJK UNIFIED IDEOGRAPH
+ 0xE8C1: 0x7AAA, //CJK UNIFIED IDEOGRAPH
+ 0xE8C2: 0x81E5, //CJK UNIFIED IDEOGRAPH
+ 0xE8C3: 0x86D9, //CJK UNIFIED IDEOGRAPH
+ 0xE8C4: 0x8778, //CJK UNIFIED IDEOGRAPH
+ 0xE8C5: 0x8A1B, //CJK UNIFIED IDEOGRAPH
+ 0xE8C6: 0x5A49, //CJK UNIFIED IDEOGRAPH
+ 0xE8C7: 0x5B8C, //CJK UNIFIED IDEOGRAPH
+ 0xE8C8: 0x5B9B, //CJK UNIFIED IDEOGRAPH
+ 0xE8C9: 0x68A1, //CJK UNIFIED IDEOGRAPH
+ 0xE8CA: 0x6900, //CJK UNIFIED IDEOGRAPH
+ 0xE8CB: 0x6D63, //CJK UNIFIED IDEOGRAPH
+ 0xE8CC: 0x73A9, //CJK UNIFIED IDEOGRAPH
+ 0xE8CD: 0x7413, //CJK UNIFIED IDEOGRAPH
+ 0xE8CE: 0x742C, //CJK UNIFIED IDEOGRAPH
+ 0xE8CF: 0x7897, //CJK UNIFIED IDEOGRAPH
+ 0xE8D0: 0x7DE9, //CJK UNIFIED IDEOGRAPH
+ 0xE8D1: 0x7FEB, //CJK UNIFIED IDEOGRAPH
+ 0xE8D2: 0x8118, //CJK UNIFIED IDEOGRAPH
+ 0xE8D3: 0x8155, //CJK UNIFIED IDEOGRAPH
+ 0xE8D4: 0x839E, //CJK UNIFIED IDEOGRAPH
+ 0xE8D5: 0x8C4C, //CJK UNIFIED IDEOGRAPH
+ 0xE8D6: 0x962E, //CJK UNIFIED IDEOGRAPH
+ 0xE8D7: 0x9811, //CJK UNIFIED IDEOGRAPH
+ 0xE8D8: 0x66F0, //CJK UNIFIED IDEOGRAPH
+ 0xE8D9: 0x5F80, //CJK UNIFIED IDEOGRAPH
+ 0xE8DA: 0x65FA, //CJK UNIFIED IDEOGRAPH
+ 0xE8DB: 0x6789, //CJK UNIFIED IDEOGRAPH
+ 0xE8DC: 0x6C6A, //CJK UNIFIED IDEOGRAPH
+ 0xE8DD: 0x738B, //CJK UNIFIED IDEOGRAPH
+ 0xE8DE: 0x502D, //CJK UNIFIED IDEOGRAPH
+ 0xE8DF: 0x5A03, //CJK UNIFIED IDEOGRAPH
+ 0xE8E0: 0x6B6A, //CJK UNIFIED IDEOGRAPH
+ 0xE8E1: 0x77EE, //CJK UNIFIED IDEOGRAPH
+ 0xE8E2: 0x5916, //CJK UNIFIED IDEOGRAPH
+ 0xE8E3: 0x5D6C, //CJK UNIFIED IDEOGRAPH
+ 0xE8E4: 0x5DCD, //CJK UNIFIED IDEOGRAPH
+ 0xE8E5: 0x7325, //CJK UNIFIED IDEOGRAPH
+ 0xE8E6: 0x754F, //CJK UNIFIED IDEOGRAPH
+ 0xE8E7: 0xF9BA, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE8E8: 0xF9BB, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE8E9: 0x50E5, //CJK UNIFIED IDEOGRAPH
+ 0xE8EA: 0x51F9, //CJK UNIFIED IDEOGRAPH
+ 0xE8EB: 0x582F, //CJK UNIFIED IDEOGRAPH
+ 0xE8EC: 0x592D, //CJK UNIFIED IDEOGRAPH
+ 0xE8ED: 0x5996, //CJK UNIFIED IDEOGRAPH
+ 0xE8EE: 0x59DA, //CJK UNIFIED IDEOGRAPH
+ 0xE8EF: 0x5BE5, //CJK UNIFIED IDEOGRAPH
+ 0xE8F0: 0xF9BC, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE8F1: 0xF9BD, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE8F2: 0x5DA2, //CJK UNIFIED IDEOGRAPH
+ 0xE8F3: 0x62D7, //CJK UNIFIED IDEOGRAPH
+ 0xE8F4: 0x6416, //CJK UNIFIED IDEOGRAPH
+ 0xE8F5: 0x6493, //CJK UNIFIED IDEOGRAPH
+ 0xE8F6: 0x64FE, //CJK UNIFIED IDEOGRAPH
+ 0xE8F7: 0xF9BE, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE8F8: 0x66DC, //CJK UNIFIED IDEOGRAPH
+ 0xE8F9: 0xF9BF, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE8FA: 0x6A48, //CJK UNIFIED IDEOGRAPH
+ 0xE8FB: 0xF9C0, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE8FC: 0x71FF, //CJK UNIFIED IDEOGRAPH
+ 0xE8FD: 0x7464, //CJK UNIFIED IDEOGRAPH
+ 0xE8FE: 0xF9C1, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE9A1: 0x7A88, //CJK UNIFIED IDEOGRAPH
+ 0xE9A2: 0x7AAF, //CJK UNIFIED IDEOGRAPH
+ 0xE9A3: 0x7E47, //CJK UNIFIED IDEOGRAPH
+ 0xE9A4: 0x7E5E, //CJK UNIFIED IDEOGRAPH
+ 0xE9A5: 0x8000, //CJK UNIFIED IDEOGRAPH
+ 0xE9A6: 0x8170, //CJK UNIFIED IDEOGRAPH
+ 0xE9A7: 0xF9C2, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE9A8: 0x87EF, //CJK UNIFIED IDEOGRAPH
+ 0xE9A9: 0x8981, //CJK UNIFIED IDEOGRAPH
+ 0xE9AA: 0x8B20, //CJK UNIFIED IDEOGRAPH
+ 0xE9AB: 0x9059, //CJK UNIFIED IDEOGRAPH
+ 0xE9AC: 0xF9C3, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE9AD: 0x9080, //CJK UNIFIED IDEOGRAPH
+ 0xE9AE: 0x9952, //CJK UNIFIED IDEOGRAPH
+ 0xE9AF: 0x617E, //CJK UNIFIED IDEOGRAPH
+ 0xE9B0: 0x6B32, //CJK UNIFIED IDEOGRAPH
+ 0xE9B1: 0x6D74, //CJK UNIFIED IDEOGRAPH
+ 0xE9B2: 0x7E1F, //CJK UNIFIED IDEOGRAPH
+ 0xE9B3: 0x8925, //CJK UNIFIED IDEOGRAPH
+ 0xE9B4: 0x8FB1, //CJK UNIFIED IDEOGRAPH
+ 0xE9B5: 0x4FD1, //CJK UNIFIED IDEOGRAPH
+ 0xE9B6: 0x50AD, //CJK UNIFIED IDEOGRAPH
+ 0xE9B7: 0x5197, //CJK UNIFIED IDEOGRAPH
+ 0xE9B8: 0x52C7, //CJK UNIFIED IDEOGRAPH
+ 0xE9B9: 0x57C7, //CJK UNIFIED IDEOGRAPH
+ 0xE9BA: 0x5889, //CJK UNIFIED IDEOGRAPH
+ 0xE9BB: 0x5BB9, //CJK UNIFIED IDEOGRAPH
+ 0xE9BC: 0x5EB8, //CJK UNIFIED IDEOGRAPH
+ 0xE9BD: 0x6142, //CJK UNIFIED IDEOGRAPH
+ 0xE9BE: 0x6995, //CJK UNIFIED IDEOGRAPH
+ 0xE9BF: 0x6D8C, //CJK UNIFIED IDEOGRAPH
+ 0xE9C0: 0x6E67, //CJK UNIFIED IDEOGRAPH
+ 0xE9C1: 0x6EB6, //CJK UNIFIED IDEOGRAPH
+ 0xE9C2: 0x7194, //CJK UNIFIED IDEOGRAPH
+ 0xE9C3: 0x7462, //CJK UNIFIED IDEOGRAPH
+ 0xE9C4: 0x7528, //CJK UNIFIED IDEOGRAPH
+ 0xE9C5: 0x752C, //CJK UNIFIED IDEOGRAPH
+ 0xE9C6: 0x8073, //CJK UNIFIED IDEOGRAPH
+ 0xE9C7: 0x8338, //CJK UNIFIED IDEOGRAPH
+ 0xE9C8: 0x84C9, //CJK UNIFIED IDEOGRAPH
+ 0xE9C9: 0x8E0A, //CJK UNIFIED IDEOGRAPH
+ 0xE9CA: 0x9394, //CJK UNIFIED IDEOGRAPH
+ 0xE9CB: 0x93DE, //CJK UNIFIED IDEOGRAPH
+ 0xE9CC: 0xF9C4, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE9CD: 0x4E8E, //CJK UNIFIED IDEOGRAPH
+ 0xE9CE: 0x4F51, //CJK UNIFIED IDEOGRAPH
+ 0xE9CF: 0x5076, //CJK UNIFIED IDEOGRAPH
+ 0xE9D0: 0x512A, //CJK UNIFIED IDEOGRAPH
+ 0xE9D1: 0x53C8, //CJK UNIFIED IDEOGRAPH
+ 0xE9D2: 0x53CB, //CJK UNIFIED IDEOGRAPH
+ 0xE9D3: 0x53F3, //CJK UNIFIED IDEOGRAPH
+ 0xE9D4: 0x5B87, //CJK UNIFIED IDEOGRAPH
+ 0xE9D5: 0x5BD3, //CJK UNIFIED IDEOGRAPH
+ 0xE9D6: 0x5C24, //CJK UNIFIED IDEOGRAPH
+ 0xE9D7: 0x611A, //CJK UNIFIED IDEOGRAPH
+ 0xE9D8: 0x6182, //CJK UNIFIED IDEOGRAPH
+ 0xE9D9: 0x65F4, //CJK UNIFIED IDEOGRAPH
+ 0xE9DA: 0x725B, //CJK UNIFIED IDEOGRAPH
+ 0xE9DB: 0x7397, //CJK UNIFIED IDEOGRAPH
+ 0xE9DC: 0x7440, //CJK UNIFIED IDEOGRAPH
+ 0xE9DD: 0x76C2, //CJK UNIFIED IDEOGRAPH
+ 0xE9DE: 0x7950, //CJK UNIFIED IDEOGRAPH
+ 0xE9DF: 0x7991, //CJK UNIFIED IDEOGRAPH
+ 0xE9E0: 0x79B9, //CJK UNIFIED IDEOGRAPH
+ 0xE9E1: 0x7D06, //CJK UNIFIED IDEOGRAPH
+ 0xE9E2: 0x7FBD, //CJK UNIFIED IDEOGRAPH
+ 0xE9E3: 0x828B, //CJK UNIFIED IDEOGRAPH
+ 0xE9E4: 0x85D5, //CJK UNIFIED IDEOGRAPH
+ 0xE9E5: 0x865E, //CJK UNIFIED IDEOGRAPH
+ 0xE9E6: 0x8FC2, //CJK UNIFIED IDEOGRAPH
+ 0xE9E7: 0x9047, //CJK UNIFIED IDEOGRAPH
+ 0xE9E8: 0x90F5, //CJK UNIFIED IDEOGRAPH
+ 0xE9E9: 0x91EA, //CJK UNIFIED IDEOGRAPH
+ 0xE9EA: 0x9685, //CJK UNIFIED IDEOGRAPH
+ 0xE9EB: 0x96E8, //CJK UNIFIED IDEOGRAPH
+ 0xE9EC: 0x96E9, //CJK UNIFIED IDEOGRAPH
+ 0xE9ED: 0x52D6, //CJK UNIFIED IDEOGRAPH
+ 0xE9EE: 0x5F67, //CJK UNIFIED IDEOGRAPH
+ 0xE9EF: 0x65ED, //CJK UNIFIED IDEOGRAPH
+ 0xE9F0: 0x6631, //CJK UNIFIED IDEOGRAPH
+ 0xE9F1: 0x682F, //CJK UNIFIED IDEOGRAPH
+ 0xE9F2: 0x715C, //CJK UNIFIED IDEOGRAPH
+ 0xE9F3: 0x7A36, //CJK UNIFIED IDEOGRAPH
+ 0xE9F4: 0x90C1, //CJK UNIFIED IDEOGRAPH
+ 0xE9F5: 0x980A, //CJK UNIFIED IDEOGRAPH
+ 0xE9F6: 0x4E91, //CJK UNIFIED IDEOGRAPH
+ 0xE9F7: 0xF9C5, //CJK COMPATIBILITY IDEOGRAPH
+ 0xE9F8: 0x6A52, //CJK UNIFIED IDEOGRAPH
+ 0xE9F9: 0x6B9E, //CJK UNIFIED IDEOGRAPH
+ 0xE9FA: 0x6F90, //CJK UNIFIED IDEOGRAPH
+ 0xE9FB: 0x7189, //CJK UNIFIED IDEOGRAPH
+ 0xE9FC: 0x8018, //CJK UNIFIED IDEOGRAPH
+ 0xE9FD: 0x82B8, //CJK UNIFIED IDEOGRAPH
+ 0xE9FE: 0x8553, //CJK UNIFIED IDEOGRAPH
+ 0xEAA1: 0x904B, //CJK UNIFIED IDEOGRAPH
+ 0xEAA2: 0x9695, //CJK UNIFIED IDEOGRAPH
+ 0xEAA3: 0x96F2, //CJK UNIFIED IDEOGRAPH
+ 0xEAA4: 0x97FB, //CJK UNIFIED IDEOGRAPH
+ 0xEAA5: 0x851A, //CJK UNIFIED IDEOGRAPH
+ 0xEAA6: 0x9B31, //CJK UNIFIED IDEOGRAPH
+ 0xEAA7: 0x4E90, //CJK UNIFIED IDEOGRAPH
+ 0xEAA8: 0x718A, //CJK UNIFIED IDEOGRAPH
+ 0xEAA9: 0x96C4, //CJK UNIFIED IDEOGRAPH
+ 0xEAAA: 0x5143, //CJK UNIFIED IDEOGRAPH
+ 0xEAAB: 0x539F, //CJK UNIFIED IDEOGRAPH
+ 0xEAAC: 0x54E1, //CJK UNIFIED IDEOGRAPH
+ 0xEAAD: 0x5713, //CJK UNIFIED IDEOGRAPH
+ 0xEAAE: 0x5712, //CJK UNIFIED IDEOGRAPH
+ 0xEAAF: 0x57A3, //CJK UNIFIED IDEOGRAPH
+ 0xEAB0: 0x5A9B, //CJK UNIFIED IDEOGRAPH
+ 0xEAB1: 0x5AC4, //CJK UNIFIED IDEOGRAPH
+ 0xEAB2: 0x5BC3, //CJK UNIFIED IDEOGRAPH
+ 0xEAB3: 0x6028, //CJK UNIFIED IDEOGRAPH
+ 0xEAB4: 0x613F, //CJK UNIFIED IDEOGRAPH
+ 0xEAB5: 0x63F4, //CJK UNIFIED IDEOGRAPH
+ 0xEAB6: 0x6C85, //CJK UNIFIED IDEOGRAPH
+ 0xEAB7: 0x6D39, //CJK UNIFIED IDEOGRAPH
+ 0xEAB8: 0x6E72, //CJK UNIFIED IDEOGRAPH
+ 0xEAB9: 0x6E90, //CJK UNIFIED IDEOGRAPH
+ 0xEABA: 0x7230, //CJK UNIFIED IDEOGRAPH
+ 0xEABB: 0x733F, //CJK UNIFIED IDEOGRAPH
+ 0xEABC: 0x7457, //CJK UNIFIED IDEOGRAPH
+ 0xEABD: 0x82D1, //CJK UNIFIED IDEOGRAPH
+ 0xEABE: 0x8881, //CJK UNIFIED IDEOGRAPH
+ 0xEABF: 0x8F45, //CJK UNIFIED IDEOGRAPH
+ 0xEAC0: 0x9060, //CJK UNIFIED IDEOGRAPH
+ 0xEAC1: 0xF9C6, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEAC2: 0x9662, //CJK UNIFIED IDEOGRAPH
+ 0xEAC3: 0x9858, //CJK UNIFIED IDEOGRAPH
+ 0xEAC4: 0x9D1B, //CJK UNIFIED IDEOGRAPH
+ 0xEAC5: 0x6708, //CJK UNIFIED IDEOGRAPH
+ 0xEAC6: 0x8D8A, //CJK UNIFIED IDEOGRAPH
+ 0xEAC7: 0x925E, //CJK UNIFIED IDEOGRAPH
+ 0xEAC8: 0x4F4D, //CJK UNIFIED IDEOGRAPH
+ 0xEAC9: 0x5049, //CJK UNIFIED IDEOGRAPH
+ 0xEACA: 0x50DE, //CJK UNIFIED IDEOGRAPH
+ 0xEACB: 0x5371, //CJK UNIFIED IDEOGRAPH
+ 0xEACC: 0x570D, //CJK UNIFIED IDEOGRAPH
+ 0xEACD: 0x59D4, //CJK UNIFIED IDEOGRAPH
+ 0xEACE: 0x5A01, //CJK UNIFIED IDEOGRAPH
+ 0xEACF: 0x5C09, //CJK UNIFIED IDEOGRAPH
+ 0xEAD0: 0x6170, //CJK UNIFIED IDEOGRAPH
+ 0xEAD1: 0x6690, //CJK UNIFIED IDEOGRAPH
+ 0xEAD2: 0x6E2D, //CJK UNIFIED IDEOGRAPH
+ 0xEAD3: 0x7232, //CJK UNIFIED IDEOGRAPH
+ 0xEAD4: 0x744B, //CJK UNIFIED IDEOGRAPH
+ 0xEAD5: 0x7DEF, //CJK UNIFIED IDEOGRAPH
+ 0xEAD6: 0x80C3, //CJK UNIFIED IDEOGRAPH
+ 0xEAD7: 0x840E, //CJK UNIFIED IDEOGRAPH
+ 0xEAD8: 0x8466, //CJK UNIFIED IDEOGRAPH
+ 0xEAD9: 0x853F, //CJK UNIFIED IDEOGRAPH
+ 0xEADA: 0x875F, //CJK UNIFIED IDEOGRAPH
+ 0xEADB: 0x885B, //CJK UNIFIED IDEOGRAPH
+ 0xEADC: 0x8918, //CJK UNIFIED IDEOGRAPH
+ 0xEADD: 0x8B02, //CJK UNIFIED IDEOGRAPH
+ 0xEADE: 0x9055, //CJK UNIFIED IDEOGRAPH
+ 0xEADF: 0x97CB, //CJK UNIFIED IDEOGRAPH
+ 0xEAE0: 0x9B4F, //CJK UNIFIED IDEOGRAPH
+ 0xEAE1: 0x4E73, //CJK UNIFIED IDEOGRAPH
+ 0xEAE2: 0x4F91, //CJK UNIFIED IDEOGRAPH
+ 0xEAE3: 0x5112, //CJK UNIFIED IDEOGRAPH
+ 0xEAE4: 0x516A, //CJK UNIFIED IDEOGRAPH
+ 0xEAE5: 0xF9C7, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEAE6: 0x552F, //CJK UNIFIED IDEOGRAPH
+ 0xEAE7: 0x55A9, //CJK UNIFIED IDEOGRAPH
+ 0xEAE8: 0x5B7A, //CJK UNIFIED IDEOGRAPH
+ 0xEAE9: 0x5BA5, //CJK UNIFIED IDEOGRAPH
+ 0xEAEA: 0x5E7C, //CJK UNIFIED IDEOGRAPH
+ 0xEAEB: 0x5E7D, //CJK UNIFIED IDEOGRAPH
+ 0xEAEC: 0x5EBE, //CJK UNIFIED IDEOGRAPH
+ 0xEAED: 0x60A0, //CJK UNIFIED IDEOGRAPH
+ 0xEAEE: 0x60DF, //CJK UNIFIED IDEOGRAPH
+ 0xEAEF: 0x6108, //CJK UNIFIED IDEOGRAPH
+ 0xEAF0: 0x6109, //CJK UNIFIED IDEOGRAPH
+ 0xEAF1: 0x63C4, //CJK UNIFIED IDEOGRAPH
+ 0xEAF2: 0x6538, //CJK UNIFIED IDEOGRAPH
+ 0xEAF3: 0x6709, //CJK UNIFIED IDEOGRAPH
+ 0xEAF4: 0xF9C8, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEAF5: 0x67D4, //CJK UNIFIED IDEOGRAPH
+ 0xEAF6: 0x67DA, //CJK UNIFIED IDEOGRAPH
+ 0xEAF7: 0xF9C9, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEAF8: 0x6961, //CJK UNIFIED IDEOGRAPH
+ 0xEAF9: 0x6962, //CJK UNIFIED IDEOGRAPH
+ 0xEAFA: 0x6CB9, //CJK UNIFIED IDEOGRAPH
+ 0xEAFB: 0x6D27, //CJK UNIFIED IDEOGRAPH
+ 0xEAFC: 0xF9CA, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEAFD: 0x6E38, //CJK UNIFIED IDEOGRAPH
+ 0xEAFE: 0xF9CB, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBA1: 0x6FE1, //CJK UNIFIED IDEOGRAPH
+ 0xEBA2: 0x7336, //CJK UNIFIED IDEOGRAPH
+ 0xEBA3: 0x7337, //CJK UNIFIED IDEOGRAPH
+ 0xEBA4: 0xF9CC, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBA5: 0x745C, //CJK UNIFIED IDEOGRAPH
+ 0xEBA6: 0x7531, //CJK UNIFIED IDEOGRAPH
+ 0xEBA7: 0xF9CD, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBA8: 0x7652, //CJK UNIFIED IDEOGRAPH
+ 0xEBA9: 0xF9CE, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBAA: 0xF9CF, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBAB: 0x7DAD, //CJK UNIFIED IDEOGRAPH
+ 0xEBAC: 0x81FE, //CJK UNIFIED IDEOGRAPH
+ 0xEBAD: 0x8438, //CJK UNIFIED IDEOGRAPH
+ 0xEBAE: 0x88D5, //CJK UNIFIED IDEOGRAPH
+ 0xEBAF: 0x8A98, //CJK UNIFIED IDEOGRAPH
+ 0xEBB0: 0x8ADB, //CJK UNIFIED IDEOGRAPH
+ 0xEBB1: 0x8AED, //CJK UNIFIED IDEOGRAPH
+ 0xEBB2: 0x8E30, //CJK UNIFIED IDEOGRAPH
+ 0xEBB3: 0x8E42, //CJK UNIFIED IDEOGRAPH
+ 0xEBB4: 0x904A, //CJK UNIFIED IDEOGRAPH
+ 0xEBB5: 0x903E, //CJK UNIFIED IDEOGRAPH
+ 0xEBB6: 0x907A, //CJK UNIFIED IDEOGRAPH
+ 0xEBB7: 0x9149, //CJK UNIFIED IDEOGRAPH
+ 0xEBB8: 0x91C9, //CJK UNIFIED IDEOGRAPH
+ 0xEBB9: 0x936E, //CJK UNIFIED IDEOGRAPH
+ 0xEBBA: 0xF9D0, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBBB: 0xF9D1, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBBC: 0x5809, //CJK UNIFIED IDEOGRAPH
+ 0xEBBD: 0xF9D2, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBBE: 0x6BD3, //CJK UNIFIED IDEOGRAPH
+ 0xEBBF: 0x8089, //CJK UNIFIED IDEOGRAPH
+ 0xEBC0: 0x80B2, //CJK UNIFIED IDEOGRAPH
+ 0xEBC1: 0xF9D3, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBC2: 0xF9D4, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBC3: 0x5141, //CJK UNIFIED IDEOGRAPH
+ 0xEBC4: 0x596B, //CJK UNIFIED IDEOGRAPH
+ 0xEBC5: 0x5C39, //CJK UNIFIED IDEOGRAPH
+ 0xEBC6: 0xF9D5, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBC7: 0xF9D6, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBC8: 0x6F64, //CJK UNIFIED IDEOGRAPH
+ 0xEBC9: 0x73A7, //CJK UNIFIED IDEOGRAPH
+ 0xEBCA: 0x80E4, //CJK UNIFIED IDEOGRAPH
+ 0xEBCB: 0x8D07, //CJK UNIFIED IDEOGRAPH
+ 0xEBCC: 0xF9D7, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBCD: 0x9217, //CJK UNIFIED IDEOGRAPH
+ 0xEBCE: 0x958F, //CJK UNIFIED IDEOGRAPH
+ 0xEBCF: 0xF9D8, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBD0: 0xF9D9, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBD1: 0xF9DA, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBD2: 0xF9DB, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBD3: 0x807F, //CJK UNIFIED IDEOGRAPH
+ 0xEBD4: 0x620E, //CJK UNIFIED IDEOGRAPH
+ 0xEBD5: 0x701C, //CJK UNIFIED IDEOGRAPH
+ 0xEBD6: 0x7D68, //CJK UNIFIED IDEOGRAPH
+ 0xEBD7: 0x878D, //CJK UNIFIED IDEOGRAPH
+ 0xEBD8: 0xF9DC, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEBD9: 0x57A0, //CJK UNIFIED IDEOGRAPH
+ 0xEBDA: 0x6069, //CJK UNIFIED IDEOGRAPH
+ 0xEBDB: 0x6147, //CJK UNIFIED IDEOGRAPH
+ 0xEBDC: 0x6BB7, //CJK UNIFIED IDEOGRAPH
+ 0xEBDD: 0x8ABE, //CJK UNIFIED IDEOGRAPH
+ 0xEBDE: 0x9280, //CJK UNIFIED IDEOGRAPH
+ 0xEBDF: 0x96B1, //CJK UNIFIED IDEOGRAPH
+ 0xEBE0: 0x4E59, //CJK UNIFIED IDEOGRAPH
+ 0xEBE1: 0x541F, //CJK UNIFIED IDEOGRAPH
+ 0xEBE2: 0x6DEB, //CJK UNIFIED IDEOGRAPH
+ 0xEBE3: 0x852D, //CJK UNIFIED IDEOGRAPH
+ 0xEBE4: 0x9670, //CJK UNIFIED IDEOGRAPH
+ 0xEBE5: 0x97F3, //CJK UNIFIED IDEOGRAPH
+ 0xEBE6: 0x98EE, //CJK UNIFIED IDEOGRAPH
+ 0xEBE7: 0x63D6, //CJK UNIFIED IDEOGRAPH
+ 0xEBE8: 0x6CE3, //CJK UNIFIED IDEOGRAPH
+ 0xEBE9: 0x9091, //CJK UNIFIED IDEOGRAPH
+ 0xEBEA: 0x51DD, //CJK UNIFIED IDEOGRAPH
+ 0xEBEB: 0x61C9, //CJK UNIFIED IDEOGRAPH
+ 0xEBEC: 0x81BA, //CJK UNIFIED IDEOGRAPH
+ 0xEBED: 0x9DF9, //CJK UNIFIED IDEOGRAPH
+ 0xEBEE: 0x4F9D, //CJK UNIFIED IDEOGRAPH
+ 0xEBEF: 0x501A, //CJK UNIFIED IDEOGRAPH
+ 0xEBF0: 0x5100, //CJK UNIFIED IDEOGRAPH
+ 0xEBF1: 0x5B9C, //CJK UNIFIED IDEOGRAPH
+ 0xEBF2: 0x610F, //CJK UNIFIED IDEOGRAPH
+ 0xEBF3: 0x61FF, //CJK UNIFIED IDEOGRAPH
+ 0xEBF4: 0x64EC, //CJK UNIFIED IDEOGRAPH
+ 0xEBF5: 0x6905, //CJK UNIFIED IDEOGRAPH
+ 0xEBF6: 0x6BC5, //CJK UNIFIED IDEOGRAPH
+ 0xEBF7: 0x7591, //CJK UNIFIED IDEOGRAPH
+ 0xEBF8: 0x77E3, //CJK UNIFIED IDEOGRAPH
+ 0xEBF9: 0x7FA9, //CJK UNIFIED IDEOGRAPH
+ 0xEBFA: 0x8264, //CJK UNIFIED IDEOGRAPH
+ 0xEBFB: 0x858F, //CJK UNIFIED IDEOGRAPH
+ 0xEBFC: 0x87FB, //CJK UNIFIED IDEOGRAPH
+ 0xEBFD: 0x8863, //CJK UNIFIED IDEOGRAPH
+ 0xEBFE: 0x8ABC, //CJK UNIFIED IDEOGRAPH
+ 0xECA1: 0x8B70, //CJK UNIFIED IDEOGRAPH
+ 0xECA2: 0x91AB, //CJK UNIFIED IDEOGRAPH
+ 0xECA3: 0x4E8C, //CJK UNIFIED IDEOGRAPH
+ 0xECA4: 0x4EE5, //CJK UNIFIED IDEOGRAPH
+ 0xECA5: 0x4F0A, //CJK UNIFIED IDEOGRAPH
+ 0xECA6: 0xF9DD, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECA7: 0xF9DE, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECA8: 0x5937, //CJK UNIFIED IDEOGRAPH
+ 0xECA9: 0x59E8, //CJK UNIFIED IDEOGRAPH
+ 0xECAA: 0xF9DF, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECAB: 0x5DF2, //CJK UNIFIED IDEOGRAPH
+ 0xECAC: 0x5F1B, //CJK UNIFIED IDEOGRAPH
+ 0xECAD: 0x5F5B, //CJK UNIFIED IDEOGRAPH
+ 0xECAE: 0x6021, //CJK UNIFIED IDEOGRAPH
+ 0xECAF: 0xF9E0, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECB0: 0xF9E1, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECB1: 0xF9E2, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECB2: 0xF9E3, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECB3: 0x723E, //CJK UNIFIED IDEOGRAPH
+ 0xECB4: 0x73E5, //CJK UNIFIED IDEOGRAPH
+ 0xECB5: 0xF9E4, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECB6: 0x7570, //CJK UNIFIED IDEOGRAPH
+ 0xECB7: 0x75CD, //CJK UNIFIED IDEOGRAPH
+ 0xECB8: 0xF9E5, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECB9: 0x79FB, //CJK UNIFIED IDEOGRAPH
+ 0xECBA: 0xF9E6, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECBB: 0x800C, //CJK UNIFIED IDEOGRAPH
+ 0xECBC: 0x8033, //CJK UNIFIED IDEOGRAPH
+ 0xECBD: 0x8084, //CJK UNIFIED IDEOGRAPH
+ 0xECBE: 0x82E1, //CJK UNIFIED IDEOGRAPH
+ 0xECBF: 0x8351, //CJK UNIFIED IDEOGRAPH
+ 0xECC0: 0xF9E7, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECC1: 0xF9E8, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECC2: 0x8CBD, //CJK UNIFIED IDEOGRAPH
+ 0xECC3: 0x8CB3, //CJK UNIFIED IDEOGRAPH
+ 0xECC4: 0x9087, //CJK UNIFIED IDEOGRAPH
+ 0xECC5: 0xF9E9, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECC6: 0xF9EA, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECC7: 0x98F4, //CJK UNIFIED IDEOGRAPH
+ 0xECC8: 0x990C, //CJK UNIFIED IDEOGRAPH
+ 0xECC9: 0xF9EB, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECCA: 0xF9EC, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECCB: 0x7037, //CJK UNIFIED IDEOGRAPH
+ 0xECCC: 0x76CA, //CJK UNIFIED IDEOGRAPH
+ 0xECCD: 0x7FCA, //CJK UNIFIED IDEOGRAPH
+ 0xECCE: 0x7FCC, //CJK UNIFIED IDEOGRAPH
+ 0xECCF: 0x7FFC, //CJK UNIFIED IDEOGRAPH
+ 0xECD0: 0x8B1A, //CJK UNIFIED IDEOGRAPH
+ 0xECD1: 0x4EBA, //CJK UNIFIED IDEOGRAPH
+ 0xECD2: 0x4EC1, //CJK UNIFIED IDEOGRAPH
+ 0xECD3: 0x5203, //CJK UNIFIED IDEOGRAPH
+ 0xECD4: 0x5370, //CJK UNIFIED IDEOGRAPH
+ 0xECD5: 0xF9ED, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECD6: 0x54BD, //CJK UNIFIED IDEOGRAPH
+ 0xECD7: 0x56E0, //CJK UNIFIED IDEOGRAPH
+ 0xECD8: 0x59FB, //CJK UNIFIED IDEOGRAPH
+ 0xECD9: 0x5BC5, //CJK UNIFIED IDEOGRAPH
+ 0xECDA: 0x5F15, //CJK UNIFIED IDEOGRAPH
+ 0xECDB: 0x5FCD, //CJK UNIFIED IDEOGRAPH
+ 0xECDC: 0x6E6E, //CJK UNIFIED IDEOGRAPH
+ 0xECDD: 0xF9EE, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECDE: 0xF9EF, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECDF: 0x7D6A, //CJK UNIFIED IDEOGRAPH
+ 0xECE0: 0x8335, //CJK UNIFIED IDEOGRAPH
+ 0xECE1: 0xF9F0, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECE2: 0x8693, //CJK UNIFIED IDEOGRAPH
+ 0xECE3: 0x8A8D, //CJK UNIFIED IDEOGRAPH
+ 0xECE4: 0xF9F1, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECE5: 0x976D, //CJK UNIFIED IDEOGRAPH
+ 0xECE6: 0x9777, //CJK UNIFIED IDEOGRAPH
+ 0xECE7: 0xF9F2, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECE8: 0xF9F3, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECE9: 0x4E00, //CJK UNIFIED IDEOGRAPH
+ 0xECEA: 0x4F5A, //CJK UNIFIED IDEOGRAPH
+ 0xECEB: 0x4F7E, //CJK UNIFIED IDEOGRAPH
+ 0xECEC: 0x58F9, //CJK UNIFIED IDEOGRAPH
+ 0xECED: 0x65E5, //CJK UNIFIED IDEOGRAPH
+ 0xECEE: 0x6EA2, //CJK UNIFIED IDEOGRAPH
+ 0xECEF: 0x9038, //CJK UNIFIED IDEOGRAPH
+ 0xECF0: 0x93B0, //CJK UNIFIED IDEOGRAPH
+ 0xECF1: 0x99B9, //CJK UNIFIED IDEOGRAPH
+ 0xECF2: 0x4EFB, //CJK UNIFIED IDEOGRAPH
+ 0xECF3: 0x58EC, //CJK UNIFIED IDEOGRAPH
+ 0xECF4: 0x598A, //CJK UNIFIED IDEOGRAPH
+ 0xECF5: 0x59D9, //CJK UNIFIED IDEOGRAPH
+ 0xECF6: 0x6041, //CJK UNIFIED IDEOGRAPH
+ 0xECF7: 0xF9F4, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECF8: 0xF9F5, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECF9: 0x7A14, //CJK UNIFIED IDEOGRAPH
+ 0xECFA: 0xF9F6, //CJK COMPATIBILITY IDEOGRAPH
+ 0xECFB: 0x834F, //CJK UNIFIED IDEOGRAPH
+ 0xECFC: 0x8CC3, //CJK UNIFIED IDEOGRAPH
+ 0xECFD: 0x5165, //CJK UNIFIED IDEOGRAPH
+ 0xECFE: 0x5344, //CJK UNIFIED IDEOGRAPH
+ 0xEDA1: 0xF9F7, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDA2: 0xF9F8, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDA3: 0xF9F9, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDA4: 0x4ECD, //CJK UNIFIED IDEOGRAPH
+ 0xEDA5: 0x5269, //CJK UNIFIED IDEOGRAPH
+ 0xEDA6: 0x5B55, //CJK UNIFIED IDEOGRAPH
+ 0xEDA7: 0x82BF, //CJK UNIFIED IDEOGRAPH
+ 0xEDA8: 0x4ED4, //CJK UNIFIED IDEOGRAPH
+ 0xEDA9: 0x523A, //CJK UNIFIED IDEOGRAPH
+ 0xEDAA: 0x54A8, //CJK UNIFIED IDEOGRAPH
+ 0xEDAB: 0x59C9, //CJK UNIFIED IDEOGRAPH
+ 0xEDAC: 0x59FF, //CJK UNIFIED IDEOGRAPH
+ 0xEDAD: 0x5B50, //CJK UNIFIED IDEOGRAPH
+ 0xEDAE: 0x5B57, //CJK UNIFIED IDEOGRAPH
+ 0xEDAF: 0x5B5C, //CJK UNIFIED IDEOGRAPH
+ 0xEDB0: 0x6063, //CJK UNIFIED IDEOGRAPH
+ 0xEDB1: 0x6148, //CJK UNIFIED IDEOGRAPH
+ 0xEDB2: 0x6ECB, //CJK UNIFIED IDEOGRAPH
+ 0xEDB3: 0x7099, //CJK UNIFIED IDEOGRAPH
+ 0xEDB4: 0x716E, //CJK UNIFIED IDEOGRAPH
+ 0xEDB5: 0x7386, //CJK UNIFIED IDEOGRAPH
+ 0xEDB6: 0x74F7, //CJK UNIFIED IDEOGRAPH
+ 0xEDB7: 0x75B5, //CJK UNIFIED IDEOGRAPH
+ 0xEDB8: 0x78C1, //CJK UNIFIED IDEOGRAPH
+ 0xEDB9: 0x7D2B, //CJK UNIFIED IDEOGRAPH
+ 0xEDBA: 0x8005, //CJK UNIFIED IDEOGRAPH
+ 0xEDBB: 0x81EA, //CJK UNIFIED IDEOGRAPH
+ 0xEDBC: 0x8328, //CJK UNIFIED IDEOGRAPH
+ 0xEDBD: 0x8517, //CJK UNIFIED IDEOGRAPH
+ 0xEDBE: 0x85C9, //CJK UNIFIED IDEOGRAPH
+ 0xEDBF: 0x8AEE, //CJK UNIFIED IDEOGRAPH
+ 0xEDC0: 0x8CC7, //CJK UNIFIED IDEOGRAPH
+ 0xEDC1: 0x96CC, //CJK UNIFIED IDEOGRAPH
+ 0xEDC2: 0x4F5C, //CJK UNIFIED IDEOGRAPH
+ 0xEDC3: 0x52FA, //CJK UNIFIED IDEOGRAPH
+ 0xEDC4: 0x56BC, //CJK UNIFIED IDEOGRAPH
+ 0xEDC5: 0x65AB, //CJK UNIFIED IDEOGRAPH
+ 0xEDC6: 0x6628, //CJK UNIFIED IDEOGRAPH
+ 0xEDC7: 0x707C, //CJK UNIFIED IDEOGRAPH
+ 0xEDC8: 0x70B8, //CJK UNIFIED IDEOGRAPH
+ 0xEDC9: 0x7235, //CJK UNIFIED IDEOGRAPH
+ 0xEDCA: 0x7DBD, //CJK UNIFIED IDEOGRAPH
+ 0xEDCB: 0x828D, //CJK UNIFIED IDEOGRAPH
+ 0xEDCC: 0x914C, //CJK UNIFIED IDEOGRAPH
+ 0xEDCD: 0x96C0, //CJK UNIFIED IDEOGRAPH
+ 0xEDCE: 0x9D72, //CJK UNIFIED IDEOGRAPH
+ 0xEDCF: 0x5B71, //CJK UNIFIED IDEOGRAPH
+ 0xEDD0: 0x68E7, //CJK UNIFIED IDEOGRAPH
+ 0xEDD1: 0x6B98, //CJK UNIFIED IDEOGRAPH
+ 0xEDD2: 0x6F7A, //CJK UNIFIED IDEOGRAPH
+ 0xEDD3: 0x76DE, //CJK UNIFIED IDEOGRAPH
+ 0xEDD4: 0x5C91, //CJK UNIFIED IDEOGRAPH
+ 0xEDD5: 0x66AB, //CJK UNIFIED IDEOGRAPH
+ 0xEDD6: 0x6F5B, //CJK UNIFIED IDEOGRAPH
+ 0xEDD7: 0x7BB4, //CJK UNIFIED IDEOGRAPH
+ 0xEDD8: 0x7C2A, //CJK UNIFIED IDEOGRAPH
+ 0xEDD9: 0x8836, //CJK UNIFIED IDEOGRAPH
+ 0xEDDA: 0x96DC, //CJK UNIFIED IDEOGRAPH
+ 0xEDDB: 0x4E08, //CJK UNIFIED IDEOGRAPH
+ 0xEDDC: 0x4ED7, //CJK UNIFIED IDEOGRAPH
+ 0xEDDD: 0x5320, //CJK UNIFIED IDEOGRAPH
+ 0xEDDE: 0x5834, //CJK UNIFIED IDEOGRAPH
+ 0xEDDF: 0x58BB, //CJK UNIFIED IDEOGRAPH
+ 0xEDE0: 0x58EF, //CJK UNIFIED IDEOGRAPH
+ 0xEDE1: 0x596C, //CJK UNIFIED IDEOGRAPH
+ 0xEDE2: 0x5C07, //CJK UNIFIED IDEOGRAPH
+ 0xEDE3: 0x5E33, //CJK UNIFIED IDEOGRAPH
+ 0xEDE4: 0x5E84, //CJK UNIFIED IDEOGRAPH
+ 0xEDE5: 0x5F35, //CJK UNIFIED IDEOGRAPH
+ 0xEDE6: 0x638C, //CJK UNIFIED IDEOGRAPH
+ 0xEDE7: 0x66B2, //CJK UNIFIED IDEOGRAPH
+ 0xEDE8: 0x6756, //CJK UNIFIED IDEOGRAPH
+ 0xEDE9: 0x6A1F, //CJK UNIFIED IDEOGRAPH
+ 0xEDEA: 0x6AA3, //CJK UNIFIED IDEOGRAPH
+ 0xEDEB: 0x6B0C, //CJK UNIFIED IDEOGRAPH
+ 0xEDEC: 0x6F3F, //CJK UNIFIED IDEOGRAPH
+ 0xEDED: 0x7246, //CJK UNIFIED IDEOGRAPH
+ 0xEDEE: 0xF9FA, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEDEF: 0x7350, //CJK UNIFIED IDEOGRAPH
+ 0xEDF0: 0x748B, //CJK UNIFIED IDEOGRAPH
+ 0xEDF1: 0x7AE0, //CJK UNIFIED IDEOGRAPH
+ 0xEDF2: 0x7CA7, //CJK UNIFIED IDEOGRAPH
+ 0xEDF3: 0x8178, //CJK UNIFIED IDEOGRAPH
+ 0xEDF4: 0x81DF, //CJK UNIFIED IDEOGRAPH
+ 0xEDF5: 0x81E7, //CJK UNIFIED IDEOGRAPH
+ 0xEDF6: 0x838A, //CJK UNIFIED IDEOGRAPH
+ 0xEDF7: 0x846C, //CJK UNIFIED IDEOGRAPH
+ 0xEDF8: 0x8523, //CJK UNIFIED IDEOGRAPH
+ 0xEDF9: 0x8594, //CJK UNIFIED IDEOGRAPH
+ 0xEDFA: 0x85CF, //CJK UNIFIED IDEOGRAPH
+ 0xEDFB: 0x88DD, //CJK UNIFIED IDEOGRAPH
+ 0xEDFC: 0x8D13, //CJK UNIFIED IDEOGRAPH
+ 0xEDFD: 0x91AC, //CJK UNIFIED IDEOGRAPH
+ 0xEDFE: 0x9577, //CJK UNIFIED IDEOGRAPH
+ 0xEEA1: 0x969C, //CJK UNIFIED IDEOGRAPH
+ 0xEEA2: 0x518D, //CJK UNIFIED IDEOGRAPH
+ 0xEEA3: 0x54C9, //CJK UNIFIED IDEOGRAPH
+ 0xEEA4: 0x5728, //CJK UNIFIED IDEOGRAPH
+ 0xEEA5: 0x5BB0, //CJK UNIFIED IDEOGRAPH
+ 0xEEA6: 0x624D, //CJK UNIFIED IDEOGRAPH
+ 0xEEA7: 0x6750, //CJK UNIFIED IDEOGRAPH
+ 0xEEA8: 0x683D, //CJK UNIFIED IDEOGRAPH
+ 0xEEA9: 0x6893, //CJK UNIFIED IDEOGRAPH
+ 0xEEAA: 0x6E3D, //CJK UNIFIED IDEOGRAPH
+ 0xEEAB: 0x6ED3, //CJK UNIFIED IDEOGRAPH
+ 0xEEAC: 0x707D, //CJK UNIFIED IDEOGRAPH
+ 0xEEAD: 0x7E21, //CJK UNIFIED IDEOGRAPH
+ 0xEEAE: 0x88C1, //CJK UNIFIED IDEOGRAPH
+ 0xEEAF: 0x8CA1, //CJK UNIFIED IDEOGRAPH
+ 0xEEB0: 0x8F09, //CJK UNIFIED IDEOGRAPH
+ 0xEEB1: 0x9F4B, //CJK UNIFIED IDEOGRAPH
+ 0xEEB2: 0x9F4E, //CJK UNIFIED IDEOGRAPH
+ 0xEEB3: 0x722D, //CJK UNIFIED IDEOGRAPH
+ 0xEEB4: 0x7B8F, //CJK UNIFIED IDEOGRAPH
+ 0xEEB5: 0x8ACD, //CJK UNIFIED IDEOGRAPH
+ 0xEEB6: 0x931A, //CJK UNIFIED IDEOGRAPH
+ 0xEEB7: 0x4F47, //CJK UNIFIED IDEOGRAPH
+ 0xEEB8: 0x4F4E, //CJK UNIFIED IDEOGRAPH
+ 0xEEB9: 0x5132, //CJK UNIFIED IDEOGRAPH
+ 0xEEBA: 0x5480, //CJK UNIFIED IDEOGRAPH
+ 0xEEBB: 0x59D0, //CJK UNIFIED IDEOGRAPH
+ 0xEEBC: 0x5E95, //CJK UNIFIED IDEOGRAPH
+ 0xEEBD: 0x62B5, //CJK UNIFIED IDEOGRAPH
+ 0xEEBE: 0x6775, //CJK UNIFIED IDEOGRAPH
+ 0xEEBF: 0x696E, //CJK UNIFIED IDEOGRAPH
+ 0xEEC0: 0x6A17, //CJK UNIFIED IDEOGRAPH
+ 0xEEC1: 0x6CAE, //CJK UNIFIED IDEOGRAPH
+ 0xEEC2: 0x6E1A, //CJK UNIFIED IDEOGRAPH
+ 0xEEC3: 0x72D9, //CJK UNIFIED IDEOGRAPH
+ 0xEEC4: 0x732A, //CJK UNIFIED IDEOGRAPH
+ 0xEEC5: 0x75BD, //CJK UNIFIED IDEOGRAPH
+ 0xEEC6: 0x7BB8, //CJK UNIFIED IDEOGRAPH
+ 0xEEC7: 0x7D35, //CJK UNIFIED IDEOGRAPH
+ 0xEEC8: 0x82E7, //CJK UNIFIED IDEOGRAPH
+ 0xEEC9: 0x83F9, //CJK UNIFIED IDEOGRAPH
+ 0xEECA: 0x8457, //CJK UNIFIED IDEOGRAPH
+ 0xEECB: 0x85F7, //CJK UNIFIED IDEOGRAPH
+ 0xEECC: 0x8A5B, //CJK UNIFIED IDEOGRAPH
+ 0xEECD: 0x8CAF, //CJK UNIFIED IDEOGRAPH
+ 0xEECE: 0x8E87, //CJK UNIFIED IDEOGRAPH
+ 0xEECF: 0x9019, //CJK UNIFIED IDEOGRAPH
+ 0xEED0: 0x90B8, //CJK UNIFIED IDEOGRAPH
+ 0xEED1: 0x96CE, //CJK UNIFIED IDEOGRAPH
+ 0xEED2: 0x9F5F, //CJK UNIFIED IDEOGRAPH
+ 0xEED3: 0x52E3, //CJK UNIFIED IDEOGRAPH
+ 0xEED4: 0x540A, //CJK UNIFIED IDEOGRAPH
+ 0xEED5: 0x5AE1, //CJK UNIFIED IDEOGRAPH
+ 0xEED6: 0x5BC2, //CJK UNIFIED IDEOGRAPH
+ 0xEED7: 0x6458, //CJK UNIFIED IDEOGRAPH
+ 0xEED8: 0x6575, //CJK UNIFIED IDEOGRAPH
+ 0xEED9: 0x6EF4, //CJK UNIFIED IDEOGRAPH
+ 0xEEDA: 0x72C4, //CJK UNIFIED IDEOGRAPH
+ 0xEEDB: 0xF9FB, //CJK COMPATIBILITY IDEOGRAPH
+ 0xEEDC: 0x7684, //CJK UNIFIED IDEOGRAPH
+ 0xEEDD: 0x7A4D, //CJK UNIFIED IDEOGRAPH
+ 0xEEDE: 0x7B1B, //CJK UNIFIED IDEOGRAPH
+ 0xEEDF: 0x7C4D, //CJK UNIFIED IDEOGRAPH
+ 0xEEE0: 0x7E3E, //CJK UNIFIED IDEOGRAPH
+ 0xEEE1: 0x7FDF, //CJK UNIFIED IDEOGRAPH
+ 0xEEE2: 0x837B, //CJK UNIFIED IDEOGRAPH
+ 0xEEE3: 0x8B2B, //CJK UNIFIED IDEOGRAPH
+ 0xEEE4: 0x8CCA, //CJK UNIFIED IDEOGRAPH
+ 0xEEE5: 0x8D64, //CJK UNIFIED IDEOGRAPH
+ 0xEEE6: 0x8DE1, //CJK UNIFIED IDEOGRAPH
+ 0xEEE7: 0x8E5F, //CJK UNIFIED IDEOGRAPH
+ 0xEEE8: 0x8FEA, //CJK UNIFIED IDEOGRAPH
+ 0xEEE9: 0x8FF9, //CJK UNIFIED IDEOGRAPH
+ 0xEEEA: 0x9069, //CJK UNIFIED IDEOGRAPH
+ 0xEEEB: 0x93D1, //CJK UNIFIED IDEOGRAPH
+ 0xEEEC: 0x4F43, //CJK UNIFIED IDEOGRAPH
+ 0xEEED: 0x4F7A, //CJK UNIFIED IDEOGRAPH
+ 0xEEEE: 0x50B3, //CJK UNIFIED IDEOGRAPH
+ 0xEEEF: 0x5168, //CJK UNIFIED IDEOGRAPH
+ 0xEEF0: 0x5178, //CJK UNIFIED IDEOGRAPH
+ 0xEEF1: 0x524D, //CJK UNIFIED IDEOGRAPH
+ 0xEEF2: 0x526A, //CJK UNIFIED IDEOGRAPH
+ 0xEEF3: 0x5861, //CJK UNIFIED IDEOGRAPH
+ 0xEEF4: 0x587C, //CJK UNIFIED IDEOGRAPH
+ 0xEEF5: 0x5960, //CJK UNIFIED IDEOGRAPH
+ 0xEEF6: 0x5C08, //CJK UNIFIED IDEOGRAPH
+ 0xEEF7: 0x5C55, //CJK UNIFIED IDEOGRAPH
+ 0xEEF8: 0x5EDB, //CJK UNIFIED IDEOGRAPH
+ 0xEEF9: 0x609B, //CJK UNIFIED IDEOGRAPH
+ 0xEEFA: 0x6230, //CJK UNIFIED IDEOGRAPH
+ 0xEEFB: 0x6813, //CJK UNIFIED IDEOGRAPH
+ 0xEEFC: 0x6BBF, //CJK UNIFIED IDEOGRAPH
+ 0xEEFD: 0x6C08, //CJK UNIFIED IDEOGRAPH
+ 0xEEFE: 0x6FB1, //CJK UNIFIED IDEOGRAPH
+ 0xEFA1: 0x714E, //CJK UNIFIED IDEOGRAPH
+ 0xEFA2: 0x7420, //CJK UNIFIED IDEOGRAPH
+ 0xEFA3: 0x7530, //CJK UNIFIED IDEOGRAPH
+ 0xEFA4: 0x7538, //CJK UNIFIED IDEOGRAPH
+ 0xEFA5: 0x7551, //CJK UNIFIED IDEOGRAPH
+ 0xEFA6: 0x7672, //CJK UNIFIED IDEOGRAPH
+ 0xEFA7: 0x7B4C, //CJK UNIFIED IDEOGRAPH
+ 0xEFA8: 0x7B8B, //CJK UNIFIED IDEOGRAPH
+ 0xEFA9: 0x7BAD, //CJK UNIFIED IDEOGRAPH
+ 0xEFAA: 0x7BC6, //CJK UNIFIED IDEOGRAPH
+ 0xEFAB: 0x7E8F, //CJK UNIFIED IDEOGRAPH
+ 0xEFAC: 0x8A6E, //CJK UNIFIED IDEOGRAPH
+ 0xEFAD: 0x8F3E, //CJK UNIFIED IDEOGRAPH
+ 0xEFAE: 0x8F49, //CJK UNIFIED IDEOGRAPH
+ 0xEFAF: 0x923F, //CJK UNIFIED IDEOGRAPH
+ 0xEFB0: 0x9293, //CJK UNIFIED IDEOGRAPH
+ 0xEFB1: 0x9322, //CJK UNIFIED IDEOGRAPH
+ 0xEFB2: 0x942B, //CJK UNIFIED IDEOGRAPH
+ 0xEFB3: 0x96FB, //CJK UNIFIED IDEOGRAPH
+ 0xEFB4: 0x985A, //CJK UNIFIED IDEOGRAPH
+ 0xEFB5: 0x986B, //CJK UNIFIED IDEOGRAPH
+ 0xEFB6: 0x991E, //CJK UNIFIED IDEOGRAPH
+ 0xEFB7: 0x5207, //CJK UNIFIED IDEOGRAPH
+ 0xEFB8: 0x622A, //CJK UNIFIED IDEOGRAPH
+ 0xEFB9: 0x6298, //CJK UNIFIED IDEOGRAPH
+ 0xEFBA: 0x6D59, //CJK UNIFIED IDEOGRAPH
+ 0xEFBB: 0x7664, //CJK UNIFIED IDEOGRAPH
+ 0xEFBC: 0x7ACA, //CJK UNIFIED IDEOGRAPH
+ 0xEFBD: 0x7BC0, //CJK UNIFIED IDEOGRAPH
+ 0xEFBE: 0x7D76, //CJK UNIFIED IDEOGRAPH
+ 0xEFBF: 0x5360, //CJK UNIFIED IDEOGRAPH
+ 0xEFC0: 0x5CBE, //CJK UNIFIED IDEOGRAPH
+ 0xEFC1: 0x5E97, //CJK UNIFIED IDEOGRAPH
+ 0xEFC2: 0x6F38, //CJK UNIFIED IDEOGRAPH
+ 0xEFC3: 0x70B9, //CJK UNIFIED IDEOGRAPH
+ 0xEFC4: 0x7C98, //CJK UNIFIED IDEOGRAPH
+ 0xEFC5: 0x9711, //CJK UNIFIED IDEOGRAPH
+ 0xEFC6: 0x9B8E, //CJK UNIFIED IDEOGRAPH
+ 0xEFC7: 0x9EDE, //CJK UNIFIED IDEOGRAPH
+ 0xEFC8: 0x63A5, //CJK UNIFIED IDEOGRAPH
+ 0xEFC9: 0x647A, //CJK UNIFIED IDEOGRAPH
+ 0xEFCA: 0x8776, //CJK UNIFIED IDEOGRAPH
+ 0xEFCB: 0x4E01, //CJK UNIFIED IDEOGRAPH
+ 0xEFCC: 0x4E95, //CJK UNIFIED IDEOGRAPH
+ 0xEFCD: 0x4EAD, //CJK UNIFIED IDEOGRAPH
+ 0xEFCE: 0x505C, //CJK UNIFIED IDEOGRAPH
+ 0xEFCF: 0x5075, //CJK UNIFIED IDEOGRAPH
+ 0xEFD0: 0x5448, //CJK UNIFIED IDEOGRAPH
+ 0xEFD1: 0x59C3, //CJK UNIFIED IDEOGRAPH
+ 0xEFD2: 0x5B9A, //CJK UNIFIED IDEOGRAPH
+ 0xEFD3: 0x5E40, //CJK UNIFIED IDEOGRAPH
+ 0xEFD4: 0x5EAD, //CJK UNIFIED IDEOGRAPH
+ 0xEFD5: 0x5EF7, //CJK UNIFIED IDEOGRAPH
+ 0xEFD6: 0x5F81, //CJK UNIFIED IDEOGRAPH
+ 0xEFD7: 0x60C5, //CJK UNIFIED IDEOGRAPH
+ 0xEFD8: 0x633A, //CJK UNIFIED IDEOGRAPH
+ 0xEFD9: 0x653F, //CJK UNIFIED IDEOGRAPH
+ 0xEFDA: 0x6574, //CJK UNIFIED IDEOGRAPH
+ 0xEFDB: 0x65CC, //CJK UNIFIED IDEOGRAPH
+ 0xEFDC: 0x6676, //CJK UNIFIED IDEOGRAPH
+ 0xEFDD: 0x6678, //CJK UNIFIED IDEOGRAPH
+ 0xEFDE: 0x67FE, //CJK UNIFIED IDEOGRAPH
+ 0xEFDF: 0x6968, //CJK UNIFIED IDEOGRAPH
+ 0xEFE0: 0x6A89, //CJK UNIFIED IDEOGRAPH
+ 0xEFE1: 0x6B63, //CJK UNIFIED IDEOGRAPH
+ 0xEFE2: 0x6C40, //CJK UNIFIED IDEOGRAPH
+ 0xEFE3: 0x6DC0, //CJK UNIFIED IDEOGRAPH
+ 0xEFE4: 0x6DE8, //CJK UNIFIED IDEOGRAPH
+ 0xEFE5: 0x6E1F, //CJK UNIFIED IDEOGRAPH
+ 0xEFE6: 0x6E5E, //CJK UNIFIED IDEOGRAPH
+ 0xEFE7: 0x701E, //CJK UNIFIED IDEOGRAPH
+ 0xEFE8: 0x70A1, //CJK UNIFIED IDEOGRAPH
+ 0xEFE9: 0x738E, //CJK UNIFIED IDEOGRAPH
+ 0xEFEA: 0x73FD, //CJK UNIFIED IDEOGRAPH
+ 0xEFEB: 0x753A, //CJK UNIFIED IDEOGRAPH
+ 0xEFEC: 0x775B, //CJK UNIFIED IDEOGRAPH
+ 0xEFED: 0x7887, //CJK UNIFIED IDEOGRAPH
+ 0xEFEE: 0x798E, //CJK UNIFIED IDEOGRAPH
+ 0xEFEF: 0x7A0B, //CJK UNIFIED IDEOGRAPH
+ 0xEFF0: 0x7A7D, //CJK UNIFIED IDEOGRAPH
+ 0xEFF1: 0x7CBE, //CJK UNIFIED IDEOGRAPH
+ 0xEFF2: 0x7D8E, //CJK UNIFIED IDEOGRAPH
+ 0xEFF3: 0x8247, //CJK UNIFIED IDEOGRAPH
+ 0xEFF4: 0x8A02, //CJK UNIFIED IDEOGRAPH
+ 0xEFF5: 0x8AEA, //CJK UNIFIED IDEOGRAPH
+ 0xEFF6: 0x8C9E, //CJK UNIFIED IDEOGRAPH
+ 0xEFF7: 0x912D, //CJK UNIFIED IDEOGRAPH
+ 0xEFF8: 0x914A, //CJK UNIFIED IDEOGRAPH
+ 0xEFF9: 0x91D8, //CJK UNIFIED IDEOGRAPH
+ 0xEFFA: 0x9266, //CJK UNIFIED IDEOGRAPH
+ 0xEFFB: 0x92CC, //CJK UNIFIED IDEOGRAPH
+ 0xEFFC: 0x9320, //CJK UNIFIED IDEOGRAPH
+ 0xEFFD: 0x9706, //CJK UNIFIED IDEOGRAPH
+ 0xEFFE: 0x9756, //CJK UNIFIED IDEOGRAPH
+ 0xF0A1: 0x975C, //CJK UNIFIED IDEOGRAPH
+ 0xF0A2: 0x9802, //CJK UNIFIED IDEOGRAPH
+ 0xF0A3: 0x9F0E, //CJK UNIFIED IDEOGRAPH
+ 0xF0A4: 0x5236, //CJK UNIFIED IDEOGRAPH
+ 0xF0A5: 0x5291, //CJK UNIFIED IDEOGRAPH
+ 0xF0A6: 0x557C, //CJK UNIFIED IDEOGRAPH
+ 0xF0A7: 0x5824, //CJK UNIFIED IDEOGRAPH
+ 0xF0A8: 0x5E1D, //CJK UNIFIED IDEOGRAPH
+ 0xF0A9: 0x5F1F, //CJK UNIFIED IDEOGRAPH
+ 0xF0AA: 0x608C, //CJK UNIFIED IDEOGRAPH
+ 0xF0AB: 0x63D0, //CJK UNIFIED IDEOGRAPH
+ 0xF0AC: 0x68AF, //CJK UNIFIED IDEOGRAPH
+ 0xF0AD: 0x6FDF, //CJK UNIFIED IDEOGRAPH
+ 0xF0AE: 0x796D, //CJK UNIFIED IDEOGRAPH
+ 0xF0AF: 0x7B2C, //CJK UNIFIED IDEOGRAPH
+ 0xF0B0: 0x81CD, //CJK UNIFIED IDEOGRAPH
+ 0xF0B1: 0x85BA, //CJK UNIFIED IDEOGRAPH
+ 0xF0B2: 0x88FD, //CJK UNIFIED IDEOGRAPH
+ 0xF0B3: 0x8AF8, //CJK UNIFIED IDEOGRAPH
+ 0xF0B4: 0x8E44, //CJK UNIFIED IDEOGRAPH
+ 0xF0B5: 0x918D, //CJK UNIFIED IDEOGRAPH
+ 0xF0B6: 0x9664, //CJK UNIFIED IDEOGRAPH
+ 0xF0B7: 0x969B, //CJK UNIFIED IDEOGRAPH
+ 0xF0B8: 0x973D, //CJK UNIFIED IDEOGRAPH
+ 0xF0B9: 0x984C, //CJK UNIFIED IDEOGRAPH
+ 0xF0BA: 0x9F4A, //CJK UNIFIED IDEOGRAPH
+ 0xF0BB: 0x4FCE, //CJK UNIFIED IDEOGRAPH
+ 0xF0BC: 0x5146, //CJK UNIFIED IDEOGRAPH
+ 0xF0BD: 0x51CB, //CJK UNIFIED IDEOGRAPH
+ 0xF0BE: 0x52A9, //CJK UNIFIED IDEOGRAPH
+ 0xF0BF: 0x5632, //CJK UNIFIED IDEOGRAPH
+ 0xF0C0: 0x5F14, //CJK UNIFIED IDEOGRAPH
+ 0xF0C1: 0x5F6B, //CJK UNIFIED IDEOGRAPH
+ 0xF0C2: 0x63AA, //CJK UNIFIED IDEOGRAPH
+ 0xF0C3: 0x64CD, //CJK UNIFIED IDEOGRAPH
+ 0xF0C4: 0x65E9, //CJK UNIFIED IDEOGRAPH
+ 0xF0C5: 0x6641, //CJK UNIFIED IDEOGRAPH
+ 0xF0C6: 0x66FA, //CJK UNIFIED IDEOGRAPH
+ 0xF0C7: 0x66F9, //CJK UNIFIED IDEOGRAPH
+ 0xF0C8: 0x671D, //CJK UNIFIED IDEOGRAPH
+ 0xF0C9: 0x689D, //CJK UNIFIED IDEOGRAPH
+ 0xF0CA: 0x68D7, //CJK UNIFIED IDEOGRAPH
+ 0xF0CB: 0x69FD, //CJK UNIFIED IDEOGRAPH
+ 0xF0CC: 0x6F15, //CJK UNIFIED IDEOGRAPH
+ 0xF0CD: 0x6F6E, //CJK UNIFIED IDEOGRAPH
+ 0xF0CE: 0x7167, //CJK UNIFIED IDEOGRAPH
+ 0xF0CF: 0x71E5, //CJK UNIFIED IDEOGRAPH
+ 0xF0D0: 0x722A, //CJK UNIFIED IDEOGRAPH
+ 0xF0D1: 0x74AA, //CJK UNIFIED IDEOGRAPH
+ 0xF0D2: 0x773A, //CJK UNIFIED IDEOGRAPH
+ 0xF0D3: 0x7956, //CJK UNIFIED IDEOGRAPH
+ 0xF0D4: 0x795A, //CJK UNIFIED IDEOGRAPH
+ 0xF0D5: 0x79DF, //CJK UNIFIED IDEOGRAPH
+ 0xF0D6: 0x7A20, //CJK UNIFIED IDEOGRAPH
+ 0xF0D7: 0x7A95, //CJK UNIFIED IDEOGRAPH
+ 0xF0D8: 0x7C97, //CJK UNIFIED IDEOGRAPH
+ 0xF0D9: 0x7CDF, //CJK UNIFIED IDEOGRAPH
+ 0xF0DA: 0x7D44, //CJK UNIFIED IDEOGRAPH
+ 0xF0DB: 0x7E70, //CJK UNIFIED IDEOGRAPH
+ 0xF0DC: 0x8087, //CJK UNIFIED IDEOGRAPH
+ 0xF0DD: 0x85FB, //CJK UNIFIED IDEOGRAPH
+ 0xF0DE: 0x86A4, //CJK UNIFIED IDEOGRAPH
+ 0xF0DF: 0x8A54, //CJK UNIFIED IDEOGRAPH
+ 0xF0E0: 0x8ABF, //CJK UNIFIED IDEOGRAPH
+ 0xF0E1: 0x8D99, //CJK UNIFIED IDEOGRAPH
+ 0xF0E2: 0x8E81, //CJK UNIFIED IDEOGRAPH
+ 0xF0E3: 0x9020, //CJK UNIFIED IDEOGRAPH
+ 0xF0E4: 0x906D, //CJK UNIFIED IDEOGRAPH
+ 0xF0E5: 0x91E3, //CJK UNIFIED IDEOGRAPH
+ 0xF0E6: 0x963B, //CJK UNIFIED IDEOGRAPH
+ 0xF0E7: 0x96D5, //CJK UNIFIED IDEOGRAPH
+ 0xF0E8: 0x9CE5, //CJK UNIFIED IDEOGRAPH
+ 0xF0E9: 0x65CF, //CJK UNIFIED IDEOGRAPH
+ 0xF0EA: 0x7C07, //CJK UNIFIED IDEOGRAPH
+ 0xF0EB: 0x8DB3, //CJK UNIFIED IDEOGRAPH
+ 0xF0EC: 0x93C3, //CJK UNIFIED IDEOGRAPH
+ 0xF0ED: 0x5B58, //CJK UNIFIED IDEOGRAPH
+ 0xF0EE: 0x5C0A, //CJK UNIFIED IDEOGRAPH
+ 0xF0EF: 0x5352, //CJK UNIFIED IDEOGRAPH
+ 0xF0F0: 0x62D9, //CJK UNIFIED IDEOGRAPH
+ 0xF0F1: 0x731D, //CJK UNIFIED IDEOGRAPH
+ 0xF0F2: 0x5027, //CJK UNIFIED IDEOGRAPH
+ 0xF0F3: 0x5B97, //CJK UNIFIED IDEOGRAPH
+ 0xF0F4: 0x5F9E, //CJK UNIFIED IDEOGRAPH
+ 0xF0F5: 0x60B0, //CJK UNIFIED IDEOGRAPH
+ 0xF0F6: 0x616B, //CJK UNIFIED IDEOGRAPH
+ 0xF0F7: 0x68D5, //CJK UNIFIED IDEOGRAPH
+ 0xF0F8: 0x6DD9, //CJK UNIFIED IDEOGRAPH
+ 0xF0F9: 0x742E, //CJK UNIFIED IDEOGRAPH
+ 0xF0FA: 0x7A2E, //CJK UNIFIED IDEOGRAPH
+ 0xF0FB: 0x7D42, //CJK UNIFIED IDEOGRAPH
+ 0xF0FC: 0x7D9C, //CJK UNIFIED IDEOGRAPH
+ 0xF0FD: 0x7E31, //CJK UNIFIED IDEOGRAPH
+ 0xF0FE: 0x816B, //CJK UNIFIED IDEOGRAPH
+ 0xF1A1: 0x8E2A, //CJK UNIFIED IDEOGRAPH
+ 0xF1A2: 0x8E35, //CJK UNIFIED IDEOGRAPH
+ 0xF1A3: 0x937E, //CJK UNIFIED IDEOGRAPH
+ 0xF1A4: 0x9418, //CJK UNIFIED IDEOGRAPH
+ 0xF1A5: 0x4F50, //CJK UNIFIED IDEOGRAPH
+ 0xF1A6: 0x5750, //CJK UNIFIED IDEOGRAPH
+ 0xF1A7: 0x5DE6, //CJK UNIFIED IDEOGRAPH
+ 0xF1A8: 0x5EA7, //CJK UNIFIED IDEOGRAPH
+ 0xF1A9: 0x632B, //CJK UNIFIED IDEOGRAPH
+ 0xF1AA: 0x7F6A, //CJK UNIFIED IDEOGRAPH
+ 0xF1AB: 0x4E3B, //CJK UNIFIED IDEOGRAPH
+ 0xF1AC: 0x4F4F, //CJK UNIFIED IDEOGRAPH
+ 0xF1AD: 0x4F8F, //CJK UNIFIED IDEOGRAPH
+ 0xF1AE: 0x505A, //CJK UNIFIED IDEOGRAPH
+ 0xF1AF: 0x59DD, //CJK UNIFIED IDEOGRAPH
+ 0xF1B0: 0x80C4, //CJK UNIFIED IDEOGRAPH
+ 0xF1B1: 0x546A, //CJK UNIFIED IDEOGRAPH
+ 0xF1B2: 0x5468, //CJK UNIFIED IDEOGRAPH
+ 0xF1B3: 0x55FE, //CJK UNIFIED IDEOGRAPH
+ 0xF1B4: 0x594F, //CJK UNIFIED IDEOGRAPH
+ 0xF1B5: 0x5B99, //CJK UNIFIED IDEOGRAPH
+ 0xF1B6: 0x5DDE, //CJK UNIFIED IDEOGRAPH
+ 0xF1B7: 0x5EDA, //CJK UNIFIED IDEOGRAPH
+ 0xF1B8: 0x665D, //CJK UNIFIED IDEOGRAPH
+ 0xF1B9: 0x6731, //CJK UNIFIED IDEOGRAPH
+ 0xF1BA: 0x67F1, //CJK UNIFIED IDEOGRAPH
+ 0xF1BB: 0x682A, //CJK UNIFIED IDEOGRAPH
+ 0xF1BC: 0x6CE8, //CJK UNIFIED IDEOGRAPH
+ 0xF1BD: 0x6D32, //CJK UNIFIED IDEOGRAPH
+ 0xF1BE: 0x6E4A, //CJK UNIFIED IDEOGRAPH
+ 0xF1BF: 0x6F8D, //CJK UNIFIED IDEOGRAPH
+ 0xF1C0: 0x70B7, //CJK UNIFIED IDEOGRAPH
+ 0xF1C1: 0x73E0, //CJK UNIFIED IDEOGRAPH
+ 0xF1C2: 0x7587, //CJK UNIFIED IDEOGRAPH
+ 0xF1C3: 0x7C4C, //CJK UNIFIED IDEOGRAPH
+ 0xF1C4: 0x7D02, //CJK UNIFIED IDEOGRAPH
+ 0xF1C5: 0x7D2C, //CJK UNIFIED IDEOGRAPH
+ 0xF1C6: 0x7DA2, //CJK UNIFIED IDEOGRAPH
+ 0xF1C7: 0x821F, //CJK UNIFIED IDEOGRAPH
+ 0xF1C8: 0x86DB, //CJK UNIFIED IDEOGRAPH
+ 0xF1C9: 0x8A3B, //CJK UNIFIED IDEOGRAPH
+ 0xF1CA: 0x8A85, //CJK UNIFIED IDEOGRAPH
+ 0xF1CB: 0x8D70, //CJK UNIFIED IDEOGRAPH
+ 0xF1CC: 0x8E8A, //CJK UNIFIED IDEOGRAPH
+ 0xF1CD: 0x8F33, //CJK UNIFIED IDEOGRAPH
+ 0xF1CE: 0x9031, //CJK UNIFIED IDEOGRAPH
+ 0xF1CF: 0x914E, //CJK UNIFIED IDEOGRAPH
+ 0xF1D0: 0x9152, //CJK UNIFIED IDEOGRAPH
+ 0xF1D1: 0x9444, //CJK UNIFIED IDEOGRAPH
+ 0xF1D2: 0x99D0, //CJK UNIFIED IDEOGRAPH
+ 0xF1D3: 0x7AF9, //CJK UNIFIED IDEOGRAPH
+ 0xF1D4: 0x7CA5, //CJK UNIFIED IDEOGRAPH
+ 0xF1D5: 0x4FCA, //CJK UNIFIED IDEOGRAPH
+ 0xF1D6: 0x5101, //CJK UNIFIED IDEOGRAPH
+ 0xF1D7: 0x51C6, //CJK UNIFIED IDEOGRAPH
+ 0xF1D8: 0x57C8, //CJK UNIFIED IDEOGRAPH
+ 0xF1D9: 0x5BEF, //CJK UNIFIED IDEOGRAPH
+ 0xF1DA: 0x5CFB, //CJK UNIFIED IDEOGRAPH
+ 0xF1DB: 0x6659, //CJK UNIFIED IDEOGRAPH
+ 0xF1DC: 0x6A3D, //CJK UNIFIED IDEOGRAPH
+ 0xF1DD: 0x6D5A, //CJK UNIFIED IDEOGRAPH
+ 0xF1DE: 0x6E96, //CJK UNIFIED IDEOGRAPH
+ 0xF1DF: 0x6FEC, //CJK UNIFIED IDEOGRAPH
+ 0xF1E0: 0x710C, //CJK UNIFIED IDEOGRAPH
+ 0xF1E1: 0x756F, //CJK UNIFIED IDEOGRAPH
+ 0xF1E2: 0x7AE3, //CJK UNIFIED IDEOGRAPH
+ 0xF1E3: 0x8822, //CJK UNIFIED IDEOGRAPH
+ 0xF1E4: 0x9021, //CJK UNIFIED IDEOGRAPH
+ 0xF1E5: 0x9075, //CJK UNIFIED IDEOGRAPH
+ 0xF1E6: 0x96CB, //CJK UNIFIED IDEOGRAPH
+ 0xF1E7: 0x99FF, //CJK UNIFIED IDEOGRAPH
+ 0xF1E8: 0x8301, //CJK UNIFIED IDEOGRAPH
+ 0xF1E9: 0x4E2D, //CJK UNIFIED IDEOGRAPH
+ 0xF1EA: 0x4EF2, //CJK UNIFIED IDEOGRAPH
+ 0xF1EB: 0x8846, //CJK UNIFIED IDEOGRAPH
+ 0xF1EC: 0x91CD, //CJK UNIFIED IDEOGRAPH
+ 0xF1ED: 0x537D, //CJK UNIFIED IDEOGRAPH
+ 0xF1EE: 0x6ADB, //CJK UNIFIED IDEOGRAPH
+ 0xF1EF: 0x696B, //CJK UNIFIED IDEOGRAPH
+ 0xF1F0: 0x6C41, //CJK UNIFIED IDEOGRAPH
+ 0xF1F1: 0x847A, //CJK UNIFIED IDEOGRAPH
+ 0xF1F2: 0x589E, //CJK UNIFIED IDEOGRAPH
+ 0xF1F3: 0x618E, //CJK UNIFIED IDEOGRAPH
+ 0xF1F4: 0x66FE, //CJK UNIFIED IDEOGRAPH
+ 0xF1F5: 0x62EF, //CJK UNIFIED IDEOGRAPH
+ 0xF1F6: 0x70DD, //CJK UNIFIED IDEOGRAPH
+ 0xF1F7: 0x7511, //CJK UNIFIED IDEOGRAPH
+ 0xF1F8: 0x75C7, //CJK UNIFIED IDEOGRAPH
+ 0xF1F9: 0x7E52, //CJK UNIFIED IDEOGRAPH
+ 0xF1FA: 0x84B8, //CJK UNIFIED IDEOGRAPH
+ 0xF1FB: 0x8B49, //CJK UNIFIED IDEOGRAPH
+ 0xF1FC: 0x8D08, //CJK UNIFIED IDEOGRAPH
+ 0xF1FD: 0x4E4B, //CJK UNIFIED IDEOGRAPH
+ 0xF1FE: 0x53EA, //CJK UNIFIED IDEOGRAPH
+ 0xF2A1: 0x54AB, //CJK UNIFIED IDEOGRAPH
+ 0xF2A2: 0x5730, //CJK UNIFIED IDEOGRAPH
+ 0xF2A3: 0x5740, //CJK UNIFIED IDEOGRAPH
+ 0xF2A4: 0x5FD7, //CJK UNIFIED IDEOGRAPH
+ 0xF2A5: 0x6301, //CJK UNIFIED IDEOGRAPH
+ 0xF2A6: 0x6307, //CJK UNIFIED IDEOGRAPH
+ 0xF2A7: 0x646F, //CJK UNIFIED IDEOGRAPH
+ 0xF2A8: 0x652F, //CJK UNIFIED IDEOGRAPH
+ 0xF2A9: 0x65E8, //CJK UNIFIED IDEOGRAPH
+ 0xF2AA: 0x667A, //CJK UNIFIED IDEOGRAPH
+ 0xF2AB: 0x679D, //CJK UNIFIED IDEOGRAPH
+ 0xF2AC: 0x67B3, //CJK UNIFIED IDEOGRAPH
+ 0xF2AD: 0x6B62, //CJK UNIFIED IDEOGRAPH
+ 0xF2AE: 0x6C60, //CJK UNIFIED IDEOGRAPH
+ 0xF2AF: 0x6C9A, //CJK UNIFIED IDEOGRAPH
+ 0xF2B0: 0x6F2C, //CJK UNIFIED IDEOGRAPH
+ 0xF2B1: 0x77E5, //CJK UNIFIED IDEOGRAPH
+ 0xF2B2: 0x7825, //CJK UNIFIED IDEOGRAPH
+ 0xF2B3: 0x7949, //CJK UNIFIED IDEOGRAPH
+ 0xF2B4: 0x7957, //CJK UNIFIED IDEOGRAPH
+ 0xF2B5: 0x7D19, //CJK UNIFIED IDEOGRAPH
+ 0xF2B6: 0x80A2, //CJK UNIFIED IDEOGRAPH
+ 0xF2B7: 0x8102, //CJK UNIFIED IDEOGRAPH
+ 0xF2B8: 0x81F3, //CJK UNIFIED IDEOGRAPH
+ 0xF2B9: 0x829D, //CJK UNIFIED IDEOGRAPH
+ 0xF2BA: 0x82B7, //CJK UNIFIED IDEOGRAPH
+ 0xF2BB: 0x8718, //CJK UNIFIED IDEOGRAPH
+ 0xF2BC: 0x8A8C, //CJK UNIFIED IDEOGRAPH
+ 0xF2BD: 0xF9FC, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF2BE: 0x8D04, //CJK UNIFIED IDEOGRAPH
+ 0xF2BF: 0x8DBE, //CJK UNIFIED IDEOGRAPH
+ 0xF2C0: 0x9072, //CJK UNIFIED IDEOGRAPH
+ 0xF2C1: 0x76F4, //CJK UNIFIED IDEOGRAPH
+ 0xF2C2: 0x7A19, //CJK UNIFIED IDEOGRAPH
+ 0xF2C3: 0x7A37, //CJK UNIFIED IDEOGRAPH
+ 0xF2C4: 0x7E54, //CJK UNIFIED IDEOGRAPH
+ 0xF2C5: 0x8077, //CJK UNIFIED IDEOGRAPH
+ 0xF2C6: 0x5507, //CJK UNIFIED IDEOGRAPH
+ 0xF2C7: 0x55D4, //CJK UNIFIED IDEOGRAPH
+ 0xF2C8: 0x5875, //CJK UNIFIED IDEOGRAPH
+ 0xF2C9: 0x632F, //CJK UNIFIED IDEOGRAPH
+ 0xF2CA: 0x6422, //CJK UNIFIED IDEOGRAPH
+ 0xF2CB: 0x6649, //CJK UNIFIED IDEOGRAPH
+ 0xF2CC: 0x664B, //CJK UNIFIED IDEOGRAPH
+ 0xF2CD: 0x686D, //CJK UNIFIED IDEOGRAPH
+ 0xF2CE: 0x699B, //CJK UNIFIED IDEOGRAPH
+ 0xF2CF: 0x6B84, //CJK UNIFIED IDEOGRAPH
+ 0xF2D0: 0x6D25, //CJK UNIFIED IDEOGRAPH
+ 0xF2D1: 0x6EB1, //CJK UNIFIED IDEOGRAPH
+ 0xF2D2: 0x73CD, //CJK UNIFIED IDEOGRAPH
+ 0xF2D3: 0x7468, //CJK UNIFIED IDEOGRAPH
+ 0xF2D4: 0x74A1, //CJK UNIFIED IDEOGRAPH
+ 0xF2D5: 0x755B, //CJK UNIFIED IDEOGRAPH
+ 0xF2D6: 0x75B9, //CJK UNIFIED IDEOGRAPH
+ 0xF2D7: 0x76E1, //CJK UNIFIED IDEOGRAPH
+ 0xF2D8: 0x771E, //CJK UNIFIED IDEOGRAPH
+ 0xF2D9: 0x778B, //CJK UNIFIED IDEOGRAPH
+ 0xF2DA: 0x79E6, //CJK UNIFIED IDEOGRAPH
+ 0xF2DB: 0x7E09, //CJK UNIFIED IDEOGRAPH
+ 0xF2DC: 0x7E1D, //CJK UNIFIED IDEOGRAPH
+ 0xF2DD: 0x81FB, //CJK UNIFIED IDEOGRAPH
+ 0xF2DE: 0x852F, //CJK UNIFIED IDEOGRAPH
+ 0xF2DF: 0x8897, //CJK UNIFIED IDEOGRAPH
+ 0xF2E0: 0x8A3A, //CJK UNIFIED IDEOGRAPH
+ 0xF2E1: 0x8CD1, //CJK UNIFIED IDEOGRAPH
+ 0xF2E2: 0x8EEB, //CJK UNIFIED IDEOGRAPH
+ 0xF2E3: 0x8FB0, //CJK UNIFIED IDEOGRAPH
+ 0xF2E4: 0x9032, //CJK UNIFIED IDEOGRAPH
+ 0xF2E5: 0x93AD, //CJK UNIFIED IDEOGRAPH
+ 0xF2E6: 0x9663, //CJK UNIFIED IDEOGRAPH
+ 0xF2E7: 0x9673, //CJK UNIFIED IDEOGRAPH
+ 0xF2E8: 0x9707, //CJK UNIFIED IDEOGRAPH
+ 0xF2E9: 0x4F84, //CJK UNIFIED IDEOGRAPH
+ 0xF2EA: 0x53F1, //CJK UNIFIED IDEOGRAPH
+ 0xF2EB: 0x59EA, //CJK UNIFIED IDEOGRAPH
+ 0xF2EC: 0x5AC9, //CJK UNIFIED IDEOGRAPH
+ 0xF2ED: 0x5E19, //CJK UNIFIED IDEOGRAPH
+ 0xF2EE: 0x684E, //CJK UNIFIED IDEOGRAPH
+ 0xF2EF: 0x74C6, //CJK UNIFIED IDEOGRAPH
+ 0xF2F0: 0x75BE, //CJK UNIFIED IDEOGRAPH
+ 0xF2F1: 0x79E9, //CJK UNIFIED IDEOGRAPH
+ 0xF2F2: 0x7A92, //CJK UNIFIED IDEOGRAPH
+ 0xF2F3: 0x81A3, //CJK UNIFIED IDEOGRAPH
+ 0xF2F4: 0x86ED, //CJK UNIFIED IDEOGRAPH
+ 0xF2F5: 0x8CEA, //CJK UNIFIED IDEOGRAPH
+ 0xF2F6: 0x8DCC, //CJK UNIFIED IDEOGRAPH
+ 0xF2F7: 0x8FED, //CJK UNIFIED IDEOGRAPH
+ 0xF2F8: 0x659F, //CJK UNIFIED IDEOGRAPH
+ 0xF2F9: 0x6715, //CJK UNIFIED IDEOGRAPH
+ 0xF2FA: 0xF9FD, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF2FB: 0x57F7, //CJK UNIFIED IDEOGRAPH
+ 0xF2FC: 0x6F57, //CJK UNIFIED IDEOGRAPH
+ 0xF2FD: 0x7DDD, //CJK UNIFIED IDEOGRAPH
+ 0xF2FE: 0x8F2F, //CJK UNIFIED IDEOGRAPH
+ 0xF3A1: 0x93F6, //CJK UNIFIED IDEOGRAPH
+ 0xF3A2: 0x96C6, //CJK UNIFIED IDEOGRAPH
+ 0xF3A3: 0x5FB5, //CJK UNIFIED IDEOGRAPH
+ 0xF3A4: 0x61F2, //CJK UNIFIED IDEOGRAPH
+ 0xF3A5: 0x6F84, //CJK UNIFIED IDEOGRAPH
+ 0xF3A6: 0x4E14, //CJK UNIFIED IDEOGRAPH
+ 0xF3A7: 0x4F98, //CJK UNIFIED IDEOGRAPH
+ 0xF3A8: 0x501F, //CJK UNIFIED IDEOGRAPH
+ 0xF3A9: 0x53C9, //CJK UNIFIED IDEOGRAPH
+ 0xF3AA: 0x55DF, //CJK UNIFIED IDEOGRAPH
+ 0xF3AB: 0x5D6F, //CJK UNIFIED IDEOGRAPH
+ 0xF3AC: 0x5DEE, //CJK UNIFIED IDEOGRAPH
+ 0xF3AD: 0x6B21, //CJK UNIFIED IDEOGRAPH
+ 0xF3AE: 0x6B64, //CJK UNIFIED IDEOGRAPH
+ 0xF3AF: 0x78CB, //CJK UNIFIED IDEOGRAPH
+ 0xF3B0: 0x7B9A, //CJK UNIFIED IDEOGRAPH
+ 0xF3B1: 0xF9FE, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF3B2: 0x8E49, //CJK UNIFIED IDEOGRAPH
+ 0xF3B3: 0x8ECA, //CJK UNIFIED IDEOGRAPH
+ 0xF3B4: 0x906E, //CJK UNIFIED IDEOGRAPH
+ 0xF3B5: 0x6349, //CJK UNIFIED IDEOGRAPH
+ 0xF3B6: 0x643E, //CJK UNIFIED IDEOGRAPH
+ 0xF3B7: 0x7740, //CJK UNIFIED IDEOGRAPH
+ 0xF3B8: 0x7A84, //CJK UNIFIED IDEOGRAPH
+ 0xF3B9: 0x932F, //CJK UNIFIED IDEOGRAPH
+ 0xF3BA: 0x947F, //CJK UNIFIED IDEOGRAPH
+ 0xF3BB: 0x9F6A, //CJK UNIFIED IDEOGRAPH
+ 0xF3BC: 0x64B0, //CJK UNIFIED IDEOGRAPH
+ 0xF3BD: 0x6FAF, //CJK UNIFIED IDEOGRAPH
+ 0xF3BE: 0x71E6, //CJK UNIFIED IDEOGRAPH
+ 0xF3BF: 0x74A8, //CJK UNIFIED IDEOGRAPH
+ 0xF3C0: 0x74DA, //CJK UNIFIED IDEOGRAPH
+ 0xF3C1: 0x7AC4, //CJK UNIFIED IDEOGRAPH
+ 0xF3C2: 0x7C12, //CJK UNIFIED IDEOGRAPH
+ 0xF3C3: 0x7E82, //CJK UNIFIED IDEOGRAPH
+ 0xF3C4: 0x7CB2, //CJK UNIFIED IDEOGRAPH
+ 0xF3C5: 0x7E98, //CJK UNIFIED IDEOGRAPH
+ 0xF3C6: 0x8B9A, //CJK UNIFIED IDEOGRAPH
+ 0xF3C7: 0x8D0A, //CJK UNIFIED IDEOGRAPH
+ 0xF3C8: 0x947D, //CJK UNIFIED IDEOGRAPH
+ 0xF3C9: 0x9910, //CJK UNIFIED IDEOGRAPH
+ 0xF3CA: 0x994C, //CJK UNIFIED IDEOGRAPH
+ 0xF3CB: 0x5239, //CJK UNIFIED IDEOGRAPH
+ 0xF3CC: 0x5BDF, //CJK UNIFIED IDEOGRAPH
+ 0xF3CD: 0x64E6, //CJK UNIFIED IDEOGRAPH
+ 0xF3CE: 0x672D, //CJK UNIFIED IDEOGRAPH
+ 0xF3CF: 0x7D2E, //CJK UNIFIED IDEOGRAPH
+ 0xF3D0: 0x50ED, //CJK UNIFIED IDEOGRAPH
+ 0xF3D1: 0x53C3, //CJK UNIFIED IDEOGRAPH
+ 0xF3D2: 0x5879, //CJK UNIFIED IDEOGRAPH
+ 0xF3D3: 0x6158, //CJK UNIFIED IDEOGRAPH
+ 0xF3D4: 0x6159, //CJK UNIFIED IDEOGRAPH
+ 0xF3D5: 0x61FA, //CJK UNIFIED IDEOGRAPH
+ 0xF3D6: 0x65AC, //CJK UNIFIED IDEOGRAPH
+ 0xF3D7: 0x7AD9, //CJK UNIFIED IDEOGRAPH
+ 0xF3D8: 0x8B92, //CJK UNIFIED IDEOGRAPH
+ 0xF3D9: 0x8B96, //CJK UNIFIED IDEOGRAPH
+ 0xF3DA: 0x5009, //CJK UNIFIED IDEOGRAPH
+ 0xF3DB: 0x5021, //CJK UNIFIED IDEOGRAPH
+ 0xF3DC: 0x5275, //CJK UNIFIED IDEOGRAPH
+ 0xF3DD: 0x5531, //CJK UNIFIED IDEOGRAPH
+ 0xF3DE: 0x5A3C, //CJK UNIFIED IDEOGRAPH
+ 0xF3DF: 0x5EE0, //CJK UNIFIED IDEOGRAPH
+ 0xF3E0: 0x5F70, //CJK UNIFIED IDEOGRAPH
+ 0xF3E1: 0x6134, //CJK UNIFIED IDEOGRAPH
+ 0xF3E2: 0x655E, //CJK UNIFIED IDEOGRAPH
+ 0xF3E3: 0x660C, //CJK UNIFIED IDEOGRAPH
+ 0xF3E4: 0x6636, //CJK UNIFIED IDEOGRAPH
+ 0xF3E5: 0x66A2, //CJK UNIFIED IDEOGRAPH
+ 0xF3E6: 0x69CD, //CJK UNIFIED IDEOGRAPH
+ 0xF3E7: 0x6EC4, //CJK UNIFIED IDEOGRAPH
+ 0xF3E8: 0x6F32, //CJK UNIFIED IDEOGRAPH
+ 0xF3E9: 0x7316, //CJK UNIFIED IDEOGRAPH
+ 0xF3EA: 0x7621, //CJK UNIFIED IDEOGRAPH
+ 0xF3EB: 0x7A93, //CJK UNIFIED IDEOGRAPH
+ 0xF3EC: 0x8139, //CJK UNIFIED IDEOGRAPH
+ 0xF3ED: 0x8259, //CJK UNIFIED IDEOGRAPH
+ 0xF3EE: 0x83D6, //CJK UNIFIED IDEOGRAPH
+ 0xF3EF: 0x84BC, //CJK UNIFIED IDEOGRAPH
+ 0xF3F0: 0x50B5, //CJK UNIFIED IDEOGRAPH
+ 0xF3F1: 0x57F0, //CJK UNIFIED IDEOGRAPH
+ 0xF3F2: 0x5BC0, //CJK UNIFIED IDEOGRAPH
+ 0xF3F3: 0x5BE8, //CJK UNIFIED IDEOGRAPH
+ 0xF3F4: 0x5F69, //CJK UNIFIED IDEOGRAPH
+ 0xF3F5: 0x63A1, //CJK UNIFIED IDEOGRAPH
+ 0xF3F6: 0x7826, //CJK UNIFIED IDEOGRAPH
+ 0xF3F7: 0x7DB5, //CJK UNIFIED IDEOGRAPH
+ 0xF3F8: 0x83DC, //CJK UNIFIED IDEOGRAPH
+ 0xF3F9: 0x8521, //CJK UNIFIED IDEOGRAPH
+ 0xF3FA: 0x91C7, //CJK UNIFIED IDEOGRAPH
+ 0xF3FB: 0x91F5, //CJK UNIFIED IDEOGRAPH
+ 0xF3FC: 0x518A, //CJK UNIFIED IDEOGRAPH
+ 0xF3FD: 0x67F5, //CJK UNIFIED IDEOGRAPH
+ 0xF3FE: 0x7B56, //CJK UNIFIED IDEOGRAPH
+ 0xF4A1: 0x8CAC, //CJK UNIFIED IDEOGRAPH
+ 0xF4A2: 0x51C4, //CJK UNIFIED IDEOGRAPH
+ 0xF4A3: 0x59BB, //CJK UNIFIED IDEOGRAPH
+ 0xF4A4: 0x60BD, //CJK UNIFIED IDEOGRAPH
+ 0xF4A5: 0x8655, //CJK UNIFIED IDEOGRAPH
+ 0xF4A6: 0x501C, //CJK UNIFIED IDEOGRAPH
+ 0xF4A7: 0xF9FF, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF4A8: 0x5254, //CJK UNIFIED IDEOGRAPH
+ 0xF4A9: 0x5C3A, //CJK UNIFIED IDEOGRAPH
+ 0xF4AA: 0x617D, //CJK UNIFIED IDEOGRAPH
+ 0xF4AB: 0x621A, //CJK UNIFIED IDEOGRAPH
+ 0xF4AC: 0x62D3, //CJK UNIFIED IDEOGRAPH
+ 0xF4AD: 0x64F2, //CJK UNIFIED IDEOGRAPH
+ 0xF4AE: 0x65A5, //CJK UNIFIED IDEOGRAPH
+ 0xF4AF: 0x6ECC, //CJK UNIFIED IDEOGRAPH
+ 0xF4B0: 0x7620, //CJK UNIFIED IDEOGRAPH
+ 0xF4B1: 0x810A, //CJK UNIFIED IDEOGRAPH
+ 0xF4B2: 0x8E60, //CJK UNIFIED IDEOGRAPH
+ 0xF4B3: 0x965F, //CJK UNIFIED IDEOGRAPH
+ 0xF4B4: 0x96BB, //CJK UNIFIED IDEOGRAPH
+ 0xF4B5: 0x4EDF, //CJK UNIFIED IDEOGRAPH
+ 0xF4B6: 0x5343, //CJK UNIFIED IDEOGRAPH
+ 0xF4B7: 0x5598, //CJK UNIFIED IDEOGRAPH
+ 0xF4B8: 0x5929, //CJK UNIFIED IDEOGRAPH
+ 0xF4B9: 0x5DDD, //CJK UNIFIED IDEOGRAPH
+ 0xF4BA: 0x64C5, //CJK UNIFIED IDEOGRAPH
+ 0xF4BB: 0x6CC9, //CJK UNIFIED IDEOGRAPH
+ 0xF4BC: 0x6DFA, //CJK UNIFIED IDEOGRAPH
+ 0xF4BD: 0x7394, //CJK UNIFIED IDEOGRAPH
+ 0xF4BE: 0x7A7F, //CJK UNIFIED IDEOGRAPH
+ 0xF4BF: 0x821B, //CJK UNIFIED IDEOGRAPH
+ 0xF4C0: 0x85A6, //CJK UNIFIED IDEOGRAPH
+ 0xF4C1: 0x8CE4, //CJK UNIFIED IDEOGRAPH
+ 0xF4C2: 0x8E10, //CJK UNIFIED IDEOGRAPH
+ 0xF4C3: 0x9077, //CJK UNIFIED IDEOGRAPH
+ 0xF4C4: 0x91E7, //CJK UNIFIED IDEOGRAPH
+ 0xF4C5: 0x95E1, //CJK UNIFIED IDEOGRAPH
+ 0xF4C6: 0x9621, //CJK UNIFIED IDEOGRAPH
+ 0xF4C7: 0x97C6, //CJK UNIFIED IDEOGRAPH
+ 0xF4C8: 0x51F8, //CJK UNIFIED IDEOGRAPH
+ 0xF4C9: 0x54F2, //CJK UNIFIED IDEOGRAPH
+ 0xF4CA: 0x5586, //CJK UNIFIED IDEOGRAPH
+ 0xF4CB: 0x5FB9, //CJK UNIFIED IDEOGRAPH
+ 0xF4CC: 0x64A4, //CJK UNIFIED IDEOGRAPH
+ 0xF4CD: 0x6F88, //CJK UNIFIED IDEOGRAPH
+ 0xF4CE: 0x7DB4, //CJK UNIFIED IDEOGRAPH
+ 0xF4CF: 0x8F1F, //CJK UNIFIED IDEOGRAPH
+ 0xF4D0: 0x8F4D, //CJK UNIFIED IDEOGRAPH
+ 0xF4D1: 0x9435, //CJK UNIFIED IDEOGRAPH
+ 0xF4D2: 0x50C9, //CJK UNIFIED IDEOGRAPH
+ 0xF4D3: 0x5C16, //CJK UNIFIED IDEOGRAPH
+ 0xF4D4: 0x6CBE, //CJK UNIFIED IDEOGRAPH
+ 0xF4D5: 0x6DFB, //CJK UNIFIED IDEOGRAPH
+ 0xF4D6: 0x751B, //CJK UNIFIED IDEOGRAPH
+ 0xF4D7: 0x77BB, //CJK UNIFIED IDEOGRAPH
+ 0xF4D8: 0x7C3D, //CJK UNIFIED IDEOGRAPH
+ 0xF4D9: 0x7C64, //CJK UNIFIED IDEOGRAPH
+ 0xF4DA: 0x8A79, //CJK UNIFIED IDEOGRAPH
+ 0xF4DB: 0x8AC2, //CJK UNIFIED IDEOGRAPH
+ 0xF4DC: 0x581E, //CJK UNIFIED IDEOGRAPH
+ 0xF4DD: 0x59BE, //CJK UNIFIED IDEOGRAPH
+ 0xF4DE: 0x5E16, //CJK UNIFIED IDEOGRAPH
+ 0xF4DF: 0x6377, //CJK UNIFIED IDEOGRAPH
+ 0xF4E0: 0x7252, //CJK UNIFIED IDEOGRAPH
+ 0xF4E1: 0x758A, //CJK UNIFIED IDEOGRAPH
+ 0xF4E2: 0x776B, //CJK UNIFIED IDEOGRAPH
+ 0xF4E3: 0x8ADC, //CJK UNIFIED IDEOGRAPH
+ 0xF4E4: 0x8CBC, //CJK UNIFIED IDEOGRAPH
+ 0xF4E5: 0x8F12, //CJK UNIFIED IDEOGRAPH
+ 0xF4E6: 0x5EF3, //CJK UNIFIED IDEOGRAPH
+ 0xF4E7: 0x6674, //CJK UNIFIED IDEOGRAPH
+ 0xF4E8: 0x6DF8, //CJK UNIFIED IDEOGRAPH
+ 0xF4E9: 0x807D, //CJK UNIFIED IDEOGRAPH
+ 0xF4EA: 0x83C1, //CJK UNIFIED IDEOGRAPH
+ 0xF4EB: 0x8ACB, //CJK UNIFIED IDEOGRAPH
+ 0xF4EC: 0x9751, //CJK UNIFIED IDEOGRAPH
+ 0xF4ED: 0x9BD6, //CJK UNIFIED IDEOGRAPH
+ 0xF4EE: 0xFA00, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF4EF: 0x5243, //CJK UNIFIED IDEOGRAPH
+ 0xF4F0: 0x66FF, //CJK UNIFIED IDEOGRAPH
+ 0xF4F1: 0x6D95, //CJK UNIFIED IDEOGRAPH
+ 0xF4F2: 0x6EEF, //CJK UNIFIED IDEOGRAPH
+ 0xF4F3: 0x7DE0, //CJK UNIFIED IDEOGRAPH
+ 0xF4F4: 0x8AE6, //CJK UNIFIED IDEOGRAPH
+ 0xF4F5: 0x902E, //CJK UNIFIED IDEOGRAPH
+ 0xF4F6: 0x905E, //CJK UNIFIED IDEOGRAPH
+ 0xF4F7: 0x9AD4, //CJK UNIFIED IDEOGRAPH
+ 0xF4F8: 0x521D, //CJK UNIFIED IDEOGRAPH
+ 0xF4F9: 0x527F, //CJK UNIFIED IDEOGRAPH
+ 0xF4FA: 0x54E8, //CJK UNIFIED IDEOGRAPH
+ 0xF4FB: 0x6194, //CJK UNIFIED IDEOGRAPH
+ 0xF4FC: 0x6284, //CJK UNIFIED IDEOGRAPH
+ 0xF4FD: 0x62DB, //CJK UNIFIED IDEOGRAPH
+ 0xF4FE: 0x68A2, //CJK UNIFIED IDEOGRAPH
+ 0xF5A1: 0x6912, //CJK UNIFIED IDEOGRAPH
+ 0xF5A2: 0x695A, //CJK UNIFIED IDEOGRAPH
+ 0xF5A3: 0x6A35, //CJK UNIFIED IDEOGRAPH
+ 0xF5A4: 0x7092, //CJK UNIFIED IDEOGRAPH
+ 0xF5A5: 0x7126, //CJK UNIFIED IDEOGRAPH
+ 0xF5A6: 0x785D, //CJK UNIFIED IDEOGRAPH
+ 0xF5A7: 0x7901, //CJK UNIFIED IDEOGRAPH
+ 0xF5A8: 0x790E, //CJK UNIFIED IDEOGRAPH
+ 0xF5A9: 0x79D2, //CJK UNIFIED IDEOGRAPH
+ 0xF5AA: 0x7A0D, //CJK UNIFIED IDEOGRAPH
+ 0xF5AB: 0x8096, //CJK UNIFIED IDEOGRAPH
+ 0xF5AC: 0x8278, //CJK UNIFIED IDEOGRAPH
+ 0xF5AD: 0x82D5, //CJK UNIFIED IDEOGRAPH
+ 0xF5AE: 0x8349, //CJK UNIFIED IDEOGRAPH
+ 0xF5AF: 0x8549, //CJK UNIFIED IDEOGRAPH
+ 0xF5B0: 0x8C82, //CJK UNIFIED IDEOGRAPH
+ 0xF5B1: 0x8D85, //CJK UNIFIED IDEOGRAPH
+ 0xF5B2: 0x9162, //CJK UNIFIED IDEOGRAPH
+ 0xF5B3: 0x918B, //CJK UNIFIED IDEOGRAPH
+ 0xF5B4: 0x91AE, //CJK UNIFIED IDEOGRAPH
+ 0xF5B5: 0x4FC3, //CJK UNIFIED IDEOGRAPH
+ 0xF5B6: 0x56D1, //CJK UNIFIED IDEOGRAPH
+ 0xF5B7: 0x71ED, //CJK UNIFIED IDEOGRAPH
+ 0xF5B8: 0x77D7, //CJK UNIFIED IDEOGRAPH
+ 0xF5B9: 0x8700, //CJK UNIFIED IDEOGRAPH
+ 0xF5BA: 0x89F8, //CJK UNIFIED IDEOGRAPH
+ 0xF5BB: 0x5BF8, //CJK UNIFIED IDEOGRAPH
+ 0xF5BC: 0x5FD6, //CJK UNIFIED IDEOGRAPH
+ 0xF5BD: 0x6751, //CJK UNIFIED IDEOGRAPH
+ 0xF5BE: 0x90A8, //CJK UNIFIED IDEOGRAPH
+ 0xF5BF: 0x53E2, //CJK UNIFIED IDEOGRAPH
+ 0xF5C0: 0x585A, //CJK UNIFIED IDEOGRAPH
+ 0xF5C1: 0x5BF5, //CJK UNIFIED IDEOGRAPH
+ 0xF5C2: 0x60A4, //CJK UNIFIED IDEOGRAPH
+ 0xF5C3: 0x6181, //CJK UNIFIED IDEOGRAPH
+ 0xF5C4: 0x6460, //CJK UNIFIED IDEOGRAPH
+ 0xF5C5: 0x7E3D, //CJK UNIFIED IDEOGRAPH
+ 0xF5C6: 0x8070, //CJK UNIFIED IDEOGRAPH
+ 0xF5C7: 0x8525, //CJK UNIFIED IDEOGRAPH
+ 0xF5C8: 0x9283, //CJK UNIFIED IDEOGRAPH
+ 0xF5C9: 0x64AE, //CJK UNIFIED IDEOGRAPH
+ 0xF5CA: 0x50AC, //CJK UNIFIED IDEOGRAPH
+ 0xF5CB: 0x5D14, //CJK UNIFIED IDEOGRAPH
+ 0xF5CC: 0x6700, //CJK UNIFIED IDEOGRAPH
+ 0xF5CD: 0x589C, //CJK UNIFIED IDEOGRAPH
+ 0xF5CE: 0x62BD, //CJK UNIFIED IDEOGRAPH
+ 0xF5CF: 0x63A8, //CJK UNIFIED IDEOGRAPH
+ 0xF5D0: 0x690E, //CJK UNIFIED IDEOGRAPH
+ 0xF5D1: 0x6978, //CJK UNIFIED IDEOGRAPH
+ 0xF5D2: 0x6A1E, //CJK UNIFIED IDEOGRAPH
+ 0xF5D3: 0x6E6B, //CJK UNIFIED IDEOGRAPH
+ 0xF5D4: 0x76BA, //CJK UNIFIED IDEOGRAPH
+ 0xF5D5: 0x79CB, //CJK UNIFIED IDEOGRAPH
+ 0xF5D6: 0x82BB, //CJK UNIFIED IDEOGRAPH
+ 0xF5D7: 0x8429, //CJK UNIFIED IDEOGRAPH
+ 0xF5D8: 0x8ACF, //CJK UNIFIED IDEOGRAPH
+ 0xF5D9: 0x8DA8, //CJK UNIFIED IDEOGRAPH
+ 0xF5DA: 0x8FFD, //CJK UNIFIED IDEOGRAPH
+ 0xF5DB: 0x9112, //CJK UNIFIED IDEOGRAPH
+ 0xF5DC: 0x914B, //CJK UNIFIED IDEOGRAPH
+ 0xF5DD: 0x919C, //CJK UNIFIED IDEOGRAPH
+ 0xF5DE: 0x9310, //CJK UNIFIED IDEOGRAPH
+ 0xF5DF: 0x9318, //CJK UNIFIED IDEOGRAPH
+ 0xF5E0: 0x939A, //CJK UNIFIED IDEOGRAPH
+ 0xF5E1: 0x96DB, //CJK UNIFIED IDEOGRAPH
+ 0xF5E2: 0x9A36, //CJK UNIFIED IDEOGRAPH
+ 0xF5E3: 0x9C0D, //CJK UNIFIED IDEOGRAPH
+ 0xF5E4: 0x4E11, //CJK UNIFIED IDEOGRAPH
+ 0xF5E5: 0x755C, //CJK UNIFIED IDEOGRAPH
+ 0xF5E6: 0x795D, //CJK UNIFIED IDEOGRAPH
+ 0xF5E7: 0x7AFA, //CJK UNIFIED IDEOGRAPH
+ 0xF5E8: 0x7B51, //CJK UNIFIED IDEOGRAPH
+ 0xF5E9: 0x7BC9, //CJK UNIFIED IDEOGRAPH
+ 0xF5EA: 0x7E2E, //CJK UNIFIED IDEOGRAPH
+ 0xF5EB: 0x84C4, //CJK UNIFIED IDEOGRAPH
+ 0xF5EC: 0x8E59, //CJK UNIFIED IDEOGRAPH
+ 0xF5ED: 0x8E74, //CJK UNIFIED IDEOGRAPH
+ 0xF5EE: 0x8EF8, //CJK UNIFIED IDEOGRAPH
+ 0xF5EF: 0x9010, //CJK UNIFIED IDEOGRAPH
+ 0xF5F0: 0x6625, //CJK UNIFIED IDEOGRAPH
+ 0xF5F1: 0x693F, //CJK UNIFIED IDEOGRAPH
+ 0xF5F2: 0x7443, //CJK UNIFIED IDEOGRAPH
+ 0xF5F3: 0x51FA, //CJK UNIFIED IDEOGRAPH
+ 0xF5F4: 0x672E, //CJK UNIFIED IDEOGRAPH
+ 0xF5F5: 0x9EDC, //CJK UNIFIED IDEOGRAPH
+ 0xF5F6: 0x5145, //CJK UNIFIED IDEOGRAPH
+ 0xF5F7: 0x5FE0, //CJK UNIFIED IDEOGRAPH
+ 0xF5F8: 0x6C96, //CJK UNIFIED IDEOGRAPH
+ 0xF5F9: 0x87F2, //CJK UNIFIED IDEOGRAPH
+ 0xF5FA: 0x885D, //CJK UNIFIED IDEOGRAPH
+ 0xF5FB: 0x8877, //CJK UNIFIED IDEOGRAPH
+ 0xF5FC: 0x60B4, //CJK UNIFIED IDEOGRAPH
+ 0xF5FD: 0x81B5, //CJK UNIFIED IDEOGRAPH
+ 0xF5FE: 0x8403, //CJK UNIFIED IDEOGRAPH
+ 0xF6A1: 0x8D05, //CJK UNIFIED IDEOGRAPH
+ 0xF6A2: 0x53D6, //CJK UNIFIED IDEOGRAPH
+ 0xF6A3: 0x5439, //CJK UNIFIED IDEOGRAPH
+ 0xF6A4: 0x5634, //CJK UNIFIED IDEOGRAPH
+ 0xF6A5: 0x5A36, //CJK UNIFIED IDEOGRAPH
+ 0xF6A6: 0x5C31, //CJK UNIFIED IDEOGRAPH
+ 0xF6A7: 0x708A, //CJK UNIFIED IDEOGRAPH
+ 0xF6A8: 0x7FE0, //CJK UNIFIED IDEOGRAPH
+ 0xF6A9: 0x805A, //CJK UNIFIED IDEOGRAPH
+ 0xF6AA: 0x8106, //CJK UNIFIED IDEOGRAPH
+ 0xF6AB: 0x81ED, //CJK UNIFIED IDEOGRAPH
+ 0xF6AC: 0x8DA3, //CJK UNIFIED IDEOGRAPH
+ 0xF6AD: 0x9189, //CJK UNIFIED IDEOGRAPH
+ 0xF6AE: 0x9A5F, //CJK UNIFIED IDEOGRAPH
+ 0xF6AF: 0x9DF2, //CJK UNIFIED IDEOGRAPH
+ 0xF6B0: 0x5074, //CJK UNIFIED IDEOGRAPH
+ 0xF6B1: 0x4EC4, //CJK UNIFIED IDEOGRAPH
+ 0xF6B2: 0x53A0, //CJK UNIFIED IDEOGRAPH
+ 0xF6B3: 0x60FB, //CJK UNIFIED IDEOGRAPH
+ 0xF6B4: 0x6E2C, //CJK UNIFIED IDEOGRAPH
+ 0xF6B5: 0x5C64, //CJK UNIFIED IDEOGRAPH
+ 0xF6B6: 0x4F88, //CJK UNIFIED IDEOGRAPH
+ 0xF6B7: 0x5024, //CJK UNIFIED IDEOGRAPH
+ 0xF6B8: 0x55E4, //CJK UNIFIED IDEOGRAPH
+ 0xF6B9: 0x5CD9, //CJK UNIFIED IDEOGRAPH
+ 0xF6BA: 0x5E5F, //CJK UNIFIED IDEOGRAPH
+ 0xF6BB: 0x6065, //CJK UNIFIED IDEOGRAPH
+ 0xF6BC: 0x6894, //CJK UNIFIED IDEOGRAPH
+ 0xF6BD: 0x6CBB, //CJK UNIFIED IDEOGRAPH
+ 0xF6BE: 0x6DC4, //CJK UNIFIED IDEOGRAPH
+ 0xF6BF: 0x71BE, //CJK UNIFIED IDEOGRAPH
+ 0xF6C0: 0x75D4, //CJK UNIFIED IDEOGRAPH
+ 0xF6C1: 0x75F4, //CJK UNIFIED IDEOGRAPH
+ 0xF6C2: 0x7661, //CJK UNIFIED IDEOGRAPH
+ 0xF6C3: 0x7A1A, //CJK UNIFIED IDEOGRAPH
+ 0xF6C4: 0x7A49, //CJK UNIFIED IDEOGRAPH
+ 0xF6C5: 0x7DC7, //CJK UNIFIED IDEOGRAPH
+ 0xF6C6: 0x7DFB, //CJK UNIFIED IDEOGRAPH
+ 0xF6C7: 0x7F6E, //CJK UNIFIED IDEOGRAPH
+ 0xF6C8: 0x81F4, //CJK UNIFIED IDEOGRAPH
+ 0xF6C9: 0x86A9, //CJK UNIFIED IDEOGRAPH
+ 0xF6CA: 0x8F1C, //CJK UNIFIED IDEOGRAPH
+ 0xF6CB: 0x96C9, //CJK UNIFIED IDEOGRAPH
+ 0xF6CC: 0x99B3, //CJK UNIFIED IDEOGRAPH
+ 0xF6CD: 0x9F52, //CJK UNIFIED IDEOGRAPH
+ 0xF6CE: 0x5247, //CJK UNIFIED IDEOGRAPH
+ 0xF6CF: 0x52C5, //CJK UNIFIED IDEOGRAPH
+ 0xF6D0: 0x98ED, //CJK UNIFIED IDEOGRAPH
+ 0xF6D1: 0x89AA, //CJK UNIFIED IDEOGRAPH
+ 0xF6D2: 0x4E03, //CJK UNIFIED IDEOGRAPH
+ 0xF6D3: 0x67D2, //CJK UNIFIED IDEOGRAPH
+ 0xF6D4: 0x6F06, //CJK UNIFIED IDEOGRAPH
+ 0xF6D5: 0x4FB5, //CJK UNIFIED IDEOGRAPH
+ 0xF6D6: 0x5BE2, //CJK UNIFIED IDEOGRAPH
+ 0xF6D7: 0x6795, //CJK UNIFIED IDEOGRAPH
+ 0xF6D8: 0x6C88, //CJK UNIFIED IDEOGRAPH
+ 0xF6D9: 0x6D78, //CJK UNIFIED IDEOGRAPH
+ 0xF6DA: 0x741B, //CJK UNIFIED IDEOGRAPH
+ 0xF6DB: 0x7827, //CJK UNIFIED IDEOGRAPH
+ 0xF6DC: 0x91DD, //CJK UNIFIED IDEOGRAPH
+ 0xF6DD: 0x937C, //CJK UNIFIED IDEOGRAPH
+ 0xF6DE: 0x87C4, //CJK UNIFIED IDEOGRAPH
+ 0xF6DF: 0x79E4, //CJK UNIFIED IDEOGRAPH
+ 0xF6E0: 0x7A31, //CJK UNIFIED IDEOGRAPH
+ 0xF6E1: 0x5FEB, //CJK UNIFIED IDEOGRAPH
+ 0xF6E2: 0x4ED6, //CJK UNIFIED IDEOGRAPH
+ 0xF6E3: 0x54A4, //CJK UNIFIED IDEOGRAPH
+ 0xF6E4: 0x553E, //CJK UNIFIED IDEOGRAPH
+ 0xF6E5: 0x58AE, //CJK UNIFIED IDEOGRAPH
+ 0xF6E6: 0x59A5, //CJK UNIFIED IDEOGRAPH
+ 0xF6E7: 0x60F0, //CJK UNIFIED IDEOGRAPH
+ 0xF6E8: 0x6253, //CJK UNIFIED IDEOGRAPH
+ 0xF6E9: 0x62D6, //CJK UNIFIED IDEOGRAPH
+ 0xF6EA: 0x6736, //CJK UNIFIED IDEOGRAPH
+ 0xF6EB: 0x6955, //CJK UNIFIED IDEOGRAPH
+ 0xF6EC: 0x8235, //CJK UNIFIED IDEOGRAPH
+ 0xF6ED: 0x9640, //CJK UNIFIED IDEOGRAPH
+ 0xF6EE: 0x99B1, //CJK UNIFIED IDEOGRAPH
+ 0xF6EF: 0x99DD, //CJK UNIFIED IDEOGRAPH
+ 0xF6F0: 0x502C, //CJK UNIFIED IDEOGRAPH
+ 0xF6F1: 0x5353, //CJK UNIFIED IDEOGRAPH
+ 0xF6F2: 0x5544, //CJK UNIFIED IDEOGRAPH
+ 0xF6F3: 0x577C, //CJK UNIFIED IDEOGRAPH
+ 0xF6F4: 0xFA01, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF6F5: 0x6258, //CJK UNIFIED IDEOGRAPH
+ 0xF6F6: 0xFA02, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF6F7: 0x64E2, //CJK UNIFIED IDEOGRAPH
+ 0xF6F8: 0x666B, //CJK UNIFIED IDEOGRAPH
+ 0xF6F9: 0x67DD, //CJK UNIFIED IDEOGRAPH
+ 0xF6FA: 0x6FC1, //CJK UNIFIED IDEOGRAPH
+ 0xF6FB: 0x6FEF, //CJK UNIFIED IDEOGRAPH
+ 0xF6FC: 0x7422, //CJK UNIFIED IDEOGRAPH
+ 0xF6FD: 0x7438, //CJK UNIFIED IDEOGRAPH
+ 0xF6FE: 0x8A17, //CJK UNIFIED IDEOGRAPH
+ 0xF7A1: 0x9438, //CJK UNIFIED IDEOGRAPH
+ 0xF7A2: 0x5451, //CJK UNIFIED IDEOGRAPH
+ 0xF7A3: 0x5606, //CJK UNIFIED IDEOGRAPH
+ 0xF7A4: 0x5766, //CJK UNIFIED IDEOGRAPH
+ 0xF7A5: 0x5F48, //CJK UNIFIED IDEOGRAPH
+ 0xF7A6: 0x619A, //CJK UNIFIED IDEOGRAPH
+ 0xF7A7: 0x6B4E, //CJK UNIFIED IDEOGRAPH
+ 0xF7A8: 0x7058, //CJK UNIFIED IDEOGRAPH
+ 0xF7A9: 0x70AD, //CJK UNIFIED IDEOGRAPH
+ 0xF7AA: 0x7DBB, //CJK UNIFIED IDEOGRAPH
+ 0xF7AB: 0x8A95, //CJK UNIFIED IDEOGRAPH
+ 0xF7AC: 0x596A, //CJK UNIFIED IDEOGRAPH
+ 0xF7AD: 0x812B, //CJK UNIFIED IDEOGRAPH
+ 0xF7AE: 0x63A2, //CJK UNIFIED IDEOGRAPH
+ 0xF7AF: 0x7708, //CJK UNIFIED IDEOGRAPH
+ 0xF7B0: 0x803D, //CJK UNIFIED IDEOGRAPH
+ 0xF7B1: 0x8CAA, //CJK UNIFIED IDEOGRAPH
+ 0xF7B2: 0x5854, //CJK UNIFIED IDEOGRAPH
+ 0xF7B3: 0x642D, //CJK UNIFIED IDEOGRAPH
+ 0xF7B4: 0x69BB, //CJK UNIFIED IDEOGRAPH
+ 0xF7B5: 0x5B95, //CJK UNIFIED IDEOGRAPH
+ 0xF7B6: 0x5E11, //CJK UNIFIED IDEOGRAPH
+ 0xF7B7: 0x6E6F, //CJK UNIFIED IDEOGRAPH
+ 0xF7B8: 0xFA03, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF7B9: 0x8569, //CJK UNIFIED IDEOGRAPH
+ 0xF7BA: 0x514C, //CJK UNIFIED IDEOGRAPH
+ 0xF7BB: 0x53F0, //CJK UNIFIED IDEOGRAPH
+ 0xF7BC: 0x592A, //CJK UNIFIED IDEOGRAPH
+ 0xF7BD: 0x6020, //CJK UNIFIED IDEOGRAPH
+ 0xF7BE: 0x614B, //CJK UNIFIED IDEOGRAPH
+ 0xF7BF: 0x6B86, //CJK UNIFIED IDEOGRAPH
+ 0xF7C0: 0x6C70, //CJK UNIFIED IDEOGRAPH
+ 0xF7C1: 0x6CF0, //CJK UNIFIED IDEOGRAPH
+ 0xF7C2: 0x7B1E, //CJK UNIFIED IDEOGRAPH
+ 0xF7C3: 0x80CE, //CJK UNIFIED IDEOGRAPH
+ 0xF7C4: 0x82D4, //CJK UNIFIED IDEOGRAPH
+ 0xF7C5: 0x8DC6, //CJK UNIFIED IDEOGRAPH
+ 0xF7C6: 0x90B0, //CJK UNIFIED IDEOGRAPH
+ 0xF7C7: 0x98B1, //CJK UNIFIED IDEOGRAPH
+ 0xF7C8: 0xFA04, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF7C9: 0x64C7, //CJK UNIFIED IDEOGRAPH
+ 0xF7CA: 0x6FA4, //CJK UNIFIED IDEOGRAPH
+ 0xF7CB: 0x6491, //CJK UNIFIED IDEOGRAPH
+ 0xF7CC: 0x6504, //CJK UNIFIED IDEOGRAPH
+ 0xF7CD: 0x514E, //CJK UNIFIED IDEOGRAPH
+ 0xF7CE: 0x5410, //CJK UNIFIED IDEOGRAPH
+ 0xF7CF: 0x571F, //CJK UNIFIED IDEOGRAPH
+ 0xF7D0: 0x8A0E, //CJK UNIFIED IDEOGRAPH
+ 0xF7D1: 0x615F, //CJK UNIFIED IDEOGRAPH
+ 0xF7D2: 0x6876, //CJK UNIFIED IDEOGRAPH
+ 0xF7D3: 0xFA05, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF7D4: 0x75DB, //CJK UNIFIED IDEOGRAPH
+ 0xF7D5: 0x7B52, //CJK UNIFIED IDEOGRAPH
+ 0xF7D6: 0x7D71, //CJK UNIFIED IDEOGRAPH
+ 0xF7D7: 0x901A, //CJK UNIFIED IDEOGRAPH
+ 0xF7D8: 0x5806, //CJK UNIFIED IDEOGRAPH
+ 0xF7D9: 0x69CC, //CJK UNIFIED IDEOGRAPH
+ 0xF7DA: 0x817F, //CJK UNIFIED IDEOGRAPH
+ 0xF7DB: 0x892A, //CJK UNIFIED IDEOGRAPH
+ 0xF7DC: 0x9000, //CJK UNIFIED IDEOGRAPH
+ 0xF7DD: 0x9839, //CJK UNIFIED IDEOGRAPH
+ 0xF7DE: 0x5078, //CJK UNIFIED IDEOGRAPH
+ 0xF7DF: 0x5957, //CJK UNIFIED IDEOGRAPH
+ 0xF7E0: 0x59AC, //CJK UNIFIED IDEOGRAPH
+ 0xF7E1: 0x6295, //CJK UNIFIED IDEOGRAPH
+ 0xF7E2: 0x900F, //CJK UNIFIED IDEOGRAPH
+ 0xF7E3: 0x9B2A, //CJK UNIFIED IDEOGRAPH
+ 0xF7E4: 0x615D, //CJK UNIFIED IDEOGRAPH
+ 0xF7E5: 0x7279, //CJK UNIFIED IDEOGRAPH
+ 0xF7E6: 0x95D6, //CJK UNIFIED IDEOGRAPH
+ 0xF7E7: 0x5761, //CJK UNIFIED IDEOGRAPH
+ 0xF7E8: 0x5A46, //CJK UNIFIED IDEOGRAPH
+ 0xF7E9: 0x5DF4, //CJK UNIFIED IDEOGRAPH
+ 0xF7EA: 0x628A, //CJK UNIFIED IDEOGRAPH
+ 0xF7EB: 0x64AD, //CJK UNIFIED IDEOGRAPH
+ 0xF7EC: 0x64FA, //CJK UNIFIED IDEOGRAPH
+ 0xF7ED: 0x6777, //CJK UNIFIED IDEOGRAPH
+ 0xF7EE: 0x6CE2, //CJK UNIFIED IDEOGRAPH
+ 0xF7EF: 0x6D3E, //CJK UNIFIED IDEOGRAPH
+ 0xF7F0: 0x722C, //CJK UNIFIED IDEOGRAPH
+ 0xF7F1: 0x7436, //CJK UNIFIED IDEOGRAPH
+ 0xF7F2: 0x7834, //CJK UNIFIED IDEOGRAPH
+ 0xF7F3: 0x7F77, //CJK UNIFIED IDEOGRAPH
+ 0xF7F4: 0x82AD, //CJK UNIFIED IDEOGRAPH
+ 0xF7F5: 0x8DDB, //CJK UNIFIED IDEOGRAPH
+ 0xF7F6: 0x9817, //CJK UNIFIED IDEOGRAPH
+ 0xF7F7: 0x5224, //CJK UNIFIED IDEOGRAPH
+ 0xF7F8: 0x5742, //CJK UNIFIED IDEOGRAPH
+ 0xF7F9: 0x677F, //CJK UNIFIED IDEOGRAPH
+ 0xF7FA: 0x7248, //CJK UNIFIED IDEOGRAPH
+ 0xF7FB: 0x74E3, //CJK UNIFIED IDEOGRAPH
+ 0xF7FC: 0x8CA9, //CJK UNIFIED IDEOGRAPH
+ 0xF7FD: 0x8FA6, //CJK UNIFIED IDEOGRAPH
+ 0xF7FE: 0x9211, //CJK UNIFIED IDEOGRAPH
+ 0xF8A1: 0x962A, //CJK UNIFIED IDEOGRAPH
+ 0xF8A2: 0x516B, //CJK UNIFIED IDEOGRAPH
+ 0xF8A3: 0x53ED, //CJK UNIFIED IDEOGRAPH
+ 0xF8A4: 0x634C, //CJK UNIFIED IDEOGRAPH
+ 0xF8A5: 0x4F69, //CJK UNIFIED IDEOGRAPH
+ 0xF8A6: 0x5504, //CJK UNIFIED IDEOGRAPH
+ 0xF8A7: 0x6096, //CJK UNIFIED IDEOGRAPH
+ 0xF8A8: 0x6557, //CJK UNIFIED IDEOGRAPH
+ 0xF8A9: 0x6C9B, //CJK UNIFIED IDEOGRAPH
+ 0xF8AA: 0x6D7F, //CJK UNIFIED IDEOGRAPH
+ 0xF8AB: 0x724C, //CJK UNIFIED IDEOGRAPH
+ 0xF8AC: 0x72FD, //CJK UNIFIED IDEOGRAPH
+ 0xF8AD: 0x7A17, //CJK UNIFIED IDEOGRAPH
+ 0xF8AE: 0x8987, //CJK UNIFIED IDEOGRAPH
+ 0xF8AF: 0x8C9D, //CJK UNIFIED IDEOGRAPH
+ 0xF8B0: 0x5F6D, //CJK UNIFIED IDEOGRAPH
+ 0xF8B1: 0x6F8E, //CJK UNIFIED IDEOGRAPH
+ 0xF8B2: 0x70F9, //CJK UNIFIED IDEOGRAPH
+ 0xF8B3: 0x81A8, //CJK UNIFIED IDEOGRAPH
+ 0xF8B4: 0x610E, //CJK UNIFIED IDEOGRAPH
+ 0xF8B5: 0x4FBF, //CJK UNIFIED IDEOGRAPH
+ 0xF8B6: 0x504F, //CJK UNIFIED IDEOGRAPH
+ 0xF8B7: 0x6241, //CJK UNIFIED IDEOGRAPH
+ 0xF8B8: 0x7247, //CJK UNIFIED IDEOGRAPH
+ 0xF8B9: 0x7BC7, //CJK UNIFIED IDEOGRAPH
+ 0xF8BA: 0x7DE8, //CJK UNIFIED IDEOGRAPH
+ 0xF8BB: 0x7FE9, //CJK UNIFIED IDEOGRAPH
+ 0xF8BC: 0x904D, //CJK UNIFIED IDEOGRAPH
+ 0xF8BD: 0x97AD, //CJK UNIFIED IDEOGRAPH
+ 0xF8BE: 0x9A19, //CJK UNIFIED IDEOGRAPH
+ 0xF8BF: 0x8CB6, //CJK UNIFIED IDEOGRAPH
+ 0xF8C0: 0x576A, //CJK UNIFIED IDEOGRAPH
+ 0xF8C1: 0x5E73, //CJK UNIFIED IDEOGRAPH
+ 0xF8C2: 0x67B0, //CJK UNIFIED IDEOGRAPH
+ 0xF8C3: 0x840D, //CJK UNIFIED IDEOGRAPH
+ 0xF8C4: 0x8A55, //CJK UNIFIED IDEOGRAPH
+ 0xF8C5: 0x5420, //CJK UNIFIED IDEOGRAPH
+ 0xF8C6: 0x5B16, //CJK UNIFIED IDEOGRAPH
+ 0xF8C7: 0x5E63, //CJK UNIFIED IDEOGRAPH
+ 0xF8C8: 0x5EE2, //CJK UNIFIED IDEOGRAPH
+ 0xF8C9: 0x5F0A, //CJK UNIFIED IDEOGRAPH
+ 0xF8CA: 0x6583, //CJK UNIFIED IDEOGRAPH
+ 0xF8CB: 0x80BA, //CJK UNIFIED IDEOGRAPH
+ 0xF8CC: 0x853D, //CJK UNIFIED IDEOGRAPH
+ 0xF8CD: 0x9589, //CJK UNIFIED IDEOGRAPH
+ 0xF8CE: 0x965B, //CJK UNIFIED IDEOGRAPH
+ 0xF8CF: 0x4F48, //CJK UNIFIED IDEOGRAPH
+ 0xF8D0: 0x5305, //CJK UNIFIED IDEOGRAPH
+ 0xF8D1: 0x530D, //CJK UNIFIED IDEOGRAPH
+ 0xF8D2: 0x530F, //CJK UNIFIED IDEOGRAPH
+ 0xF8D3: 0x5486, //CJK UNIFIED IDEOGRAPH
+ 0xF8D4: 0x54FA, //CJK UNIFIED IDEOGRAPH
+ 0xF8D5: 0x5703, //CJK UNIFIED IDEOGRAPH
+ 0xF8D6: 0x5E03, //CJK UNIFIED IDEOGRAPH
+ 0xF8D7: 0x6016, //CJK UNIFIED IDEOGRAPH
+ 0xF8D8: 0x629B, //CJK UNIFIED IDEOGRAPH
+ 0xF8D9: 0x62B1, //CJK UNIFIED IDEOGRAPH
+ 0xF8DA: 0x6355, //CJK UNIFIED IDEOGRAPH
+ 0xF8DB: 0xFA06, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF8DC: 0x6CE1, //CJK UNIFIED IDEOGRAPH
+ 0xF8DD: 0x6D66, //CJK UNIFIED IDEOGRAPH
+ 0xF8DE: 0x75B1, //CJK UNIFIED IDEOGRAPH
+ 0xF8DF: 0x7832, //CJK UNIFIED IDEOGRAPH
+ 0xF8E0: 0x80DE, //CJK UNIFIED IDEOGRAPH
+ 0xF8E1: 0x812F, //CJK UNIFIED IDEOGRAPH
+ 0xF8E2: 0x82DE, //CJK UNIFIED IDEOGRAPH
+ 0xF8E3: 0x8461, //CJK UNIFIED IDEOGRAPH
+ 0xF8E4: 0x84B2, //CJK UNIFIED IDEOGRAPH
+ 0xF8E5: 0x888D, //CJK UNIFIED IDEOGRAPH
+ 0xF8E6: 0x8912, //CJK UNIFIED IDEOGRAPH
+ 0xF8E7: 0x900B, //CJK UNIFIED IDEOGRAPH
+ 0xF8E8: 0x92EA, //CJK UNIFIED IDEOGRAPH
+ 0xF8E9: 0x98FD, //CJK UNIFIED IDEOGRAPH
+ 0xF8EA: 0x9B91, //CJK UNIFIED IDEOGRAPH
+ 0xF8EB: 0x5E45, //CJK UNIFIED IDEOGRAPH
+ 0xF8EC: 0x66B4, //CJK UNIFIED IDEOGRAPH
+ 0xF8ED: 0x66DD, //CJK UNIFIED IDEOGRAPH
+ 0xF8EE: 0x7011, //CJK UNIFIED IDEOGRAPH
+ 0xF8EF: 0x7206, //CJK UNIFIED IDEOGRAPH
+ 0xF8F0: 0xFA07, //CJK COMPATIBILITY IDEOGRAPH
+ 0xF8F1: 0x4FF5, //CJK UNIFIED IDEOGRAPH
+ 0xF8F2: 0x527D, //CJK UNIFIED IDEOGRAPH
+ 0xF8F3: 0x5F6A, //CJK UNIFIED IDEOGRAPH
+ 0xF8F4: 0x6153, //CJK UNIFIED IDEOGRAPH
+ 0xF8F5: 0x6753, //CJK UNIFIED IDEOGRAPH
+ 0xF8F6: 0x6A19, //CJK UNIFIED IDEOGRAPH
+ 0xF8F7: 0x6F02, //CJK UNIFIED IDEOGRAPH
+ 0xF8F8: 0x74E2, //CJK UNIFIED IDEOGRAPH
+ 0xF8F9: 0x7968, //CJK UNIFIED IDEOGRAPH
+ 0xF8FA: 0x8868, //CJK UNIFIED IDEOGRAPH
+ 0xF8FB: 0x8C79, //CJK UNIFIED IDEOGRAPH
+ 0xF8FC: 0x98C7, //CJK UNIFIED IDEOGRAPH
+ 0xF8FD: 0x98C4, //CJK UNIFIED IDEOGRAPH
+ 0xF8FE: 0x9A43, //CJK UNIFIED IDEOGRAPH
+ 0xF9A1: 0x54C1, //CJK UNIFIED IDEOGRAPH
+ 0xF9A2: 0x7A1F, //CJK UNIFIED IDEOGRAPH
+ 0xF9A3: 0x6953, //CJK UNIFIED IDEOGRAPH
+ 0xF9A4: 0x8AF7, //CJK UNIFIED IDEOGRAPH
+ 0xF9A5: 0x8C4A, //CJK UNIFIED IDEOGRAPH
+ 0xF9A6: 0x98A8, //CJK UNIFIED IDEOGRAPH
+ 0xF9A7: 0x99AE, //CJK UNIFIED IDEOGRAPH
+ 0xF9A8: 0x5F7C, //CJK UNIFIED IDEOGRAPH
+ 0xF9A9: 0x62AB, //CJK UNIFIED IDEOGRAPH
+ 0xF9AA: 0x75B2, //CJK UNIFIED IDEOGRAPH
+ 0xF9AB: 0x76AE, //CJK UNIFIED IDEOGRAPH
+ 0xF9AC: 0x88AB, //CJK UNIFIED IDEOGRAPH
+ 0xF9AD: 0x907F, //CJK UNIFIED IDEOGRAPH
+ 0xF9AE: 0x9642, //CJK UNIFIED IDEOGRAPH
+ 0xF9AF: 0x5339, //CJK UNIFIED IDEOGRAPH
+ 0xF9B0: 0x5F3C, //CJK UNIFIED IDEOGRAPH
+ 0xF9B1: 0x5FC5, //CJK UNIFIED IDEOGRAPH
+ 0xF9B2: 0x6CCC, //CJK UNIFIED IDEOGRAPH
+ 0xF9B3: 0x73CC, //CJK UNIFIED IDEOGRAPH
+ 0xF9B4: 0x7562, //CJK UNIFIED IDEOGRAPH
+ 0xF9B5: 0x758B, //CJK UNIFIED IDEOGRAPH
+ 0xF9B6: 0x7B46, //CJK UNIFIED IDEOGRAPH
+ 0xF9B7: 0x82FE, //CJK UNIFIED IDEOGRAPH
+ 0xF9B8: 0x999D, //CJK UNIFIED IDEOGRAPH
+ 0xF9B9: 0x4E4F, //CJK UNIFIED IDEOGRAPH
+ 0xF9BA: 0x903C, //CJK UNIFIED IDEOGRAPH
+ 0xF9BB: 0x4E0B, //CJK UNIFIED IDEOGRAPH
+ 0xF9BC: 0x4F55, //CJK UNIFIED IDEOGRAPH
+ 0xF9BD: 0x53A6, //CJK UNIFIED IDEOGRAPH
+ 0xF9BE: 0x590F, //CJK UNIFIED IDEOGRAPH
+ 0xF9BF: 0x5EC8, //CJK UNIFIED IDEOGRAPH
+ 0xF9C0: 0x6630, //CJK UNIFIED IDEOGRAPH
+ 0xF9C1: 0x6CB3, //CJK UNIFIED IDEOGRAPH
+ 0xF9C2: 0x7455, //CJK UNIFIED IDEOGRAPH
+ 0xF9C3: 0x8377, //CJK UNIFIED IDEOGRAPH
+ 0xF9C4: 0x8766, //CJK UNIFIED IDEOGRAPH
+ 0xF9C5: 0x8CC0, //CJK UNIFIED IDEOGRAPH
+ 0xF9C6: 0x9050, //CJK UNIFIED IDEOGRAPH
+ 0xF9C7: 0x971E, //CJK UNIFIED IDEOGRAPH
+ 0xF9C8: 0x9C15, //CJK UNIFIED IDEOGRAPH
+ 0xF9C9: 0x58D1, //CJK UNIFIED IDEOGRAPH
+ 0xF9CA: 0x5B78, //CJK UNIFIED IDEOGRAPH
+ 0xF9CB: 0x8650, //CJK UNIFIED IDEOGRAPH
+ 0xF9CC: 0x8B14, //CJK UNIFIED IDEOGRAPH
+ 0xF9CD: 0x9DB4, //CJK UNIFIED IDEOGRAPH
+ 0xF9CE: 0x5BD2, //CJK UNIFIED IDEOGRAPH
+ 0xF9CF: 0x6068, //CJK UNIFIED IDEOGRAPH
+ 0xF9D0: 0x608D, //CJK UNIFIED IDEOGRAPH
+ 0xF9D1: 0x65F1, //CJK UNIFIED IDEOGRAPH
+ 0xF9D2: 0x6C57, //CJK UNIFIED IDEOGRAPH
+ 0xF9D3: 0x6F22, //CJK UNIFIED IDEOGRAPH
+ 0xF9D4: 0x6FA3, //CJK UNIFIED IDEOGRAPH
+ 0xF9D5: 0x701A, //CJK UNIFIED IDEOGRAPH
+ 0xF9D6: 0x7F55, //CJK UNIFIED IDEOGRAPH
+ 0xF9D7: 0x7FF0, //CJK UNIFIED IDEOGRAPH
+ 0xF9D8: 0x9591, //CJK UNIFIED IDEOGRAPH
+ 0xF9D9: 0x9592, //CJK UNIFIED IDEOGRAPH
+ 0xF9DA: 0x9650, //CJK UNIFIED IDEOGRAPH
+ 0xF9DB: 0x97D3, //CJK UNIFIED IDEOGRAPH
+ 0xF9DC: 0x5272, //CJK UNIFIED IDEOGRAPH
+ 0xF9DD: 0x8F44, //CJK UNIFIED IDEOGRAPH
+ 0xF9DE: 0x51FD, //CJK UNIFIED IDEOGRAPH
+ 0xF9DF: 0x542B, //CJK UNIFIED IDEOGRAPH
+ 0xF9E0: 0x54B8, //CJK UNIFIED IDEOGRAPH
+ 0xF9E1: 0x5563, //CJK UNIFIED IDEOGRAPH
+ 0xF9E2: 0x558A, //CJK UNIFIED IDEOGRAPH
+ 0xF9E3: 0x6ABB, //CJK UNIFIED IDEOGRAPH
+ 0xF9E4: 0x6DB5, //CJK UNIFIED IDEOGRAPH
+ 0xF9E5: 0x7DD8, //CJK UNIFIED IDEOGRAPH
+ 0xF9E6: 0x8266, //CJK UNIFIED IDEOGRAPH
+ 0xF9E7: 0x929C, //CJK UNIFIED IDEOGRAPH
+ 0xF9E8: 0x9677, //CJK UNIFIED IDEOGRAPH
+ 0xF9E9: 0x9E79, //CJK UNIFIED IDEOGRAPH
+ 0xF9EA: 0x5408, //CJK UNIFIED IDEOGRAPH
+ 0xF9EB: 0x54C8, //CJK UNIFIED IDEOGRAPH
+ 0xF9EC: 0x76D2, //CJK UNIFIED IDEOGRAPH
+ 0xF9ED: 0x86E4, //CJK UNIFIED IDEOGRAPH
+ 0xF9EE: 0x95A4, //CJK UNIFIED IDEOGRAPH
+ 0xF9EF: 0x95D4, //CJK UNIFIED IDEOGRAPH
+ 0xF9F0: 0x965C, //CJK UNIFIED IDEOGRAPH
+ 0xF9F1: 0x4EA2, //CJK UNIFIED IDEOGRAPH
+ 0xF9F2: 0x4F09, //CJK UNIFIED IDEOGRAPH
+ 0xF9F3: 0x59EE, //CJK UNIFIED IDEOGRAPH
+ 0xF9F4: 0x5AE6, //CJK UNIFIED IDEOGRAPH
+ 0xF9F5: 0x5DF7, //CJK UNIFIED IDEOGRAPH
+ 0xF9F6: 0x6052, //CJK UNIFIED IDEOGRAPH
+ 0xF9F7: 0x6297, //CJK UNIFIED IDEOGRAPH
+ 0xF9F8: 0x676D, //CJK UNIFIED IDEOGRAPH
+ 0xF9F9: 0x6841, //CJK UNIFIED IDEOGRAPH
+ 0xF9FA: 0x6C86, //CJK UNIFIED IDEOGRAPH
+ 0xF9FB: 0x6E2F, //CJK UNIFIED IDEOGRAPH
+ 0xF9FC: 0x7F38, //CJK UNIFIED IDEOGRAPH
+ 0xF9FD: 0x809B, //CJK UNIFIED IDEOGRAPH
+ 0xF9FE: 0x822A, //CJK UNIFIED IDEOGRAPH
+ 0xFAA1: 0xFA08, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFAA2: 0xFA09, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFAA3: 0x9805, //CJK UNIFIED IDEOGRAPH
+ 0xFAA4: 0x4EA5, //CJK UNIFIED IDEOGRAPH
+ 0xFAA5: 0x5055, //CJK UNIFIED IDEOGRAPH
+ 0xFAA6: 0x54B3, //CJK UNIFIED IDEOGRAPH
+ 0xFAA7: 0x5793, //CJK UNIFIED IDEOGRAPH
+ 0xFAA8: 0x595A, //CJK UNIFIED IDEOGRAPH
+ 0xFAA9: 0x5B69, //CJK UNIFIED IDEOGRAPH
+ 0xFAAA: 0x5BB3, //CJK UNIFIED IDEOGRAPH
+ 0xFAAB: 0x61C8, //CJK UNIFIED IDEOGRAPH
+ 0xFAAC: 0x6977, //CJK UNIFIED IDEOGRAPH
+ 0xFAAD: 0x6D77, //CJK UNIFIED IDEOGRAPH
+ 0xFAAE: 0x7023, //CJK UNIFIED IDEOGRAPH
+ 0xFAAF: 0x87F9, //CJK UNIFIED IDEOGRAPH
+ 0xFAB0: 0x89E3, //CJK UNIFIED IDEOGRAPH
+ 0xFAB1: 0x8A72, //CJK UNIFIED IDEOGRAPH
+ 0xFAB2: 0x8AE7, //CJK UNIFIED IDEOGRAPH
+ 0xFAB3: 0x9082, //CJK UNIFIED IDEOGRAPH
+ 0xFAB4: 0x99ED, //CJK UNIFIED IDEOGRAPH
+ 0xFAB5: 0x9AB8, //CJK UNIFIED IDEOGRAPH
+ 0xFAB6: 0x52BE, //CJK UNIFIED IDEOGRAPH
+ 0xFAB7: 0x6838, //CJK UNIFIED IDEOGRAPH
+ 0xFAB8: 0x5016, //CJK UNIFIED IDEOGRAPH
+ 0xFAB9: 0x5E78, //CJK UNIFIED IDEOGRAPH
+ 0xFABA: 0x674F, //CJK UNIFIED IDEOGRAPH
+ 0xFABB: 0x8347, //CJK UNIFIED IDEOGRAPH
+ 0xFABC: 0x884C, //CJK UNIFIED IDEOGRAPH
+ 0xFABD: 0x4EAB, //CJK UNIFIED IDEOGRAPH
+ 0xFABE: 0x5411, //CJK UNIFIED IDEOGRAPH
+ 0xFABF: 0x56AE, //CJK UNIFIED IDEOGRAPH
+ 0xFAC0: 0x73E6, //CJK UNIFIED IDEOGRAPH
+ 0xFAC1: 0x9115, //CJK UNIFIED IDEOGRAPH
+ 0xFAC2: 0x97FF, //CJK UNIFIED IDEOGRAPH
+ 0xFAC3: 0x9909, //CJK UNIFIED IDEOGRAPH
+ 0xFAC4: 0x9957, //CJK UNIFIED IDEOGRAPH
+ 0xFAC5: 0x9999, //CJK UNIFIED IDEOGRAPH
+ 0xFAC6: 0x5653, //CJK UNIFIED IDEOGRAPH
+ 0xFAC7: 0x589F, //CJK UNIFIED IDEOGRAPH
+ 0xFAC8: 0x865B, //CJK UNIFIED IDEOGRAPH
+ 0xFAC9: 0x8A31, //CJK UNIFIED IDEOGRAPH
+ 0xFACA: 0x61B2, //CJK UNIFIED IDEOGRAPH
+ 0xFACB: 0x6AF6, //CJK UNIFIED IDEOGRAPH
+ 0xFACC: 0x737B, //CJK UNIFIED IDEOGRAPH
+ 0xFACD: 0x8ED2, //CJK UNIFIED IDEOGRAPH
+ 0xFACE: 0x6B47, //CJK UNIFIED IDEOGRAPH
+ 0xFACF: 0x96AA, //CJK UNIFIED IDEOGRAPH
+ 0xFAD0: 0x9A57, //CJK UNIFIED IDEOGRAPH
+ 0xFAD1: 0x5955, //CJK UNIFIED IDEOGRAPH
+ 0xFAD2: 0x7200, //CJK UNIFIED IDEOGRAPH
+ 0xFAD3: 0x8D6B, //CJK UNIFIED IDEOGRAPH
+ 0xFAD4: 0x9769, //CJK UNIFIED IDEOGRAPH
+ 0xFAD5: 0x4FD4, //CJK UNIFIED IDEOGRAPH
+ 0xFAD6: 0x5CF4, //CJK UNIFIED IDEOGRAPH
+ 0xFAD7: 0x5F26, //CJK UNIFIED IDEOGRAPH
+ 0xFAD8: 0x61F8, //CJK UNIFIED IDEOGRAPH
+ 0xFAD9: 0x665B, //CJK UNIFIED IDEOGRAPH
+ 0xFADA: 0x6CEB, //CJK UNIFIED IDEOGRAPH
+ 0xFADB: 0x70AB, //CJK UNIFIED IDEOGRAPH
+ 0xFADC: 0x7384, //CJK UNIFIED IDEOGRAPH
+ 0xFADD: 0x73B9, //CJK UNIFIED IDEOGRAPH
+ 0xFADE: 0x73FE, //CJK UNIFIED IDEOGRAPH
+ 0xFADF: 0x7729, //CJK UNIFIED IDEOGRAPH
+ 0xFAE0: 0x774D, //CJK UNIFIED IDEOGRAPH
+ 0xFAE1: 0x7D43, //CJK UNIFIED IDEOGRAPH
+ 0xFAE2: 0x7D62, //CJK UNIFIED IDEOGRAPH
+ 0xFAE3: 0x7E23, //CJK UNIFIED IDEOGRAPH
+ 0xFAE4: 0x8237, //CJK UNIFIED IDEOGRAPH
+ 0xFAE5: 0x8852, //CJK UNIFIED IDEOGRAPH
+ 0xFAE6: 0xFA0A, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFAE7: 0x8CE2, //CJK UNIFIED IDEOGRAPH
+ 0xFAE8: 0x9249, //CJK UNIFIED IDEOGRAPH
+ 0xFAE9: 0x986F, //CJK UNIFIED IDEOGRAPH
+ 0xFAEA: 0x5B51, //CJK UNIFIED IDEOGRAPH
+ 0xFAEB: 0x7A74, //CJK UNIFIED IDEOGRAPH
+ 0xFAEC: 0x8840, //CJK UNIFIED IDEOGRAPH
+ 0xFAED: 0x9801, //CJK UNIFIED IDEOGRAPH
+ 0xFAEE: 0x5ACC, //CJK UNIFIED IDEOGRAPH
+ 0xFAEF: 0x4FE0, //CJK UNIFIED IDEOGRAPH
+ 0xFAF0: 0x5354, //CJK UNIFIED IDEOGRAPH
+ 0xFAF1: 0x593E, //CJK UNIFIED IDEOGRAPH
+ 0xFAF2: 0x5CFD, //CJK UNIFIED IDEOGRAPH
+ 0xFAF3: 0x633E, //CJK UNIFIED IDEOGRAPH
+ 0xFAF4: 0x6D79, //CJK UNIFIED IDEOGRAPH
+ 0xFAF5: 0x72F9, //CJK UNIFIED IDEOGRAPH
+ 0xFAF6: 0x8105, //CJK UNIFIED IDEOGRAPH
+ 0xFAF7: 0x8107, //CJK UNIFIED IDEOGRAPH
+ 0xFAF8: 0x83A2, //CJK UNIFIED IDEOGRAPH
+ 0xFAF9: 0x92CF, //CJK UNIFIED IDEOGRAPH
+ 0xFAFA: 0x9830, //CJK UNIFIED IDEOGRAPH
+ 0xFAFB: 0x4EA8, //CJK UNIFIED IDEOGRAPH
+ 0xFAFC: 0x5144, //CJK UNIFIED IDEOGRAPH
+ 0xFAFD: 0x5211, //CJK UNIFIED IDEOGRAPH
+ 0xFAFE: 0x578B, //CJK UNIFIED IDEOGRAPH
+ 0xFBA1: 0x5F62, //CJK UNIFIED IDEOGRAPH
+ 0xFBA2: 0x6CC2, //CJK UNIFIED IDEOGRAPH
+ 0xFBA3: 0x6ECE, //CJK UNIFIED IDEOGRAPH
+ 0xFBA4: 0x7005, //CJK UNIFIED IDEOGRAPH
+ 0xFBA5: 0x7050, //CJK UNIFIED IDEOGRAPH
+ 0xFBA6: 0x70AF, //CJK UNIFIED IDEOGRAPH
+ 0xFBA7: 0x7192, //CJK UNIFIED IDEOGRAPH
+ 0xFBA8: 0x73E9, //CJK UNIFIED IDEOGRAPH
+ 0xFBA9: 0x7469, //CJK UNIFIED IDEOGRAPH
+ 0xFBAA: 0x834A, //CJK UNIFIED IDEOGRAPH
+ 0xFBAB: 0x87A2, //CJK UNIFIED IDEOGRAPH
+ 0xFBAC: 0x8861, //CJK UNIFIED IDEOGRAPH
+ 0xFBAD: 0x9008, //CJK UNIFIED IDEOGRAPH
+ 0xFBAE: 0x90A2, //CJK UNIFIED IDEOGRAPH
+ 0xFBAF: 0x93A3, //CJK UNIFIED IDEOGRAPH
+ 0xFBB0: 0x99A8, //CJK UNIFIED IDEOGRAPH
+ 0xFBB1: 0x516E, //CJK UNIFIED IDEOGRAPH
+ 0xFBB2: 0x5F57, //CJK UNIFIED IDEOGRAPH
+ 0xFBB3: 0x60E0, //CJK UNIFIED IDEOGRAPH
+ 0xFBB4: 0x6167, //CJK UNIFIED IDEOGRAPH
+ 0xFBB5: 0x66B3, //CJK UNIFIED IDEOGRAPH
+ 0xFBB6: 0x8559, //CJK UNIFIED IDEOGRAPH
+ 0xFBB7: 0x8E4A, //CJK UNIFIED IDEOGRAPH
+ 0xFBB8: 0x91AF, //CJK UNIFIED IDEOGRAPH
+ 0xFBB9: 0x978B, //CJK UNIFIED IDEOGRAPH
+ 0xFBBA: 0x4E4E, //CJK UNIFIED IDEOGRAPH
+ 0xFBBB: 0x4E92, //CJK UNIFIED IDEOGRAPH
+ 0xFBBC: 0x547C, //CJK UNIFIED IDEOGRAPH
+ 0xFBBD: 0x58D5, //CJK UNIFIED IDEOGRAPH
+ 0xFBBE: 0x58FA, //CJK UNIFIED IDEOGRAPH
+ 0xFBBF: 0x597D, //CJK UNIFIED IDEOGRAPH
+ 0xFBC0: 0x5CB5, //CJK UNIFIED IDEOGRAPH
+ 0xFBC1: 0x5F27, //CJK UNIFIED IDEOGRAPH
+ 0xFBC2: 0x6236, //CJK UNIFIED IDEOGRAPH
+ 0xFBC3: 0x6248, //CJK UNIFIED IDEOGRAPH
+ 0xFBC4: 0x660A, //CJK UNIFIED IDEOGRAPH
+ 0xFBC5: 0x6667, //CJK UNIFIED IDEOGRAPH
+ 0xFBC6: 0x6BEB, //CJK UNIFIED IDEOGRAPH
+ 0xFBC7: 0x6D69, //CJK UNIFIED IDEOGRAPH
+ 0xFBC8: 0x6DCF, //CJK UNIFIED IDEOGRAPH
+ 0xFBC9: 0x6E56, //CJK UNIFIED IDEOGRAPH
+ 0xFBCA: 0x6EF8, //CJK UNIFIED IDEOGRAPH
+ 0xFBCB: 0x6F94, //CJK UNIFIED IDEOGRAPH
+ 0xFBCC: 0x6FE0, //CJK UNIFIED IDEOGRAPH
+ 0xFBCD: 0x6FE9, //CJK UNIFIED IDEOGRAPH
+ 0xFBCE: 0x705D, //CJK UNIFIED IDEOGRAPH
+ 0xFBCF: 0x72D0, //CJK UNIFIED IDEOGRAPH
+ 0xFBD0: 0x7425, //CJK UNIFIED IDEOGRAPH
+ 0xFBD1: 0x745A, //CJK UNIFIED IDEOGRAPH
+ 0xFBD2: 0x74E0, //CJK UNIFIED IDEOGRAPH
+ 0xFBD3: 0x7693, //CJK UNIFIED IDEOGRAPH
+ 0xFBD4: 0x795C, //CJK UNIFIED IDEOGRAPH
+ 0xFBD5: 0x7CCA, //CJK UNIFIED IDEOGRAPH
+ 0xFBD6: 0x7E1E, //CJK UNIFIED IDEOGRAPH
+ 0xFBD7: 0x80E1, //CJK UNIFIED IDEOGRAPH
+ 0xFBD8: 0x82A6, //CJK UNIFIED IDEOGRAPH
+ 0xFBD9: 0x846B, //CJK UNIFIED IDEOGRAPH
+ 0xFBDA: 0x84BF, //CJK UNIFIED IDEOGRAPH
+ 0xFBDB: 0x864E, //CJK UNIFIED IDEOGRAPH
+ 0xFBDC: 0x865F, //CJK UNIFIED IDEOGRAPH
+ 0xFBDD: 0x8774, //CJK UNIFIED IDEOGRAPH
+ 0xFBDE: 0x8B77, //CJK UNIFIED IDEOGRAPH
+ 0xFBDF: 0x8C6A, //CJK UNIFIED IDEOGRAPH
+ 0xFBE0: 0x93AC, //CJK UNIFIED IDEOGRAPH
+ 0xFBE1: 0x9800, //CJK UNIFIED IDEOGRAPH
+ 0xFBE2: 0x9865, //CJK UNIFIED IDEOGRAPH
+ 0xFBE3: 0x60D1, //CJK UNIFIED IDEOGRAPH
+ 0xFBE4: 0x6216, //CJK UNIFIED IDEOGRAPH
+ 0xFBE5: 0x9177, //CJK UNIFIED IDEOGRAPH
+ 0xFBE6: 0x5A5A, //CJK UNIFIED IDEOGRAPH
+ 0xFBE7: 0x660F, //CJK UNIFIED IDEOGRAPH
+ 0xFBE8: 0x6DF7, //CJK UNIFIED IDEOGRAPH
+ 0xFBE9: 0x6E3E, //CJK UNIFIED IDEOGRAPH
+ 0xFBEA: 0x743F, //CJK UNIFIED IDEOGRAPH
+ 0xFBEB: 0x9B42, //CJK UNIFIED IDEOGRAPH
+ 0xFBEC: 0x5FFD, //CJK UNIFIED IDEOGRAPH
+ 0xFBED: 0x60DA, //CJK UNIFIED IDEOGRAPH
+ 0xFBEE: 0x7B0F, //CJK UNIFIED IDEOGRAPH
+ 0xFBEF: 0x54C4, //CJK UNIFIED IDEOGRAPH
+ 0xFBF0: 0x5F18, //CJK UNIFIED IDEOGRAPH
+ 0xFBF1: 0x6C5E, //CJK UNIFIED IDEOGRAPH
+ 0xFBF2: 0x6CD3, //CJK UNIFIED IDEOGRAPH
+ 0xFBF3: 0x6D2A, //CJK UNIFIED IDEOGRAPH
+ 0xFBF4: 0x70D8, //CJK UNIFIED IDEOGRAPH
+ 0xFBF5: 0x7D05, //CJK UNIFIED IDEOGRAPH
+ 0xFBF6: 0x8679, //CJK UNIFIED IDEOGRAPH
+ 0xFBF7: 0x8A0C, //CJK UNIFIED IDEOGRAPH
+ 0xFBF8: 0x9D3B, //CJK UNIFIED IDEOGRAPH
+ 0xFBF9: 0x5316, //CJK UNIFIED IDEOGRAPH
+ 0xFBFA: 0x548C, //CJK UNIFIED IDEOGRAPH
+ 0xFBFB: 0x5B05, //CJK UNIFIED IDEOGRAPH
+ 0xFBFC: 0x6A3A, //CJK UNIFIED IDEOGRAPH
+ 0xFBFD: 0x706B, //CJK UNIFIED IDEOGRAPH
+ 0xFBFE: 0x7575, //CJK UNIFIED IDEOGRAPH
+ 0xFCA1: 0x798D, //CJK UNIFIED IDEOGRAPH
+ 0xFCA2: 0x79BE, //CJK UNIFIED IDEOGRAPH
+ 0xFCA3: 0x82B1, //CJK UNIFIED IDEOGRAPH
+ 0xFCA4: 0x83EF, //CJK UNIFIED IDEOGRAPH
+ 0xFCA5: 0x8A71, //CJK UNIFIED IDEOGRAPH
+ 0xFCA6: 0x8B41, //CJK UNIFIED IDEOGRAPH
+ 0xFCA7: 0x8CA8, //CJK UNIFIED IDEOGRAPH
+ 0xFCA8: 0x9774, //CJK UNIFIED IDEOGRAPH
+ 0xFCA9: 0xFA0B, //CJK COMPATIBILITY IDEOGRAPH
+ 0xFCAA: 0x64F4, //CJK UNIFIED IDEOGRAPH
+ 0xFCAB: 0x652B, //CJK UNIFIED IDEOGRAPH
+ 0xFCAC: 0x78BA, //CJK UNIFIED IDEOGRAPH
+ 0xFCAD: 0x78BB, //CJK UNIFIED IDEOGRAPH
+ 0xFCAE: 0x7A6B, //CJK UNIFIED IDEOGRAPH
+ 0xFCAF: 0x4E38, //CJK UNIFIED IDEOGRAPH
+ 0xFCB0: 0x559A, //CJK UNIFIED IDEOGRAPH
+ 0xFCB1: 0x5950, //CJK UNIFIED IDEOGRAPH
+ 0xFCB2: 0x5BA6, //CJK UNIFIED IDEOGRAPH
+ 0xFCB3: 0x5E7B, //CJK UNIFIED IDEOGRAPH
+ 0xFCB4: 0x60A3, //CJK UNIFIED IDEOGRAPH
+ 0xFCB5: 0x63DB, //CJK UNIFIED IDEOGRAPH
+ 0xFCB6: 0x6B61, //CJK UNIFIED IDEOGRAPH
+ 0xFCB7: 0x6665, //CJK UNIFIED IDEOGRAPH
+ 0xFCB8: 0x6853, //CJK UNIFIED IDEOGRAPH
+ 0xFCB9: 0x6E19, //CJK UNIFIED IDEOGRAPH
+ 0xFCBA: 0x7165, //CJK UNIFIED IDEOGRAPH
+ 0xFCBB: 0x74B0, //CJK UNIFIED IDEOGRAPH
+ 0xFCBC: 0x7D08, //CJK UNIFIED IDEOGRAPH
+ 0xFCBD: 0x9084, //CJK UNIFIED IDEOGRAPH
+ 0xFCBE: 0x9A69, //CJK UNIFIED IDEOGRAPH
+ 0xFCBF: 0x9C25, //CJK UNIFIED IDEOGRAPH
+ 0xFCC0: 0x6D3B, //CJK UNIFIED IDEOGRAPH
+ 0xFCC1: 0x6ED1, //CJK UNIFIED IDEOGRAPH
+ 0xFCC2: 0x733E, //CJK UNIFIED IDEOGRAPH
+ 0xFCC3: 0x8C41, //CJK UNIFIED IDEOGRAPH
+ 0xFCC4: 0x95CA, //CJK UNIFIED IDEOGRAPH
+ 0xFCC5: 0x51F0, //CJK UNIFIED IDEOGRAPH
+ 0xFCC6: 0x5E4C, //CJK UNIFIED IDEOGRAPH
+ 0xFCC7: 0x5FA8, //CJK UNIFIED IDEOGRAPH
+ 0xFCC8: 0x604D, //CJK UNIFIED IDEOGRAPH
+ 0xFCC9: 0x60F6, //CJK UNIFIED IDEOGRAPH
+ 0xFCCA: 0x6130, //CJK UNIFIED IDEOGRAPH
+ 0xFCCB: 0x614C, //CJK UNIFIED IDEOGRAPH
+ 0xFCCC: 0x6643, //CJK UNIFIED IDEOGRAPH
+ 0xFCCD: 0x6644, //CJK UNIFIED IDEOGRAPH
+ 0xFCCE: 0x69A5, //CJK UNIFIED IDEOGRAPH
+ 0xFCCF: 0x6CC1, //CJK UNIFIED IDEOGRAPH
+ 0xFCD0: 0x6E5F, //CJK UNIFIED IDEOGRAPH
+ 0xFCD1: 0x6EC9, //CJK UNIFIED IDEOGRAPH
+ 0xFCD2: 0x6F62, //CJK UNIFIED IDEOGRAPH
+ 0xFCD3: 0x714C, //CJK UNIFIED IDEOGRAPH
+ 0xFCD4: 0x749C, //CJK UNIFIED IDEOGRAPH
+ 0xFCD5: 0x7687, //CJK UNIFIED IDEOGRAPH
+ 0xFCD6: 0x7BC1, //CJK UNIFIED IDEOGRAPH
+ 0xFCD7: 0x7C27, //CJK UNIFIED IDEOGRAPH
+ 0xFCD8: 0x8352, //CJK UNIFIED IDEOGRAPH
+ 0xFCD9: 0x8757, //CJK UNIFIED IDEOGRAPH
+ 0xFCDA: 0x9051, //CJK UNIFIED IDEOGRAPH
+ 0xFCDB: 0x968D, //CJK UNIFIED IDEOGRAPH
+ 0xFCDC: 0x9EC3, //CJK UNIFIED IDEOGRAPH
+ 0xFCDD: 0x532F, //CJK UNIFIED IDEOGRAPH
+ 0xFCDE: 0x56DE, //CJK UNIFIED IDEOGRAPH
+ 0xFCDF: 0x5EFB, //CJK UNIFIED IDEOGRAPH
+ 0xFCE0: 0x5F8A, //CJK UNIFIED IDEOGRAPH
+ 0xFCE1: 0x6062, //CJK UNIFIED IDEOGRAPH
+ 0xFCE2: 0x6094, //CJK UNIFIED IDEOGRAPH
+ 0xFCE3: 0x61F7, //CJK UNIFIED IDEOGRAPH
+ 0xFCE4: 0x6666, //CJK UNIFIED IDEOGRAPH
+ 0xFCE5: 0x6703, //CJK UNIFIED IDEOGRAPH
+ 0xFCE6: 0x6A9C, //CJK UNIFIED IDEOGRAPH
+ 0xFCE7: 0x6DEE, //CJK UNIFIED IDEOGRAPH
+ 0xFCE8: 0x6FAE, //CJK UNIFIED IDEOGRAPH
+ 0xFCE9: 0x7070, //CJK UNIFIED IDEOGRAPH
+ 0xFCEA: 0x736A, //CJK UNIFIED IDEOGRAPH
+ 0xFCEB: 0x7E6A, //CJK UNIFIED IDEOGRAPH
+ 0xFCEC: 0x81BE, //CJK UNIFIED IDEOGRAPH
+ 0xFCED: 0x8334, //CJK UNIFIED IDEOGRAPH
+ 0xFCEE: 0x86D4, //CJK UNIFIED IDEOGRAPH
+ 0xFCEF: 0x8AA8, //CJK UNIFIED IDEOGRAPH
+ 0xFCF0: 0x8CC4, //CJK UNIFIED IDEOGRAPH
+ 0xFCF1: 0x5283, //CJK UNIFIED IDEOGRAPH
+ 0xFCF2: 0x7372, //CJK UNIFIED IDEOGRAPH
+ 0xFCF3: 0x5B96, //CJK UNIFIED IDEOGRAPH
+ 0xFCF4: 0x6A6B, //CJK UNIFIED IDEOGRAPH
+ 0xFCF5: 0x9404, //CJK UNIFIED IDEOGRAPH
+ 0xFCF6: 0x54EE, //CJK UNIFIED IDEOGRAPH
+ 0xFCF7: 0x5686, //CJK UNIFIED IDEOGRAPH
+ 0xFCF8: 0x5B5D, //CJK UNIFIED IDEOGRAPH
+ 0xFCF9: 0x6548, //CJK UNIFIED IDEOGRAPH
+ 0xFCFA: 0x6585, //CJK UNIFIED IDEOGRAPH
+ 0xFCFB: 0x66C9, //CJK UNIFIED IDEOGRAPH
+ 0xFCFC: 0x689F, //CJK UNIFIED IDEOGRAPH
+ 0xFCFD: 0x6D8D, //CJK UNIFIED IDEOGRAPH
+ 0xFCFE: 0x6DC6, //CJK UNIFIED IDEOGRAPH
+ 0xFDA1: 0x723B, //CJK UNIFIED IDEOGRAPH
+ 0xFDA2: 0x80B4, //CJK UNIFIED IDEOGRAPH
+ 0xFDA3: 0x9175, //CJK UNIFIED IDEOGRAPH
+ 0xFDA4: 0x9A4D, //CJK UNIFIED IDEOGRAPH
+ 0xFDA5: 0x4FAF, //CJK UNIFIED IDEOGRAPH
+ 0xFDA6: 0x5019, //CJK UNIFIED IDEOGRAPH
+ 0xFDA7: 0x539A, //CJK UNIFIED IDEOGRAPH
+ 0xFDA8: 0x540E, //CJK UNIFIED IDEOGRAPH
+ 0xFDA9: 0x543C, //CJK UNIFIED IDEOGRAPH
+ 0xFDAA: 0x5589, //CJK UNIFIED IDEOGRAPH
+ 0xFDAB: 0x55C5, //CJK UNIFIED IDEOGRAPH
+ 0xFDAC: 0x5E3F, //CJK UNIFIED IDEOGRAPH
+ 0xFDAD: 0x5F8C, //CJK UNIFIED IDEOGRAPH
+ 0xFDAE: 0x673D, //CJK UNIFIED IDEOGRAPH
+ 0xFDAF: 0x7166, //CJK UNIFIED IDEOGRAPH
+ 0xFDB0: 0x73DD, //CJK UNIFIED IDEOGRAPH
+ 0xFDB1: 0x9005, //CJK UNIFIED IDEOGRAPH
+ 0xFDB2: 0x52DB, //CJK UNIFIED IDEOGRAPH
+ 0xFDB3: 0x52F3, //CJK UNIFIED IDEOGRAPH
+ 0xFDB4: 0x5864, //CJK UNIFIED IDEOGRAPH
+ 0xFDB5: 0x58CE, //CJK UNIFIED IDEOGRAPH
+ 0xFDB6: 0x7104, //CJK UNIFIED IDEOGRAPH
+ 0xFDB7: 0x718F, //CJK UNIFIED IDEOGRAPH
+ 0xFDB8: 0x71FB, //CJK UNIFIED IDEOGRAPH
+ 0xFDB9: 0x85B0, //CJK UNIFIED IDEOGRAPH
+ 0xFDBA: 0x8A13, //CJK UNIFIED IDEOGRAPH
+ 0xFDBB: 0x6688, //CJK UNIFIED IDEOGRAPH
+ 0xFDBC: 0x85A8, //CJK UNIFIED IDEOGRAPH
+ 0xFDBD: 0x55A7, //CJK UNIFIED IDEOGRAPH
+ 0xFDBE: 0x6684, //CJK UNIFIED IDEOGRAPH
+ 0xFDBF: 0x714A, //CJK UNIFIED IDEOGRAPH
+ 0xFDC0: 0x8431, //CJK UNIFIED IDEOGRAPH
+ 0xFDC1: 0x5349, //CJK UNIFIED IDEOGRAPH
+ 0xFDC2: 0x5599, //CJK UNIFIED IDEOGRAPH
+ 0xFDC3: 0x6BC1, //CJK UNIFIED IDEOGRAPH
+ 0xFDC4: 0x5F59, //CJK UNIFIED IDEOGRAPH
+ 0xFDC5: 0x5FBD, //CJK UNIFIED IDEOGRAPH
+ 0xFDC6: 0x63EE, //CJK UNIFIED IDEOGRAPH
+ 0xFDC7: 0x6689, //CJK UNIFIED IDEOGRAPH
+ 0xFDC8: 0x7147, //CJK UNIFIED IDEOGRAPH
+ 0xFDC9: 0x8AF1, //CJK UNIFIED IDEOGRAPH
+ 0xFDCA: 0x8F1D, //CJK UNIFIED IDEOGRAPH
+ 0xFDCB: 0x9EBE, //CJK UNIFIED IDEOGRAPH
+ 0xFDCC: 0x4F11, //CJK UNIFIED IDEOGRAPH
+ 0xFDCD: 0x643A, //CJK UNIFIED IDEOGRAPH
+ 0xFDCE: 0x70CB, //CJK UNIFIED IDEOGRAPH
+ 0xFDCF: 0x7566, //CJK UNIFIED IDEOGRAPH
+ 0xFDD0: 0x8667, //CJK UNIFIED IDEOGRAPH
+ 0xFDD1: 0x6064, //CJK UNIFIED IDEOGRAPH
+ 0xFDD2: 0x8B4E, //CJK UNIFIED IDEOGRAPH
+ 0xFDD3: 0x9DF8, //CJK UNIFIED IDEOGRAPH
+ 0xFDD4: 0x5147, //CJK UNIFIED IDEOGRAPH
+ 0xFDD5: 0x51F6, //CJK UNIFIED IDEOGRAPH
+ 0xFDD6: 0x5308, //CJK UNIFIED IDEOGRAPH
+ 0xFDD7: 0x6D36, //CJK UNIFIED IDEOGRAPH
+ 0xFDD8: 0x80F8, //CJK UNIFIED IDEOGRAPH
+ 0xFDD9: 0x9ED1, //CJK UNIFIED IDEOGRAPH
+ 0xFDDA: 0x6615, //CJK UNIFIED IDEOGRAPH
+ 0xFDDB: 0x6B23, //CJK UNIFIED IDEOGRAPH
+ 0xFDDC: 0x7098, //CJK UNIFIED IDEOGRAPH
+ 0xFDDD: 0x75D5, //CJK UNIFIED IDEOGRAPH
+ 0xFDDE: 0x5403, //CJK UNIFIED IDEOGRAPH
+ 0xFDDF: 0x5C79, //CJK UNIFIED IDEOGRAPH
+ 0xFDE0: 0x7D07, //CJK UNIFIED IDEOGRAPH
+ 0xFDE1: 0x8A16, //CJK UNIFIED IDEOGRAPH
+ 0xFDE2: 0x6B20, //CJK UNIFIED IDEOGRAPH
+ 0xFDE3: 0x6B3D, //CJK UNIFIED IDEOGRAPH
+ 0xFDE4: 0x6B46, //CJK UNIFIED IDEOGRAPH
+ 0xFDE5: 0x5438, //CJK UNIFIED IDEOGRAPH
+ 0xFDE6: 0x6070, //CJK UNIFIED IDEOGRAPH
+ 0xFDE7: 0x6D3D, //CJK UNIFIED IDEOGRAPH
+ 0xFDE8: 0x7FD5, //CJK UNIFIED IDEOGRAPH
+ 0xFDE9: 0x8208, //CJK UNIFIED IDEOGRAPH
+ 0xFDEA: 0x50D6, //CJK UNIFIED IDEOGRAPH
+ 0xFDEB: 0x51DE, //CJK UNIFIED IDEOGRAPH
+ 0xFDEC: 0x559C, //CJK UNIFIED IDEOGRAPH
+ 0xFDED: 0x566B, //CJK UNIFIED IDEOGRAPH
+ 0xFDEE: 0x56CD, //CJK UNIFIED IDEOGRAPH
+ 0xFDEF: 0x59EC, //CJK UNIFIED IDEOGRAPH
+ 0xFDF0: 0x5B09, //CJK UNIFIED IDEOGRAPH
+ 0xFDF1: 0x5E0C, //CJK UNIFIED IDEOGRAPH
+ 0xFDF2: 0x6199, //CJK UNIFIED IDEOGRAPH
+ 0xFDF3: 0x6198, //CJK UNIFIED IDEOGRAPH
+ 0xFDF4: 0x6231, //CJK UNIFIED IDEOGRAPH
+ 0xFDF5: 0x665E, //CJK UNIFIED IDEOGRAPH
+ 0xFDF6: 0x66E6, //CJK UNIFIED IDEOGRAPH
+ 0xFDF7: 0x7199, //CJK UNIFIED IDEOGRAPH
+ 0xFDF8: 0x71B9, //CJK UNIFIED IDEOGRAPH
+ 0xFDF9: 0x71BA, //CJK UNIFIED IDEOGRAPH
+ 0xFDFA: 0x72A7, //CJK UNIFIED IDEOGRAPH
+ 0xFDFB: 0x79A7, //CJK UNIFIED IDEOGRAPH
+ 0xFDFC: 0x7A00, //CJK UNIFIED IDEOGRAPH
+ 0xFDFD: 0x7FB2, //CJK UNIFIED IDEOGRAPH
+ 0xFDFE: 0x8A70, //CJK UNIFIED IDEOGRAPH
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/cp950.go b/vendor/github.com/denisenkom/go-mssqldb/cp950.go
new file mode 100644
index 000000000..cbf25cb91
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/cp950.go
@@ -0,0 +1,13767 @@
+package mssql
+
+var cp950 *charsetMap = &charsetMap{
+ sb: [256]rune{
+ 0x0000, //NULL
+ 0x0001, //START OF HEADING
+ 0x0002, //START OF TEXT
+ 0x0003, //END OF TEXT
+ 0x0004, //END OF TRANSMISSION
+ 0x0005, //ENQUIRY
+ 0x0006, //ACKNOWLEDGE
+ 0x0007, //BELL
+ 0x0008, //BACKSPACE
+ 0x0009, //HORIZONTAL TABULATION
+ 0x000A, //LINE FEED
+ 0x000B, //VERTICAL TABULATION
+ 0x000C, //FORM FEED
+ 0x000D, //CARRIAGE RETURN
+ 0x000E, //SHIFT OUT
+ 0x000F, //SHIFT IN
+ 0x0010, //DATA LINK ESCAPE
+ 0x0011, //DEVICE CONTROL ONE
+ 0x0012, //DEVICE CONTROL TWO
+ 0x0013, //DEVICE CONTROL THREE
+ 0x0014, //DEVICE CONTROL FOUR
+ 0x0015, //NEGATIVE ACKNOWLEDGE
+ 0x0016, //SYNCHRONOUS IDLE
+ 0x0017, //END OF TRANSMISSION BLOCK
+ 0x0018, //CANCEL
+ 0x0019, //END OF MEDIUM
+ 0x001A, //SUBSTITUTE
+ 0x001B, //ESCAPE
+ 0x001C, //FILE SEPARATOR
+ 0x001D, //GROUP SEPARATOR
+ 0x001E, //RECORD SEPARATOR
+ 0x001F, //UNIT SEPARATOR
+ 0x0020, //SPACE
+ 0x0021, //EXCLAMATION MARK
+ 0x0022, //QUOTATION MARK
+ 0x0023, //NUMBER SIGN
+ 0x0024, //DOLLAR SIGN
+ 0x0025, //PERCENT SIGN
+ 0x0026, //AMPERSAND
+ 0x0027, //APOSTROPHE
+ 0x0028, //LEFT PARENTHESIS
+ 0x0029, //RIGHT PARENTHESIS
+ 0x002A, //ASTERISK
+ 0x002B, //PLUS SIGN
+ 0x002C, //COMMA
+ 0x002D, //HYPHEN-MINUS
+ 0x002E, //FULL STOP
+ 0x002F, //SOLIDUS
+ 0x0030, //DIGIT ZERO
+ 0x0031, //DIGIT ONE
+ 0x0032, //DIGIT TWO
+ 0x0033, //DIGIT THREE
+ 0x0034, //DIGIT FOUR
+ 0x0035, //DIGIT FIVE
+ 0x0036, //DIGIT SIX
+ 0x0037, //DIGIT SEVEN
+ 0x0038, //DIGIT EIGHT
+ 0x0039, //DIGIT NINE
+ 0x003A, //COLON
+ 0x003B, //SEMICOLON
+ 0x003C, //LESS-THAN SIGN
+ 0x003D, //EQUALS SIGN
+ 0x003E, //GREATER-THAN SIGN
+ 0x003F, //QUESTION MARK
+ 0x0040, //COMMERCIAL AT
+ 0x0041, //LATIN CAPITAL LETTER A
+ 0x0042, //LATIN CAPITAL LETTER B
+ 0x0043, //LATIN CAPITAL LETTER C
+ 0x0044, //LATIN CAPITAL LETTER D
+ 0x0045, //LATIN CAPITAL LETTER E
+ 0x0046, //LATIN CAPITAL LETTER F
+ 0x0047, //LATIN CAPITAL LETTER G
+ 0x0048, //LATIN CAPITAL LETTER H
+ 0x0049, //LATIN CAPITAL LETTER I
+ 0x004A, //LATIN CAPITAL LETTER J
+ 0x004B, //LATIN CAPITAL LETTER K
+ 0x004C, //LATIN CAPITAL LETTER L
+ 0x004D, //LATIN CAPITAL LETTER M
+ 0x004E, //LATIN CAPITAL LETTER N
+ 0x004F, //LATIN CAPITAL LETTER O
+ 0x0050, //LATIN CAPITAL LETTER P
+ 0x0051, //LATIN CAPITAL LETTER Q
+ 0x0052, //LATIN CAPITAL LETTER R
+ 0x0053, //LATIN CAPITAL LETTER S
+ 0x0054, //LATIN CAPITAL LETTER T
+ 0x0055, //LATIN CAPITAL LETTER U
+ 0x0056, //LATIN CAPITAL LETTER V
+ 0x0057, //LATIN CAPITAL LETTER W
+ 0x0058, //LATIN CAPITAL LETTER X
+ 0x0059, //LATIN CAPITAL LETTER Y
+ 0x005A, //LATIN CAPITAL LETTER Z
+ 0x005B, //LEFT SQUARE BRACKET
+ 0x005C, //REVERSE SOLIDUS
+ 0x005D, //RIGHT SQUARE BRACKET
+ 0x005E, //CIRCUMFLEX ACCENT
+ 0x005F, //LOW LINE
+ 0x0060, //GRAVE ACCENT
+ 0x0061, //LATIN SMALL LETTER A
+ 0x0062, //LATIN SMALL LETTER B
+ 0x0063, //LATIN SMALL LETTER C
+ 0x0064, //LATIN SMALL LETTER D
+ 0x0065, //LATIN SMALL LETTER E
+ 0x0066, //LATIN SMALL LETTER F
+ 0x0067, //LATIN SMALL LETTER G
+ 0x0068, //LATIN SMALL LETTER H
+ 0x0069, //LATIN SMALL LETTER I
+ 0x006A, //LATIN SMALL LETTER J
+ 0x006B, //LATIN SMALL LETTER K
+ 0x006C, //LATIN SMALL LETTER L
+ 0x006D, //LATIN SMALL LETTER M
+ 0x006E, //LATIN SMALL LETTER N
+ 0x006F, //LATIN SMALL LETTER O
+ 0x0070, //LATIN SMALL LETTER P
+ 0x0071, //LATIN SMALL LETTER Q
+ 0x0072, //LATIN SMALL LETTER R
+ 0x0073, //LATIN SMALL LETTER S
+ 0x0074, //LATIN SMALL LETTER T
+ 0x0075, //LATIN SMALL LETTER U
+ 0x0076, //LATIN SMALL LETTER V
+ 0x0077, //LATIN SMALL LETTER W
+ 0x0078, //LATIN SMALL LETTER X
+ 0x0079, //LATIN SMALL LETTER Y
+ 0x007A, //LATIN SMALL LETTER Z
+ 0x007B, //LEFT CURLY BRACKET
+ 0x007C, //VERTICAL LINE
+ 0x007D, //RIGHT CURLY BRACKET
+ 0x007E, //TILDE
+ 0x007F, //DELETE
+ 0xFFFD, //UNDEFINED
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ -1, //DBCS LEAD BYTE
+ 0xFFFD, //UNDEFINED
+ },
+ db: map[int]rune{
+ 0xA140: 0x3000, //IDEOGRAPHIC SPACE
+ 0xA141: 0xFF0C, //FULLWIDTH COMMA
+ 0xA142: 0x3001, //IDEOGRAPHIC COMMA
+ 0xA143: 0x3002, //IDEOGRAPHIC FULL STOP
+ 0xA144: 0xFF0E, //FULLWIDTH FULL STOP
+ 0xA145: 0x2027, //HYPHENATION POINT
+ 0xA146: 0xFF1B, //FULLWIDTH SEMICOLON
+ 0xA147: 0xFF1A, //FULLWIDTH COLON
+ 0xA148: 0xFF1F, //FULLWIDTH QUESTION MARK
+ 0xA149: 0xFF01, //FULLWIDTH EXCLAMATION MARK
+ 0xA14A: 0xFE30, //PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+ 0xA14B: 0x2026, //HORIZONTAL ELLIPSIS
+ 0xA14C: 0x2025, //TWO DOT LEADER
+ 0xA14D: 0xFE50, //SMALL COMMA
+ 0xA14E: 0xFE51, //SMALL IDEOGRAPHIC COMMA
+ 0xA14F: 0xFE52, //SMALL FULL STOP
+ 0xA150: 0x00B7, //MIDDLE DOT
+ 0xA151: 0xFE54, //SMALL SEMICOLON
+ 0xA152: 0xFE55, //SMALL COLON
+ 0xA153: 0xFE56, //SMALL QUESTION MARK
+ 0xA154: 0xFE57, //SMALL EXCLAMATION MARK
+ 0xA155: 0xFF5C, //FULLWIDTH VERTICAL LINE
+ 0xA156: 0x2013, //EN DASH
+ 0xA157: 0xFE31, //PRESENTATION FORM FOR VERTICAL EM DASH
+ 0xA158: 0x2014, //EM DASH
+ 0xA159: 0xFE33, //PRESENTATION FORM FOR VERTICAL LOW LINE
+ 0xA15A: 0x2574, //BOX DRAWINGS LIGHT LEFT
+ 0xA15B: 0xFE34, //PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+ 0xA15C: 0xFE4F, //WAVY LOW LINE
+ 0xA15D: 0xFF08, //FULLWIDTH LEFT PARENTHESIS
+ 0xA15E: 0xFF09, //FULLWIDTH RIGHT PARENTHESIS
+ 0xA15F: 0xFE35, //PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+ 0xA160: 0xFE36, //PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+ 0xA161: 0xFF5B, //FULLWIDTH LEFT CURLY BRACKET
+ 0xA162: 0xFF5D, //FULLWIDTH RIGHT CURLY BRACKET
+ 0xA163: 0xFE37, //PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+ 0xA164: 0xFE38, //PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+ 0xA165: 0x3014, //LEFT TORTOISE SHELL BRACKET
+ 0xA166: 0x3015, //RIGHT TORTOISE SHELL BRACKET
+ 0xA167: 0xFE39, //PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+ 0xA168: 0xFE3A, //PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+ 0xA169: 0x3010, //LEFT BLACK LENTICULAR BRACKET
+ 0xA16A: 0x3011, //RIGHT BLACK LENTICULAR BRACKET
+ 0xA16B: 0xFE3B, //PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+ 0xA16C: 0xFE3C, //PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+ 0xA16D: 0x300A, //LEFT DOUBLE ANGLE BRACKET
+ 0xA16E: 0x300B, //RIGHT DOUBLE ANGLE BRACKET
+ 0xA16F: 0xFE3D, //PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+ 0xA170: 0xFE3E, //PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+ 0xA171: 0x3008, //LEFT ANGLE BRACKET
+ 0xA172: 0x3009, //RIGHT ANGLE BRACKET
+ 0xA173: 0xFE3F, //PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+ 0xA174: 0xFE40, //PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+ 0xA175: 0x300C, //LEFT CORNER BRACKET
+ 0xA176: 0x300D, //RIGHT CORNER BRACKET
+ 0xA177: 0xFE41, //PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+ 0xA178: 0xFE42, //PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+ 0xA179: 0x300E, //LEFT WHITE CORNER BRACKET
+ 0xA17A: 0x300F, //RIGHT WHITE CORNER BRACKET
+ 0xA17B: 0xFE43, //PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+ 0xA17C: 0xFE44, //PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+ 0xA17D: 0xFE59, //SMALL LEFT PARENTHESIS
+ 0xA17E: 0xFE5A, //SMALL RIGHT PARENTHESIS
+ 0xA1A1: 0xFE5B, //SMALL LEFT CURLY BRACKET
+ 0xA1A2: 0xFE5C, //SMALL RIGHT CURLY BRACKET
+ 0xA1A3: 0xFE5D, //SMALL LEFT TORTOISE SHELL BRACKET
+ 0xA1A4: 0xFE5E, //SMALL RIGHT TORTOISE SHELL BRACKET
+ 0xA1A5: 0x2018, //LEFT SINGLE QUOTATION MARK
+ 0xA1A6: 0x2019, //RIGHT SINGLE QUOTATION MARK
+ 0xA1A7: 0x201C, //LEFT DOUBLE QUOTATION MARK
+ 0xA1A8: 0x201D, //RIGHT DOUBLE QUOTATION MARK
+ 0xA1A9: 0x301D, //REVERSED DOUBLE PRIME QUOTATION MARK
+ 0xA1AA: 0x301E, //DOUBLE PRIME QUOTATION MARK
+ 0xA1AB: 0x2035, //REVERSED PRIME
+ 0xA1AC: 0x2032, //PRIME
+ 0xA1AD: 0xFF03, //FULLWIDTH NUMBER SIGN
+ 0xA1AE: 0xFF06, //FULLWIDTH AMPERSAND
+ 0xA1AF: 0xFF0A, //FULLWIDTH ASTERISK
+ 0xA1B0: 0x203B, //REFERENCE MARK
+ 0xA1B1: 0x00A7, //SECTION SIGN
+ 0xA1B2: 0x3003, //DITTO MARK
+ 0xA1B3: 0x25CB, //WHITE CIRCLE
+ 0xA1B4: 0x25CF, //BLACK CIRCLE
+ 0xA1B5: 0x25B3, //WHITE UP-POINTING TRIANGLE
+ 0xA1B6: 0x25B2, //BLACK UP-POINTING TRIANGLE
+ 0xA1B7: 0x25CE, //BULLSEYE
+ 0xA1B8: 0x2606, //WHITE STAR
+ 0xA1B9: 0x2605, //BLACK STAR
+ 0xA1BA: 0x25C7, //WHITE DIAMOND
+ 0xA1BB: 0x25C6, //BLACK DIAMOND
+ 0xA1BC: 0x25A1, //WHITE SQUARE
+ 0xA1BD: 0x25A0, //BLACK SQUARE
+ 0xA1BE: 0x25BD, //WHITE DOWN-POINTING TRIANGLE
+ 0xA1BF: 0x25BC, //BLACK DOWN-POINTING TRIANGLE
+ 0xA1C0: 0x32A3, //CIRCLED IDEOGRAPH CORRECT
+ 0xA1C1: 0x2105, //CARE OF
+ 0xA1C2: 0x00AF, //MACRON
+ 0xA1C3: 0xFFE3, //FULLWIDTH MACRON
+ 0xA1C4: 0xFF3F, //FULLWIDTH LOW LINE
+ 0xA1C5: 0x02CD, //MODIFIER LETTER LOW MACRON
+ 0xA1C6: 0xFE49, //DASHED OVERLINE
+ 0xA1C7: 0xFE4A, //CENTRELINE OVERLINE
+ 0xA1C8: 0xFE4D, //DASHED LOW LINE
+ 0xA1C9: 0xFE4E, //CENTRELINE LOW LINE
+ 0xA1CA: 0xFE4B, //WAVY OVERLINE
+ 0xA1CB: 0xFE4C, //DOUBLE WAVY OVERLINE
+ 0xA1CC: 0xFE5F, //SMALL NUMBER SIGN
+ 0xA1CD: 0xFE60, //SMALL AMPERSAND
+ 0xA1CE: 0xFE61, //SMALL ASTERISK
+ 0xA1CF: 0xFF0B, //FULLWIDTH PLUS SIGN
+ 0xA1D0: 0xFF0D, //FULLWIDTH HYPHEN-MINUS
+ 0xA1D1: 0x00D7, //MULTIPLICATION SIGN
+ 0xA1D2: 0x00F7, //DIVISION SIGN
+ 0xA1D3: 0x00B1, //PLUS-MINUS SIGN
+ 0xA1D4: 0x221A, //SQUARE ROOT
+ 0xA1D5: 0xFF1C, //FULLWIDTH LESS-THAN SIGN
+ 0xA1D6: 0xFF1E, //FULLWIDTH GREATER-THAN SIGN
+ 0xA1D7: 0xFF1D, //FULLWIDTH EQUALS SIGN
+ 0xA1D8: 0x2266, //LESS-THAN OVER EQUAL TO
+ 0xA1D9: 0x2267, //GREATER-THAN OVER EQUAL TO
+ 0xA1DA: 0x2260, //NOT EQUAL TO
+ 0xA1DB: 0x221E, //INFINITY
+ 0xA1DC: 0x2252, //APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ 0xA1DD: 0x2261, //IDENTICAL TO
+ 0xA1DE: 0xFE62, //SMALL PLUS SIGN
+ 0xA1DF: 0xFE63, //SMALL HYPHEN-MINUS
+ 0xA1E0: 0xFE64, //SMALL LESS-THAN SIGN
+ 0xA1E1: 0xFE65, //SMALL GREATER-THAN SIGN
+ 0xA1E2: 0xFE66, //SMALL EQUALS SIGN
+ 0xA1E3: 0xFF5E, //FULLWIDTH TILDE
+ 0xA1E4: 0x2229, //INTERSECTION
+ 0xA1E5: 0x222A, //UNION
+ 0xA1E6: 0x22A5, //UP TACK
+ 0xA1E7: 0x2220, //ANGLE
+ 0xA1E8: 0x221F, //RIGHT ANGLE
+ 0xA1E9: 0x22BF, //RIGHT TRIANGLE
+ 0xA1EA: 0x33D2, //SQUARE LOG
+ 0xA1EB: 0x33D1, //SQUARE LN
+ 0xA1EC: 0x222B, //INTEGRAL
+ 0xA1ED: 0x222E, //CONTOUR INTEGRAL
+ 0xA1EE: 0x2235, //BECAUSE
+ 0xA1EF: 0x2234, //THEREFORE
+ 0xA1F0: 0x2640, //FEMALE SIGN
+ 0xA1F1: 0x2642, //MALE SIGN
+ 0xA1F2: 0x2295, //CIRCLED PLUS
+ 0xA1F3: 0x2299, //CIRCLED DOT OPERATOR
+ 0xA1F4: 0x2191, //UPWARDS ARROW
+ 0xA1F5: 0x2193, //DOWNWARDS ARROW
+ 0xA1F6: 0x2190, //LEFTWARDS ARROW
+ 0xA1F7: 0x2192, //RIGHTWARDS ARROW
+ 0xA1F8: 0x2196, //NORTH WEST ARROW
+ 0xA1F9: 0x2197, //NORTH EAST ARROW
+ 0xA1FA: 0x2199, //SOUTH WEST ARROW
+ 0xA1FB: 0x2198, //SOUTH EAST ARROW
+ 0xA1FC: 0x2225, //PARALLEL TO
+ 0xA1FD: 0x2223, //DIVIDES
+ 0xA1FE: 0xFF0F, //FULLWIDTH SOLIDUS
+ 0xA240: 0xFF3C, //FULLWIDTH REVERSE SOLIDUS
+ 0xA241: 0x2215, //DIVISION SLASH
+ 0xA242: 0xFE68, //SMALL REVERSE SOLIDUS
+ 0xA243: 0xFF04, //FULLWIDTH DOLLAR SIGN
+ 0xA244: 0xFFE5, //FULLWIDTH YEN SIGN
+ 0xA245: 0x3012, //POSTAL MARK
+ 0xA246: 0xFFE0, //FULLWIDTH CENT SIGN
+ 0xA247: 0xFFE1, //FULLWIDTH POUND SIGN
+ 0xA248: 0xFF05, //FULLWIDTH PERCENT SIGN
+ 0xA249: 0xFF20, //FULLWIDTH COMMERCIAL AT
+ 0xA24A: 0x2103, //DEGREE CELSIUS
+ 0xA24B: 0x2109, //DEGREE FAHRENHEIT
+ 0xA24C: 0xFE69, //SMALL DOLLAR SIGN
+ 0xA24D: 0xFE6A, //SMALL PERCENT SIGN
+ 0xA24E: 0xFE6B, //SMALL COMMERCIAL AT
+ 0xA24F: 0x33D5, //SQUARE MIL
+ 0xA250: 0x339C, //SQUARE MM
+ 0xA251: 0x339D, //SQUARE CM
+ 0xA252: 0x339E, //SQUARE KM
+ 0xA253: 0x33CE, //SQUARE KM CAPITAL
+ 0xA254: 0x33A1, //SQUARE M SQUARED
+ 0xA255: 0x338E, //SQUARE MG
+ 0xA256: 0x338F, //SQUARE KG
+ 0xA257: 0x33C4, //SQUARE CC
+ 0xA258: 0x00B0, //DEGREE SIGN
+ 0xA259: 0x5159, //CJK UNIFIED IDEOGRAPH
+ 0xA25A: 0x515B, //CJK UNIFIED IDEOGRAPH
+ 0xA25B: 0x515E, //CJK UNIFIED IDEOGRAPH
+ 0xA25C: 0x515D, //CJK UNIFIED IDEOGRAPH
+ 0xA25D: 0x5161, //CJK UNIFIED IDEOGRAPH
+ 0xA25E: 0x5163, //CJK UNIFIED IDEOGRAPH
+ 0xA25F: 0x55E7, //CJK UNIFIED IDEOGRAPH
+ 0xA260: 0x74E9, //CJK UNIFIED IDEOGRAPH
+ 0xA261: 0x7CCE, //CJK UNIFIED IDEOGRAPH
+ 0xA262: 0x2581, //LOWER ONE EIGHTH BLOCK
+ 0xA263: 0x2582, //LOWER ONE QUARTER BLOCK
+ 0xA264: 0x2583, //LOWER THREE EIGHTHS BLOCK
+ 0xA265: 0x2584, //LOWER HALF BLOCK
+ 0xA266: 0x2585, //LOWER FIVE EIGHTHS BLOCK
+ 0xA267: 0x2586, //LOWER THREE QUARTERS BLOCK
+ 0xA268: 0x2587, //LOWER SEVEN EIGHTHS BLOCK
+ 0xA269: 0x2588, //FULL BLOCK
+ 0xA26A: 0x258F, //LEFT ONE EIGHTH BLOCK
+ 0xA26B: 0x258E, //LEFT ONE QUARTER BLOCK
+ 0xA26C: 0x258D, //LEFT THREE EIGHTHS BLOCK
+ 0xA26D: 0x258C, //LEFT HALF BLOCK
+ 0xA26E: 0x258B, //LEFT FIVE EIGHTHS BLOCK
+ 0xA26F: 0x258A, //LEFT THREE QUARTERS BLOCK
+ 0xA270: 0x2589, //LEFT SEVEN EIGHTHS BLOCK
+ 0xA271: 0x253C, //BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ 0xA272: 0x2534, //BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ 0xA273: 0x252C, //BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ 0xA274: 0x2524, //BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ 0xA275: 0x251C, //BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ 0xA276: 0x2594, //UPPER ONE EIGHTH BLOCK
+ 0xA277: 0x2500, //BOX DRAWINGS LIGHT HORIZONTAL
+ 0xA278: 0x2502, //BOX DRAWINGS LIGHT VERTICAL
+ 0xA279: 0x2595, //RIGHT ONE EIGHTH BLOCK
+ 0xA27A: 0x250C, //BOX DRAWINGS LIGHT DOWN AND RIGHT
+ 0xA27B: 0x2510, //BOX DRAWINGS LIGHT DOWN AND LEFT
+ 0xA27C: 0x2514, //BOX DRAWINGS LIGHT UP AND RIGHT
+ 0xA27D: 0x2518, //BOX DRAWINGS LIGHT UP AND LEFT
+ 0xA27E: 0x256D, //BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+ 0xA2A1: 0x256E, //BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+ 0xA2A2: 0x2570, //BOX DRAWINGS LIGHT ARC UP AND RIGHT
+ 0xA2A3: 0x256F, //BOX DRAWINGS LIGHT ARC UP AND LEFT
+ 0xA2A4: 0x2550, //BOX DRAWINGS DOUBLE HORIZONTAL
+ 0xA2A5: 0x255E, //BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ 0xA2A6: 0x256A, //BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ 0xA2A7: 0x2561, //BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ 0xA2A8: 0x25E2, //BLACK LOWER RIGHT TRIANGLE
+ 0xA2A9: 0x25E3, //BLACK LOWER LEFT TRIANGLE
+ 0xA2AA: 0x25E5, //BLACK UPPER RIGHT TRIANGLE
+ 0xA2AB: 0x25E4, //BLACK UPPER LEFT TRIANGLE
+ 0xA2AC: 0x2571, //BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+ 0xA2AD: 0x2572, //BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+ 0xA2AE: 0x2573, //BOX DRAWINGS LIGHT DIAGONAL CROSS
+ 0xA2AF: 0xFF10, //FULLWIDTH DIGIT ZERO
+ 0xA2B0: 0xFF11, //FULLWIDTH DIGIT ONE
+ 0xA2B1: 0xFF12, //FULLWIDTH DIGIT TWO
+ 0xA2B2: 0xFF13, //FULLWIDTH DIGIT THREE
+ 0xA2B3: 0xFF14, //FULLWIDTH DIGIT FOUR
+ 0xA2B4: 0xFF15, //FULLWIDTH DIGIT FIVE
+ 0xA2B5: 0xFF16, //FULLWIDTH DIGIT SIX
+ 0xA2B6: 0xFF17, //FULLWIDTH DIGIT SEVEN
+ 0xA2B7: 0xFF18, //FULLWIDTH DIGIT EIGHT
+ 0xA2B8: 0xFF19, //FULLWIDTH DIGIT NINE
+ 0xA2B9: 0x2160, //ROMAN NUMERAL ONE
+ 0xA2BA: 0x2161, //ROMAN NUMERAL TWO
+ 0xA2BB: 0x2162, //ROMAN NUMERAL THREE
+ 0xA2BC: 0x2163, //ROMAN NUMERAL FOUR
+ 0xA2BD: 0x2164, //ROMAN NUMERAL FIVE
+ 0xA2BE: 0x2165, //ROMAN NUMERAL SIX
+ 0xA2BF: 0x2166, //ROMAN NUMERAL SEVEN
+ 0xA2C0: 0x2167, //ROMAN NUMERAL EIGHT
+ 0xA2C1: 0x2168, //ROMAN NUMERAL NINE
+ 0xA2C2: 0x2169, //ROMAN NUMERAL TEN
+ 0xA2C3: 0x3021, //HANGZHOU NUMERAL ONE
+ 0xA2C4: 0x3022, //HANGZHOU NUMERAL TWO
+ 0xA2C5: 0x3023, //HANGZHOU NUMERAL THREE
+ 0xA2C6: 0x3024, //HANGZHOU NUMERAL FOUR
+ 0xA2C7: 0x3025, //HANGZHOU NUMERAL FIVE
+ 0xA2C8: 0x3026, //HANGZHOU NUMERAL SIX
+ 0xA2C9: 0x3027, //HANGZHOU NUMERAL SEVEN
+ 0xA2CA: 0x3028, //HANGZHOU NUMERAL EIGHT
+ 0xA2CB: 0x3029, //HANGZHOU NUMERAL NINE
+ 0xA2CC: 0x5341, //CJK UNIFIED IDEOGRAPH
+ 0xA2CD: 0x5344, //CJK UNIFIED IDEOGRAPH
+ 0xA2CE: 0x5345, //CJK UNIFIED IDEOGRAPH
+ 0xA2CF: 0xFF21, //FULLWIDTH LATIN CAPITAL LETTER A
+ 0xA2D0: 0xFF22, //FULLWIDTH LATIN CAPITAL LETTER B
+ 0xA2D1: 0xFF23, //FULLWIDTH LATIN CAPITAL LETTER C
+ 0xA2D2: 0xFF24, //FULLWIDTH LATIN CAPITAL LETTER D
+ 0xA2D3: 0xFF25, //FULLWIDTH LATIN CAPITAL LETTER E
+ 0xA2D4: 0xFF26, //FULLWIDTH LATIN CAPITAL LETTER F
+ 0xA2D5: 0xFF27, //FULLWIDTH LATIN CAPITAL LETTER G
+ 0xA2D6: 0xFF28, //FULLWIDTH LATIN CAPITAL LETTER H
+ 0xA2D7: 0xFF29, //FULLWIDTH LATIN CAPITAL LETTER I
+ 0xA2D8: 0xFF2A, //FULLWIDTH LATIN CAPITAL LETTER J
+ 0xA2D9: 0xFF2B, //FULLWIDTH LATIN CAPITAL LETTER K
+ 0xA2DA: 0xFF2C, //FULLWIDTH LATIN CAPITAL LETTER L
+ 0xA2DB: 0xFF2D, //FULLWIDTH LATIN CAPITAL LETTER M
+ 0xA2DC: 0xFF2E, //FULLWIDTH LATIN CAPITAL LETTER N
+ 0xA2DD: 0xFF2F, //FULLWIDTH LATIN CAPITAL LETTER O
+ 0xA2DE: 0xFF30, //FULLWIDTH LATIN CAPITAL LETTER P
+ 0xA2DF: 0xFF31, //FULLWIDTH LATIN CAPITAL LETTER Q
+ 0xA2E0: 0xFF32, //FULLWIDTH LATIN CAPITAL LETTER R
+ 0xA2E1: 0xFF33, //FULLWIDTH LATIN CAPITAL LETTER S
+ 0xA2E2: 0xFF34, //FULLWIDTH LATIN CAPITAL LETTER T
+ 0xA2E3: 0xFF35, //FULLWIDTH LATIN CAPITAL LETTER U
+ 0xA2E4: 0xFF36, //FULLWIDTH LATIN CAPITAL LETTER V
+ 0xA2E5: 0xFF37, //FULLWIDTH LATIN CAPITAL LETTER W
+ 0xA2E6: 0xFF38, //FULLWIDTH LATIN CAPITAL LETTER X
+ 0xA2E7: 0xFF39, //FULLWIDTH LATIN CAPITAL LETTER Y
+ 0xA2E8: 0xFF3A, //FULLWIDTH LATIN CAPITAL LETTER Z
+ 0xA2E9: 0xFF41, //FULLWIDTH LATIN SMALL LETTER A
+ 0xA2EA: 0xFF42, //FULLWIDTH LATIN SMALL LETTER B
+ 0xA2EB: 0xFF43, //FULLWIDTH LATIN SMALL LETTER C
+ 0xA2EC: 0xFF44, //FULLWIDTH LATIN SMALL LETTER D
+ 0xA2ED: 0xFF45, //FULLWIDTH LATIN SMALL LETTER E
+ 0xA2EE: 0xFF46, //FULLWIDTH LATIN SMALL LETTER F
+ 0xA2EF: 0xFF47, //FULLWIDTH LATIN SMALL LETTER G
+ 0xA2F0: 0xFF48, //FULLWIDTH LATIN SMALL LETTER H
+ 0xA2F1: 0xFF49, //FULLWIDTH LATIN SMALL LETTER I
+ 0xA2F2: 0xFF4A, //FULLWIDTH LATIN SMALL LETTER J
+ 0xA2F3: 0xFF4B, //FULLWIDTH LATIN SMALL LETTER K
+ 0xA2F4: 0xFF4C, //FULLWIDTH LATIN SMALL LETTER L
+ 0xA2F5: 0xFF4D, //FULLWIDTH LATIN SMALL LETTER M
+ 0xA2F6: 0xFF4E, //FULLWIDTH LATIN SMALL LETTER N
+ 0xA2F7: 0xFF4F, //FULLWIDTH LATIN SMALL LETTER O
+ 0xA2F8: 0xFF50, //FULLWIDTH LATIN SMALL LETTER P
+ 0xA2F9: 0xFF51, //FULLWIDTH LATIN SMALL LETTER Q
+ 0xA2FA: 0xFF52, //FULLWIDTH LATIN SMALL LETTER R
+ 0xA2FB: 0xFF53, //FULLWIDTH LATIN SMALL LETTER S
+ 0xA2FC: 0xFF54, //FULLWIDTH LATIN SMALL LETTER T
+ 0xA2FD: 0xFF55, //FULLWIDTH LATIN SMALL LETTER U
+ 0xA2FE: 0xFF56, //FULLWIDTH LATIN SMALL LETTER V
+ 0xA340: 0xFF57, //FULLWIDTH LATIN SMALL LETTER W
+ 0xA341: 0xFF58, //FULLWIDTH LATIN SMALL LETTER X
+ 0xA342: 0xFF59, //FULLWIDTH LATIN SMALL LETTER Y
+ 0xA343: 0xFF5A, //FULLWIDTH LATIN SMALL LETTER Z
+ 0xA344: 0x0391, //GREEK CAPITAL LETTER ALPHA
+ 0xA345: 0x0392, //GREEK CAPITAL LETTER BETA
+ 0xA346: 0x0393, //GREEK CAPITAL LETTER GAMMA
+ 0xA347: 0x0394, //GREEK CAPITAL LETTER DELTA
+ 0xA348: 0x0395, //GREEK CAPITAL LETTER EPSILON
+ 0xA349: 0x0396, //GREEK CAPITAL LETTER ZETA
+ 0xA34A: 0x0397, //GREEK CAPITAL LETTER ETA
+ 0xA34B: 0x0398, //GREEK CAPITAL LETTER THETA
+ 0xA34C: 0x0399, //GREEK CAPITAL LETTER IOTA
+ 0xA34D: 0x039A, //GREEK CAPITAL LETTER KAPPA
+ 0xA34E: 0x039B, //GREEK CAPITAL LETTER LAMDA
+ 0xA34F: 0x039C, //GREEK CAPITAL LETTER MU
+ 0xA350: 0x039D, //GREEK CAPITAL LETTER NU
+ 0xA351: 0x039E, //GREEK CAPITAL LETTER XI
+ 0xA352: 0x039F, //GREEK CAPITAL LETTER OMICRON
+ 0xA353: 0x03A0, //GREEK CAPITAL LETTER PI
+ 0xA354: 0x03A1, //GREEK CAPITAL LETTER RHO
+ 0xA355: 0x03A3, //GREEK CAPITAL LETTER SIGMA
+ 0xA356: 0x03A4, //GREEK CAPITAL LETTER TAU
+ 0xA357: 0x03A5, //GREEK CAPITAL LETTER UPSILON
+ 0xA358: 0x03A6, //GREEK CAPITAL LETTER PHI
+ 0xA359: 0x03A7, //GREEK CAPITAL LETTER CHI
+ 0xA35A: 0x03A8, //GREEK CAPITAL LETTER PSI
+ 0xA35B: 0x03A9, //GREEK CAPITAL LETTER OMEGA
+ 0xA35C: 0x03B1, //GREEK SMALL LETTER ALPHA
+ 0xA35D: 0x03B2, //GREEK SMALL LETTER BETA
+ 0xA35E: 0x03B3, //GREEK SMALL LETTER GAMMA
+ 0xA35F: 0x03B4, //GREEK SMALL LETTER DELTA
+ 0xA360: 0x03B5, //GREEK SMALL LETTER EPSILON
+ 0xA361: 0x03B6, //GREEK SMALL LETTER ZETA
+ 0xA362: 0x03B7, //GREEK SMALL LETTER ETA
+ 0xA363: 0x03B8, //GREEK SMALL LETTER THETA
+ 0xA364: 0x03B9, //GREEK SMALL LETTER IOTA
+ 0xA365: 0x03BA, //GREEK SMALL LETTER KAPPA
+ 0xA366: 0x03BB, //GREEK SMALL LETTER LAMDA
+ 0xA367: 0x03BC, //GREEK SMALL LETTER MU
+ 0xA368: 0x03BD, //GREEK SMALL LETTER NU
+ 0xA369: 0x03BE, //GREEK SMALL LETTER XI
+ 0xA36A: 0x03BF, //GREEK SMALL LETTER OMICRON
+ 0xA36B: 0x03C0, //GREEK SMALL LETTER PI
+ 0xA36C: 0x03C1, //GREEK SMALL LETTER RHO
+ 0xA36D: 0x03C3, //GREEK SMALL LETTER SIGMA
+ 0xA36E: 0x03C4, //GREEK SMALL LETTER TAU
+ 0xA36F: 0x03C5, //GREEK SMALL LETTER UPSILON
+ 0xA370: 0x03C6, //GREEK SMALL LETTER PHI
+ 0xA371: 0x03C7, //GREEK SMALL LETTER CHI
+ 0xA372: 0x03C8, //GREEK SMALL LETTER PSI
+ 0xA373: 0x03C9, //GREEK SMALL LETTER OMEGA
+ 0xA374: 0x3105, //BOPOMOFO LETTER B
+ 0xA375: 0x3106, //BOPOMOFO LETTER P
+ 0xA376: 0x3107, //BOPOMOFO LETTER M
+ 0xA377: 0x3108, //BOPOMOFO LETTER F
+ 0xA378: 0x3109, //BOPOMOFO LETTER D
+ 0xA379: 0x310A, //BOPOMOFO LETTER T
+ 0xA37A: 0x310B, //BOPOMOFO LETTER N
+ 0xA37B: 0x310C, //BOPOMOFO LETTER L
+ 0xA37C: 0x310D, //BOPOMOFO LETTER G
+ 0xA37D: 0x310E, //BOPOMOFO LETTER K
+ 0xA37E: 0x310F, //BOPOMOFO LETTER H
+ 0xA3A1: 0x3110, //BOPOMOFO LETTER J
+ 0xA3A2: 0x3111, //BOPOMOFO LETTER Q
+ 0xA3A3: 0x3112, //BOPOMOFO LETTER X
+ 0xA3A4: 0x3113, //BOPOMOFO LETTER ZH
+ 0xA3A5: 0x3114, //BOPOMOFO LETTER CH
+ 0xA3A6: 0x3115, //BOPOMOFO LETTER SH
+ 0xA3A7: 0x3116, //BOPOMOFO LETTER R
+ 0xA3A8: 0x3117, //BOPOMOFO LETTER Z
+ 0xA3A9: 0x3118, //BOPOMOFO LETTER C
+ 0xA3AA: 0x3119, //BOPOMOFO LETTER S
+ 0xA3AB: 0x311A, //BOPOMOFO LETTER A
+ 0xA3AC: 0x311B, //BOPOMOFO LETTER O
+ 0xA3AD: 0x311C, //BOPOMOFO LETTER E
+ 0xA3AE: 0x311D, //BOPOMOFO LETTER EH
+ 0xA3AF: 0x311E, //BOPOMOFO LETTER AI
+ 0xA3B0: 0x311F, //BOPOMOFO LETTER EI
+ 0xA3B1: 0x3120, //BOPOMOFO LETTER AU
+ 0xA3B2: 0x3121, //BOPOMOFO LETTER OU
+ 0xA3B3: 0x3122, //BOPOMOFO LETTER AN
+ 0xA3B4: 0x3123, //BOPOMOFO LETTER EN
+ 0xA3B5: 0x3124, //BOPOMOFO LETTER ANG
+ 0xA3B6: 0x3125, //BOPOMOFO LETTER ENG
+ 0xA3B7: 0x3126, //BOPOMOFO LETTER ER
+ 0xA3B8: 0x3127, //BOPOMOFO LETTER I
+ 0xA3B9: 0x3128, //BOPOMOFO LETTER U
+ 0xA3BA: 0x3129, //BOPOMOFO LETTER IU
+ 0xA3BB: 0x02D9, //DOT ABOVE
+ 0xA3BC: 0x02C9, //MODIFIER LETTER MACRON
+ 0xA3BD: 0x02CA, //MODIFIER LETTER ACUTE ACCENT
+ 0xA3BE: 0x02C7, //CARON
+ 0xA3BF: 0x02CB, //MODIFIER LETTER GRAVE ACCENT
+ 0xA3E1: 0x20AC, //EURO SIGN
+ 0xA440: 0x4E00, //CJK UNIFIED IDEOGRAPH
+ 0xA441: 0x4E59, //CJK UNIFIED IDEOGRAPH
+ 0xA442: 0x4E01, //CJK UNIFIED IDEOGRAPH
+ 0xA443: 0x4E03, //CJK UNIFIED IDEOGRAPH
+ 0xA444: 0x4E43, //CJK UNIFIED IDEOGRAPH
+ 0xA445: 0x4E5D, //CJK UNIFIED IDEOGRAPH
+ 0xA446: 0x4E86, //CJK UNIFIED IDEOGRAPH
+ 0xA447: 0x4E8C, //CJK UNIFIED IDEOGRAPH
+ 0xA448: 0x4EBA, //CJK UNIFIED IDEOGRAPH
+ 0xA449: 0x513F, //CJK UNIFIED IDEOGRAPH
+ 0xA44A: 0x5165, //CJK UNIFIED IDEOGRAPH
+ 0xA44B: 0x516B, //CJK UNIFIED IDEOGRAPH
+ 0xA44C: 0x51E0, //CJK UNIFIED IDEOGRAPH
+ 0xA44D: 0x5200, //CJK UNIFIED IDEOGRAPH
+ 0xA44E: 0x5201, //CJK UNIFIED IDEOGRAPH
+ 0xA44F: 0x529B, //CJK UNIFIED IDEOGRAPH
+ 0xA450: 0x5315, //CJK UNIFIED IDEOGRAPH
+ 0xA451: 0x5341, //CJK UNIFIED IDEOGRAPH
+ 0xA452: 0x535C, //CJK UNIFIED IDEOGRAPH
+ 0xA453: 0x53C8, //CJK UNIFIED IDEOGRAPH
+ 0xA454: 0x4E09, //CJK UNIFIED IDEOGRAPH
+ 0xA455: 0x4E0B, //CJK UNIFIED IDEOGRAPH
+ 0xA456: 0x4E08, //CJK UNIFIED IDEOGRAPH
+ 0xA457: 0x4E0A, //CJK UNIFIED IDEOGRAPH
+ 0xA458: 0x4E2B, //CJK UNIFIED IDEOGRAPH
+ 0xA459: 0x4E38, //CJK UNIFIED IDEOGRAPH
+ 0xA45A: 0x51E1, //CJK UNIFIED IDEOGRAPH
+ 0xA45B: 0x4E45, //CJK UNIFIED IDEOGRAPH
+ 0xA45C: 0x4E48, //CJK UNIFIED IDEOGRAPH
+ 0xA45D: 0x4E5F, //CJK UNIFIED IDEOGRAPH
+ 0xA45E: 0x4E5E, //CJK UNIFIED IDEOGRAPH
+ 0xA45F: 0x4E8E, //CJK UNIFIED IDEOGRAPH
+ 0xA460: 0x4EA1, //CJK UNIFIED IDEOGRAPH
+ 0xA461: 0x5140, //CJK UNIFIED IDEOGRAPH
+ 0xA462: 0x5203, //CJK UNIFIED IDEOGRAPH
+ 0xA463: 0x52FA, //CJK UNIFIED IDEOGRAPH
+ 0xA464: 0x5343, //CJK UNIFIED IDEOGRAPH
+ 0xA465: 0x53C9, //CJK UNIFIED IDEOGRAPH
+ 0xA466: 0x53E3, //CJK UNIFIED IDEOGRAPH
+ 0xA467: 0x571F, //CJK UNIFIED IDEOGRAPH
+ 0xA468: 0x58EB, //CJK UNIFIED IDEOGRAPH
+ 0xA469: 0x5915, //CJK UNIFIED IDEOGRAPH
+ 0xA46A: 0x5927, //CJK UNIFIED IDEOGRAPH
+ 0xA46B: 0x5973, //CJK UNIFIED IDEOGRAPH
+ 0xA46C: 0x5B50, //CJK UNIFIED IDEOGRAPH
+ 0xA46D: 0x5B51, //CJK UNIFIED IDEOGRAPH
+ 0xA46E: 0x5B53, //CJK UNIFIED IDEOGRAPH
+ 0xA46F: 0x5BF8, //CJK UNIFIED IDEOGRAPH
+ 0xA470: 0x5C0F, //CJK UNIFIED IDEOGRAPH
+ 0xA471: 0x5C22, //CJK UNIFIED IDEOGRAPH
+ 0xA472: 0x5C38, //CJK UNIFIED IDEOGRAPH
+ 0xA473: 0x5C71, //CJK UNIFIED IDEOGRAPH
+ 0xA474: 0x5DDD, //CJK UNIFIED IDEOGRAPH
+ 0xA475: 0x5DE5, //CJK UNIFIED IDEOGRAPH
+ 0xA476: 0x5DF1, //CJK UNIFIED IDEOGRAPH
+ 0xA477: 0x5DF2, //CJK UNIFIED IDEOGRAPH
+ 0xA478: 0x5DF3, //CJK UNIFIED IDEOGRAPH
+ 0xA479: 0x5DFE, //CJK UNIFIED IDEOGRAPH
+ 0xA47A: 0x5E72, //CJK UNIFIED IDEOGRAPH
+ 0xA47B: 0x5EFE, //CJK UNIFIED IDEOGRAPH
+ 0xA47C: 0x5F0B, //CJK UNIFIED IDEOGRAPH
+ 0xA47D: 0x5F13, //CJK UNIFIED IDEOGRAPH
+ 0xA47E: 0x624D, //CJK UNIFIED IDEOGRAPH
+ 0xA4A1: 0x4E11, //CJK UNIFIED IDEOGRAPH
+ 0xA4A2: 0x4E10, //CJK UNIFIED IDEOGRAPH
+ 0xA4A3: 0x4E0D, //CJK UNIFIED IDEOGRAPH
+ 0xA4A4: 0x4E2D, //CJK UNIFIED IDEOGRAPH
+ 0xA4A5: 0x4E30, //CJK UNIFIED IDEOGRAPH
+ 0xA4A6: 0x4E39, //CJK UNIFIED IDEOGRAPH
+ 0xA4A7: 0x4E4B, //CJK UNIFIED IDEOGRAPH
+ 0xA4A8: 0x5C39, //CJK UNIFIED IDEOGRAPH
+ 0xA4A9: 0x4E88, //CJK UNIFIED IDEOGRAPH
+ 0xA4AA: 0x4E91, //CJK UNIFIED IDEOGRAPH
+ 0xA4AB: 0x4E95, //CJK UNIFIED IDEOGRAPH
+ 0xA4AC: 0x4E92, //CJK UNIFIED IDEOGRAPH
+ 0xA4AD: 0x4E94, //CJK UNIFIED IDEOGRAPH
+ 0xA4AE: 0x4EA2, //CJK UNIFIED IDEOGRAPH
+ 0xA4AF: 0x4EC1, //CJK UNIFIED IDEOGRAPH
+ 0xA4B0: 0x4EC0, //CJK UNIFIED IDEOGRAPH
+ 0xA4B1: 0x4EC3, //CJK UNIFIED IDEOGRAPH
+ 0xA4B2: 0x4EC6, //CJK UNIFIED IDEOGRAPH
+ 0xA4B3: 0x4EC7, //CJK UNIFIED IDEOGRAPH
+ 0xA4B4: 0x4ECD, //CJK UNIFIED IDEOGRAPH
+ 0xA4B5: 0x4ECA, //CJK UNIFIED IDEOGRAPH
+ 0xA4B6: 0x4ECB, //CJK UNIFIED IDEOGRAPH
+ 0xA4B7: 0x4EC4, //CJK UNIFIED IDEOGRAPH
+ 0xA4B8: 0x5143, //CJK UNIFIED IDEOGRAPH
+ 0xA4B9: 0x5141, //CJK UNIFIED IDEOGRAPH
+ 0xA4BA: 0x5167, //CJK UNIFIED IDEOGRAPH
+ 0xA4BB: 0x516D, //CJK UNIFIED IDEOGRAPH
+ 0xA4BC: 0x516E, //CJK UNIFIED IDEOGRAPH
+ 0xA4BD: 0x516C, //CJK UNIFIED IDEOGRAPH
+ 0xA4BE: 0x5197, //CJK UNIFIED IDEOGRAPH
+ 0xA4BF: 0x51F6, //CJK UNIFIED IDEOGRAPH
+ 0xA4C0: 0x5206, //CJK UNIFIED IDEOGRAPH
+ 0xA4C1: 0x5207, //CJK UNIFIED IDEOGRAPH
+ 0xA4C2: 0x5208, //CJK UNIFIED IDEOGRAPH
+ 0xA4C3: 0x52FB, //CJK UNIFIED IDEOGRAPH
+ 0xA4C4: 0x52FE, //CJK UNIFIED IDEOGRAPH
+ 0xA4C5: 0x52FF, //CJK UNIFIED IDEOGRAPH
+ 0xA4C6: 0x5316, //CJK UNIFIED IDEOGRAPH
+ 0xA4C7: 0x5339, //CJK UNIFIED IDEOGRAPH
+ 0xA4C8: 0x5348, //CJK UNIFIED IDEOGRAPH
+ 0xA4C9: 0x5347, //CJK UNIFIED IDEOGRAPH
+ 0xA4CA: 0x5345, //CJK UNIFIED IDEOGRAPH
+ 0xA4CB: 0x535E, //CJK UNIFIED IDEOGRAPH
+ 0xA4CC: 0x5384, //CJK UNIFIED IDEOGRAPH
+ 0xA4CD: 0x53CB, //CJK UNIFIED IDEOGRAPH
+ 0xA4CE: 0x53CA, //CJK UNIFIED IDEOGRAPH
+ 0xA4CF: 0x53CD, //CJK UNIFIED IDEOGRAPH
+ 0xA4D0: 0x58EC, //CJK UNIFIED IDEOGRAPH
+ 0xA4D1: 0x5929, //CJK UNIFIED IDEOGRAPH
+ 0xA4D2: 0x592B, //CJK UNIFIED IDEOGRAPH
+ 0xA4D3: 0x592A, //CJK UNIFIED IDEOGRAPH
+ 0xA4D4: 0x592D, //CJK UNIFIED IDEOGRAPH
+ 0xA4D5: 0x5B54, //CJK UNIFIED IDEOGRAPH
+ 0xA4D6: 0x5C11, //CJK UNIFIED IDEOGRAPH
+ 0xA4D7: 0x5C24, //CJK UNIFIED IDEOGRAPH
+ 0xA4D8: 0x5C3A, //CJK UNIFIED IDEOGRAPH
+ 0xA4D9: 0x5C6F, //CJK UNIFIED IDEOGRAPH
+ 0xA4DA: 0x5DF4, //CJK UNIFIED IDEOGRAPH
+ 0xA4DB: 0x5E7B, //CJK UNIFIED IDEOGRAPH
+ 0xA4DC: 0x5EFF, //CJK UNIFIED IDEOGRAPH
+ 0xA4DD: 0x5F14, //CJK UNIFIED IDEOGRAPH
+ 0xA4DE: 0x5F15, //CJK UNIFIED IDEOGRAPH
+ 0xA4DF: 0x5FC3, //CJK UNIFIED IDEOGRAPH
+ 0xA4E0: 0x6208, //CJK UNIFIED IDEOGRAPH
+ 0xA4E1: 0x6236, //CJK UNIFIED IDEOGRAPH
+ 0xA4E2: 0x624B, //CJK UNIFIED IDEOGRAPH
+ 0xA4E3: 0x624E, //CJK UNIFIED IDEOGRAPH
+ 0xA4E4: 0x652F, //CJK UNIFIED IDEOGRAPH
+ 0xA4E5: 0x6587, //CJK UNIFIED IDEOGRAPH
+ 0xA4E6: 0x6597, //CJK UNIFIED IDEOGRAPH
+ 0xA4E7: 0x65A4, //CJK UNIFIED IDEOGRAPH
+ 0xA4E8: 0x65B9, //CJK UNIFIED IDEOGRAPH
+ 0xA4E9: 0x65E5, //CJK UNIFIED IDEOGRAPH
+ 0xA4EA: 0x66F0, //CJK UNIFIED IDEOGRAPH
+ 0xA4EB: 0x6708, //CJK UNIFIED IDEOGRAPH
+ 0xA4EC: 0x6728, //CJK UNIFIED IDEOGRAPH
+ 0xA4ED: 0x6B20, //CJK UNIFIED IDEOGRAPH
+ 0xA4EE: 0x6B62, //CJK UNIFIED IDEOGRAPH
+ 0xA4EF: 0x6B79, //CJK UNIFIED IDEOGRAPH
+ 0xA4F0: 0x6BCB, //CJK UNIFIED IDEOGRAPH
+ 0xA4F1: 0x6BD4, //CJK UNIFIED IDEOGRAPH
+ 0xA4F2: 0x6BDB, //CJK UNIFIED IDEOGRAPH
+ 0xA4F3: 0x6C0F, //CJK UNIFIED IDEOGRAPH
+ 0xA4F4: 0x6C34, //CJK UNIFIED IDEOGRAPH
+ 0xA4F5: 0x706B, //CJK UNIFIED IDEOGRAPH
+ 0xA4F6: 0x722A, //CJK UNIFIED IDEOGRAPH
+ 0xA4F7: 0x7236, //CJK UNIFIED IDEOGRAPH
+ 0xA4F8: 0x723B, //CJK UNIFIED IDEOGRAPH
+ 0xA4F9: 0x7247, //CJK UNIFIED IDEOGRAPH
+ 0xA4FA: 0x7259, //CJK UNIFIED IDEOGRAPH
+ 0xA4FB: 0x725B, //CJK UNIFIED IDEOGRAPH
+ 0xA4FC: 0x72AC, //CJK UNIFIED IDEOGRAPH
+ 0xA4FD: 0x738B, //CJK UNIFIED IDEOGRAPH
+ 0xA4FE: 0x4E19, //CJK UNIFIED IDEOGRAPH
+ 0xA540: 0x4E16, //CJK UNIFIED IDEOGRAPH
+ 0xA541: 0x4E15, //CJK UNIFIED IDEOGRAPH
+ 0xA542: 0x4E14, //CJK UNIFIED IDEOGRAPH
+ 0xA543: 0x4E18, //CJK UNIFIED IDEOGRAPH
+ 0xA544: 0x4E3B, //CJK UNIFIED IDEOGRAPH
+ 0xA545: 0x4E4D, //CJK UNIFIED IDEOGRAPH
+ 0xA546: 0x4E4F, //CJK UNIFIED IDEOGRAPH
+ 0xA547: 0x4E4E, //CJK UNIFIED IDEOGRAPH
+ 0xA548: 0x4EE5, //CJK UNIFIED IDEOGRAPH
+ 0xA549: 0x4ED8, //CJK UNIFIED IDEOGRAPH
+ 0xA54A: 0x4ED4, //CJK UNIFIED IDEOGRAPH
+ 0xA54B: 0x4ED5, //CJK UNIFIED IDEOGRAPH
+ 0xA54C: 0x4ED6, //CJK UNIFIED IDEOGRAPH
+ 0xA54D: 0x4ED7, //CJK UNIFIED IDEOGRAPH
+ 0xA54E: 0x4EE3, //CJK UNIFIED IDEOGRAPH
+ 0xA54F: 0x4EE4, //CJK UNIFIED IDEOGRAPH
+ 0xA550: 0x4ED9, //CJK UNIFIED IDEOGRAPH
+ 0xA551: 0x4EDE, //CJK UNIFIED IDEOGRAPH
+ 0xA552: 0x5145, //CJK UNIFIED IDEOGRAPH
+ 0xA553: 0x5144, //CJK UNIFIED IDEOGRAPH
+ 0xA554: 0x5189, //CJK UNIFIED IDEOGRAPH
+ 0xA555: 0x518A, //CJK UNIFIED IDEOGRAPH
+ 0xA556: 0x51AC, //CJK UNIFIED IDEOGRAPH
+ 0xA557: 0x51F9, //CJK UNIFIED IDEOGRAPH
+ 0xA558: 0x51FA, //CJK UNIFIED IDEOGRAPH
+ 0xA559: 0x51F8, //CJK UNIFIED IDEOGRAPH
+ 0xA55A: 0x520A, //CJK UNIFIED IDEOGRAPH
+ 0xA55B: 0x52A0, //CJK UNIFIED IDEOGRAPH
+ 0xA55C: 0x529F, //CJK UNIFIED IDEOGRAPH
+ 0xA55D: 0x5305, //CJK UNIFIED IDEOGRAPH
+ 0xA55E: 0x5306, //CJK UNIFIED IDEOGRAPH
+ 0xA55F: 0x5317, //CJK UNIFIED IDEOGRAPH
+ 0xA560: 0x531D, //CJK UNIFIED IDEOGRAPH
+ 0xA561: 0x4EDF, //CJK UNIFIED IDEOGRAPH
+ 0xA562: 0x534A, //CJK UNIFIED IDEOGRAPH
+ 0xA563: 0x5349, //CJK UNIFIED IDEOGRAPH
+ 0xA564: 0x5361, //CJK UNIFIED IDEOGRAPH
+ 0xA565: 0x5360, //CJK UNIFIED IDEOGRAPH
+ 0xA566: 0x536F, //CJK UNIFIED IDEOGRAPH
+ 0xA567: 0x536E, //CJK UNIFIED IDEOGRAPH
+ 0xA568: 0x53BB, //CJK UNIFIED IDEOGRAPH
+ 0xA569: 0x53EF, //CJK UNIFIED IDEOGRAPH
+ 0xA56A: 0x53E4, //CJK UNIFIED IDEOGRAPH
+ 0xA56B: 0x53F3, //CJK UNIFIED IDEOGRAPH
+ 0xA56C: 0x53EC, //CJK UNIFIED IDEOGRAPH
+ 0xA56D: 0x53EE, //CJK UNIFIED IDEOGRAPH
+ 0xA56E: 0x53E9, //CJK UNIFIED IDEOGRAPH
+ 0xA56F: 0x53E8, //CJK UNIFIED IDEOGRAPH
+ 0xA570: 0x53FC, //CJK UNIFIED IDEOGRAPH
+ 0xA571: 0x53F8, //CJK UNIFIED IDEOGRAPH
+ 0xA572: 0x53F5, //CJK UNIFIED IDEOGRAPH
+ 0xA573: 0x53EB, //CJK UNIFIED IDEOGRAPH
+ 0xA574: 0x53E6, //CJK UNIFIED IDEOGRAPH
+ 0xA575: 0x53EA, //CJK UNIFIED IDEOGRAPH
+ 0xA576: 0x53F2, //CJK UNIFIED IDEOGRAPH
+ 0xA577: 0x53F1, //CJK UNIFIED IDEOGRAPH
+ 0xA578: 0x53F0, //CJK UNIFIED IDEOGRAPH
+ 0xA579: 0x53E5, //CJK UNIFIED IDEOGRAPH
+ 0xA57A: 0x53ED, //CJK UNIFIED IDEOGRAPH
+ 0xA57B: 0x53FB, //CJK UNIFIED IDEOGRAPH
+ 0xA57C: 0x56DB, //CJK UNIFIED IDEOGRAPH
+ 0xA57D: 0x56DA, //CJK UNIFIED IDEOGRAPH
+ 0xA57E: 0x5916, //CJK UNIFIED IDEOGRAPH
+ 0xA5A1: 0x592E, //CJK UNIFIED IDEOGRAPH
+ 0xA5A2: 0x5931, //CJK UNIFIED IDEOGRAPH
+ 0xA5A3: 0x5974, //CJK UNIFIED IDEOGRAPH
+ 0xA5A4: 0x5976, //CJK UNIFIED IDEOGRAPH
+ 0xA5A5: 0x5B55, //CJK UNIFIED IDEOGRAPH
+ 0xA5A6: 0x5B83, //CJK UNIFIED IDEOGRAPH
+ 0xA5A7: 0x5C3C, //CJK UNIFIED IDEOGRAPH
+ 0xA5A8: 0x5DE8, //CJK UNIFIED IDEOGRAPH
+ 0xA5A9: 0x5DE7, //CJK UNIFIED IDEOGRAPH
+ 0xA5AA: 0x5DE6, //CJK UNIFIED IDEOGRAPH
+ 0xA5AB: 0x5E02, //CJK UNIFIED IDEOGRAPH
+ 0xA5AC: 0x5E03, //CJK UNIFIED IDEOGRAPH
+ 0xA5AD: 0x5E73, //CJK UNIFIED IDEOGRAPH
+ 0xA5AE: 0x5E7C, //CJK UNIFIED IDEOGRAPH
+ 0xA5AF: 0x5F01, //CJK UNIFIED IDEOGRAPH
+ 0xA5B0: 0x5F18, //CJK UNIFIED IDEOGRAPH
+ 0xA5B1: 0x5F17, //CJK UNIFIED IDEOGRAPH
+ 0xA5B2: 0x5FC5, //CJK UNIFIED IDEOGRAPH
+ 0xA5B3: 0x620A, //CJK UNIFIED IDEOGRAPH
+ 0xA5B4: 0x6253, //CJK UNIFIED IDEOGRAPH
+ 0xA5B5: 0x6254, //CJK UNIFIED IDEOGRAPH
+ 0xA5B6: 0x6252, //CJK UNIFIED IDEOGRAPH
+ 0xA5B7: 0x6251, //CJK UNIFIED IDEOGRAPH
+ 0xA5B8: 0x65A5, //CJK UNIFIED IDEOGRAPH
+ 0xA5B9: 0x65E6, //CJK UNIFIED IDEOGRAPH
+ 0xA5BA: 0x672E, //CJK UNIFIED IDEOGRAPH
+ 0xA5BB: 0x672C, //CJK UNIFIED IDEOGRAPH
+ 0xA5BC: 0x672A, //CJK UNIFIED IDEOGRAPH
+ 0xA5BD: 0x672B, //CJK UNIFIED IDEOGRAPH
+ 0xA5BE: 0x672D, //CJK UNIFIED IDEOGRAPH
+ 0xA5BF: 0x6B63, //CJK UNIFIED IDEOGRAPH
+ 0xA5C0: 0x6BCD, //CJK UNIFIED IDEOGRAPH
+ 0xA5C1: 0x6C11, //CJK UNIFIED IDEOGRAPH
+ 0xA5C2: 0x6C10, //CJK UNIFIED IDEOGRAPH
+ 0xA5C3: 0x6C38, //CJK UNIFIED IDEOGRAPH
+ 0xA5C4: 0x6C41, //CJK UNIFIED IDEOGRAPH
+ 0xA5C5: 0x6C40, //CJK UNIFIED IDEOGRAPH
+ 0xA5C6: 0x6C3E, //CJK UNIFIED IDEOGRAPH
+ 0xA5C7: 0x72AF, //CJK UNIFIED IDEOGRAPH
+ 0xA5C8: 0x7384, //CJK UNIFIED IDEOGRAPH
+ 0xA5C9: 0x7389, //CJK UNIFIED IDEOGRAPH
+ 0xA5CA: 0x74DC, //CJK UNIFIED IDEOGRAPH
+ 0xA5CB: 0x74E6, //CJK UNIFIED IDEOGRAPH
+ 0xA5CC: 0x7518, //CJK UNIFIED IDEOGRAPH
+ 0xA5CD: 0x751F, //CJK UNIFIED IDEOGRAPH
+ 0xA5CE: 0x7528, //CJK UNIFIED IDEOGRAPH
+ 0xA5CF: 0x7529, //CJK UNIFIED IDEOGRAPH
+ 0xA5D0: 0x7530, //CJK UNIFIED IDEOGRAPH
+ 0xA5D1: 0x7531, //CJK UNIFIED IDEOGRAPH
+ 0xA5D2: 0x7532, //CJK UNIFIED IDEOGRAPH
+ 0xA5D3: 0x7533, //CJK UNIFIED IDEOGRAPH
+ 0xA5D4: 0x758B, //CJK UNIFIED IDEOGRAPH
+ 0xA5D5: 0x767D, //CJK UNIFIED IDEOGRAPH
+ 0xA5D6: 0x76AE, //CJK UNIFIED IDEOGRAPH
+ 0xA5D7: 0x76BF, //CJK UNIFIED IDEOGRAPH
+ 0xA5D8: 0x76EE, //CJK UNIFIED IDEOGRAPH
+ 0xA5D9: 0x77DB, //CJK UNIFIED IDEOGRAPH
+ 0xA5DA: 0x77E2, //CJK UNIFIED IDEOGRAPH
+ 0xA5DB: 0x77F3, //CJK UNIFIED IDEOGRAPH
+ 0xA5DC: 0x793A, //CJK UNIFIED IDEOGRAPH
+ 0xA5DD: 0x79BE, //CJK UNIFIED IDEOGRAPH
+ 0xA5DE: 0x7A74, //CJK UNIFIED IDEOGRAPH
+ 0xA5DF: 0x7ACB, //CJK UNIFIED IDEOGRAPH
+ 0xA5E0: 0x4E1E, //CJK UNIFIED IDEOGRAPH
+ 0xA5E1: 0x4E1F, //CJK UNIFIED IDEOGRAPH
+ 0xA5E2: 0x4E52, //CJK UNIFIED IDEOGRAPH
+ 0xA5E3: 0x4E53, //CJK UNIFIED IDEOGRAPH
+ 0xA5E4: 0x4E69, //CJK UNIFIED IDEOGRAPH
+ 0xA5E5: 0x4E99, //CJK UNIFIED IDEOGRAPH
+ 0xA5E6: 0x4EA4, //CJK UNIFIED IDEOGRAPH
+ 0xA5E7: 0x4EA6, //CJK UNIFIED IDEOGRAPH
+ 0xA5E8: 0x4EA5, //CJK UNIFIED IDEOGRAPH
+ 0xA5E9: 0x4EFF, //CJK UNIFIED IDEOGRAPH
+ 0xA5EA: 0x4F09, //CJK UNIFIED IDEOGRAPH
+ 0xA5EB: 0x4F19, //CJK UNIFIED IDEOGRAPH
+ 0xA5EC: 0x4F0A, //CJK UNIFIED IDEOGRAPH
+ 0xA5ED: 0x4F15, //CJK UNIFIED IDEOGRAPH
+ 0xA5EE: 0x4F0D, //CJK UNIFIED IDEOGRAPH
+ 0xA5EF: 0x4F10, //CJK UNIFIED IDEOGRAPH
+ 0xA5F0: 0x4F11, //CJK UNIFIED IDEOGRAPH
+ 0xA5F1: 0x4F0F, //CJK UNIFIED IDEOGRAPH
+ 0xA5F2: 0x4EF2, //CJK UNIFIED IDEOGRAPH
+ 0xA5F3: 0x4EF6, //CJK UNIFIED IDEOGRAPH
+ 0xA5F4: 0x4EFB, //CJK UNIFIED IDEOGRAPH
+ 0xA5F5: 0x4EF0, //CJK UNIFIED IDEOGRAPH
+ 0xA5F6: 0x4EF3, //CJK UNIFIED IDEOGRAPH
+ 0xA5F7: 0x4EFD, //CJK UNIFIED IDEOGRAPH
+ 0xA5F8: 0x4F01, //CJK UNIFIED IDEOGRAPH
+ 0xA5F9: 0x4F0B, //CJK UNIFIED IDEOGRAPH
+ 0xA5FA: 0x5149, //CJK UNIFIED IDEOGRAPH
+ 0xA5FB: 0x5147, //CJK UNIFIED IDEOGRAPH
+ 0xA5FC: 0x5146, //CJK UNIFIED IDEOGRAPH
+ 0xA5FD: 0x5148, //CJK UNIFIED IDEOGRAPH
+ 0xA5FE: 0x5168, //CJK UNIFIED IDEOGRAPH
+ 0xA640: 0x5171, //CJK UNIFIED IDEOGRAPH
+ 0xA641: 0x518D, //CJK UNIFIED IDEOGRAPH
+ 0xA642: 0x51B0, //CJK UNIFIED IDEOGRAPH
+ 0xA643: 0x5217, //CJK UNIFIED IDEOGRAPH
+ 0xA644: 0x5211, //CJK UNIFIED IDEOGRAPH
+ 0xA645: 0x5212, //CJK UNIFIED IDEOGRAPH
+ 0xA646: 0x520E, //CJK UNIFIED IDEOGRAPH
+ 0xA647: 0x5216, //CJK UNIFIED IDEOGRAPH
+ 0xA648: 0x52A3, //CJK UNIFIED IDEOGRAPH
+ 0xA649: 0x5308, //CJK UNIFIED IDEOGRAPH
+ 0xA64A: 0x5321, //CJK UNIFIED IDEOGRAPH
+ 0xA64B: 0x5320, //CJK UNIFIED IDEOGRAPH
+ 0xA64C: 0x5370, //CJK UNIFIED IDEOGRAPH
+ 0xA64D: 0x5371, //CJK UNIFIED IDEOGRAPH
+ 0xA64E: 0x5409, //CJK UNIFIED IDEOGRAPH
+ 0xA64F: 0x540F, //CJK UNIFIED IDEOGRAPH
+ 0xA650: 0x540C, //CJK UNIFIED IDEOGRAPH
+ 0xA651: 0x540A, //CJK UNIFIED IDEOGRAPH
+ 0xA652: 0x5410, //CJK UNIFIED IDEOGRAPH
+ 0xA653: 0x5401, //CJK UNIFIED IDEOGRAPH
+ 0xA654: 0x540B, //CJK UNIFIED IDEOGRAPH
+ 0xA655: 0x5404, //CJK UNIFIED IDEOGRAPH
+ 0xA656: 0x5411, //CJK UNIFIED IDEOGRAPH
+ 0xA657: 0x540D, //CJK UNIFIED IDEOGRAPH
+ 0xA658: 0x5408, //CJK UNIFIED IDEOGRAPH
+ 0xA659: 0x5403, //CJK UNIFIED IDEOGRAPH
+ 0xA65A: 0x540E, //CJK UNIFIED IDEOGRAPH
+ 0xA65B: 0x5406, //CJK UNIFIED IDEOGRAPH
+ 0xA65C: 0x5412, //CJK UNIFIED IDEOGRAPH
+ 0xA65D: 0x56E0, //CJK UNIFIED IDEOGRAPH
+ 0xA65E: 0x56DE, //CJK UNIFIED IDEOGRAPH
+ 0xA65F: 0x56DD, //CJK UNIFIED IDEOGRAPH
+ 0xA660: 0x5733, //CJK UNIFIED IDEOGRAPH
+ 0xA661: 0x5730, //CJK UNIFIED IDEOGRAPH
+ 0xA662: 0x5728, //CJK UNIFIED IDEOGRAPH
+ 0xA663: 0x572D, //CJK UNIFIED IDEOGRAPH
+ 0xA664: 0x572C, //CJK UNIFIED IDEOGRAPH
+ 0xA665: 0x572F, //CJK UNIFIED IDEOGRAPH
+ 0xA666: 0x5729, //CJK UNIFIED IDEOGRAPH
+ 0xA667: 0x5919, //CJK UNIFIED IDEOGRAPH
+ 0xA668: 0x591A, //CJK UNIFIED IDEOGRAPH
+ 0xA669: 0x5937, //CJK UNIFIED IDEOGRAPH
+ 0xA66A: 0x5938, //CJK UNIFIED IDEOGRAPH
+ 0xA66B: 0x5984, //CJK UNIFIED IDEOGRAPH
+ 0xA66C: 0x5978, //CJK UNIFIED IDEOGRAPH
+ 0xA66D: 0x5983, //CJK UNIFIED IDEOGRAPH
+ 0xA66E: 0x597D, //CJK UNIFIED IDEOGRAPH
+ 0xA66F: 0x5979, //CJK UNIFIED IDEOGRAPH
+ 0xA670: 0x5982, //CJK UNIFIED IDEOGRAPH
+ 0xA671: 0x5981, //CJK UNIFIED IDEOGRAPH
+ 0xA672: 0x5B57, //CJK UNIFIED IDEOGRAPH
+ 0xA673: 0x5B58, //CJK UNIFIED IDEOGRAPH
+ 0xA674: 0x5B87, //CJK UNIFIED IDEOGRAPH
+ 0xA675: 0x5B88, //CJK UNIFIED IDEOGRAPH
+ 0xA676: 0x5B85, //CJK UNIFIED IDEOGRAPH
+ 0xA677: 0x5B89, //CJK UNIFIED IDEOGRAPH
+ 0xA678: 0x5BFA, //CJK UNIFIED IDEOGRAPH
+ 0xA679: 0x5C16, //CJK UNIFIED IDEOGRAPH
+ 0xA67A: 0x5C79, //CJK UNIFIED IDEOGRAPH
+ 0xA67B: 0x5DDE, //CJK UNIFIED IDEOGRAPH
+ 0xA67C: 0x5E06, //CJK UNIFIED IDEOGRAPH
+ 0xA67D: 0x5E76, //CJK UNIFIED IDEOGRAPH
+ 0xA67E: 0x5E74, //CJK UNIFIED IDEOGRAPH
+ 0xA6A1: 0x5F0F, //CJK UNIFIED IDEOGRAPH
+ 0xA6A2: 0x5F1B, //CJK UNIFIED IDEOGRAPH
+ 0xA6A3: 0x5FD9, //CJK UNIFIED IDEOGRAPH
+ 0xA6A4: 0x5FD6, //CJK UNIFIED IDEOGRAPH
+ 0xA6A5: 0x620E, //CJK UNIFIED IDEOGRAPH
+ 0xA6A6: 0x620C, //CJK UNIFIED IDEOGRAPH
+ 0xA6A7: 0x620D, //CJK UNIFIED IDEOGRAPH
+ 0xA6A8: 0x6210, //CJK UNIFIED IDEOGRAPH
+ 0xA6A9: 0x6263, //CJK UNIFIED IDEOGRAPH
+ 0xA6AA: 0x625B, //CJK UNIFIED IDEOGRAPH
+ 0xA6AB: 0x6258, //CJK UNIFIED IDEOGRAPH
+ 0xA6AC: 0x6536, //CJK UNIFIED IDEOGRAPH
+ 0xA6AD: 0x65E9, //CJK UNIFIED IDEOGRAPH
+ 0xA6AE: 0x65E8, //CJK UNIFIED IDEOGRAPH
+ 0xA6AF: 0x65EC, //CJK UNIFIED IDEOGRAPH
+ 0xA6B0: 0x65ED, //CJK UNIFIED IDEOGRAPH
+ 0xA6B1: 0x66F2, //CJK UNIFIED IDEOGRAPH
+ 0xA6B2: 0x66F3, //CJK UNIFIED IDEOGRAPH
+ 0xA6B3: 0x6709, //CJK UNIFIED IDEOGRAPH
+ 0xA6B4: 0x673D, //CJK UNIFIED IDEOGRAPH
+ 0xA6B5: 0x6734, //CJK UNIFIED IDEOGRAPH
+ 0xA6B6: 0x6731, //CJK UNIFIED IDEOGRAPH
+ 0xA6B7: 0x6735, //CJK UNIFIED IDEOGRAPH
+ 0xA6B8: 0x6B21, //CJK UNIFIED IDEOGRAPH
+ 0xA6B9: 0x6B64, //CJK UNIFIED IDEOGRAPH
+ 0xA6BA: 0x6B7B, //CJK UNIFIED IDEOGRAPH
+ 0xA6BB: 0x6C16, //CJK UNIFIED IDEOGRAPH
+ 0xA6BC: 0x6C5D, //CJK UNIFIED IDEOGRAPH
+ 0xA6BD: 0x6C57, //CJK UNIFIED IDEOGRAPH
+ 0xA6BE: 0x6C59, //CJK UNIFIED IDEOGRAPH
+ 0xA6BF: 0x6C5F, //CJK UNIFIED IDEOGRAPH
+ 0xA6C0: 0x6C60, //CJK UNIFIED IDEOGRAPH
+ 0xA6C1: 0x6C50, //CJK UNIFIED IDEOGRAPH
+ 0xA6C2: 0x6C55, //CJK UNIFIED IDEOGRAPH
+ 0xA6C3: 0x6C61, //CJK UNIFIED IDEOGRAPH
+ 0xA6C4: 0x6C5B, //CJK UNIFIED IDEOGRAPH
+ 0xA6C5: 0x6C4D, //CJK UNIFIED IDEOGRAPH
+ 0xA6C6: 0x6C4E, //CJK UNIFIED IDEOGRAPH
+ 0xA6C7: 0x7070, //CJK UNIFIED IDEOGRAPH
+ 0xA6C8: 0x725F, //CJK UNIFIED IDEOGRAPH
+ 0xA6C9: 0x725D, //CJK UNIFIED IDEOGRAPH
+ 0xA6CA: 0x767E, //CJK UNIFIED IDEOGRAPH
+ 0xA6CB: 0x7AF9, //CJK UNIFIED IDEOGRAPH
+ 0xA6CC: 0x7C73, //CJK UNIFIED IDEOGRAPH
+ 0xA6CD: 0x7CF8, //CJK UNIFIED IDEOGRAPH
+ 0xA6CE: 0x7F36, //CJK UNIFIED IDEOGRAPH
+ 0xA6CF: 0x7F8A, //CJK UNIFIED IDEOGRAPH
+ 0xA6D0: 0x7FBD, //CJK UNIFIED IDEOGRAPH
+ 0xA6D1: 0x8001, //CJK UNIFIED IDEOGRAPH
+ 0xA6D2: 0x8003, //CJK UNIFIED IDEOGRAPH
+ 0xA6D3: 0x800C, //CJK UNIFIED IDEOGRAPH
+ 0xA6D4: 0x8012, //CJK UNIFIED IDEOGRAPH
+ 0xA6D5: 0x8033, //CJK UNIFIED IDEOGRAPH
+ 0xA6D6: 0x807F, //CJK UNIFIED IDEOGRAPH
+ 0xA6D7: 0x8089, //CJK UNIFIED IDEOGRAPH
+ 0xA6D8: 0x808B, //CJK UNIFIED IDEOGRAPH
+ 0xA6D9: 0x808C, //CJK UNIFIED IDEOGRAPH
+ 0xA6DA: 0x81E3, //CJK UNIFIED IDEOGRAPH
+ 0xA6DB: 0x81EA, //CJK UNIFIED IDEOGRAPH
+ 0xA6DC: 0x81F3, //CJK UNIFIED IDEOGRAPH
+ 0xA6DD: 0x81FC, //CJK UNIFIED IDEOGRAPH
+ 0xA6DE: 0x820C, //CJK UNIFIED IDEOGRAPH
+ 0xA6DF: 0x821B, //CJK UNIFIED IDEOGRAPH
+ 0xA6E0: 0x821F, //CJK UNIFIED IDEOGRAPH
+ 0xA6E1: 0x826E, //CJK UNIFIED IDEOGRAPH
+ 0xA6E2: 0x8272, //CJK UNIFIED IDEOGRAPH
+ 0xA6E3: 0x827E, //CJK UNIFIED IDEOGRAPH
+ 0xA6E4: 0x866B, //CJK UNIFIED IDEOGRAPH
+ 0xA6E5: 0x8840, //CJK UNIFIED IDEOGRAPH
+ 0xA6E6: 0x884C, //CJK UNIFIED IDEOGRAPH
+ 0xA6E7: 0x8863, //CJK UNIFIED IDEOGRAPH
+ 0xA6E8: 0x897F, //CJK UNIFIED IDEOGRAPH
+ 0xA6E9: 0x9621, //CJK UNIFIED IDEOGRAPH
+ 0xA6EA: 0x4E32, //CJK UNIFIED IDEOGRAPH
+ 0xA6EB: 0x4EA8, //CJK UNIFIED IDEOGRAPH
+ 0xA6EC: 0x4F4D, //CJK UNIFIED IDEOGRAPH
+ 0xA6ED: 0x4F4F, //CJK UNIFIED IDEOGRAPH
+ 0xA6EE: 0x4F47, //CJK UNIFIED IDEOGRAPH
+ 0xA6EF: 0x4F57, //CJK UNIFIED IDEOGRAPH
+ 0xA6F0: 0x4F5E, //CJK UNIFIED IDEOGRAPH
+ 0xA6F1: 0x4F34, //CJK UNIFIED IDEOGRAPH
+ 0xA6F2: 0x4F5B, //CJK UNIFIED IDEOGRAPH
+ 0xA6F3: 0x4F55, //CJK UNIFIED IDEOGRAPH
+ 0xA6F4: 0x4F30, //CJK UNIFIED IDEOGRAPH
+ 0xA6F5: 0x4F50, //CJK UNIFIED IDEOGRAPH
+ 0xA6F6: 0x4F51, //CJK UNIFIED IDEOGRAPH
+ 0xA6F7: 0x4F3D, //CJK UNIFIED IDEOGRAPH
+ 0xA6F8: 0x4F3A, //CJK UNIFIED IDEOGRAPH
+ 0xA6F9: 0x4F38, //CJK UNIFIED IDEOGRAPH
+ 0xA6FA: 0x4F43, //CJK UNIFIED IDEOGRAPH
+ 0xA6FB: 0x4F54, //CJK UNIFIED IDEOGRAPH
+ 0xA6FC: 0x4F3C, //CJK UNIFIED IDEOGRAPH
+ 0xA6FD: 0x4F46, //CJK UNIFIED IDEOGRAPH
+ 0xA6FE: 0x4F63, //CJK UNIFIED IDEOGRAPH
+ 0xA740: 0x4F5C, //CJK UNIFIED IDEOGRAPH
+ 0xA741: 0x4F60, //CJK UNIFIED IDEOGRAPH
+ 0xA742: 0x4F2F, //CJK UNIFIED IDEOGRAPH
+ 0xA743: 0x4F4E, //CJK UNIFIED IDEOGRAPH
+ 0xA744: 0x4F36, //CJK UNIFIED IDEOGRAPH
+ 0xA745: 0x4F59, //CJK UNIFIED IDEOGRAPH
+ 0xA746: 0x4F5D, //CJK UNIFIED IDEOGRAPH
+ 0xA747: 0x4F48, //CJK UNIFIED IDEOGRAPH
+ 0xA748: 0x4F5A, //CJK UNIFIED IDEOGRAPH
+ 0xA749: 0x514C, //CJK UNIFIED IDEOGRAPH
+ 0xA74A: 0x514B, //CJK UNIFIED IDEOGRAPH
+ 0xA74B: 0x514D, //CJK UNIFIED IDEOGRAPH
+ 0xA74C: 0x5175, //CJK UNIFIED IDEOGRAPH
+ 0xA74D: 0x51B6, //CJK UNIFIED IDEOGRAPH
+ 0xA74E: 0x51B7, //CJK UNIFIED IDEOGRAPH
+ 0xA74F: 0x5225, //CJK UNIFIED IDEOGRAPH
+ 0xA750: 0x5224, //CJK UNIFIED IDEOGRAPH
+ 0xA751: 0x5229, //CJK UNIFIED IDEOGRAPH
+ 0xA752: 0x522A, //CJK UNIFIED IDEOGRAPH
+ 0xA753: 0x5228, //CJK UNIFIED IDEOGRAPH
+ 0xA754: 0x52AB, //CJK UNIFIED IDEOGRAPH
+ 0xA755: 0x52A9, //CJK UNIFIED IDEOGRAPH
+ 0xA756: 0x52AA, //CJK UNIFIED IDEOGRAPH
+ 0xA757: 0x52AC, //CJK UNIFIED IDEOGRAPH
+ 0xA758: 0x5323, //CJK UNIFIED IDEOGRAPH
+ 0xA759: 0x5373, //CJK UNIFIED IDEOGRAPH
+ 0xA75A: 0x5375, //CJK UNIFIED IDEOGRAPH
+ 0xA75B: 0x541D, //CJK UNIFIED IDEOGRAPH
+ 0xA75C: 0x542D, //CJK UNIFIED IDEOGRAPH
+ 0xA75D: 0x541E, //CJK UNIFIED IDEOGRAPH
+ 0xA75E: 0x543E, //CJK UNIFIED IDEOGRAPH
+ 0xA75F: 0x5426, //CJK UNIFIED IDEOGRAPH
+ 0xA760: 0x544E, //CJK UNIFIED IDEOGRAPH
+ 0xA761: 0x5427, //CJK UNIFIED IDEOGRAPH
+ 0xA762: 0x5446, //CJK UNIFIED IDEOGRAPH
+ 0xA763: 0x5443, //CJK UNIFIED IDEOGRAPH
+ 0xA764: 0x5433, //CJK UNIFIED IDEOGRAPH
+ 0xA765: 0x5448, //CJK UNIFIED IDEOGRAPH
+ 0xA766: 0x5442, //CJK UNIFIED IDEOGRAPH
+ 0xA767: 0x541B, //CJK UNIFIED IDEOGRAPH
+ 0xA768: 0x5429, //CJK UNIFIED IDEOGRAPH
+ 0xA769: 0x544A, //CJK UNIFIED IDEOGRAPH
+ 0xA76A: 0x5439, //CJK UNIFIED IDEOGRAPH
+ 0xA76B: 0x543B, //CJK UNIFIED IDEOGRAPH
+ 0xA76C: 0x5438, //CJK UNIFIED IDEOGRAPH
+ 0xA76D: 0x542E, //CJK UNIFIED IDEOGRAPH
+ 0xA76E: 0x5435, //CJK UNIFIED IDEOGRAPH
+ 0xA76F: 0x5436, //CJK UNIFIED IDEOGRAPH
+ 0xA770: 0x5420, //CJK UNIFIED IDEOGRAPH
+ 0xA771: 0x543C, //CJK UNIFIED IDEOGRAPH
+ 0xA772: 0x5440, //CJK UNIFIED IDEOGRAPH
+ 0xA773: 0x5431, //CJK UNIFIED IDEOGRAPH
+ 0xA774: 0x542B, //CJK UNIFIED IDEOGRAPH
+ 0xA775: 0x541F, //CJK UNIFIED IDEOGRAPH
+ 0xA776: 0x542C, //CJK UNIFIED IDEOGRAPH
+ 0xA777: 0x56EA, //CJK UNIFIED IDEOGRAPH
+ 0xA778: 0x56F0, //CJK UNIFIED IDEOGRAPH
+ 0xA779: 0x56E4, //CJK UNIFIED IDEOGRAPH
+ 0xA77A: 0x56EB, //CJK UNIFIED IDEOGRAPH
+ 0xA77B: 0x574A, //CJK UNIFIED IDEOGRAPH
+ 0xA77C: 0x5751, //CJK UNIFIED IDEOGRAPH
+ 0xA77D: 0x5740, //CJK UNIFIED IDEOGRAPH
+ 0xA77E: 0x574D, //CJK UNIFIED IDEOGRAPH
+ 0xA7A1: 0x5747, //CJK UNIFIED IDEOGRAPH
+ 0xA7A2: 0x574E, //CJK UNIFIED IDEOGRAPH
+ 0xA7A3: 0x573E, //CJK UNIFIED IDEOGRAPH
+ 0xA7A4: 0x5750, //CJK UNIFIED IDEOGRAPH
+ 0xA7A5: 0x574F, //CJK UNIFIED IDEOGRAPH
+ 0xA7A6: 0x573B, //CJK UNIFIED IDEOGRAPH
+ 0xA7A7: 0x58EF, //CJK UNIFIED IDEOGRAPH
+ 0xA7A8: 0x593E, //CJK UNIFIED IDEOGRAPH
+ 0xA7A9: 0x599D, //CJK UNIFIED IDEOGRAPH
+ 0xA7AA: 0x5992, //CJK UNIFIED IDEOGRAPH
+ 0xA7AB: 0x59A8, //CJK UNIFIED IDEOGRAPH
+ 0xA7AC: 0x599E, //CJK UNIFIED IDEOGRAPH
+ 0xA7AD: 0x59A3, //CJK UNIFIED IDEOGRAPH
+ 0xA7AE: 0x5999, //CJK UNIFIED IDEOGRAPH
+ 0xA7AF: 0x5996, //CJK UNIFIED IDEOGRAPH
+ 0xA7B0: 0x598D, //CJK UNIFIED IDEOGRAPH
+ 0xA7B1: 0x59A4, //CJK UNIFIED IDEOGRAPH
+ 0xA7B2: 0x5993, //CJK UNIFIED IDEOGRAPH
+ 0xA7B3: 0x598A, //CJK UNIFIED IDEOGRAPH
+ 0xA7B4: 0x59A5, //CJK UNIFIED IDEOGRAPH
+ 0xA7B5: 0x5B5D, //CJK UNIFIED IDEOGRAPH
+ 0xA7B6: 0x5B5C, //CJK UNIFIED IDEOGRAPH
+ 0xA7B7: 0x5B5A, //CJK UNIFIED IDEOGRAPH
+ 0xA7B8: 0x5B5B, //CJK UNIFIED IDEOGRAPH
+ 0xA7B9: 0x5B8C, //CJK UNIFIED IDEOGRAPH
+ 0xA7BA: 0x5B8B, //CJK UNIFIED IDEOGRAPH
+ 0xA7BB: 0x5B8F, //CJK UNIFIED IDEOGRAPH
+ 0xA7BC: 0x5C2C, //CJK UNIFIED IDEOGRAPH
+ 0xA7BD: 0x5C40, //CJK UNIFIED IDEOGRAPH
+ 0xA7BE: 0x5C41, //CJK UNIFIED IDEOGRAPH
+ 0xA7BF: 0x5C3F, //CJK UNIFIED IDEOGRAPH
+ 0xA7C0: 0x5C3E, //CJK UNIFIED IDEOGRAPH
+ 0xA7C1: 0x5C90, //CJK UNIFIED IDEOGRAPH
+ 0xA7C2: 0x5C91, //CJK UNIFIED IDEOGRAPH
+ 0xA7C3: 0x5C94, //CJK UNIFIED IDEOGRAPH
+ 0xA7C4: 0x5C8C, //CJK UNIFIED IDEOGRAPH
+ 0xA7C5: 0x5DEB, //CJK UNIFIED IDEOGRAPH
+ 0xA7C6: 0x5E0C, //CJK UNIFIED IDEOGRAPH
+ 0xA7C7: 0x5E8F, //CJK UNIFIED IDEOGRAPH
+ 0xA7C8: 0x5E87, //CJK UNIFIED IDEOGRAPH
+ 0xA7C9: 0x5E8A, //CJK UNIFIED IDEOGRAPH
+ 0xA7CA: 0x5EF7, //CJK UNIFIED IDEOGRAPH
+ 0xA7CB: 0x5F04, //CJK UNIFIED IDEOGRAPH
+ 0xA7CC: 0x5F1F, //CJK UNIFIED IDEOGRAPH
+ 0xA7CD: 0x5F64, //CJK UNIFIED IDEOGRAPH
+ 0xA7CE: 0x5F62, //CJK UNIFIED IDEOGRAPH
+ 0xA7CF: 0x5F77, //CJK UNIFIED IDEOGRAPH
+ 0xA7D0: 0x5F79, //CJK UNIFIED IDEOGRAPH
+ 0xA7D1: 0x5FD8, //CJK UNIFIED IDEOGRAPH
+ 0xA7D2: 0x5FCC, //CJK UNIFIED IDEOGRAPH
+ 0xA7D3: 0x5FD7, //CJK UNIFIED IDEOGRAPH
+ 0xA7D4: 0x5FCD, //CJK UNIFIED IDEOGRAPH
+ 0xA7D5: 0x5FF1, //CJK UNIFIED IDEOGRAPH
+ 0xA7D6: 0x5FEB, //CJK UNIFIED IDEOGRAPH
+ 0xA7D7: 0x5FF8, //CJK UNIFIED IDEOGRAPH
+ 0xA7D8: 0x5FEA, //CJK UNIFIED IDEOGRAPH
+ 0xA7D9: 0x6212, //CJK UNIFIED IDEOGRAPH
+ 0xA7DA: 0x6211, //CJK UNIFIED IDEOGRAPH
+ 0xA7DB: 0x6284, //CJK UNIFIED IDEOGRAPH
+ 0xA7DC: 0x6297, //CJK UNIFIED IDEOGRAPH
+ 0xA7DD: 0x6296, //CJK UNIFIED IDEOGRAPH
+ 0xA7DE: 0x6280, //CJK UNIFIED IDEOGRAPH
+ 0xA7DF: 0x6276, //CJK UNIFIED IDEOGRAPH
+ 0xA7E0: 0x6289, //CJK UNIFIED IDEOGRAPH
+ 0xA7E1: 0x626D, //CJK UNIFIED IDEOGRAPH
+ 0xA7E2: 0x628A, //CJK UNIFIED IDEOGRAPH
+ 0xA7E3: 0x627C, //CJK UNIFIED IDEOGRAPH
+ 0xA7E4: 0x627E, //CJK UNIFIED IDEOGRAPH
+ 0xA7E5: 0x6279, //CJK UNIFIED IDEOGRAPH
+ 0xA7E6: 0x6273, //CJK UNIFIED IDEOGRAPH
+ 0xA7E7: 0x6292, //CJK UNIFIED IDEOGRAPH
+ 0xA7E8: 0x626F, //CJK UNIFIED IDEOGRAPH
+ 0xA7E9: 0x6298, //CJK UNIFIED IDEOGRAPH
+ 0xA7EA: 0x626E, //CJK UNIFIED IDEOGRAPH
+ 0xA7EB: 0x6295, //CJK UNIFIED IDEOGRAPH
+ 0xA7EC: 0x6293, //CJK UNIFIED IDEOGRAPH
+ 0xA7ED: 0x6291, //CJK UNIFIED IDEOGRAPH
+ 0xA7EE: 0x6286, //CJK UNIFIED IDEOGRAPH
+ 0xA7EF: 0x6539, //CJK UNIFIED IDEOGRAPH
+ 0xA7F0: 0x653B, //CJK UNIFIED IDEOGRAPH
+ 0xA7F1: 0x6538, //CJK UNIFIED IDEOGRAPH
+ 0xA7F2: 0x65F1, //CJK UNIFIED IDEOGRAPH
+ 0xA7F3: 0x66F4, //CJK UNIFIED IDEOGRAPH
+ 0xA7F4: 0x675F, //CJK UNIFIED IDEOGRAPH
+ 0xA7F5: 0x674E, //CJK UNIFIED IDEOGRAPH
+ 0xA7F6: 0x674F, //CJK UNIFIED IDEOGRAPH
+ 0xA7F7: 0x6750, //CJK UNIFIED IDEOGRAPH
+ 0xA7F8: 0x6751, //CJK UNIFIED IDEOGRAPH
+ 0xA7F9: 0x675C, //CJK UNIFIED IDEOGRAPH
+ 0xA7FA: 0x6756, //CJK UNIFIED IDEOGRAPH
+ 0xA7FB: 0x675E, //CJK UNIFIED IDEOGRAPH
+ 0xA7FC: 0x6749, //CJK UNIFIED IDEOGRAPH
+ 0xA7FD: 0x6746, //CJK UNIFIED IDEOGRAPH
+ 0xA7FE: 0x6760, //CJK UNIFIED IDEOGRAPH
+ 0xA840: 0x6753, //CJK UNIFIED IDEOGRAPH
+ 0xA841: 0x6757, //CJK UNIFIED IDEOGRAPH
+ 0xA842: 0x6B65, //CJK UNIFIED IDEOGRAPH
+ 0xA843: 0x6BCF, //CJK UNIFIED IDEOGRAPH
+ 0xA844: 0x6C42, //CJK UNIFIED IDEOGRAPH
+ 0xA845: 0x6C5E, //CJK UNIFIED IDEOGRAPH
+ 0xA846: 0x6C99, //CJK UNIFIED IDEOGRAPH
+ 0xA847: 0x6C81, //CJK UNIFIED IDEOGRAPH
+ 0xA848: 0x6C88, //CJK UNIFIED IDEOGRAPH
+ 0xA849: 0x6C89, //CJK UNIFIED IDEOGRAPH
+ 0xA84A: 0x6C85, //CJK UNIFIED IDEOGRAPH
+ 0xA84B: 0x6C9B, //CJK UNIFIED IDEOGRAPH
+ 0xA84C: 0x6C6A, //CJK UNIFIED IDEOGRAPH
+ 0xA84D: 0x6C7A, //CJK UNIFIED IDEOGRAPH
+ 0xA84E: 0x6C90, //CJK UNIFIED IDEOGRAPH
+ 0xA84F: 0x6C70, //CJK UNIFIED IDEOGRAPH
+ 0xA850: 0x6C8C, //CJK UNIFIED IDEOGRAPH
+ 0xA851: 0x6C68, //CJK UNIFIED IDEOGRAPH
+ 0xA852: 0x6C96, //CJK UNIFIED IDEOGRAPH
+ 0xA853: 0x6C92, //CJK UNIFIED IDEOGRAPH
+ 0xA854: 0x6C7D, //CJK UNIFIED IDEOGRAPH
+ 0xA855: 0x6C83, //CJK UNIFIED IDEOGRAPH
+ 0xA856: 0x6C72, //CJK UNIFIED IDEOGRAPH
+ 0xA857: 0x6C7E, //CJK UNIFIED IDEOGRAPH
+ 0xA858: 0x6C74, //CJK UNIFIED IDEOGRAPH
+ 0xA859: 0x6C86, //CJK UNIFIED IDEOGRAPH
+ 0xA85A: 0x6C76, //CJK UNIFIED IDEOGRAPH
+ 0xA85B: 0x6C8D, //CJK UNIFIED IDEOGRAPH
+ 0xA85C: 0x6C94, //CJK UNIFIED IDEOGRAPH
+ 0xA85D: 0x6C98, //CJK UNIFIED IDEOGRAPH
+ 0xA85E: 0x6C82, //CJK UNIFIED IDEOGRAPH
+ 0xA85F: 0x7076, //CJK UNIFIED IDEOGRAPH
+ 0xA860: 0x707C, //CJK UNIFIED IDEOGRAPH
+ 0xA861: 0x707D, //CJK UNIFIED IDEOGRAPH
+ 0xA862: 0x7078, //CJK UNIFIED IDEOGRAPH
+ 0xA863: 0x7262, //CJK UNIFIED IDEOGRAPH
+ 0xA864: 0x7261, //CJK UNIFIED IDEOGRAPH
+ 0xA865: 0x7260, //CJK UNIFIED IDEOGRAPH
+ 0xA866: 0x72C4, //CJK UNIFIED IDEOGRAPH
+ 0xA867: 0x72C2, //CJK UNIFIED IDEOGRAPH
+ 0xA868: 0x7396, //CJK UNIFIED IDEOGRAPH
+ 0xA869: 0x752C, //CJK UNIFIED IDEOGRAPH
+ 0xA86A: 0x752B, //CJK UNIFIED IDEOGRAPH
+ 0xA86B: 0x7537, //CJK UNIFIED IDEOGRAPH
+ 0xA86C: 0x7538, //CJK UNIFIED IDEOGRAPH
+ 0xA86D: 0x7682, //CJK UNIFIED IDEOGRAPH
+ 0xA86E: 0x76EF, //CJK UNIFIED IDEOGRAPH
+ 0xA86F: 0x77E3, //CJK UNIFIED IDEOGRAPH
+ 0xA870: 0x79C1, //CJK UNIFIED IDEOGRAPH
+ 0xA871: 0x79C0, //CJK UNIFIED IDEOGRAPH
+ 0xA872: 0x79BF, //CJK UNIFIED IDEOGRAPH
+ 0xA873: 0x7A76, //CJK UNIFIED IDEOGRAPH
+ 0xA874: 0x7CFB, //CJK UNIFIED IDEOGRAPH
+ 0xA875: 0x7F55, //CJK UNIFIED IDEOGRAPH
+ 0xA876: 0x8096, //CJK UNIFIED IDEOGRAPH
+ 0xA877: 0x8093, //CJK UNIFIED IDEOGRAPH
+ 0xA878: 0x809D, //CJK UNIFIED IDEOGRAPH
+ 0xA879: 0x8098, //CJK UNIFIED IDEOGRAPH
+ 0xA87A: 0x809B, //CJK UNIFIED IDEOGRAPH
+ 0xA87B: 0x809A, //CJK UNIFIED IDEOGRAPH
+ 0xA87C: 0x80B2, //CJK UNIFIED IDEOGRAPH
+ 0xA87D: 0x826F, //CJK UNIFIED IDEOGRAPH
+ 0xA87E: 0x8292, //CJK UNIFIED IDEOGRAPH
+ 0xA8A1: 0x828B, //CJK UNIFIED IDEOGRAPH
+ 0xA8A2: 0x828D, //CJK UNIFIED IDEOGRAPH
+ 0xA8A3: 0x898B, //CJK UNIFIED IDEOGRAPH
+ 0xA8A4: 0x89D2, //CJK UNIFIED IDEOGRAPH
+ 0xA8A5: 0x8A00, //CJK UNIFIED IDEOGRAPH
+ 0xA8A6: 0x8C37, //CJK UNIFIED IDEOGRAPH
+ 0xA8A7: 0x8C46, //CJK UNIFIED IDEOGRAPH
+ 0xA8A8: 0x8C55, //CJK UNIFIED IDEOGRAPH
+ 0xA8A9: 0x8C9D, //CJK UNIFIED IDEOGRAPH
+ 0xA8AA: 0x8D64, //CJK UNIFIED IDEOGRAPH
+ 0xA8AB: 0x8D70, //CJK UNIFIED IDEOGRAPH
+ 0xA8AC: 0x8DB3, //CJK UNIFIED IDEOGRAPH
+ 0xA8AD: 0x8EAB, //CJK UNIFIED IDEOGRAPH
+ 0xA8AE: 0x8ECA, //CJK UNIFIED IDEOGRAPH
+ 0xA8AF: 0x8F9B, //CJK UNIFIED IDEOGRAPH
+ 0xA8B0: 0x8FB0, //CJK UNIFIED IDEOGRAPH
+ 0xA8B1: 0x8FC2, //CJK UNIFIED IDEOGRAPH
+ 0xA8B2: 0x8FC6, //CJK UNIFIED IDEOGRAPH
+ 0xA8B3: 0x8FC5, //CJK UNIFIED IDEOGRAPH
+ 0xA8B4: 0x8FC4, //CJK UNIFIED IDEOGRAPH
+ 0xA8B5: 0x5DE1, //CJK UNIFIED IDEOGRAPH
+ 0xA8B6: 0x9091, //CJK UNIFIED IDEOGRAPH
+ 0xA8B7: 0x90A2, //CJK UNIFIED IDEOGRAPH
+ 0xA8B8: 0x90AA, //CJK UNIFIED IDEOGRAPH
+ 0xA8B9: 0x90A6, //CJK UNIFIED IDEOGRAPH
+ 0xA8BA: 0x90A3, //CJK UNIFIED IDEOGRAPH
+ 0xA8BB: 0x9149, //CJK UNIFIED IDEOGRAPH
+ 0xA8BC: 0x91C6, //CJK UNIFIED IDEOGRAPH
+ 0xA8BD: 0x91CC, //CJK UNIFIED IDEOGRAPH
+ 0xA8BE: 0x9632, //CJK UNIFIED IDEOGRAPH
+ 0xA8BF: 0x962E, //CJK UNIFIED IDEOGRAPH
+ 0xA8C0: 0x9631, //CJK UNIFIED IDEOGRAPH
+ 0xA8C1: 0x962A, //CJK UNIFIED IDEOGRAPH
+ 0xA8C2: 0x962C, //CJK UNIFIED IDEOGRAPH
+ 0xA8C3: 0x4E26, //CJK UNIFIED IDEOGRAPH
+ 0xA8C4: 0x4E56, //CJK UNIFIED IDEOGRAPH
+ 0xA8C5: 0x4E73, //CJK UNIFIED IDEOGRAPH
+ 0xA8C6: 0x4E8B, //CJK UNIFIED IDEOGRAPH
+ 0xA8C7: 0x4E9B, //CJK UNIFIED IDEOGRAPH
+ 0xA8C8: 0x4E9E, //CJK UNIFIED IDEOGRAPH
+ 0xA8C9: 0x4EAB, //CJK UNIFIED IDEOGRAPH
+ 0xA8CA: 0x4EAC, //CJK UNIFIED IDEOGRAPH
+ 0xA8CB: 0x4F6F, //CJK UNIFIED IDEOGRAPH
+ 0xA8CC: 0x4F9D, //CJK UNIFIED IDEOGRAPH
+ 0xA8CD: 0x4F8D, //CJK UNIFIED IDEOGRAPH
+ 0xA8CE: 0x4F73, //CJK UNIFIED IDEOGRAPH
+ 0xA8CF: 0x4F7F, //CJK UNIFIED IDEOGRAPH
+ 0xA8D0: 0x4F6C, //CJK UNIFIED IDEOGRAPH
+ 0xA8D1: 0x4F9B, //CJK UNIFIED IDEOGRAPH
+ 0xA8D2: 0x4F8B, //CJK UNIFIED IDEOGRAPH
+ 0xA8D3: 0x4F86, //CJK UNIFIED IDEOGRAPH
+ 0xA8D4: 0x4F83, //CJK UNIFIED IDEOGRAPH
+ 0xA8D5: 0x4F70, //CJK UNIFIED IDEOGRAPH
+ 0xA8D6: 0x4F75, //CJK UNIFIED IDEOGRAPH
+ 0xA8D7: 0x4F88, //CJK UNIFIED IDEOGRAPH
+ 0xA8D8: 0x4F69, //CJK UNIFIED IDEOGRAPH
+ 0xA8D9: 0x4F7B, //CJK UNIFIED IDEOGRAPH
+ 0xA8DA: 0x4F96, //CJK UNIFIED IDEOGRAPH
+ 0xA8DB: 0x4F7E, //CJK UNIFIED IDEOGRAPH
+ 0xA8DC: 0x4F8F, //CJK UNIFIED IDEOGRAPH
+ 0xA8DD: 0x4F91, //CJK UNIFIED IDEOGRAPH
+ 0xA8DE: 0x4F7A, //CJK UNIFIED IDEOGRAPH
+ 0xA8DF: 0x5154, //CJK UNIFIED IDEOGRAPH
+ 0xA8E0: 0x5152, //CJK UNIFIED IDEOGRAPH
+ 0xA8E1: 0x5155, //CJK UNIFIED IDEOGRAPH
+ 0xA8E2: 0x5169, //CJK UNIFIED IDEOGRAPH
+ 0xA8E3: 0x5177, //CJK UNIFIED IDEOGRAPH
+ 0xA8E4: 0x5176, //CJK UNIFIED IDEOGRAPH
+ 0xA8E5: 0x5178, //CJK UNIFIED IDEOGRAPH
+ 0xA8E6: 0x51BD, //CJK UNIFIED IDEOGRAPH
+ 0xA8E7: 0x51FD, //CJK UNIFIED IDEOGRAPH
+ 0xA8E8: 0x523B, //CJK UNIFIED IDEOGRAPH
+ 0xA8E9: 0x5238, //CJK UNIFIED IDEOGRAPH
+ 0xA8EA: 0x5237, //CJK UNIFIED IDEOGRAPH
+ 0xA8EB: 0x523A, //CJK UNIFIED IDEOGRAPH
+ 0xA8EC: 0x5230, //CJK UNIFIED IDEOGRAPH
+ 0xA8ED: 0x522E, //CJK UNIFIED IDEOGRAPH
+ 0xA8EE: 0x5236, //CJK UNIFIED IDEOGRAPH
+ 0xA8EF: 0x5241, //CJK UNIFIED IDEOGRAPH
+ 0xA8F0: 0x52BE, //CJK UNIFIED IDEOGRAPH
+ 0xA8F1: 0x52BB, //CJK UNIFIED IDEOGRAPH
+ 0xA8F2: 0x5352, //CJK UNIFIED IDEOGRAPH
+ 0xA8F3: 0x5354, //CJK UNIFIED IDEOGRAPH
+ 0xA8F4: 0x5353, //CJK UNIFIED IDEOGRAPH
+ 0xA8F5: 0x5351, //CJK UNIFIED IDEOGRAPH
+ 0xA8F6: 0x5366, //CJK UNIFIED IDEOGRAPH
+ 0xA8F7: 0x5377, //CJK UNIFIED IDEOGRAPH
+ 0xA8F8: 0x5378, //CJK UNIFIED IDEOGRAPH
+ 0xA8F9: 0x5379, //CJK UNIFIED IDEOGRAPH
+ 0xA8FA: 0x53D6, //CJK UNIFIED IDEOGRAPH
+ 0xA8FB: 0x53D4, //CJK UNIFIED IDEOGRAPH
+ 0xA8FC: 0x53D7, //CJK UNIFIED IDEOGRAPH
+ 0xA8FD: 0x5473, //CJK UNIFIED IDEOGRAPH
+ 0xA8FE: 0x5475, //CJK UNIFIED IDEOGRAPH
+ 0xA940: 0x5496, //CJK UNIFIED IDEOGRAPH
+ 0xA941: 0x5478, //CJK UNIFIED IDEOGRAPH
+ 0xA942: 0x5495, //CJK UNIFIED IDEOGRAPH
+ 0xA943: 0x5480, //CJK UNIFIED IDEOGRAPH
+ 0xA944: 0x547B, //CJK UNIFIED IDEOGRAPH
+ 0xA945: 0x5477, //CJK UNIFIED IDEOGRAPH
+ 0xA946: 0x5484, //CJK UNIFIED IDEOGRAPH
+ 0xA947: 0x5492, //CJK UNIFIED IDEOGRAPH
+ 0xA948: 0x5486, //CJK UNIFIED IDEOGRAPH
+ 0xA949: 0x547C, //CJK UNIFIED IDEOGRAPH
+ 0xA94A: 0x5490, //CJK UNIFIED IDEOGRAPH
+ 0xA94B: 0x5471, //CJK UNIFIED IDEOGRAPH
+ 0xA94C: 0x5476, //CJK UNIFIED IDEOGRAPH
+ 0xA94D: 0x548C, //CJK UNIFIED IDEOGRAPH
+ 0xA94E: 0x549A, //CJK UNIFIED IDEOGRAPH
+ 0xA94F: 0x5462, //CJK UNIFIED IDEOGRAPH
+ 0xA950: 0x5468, //CJK UNIFIED IDEOGRAPH
+ 0xA951: 0x548B, //CJK UNIFIED IDEOGRAPH
+ 0xA952: 0x547D, //CJK UNIFIED IDEOGRAPH
+ 0xA953: 0x548E, //CJK UNIFIED IDEOGRAPH
+ 0xA954: 0x56FA, //CJK UNIFIED IDEOGRAPH
+ 0xA955: 0x5783, //CJK UNIFIED IDEOGRAPH
+ 0xA956: 0x5777, //CJK UNIFIED IDEOGRAPH
+ 0xA957: 0x576A, //CJK UNIFIED IDEOGRAPH
+ 0xA958: 0x5769, //CJK UNIFIED IDEOGRAPH
+ 0xA959: 0x5761, //CJK UNIFIED IDEOGRAPH
+ 0xA95A: 0x5766, //CJK UNIFIED IDEOGRAPH
+ 0xA95B: 0x5764, //CJK UNIFIED IDEOGRAPH
+ 0xA95C: 0x577C, //CJK UNIFIED IDEOGRAPH
+ 0xA95D: 0x591C, //CJK UNIFIED IDEOGRAPH
+ 0xA95E: 0x5949, //CJK UNIFIED IDEOGRAPH
+ 0xA95F: 0x5947, //CJK UNIFIED IDEOGRAPH
+ 0xA960: 0x5948, //CJK UNIFIED IDEOGRAPH
+ 0xA961: 0x5944, //CJK UNIFIED IDEOGRAPH
+ 0xA962: 0x5954, //CJK UNIFIED IDEOGRAPH
+ 0xA963: 0x59BE, //CJK UNIFIED IDEOGRAPH
+ 0xA964: 0x59BB, //CJK UNIFIED IDEOGRAPH
+ 0xA965: 0x59D4, //CJK UNIFIED IDEOGRAPH
+ 0xA966: 0x59B9, //CJK UNIFIED IDEOGRAPH
+ 0xA967: 0x59AE, //CJK UNIFIED IDEOGRAPH
+ 0xA968: 0x59D1, //CJK UNIFIED IDEOGRAPH
+ 0xA969: 0x59C6, //CJK UNIFIED IDEOGRAPH
+ 0xA96A: 0x59D0, //CJK UNIFIED IDEOGRAPH
+ 0xA96B: 0x59CD, //CJK UNIFIED IDEOGRAPH
+ 0xA96C: 0x59CB, //CJK UNIFIED IDEOGRAPH
+ 0xA96D: 0x59D3, //CJK UNIFIED IDEOGRAPH
+ 0xA96E: 0x59CA, //CJK UNIFIED IDEOGRAPH
+ 0xA96F: 0x59AF, //CJK UNIFIED IDEOGRAPH
+ 0xA970: 0x59B3, //CJK UNIFIED IDEOGRAPH
+ 0xA971: 0x59D2, //CJK UNIFIED IDEOGRAPH
+ 0xA972: 0x59C5, //CJK UNIFIED IDEOGRAPH
+ 0xA973: 0x5B5F, //CJK UNIFIED IDEOGRAPH
+ 0xA974: 0x5B64, //CJK UNIFIED IDEOGRAPH
+ 0xA975: 0x5B63, //CJK UNIFIED IDEOGRAPH
+ 0xA976: 0x5B97, //CJK UNIFIED IDEOGRAPH
+ 0xA977: 0x5B9A, //CJK UNIFIED IDEOGRAPH
+ 0xA978: 0x5B98, //CJK UNIFIED IDEOGRAPH
+ 0xA979: 0x5B9C, //CJK UNIFIED IDEOGRAPH
+ 0xA97A: 0x5B99, //CJK UNIFIED IDEOGRAPH
+ 0xA97B: 0x5B9B, //CJK UNIFIED IDEOGRAPH
+ 0xA97C: 0x5C1A, //CJK UNIFIED IDEOGRAPH
+ 0xA97D: 0x5C48, //CJK UNIFIED IDEOGRAPH
+ 0xA97E: 0x5C45, //CJK UNIFIED IDEOGRAPH
+ 0xA9A1: 0x5C46, //CJK UNIFIED IDEOGRAPH
+ 0xA9A2: 0x5CB7, //CJK UNIFIED IDEOGRAPH
+ 0xA9A3: 0x5CA1, //CJK UNIFIED IDEOGRAPH
+ 0xA9A4: 0x5CB8, //CJK UNIFIED IDEOGRAPH
+ 0xA9A5: 0x5CA9, //CJK UNIFIED IDEOGRAPH
+ 0xA9A6: 0x5CAB, //CJK UNIFIED IDEOGRAPH
+ 0xA9A7: 0x5CB1, //CJK UNIFIED IDEOGRAPH
+ 0xA9A8: 0x5CB3, //CJK UNIFIED IDEOGRAPH
+ 0xA9A9: 0x5E18, //CJK UNIFIED IDEOGRAPH
+ 0xA9AA: 0x5E1A, //CJK UNIFIED IDEOGRAPH
+ 0xA9AB: 0x5E16, //CJK UNIFIED IDEOGRAPH
+ 0xA9AC: 0x5E15, //CJK UNIFIED IDEOGRAPH
+ 0xA9AD: 0x5E1B, //CJK UNIFIED IDEOGRAPH
+ 0xA9AE: 0x5E11, //CJK UNIFIED IDEOGRAPH
+ 0xA9AF: 0x5E78, //CJK UNIFIED IDEOGRAPH
+ 0xA9B0: 0x5E9A, //CJK UNIFIED IDEOGRAPH
+ 0xA9B1: 0x5E97, //CJK UNIFIED IDEOGRAPH
+ 0xA9B2: 0x5E9C, //CJK UNIFIED IDEOGRAPH
+ 0xA9B3: 0x5E95, //CJK UNIFIED IDEOGRAPH
+ 0xA9B4: 0x5E96, //CJK UNIFIED IDEOGRAPH
+ 0xA9B5: 0x5EF6, //CJK UNIFIED IDEOGRAPH
+ 0xA9B6: 0x5F26, //CJK UNIFIED IDEOGRAPH
+ 0xA9B7: 0x5F27, //CJK UNIFIED IDEOGRAPH
+ 0xA9B8: 0x5F29, //CJK UNIFIED IDEOGRAPH
+ 0xA9B9: 0x5F80, //CJK UNIFIED IDEOGRAPH
+ 0xA9BA: 0x5F81, //CJK UNIFIED IDEOGRAPH
+ 0xA9BB: 0x5F7F, //CJK UNIFIED IDEOGRAPH
+ 0xA9BC: 0x5F7C, //CJK UNIFIED IDEOGRAPH
+ 0xA9BD: 0x5FDD, //CJK UNIFIED IDEOGRAPH
+ 0xA9BE: 0x5FE0, //CJK UNIFIED IDEOGRAPH
+ 0xA9BF: 0x5FFD, //CJK UNIFIED IDEOGRAPH
+ 0xA9C0: 0x5FF5, //CJK UNIFIED IDEOGRAPH
+ 0xA9C1: 0x5FFF, //CJK UNIFIED IDEOGRAPH
+ 0xA9C2: 0x600F, //CJK UNIFIED IDEOGRAPH
+ 0xA9C3: 0x6014, //CJK UNIFIED IDEOGRAPH
+ 0xA9C4: 0x602F, //CJK UNIFIED IDEOGRAPH
+ 0xA9C5: 0x6035, //CJK UNIFIED IDEOGRAPH
+ 0xA9C6: 0x6016, //CJK UNIFIED IDEOGRAPH
+ 0xA9C7: 0x602A, //CJK UNIFIED IDEOGRAPH
+ 0xA9C8: 0x6015, //CJK UNIFIED IDEOGRAPH
+ 0xA9C9: 0x6021, //CJK UNIFIED IDEOGRAPH
+ 0xA9CA: 0x6027, //CJK UNIFIED IDEOGRAPH
+ 0xA9CB: 0x6029, //CJK UNIFIED IDEOGRAPH
+ 0xA9CC: 0x602B, //CJK UNIFIED IDEOGRAPH
+ 0xA9CD: 0x601B, //CJK UNIFIED IDEOGRAPH
+ 0xA9CE: 0x6216, //CJK UNIFIED IDEOGRAPH
+ 0xA9CF: 0x6215, //CJK UNIFIED IDEOGRAPH
+ 0xA9D0: 0x623F, //CJK UNIFIED IDEOGRAPH
+ 0xA9D1: 0x623E, //CJK UNIFIED IDEOGRAPH
+ 0xA9D2: 0x6240, //CJK UNIFIED IDEOGRAPH
+ 0xA9D3: 0x627F, //CJK UNIFIED IDEOGRAPH
+ 0xA9D4: 0x62C9, //CJK UNIFIED IDEOGRAPH
+ 0xA9D5: 0x62CC, //CJK UNIFIED IDEOGRAPH
+ 0xA9D6: 0x62C4, //CJK UNIFIED IDEOGRAPH
+ 0xA9D7: 0x62BF, //CJK UNIFIED IDEOGRAPH
+ 0xA9D8: 0x62C2, //CJK UNIFIED IDEOGRAPH
+ 0xA9D9: 0x62B9, //CJK UNIFIED IDEOGRAPH
+ 0xA9DA: 0x62D2, //CJK UNIFIED IDEOGRAPH
+ 0xA9DB: 0x62DB, //CJK UNIFIED IDEOGRAPH
+ 0xA9DC: 0x62AB, //CJK UNIFIED IDEOGRAPH
+ 0xA9DD: 0x62D3, //CJK UNIFIED IDEOGRAPH
+ 0xA9DE: 0x62D4, //CJK UNIFIED IDEOGRAPH
+ 0xA9DF: 0x62CB, //CJK UNIFIED IDEOGRAPH
+ 0xA9E0: 0x62C8, //CJK UNIFIED IDEOGRAPH
+ 0xA9E1: 0x62A8, //CJK UNIFIED IDEOGRAPH
+ 0xA9E2: 0x62BD, //CJK UNIFIED IDEOGRAPH
+ 0xA9E3: 0x62BC, //CJK UNIFIED IDEOGRAPH
+ 0xA9E4: 0x62D0, //CJK UNIFIED IDEOGRAPH
+ 0xA9E5: 0x62D9, //CJK UNIFIED IDEOGRAPH
+ 0xA9E6: 0x62C7, //CJK UNIFIED IDEOGRAPH
+ 0xA9E7: 0x62CD, //CJK UNIFIED IDEOGRAPH
+ 0xA9E8: 0x62B5, //CJK UNIFIED IDEOGRAPH
+ 0xA9E9: 0x62DA, //CJK UNIFIED IDEOGRAPH
+ 0xA9EA: 0x62B1, //CJK UNIFIED IDEOGRAPH
+ 0xA9EB: 0x62D8, //CJK UNIFIED IDEOGRAPH
+ 0xA9EC: 0x62D6, //CJK UNIFIED IDEOGRAPH
+ 0xA9ED: 0x62D7, //CJK UNIFIED IDEOGRAPH
+ 0xA9EE: 0x62C6, //CJK UNIFIED IDEOGRAPH
+ 0xA9EF: 0x62AC, //CJK UNIFIED IDEOGRAPH
+ 0xA9F0: 0x62CE, //CJK UNIFIED IDEOGRAPH
+ 0xA9F1: 0x653E, //CJK UNIFIED IDEOGRAPH
+ 0xA9F2: 0x65A7, //CJK UNIFIED IDEOGRAPH
+ 0xA9F3: 0x65BC, //CJK UNIFIED IDEOGRAPH
+ 0xA9F4: 0x65FA, //CJK UNIFIED IDEOGRAPH
+ 0xA9F5: 0x6614, //CJK UNIFIED IDEOGRAPH
+ 0xA9F6: 0x6613, //CJK UNIFIED IDEOGRAPH
+ 0xA9F7: 0x660C, //CJK UNIFIED IDEOGRAPH
+ 0xA9F8: 0x6606, //CJK UNIFIED IDEOGRAPH
+ 0xA9F9: 0x6602, //CJK UNIFIED IDEOGRAPH
+ 0xA9FA: 0x660E, //CJK UNIFIED IDEOGRAPH
+ 0xA9FB: 0x6600, //CJK UNIFIED IDEOGRAPH
+ 0xA9FC: 0x660F, //CJK UNIFIED IDEOGRAPH
+ 0xA9FD: 0x6615, //CJK UNIFIED IDEOGRAPH
+ 0xA9FE: 0x660A, //CJK UNIFIED IDEOGRAPH
+ 0xAA40: 0x6607, //CJK UNIFIED IDEOGRAPH
+ 0xAA41: 0x670D, //CJK UNIFIED IDEOGRAPH
+ 0xAA42: 0x670B, //CJK UNIFIED IDEOGRAPH
+ 0xAA43: 0x676D, //CJK UNIFIED IDEOGRAPH
+ 0xAA44: 0x678B, //CJK UNIFIED IDEOGRAPH
+ 0xAA45: 0x6795, //CJK UNIFIED IDEOGRAPH
+ 0xAA46: 0x6771, //CJK UNIFIED IDEOGRAPH
+ 0xAA47: 0x679C, //CJK UNIFIED IDEOGRAPH
+ 0xAA48: 0x6773, //CJK UNIFIED IDEOGRAPH
+ 0xAA49: 0x6777, //CJK UNIFIED IDEOGRAPH
+ 0xAA4A: 0x6787, //CJK UNIFIED IDEOGRAPH
+ 0xAA4B: 0x679D, //CJK UNIFIED IDEOGRAPH
+ 0xAA4C: 0x6797, //CJK UNIFIED IDEOGRAPH
+ 0xAA4D: 0x676F, //CJK UNIFIED IDEOGRAPH
+ 0xAA4E: 0x6770, //CJK UNIFIED IDEOGRAPH
+ 0xAA4F: 0x677F, //CJK UNIFIED IDEOGRAPH
+ 0xAA50: 0x6789, //CJK UNIFIED IDEOGRAPH
+ 0xAA51: 0x677E, //CJK UNIFIED IDEOGRAPH
+ 0xAA52: 0x6790, //CJK UNIFIED IDEOGRAPH
+ 0xAA53: 0x6775, //CJK UNIFIED IDEOGRAPH
+ 0xAA54: 0x679A, //CJK UNIFIED IDEOGRAPH
+ 0xAA55: 0x6793, //CJK UNIFIED IDEOGRAPH
+ 0xAA56: 0x677C, //CJK UNIFIED IDEOGRAPH
+ 0xAA57: 0x676A, //CJK UNIFIED IDEOGRAPH
+ 0xAA58: 0x6772, //CJK UNIFIED IDEOGRAPH
+ 0xAA59: 0x6B23, //CJK UNIFIED IDEOGRAPH
+ 0xAA5A: 0x6B66, //CJK UNIFIED IDEOGRAPH
+ 0xAA5B: 0x6B67, //CJK UNIFIED IDEOGRAPH
+ 0xAA5C: 0x6B7F, //CJK UNIFIED IDEOGRAPH
+ 0xAA5D: 0x6C13, //CJK UNIFIED IDEOGRAPH
+ 0xAA5E: 0x6C1B, //CJK UNIFIED IDEOGRAPH
+ 0xAA5F: 0x6CE3, //CJK UNIFIED IDEOGRAPH
+ 0xAA60: 0x6CE8, //CJK UNIFIED IDEOGRAPH
+ 0xAA61: 0x6CF3, //CJK UNIFIED IDEOGRAPH
+ 0xAA62: 0x6CB1, //CJK UNIFIED IDEOGRAPH
+ 0xAA63: 0x6CCC, //CJK UNIFIED IDEOGRAPH
+ 0xAA64: 0x6CE5, //CJK UNIFIED IDEOGRAPH
+ 0xAA65: 0x6CB3, //CJK UNIFIED IDEOGRAPH
+ 0xAA66: 0x6CBD, //CJK UNIFIED IDEOGRAPH
+ 0xAA67: 0x6CBE, //CJK UNIFIED IDEOGRAPH
+ 0xAA68: 0x6CBC, //CJK UNIFIED IDEOGRAPH
+ 0xAA69: 0x6CE2, //CJK UNIFIED IDEOGRAPH
+ 0xAA6A: 0x6CAB, //CJK UNIFIED IDEOGRAPH
+ 0xAA6B: 0x6CD5, //CJK UNIFIED IDEOGRAPH
+ 0xAA6C: 0x6CD3, //CJK UNIFIED IDEOGRAPH
+ 0xAA6D: 0x6CB8, //CJK UNIFIED IDEOGRAPH
+ 0xAA6E: 0x6CC4, //CJK UNIFIED IDEOGRAPH
+ 0xAA6F: 0x6CB9, //CJK UNIFIED IDEOGRAPH
+ 0xAA70: 0x6CC1, //CJK UNIFIED IDEOGRAPH
+ 0xAA71: 0x6CAE, //CJK UNIFIED IDEOGRAPH
+ 0xAA72: 0x6CD7, //CJK UNIFIED IDEOGRAPH
+ 0xAA73: 0x6CC5, //CJK UNIFIED IDEOGRAPH
+ 0xAA74: 0x6CF1, //CJK UNIFIED IDEOGRAPH
+ 0xAA75: 0x6CBF, //CJK UNIFIED IDEOGRAPH
+ 0xAA76: 0x6CBB, //CJK UNIFIED IDEOGRAPH
+ 0xAA77: 0x6CE1, //CJK UNIFIED IDEOGRAPH
+ 0xAA78: 0x6CDB, //CJK UNIFIED IDEOGRAPH
+ 0xAA79: 0x6CCA, //CJK UNIFIED IDEOGRAPH
+ 0xAA7A: 0x6CAC, //CJK UNIFIED IDEOGRAPH
+ 0xAA7B: 0x6CEF, //CJK UNIFIED IDEOGRAPH
+ 0xAA7C: 0x6CDC, //CJK UNIFIED IDEOGRAPH
+ 0xAA7D: 0x6CD6, //CJK UNIFIED IDEOGRAPH
+ 0xAA7E: 0x6CE0, //CJK UNIFIED IDEOGRAPH
+ 0xAAA1: 0x7095, //CJK UNIFIED IDEOGRAPH
+ 0xAAA2: 0x708E, //CJK UNIFIED IDEOGRAPH
+ 0xAAA3: 0x7092, //CJK UNIFIED IDEOGRAPH
+ 0xAAA4: 0x708A, //CJK UNIFIED IDEOGRAPH
+ 0xAAA5: 0x7099, //CJK UNIFIED IDEOGRAPH
+ 0xAAA6: 0x722C, //CJK UNIFIED IDEOGRAPH
+ 0xAAA7: 0x722D, //CJK UNIFIED IDEOGRAPH
+ 0xAAA8: 0x7238, //CJK UNIFIED IDEOGRAPH
+ 0xAAA9: 0x7248, //CJK UNIFIED IDEOGRAPH
+ 0xAAAA: 0x7267, //CJK UNIFIED IDEOGRAPH
+ 0xAAAB: 0x7269, //CJK UNIFIED IDEOGRAPH
+ 0xAAAC: 0x72C0, //CJK UNIFIED IDEOGRAPH
+ 0xAAAD: 0x72CE, //CJK UNIFIED IDEOGRAPH
+ 0xAAAE: 0x72D9, //CJK UNIFIED IDEOGRAPH
+ 0xAAAF: 0x72D7, //CJK UNIFIED IDEOGRAPH
+ 0xAAB0: 0x72D0, //CJK UNIFIED IDEOGRAPH
+ 0xAAB1: 0x73A9, //CJK UNIFIED IDEOGRAPH
+ 0xAAB2: 0x73A8, //CJK UNIFIED IDEOGRAPH
+ 0xAAB3: 0x739F, //CJK UNIFIED IDEOGRAPH
+ 0xAAB4: 0x73AB, //CJK UNIFIED IDEOGRAPH
+ 0xAAB5: 0x73A5, //CJK UNIFIED IDEOGRAPH
+ 0xAAB6: 0x753D, //CJK UNIFIED IDEOGRAPH
+ 0xAAB7: 0x759D, //CJK UNIFIED IDEOGRAPH
+ 0xAAB8: 0x7599, //CJK UNIFIED IDEOGRAPH
+ 0xAAB9: 0x759A, //CJK UNIFIED IDEOGRAPH
+ 0xAABA: 0x7684, //CJK UNIFIED IDEOGRAPH
+ 0xAABB: 0x76C2, //CJK UNIFIED IDEOGRAPH
+ 0xAABC: 0x76F2, //CJK UNIFIED IDEOGRAPH
+ 0xAABD: 0x76F4, //CJK UNIFIED IDEOGRAPH
+ 0xAABE: 0x77E5, //CJK UNIFIED IDEOGRAPH
+ 0xAABF: 0x77FD, //CJK UNIFIED IDEOGRAPH
+ 0xAAC0: 0x793E, //CJK UNIFIED IDEOGRAPH
+ 0xAAC1: 0x7940, //CJK UNIFIED IDEOGRAPH
+ 0xAAC2: 0x7941, //CJK UNIFIED IDEOGRAPH
+ 0xAAC3: 0x79C9, //CJK UNIFIED IDEOGRAPH
+ 0xAAC4: 0x79C8, //CJK UNIFIED IDEOGRAPH
+ 0xAAC5: 0x7A7A, //CJK UNIFIED IDEOGRAPH
+ 0xAAC6: 0x7A79, //CJK UNIFIED IDEOGRAPH
+ 0xAAC7: 0x7AFA, //CJK UNIFIED IDEOGRAPH
+ 0xAAC8: 0x7CFE, //CJK UNIFIED IDEOGRAPH
+ 0xAAC9: 0x7F54, //CJK UNIFIED IDEOGRAPH
+ 0xAACA: 0x7F8C, //CJK UNIFIED IDEOGRAPH
+ 0xAACB: 0x7F8B, //CJK UNIFIED IDEOGRAPH
+ 0xAACC: 0x8005, //CJK UNIFIED IDEOGRAPH
+ 0xAACD: 0x80BA, //CJK UNIFIED IDEOGRAPH
+ 0xAACE: 0x80A5, //CJK UNIFIED IDEOGRAPH
+ 0xAACF: 0x80A2, //CJK UNIFIED IDEOGRAPH
+ 0xAAD0: 0x80B1, //CJK UNIFIED IDEOGRAPH
+ 0xAAD1: 0x80A1, //CJK UNIFIED IDEOGRAPH
+ 0xAAD2: 0x80AB, //CJK UNIFIED IDEOGRAPH
+ 0xAAD3: 0x80A9, //CJK UNIFIED IDEOGRAPH
+ 0xAAD4: 0x80B4, //CJK UNIFIED IDEOGRAPH
+ 0xAAD5: 0x80AA, //CJK UNIFIED IDEOGRAPH
+ 0xAAD6: 0x80AF, //CJK UNIFIED IDEOGRAPH
+ 0xAAD7: 0x81E5, //CJK UNIFIED IDEOGRAPH
+ 0xAAD8: 0x81FE, //CJK UNIFIED IDEOGRAPH
+ 0xAAD9: 0x820D, //CJK UNIFIED IDEOGRAPH
+ 0xAADA: 0x82B3, //CJK UNIFIED IDEOGRAPH
+ 0xAADB: 0x829D, //CJK UNIFIED IDEOGRAPH
+ 0xAADC: 0x8299, //CJK UNIFIED IDEOGRAPH
+ 0xAADD: 0x82AD, //CJK UNIFIED IDEOGRAPH
+ 0xAADE: 0x82BD, //CJK UNIFIED IDEOGRAPH
+ 0xAADF: 0x829F, //CJK UNIFIED IDEOGRAPH
+ 0xAAE0: 0x82B9, //CJK UNIFIED IDEOGRAPH
+ 0xAAE1: 0x82B1, //CJK UNIFIED IDEOGRAPH
+ 0xAAE2: 0x82AC, //CJK UNIFIED IDEOGRAPH
+ 0xAAE3: 0x82A5, //CJK UNIFIED IDEOGRAPH
+ 0xAAE4: 0x82AF, //CJK UNIFIED IDEOGRAPH
+ 0xAAE5: 0x82B8, //CJK UNIFIED IDEOGRAPH
+ 0xAAE6: 0x82A3, //CJK UNIFIED IDEOGRAPH
+ 0xAAE7: 0x82B0, //CJK UNIFIED IDEOGRAPH
+ 0xAAE8: 0x82BE, //CJK UNIFIED IDEOGRAPH
+ 0xAAE9: 0x82B7, //CJK UNIFIED IDEOGRAPH
+ 0xAAEA: 0x864E, //CJK UNIFIED IDEOGRAPH
+ 0xAAEB: 0x8671, //CJK UNIFIED IDEOGRAPH
+ 0xAAEC: 0x521D, //CJK UNIFIED IDEOGRAPH
+ 0xAAED: 0x8868, //CJK UNIFIED IDEOGRAPH
+ 0xAAEE: 0x8ECB, //CJK UNIFIED IDEOGRAPH
+ 0xAAEF: 0x8FCE, //CJK UNIFIED IDEOGRAPH
+ 0xAAF0: 0x8FD4, //CJK UNIFIED IDEOGRAPH
+ 0xAAF1: 0x8FD1, //CJK UNIFIED IDEOGRAPH
+ 0xAAF2: 0x90B5, //CJK UNIFIED IDEOGRAPH
+ 0xAAF3: 0x90B8, //CJK UNIFIED IDEOGRAPH
+ 0xAAF4: 0x90B1, //CJK UNIFIED IDEOGRAPH
+ 0xAAF5: 0x90B6, //CJK UNIFIED IDEOGRAPH
+ 0xAAF6: 0x91C7, //CJK UNIFIED IDEOGRAPH
+ 0xAAF7: 0x91D1, //CJK UNIFIED IDEOGRAPH
+ 0xAAF8: 0x9577, //CJK UNIFIED IDEOGRAPH
+ 0xAAF9: 0x9580, //CJK UNIFIED IDEOGRAPH
+ 0xAAFA: 0x961C, //CJK UNIFIED IDEOGRAPH
+ 0xAAFB: 0x9640, //CJK UNIFIED IDEOGRAPH
+ 0xAAFC: 0x963F, //CJK UNIFIED IDEOGRAPH
+ 0xAAFD: 0x963B, //CJK UNIFIED IDEOGRAPH
+ 0xAAFE: 0x9644, //CJK UNIFIED IDEOGRAPH
+ 0xAB40: 0x9642, //CJK UNIFIED IDEOGRAPH
+ 0xAB41: 0x96B9, //CJK UNIFIED IDEOGRAPH
+ 0xAB42: 0x96E8, //CJK UNIFIED IDEOGRAPH
+ 0xAB43: 0x9752, //CJK UNIFIED IDEOGRAPH
+ 0xAB44: 0x975E, //CJK UNIFIED IDEOGRAPH
+ 0xAB45: 0x4E9F, //CJK UNIFIED IDEOGRAPH
+ 0xAB46: 0x4EAD, //CJK UNIFIED IDEOGRAPH
+ 0xAB47: 0x4EAE, //CJK UNIFIED IDEOGRAPH
+ 0xAB48: 0x4FE1, //CJK UNIFIED IDEOGRAPH
+ 0xAB49: 0x4FB5, //CJK UNIFIED IDEOGRAPH
+ 0xAB4A: 0x4FAF, //CJK UNIFIED IDEOGRAPH
+ 0xAB4B: 0x4FBF, //CJK UNIFIED IDEOGRAPH
+ 0xAB4C: 0x4FE0, //CJK UNIFIED IDEOGRAPH
+ 0xAB4D: 0x4FD1, //CJK UNIFIED IDEOGRAPH
+ 0xAB4E: 0x4FCF, //CJK UNIFIED IDEOGRAPH
+ 0xAB4F: 0x4FDD, //CJK UNIFIED IDEOGRAPH
+ 0xAB50: 0x4FC3, //CJK UNIFIED IDEOGRAPH
+ 0xAB51: 0x4FB6, //CJK UNIFIED IDEOGRAPH
+ 0xAB52: 0x4FD8, //CJK UNIFIED IDEOGRAPH
+ 0xAB53: 0x4FDF, //CJK UNIFIED IDEOGRAPH
+ 0xAB54: 0x4FCA, //CJK UNIFIED IDEOGRAPH
+ 0xAB55: 0x4FD7, //CJK UNIFIED IDEOGRAPH
+ 0xAB56: 0x4FAE, //CJK UNIFIED IDEOGRAPH
+ 0xAB57: 0x4FD0, //CJK UNIFIED IDEOGRAPH
+ 0xAB58: 0x4FC4, //CJK UNIFIED IDEOGRAPH
+ 0xAB59: 0x4FC2, //CJK UNIFIED IDEOGRAPH
+ 0xAB5A: 0x4FDA, //CJK UNIFIED IDEOGRAPH
+ 0xAB5B: 0x4FCE, //CJK UNIFIED IDEOGRAPH
+ 0xAB5C: 0x4FDE, //CJK UNIFIED IDEOGRAPH
+ 0xAB5D: 0x4FB7, //CJK UNIFIED IDEOGRAPH
+ 0xAB5E: 0x5157, //CJK UNIFIED IDEOGRAPH
+ 0xAB5F: 0x5192, //CJK UNIFIED IDEOGRAPH
+ 0xAB60: 0x5191, //CJK UNIFIED IDEOGRAPH
+ 0xAB61: 0x51A0, //CJK UNIFIED IDEOGRAPH
+ 0xAB62: 0x524E, //CJK UNIFIED IDEOGRAPH
+ 0xAB63: 0x5243, //CJK UNIFIED IDEOGRAPH
+ 0xAB64: 0x524A, //CJK UNIFIED IDEOGRAPH
+ 0xAB65: 0x524D, //CJK UNIFIED IDEOGRAPH
+ 0xAB66: 0x524C, //CJK UNIFIED IDEOGRAPH
+ 0xAB67: 0x524B, //CJK UNIFIED IDEOGRAPH
+ 0xAB68: 0x5247, //CJK UNIFIED IDEOGRAPH
+ 0xAB69: 0x52C7, //CJK UNIFIED IDEOGRAPH
+ 0xAB6A: 0x52C9, //CJK UNIFIED IDEOGRAPH
+ 0xAB6B: 0x52C3, //CJK UNIFIED IDEOGRAPH
+ 0xAB6C: 0x52C1, //CJK UNIFIED IDEOGRAPH
+ 0xAB6D: 0x530D, //CJK UNIFIED IDEOGRAPH
+ 0xAB6E: 0x5357, //CJK UNIFIED IDEOGRAPH
+ 0xAB6F: 0x537B, //CJK UNIFIED IDEOGRAPH
+ 0xAB70: 0x539A, //CJK UNIFIED IDEOGRAPH
+ 0xAB71: 0x53DB, //CJK UNIFIED IDEOGRAPH
+ 0xAB72: 0x54AC, //CJK UNIFIED IDEOGRAPH
+ 0xAB73: 0x54C0, //CJK UNIFIED IDEOGRAPH
+ 0xAB74: 0x54A8, //CJK UNIFIED IDEOGRAPH
+ 0xAB75: 0x54CE, //CJK UNIFIED IDEOGRAPH
+ 0xAB76: 0x54C9, //CJK UNIFIED IDEOGRAPH
+ 0xAB77: 0x54B8, //CJK UNIFIED IDEOGRAPH
+ 0xAB78: 0x54A6, //CJK UNIFIED IDEOGRAPH
+ 0xAB79: 0x54B3, //CJK UNIFIED IDEOGRAPH
+ 0xAB7A: 0x54C7, //CJK UNIFIED IDEOGRAPH
+ 0xAB7B: 0x54C2, //CJK UNIFIED IDEOGRAPH
+ 0xAB7C: 0x54BD, //CJK UNIFIED IDEOGRAPH
+ 0xAB7D: 0x54AA, //CJK UNIFIED IDEOGRAPH
+ 0xAB7E: 0x54C1, //CJK UNIFIED IDEOGRAPH
+ 0xABA1: 0x54C4, //CJK UNIFIED IDEOGRAPH
+ 0xABA2: 0x54C8, //CJK UNIFIED IDEOGRAPH
+ 0xABA3: 0x54AF, //CJK UNIFIED IDEOGRAPH
+ 0xABA4: 0x54AB, //CJK UNIFIED IDEOGRAPH
+ 0xABA5: 0x54B1, //CJK UNIFIED IDEOGRAPH
+ 0xABA6: 0x54BB, //CJK UNIFIED IDEOGRAPH
+ 0xABA7: 0x54A9, //CJK UNIFIED IDEOGRAPH
+ 0xABA8: 0x54A7, //CJK UNIFIED IDEOGRAPH
+ 0xABA9: 0x54BF, //CJK UNIFIED IDEOGRAPH
+ 0xABAA: 0x56FF, //CJK UNIFIED IDEOGRAPH
+ 0xABAB: 0x5782, //CJK UNIFIED IDEOGRAPH
+ 0xABAC: 0x578B, //CJK UNIFIED IDEOGRAPH
+ 0xABAD: 0x57A0, //CJK UNIFIED IDEOGRAPH
+ 0xABAE: 0x57A3, //CJK UNIFIED IDEOGRAPH
+ 0xABAF: 0x57A2, //CJK UNIFIED IDEOGRAPH
+ 0xABB0: 0x57CE, //CJK UNIFIED IDEOGRAPH
+ 0xABB1: 0x57AE, //CJK UNIFIED IDEOGRAPH
+ 0xABB2: 0x5793, //CJK UNIFIED IDEOGRAPH
+ 0xABB3: 0x5955, //CJK UNIFIED IDEOGRAPH
+ 0xABB4: 0x5951, //CJK UNIFIED IDEOGRAPH
+ 0xABB5: 0x594F, //CJK UNIFIED IDEOGRAPH
+ 0xABB6: 0x594E, //CJK UNIFIED IDEOGRAPH
+ 0xABB7: 0x5950, //CJK UNIFIED IDEOGRAPH
+ 0xABB8: 0x59DC, //CJK UNIFIED IDEOGRAPH
+ 0xABB9: 0x59D8, //CJK UNIFIED IDEOGRAPH
+ 0xABBA: 0x59FF, //CJK UNIFIED IDEOGRAPH
+ 0xABBB: 0x59E3, //CJK UNIFIED IDEOGRAPH
+ 0xABBC: 0x59E8, //CJK UNIFIED IDEOGRAPH
+ 0xABBD: 0x5A03, //CJK UNIFIED IDEOGRAPH
+ 0xABBE: 0x59E5, //CJK UNIFIED IDEOGRAPH
+ 0xABBF: 0x59EA, //CJK UNIFIED IDEOGRAPH
+ 0xABC0: 0x59DA, //CJK UNIFIED IDEOGRAPH
+ 0xABC1: 0x59E6, //CJK UNIFIED IDEOGRAPH
+ 0xABC2: 0x5A01, //CJK UNIFIED IDEOGRAPH
+ 0xABC3: 0x59FB, //CJK UNIFIED IDEOGRAPH
+ 0xABC4: 0x5B69, //CJK UNIFIED IDEOGRAPH
+ 0xABC5: 0x5BA3, //CJK UNIFIED IDEOGRAPH
+ 0xABC6: 0x5BA6, //CJK UNIFIED IDEOGRAPH
+ 0xABC7: 0x5BA4, //CJK UNIFIED IDEOGRAPH
+ 0xABC8: 0x5BA2, //CJK UNIFIED IDEOGRAPH
+ 0xABC9: 0x5BA5, //CJK UNIFIED IDEOGRAPH
+ 0xABCA: 0x5C01, //CJK UNIFIED IDEOGRAPH
+ 0xABCB: 0x5C4E, //CJK UNIFIED IDEOGRAPH
+ 0xABCC: 0x5C4F, //CJK UNIFIED IDEOGRAPH
+ 0xABCD: 0x5C4D, //CJK UNIFIED IDEOGRAPH
+ 0xABCE: 0x5C4B, //CJK UNIFIED IDEOGRAPH
+ 0xABCF: 0x5CD9, //CJK UNIFIED IDEOGRAPH
+ 0xABD0: 0x5CD2, //CJK UNIFIED IDEOGRAPH
+ 0xABD1: 0x5DF7, //CJK UNIFIED IDEOGRAPH
+ 0xABD2: 0x5E1D, //CJK UNIFIED IDEOGRAPH
+ 0xABD3: 0x5E25, //CJK UNIFIED IDEOGRAPH
+ 0xABD4: 0x5E1F, //CJK UNIFIED IDEOGRAPH
+ 0xABD5: 0x5E7D, //CJK UNIFIED IDEOGRAPH
+ 0xABD6: 0x5EA0, //CJK UNIFIED IDEOGRAPH
+ 0xABD7: 0x5EA6, //CJK UNIFIED IDEOGRAPH
+ 0xABD8: 0x5EFA, //CJK UNIFIED IDEOGRAPH
+ 0xABD9: 0x5F08, //CJK UNIFIED IDEOGRAPH
+ 0xABDA: 0x5F2D, //CJK UNIFIED IDEOGRAPH
+ 0xABDB: 0x5F65, //CJK UNIFIED IDEOGRAPH
+ 0xABDC: 0x5F88, //CJK UNIFIED IDEOGRAPH
+ 0xABDD: 0x5F85, //CJK UNIFIED IDEOGRAPH
+ 0xABDE: 0x5F8A, //CJK UNIFIED IDEOGRAPH
+ 0xABDF: 0x5F8B, //CJK UNIFIED IDEOGRAPH
+ 0xABE0: 0x5F87, //CJK UNIFIED IDEOGRAPH
+ 0xABE1: 0x5F8C, //CJK UNIFIED IDEOGRAPH
+ 0xABE2: 0x5F89, //CJK UNIFIED IDEOGRAPH
+ 0xABE3: 0x6012, //CJK UNIFIED IDEOGRAPH
+ 0xABE4: 0x601D, //CJK UNIFIED IDEOGRAPH
+ 0xABE5: 0x6020, //CJK UNIFIED IDEOGRAPH
+ 0xABE6: 0x6025, //CJK UNIFIED IDEOGRAPH
+ 0xABE7: 0x600E, //CJK UNIFIED IDEOGRAPH
+ 0xABE8: 0x6028, //CJK UNIFIED IDEOGRAPH
+ 0xABE9: 0x604D, //CJK UNIFIED IDEOGRAPH
+ 0xABEA: 0x6070, //CJK UNIFIED IDEOGRAPH
+ 0xABEB: 0x6068, //CJK UNIFIED IDEOGRAPH
+ 0xABEC: 0x6062, //CJK UNIFIED IDEOGRAPH
+ 0xABED: 0x6046, //CJK UNIFIED IDEOGRAPH
+ 0xABEE: 0x6043, //CJK UNIFIED IDEOGRAPH
+ 0xABEF: 0x606C, //CJK UNIFIED IDEOGRAPH
+ 0xABF0: 0x606B, //CJK UNIFIED IDEOGRAPH
+ 0xABF1: 0x606A, //CJK UNIFIED IDEOGRAPH
+ 0xABF2: 0x6064, //CJK UNIFIED IDEOGRAPH
+ 0xABF3: 0x6241, //CJK UNIFIED IDEOGRAPH
+ 0xABF4: 0x62DC, //CJK UNIFIED IDEOGRAPH
+ 0xABF5: 0x6316, //CJK UNIFIED IDEOGRAPH
+ 0xABF6: 0x6309, //CJK UNIFIED IDEOGRAPH
+ 0xABF7: 0x62FC, //CJK UNIFIED IDEOGRAPH
+ 0xABF8: 0x62ED, //CJK UNIFIED IDEOGRAPH
+ 0xABF9: 0x6301, //CJK UNIFIED IDEOGRAPH
+ 0xABFA: 0x62EE, //CJK UNIFIED IDEOGRAPH
+ 0xABFB: 0x62FD, //CJK UNIFIED IDEOGRAPH
+ 0xABFC: 0x6307, //CJK UNIFIED IDEOGRAPH
+ 0xABFD: 0x62F1, //CJK UNIFIED IDEOGRAPH
+ 0xABFE: 0x62F7, //CJK UNIFIED IDEOGRAPH
+ 0xAC40: 0x62EF, //CJK UNIFIED IDEOGRAPH
+ 0xAC41: 0x62EC, //CJK UNIFIED IDEOGRAPH
+ 0xAC42: 0x62FE, //CJK UNIFIED IDEOGRAPH
+ 0xAC43: 0x62F4, //CJK UNIFIED IDEOGRAPH
+ 0xAC44: 0x6311, //CJK UNIFIED IDEOGRAPH
+ 0xAC45: 0x6302, //CJK UNIFIED IDEOGRAPH
+ 0xAC46: 0x653F, //CJK UNIFIED IDEOGRAPH
+ 0xAC47: 0x6545, //CJK UNIFIED IDEOGRAPH
+ 0xAC48: 0x65AB, //CJK UNIFIED IDEOGRAPH
+ 0xAC49: 0x65BD, //CJK UNIFIED IDEOGRAPH
+ 0xAC4A: 0x65E2, //CJK UNIFIED IDEOGRAPH
+ 0xAC4B: 0x6625, //CJK UNIFIED IDEOGRAPH
+ 0xAC4C: 0x662D, //CJK UNIFIED IDEOGRAPH
+ 0xAC4D: 0x6620, //CJK UNIFIED IDEOGRAPH
+ 0xAC4E: 0x6627, //CJK UNIFIED IDEOGRAPH
+ 0xAC4F: 0x662F, //CJK UNIFIED IDEOGRAPH
+ 0xAC50: 0x661F, //CJK UNIFIED IDEOGRAPH
+ 0xAC51: 0x6628, //CJK UNIFIED IDEOGRAPH
+ 0xAC52: 0x6631, //CJK UNIFIED IDEOGRAPH
+ 0xAC53: 0x6624, //CJK UNIFIED IDEOGRAPH
+ 0xAC54: 0x66F7, //CJK UNIFIED IDEOGRAPH
+ 0xAC55: 0x67FF, //CJK UNIFIED IDEOGRAPH
+ 0xAC56: 0x67D3, //CJK UNIFIED IDEOGRAPH
+ 0xAC57: 0x67F1, //CJK UNIFIED IDEOGRAPH
+ 0xAC58: 0x67D4, //CJK UNIFIED IDEOGRAPH
+ 0xAC59: 0x67D0, //CJK UNIFIED IDEOGRAPH
+ 0xAC5A: 0x67EC, //CJK UNIFIED IDEOGRAPH
+ 0xAC5B: 0x67B6, //CJK UNIFIED IDEOGRAPH
+ 0xAC5C: 0x67AF, //CJK UNIFIED IDEOGRAPH
+ 0xAC5D: 0x67F5, //CJK UNIFIED IDEOGRAPH
+ 0xAC5E: 0x67E9, //CJK UNIFIED IDEOGRAPH
+ 0xAC5F: 0x67EF, //CJK UNIFIED IDEOGRAPH
+ 0xAC60: 0x67C4, //CJK UNIFIED IDEOGRAPH
+ 0xAC61: 0x67D1, //CJK UNIFIED IDEOGRAPH
+ 0xAC62: 0x67B4, //CJK UNIFIED IDEOGRAPH
+ 0xAC63: 0x67DA, //CJK UNIFIED IDEOGRAPH
+ 0xAC64: 0x67E5, //CJK UNIFIED IDEOGRAPH
+ 0xAC65: 0x67B8, //CJK UNIFIED IDEOGRAPH
+ 0xAC66: 0x67CF, //CJK UNIFIED IDEOGRAPH
+ 0xAC67: 0x67DE, //CJK UNIFIED IDEOGRAPH
+ 0xAC68: 0x67F3, //CJK UNIFIED IDEOGRAPH
+ 0xAC69: 0x67B0, //CJK UNIFIED IDEOGRAPH
+ 0xAC6A: 0x67D9, //CJK UNIFIED IDEOGRAPH
+ 0xAC6B: 0x67E2, //CJK UNIFIED IDEOGRAPH
+ 0xAC6C: 0x67DD, //CJK UNIFIED IDEOGRAPH
+ 0xAC6D: 0x67D2, //CJK UNIFIED IDEOGRAPH
+ 0xAC6E: 0x6B6A, //CJK UNIFIED IDEOGRAPH
+ 0xAC6F: 0x6B83, //CJK UNIFIED IDEOGRAPH
+ 0xAC70: 0x6B86, //CJK UNIFIED IDEOGRAPH
+ 0xAC71: 0x6BB5, //CJK UNIFIED IDEOGRAPH
+ 0xAC72: 0x6BD2, //CJK UNIFIED IDEOGRAPH
+ 0xAC73: 0x6BD7, //CJK UNIFIED IDEOGRAPH
+ 0xAC74: 0x6C1F, //CJK UNIFIED IDEOGRAPH
+ 0xAC75: 0x6CC9, //CJK UNIFIED IDEOGRAPH
+ 0xAC76: 0x6D0B, //CJK UNIFIED IDEOGRAPH
+ 0xAC77: 0x6D32, //CJK UNIFIED IDEOGRAPH
+ 0xAC78: 0x6D2A, //CJK UNIFIED IDEOGRAPH
+ 0xAC79: 0x6D41, //CJK UNIFIED IDEOGRAPH
+ 0xAC7A: 0x6D25, //CJK UNIFIED IDEOGRAPH
+ 0xAC7B: 0x6D0C, //CJK UNIFIED IDEOGRAPH
+ 0xAC7C: 0x6D31, //CJK UNIFIED IDEOGRAPH
+ 0xAC7D: 0x6D1E, //CJK UNIFIED IDEOGRAPH
+ 0xAC7E: 0x6D17, //CJK UNIFIED IDEOGRAPH
+ 0xACA1: 0x6D3B, //CJK UNIFIED IDEOGRAPH
+ 0xACA2: 0x6D3D, //CJK UNIFIED IDEOGRAPH
+ 0xACA3: 0x6D3E, //CJK UNIFIED IDEOGRAPH
+ 0xACA4: 0x6D36, //CJK UNIFIED IDEOGRAPH
+ 0xACA5: 0x6D1B, //CJK UNIFIED IDEOGRAPH
+ 0xACA6: 0x6CF5, //CJK UNIFIED IDEOGRAPH
+ 0xACA7: 0x6D39, //CJK UNIFIED IDEOGRAPH
+ 0xACA8: 0x6D27, //CJK UNIFIED IDEOGRAPH
+ 0xACA9: 0x6D38, //CJK UNIFIED IDEOGRAPH
+ 0xACAA: 0x6D29, //CJK UNIFIED IDEOGRAPH
+ 0xACAB: 0x6D2E, //CJK UNIFIED IDEOGRAPH
+ 0xACAC: 0x6D35, //CJK UNIFIED IDEOGRAPH
+ 0xACAD: 0x6D0E, //CJK UNIFIED IDEOGRAPH
+ 0xACAE: 0x6D2B, //CJK UNIFIED IDEOGRAPH
+ 0xACAF: 0x70AB, //CJK UNIFIED IDEOGRAPH
+ 0xACB0: 0x70BA, //CJK UNIFIED IDEOGRAPH
+ 0xACB1: 0x70B3, //CJK UNIFIED IDEOGRAPH
+ 0xACB2: 0x70AC, //CJK UNIFIED IDEOGRAPH
+ 0xACB3: 0x70AF, //CJK UNIFIED IDEOGRAPH
+ 0xACB4: 0x70AD, //CJK UNIFIED IDEOGRAPH
+ 0xACB5: 0x70B8, //CJK UNIFIED IDEOGRAPH
+ 0xACB6: 0x70AE, //CJK UNIFIED IDEOGRAPH
+ 0xACB7: 0x70A4, //CJK UNIFIED IDEOGRAPH
+ 0xACB8: 0x7230, //CJK UNIFIED IDEOGRAPH
+ 0xACB9: 0x7272, //CJK UNIFIED IDEOGRAPH
+ 0xACBA: 0x726F, //CJK UNIFIED IDEOGRAPH
+ 0xACBB: 0x7274, //CJK UNIFIED IDEOGRAPH
+ 0xACBC: 0x72E9, //CJK UNIFIED IDEOGRAPH
+ 0xACBD: 0x72E0, //CJK UNIFIED IDEOGRAPH
+ 0xACBE: 0x72E1, //CJK UNIFIED IDEOGRAPH
+ 0xACBF: 0x73B7, //CJK UNIFIED IDEOGRAPH
+ 0xACC0: 0x73CA, //CJK UNIFIED IDEOGRAPH
+ 0xACC1: 0x73BB, //CJK UNIFIED IDEOGRAPH
+ 0xACC2: 0x73B2, //CJK UNIFIED IDEOGRAPH
+ 0xACC3: 0x73CD, //CJK UNIFIED IDEOGRAPH
+ 0xACC4: 0x73C0, //CJK UNIFIED IDEOGRAPH
+ 0xACC5: 0x73B3, //CJK UNIFIED IDEOGRAPH
+ 0xACC6: 0x751A, //CJK UNIFIED IDEOGRAPH
+ 0xACC7: 0x752D, //CJK UNIFIED IDEOGRAPH
+ 0xACC8: 0x754F, //CJK UNIFIED IDEOGRAPH
+ 0xACC9: 0x754C, //CJK UNIFIED IDEOGRAPH
+ 0xACCA: 0x754E, //CJK UNIFIED IDEOGRAPH
+ 0xACCB: 0x754B, //CJK UNIFIED IDEOGRAPH
+ 0xACCC: 0x75AB, //CJK UNIFIED IDEOGRAPH
+ 0xACCD: 0x75A4, //CJK UNIFIED IDEOGRAPH
+ 0xACCE: 0x75A5, //CJK UNIFIED IDEOGRAPH
+ 0xACCF: 0x75A2, //CJK UNIFIED IDEOGRAPH
+ 0xACD0: 0x75A3, //CJK UNIFIED IDEOGRAPH
+ 0xACD1: 0x7678, //CJK UNIFIED IDEOGRAPH
+ 0xACD2: 0x7686, //CJK UNIFIED IDEOGRAPH
+ 0xACD3: 0x7687, //CJK UNIFIED IDEOGRAPH
+ 0xACD4: 0x7688, //CJK UNIFIED IDEOGRAPH
+ 0xACD5: 0x76C8, //CJK UNIFIED IDEOGRAPH
+ 0xACD6: 0x76C6, //CJK UNIFIED IDEOGRAPH
+ 0xACD7: 0x76C3, //CJK UNIFIED IDEOGRAPH
+ 0xACD8: 0x76C5, //CJK UNIFIED IDEOGRAPH
+ 0xACD9: 0x7701, //CJK UNIFIED IDEOGRAPH
+ 0xACDA: 0x76F9, //CJK UNIFIED IDEOGRAPH
+ 0xACDB: 0x76F8, //CJK UNIFIED IDEOGRAPH
+ 0xACDC: 0x7709, //CJK UNIFIED IDEOGRAPH
+ 0xACDD: 0x770B, //CJK UNIFIED IDEOGRAPH
+ 0xACDE: 0x76FE, //CJK UNIFIED IDEOGRAPH
+ 0xACDF: 0x76FC, //CJK UNIFIED IDEOGRAPH
+ 0xACE0: 0x7707, //CJK UNIFIED IDEOGRAPH
+ 0xACE1: 0x77DC, //CJK UNIFIED IDEOGRAPH
+ 0xACE2: 0x7802, //CJK UNIFIED IDEOGRAPH
+ 0xACE3: 0x7814, //CJK UNIFIED IDEOGRAPH
+ 0xACE4: 0x780C, //CJK UNIFIED IDEOGRAPH
+ 0xACE5: 0x780D, //CJK UNIFIED IDEOGRAPH
+ 0xACE6: 0x7946, //CJK UNIFIED IDEOGRAPH
+ 0xACE7: 0x7949, //CJK UNIFIED IDEOGRAPH
+ 0xACE8: 0x7948, //CJK UNIFIED IDEOGRAPH
+ 0xACE9: 0x7947, //CJK UNIFIED IDEOGRAPH
+ 0xACEA: 0x79B9, //CJK UNIFIED IDEOGRAPH
+ 0xACEB: 0x79BA, //CJK UNIFIED IDEOGRAPH
+ 0xACEC: 0x79D1, //CJK UNIFIED IDEOGRAPH
+ 0xACED: 0x79D2, //CJK UNIFIED IDEOGRAPH
+ 0xACEE: 0x79CB, //CJK UNIFIED IDEOGRAPH
+ 0xACEF: 0x7A7F, //CJK UNIFIED IDEOGRAPH
+ 0xACF0: 0x7A81, //CJK UNIFIED IDEOGRAPH
+ 0xACF1: 0x7AFF, //CJK UNIFIED IDEOGRAPH
+ 0xACF2: 0x7AFD, //CJK UNIFIED IDEOGRAPH
+ 0xACF3: 0x7C7D, //CJK UNIFIED IDEOGRAPH
+ 0xACF4: 0x7D02, //CJK UNIFIED IDEOGRAPH
+ 0xACF5: 0x7D05, //CJK UNIFIED IDEOGRAPH
+ 0xACF6: 0x7D00, //CJK UNIFIED IDEOGRAPH
+ 0xACF7: 0x7D09, //CJK UNIFIED IDEOGRAPH
+ 0xACF8: 0x7D07, //CJK UNIFIED IDEOGRAPH
+ 0xACF9: 0x7D04, //CJK UNIFIED IDEOGRAPH
+ 0xACFA: 0x7D06, //CJK UNIFIED IDEOGRAPH
+ 0xACFB: 0x7F38, //CJK UNIFIED IDEOGRAPH
+ 0xACFC: 0x7F8E, //CJK UNIFIED IDEOGRAPH
+ 0xACFD: 0x7FBF, //CJK UNIFIED IDEOGRAPH
+ 0xACFE: 0x8004, //CJK UNIFIED IDEOGRAPH
+ 0xAD40: 0x8010, //CJK UNIFIED IDEOGRAPH
+ 0xAD41: 0x800D, //CJK UNIFIED IDEOGRAPH
+ 0xAD42: 0x8011, //CJK UNIFIED IDEOGRAPH
+ 0xAD43: 0x8036, //CJK UNIFIED IDEOGRAPH
+ 0xAD44: 0x80D6, //CJK UNIFIED IDEOGRAPH
+ 0xAD45: 0x80E5, //CJK UNIFIED IDEOGRAPH
+ 0xAD46: 0x80DA, //CJK UNIFIED IDEOGRAPH
+ 0xAD47: 0x80C3, //CJK UNIFIED IDEOGRAPH
+ 0xAD48: 0x80C4, //CJK UNIFIED IDEOGRAPH
+ 0xAD49: 0x80CC, //CJK UNIFIED IDEOGRAPH
+ 0xAD4A: 0x80E1, //CJK UNIFIED IDEOGRAPH
+ 0xAD4B: 0x80DB, //CJK UNIFIED IDEOGRAPH
+ 0xAD4C: 0x80CE, //CJK UNIFIED IDEOGRAPH
+ 0xAD4D: 0x80DE, //CJK UNIFIED IDEOGRAPH
+ 0xAD4E: 0x80E4, //CJK UNIFIED IDEOGRAPH
+ 0xAD4F: 0x80DD, //CJK UNIFIED IDEOGRAPH
+ 0xAD50: 0x81F4, //CJK UNIFIED IDEOGRAPH
+ 0xAD51: 0x8222, //CJK UNIFIED IDEOGRAPH
+ 0xAD52: 0x82E7, //CJK UNIFIED IDEOGRAPH
+ 0xAD53: 0x8303, //CJK UNIFIED IDEOGRAPH
+ 0xAD54: 0x8305, //CJK UNIFIED IDEOGRAPH
+ 0xAD55: 0x82E3, //CJK UNIFIED IDEOGRAPH
+ 0xAD56: 0x82DB, //CJK UNIFIED IDEOGRAPH
+ 0xAD57: 0x82E6, //CJK UNIFIED IDEOGRAPH
+ 0xAD58: 0x8304, //CJK UNIFIED IDEOGRAPH
+ 0xAD59: 0x82E5, //CJK UNIFIED IDEOGRAPH
+ 0xAD5A: 0x8302, //CJK UNIFIED IDEOGRAPH
+ 0xAD5B: 0x8309, //CJK UNIFIED IDEOGRAPH
+ 0xAD5C: 0x82D2, //CJK UNIFIED IDEOGRAPH
+ 0xAD5D: 0x82D7, //CJK UNIFIED IDEOGRAPH
+ 0xAD5E: 0x82F1, //CJK UNIFIED IDEOGRAPH
+ 0xAD5F: 0x8301, //CJK UNIFIED IDEOGRAPH
+ 0xAD60: 0x82DC, //CJK UNIFIED IDEOGRAPH
+ 0xAD61: 0x82D4, //CJK UNIFIED IDEOGRAPH
+ 0xAD62: 0x82D1, //CJK UNIFIED IDEOGRAPH
+ 0xAD63: 0x82DE, //CJK UNIFIED IDEOGRAPH
+ 0xAD64: 0x82D3, //CJK UNIFIED IDEOGRAPH
+ 0xAD65: 0x82DF, //CJK UNIFIED IDEOGRAPH
+ 0xAD66: 0x82EF, //CJK UNIFIED IDEOGRAPH
+ 0xAD67: 0x8306, //CJK UNIFIED IDEOGRAPH
+ 0xAD68: 0x8650, //CJK UNIFIED IDEOGRAPH
+ 0xAD69: 0x8679, //CJK UNIFIED IDEOGRAPH
+ 0xAD6A: 0x867B, //CJK UNIFIED IDEOGRAPH
+ 0xAD6B: 0x867A, //CJK UNIFIED IDEOGRAPH
+ 0xAD6C: 0x884D, //CJK UNIFIED IDEOGRAPH
+ 0xAD6D: 0x886B, //CJK UNIFIED IDEOGRAPH
+ 0xAD6E: 0x8981, //CJK UNIFIED IDEOGRAPH
+ 0xAD6F: 0x89D4, //CJK UNIFIED IDEOGRAPH
+ 0xAD70: 0x8A08, //CJK UNIFIED IDEOGRAPH
+ 0xAD71: 0x8A02, //CJK UNIFIED IDEOGRAPH
+ 0xAD72: 0x8A03, //CJK UNIFIED IDEOGRAPH
+ 0xAD73: 0x8C9E, //CJK UNIFIED IDEOGRAPH
+ 0xAD74: 0x8CA0, //CJK UNIFIED IDEOGRAPH
+ 0xAD75: 0x8D74, //CJK UNIFIED IDEOGRAPH
+ 0xAD76: 0x8D73, //CJK UNIFIED IDEOGRAPH
+ 0xAD77: 0x8DB4, //CJK UNIFIED IDEOGRAPH
+ 0xAD78: 0x8ECD, //CJK UNIFIED IDEOGRAPH
+ 0xAD79: 0x8ECC, //CJK UNIFIED IDEOGRAPH
+ 0xAD7A: 0x8FF0, //CJK UNIFIED IDEOGRAPH
+ 0xAD7B: 0x8FE6, //CJK UNIFIED IDEOGRAPH
+ 0xAD7C: 0x8FE2, //CJK UNIFIED IDEOGRAPH
+ 0xAD7D: 0x8FEA, //CJK UNIFIED IDEOGRAPH
+ 0xAD7E: 0x8FE5, //CJK UNIFIED IDEOGRAPH
+ 0xADA1: 0x8FED, //CJK UNIFIED IDEOGRAPH
+ 0xADA2: 0x8FEB, //CJK UNIFIED IDEOGRAPH
+ 0xADA3: 0x8FE4, //CJK UNIFIED IDEOGRAPH
+ 0xADA4: 0x8FE8, //CJK UNIFIED IDEOGRAPH
+ 0xADA5: 0x90CA, //CJK UNIFIED IDEOGRAPH
+ 0xADA6: 0x90CE, //CJK UNIFIED IDEOGRAPH
+ 0xADA7: 0x90C1, //CJK UNIFIED IDEOGRAPH
+ 0xADA8: 0x90C3, //CJK UNIFIED IDEOGRAPH
+ 0xADA9: 0x914B, //CJK UNIFIED IDEOGRAPH
+ 0xADAA: 0x914A, //CJK UNIFIED IDEOGRAPH
+ 0xADAB: 0x91CD, //CJK UNIFIED IDEOGRAPH
+ 0xADAC: 0x9582, //CJK UNIFIED IDEOGRAPH
+ 0xADAD: 0x9650, //CJK UNIFIED IDEOGRAPH
+ 0xADAE: 0x964B, //CJK UNIFIED IDEOGRAPH
+ 0xADAF: 0x964C, //CJK UNIFIED IDEOGRAPH
+ 0xADB0: 0x964D, //CJK UNIFIED IDEOGRAPH
+ 0xADB1: 0x9762, //CJK UNIFIED IDEOGRAPH
+ 0xADB2: 0x9769, //CJK UNIFIED IDEOGRAPH
+ 0xADB3: 0x97CB, //CJK UNIFIED IDEOGRAPH
+ 0xADB4: 0x97ED, //CJK UNIFIED IDEOGRAPH
+ 0xADB5: 0x97F3, //CJK UNIFIED IDEOGRAPH
+ 0xADB6: 0x9801, //CJK UNIFIED IDEOGRAPH
+ 0xADB7: 0x98A8, //CJK UNIFIED IDEOGRAPH
+ 0xADB8: 0x98DB, //CJK UNIFIED IDEOGRAPH
+ 0xADB9: 0x98DF, //CJK UNIFIED IDEOGRAPH
+ 0xADBA: 0x9996, //CJK UNIFIED IDEOGRAPH
+ 0xADBB: 0x9999, //CJK UNIFIED IDEOGRAPH
+ 0xADBC: 0x4E58, //CJK UNIFIED IDEOGRAPH
+ 0xADBD: 0x4EB3, //CJK UNIFIED IDEOGRAPH
+ 0xADBE: 0x500C, //CJK UNIFIED IDEOGRAPH
+ 0xADBF: 0x500D, //CJK UNIFIED IDEOGRAPH
+ 0xADC0: 0x5023, //CJK UNIFIED IDEOGRAPH
+ 0xADC1: 0x4FEF, //CJK UNIFIED IDEOGRAPH
+ 0xADC2: 0x5026, //CJK UNIFIED IDEOGRAPH
+ 0xADC3: 0x5025, //CJK UNIFIED IDEOGRAPH
+ 0xADC4: 0x4FF8, //CJK UNIFIED IDEOGRAPH
+ 0xADC5: 0x5029, //CJK UNIFIED IDEOGRAPH
+ 0xADC6: 0x5016, //CJK UNIFIED IDEOGRAPH
+ 0xADC7: 0x5006, //CJK UNIFIED IDEOGRAPH
+ 0xADC8: 0x503C, //CJK UNIFIED IDEOGRAPH
+ 0xADC9: 0x501F, //CJK UNIFIED IDEOGRAPH
+ 0xADCA: 0x501A, //CJK UNIFIED IDEOGRAPH
+ 0xADCB: 0x5012, //CJK UNIFIED IDEOGRAPH
+ 0xADCC: 0x5011, //CJK UNIFIED IDEOGRAPH
+ 0xADCD: 0x4FFA, //CJK UNIFIED IDEOGRAPH
+ 0xADCE: 0x5000, //CJK UNIFIED IDEOGRAPH
+ 0xADCF: 0x5014, //CJK UNIFIED IDEOGRAPH
+ 0xADD0: 0x5028, //CJK UNIFIED IDEOGRAPH
+ 0xADD1: 0x4FF1, //CJK UNIFIED IDEOGRAPH
+ 0xADD2: 0x5021, //CJK UNIFIED IDEOGRAPH
+ 0xADD3: 0x500B, //CJK UNIFIED IDEOGRAPH
+ 0xADD4: 0x5019, //CJK UNIFIED IDEOGRAPH
+ 0xADD5: 0x5018, //CJK UNIFIED IDEOGRAPH
+ 0xADD6: 0x4FF3, //CJK UNIFIED IDEOGRAPH
+ 0xADD7: 0x4FEE, //CJK UNIFIED IDEOGRAPH
+ 0xADD8: 0x502D, //CJK UNIFIED IDEOGRAPH
+ 0xADD9: 0x502A, //CJK UNIFIED IDEOGRAPH
+ 0xADDA: 0x4FFE, //CJK UNIFIED IDEOGRAPH
+ 0xADDB: 0x502B, //CJK UNIFIED IDEOGRAPH
+ 0xADDC: 0x5009, //CJK UNIFIED IDEOGRAPH
+ 0xADDD: 0x517C, //CJK UNIFIED IDEOGRAPH
+ 0xADDE: 0x51A4, //CJK UNIFIED IDEOGRAPH
+ 0xADDF: 0x51A5, //CJK UNIFIED IDEOGRAPH
+ 0xADE0: 0x51A2, //CJK UNIFIED IDEOGRAPH
+ 0xADE1: 0x51CD, //CJK UNIFIED IDEOGRAPH
+ 0xADE2: 0x51CC, //CJK UNIFIED IDEOGRAPH
+ 0xADE3: 0x51C6, //CJK UNIFIED IDEOGRAPH
+ 0xADE4: 0x51CB, //CJK UNIFIED IDEOGRAPH
+ 0xADE5: 0x5256, //CJK UNIFIED IDEOGRAPH
+ 0xADE6: 0x525C, //CJK UNIFIED IDEOGRAPH
+ 0xADE7: 0x5254, //CJK UNIFIED IDEOGRAPH
+ 0xADE8: 0x525B, //CJK UNIFIED IDEOGRAPH
+ 0xADE9: 0x525D, //CJK UNIFIED IDEOGRAPH
+ 0xADEA: 0x532A, //CJK UNIFIED IDEOGRAPH
+ 0xADEB: 0x537F, //CJK UNIFIED IDEOGRAPH
+ 0xADEC: 0x539F, //CJK UNIFIED IDEOGRAPH
+ 0xADED: 0x539D, //CJK UNIFIED IDEOGRAPH
+ 0xADEE: 0x53DF, //CJK UNIFIED IDEOGRAPH
+ 0xADEF: 0x54E8, //CJK UNIFIED IDEOGRAPH
+ 0xADF0: 0x5510, //CJK UNIFIED IDEOGRAPH
+ 0xADF1: 0x5501, //CJK UNIFIED IDEOGRAPH
+ 0xADF2: 0x5537, //CJK UNIFIED IDEOGRAPH
+ 0xADF3: 0x54FC, //CJK UNIFIED IDEOGRAPH
+ 0xADF4: 0x54E5, //CJK UNIFIED IDEOGRAPH
+ 0xADF5: 0x54F2, //CJK UNIFIED IDEOGRAPH
+ 0xADF6: 0x5506, //CJK UNIFIED IDEOGRAPH
+ 0xADF7: 0x54FA, //CJK UNIFIED IDEOGRAPH
+ 0xADF8: 0x5514, //CJK UNIFIED IDEOGRAPH
+ 0xADF9: 0x54E9, //CJK UNIFIED IDEOGRAPH
+ 0xADFA: 0x54ED, //CJK UNIFIED IDEOGRAPH
+ 0xADFB: 0x54E1, //CJK UNIFIED IDEOGRAPH
+ 0xADFC: 0x5509, //CJK UNIFIED IDEOGRAPH
+ 0xADFD: 0x54EE, //CJK UNIFIED IDEOGRAPH
+ 0xADFE: 0x54EA, //CJK UNIFIED IDEOGRAPH
+ 0xAE40: 0x54E6, //CJK UNIFIED IDEOGRAPH
+ 0xAE41: 0x5527, //CJK UNIFIED IDEOGRAPH
+ 0xAE42: 0x5507, //CJK UNIFIED IDEOGRAPH
+ 0xAE43: 0x54FD, //CJK UNIFIED IDEOGRAPH
+ 0xAE44: 0x550F, //CJK UNIFIED IDEOGRAPH
+ 0xAE45: 0x5703, //CJK UNIFIED IDEOGRAPH
+ 0xAE46: 0x5704, //CJK UNIFIED IDEOGRAPH
+ 0xAE47: 0x57C2, //CJK UNIFIED IDEOGRAPH
+ 0xAE48: 0x57D4, //CJK UNIFIED IDEOGRAPH
+ 0xAE49: 0x57CB, //CJK UNIFIED IDEOGRAPH
+ 0xAE4A: 0x57C3, //CJK UNIFIED IDEOGRAPH
+ 0xAE4B: 0x5809, //CJK UNIFIED IDEOGRAPH
+ 0xAE4C: 0x590F, //CJK UNIFIED IDEOGRAPH
+ 0xAE4D: 0x5957, //CJK UNIFIED IDEOGRAPH
+ 0xAE4E: 0x5958, //CJK UNIFIED IDEOGRAPH
+ 0xAE4F: 0x595A, //CJK UNIFIED IDEOGRAPH
+ 0xAE50: 0x5A11, //CJK UNIFIED IDEOGRAPH
+ 0xAE51: 0x5A18, //CJK UNIFIED IDEOGRAPH
+ 0xAE52: 0x5A1C, //CJK UNIFIED IDEOGRAPH
+ 0xAE53: 0x5A1F, //CJK UNIFIED IDEOGRAPH
+ 0xAE54: 0x5A1B, //CJK UNIFIED IDEOGRAPH
+ 0xAE55: 0x5A13, //CJK UNIFIED IDEOGRAPH
+ 0xAE56: 0x59EC, //CJK UNIFIED IDEOGRAPH
+ 0xAE57: 0x5A20, //CJK UNIFIED IDEOGRAPH
+ 0xAE58: 0x5A23, //CJK UNIFIED IDEOGRAPH
+ 0xAE59: 0x5A29, //CJK UNIFIED IDEOGRAPH
+ 0xAE5A: 0x5A25, //CJK UNIFIED IDEOGRAPH
+ 0xAE5B: 0x5A0C, //CJK UNIFIED IDEOGRAPH
+ 0xAE5C: 0x5A09, //CJK UNIFIED IDEOGRAPH
+ 0xAE5D: 0x5B6B, //CJK UNIFIED IDEOGRAPH
+ 0xAE5E: 0x5C58, //CJK UNIFIED IDEOGRAPH
+ 0xAE5F: 0x5BB0, //CJK UNIFIED IDEOGRAPH
+ 0xAE60: 0x5BB3, //CJK UNIFIED IDEOGRAPH
+ 0xAE61: 0x5BB6, //CJK UNIFIED IDEOGRAPH
+ 0xAE62: 0x5BB4, //CJK UNIFIED IDEOGRAPH
+ 0xAE63: 0x5BAE, //CJK UNIFIED IDEOGRAPH
+ 0xAE64: 0x5BB5, //CJK UNIFIED IDEOGRAPH
+ 0xAE65: 0x5BB9, //CJK UNIFIED IDEOGRAPH
+ 0xAE66: 0x5BB8, //CJK UNIFIED IDEOGRAPH
+ 0xAE67: 0x5C04, //CJK UNIFIED IDEOGRAPH
+ 0xAE68: 0x5C51, //CJK UNIFIED IDEOGRAPH
+ 0xAE69: 0x5C55, //CJK UNIFIED IDEOGRAPH
+ 0xAE6A: 0x5C50, //CJK UNIFIED IDEOGRAPH
+ 0xAE6B: 0x5CED, //CJK UNIFIED IDEOGRAPH
+ 0xAE6C: 0x5CFD, //CJK UNIFIED IDEOGRAPH
+ 0xAE6D: 0x5CFB, //CJK UNIFIED IDEOGRAPH
+ 0xAE6E: 0x5CEA, //CJK UNIFIED IDEOGRAPH
+ 0xAE6F: 0x5CE8, //CJK UNIFIED IDEOGRAPH
+ 0xAE70: 0x5CF0, //CJK UNIFIED IDEOGRAPH
+ 0xAE71: 0x5CF6, //CJK UNIFIED IDEOGRAPH
+ 0xAE72: 0x5D01, //CJK UNIFIED IDEOGRAPH
+ 0xAE73: 0x5CF4, //CJK UNIFIED IDEOGRAPH
+ 0xAE74: 0x5DEE, //CJK UNIFIED IDEOGRAPH
+ 0xAE75: 0x5E2D, //CJK UNIFIED IDEOGRAPH
+ 0xAE76: 0x5E2B, //CJK UNIFIED IDEOGRAPH
+ 0xAE77: 0x5EAB, //CJK UNIFIED IDEOGRAPH
+ 0xAE78: 0x5EAD, //CJK UNIFIED IDEOGRAPH
+ 0xAE79: 0x5EA7, //CJK UNIFIED IDEOGRAPH
+ 0xAE7A: 0x5F31, //CJK UNIFIED IDEOGRAPH
+ 0xAE7B: 0x5F92, //CJK UNIFIED IDEOGRAPH
+ 0xAE7C: 0x5F91, //CJK UNIFIED IDEOGRAPH
+ 0xAE7D: 0x5F90, //CJK UNIFIED IDEOGRAPH
+ 0xAE7E: 0x6059, //CJK UNIFIED IDEOGRAPH
+ 0xAEA1: 0x6063, //CJK UNIFIED IDEOGRAPH
+ 0xAEA2: 0x6065, //CJK UNIFIED IDEOGRAPH
+ 0xAEA3: 0x6050, //CJK UNIFIED IDEOGRAPH
+ 0xAEA4: 0x6055, //CJK UNIFIED IDEOGRAPH
+ 0xAEA5: 0x606D, //CJK UNIFIED IDEOGRAPH
+ 0xAEA6: 0x6069, //CJK UNIFIED IDEOGRAPH
+ 0xAEA7: 0x606F, //CJK UNIFIED IDEOGRAPH
+ 0xAEA8: 0x6084, //CJK UNIFIED IDEOGRAPH
+ 0xAEA9: 0x609F, //CJK UNIFIED IDEOGRAPH
+ 0xAEAA: 0x609A, //CJK UNIFIED IDEOGRAPH
+ 0xAEAB: 0x608D, //CJK UNIFIED IDEOGRAPH
+ 0xAEAC: 0x6094, //CJK UNIFIED IDEOGRAPH
+ 0xAEAD: 0x608C, //CJK UNIFIED IDEOGRAPH
+ 0xAEAE: 0x6085, //CJK UNIFIED IDEOGRAPH
+ 0xAEAF: 0x6096, //CJK UNIFIED IDEOGRAPH
+ 0xAEB0: 0x6247, //CJK UNIFIED IDEOGRAPH
+ 0xAEB1: 0x62F3, //CJK UNIFIED IDEOGRAPH
+ 0xAEB2: 0x6308, //CJK UNIFIED IDEOGRAPH
+ 0xAEB3: 0x62FF, //CJK UNIFIED IDEOGRAPH
+ 0xAEB4: 0x634E, //CJK UNIFIED IDEOGRAPH
+ 0xAEB5: 0x633E, //CJK UNIFIED IDEOGRAPH
+ 0xAEB6: 0x632F, //CJK UNIFIED IDEOGRAPH
+ 0xAEB7: 0x6355, //CJK UNIFIED IDEOGRAPH
+ 0xAEB8: 0x6342, //CJK UNIFIED IDEOGRAPH
+ 0xAEB9: 0x6346, //CJK UNIFIED IDEOGRAPH
+ 0xAEBA: 0x634F, //CJK UNIFIED IDEOGRAPH
+ 0xAEBB: 0x6349, //CJK UNIFIED IDEOGRAPH
+ 0xAEBC: 0x633A, //CJK UNIFIED IDEOGRAPH
+ 0xAEBD: 0x6350, //CJK UNIFIED IDEOGRAPH
+ 0xAEBE: 0x633D, //CJK UNIFIED IDEOGRAPH
+ 0xAEBF: 0x632A, //CJK UNIFIED IDEOGRAPH
+ 0xAEC0: 0x632B, //CJK UNIFIED IDEOGRAPH
+ 0xAEC1: 0x6328, //CJK UNIFIED IDEOGRAPH
+ 0xAEC2: 0x634D, //CJK UNIFIED IDEOGRAPH
+ 0xAEC3: 0x634C, //CJK UNIFIED IDEOGRAPH
+ 0xAEC4: 0x6548, //CJK UNIFIED IDEOGRAPH
+ 0xAEC5: 0x6549, //CJK UNIFIED IDEOGRAPH
+ 0xAEC6: 0x6599, //CJK UNIFIED IDEOGRAPH
+ 0xAEC7: 0x65C1, //CJK UNIFIED IDEOGRAPH
+ 0xAEC8: 0x65C5, //CJK UNIFIED IDEOGRAPH
+ 0xAEC9: 0x6642, //CJK UNIFIED IDEOGRAPH
+ 0xAECA: 0x6649, //CJK UNIFIED IDEOGRAPH
+ 0xAECB: 0x664F, //CJK UNIFIED IDEOGRAPH
+ 0xAECC: 0x6643, //CJK UNIFIED IDEOGRAPH
+ 0xAECD: 0x6652, //CJK UNIFIED IDEOGRAPH
+ 0xAECE: 0x664C, //CJK UNIFIED IDEOGRAPH
+ 0xAECF: 0x6645, //CJK UNIFIED IDEOGRAPH
+ 0xAED0: 0x6641, //CJK UNIFIED IDEOGRAPH
+ 0xAED1: 0x66F8, //CJK UNIFIED IDEOGRAPH
+ 0xAED2: 0x6714, //CJK UNIFIED IDEOGRAPH
+ 0xAED3: 0x6715, //CJK UNIFIED IDEOGRAPH
+ 0xAED4: 0x6717, //CJK UNIFIED IDEOGRAPH
+ 0xAED5: 0x6821, //CJK UNIFIED IDEOGRAPH
+ 0xAED6: 0x6838, //CJK UNIFIED IDEOGRAPH
+ 0xAED7: 0x6848, //CJK UNIFIED IDEOGRAPH
+ 0xAED8: 0x6846, //CJK UNIFIED IDEOGRAPH
+ 0xAED9: 0x6853, //CJK UNIFIED IDEOGRAPH
+ 0xAEDA: 0x6839, //CJK UNIFIED IDEOGRAPH
+ 0xAEDB: 0x6842, //CJK UNIFIED IDEOGRAPH
+ 0xAEDC: 0x6854, //CJK UNIFIED IDEOGRAPH
+ 0xAEDD: 0x6829, //CJK UNIFIED IDEOGRAPH
+ 0xAEDE: 0x68B3, //CJK UNIFIED IDEOGRAPH
+ 0xAEDF: 0x6817, //CJK UNIFIED IDEOGRAPH
+ 0xAEE0: 0x684C, //CJK UNIFIED IDEOGRAPH
+ 0xAEE1: 0x6851, //CJK UNIFIED IDEOGRAPH
+ 0xAEE2: 0x683D, //CJK UNIFIED IDEOGRAPH
+ 0xAEE3: 0x67F4, //CJK UNIFIED IDEOGRAPH
+ 0xAEE4: 0x6850, //CJK UNIFIED IDEOGRAPH
+ 0xAEE5: 0x6840, //CJK UNIFIED IDEOGRAPH
+ 0xAEE6: 0x683C, //CJK UNIFIED IDEOGRAPH
+ 0xAEE7: 0x6843, //CJK UNIFIED IDEOGRAPH
+ 0xAEE8: 0x682A, //CJK UNIFIED IDEOGRAPH
+ 0xAEE9: 0x6845, //CJK UNIFIED IDEOGRAPH
+ 0xAEEA: 0x6813, //CJK UNIFIED IDEOGRAPH
+ 0xAEEB: 0x6818, //CJK UNIFIED IDEOGRAPH
+ 0xAEEC: 0x6841, //CJK UNIFIED IDEOGRAPH
+ 0xAEED: 0x6B8A, //CJK UNIFIED IDEOGRAPH
+ 0xAEEE: 0x6B89, //CJK UNIFIED IDEOGRAPH
+ 0xAEEF: 0x6BB7, //CJK UNIFIED IDEOGRAPH
+ 0xAEF0: 0x6C23, //CJK UNIFIED IDEOGRAPH
+ 0xAEF1: 0x6C27, //CJK UNIFIED IDEOGRAPH
+ 0xAEF2: 0x6C28, //CJK UNIFIED IDEOGRAPH
+ 0xAEF3: 0x6C26, //CJK UNIFIED IDEOGRAPH
+ 0xAEF4: 0x6C24, //CJK UNIFIED IDEOGRAPH
+ 0xAEF5: 0x6CF0, //CJK UNIFIED IDEOGRAPH
+ 0xAEF6: 0x6D6A, //CJK UNIFIED IDEOGRAPH
+ 0xAEF7: 0x6D95, //CJK UNIFIED IDEOGRAPH
+ 0xAEF8: 0x6D88, //CJK UNIFIED IDEOGRAPH
+ 0xAEF9: 0x6D87, //CJK UNIFIED IDEOGRAPH
+ 0xAEFA: 0x6D66, //CJK UNIFIED IDEOGRAPH
+ 0xAEFB: 0x6D78, //CJK UNIFIED IDEOGRAPH
+ 0xAEFC: 0x6D77, //CJK UNIFIED IDEOGRAPH
+ 0xAEFD: 0x6D59, //CJK UNIFIED IDEOGRAPH
+ 0xAEFE: 0x6D93, //CJK UNIFIED IDEOGRAPH
+ 0xAF40: 0x6D6C, //CJK UNIFIED IDEOGRAPH
+ 0xAF41: 0x6D89, //CJK UNIFIED IDEOGRAPH
+ 0xAF42: 0x6D6E, //CJK UNIFIED IDEOGRAPH
+ 0xAF43: 0x6D5A, //CJK UNIFIED IDEOGRAPH
+ 0xAF44: 0x6D74, //CJK UNIFIED IDEOGRAPH
+ 0xAF45: 0x6D69, //CJK UNIFIED IDEOGRAPH
+ 0xAF46: 0x6D8C, //CJK UNIFIED IDEOGRAPH
+ 0xAF47: 0x6D8A, //CJK UNIFIED IDEOGRAPH
+ 0xAF48: 0x6D79, //CJK UNIFIED IDEOGRAPH
+ 0xAF49: 0x6D85, //CJK UNIFIED IDEOGRAPH
+ 0xAF4A: 0x6D65, //CJK UNIFIED IDEOGRAPH
+ 0xAF4B: 0x6D94, //CJK UNIFIED IDEOGRAPH
+ 0xAF4C: 0x70CA, //CJK UNIFIED IDEOGRAPH
+ 0xAF4D: 0x70D8, //CJK UNIFIED IDEOGRAPH
+ 0xAF4E: 0x70E4, //CJK UNIFIED IDEOGRAPH
+ 0xAF4F: 0x70D9, //CJK UNIFIED IDEOGRAPH
+ 0xAF50: 0x70C8, //CJK UNIFIED IDEOGRAPH
+ 0xAF51: 0x70CF, //CJK UNIFIED IDEOGRAPH
+ 0xAF52: 0x7239, //CJK UNIFIED IDEOGRAPH
+ 0xAF53: 0x7279, //CJK UNIFIED IDEOGRAPH
+ 0xAF54: 0x72FC, //CJK UNIFIED IDEOGRAPH
+ 0xAF55: 0x72F9, //CJK UNIFIED IDEOGRAPH
+ 0xAF56: 0x72FD, //CJK UNIFIED IDEOGRAPH
+ 0xAF57: 0x72F8, //CJK UNIFIED IDEOGRAPH
+ 0xAF58: 0x72F7, //CJK UNIFIED IDEOGRAPH
+ 0xAF59: 0x7386, //CJK UNIFIED IDEOGRAPH
+ 0xAF5A: 0x73ED, //CJK UNIFIED IDEOGRAPH
+ 0xAF5B: 0x7409, //CJK UNIFIED IDEOGRAPH
+ 0xAF5C: 0x73EE, //CJK UNIFIED IDEOGRAPH
+ 0xAF5D: 0x73E0, //CJK UNIFIED IDEOGRAPH
+ 0xAF5E: 0x73EA, //CJK UNIFIED IDEOGRAPH
+ 0xAF5F: 0x73DE, //CJK UNIFIED IDEOGRAPH
+ 0xAF60: 0x7554, //CJK UNIFIED IDEOGRAPH
+ 0xAF61: 0x755D, //CJK UNIFIED IDEOGRAPH
+ 0xAF62: 0x755C, //CJK UNIFIED IDEOGRAPH
+ 0xAF63: 0x755A, //CJK UNIFIED IDEOGRAPH
+ 0xAF64: 0x7559, //CJK UNIFIED IDEOGRAPH
+ 0xAF65: 0x75BE, //CJK UNIFIED IDEOGRAPH
+ 0xAF66: 0x75C5, //CJK UNIFIED IDEOGRAPH
+ 0xAF67: 0x75C7, //CJK UNIFIED IDEOGRAPH
+ 0xAF68: 0x75B2, //CJK UNIFIED IDEOGRAPH
+ 0xAF69: 0x75B3, //CJK UNIFIED IDEOGRAPH
+ 0xAF6A: 0x75BD, //CJK UNIFIED IDEOGRAPH
+ 0xAF6B: 0x75BC, //CJK UNIFIED IDEOGRAPH
+ 0xAF6C: 0x75B9, //CJK UNIFIED IDEOGRAPH
+ 0xAF6D: 0x75C2, //CJK UNIFIED IDEOGRAPH
+ 0xAF6E: 0x75B8, //CJK UNIFIED IDEOGRAPH
+ 0xAF6F: 0x768B, //CJK UNIFIED IDEOGRAPH
+ 0xAF70: 0x76B0, //CJK UNIFIED IDEOGRAPH
+ 0xAF71: 0x76CA, //CJK UNIFIED IDEOGRAPH
+ 0xAF72: 0x76CD, //CJK UNIFIED IDEOGRAPH
+ 0xAF73: 0x76CE, //CJK UNIFIED IDEOGRAPH
+ 0xAF74: 0x7729, //CJK UNIFIED IDEOGRAPH
+ 0xAF75: 0x771F, //CJK UNIFIED IDEOGRAPH
+ 0xAF76: 0x7720, //CJK UNIFIED IDEOGRAPH
+ 0xAF77: 0x7728, //CJK UNIFIED IDEOGRAPH
+ 0xAF78: 0x77E9, //CJK UNIFIED IDEOGRAPH
+ 0xAF79: 0x7830, //CJK UNIFIED IDEOGRAPH
+ 0xAF7A: 0x7827, //CJK UNIFIED IDEOGRAPH
+ 0xAF7B: 0x7838, //CJK UNIFIED IDEOGRAPH
+ 0xAF7C: 0x781D, //CJK UNIFIED IDEOGRAPH
+ 0xAF7D: 0x7834, //CJK UNIFIED IDEOGRAPH
+ 0xAF7E: 0x7837, //CJK UNIFIED IDEOGRAPH
+ 0xAFA1: 0x7825, //CJK UNIFIED IDEOGRAPH
+ 0xAFA2: 0x782D, //CJK UNIFIED IDEOGRAPH
+ 0xAFA3: 0x7820, //CJK UNIFIED IDEOGRAPH
+ 0xAFA4: 0x781F, //CJK UNIFIED IDEOGRAPH
+ 0xAFA5: 0x7832, //CJK UNIFIED IDEOGRAPH
+ 0xAFA6: 0x7955, //CJK UNIFIED IDEOGRAPH
+ 0xAFA7: 0x7950, //CJK UNIFIED IDEOGRAPH
+ 0xAFA8: 0x7960, //CJK UNIFIED IDEOGRAPH
+ 0xAFA9: 0x795F, //CJK UNIFIED IDEOGRAPH
+ 0xAFAA: 0x7956, //CJK UNIFIED IDEOGRAPH
+ 0xAFAB: 0x795E, //CJK UNIFIED IDEOGRAPH
+ 0xAFAC: 0x795D, //CJK UNIFIED IDEOGRAPH
+ 0xAFAD: 0x7957, //CJK UNIFIED IDEOGRAPH
+ 0xAFAE: 0x795A, //CJK UNIFIED IDEOGRAPH
+ 0xAFAF: 0x79E4, //CJK UNIFIED IDEOGRAPH
+ 0xAFB0: 0x79E3, //CJK UNIFIED IDEOGRAPH
+ 0xAFB1: 0x79E7, //CJK UNIFIED IDEOGRAPH
+ 0xAFB2: 0x79DF, //CJK UNIFIED IDEOGRAPH
+ 0xAFB3: 0x79E6, //CJK UNIFIED IDEOGRAPH
+ 0xAFB4: 0x79E9, //CJK UNIFIED IDEOGRAPH
+ 0xAFB5: 0x79D8, //CJK UNIFIED IDEOGRAPH
+ 0xAFB6: 0x7A84, //CJK UNIFIED IDEOGRAPH
+ 0xAFB7: 0x7A88, //CJK UNIFIED IDEOGRAPH
+ 0xAFB8: 0x7AD9, //CJK UNIFIED IDEOGRAPH
+ 0xAFB9: 0x7B06, //CJK UNIFIED IDEOGRAPH
+ 0xAFBA: 0x7B11, //CJK UNIFIED IDEOGRAPH
+ 0xAFBB: 0x7C89, //CJK UNIFIED IDEOGRAPH
+ 0xAFBC: 0x7D21, //CJK UNIFIED IDEOGRAPH
+ 0xAFBD: 0x7D17, //CJK UNIFIED IDEOGRAPH
+ 0xAFBE: 0x7D0B, //CJK UNIFIED IDEOGRAPH
+ 0xAFBF: 0x7D0A, //CJK UNIFIED IDEOGRAPH
+ 0xAFC0: 0x7D20, //CJK UNIFIED IDEOGRAPH
+ 0xAFC1: 0x7D22, //CJK UNIFIED IDEOGRAPH
+ 0xAFC2: 0x7D14, //CJK UNIFIED IDEOGRAPH
+ 0xAFC3: 0x7D10, //CJK UNIFIED IDEOGRAPH
+ 0xAFC4: 0x7D15, //CJK UNIFIED IDEOGRAPH
+ 0xAFC5: 0x7D1A, //CJK UNIFIED IDEOGRAPH
+ 0xAFC6: 0x7D1C, //CJK UNIFIED IDEOGRAPH
+ 0xAFC7: 0x7D0D, //CJK UNIFIED IDEOGRAPH
+ 0xAFC8: 0x7D19, //CJK UNIFIED IDEOGRAPH
+ 0xAFC9: 0x7D1B, //CJK UNIFIED IDEOGRAPH
+ 0xAFCA: 0x7F3A, //CJK UNIFIED IDEOGRAPH
+ 0xAFCB: 0x7F5F, //CJK UNIFIED IDEOGRAPH
+ 0xAFCC: 0x7F94, //CJK UNIFIED IDEOGRAPH
+ 0xAFCD: 0x7FC5, //CJK UNIFIED IDEOGRAPH
+ 0xAFCE: 0x7FC1, //CJK UNIFIED IDEOGRAPH
+ 0xAFCF: 0x8006, //CJK UNIFIED IDEOGRAPH
+ 0xAFD0: 0x8018, //CJK UNIFIED IDEOGRAPH
+ 0xAFD1: 0x8015, //CJK UNIFIED IDEOGRAPH
+ 0xAFD2: 0x8019, //CJK UNIFIED IDEOGRAPH
+ 0xAFD3: 0x8017, //CJK UNIFIED IDEOGRAPH
+ 0xAFD4: 0x803D, //CJK UNIFIED IDEOGRAPH
+ 0xAFD5: 0x803F, //CJK UNIFIED IDEOGRAPH
+ 0xAFD6: 0x80F1, //CJK UNIFIED IDEOGRAPH
+ 0xAFD7: 0x8102, //CJK UNIFIED IDEOGRAPH
+ 0xAFD8: 0x80F0, //CJK UNIFIED IDEOGRAPH
+ 0xAFD9: 0x8105, //CJK UNIFIED IDEOGRAPH
+ 0xAFDA: 0x80ED, //CJK UNIFIED IDEOGRAPH
+ 0xAFDB: 0x80F4, //CJK UNIFIED IDEOGRAPH
+ 0xAFDC: 0x8106, //CJK UNIFIED IDEOGRAPH
+ 0xAFDD: 0x80F8, //CJK UNIFIED IDEOGRAPH
+ 0xAFDE: 0x80F3, //CJK UNIFIED IDEOGRAPH
+ 0xAFDF: 0x8108, //CJK UNIFIED IDEOGRAPH
+ 0xAFE0: 0x80FD, //CJK UNIFIED IDEOGRAPH
+ 0xAFE1: 0x810A, //CJK UNIFIED IDEOGRAPH
+ 0xAFE2: 0x80FC, //CJK UNIFIED IDEOGRAPH
+ 0xAFE3: 0x80EF, //CJK UNIFIED IDEOGRAPH
+ 0xAFE4: 0x81ED, //CJK UNIFIED IDEOGRAPH
+ 0xAFE5: 0x81EC, //CJK UNIFIED IDEOGRAPH
+ 0xAFE6: 0x8200, //CJK UNIFIED IDEOGRAPH
+ 0xAFE7: 0x8210, //CJK UNIFIED IDEOGRAPH
+ 0xAFE8: 0x822A, //CJK UNIFIED IDEOGRAPH
+ 0xAFE9: 0x822B, //CJK UNIFIED IDEOGRAPH
+ 0xAFEA: 0x8228, //CJK UNIFIED IDEOGRAPH
+ 0xAFEB: 0x822C, //CJK UNIFIED IDEOGRAPH
+ 0xAFEC: 0x82BB, //CJK UNIFIED IDEOGRAPH
+ 0xAFED: 0x832B, //CJK UNIFIED IDEOGRAPH
+ 0xAFEE: 0x8352, //CJK UNIFIED IDEOGRAPH
+ 0xAFEF: 0x8354, //CJK UNIFIED IDEOGRAPH
+ 0xAFF0: 0x834A, //CJK UNIFIED IDEOGRAPH
+ 0xAFF1: 0x8338, //CJK UNIFIED IDEOGRAPH
+ 0xAFF2: 0x8350, //CJK UNIFIED IDEOGRAPH
+ 0xAFF3: 0x8349, //CJK UNIFIED IDEOGRAPH
+ 0xAFF4: 0x8335, //CJK UNIFIED IDEOGRAPH
+ 0xAFF5: 0x8334, //CJK UNIFIED IDEOGRAPH
+ 0xAFF6: 0x834F, //CJK UNIFIED IDEOGRAPH
+ 0xAFF7: 0x8332, //CJK UNIFIED IDEOGRAPH
+ 0xAFF8: 0x8339, //CJK UNIFIED IDEOGRAPH
+ 0xAFF9: 0x8336, //CJK UNIFIED IDEOGRAPH
+ 0xAFFA: 0x8317, //CJK UNIFIED IDEOGRAPH
+ 0xAFFB: 0x8340, //CJK UNIFIED IDEOGRAPH
+ 0xAFFC: 0x8331, //CJK UNIFIED IDEOGRAPH
+ 0xAFFD: 0x8328, //CJK UNIFIED IDEOGRAPH
+ 0xAFFE: 0x8343, //CJK UNIFIED IDEOGRAPH
+ 0xB040: 0x8654, //CJK UNIFIED IDEOGRAPH
+ 0xB041: 0x868A, //CJK UNIFIED IDEOGRAPH
+ 0xB042: 0x86AA, //CJK UNIFIED IDEOGRAPH
+ 0xB043: 0x8693, //CJK UNIFIED IDEOGRAPH
+ 0xB044: 0x86A4, //CJK UNIFIED IDEOGRAPH
+ 0xB045: 0x86A9, //CJK UNIFIED IDEOGRAPH
+ 0xB046: 0x868C, //CJK UNIFIED IDEOGRAPH
+ 0xB047: 0x86A3, //CJK UNIFIED IDEOGRAPH
+ 0xB048: 0x869C, //CJK UNIFIED IDEOGRAPH
+ 0xB049: 0x8870, //CJK UNIFIED IDEOGRAPH
+ 0xB04A: 0x8877, //CJK UNIFIED IDEOGRAPH
+ 0xB04B: 0x8881, //CJK UNIFIED IDEOGRAPH
+ 0xB04C: 0x8882, //CJK UNIFIED IDEOGRAPH
+ 0xB04D: 0x887D, //CJK UNIFIED IDEOGRAPH
+ 0xB04E: 0x8879, //CJK UNIFIED IDEOGRAPH
+ 0xB04F: 0x8A18, //CJK UNIFIED IDEOGRAPH
+ 0xB050: 0x8A10, //CJK UNIFIED IDEOGRAPH
+ 0xB051: 0x8A0E, //CJK UNIFIED IDEOGRAPH
+ 0xB052: 0x8A0C, //CJK UNIFIED IDEOGRAPH
+ 0xB053: 0x8A15, //CJK UNIFIED IDEOGRAPH
+ 0xB054: 0x8A0A, //CJK UNIFIED IDEOGRAPH
+ 0xB055: 0x8A17, //CJK UNIFIED IDEOGRAPH
+ 0xB056: 0x8A13, //CJK UNIFIED IDEOGRAPH
+ 0xB057: 0x8A16, //CJK UNIFIED IDEOGRAPH
+ 0xB058: 0x8A0F, //CJK UNIFIED IDEOGRAPH
+ 0xB059: 0x8A11, //CJK UNIFIED IDEOGRAPH
+ 0xB05A: 0x8C48, //CJK UNIFIED IDEOGRAPH
+ 0xB05B: 0x8C7A, //CJK UNIFIED IDEOGRAPH
+ 0xB05C: 0x8C79, //CJK UNIFIED IDEOGRAPH
+ 0xB05D: 0x8CA1, //CJK UNIFIED IDEOGRAPH
+ 0xB05E: 0x8CA2, //CJK UNIFIED IDEOGRAPH
+ 0xB05F: 0x8D77, //CJK UNIFIED IDEOGRAPH
+ 0xB060: 0x8EAC, //CJK UNIFIED IDEOGRAPH
+ 0xB061: 0x8ED2, //CJK UNIFIED IDEOGRAPH
+ 0xB062: 0x8ED4, //CJK UNIFIED IDEOGRAPH
+ 0xB063: 0x8ECF, //CJK UNIFIED IDEOGRAPH
+ 0xB064: 0x8FB1, //CJK UNIFIED IDEOGRAPH
+ 0xB065: 0x9001, //CJK UNIFIED IDEOGRAPH
+ 0xB066: 0x9006, //CJK UNIFIED IDEOGRAPH
+ 0xB067: 0x8FF7, //CJK UNIFIED IDEOGRAPH
+ 0xB068: 0x9000, //CJK UNIFIED IDEOGRAPH
+ 0xB069: 0x8FFA, //CJK UNIFIED IDEOGRAPH
+ 0xB06A: 0x8FF4, //CJK UNIFIED IDEOGRAPH
+ 0xB06B: 0x9003, //CJK UNIFIED IDEOGRAPH
+ 0xB06C: 0x8FFD, //CJK UNIFIED IDEOGRAPH
+ 0xB06D: 0x9005, //CJK UNIFIED IDEOGRAPH
+ 0xB06E: 0x8FF8, //CJK UNIFIED IDEOGRAPH
+ 0xB06F: 0x9095, //CJK UNIFIED IDEOGRAPH
+ 0xB070: 0x90E1, //CJK UNIFIED IDEOGRAPH
+ 0xB071: 0x90DD, //CJK UNIFIED IDEOGRAPH
+ 0xB072: 0x90E2, //CJK UNIFIED IDEOGRAPH
+ 0xB073: 0x9152, //CJK UNIFIED IDEOGRAPH
+ 0xB074: 0x914D, //CJK UNIFIED IDEOGRAPH
+ 0xB075: 0x914C, //CJK UNIFIED IDEOGRAPH
+ 0xB076: 0x91D8, //CJK UNIFIED IDEOGRAPH
+ 0xB077: 0x91DD, //CJK UNIFIED IDEOGRAPH
+ 0xB078: 0x91D7, //CJK UNIFIED IDEOGRAPH
+ 0xB079: 0x91DC, //CJK UNIFIED IDEOGRAPH
+ 0xB07A: 0x91D9, //CJK UNIFIED IDEOGRAPH
+ 0xB07B: 0x9583, //CJK UNIFIED IDEOGRAPH
+ 0xB07C: 0x9662, //CJK UNIFIED IDEOGRAPH
+ 0xB07D: 0x9663, //CJK UNIFIED IDEOGRAPH
+ 0xB07E: 0x9661, //CJK UNIFIED IDEOGRAPH
+ 0xB0A1: 0x965B, //CJK UNIFIED IDEOGRAPH
+ 0xB0A2: 0x965D, //CJK UNIFIED IDEOGRAPH
+ 0xB0A3: 0x9664, //CJK UNIFIED IDEOGRAPH
+ 0xB0A4: 0x9658, //CJK UNIFIED IDEOGRAPH
+ 0xB0A5: 0x965E, //CJK UNIFIED IDEOGRAPH
+ 0xB0A6: 0x96BB, //CJK UNIFIED IDEOGRAPH
+ 0xB0A7: 0x98E2, //CJK UNIFIED IDEOGRAPH
+ 0xB0A8: 0x99AC, //CJK UNIFIED IDEOGRAPH
+ 0xB0A9: 0x9AA8, //CJK UNIFIED IDEOGRAPH
+ 0xB0AA: 0x9AD8, //CJK UNIFIED IDEOGRAPH
+ 0xB0AB: 0x9B25, //CJK UNIFIED IDEOGRAPH
+ 0xB0AC: 0x9B32, //CJK UNIFIED IDEOGRAPH
+ 0xB0AD: 0x9B3C, //CJK UNIFIED IDEOGRAPH
+ 0xB0AE: 0x4E7E, //CJK UNIFIED IDEOGRAPH
+ 0xB0AF: 0x507A, //CJK UNIFIED IDEOGRAPH
+ 0xB0B0: 0x507D, //CJK UNIFIED IDEOGRAPH
+ 0xB0B1: 0x505C, //CJK UNIFIED IDEOGRAPH
+ 0xB0B2: 0x5047, //CJK UNIFIED IDEOGRAPH
+ 0xB0B3: 0x5043, //CJK UNIFIED IDEOGRAPH
+ 0xB0B4: 0x504C, //CJK UNIFIED IDEOGRAPH
+ 0xB0B5: 0x505A, //CJK UNIFIED IDEOGRAPH
+ 0xB0B6: 0x5049, //CJK UNIFIED IDEOGRAPH
+ 0xB0B7: 0x5065, //CJK UNIFIED IDEOGRAPH
+ 0xB0B8: 0x5076, //CJK UNIFIED IDEOGRAPH
+ 0xB0B9: 0x504E, //CJK UNIFIED IDEOGRAPH
+ 0xB0BA: 0x5055, //CJK UNIFIED IDEOGRAPH
+ 0xB0BB: 0x5075, //CJK UNIFIED IDEOGRAPH
+ 0xB0BC: 0x5074, //CJK UNIFIED IDEOGRAPH
+ 0xB0BD: 0x5077, //CJK UNIFIED IDEOGRAPH
+ 0xB0BE: 0x504F, //CJK UNIFIED IDEOGRAPH
+ 0xB0BF: 0x500F, //CJK UNIFIED IDEOGRAPH
+ 0xB0C0: 0x506F, //CJK UNIFIED IDEOGRAPH
+ 0xB0C1: 0x506D, //CJK UNIFIED IDEOGRAPH
+ 0xB0C2: 0x515C, //CJK UNIFIED IDEOGRAPH
+ 0xB0C3: 0x5195, //CJK UNIFIED IDEOGRAPH
+ 0xB0C4: 0x51F0, //CJK UNIFIED IDEOGRAPH
+ 0xB0C5: 0x526A, //CJK UNIFIED IDEOGRAPH
+ 0xB0C6: 0x526F, //CJK UNIFIED IDEOGRAPH
+ 0xB0C7: 0x52D2, //CJK UNIFIED IDEOGRAPH
+ 0xB0C8: 0x52D9, //CJK UNIFIED IDEOGRAPH
+ 0xB0C9: 0x52D8, //CJK UNIFIED IDEOGRAPH
+ 0xB0CA: 0x52D5, //CJK UNIFIED IDEOGRAPH
+ 0xB0CB: 0x5310, //CJK UNIFIED IDEOGRAPH
+ 0xB0CC: 0x530F, //CJK UNIFIED IDEOGRAPH
+ 0xB0CD: 0x5319, //CJK UNIFIED IDEOGRAPH
+ 0xB0CE: 0x533F, //CJK UNIFIED IDEOGRAPH
+ 0xB0CF: 0x5340, //CJK UNIFIED IDEOGRAPH
+ 0xB0D0: 0x533E, //CJK UNIFIED IDEOGRAPH
+ 0xB0D1: 0x53C3, //CJK UNIFIED IDEOGRAPH
+ 0xB0D2: 0x66FC, //CJK UNIFIED IDEOGRAPH
+ 0xB0D3: 0x5546, //CJK UNIFIED IDEOGRAPH
+ 0xB0D4: 0x556A, //CJK UNIFIED IDEOGRAPH
+ 0xB0D5: 0x5566, //CJK UNIFIED IDEOGRAPH
+ 0xB0D6: 0x5544, //CJK UNIFIED IDEOGRAPH
+ 0xB0D7: 0x555E, //CJK UNIFIED IDEOGRAPH
+ 0xB0D8: 0x5561, //CJK UNIFIED IDEOGRAPH
+ 0xB0D9: 0x5543, //CJK UNIFIED IDEOGRAPH
+ 0xB0DA: 0x554A, //CJK UNIFIED IDEOGRAPH
+ 0xB0DB: 0x5531, //CJK UNIFIED IDEOGRAPH
+ 0xB0DC: 0x5556, //CJK UNIFIED IDEOGRAPH
+ 0xB0DD: 0x554F, //CJK UNIFIED IDEOGRAPH
+ 0xB0DE: 0x5555, //CJK UNIFIED IDEOGRAPH
+ 0xB0DF: 0x552F, //CJK UNIFIED IDEOGRAPH
+ 0xB0E0: 0x5564, //CJK UNIFIED IDEOGRAPH
+ 0xB0E1: 0x5538, //CJK UNIFIED IDEOGRAPH
+ 0xB0E2: 0x552E, //CJK UNIFIED IDEOGRAPH
+ 0xB0E3: 0x555C, //CJK UNIFIED IDEOGRAPH
+ 0xB0E4: 0x552C, //CJK UNIFIED IDEOGRAPH
+ 0xB0E5: 0x5563, //CJK UNIFIED IDEOGRAPH
+ 0xB0E6: 0x5533, //CJK UNIFIED IDEOGRAPH
+ 0xB0E7: 0x5541, //CJK UNIFIED IDEOGRAPH
+ 0xB0E8: 0x5557, //CJK UNIFIED IDEOGRAPH
+ 0xB0E9: 0x5708, //CJK UNIFIED IDEOGRAPH
+ 0xB0EA: 0x570B, //CJK UNIFIED IDEOGRAPH
+ 0xB0EB: 0x5709, //CJK UNIFIED IDEOGRAPH
+ 0xB0EC: 0x57DF, //CJK UNIFIED IDEOGRAPH
+ 0xB0ED: 0x5805, //CJK UNIFIED IDEOGRAPH
+ 0xB0EE: 0x580A, //CJK UNIFIED IDEOGRAPH
+ 0xB0EF: 0x5806, //CJK UNIFIED IDEOGRAPH
+ 0xB0F0: 0x57E0, //CJK UNIFIED IDEOGRAPH
+ 0xB0F1: 0x57E4, //CJK UNIFIED IDEOGRAPH
+ 0xB0F2: 0x57FA, //CJK UNIFIED IDEOGRAPH
+ 0xB0F3: 0x5802, //CJK UNIFIED IDEOGRAPH
+ 0xB0F4: 0x5835, //CJK UNIFIED IDEOGRAPH
+ 0xB0F5: 0x57F7, //CJK UNIFIED IDEOGRAPH
+ 0xB0F6: 0x57F9, //CJK UNIFIED IDEOGRAPH
+ 0xB0F7: 0x5920, //CJK UNIFIED IDEOGRAPH
+ 0xB0F8: 0x5962, //CJK UNIFIED IDEOGRAPH
+ 0xB0F9: 0x5A36, //CJK UNIFIED IDEOGRAPH
+ 0xB0FA: 0x5A41, //CJK UNIFIED IDEOGRAPH
+ 0xB0FB: 0x5A49, //CJK UNIFIED IDEOGRAPH
+ 0xB0FC: 0x5A66, //CJK UNIFIED IDEOGRAPH
+ 0xB0FD: 0x5A6A, //CJK UNIFIED IDEOGRAPH
+ 0xB0FE: 0x5A40, //CJK UNIFIED IDEOGRAPH
+ 0xB140: 0x5A3C, //CJK UNIFIED IDEOGRAPH
+ 0xB141: 0x5A62, //CJK UNIFIED IDEOGRAPH
+ 0xB142: 0x5A5A, //CJK UNIFIED IDEOGRAPH
+ 0xB143: 0x5A46, //CJK UNIFIED IDEOGRAPH
+ 0xB144: 0x5A4A, //CJK UNIFIED IDEOGRAPH
+ 0xB145: 0x5B70, //CJK UNIFIED IDEOGRAPH
+ 0xB146: 0x5BC7, //CJK UNIFIED IDEOGRAPH
+ 0xB147: 0x5BC5, //CJK UNIFIED IDEOGRAPH
+ 0xB148: 0x5BC4, //CJK UNIFIED IDEOGRAPH
+ 0xB149: 0x5BC2, //CJK UNIFIED IDEOGRAPH
+ 0xB14A: 0x5BBF, //CJK UNIFIED IDEOGRAPH
+ 0xB14B: 0x5BC6, //CJK UNIFIED IDEOGRAPH
+ 0xB14C: 0x5C09, //CJK UNIFIED IDEOGRAPH
+ 0xB14D: 0x5C08, //CJK UNIFIED IDEOGRAPH
+ 0xB14E: 0x5C07, //CJK UNIFIED IDEOGRAPH
+ 0xB14F: 0x5C60, //CJK UNIFIED IDEOGRAPH
+ 0xB150: 0x5C5C, //CJK UNIFIED IDEOGRAPH
+ 0xB151: 0x5C5D, //CJK UNIFIED IDEOGRAPH
+ 0xB152: 0x5D07, //CJK UNIFIED IDEOGRAPH
+ 0xB153: 0x5D06, //CJK UNIFIED IDEOGRAPH
+ 0xB154: 0x5D0E, //CJK UNIFIED IDEOGRAPH
+ 0xB155: 0x5D1B, //CJK UNIFIED IDEOGRAPH
+ 0xB156: 0x5D16, //CJK UNIFIED IDEOGRAPH
+ 0xB157: 0x5D22, //CJK UNIFIED IDEOGRAPH
+ 0xB158: 0x5D11, //CJK UNIFIED IDEOGRAPH
+ 0xB159: 0x5D29, //CJK UNIFIED IDEOGRAPH
+ 0xB15A: 0x5D14, //CJK UNIFIED IDEOGRAPH
+ 0xB15B: 0x5D19, //CJK UNIFIED IDEOGRAPH
+ 0xB15C: 0x5D24, //CJK UNIFIED IDEOGRAPH
+ 0xB15D: 0x5D27, //CJK UNIFIED IDEOGRAPH
+ 0xB15E: 0x5D17, //CJK UNIFIED IDEOGRAPH
+ 0xB15F: 0x5DE2, //CJK UNIFIED IDEOGRAPH
+ 0xB160: 0x5E38, //CJK UNIFIED IDEOGRAPH
+ 0xB161: 0x5E36, //CJK UNIFIED IDEOGRAPH
+ 0xB162: 0x5E33, //CJK UNIFIED IDEOGRAPH
+ 0xB163: 0x5E37, //CJK UNIFIED IDEOGRAPH
+ 0xB164: 0x5EB7, //CJK UNIFIED IDEOGRAPH
+ 0xB165: 0x5EB8, //CJK UNIFIED IDEOGRAPH
+ 0xB166: 0x5EB6, //CJK UNIFIED IDEOGRAPH
+ 0xB167: 0x5EB5, //CJK UNIFIED IDEOGRAPH
+ 0xB168: 0x5EBE, //CJK UNIFIED IDEOGRAPH
+ 0xB169: 0x5F35, //CJK UNIFIED IDEOGRAPH
+ 0xB16A: 0x5F37, //CJK UNIFIED IDEOGRAPH
+ 0xB16B: 0x5F57, //CJK UNIFIED IDEOGRAPH
+ 0xB16C: 0x5F6C, //CJK UNIFIED IDEOGRAPH
+ 0xB16D: 0x5F69, //CJK UNIFIED IDEOGRAPH
+ 0xB16E: 0x5F6B, //CJK UNIFIED IDEOGRAPH
+ 0xB16F: 0x5F97, //CJK UNIFIED IDEOGRAPH
+ 0xB170: 0x5F99, //CJK UNIFIED IDEOGRAPH
+ 0xB171: 0x5F9E, //CJK UNIFIED IDEOGRAPH
+ 0xB172: 0x5F98, //CJK UNIFIED IDEOGRAPH
+ 0xB173: 0x5FA1, //CJK UNIFIED IDEOGRAPH
+ 0xB174: 0x5FA0, //CJK UNIFIED IDEOGRAPH
+ 0xB175: 0x5F9C, //CJK UNIFIED IDEOGRAPH
+ 0xB176: 0x607F, //CJK UNIFIED IDEOGRAPH
+ 0xB177: 0x60A3, //CJK UNIFIED IDEOGRAPH
+ 0xB178: 0x6089, //CJK UNIFIED IDEOGRAPH
+ 0xB179: 0x60A0, //CJK UNIFIED IDEOGRAPH
+ 0xB17A: 0x60A8, //CJK UNIFIED IDEOGRAPH
+ 0xB17B: 0x60CB, //CJK UNIFIED IDEOGRAPH
+ 0xB17C: 0x60B4, //CJK UNIFIED IDEOGRAPH
+ 0xB17D: 0x60E6, //CJK UNIFIED IDEOGRAPH
+ 0xB17E: 0x60BD, //CJK UNIFIED IDEOGRAPH
+ 0xB1A1: 0x60C5, //CJK UNIFIED IDEOGRAPH
+ 0xB1A2: 0x60BB, //CJK UNIFIED IDEOGRAPH
+ 0xB1A3: 0x60B5, //CJK UNIFIED IDEOGRAPH
+ 0xB1A4: 0x60DC, //CJK UNIFIED IDEOGRAPH
+ 0xB1A5: 0x60BC, //CJK UNIFIED IDEOGRAPH
+ 0xB1A6: 0x60D8, //CJK UNIFIED IDEOGRAPH
+ 0xB1A7: 0x60D5, //CJK UNIFIED IDEOGRAPH
+ 0xB1A8: 0x60C6, //CJK UNIFIED IDEOGRAPH
+ 0xB1A9: 0x60DF, //CJK UNIFIED IDEOGRAPH
+ 0xB1AA: 0x60B8, //CJK UNIFIED IDEOGRAPH
+ 0xB1AB: 0x60DA, //CJK UNIFIED IDEOGRAPH
+ 0xB1AC: 0x60C7, //CJK UNIFIED IDEOGRAPH
+ 0xB1AD: 0x621A, //CJK UNIFIED IDEOGRAPH
+ 0xB1AE: 0x621B, //CJK UNIFIED IDEOGRAPH
+ 0xB1AF: 0x6248, //CJK UNIFIED IDEOGRAPH
+ 0xB1B0: 0x63A0, //CJK UNIFIED IDEOGRAPH
+ 0xB1B1: 0x63A7, //CJK UNIFIED IDEOGRAPH
+ 0xB1B2: 0x6372, //CJK UNIFIED IDEOGRAPH
+ 0xB1B3: 0x6396, //CJK UNIFIED IDEOGRAPH
+ 0xB1B4: 0x63A2, //CJK UNIFIED IDEOGRAPH
+ 0xB1B5: 0x63A5, //CJK UNIFIED IDEOGRAPH
+ 0xB1B6: 0x6377, //CJK UNIFIED IDEOGRAPH
+ 0xB1B7: 0x6367, //CJK UNIFIED IDEOGRAPH
+ 0xB1B8: 0x6398, //CJK UNIFIED IDEOGRAPH
+ 0xB1B9: 0x63AA, //CJK UNIFIED IDEOGRAPH
+ 0xB1BA: 0x6371, //CJK UNIFIED IDEOGRAPH
+ 0xB1BB: 0x63A9, //CJK UNIFIED IDEOGRAPH
+ 0xB1BC: 0x6389, //CJK UNIFIED IDEOGRAPH
+ 0xB1BD: 0x6383, //CJK UNIFIED IDEOGRAPH
+ 0xB1BE: 0x639B, //CJK UNIFIED IDEOGRAPH
+ 0xB1BF: 0x636B, //CJK UNIFIED IDEOGRAPH
+ 0xB1C0: 0x63A8, //CJK UNIFIED IDEOGRAPH
+ 0xB1C1: 0x6384, //CJK UNIFIED IDEOGRAPH
+ 0xB1C2: 0x6388, //CJK UNIFIED IDEOGRAPH
+ 0xB1C3: 0x6399, //CJK UNIFIED IDEOGRAPH
+ 0xB1C4: 0x63A1, //CJK UNIFIED IDEOGRAPH
+ 0xB1C5: 0x63AC, //CJK UNIFIED IDEOGRAPH
+ 0xB1C6: 0x6392, //CJK UNIFIED IDEOGRAPH
+ 0xB1C7: 0x638F, //CJK UNIFIED IDEOGRAPH
+ 0xB1C8: 0x6380, //CJK UNIFIED IDEOGRAPH
+ 0xB1C9: 0x637B, //CJK UNIFIED IDEOGRAPH
+ 0xB1CA: 0x6369, //CJK UNIFIED IDEOGRAPH
+ 0xB1CB: 0x6368, //CJK UNIFIED IDEOGRAPH
+ 0xB1CC: 0x637A, //CJK UNIFIED IDEOGRAPH
+ 0xB1CD: 0x655D, //CJK UNIFIED IDEOGRAPH
+ 0xB1CE: 0x6556, //CJK UNIFIED IDEOGRAPH
+ 0xB1CF: 0x6551, //CJK UNIFIED IDEOGRAPH
+ 0xB1D0: 0x6559, //CJK UNIFIED IDEOGRAPH
+ 0xB1D1: 0x6557, //CJK UNIFIED IDEOGRAPH
+ 0xB1D2: 0x555F, //CJK UNIFIED IDEOGRAPH
+ 0xB1D3: 0x654F, //CJK UNIFIED IDEOGRAPH
+ 0xB1D4: 0x6558, //CJK UNIFIED IDEOGRAPH
+ 0xB1D5: 0x6555, //CJK UNIFIED IDEOGRAPH
+ 0xB1D6: 0x6554, //CJK UNIFIED IDEOGRAPH
+ 0xB1D7: 0x659C, //CJK UNIFIED IDEOGRAPH
+ 0xB1D8: 0x659B, //CJK UNIFIED IDEOGRAPH
+ 0xB1D9: 0x65AC, //CJK UNIFIED IDEOGRAPH
+ 0xB1DA: 0x65CF, //CJK UNIFIED IDEOGRAPH
+ 0xB1DB: 0x65CB, //CJK UNIFIED IDEOGRAPH
+ 0xB1DC: 0x65CC, //CJK UNIFIED IDEOGRAPH
+ 0xB1DD: 0x65CE, //CJK UNIFIED IDEOGRAPH
+ 0xB1DE: 0x665D, //CJK UNIFIED IDEOGRAPH
+ 0xB1DF: 0x665A, //CJK UNIFIED IDEOGRAPH
+ 0xB1E0: 0x6664, //CJK UNIFIED IDEOGRAPH
+ 0xB1E1: 0x6668, //CJK UNIFIED IDEOGRAPH
+ 0xB1E2: 0x6666, //CJK UNIFIED IDEOGRAPH
+ 0xB1E3: 0x665E, //CJK UNIFIED IDEOGRAPH
+ 0xB1E4: 0x66F9, //CJK UNIFIED IDEOGRAPH
+ 0xB1E5: 0x52D7, //CJK UNIFIED IDEOGRAPH
+ 0xB1E6: 0x671B, //CJK UNIFIED IDEOGRAPH
+ 0xB1E7: 0x6881, //CJK UNIFIED IDEOGRAPH
+ 0xB1E8: 0x68AF, //CJK UNIFIED IDEOGRAPH
+ 0xB1E9: 0x68A2, //CJK UNIFIED IDEOGRAPH
+ 0xB1EA: 0x6893, //CJK UNIFIED IDEOGRAPH
+ 0xB1EB: 0x68B5, //CJK UNIFIED IDEOGRAPH
+ 0xB1EC: 0x687F, //CJK UNIFIED IDEOGRAPH
+ 0xB1ED: 0x6876, //CJK UNIFIED IDEOGRAPH
+ 0xB1EE: 0x68B1, //CJK UNIFIED IDEOGRAPH
+ 0xB1EF: 0x68A7, //CJK UNIFIED IDEOGRAPH
+ 0xB1F0: 0x6897, //CJK UNIFIED IDEOGRAPH
+ 0xB1F1: 0x68B0, //CJK UNIFIED IDEOGRAPH
+ 0xB1F2: 0x6883, //CJK UNIFIED IDEOGRAPH
+ 0xB1F3: 0x68C4, //CJK UNIFIED IDEOGRAPH
+ 0xB1F4: 0x68AD, //CJK UNIFIED IDEOGRAPH
+ 0xB1F5: 0x6886, //CJK UNIFIED IDEOGRAPH
+ 0xB1F6: 0x6885, //CJK UNIFIED IDEOGRAPH
+ 0xB1F7: 0x6894, //CJK UNIFIED IDEOGRAPH
+ 0xB1F8: 0x689D, //CJK UNIFIED IDEOGRAPH
+ 0xB1F9: 0x68A8, //CJK UNIFIED IDEOGRAPH
+ 0xB1FA: 0x689F, //CJK UNIFIED IDEOGRAPH
+ 0xB1FB: 0x68A1, //CJK UNIFIED IDEOGRAPH
+ 0xB1FC: 0x6882, //CJK UNIFIED IDEOGRAPH
+ 0xB1FD: 0x6B32, //CJK UNIFIED IDEOGRAPH
+ 0xB1FE: 0x6BBA, //CJK UNIFIED IDEOGRAPH
+ 0xB240: 0x6BEB, //CJK UNIFIED IDEOGRAPH
+ 0xB241: 0x6BEC, //CJK UNIFIED IDEOGRAPH
+ 0xB242: 0x6C2B, //CJK UNIFIED IDEOGRAPH
+ 0xB243: 0x6D8E, //CJK UNIFIED IDEOGRAPH
+ 0xB244: 0x6DBC, //CJK UNIFIED IDEOGRAPH
+ 0xB245: 0x6DF3, //CJK UNIFIED IDEOGRAPH
+ 0xB246: 0x6DD9, //CJK UNIFIED IDEOGRAPH
+ 0xB247: 0x6DB2, //CJK UNIFIED IDEOGRAPH
+ 0xB248: 0x6DE1, //CJK UNIFIED IDEOGRAPH
+ 0xB249: 0x6DCC, //CJK UNIFIED IDEOGRAPH
+ 0xB24A: 0x6DE4, //CJK UNIFIED IDEOGRAPH
+ 0xB24B: 0x6DFB, //CJK UNIFIED IDEOGRAPH
+ 0xB24C: 0x6DFA, //CJK UNIFIED IDEOGRAPH
+ 0xB24D: 0x6E05, //CJK UNIFIED IDEOGRAPH
+ 0xB24E: 0x6DC7, //CJK UNIFIED IDEOGRAPH
+ 0xB24F: 0x6DCB, //CJK UNIFIED IDEOGRAPH
+ 0xB250: 0x6DAF, //CJK UNIFIED IDEOGRAPH
+ 0xB251: 0x6DD1, //CJK UNIFIED IDEOGRAPH
+ 0xB252: 0x6DAE, //CJK UNIFIED IDEOGRAPH
+ 0xB253: 0x6DDE, //CJK UNIFIED IDEOGRAPH
+ 0xB254: 0x6DF9, //CJK UNIFIED IDEOGRAPH
+ 0xB255: 0x6DB8, //CJK UNIFIED IDEOGRAPH
+ 0xB256: 0x6DF7, //CJK UNIFIED IDEOGRAPH
+ 0xB257: 0x6DF5, //CJK UNIFIED IDEOGRAPH
+ 0xB258: 0x6DC5, //CJK UNIFIED IDEOGRAPH
+ 0xB259: 0x6DD2, //CJK UNIFIED IDEOGRAPH
+ 0xB25A: 0x6E1A, //CJK UNIFIED IDEOGRAPH
+ 0xB25B: 0x6DB5, //CJK UNIFIED IDEOGRAPH
+ 0xB25C: 0x6DDA, //CJK UNIFIED IDEOGRAPH
+ 0xB25D: 0x6DEB, //CJK UNIFIED IDEOGRAPH
+ 0xB25E: 0x6DD8, //CJK UNIFIED IDEOGRAPH
+ 0xB25F: 0x6DEA, //CJK UNIFIED IDEOGRAPH
+ 0xB260: 0x6DF1, //CJK UNIFIED IDEOGRAPH
+ 0xB261: 0x6DEE, //CJK UNIFIED IDEOGRAPH
+ 0xB262: 0x6DE8, //CJK UNIFIED IDEOGRAPH
+ 0xB263: 0x6DC6, //CJK UNIFIED IDEOGRAPH
+ 0xB264: 0x6DC4, //CJK UNIFIED IDEOGRAPH
+ 0xB265: 0x6DAA, //CJK UNIFIED IDEOGRAPH
+ 0xB266: 0x6DEC, //CJK UNIFIED IDEOGRAPH
+ 0xB267: 0x6DBF, //CJK UNIFIED IDEOGRAPH
+ 0xB268: 0x6DE6, //CJK UNIFIED IDEOGRAPH
+ 0xB269: 0x70F9, //CJK UNIFIED IDEOGRAPH
+ 0xB26A: 0x7109, //CJK UNIFIED IDEOGRAPH
+ 0xB26B: 0x710A, //CJK UNIFIED IDEOGRAPH
+ 0xB26C: 0x70FD, //CJK UNIFIED IDEOGRAPH
+ 0xB26D: 0x70EF, //CJK UNIFIED IDEOGRAPH
+ 0xB26E: 0x723D, //CJK UNIFIED IDEOGRAPH
+ 0xB26F: 0x727D, //CJK UNIFIED IDEOGRAPH
+ 0xB270: 0x7281, //CJK UNIFIED IDEOGRAPH
+ 0xB271: 0x731C, //CJK UNIFIED IDEOGRAPH
+ 0xB272: 0x731B, //CJK UNIFIED IDEOGRAPH
+ 0xB273: 0x7316, //CJK UNIFIED IDEOGRAPH
+ 0xB274: 0x7313, //CJK UNIFIED IDEOGRAPH
+ 0xB275: 0x7319, //CJK UNIFIED IDEOGRAPH
+ 0xB276: 0x7387, //CJK UNIFIED IDEOGRAPH
+ 0xB277: 0x7405, //CJK UNIFIED IDEOGRAPH
+ 0xB278: 0x740A, //CJK UNIFIED IDEOGRAPH
+ 0xB279: 0x7403, //CJK UNIFIED IDEOGRAPH
+ 0xB27A: 0x7406, //CJK UNIFIED IDEOGRAPH
+ 0xB27B: 0x73FE, //CJK UNIFIED IDEOGRAPH
+ 0xB27C: 0x740D, //CJK UNIFIED IDEOGRAPH
+ 0xB27D: 0x74E0, //CJK UNIFIED IDEOGRAPH
+ 0xB27E: 0x74F6, //CJK UNIFIED IDEOGRAPH
+ 0xB2A1: 0x74F7, //CJK UNIFIED IDEOGRAPH
+ 0xB2A2: 0x751C, //CJK UNIFIED IDEOGRAPH
+ 0xB2A3: 0x7522, //CJK UNIFIED IDEOGRAPH
+ 0xB2A4: 0x7565, //CJK UNIFIED IDEOGRAPH
+ 0xB2A5: 0x7566, //CJK UNIFIED IDEOGRAPH
+ 0xB2A6: 0x7562, //CJK UNIFIED IDEOGRAPH
+ 0xB2A7: 0x7570, //CJK UNIFIED IDEOGRAPH
+ 0xB2A8: 0x758F, //CJK UNIFIED IDEOGRAPH
+ 0xB2A9: 0x75D4, //CJK UNIFIED IDEOGRAPH
+ 0xB2AA: 0x75D5, //CJK UNIFIED IDEOGRAPH
+ 0xB2AB: 0x75B5, //CJK UNIFIED IDEOGRAPH
+ 0xB2AC: 0x75CA, //CJK UNIFIED IDEOGRAPH
+ 0xB2AD: 0x75CD, //CJK UNIFIED IDEOGRAPH
+ 0xB2AE: 0x768E, //CJK UNIFIED IDEOGRAPH
+ 0xB2AF: 0x76D4, //CJK UNIFIED IDEOGRAPH
+ 0xB2B0: 0x76D2, //CJK UNIFIED IDEOGRAPH
+ 0xB2B1: 0x76DB, //CJK UNIFIED IDEOGRAPH
+ 0xB2B2: 0x7737, //CJK UNIFIED IDEOGRAPH
+ 0xB2B3: 0x773E, //CJK UNIFIED IDEOGRAPH
+ 0xB2B4: 0x773C, //CJK UNIFIED IDEOGRAPH
+ 0xB2B5: 0x7736, //CJK UNIFIED IDEOGRAPH
+ 0xB2B6: 0x7738, //CJK UNIFIED IDEOGRAPH
+ 0xB2B7: 0x773A, //CJK UNIFIED IDEOGRAPH
+ 0xB2B8: 0x786B, //CJK UNIFIED IDEOGRAPH
+ 0xB2B9: 0x7843, //CJK UNIFIED IDEOGRAPH
+ 0xB2BA: 0x784E, //CJK UNIFIED IDEOGRAPH
+ 0xB2BB: 0x7965, //CJK UNIFIED IDEOGRAPH
+ 0xB2BC: 0x7968, //CJK UNIFIED IDEOGRAPH
+ 0xB2BD: 0x796D, //CJK UNIFIED IDEOGRAPH
+ 0xB2BE: 0x79FB, //CJK UNIFIED IDEOGRAPH
+ 0xB2BF: 0x7A92, //CJK UNIFIED IDEOGRAPH
+ 0xB2C0: 0x7A95, //CJK UNIFIED IDEOGRAPH
+ 0xB2C1: 0x7B20, //CJK UNIFIED IDEOGRAPH
+ 0xB2C2: 0x7B28, //CJK UNIFIED IDEOGRAPH
+ 0xB2C3: 0x7B1B, //CJK UNIFIED IDEOGRAPH
+ 0xB2C4: 0x7B2C, //CJK UNIFIED IDEOGRAPH
+ 0xB2C5: 0x7B26, //CJK UNIFIED IDEOGRAPH
+ 0xB2C6: 0x7B19, //CJK UNIFIED IDEOGRAPH
+ 0xB2C7: 0x7B1E, //CJK UNIFIED IDEOGRAPH
+ 0xB2C8: 0x7B2E, //CJK UNIFIED IDEOGRAPH
+ 0xB2C9: 0x7C92, //CJK UNIFIED IDEOGRAPH
+ 0xB2CA: 0x7C97, //CJK UNIFIED IDEOGRAPH
+ 0xB2CB: 0x7C95, //CJK UNIFIED IDEOGRAPH
+ 0xB2CC: 0x7D46, //CJK UNIFIED IDEOGRAPH
+ 0xB2CD: 0x7D43, //CJK UNIFIED IDEOGRAPH
+ 0xB2CE: 0x7D71, //CJK UNIFIED IDEOGRAPH
+ 0xB2CF: 0x7D2E, //CJK UNIFIED IDEOGRAPH
+ 0xB2D0: 0x7D39, //CJK UNIFIED IDEOGRAPH
+ 0xB2D1: 0x7D3C, //CJK UNIFIED IDEOGRAPH
+ 0xB2D2: 0x7D40, //CJK UNIFIED IDEOGRAPH
+ 0xB2D3: 0x7D30, //CJK UNIFIED IDEOGRAPH
+ 0xB2D4: 0x7D33, //CJK UNIFIED IDEOGRAPH
+ 0xB2D5: 0x7D44, //CJK UNIFIED IDEOGRAPH
+ 0xB2D6: 0x7D2F, //CJK UNIFIED IDEOGRAPH
+ 0xB2D7: 0x7D42, //CJK UNIFIED IDEOGRAPH
+ 0xB2D8: 0x7D32, //CJK UNIFIED IDEOGRAPH
+ 0xB2D9: 0x7D31, //CJK UNIFIED IDEOGRAPH
+ 0xB2DA: 0x7F3D, //CJK UNIFIED IDEOGRAPH
+ 0xB2DB: 0x7F9E, //CJK UNIFIED IDEOGRAPH
+ 0xB2DC: 0x7F9A, //CJK UNIFIED IDEOGRAPH
+ 0xB2DD: 0x7FCC, //CJK UNIFIED IDEOGRAPH
+ 0xB2DE: 0x7FCE, //CJK UNIFIED IDEOGRAPH
+ 0xB2DF: 0x7FD2, //CJK UNIFIED IDEOGRAPH
+ 0xB2E0: 0x801C, //CJK UNIFIED IDEOGRAPH
+ 0xB2E1: 0x804A, //CJK UNIFIED IDEOGRAPH
+ 0xB2E2: 0x8046, //CJK UNIFIED IDEOGRAPH
+ 0xB2E3: 0x812F, //CJK UNIFIED IDEOGRAPH
+ 0xB2E4: 0x8116, //CJK UNIFIED IDEOGRAPH
+ 0xB2E5: 0x8123, //CJK UNIFIED IDEOGRAPH
+ 0xB2E6: 0x812B, //CJK UNIFIED IDEOGRAPH
+ 0xB2E7: 0x8129, //CJK UNIFIED IDEOGRAPH
+ 0xB2E8: 0x8130, //CJK UNIFIED IDEOGRAPH
+ 0xB2E9: 0x8124, //CJK UNIFIED IDEOGRAPH
+ 0xB2EA: 0x8202, //CJK UNIFIED IDEOGRAPH
+ 0xB2EB: 0x8235, //CJK UNIFIED IDEOGRAPH
+ 0xB2EC: 0x8237, //CJK UNIFIED IDEOGRAPH
+ 0xB2ED: 0x8236, //CJK UNIFIED IDEOGRAPH
+ 0xB2EE: 0x8239, //CJK UNIFIED IDEOGRAPH
+ 0xB2EF: 0x838E, //CJK UNIFIED IDEOGRAPH
+ 0xB2F0: 0x839E, //CJK UNIFIED IDEOGRAPH
+ 0xB2F1: 0x8398, //CJK UNIFIED IDEOGRAPH
+ 0xB2F2: 0x8378, //CJK UNIFIED IDEOGRAPH
+ 0xB2F3: 0x83A2, //CJK UNIFIED IDEOGRAPH
+ 0xB2F4: 0x8396, //CJK UNIFIED IDEOGRAPH
+ 0xB2F5: 0x83BD, //CJK UNIFIED IDEOGRAPH
+ 0xB2F6: 0x83AB, //CJK UNIFIED IDEOGRAPH
+ 0xB2F7: 0x8392, //CJK UNIFIED IDEOGRAPH
+ 0xB2F8: 0x838A, //CJK UNIFIED IDEOGRAPH
+ 0xB2F9: 0x8393, //CJK UNIFIED IDEOGRAPH
+ 0xB2FA: 0x8389, //CJK UNIFIED IDEOGRAPH
+ 0xB2FB: 0x83A0, //CJK UNIFIED IDEOGRAPH
+ 0xB2FC: 0x8377, //CJK UNIFIED IDEOGRAPH
+ 0xB2FD: 0x837B, //CJK UNIFIED IDEOGRAPH
+ 0xB2FE: 0x837C, //CJK UNIFIED IDEOGRAPH
+ 0xB340: 0x8386, //CJK UNIFIED IDEOGRAPH
+ 0xB341: 0x83A7, //CJK UNIFIED IDEOGRAPH
+ 0xB342: 0x8655, //CJK UNIFIED IDEOGRAPH
+ 0xB343: 0x5F6A, //CJK UNIFIED IDEOGRAPH
+ 0xB344: 0x86C7, //CJK UNIFIED IDEOGRAPH
+ 0xB345: 0x86C0, //CJK UNIFIED IDEOGRAPH
+ 0xB346: 0x86B6, //CJK UNIFIED IDEOGRAPH
+ 0xB347: 0x86C4, //CJK UNIFIED IDEOGRAPH
+ 0xB348: 0x86B5, //CJK UNIFIED IDEOGRAPH
+ 0xB349: 0x86C6, //CJK UNIFIED IDEOGRAPH
+ 0xB34A: 0x86CB, //CJK UNIFIED IDEOGRAPH
+ 0xB34B: 0x86B1, //CJK UNIFIED IDEOGRAPH
+ 0xB34C: 0x86AF, //CJK UNIFIED IDEOGRAPH
+ 0xB34D: 0x86C9, //CJK UNIFIED IDEOGRAPH
+ 0xB34E: 0x8853, //CJK UNIFIED IDEOGRAPH
+ 0xB34F: 0x889E, //CJK UNIFIED IDEOGRAPH
+ 0xB350: 0x8888, //CJK UNIFIED IDEOGRAPH
+ 0xB351: 0x88AB, //CJK UNIFIED IDEOGRAPH
+ 0xB352: 0x8892, //CJK UNIFIED IDEOGRAPH
+ 0xB353: 0x8896, //CJK UNIFIED IDEOGRAPH
+ 0xB354: 0x888D, //CJK UNIFIED IDEOGRAPH
+ 0xB355: 0x888B, //CJK UNIFIED IDEOGRAPH
+ 0xB356: 0x8993, //CJK UNIFIED IDEOGRAPH
+ 0xB357: 0x898F, //CJK UNIFIED IDEOGRAPH
+ 0xB358: 0x8A2A, //CJK UNIFIED IDEOGRAPH
+ 0xB359: 0x8A1D, //CJK UNIFIED IDEOGRAPH
+ 0xB35A: 0x8A23, //CJK UNIFIED IDEOGRAPH
+ 0xB35B: 0x8A25, //CJK UNIFIED IDEOGRAPH
+ 0xB35C: 0x8A31, //CJK UNIFIED IDEOGRAPH
+ 0xB35D: 0x8A2D, //CJK UNIFIED IDEOGRAPH
+ 0xB35E: 0x8A1F, //CJK UNIFIED IDEOGRAPH
+ 0xB35F: 0x8A1B, //CJK UNIFIED IDEOGRAPH
+ 0xB360: 0x8A22, //CJK UNIFIED IDEOGRAPH
+ 0xB361: 0x8C49, //CJK UNIFIED IDEOGRAPH
+ 0xB362: 0x8C5A, //CJK UNIFIED IDEOGRAPH
+ 0xB363: 0x8CA9, //CJK UNIFIED IDEOGRAPH
+ 0xB364: 0x8CAC, //CJK UNIFIED IDEOGRAPH
+ 0xB365: 0x8CAB, //CJK UNIFIED IDEOGRAPH
+ 0xB366: 0x8CA8, //CJK UNIFIED IDEOGRAPH
+ 0xB367: 0x8CAA, //CJK UNIFIED IDEOGRAPH
+ 0xB368: 0x8CA7, //CJK UNIFIED IDEOGRAPH
+ 0xB369: 0x8D67, //CJK UNIFIED IDEOGRAPH
+ 0xB36A: 0x8D66, //CJK UNIFIED IDEOGRAPH
+ 0xB36B: 0x8DBE, //CJK UNIFIED IDEOGRAPH
+ 0xB36C: 0x8DBA, //CJK UNIFIED IDEOGRAPH
+ 0xB36D: 0x8EDB, //CJK UNIFIED IDEOGRAPH
+ 0xB36E: 0x8EDF, //CJK UNIFIED IDEOGRAPH
+ 0xB36F: 0x9019, //CJK UNIFIED IDEOGRAPH
+ 0xB370: 0x900D, //CJK UNIFIED IDEOGRAPH
+ 0xB371: 0x901A, //CJK UNIFIED IDEOGRAPH
+ 0xB372: 0x9017, //CJK UNIFIED IDEOGRAPH
+ 0xB373: 0x9023, //CJK UNIFIED IDEOGRAPH
+ 0xB374: 0x901F, //CJK UNIFIED IDEOGRAPH
+ 0xB375: 0x901D, //CJK UNIFIED IDEOGRAPH
+ 0xB376: 0x9010, //CJK UNIFIED IDEOGRAPH
+ 0xB377: 0x9015, //CJK UNIFIED IDEOGRAPH
+ 0xB378: 0x901E, //CJK UNIFIED IDEOGRAPH
+ 0xB379: 0x9020, //CJK UNIFIED IDEOGRAPH
+ 0xB37A: 0x900F, //CJK UNIFIED IDEOGRAPH
+ 0xB37B: 0x9022, //CJK UNIFIED IDEOGRAPH
+ 0xB37C: 0x9016, //CJK UNIFIED IDEOGRAPH
+ 0xB37D: 0x901B, //CJK UNIFIED IDEOGRAPH
+ 0xB37E: 0x9014, //CJK UNIFIED IDEOGRAPH
+ 0xB3A1: 0x90E8, //CJK UNIFIED IDEOGRAPH
+ 0xB3A2: 0x90ED, //CJK UNIFIED IDEOGRAPH
+ 0xB3A3: 0x90FD, //CJK UNIFIED IDEOGRAPH
+ 0xB3A4: 0x9157, //CJK UNIFIED IDEOGRAPH
+ 0xB3A5: 0x91CE, //CJK UNIFIED IDEOGRAPH
+ 0xB3A6: 0x91F5, //CJK UNIFIED IDEOGRAPH
+ 0xB3A7: 0x91E6, //CJK UNIFIED IDEOGRAPH
+ 0xB3A8: 0x91E3, //CJK UNIFIED IDEOGRAPH
+ 0xB3A9: 0x91E7, //CJK UNIFIED IDEOGRAPH
+ 0xB3AA: 0x91ED, //CJK UNIFIED IDEOGRAPH
+ 0xB3AB: 0x91E9, //CJK UNIFIED IDEOGRAPH
+ 0xB3AC: 0x9589, //CJK UNIFIED IDEOGRAPH
+ 0xB3AD: 0x966A, //CJK UNIFIED IDEOGRAPH
+ 0xB3AE: 0x9675, //CJK UNIFIED IDEOGRAPH
+ 0xB3AF: 0x9673, //CJK UNIFIED IDEOGRAPH
+ 0xB3B0: 0x9678, //CJK UNIFIED IDEOGRAPH
+ 0xB3B1: 0x9670, //CJK UNIFIED IDEOGRAPH
+ 0xB3B2: 0x9674, //CJK UNIFIED IDEOGRAPH
+ 0xB3B3: 0x9676, //CJK UNIFIED IDEOGRAPH
+ 0xB3B4: 0x9677, //CJK UNIFIED IDEOGRAPH
+ 0xB3B5: 0x966C, //CJK UNIFIED IDEOGRAPH
+ 0xB3B6: 0x96C0, //CJK UNIFIED IDEOGRAPH
+ 0xB3B7: 0x96EA, //CJK UNIFIED IDEOGRAPH
+ 0xB3B8: 0x96E9, //CJK UNIFIED IDEOGRAPH
+ 0xB3B9: 0x7AE0, //CJK UNIFIED IDEOGRAPH
+ 0xB3BA: 0x7ADF, //CJK UNIFIED IDEOGRAPH
+ 0xB3BB: 0x9802, //CJK UNIFIED IDEOGRAPH
+ 0xB3BC: 0x9803, //CJK UNIFIED IDEOGRAPH
+ 0xB3BD: 0x9B5A, //CJK UNIFIED IDEOGRAPH
+ 0xB3BE: 0x9CE5, //CJK UNIFIED IDEOGRAPH
+ 0xB3BF: 0x9E75, //CJK UNIFIED IDEOGRAPH
+ 0xB3C0: 0x9E7F, //CJK UNIFIED IDEOGRAPH
+ 0xB3C1: 0x9EA5, //CJK UNIFIED IDEOGRAPH
+ 0xB3C2: 0x9EBB, //CJK UNIFIED IDEOGRAPH
+ 0xB3C3: 0x50A2, //CJK UNIFIED IDEOGRAPH
+ 0xB3C4: 0x508D, //CJK UNIFIED IDEOGRAPH
+ 0xB3C5: 0x5085, //CJK UNIFIED IDEOGRAPH
+ 0xB3C6: 0x5099, //CJK UNIFIED IDEOGRAPH
+ 0xB3C7: 0x5091, //CJK UNIFIED IDEOGRAPH
+ 0xB3C8: 0x5080, //CJK UNIFIED IDEOGRAPH
+ 0xB3C9: 0x5096, //CJK UNIFIED IDEOGRAPH
+ 0xB3CA: 0x5098, //CJK UNIFIED IDEOGRAPH
+ 0xB3CB: 0x509A, //CJK UNIFIED IDEOGRAPH
+ 0xB3CC: 0x6700, //CJK UNIFIED IDEOGRAPH
+ 0xB3CD: 0x51F1, //CJK UNIFIED IDEOGRAPH
+ 0xB3CE: 0x5272, //CJK UNIFIED IDEOGRAPH
+ 0xB3CF: 0x5274, //CJK UNIFIED IDEOGRAPH
+ 0xB3D0: 0x5275, //CJK UNIFIED IDEOGRAPH
+ 0xB3D1: 0x5269, //CJK UNIFIED IDEOGRAPH
+ 0xB3D2: 0x52DE, //CJK UNIFIED IDEOGRAPH
+ 0xB3D3: 0x52DD, //CJK UNIFIED IDEOGRAPH
+ 0xB3D4: 0x52DB, //CJK UNIFIED IDEOGRAPH
+ 0xB3D5: 0x535A, //CJK UNIFIED IDEOGRAPH
+ 0xB3D6: 0x53A5, //CJK UNIFIED IDEOGRAPH
+ 0xB3D7: 0x557B, //CJK UNIFIED IDEOGRAPH
+ 0xB3D8: 0x5580, //CJK UNIFIED IDEOGRAPH
+ 0xB3D9: 0x55A7, //CJK UNIFIED IDEOGRAPH
+ 0xB3DA: 0x557C, //CJK UNIFIED IDEOGRAPH
+ 0xB3DB: 0x558A, //CJK UNIFIED IDEOGRAPH
+ 0xB3DC: 0x559D, //CJK UNIFIED IDEOGRAPH
+ 0xB3DD: 0x5598, //CJK UNIFIED IDEOGRAPH
+ 0xB3DE: 0x5582, //CJK UNIFIED IDEOGRAPH
+ 0xB3DF: 0x559C, //CJK UNIFIED IDEOGRAPH
+ 0xB3E0: 0x55AA, //CJK UNIFIED IDEOGRAPH
+ 0xB3E1: 0x5594, //CJK UNIFIED IDEOGRAPH
+ 0xB3E2: 0x5587, //CJK UNIFIED IDEOGRAPH
+ 0xB3E3: 0x558B, //CJK UNIFIED IDEOGRAPH
+ 0xB3E4: 0x5583, //CJK UNIFIED IDEOGRAPH
+ 0xB3E5: 0x55B3, //CJK UNIFIED IDEOGRAPH
+ 0xB3E6: 0x55AE, //CJK UNIFIED IDEOGRAPH
+ 0xB3E7: 0x559F, //CJK UNIFIED IDEOGRAPH
+ 0xB3E8: 0x553E, //CJK UNIFIED IDEOGRAPH
+ 0xB3E9: 0x55B2, //CJK UNIFIED IDEOGRAPH
+ 0xB3EA: 0x559A, //CJK UNIFIED IDEOGRAPH
+ 0xB3EB: 0x55BB, //CJK UNIFIED IDEOGRAPH
+ 0xB3EC: 0x55AC, //CJK UNIFIED IDEOGRAPH
+ 0xB3ED: 0x55B1, //CJK UNIFIED IDEOGRAPH
+ 0xB3EE: 0x557E, //CJK UNIFIED IDEOGRAPH
+ 0xB3EF: 0x5589, //CJK UNIFIED IDEOGRAPH
+ 0xB3F0: 0x55AB, //CJK UNIFIED IDEOGRAPH
+ 0xB3F1: 0x5599, //CJK UNIFIED IDEOGRAPH
+ 0xB3F2: 0x570D, //CJK UNIFIED IDEOGRAPH
+ 0xB3F3: 0x582F, //CJK UNIFIED IDEOGRAPH
+ 0xB3F4: 0x582A, //CJK UNIFIED IDEOGRAPH
+ 0xB3F5: 0x5834, //CJK UNIFIED IDEOGRAPH
+ 0xB3F6: 0x5824, //CJK UNIFIED IDEOGRAPH
+ 0xB3F7: 0x5830, //CJK UNIFIED IDEOGRAPH
+ 0xB3F8: 0x5831, //CJK UNIFIED IDEOGRAPH
+ 0xB3F9: 0x5821, //CJK UNIFIED IDEOGRAPH
+ 0xB3FA: 0x581D, //CJK UNIFIED IDEOGRAPH
+ 0xB3FB: 0x5820, //CJK UNIFIED IDEOGRAPH
+ 0xB3FC: 0x58F9, //CJK UNIFIED IDEOGRAPH
+ 0xB3FD: 0x58FA, //CJK UNIFIED IDEOGRAPH
+ 0xB3FE: 0x5960, //CJK UNIFIED IDEOGRAPH
+ 0xB440: 0x5A77, //CJK UNIFIED IDEOGRAPH
+ 0xB441: 0x5A9A, //CJK UNIFIED IDEOGRAPH
+ 0xB442: 0x5A7F, //CJK UNIFIED IDEOGRAPH
+ 0xB443: 0x5A92, //CJK UNIFIED IDEOGRAPH
+ 0xB444: 0x5A9B, //CJK UNIFIED IDEOGRAPH
+ 0xB445: 0x5AA7, //CJK UNIFIED IDEOGRAPH
+ 0xB446: 0x5B73, //CJK UNIFIED IDEOGRAPH
+ 0xB447: 0x5B71, //CJK UNIFIED IDEOGRAPH
+ 0xB448: 0x5BD2, //CJK UNIFIED IDEOGRAPH
+ 0xB449: 0x5BCC, //CJK UNIFIED IDEOGRAPH
+ 0xB44A: 0x5BD3, //CJK UNIFIED IDEOGRAPH
+ 0xB44B: 0x5BD0, //CJK UNIFIED IDEOGRAPH
+ 0xB44C: 0x5C0A, //CJK UNIFIED IDEOGRAPH
+ 0xB44D: 0x5C0B, //CJK UNIFIED IDEOGRAPH
+ 0xB44E: 0x5C31, //CJK UNIFIED IDEOGRAPH
+ 0xB44F: 0x5D4C, //CJK UNIFIED IDEOGRAPH
+ 0xB450: 0x5D50, //CJK UNIFIED IDEOGRAPH
+ 0xB451: 0x5D34, //CJK UNIFIED IDEOGRAPH
+ 0xB452: 0x5D47, //CJK UNIFIED IDEOGRAPH
+ 0xB453: 0x5DFD, //CJK UNIFIED IDEOGRAPH
+ 0xB454: 0x5E45, //CJK UNIFIED IDEOGRAPH
+ 0xB455: 0x5E3D, //CJK UNIFIED IDEOGRAPH
+ 0xB456: 0x5E40, //CJK UNIFIED IDEOGRAPH
+ 0xB457: 0x5E43, //CJK UNIFIED IDEOGRAPH
+ 0xB458: 0x5E7E, //CJK UNIFIED IDEOGRAPH
+ 0xB459: 0x5ECA, //CJK UNIFIED IDEOGRAPH
+ 0xB45A: 0x5EC1, //CJK UNIFIED IDEOGRAPH
+ 0xB45B: 0x5EC2, //CJK UNIFIED IDEOGRAPH
+ 0xB45C: 0x5EC4, //CJK UNIFIED IDEOGRAPH
+ 0xB45D: 0x5F3C, //CJK UNIFIED IDEOGRAPH
+ 0xB45E: 0x5F6D, //CJK UNIFIED IDEOGRAPH
+ 0xB45F: 0x5FA9, //CJK UNIFIED IDEOGRAPH
+ 0xB460: 0x5FAA, //CJK UNIFIED IDEOGRAPH
+ 0xB461: 0x5FA8, //CJK UNIFIED IDEOGRAPH
+ 0xB462: 0x60D1, //CJK UNIFIED IDEOGRAPH
+ 0xB463: 0x60E1, //CJK UNIFIED IDEOGRAPH
+ 0xB464: 0x60B2, //CJK UNIFIED IDEOGRAPH
+ 0xB465: 0x60B6, //CJK UNIFIED IDEOGRAPH
+ 0xB466: 0x60E0, //CJK UNIFIED IDEOGRAPH
+ 0xB467: 0x611C, //CJK UNIFIED IDEOGRAPH
+ 0xB468: 0x6123, //CJK UNIFIED IDEOGRAPH
+ 0xB469: 0x60FA, //CJK UNIFIED IDEOGRAPH
+ 0xB46A: 0x6115, //CJK UNIFIED IDEOGRAPH
+ 0xB46B: 0x60F0, //CJK UNIFIED IDEOGRAPH
+ 0xB46C: 0x60FB, //CJK UNIFIED IDEOGRAPH
+ 0xB46D: 0x60F4, //CJK UNIFIED IDEOGRAPH
+ 0xB46E: 0x6168, //CJK UNIFIED IDEOGRAPH
+ 0xB46F: 0x60F1, //CJK UNIFIED IDEOGRAPH
+ 0xB470: 0x610E, //CJK UNIFIED IDEOGRAPH
+ 0xB471: 0x60F6, //CJK UNIFIED IDEOGRAPH
+ 0xB472: 0x6109, //CJK UNIFIED IDEOGRAPH
+ 0xB473: 0x6100, //CJK UNIFIED IDEOGRAPH
+ 0xB474: 0x6112, //CJK UNIFIED IDEOGRAPH
+ 0xB475: 0x621F, //CJK UNIFIED IDEOGRAPH
+ 0xB476: 0x6249, //CJK UNIFIED IDEOGRAPH
+ 0xB477: 0x63A3, //CJK UNIFIED IDEOGRAPH
+ 0xB478: 0x638C, //CJK UNIFIED IDEOGRAPH
+ 0xB479: 0x63CF, //CJK UNIFIED IDEOGRAPH
+ 0xB47A: 0x63C0, //CJK UNIFIED IDEOGRAPH
+ 0xB47B: 0x63E9, //CJK UNIFIED IDEOGRAPH
+ 0xB47C: 0x63C9, //CJK UNIFIED IDEOGRAPH
+ 0xB47D: 0x63C6, //CJK UNIFIED IDEOGRAPH
+ 0xB47E: 0x63CD, //CJK UNIFIED IDEOGRAPH
+ 0xB4A1: 0x63D2, //CJK UNIFIED IDEOGRAPH
+ 0xB4A2: 0x63E3, //CJK UNIFIED IDEOGRAPH
+ 0xB4A3: 0x63D0, //CJK UNIFIED IDEOGRAPH
+ 0xB4A4: 0x63E1, //CJK UNIFIED IDEOGRAPH
+ 0xB4A5: 0x63D6, //CJK UNIFIED IDEOGRAPH
+ 0xB4A6: 0x63ED, //CJK UNIFIED IDEOGRAPH
+ 0xB4A7: 0x63EE, //CJK UNIFIED IDEOGRAPH
+ 0xB4A8: 0x6376, //CJK UNIFIED IDEOGRAPH
+ 0xB4A9: 0x63F4, //CJK UNIFIED IDEOGRAPH
+ 0xB4AA: 0x63EA, //CJK UNIFIED IDEOGRAPH
+ 0xB4AB: 0x63DB, //CJK UNIFIED IDEOGRAPH
+ 0xB4AC: 0x6452, //CJK UNIFIED IDEOGRAPH
+ 0xB4AD: 0x63DA, //CJK UNIFIED IDEOGRAPH
+ 0xB4AE: 0x63F9, //CJK UNIFIED IDEOGRAPH
+ 0xB4AF: 0x655E, //CJK UNIFIED IDEOGRAPH
+ 0xB4B0: 0x6566, //CJK UNIFIED IDEOGRAPH
+ 0xB4B1: 0x6562, //CJK UNIFIED IDEOGRAPH
+ 0xB4B2: 0x6563, //CJK UNIFIED IDEOGRAPH
+ 0xB4B3: 0x6591, //CJK UNIFIED IDEOGRAPH
+ 0xB4B4: 0x6590, //CJK UNIFIED IDEOGRAPH
+ 0xB4B5: 0x65AF, //CJK UNIFIED IDEOGRAPH
+ 0xB4B6: 0x666E, //CJK UNIFIED IDEOGRAPH
+ 0xB4B7: 0x6670, //CJK UNIFIED IDEOGRAPH
+ 0xB4B8: 0x6674, //CJK UNIFIED IDEOGRAPH
+ 0xB4B9: 0x6676, //CJK UNIFIED IDEOGRAPH
+ 0xB4BA: 0x666F, //CJK UNIFIED IDEOGRAPH
+ 0xB4BB: 0x6691, //CJK UNIFIED IDEOGRAPH
+ 0xB4BC: 0x667A, //CJK UNIFIED IDEOGRAPH
+ 0xB4BD: 0x667E, //CJK UNIFIED IDEOGRAPH
+ 0xB4BE: 0x6677, //CJK UNIFIED IDEOGRAPH
+ 0xB4BF: 0x66FE, //CJK UNIFIED IDEOGRAPH
+ 0xB4C0: 0x66FF, //CJK UNIFIED IDEOGRAPH
+ 0xB4C1: 0x671F, //CJK UNIFIED IDEOGRAPH
+ 0xB4C2: 0x671D, //CJK UNIFIED IDEOGRAPH
+ 0xB4C3: 0x68FA, //CJK UNIFIED IDEOGRAPH
+ 0xB4C4: 0x68D5, //CJK UNIFIED IDEOGRAPH
+ 0xB4C5: 0x68E0, //CJK UNIFIED IDEOGRAPH
+ 0xB4C6: 0x68D8, //CJK UNIFIED IDEOGRAPH
+ 0xB4C7: 0x68D7, //CJK UNIFIED IDEOGRAPH
+ 0xB4C8: 0x6905, //CJK UNIFIED IDEOGRAPH
+ 0xB4C9: 0x68DF, //CJK UNIFIED IDEOGRAPH
+ 0xB4CA: 0x68F5, //CJK UNIFIED IDEOGRAPH
+ 0xB4CB: 0x68EE, //CJK UNIFIED IDEOGRAPH
+ 0xB4CC: 0x68E7, //CJK UNIFIED IDEOGRAPH
+ 0xB4CD: 0x68F9, //CJK UNIFIED IDEOGRAPH
+ 0xB4CE: 0x68D2, //CJK UNIFIED IDEOGRAPH
+ 0xB4CF: 0x68F2, //CJK UNIFIED IDEOGRAPH
+ 0xB4D0: 0x68E3, //CJK UNIFIED IDEOGRAPH
+ 0xB4D1: 0x68CB, //CJK UNIFIED IDEOGRAPH
+ 0xB4D2: 0x68CD, //CJK UNIFIED IDEOGRAPH
+ 0xB4D3: 0x690D, //CJK UNIFIED IDEOGRAPH
+ 0xB4D4: 0x6912, //CJK UNIFIED IDEOGRAPH
+ 0xB4D5: 0x690E, //CJK UNIFIED IDEOGRAPH
+ 0xB4D6: 0x68C9, //CJK UNIFIED IDEOGRAPH
+ 0xB4D7: 0x68DA, //CJK UNIFIED IDEOGRAPH
+ 0xB4D8: 0x696E, //CJK UNIFIED IDEOGRAPH
+ 0xB4D9: 0x68FB, //CJK UNIFIED IDEOGRAPH
+ 0xB4DA: 0x6B3E, //CJK UNIFIED IDEOGRAPH
+ 0xB4DB: 0x6B3A, //CJK UNIFIED IDEOGRAPH
+ 0xB4DC: 0x6B3D, //CJK UNIFIED IDEOGRAPH
+ 0xB4DD: 0x6B98, //CJK UNIFIED IDEOGRAPH
+ 0xB4DE: 0x6B96, //CJK UNIFIED IDEOGRAPH
+ 0xB4DF: 0x6BBC, //CJK UNIFIED IDEOGRAPH
+ 0xB4E0: 0x6BEF, //CJK UNIFIED IDEOGRAPH
+ 0xB4E1: 0x6C2E, //CJK UNIFIED IDEOGRAPH
+ 0xB4E2: 0x6C2F, //CJK UNIFIED IDEOGRAPH
+ 0xB4E3: 0x6C2C, //CJK UNIFIED IDEOGRAPH
+ 0xB4E4: 0x6E2F, //CJK UNIFIED IDEOGRAPH
+ 0xB4E5: 0x6E38, //CJK UNIFIED IDEOGRAPH
+ 0xB4E6: 0x6E54, //CJK UNIFIED IDEOGRAPH
+ 0xB4E7: 0x6E21, //CJK UNIFIED IDEOGRAPH
+ 0xB4E8: 0x6E32, //CJK UNIFIED IDEOGRAPH
+ 0xB4E9: 0x6E67, //CJK UNIFIED IDEOGRAPH
+ 0xB4EA: 0x6E4A, //CJK UNIFIED IDEOGRAPH
+ 0xB4EB: 0x6E20, //CJK UNIFIED IDEOGRAPH
+ 0xB4EC: 0x6E25, //CJK UNIFIED IDEOGRAPH
+ 0xB4ED: 0x6E23, //CJK UNIFIED IDEOGRAPH
+ 0xB4EE: 0x6E1B, //CJK UNIFIED IDEOGRAPH
+ 0xB4EF: 0x6E5B, //CJK UNIFIED IDEOGRAPH
+ 0xB4F0: 0x6E58, //CJK UNIFIED IDEOGRAPH
+ 0xB4F1: 0x6E24, //CJK UNIFIED IDEOGRAPH
+ 0xB4F2: 0x6E56, //CJK UNIFIED IDEOGRAPH
+ 0xB4F3: 0x6E6E, //CJK UNIFIED IDEOGRAPH
+ 0xB4F4: 0x6E2D, //CJK UNIFIED IDEOGRAPH
+ 0xB4F5: 0x6E26, //CJK UNIFIED IDEOGRAPH
+ 0xB4F6: 0x6E6F, //CJK UNIFIED IDEOGRAPH
+ 0xB4F7: 0x6E34, //CJK UNIFIED IDEOGRAPH
+ 0xB4F8: 0x6E4D, //CJK UNIFIED IDEOGRAPH
+ 0xB4F9: 0x6E3A, //CJK UNIFIED IDEOGRAPH
+ 0xB4FA: 0x6E2C, //CJK UNIFIED IDEOGRAPH
+ 0xB4FB: 0x6E43, //CJK UNIFIED IDEOGRAPH
+ 0xB4FC: 0x6E1D, //CJK UNIFIED IDEOGRAPH
+ 0xB4FD: 0x6E3E, //CJK UNIFIED IDEOGRAPH
+ 0xB4FE: 0x6ECB, //CJK UNIFIED IDEOGRAPH
+ 0xB540: 0x6E89, //CJK UNIFIED IDEOGRAPH
+ 0xB541: 0x6E19, //CJK UNIFIED IDEOGRAPH
+ 0xB542: 0x6E4E, //CJK UNIFIED IDEOGRAPH
+ 0xB543: 0x6E63, //CJK UNIFIED IDEOGRAPH
+ 0xB544: 0x6E44, //CJK UNIFIED IDEOGRAPH
+ 0xB545: 0x6E72, //CJK UNIFIED IDEOGRAPH
+ 0xB546: 0x6E69, //CJK UNIFIED IDEOGRAPH
+ 0xB547: 0x6E5F, //CJK UNIFIED IDEOGRAPH
+ 0xB548: 0x7119, //CJK UNIFIED IDEOGRAPH
+ 0xB549: 0x711A, //CJK UNIFIED IDEOGRAPH
+ 0xB54A: 0x7126, //CJK UNIFIED IDEOGRAPH
+ 0xB54B: 0x7130, //CJK UNIFIED IDEOGRAPH
+ 0xB54C: 0x7121, //CJK UNIFIED IDEOGRAPH
+ 0xB54D: 0x7136, //CJK UNIFIED IDEOGRAPH
+ 0xB54E: 0x716E, //CJK UNIFIED IDEOGRAPH
+ 0xB54F: 0x711C, //CJK UNIFIED IDEOGRAPH
+ 0xB550: 0x724C, //CJK UNIFIED IDEOGRAPH
+ 0xB551: 0x7284, //CJK UNIFIED IDEOGRAPH
+ 0xB552: 0x7280, //CJK UNIFIED IDEOGRAPH
+ 0xB553: 0x7336, //CJK UNIFIED IDEOGRAPH
+ 0xB554: 0x7325, //CJK UNIFIED IDEOGRAPH
+ 0xB555: 0x7334, //CJK UNIFIED IDEOGRAPH
+ 0xB556: 0x7329, //CJK UNIFIED IDEOGRAPH
+ 0xB557: 0x743A, //CJK UNIFIED IDEOGRAPH
+ 0xB558: 0x742A, //CJK UNIFIED IDEOGRAPH
+ 0xB559: 0x7433, //CJK UNIFIED IDEOGRAPH
+ 0xB55A: 0x7422, //CJK UNIFIED IDEOGRAPH
+ 0xB55B: 0x7425, //CJK UNIFIED IDEOGRAPH
+ 0xB55C: 0x7435, //CJK UNIFIED IDEOGRAPH
+ 0xB55D: 0x7436, //CJK UNIFIED IDEOGRAPH
+ 0xB55E: 0x7434, //CJK UNIFIED IDEOGRAPH
+ 0xB55F: 0x742F, //CJK UNIFIED IDEOGRAPH
+ 0xB560: 0x741B, //CJK UNIFIED IDEOGRAPH
+ 0xB561: 0x7426, //CJK UNIFIED IDEOGRAPH
+ 0xB562: 0x7428, //CJK UNIFIED IDEOGRAPH
+ 0xB563: 0x7525, //CJK UNIFIED IDEOGRAPH
+ 0xB564: 0x7526, //CJK UNIFIED IDEOGRAPH
+ 0xB565: 0x756B, //CJK UNIFIED IDEOGRAPH
+ 0xB566: 0x756A, //CJK UNIFIED IDEOGRAPH
+ 0xB567: 0x75E2, //CJK UNIFIED IDEOGRAPH
+ 0xB568: 0x75DB, //CJK UNIFIED IDEOGRAPH
+ 0xB569: 0x75E3, //CJK UNIFIED IDEOGRAPH
+ 0xB56A: 0x75D9, //CJK UNIFIED IDEOGRAPH
+ 0xB56B: 0x75D8, //CJK UNIFIED IDEOGRAPH
+ 0xB56C: 0x75DE, //CJK UNIFIED IDEOGRAPH
+ 0xB56D: 0x75E0, //CJK UNIFIED IDEOGRAPH
+ 0xB56E: 0x767B, //CJK UNIFIED IDEOGRAPH
+ 0xB56F: 0x767C, //CJK UNIFIED IDEOGRAPH
+ 0xB570: 0x7696, //CJK UNIFIED IDEOGRAPH
+ 0xB571: 0x7693, //CJK UNIFIED IDEOGRAPH
+ 0xB572: 0x76B4, //CJK UNIFIED IDEOGRAPH
+ 0xB573: 0x76DC, //CJK UNIFIED IDEOGRAPH
+ 0xB574: 0x774F, //CJK UNIFIED IDEOGRAPH
+ 0xB575: 0x77ED, //CJK UNIFIED IDEOGRAPH
+ 0xB576: 0x785D, //CJK UNIFIED IDEOGRAPH
+ 0xB577: 0x786C, //CJK UNIFIED IDEOGRAPH
+ 0xB578: 0x786F, //CJK UNIFIED IDEOGRAPH
+ 0xB579: 0x7A0D, //CJK UNIFIED IDEOGRAPH
+ 0xB57A: 0x7A08, //CJK UNIFIED IDEOGRAPH
+ 0xB57B: 0x7A0B, //CJK UNIFIED IDEOGRAPH
+ 0xB57C: 0x7A05, //CJK UNIFIED IDEOGRAPH
+ 0xB57D: 0x7A00, //CJK UNIFIED IDEOGRAPH
+ 0xB57E: 0x7A98, //CJK UNIFIED IDEOGRAPH
+ 0xB5A1: 0x7A97, //CJK UNIFIED IDEOGRAPH
+ 0xB5A2: 0x7A96, //CJK UNIFIED IDEOGRAPH
+ 0xB5A3: 0x7AE5, //CJK UNIFIED IDEOGRAPH
+ 0xB5A4: 0x7AE3, //CJK UNIFIED IDEOGRAPH
+ 0xB5A5: 0x7B49, //CJK UNIFIED IDEOGRAPH
+ 0xB5A6: 0x7B56, //CJK UNIFIED IDEOGRAPH
+ 0xB5A7: 0x7B46, //CJK UNIFIED IDEOGRAPH
+ 0xB5A8: 0x7B50, //CJK UNIFIED IDEOGRAPH
+ 0xB5A9: 0x7B52, //CJK UNIFIED IDEOGRAPH
+ 0xB5AA: 0x7B54, //CJK UNIFIED IDEOGRAPH
+ 0xB5AB: 0x7B4D, //CJK UNIFIED IDEOGRAPH
+ 0xB5AC: 0x7B4B, //CJK UNIFIED IDEOGRAPH
+ 0xB5AD: 0x7B4F, //CJK UNIFIED IDEOGRAPH
+ 0xB5AE: 0x7B51, //CJK UNIFIED IDEOGRAPH
+ 0xB5AF: 0x7C9F, //CJK UNIFIED IDEOGRAPH
+ 0xB5B0: 0x7CA5, //CJK UNIFIED IDEOGRAPH
+ 0xB5B1: 0x7D5E, //CJK UNIFIED IDEOGRAPH
+ 0xB5B2: 0x7D50, //CJK UNIFIED IDEOGRAPH
+ 0xB5B3: 0x7D68, //CJK UNIFIED IDEOGRAPH
+ 0xB5B4: 0x7D55, //CJK UNIFIED IDEOGRAPH
+ 0xB5B5: 0x7D2B, //CJK UNIFIED IDEOGRAPH
+ 0xB5B6: 0x7D6E, //CJK UNIFIED IDEOGRAPH
+ 0xB5B7: 0x7D72, //CJK UNIFIED IDEOGRAPH
+ 0xB5B8: 0x7D61, //CJK UNIFIED IDEOGRAPH
+ 0xB5B9: 0x7D66, //CJK UNIFIED IDEOGRAPH
+ 0xB5BA: 0x7D62, //CJK UNIFIED IDEOGRAPH
+ 0xB5BB: 0x7D70, //CJK UNIFIED IDEOGRAPH
+ 0xB5BC: 0x7D73, //CJK UNIFIED IDEOGRAPH
+ 0xB5BD: 0x5584, //CJK UNIFIED IDEOGRAPH
+ 0xB5BE: 0x7FD4, //CJK UNIFIED IDEOGRAPH
+ 0xB5BF: 0x7FD5, //CJK UNIFIED IDEOGRAPH
+ 0xB5C0: 0x800B, //CJK UNIFIED IDEOGRAPH
+ 0xB5C1: 0x8052, //CJK UNIFIED IDEOGRAPH
+ 0xB5C2: 0x8085, //CJK UNIFIED IDEOGRAPH
+ 0xB5C3: 0x8155, //CJK UNIFIED IDEOGRAPH
+ 0xB5C4: 0x8154, //CJK UNIFIED IDEOGRAPH
+ 0xB5C5: 0x814B, //CJK UNIFIED IDEOGRAPH
+ 0xB5C6: 0x8151, //CJK UNIFIED IDEOGRAPH
+ 0xB5C7: 0x814E, //CJK UNIFIED IDEOGRAPH
+ 0xB5C8: 0x8139, //CJK UNIFIED IDEOGRAPH
+ 0xB5C9: 0x8146, //CJK UNIFIED IDEOGRAPH
+ 0xB5CA: 0x813E, //CJK UNIFIED IDEOGRAPH
+ 0xB5CB: 0x814C, //CJK UNIFIED IDEOGRAPH
+ 0xB5CC: 0x8153, //CJK UNIFIED IDEOGRAPH
+ 0xB5CD: 0x8174, //CJK UNIFIED IDEOGRAPH
+ 0xB5CE: 0x8212, //CJK UNIFIED IDEOGRAPH
+ 0xB5CF: 0x821C, //CJK UNIFIED IDEOGRAPH
+ 0xB5D0: 0x83E9, //CJK UNIFIED IDEOGRAPH
+ 0xB5D1: 0x8403, //CJK UNIFIED IDEOGRAPH
+ 0xB5D2: 0x83F8, //CJK UNIFIED IDEOGRAPH
+ 0xB5D3: 0x840D, //CJK UNIFIED IDEOGRAPH
+ 0xB5D4: 0x83E0, //CJK UNIFIED IDEOGRAPH
+ 0xB5D5: 0x83C5, //CJK UNIFIED IDEOGRAPH
+ 0xB5D6: 0x840B, //CJK UNIFIED IDEOGRAPH
+ 0xB5D7: 0x83C1, //CJK UNIFIED IDEOGRAPH
+ 0xB5D8: 0x83EF, //CJK UNIFIED IDEOGRAPH
+ 0xB5D9: 0x83F1, //CJK UNIFIED IDEOGRAPH
+ 0xB5DA: 0x83F4, //CJK UNIFIED IDEOGRAPH
+ 0xB5DB: 0x8457, //CJK UNIFIED IDEOGRAPH
+ 0xB5DC: 0x840A, //CJK UNIFIED IDEOGRAPH
+ 0xB5DD: 0x83F0, //CJK UNIFIED IDEOGRAPH
+ 0xB5DE: 0x840C, //CJK UNIFIED IDEOGRAPH
+ 0xB5DF: 0x83CC, //CJK UNIFIED IDEOGRAPH
+ 0xB5E0: 0x83FD, //CJK UNIFIED IDEOGRAPH
+ 0xB5E1: 0x83F2, //CJK UNIFIED IDEOGRAPH
+ 0xB5E2: 0x83CA, //CJK UNIFIED IDEOGRAPH
+ 0xB5E3: 0x8438, //CJK UNIFIED IDEOGRAPH
+ 0xB5E4: 0x840E, //CJK UNIFIED IDEOGRAPH
+ 0xB5E5: 0x8404, //CJK UNIFIED IDEOGRAPH
+ 0xB5E6: 0x83DC, //CJK UNIFIED IDEOGRAPH
+ 0xB5E7: 0x8407, //CJK UNIFIED IDEOGRAPH
+ 0xB5E8: 0x83D4, //CJK UNIFIED IDEOGRAPH
+ 0xB5E9: 0x83DF, //CJK UNIFIED IDEOGRAPH
+ 0xB5EA: 0x865B, //CJK UNIFIED IDEOGRAPH
+ 0xB5EB: 0x86DF, //CJK UNIFIED IDEOGRAPH
+ 0xB5EC: 0x86D9, //CJK UNIFIED IDEOGRAPH
+ 0xB5ED: 0x86ED, //CJK UNIFIED IDEOGRAPH
+ 0xB5EE: 0x86D4, //CJK UNIFIED IDEOGRAPH
+ 0xB5EF: 0x86DB, //CJK UNIFIED IDEOGRAPH
+ 0xB5F0: 0x86E4, //CJK UNIFIED IDEOGRAPH
+ 0xB5F1: 0x86D0, //CJK UNIFIED IDEOGRAPH
+ 0xB5F2: 0x86DE, //CJK UNIFIED IDEOGRAPH
+ 0xB5F3: 0x8857, //CJK UNIFIED IDEOGRAPH
+ 0xB5F4: 0x88C1, //CJK UNIFIED IDEOGRAPH
+ 0xB5F5: 0x88C2, //CJK UNIFIED IDEOGRAPH
+ 0xB5F6: 0x88B1, //CJK UNIFIED IDEOGRAPH
+ 0xB5F7: 0x8983, //CJK UNIFIED IDEOGRAPH
+ 0xB5F8: 0x8996, //CJK UNIFIED IDEOGRAPH
+ 0xB5F9: 0x8A3B, //CJK UNIFIED IDEOGRAPH
+ 0xB5FA: 0x8A60, //CJK UNIFIED IDEOGRAPH
+ 0xB5FB: 0x8A55, //CJK UNIFIED IDEOGRAPH
+ 0xB5FC: 0x8A5E, //CJK UNIFIED IDEOGRAPH
+ 0xB5FD: 0x8A3C, //CJK UNIFIED IDEOGRAPH
+ 0xB5FE: 0x8A41, //CJK UNIFIED IDEOGRAPH
+ 0xB640: 0x8A54, //CJK UNIFIED IDEOGRAPH
+ 0xB641: 0x8A5B, //CJK UNIFIED IDEOGRAPH
+ 0xB642: 0x8A50, //CJK UNIFIED IDEOGRAPH
+ 0xB643: 0x8A46, //CJK UNIFIED IDEOGRAPH
+ 0xB644: 0x8A34, //CJK UNIFIED IDEOGRAPH
+ 0xB645: 0x8A3A, //CJK UNIFIED IDEOGRAPH
+ 0xB646: 0x8A36, //CJK UNIFIED IDEOGRAPH
+ 0xB647: 0x8A56, //CJK UNIFIED IDEOGRAPH
+ 0xB648: 0x8C61, //CJK UNIFIED IDEOGRAPH
+ 0xB649: 0x8C82, //CJK UNIFIED IDEOGRAPH
+ 0xB64A: 0x8CAF, //CJK UNIFIED IDEOGRAPH
+ 0xB64B: 0x8CBC, //CJK UNIFIED IDEOGRAPH
+ 0xB64C: 0x8CB3, //CJK UNIFIED IDEOGRAPH
+ 0xB64D: 0x8CBD, //CJK UNIFIED IDEOGRAPH
+ 0xB64E: 0x8CC1, //CJK UNIFIED IDEOGRAPH
+ 0xB64F: 0x8CBB, //CJK UNIFIED IDEOGRAPH
+ 0xB650: 0x8CC0, //CJK UNIFIED IDEOGRAPH
+ 0xB651: 0x8CB4, //CJK UNIFIED IDEOGRAPH
+ 0xB652: 0x8CB7, //CJK UNIFIED IDEOGRAPH
+ 0xB653: 0x8CB6, //CJK UNIFIED IDEOGRAPH
+ 0xB654: 0x8CBF, //CJK UNIFIED IDEOGRAPH
+ 0xB655: 0x8CB8, //CJK UNIFIED IDEOGRAPH
+ 0xB656: 0x8D8A, //CJK UNIFIED IDEOGRAPH
+ 0xB657: 0x8D85, //CJK UNIFIED IDEOGRAPH
+ 0xB658: 0x8D81, //CJK UNIFIED IDEOGRAPH
+ 0xB659: 0x8DCE, //CJK UNIFIED IDEOGRAPH
+ 0xB65A: 0x8DDD, //CJK UNIFIED IDEOGRAPH
+ 0xB65B: 0x8DCB, //CJK UNIFIED IDEOGRAPH
+ 0xB65C: 0x8DDA, //CJK UNIFIED IDEOGRAPH
+ 0xB65D: 0x8DD1, //CJK UNIFIED IDEOGRAPH
+ 0xB65E: 0x8DCC, //CJK UNIFIED IDEOGRAPH
+ 0xB65F: 0x8DDB, //CJK UNIFIED IDEOGRAPH
+ 0xB660: 0x8DC6, //CJK UNIFIED IDEOGRAPH
+ 0xB661: 0x8EFB, //CJK UNIFIED IDEOGRAPH
+ 0xB662: 0x8EF8, //CJK UNIFIED IDEOGRAPH
+ 0xB663: 0x8EFC, //CJK UNIFIED IDEOGRAPH
+ 0xB664: 0x8F9C, //CJK UNIFIED IDEOGRAPH
+ 0xB665: 0x902E, //CJK UNIFIED IDEOGRAPH
+ 0xB666: 0x9035, //CJK UNIFIED IDEOGRAPH
+ 0xB667: 0x9031, //CJK UNIFIED IDEOGRAPH
+ 0xB668: 0x9038, //CJK UNIFIED IDEOGRAPH
+ 0xB669: 0x9032, //CJK UNIFIED IDEOGRAPH
+ 0xB66A: 0x9036, //CJK UNIFIED IDEOGRAPH
+ 0xB66B: 0x9102, //CJK UNIFIED IDEOGRAPH
+ 0xB66C: 0x90F5, //CJK UNIFIED IDEOGRAPH
+ 0xB66D: 0x9109, //CJK UNIFIED IDEOGRAPH
+ 0xB66E: 0x90FE, //CJK UNIFIED IDEOGRAPH
+ 0xB66F: 0x9163, //CJK UNIFIED IDEOGRAPH
+ 0xB670: 0x9165, //CJK UNIFIED IDEOGRAPH
+ 0xB671: 0x91CF, //CJK UNIFIED IDEOGRAPH
+ 0xB672: 0x9214, //CJK UNIFIED IDEOGRAPH
+ 0xB673: 0x9215, //CJK UNIFIED IDEOGRAPH
+ 0xB674: 0x9223, //CJK UNIFIED IDEOGRAPH
+ 0xB675: 0x9209, //CJK UNIFIED IDEOGRAPH
+ 0xB676: 0x921E, //CJK UNIFIED IDEOGRAPH
+ 0xB677: 0x920D, //CJK UNIFIED IDEOGRAPH
+ 0xB678: 0x9210, //CJK UNIFIED IDEOGRAPH
+ 0xB679: 0x9207, //CJK UNIFIED IDEOGRAPH
+ 0xB67A: 0x9211, //CJK UNIFIED IDEOGRAPH
+ 0xB67B: 0x9594, //CJK UNIFIED IDEOGRAPH
+ 0xB67C: 0x958F, //CJK UNIFIED IDEOGRAPH
+ 0xB67D: 0x958B, //CJK UNIFIED IDEOGRAPH
+ 0xB67E: 0x9591, //CJK UNIFIED IDEOGRAPH
+ 0xB6A1: 0x9593, //CJK UNIFIED IDEOGRAPH
+ 0xB6A2: 0x9592, //CJK UNIFIED IDEOGRAPH
+ 0xB6A3: 0x958E, //CJK UNIFIED IDEOGRAPH
+ 0xB6A4: 0x968A, //CJK UNIFIED IDEOGRAPH
+ 0xB6A5: 0x968E, //CJK UNIFIED IDEOGRAPH
+ 0xB6A6: 0x968B, //CJK UNIFIED IDEOGRAPH
+ 0xB6A7: 0x967D, //CJK UNIFIED IDEOGRAPH
+ 0xB6A8: 0x9685, //CJK UNIFIED IDEOGRAPH
+ 0xB6A9: 0x9686, //CJK UNIFIED IDEOGRAPH
+ 0xB6AA: 0x968D, //CJK UNIFIED IDEOGRAPH
+ 0xB6AB: 0x9672, //CJK UNIFIED IDEOGRAPH
+ 0xB6AC: 0x9684, //CJK UNIFIED IDEOGRAPH
+ 0xB6AD: 0x96C1, //CJK UNIFIED IDEOGRAPH
+ 0xB6AE: 0x96C5, //CJK UNIFIED IDEOGRAPH
+ 0xB6AF: 0x96C4, //CJK UNIFIED IDEOGRAPH
+ 0xB6B0: 0x96C6, //CJK UNIFIED IDEOGRAPH
+ 0xB6B1: 0x96C7, //CJK UNIFIED IDEOGRAPH
+ 0xB6B2: 0x96EF, //CJK UNIFIED IDEOGRAPH
+ 0xB6B3: 0x96F2, //CJK UNIFIED IDEOGRAPH
+ 0xB6B4: 0x97CC, //CJK UNIFIED IDEOGRAPH
+ 0xB6B5: 0x9805, //CJK UNIFIED IDEOGRAPH
+ 0xB6B6: 0x9806, //CJK UNIFIED IDEOGRAPH
+ 0xB6B7: 0x9808, //CJK UNIFIED IDEOGRAPH
+ 0xB6B8: 0x98E7, //CJK UNIFIED IDEOGRAPH
+ 0xB6B9: 0x98EA, //CJK UNIFIED IDEOGRAPH
+ 0xB6BA: 0x98EF, //CJK UNIFIED IDEOGRAPH
+ 0xB6BB: 0x98E9, //CJK UNIFIED IDEOGRAPH
+ 0xB6BC: 0x98F2, //CJK UNIFIED IDEOGRAPH
+ 0xB6BD: 0x98ED, //CJK UNIFIED IDEOGRAPH
+ 0xB6BE: 0x99AE, //CJK UNIFIED IDEOGRAPH
+ 0xB6BF: 0x99AD, //CJK UNIFIED IDEOGRAPH
+ 0xB6C0: 0x9EC3, //CJK UNIFIED IDEOGRAPH
+ 0xB6C1: 0x9ECD, //CJK UNIFIED IDEOGRAPH
+ 0xB6C2: 0x9ED1, //CJK UNIFIED IDEOGRAPH
+ 0xB6C3: 0x4E82, //CJK UNIFIED IDEOGRAPH
+ 0xB6C4: 0x50AD, //CJK UNIFIED IDEOGRAPH
+ 0xB6C5: 0x50B5, //CJK UNIFIED IDEOGRAPH
+ 0xB6C6: 0x50B2, //CJK UNIFIED IDEOGRAPH
+ 0xB6C7: 0x50B3, //CJK UNIFIED IDEOGRAPH
+ 0xB6C8: 0x50C5, //CJK UNIFIED IDEOGRAPH
+ 0xB6C9: 0x50BE, //CJK UNIFIED IDEOGRAPH
+ 0xB6CA: 0x50AC, //CJK UNIFIED IDEOGRAPH
+ 0xB6CB: 0x50B7, //CJK UNIFIED IDEOGRAPH
+ 0xB6CC: 0x50BB, //CJK UNIFIED IDEOGRAPH
+ 0xB6CD: 0x50AF, //CJK UNIFIED IDEOGRAPH
+ 0xB6CE: 0x50C7, //CJK UNIFIED IDEOGRAPH
+ 0xB6CF: 0x527F, //CJK UNIFIED IDEOGRAPH
+ 0xB6D0: 0x5277, //CJK UNIFIED IDEOGRAPH
+ 0xB6D1: 0x527D, //CJK UNIFIED IDEOGRAPH
+ 0xB6D2: 0x52DF, //CJK UNIFIED IDEOGRAPH
+ 0xB6D3: 0x52E6, //CJK UNIFIED IDEOGRAPH
+ 0xB6D4: 0x52E4, //CJK UNIFIED IDEOGRAPH
+ 0xB6D5: 0x52E2, //CJK UNIFIED IDEOGRAPH
+ 0xB6D6: 0x52E3, //CJK UNIFIED IDEOGRAPH
+ 0xB6D7: 0x532F, //CJK UNIFIED IDEOGRAPH
+ 0xB6D8: 0x55DF, //CJK UNIFIED IDEOGRAPH
+ 0xB6D9: 0x55E8, //CJK UNIFIED IDEOGRAPH
+ 0xB6DA: 0x55D3, //CJK UNIFIED IDEOGRAPH
+ 0xB6DB: 0x55E6, //CJK UNIFIED IDEOGRAPH
+ 0xB6DC: 0x55CE, //CJK UNIFIED IDEOGRAPH
+ 0xB6DD: 0x55DC, //CJK UNIFIED IDEOGRAPH
+ 0xB6DE: 0x55C7, //CJK UNIFIED IDEOGRAPH
+ 0xB6DF: 0x55D1, //CJK UNIFIED IDEOGRAPH
+ 0xB6E0: 0x55E3, //CJK UNIFIED IDEOGRAPH
+ 0xB6E1: 0x55E4, //CJK UNIFIED IDEOGRAPH
+ 0xB6E2: 0x55EF, //CJK UNIFIED IDEOGRAPH
+ 0xB6E3: 0x55DA, //CJK UNIFIED IDEOGRAPH
+ 0xB6E4: 0x55E1, //CJK UNIFIED IDEOGRAPH
+ 0xB6E5: 0x55C5, //CJK UNIFIED IDEOGRAPH
+ 0xB6E6: 0x55C6, //CJK UNIFIED IDEOGRAPH
+ 0xB6E7: 0x55E5, //CJK UNIFIED IDEOGRAPH
+ 0xB6E8: 0x55C9, //CJK UNIFIED IDEOGRAPH
+ 0xB6E9: 0x5712, //CJK UNIFIED IDEOGRAPH
+ 0xB6EA: 0x5713, //CJK UNIFIED IDEOGRAPH
+ 0xB6EB: 0x585E, //CJK UNIFIED IDEOGRAPH
+ 0xB6EC: 0x5851, //CJK UNIFIED IDEOGRAPH
+ 0xB6ED: 0x5858, //CJK UNIFIED IDEOGRAPH
+ 0xB6EE: 0x5857, //CJK UNIFIED IDEOGRAPH
+ 0xB6EF: 0x585A, //CJK UNIFIED IDEOGRAPH
+ 0xB6F0: 0x5854, //CJK UNIFIED IDEOGRAPH
+ 0xB6F1: 0x586B, //CJK UNIFIED IDEOGRAPH
+ 0xB6F2: 0x584C, //CJK UNIFIED IDEOGRAPH
+ 0xB6F3: 0x586D, //CJK UNIFIED IDEOGRAPH
+ 0xB6F4: 0x584A, //CJK UNIFIED IDEOGRAPH
+ 0xB6F5: 0x5862, //CJK UNIFIED IDEOGRAPH
+ 0xB6F6: 0x5852, //CJK UNIFIED IDEOGRAPH
+ 0xB6F7: 0x584B, //CJK UNIFIED IDEOGRAPH
+ 0xB6F8: 0x5967, //CJK UNIFIED IDEOGRAPH
+ 0xB6F9: 0x5AC1, //CJK UNIFIED IDEOGRAPH
+ 0xB6FA: 0x5AC9, //CJK UNIFIED IDEOGRAPH
+ 0xB6FB: 0x5ACC, //CJK UNIFIED IDEOGRAPH
+ 0xB6FC: 0x5ABE, //CJK UNIFIED IDEOGRAPH
+ 0xB6FD: 0x5ABD, //CJK UNIFIED IDEOGRAPH
+ 0xB6FE: 0x5ABC, //CJK UNIFIED IDEOGRAPH
+ 0xB740: 0x5AB3, //CJK UNIFIED IDEOGRAPH
+ 0xB741: 0x5AC2, //CJK UNIFIED IDEOGRAPH
+ 0xB742: 0x5AB2, //CJK UNIFIED IDEOGRAPH
+ 0xB743: 0x5D69, //CJK UNIFIED IDEOGRAPH
+ 0xB744: 0x5D6F, //CJK UNIFIED IDEOGRAPH
+ 0xB745: 0x5E4C, //CJK UNIFIED IDEOGRAPH
+ 0xB746: 0x5E79, //CJK UNIFIED IDEOGRAPH
+ 0xB747: 0x5EC9, //CJK UNIFIED IDEOGRAPH
+ 0xB748: 0x5EC8, //CJK UNIFIED IDEOGRAPH
+ 0xB749: 0x5F12, //CJK UNIFIED IDEOGRAPH
+ 0xB74A: 0x5F59, //CJK UNIFIED IDEOGRAPH
+ 0xB74B: 0x5FAC, //CJK UNIFIED IDEOGRAPH
+ 0xB74C: 0x5FAE, //CJK UNIFIED IDEOGRAPH
+ 0xB74D: 0x611A, //CJK UNIFIED IDEOGRAPH
+ 0xB74E: 0x610F, //CJK UNIFIED IDEOGRAPH
+ 0xB74F: 0x6148, //CJK UNIFIED IDEOGRAPH
+ 0xB750: 0x611F, //CJK UNIFIED IDEOGRAPH
+ 0xB751: 0x60F3, //CJK UNIFIED IDEOGRAPH
+ 0xB752: 0x611B, //CJK UNIFIED IDEOGRAPH
+ 0xB753: 0x60F9, //CJK UNIFIED IDEOGRAPH
+ 0xB754: 0x6101, //CJK UNIFIED IDEOGRAPH
+ 0xB755: 0x6108, //CJK UNIFIED IDEOGRAPH
+ 0xB756: 0x614E, //CJK UNIFIED IDEOGRAPH
+ 0xB757: 0x614C, //CJK UNIFIED IDEOGRAPH
+ 0xB758: 0x6144, //CJK UNIFIED IDEOGRAPH
+ 0xB759: 0x614D, //CJK UNIFIED IDEOGRAPH
+ 0xB75A: 0x613E, //CJK UNIFIED IDEOGRAPH
+ 0xB75B: 0x6134, //CJK UNIFIED IDEOGRAPH
+ 0xB75C: 0x6127, //CJK UNIFIED IDEOGRAPH
+ 0xB75D: 0x610D, //CJK UNIFIED IDEOGRAPH
+ 0xB75E: 0x6106, //CJK UNIFIED IDEOGRAPH
+ 0xB75F: 0x6137, //CJK UNIFIED IDEOGRAPH
+ 0xB760: 0x6221, //CJK UNIFIED IDEOGRAPH
+ 0xB761: 0x6222, //CJK UNIFIED IDEOGRAPH
+ 0xB762: 0x6413, //CJK UNIFIED IDEOGRAPH
+ 0xB763: 0x643E, //CJK UNIFIED IDEOGRAPH
+ 0xB764: 0x641E, //CJK UNIFIED IDEOGRAPH
+ 0xB765: 0x642A, //CJK UNIFIED IDEOGRAPH
+ 0xB766: 0x642D, //CJK UNIFIED IDEOGRAPH
+ 0xB767: 0x643D, //CJK UNIFIED IDEOGRAPH
+ 0xB768: 0x642C, //CJK UNIFIED IDEOGRAPH
+ 0xB769: 0x640F, //CJK UNIFIED IDEOGRAPH
+ 0xB76A: 0x641C, //CJK UNIFIED IDEOGRAPH
+ 0xB76B: 0x6414, //CJK UNIFIED IDEOGRAPH
+ 0xB76C: 0x640D, //CJK UNIFIED IDEOGRAPH
+ 0xB76D: 0x6436, //CJK UNIFIED IDEOGRAPH
+ 0xB76E: 0x6416, //CJK UNIFIED IDEOGRAPH
+ 0xB76F: 0x6417, //CJK UNIFIED IDEOGRAPH
+ 0xB770: 0x6406, //CJK UNIFIED IDEOGRAPH
+ 0xB771: 0x656C, //CJK UNIFIED IDEOGRAPH
+ 0xB772: 0x659F, //CJK UNIFIED IDEOGRAPH
+ 0xB773: 0x65B0, //CJK UNIFIED IDEOGRAPH
+ 0xB774: 0x6697, //CJK UNIFIED IDEOGRAPH
+ 0xB775: 0x6689, //CJK UNIFIED IDEOGRAPH
+ 0xB776: 0x6687, //CJK UNIFIED IDEOGRAPH
+ 0xB777: 0x6688, //CJK UNIFIED IDEOGRAPH
+ 0xB778: 0x6696, //CJK UNIFIED IDEOGRAPH
+ 0xB779: 0x6684, //CJK UNIFIED IDEOGRAPH
+ 0xB77A: 0x6698, //CJK UNIFIED IDEOGRAPH
+ 0xB77B: 0x668D, //CJK UNIFIED IDEOGRAPH
+ 0xB77C: 0x6703, //CJK UNIFIED IDEOGRAPH
+ 0xB77D: 0x6994, //CJK UNIFIED IDEOGRAPH
+ 0xB77E: 0x696D, //CJK UNIFIED IDEOGRAPH
+ 0xB7A1: 0x695A, //CJK UNIFIED IDEOGRAPH
+ 0xB7A2: 0x6977, //CJK UNIFIED IDEOGRAPH
+ 0xB7A3: 0x6960, //CJK UNIFIED IDEOGRAPH
+ 0xB7A4: 0x6954, //CJK UNIFIED IDEOGRAPH
+ 0xB7A5: 0x6975, //CJK UNIFIED IDEOGRAPH
+ 0xB7A6: 0x6930, //CJK UNIFIED IDEOGRAPH
+ 0xB7A7: 0x6982, //CJK UNIFIED IDEOGRAPH
+ 0xB7A8: 0x694A, //CJK UNIFIED IDEOGRAPH
+ 0xB7A9: 0x6968, //CJK UNIFIED IDEOGRAPH
+ 0xB7AA: 0x696B, //CJK UNIFIED IDEOGRAPH
+ 0xB7AB: 0x695E, //CJK UNIFIED IDEOGRAPH
+ 0xB7AC: 0x6953, //CJK UNIFIED IDEOGRAPH
+ 0xB7AD: 0x6979, //CJK UNIFIED IDEOGRAPH
+ 0xB7AE: 0x6986, //CJK UNIFIED IDEOGRAPH
+ 0xB7AF: 0x695D, //CJK UNIFIED IDEOGRAPH
+ 0xB7B0: 0x6963, //CJK UNIFIED IDEOGRAPH
+ 0xB7B1: 0x695B, //CJK UNIFIED IDEOGRAPH
+ 0xB7B2: 0x6B47, //CJK UNIFIED IDEOGRAPH
+ 0xB7B3: 0x6B72, //CJK UNIFIED IDEOGRAPH
+ 0xB7B4: 0x6BC0, //CJK UNIFIED IDEOGRAPH
+ 0xB7B5: 0x6BBF, //CJK UNIFIED IDEOGRAPH
+ 0xB7B6: 0x6BD3, //CJK UNIFIED IDEOGRAPH
+ 0xB7B7: 0x6BFD, //CJK UNIFIED IDEOGRAPH
+ 0xB7B8: 0x6EA2, //CJK UNIFIED IDEOGRAPH
+ 0xB7B9: 0x6EAF, //CJK UNIFIED IDEOGRAPH
+ 0xB7BA: 0x6ED3, //CJK UNIFIED IDEOGRAPH
+ 0xB7BB: 0x6EB6, //CJK UNIFIED IDEOGRAPH
+ 0xB7BC: 0x6EC2, //CJK UNIFIED IDEOGRAPH
+ 0xB7BD: 0x6E90, //CJK UNIFIED IDEOGRAPH
+ 0xB7BE: 0x6E9D, //CJK UNIFIED IDEOGRAPH
+ 0xB7BF: 0x6EC7, //CJK UNIFIED IDEOGRAPH
+ 0xB7C0: 0x6EC5, //CJK UNIFIED IDEOGRAPH
+ 0xB7C1: 0x6EA5, //CJK UNIFIED IDEOGRAPH
+ 0xB7C2: 0x6E98, //CJK UNIFIED IDEOGRAPH
+ 0xB7C3: 0x6EBC, //CJK UNIFIED IDEOGRAPH
+ 0xB7C4: 0x6EBA, //CJK UNIFIED IDEOGRAPH
+ 0xB7C5: 0x6EAB, //CJK UNIFIED IDEOGRAPH
+ 0xB7C6: 0x6ED1, //CJK UNIFIED IDEOGRAPH
+ 0xB7C7: 0x6E96, //CJK UNIFIED IDEOGRAPH
+ 0xB7C8: 0x6E9C, //CJK UNIFIED IDEOGRAPH
+ 0xB7C9: 0x6EC4, //CJK UNIFIED IDEOGRAPH
+ 0xB7CA: 0x6ED4, //CJK UNIFIED IDEOGRAPH
+ 0xB7CB: 0x6EAA, //CJK UNIFIED IDEOGRAPH
+ 0xB7CC: 0x6EA7, //CJK UNIFIED IDEOGRAPH
+ 0xB7CD: 0x6EB4, //CJK UNIFIED IDEOGRAPH
+ 0xB7CE: 0x714E, //CJK UNIFIED IDEOGRAPH
+ 0xB7CF: 0x7159, //CJK UNIFIED IDEOGRAPH
+ 0xB7D0: 0x7169, //CJK UNIFIED IDEOGRAPH
+ 0xB7D1: 0x7164, //CJK UNIFIED IDEOGRAPH
+ 0xB7D2: 0x7149, //CJK UNIFIED IDEOGRAPH
+ 0xB7D3: 0x7167, //CJK UNIFIED IDEOGRAPH
+ 0xB7D4: 0x715C, //CJK UNIFIED IDEOGRAPH
+ 0xB7D5: 0x716C, //CJK UNIFIED IDEOGRAPH
+ 0xB7D6: 0x7166, //CJK UNIFIED IDEOGRAPH
+ 0xB7D7: 0x714C, //CJK UNIFIED IDEOGRAPH
+ 0xB7D8: 0x7165, //CJK UNIFIED IDEOGRAPH
+ 0xB7D9: 0x715E, //CJK UNIFIED IDEOGRAPH
+ 0xB7DA: 0x7146, //CJK UNIFIED IDEOGRAPH
+ 0xB7DB: 0x7168, //CJK UNIFIED IDEOGRAPH
+ 0xB7DC: 0x7156, //CJK UNIFIED IDEOGRAPH
+ 0xB7DD: 0x723A, //CJK UNIFIED IDEOGRAPH
+ 0xB7DE: 0x7252, //CJK UNIFIED IDEOGRAPH
+ 0xB7DF: 0x7337, //CJK UNIFIED IDEOGRAPH
+ 0xB7E0: 0x7345, //CJK UNIFIED IDEOGRAPH
+ 0xB7E1: 0x733F, //CJK UNIFIED IDEOGRAPH
+ 0xB7E2: 0x733E, //CJK UNIFIED IDEOGRAPH
+ 0xB7E3: 0x746F, //CJK UNIFIED IDEOGRAPH
+ 0xB7E4: 0x745A, //CJK UNIFIED IDEOGRAPH
+ 0xB7E5: 0x7455, //CJK UNIFIED IDEOGRAPH
+ 0xB7E6: 0x745F, //CJK UNIFIED IDEOGRAPH
+ 0xB7E7: 0x745E, //CJK UNIFIED IDEOGRAPH
+ 0xB7E8: 0x7441, //CJK UNIFIED IDEOGRAPH
+ 0xB7E9: 0x743F, //CJK UNIFIED IDEOGRAPH
+ 0xB7EA: 0x7459, //CJK UNIFIED IDEOGRAPH
+ 0xB7EB: 0x745B, //CJK UNIFIED IDEOGRAPH
+ 0xB7EC: 0x745C, //CJK UNIFIED IDEOGRAPH
+ 0xB7ED: 0x7576, //CJK UNIFIED IDEOGRAPH
+ 0xB7EE: 0x7578, //CJK UNIFIED IDEOGRAPH
+ 0xB7EF: 0x7600, //CJK UNIFIED IDEOGRAPH
+ 0xB7F0: 0x75F0, //CJK UNIFIED IDEOGRAPH
+ 0xB7F1: 0x7601, //CJK UNIFIED IDEOGRAPH
+ 0xB7F2: 0x75F2, //CJK UNIFIED IDEOGRAPH
+ 0xB7F3: 0x75F1, //CJK UNIFIED IDEOGRAPH
+ 0xB7F4: 0x75FA, //CJK UNIFIED IDEOGRAPH
+ 0xB7F5: 0x75FF, //CJK UNIFIED IDEOGRAPH
+ 0xB7F6: 0x75F4, //CJK UNIFIED IDEOGRAPH
+ 0xB7F7: 0x75F3, //CJK UNIFIED IDEOGRAPH
+ 0xB7F8: 0x76DE, //CJK UNIFIED IDEOGRAPH
+ 0xB7F9: 0x76DF, //CJK UNIFIED IDEOGRAPH
+ 0xB7FA: 0x775B, //CJK UNIFIED IDEOGRAPH
+ 0xB7FB: 0x776B, //CJK UNIFIED IDEOGRAPH
+ 0xB7FC: 0x7766, //CJK UNIFIED IDEOGRAPH
+ 0xB7FD: 0x775E, //CJK UNIFIED IDEOGRAPH
+ 0xB7FE: 0x7763, //CJK UNIFIED IDEOGRAPH
+ 0xB840: 0x7779, //CJK UNIFIED IDEOGRAPH
+ 0xB841: 0x776A, //CJK UNIFIED IDEOGRAPH
+ 0xB842: 0x776C, //CJK UNIFIED IDEOGRAPH
+ 0xB843: 0x775C, //CJK UNIFIED IDEOGRAPH
+ 0xB844: 0x7765, //CJK UNIFIED IDEOGRAPH
+ 0xB845: 0x7768, //CJK UNIFIED IDEOGRAPH
+ 0xB846: 0x7762, //CJK UNIFIED IDEOGRAPH
+ 0xB847: 0x77EE, //CJK UNIFIED IDEOGRAPH
+ 0xB848: 0x788E, //CJK UNIFIED IDEOGRAPH
+ 0xB849: 0x78B0, //CJK UNIFIED IDEOGRAPH
+ 0xB84A: 0x7897, //CJK UNIFIED IDEOGRAPH
+ 0xB84B: 0x7898, //CJK UNIFIED IDEOGRAPH
+ 0xB84C: 0x788C, //CJK UNIFIED IDEOGRAPH
+ 0xB84D: 0x7889, //CJK UNIFIED IDEOGRAPH
+ 0xB84E: 0x787C, //CJK UNIFIED IDEOGRAPH
+ 0xB84F: 0x7891, //CJK UNIFIED IDEOGRAPH
+ 0xB850: 0x7893, //CJK UNIFIED IDEOGRAPH
+ 0xB851: 0x787F, //CJK UNIFIED IDEOGRAPH
+ 0xB852: 0x797A, //CJK UNIFIED IDEOGRAPH
+ 0xB853: 0x797F, //CJK UNIFIED IDEOGRAPH
+ 0xB854: 0x7981, //CJK UNIFIED IDEOGRAPH
+ 0xB855: 0x842C, //CJK UNIFIED IDEOGRAPH
+ 0xB856: 0x79BD, //CJK UNIFIED IDEOGRAPH
+ 0xB857: 0x7A1C, //CJK UNIFIED IDEOGRAPH
+ 0xB858: 0x7A1A, //CJK UNIFIED IDEOGRAPH
+ 0xB859: 0x7A20, //CJK UNIFIED IDEOGRAPH
+ 0xB85A: 0x7A14, //CJK UNIFIED IDEOGRAPH
+ 0xB85B: 0x7A1F, //CJK UNIFIED IDEOGRAPH
+ 0xB85C: 0x7A1E, //CJK UNIFIED IDEOGRAPH
+ 0xB85D: 0x7A9F, //CJK UNIFIED IDEOGRAPH
+ 0xB85E: 0x7AA0, //CJK UNIFIED IDEOGRAPH
+ 0xB85F: 0x7B77, //CJK UNIFIED IDEOGRAPH
+ 0xB860: 0x7BC0, //CJK UNIFIED IDEOGRAPH
+ 0xB861: 0x7B60, //CJK UNIFIED IDEOGRAPH
+ 0xB862: 0x7B6E, //CJK UNIFIED IDEOGRAPH
+ 0xB863: 0x7B67, //CJK UNIFIED IDEOGRAPH
+ 0xB864: 0x7CB1, //CJK UNIFIED IDEOGRAPH
+ 0xB865: 0x7CB3, //CJK UNIFIED IDEOGRAPH
+ 0xB866: 0x7CB5, //CJK UNIFIED IDEOGRAPH
+ 0xB867: 0x7D93, //CJK UNIFIED IDEOGRAPH
+ 0xB868: 0x7D79, //CJK UNIFIED IDEOGRAPH
+ 0xB869: 0x7D91, //CJK UNIFIED IDEOGRAPH
+ 0xB86A: 0x7D81, //CJK UNIFIED IDEOGRAPH
+ 0xB86B: 0x7D8F, //CJK UNIFIED IDEOGRAPH
+ 0xB86C: 0x7D5B, //CJK UNIFIED IDEOGRAPH
+ 0xB86D: 0x7F6E, //CJK UNIFIED IDEOGRAPH
+ 0xB86E: 0x7F69, //CJK UNIFIED IDEOGRAPH
+ 0xB86F: 0x7F6A, //CJK UNIFIED IDEOGRAPH
+ 0xB870: 0x7F72, //CJK UNIFIED IDEOGRAPH
+ 0xB871: 0x7FA9, //CJK UNIFIED IDEOGRAPH
+ 0xB872: 0x7FA8, //CJK UNIFIED IDEOGRAPH
+ 0xB873: 0x7FA4, //CJK UNIFIED IDEOGRAPH
+ 0xB874: 0x8056, //CJK UNIFIED IDEOGRAPH
+ 0xB875: 0x8058, //CJK UNIFIED IDEOGRAPH
+ 0xB876: 0x8086, //CJK UNIFIED IDEOGRAPH
+ 0xB877: 0x8084, //CJK UNIFIED IDEOGRAPH
+ 0xB878: 0x8171, //CJK UNIFIED IDEOGRAPH
+ 0xB879: 0x8170, //CJK UNIFIED IDEOGRAPH
+ 0xB87A: 0x8178, //CJK UNIFIED IDEOGRAPH
+ 0xB87B: 0x8165, //CJK UNIFIED IDEOGRAPH
+ 0xB87C: 0x816E, //CJK UNIFIED IDEOGRAPH
+ 0xB87D: 0x8173, //CJK UNIFIED IDEOGRAPH
+ 0xB87E: 0x816B, //CJK UNIFIED IDEOGRAPH
+ 0xB8A1: 0x8179, //CJK UNIFIED IDEOGRAPH
+ 0xB8A2: 0x817A, //CJK UNIFIED IDEOGRAPH
+ 0xB8A3: 0x8166, //CJK UNIFIED IDEOGRAPH
+ 0xB8A4: 0x8205, //CJK UNIFIED IDEOGRAPH
+ 0xB8A5: 0x8247, //CJK UNIFIED IDEOGRAPH
+ 0xB8A6: 0x8482, //CJK UNIFIED IDEOGRAPH
+ 0xB8A7: 0x8477, //CJK UNIFIED IDEOGRAPH
+ 0xB8A8: 0x843D, //CJK UNIFIED IDEOGRAPH
+ 0xB8A9: 0x8431, //CJK UNIFIED IDEOGRAPH
+ 0xB8AA: 0x8475, //CJK UNIFIED IDEOGRAPH
+ 0xB8AB: 0x8466, //CJK UNIFIED IDEOGRAPH
+ 0xB8AC: 0x846B, //CJK UNIFIED IDEOGRAPH
+ 0xB8AD: 0x8449, //CJK UNIFIED IDEOGRAPH
+ 0xB8AE: 0x846C, //CJK UNIFIED IDEOGRAPH
+ 0xB8AF: 0x845B, //CJK UNIFIED IDEOGRAPH
+ 0xB8B0: 0x843C, //CJK UNIFIED IDEOGRAPH
+ 0xB8B1: 0x8435, //CJK UNIFIED IDEOGRAPH
+ 0xB8B2: 0x8461, //CJK UNIFIED IDEOGRAPH
+ 0xB8B3: 0x8463, //CJK UNIFIED IDEOGRAPH
+ 0xB8B4: 0x8469, //CJK UNIFIED IDEOGRAPH
+ 0xB8B5: 0x846D, //CJK UNIFIED IDEOGRAPH
+ 0xB8B6: 0x8446, //CJK UNIFIED IDEOGRAPH
+ 0xB8B7: 0x865E, //CJK UNIFIED IDEOGRAPH
+ 0xB8B8: 0x865C, //CJK UNIFIED IDEOGRAPH
+ 0xB8B9: 0x865F, //CJK UNIFIED IDEOGRAPH
+ 0xB8BA: 0x86F9, //CJK UNIFIED IDEOGRAPH
+ 0xB8BB: 0x8713, //CJK UNIFIED IDEOGRAPH
+ 0xB8BC: 0x8708, //CJK UNIFIED IDEOGRAPH
+ 0xB8BD: 0x8707, //CJK UNIFIED IDEOGRAPH
+ 0xB8BE: 0x8700, //CJK UNIFIED IDEOGRAPH
+ 0xB8BF: 0x86FE, //CJK UNIFIED IDEOGRAPH
+ 0xB8C0: 0x86FB, //CJK UNIFIED IDEOGRAPH
+ 0xB8C1: 0x8702, //CJK UNIFIED IDEOGRAPH
+ 0xB8C2: 0x8703, //CJK UNIFIED IDEOGRAPH
+ 0xB8C3: 0x8706, //CJK UNIFIED IDEOGRAPH
+ 0xB8C4: 0x870A, //CJK UNIFIED IDEOGRAPH
+ 0xB8C5: 0x8859, //CJK UNIFIED IDEOGRAPH
+ 0xB8C6: 0x88DF, //CJK UNIFIED IDEOGRAPH
+ 0xB8C7: 0x88D4, //CJK UNIFIED IDEOGRAPH
+ 0xB8C8: 0x88D9, //CJK UNIFIED IDEOGRAPH
+ 0xB8C9: 0x88DC, //CJK UNIFIED IDEOGRAPH
+ 0xB8CA: 0x88D8, //CJK UNIFIED IDEOGRAPH
+ 0xB8CB: 0x88DD, //CJK UNIFIED IDEOGRAPH
+ 0xB8CC: 0x88E1, //CJK UNIFIED IDEOGRAPH
+ 0xB8CD: 0x88CA, //CJK UNIFIED IDEOGRAPH
+ 0xB8CE: 0x88D5, //CJK UNIFIED IDEOGRAPH
+ 0xB8CF: 0x88D2, //CJK UNIFIED IDEOGRAPH
+ 0xB8D0: 0x899C, //CJK UNIFIED IDEOGRAPH
+ 0xB8D1: 0x89E3, //CJK UNIFIED IDEOGRAPH
+ 0xB8D2: 0x8A6B, //CJK UNIFIED IDEOGRAPH
+ 0xB8D3: 0x8A72, //CJK UNIFIED IDEOGRAPH
+ 0xB8D4: 0x8A73, //CJK UNIFIED IDEOGRAPH
+ 0xB8D5: 0x8A66, //CJK UNIFIED IDEOGRAPH
+ 0xB8D6: 0x8A69, //CJK UNIFIED IDEOGRAPH
+ 0xB8D7: 0x8A70, //CJK UNIFIED IDEOGRAPH
+ 0xB8D8: 0x8A87, //CJK UNIFIED IDEOGRAPH
+ 0xB8D9: 0x8A7C, //CJK UNIFIED IDEOGRAPH
+ 0xB8DA: 0x8A63, //CJK UNIFIED IDEOGRAPH
+ 0xB8DB: 0x8AA0, //CJK UNIFIED IDEOGRAPH
+ 0xB8DC: 0x8A71, //CJK UNIFIED IDEOGRAPH
+ 0xB8DD: 0x8A85, //CJK UNIFIED IDEOGRAPH
+ 0xB8DE: 0x8A6D, //CJK UNIFIED IDEOGRAPH
+ 0xB8DF: 0x8A62, //CJK UNIFIED IDEOGRAPH
+ 0xB8E0: 0x8A6E, //CJK UNIFIED IDEOGRAPH
+ 0xB8E1: 0x8A6C, //CJK UNIFIED IDEOGRAPH
+ 0xB8E2: 0x8A79, //CJK UNIFIED IDEOGRAPH
+ 0xB8E3: 0x8A7B, //CJK UNIFIED IDEOGRAPH
+ 0xB8E4: 0x8A3E, //CJK UNIFIED IDEOGRAPH
+ 0xB8E5: 0x8A68, //CJK UNIFIED IDEOGRAPH
+ 0xB8E6: 0x8C62, //CJK UNIFIED IDEOGRAPH
+ 0xB8E7: 0x8C8A, //CJK UNIFIED IDEOGRAPH
+ 0xB8E8: 0x8C89, //CJK UNIFIED IDEOGRAPH
+ 0xB8E9: 0x8CCA, //CJK UNIFIED IDEOGRAPH
+ 0xB8EA: 0x8CC7, //CJK UNIFIED IDEOGRAPH
+ 0xB8EB: 0x8CC8, //CJK UNIFIED IDEOGRAPH
+ 0xB8EC: 0x8CC4, //CJK UNIFIED IDEOGRAPH
+ 0xB8ED: 0x8CB2, //CJK UNIFIED IDEOGRAPH
+ 0xB8EE: 0x8CC3, //CJK UNIFIED IDEOGRAPH
+ 0xB8EF: 0x8CC2, //CJK UNIFIED IDEOGRAPH
+ 0xB8F0: 0x8CC5, //CJK UNIFIED IDEOGRAPH
+ 0xB8F1: 0x8DE1, //CJK UNIFIED IDEOGRAPH
+ 0xB8F2: 0x8DDF, //CJK UNIFIED IDEOGRAPH
+ 0xB8F3: 0x8DE8, //CJK UNIFIED IDEOGRAPH
+ 0xB8F4: 0x8DEF, //CJK UNIFIED IDEOGRAPH
+ 0xB8F5: 0x8DF3, //CJK UNIFIED IDEOGRAPH
+ 0xB8F6: 0x8DFA, //CJK UNIFIED IDEOGRAPH
+ 0xB8F7: 0x8DEA, //CJK UNIFIED IDEOGRAPH
+ 0xB8F8: 0x8DE4, //CJK UNIFIED IDEOGRAPH
+ 0xB8F9: 0x8DE6, //CJK UNIFIED IDEOGRAPH
+ 0xB8FA: 0x8EB2, //CJK UNIFIED IDEOGRAPH
+ 0xB8FB: 0x8F03, //CJK UNIFIED IDEOGRAPH
+ 0xB8FC: 0x8F09, //CJK UNIFIED IDEOGRAPH
+ 0xB8FD: 0x8EFE, //CJK UNIFIED IDEOGRAPH
+ 0xB8FE: 0x8F0A, //CJK UNIFIED IDEOGRAPH
+ 0xB940: 0x8F9F, //CJK UNIFIED IDEOGRAPH
+ 0xB941: 0x8FB2, //CJK UNIFIED IDEOGRAPH
+ 0xB942: 0x904B, //CJK UNIFIED IDEOGRAPH
+ 0xB943: 0x904A, //CJK UNIFIED IDEOGRAPH
+ 0xB944: 0x9053, //CJK UNIFIED IDEOGRAPH
+ 0xB945: 0x9042, //CJK UNIFIED IDEOGRAPH
+ 0xB946: 0x9054, //CJK UNIFIED IDEOGRAPH
+ 0xB947: 0x903C, //CJK UNIFIED IDEOGRAPH
+ 0xB948: 0x9055, //CJK UNIFIED IDEOGRAPH
+ 0xB949: 0x9050, //CJK UNIFIED IDEOGRAPH
+ 0xB94A: 0x9047, //CJK UNIFIED IDEOGRAPH
+ 0xB94B: 0x904F, //CJK UNIFIED IDEOGRAPH
+ 0xB94C: 0x904E, //CJK UNIFIED IDEOGRAPH
+ 0xB94D: 0x904D, //CJK UNIFIED IDEOGRAPH
+ 0xB94E: 0x9051, //CJK UNIFIED IDEOGRAPH
+ 0xB94F: 0x903E, //CJK UNIFIED IDEOGRAPH
+ 0xB950: 0x9041, //CJK UNIFIED IDEOGRAPH
+ 0xB951: 0x9112, //CJK UNIFIED IDEOGRAPH
+ 0xB952: 0x9117, //CJK UNIFIED IDEOGRAPH
+ 0xB953: 0x916C, //CJK UNIFIED IDEOGRAPH
+ 0xB954: 0x916A, //CJK UNIFIED IDEOGRAPH
+ 0xB955: 0x9169, //CJK UNIFIED IDEOGRAPH
+ 0xB956: 0x91C9, //CJK UNIFIED IDEOGRAPH
+ 0xB957: 0x9237, //CJK UNIFIED IDEOGRAPH
+ 0xB958: 0x9257, //CJK UNIFIED IDEOGRAPH
+ 0xB959: 0x9238, //CJK UNIFIED IDEOGRAPH
+ 0xB95A: 0x923D, //CJK UNIFIED IDEOGRAPH
+ 0xB95B: 0x9240, //CJK UNIFIED IDEOGRAPH
+ 0xB95C: 0x923E, //CJK UNIFIED IDEOGRAPH
+ 0xB95D: 0x925B, //CJK UNIFIED IDEOGRAPH
+ 0xB95E: 0x924B, //CJK UNIFIED IDEOGRAPH
+ 0xB95F: 0x9264, //CJK UNIFIED IDEOGRAPH
+ 0xB960: 0x9251, //CJK UNIFIED IDEOGRAPH
+ 0xB961: 0x9234, //CJK UNIFIED IDEOGRAPH
+ 0xB962: 0x9249, //CJK UNIFIED IDEOGRAPH
+ 0xB963: 0x924D, //CJK UNIFIED IDEOGRAPH
+ 0xB964: 0x9245, //CJK UNIFIED IDEOGRAPH
+ 0xB965: 0x9239, //CJK UNIFIED IDEOGRAPH
+ 0xB966: 0x923F, //CJK UNIFIED IDEOGRAPH
+ 0xB967: 0x925A, //CJK UNIFIED IDEOGRAPH
+ 0xB968: 0x9598, //CJK UNIFIED IDEOGRAPH
+ 0xB969: 0x9698, //CJK UNIFIED IDEOGRAPH
+ 0xB96A: 0x9694, //CJK UNIFIED IDEOGRAPH
+ 0xB96B: 0x9695, //CJK UNIFIED IDEOGRAPH
+ 0xB96C: 0x96CD, //CJK UNIFIED IDEOGRAPH
+ 0xB96D: 0x96CB, //CJK UNIFIED IDEOGRAPH
+ 0xB96E: 0x96C9, //CJK UNIFIED IDEOGRAPH
+ 0xB96F: 0x96CA, //CJK UNIFIED IDEOGRAPH
+ 0xB970: 0x96F7, //CJK UNIFIED IDEOGRAPH
+ 0xB971: 0x96FB, //CJK UNIFIED IDEOGRAPH
+ 0xB972: 0x96F9, //CJK UNIFIED IDEOGRAPH
+ 0xB973: 0x96F6, //CJK UNIFIED IDEOGRAPH
+ 0xB974: 0x9756, //CJK UNIFIED IDEOGRAPH
+ 0xB975: 0x9774, //CJK UNIFIED IDEOGRAPH
+ 0xB976: 0x9776, //CJK UNIFIED IDEOGRAPH
+ 0xB977: 0x9810, //CJK UNIFIED IDEOGRAPH
+ 0xB978: 0x9811, //CJK UNIFIED IDEOGRAPH
+ 0xB979: 0x9813, //CJK UNIFIED IDEOGRAPH
+ 0xB97A: 0x980A, //CJK UNIFIED IDEOGRAPH
+ 0xB97B: 0x9812, //CJK UNIFIED IDEOGRAPH
+ 0xB97C: 0x980C, //CJK UNIFIED IDEOGRAPH
+ 0xB97D: 0x98FC, //CJK UNIFIED IDEOGRAPH
+ 0xB97E: 0x98F4, //CJK UNIFIED IDEOGRAPH
+ 0xB9A1: 0x98FD, //CJK UNIFIED IDEOGRAPH
+ 0xB9A2: 0x98FE, //CJK UNIFIED IDEOGRAPH
+ 0xB9A3: 0x99B3, //CJK UNIFIED IDEOGRAPH
+ 0xB9A4: 0x99B1, //CJK UNIFIED IDEOGRAPH
+ 0xB9A5: 0x99B4, //CJK UNIFIED IDEOGRAPH
+ 0xB9A6: 0x9AE1, //CJK UNIFIED IDEOGRAPH
+ 0xB9A7: 0x9CE9, //CJK UNIFIED IDEOGRAPH
+ 0xB9A8: 0x9E82, //CJK UNIFIED IDEOGRAPH
+ 0xB9A9: 0x9F0E, //CJK UNIFIED IDEOGRAPH
+ 0xB9AA: 0x9F13, //CJK UNIFIED IDEOGRAPH
+ 0xB9AB: 0x9F20, //CJK UNIFIED IDEOGRAPH
+ 0xB9AC: 0x50E7, //CJK UNIFIED IDEOGRAPH
+ 0xB9AD: 0x50EE, //CJK UNIFIED IDEOGRAPH
+ 0xB9AE: 0x50E5, //CJK UNIFIED IDEOGRAPH
+ 0xB9AF: 0x50D6, //CJK UNIFIED IDEOGRAPH
+ 0xB9B0: 0x50ED, //CJK UNIFIED IDEOGRAPH
+ 0xB9B1: 0x50DA, //CJK UNIFIED IDEOGRAPH
+ 0xB9B2: 0x50D5, //CJK UNIFIED IDEOGRAPH
+ 0xB9B3: 0x50CF, //CJK UNIFIED IDEOGRAPH
+ 0xB9B4: 0x50D1, //CJK UNIFIED IDEOGRAPH
+ 0xB9B5: 0x50F1, //CJK UNIFIED IDEOGRAPH
+ 0xB9B6: 0x50CE, //CJK UNIFIED IDEOGRAPH
+ 0xB9B7: 0x50E9, //CJK UNIFIED IDEOGRAPH
+ 0xB9B8: 0x5162, //CJK UNIFIED IDEOGRAPH
+ 0xB9B9: 0x51F3, //CJK UNIFIED IDEOGRAPH
+ 0xB9BA: 0x5283, //CJK UNIFIED IDEOGRAPH
+ 0xB9BB: 0x5282, //CJK UNIFIED IDEOGRAPH
+ 0xB9BC: 0x5331, //CJK UNIFIED IDEOGRAPH
+ 0xB9BD: 0x53AD, //CJK UNIFIED IDEOGRAPH
+ 0xB9BE: 0x55FE, //CJK UNIFIED IDEOGRAPH
+ 0xB9BF: 0x5600, //CJK UNIFIED IDEOGRAPH
+ 0xB9C0: 0x561B, //CJK UNIFIED IDEOGRAPH
+ 0xB9C1: 0x5617, //CJK UNIFIED IDEOGRAPH
+ 0xB9C2: 0x55FD, //CJK UNIFIED IDEOGRAPH
+ 0xB9C3: 0x5614, //CJK UNIFIED IDEOGRAPH
+ 0xB9C4: 0x5606, //CJK UNIFIED IDEOGRAPH
+ 0xB9C5: 0x5609, //CJK UNIFIED IDEOGRAPH
+ 0xB9C6: 0x560D, //CJK UNIFIED IDEOGRAPH
+ 0xB9C7: 0x560E, //CJK UNIFIED IDEOGRAPH
+ 0xB9C8: 0x55F7, //CJK UNIFIED IDEOGRAPH
+ 0xB9C9: 0x5616, //CJK UNIFIED IDEOGRAPH
+ 0xB9CA: 0x561F, //CJK UNIFIED IDEOGRAPH
+ 0xB9CB: 0x5608, //CJK UNIFIED IDEOGRAPH
+ 0xB9CC: 0x5610, //CJK UNIFIED IDEOGRAPH
+ 0xB9CD: 0x55F6, //CJK UNIFIED IDEOGRAPH
+ 0xB9CE: 0x5718, //CJK UNIFIED IDEOGRAPH
+ 0xB9CF: 0x5716, //CJK UNIFIED IDEOGRAPH
+ 0xB9D0: 0x5875, //CJK UNIFIED IDEOGRAPH
+ 0xB9D1: 0x587E, //CJK UNIFIED IDEOGRAPH
+ 0xB9D2: 0x5883, //CJK UNIFIED IDEOGRAPH
+ 0xB9D3: 0x5893, //CJK UNIFIED IDEOGRAPH
+ 0xB9D4: 0x588A, //CJK UNIFIED IDEOGRAPH
+ 0xB9D5: 0x5879, //CJK UNIFIED IDEOGRAPH
+ 0xB9D6: 0x5885, //CJK UNIFIED IDEOGRAPH
+ 0xB9D7: 0x587D, //CJK UNIFIED IDEOGRAPH
+ 0xB9D8: 0x58FD, //CJK UNIFIED IDEOGRAPH
+ 0xB9D9: 0x5925, //CJK UNIFIED IDEOGRAPH
+ 0xB9DA: 0x5922, //CJK UNIFIED IDEOGRAPH
+ 0xB9DB: 0x5924, //CJK UNIFIED IDEOGRAPH
+ 0xB9DC: 0x596A, //CJK UNIFIED IDEOGRAPH
+ 0xB9DD: 0x5969, //CJK UNIFIED IDEOGRAPH
+ 0xB9DE: 0x5AE1, //CJK UNIFIED IDEOGRAPH
+ 0xB9DF: 0x5AE6, //CJK UNIFIED IDEOGRAPH
+ 0xB9E0: 0x5AE9, //CJK UNIFIED IDEOGRAPH
+ 0xB9E1: 0x5AD7, //CJK UNIFIED IDEOGRAPH
+ 0xB9E2: 0x5AD6, //CJK UNIFIED IDEOGRAPH
+ 0xB9E3: 0x5AD8, //CJK UNIFIED IDEOGRAPH
+ 0xB9E4: 0x5AE3, //CJK UNIFIED IDEOGRAPH
+ 0xB9E5: 0x5B75, //CJK UNIFIED IDEOGRAPH
+ 0xB9E6: 0x5BDE, //CJK UNIFIED IDEOGRAPH
+ 0xB9E7: 0x5BE7, //CJK UNIFIED IDEOGRAPH
+ 0xB9E8: 0x5BE1, //CJK UNIFIED IDEOGRAPH
+ 0xB9E9: 0x5BE5, //CJK UNIFIED IDEOGRAPH
+ 0xB9EA: 0x5BE6, //CJK UNIFIED IDEOGRAPH
+ 0xB9EB: 0x5BE8, //CJK UNIFIED IDEOGRAPH
+ 0xB9EC: 0x5BE2, //CJK UNIFIED IDEOGRAPH
+ 0xB9ED: 0x5BE4, //CJK UNIFIED IDEOGRAPH
+ 0xB9EE: 0x5BDF, //CJK UNIFIED IDEOGRAPH
+ 0xB9EF: 0x5C0D, //CJK UNIFIED IDEOGRAPH
+ 0xB9F0: 0x5C62, //CJK UNIFIED IDEOGRAPH
+ 0xB9F1: 0x5D84, //CJK UNIFIED IDEOGRAPH
+ 0xB9F2: 0x5D87, //CJK UNIFIED IDEOGRAPH
+ 0xB9F3: 0x5E5B, //CJK UNIFIED IDEOGRAPH
+ 0xB9F4: 0x5E63, //CJK UNIFIED IDEOGRAPH
+ 0xB9F5: 0x5E55, //CJK UNIFIED IDEOGRAPH
+ 0xB9F6: 0x5E57, //CJK UNIFIED IDEOGRAPH
+ 0xB9F7: 0x5E54, //CJK UNIFIED IDEOGRAPH
+ 0xB9F8: 0x5ED3, //CJK UNIFIED IDEOGRAPH
+ 0xB9F9: 0x5ED6, //CJK UNIFIED IDEOGRAPH
+ 0xB9FA: 0x5F0A, //CJK UNIFIED IDEOGRAPH
+ 0xB9FB: 0x5F46, //CJK UNIFIED IDEOGRAPH
+ 0xB9FC: 0x5F70, //CJK UNIFIED IDEOGRAPH
+ 0xB9FD: 0x5FB9, //CJK UNIFIED IDEOGRAPH
+ 0xB9FE: 0x6147, //CJK UNIFIED IDEOGRAPH
+ 0xBA40: 0x613F, //CJK UNIFIED IDEOGRAPH
+ 0xBA41: 0x614B, //CJK UNIFIED IDEOGRAPH
+ 0xBA42: 0x6177, //CJK UNIFIED IDEOGRAPH
+ 0xBA43: 0x6162, //CJK UNIFIED IDEOGRAPH
+ 0xBA44: 0x6163, //CJK UNIFIED IDEOGRAPH
+ 0xBA45: 0x615F, //CJK UNIFIED IDEOGRAPH
+ 0xBA46: 0x615A, //CJK UNIFIED IDEOGRAPH
+ 0xBA47: 0x6158, //CJK UNIFIED IDEOGRAPH
+ 0xBA48: 0x6175, //CJK UNIFIED IDEOGRAPH
+ 0xBA49: 0x622A, //CJK UNIFIED IDEOGRAPH
+ 0xBA4A: 0x6487, //CJK UNIFIED IDEOGRAPH
+ 0xBA4B: 0x6458, //CJK UNIFIED IDEOGRAPH
+ 0xBA4C: 0x6454, //CJK UNIFIED IDEOGRAPH
+ 0xBA4D: 0x64A4, //CJK UNIFIED IDEOGRAPH
+ 0xBA4E: 0x6478, //CJK UNIFIED IDEOGRAPH
+ 0xBA4F: 0x645F, //CJK UNIFIED IDEOGRAPH
+ 0xBA50: 0x647A, //CJK UNIFIED IDEOGRAPH
+ 0xBA51: 0x6451, //CJK UNIFIED IDEOGRAPH
+ 0xBA52: 0x6467, //CJK UNIFIED IDEOGRAPH
+ 0xBA53: 0x6434, //CJK UNIFIED IDEOGRAPH
+ 0xBA54: 0x646D, //CJK UNIFIED IDEOGRAPH
+ 0xBA55: 0x647B, //CJK UNIFIED IDEOGRAPH
+ 0xBA56: 0x6572, //CJK UNIFIED IDEOGRAPH
+ 0xBA57: 0x65A1, //CJK UNIFIED IDEOGRAPH
+ 0xBA58: 0x65D7, //CJK UNIFIED IDEOGRAPH
+ 0xBA59: 0x65D6, //CJK UNIFIED IDEOGRAPH
+ 0xBA5A: 0x66A2, //CJK UNIFIED IDEOGRAPH
+ 0xBA5B: 0x66A8, //CJK UNIFIED IDEOGRAPH
+ 0xBA5C: 0x669D, //CJK UNIFIED IDEOGRAPH
+ 0xBA5D: 0x699C, //CJK UNIFIED IDEOGRAPH
+ 0xBA5E: 0x69A8, //CJK UNIFIED IDEOGRAPH
+ 0xBA5F: 0x6995, //CJK UNIFIED IDEOGRAPH
+ 0xBA60: 0x69C1, //CJK UNIFIED IDEOGRAPH
+ 0xBA61: 0x69AE, //CJK UNIFIED IDEOGRAPH
+ 0xBA62: 0x69D3, //CJK UNIFIED IDEOGRAPH
+ 0xBA63: 0x69CB, //CJK UNIFIED IDEOGRAPH
+ 0xBA64: 0x699B, //CJK UNIFIED IDEOGRAPH
+ 0xBA65: 0x69B7, //CJK UNIFIED IDEOGRAPH
+ 0xBA66: 0x69BB, //CJK UNIFIED IDEOGRAPH
+ 0xBA67: 0x69AB, //CJK UNIFIED IDEOGRAPH
+ 0xBA68: 0x69B4, //CJK UNIFIED IDEOGRAPH
+ 0xBA69: 0x69D0, //CJK UNIFIED IDEOGRAPH
+ 0xBA6A: 0x69CD, //CJK UNIFIED IDEOGRAPH
+ 0xBA6B: 0x69AD, //CJK UNIFIED IDEOGRAPH
+ 0xBA6C: 0x69CC, //CJK UNIFIED IDEOGRAPH
+ 0xBA6D: 0x69A6, //CJK UNIFIED IDEOGRAPH
+ 0xBA6E: 0x69C3, //CJK UNIFIED IDEOGRAPH
+ 0xBA6F: 0x69A3, //CJK UNIFIED IDEOGRAPH
+ 0xBA70: 0x6B49, //CJK UNIFIED IDEOGRAPH
+ 0xBA71: 0x6B4C, //CJK UNIFIED IDEOGRAPH
+ 0xBA72: 0x6C33, //CJK UNIFIED IDEOGRAPH
+ 0xBA73: 0x6F33, //CJK UNIFIED IDEOGRAPH
+ 0xBA74: 0x6F14, //CJK UNIFIED IDEOGRAPH
+ 0xBA75: 0x6EFE, //CJK UNIFIED IDEOGRAPH
+ 0xBA76: 0x6F13, //CJK UNIFIED IDEOGRAPH
+ 0xBA77: 0x6EF4, //CJK UNIFIED IDEOGRAPH
+ 0xBA78: 0x6F29, //CJK UNIFIED IDEOGRAPH
+ 0xBA79: 0x6F3E, //CJK UNIFIED IDEOGRAPH
+ 0xBA7A: 0x6F20, //CJK UNIFIED IDEOGRAPH
+ 0xBA7B: 0x6F2C, //CJK UNIFIED IDEOGRAPH
+ 0xBA7C: 0x6F0F, //CJK UNIFIED IDEOGRAPH
+ 0xBA7D: 0x6F02, //CJK UNIFIED IDEOGRAPH
+ 0xBA7E: 0x6F22, //CJK UNIFIED IDEOGRAPH
+ 0xBAA1: 0x6EFF, //CJK UNIFIED IDEOGRAPH
+ 0xBAA2: 0x6EEF, //CJK UNIFIED IDEOGRAPH
+ 0xBAA3: 0x6F06, //CJK UNIFIED IDEOGRAPH
+ 0xBAA4: 0x6F31, //CJK UNIFIED IDEOGRAPH
+ 0xBAA5: 0x6F38, //CJK UNIFIED IDEOGRAPH
+ 0xBAA6: 0x6F32, //CJK UNIFIED IDEOGRAPH
+ 0xBAA7: 0x6F23, //CJK UNIFIED IDEOGRAPH
+ 0xBAA8: 0x6F15, //CJK UNIFIED IDEOGRAPH
+ 0xBAA9: 0x6F2B, //CJK UNIFIED IDEOGRAPH
+ 0xBAAA: 0x6F2F, //CJK UNIFIED IDEOGRAPH
+ 0xBAAB: 0x6F88, //CJK UNIFIED IDEOGRAPH
+ 0xBAAC: 0x6F2A, //CJK UNIFIED IDEOGRAPH
+ 0xBAAD: 0x6EEC, //CJK UNIFIED IDEOGRAPH
+ 0xBAAE: 0x6F01, //CJK UNIFIED IDEOGRAPH
+ 0xBAAF: 0x6EF2, //CJK UNIFIED IDEOGRAPH
+ 0xBAB0: 0x6ECC, //CJK UNIFIED IDEOGRAPH
+ 0xBAB1: 0x6EF7, //CJK UNIFIED IDEOGRAPH
+ 0xBAB2: 0x7194, //CJK UNIFIED IDEOGRAPH
+ 0xBAB3: 0x7199, //CJK UNIFIED IDEOGRAPH
+ 0xBAB4: 0x717D, //CJK UNIFIED IDEOGRAPH
+ 0xBAB5: 0x718A, //CJK UNIFIED IDEOGRAPH
+ 0xBAB6: 0x7184, //CJK UNIFIED IDEOGRAPH
+ 0xBAB7: 0x7192, //CJK UNIFIED IDEOGRAPH
+ 0xBAB8: 0x723E, //CJK UNIFIED IDEOGRAPH
+ 0xBAB9: 0x7292, //CJK UNIFIED IDEOGRAPH
+ 0xBABA: 0x7296, //CJK UNIFIED IDEOGRAPH
+ 0xBABB: 0x7344, //CJK UNIFIED IDEOGRAPH
+ 0xBABC: 0x7350, //CJK UNIFIED IDEOGRAPH
+ 0xBABD: 0x7464, //CJK UNIFIED IDEOGRAPH
+ 0xBABE: 0x7463, //CJK UNIFIED IDEOGRAPH
+ 0xBABF: 0x746A, //CJK UNIFIED IDEOGRAPH
+ 0xBAC0: 0x7470, //CJK UNIFIED IDEOGRAPH
+ 0xBAC1: 0x746D, //CJK UNIFIED IDEOGRAPH
+ 0xBAC2: 0x7504, //CJK UNIFIED IDEOGRAPH
+ 0xBAC3: 0x7591, //CJK UNIFIED IDEOGRAPH
+ 0xBAC4: 0x7627, //CJK UNIFIED IDEOGRAPH
+ 0xBAC5: 0x760D, //CJK UNIFIED IDEOGRAPH
+ 0xBAC6: 0x760B, //CJK UNIFIED IDEOGRAPH
+ 0xBAC7: 0x7609, //CJK UNIFIED IDEOGRAPH
+ 0xBAC8: 0x7613, //CJK UNIFIED IDEOGRAPH
+ 0xBAC9: 0x76E1, //CJK UNIFIED IDEOGRAPH
+ 0xBACA: 0x76E3, //CJK UNIFIED IDEOGRAPH
+ 0xBACB: 0x7784, //CJK UNIFIED IDEOGRAPH
+ 0xBACC: 0x777D, //CJK UNIFIED IDEOGRAPH
+ 0xBACD: 0x777F, //CJK UNIFIED IDEOGRAPH
+ 0xBACE: 0x7761, //CJK UNIFIED IDEOGRAPH
+ 0xBACF: 0x78C1, //CJK UNIFIED IDEOGRAPH
+ 0xBAD0: 0x789F, //CJK UNIFIED IDEOGRAPH
+ 0xBAD1: 0x78A7, //CJK UNIFIED IDEOGRAPH
+ 0xBAD2: 0x78B3, //CJK UNIFIED IDEOGRAPH
+ 0xBAD3: 0x78A9, //CJK UNIFIED IDEOGRAPH
+ 0xBAD4: 0x78A3, //CJK UNIFIED IDEOGRAPH
+ 0xBAD5: 0x798E, //CJK UNIFIED IDEOGRAPH
+ 0xBAD6: 0x798F, //CJK UNIFIED IDEOGRAPH
+ 0xBAD7: 0x798D, //CJK UNIFIED IDEOGRAPH
+ 0xBAD8: 0x7A2E, //CJK UNIFIED IDEOGRAPH
+ 0xBAD9: 0x7A31, //CJK UNIFIED IDEOGRAPH
+ 0xBADA: 0x7AAA, //CJK UNIFIED IDEOGRAPH
+ 0xBADB: 0x7AA9, //CJK UNIFIED IDEOGRAPH
+ 0xBADC: 0x7AED, //CJK UNIFIED IDEOGRAPH
+ 0xBADD: 0x7AEF, //CJK UNIFIED IDEOGRAPH
+ 0xBADE: 0x7BA1, //CJK UNIFIED IDEOGRAPH
+ 0xBADF: 0x7B95, //CJK UNIFIED IDEOGRAPH
+ 0xBAE0: 0x7B8B, //CJK UNIFIED IDEOGRAPH
+ 0xBAE1: 0x7B75, //CJK UNIFIED IDEOGRAPH
+ 0xBAE2: 0x7B97, //CJK UNIFIED IDEOGRAPH
+ 0xBAE3: 0x7B9D, //CJK UNIFIED IDEOGRAPH
+ 0xBAE4: 0x7B94, //CJK UNIFIED IDEOGRAPH
+ 0xBAE5: 0x7B8F, //CJK UNIFIED IDEOGRAPH
+ 0xBAE6: 0x7BB8, //CJK UNIFIED IDEOGRAPH
+ 0xBAE7: 0x7B87, //CJK UNIFIED IDEOGRAPH
+ 0xBAE8: 0x7B84, //CJK UNIFIED IDEOGRAPH
+ 0xBAE9: 0x7CB9, //CJK UNIFIED IDEOGRAPH
+ 0xBAEA: 0x7CBD, //CJK UNIFIED IDEOGRAPH
+ 0xBAEB: 0x7CBE, //CJK UNIFIED IDEOGRAPH
+ 0xBAEC: 0x7DBB, //CJK UNIFIED IDEOGRAPH
+ 0xBAED: 0x7DB0, //CJK UNIFIED IDEOGRAPH
+ 0xBAEE: 0x7D9C, //CJK UNIFIED IDEOGRAPH
+ 0xBAEF: 0x7DBD, //CJK UNIFIED IDEOGRAPH
+ 0xBAF0: 0x7DBE, //CJK UNIFIED IDEOGRAPH
+ 0xBAF1: 0x7DA0, //CJK UNIFIED IDEOGRAPH
+ 0xBAF2: 0x7DCA, //CJK UNIFIED IDEOGRAPH
+ 0xBAF3: 0x7DB4, //CJK UNIFIED IDEOGRAPH
+ 0xBAF4: 0x7DB2, //CJK UNIFIED IDEOGRAPH
+ 0xBAF5: 0x7DB1, //CJK UNIFIED IDEOGRAPH
+ 0xBAF6: 0x7DBA, //CJK UNIFIED IDEOGRAPH
+ 0xBAF7: 0x7DA2, //CJK UNIFIED IDEOGRAPH
+ 0xBAF8: 0x7DBF, //CJK UNIFIED IDEOGRAPH
+ 0xBAF9: 0x7DB5, //CJK UNIFIED IDEOGRAPH
+ 0xBAFA: 0x7DB8, //CJK UNIFIED IDEOGRAPH
+ 0xBAFB: 0x7DAD, //CJK UNIFIED IDEOGRAPH
+ 0xBAFC: 0x7DD2, //CJK UNIFIED IDEOGRAPH
+ 0xBAFD: 0x7DC7, //CJK UNIFIED IDEOGRAPH
+ 0xBAFE: 0x7DAC, //CJK UNIFIED IDEOGRAPH
+ 0xBB40: 0x7F70, //CJK UNIFIED IDEOGRAPH
+ 0xBB41: 0x7FE0, //CJK UNIFIED IDEOGRAPH
+ 0xBB42: 0x7FE1, //CJK UNIFIED IDEOGRAPH
+ 0xBB43: 0x7FDF, //CJK UNIFIED IDEOGRAPH
+ 0xBB44: 0x805E, //CJK UNIFIED IDEOGRAPH
+ 0xBB45: 0x805A, //CJK UNIFIED IDEOGRAPH
+ 0xBB46: 0x8087, //CJK UNIFIED IDEOGRAPH
+ 0xBB47: 0x8150, //CJK UNIFIED IDEOGRAPH
+ 0xBB48: 0x8180, //CJK UNIFIED IDEOGRAPH
+ 0xBB49: 0x818F, //CJK UNIFIED IDEOGRAPH
+ 0xBB4A: 0x8188, //CJK UNIFIED IDEOGRAPH
+ 0xBB4B: 0x818A, //CJK UNIFIED IDEOGRAPH
+ 0xBB4C: 0x817F, //CJK UNIFIED IDEOGRAPH
+ 0xBB4D: 0x8182, //CJK UNIFIED IDEOGRAPH
+ 0xBB4E: 0x81E7, //CJK UNIFIED IDEOGRAPH
+ 0xBB4F: 0x81FA, //CJK UNIFIED IDEOGRAPH
+ 0xBB50: 0x8207, //CJK UNIFIED IDEOGRAPH
+ 0xBB51: 0x8214, //CJK UNIFIED IDEOGRAPH
+ 0xBB52: 0x821E, //CJK UNIFIED IDEOGRAPH
+ 0xBB53: 0x824B, //CJK UNIFIED IDEOGRAPH
+ 0xBB54: 0x84C9, //CJK UNIFIED IDEOGRAPH
+ 0xBB55: 0x84BF, //CJK UNIFIED IDEOGRAPH
+ 0xBB56: 0x84C6, //CJK UNIFIED IDEOGRAPH
+ 0xBB57: 0x84C4, //CJK UNIFIED IDEOGRAPH
+ 0xBB58: 0x8499, //CJK UNIFIED IDEOGRAPH
+ 0xBB59: 0x849E, //CJK UNIFIED IDEOGRAPH
+ 0xBB5A: 0x84B2, //CJK UNIFIED IDEOGRAPH
+ 0xBB5B: 0x849C, //CJK UNIFIED IDEOGRAPH
+ 0xBB5C: 0x84CB, //CJK UNIFIED IDEOGRAPH
+ 0xBB5D: 0x84B8, //CJK UNIFIED IDEOGRAPH
+ 0xBB5E: 0x84C0, //CJK UNIFIED IDEOGRAPH
+ 0xBB5F: 0x84D3, //CJK UNIFIED IDEOGRAPH
+ 0xBB60: 0x8490, //CJK UNIFIED IDEOGRAPH
+ 0xBB61: 0x84BC, //CJK UNIFIED IDEOGRAPH
+ 0xBB62: 0x84D1, //CJK UNIFIED IDEOGRAPH
+ 0xBB63: 0x84CA, //CJK UNIFIED IDEOGRAPH
+ 0xBB64: 0x873F, //CJK UNIFIED IDEOGRAPH
+ 0xBB65: 0x871C, //CJK UNIFIED IDEOGRAPH
+ 0xBB66: 0x873B, //CJK UNIFIED IDEOGRAPH
+ 0xBB67: 0x8722, //CJK UNIFIED IDEOGRAPH
+ 0xBB68: 0x8725, //CJK UNIFIED IDEOGRAPH
+ 0xBB69: 0x8734, //CJK UNIFIED IDEOGRAPH
+ 0xBB6A: 0x8718, //CJK UNIFIED IDEOGRAPH
+ 0xBB6B: 0x8755, //CJK UNIFIED IDEOGRAPH
+ 0xBB6C: 0x8737, //CJK UNIFIED IDEOGRAPH
+ 0xBB6D: 0x8729, //CJK UNIFIED IDEOGRAPH
+ 0xBB6E: 0x88F3, //CJK UNIFIED IDEOGRAPH
+ 0xBB6F: 0x8902, //CJK UNIFIED IDEOGRAPH
+ 0xBB70: 0x88F4, //CJK UNIFIED IDEOGRAPH
+ 0xBB71: 0x88F9, //CJK UNIFIED IDEOGRAPH
+ 0xBB72: 0x88F8, //CJK UNIFIED IDEOGRAPH
+ 0xBB73: 0x88FD, //CJK UNIFIED IDEOGRAPH
+ 0xBB74: 0x88E8, //CJK UNIFIED IDEOGRAPH
+ 0xBB75: 0x891A, //CJK UNIFIED IDEOGRAPH
+ 0xBB76: 0x88EF, //CJK UNIFIED IDEOGRAPH
+ 0xBB77: 0x8AA6, //CJK UNIFIED IDEOGRAPH
+ 0xBB78: 0x8A8C, //CJK UNIFIED IDEOGRAPH
+ 0xBB79: 0x8A9E, //CJK UNIFIED IDEOGRAPH
+ 0xBB7A: 0x8AA3, //CJK UNIFIED IDEOGRAPH
+ 0xBB7B: 0x8A8D, //CJK UNIFIED IDEOGRAPH
+ 0xBB7C: 0x8AA1, //CJK UNIFIED IDEOGRAPH
+ 0xBB7D: 0x8A93, //CJK UNIFIED IDEOGRAPH
+ 0xBB7E: 0x8AA4, //CJK UNIFIED IDEOGRAPH
+ 0xBBA1: 0x8AAA, //CJK UNIFIED IDEOGRAPH
+ 0xBBA2: 0x8AA5, //CJK UNIFIED IDEOGRAPH
+ 0xBBA3: 0x8AA8, //CJK UNIFIED IDEOGRAPH
+ 0xBBA4: 0x8A98, //CJK UNIFIED IDEOGRAPH
+ 0xBBA5: 0x8A91, //CJK UNIFIED IDEOGRAPH
+ 0xBBA6: 0x8A9A, //CJK UNIFIED IDEOGRAPH
+ 0xBBA7: 0x8AA7, //CJK UNIFIED IDEOGRAPH
+ 0xBBA8: 0x8C6A, //CJK UNIFIED IDEOGRAPH
+ 0xBBA9: 0x8C8D, //CJK UNIFIED IDEOGRAPH
+ 0xBBAA: 0x8C8C, //CJK UNIFIED IDEOGRAPH
+ 0xBBAB: 0x8CD3, //CJK UNIFIED IDEOGRAPH
+ 0xBBAC: 0x8CD1, //CJK UNIFIED IDEOGRAPH
+ 0xBBAD: 0x8CD2, //CJK UNIFIED IDEOGRAPH
+ 0xBBAE: 0x8D6B, //CJK UNIFIED IDEOGRAPH
+ 0xBBAF: 0x8D99, //CJK UNIFIED IDEOGRAPH
+ 0xBBB0: 0x8D95, //CJK UNIFIED IDEOGRAPH
+ 0xBBB1: 0x8DFC, //CJK UNIFIED IDEOGRAPH
+ 0xBBB2: 0x8F14, //CJK UNIFIED IDEOGRAPH
+ 0xBBB3: 0x8F12, //CJK UNIFIED IDEOGRAPH
+ 0xBBB4: 0x8F15, //CJK UNIFIED IDEOGRAPH
+ 0xBBB5: 0x8F13, //CJK UNIFIED IDEOGRAPH
+ 0xBBB6: 0x8FA3, //CJK UNIFIED IDEOGRAPH
+ 0xBBB7: 0x9060, //CJK UNIFIED IDEOGRAPH
+ 0xBBB8: 0x9058, //CJK UNIFIED IDEOGRAPH
+ 0xBBB9: 0x905C, //CJK UNIFIED IDEOGRAPH
+ 0xBBBA: 0x9063, //CJK UNIFIED IDEOGRAPH
+ 0xBBBB: 0x9059, //CJK UNIFIED IDEOGRAPH
+ 0xBBBC: 0x905E, //CJK UNIFIED IDEOGRAPH
+ 0xBBBD: 0x9062, //CJK UNIFIED IDEOGRAPH
+ 0xBBBE: 0x905D, //CJK UNIFIED IDEOGRAPH
+ 0xBBBF: 0x905B, //CJK UNIFIED IDEOGRAPH
+ 0xBBC0: 0x9119, //CJK UNIFIED IDEOGRAPH
+ 0xBBC1: 0x9118, //CJK UNIFIED IDEOGRAPH
+ 0xBBC2: 0x911E, //CJK UNIFIED IDEOGRAPH
+ 0xBBC3: 0x9175, //CJK UNIFIED IDEOGRAPH
+ 0xBBC4: 0x9178, //CJK UNIFIED IDEOGRAPH
+ 0xBBC5: 0x9177, //CJK UNIFIED IDEOGRAPH
+ 0xBBC6: 0x9174, //CJK UNIFIED IDEOGRAPH
+ 0xBBC7: 0x9278, //CJK UNIFIED IDEOGRAPH
+ 0xBBC8: 0x9280, //CJK UNIFIED IDEOGRAPH
+ 0xBBC9: 0x9285, //CJK UNIFIED IDEOGRAPH
+ 0xBBCA: 0x9298, //CJK UNIFIED IDEOGRAPH
+ 0xBBCB: 0x9296, //CJK UNIFIED IDEOGRAPH
+ 0xBBCC: 0x927B, //CJK UNIFIED IDEOGRAPH
+ 0xBBCD: 0x9293, //CJK UNIFIED IDEOGRAPH
+ 0xBBCE: 0x929C, //CJK UNIFIED IDEOGRAPH
+ 0xBBCF: 0x92A8, //CJK UNIFIED IDEOGRAPH
+ 0xBBD0: 0x927C, //CJK UNIFIED IDEOGRAPH
+ 0xBBD1: 0x9291, //CJK UNIFIED IDEOGRAPH
+ 0xBBD2: 0x95A1, //CJK UNIFIED IDEOGRAPH
+ 0xBBD3: 0x95A8, //CJK UNIFIED IDEOGRAPH
+ 0xBBD4: 0x95A9, //CJK UNIFIED IDEOGRAPH
+ 0xBBD5: 0x95A3, //CJK UNIFIED IDEOGRAPH
+ 0xBBD6: 0x95A5, //CJK UNIFIED IDEOGRAPH
+ 0xBBD7: 0x95A4, //CJK UNIFIED IDEOGRAPH
+ 0xBBD8: 0x9699, //CJK UNIFIED IDEOGRAPH
+ 0xBBD9: 0x969C, //CJK UNIFIED IDEOGRAPH
+ 0xBBDA: 0x969B, //CJK UNIFIED IDEOGRAPH
+ 0xBBDB: 0x96CC, //CJK UNIFIED IDEOGRAPH
+ 0xBBDC: 0x96D2, //CJK UNIFIED IDEOGRAPH
+ 0xBBDD: 0x9700, //CJK UNIFIED IDEOGRAPH
+ 0xBBDE: 0x977C, //CJK UNIFIED IDEOGRAPH
+ 0xBBDF: 0x9785, //CJK UNIFIED IDEOGRAPH
+ 0xBBE0: 0x97F6, //CJK UNIFIED IDEOGRAPH
+ 0xBBE1: 0x9817, //CJK UNIFIED IDEOGRAPH
+ 0xBBE2: 0x9818, //CJK UNIFIED IDEOGRAPH
+ 0xBBE3: 0x98AF, //CJK UNIFIED IDEOGRAPH
+ 0xBBE4: 0x98B1, //CJK UNIFIED IDEOGRAPH
+ 0xBBE5: 0x9903, //CJK UNIFIED IDEOGRAPH
+ 0xBBE6: 0x9905, //CJK UNIFIED IDEOGRAPH
+ 0xBBE7: 0x990C, //CJK UNIFIED IDEOGRAPH
+ 0xBBE8: 0x9909, //CJK UNIFIED IDEOGRAPH
+ 0xBBE9: 0x99C1, //CJK UNIFIED IDEOGRAPH
+ 0xBBEA: 0x9AAF, //CJK UNIFIED IDEOGRAPH
+ 0xBBEB: 0x9AB0, //CJK UNIFIED IDEOGRAPH
+ 0xBBEC: 0x9AE6, //CJK UNIFIED IDEOGRAPH
+ 0xBBED: 0x9B41, //CJK UNIFIED IDEOGRAPH
+ 0xBBEE: 0x9B42, //CJK UNIFIED IDEOGRAPH
+ 0xBBEF: 0x9CF4, //CJK UNIFIED IDEOGRAPH
+ 0xBBF0: 0x9CF6, //CJK UNIFIED IDEOGRAPH
+ 0xBBF1: 0x9CF3, //CJK UNIFIED IDEOGRAPH
+ 0xBBF2: 0x9EBC, //CJK UNIFIED IDEOGRAPH
+ 0xBBF3: 0x9F3B, //CJK UNIFIED IDEOGRAPH
+ 0xBBF4: 0x9F4A, //CJK UNIFIED IDEOGRAPH
+ 0xBBF5: 0x5104, //CJK UNIFIED IDEOGRAPH
+ 0xBBF6: 0x5100, //CJK UNIFIED IDEOGRAPH
+ 0xBBF7: 0x50FB, //CJK UNIFIED IDEOGRAPH
+ 0xBBF8: 0x50F5, //CJK UNIFIED IDEOGRAPH
+ 0xBBF9: 0x50F9, //CJK UNIFIED IDEOGRAPH
+ 0xBBFA: 0x5102, //CJK UNIFIED IDEOGRAPH
+ 0xBBFB: 0x5108, //CJK UNIFIED IDEOGRAPH
+ 0xBBFC: 0x5109, //CJK UNIFIED IDEOGRAPH
+ 0xBBFD: 0x5105, //CJK UNIFIED IDEOGRAPH
+ 0xBBFE: 0x51DC, //CJK UNIFIED IDEOGRAPH
+ 0xBC40: 0x5287, //CJK UNIFIED IDEOGRAPH
+ 0xBC41: 0x5288, //CJK UNIFIED IDEOGRAPH
+ 0xBC42: 0x5289, //CJK UNIFIED IDEOGRAPH
+ 0xBC43: 0x528D, //CJK UNIFIED IDEOGRAPH
+ 0xBC44: 0x528A, //CJK UNIFIED IDEOGRAPH
+ 0xBC45: 0x52F0, //CJK UNIFIED IDEOGRAPH
+ 0xBC46: 0x53B2, //CJK UNIFIED IDEOGRAPH
+ 0xBC47: 0x562E, //CJK UNIFIED IDEOGRAPH
+ 0xBC48: 0x563B, //CJK UNIFIED IDEOGRAPH
+ 0xBC49: 0x5639, //CJK UNIFIED IDEOGRAPH
+ 0xBC4A: 0x5632, //CJK UNIFIED IDEOGRAPH
+ 0xBC4B: 0x563F, //CJK UNIFIED IDEOGRAPH
+ 0xBC4C: 0x5634, //CJK UNIFIED IDEOGRAPH
+ 0xBC4D: 0x5629, //CJK UNIFIED IDEOGRAPH
+ 0xBC4E: 0x5653, //CJK UNIFIED IDEOGRAPH
+ 0xBC4F: 0x564E, //CJK UNIFIED IDEOGRAPH
+ 0xBC50: 0x5657, //CJK UNIFIED IDEOGRAPH
+ 0xBC51: 0x5674, //CJK UNIFIED IDEOGRAPH
+ 0xBC52: 0x5636, //CJK UNIFIED IDEOGRAPH
+ 0xBC53: 0x562F, //CJK UNIFIED IDEOGRAPH
+ 0xBC54: 0x5630, //CJK UNIFIED IDEOGRAPH
+ 0xBC55: 0x5880, //CJK UNIFIED IDEOGRAPH
+ 0xBC56: 0x589F, //CJK UNIFIED IDEOGRAPH
+ 0xBC57: 0x589E, //CJK UNIFIED IDEOGRAPH
+ 0xBC58: 0x58B3, //CJK UNIFIED IDEOGRAPH
+ 0xBC59: 0x589C, //CJK UNIFIED IDEOGRAPH
+ 0xBC5A: 0x58AE, //CJK UNIFIED IDEOGRAPH
+ 0xBC5B: 0x58A9, //CJK UNIFIED IDEOGRAPH
+ 0xBC5C: 0x58A6, //CJK UNIFIED IDEOGRAPH
+ 0xBC5D: 0x596D, //CJK UNIFIED IDEOGRAPH
+ 0xBC5E: 0x5B09, //CJK UNIFIED IDEOGRAPH
+ 0xBC5F: 0x5AFB, //CJK UNIFIED IDEOGRAPH
+ 0xBC60: 0x5B0B, //CJK UNIFIED IDEOGRAPH
+ 0xBC61: 0x5AF5, //CJK UNIFIED IDEOGRAPH
+ 0xBC62: 0x5B0C, //CJK UNIFIED IDEOGRAPH
+ 0xBC63: 0x5B08, //CJK UNIFIED IDEOGRAPH
+ 0xBC64: 0x5BEE, //CJK UNIFIED IDEOGRAPH
+ 0xBC65: 0x5BEC, //CJK UNIFIED IDEOGRAPH
+ 0xBC66: 0x5BE9, //CJK UNIFIED IDEOGRAPH
+ 0xBC67: 0x5BEB, //CJK UNIFIED IDEOGRAPH
+ 0xBC68: 0x5C64, //CJK UNIFIED IDEOGRAPH
+ 0xBC69: 0x5C65, //CJK UNIFIED IDEOGRAPH
+ 0xBC6A: 0x5D9D, //CJK UNIFIED IDEOGRAPH
+ 0xBC6B: 0x5D94, //CJK UNIFIED IDEOGRAPH
+ 0xBC6C: 0x5E62, //CJK UNIFIED IDEOGRAPH
+ 0xBC6D: 0x5E5F, //CJK UNIFIED IDEOGRAPH
+ 0xBC6E: 0x5E61, //CJK UNIFIED IDEOGRAPH
+ 0xBC6F: 0x5EE2, //CJK UNIFIED IDEOGRAPH
+ 0xBC70: 0x5EDA, //CJK UNIFIED IDEOGRAPH
+ 0xBC71: 0x5EDF, //CJK UNIFIED IDEOGRAPH
+ 0xBC72: 0x5EDD, //CJK UNIFIED IDEOGRAPH
+ 0xBC73: 0x5EE3, //CJK UNIFIED IDEOGRAPH
+ 0xBC74: 0x5EE0, //CJK UNIFIED IDEOGRAPH
+ 0xBC75: 0x5F48, //CJK UNIFIED IDEOGRAPH
+ 0xBC76: 0x5F71, //CJK UNIFIED IDEOGRAPH
+ 0xBC77: 0x5FB7, //CJK UNIFIED IDEOGRAPH
+ 0xBC78: 0x5FB5, //CJK UNIFIED IDEOGRAPH
+ 0xBC79: 0x6176, //CJK UNIFIED IDEOGRAPH
+ 0xBC7A: 0x6167, //CJK UNIFIED IDEOGRAPH
+ 0xBC7B: 0x616E, //CJK UNIFIED IDEOGRAPH
+ 0xBC7C: 0x615D, //CJK UNIFIED IDEOGRAPH
+ 0xBC7D: 0x6155, //CJK UNIFIED IDEOGRAPH
+ 0xBC7E: 0x6182, //CJK UNIFIED IDEOGRAPH
+ 0xBCA1: 0x617C, //CJK UNIFIED IDEOGRAPH
+ 0xBCA2: 0x6170, //CJK UNIFIED IDEOGRAPH
+ 0xBCA3: 0x616B, //CJK UNIFIED IDEOGRAPH
+ 0xBCA4: 0x617E, //CJK UNIFIED IDEOGRAPH
+ 0xBCA5: 0x61A7, //CJK UNIFIED IDEOGRAPH
+ 0xBCA6: 0x6190, //CJK UNIFIED IDEOGRAPH
+ 0xBCA7: 0x61AB, //CJK UNIFIED IDEOGRAPH
+ 0xBCA8: 0x618E, //CJK UNIFIED IDEOGRAPH
+ 0xBCA9: 0x61AC, //CJK UNIFIED IDEOGRAPH
+ 0xBCAA: 0x619A, //CJK UNIFIED IDEOGRAPH
+ 0xBCAB: 0x61A4, //CJK UNIFIED IDEOGRAPH
+ 0xBCAC: 0x6194, //CJK UNIFIED IDEOGRAPH
+ 0xBCAD: 0x61AE, //CJK UNIFIED IDEOGRAPH
+ 0xBCAE: 0x622E, //CJK UNIFIED IDEOGRAPH
+ 0xBCAF: 0x6469, //CJK UNIFIED IDEOGRAPH
+ 0xBCB0: 0x646F, //CJK UNIFIED IDEOGRAPH
+ 0xBCB1: 0x6479, //CJK UNIFIED IDEOGRAPH
+ 0xBCB2: 0x649E, //CJK UNIFIED IDEOGRAPH
+ 0xBCB3: 0x64B2, //CJK UNIFIED IDEOGRAPH
+ 0xBCB4: 0x6488, //CJK UNIFIED IDEOGRAPH
+ 0xBCB5: 0x6490, //CJK UNIFIED IDEOGRAPH
+ 0xBCB6: 0x64B0, //CJK UNIFIED IDEOGRAPH
+ 0xBCB7: 0x64A5, //CJK UNIFIED IDEOGRAPH
+ 0xBCB8: 0x6493, //CJK UNIFIED IDEOGRAPH
+ 0xBCB9: 0x6495, //CJK UNIFIED IDEOGRAPH
+ 0xBCBA: 0x64A9, //CJK UNIFIED IDEOGRAPH
+ 0xBCBB: 0x6492, //CJK UNIFIED IDEOGRAPH
+ 0xBCBC: 0x64AE, //CJK UNIFIED IDEOGRAPH
+ 0xBCBD: 0x64AD, //CJK UNIFIED IDEOGRAPH
+ 0xBCBE: 0x64AB, //CJK UNIFIED IDEOGRAPH
+ 0xBCBF: 0x649A, //CJK UNIFIED IDEOGRAPH
+ 0xBCC0: 0x64AC, //CJK UNIFIED IDEOGRAPH
+ 0xBCC1: 0x6499, //CJK UNIFIED IDEOGRAPH
+ 0xBCC2: 0x64A2, //CJK UNIFIED IDEOGRAPH
+ 0xBCC3: 0x64B3, //CJK UNIFIED IDEOGRAPH
+ 0xBCC4: 0x6575, //CJK UNIFIED IDEOGRAPH
+ 0xBCC5: 0x6577, //CJK UNIFIED IDEOGRAPH
+ 0xBCC6: 0x6578, //CJK UNIFIED IDEOGRAPH
+ 0xBCC7: 0x66AE, //CJK UNIFIED IDEOGRAPH
+ 0xBCC8: 0x66AB, //CJK UNIFIED IDEOGRAPH
+ 0xBCC9: 0x66B4, //CJK UNIFIED IDEOGRAPH
+ 0xBCCA: 0x66B1, //CJK UNIFIED IDEOGRAPH
+ 0xBCCB: 0x6A23, //CJK UNIFIED IDEOGRAPH
+ 0xBCCC: 0x6A1F, //CJK UNIFIED IDEOGRAPH
+ 0xBCCD: 0x69E8, //CJK UNIFIED IDEOGRAPH
+ 0xBCCE: 0x6A01, //CJK UNIFIED IDEOGRAPH
+ 0xBCCF: 0x6A1E, //CJK UNIFIED IDEOGRAPH
+ 0xBCD0: 0x6A19, //CJK UNIFIED IDEOGRAPH
+ 0xBCD1: 0x69FD, //CJK UNIFIED IDEOGRAPH
+ 0xBCD2: 0x6A21, //CJK UNIFIED IDEOGRAPH
+ 0xBCD3: 0x6A13, //CJK UNIFIED IDEOGRAPH
+ 0xBCD4: 0x6A0A, //CJK UNIFIED IDEOGRAPH
+ 0xBCD5: 0x69F3, //CJK UNIFIED IDEOGRAPH
+ 0xBCD6: 0x6A02, //CJK UNIFIED IDEOGRAPH
+ 0xBCD7: 0x6A05, //CJK UNIFIED IDEOGRAPH
+ 0xBCD8: 0x69ED, //CJK UNIFIED IDEOGRAPH
+ 0xBCD9: 0x6A11, //CJK UNIFIED IDEOGRAPH
+ 0xBCDA: 0x6B50, //CJK UNIFIED IDEOGRAPH
+ 0xBCDB: 0x6B4E, //CJK UNIFIED IDEOGRAPH
+ 0xBCDC: 0x6BA4, //CJK UNIFIED IDEOGRAPH
+ 0xBCDD: 0x6BC5, //CJK UNIFIED IDEOGRAPH
+ 0xBCDE: 0x6BC6, //CJK UNIFIED IDEOGRAPH
+ 0xBCDF: 0x6F3F, //CJK UNIFIED IDEOGRAPH
+ 0xBCE0: 0x6F7C, //CJK UNIFIED IDEOGRAPH
+ 0xBCE1: 0x6F84, //CJK UNIFIED IDEOGRAPH
+ 0xBCE2: 0x6F51, //CJK UNIFIED IDEOGRAPH
+ 0xBCE3: 0x6F66, //CJK UNIFIED IDEOGRAPH
+ 0xBCE4: 0x6F54, //CJK UNIFIED IDEOGRAPH
+ 0xBCE5: 0x6F86, //CJK UNIFIED IDEOGRAPH
+ 0xBCE6: 0x6F6D, //CJK UNIFIED IDEOGRAPH
+ 0xBCE7: 0x6F5B, //CJK UNIFIED IDEOGRAPH
+ 0xBCE8: 0x6F78, //CJK UNIFIED IDEOGRAPH
+ 0xBCE9: 0x6F6E, //CJK UNIFIED IDEOGRAPH
+ 0xBCEA: 0x6F8E, //CJK UNIFIED IDEOGRAPH
+ 0xBCEB: 0x6F7A, //CJK UNIFIED IDEOGRAPH
+ 0xBCEC: 0x6F70, //CJK UNIFIED IDEOGRAPH
+ 0xBCED: 0x6F64, //CJK UNIFIED IDEOGRAPH
+ 0xBCEE: 0x6F97, //CJK UNIFIED IDEOGRAPH
+ 0xBCEF: 0x6F58, //CJK UNIFIED IDEOGRAPH
+ 0xBCF0: 0x6ED5, //CJK UNIFIED IDEOGRAPH
+ 0xBCF1: 0x6F6F, //CJK UNIFIED IDEOGRAPH
+ 0xBCF2: 0x6F60, //CJK UNIFIED IDEOGRAPH
+ 0xBCF3: 0x6F5F, //CJK UNIFIED IDEOGRAPH
+ 0xBCF4: 0x719F, //CJK UNIFIED IDEOGRAPH
+ 0xBCF5: 0x71AC, //CJK UNIFIED IDEOGRAPH
+ 0xBCF6: 0x71B1, //CJK UNIFIED IDEOGRAPH
+ 0xBCF7: 0x71A8, //CJK UNIFIED IDEOGRAPH
+ 0xBCF8: 0x7256, //CJK UNIFIED IDEOGRAPH
+ 0xBCF9: 0x729B, //CJK UNIFIED IDEOGRAPH
+ 0xBCFA: 0x734E, //CJK UNIFIED IDEOGRAPH
+ 0xBCFB: 0x7357, //CJK UNIFIED IDEOGRAPH
+ 0xBCFC: 0x7469, //CJK UNIFIED IDEOGRAPH
+ 0xBCFD: 0x748B, //CJK UNIFIED IDEOGRAPH
+ 0xBCFE: 0x7483, //CJK UNIFIED IDEOGRAPH
+ 0xBD40: 0x747E, //CJK UNIFIED IDEOGRAPH
+ 0xBD41: 0x7480, //CJK UNIFIED IDEOGRAPH
+ 0xBD42: 0x757F, //CJK UNIFIED IDEOGRAPH
+ 0xBD43: 0x7620, //CJK UNIFIED IDEOGRAPH
+ 0xBD44: 0x7629, //CJK UNIFIED IDEOGRAPH
+ 0xBD45: 0x761F, //CJK UNIFIED IDEOGRAPH
+ 0xBD46: 0x7624, //CJK UNIFIED IDEOGRAPH
+ 0xBD47: 0x7626, //CJK UNIFIED IDEOGRAPH
+ 0xBD48: 0x7621, //CJK UNIFIED IDEOGRAPH
+ 0xBD49: 0x7622, //CJK UNIFIED IDEOGRAPH
+ 0xBD4A: 0x769A, //CJK UNIFIED IDEOGRAPH
+ 0xBD4B: 0x76BA, //CJK UNIFIED IDEOGRAPH
+ 0xBD4C: 0x76E4, //CJK UNIFIED IDEOGRAPH
+ 0xBD4D: 0x778E, //CJK UNIFIED IDEOGRAPH
+ 0xBD4E: 0x7787, //CJK UNIFIED IDEOGRAPH
+ 0xBD4F: 0x778C, //CJK UNIFIED IDEOGRAPH
+ 0xBD50: 0x7791, //CJK UNIFIED IDEOGRAPH
+ 0xBD51: 0x778B, //CJK UNIFIED IDEOGRAPH
+ 0xBD52: 0x78CB, //CJK UNIFIED IDEOGRAPH
+ 0xBD53: 0x78C5, //CJK UNIFIED IDEOGRAPH
+ 0xBD54: 0x78BA, //CJK UNIFIED IDEOGRAPH
+ 0xBD55: 0x78CA, //CJK UNIFIED IDEOGRAPH
+ 0xBD56: 0x78BE, //CJK UNIFIED IDEOGRAPH
+ 0xBD57: 0x78D5, //CJK UNIFIED IDEOGRAPH
+ 0xBD58: 0x78BC, //CJK UNIFIED IDEOGRAPH
+ 0xBD59: 0x78D0, //CJK UNIFIED IDEOGRAPH
+ 0xBD5A: 0x7A3F, //CJK UNIFIED IDEOGRAPH
+ 0xBD5B: 0x7A3C, //CJK UNIFIED IDEOGRAPH
+ 0xBD5C: 0x7A40, //CJK UNIFIED IDEOGRAPH
+ 0xBD5D: 0x7A3D, //CJK UNIFIED IDEOGRAPH
+ 0xBD5E: 0x7A37, //CJK UNIFIED IDEOGRAPH
+ 0xBD5F: 0x7A3B, //CJK UNIFIED IDEOGRAPH
+ 0xBD60: 0x7AAF, //CJK UNIFIED IDEOGRAPH
+ 0xBD61: 0x7AAE, //CJK UNIFIED IDEOGRAPH
+ 0xBD62: 0x7BAD, //CJK UNIFIED IDEOGRAPH
+ 0xBD63: 0x7BB1, //CJK UNIFIED IDEOGRAPH
+ 0xBD64: 0x7BC4, //CJK UNIFIED IDEOGRAPH
+ 0xBD65: 0x7BB4, //CJK UNIFIED IDEOGRAPH
+ 0xBD66: 0x7BC6, //CJK UNIFIED IDEOGRAPH
+ 0xBD67: 0x7BC7, //CJK UNIFIED IDEOGRAPH
+ 0xBD68: 0x7BC1, //CJK UNIFIED IDEOGRAPH
+ 0xBD69: 0x7BA0, //CJK UNIFIED IDEOGRAPH
+ 0xBD6A: 0x7BCC, //CJK UNIFIED IDEOGRAPH
+ 0xBD6B: 0x7CCA, //CJK UNIFIED IDEOGRAPH
+ 0xBD6C: 0x7DE0, //CJK UNIFIED IDEOGRAPH
+ 0xBD6D: 0x7DF4, //CJK UNIFIED IDEOGRAPH
+ 0xBD6E: 0x7DEF, //CJK UNIFIED IDEOGRAPH
+ 0xBD6F: 0x7DFB, //CJK UNIFIED IDEOGRAPH
+ 0xBD70: 0x7DD8, //CJK UNIFIED IDEOGRAPH
+ 0xBD71: 0x7DEC, //CJK UNIFIED IDEOGRAPH
+ 0xBD72: 0x7DDD, //CJK UNIFIED IDEOGRAPH
+ 0xBD73: 0x7DE8, //CJK UNIFIED IDEOGRAPH
+ 0xBD74: 0x7DE3, //CJK UNIFIED IDEOGRAPH
+ 0xBD75: 0x7DDA, //CJK UNIFIED IDEOGRAPH
+ 0xBD76: 0x7DDE, //CJK UNIFIED IDEOGRAPH
+ 0xBD77: 0x7DE9, //CJK UNIFIED IDEOGRAPH
+ 0xBD78: 0x7D9E, //CJK UNIFIED IDEOGRAPH
+ 0xBD79: 0x7DD9, //CJK UNIFIED IDEOGRAPH
+ 0xBD7A: 0x7DF2, //CJK UNIFIED IDEOGRAPH
+ 0xBD7B: 0x7DF9, //CJK UNIFIED IDEOGRAPH
+ 0xBD7C: 0x7F75, //CJK UNIFIED IDEOGRAPH
+ 0xBD7D: 0x7F77, //CJK UNIFIED IDEOGRAPH
+ 0xBD7E: 0x7FAF, //CJK UNIFIED IDEOGRAPH
+ 0xBDA1: 0x7FE9, //CJK UNIFIED IDEOGRAPH
+ 0xBDA2: 0x8026, //CJK UNIFIED IDEOGRAPH
+ 0xBDA3: 0x819B, //CJK UNIFIED IDEOGRAPH
+ 0xBDA4: 0x819C, //CJK UNIFIED IDEOGRAPH
+ 0xBDA5: 0x819D, //CJK UNIFIED IDEOGRAPH
+ 0xBDA6: 0x81A0, //CJK UNIFIED IDEOGRAPH
+ 0xBDA7: 0x819A, //CJK UNIFIED IDEOGRAPH
+ 0xBDA8: 0x8198, //CJK UNIFIED IDEOGRAPH
+ 0xBDA9: 0x8517, //CJK UNIFIED IDEOGRAPH
+ 0xBDAA: 0x853D, //CJK UNIFIED IDEOGRAPH
+ 0xBDAB: 0x851A, //CJK UNIFIED IDEOGRAPH
+ 0xBDAC: 0x84EE, //CJK UNIFIED IDEOGRAPH
+ 0xBDAD: 0x852C, //CJK UNIFIED IDEOGRAPH
+ 0xBDAE: 0x852D, //CJK UNIFIED IDEOGRAPH
+ 0xBDAF: 0x8513, //CJK UNIFIED IDEOGRAPH
+ 0xBDB0: 0x8511, //CJK UNIFIED IDEOGRAPH
+ 0xBDB1: 0x8523, //CJK UNIFIED IDEOGRAPH
+ 0xBDB2: 0x8521, //CJK UNIFIED IDEOGRAPH
+ 0xBDB3: 0x8514, //CJK UNIFIED IDEOGRAPH
+ 0xBDB4: 0x84EC, //CJK UNIFIED IDEOGRAPH
+ 0xBDB5: 0x8525, //CJK UNIFIED IDEOGRAPH
+ 0xBDB6: 0x84FF, //CJK UNIFIED IDEOGRAPH
+ 0xBDB7: 0x8506, //CJK UNIFIED IDEOGRAPH
+ 0xBDB8: 0x8782, //CJK UNIFIED IDEOGRAPH
+ 0xBDB9: 0x8774, //CJK UNIFIED IDEOGRAPH
+ 0xBDBA: 0x8776, //CJK UNIFIED IDEOGRAPH
+ 0xBDBB: 0x8760, //CJK UNIFIED IDEOGRAPH
+ 0xBDBC: 0x8766, //CJK UNIFIED IDEOGRAPH
+ 0xBDBD: 0x8778, //CJK UNIFIED IDEOGRAPH
+ 0xBDBE: 0x8768, //CJK UNIFIED IDEOGRAPH
+ 0xBDBF: 0x8759, //CJK UNIFIED IDEOGRAPH
+ 0xBDC0: 0x8757, //CJK UNIFIED IDEOGRAPH
+ 0xBDC1: 0x874C, //CJK UNIFIED IDEOGRAPH
+ 0xBDC2: 0x8753, //CJK UNIFIED IDEOGRAPH
+ 0xBDC3: 0x885B, //CJK UNIFIED IDEOGRAPH
+ 0xBDC4: 0x885D, //CJK UNIFIED IDEOGRAPH
+ 0xBDC5: 0x8910, //CJK UNIFIED IDEOGRAPH
+ 0xBDC6: 0x8907, //CJK UNIFIED IDEOGRAPH
+ 0xBDC7: 0x8912, //CJK UNIFIED IDEOGRAPH
+ 0xBDC8: 0x8913, //CJK UNIFIED IDEOGRAPH
+ 0xBDC9: 0x8915, //CJK UNIFIED IDEOGRAPH
+ 0xBDCA: 0x890A, //CJK UNIFIED IDEOGRAPH
+ 0xBDCB: 0x8ABC, //CJK UNIFIED IDEOGRAPH
+ 0xBDCC: 0x8AD2, //CJK UNIFIED IDEOGRAPH
+ 0xBDCD: 0x8AC7, //CJK UNIFIED IDEOGRAPH
+ 0xBDCE: 0x8AC4, //CJK UNIFIED IDEOGRAPH
+ 0xBDCF: 0x8A95, //CJK UNIFIED IDEOGRAPH
+ 0xBDD0: 0x8ACB, //CJK UNIFIED IDEOGRAPH
+ 0xBDD1: 0x8AF8, //CJK UNIFIED IDEOGRAPH
+ 0xBDD2: 0x8AB2, //CJK UNIFIED IDEOGRAPH
+ 0xBDD3: 0x8AC9, //CJK UNIFIED IDEOGRAPH
+ 0xBDD4: 0x8AC2, //CJK UNIFIED IDEOGRAPH
+ 0xBDD5: 0x8ABF, //CJK UNIFIED IDEOGRAPH
+ 0xBDD6: 0x8AB0, //CJK UNIFIED IDEOGRAPH
+ 0xBDD7: 0x8AD6, //CJK UNIFIED IDEOGRAPH
+ 0xBDD8: 0x8ACD, //CJK UNIFIED IDEOGRAPH
+ 0xBDD9: 0x8AB6, //CJK UNIFIED IDEOGRAPH
+ 0xBDDA: 0x8AB9, //CJK UNIFIED IDEOGRAPH
+ 0xBDDB: 0x8ADB, //CJK UNIFIED IDEOGRAPH
+ 0xBDDC: 0x8C4C, //CJK UNIFIED IDEOGRAPH
+ 0xBDDD: 0x8C4E, //CJK UNIFIED IDEOGRAPH
+ 0xBDDE: 0x8C6C, //CJK UNIFIED IDEOGRAPH
+ 0xBDDF: 0x8CE0, //CJK UNIFIED IDEOGRAPH
+ 0xBDE0: 0x8CDE, //CJK UNIFIED IDEOGRAPH
+ 0xBDE1: 0x8CE6, //CJK UNIFIED IDEOGRAPH
+ 0xBDE2: 0x8CE4, //CJK UNIFIED IDEOGRAPH
+ 0xBDE3: 0x8CEC, //CJK UNIFIED IDEOGRAPH
+ 0xBDE4: 0x8CED, //CJK UNIFIED IDEOGRAPH
+ 0xBDE5: 0x8CE2, //CJK UNIFIED IDEOGRAPH
+ 0xBDE6: 0x8CE3, //CJK UNIFIED IDEOGRAPH
+ 0xBDE7: 0x8CDC, //CJK UNIFIED IDEOGRAPH
+ 0xBDE8: 0x8CEA, //CJK UNIFIED IDEOGRAPH
+ 0xBDE9: 0x8CE1, //CJK UNIFIED IDEOGRAPH
+ 0xBDEA: 0x8D6D, //CJK UNIFIED IDEOGRAPH
+ 0xBDEB: 0x8D9F, //CJK UNIFIED IDEOGRAPH
+ 0xBDEC: 0x8DA3, //CJK UNIFIED IDEOGRAPH
+ 0xBDED: 0x8E2B, //CJK UNIFIED IDEOGRAPH
+ 0xBDEE: 0x8E10, //CJK UNIFIED IDEOGRAPH
+ 0xBDEF: 0x8E1D, //CJK UNIFIED IDEOGRAPH
+ 0xBDF0: 0x8E22, //CJK UNIFIED IDEOGRAPH
+ 0xBDF1: 0x8E0F, //CJK UNIFIED IDEOGRAPH
+ 0xBDF2: 0x8E29, //CJK UNIFIED IDEOGRAPH
+ 0xBDF3: 0x8E1F, //CJK UNIFIED IDEOGRAPH
+ 0xBDF4: 0x8E21, //CJK UNIFIED IDEOGRAPH
+ 0xBDF5: 0x8E1E, //CJK UNIFIED IDEOGRAPH
+ 0xBDF6: 0x8EBA, //CJK UNIFIED IDEOGRAPH
+ 0xBDF7: 0x8F1D, //CJK UNIFIED IDEOGRAPH
+ 0xBDF8: 0x8F1B, //CJK UNIFIED IDEOGRAPH
+ 0xBDF9: 0x8F1F, //CJK UNIFIED IDEOGRAPH
+ 0xBDFA: 0x8F29, //CJK UNIFIED IDEOGRAPH
+ 0xBDFB: 0x8F26, //CJK UNIFIED IDEOGRAPH
+ 0xBDFC: 0x8F2A, //CJK UNIFIED IDEOGRAPH
+ 0xBDFD: 0x8F1C, //CJK UNIFIED IDEOGRAPH
+ 0xBDFE: 0x8F1E, //CJK UNIFIED IDEOGRAPH
+ 0xBE40: 0x8F25, //CJK UNIFIED IDEOGRAPH
+ 0xBE41: 0x9069, //CJK UNIFIED IDEOGRAPH
+ 0xBE42: 0x906E, //CJK UNIFIED IDEOGRAPH
+ 0xBE43: 0x9068, //CJK UNIFIED IDEOGRAPH
+ 0xBE44: 0x906D, //CJK UNIFIED IDEOGRAPH
+ 0xBE45: 0x9077, //CJK UNIFIED IDEOGRAPH
+ 0xBE46: 0x9130, //CJK UNIFIED IDEOGRAPH
+ 0xBE47: 0x912D, //CJK UNIFIED IDEOGRAPH
+ 0xBE48: 0x9127, //CJK UNIFIED IDEOGRAPH
+ 0xBE49: 0x9131, //CJK UNIFIED IDEOGRAPH
+ 0xBE4A: 0x9187, //CJK UNIFIED IDEOGRAPH
+ 0xBE4B: 0x9189, //CJK UNIFIED IDEOGRAPH
+ 0xBE4C: 0x918B, //CJK UNIFIED IDEOGRAPH
+ 0xBE4D: 0x9183, //CJK UNIFIED IDEOGRAPH
+ 0xBE4E: 0x92C5, //CJK UNIFIED IDEOGRAPH
+ 0xBE4F: 0x92BB, //CJK UNIFIED IDEOGRAPH
+ 0xBE50: 0x92B7, //CJK UNIFIED IDEOGRAPH
+ 0xBE51: 0x92EA, //CJK UNIFIED IDEOGRAPH
+ 0xBE52: 0x92AC, //CJK UNIFIED IDEOGRAPH
+ 0xBE53: 0x92E4, //CJK UNIFIED IDEOGRAPH
+ 0xBE54: 0x92C1, //CJK UNIFIED IDEOGRAPH
+ 0xBE55: 0x92B3, //CJK UNIFIED IDEOGRAPH
+ 0xBE56: 0x92BC, //CJK UNIFIED IDEOGRAPH
+ 0xBE57: 0x92D2, //CJK UNIFIED IDEOGRAPH
+ 0xBE58: 0x92C7, //CJK UNIFIED IDEOGRAPH
+ 0xBE59: 0x92F0, //CJK UNIFIED IDEOGRAPH
+ 0xBE5A: 0x92B2, //CJK UNIFIED IDEOGRAPH
+ 0xBE5B: 0x95AD, //CJK UNIFIED IDEOGRAPH
+ 0xBE5C: 0x95B1, //CJK UNIFIED IDEOGRAPH
+ 0xBE5D: 0x9704, //CJK UNIFIED IDEOGRAPH
+ 0xBE5E: 0x9706, //CJK UNIFIED IDEOGRAPH
+ 0xBE5F: 0x9707, //CJK UNIFIED IDEOGRAPH
+ 0xBE60: 0x9709, //CJK UNIFIED IDEOGRAPH
+ 0xBE61: 0x9760, //CJK UNIFIED IDEOGRAPH
+ 0xBE62: 0x978D, //CJK UNIFIED IDEOGRAPH
+ 0xBE63: 0x978B, //CJK UNIFIED IDEOGRAPH
+ 0xBE64: 0x978F, //CJK UNIFIED IDEOGRAPH
+ 0xBE65: 0x9821, //CJK UNIFIED IDEOGRAPH
+ 0xBE66: 0x982B, //CJK UNIFIED IDEOGRAPH
+ 0xBE67: 0x981C, //CJK UNIFIED IDEOGRAPH
+ 0xBE68: 0x98B3, //CJK UNIFIED IDEOGRAPH
+ 0xBE69: 0x990A, //CJK UNIFIED IDEOGRAPH
+ 0xBE6A: 0x9913, //CJK UNIFIED IDEOGRAPH
+ 0xBE6B: 0x9912, //CJK UNIFIED IDEOGRAPH
+ 0xBE6C: 0x9918, //CJK UNIFIED IDEOGRAPH
+ 0xBE6D: 0x99DD, //CJK UNIFIED IDEOGRAPH
+ 0xBE6E: 0x99D0, //CJK UNIFIED IDEOGRAPH
+ 0xBE6F: 0x99DF, //CJK UNIFIED IDEOGRAPH
+ 0xBE70: 0x99DB, //CJK UNIFIED IDEOGRAPH
+ 0xBE71: 0x99D1, //CJK UNIFIED IDEOGRAPH
+ 0xBE72: 0x99D5, //CJK UNIFIED IDEOGRAPH
+ 0xBE73: 0x99D2, //CJK UNIFIED IDEOGRAPH
+ 0xBE74: 0x99D9, //CJK UNIFIED IDEOGRAPH
+ 0xBE75: 0x9AB7, //CJK UNIFIED IDEOGRAPH
+ 0xBE76: 0x9AEE, //CJK UNIFIED IDEOGRAPH
+ 0xBE77: 0x9AEF, //CJK UNIFIED IDEOGRAPH
+ 0xBE78: 0x9B27, //CJK UNIFIED IDEOGRAPH
+ 0xBE79: 0x9B45, //CJK UNIFIED IDEOGRAPH
+ 0xBE7A: 0x9B44, //CJK UNIFIED IDEOGRAPH
+ 0xBE7B: 0x9B77, //CJK UNIFIED IDEOGRAPH
+ 0xBE7C: 0x9B6F, //CJK UNIFIED IDEOGRAPH
+ 0xBE7D: 0x9D06, //CJK UNIFIED IDEOGRAPH
+ 0xBE7E: 0x9D09, //CJK UNIFIED IDEOGRAPH
+ 0xBEA1: 0x9D03, //CJK UNIFIED IDEOGRAPH
+ 0xBEA2: 0x9EA9, //CJK UNIFIED IDEOGRAPH
+ 0xBEA3: 0x9EBE, //CJK UNIFIED IDEOGRAPH
+ 0xBEA4: 0x9ECE, //CJK UNIFIED IDEOGRAPH
+ 0xBEA5: 0x58A8, //CJK UNIFIED IDEOGRAPH
+ 0xBEA6: 0x9F52, //CJK UNIFIED IDEOGRAPH
+ 0xBEA7: 0x5112, //CJK UNIFIED IDEOGRAPH
+ 0xBEA8: 0x5118, //CJK UNIFIED IDEOGRAPH
+ 0xBEA9: 0x5114, //CJK UNIFIED IDEOGRAPH
+ 0xBEAA: 0x5110, //CJK UNIFIED IDEOGRAPH
+ 0xBEAB: 0x5115, //CJK UNIFIED IDEOGRAPH
+ 0xBEAC: 0x5180, //CJK UNIFIED IDEOGRAPH
+ 0xBEAD: 0x51AA, //CJK UNIFIED IDEOGRAPH
+ 0xBEAE: 0x51DD, //CJK UNIFIED IDEOGRAPH
+ 0xBEAF: 0x5291, //CJK UNIFIED IDEOGRAPH
+ 0xBEB0: 0x5293, //CJK UNIFIED IDEOGRAPH
+ 0xBEB1: 0x52F3, //CJK UNIFIED IDEOGRAPH
+ 0xBEB2: 0x5659, //CJK UNIFIED IDEOGRAPH
+ 0xBEB3: 0x566B, //CJK UNIFIED IDEOGRAPH
+ 0xBEB4: 0x5679, //CJK UNIFIED IDEOGRAPH
+ 0xBEB5: 0x5669, //CJK UNIFIED IDEOGRAPH
+ 0xBEB6: 0x5664, //CJK UNIFIED IDEOGRAPH
+ 0xBEB7: 0x5678, //CJK UNIFIED IDEOGRAPH
+ 0xBEB8: 0x566A, //CJK UNIFIED IDEOGRAPH
+ 0xBEB9: 0x5668, //CJK UNIFIED IDEOGRAPH
+ 0xBEBA: 0x5665, //CJK UNIFIED IDEOGRAPH
+ 0xBEBB: 0x5671, //CJK UNIFIED IDEOGRAPH
+ 0xBEBC: 0x566F, //CJK UNIFIED IDEOGRAPH
+ 0xBEBD: 0x566C, //CJK UNIFIED IDEOGRAPH
+ 0xBEBE: 0x5662, //CJK UNIFIED IDEOGRAPH
+ 0xBEBF: 0x5676, //CJK UNIFIED IDEOGRAPH
+ 0xBEC0: 0x58C1, //CJK UNIFIED IDEOGRAPH
+ 0xBEC1: 0x58BE, //CJK UNIFIED IDEOGRAPH
+ 0xBEC2: 0x58C7, //CJK UNIFIED IDEOGRAPH
+ 0xBEC3: 0x58C5, //CJK UNIFIED IDEOGRAPH
+ 0xBEC4: 0x596E, //CJK UNIFIED IDEOGRAPH
+ 0xBEC5: 0x5B1D, //CJK UNIFIED IDEOGRAPH
+ 0xBEC6: 0x5B34, //CJK UNIFIED IDEOGRAPH
+ 0xBEC7: 0x5B78, //CJK UNIFIED IDEOGRAPH
+ 0xBEC8: 0x5BF0, //CJK UNIFIED IDEOGRAPH
+ 0xBEC9: 0x5C0E, //CJK UNIFIED IDEOGRAPH
+ 0xBECA: 0x5F4A, //CJK UNIFIED IDEOGRAPH
+ 0xBECB: 0x61B2, //CJK UNIFIED IDEOGRAPH
+ 0xBECC: 0x6191, //CJK UNIFIED IDEOGRAPH
+ 0xBECD: 0x61A9, //CJK UNIFIED IDEOGRAPH
+ 0xBECE: 0x618A, //CJK UNIFIED IDEOGRAPH
+ 0xBECF: 0x61CD, //CJK UNIFIED IDEOGRAPH
+ 0xBED0: 0x61B6, //CJK UNIFIED IDEOGRAPH
+ 0xBED1: 0x61BE, //CJK UNIFIED IDEOGRAPH
+ 0xBED2: 0x61CA, //CJK UNIFIED IDEOGRAPH
+ 0xBED3: 0x61C8, //CJK UNIFIED IDEOGRAPH
+ 0xBED4: 0x6230, //CJK UNIFIED IDEOGRAPH
+ 0xBED5: 0x64C5, //CJK UNIFIED IDEOGRAPH
+ 0xBED6: 0x64C1, //CJK UNIFIED IDEOGRAPH
+ 0xBED7: 0x64CB, //CJK UNIFIED IDEOGRAPH
+ 0xBED8: 0x64BB, //CJK UNIFIED IDEOGRAPH
+ 0xBED9: 0x64BC, //CJK UNIFIED IDEOGRAPH
+ 0xBEDA: 0x64DA, //CJK UNIFIED IDEOGRAPH
+ 0xBEDB: 0x64C4, //CJK UNIFIED IDEOGRAPH
+ 0xBEDC: 0x64C7, //CJK UNIFIED IDEOGRAPH
+ 0xBEDD: 0x64C2, //CJK UNIFIED IDEOGRAPH
+ 0xBEDE: 0x64CD, //CJK UNIFIED IDEOGRAPH
+ 0xBEDF: 0x64BF, //CJK UNIFIED IDEOGRAPH
+ 0xBEE0: 0x64D2, //CJK UNIFIED IDEOGRAPH
+ 0xBEE1: 0x64D4, //CJK UNIFIED IDEOGRAPH
+ 0xBEE2: 0x64BE, //CJK UNIFIED IDEOGRAPH
+ 0xBEE3: 0x6574, //CJK UNIFIED IDEOGRAPH
+ 0xBEE4: 0x66C6, //CJK UNIFIED IDEOGRAPH
+ 0xBEE5: 0x66C9, //CJK UNIFIED IDEOGRAPH
+ 0xBEE6: 0x66B9, //CJK UNIFIED IDEOGRAPH
+ 0xBEE7: 0x66C4, //CJK UNIFIED IDEOGRAPH
+ 0xBEE8: 0x66C7, //CJK UNIFIED IDEOGRAPH
+ 0xBEE9: 0x66B8, //CJK UNIFIED IDEOGRAPH
+ 0xBEEA: 0x6A3D, //CJK UNIFIED IDEOGRAPH
+ 0xBEEB: 0x6A38, //CJK UNIFIED IDEOGRAPH
+ 0xBEEC: 0x6A3A, //CJK UNIFIED IDEOGRAPH
+ 0xBEED: 0x6A59, //CJK UNIFIED IDEOGRAPH
+ 0xBEEE: 0x6A6B, //CJK UNIFIED IDEOGRAPH
+ 0xBEEF: 0x6A58, //CJK UNIFIED IDEOGRAPH
+ 0xBEF0: 0x6A39, //CJK UNIFIED IDEOGRAPH
+ 0xBEF1: 0x6A44, //CJK UNIFIED IDEOGRAPH
+ 0xBEF2: 0x6A62, //CJK UNIFIED IDEOGRAPH
+ 0xBEF3: 0x6A61, //CJK UNIFIED IDEOGRAPH
+ 0xBEF4: 0x6A4B, //CJK UNIFIED IDEOGRAPH
+ 0xBEF5: 0x6A47, //CJK UNIFIED IDEOGRAPH
+ 0xBEF6: 0x6A35, //CJK UNIFIED IDEOGRAPH
+ 0xBEF7: 0x6A5F, //CJK UNIFIED IDEOGRAPH
+ 0xBEF8: 0x6A48, //CJK UNIFIED IDEOGRAPH
+ 0xBEF9: 0x6B59, //CJK UNIFIED IDEOGRAPH
+ 0xBEFA: 0x6B77, //CJK UNIFIED IDEOGRAPH
+ 0xBEFB: 0x6C05, //CJK UNIFIED IDEOGRAPH
+ 0xBEFC: 0x6FC2, //CJK UNIFIED IDEOGRAPH
+ 0xBEFD: 0x6FB1, //CJK UNIFIED IDEOGRAPH
+ 0xBEFE: 0x6FA1, //CJK UNIFIED IDEOGRAPH
+ 0xBF40: 0x6FC3, //CJK UNIFIED IDEOGRAPH
+ 0xBF41: 0x6FA4, //CJK UNIFIED IDEOGRAPH
+ 0xBF42: 0x6FC1, //CJK UNIFIED IDEOGRAPH
+ 0xBF43: 0x6FA7, //CJK UNIFIED IDEOGRAPH
+ 0xBF44: 0x6FB3, //CJK UNIFIED IDEOGRAPH
+ 0xBF45: 0x6FC0, //CJK UNIFIED IDEOGRAPH
+ 0xBF46: 0x6FB9, //CJK UNIFIED IDEOGRAPH
+ 0xBF47: 0x6FB6, //CJK UNIFIED IDEOGRAPH
+ 0xBF48: 0x6FA6, //CJK UNIFIED IDEOGRAPH
+ 0xBF49: 0x6FA0, //CJK UNIFIED IDEOGRAPH
+ 0xBF4A: 0x6FB4, //CJK UNIFIED IDEOGRAPH
+ 0xBF4B: 0x71BE, //CJK UNIFIED IDEOGRAPH
+ 0xBF4C: 0x71C9, //CJK UNIFIED IDEOGRAPH
+ 0xBF4D: 0x71D0, //CJK UNIFIED IDEOGRAPH
+ 0xBF4E: 0x71D2, //CJK UNIFIED IDEOGRAPH
+ 0xBF4F: 0x71C8, //CJK UNIFIED IDEOGRAPH
+ 0xBF50: 0x71D5, //CJK UNIFIED IDEOGRAPH
+ 0xBF51: 0x71B9, //CJK UNIFIED IDEOGRAPH
+ 0xBF52: 0x71CE, //CJK UNIFIED IDEOGRAPH
+ 0xBF53: 0x71D9, //CJK UNIFIED IDEOGRAPH
+ 0xBF54: 0x71DC, //CJK UNIFIED IDEOGRAPH
+ 0xBF55: 0x71C3, //CJK UNIFIED IDEOGRAPH
+ 0xBF56: 0x71C4, //CJK UNIFIED IDEOGRAPH
+ 0xBF57: 0x7368, //CJK UNIFIED IDEOGRAPH
+ 0xBF58: 0x749C, //CJK UNIFIED IDEOGRAPH
+ 0xBF59: 0x74A3, //CJK UNIFIED IDEOGRAPH
+ 0xBF5A: 0x7498, //CJK UNIFIED IDEOGRAPH
+ 0xBF5B: 0x749F, //CJK UNIFIED IDEOGRAPH
+ 0xBF5C: 0x749E, //CJK UNIFIED IDEOGRAPH
+ 0xBF5D: 0x74E2, //CJK UNIFIED IDEOGRAPH
+ 0xBF5E: 0x750C, //CJK UNIFIED IDEOGRAPH
+ 0xBF5F: 0x750D, //CJK UNIFIED IDEOGRAPH
+ 0xBF60: 0x7634, //CJK UNIFIED IDEOGRAPH
+ 0xBF61: 0x7638, //CJK UNIFIED IDEOGRAPH
+ 0xBF62: 0x763A, //CJK UNIFIED IDEOGRAPH
+ 0xBF63: 0x76E7, //CJK UNIFIED IDEOGRAPH
+ 0xBF64: 0x76E5, //CJK UNIFIED IDEOGRAPH
+ 0xBF65: 0x77A0, //CJK UNIFIED IDEOGRAPH
+ 0xBF66: 0x779E, //CJK UNIFIED IDEOGRAPH
+ 0xBF67: 0x779F, //CJK UNIFIED IDEOGRAPH
+ 0xBF68: 0x77A5, //CJK UNIFIED IDEOGRAPH
+ 0xBF69: 0x78E8, //CJK UNIFIED IDEOGRAPH
+ 0xBF6A: 0x78DA, //CJK UNIFIED IDEOGRAPH
+ 0xBF6B: 0x78EC, //CJK UNIFIED IDEOGRAPH
+ 0xBF6C: 0x78E7, //CJK UNIFIED IDEOGRAPH
+ 0xBF6D: 0x79A6, //CJK UNIFIED IDEOGRAPH
+ 0xBF6E: 0x7A4D, //CJK UNIFIED IDEOGRAPH
+ 0xBF6F: 0x7A4E, //CJK UNIFIED IDEOGRAPH
+ 0xBF70: 0x7A46, //CJK UNIFIED IDEOGRAPH
+ 0xBF71: 0x7A4C, //CJK UNIFIED IDEOGRAPH
+ 0xBF72: 0x7A4B, //CJK UNIFIED IDEOGRAPH
+ 0xBF73: 0x7ABA, //CJK UNIFIED IDEOGRAPH
+ 0xBF74: 0x7BD9, //CJK UNIFIED IDEOGRAPH
+ 0xBF75: 0x7C11, //CJK UNIFIED IDEOGRAPH
+ 0xBF76: 0x7BC9, //CJK UNIFIED IDEOGRAPH
+ 0xBF77: 0x7BE4, //CJK UNIFIED IDEOGRAPH
+ 0xBF78: 0x7BDB, //CJK UNIFIED IDEOGRAPH
+ 0xBF79: 0x7BE1, //CJK UNIFIED IDEOGRAPH
+ 0xBF7A: 0x7BE9, //CJK UNIFIED IDEOGRAPH
+ 0xBF7B: 0x7BE6, //CJK UNIFIED IDEOGRAPH
+ 0xBF7C: 0x7CD5, //CJK UNIFIED IDEOGRAPH
+ 0xBF7D: 0x7CD6, //CJK UNIFIED IDEOGRAPH
+ 0xBF7E: 0x7E0A, //CJK UNIFIED IDEOGRAPH
+ 0xBFA1: 0x7E11, //CJK UNIFIED IDEOGRAPH
+ 0xBFA2: 0x7E08, //CJK UNIFIED IDEOGRAPH
+ 0xBFA3: 0x7E1B, //CJK UNIFIED IDEOGRAPH
+ 0xBFA4: 0x7E23, //CJK UNIFIED IDEOGRAPH
+ 0xBFA5: 0x7E1E, //CJK UNIFIED IDEOGRAPH
+ 0xBFA6: 0x7E1D, //CJK UNIFIED IDEOGRAPH
+ 0xBFA7: 0x7E09, //CJK UNIFIED IDEOGRAPH
+ 0xBFA8: 0x7E10, //CJK UNIFIED IDEOGRAPH
+ 0xBFA9: 0x7F79, //CJK UNIFIED IDEOGRAPH
+ 0xBFAA: 0x7FB2, //CJK UNIFIED IDEOGRAPH
+ 0xBFAB: 0x7FF0, //CJK UNIFIED IDEOGRAPH
+ 0xBFAC: 0x7FF1, //CJK UNIFIED IDEOGRAPH
+ 0xBFAD: 0x7FEE, //CJK UNIFIED IDEOGRAPH
+ 0xBFAE: 0x8028, //CJK UNIFIED IDEOGRAPH
+ 0xBFAF: 0x81B3, //CJK UNIFIED IDEOGRAPH
+ 0xBFB0: 0x81A9, //CJK UNIFIED IDEOGRAPH
+ 0xBFB1: 0x81A8, //CJK UNIFIED IDEOGRAPH
+ 0xBFB2: 0x81FB, //CJK UNIFIED IDEOGRAPH
+ 0xBFB3: 0x8208, //CJK UNIFIED IDEOGRAPH
+ 0xBFB4: 0x8258, //CJK UNIFIED IDEOGRAPH
+ 0xBFB5: 0x8259, //CJK UNIFIED IDEOGRAPH
+ 0xBFB6: 0x854A, //CJK UNIFIED IDEOGRAPH
+ 0xBFB7: 0x8559, //CJK UNIFIED IDEOGRAPH
+ 0xBFB8: 0x8548, //CJK UNIFIED IDEOGRAPH
+ 0xBFB9: 0x8568, //CJK UNIFIED IDEOGRAPH
+ 0xBFBA: 0x8569, //CJK UNIFIED IDEOGRAPH
+ 0xBFBB: 0x8543, //CJK UNIFIED IDEOGRAPH
+ 0xBFBC: 0x8549, //CJK UNIFIED IDEOGRAPH
+ 0xBFBD: 0x856D, //CJK UNIFIED IDEOGRAPH
+ 0xBFBE: 0x856A, //CJK UNIFIED IDEOGRAPH
+ 0xBFBF: 0x855E, //CJK UNIFIED IDEOGRAPH
+ 0xBFC0: 0x8783, //CJK UNIFIED IDEOGRAPH
+ 0xBFC1: 0x879F, //CJK UNIFIED IDEOGRAPH
+ 0xBFC2: 0x879E, //CJK UNIFIED IDEOGRAPH
+ 0xBFC3: 0x87A2, //CJK UNIFIED IDEOGRAPH
+ 0xBFC4: 0x878D, //CJK UNIFIED IDEOGRAPH
+ 0xBFC5: 0x8861, //CJK UNIFIED IDEOGRAPH
+ 0xBFC6: 0x892A, //CJK UNIFIED IDEOGRAPH
+ 0xBFC7: 0x8932, //CJK UNIFIED IDEOGRAPH
+ 0xBFC8: 0x8925, //CJK UNIFIED IDEOGRAPH
+ 0xBFC9: 0x892B, //CJK UNIFIED IDEOGRAPH
+ 0xBFCA: 0x8921, //CJK UNIFIED IDEOGRAPH
+ 0xBFCB: 0x89AA, //CJK UNIFIED IDEOGRAPH
+ 0xBFCC: 0x89A6, //CJK UNIFIED IDEOGRAPH
+ 0xBFCD: 0x8AE6, //CJK UNIFIED IDEOGRAPH
+ 0xBFCE: 0x8AFA, //CJK UNIFIED IDEOGRAPH
+ 0xBFCF: 0x8AEB, //CJK UNIFIED IDEOGRAPH
+ 0xBFD0: 0x8AF1, //CJK UNIFIED IDEOGRAPH
+ 0xBFD1: 0x8B00, //CJK UNIFIED IDEOGRAPH
+ 0xBFD2: 0x8ADC, //CJK UNIFIED IDEOGRAPH
+ 0xBFD3: 0x8AE7, //CJK UNIFIED IDEOGRAPH
+ 0xBFD4: 0x8AEE, //CJK UNIFIED IDEOGRAPH
+ 0xBFD5: 0x8AFE, //CJK UNIFIED IDEOGRAPH
+ 0xBFD6: 0x8B01, //CJK UNIFIED IDEOGRAPH
+ 0xBFD7: 0x8B02, //CJK UNIFIED IDEOGRAPH
+ 0xBFD8: 0x8AF7, //CJK UNIFIED IDEOGRAPH
+ 0xBFD9: 0x8AED, //CJK UNIFIED IDEOGRAPH
+ 0xBFDA: 0x8AF3, //CJK UNIFIED IDEOGRAPH
+ 0xBFDB: 0x8AF6, //CJK UNIFIED IDEOGRAPH
+ 0xBFDC: 0x8AFC, //CJK UNIFIED IDEOGRAPH
+ 0xBFDD: 0x8C6B, //CJK UNIFIED IDEOGRAPH
+ 0xBFDE: 0x8C6D, //CJK UNIFIED IDEOGRAPH
+ 0xBFDF: 0x8C93, //CJK UNIFIED IDEOGRAPH
+ 0xBFE0: 0x8CF4, //CJK UNIFIED IDEOGRAPH
+ 0xBFE1: 0x8E44, //CJK UNIFIED IDEOGRAPH
+ 0xBFE2: 0x8E31, //CJK UNIFIED IDEOGRAPH
+ 0xBFE3: 0x8E34, //CJK UNIFIED IDEOGRAPH
+ 0xBFE4: 0x8E42, //CJK UNIFIED IDEOGRAPH
+ 0xBFE5: 0x8E39, //CJK UNIFIED IDEOGRAPH
+ 0xBFE6: 0x8E35, //CJK UNIFIED IDEOGRAPH
+ 0xBFE7: 0x8F3B, //CJK UNIFIED IDEOGRAPH
+ 0xBFE8: 0x8F2F, //CJK UNIFIED IDEOGRAPH
+ 0xBFE9: 0x8F38, //CJK UNIFIED IDEOGRAPH
+ 0xBFEA: 0x8F33, //CJK UNIFIED IDEOGRAPH
+ 0xBFEB: 0x8FA8, //CJK UNIFIED IDEOGRAPH
+ 0xBFEC: 0x8FA6, //CJK UNIFIED IDEOGRAPH
+ 0xBFED: 0x9075, //CJK UNIFIED IDEOGRAPH
+ 0xBFEE: 0x9074, //CJK UNIFIED IDEOGRAPH
+ 0xBFEF: 0x9078, //CJK UNIFIED IDEOGRAPH
+ 0xBFF0: 0x9072, //CJK UNIFIED IDEOGRAPH
+ 0xBFF1: 0x907C, //CJK UNIFIED IDEOGRAPH
+ 0xBFF2: 0x907A, //CJK UNIFIED IDEOGRAPH
+ 0xBFF3: 0x9134, //CJK UNIFIED IDEOGRAPH
+ 0xBFF4: 0x9192, //CJK UNIFIED IDEOGRAPH
+ 0xBFF5: 0x9320, //CJK UNIFIED IDEOGRAPH
+ 0xBFF6: 0x9336, //CJK UNIFIED IDEOGRAPH
+ 0xBFF7: 0x92F8, //CJK UNIFIED IDEOGRAPH
+ 0xBFF8: 0x9333, //CJK UNIFIED IDEOGRAPH
+ 0xBFF9: 0x932F, //CJK UNIFIED IDEOGRAPH
+ 0xBFFA: 0x9322, //CJK UNIFIED IDEOGRAPH
+ 0xBFFB: 0x92FC, //CJK UNIFIED IDEOGRAPH
+ 0xBFFC: 0x932B, //CJK UNIFIED IDEOGRAPH
+ 0xBFFD: 0x9304, //CJK UNIFIED IDEOGRAPH
+ 0xBFFE: 0x931A, //CJK UNIFIED IDEOGRAPH
+ 0xC040: 0x9310, //CJK UNIFIED IDEOGRAPH
+ 0xC041: 0x9326, //CJK UNIFIED IDEOGRAPH
+ 0xC042: 0x9321, //CJK UNIFIED IDEOGRAPH
+ 0xC043: 0x9315, //CJK UNIFIED IDEOGRAPH
+ 0xC044: 0x932E, //CJK UNIFIED IDEOGRAPH
+ 0xC045: 0x9319, //CJK UNIFIED IDEOGRAPH
+ 0xC046: 0x95BB, //CJK UNIFIED IDEOGRAPH
+ 0xC047: 0x96A7, //CJK UNIFIED IDEOGRAPH
+ 0xC048: 0x96A8, //CJK UNIFIED IDEOGRAPH
+ 0xC049: 0x96AA, //CJK UNIFIED IDEOGRAPH
+ 0xC04A: 0x96D5, //CJK UNIFIED IDEOGRAPH
+ 0xC04B: 0x970E, //CJK UNIFIED IDEOGRAPH
+ 0xC04C: 0x9711, //CJK UNIFIED IDEOGRAPH
+ 0xC04D: 0x9716, //CJK UNIFIED IDEOGRAPH
+ 0xC04E: 0x970D, //CJK UNIFIED IDEOGRAPH
+ 0xC04F: 0x9713, //CJK UNIFIED IDEOGRAPH
+ 0xC050: 0x970F, //CJK UNIFIED IDEOGRAPH
+ 0xC051: 0x975B, //CJK UNIFIED IDEOGRAPH
+ 0xC052: 0x975C, //CJK UNIFIED IDEOGRAPH
+ 0xC053: 0x9766, //CJK UNIFIED IDEOGRAPH
+ 0xC054: 0x9798, //CJK UNIFIED IDEOGRAPH
+ 0xC055: 0x9830, //CJK UNIFIED IDEOGRAPH
+ 0xC056: 0x9838, //CJK UNIFIED IDEOGRAPH
+ 0xC057: 0x983B, //CJK UNIFIED IDEOGRAPH
+ 0xC058: 0x9837, //CJK UNIFIED IDEOGRAPH
+ 0xC059: 0x982D, //CJK UNIFIED IDEOGRAPH
+ 0xC05A: 0x9839, //CJK UNIFIED IDEOGRAPH
+ 0xC05B: 0x9824, //CJK UNIFIED IDEOGRAPH
+ 0xC05C: 0x9910, //CJK UNIFIED IDEOGRAPH
+ 0xC05D: 0x9928, //CJK UNIFIED IDEOGRAPH
+ 0xC05E: 0x991E, //CJK UNIFIED IDEOGRAPH
+ 0xC05F: 0x991B, //CJK UNIFIED IDEOGRAPH
+ 0xC060: 0x9921, //CJK UNIFIED IDEOGRAPH
+ 0xC061: 0x991A, //CJK UNIFIED IDEOGRAPH
+ 0xC062: 0x99ED, //CJK UNIFIED IDEOGRAPH
+ 0xC063: 0x99E2, //CJK UNIFIED IDEOGRAPH
+ 0xC064: 0x99F1, //CJK UNIFIED IDEOGRAPH
+ 0xC065: 0x9AB8, //CJK UNIFIED IDEOGRAPH
+ 0xC066: 0x9ABC, //CJK UNIFIED IDEOGRAPH
+ 0xC067: 0x9AFB, //CJK UNIFIED IDEOGRAPH
+ 0xC068: 0x9AED, //CJK UNIFIED IDEOGRAPH
+ 0xC069: 0x9B28, //CJK UNIFIED IDEOGRAPH
+ 0xC06A: 0x9B91, //CJK UNIFIED IDEOGRAPH
+ 0xC06B: 0x9D15, //CJK UNIFIED IDEOGRAPH
+ 0xC06C: 0x9D23, //CJK UNIFIED IDEOGRAPH
+ 0xC06D: 0x9D26, //CJK UNIFIED IDEOGRAPH
+ 0xC06E: 0x9D28, //CJK UNIFIED IDEOGRAPH
+ 0xC06F: 0x9D12, //CJK UNIFIED IDEOGRAPH
+ 0xC070: 0x9D1B, //CJK UNIFIED IDEOGRAPH
+ 0xC071: 0x9ED8, //CJK UNIFIED IDEOGRAPH
+ 0xC072: 0x9ED4, //CJK UNIFIED IDEOGRAPH
+ 0xC073: 0x9F8D, //CJK UNIFIED IDEOGRAPH
+ 0xC074: 0x9F9C, //CJK UNIFIED IDEOGRAPH
+ 0xC075: 0x512A, //CJK UNIFIED IDEOGRAPH
+ 0xC076: 0x511F, //CJK UNIFIED IDEOGRAPH
+ 0xC077: 0x5121, //CJK UNIFIED IDEOGRAPH
+ 0xC078: 0x5132, //CJK UNIFIED IDEOGRAPH
+ 0xC079: 0x52F5, //CJK UNIFIED IDEOGRAPH
+ 0xC07A: 0x568E, //CJK UNIFIED IDEOGRAPH
+ 0xC07B: 0x5680, //CJK UNIFIED IDEOGRAPH
+ 0xC07C: 0x5690, //CJK UNIFIED IDEOGRAPH
+ 0xC07D: 0x5685, //CJK UNIFIED IDEOGRAPH
+ 0xC07E: 0x5687, //CJK UNIFIED IDEOGRAPH
+ 0xC0A1: 0x568F, //CJK UNIFIED IDEOGRAPH
+ 0xC0A2: 0x58D5, //CJK UNIFIED IDEOGRAPH
+ 0xC0A3: 0x58D3, //CJK UNIFIED IDEOGRAPH
+ 0xC0A4: 0x58D1, //CJK UNIFIED IDEOGRAPH
+ 0xC0A5: 0x58CE, //CJK UNIFIED IDEOGRAPH
+ 0xC0A6: 0x5B30, //CJK UNIFIED IDEOGRAPH
+ 0xC0A7: 0x5B2A, //CJK UNIFIED IDEOGRAPH
+ 0xC0A8: 0x5B24, //CJK UNIFIED IDEOGRAPH
+ 0xC0A9: 0x5B7A, //CJK UNIFIED IDEOGRAPH
+ 0xC0AA: 0x5C37, //CJK UNIFIED IDEOGRAPH
+ 0xC0AB: 0x5C68, //CJK UNIFIED IDEOGRAPH
+ 0xC0AC: 0x5DBC, //CJK UNIFIED IDEOGRAPH
+ 0xC0AD: 0x5DBA, //CJK UNIFIED IDEOGRAPH
+ 0xC0AE: 0x5DBD, //CJK UNIFIED IDEOGRAPH
+ 0xC0AF: 0x5DB8, //CJK UNIFIED IDEOGRAPH
+ 0xC0B0: 0x5E6B, //CJK UNIFIED IDEOGRAPH
+ 0xC0B1: 0x5F4C, //CJK UNIFIED IDEOGRAPH
+ 0xC0B2: 0x5FBD, //CJK UNIFIED IDEOGRAPH
+ 0xC0B3: 0x61C9, //CJK UNIFIED IDEOGRAPH
+ 0xC0B4: 0x61C2, //CJK UNIFIED IDEOGRAPH
+ 0xC0B5: 0x61C7, //CJK UNIFIED IDEOGRAPH
+ 0xC0B6: 0x61E6, //CJK UNIFIED IDEOGRAPH
+ 0xC0B7: 0x61CB, //CJK UNIFIED IDEOGRAPH
+ 0xC0B8: 0x6232, //CJK UNIFIED IDEOGRAPH
+ 0xC0B9: 0x6234, //CJK UNIFIED IDEOGRAPH
+ 0xC0BA: 0x64CE, //CJK UNIFIED IDEOGRAPH
+ 0xC0BB: 0x64CA, //CJK UNIFIED IDEOGRAPH
+ 0xC0BC: 0x64D8, //CJK UNIFIED IDEOGRAPH
+ 0xC0BD: 0x64E0, //CJK UNIFIED IDEOGRAPH
+ 0xC0BE: 0x64F0, //CJK UNIFIED IDEOGRAPH
+ 0xC0BF: 0x64E6, //CJK UNIFIED IDEOGRAPH
+ 0xC0C0: 0x64EC, //CJK UNIFIED IDEOGRAPH
+ 0xC0C1: 0x64F1, //CJK UNIFIED IDEOGRAPH
+ 0xC0C2: 0x64E2, //CJK UNIFIED IDEOGRAPH
+ 0xC0C3: 0x64ED, //CJK UNIFIED IDEOGRAPH
+ 0xC0C4: 0x6582, //CJK UNIFIED IDEOGRAPH
+ 0xC0C5: 0x6583, //CJK UNIFIED IDEOGRAPH
+ 0xC0C6: 0x66D9, //CJK UNIFIED IDEOGRAPH
+ 0xC0C7: 0x66D6, //CJK UNIFIED IDEOGRAPH
+ 0xC0C8: 0x6A80, //CJK UNIFIED IDEOGRAPH
+ 0xC0C9: 0x6A94, //CJK UNIFIED IDEOGRAPH
+ 0xC0CA: 0x6A84, //CJK UNIFIED IDEOGRAPH
+ 0xC0CB: 0x6AA2, //CJK UNIFIED IDEOGRAPH
+ 0xC0CC: 0x6A9C, //CJK UNIFIED IDEOGRAPH
+ 0xC0CD: 0x6ADB, //CJK UNIFIED IDEOGRAPH
+ 0xC0CE: 0x6AA3, //CJK UNIFIED IDEOGRAPH
+ 0xC0CF: 0x6A7E, //CJK UNIFIED IDEOGRAPH
+ 0xC0D0: 0x6A97, //CJK UNIFIED IDEOGRAPH
+ 0xC0D1: 0x6A90, //CJK UNIFIED IDEOGRAPH
+ 0xC0D2: 0x6AA0, //CJK UNIFIED IDEOGRAPH
+ 0xC0D3: 0x6B5C, //CJK UNIFIED IDEOGRAPH
+ 0xC0D4: 0x6BAE, //CJK UNIFIED IDEOGRAPH
+ 0xC0D5: 0x6BDA, //CJK UNIFIED IDEOGRAPH
+ 0xC0D6: 0x6C08, //CJK UNIFIED IDEOGRAPH
+ 0xC0D7: 0x6FD8, //CJK UNIFIED IDEOGRAPH
+ 0xC0D8: 0x6FF1, //CJK UNIFIED IDEOGRAPH
+ 0xC0D9: 0x6FDF, //CJK UNIFIED IDEOGRAPH
+ 0xC0DA: 0x6FE0, //CJK UNIFIED IDEOGRAPH
+ 0xC0DB: 0x6FDB, //CJK UNIFIED IDEOGRAPH
+ 0xC0DC: 0x6FE4, //CJK UNIFIED IDEOGRAPH
+ 0xC0DD: 0x6FEB, //CJK UNIFIED IDEOGRAPH
+ 0xC0DE: 0x6FEF, //CJK UNIFIED IDEOGRAPH
+ 0xC0DF: 0x6F80, //CJK UNIFIED IDEOGRAPH
+ 0xC0E0: 0x6FEC, //CJK UNIFIED IDEOGRAPH
+ 0xC0E1: 0x6FE1, //CJK UNIFIED IDEOGRAPH
+ 0xC0E2: 0x6FE9, //CJK UNIFIED IDEOGRAPH
+ 0xC0E3: 0x6FD5, //CJK UNIFIED IDEOGRAPH
+ 0xC0E4: 0x6FEE, //CJK UNIFIED IDEOGRAPH
+ 0xC0E5: 0x6FF0, //CJK UNIFIED IDEOGRAPH
+ 0xC0E6: 0x71E7, //CJK UNIFIED IDEOGRAPH
+ 0xC0E7: 0x71DF, //CJK UNIFIED IDEOGRAPH
+ 0xC0E8: 0x71EE, //CJK UNIFIED IDEOGRAPH
+ 0xC0E9: 0x71E6, //CJK UNIFIED IDEOGRAPH
+ 0xC0EA: 0x71E5, //CJK UNIFIED IDEOGRAPH
+ 0xC0EB: 0x71ED, //CJK UNIFIED IDEOGRAPH
+ 0xC0EC: 0x71EC, //CJK UNIFIED IDEOGRAPH
+ 0xC0ED: 0x71F4, //CJK UNIFIED IDEOGRAPH
+ 0xC0EE: 0x71E0, //CJK UNIFIED IDEOGRAPH
+ 0xC0EF: 0x7235, //CJK UNIFIED IDEOGRAPH
+ 0xC0F0: 0x7246, //CJK UNIFIED IDEOGRAPH
+ 0xC0F1: 0x7370, //CJK UNIFIED IDEOGRAPH
+ 0xC0F2: 0x7372, //CJK UNIFIED IDEOGRAPH
+ 0xC0F3: 0x74A9, //CJK UNIFIED IDEOGRAPH
+ 0xC0F4: 0x74B0, //CJK UNIFIED IDEOGRAPH
+ 0xC0F5: 0x74A6, //CJK UNIFIED IDEOGRAPH
+ 0xC0F6: 0x74A8, //CJK UNIFIED IDEOGRAPH
+ 0xC0F7: 0x7646, //CJK UNIFIED IDEOGRAPH
+ 0xC0F8: 0x7642, //CJK UNIFIED IDEOGRAPH
+ 0xC0F9: 0x764C, //CJK UNIFIED IDEOGRAPH
+ 0xC0FA: 0x76EA, //CJK UNIFIED IDEOGRAPH
+ 0xC0FB: 0x77B3, //CJK UNIFIED IDEOGRAPH
+ 0xC0FC: 0x77AA, //CJK UNIFIED IDEOGRAPH
+ 0xC0FD: 0x77B0, //CJK UNIFIED IDEOGRAPH
+ 0xC0FE: 0x77AC, //CJK UNIFIED IDEOGRAPH
+ 0xC140: 0x77A7, //CJK UNIFIED IDEOGRAPH
+ 0xC141: 0x77AD, //CJK UNIFIED IDEOGRAPH
+ 0xC142: 0x77EF, //CJK UNIFIED IDEOGRAPH
+ 0xC143: 0x78F7, //CJK UNIFIED IDEOGRAPH
+ 0xC144: 0x78FA, //CJK UNIFIED IDEOGRAPH
+ 0xC145: 0x78F4, //CJK UNIFIED IDEOGRAPH
+ 0xC146: 0x78EF, //CJK UNIFIED IDEOGRAPH
+ 0xC147: 0x7901, //CJK UNIFIED IDEOGRAPH
+ 0xC148: 0x79A7, //CJK UNIFIED IDEOGRAPH
+ 0xC149: 0x79AA, //CJK UNIFIED IDEOGRAPH
+ 0xC14A: 0x7A57, //CJK UNIFIED IDEOGRAPH
+ 0xC14B: 0x7ABF, //CJK UNIFIED IDEOGRAPH
+ 0xC14C: 0x7C07, //CJK UNIFIED IDEOGRAPH
+ 0xC14D: 0x7C0D, //CJK UNIFIED IDEOGRAPH
+ 0xC14E: 0x7BFE, //CJK UNIFIED IDEOGRAPH
+ 0xC14F: 0x7BF7, //CJK UNIFIED IDEOGRAPH
+ 0xC150: 0x7C0C, //CJK UNIFIED IDEOGRAPH
+ 0xC151: 0x7BE0, //CJK UNIFIED IDEOGRAPH
+ 0xC152: 0x7CE0, //CJK UNIFIED IDEOGRAPH
+ 0xC153: 0x7CDC, //CJK UNIFIED IDEOGRAPH
+ 0xC154: 0x7CDE, //CJK UNIFIED IDEOGRAPH
+ 0xC155: 0x7CE2, //CJK UNIFIED IDEOGRAPH
+ 0xC156: 0x7CDF, //CJK UNIFIED IDEOGRAPH
+ 0xC157: 0x7CD9, //CJK UNIFIED IDEOGRAPH
+ 0xC158: 0x7CDD, //CJK UNIFIED IDEOGRAPH
+ 0xC159: 0x7E2E, //CJK UNIFIED IDEOGRAPH
+ 0xC15A: 0x7E3E, //CJK UNIFIED IDEOGRAPH
+ 0xC15B: 0x7E46, //CJK UNIFIED IDEOGRAPH
+ 0xC15C: 0x7E37, //CJK UNIFIED IDEOGRAPH
+ 0xC15D: 0x7E32, //CJK UNIFIED IDEOGRAPH
+ 0xC15E: 0x7E43, //CJK UNIFIED IDEOGRAPH
+ 0xC15F: 0x7E2B, //CJK UNIFIED IDEOGRAPH
+ 0xC160: 0x7E3D, //CJK UNIFIED IDEOGRAPH
+ 0xC161: 0x7E31, //CJK UNIFIED IDEOGRAPH
+ 0xC162: 0x7E45, //CJK UNIFIED IDEOGRAPH
+ 0xC163: 0x7E41, //CJK UNIFIED IDEOGRAPH
+ 0xC164: 0x7E34, //CJK UNIFIED IDEOGRAPH
+ 0xC165: 0x7E39, //CJK UNIFIED IDEOGRAPH
+ 0xC166: 0x7E48, //CJK UNIFIED IDEOGRAPH
+ 0xC167: 0x7E35, //CJK UNIFIED IDEOGRAPH
+ 0xC168: 0x7E3F, //CJK UNIFIED IDEOGRAPH
+ 0xC169: 0x7E2F, //CJK UNIFIED IDEOGRAPH
+ 0xC16A: 0x7F44, //CJK UNIFIED IDEOGRAPH
+ 0xC16B: 0x7FF3, //CJK UNIFIED IDEOGRAPH
+ 0xC16C: 0x7FFC, //CJK UNIFIED IDEOGRAPH
+ 0xC16D: 0x8071, //CJK UNIFIED IDEOGRAPH
+ 0xC16E: 0x8072, //CJK UNIFIED IDEOGRAPH
+ 0xC16F: 0x8070, //CJK UNIFIED IDEOGRAPH
+ 0xC170: 0x806F, //CJK UNIFIED IDEOGRAPH
+ 0xC171: 0x8073, //CJK UNIFIED IDEOGRAPH
+ 0xC172: 0x81C6, //CJK UNIFIED IDEOGRAPH
+ 0xC173: 0x81C3, //CJK UNIFIED IDEOGRAPH
+ 0xC174: 0x81BA, //CJK UNIFIED IDEOGRAPH
+ 0xC175: 0x81C2, //CJK UNIFIED IDEOGRAPH
+ 0xC176: 0x81C0, //CJK UNIFIED IDEOGRAPH
+ 0xC177: 0x81BF, //CJK UNIFIED IDEOGRAPH
+ 0xC178: 0x81BD, //CJK UNIFIED IDEOGRAPH
+ 0xC179: 0x81C9, //CJK UNIFIED IDEOGRAPH
+ 0xC17A: 0x81BE, //CJK UNIFIED IDEOGRAPH
+ 0xC17B: 0x81E8, //CJK UNIFIED IDEOGRAPH
+ 0xC17C: 0x8209, //CJK UNIFIED IDEOGRAPH
+ 0xC17D: 0x8271, //CJK UNIFIED IDEOGRAPH
+ 0xC17E: 0x85AA, //CJK UNIFIED IDEOGRAPH
+ 0xC1A1: 0x8584, //CJK UNIFIED IDEOGRAPH
+ 0xC1A2: 0x857E, //CJK UNIFIED IDEOGRAPH
+ 0xC1A3: 0x859C, //CJK UNIFIED IDEOGRAPH
+ 0xC1A4: 0x8591, //CJK UNIFIED IDEOGRAPH
+ 0xC1A5: 0x8594, //CJK UNIFIED IDEOGRAPH
+ 0xC1A6: 0x85AF, //CJK UNIFIED IDEOGRAPH
+ 0xC1A7: 0x859B, //CJK UNIFIED IDEOGRAPH
+ 0xC1A8: 0x8587, //CJK UNIFIED IDEOGRAPH
+ 0xC1A9: 0x85A8, //CJK UNIFIED IDEOGRAPH
+ 0xC1AA: 0x858A, //CJK UNIFIED IDEOGRAPH
+ 0xC1AB: 0x8667, //CJK UNIFIED IDEOGRAPH
+ 0xC1AC: 0x87C0, //CJK UNIFIED IDEOGRAPH
+ 0xC1AD: 0x87D1, //CJK UNIFIED IDEOGRAPH
+ 0xC1AE: 0x87B3, //CJK UNIFIED IDEOGRAPH
+ 0xC1AF: 0x87D2, //CJK UNIFIED IDEOGRAPH
+ 0xC1B0: 0x87C6, //CJK UNIFIED IDEOGRAPH
+ 0xC1B1: 0x87AB, //CJK UNIFIED IDEOGRAPH
+ 0xC1B2: 0x87BB, //CJK UNIFIED IDEOGRAPH
+ 0xC1B3: 0x87BA, //CJK UNIFIED IDEOGRAPH
+ 0xC1B4: 0x87C8, //CJK UNIFIED IDEOGRAPH
+ 0xC1B5: 0x87CB, //CJK UNIFIED IDEOGRAPH
+ 0xC1B6: 0x893B, //CJK UNIFIED IDEOGRAPH
+ 0xC1B7: 0x8936, //CJK UNIFIED IDEOGRAPH
+ 0xC1B8: 0x8944, //CJK UNIFIED IDEOGRAPH
+ 0xC1B9: 0x8938, //CJK UNIFIED IDEOGRAPH
+ 0xC1BA: 0x893D, //CJK UNIFIED IDEOGRAPH
+ 0xC1BB: 0x89AC, //CJK UNIFIED IDEOGRAPH
+ 0xC1BC: 0x8B0E, //CJK UNIFIED IDEOGRAPH
+ 0xC1BD: 0x8B17, //CJK UNIFIED IDEOGRAPH
+ 0xC1BE: 0x8B19, //CJK UNIFIED IDEOGRAPH
+ 0xC1BF: 0x8B1B, //CJK UNIFIED IDEOGRAPH
+ 0xC1C0: 0x8B0A, //CJK UNIFIED IDEOGRAPH
+ 0xC1C1: 0x8B20, //CJK UNIFIED IDEOGRAPH
+ 0xC1C2: 0x8B1D, //CJK UNIFIED IDEOGRAPH
+ 0xC1C3: 0x8B04, //CJK UNIFIED IDEOGRAPH
+ 0xC1C4: 0x8B10, //CJK UNIFIED IDEOGRAPH
+ 0xC1C5: 0x8C41, //CJK UNIFIED IDEOGRAPH
+ 0xC1C6: 0x8C3F, //CJK UNIFIED IDEOGRAPH
+ 0xC1C7: 0x8C73, //CJK UNIFIED IDEOGRAPH
+ 0xC1C8: 0x8CFA, //CJK UNIFIED IDEOGRAPH
+ 0xC1C9: 0x8CFD, //CJK UNIFIED IDEOGRAPH
+ 0xC1CA: 0x8CFC, //CJK UNIFIED IDEOGRAPH
+ 0xC1CB: 0x8CF8, //CJK UNIFIED IDEOGRAPH
+ 0xC1CC: 0x8CFB, //CJK UNIFIED IDEOGRAPH
+ 0xC1CD: 0x8DA8, //CJK UNIFIED IDEOGRAPH
+ 0xC1CE: 0x8E49, //CJK UNIFIED IDEOGRAPH
+ 0xC1CF: 0x8E4B, //CJK UNIFIED IDEOGRAPH
+ 0xC1D0: 0x8E48, //CJK UNIFIED IDEOGRAPH
+ 0xC1D1: 0x8E4A, //CJK UNIFIED IDEOGRAPH
+ 0xC1D2: 0x8F44, //CJK UNIFIED IDEOGRAPH
+ 0xC1D3: 0x8F3E, //CJK UNIFIED IDEOGRAPH
+ 0xC1D4: 0x8F42, //CJK UNIFIED IDEOGRAPH
+ 0xC1D5: 0x8F45, //CJK UNIFIED IDEOGRAPH
+ 0xC1D6: 0x8F3F, //CJK UNIFIED IDEOGRAPH
+ 0xC1D7: 0x907F, //CJK UNIFIED IDEOGRAPH
+ 0xC1D8: 0x907D, //CJK UNIFIED IDEOGRAPH
+ 0xC1D9: 0x9084, //CJK UNIFIED IDEOGRAPH
+ 0xC1DA: 0x9081, //CJK UNIFIED IDEOGRAPH
+ 0xC1DB: 0x9082, //CJK UNIFIED IDEOGRAPH
+ 0xC1DC: 0x9080, //CJK UNIFIED IDEOGRAPH
+ 0xC1DD: 0x9139, //CJK UNIFIED IDEOGRAPH
+ 0xC1DE: 0x91A3, //CJK UNIFIED IDEOGRAPH
+ 0xC1DF: 0x919E, //CJK UNIFIED IDEOGRAPH
+ 0xC1E0: 0x919C, //CJK UNIFIED IDEOGRAPH
+ 0xC1E1: 0x934D, //CJK UNIFIED IDEOGRAPH
+ 0xC1E2: 0x9382, //CJK UNIFIED IDEOGRAPH
+ 0xC1E3: 0x9328, //CJK UNIFIED IDEOGRAPH
+ 0xC1E4: 0x9375, //CJK UNIFIED IDEOGRAPH
+ 0xC1E5: 0x934A, //CJK UNIFIED IDEOGRAPH
+ 0xC1E6: 0x9365, //CJK UNIFIED IDEOGRAPH
+ 0xC1E7: 0x934B, //CJK UNIFIED IDEOGRAPH
+ 0xC1E8: 0x9318, //CJK UNIFIED IDEOGRAPH
+ 0xC1E9: 0x937E, //CJK UNIFIED IDEOGRAPH
+ 0xC1EA: 0x936C, //CJK UNIFIED IDEOGRAPH
+ 0xC1EB: 0x935B, //CJK UNIFIED IDEOGRAPH
+ 0xC1EC: 0x9370, //CJK UNIFIED IDEOGRAPH
+ 0xC1ED: 0x935A, //CJK UNIFIED IDEOGRAPH
+ 0xC1EE: 0x9354, //CJK UNIFIED IDEOGRAPH
+ 0xC1EF: 0x95CA, //CJK UNIFIED IDEOGRAPH
+ 0xC1F0: 0x95CB, //CJK UNIFIED IDEOGRAPH
+ 0xC1F1: 0x95CC, //CJK UNIFIED IDEOGRAPH
+ 0xC1F2: 0x95C8, //CJK UNIFIED IDEOGRAPH
+ 0xC1F3: 0x95C6, //CJK UNIFIED IDEOGRAPH
+ 0xC1F4: 0x96B1, //CJK UNIFIED IDEOGRAPH
+ 0xC1F5: 0x96B8, //CJK UNIFIED IDEOGRAPH
+ 0xC1F6: 0x96D6, //CJK UNIFIED IDEOGRAPH
+ 0xC1F7: 0x971C, //CJK UNIFIED IDEOGRAPH
+ 0xC1F8: 0x971E, //CJK UNIFIED IDEOGRAPH
+ 0xC1F9: 0x97A0, //CJK UNIFIED IDEOGRAPH
+ 0xC1FA: 0x97D3, //CJK UNIFIED IDEOGRAPH
+ 0xC1FB: 0x9846, //CJK UNIFIED IDEOGRAPH
+ 0xC1FC: 0x98B6, //CJK UNIFIED IDEOGRAPH
+ 0xC1FD: 0x9935, //CJK UNIFIED IDEOGRAPH
+ 0xC1FE: 0x9A01, //CJK UNIFIED IDEOGRAPH
+ 0xC240: 0x99FF, //CJK UNIFIED IDEOGRAPH
+ 0xC241: 0x9BAE, //CJK UNIFIED IDEOGRAPH
+ 0xC242: 0x9BAB, //CJK UNIFIED IDEOGRAPH
+ 0xC243: 0x9BAA, //CJK UNIFIED IDEOGRAPH
+ 0xC244: 0x9BAD, //CJK UNIFIED IDEOGRAPH
+ 0xC245: 0x9D3B, //CJK UNIFIED IDEOGRAPH
+ 0xC246: 0x9D3F, //CJK UNIFIED IDEOGRAPH
+ 0xC247: 0x9E8B, //CJK UNIFIED IDEOGRAPH
+ 0xC248: 0x9ECF, //CJK UNIFIED IDEOGRAPH
+ 0xC249: 0x9EDE, //CJK UNIFIED IDEOGRAPH
+ 0xC24A: 0x9EDC, //CJK UNIFIED IDEOGRAPH
+ 0xC24B: 0x9EDD, //CJK UNIFIED IDEOGRAPH
+ 0xC24C: 0x9EDB, //CJK UNIFIED IDEOGRAPH
+ 0xC24D: 0x9F3E, //CJK UNIFIED IDEOGRAPH
+ 0xC24E: 0x9F4B, //CJK UNIFIED IDEOGRAPH
+ 0xC24F: 0x53E2, //CJK UNIFIED IDEOGRAPH
+ 0xC250: 0x5695, //CJK UNIFIED IDEOGRAPH
+ 0xC251: 0x56AE, //CJK UNIFIED IDEOGRAPH
+ 0xC252: 0x58D9, //CJK UNIFIED IDEOGRAPH
+ 0xC253: 0x58D8, //CJK UNIFIED IDEOGRAPH
+ 0xC254: 0x5B38, //CJK UNIFIED IDEOGRAPH
+ 0xC255: 0x5F5D, //CJK UNIFIED IDEOGRAPH
+ 0xC256: 0x61E3, //CJK UNIFIED IDEOGRAPH
+ 0xC257: 0x6233, //CJK UNIFIED IDEOGRAPH
+ 0xC258: 0x64F4, //CJK UNIFIED IDEOGRAPH
+ 0xC259: 0x64F2, //CJK UNIFIED IDEOGRAPH
+ 0xC25A: 0x64FE, //CJK UNIFIED IDEOGRAPH
+ 0xC25B: 0x6506, //CJK UNIFIED IDEOGRAPH
+ 0xC25C: 0x64FA, //CJK UNIFIED IDEOGRAPH
+ 0xC25D: 0x64FB, //CJK UNIFIED IDEOGRAPH
+ 0xC25E: 0x64F7, //CJK UNIFIED IDEOGRAPH
+ 0xC25F: 0x65B7, //CJK UNIFIED IDEOGRAPH
+ 0xC260: 0x66DC, //CJK UNIFIED IDEOGRAPH
+ 0xC261: 0x6726, //CJK UNIFIED IDEOGRAPH
+ 0xC262: 0x6AB3, //CJK UNIFIED IDEOGRAPH
+ 0xC263: 0x6AAC, //CJK UNIFIED IDEOGRAPH
+ 0xC264: 0x6AC3, //CJK UNIFIED IDEOGRAPH
+ 0xC265: 0x6ABB, //CJK UNIFIED IDEOGRAPH
+ 0xC266: 0x6AB8, //CJK UNIFIED IDEOGRAPH
+ 0xC267: 0x6AC2, //CJK UNIFIED IDEOGRAPH
+ 0xC268: 0x6AAE, //CJK UNIFIED IDEOGRAPH
+ 0xC269: 0x6AAF, //CJK UNIFIED IDEOGRAPH
+ 0xC26A: 0x6B5F, //CJK UNIFIED IDEOGRAPH
+ 0xC26B: 0x6B78, //CJK UNIFIED IDEOGRAPH
+ 0xC26C: 0x6BAF, //CJK UNIFIED IDEOGRAPH
+ 0xC26D: 0x7009, //CJK UNIFIED IDEOGRAPH
+ 0xC26E: 0x700B, //CJK UNIFIED IDEOGRAPH
+ 0xC26F: 0x6FFE, //CJK UNIFIED IDEOGRAPH
+ 0xC270: 0x7006, //CJK UNIFIED IDEOGRAPH
+ 0xC271: 0x6FFA, //CJK UNIFIED IDEOGRAPH
+ 0xC272: 0x7011, //CJK UNIFIED IDEOGRAPH
+ 0xC273: 0x700F, //CJK UNIFIED IDEOGRAPH
+ 0xC274: 0x71FB, //CJK UNIFIED IDEOGRAPH
+ 0xC275: 0x71FC, //CJK UNIFIED IDEOGRAPH
+ 0xC276: 0x71FE, //CJK UNIFIED IDEOGRAPH
+ 0xC277: 0x71F8, //CJK UNIFIED IDEOGRAPH
+ 0xC278: 0x7377, //CJK UNIFIED IDEOGRAPH
+ 0xC279: 0x7375, //CJK UNIFIED IDEOGRAPH
+ 0xC27A: 0x74A7, //CJK UNIFIED IDEOGRAPH
+ 0xC27B: 0x74BF, //CJK UNIFIED IDEOGRAPH
+ 0xC27C: 0x7515, //CJK UNIFIED IDEOGRAPH
+ 0xC27D: 0x7656, //CJK UNIFIED IDEOGRAPH
+ 0xC27E: 0x7658, //CJK UNIFIED IDEOGRAPH
+ 0xC2A1: 0x7652, //CJK UNIFIED IDEOGRAPH
+ 0xC2A2: 0x77BD, //CJK UNIFIED IDEOGRAPH
+ 0xC2A3: 0x77BF, //CJK UNIFIED IDEOGRAPH
+ 0xC2A4: 0x77BB, //CJK UNIFIED IDEOGRAPH
+ 0xC2A5: 0x77BC, //CJK UNIFIED IDEOGRAPH
+ 0xC2A6: 0x790E, //CJK UNIFIED IDEOGRAPH
+ 0xC2A7: 0x79AE, //CJK UNIFIED IDEOGRAPH
+ 0xC2A8: 0x7A61, //CJK UNIFIED IDEOGRAPH
+ 0xC2A9: 0x7A62, //CJK UNIFIED IDEOGRAPH
+ 0xC2AA: 0x7A60, //CJK UNIFIED IDEOGRAPH
+ 0xC2AB: 0x7AC4, //CJK UNIFIED IDEOGRAPH
+ 0xC2AC: 0x7AC5, //CJK UNIFIED IDEOGRAPH
+ 0xC2AD: 0x7C2B, //CJK UNIFIED IDEOGRAPH
+ 0xC2AE: 0x7C27, //CJK UNIFIED IDEOGRAPH
+ 0xC2AF: 0x7C2A, //CJK UNIFIED IDEOGRAPH
+ 0xC2B0: 0x7C1E, //CJK UNIFIED IDEOGRAPH
+ 0xC2B1: 0x7C23, //CJK UNIFIED IDEOGRAPH
+ 0xC2B2: 0x7C21, //CJK UNIFIED IDEOGRAPH
+ 0xC2B3: 0x7CE7, //CJK UNIFIED IDEOGRAPH
+ 0xC2B4: 0x7E54, //CJK UNIFIED IDEOGRAPH
+ 0xC2B5: 0x7E55, //CJK UNIFIED IDEOGRAPH
+ 0xC2B6: 0x7E5E, //CJK UNIFIED IDEOGRAPH
+ 0xC2B7: 0x7E5A, //CJK UNIFIED IDEOGRAPH
+ 0xC2B8: 0x7E61, //CJK UNIFIED IDEOGRAPH
+ 0xC2B9: 0x7E52, //CJK UNIFIED IDEOGRAPH
+ 0xC2BA: 0x7E59, //CJK UNIFIED IDEOGRAPH
+ 0xC2BB: 0x7F48, //CJK UNIFIED IDEOGRAPH
+ 0xC2BC: 0x7FF9, //CJK UNIFIED IDEOGRAPH
+ 0xC2BD: 0x7FFB, //CJK UNIFIED IDEOGRAPH
+ 0xC2BE: 0x8077, //CJK UNIFIED IDEOGRAPH
+ 0xC2BF: 0x8076, //CJK UNIFIED IDEOGRAPH
+ 0xC2C0: 0x81CD, //CJK UNIFIED IDEOGRAPH
+ 0xC2C1: 0x81CF, //CJK UNIFIED IDEOGRAPH
+ 0xC2C2: 0x820A, //CJK UNIFIED IDEOGRAPH
+ 0xC2C3: 0x85CF, //CJK UNIFIED IDEOGRAPH
+ 0xC2C4: 0x85A9, //CJK UNIFIED IDEOGRAPH
+ 0xC2C5: 0x85CD, //CJK UNIFIED IDEOGRAPH
+ 0xC2C6: 0x85D0, //CJK UNIFIED IDEOGRAPH
+ 0xC2C7: 0x85C9, //CJK UNIFIED IDEOGRAPH
+ 0xC2C8: 0x85B0, //CJK UNIFIED IDEOGRAPH
+ 0xC2C9: 0x85BA, //CJK UNIFIED IDEOGRAPH
+ 0xC2CA: 0x85B9, //CJK UNIFIED IDEOGRAPH
+ 0xC2CB: 0x85A6, //CJK UNIFIED IDEOGRAPH
+ 0xC2CC: 0x87EF, //CJK UNIFIED IDEOGRAPH
+ 0xC2CD: 0x87EC, //CJK UNIFIED IDEOGRAPH
+ 0xC2CE: 0x87F2, //CJK UNIFIED IDEOGRAPH
+ 0xC2CF: 0x87E0, //CJK UNIFIED IDEOGRAPH
+ 0xC2D0: 0x8986, //CJK UNIFIED IDEOGRAPH
+ 0xC2D1: 0x89B2, //CJK UNIFIED IDEOGRAPH
+ 0xC2D2: 0x89F4, //CJK UNIFIED IDEOGRAPH
+ 0xC2D3: 0x8B28, //CJK UNIFIED IDEOGRAPH
+ 0xC2D4: 0x8B39, //CJK UNIFIED IDEOGRAPH
+ 0xC2D5: 0x8B2C, //CJK UNIFIED IDEOGRAPH
+ 0xC2D6: 0x8B2B, //CJK UNIFIED IDEOGRAPH
+ 0xC2D7: 0x8C50, //CJK UNIFIED IDEOGRAPH
+ 0xC2D8: 0x8D05, //CJK UNIFIED IDEOGRAPH
+ 0xC2D9: 0x8E59, //CJK UNIFIED IDEOGRAPH
+ 0xC2DA: 0x8E63, //CJK UNIFIED IDEOGRAPH
+ 0xC2DB: 0x8E66, //CJK UNIFIED IDEOGRAPH
+ 0xC2DC: 0x8E64, //CJK UNIFIED IDEOGRAPH
+ 0xC2DD: 0x8E5F, //CJK UNIFIED IDEOGRAPH
+ 0xC2DE: 0x8E55, //CJK UNIFIED IDEOGRAPH
+ 0xC2DF: 0x8EC0, //CJK UNIFIED IDEOGRAPH
+ 0xC2E0: 0x8F49, //CJK UNIFIED IDEOGRAPH
+ 0xC2E1: 0x8F4D, //CJK UNIFIED IDEOGRAPH
+ 0xC2E2: 0x9087, //CJK UNIFIED IDEOGRAPH
+ 0xC2E3: 0x9083, //CJK UNIFIED IDEOGRAPH
+ 0xC2E4: 0x9088, //CJK UNIFIED IDEOGRAPH
+ 0xC2E5: 0x91AB, //CJK UNIFIED IDEOGRAPH
+ 0xC2E6: 0x91AC, //CJK UNIFIED IDEOGRAPH
+ 0xC2E7: 0x91D0, //CJK UNIFIED IDEOGRAPH
+ 0xC2E8: 0x9394, //CJK UNIFIED IDEOGRAPH
+ 0xC2E9: 0x938A, //CJK UNIFIED IDEOGRAPH
+ 0xC2EA: 0x9396, //CJK UNIFIED IDEOGRAPH
+ 0xC2EB: 0x93A2, //CJK UNIFIED IDEOGRAPH
+ 0xC2EC: 0x93B3, //CJK UNIFIED IDEOGRAPH
+ 0xC2ED: 0x93AE, //CJK UNIFIED IDEOGRAPH
+ 0xC2EE: 0x93AC, //CJK UNIFIED IDEOGRAPH
+ 0xC2EF: 0x93B0, //CJK UNIFIED IDEOGRAPH
+ 0xC2F0: 0x9398, //CJK UNIFIED IDEOGRAPH
+ 0xC2F1: 0x939A, //CJK UNIFIED IDEOGRAPH
+ 0xC2F2: 0x9397, //CJK UNIFIED IDEOGRAPH
+ 0xC2F3: 0x95D4, //CJK UNIFIED IDEOGRAPH
+ 0xC2F4: 0x95D6, //CJK UNIFIED IDEOGRAPH
+ 0xC2F5: 0x95D0, //CJK UNIFIED IDEOGRAPH
+ 0xC2F6: 0x95D5, //CJK UNIFIED IDEOGRAPH
+ 0xC2F7: 0x96E2, //CJK UNIFIED IDEOGRAPH
+ 0xC2F8: 0x96DC, //CJK UNIFIED IDEOGRAPH
+ 0xC2F9: 0x96D9, //CJK UNIFIED IDEOGRAPH
+ 0xC2FA: 0x96DB, //CJK UNIFIED IDEOGRAPH
+ 0xC2FB: 0x96DE, //CJK UNIFIED IDEOGRAPH
+ 0xC2FC: 0x9724, //CJK UNIFIED IDEOGRAPH
+ 0xC2FD: 0x97A3, //CJK UNIFIED IDEOGRAPH
+ 0xC2FE: 0x97A6, //CJK UNIFIED IDEOGRAPH
+ 0xC340: 0x97AD, //CJK UNIFIED IDEOGRAPH
+ 0xC341: 0x97F9, //CJK UNIFIED IDEOGRAPH
+ 0xC342: 0x984D, //CJK UNIFIED IDEOGRAPH
+ 0xC343: 0x984F, //CJK UNIFIED IDEOGRAPH
+ 0xC344: 0x984C, //CJK UNIFIED IDEOGRAPH
+ 0xC345: 0x984E, //CJK UNIFIED IDEOGRAPH
+ 0xC346: 0x9853, //CJK UNIFIED IDEOGRAPH
+ 0xC347: 0x98BA, //CJK UNIFIED IDEOGRAPH
+ 0xC348: 0x993E, //CJK UNIFIED IDEOGRAPH
+ 0xC349: 0x993F, //CJK UNIFIED IDEOGRAPH
+ 0xC34A: 0x993D, //CJK UNIFIED IDEOGRAPH
+ 0xC34B: 0x992E, //CJK UNIFIED IDEOGRAPH
+ 0xC34C: 0x99A5, //CJK UNIFIED IDEOGRAPH
+ 0xC34D: 0x9A0E, //CJK UNIFIED IDEOGRAPH
+ 0xC34E: 0x9AC1, //CJK UNIFIED IDEOGRAPH
+ 0xC34F: 0x9B03, //CJK UNIFIED IDEOGRAPH
+ 0xC350: 0x9B06, //CJK UNIFIED IDEOGRAPH
+ 0xC351: 0x9B4F, //CJK UNIFIED IDEOGRAPH
+ 0xC352: 0x9B4E, //CJK UNIFIED IDEOGRAPH
+ 0xC353: 0x9B4D, //CJK UNIFIED IDEOGRAPH
+ 0xC354: 0x9BCA, //CJK UNIFIED IDEOGRAPH
+ 0xC355: 0x9BC9, //CJK UNIFIED IDEOGRAPH
+ 0xC356: 0x9BFD, //CJK UNIFIED IDEOGRAPH
+ 0xC357: 0x9BC8, //CJK UNIFIED IDEOGRAPH
+ 0xC358: 0x9BC0, //CJK UNIFIED IDEOGRAPH
+ 0xC359: 0x9D51, //CJK UNIFIED IDEOGRAPH
+ 0xC35A: 0x9D5D, //CJK UNIFIED IDEOGRAPH
+ 0xC35B: 0x9D60, //CJK UNIFIED IDEOGRAPH
+ 0xC35C: 0x9EE0, //CJK UNIFIED IDEOGRAPH
+ 0xC35D: 0x9F15, //CJK UNIFIED IDEOGRAPH
+ 0xC35E: 0x9F2C, //CJK UNIFIED IDEOGRAPH
+ 0xC35F: 0x5133, //CJK UNIFIED IDEOGRAPH
+ 0xC360: 0x56A5, //CJK UNIFIED IDEOGRAPH
+ 0xC361: 0x58DE, //CJK UNIFIED IDEOGRAPH
+ 0xC362: 0x58DF, //CJK UNIFIED IDEOGRAPH
+ 0xC363: 0x58E2, //CJK UNIFIED IDEOGRAPH
+ 0xC364: 0x5BF5, //CJK UNIFIED IDEOGRAPH
+ 0xC365: 0x9F90, //CJK UNIFIED IDEOGRAPH
+ 0xC366: 0x5EEC, //CJK UNIFIED IDEOGRAPH
+ 0xC367: 0x61F2, //CJK UNIFIED IDEOGRAPH
+ 0xC368: 0x61F7, //CJK UNIFIED IDEOGRAPH
+ 0xC369: 0x61F6, //CJK UNIFIED IDEOGRAPH
+ 0xC36A: 0x61F5, //CJK UNIFIED IDEOGRAPH
+ 0xC36B: 0x6500, //CJK UNIFIED IDEOGRAPH
+ 0xC36C: 0x650F, //CJK UNIFIED IDEOGRAPH
+ 0xC36D: 0x66E0, //CJK UNIFIED IDEOGRAPH
+ 0xC36E: 0x66DD, //CJK UNIFIED IDEOGRAPH
+ 0xC36F: 0x6AE5, //CJK UNIFIED IDEOGRAPH
+ 0xC370: 0x6ADD, //CJK UNIFIED IDEOGRAPH
+ 0xC371: 0x6ADA, //CJK UNIFIED IDEOGRAPH
+ 0xC372: 0x6AD3, //CJK UNIFIED IDEOGRAPH
+ 0xC373: 0x701B, //CJK UNIFIED IDEOGRAPH
+ 0xC374: 0x701F, //CJK UNIFIED IDEOGRAPH
+ 0xC375: 0x7028, //CJK UNIFIED IDEOGRAPH
+ 0xC376: 0x701A, //CJK UNIFIED IDEOGRAPH
+ 0xC377: 0x701D, //CJK UNIFIED IDEOGRAPH
+ 0xC378: 0x7015, //CJK UNIFIED IDEOGRAPH
+ 0xC379: 0x7018, //CJK UNIFIED IDEOGRAPH
+ 0xC37A: 0x7206, //CJK UNIFIED IDEOGRAPH
+ 0xC37B: 0x720D, //CJK UNIFIED IDEOGRAPH
+ 0xC37C: 0x7258, //CJK UNIFIED IDEOGRAPH
+ 0xC37D: 0x72A2, //CJK UNIFIED IDEOGRAPH
+ 0xC37E: 0x7378, //CJK UNIFIED IDEOGRAPH
+ 0xC3A1: 0x737A, //CJK UNIFIED IDEOGRAPH
+ 0xC3A2: 0x74BD, //CJK UNIFIED IDEOGRAPH
+ 0xC3A3: 0x74CA, //CJK UNIFIED IDEOGRAPH
+ 0xC3A4: 0x74E3, //CJK UNIFIED IDEOGRAPH
+ 0xC3A5: 0x7587, //CJK UNIFIED IDEOGRAPH
+ 0xC3A6: 0x7586, //CJK UNIFIED IDEOGRAPH
+ 0xC3A7: 0x765F, //CJK UNIFIED IDEOGRAPH
+ 0xC3A8: 0x7661, //CJK UNIFIED IDEOGRAPH
+ 0xC3A9: 0x77C7, //CJK UNIFIED IDEOGRAPH
+ 0xC3AA: 0x7919, //CJK UNIFIED IDEOGRAPH
+ 0xC3AB: 0x79B1, //CJK UNIFIED IDEOGRAPH
+ 0xC3AC: 0x7A6B, //CJK UNIFIED IDEOGRAPH
+ 0xC3AD: 0x7A69, //CJK UNIFIED IDEOGRAPH
+ 0xC3AE: 0x7C3E, //CJK UNIFIED IDEOGRAPH
+ 0xC3AF: 0x7C3F, //CJK UNIFIED IDEOGRAPH
+ 0xC3B0: 0x7C38, //CJK UNIFIED IDEOGRAPH
+ 0xC3B1: 0x7C3D, //CJK UNIFIED IDEOGRAPH
+ 0xC3B2: 0x7C37, //CJK UNIFIED IDEOGRAPH
+ 0xC3B3: 0x7C40, //CJK UNIFIED IDEOGRAPH
+ 0xC3B4: 0x7E6B, //CJK UNIFIED IDEOGRAPH
+ 0xC3B5: 0x7E6D, //CJK UNIFIED IDEOGRAPH
+ 0xC3B6: 0x7E79, //CJK UNIFIED IDEOGRAPH
+ 0xC3B7: 0x7E69, //CJK UNIFIED IDEOGRAPH
+ 0xC3B8: 0x7E6A, //CJK UNIFIED IDEOGRAPH
+ 0xC3B9: 0x7F85, //CJK UNIFIED IDEOGRAPH
+ 0xC3BA: 0x7E73, //CJK UNIFIED IDEOGRAPH
+ 0xC3BB: 0x7FB6, //CJK UNIFIED IDEOGRAPH
+ 0xC3BC: 0x7FB9, //CJK UNIFIED IDEOGRAPH
+ 0xC3BD: 0x7FB8, //CJK UNIFIED IDEOGRAPH
+ 0xC3BE: 0x81D8, //CJK UNIFIED IDEOGRAPH
+ 0xC3BF: 0x85E9, //CJK UNIFIED IDEOGRAPH
+ 0xC3C0: 0x85DD, //CJK UNIFIED IDEOGRAPH
+ 0xC3C1: 0x85EA, //CJK UNIFIED IDEOGRAPH
+ 0xC3C2: 0x85D5, //CJK UNIFIED IDEOGRAPH
+ 0xC3C3: 0x85E4, //CJK UNIFIED IDEOGRAPH
+ 0xC3C4: 0x85E5, //CJK UNIFIED IDEOGRAPH
+ 0xC3C5: 0x85F7, //CJK UNIFIED IDEOGRAPH
+ 0xC3C6: 0x87FB, //CJK UNIFIED IDEOGRAPH
+ 0xC3C7: 0x8805, //CJK UNIFIED IDEOGRAPH
+ 0xC3C8: 0x880D, //CJK UNIFIED IDEOGRAPH
+ 0xC3C9: 0x87F9, //CJK UNIFIED IDEOGRAPH
+ 0xC3CA: 0x87FE, //CJK UNIFIED IDEOGRAPH
+ 0xC3CB: 0x8960, //CJK UNIFIED IDEOGRAPH
+ 0xC3CC: 0x895F, //CJK UNIFIED IDEOGRAPH
+ 0xC3CD: 0x8956, //CJK UNIFIED IDEOGRAPH
+ 0xC3CE: 0x895E, //CJK UNIFIED IDEOGRAPH
+ 0xC3CF: 0x8B41, //CJK UNIFIED IDEOGRAPH
+ 0xC3D0: 0x8B5C, //CJK UNIFIED IDEOGRAPH
+ 0xC3D1: 0x8B58, //CJK UNIFIED IDEOGRAPH
+ 0xC3D2: 0x8B49, //CJK UNIFIED IDEOGRAPH
+ 0xC3D3: 0x8B5A, //CJK UNIFIED IDEOGRAPH
+ 0xC3D4: 0x8B4E, //CJK UNIFIED IDEOGRAPH
+ 0xC3D5: 0x8B4F, //CJK UNIFIED IDEOGRAPH
+ 0xC3D6: 0x8B46, //CJK UNIFIED IDEOGRAPH
+ 0xC3D7: 0x8B59, //CJK UNIFIED IDEOGRAPH
+ 0xC3D8: 0x8D08, //CJK UNIFIED IDEOGRAPH
+ 0xC3D9: 0x8D0A, //CJK UNIFIED IDEOGRAPH
+ 0xC3DA: 0x8E7C, //CJK UNIFIED IDEOGRAPH
+ 0xC3DB: 0x8E72, //CJK UNIFIED IDEOGRAPH
+ 0xC3DC: 0x8E87, //CJK UNIFIED IDEOGRAPH
+ 0xC3DD: 0x8E76, //CJK UNIFIED IDEOGRAPH
+ 0xC3DE: 0x8E6C, //CJK UNIFIED IDEOGRAPH
+ 0xC3DF: 0x8E7A, //CJK UNIFIED IDEOGRAPH
+ 0xC3E0: 0x8E74, //CJK UNIFIED IDEOGRAPH
+ 0xC3E1: 0x8F54, //CJK UNIFIED IDEOGRAPH
+ 0xC3E2: 0x8F4E, //CJK UNIFIED IDEOGRAPH
+ 0xC3E3: 0x8FAD, //CJK UNIFIED IDEOGRAPH
+ 0xC3E4: 0x908A, //CJK UNIFIED IDEOGRAPH
+ 0xC3E5: 0x908B, //CJK UNIFIED IDEOGRAPH
+ 0xC3E6: 0x91B1, //CJK UNIFIED IDEOGRAPH
+ 0xC3E7: 0x91AE, //CJK UNIFIED IDEOGRAPH
+ 0xC3E8: 0x93E1, //CJK UNIFIED IDEOGRAPH
+ 0xC3E9: 0x93D1, //CJK UNIFIED IDEOGRAPH
+ 0xC3EA: 0x93DF, //CJK UNIFIED IDEOGRAPH
+ 0xC3EB: 0x93C3, //CJK UNIFIED IDEOGRAPH
+ 0xC3EC: 0x93C8, //CJK UNIFIED IDEOGRAPH
+ 0xC3ED: 0x93DC, //CJK UNIFIED IDEOGRAPH
+ 0xC3EE: 0x93DD, //CJK UNIFIED IDEOGRAPH
+ 0xC3EF: 0x93D6, //CJK UNIFIED IDEOGRAPH
+ 0xC3F0: 0x93E2, //CJK UNIFIED IDEOGRAPH
+ 0xC3F1: 0x93CD, //CJK UNIFIED IDEOGRAPH
+ 0xC3F2: 0x93D8, //CJK UNIFIED IDEOGRAPH
+ 0xC3F3: 0x93E4, //CJK UNIFIED IDEOGRAPH
+ 0xC3F4: 0x93D7, //CJK UNIFIED IDEOGRAPH
+ 0xC3F5: 0x93E8, //CJK UNIFIED IDEOGRAPH
+ 0xC3F6: 0x95DC, //CJK UNIFIED IDEOGRAPH
+ 0xC3F7: 0x96B4, //CJK UNIFIED IDEOGRAPH
+ 0xC3F8: 0x96E3, //CJK UNIFIED IDEOGRAPH
+ 0xC3F9: 0x972A, //CJK UNIFIED IDEOGRAPH
+ 0xC3FA: 0x9727, //CJK UNIFIED IDEOGRAPH
+ 0xC3FB: 0x9761, //CJK UNIFIED IDEOGRAPH
+ 0xC3FC: 0x97DC, //CJK UNIFIED IDEOGRAPH
+ 0xC3FD: 0x97FB, //CJK UNIFIED IDEOGRAPH
+ 0xC3FE: 0x985E, //CJK UNIFIED IDEOGRAPH
+ 0xC440: 0x9858, //CJK UNIFIED IDEOGRAPH
+ 0xC441: 0x985B, //CJK UNIFIED IDEOGRAPH
+ 0xC442: 0x98BC, //CJK UNIFIED IDEOGRAPH
+ 0xC443: 0x9945, //CJK UNIFIED IDEOGRAPH
+ 0xC444: 0x9949, //CJK UNIFIED IDEOGRAPH
+ 0xC445: 0x9A16, //CJK UNIFIED IDEOGRAPH
+ 0xC446: 0x9A19, //CJK UNIFIED IDEOGRAPH
+ 0xC447: 0x9B0D, //CJK UNIFIED IDEOGRAPH
+ 0xC448: 0x9BE8, //CJK UNIFIED IDEOGRAPH
+ 0xC449: 0x9BE7, //CJK UNIFIED IDEOGRAPH
+ 0xC44A: 0x9BD6, //CJK UNIFIED IDEOGRAPH
+ 0xC44B: 0x9BDB, //CJK UNIFIED IDEOGRAPH
+ 0xC44C: 0x9D89, //CJK UNIFIED IDEOGRAPH
+ 0xC44D: 0x9D61, //CJK UNIFIED IDEOGRAPH
+ 0xC44E: 0x9D72, //CJK UNIFIED IDEOGRAPH
+ 0xC44F: 0x9D6A, //CJK UNIFIED IDEOGRAPH
+ 0xC450: 0x9D6C, //CJK UNIFIED IDEOGRAPH
+ 0xC451: 0x9E92, //CJK UNIFIED IDEOGRAPH
+ 0xC452: 0x9E97, //CJK UNIFIED IDEOGRAPH
+ 0xC453: 0x9E93, //CJK UNIFIED IDEOGRAPH
+ 0xC454: 0x9EB4, //CJK UNIFIED IDEOGRAPH
+ 0xC455: 0x52F8, //CJK UNIFIED IDEOGRAPH
+ 0xC456: 0x56A8, //CJK UNIFIED IDEOGRAPH
+ 0xC457: 0x56B7, //CJK UNIFIED IDEOGRAPH
+ 0xC458: 0x56B6, //CJK UNIFIED IDEOGRAPH
+ 0xC459: 0x56B4, //CJK UNIFIED IDEOGRAPH
+ 0xC45A: 0x56BC, //CJK UNIFIED IDEOGRAPH
+ 0xC45B: 0x58E4, //CJK UNIFIED IDEOGRAPH
+ 0xC45C: 0x5B40, //CJK UNIFIED IDEOGRAPH
+ 0xC45D: 0x5B43, //CJK UNIFIED IDEOGRAPH
+ 0xC45E: 0x5B7D, //CJK UNIFIED IDEOGRAPH
+ 0xC45F: 0x5BF6, //CJK UNIFIED IDEOGRAPH
+ 0xC460: 0x5DC9, //CJK UNIFIED IDEOGRAPH
+ 0xC461: 0x61F8, //CJK UNIFIED IDEOGRAPH
+ 0xC462: 0x61FA, //CJK UNIFIED IDEOGRAPH
+ 0xC463: 0x6518, //CJK UNIFIED IDEOGRAPH
+ 0xC464: 0x6514, //CJK UNIFIED IDEOGRAPH
+ 0xC465: 0x6519, //CJK UNIFIED IDEOGRAPH
+ 0xC466: 0x66E6, //CJK UNIFIED IDEOGRAPH
+ 0xC467: 0x6727, //CJK UNIFIED IDEOGRAPH
+ 0xC468: 0x6AEC, //CJK UNIFIED IDEOGRAPH
+ 0xC469: 0x703E, //CJK UNIFIED IDEOGRAPH
+ 0xC46A: 0x7030, //CJK UNIFIED IDEOGRAPH
+ 0xC46B: 0x7032, //CJK UNIFIED IDEOGRAPH
+ 0xC46C: 0x7210, //CJK UNIFIED IDEOGRAPH
+ 0xC46D: 0x737B, //CJK UNIFIED IDEOGRAPH
+ 0xC46E: 0x74CF, //CJK UNIFIED IDEOGRAPH
+ 0xC46F: 0x7662, //CJK UNIFIED IDEOGRAPH
+ 0xC470: 0x7665, //CJK UNIFIED IDEOGRAPH
+ 0xC471: 0x7926, //CJK UNIFIED IDEOGRAPH
+ 0xC472: 0x792A, //CJK UNIFIED IDEOGRAPH
+ 0xC473: 0x792C, //CJK UNIFIED IDEOGRAPH
+ 0xC474: 0x792B, //CJK UNIFIED IDEOGRAPH
+ 0xC475: 0x7AC7, //CJK UNIFIED IDEOGRAPH
+ 0xC476: 0x7AF6, //CJK UNIFIED IDEOGRAPH
+ 0xC477: 0x7C4C, //CJK UNIFIED IDEOGRAPH
+ 0xC478: 0x7C43, //CJK UNIFIED IDEOGRAPH
+ 0xC479: 0x7C4D, //CJK UNIFIED IDEOGRAPH
+ 0xC47A: 0x7CEF, //CJK UNIFIED IDEOGRAPH
+ 0xC47B: 0x7CF0, //CJK UNIFIED IDEOGRAPH
+ 0xC47C: 0x8FAE, //CJK UNIFIED IDEOGRAPH
+ 0xC47D: 0x7E7D, //CJK UNIFIED IDEOGRAPH
+ 0xC47E: 0x7E7C, //CJK UNIFIED IDEOGRAPH
+ 0xC4A1: 0x7E82, //CJK UNIFIED IDEOGRAPH
+ 0xC4A2: 0x7F4C, //CJK UNIFIED IDEOGRAPH
+ 0xC4A3: 0x8000, //CJK UNIFIED IDEOGRAPH
+ 0xC4A4: 0x81DA, //CJK UNIFIED IDEOGRAPH
+ 0xC4A5: 0x8266, //CJK UNIFIED IDEOGRAPH
+ 0xC4A6: 0x85FB, //CJK UNIFIED IDEOGRAPH
+ 0xC4A7: 0x85F9, //CJK UNIFIED IDEOGRAPH
+ 0xC4A8: 0x8611, //CJK UNIFIED IDEOGRAPH
+ 0xC4A9: 0x85FA, //CJK UNIFIED IDEOGRAPH
+ 0xC4AA: 0x8606, //CJK UNIFIED IDEOGRAPH
+ 0xC4AB: 0x860B, //CJK UNIFIED IDEOGRAPH
+ 0xC4AC: 0x8607, //CJK UNIFIED IDEOGRAPH
+ 0xC4AD: 0x860A, //CJK UNIFIED IDEOGRAPH
+ 0xC4AE: 0x8814, //CJK UNIFIED IDEOGRAPH
+ 0xC4AF: 0x8815, //CJK UNIFIED IDEOGRAPH
+ 0xC4B0: 0x8964, //CJK UNIFIED IDEOGRAPH
+ 0xC4B1: 0x89BA, //CJK UNIFIED IDEOGRAPH
+ 0xC4B2: 0x89F8, //CJK UNIFIED IDEOGRAPH
+ 0xC4B3: 0x8B70, //CJK UNIFIED IDEOGRAPH
+ 0xC4B4: 0x8B6C, //CJK UNIFIED IDEOGRAPH
+ 0xC4B5: 0x8B66, //CJK UNIFIED IDEOGRAPH
+ 0xC4B6: 0x8B6F, //CJK UNIFIED IDEOGRAPH
+ 0xC4B7: 0x8B5F, //CJK UNIFIED IDEOGRAPH
+ 0xC4B8: 0x8B6B, //CJK UNIFIED IDEOGRAPH
+ 0xC4B9: 0x8D0F, //CJK UNIFIED IDEOGRAPH
+ 0xC4BA: 0x8D0D, //CJK UNIFIED IDEOGRAPH
+ 0xC4BB: 0x8E89, //CJK UNIFIED IDEOGRAPH
+ 0xC4BC: 0x8E81, //CJK UNIFIED IDEOGRAPH
+ 0xC4BD: 0x8E85, //CJK UNIFIED IDEOGRAPH
+ 0xC4BE: 0x8E82, //CJK UNIFIED IDEOGRAPH
+ 0xC4BF: 0x91B4, //CJK UNIFIED IDEOGRAPH
+ 0xC4C0: 0x91CB, //CJK UNIFIED IDEOGRAPH
+ 0xC4C1: 0x9418, //CJK UNIFIED IDEOGRAPH
+ 0xC4C2: 0x9403, //CJK UNIFIED IDEOGRAPH
+ 0xC4C3: 0x93FD, //CJK UNIFIED IDEOGRAPH
+ 0xC4C4: 0x95E1, //CJK UNIFIED IDEOGRAPH
+ 0xC4C5: 0x9730, //CJK UNIFIED IDEOGRAPH
+ 0xC4C6: 0x98C4, //CJK UNIFIED IDEOGRAPH
+ 0xC4C7: 0x9952, //CJK UNIFIED IDEOGRAPH
+ 0xC4C8: 0x9951, //CJK UNIFIED IDEOGRAPH
+ 0xC4C9: 0x99A8, //CJK UNIFIED IDEOGRAPH
+ 0xC4CA: 0x9A2B, //CJK UNIFIED IDEOGRAPH
+ 0xC4CB: 0x9A30, //CJK UNIFIED IDEOGRAPH
+ 0xC4CC: 0x9A37, //CJK UNIFIED IDEOGRAPH
+ 0xC4CD: 0x9A35, //CJK UNIFIED IDEOGRAPH
+ 0xC4CE: 0x9C13, //CJK UNIFIED IDEOGRAPH
+ 0xC4CF: 0x9C0D, //CJK UNIFIED IDEOGRAPH
+ 0xC4D0: 0x9E79, //CJK UNIFIED IDEOGRAPH
+ 0xC4D1: 0x9EB5, //CJK UNIFIED IDEOGRAPH
+ 0xC4D2: 0x9EE8, //CJK UNIFIED IDEOGRAPH
+ 0xC4D3: 0x9F2F, //CJK UNIFIED IDEOGRAPH
+ 0xC4D4: 0x9F5F, //CJK UNIFIED IDEOGRAPH
+ 0xC4D5: 0x9F63, //CJK UNIFIED IDEOGRAPH
+ 0xC4D6: 0x9F61, //CJK UNIFIED IDEOGRAPH
+ 0xC4D7: 0x5137, //CJK UNIFIED IDEOGRAPH
+ 0xC4D8: 0x5138, //CJK UNIFIED IDEOGRAPH
+ 0xC4D9: 0x56C1, //CJK UNIFIED IDEOGRAPH
+ 0xC4DA: 0x56C0, //CJK UNIFIED IDEOGRAPH
+ 0xC4DB: 0x56C2, //CJK UNIFIED IDEOGRAPH
+ 0xC4DC: 0x5914, //CJK UNIFIED IDEOGRAPH
+ 0xC4DD: 0x5C6C, //CJK UNIFIED IDEOGRAPH
+ 0xC4DE: 0x5DCD, //CJK UNIFIED IDEOGRAPH
+ 0xC4DF: 0x61FC, //CJK UNIFIED IDEOGRAPH
+ 0xC4E0: 0x61FE, //CJK UNIFIED IDEOGRAPH
+ 0xC4E1: 0x651D, //CJK UNIFIED IDEOGRAPH
+ 0xC4E2: 0x651C, //CJK UNIFIED IDEOGRAPH
+ 0xC4E3: 0x6595, //CJK UNIFIED IDEOGRAPH
+ 0xC4E4: 0x66E9, //CJK UNIFIED IDEOGRAPH
+ 0xC4E5: 0x6AFB, //CJK UNIFIED IDEOGRAPH
+ 0xC4E6: 0x6B04, //CJK UNIFIED IDEOGRAPH
+ 0xC4E7: 0x6AFA, //CJK UNIFIED IDEOGRAPH
+ 0xC4E8: 0x6BB2, //CJK UNIFIED IDEOGRAPH
+ 0xC4E9: 0x704C, //CJK UNIFIED IDEOGRAPH
+ 0xC4EA: 0x721B, //CJK UNIFIED IDEOGRAPH
+ 0xC4EB: 0x72A7, //CJK UNIFIED IDEOGRAPH
+ 0xC4EC: 0x74D6, //CJK UNIFIED IDEOGRAPH
+ 0xC4ED: 0x74D4, //CJK UNIFIED IDEOGRAPH
+ 0xC4EE: 0x7669, //CJK UNIFIED IDEOGRAPH
+ 0xC4EF: 0x77D3, //CJK UNIFIED IDEOGRAPH
+ 0xC4F0: 0x7C50, //CJK UNIFIED IDEOGRAPH
+ 0xC4F1: 0x7E8F, //CJK UNIFIED IDEOGRAPH
+ 0xC4F2: 0x7E8C, //CJK UNIFIED IDEOGRAPH
+ 0xC4F3: 0x7FBC, //CJK UNIFIED IDEOGRAPH
+ 0xC4F4: 0x8617, //CJK UNIFIED IDEOGRAPH
+ 0xC4F5: 0x862D, //CJK UNIFIED IDEOGRAPH
+ 0xC4F6: 0x861A, //CJK UNIFIED IDEOGRAPH
+ 0xC4F7: 0x8823, //CJK UNIFIED IDEOGRAPH
+ 0xC4F8: 0x8822, //CJK UNIFIED IDEOGRAPH
+ 0xC4F9: 0x8821, //CJK UNIFIED IDEOGRAPH
+ 0xC4FA: 0x881F, //CJK UNIFIED IDEOGRAPH
+ 0xC4FB: 0x896A, //CJK UNIFIED IDEOGRAPH
+ 0xC4FC: 0x896C, //CJK UNIFIED IDEOGRAPH
+ 0xC4FD: 0x89BD, //CJK UNIFIED IDEOGRAPH
+ 0xC4FE: 0x8B74, //CJK UNIFIED IDEOGRAPH
+ 0xC540: 0x8B77, //CJK UNIFIED IDEOGRAPH
+ 0xC541: 0x8B7D, //CJK UNIFIED IDEOGRAPH
+ 0xC542: 0x8D13, //CJK UNIFIED IDEOGRAPH
+ 0xC543: 0x8E8A, //CJK UNIFIED IDEOGRAPH
+ 0xC544: 0x8E8D, //CJK UNIFIED IDEOGRAPH
+ 0xC545: 0x8E8B, //CJK UNIFIED IDEOGRAPH
+ 0xC546: 0x8F5F, //CJK UNIFIED IDEOGRAPH
+ 0xC547: 0x8FAF, //CJK UNIFIED IDEOGRAPH
+ 0xC548: 0x91BA, //CJK UNIFIED IDEOGRAPH
+ 0xC549: 0x942E, //CJK UNIFIED IDEOGRAPH
+ 0xC54A: 0x9433, //CJK UNIFIED IDEOGRAPH
+ 0xC54B: 0x9435, //CJK UNIFIED IDEOGRAPH
+ 0xC54C: 0x943A, //CJK UNIFIED IDEOGRAPH
+ 0xC54D: 0x9438, //CJK UNIFIED IDEOGRAPH
+ 0xC54E: 0x9432, //CJK UNIFIED IDEOGRAPH
+ 0xC54F: 0x942B, //CJK UNIFIED IDEOGRAPH
+ 0xC550: 0x95E2, //CJK UNIFIED IDEOGRAPH
+ 0xC551: 0x9738, //CJK UNIFIED IDEOGRAPH
+ 0xC552: 0x9739, //CJK UNIFIED IDEOGRAPH
+ 0xC553: 0x9732, //CJK UNIFIED IDEOGRAPH
+ 0xC554: 0x97FF, //CJK UNIFIED IDEOGRAPH
+ 0xC555: 0x9867, //CJK UNIFIED IDEOGRAPH
+ 0xC556: 0x9865, //CJK UNIFIED IDEOGRAPH
+ 0xC557: 0x9957, //CJK UNIFIED IDEOGRAPH
+ 0xC558: 0x9A45, //CJK UNIFIED IDEOGRAPH
+ 0xC559: 0x9A43, //CJK UNIFIED IDEOGRAPH
+ 0xC55A: 0x9A40, //CJK UNIFIED IDEOGRAPH
+ 0xC55B: 0x9A3E, //CJK UNIFIED IDEOGRAPH
+ 0xC55C: 0x9ACF, //CJK UNIFIED IDEOGRAPH
+ 0xC55D: 0x9B54, //CJK UNIFIED IDEOGRAPH
+ 0xC55E: 0x9B51, //CJK UNIFIED IDEOGRAPH
+ 0xC55F: 0x9C2D, //CJK UNIFIED IDEOGRAPH
+ 0xC560: 0x9C25, //CJK UNIFIED IDEOGRAPH
+ 0xC561: 0x9DAF, //CJK UNIFIED IDEOGRAPH
+ 0xC562: 0x9DB4, //CJK UNIFIED IDEOGRAPH
+ 0xC563: 0x9DC2, //CJK UNIFIED IDEOGRAPH
+ 0xC564: 0x9DB8, //CJK UNIFIED IDEOGRAPH
+ 0xC565: 0x9E9D, //CJK UNIFIED IDEOGRAPH
+ 0xC566: 0x9EEF, //CJK UNIFIED IDEOGRAPH
+ 0xC567: 0x9F19, //CJK UNIFIED IDEOGRAPH
+ 0xC568: 0x9F5C, //CJK UNIFIED IDEOGRAPH
+ 0xC569: 0x9F66, //CJK UNIFIED IDEOGRAPH
+ 0xC56A: 0x9F67, //CJK UNIFIED IDEOGRAPH
+ 0xC56B: 0x513C, //CJK UNIFIED IDEOGRAPH
+ 0xC56C: 0x513B, //CJK UNIFIED IDEOGRAPH
+ 0xC56D: 0x56C8, //CJK UNIFIED IDEOGRAPH
+ 0xC56E: 0x56CA, //CJK UNIFIED IDEOGRAPH
+ 0xC56F: 0x56C9, //CJK UNIFIED IDEOGRAPH
+ 0xC570: 0x5B7F, //CJK UNIFIED IDEOGRAPH
+ 0xC571: 0x5DD4, //CJK UNIFIED IDEOGRAPH
+ 0xC572: 0x5DD2, //CJK UNIFIED IDEOGRAPH
+ 0xC573: 0x5F4E, //CJK UNIFIED IDEOGRAPH
+ 0xC574: 0x61FF, //CJK UNIFIED IDEOGRAPH
+ 0xC575: 0x6524, //CJK UNIFIED IDEOGRAPH
+ 0xC576: 0x6B0A, //CJK UNIFIED IDEOGRAPH
+ 0xC577: 0x6B61, //CJK UNIFIED IDEOGRAPH
+ 0xC578: 0x7051, //CJK UNIFIED IDEOGRAPH
+ 0xC579: 0x7058, //CJK UNIFIED IDEOGRAPH
+ 0xC57A: 0x7380, //CJK UNIFIED IDEOGRAPH
+ 0xC57B: 0x74E4, //CJK UNIFIED IDEOGRAPH
+ 0xC57C: 0x758A, //CJK UNIFIED IDEOGRAPH
+ 0xC57D: 0x766E, //CJK UNIFIED IDEOGRAPH
+ 0xC57E: 0x766C, //CJK UNIFIED IDEOGRAPH
+ 0xC5A1: 0x79B3, //CJK UNIFIED IDEOGRAPH
+ 0xC5A2: 0x7C60, //CJK UNIFIED IDEOGRAPH
+ 0xC5A3: 0x7C5F, //CJK UNIFIED IDEOGRAPH
+ 0xC5A4: 0x807E, //CJK UNIFIED IDEOGRAPH
+ 0xC5A5: 0x807D, //CJK UNIFIED IDEOGRAPH
+ 0xC5A6: 0x81DF, //CJK UNIFIED IDEOGRAPH
+ 0xC5A7: 0x8972, //CJK UNIFIED IDEOGRAPH
+ 0xC5A8: 0x896F, //CJK UNIFIED IDEOGRAPH
+ 0xC5A9: 0x89FC, //CJK UNIFIED IDEOGRAPH
+ 0xC5AA: 0x8B80, //CJK UNIFIED IDEOGRAPH
+ 0xC5AB: 0x8D16, //CJK UNIFIED IDEOGRAPH
+ 0xC5AC: 0x8D17, //CJK UNIFIED IDEOGRAPH
+ 0xC5AD: 0x8E91, //CJK UNIFIED IDEOGRAPH
+ 0xC5AE: 0x8E93, //CJK UNIFIED IDEOGRAPH
+ 0xC5AF: 0x8F61, //CJK UNIFIED IDEOGRAPH
+ 0xC5B0: 0x9148, //CJK UNIFIED IDEOGRAPH
+ 0xC5B1: 0x9444, //CJK UNIFIED IDEOGRAPH
+ 0xC5B2: 0x9451, //CJK UNIFIED IDEOGRAPH
+ 0xC5B3: 0x9452, //CJK UNIFIED IDEOGRAPH
+ 0xC5B4: 0x973D, //CJK UNIFIED IDEOGRAPH
+ 0xC5B5: 0x973E, //CJK UNIFIED IDEOGRAPH
+ 0xC5B6: 0x97C3, //CJK UNIFIED IDEOGRAPH
+ 0xC5B7: 0x97C1, //CJK UNIFIED IDEOGRAPH
+ 0xC5B8: 0x986B, //CJK UNIFIED IDEOGRAPH
+ 0xC5B9: 0x9955, //CJK UNIFIED IDEOGRAPH
+ 0xC5BA: 0x9A55, //CJK UNIFIED IDEOGRAPH
+ 0xC5BB: 0x9A4D, //CJK UNIFIED IDEOGRAPH
+ 0xC5BC: 0x9AD2, //CJK UNIFIED IDEOGRAPH
+ 0xC5BD: 0x9B1A, //CJK UNIFIED IDEOGRAPH
+ 0xC5BE: 0x9C49, //CJK UNIFIED IDEOGRAPH
+ 0xC5BF: 0x9C31, //CJK UNIFIED IDEOGRAPH
+ 0xC5C0: 0x9C3E, //CJK UNIFIED IDEOGRAPH
+ 0xC5C1: 0x9C3B, //CJK UNIFIED IDEOGRAPH
+ 0xC5C2: 0x9DD3, //CJK UNIFIED IDEOGRAPH
+ 0xC5C3: 0x9DD7, //CJK UNIFIED IDEOGRAPH
+ 0xC5C4: 0x9F34, //CJK UNIFIED IDEOGRAPH
+ 0xC5C5: 0x9F6C, //CJK UNIFIED IDEOGRAPH
+ 0xC5C6: 0x9F6A, //CJK UNIFIED IDEOGRAPH
+ 0xC5C7: 0x9F94, //CJK UNIFIED IDEOGRAPH
+ 0xC5C8: 0x56CC, //CJK UNIFIED IDEOGRAPH
+ 0xC5C9: 0x5DD6, //CJK UNIFIED IDEOGRAPH
+ 0xC5CA: 0x6200, //CJK UNIFIED IDEOGRAPH
+ 0xC5CB: 0x6523, //CJK UNIFIED IDEOGRAPH
+ 0xC5CC: 0x652B, //CJK UNIFIED IDEOGRAPH
+ 0xC5CD: 0x652A, //CJK UNIFIED IDEOGRAPH
+ 0xC5CE: 0x66EC, //CJK UNIFIED IDEOGRAPH
+ 0xC5CF: 0x6B10, //CJK UNIFIED IDEOGRAPH
+ 0xC5D0: 0x74DA, //CJK UNIFIED IDEOGRAPH
+ 0xC5D1: 0x7ACA, //CJK UNIFIED IDEOGRAPH
+ 0xC5D2: 0x7C64, //CJK UNIFIED IDEOGRAPH
+ 0xC5D3: 0x7C63, //CJK UNIFIED IDEOGRAPH
+ 0xC5D4: 0x7C65, //CJK UNIFIED IDEOGRAPH
+ 0xC5D5: 0x7E93, //CJK UNIFIED IDEOGRAPH
+ 0xC5D6: 0x7E96, //CJK UNIFIED IDEOGRAPH
+ 0xC5D7: 0x7E94, //CJK UNIFIED IDEOGRAPH
+ 0xC5D8: 0x81E2, //CJK UNIFIED IDEOGRAPH
+ 0xC5D9: 0x8638, //CJK UNIFIED IDEOGRAPH
+ 0xC5DA: 0x863F, //CJK UNIFIED IDEOGRAPH
+ 0xC5DB: 0x8831, //CJK UNIFIED IDEOGRAPH
+ 0xC5DC: 0x8B8A, //CJK UNIFIED IDEOGRAPH
+ 0xC5DD: 0x9090, //CJK UNIFIED IDEOGRAPH
+ 0xC5DE: 0x908F, //CJK UNIFIED IDEOGRAPH
+ 0xC5DF: 0x9463, //CJK UNIFIED IDEOGRAPH
+ 0xC5E0: 0x9460, //CJK UNIFIED IDEOGRAPH
+ 0xC5E1: 0x9464, //CJK UNIFIED IDEOGRAPH
+ 0xC5E2: 0x9768, //CJK UNIFIED IDEOGRAPH
+ 0xC5E3: 0x986F, //CJK UNIFIED IDEOGRAPH
+ 0xC5E4: 0x995C, //CJK UNIFIED IDEOGRAPH
+ 0xC5E5: 0x9A5A, //CJK UNIFIED IDEOGRAPH
+ 0xC5E6: 0x9A5B, //CJK UNIFIED IDEOGRAPH
+ 0xC5E7: 0x9A57, //CJK UNIFIED IDEOGRAPH
+ 0xC5E8: 0x9AD3, //CJK UNIFIED IDEOGRAPH
+ 0xC5E9: 0x9AD4, //CJK UNIFIED IDEOGRAPH
+ 0xC5EA: 0x9AD1, //CJK UNIFIED IDEOGRAPH
+ 0xC5EB: 0x9C54, //CJK UNIFIED IDEOGRAPH
+ 0xC5EC: 0x9C57, //CJK UNIFIED IDEOGRAPH
+ 0xC5ED: 0x9C56, //CJK UNIFIED IDEOGRAPH
+ 0xC5EE: 0x9DE5, //CJK UNIFIED IDEOGRAPH
+ 0xC5EF: 0x9E9F, //CJK UNIFIED IDEOGRAPH
+ 0xC5F0: 0x9EF4, //CJK UNIFIED IDEOGRAPH
+ 0xC5F1: 0x56D1, //CJK UNIFIED IDEOGRAPH
+ 0xC5F2: 0x58E9, //CJK UNIFIED IDEOGRAPH
+ 0xC5F3: 0x652C, //CJK UNIFIED IDEOGRAPH
+ 0xC5F4: 0x705E, //CJK UNIFIED IDEOGRAPH
+ 0xC5F5: 0x7671, //CJK UNIFIED IDEOGRAPH
+ 0xC5F6: 0x7672, //CJK UNIFIED IDEOGRAPH
+ 0xC5F7: 0x77D7, //CJK UNIFIED IDEOGRAPH
+ 0xC5F8: 0x7F50, //CJK UNIFIED IDEOGRAPH
+ 0xC5F9: 0x7F88, //CJK UNIFIED IDEOGRAPH
+ 0xC5FA: 0x8836, //CJK UNIFIED IDEOGRAPH
+ 0xC5FB: 0x8839, //CJK UNIFIED IDEOGRAPH
+ 0xC5FC: 0x8862, //CJK UNIFIED IDEOGRAPH
+ 0xC5FD: 0x8B93, //CJK UNIFIED IDEOGRAPH
+ 0xC5FE: 0x8B92, //CJK UNIFIED IDEOGRAPH
+ 0xC640: 0x8B96, //CJK UNIFIED IDEOGRAPH
+ 0xC641: 0x8277, //CJK UNIFIED IDEOGRAPH
+ 0xC642: 0x8D1B, //CJK UNIFIED IDEOGRAPH
+ 0xC643: 0x91C0, //CJK UNIFIED IDEOGRAPH
+ 0xC644: 0x946A, //CJK UNIFIED IDEOGRAPH
+ 0xC645: 0x9742, //CJK UNIFIED IDEOGRAPH
+ 0xC646: 0x9748, //CJK UNIFIED IDEOGRAPH
+ 0xC647: 0x9744, //CJK UNIFIED IDEOGRAPH
+ 0xC648: 0x97C6, //CJK UNIFIED IDEOGRAPH
+ 0xC649: 0x9870, //CJK UNIFIED IDEOGRAPH
+ 0xC64A: 0x9A5F, //CJK UNIFIED IDEOGRAPH
+ 0xC64B: 0x9B22, //CJK UNIFIED IDEOGRAPH
+ 0xC64C: 0x9B58, //CJK UNIFIED IDEOGRAPH
+ 0xC64D: 0x9C5F, //CJK UNIFIED IDEOGRAPH
+ 0xC64E: 0x9DF9, //CJK UNIFIED IDEOGRAPH
+ 0xC64F: 0x9DFA, //CJK UNIFIED IDEOGRAPH
+ 0xC650: 0x9E7C, //CJK UNIFIED IDEOGRAPH
+ 0xC651: 0x9E7D, //CJK UNIFIED IDEOGRAPH
+ 0xC652: 0x9F07, //CJK UNIFIED IDEOGRAPH
+ 0xC653: 0x9F77, //CJK UNIFIED IDEOGRAPH
+ 0xC654: 0x9F72, //CJK UNIFIED IDEOGRAPH
+ 0xC655: 0x5EF3, //CJK UNIFIED IDEOGRAPH
+ 0xC656: 0x6B16, //CJK UNIFIED IDEOGRAPH
+ 0xC657: 0x7063, //CJK UNIFIED IDEOGRAPH
+ 0xC658: 0x7C6C, //CJK UNIFIED IDEOGRAPH
+ 0xC659: 0x7C6E, //CJK UNIFIED IDEOGRAPH
+ 0xC65A: 0x883B, //CJK UNIFIED IDEOGRAPH
+ 0xC65B: 0x89C0, //CJK UNIFIED IDEOGRAPH
+ 0xC65C: 0x8EA1, //CJK UNIFIED IDEOGRAPH
+ 0xC65D: 0x91C1, //CJK UNIFIED IDEOGRAPH
+ 0xC65E: 0x9472, //CJK UNIFIED IDEOGRAPH
+ 0xC65F: 0x9470, //CJK UNIFIED IDEOGRAPH
+ 0xC660: 0x9871, //CJK UNIFIED IDEOGRAPH
+ 0xC661: 0x995E, //CJK UNIFIED IDEOGRAPH
+ 0xC662: 0x9AD6, //CJK UNIFIED IDEOGRAPH
+ 0xC663: 0x9B23, //CJK UNIFIED IDEOGRAPH
+ 0xC664: 0x9ECC, //CJK UNIFIED IDEOGRAPH
+ 0xC665: 0x7064, //CJK UNIFIED IDEOGRAPH
+ 0xC666: 0x77DA, //CJK UNIFIED IDEOGRAPH
+ 0xC667: 0x8B9A, //CJK UNIFIED IDEOGRAPH
+ 0xC668: 0x9477, //CJK UNIFIED IDEOGRAPH
+ 0xC669: 0x97C9, //CJK UNIFIED IDEOGRAPH
+ 0xC66A: 0x9A62, //CJK UNIFIED IDEOGRAPH
+ 0xC66B: 0x9A65, //CJK UNIFIED IDEOGRAPH
+ 0xC66C: 0x7E9C, //CJK UNIFIED IDEOGRAPH
+ 0xC66D: 0x8B9C, //CJK UNIFIED IDEOGRAPH
+ 0xC66E: 0x8EAA, //CJK UNIFIED IDEOGRAPH
+ 0xC66F: 0x91C5, //CJK UNIFIED IDEOGRAPH
+ 0xC670: 0x947D, //CJK UNIFIED IDEOGRAPH
+ 0xC671: 0x947E, //CJK UNIFIED IDEOGRAPH
+ 0xC672: 0x947C, //CJK UNIFIED IDEOGRAPH
+ 0xC673: 0x9C77, //CJK UNIFIED IDEOGRAPH
+ 0xC674: 0x9C78, //CJK UNIFIED IDEOGRAPH
+ 0xC675: 0x9EF7, //CJK UNIFIED IDEOGRAPH
+ 0xC676: 0x8C54, //CJK UNIFIED IDEOGRAPH
+ 0xC677: 0x947F, //CJK UNIFIED IDEOGRAPH
+ 0xC678: 0x9E1A, //CJK UNIFIED IDEOGRAPH
+ 0xC679: 0x7228, //CJK UNIFIED IDEOGRAPH
+ 0xC67A: 0x9A6A, //CJK UNIFIED IDEOGRAPH
+ 0xC67B: 0x9B31, //CJK UNIFIED IDEOGRAPH
+ 0xC67C: 0x9E1B, //CJK UNIFIED IDEOGRAPH
+ 0xC67D: 0x9E1E, //CJK UNIFIED IDEOGRAPH
+ 0xC67E: 0x7C72, //CJK UNIFIED IDEOGRAPH
+ 0xC940: 0x4E42, //CJK UNIFIED IDEOGRAPH
+ 0xC941: 0x4E5C, //CJK UNIFIED IDEOGRAPH
+ 0xC942: 0x51F5, //CJK UNIFIED IDEOGRAPH
+ 0xC943: 0x531A, //CJK UNIFIED IDEOGRAPH
+ 0xC944: 0x5382, //CJK UNIFIED IDEOGRAPH
+ 0xC945: 0x4E07, //CJK UNIFIED IDEOGRAPH
+ 0xC946: 0x4E0C, //CJK UNIFIED IDEOGRAPH
+ 0xC947: 0x4E47, //CJK UNIFIED IDEOGRAPH
+ 0xC948: 0x4E8D, //CJK UNIFIED IDEOGRAPH
+ 0xC949: 0x56D7, //CJK UNIFIED IDEOGRAPH
+ 0xC94A: 0xFA0C, //CJK COMPATIBILITY IDEOGRAPH
+ 0xC94B: 0x5C6E, //CJK UNIFIED IDEOGRAPH
+ 0xC94C: 0x5F73, //CJK UNIFIED IDEOGRAPH
+ 0xC94D: 0x4E0F, //CJK UNIFIED IDEOGRAPH
+ 0xC94E: 0x5187, //CJK UNIFIED IDEOGRAPH
+ 0xC94F: 0x4E0E, //CJK UNIFIED IDEOGRAPH
+ 0xC950: 0x4E2E, //CJK UNIFIED IDEOGRAPH
+ 0xC951: 0x4E93, //CJK UNIFIED IDEOGRAPH
+ 0xC952: 0x4EC2, //CJK UNIFIED IDEOGRAPH
+ 0xC953: 0x4EC9, //CJK UNIFIED IDEOGRAPH
+ 0xC954: 0x4EC8, //CJK UNIFIED IDEOGRAPH
+ 0xC955: 0x5198, //CJK UNIFIED IDEOGRAPH
+ 0xC956: 0x52FC, //CJK UNIFIED IDEOGRAPH
+ 0xC957: 0x536C, //CJK UNIFIED IDEOGRAPH
+ 0xC958: 0x53B9, //CJK UNIFIED IDEOGRAPH
+ 0xC959: 0x5720, //CJK UNIFIED IDEOGRAPH
+ 0xC95A: 0x5903, //CJK UNIFIED IDEOGRAPH
+ 0xC95B: 0x592C, //CJK UNIFIED IDEOGRAPH
+ 0xC95C: 0x5C10, //CJK UNIFIED IDEOGRAPH
+ 0xC95D: 0x5DFF, //CJK UNIFIED IDEOGRAPH
+ 0xC95E: 0x65E1, //CJK UNIFIED IDEOGRAPH
+ 0xC95F: 0x6BB3, //CJK UNIFIED IDEOGRAPH
+ 0xC960: 0x6BCC, //CJK UNIFIED IDEOGRAPH
+ 0xC961: 0x6C14, //CJK UNIFIED IDEOGRAPH
+ 0xC962: 0x723F, //CJK UNIFIED IDEOGRAPH
+ 0xC963: 0x4E31, //CJK UNIFIED IDEOGRAPH
+ 0xC964: 0x4E3C, //CJK UNIFIED IDEOGRAPH
+ 0xC965: 0x4EE8, //CJK UNIFIED IDEOGRAPH
+ 0xC966: 0x4EDC, //CJK UNIFIED IDEOGRAPH
+ 0xC967: 0x4EE9, //CJK UNIFIED IDEOGRAPH
+ 0xC968: 0x4EE1, //CJK UNIFIED IDEOGRAPH
+ 0xC969: 0x4EDD, //CJK UNIFIED IDEOGRAPH
+ 0xC96A: 0x4EDA, //CJK UNIFIED IDEOGRAPH
+ 0xC96B: 0x520C, //CJK UNIFIED IDEOGRAPH
+ 0xC96C: 0x531C, //CJK UNIFIED IDEOGRAPH
+ 0xC96D: 0x534C, //CJK UNIFIED IDEOGRAPH
+ 0xC96E: 0x5722, //CJK UNIFIED IDEOGRAPH
+ 0xC96F: 0x5723, //CJK UNIFIED IDEOGRAPH
+ 0xC970: 0x5917, //CJK UNIFIED IDEOGRAPH
+ 0xC971: 0x592F, //CJK UNIFIED IDEOGRAPH
+ 0xC972: 0x5B81, //CJK UNIFIED IDEOGRAPH
+ 0xC973: 0x5B84, //CJK UNIFIED IDEOGRAPH
+ 0xC974: 0x5C12, //CJK UNIFIED IDEOGRAPH
+ 0xC975: 0x5C3B, //CJK UNIFIED IDEOGRAPH
+ 0xC976: 0x5C74, //CJK UNIFIED IDEOGRAPH
+ 0xC977: 0x5C73, //CJK UNIFIED IDEOGRAPH
+ 0xC978: 0x5E04, //CJK UNIFIED IDEOGRAPH
+ 0xC979: 0x5E80, //CJK UNIFIED IDEOGRAPH
+ 0xC97A: 0x5E82, //CJK UNIFIED IDEOGRAPH
+ 0xC97B: 0x5FC9, //CJK UNIFIED IDEOGRAPH
+ 0xC97C: 0x6209, //CJK UNIFIED IDEOGRAPH
+ 0xC97D: 0x6250, //CJK UNIFIED IDEOGRAPH
+ 0xC97E: 0x6C15, //CJK UNIFIED IDEOGRAPH
+ 0xC9A1: 0x6C36, //CJK UNIFIED IDEOGRAPH
+ 0xC9A2: 0x6C43, //CJK UNIFIED IDEOGRAPH
+ 0xC9A3: 0x6C3F, //CJK UNIFIED IDEOGRAPH
+ 0xC9A4: 0x6C3B, //CJK UNIFIED IDEOGRAPH
+ 0xC9A5: 0x72AE, //CJK UNIFIED IDEOGRAPH
+ 0xC9A6: 0x72B0, //CJK UNIFIED IDEOGRAPH
+ 0xC9A7: 0x738A, //CJK UNIFIED IDEOGRAPH
+ 0xC9A8: 0x79B8, //CJK UNIFIED IDEOGRAPH
+ 0xC9A9: 0x808A, //CJK UNIFIED IDEOGRAPH
+ 0xC9AA: 0x961E, //CJK UNIFIED IDEOGRAPH
+ 0xC9AB: 0x4F0E, //CJK UNIFIED IDEOGRAPH
+ 0xC9AC: 0x4F18, //CJK UNIFIED IDEOGRAPH
+ 0xC9AD: 0x4F2C, //CJK UNIFIED IDEOGRAPH
+ 0xC9AE: 0x4EF5, //CJK UNIFIED IDEOGRAPH
+ 0xC9AF: 0x4F14, //CJK UNIFIED IDEOGRAPH
+ 0xC9B0: 0x4EF1, //CJK UNIFIED IDEOGRAPH
+ 0xC9B1: 0x4F00, //CJK UNIFIED IDEOGRAPH
+ 0xC9B2: 0x4EF7, //CJK UNIFIED IDEOGRAPH
+ 0xC9B3: 0x4F08, //CJK UNIFIED IDEOGRAPH
+ 0xC9B4: 0x4F1D, //CJK UNIFIED IDEOGRAPH
+ 0xC9B5: 0x4F02, //CJK UNIFIED IDEOGRAPH
+ 0xC9B6: 0x4F05, //CJK UNIFIED IDEOGRAPH
+ 0xC9B7: 0x4F22, //CJK UNIFIED IDEOGRAPH
+ 0xC9B8: 0x4F13, //CJK UNIFIED IDEOGRAPH
+ 0xC9B9: 0x4F04, //CJK UNIFIED IDEOGRAPH
+ 0xC9BA: 0x4EF4, //CJK UNIFIED IDEOGRAPH
+ 0xC9BB: 0x4F12, //CJK UNIFIED IDEOGRAPH
+ 0xC9BC: 0x51B1, //CJK UNIFIED IDEOGRAPH
+ 0xC9BD: 0x5213, //CJK UNIFIED IDEOGRAPH
+ 0xC9BE: 0x5209, //CJK UNIFIED IDEOGRAPH
+ 0xC9BF: 0x5210, //CJK UNIFIED IDEOGRAPH
+ 0xC9C0: 0x52A6, //CJK UNIFIED IDEOGRAPH
+ 0xC9C1: 0x5322, //CJK UNIFIED IDEOGRAPH
+ 0xC9C2: 0x531F, //CJK UNIFIED IDEOGRAPH
+ 0xC9C3: 0x534D, //CJK UNIFIED IDEOGRAPH
+ 0xC9C4: 0x538A, //CJK UNIFIED IDEOGRAPH
+ 0xC9C5: 0x5407, //CJK UNIFIED IDEOGRAPH
+ 0xC9C6: 0x56E1, //CJK UNIFIED IDEOGRAPH
+ 0xC9C7: 0x56DF, //CJK UNIFIED IDEOGRAPH
+ 0xC9C8: 0x572E, //CJK UNIFIED IDEOGRAPH
+ 0xC9C9: 0x572A, //CJK UNIFIED IDEOGRAPH
+ 0xC9CA: 0x5734, //CJK UNIFIED IDEOGRAPH
+ 0xC9CB: 0x593C, //CJK UNIFIED IDEOGRAPH
+ 0xC9CC: 0x5980, //CJK UNIFIED IDEOGRAPH
+ 0xC9CD: 0x597C, //CJK UNIFIED IDEOGRAPH
+ 0xC9CE: 0x5985, //CJK UNIFIED IDEOGRAPH
+ 0xC9CF: 0x597B, //CJK UNIFIED IDEOGRAPH
+ 0xC9D0: 0x597E, //CJK UNIFIED IDEOGRAPH
+ 0xC9D1: 0x5977, //CJK UNIFIED IDEOGRAPH
+ 0xC9D2: 0x597F, //CJK UNIFIED IDEOGRAPH
+ 0xC9D3: 0x5B56, //CJK UNIFIED IDEOGRAPH
+ 0xC9D4: 0x5C15, //CJK UNIFIED IDEOGRAPH
+ 0xC9D5: 0x5C25, //CJK UNIFIED IDEOGRAPH
+ 0xC9D6: 0x5C7C, //CJK UNIFIED IDEOGRAPH
+ 0xC9D7: 0x5C7A, //CJK UNIFIED IDEOGRAPH
+ 0xC9D8: 0x5C7B, //CJK UNIFIED IDEOGRAPH
+ 0xC9D9: 0x5C7E, //CJK UNIFIED IDEOGRAPH
+ 0xC9DA: 0x5DDF, //CJK UNIFIED IDEOGRAPH
+ 0xC9DB: 0x5E75, //CJK UNIFIED IDEOGRAPH
+ 0xC9DC: 0x5E84, //CJK UNIFIED IDEOGRAPH
+ 0xC9DD: 0x5F02, //CJK UNIFIED IDEOGRAPH
+ 0xC9DE: 0x5F1A, //CJK UNIFIED IDEOGRAPH
+ 0xC9DF: 0x5F74, //CJK UNIFIED IDEOGRAPH
+ 0xC9E0: 0x5FD5, //CJK UNIFIED IDEOGRAPH
+ 0xC9E1: 0x5FD4, //CJK UNIFIED IDEOGRAPH
+ 0xC9E2: 0x5FCF, //CJK UNIFIED IDEOGRAPH
+ 0xC9E3: 0x625C, //CJK UNIFIED IDEOGRAPH
+ 0xC9E4: 0x625E, //CJK UNIFIED IDEOGRAPH
+ 0xC9E5: 0x6264, //CJK UNIFIED IDEOGRAPH
+ 0xC9E6: 0x6261, //CJK UNIFIED IDEOGRAPH
+ 0xC9E7: 0x6266, //CJK UNIFIED IDEOGRAPH
+ 0xC9E8: 0x6262, //CJK UNIFIED IDEOGRAPH
+ 0xC9E9: 0x6259, //CJK UNIFIED IDEOGRAPH
+ 0xC9EA: 0x6260, //CJK UNIFIED IDEOGRAPH
+ 0xC9EB: 0x625A, //CJK UNIFIED IDEOGRAPH
+ 0xC9EC: 0x6265, //CJK UNIFIED IDEOGRAPH
+ 0xC9ED: 0x65EF, //CJK UNIFIED IDEOGRAPH
+ 0xC9EE: 0x65EE, //CJK UNIFIED IDEOGRAPH
+ 0xC9EF: 0x673E, //CJK UNIFIED IDEOGRAPH
+ 0xC9F0: 0x6739, //CJK UNIFIED IDEOGRAPH
+ 0xC9F1: 0x6738, //CJK UNIFIED IDEOGRAPH
+ 0xC9F2: 0x673B, //CJK UNIFIED IDEOGRAPH
+ 0xC9F3: 0x673A, //CJK UNIFIED IDEOGRAPH
+ 0xC9F4: 0x673F, //CJK UNIFIED IDEOGRAPH
+ 0xC9F5: 0x673C, //CJK UNIFIED IDEOGRAPH
+ 0xC9F6: 0x6733, //CJK UNIFIED IDEOGRAPH
+ 0xC9F7: 0x6C18, //CJK UNIFIED IDEOGRAPH
+ 0xC9F8: 0x6C46, //CJK UNIFIED IDEOGRAPH
+ 0xC9F9: 0x6C52, //CJK UNIFIED IDEOGRAPH
+ 0xC9FA: 0x6C5C, //CJK UNIFIED IDEOGRAPH
+ 0xC9FB: 0x6C4F, //CJK UNIFIED IDEOGRAPH
+ 0xC9FC: 0x6C4A, //CJK UNIFIED IDEOGRAPH
+ 0xC9FD: 0x6C54, //CJK UNIFIED IDEOGRAPH
+ 0xC9FE: 0x6C4B, //CJK UNIFIED IDEOGRAPH
+ 0xCA40: 0x6C4C, //CJK UNIFIED IDEOGRAPH
+ 0xCA41: 0x7071, //CJK UNIFIED IDEOGRAPH
+ 0xCA42: 0x725E, //CJK UNIFIED IDEOGRAPH
+ 0xCA43: 0x72B4, //CJK UNIFIED IDEOGRAPH
+ 0xCA44: 0x72B5, //CJK UNIFIED IDEOGRAPH
+ 0xCA45: 0x738E, //CJK UNIFIED IDEOGRAPH
+ 0xCA46: 0x752A, //CJK UNIFIED IDEOGRAPH
+ 0xCA47: 0x767F, //CJK UNIFIED IDEOGRAPH
+ 0xCA48: 0x7A75, //CJK UNIFIED IDEOGRAPH
+ 0xCA49: 0x7F51, //CJK UNIFIED IDEOGRAPH
+ 0xCA4A: 0x8278, //CJK UNIFIED IDEOGRAPH
+ 0xCA4B: 0x827C, //CJK UNIFIED IDEOGRAPH
+ 0xCA4C: 0x8280, //CJK UNIFIED IDEOGRAPH
+ 0xCA4D: 0x827D, //CJK UNIFIED IDEOGRAPH
+ 0xCA4E: 0x827F, //CJK UNIFIED IDEOGRAPH
+ 0xCA4F: 0x864D, //CJK UNIFIED IDEOGRAPH
+ 0xCA50: 0x897E, //CJK UNIFIED IDEOGRAPH
+ 0xCA51: 0x9099, //CJK UNIFIED IDEOGRAPH
+ 0xCA52: 0x9097, //CJK UNIFIED IDEOGRAPH
+ 0xCA53: 0x9098, //CJK UNIFIED IDEOGRAPH
+ 0xCA54: 0x909B, //CJK UNIFIED IDEOGRAPH
+ 0xCA55: 0x9094, //CJK UNIFIED IDEOGRAPH
+ 0xCA56: 0x9622, //CJK UNIFIED IDEOGRAPH
+ 0xCA57: 0x9624, //CJK UNIFIED IDEOGRAPH
+ 0xCA58: 0x9620, //CJK UNIFIED IDEOGRAPH
+ 0xCA59: 0x9623, //CJK UNIFIED IDEOGRAPH
+ 0xCA5A: 0x4F56, //CJK UNIFIED IDEOGRAPH
+ 0xCA5B: 0x4F3B, //CJK UNIFIED IDEOGRAPH
+ 0xCA5C: 0x4F62, //CJK UNIFIED IDEOGRAPH
+ 0xCA5D: 0x4F49, //CJK UNIFIED IDEOGRAPH
+ 0xCA5E: 0x4F53, //CJK UNIFIED IDEOGRAPH
+ 0xCA5F: 0x4F64, //CJK UNIFIED IDEOGRAPH
+ 0xCA60: 0x4F3E, //CJK UNIFIED IDEOGRAPH
+ 0xCA61: 0x4F67, //CJK UNIFIED IDEOGRAPH
+ 0xCA62: 0x4F52, //CJK UNIFIED IDEOGRAPH
+ 0xCA63: 0x4F5F, //CJK UNIFIED IDEOGRAPH
+ 0xCA64: 0x4F41, //CJK UNIFIED IDEOGRAPH
+ 0xCA65: 0x4F58, //CJK UNIFIED IDEOGRAPH
+ 0xCA66: 0x4F2D, //CJK UNIFIED IDEOGRAPH
+ 0xCA67: 0x4F33, //CJK UNIFIED IDEOGRAPH
+ 0xCA68: 0x4F3F, //CJK UNIFIED IDEOGRAPH
+ 0xCA69: 0x4F61, //CJK UNIFIED IDEOGRAPH
+ 0xCA6A: 0x518F, //CJK UNIFIED IDEOGRAPH
+ 0xCA6B: 0x51B9, //CJK UNIFIED IDEOGRAPH
+ 0xCA6C: 0x521C, //CJK UNIFIED IDEOGRAPH
+ 0xCA6D: 0x521E, //CJK UNIFIED IDEOGRAPH
+ 0xCA6E: 0x5221, //CJK UNIFIED IDEOGRAPH
+ 0xCA6F: 0x52AD, //CJK UNIFIED IDEOGRAPH
+ 0xCA70: 0x52AE, //CJK UNIFIED IDEOGRAPH
+ 0xCA71: 0x5309, //CJK UNIFIED IDEOGRAPH
+ 0xCA72: 0x5363, //CJK UNIFIED IDEOGRAPH
+ 0xCA73: 0x5372, //CJK UNIFIED IDEOGRAPH
+ 0xCA74: 0x538E, //CJK UNIFIED IDEOGRAPH
+ 0xCA75: 0x538F, //CJK UNIFIED IDEOGRAPH
+ 0xCA76: 0x5430, //CJK UNIFIED IDEOGRAPH
+ 0xCA77: 0x5437, //CJK UNIFIED IDEOGRAPH
+ 0xCA78: 0x542A, //CJK UNIFIED IDEOGRAPH
+ 0xCA79: 0x5454, //CJK UNIFIED IDEOGRAPH
+ 0xCA7A: 0x5445, //CJK UNIFIED IDEOGRAPH
+ 0xCA7B: 0x5419, //CJK UNIFIED IDEOGRAPH
+ 0xCA7C: 0x541C, //CJK UNIFIED IDEOGRAPH
+ 0xCA7D: 0x5425, //CJK UNIFIED IDEOGRAPH
+ 0xCA7E: 0x5418, //CJK UNIFIED IDEOGRAPH
+ 0xCAA1: 0x543D, //CJK UNIFIED IDEOGRAPH
+ 0xCAA2: 0x544F, //CJK UNIFIED IDEOGRAPH
+ 0xCAA3: 0x5441, //CJK UNIFIED IDEOGRAPH
+ 0xCAA4: 0x5428, //CJK UNIFIED IDEOGRAPH
+ 0xCAA5: 0x5424, //CJK UNIFIED IDEOGRAPH
+ 0xCAA6: 0x5447, //CJK UNIFIED IDEOGRAPH
+ 0xCAA7: 0x56EE, //CJK UNIFIED IDEOGRAPH
+ 0xCAA8: 0x56E7, //CJK UNIFIED IDEOGRAPH
+ 0xCAA9: 0x56E5, //CJK UNIFIED IDEOGRAPH
+ 0xCAAA: 0x5741, //CJK UNIFIED IDEOGRAPH
+ 0xCAAB: 0x5745, //CJK UNIFIED IDEOGRAPH
+ 0xCAAC: 0x574C, //CJK UNIFIED IDEOGRAPH
+ 0xCAAD: 0x5749, //CJK UNIFIED IDEOGRAPH
+ 0xCAAE: 0x574B, //CJK UNIFIED IDEOGRAPH
+ 0xCAAF: 0x5752, //CJK UNIFIED IDEOGRAPH
+ 0xCAB0: 0x5906, //CJK UNIFIED IDEOGRAPH
+ 0xCAB1: 0x5940, //CJK UNIFIED IDEOGRAPH
+ 0xCAB2: 0x59A6, //CJK UNIFIED IDEOGRAPH
+ 0xCAB3: 0x5998, //CJK UNIFIED IDEOGRAPH
+ 0xCAB4: 0x59A0, //CJK UNIFIED IDEOGRAPH
+ 0xCAB5: 0x5997, //CJK UNIFIED IDEOGRAPH
+ 0xCAB6: 0x598E, //CJK UNIFIED IDEOGRAPH
+ 0xCAB7: 0x59A2, //CJK UNIFIED IDEOGRAPH
+ 0xCAB8: 0x5990, //CJK UNIFIED IDEOGRAPH
+ 0xCAB9: 0x598F, //CJK UNIFIED IDEOGRAPH
+ 0xCABA: 0x59A7, //CJK UNIFIED IDEOGRAPH
+ 0xCABB: 0x59A1, //CJK UNIFIED IDEOGRAPH
+ 0xCABC: 0x5B8E, //CJK UNIFIED IDEOGRAPH
+ 0xCABD: 0x5B92, //CJK UNIFIED IDEOGRAPH
+ 0xCABE: 0x5C28, //CJK UNIFIED IDEOGRAPH
+ 0xCABF: 0x5C2A, //CJK UNIFIED IDEOGRAPH
+ 0xCAC0: 0x5C8D, //CJK UNIFIED IDEOGRAPH
+ 0xCAC1: 0x5C8F, //CJK UNIFIED IDEOGRAPH
+ 0xCAC2: 0x5C88, //CJK UNIFIED IDEOGRAPH
+ 0xCAC3: 0x5C8B, //CJK UNIFIED IDEOGRAPH
+ 0xCAC4: 0x5C89, //CJK UNIFIED IDEOGRAPH
+ 0xCAC5: 0x5C92, //CJK UNIFIED IDEOGRAPH
+ 0xCAC6: 0x5C8A, //CJK UNIFIED IDEOGRAPH
+ 0xCAC7: 0x5C86, //CJK UNIFIED IDEOGRAPH
+ 0xCAC8: 0x5C93, //CJK UNIFIED IDEOGRAPH
+ 0xCAC9: 0x5C95, //CJK UNIFIED IDEOGRAPH
+ 0xCACA: 0x5DE0, //CJK UNIFIED IDEOGRAPH
+ 0xCACB: 0x5E0A, //CJK UNIFIED IDEOGRAPH
+ 0xCACC: 0x5E0E, //CJK UNIFIED IDEOGRAPH
+ 0xCACD: 0x5E8B, //CJK UNIFIED IDEOGRAPH
+ 0xCACE: 0x5E89, //CJK UNIFIED IDEOGRAPH
+ 0xCACF: 0x5E8C, //CJK UNIFIED IDEOGRAPH
+ 0xCAD0: 0x5E88, //CJK UNIFIED IDEOGRAPH
+ 0xCAD1: 0x5E8D, //CJK UNIFIED IDEOGRAPH
+ 0xCAD2: 0x5F05, //CJK UNIFIED IDEOGRAPH
+ 0xCAD3: 0x5F1D, //CJK UNIFIED IDEOGRAPH
+ 0xCAD4: 0x5F78, //CJK UNIFIED IDEOGRAPH
+ 0xCAD5: 0x5F76, //CJK UNIFIED IDEOGRAPH
+ 0xCAD6: 0x5FD2, //CJK UNIFIED IDEOGRAPH
+ 0xCAD7: 0x5FD1, //CJK UNIFIED IDEOGRAPH
+ 0xCAD8: 0x5FD0, //CJK UNIFIED IDEOGRAPH
+ 0xCAD9: 0x5FED, //CJK UNIFIED IDEOGRAPH
+ 0xCADA: 0x5FE8, //CJK UNIFIED IDEOGRAPH
+ 0xCADB: 0x5FEE, //CJK UNIFIED IDEOGRAPH
+ 0xCADC: 0x5FF3, //CJK UNIFIED IDEOGRAPH
+ 0xCADD: 0x5FE1, //CJK UNIFIED IDEOGRAPH
+ 0xCADE: 0x5FE4, //CJK UNIFIED IDEOGRAPH
+ 0xCADF: 0x5FE3, //CJK UNIFIED IDEOGRAPH
+ 0xCAE0: 0x5FFA, //CJK UNIFIED IDEOGRAPH
+ 0xCAE1: 0x5FEF, //CJK UNIFIED IDEOGRAPH
+ 0xCAE2: 0x5FF7, //CJK UNIFIED IDEOGRAPH
+ 0xCAE3: 0x5FFB, //CJK UNIFIED IDEOGRAPH
+ 0xCAE4: 0x6000, //CJK UNIFIED IDEOGRAPH
+ 0xCAE5: 0x5FF4, //CJK UNIFIED IDEOGRAPH
+ 0xCAE6: 0x623A, //CJK UNIFIED IDEOGRAPH
+ 0xCAE7: 0x6283, //CJK UNIFIED IDEOGRAPH
+ 0xCAE8: 0x628C, //CJK UNIFIED IDEOGRAPH
+ 0xCAE9: 0x628E, //CJK UNIFIED IDEOGRAPH
+ 0xCAEA: 0x628F, //CJK UNIFIED IDEOGRAPH
+ 0xCAEB: 0x6294, //CJK UNIFIED IDEOGRAPH
+ 0xCAEC: 0x6287, //CJK UNIFIED IDEOGRAPH
+ 0xCAED: 0x6271, //CJK UNIFIED IDEOGRAPH
+ 0xCAEE: 0x627B, //CJK UNIFIED IDEOGRAPH
+ 0xCAEF: 0x627A, //CJK UNIFIED IDEOGRAPH
+ 0xCAF0: 0x6270, //CJK UNIFIED IDEOGRAPH
+ 0xCAF1: 0x6281, //CJK UNIFIED IDEOGRAPH
+ 0xCAF2: 0x6288, //CJK UNIFIED IDEOGRAPH
+ 0xCAF3: 0x6277, //CJK UNIFIED IDEOGRAPH
+ 0xCAF4: 0x627D, //CJK UNIFIED IDEOGRAPH
+ 0xCAF5: 0x6272, //CJK UNIFIED IDEOGRAPH
+ 0xCAF6: 0x6274, //CJK UNIFIED IDEOGRAPH
+ 0xCAF7: 0x6537, //CJK UNIFIED IDEOGRAPH
+ 0xCAF8: 0x65F0, //CJK UNIFIED IDEOGRAPH
+ 0xCAF9: 0x65F4, //CJK UNIFIED IDEOGRAPH
+ 0xCAFA: 0x65F3, //CJK UNIFIED IDEOGRAPH
+ 0xCAFB: 0x65F2, //CJK UNIFIED IDEOGRAPH
+ 0xCAFC: 0x65F5, //CJK UNIFIED IDEOGRAPH
+ 0xCAFD: 0x6745, //CJK UNIFIED IDEOGRAPH
+ 0xCAFE: 0x6747, //CJK UNIFIED IDEOGRAPH
+ 0xCB40: 0x6759, //CJK UNIFIED IDEOGRAPH
+ 0xCB41: 0x6755, //CJK UNIFIED IDEOGRAPH
+ 0xCB42: 0x674C, //CJK UNIFIED IDEOGRAPH
+ 0xCB43: 0x6748, //CJK UNIFIED IDEOGRAPH
+ 0xCB44: 0x675D, //CJK UNIFIED IDEOGRAPH
+ 0xCB45: 0x674D, //CJK UNIFIED IDEOGRAPH
+ 0xCB46: 0x675A, //CJK UNIFIED IDEOGRAPH
+ 0xCB47: 0x674B, //CJK UNIFIED IDEOGRAPH
+ 0xCB48: 0x6BD0, //CJK UNIFIED IDEOGRAPH
+ 0xCB49: 0x6C19, //CJK UNIFIED IDEOGRAPH
+ 0xCB4A: 0x6C1A, //CJK UNIFIED IDEOGRAPH
+ 0xCB4B: 0x6C78, //CJK UNIFIED IDEOGRAPH
+ 0xCB4C: 0x6C67, //CJK UNIFIED IDEOGRAPH
+ 0xCB4D: 0x6C6B, //CJK UNIFIED IDEOGRAPH
+ 0xCB4E: 0x6C84, //CJK UNIFIED IDEOGRAPH
+ 0xCB4F: 0x6C8B, //CJK UNIFIED IDEOGRAPH
+ 0xCB50: 0x6C8F, //CJK UNIFIED IDEOGRAPH
+ 0xCB51: 0x6C71, //CJK UNIFIED IDEOGRAPH
+ 0xCB52: 0x6C6F, //CJK UNIFIED IDEOGRAPH
+ 0xCB53: 0x6C69, //CJK UNIFIED IDEOGRAPH
+ 0xCB54: 0x6C9A, //CJK UNIFIED IDEOGRAPH
+ 0xCB55: 0x6C6D, //CJK UNIFIED IDEOGRAPH
+ 0xCB56: 0x6C87, //CJK UNIFIED IDEOGRAPH
+ 0xCB57: 0x6C95, //CJK UNIFIED IDEOGRAPH
+ 0xCB58: 0x6C9C, //CJK UNIFIED IDEOGRAPH
+ 0xCB59: 0x6C66, //CJK UNIFIED IDEOGRAPH
+ 0xCB5A: 0x6C73, //CJK UNIFIED IDEOGRAPH
+ 0xCB5B: 0x6C65, //CJK UNIFIED IDEOGRAPH
+ 0xCB5C: 0x6C7B, //CJK UNIFIED IDEOGRAPH
+ 0xCB5D: 0x6C8E, //CJK UNIFIED IDEOGRAPH
+ 0xCB5E: 0x7074, //CJK UNIFIED IDEOGRAPH
+ 0xCB5F: 0x707A, //CJK UNIFIED IDEOGRAPH
+ 0xCB60: 0x7263, //CJK UNIFIED IDEOGRAPH
+ 0xCB61: 0x72BF, //CJK UNIFIED IDEOGRAPH
+ 0xCB62: 0x72BD, //CJK UNIFIED IDEOGRAPH
+ 0xCB63: 0x72C3, //CJK UNIFIED IDEOGRAPH
+ 0xCB64: 0x72C6, //CJK UNIFIED IDEOGRAPH
+ 0xCB65: 0x72C1, //CJK UNIFIED IDEOGRAPH
+ 0xCB66: 0x72BA, //CJK UNIFIED IDEOGRAPH
+ 0xCB67: 0x72C5, //CJK UNIFIED IDEOGRAPH
+ 0xCB68: 0x7395, //CJK UNIFIED IDEOGRAPH
+ 0xCB69: 0x7397, //CJK UNIFIED IDEOGRAPH
+ 0xCB6A: 0x7393, //CJK UNIFIED IDEOGRAPH
+ 0xCB6B: 0x7394, //CJK UNIFIED IDEOGRAPH
+ 0xCB6C: 0x7392, //CJK UNIFIED IDEOGRAPH
+ 0xCB6D: 0x753A, //CJK UNIFIED IDEOGRAPH
+ 0xCB6E: 0x7539, //CJK UNIFIED IDEOGRAPH
+ 0xCB6F: 0x7594, //CJK UNIFIED IDEOGRAPH
+ 0xCB70: 0x7595, //CJK UNIFIED IDEOGRAPH
+ 0xCB71: 0x7681, //CJK UNIFIED IDEOGRAPH
+ 0xCB72: 0x793D, //CJK UNIFIED IDEOGRAPH
+ 0xCB73: 0x8034, //CJK UNIFIED IDEOGRAPH
+ 0xCB74: 0x8095, //CJK UNIFIED IDEOGRAPH
+ 0xCB75: 0x8099, //CJK UNIFIED IDEOGRAPH
+ 0xCB76: 0x8090, //CJK UNIFIED IDEOGRAPH
+ 0xCB77: 0x8092, //CJK UNIFIED IDEOGRAPH
+ 0xCB78: 0x809C, //CJK UNIFIED IDEOGRAPH
+ 0xCB79: 0x8290, //CJK UNIFIED IDEOGRAPH
+ 0xCB7A: 0x828F, //CJK UNIFIED IDEOGRAPH
+ 0xCB7B: 0x8285, //CJK UNIFIED IDEOGRAPH
+ 0xCB7C: 0x828E, //CJK UNIFIED IDEOGRAPH
+ 0xCB7D: 0x8291, //CJK UNIFIED IDEOGRAPH
+ 0xCB7E: 0x8293, //CJK UNIFIED IDEOGRAPH
+ 0xCBA1: 0x828A, //CJK UNIFIED IDEOGRAPH
+ 0xCBA2: 0x8283, //CJK UNIFIED IDEOGRAPH
+ 0xCBA3: 0x8284, //CJK UNIFIED IDEOGRAPH
+ 0xCBA4: 0x8C78, //CJK UNIFIED IDEOGRAPH
+ 0xCBA5: 0x8FC9, //CJK UNIFIED IDEOGRAPH
+ 0xCBA6: 0x8FBF, //CJK UNIFIED IDEOGRAPH
+ 0xCBA7: 0x909F, //CJK UNIFIED IDEOGRAPH
+ 0xCBA8: 0x90A1, //CJK UNIFIED IDEOGRAPH
+ 0xCBA9: 0x90A5, //CJK UNIFIED IDEOGRAPH
+ 0xCBAA: 0x909E, //CJK UNIFIED IDEOGRAPH
+ 0xCBAB: 0x90A7, //CJK UNIFIED IDEOGRAPH
+ 0xCBAC: 0x90A0, //CJK UNIFIED IDEOGRAPH
+ 0xCBAD: 0x9630, //CJK UNIFIED IDEOGRAPH
+ 0xCBAE: 0x9628, //CJK UNIFIED IDEOGRAPH
+ 0xCBAF: 0x962F, //CJK UNIFIED IDEOGRAPH
+ 0xCBB0: 0x962D, //CJK UNIFIED IDEOGRAPH
+ 0xCBB1: 0x4E33, //CJK UNIFIED IDEOGRAPH
+ 0xCBB2: 0x4F98, //CJK UNIFIED IDEOGRAPH
+ 0xCBB3: 0x4F7C, //CJK UNIFIED IDEOGRAPH
+ 0xCBB4: 0x4F85, //CJK UNIFIED IDEOGRAPH
+ 0xCBB5: 0x4F7D, //CJK UNIFIED IDEOGRAPH
+ 0xCBB6: 0x4F80, //CJK UNIFIED IDEOGRAPH
+ 0xCBB7: 0x4F87, //CJK UNIFIED IDEOGRAPH
+ 0xCBB8: 0x4F76, //CJK UNIFIED IDEOGRAPH
+ 0xCBB9: 0x4F74, //CJK UNIFIED IDEOGRAPH
+ 0xCBBA: 0x4F89, //CJK UNIFIED IDEOGRAPH
+ 0xCBBB: 0x4F84, //CJK UNIFIED IDEOGRAPH
+ 0xCBBC: 0x4F77, //CJK UNIFIED IDEOGRAPH
+ 0xCBBD: 0x4F4C, //CJK UNIFIED IDEOGRAPH
+ 0xCBBE: 0x4F97, //CJK UNIFIED IDEOGRAPH
+ 0xCBBF: 0x4F6A, //CJK UNIFIED IDEOGRAPH
+ 0xCBC0: 0x4F9A, //CJK UNIFIED IDEOGRAPH
+ 0xCBC1: 0x4F79, //CJK UNIFIED IDEOGRAPH
+ 0xCBC2: 0x4F81, //CJK UNIFIED IDEOGRAPH
+ 0xCBC3: 0x4F78, //CJK UNIFIED IDEOGRAPH
+ 0xCBC4: 0x4F90, //CJK UNIFIED IDEOGRAPH
+ 0xCBC5: 0x4F9C, //CJK UNIFIED IDEOGRAPH
+ 0xCBC6: 0x4F94, //CJK UNIFIED IDEOGRAPH
+ 0xCBC7: 0x4F9E, //CJK UNIFIED IDEOGRAPH
+ 0xCBC8: 0x4F92, //CJK UNIFIED IDEOGRAPH
+ 0xCBC9: 0x4F82, //CJK UNIFIED IDEOGRAPH
+ 0xCBCA: 0x4F95, //CJK UNIFIED IDEOGRAPH
+ 0xCBCB: 0x4F6B, //CJK UNIFIED IDEOGRAPH
+ 0xCBCC: 0x4F6E, //CJK UNIFIED IDEOGRAPH
+ 0xCBCD: 0x519E, //CJK UNIFIED IDEOGRAPH
+ 0xCBCE: 0x51BC, //CJK UNIFIED IDEOGRAPH
+ 0xCBCF: 0x51BE, //CJK UNIFIED IDEOGRAPH
+ 0xCBD0: 0x5235, //CJK UNIFIED IDEOGRAPH
+ 0xCBD1: 0x5232, //CJK UNIFIED IDEOGRAPH
+ 0xCBD2: 0x5233, //CJK UNIFIED IDEOGRAPH
+ 0xCBD3: 0x5246, //CJK UNIFIED IDEOGRAPH
+ 0xCBD4: 0x5231, //CJK UNIFIED IDEOGRAPH
+ 0xCBD5: 0x52BC, //CJK UNIFIED IDEOGRAPH
+ 0xCBD6: 0x530A, //CJK UNIFIED IDEOGRAPH
+ 0xCBD7: 0x530B, //CJK UNIFIED IDEOGRAPH
+ 0xCBD8: 0x533C, //CJK UNIFIED IDEOGRAPH
+ 0xCBD9: 0x5392, //CJK UNIFIED IDEOGRAPH
+ 0xCBDA: 0x5394, //CJK UNIFIED IDEOGRAPH
+ 0xCBDB: 0x5487, //CJK UNIFIED IDEOGRAPH
+ 0xCBDC: 0x547F, //CJK UNIFIED IDEOGRAPH
+ 0xCBDD: 0x5481, //CJK UNIFIED IDEOGRAPH
+ 0xCBDE: 0x5491, //CJK UNIFIED IDEOGRAPH
+ 0xCBDF: 0x5482, //CJK UNIFIED IDEOGRAPH
+ 0xCBE0: 0x5488, //CJK UNIFIED IDEOGRAPH
+ 0xCBE1: 0x546B, //CJK UNIFIED IDEOGRAPH
+ 0xCBE2: 0x547A, //CJK UNIFIED IDEOGRAPH
+ 0xCBE3: 0x547E, //CJK UNIFIED IDEOGRAPH
+ 0xCBE4: 0x5465, //CJK UNIFIED IDEOGRAPH
+ 0xCBE5: 0x546C, //CJK UNIFIED IDEOGRAPH
+ 0xCBE6: 0x5474, //CJK UNIFIED IDEOGRAPH
+ 0xCBE7: 0x5466, //CJK UNIFIED IDEOGRAPH
+ 0xCBE8: 0x548D, //CJK UNIFIED IDEOGRAPH
+ 0xCBE9: 0x546F, //CJK UNIFIED IDEOGRAPH
+ 0xCBEA: 0x5461, //CJK UNIFIED IDEOGRAPH
+ 0xCBEB: 0x5460, //CJK UNIFIED IDEOGRAPH
+ 0xCBEC: 0x5498, //CJK UNIFIED IDEOGRAPH
+ 0xCBED: 0x5463, //CJK UNIFIED IDEOGRAPH
+ 0xCBEE: 0x5467, //CJK UNIFIED IDEOGRAPH
+ 0xCBEF: 0x5464, //CJK UNIFIED IDEOGRAPH
+ 0xCBF0: 0x56F7, //CJK UNIFIED IDEOGRAPH
+ 0xCBF1: 0x56F9, //CJK UNIFIED IDEOGRAPH
+ 0xCBF2: 0x576F, //CJK UNIFIED IDEOGRAPH
+ 0xCBF3: 0x5772, //CJK UNIFIED IDEOGRAPH
+ 0xCBF4: 0x576D, //CJK UNIFIED IDEOGRAPH
+ 0xCBF5: 0x576B, //CJK UNIFIED IDEOGRAPH
+ 0xCBF6: 0x5771, //CJK UNIFIED IDEOGRAPH
+ 0xCBF7: 0x5770, //CJK UNIFIED IDEOGRAPH
+ 0xCBF8: 0x5776, //CJK UNIFIED IDEOGRAPH
+ 0xCBF9: 0x5780, //CJK UNIFIED IDEOGRAPH
+ 0xCBFA: 0x5775, //CJK UNIFIED IDEOGRAPH
+ 0xCBFB: 0x577B, //CJK UNIFIED IDEOGRAPH
+ 0xCBFC: 0x5773, //CJK UNIFIED IDEOGRAPH
+ 0xCBFD: 0x5774, //CJK UNIFIED IDEOGRAPH
+ 0xCBFE: 0x5762, //CJK UNIFIED IDEOGRAPH
+ 0xCC40: 0x5768, //CJK UNIFIED IDEOGRAPH
+ 0xCC41: 0x577D, //CJK UNIFIED IDEOGRAPH
+ 0xCC42: 0x590C, //CJK UNIFIED IDEOGRAPH
+ 0xCC43: 0x5945, //CJK UNIFIED IDEOGRAPH
+ 0xCC44: 0x59B5, //CJK UNIFIED IDEOGRAPH
+ 0xCC45: 0x59BA, //CJK UNIFIED IDEOGRAPH
+ 0xCC46: 0x59CF, //CJK UNIFIED IDEOGRAPH
+ 0xCC47: 0x59CE, //CJK UNIFIED IDEOGRAPH
+ 0xCC48: 0x59B2, //CJK UNIFIED IDEOGRAPH
+ 0xCC49: 0x59CC, //CJK UNIFIED IDEOGRAPH
+ 0xCC4A: 0x59C1, //CJK UNIFIED IDEOGRAPH
+ 0xCC4B: 0x59B6, //CJK UNIFIED IDEOGRAPH
+ 0xCC4C: 0x59BC, //CJK UNIFIED IDEOGRAPH
+ 0xCC4D: 0x59C3, //CJK UNIFIED IDEOGRAPH
+ 0xCC4E: 0x59D6, //CJK UNIFIED IDEOGRAPH
+ 0xCC4F: 0x59B1, //CJK UNIFIED IDEOGRAPH
+ 0xCC50: 0x59BD, //CJK UNIFIED IDEOGRAPH
+ 0xCC51: 0x59C0, //CJK UNIFIED IDEOGRAPH
+ 0xCC52: 0x59C8, //CJK UNIFIED IDEOGRAPH
+ 0xCC53: 0x59B4, //CJK UNIFIED IDEOGRAPH
+ 0xCC54: 0x59C7, //CJK UNIFIED IDEOGRAPH
+ 0xCC55: 0x5B62, //CJK UNIFIED IDEOGRAPH
+ 0xCC56: 0x5B65, //CJK UNIFIED IDEOGRAPH
+ 0xCC57: 0x5B93, //CJK UNIFIED IDEOGRAPH
+ 0xCC58: 0x5B95, //CJK UNIFIED IDEOGRAPH
+ 0xCC59: 0x5C44, //CJK UNIFIED IDEOGRAPH
+ 0xCC5A: 0x5C47, //CJK UNIFIED IDEOGRAPH
+ 0xCC5B: 0x5CAE, //CJK UNIFIED IDEOGRAPH
+ 0xCC5C: 0x5CA4, //CJK UNIFIED IDEOGRAPH
+ 0xCC5D: 0x5CA0, //CJK UNIFIED IDEOGRAPH
+ 0xCC5E: 0x5CB5, //CJK UNIFIED IDEOGRAPH
+ 0xCC5F: 0x5CAF, //CJK UNIFIED IDEOGRAPH
+ 0xCC60: 0x5CA8, //CJK UNIFIED IDEOGRAPH
+ 0xCC61: 0x5CAC, //CJK UNIFIED IDEOGRAPH
+ 0xCC62: 0x5C9F, //CJK UNIFIED IDEOGRAPH
+ 0xCC63: 0x5CA3, //CJK UNIFIED IDEOGRAPH
+ 0xCC64: 0x5CAD, //CJK UNIFIED IDEOGRAPH
+ 0xCC65: 0x5CA2, //CJK UNIFIED IDEOGRAPH
+ 0xCC66: 0x5CAA, //CJK UNIFIED IDEOGRAPH
+ 0xCC67: 0x5CA7, //CJK UNIFIED IDEOGRAPH
+ 0xCC68: 0x5C9D, //CJK UNIFIED IDEOGRAPH
+ 0xCC69: 0x5CA5, //CJK UNIFIED IDEOGRAPH
+ 0xCC6A: 0x5CB6, //CJK UNIFIED IDEOGRAPH
+ 0xCC6B: 0x5CB0, //CJK UNIFIED IDEOGRAPH
+ 0xCC6C: 0x5CA6, //CJK UNIFIED IDEOGRAPH
+ 0xCC6D: 0x5E17, //CJK UNIFIED IDEOGRAPH
+ 0xCC6E: 0x5E14, //CJK UNIFIED IDEOGRAPH
+ 0xCC6F: 0x5E19, //CJK UNIFIED IDEOGRAPH
+ 0xCC70: 0x5F28, //CJK UNIFIED IDEOGRAPH
+ 0xCC71: 0x5F22, //CJK UNIFIED IDEOGRAPH
+ 0xCC72: 0x5F23, //CJK UNIFIED IDEOGRAPH
+ 0xCC73: 0x5F24, //CJK UNIFIED IDEOGRAPH
+ 0xCC74: 0x5F54, //CJK UNIFIED IDEOGRAPH
+ 0xCC75: 0x5F82, //CJK UNIFIED IDEOGRAPH
+ 0xCC76: 0x5F7E, //CJK UNIFIED IDEOGRAPH
+ 0xCC77: 0x5F7D, //CJK UNIFIED IDEOGRAPH
+ 0xCC78: 0x5FDE, //CJK UNIFIED IDEOGRAPH
+ 0xCC79: 0x5FE5, //CJK UNIFIED IDEOGRAPH
+ 0xCC7A: 0x602D, //CJK UNIFIED IDEOGRAPH
+ 0xCC7B: 0x6026, //CJK UNIFIED IDEOGRAPH
+ 0xCC7C: 0x6019, //CJK UNIFIED IDEOGRAPH
+ 0xCC7D: 0x6032, //CJK UNIFIED IDEOGRAPH
+ 0xCC7E: 0x600B, //CJK UNIFIED IDEOGRAPH
+ 0xCCA1: 0x6034, //CJK UNIFIED IDEOGRAPH
+ 0xCCA2: 0x600A, //CJK UNIFIED IDEOGRAPH
+ 0xCCA3: 0x6017, //CJK UNIFIED IDEOGRAPH
+ 0xCCA4: 0x6033, //CJK UNIFIED IDEOGRAPH
+ 0xCCA5: 0x601A, //CJK UNIFIED IDEOGRAPH
+ 0xCCA6: 0x601E, //CJK UNIFIED IDEOGRAPH
+ 0xCCA7: 0x602C, //CJK UNIFIED IDEOGRAPH
+ 0xCCA8: 0x6022, //CJK UNIFIED IDEOGRAPH
+ 0xCCA9: 0x600D, //CJK UNIFIED IDEOGRAPH
+ 0xCCAA: 0x6010, //CJK UNIFIED IDEOGRAPH
+ 0xCCAB: 0x602E, //CJK UNIFIED IDEOGRAPH
+ 0xCCAC: 0x6013, //CJK UNIFIED IDEOGRAPH
+ 0xCCAD: 0x6011, //CJK UNIFIED IDEOGRAPH
+ 0xCCAE: 0x600C, //CJK UNIFIED IDEOGRAPH
+ 0xCCAF: 0x6009, //CJK UNIFIED IDEOGRAPH
+ 0xCCB0: 0x601C, //CJK UNIFIED IDEOGRAPH
+ 0xCCB1: 0x6214, //CJK UNIFIED IDEOGRAPH
+ 0xCCB2: 0x623D, //CJK UNIFIED IDEOGRAPH
+ 0xCCB3: 0x62AD, //CJK UNIFIED IDEOGRAPH
+ 0xCCB4: 0x62B4, //CJK UNIFIED IDEOGRAPH
+ 0xCCB5: 0x62D1, //CJK UNIFIED IDEOGRAPH
+ 0xCCB6: 0x62BE, //CJK UNIFIED IDEOGRAPH
+ 0xCCB7: 0x62AA, //CJK UNIFIED IDEOGRAPH
+ 0xCCB8: 0x62B6, //CJK UNIFIED IDEOGRAPH
+ 0xCCB9: 0x62CA, //CJK UNIFIED IDEOGRAPH
+ 0xCCBA: 0x62AE, //CJK UNIFIED IDEOGRAPH
+ 0xCCBB: 0x62B3, //CJK UNIFIED IDEOGRAPH
+ 0xCCBC: 0x62AF, //CJK UNIFIED IDEOGRAPH
+ 0xCCBD: 0x62BB, //CJK UNIFIED IDEOGRAPH
+ 0xCCBE: 0x62A9, //CJK UNIFIED IDEOGRAPH
+ 0xCCBF: 0x62B0, //CJK UNIFIED IDEOGRAPH
+ 0xCCC0: 0x62B8, //CJK UNIFIED IDEOGRAPH
+ 0xCCC1: 0x653D, //CJK UNIFIED IDEOGRAPH
+ 0xCCC2: 0x65A8, //CJK UNIFIED IDEOGRAPH
+ 0xCCC3: 0x65BB, //CJK UNIFIED IDEOGRAPH
+ 0xCCC4: 0x6609, //CJK UNIFIED IDEOGRAPH
+ 0xCCC5: 0x65FC, //CJK UNIFIED IDEOGRAPH
+ 0xCCC6: 0x6604, //CJK UNIFIED IDEOGRAPH
+ 0xCCC7: 0x6612, //CJK UNIFIED IDEOGRAPH
+ 0xCCC8: 0x6608, //CJK UNIFIED IDEOGRAPH
+ 0xCCC9: 0x65FB, //CJK UNIFIED IDEOGRAPH
+ 0xCCCA: 0x6603, //CJK UNIFIED IDEOGRAPH
+ 0xCCCB: 0x660B, //CJK UNIFIED IDEOGRAPH
+ 0xCCCC: 0x660D, //CJK UNIFIED IDEOGRAPH
+ 0xCCCD: 0x6605, //CJK UNIFIED IDEOGRAPH
+ 0xCCCE: 0x65FD, //CJK UNIFIED IDEOGRAPH
+ 0xCCCF: 0x6611, //CJK UNIFIED IDEOGRAPH
+ 0xCCD0: 0x6610, //CJK UNIFIED IDEOGRAPH
+ 0xCCD1: 0x66F6, //CJK UNIFIED IDEOGRAPH
+ 0xCCD2: 0x670A, //CJK UNIFIED IDEOGRAPH
+ 0xCCD3: 0x6785, //CJK UNIFIED IDEOGRAPH
+ 0xCCD4: 0x676C, //CJK UNIFIED IDEOGRAPH
+ 0xCCD5: 0x678E, //CJK UNIFIED IDEOGRAPH
+ 0xCCD6: 0x6792, //CJK UNIFIED IDEOGRAPH
+ 0xCCD7: 0x6776, //CJK UNIFIED IDEOGRAPH
+ 0xCCD8: 0x677B, //CJK UNIFIED IDEOGRAPH
+ 0xCCD9: 0x6798, //CJK UNIFIED IDEOGRAPH
+ 0xCCDA: 0x6786, //CJK UNIFIED IDEOGRAPH
+ 0xCCDB: 0x6784, //CJK UNIFIED IDEOGRAPH
+ 0xCCDC: 0x6774, //CJK UNIFIED IDEOGRAPH
+ 0xCCDD: 0x678D, //CJK UNIFIED IDEOGRAPH
+ 0xCCDE: 0x678C, //CJK UNIFIED IDEOGRAPH
+ 0xCCDF: 0x677A, //CJK UNIFIED IDEOGRAPH
+ 0xCCE0: 0x679F, //CJK UNIFIED IDEOGRAPH
+ 0xCCE1: 0x6791, //CJK UNIFIED IDEOGRAPH
+ 0xCCE2: 0x6799, //CJK UNIFIED IDEOGRAPH
+ 0xCCE3: 0x6783, //CJK UNIFIED IDEOGRAPH
+ 0xCCE4: 0x677D, //CJK UNIFIED IDEOGRAPH
+ 0xCCE5: 0x6781, //CJK UNIFIED IDEOGRAPH
+ 0xCCE6: 0x6778, //CJK UNIFIED IDEOGRAPH
+ 0xCCE7: 0x6779, //CJK UNIFIED IDEOGRAPH
+ 0xCCE8: 0x6794, //CJK UNIFIED IDEOGRAPH
+ 0xCCE9: 0x6B25, //CJK UNIFIED IDEOGRAPH
+ 0xCCEA: 0x6B80, //CJK UNIFIED IDEOGRAPH
+ 0xCCEB: 0x6B7E, //CJK UNIFIED IDEOGRAPH
+ 0xCCEC: 0x6BDE, //CJK UNIFIED IDEOGRAPH
+ 0xCCED: 0x6C1D, //CJK UNIFIED IDEOGRAPH
+ 0xCCEE: 0x6C93, //CJK UNIFIED IDEOGRAPH
+ 0xCCEF: 0x6CEC, //CJK UNIFIED IDEOGRAPH
+ 0xCCF0: 0x6CEB, //CJK UNIFIED IDEOGRAPH
+ 0xCCF1: 0x6CEE, //CJK UNIFIED IDEOGRAPH
+ 0xCCF2: 0x6CD9, //CJK UNIFIED IDEOGRAPH
+ 0xCCF3: 0x6CB6, //CJK UNIFIED IDEOGRAPH
+ 0xCCF4: 0x6CD4, //CJK UNIFIED IDEOGRAPH
+ 0xCCF5: 0x6CAD, //CJK UNIFIED IDEOGRAPH
+ 0xCCF6: 0x6CE7, //CJK UNIFIED IDEOGRAPH
+ 0xCCF7: 0x6CB7, //CJK UNIFIED IDEOGRAPH
+ 0xCCF8: 0x6CD0, //CJK UNIFIED IDEOGRAPH
+ 0xCCF9: 0x6CC2, //CJK UNIFIED IDEOGRAPH
+ 0xCCFA: 0x6CBA, //CJK UNIFIED IDEOGRAPH
+ 0xCCFB: 0x6CC3, //CJK UNIFIED IDEOGRAPH
+ 0xCCFC: 0x6CC6, //CJK UNIFIED IDEOGRAPH
+ 0xCCFD: 0x6CED, //CJK UNIFIED IDEOGRAPH
+ 0xCCFE: 0x6CF2, //CJK UNIFIED IDEOGRAPH
+ 0xCD40: 0x6CD2, //CJK UNIFIED IDEOGRAPH
+ 0xCD41: 0x6CDD, //CJK UNIFIED IDEOGRAPH
+ 0xCD42: 0x6CB4, //CJK UNIFIED IDEOGRAPH
+ 0xCD43: 0x6C8A, //CJK UNIFIED IDEOGRAPH
+ 0xCD44: 0x6C9D, //CJK UNIFIED IDEOGRAPH
+ 0xCD45: 0x6C80, //CJK UNIFIED IDEOGRAPH
+ 0xCD46: 0x6CDE, //CJK UNIFIED IDEOGRAPH
+ 0xCD47: 0x6CC0, //CJK UNIFIED IDEOGRAPH
+ 0xCD48: 0x6D30, //CJK UNIFIED IDEOGRAPH
+ 0xCD49: 0x6CCD, //CJK UNIFIED IDEOGRAPH
+ 0xCD4A: 0x6CC7, //CJK UNIFIED IDEOGRAPH
+ 0xCD4B: 0x6CB0, //CJK UNIFIED IDEOGRAPH
+ 0xCD4C: 0x6CF9, //CJK UNIFIED IDEOGRAPH
+ 0xCD4D: 0x6CCF, //CJK UNIFIED IDEOGRAPH
+ 0xCD4E: 0x6CE9, //CJK UNIFIED IDEOGRAPH
+ 0xCD4F: 0x6CD1, //CJK UNIFIED IDEOGRAPH
+ 0xCD50: 0x7094, //CJK UNIFIED IDEOGRAPH
+ 0xCD51: 0x7098, //CJK UNIFIED IDEOGRAPH
+ 0xCD52: 0x7085, //CJK UNIFIED IDEOGRAPH
+ 0xCD53: 0x7093, //CJK UNIFIED IDEOGRAPH
+ 0xCD54: 0x7086, //CJK UNIFIED IDEOGRAPH
+ 0xCD55: 0x7084, //CJK UNIFIED IDEOGRAPH
+ 0xCD56: 0x7091, //CJK UNIFIED IDEOGRAPH
+ 0xCD57: 0x7096, //CJK UNIFIED IDEOGRAPH
+ 0xCD58: 0x7082, //CJK UNIFIED IDEOGRAPH
+ 0xCD59: 0x709A, //CJK UNIFIED IDEOGRAPH
+ 0xCD5A: 0x7083, //CJK UNIFIED IDEOGRAPH
+ 0xCD5B: 0x726A, //CJK UNIFIED IDEOGRAPH
+ 0xCD5C: 0x72D6, //CJK UNIFIED IDEOGRAPH
+ 0xCD5D: 0x72CB, //CJK UNIFIED IDEOGRAPH
+ 0xCD5E: 0x72D8, //CJK UNIFIED IDEOGRAPH
+ 0xCD5F: 0x72C9, //CJK UNIFIED IDEOGRAPH
+ 0xCD60: 0x72DC, //CJK UNIFIED IDEOGRAPH
+ 0xCD61: 0x72D2, //CJK UNIFIED IDEOGRAPH
+ 0xCD62: 0x72D4, //CJK UNIFIED IDEOGRAPH
+ 0xCD63: 0x72DA, //CJK UNIFIED IDEOGRAPH
+ 0xCD64: 0x72CC, //CJK UNIFIED IDEOGRAPH
+ 0xCD65: 0x72D1, //CJK UNIFIED IDEOGRAPH
+ 0xCD66: 0x73A4, //CJK UNIFIED IDEOGRAPH
+ 0xCD67: 0x73A1, //CJK UNIFIED IDEOGRAPH
+ 0xCD68: 0x73AD, //CJK UNIFIED IDEOGRAPH
+ 0xCD69: 0x73A6, //CJK UNIFIED IDEOGRAPH
+ 0xCD6A: 0x73A2, //CJK UNIFIED IDEOGRAPH
+ 0xCD6B: 0x73A0, //CJK UNIFIED IDEOGRAPH
+ 0xCD6C: 0x73AC, //CJK UNIFIED IDEOGRAPH
+ 0xCD6D: 0x739D, //CJK UNIFIED IDEOGRAPH
+ 0xCD6E: 0x74DD, //CJK UNIFIED IDEOGRAPH
+ 0xCD6F: 0x74E8, //CJK UNIFIED IDEOGRAPH
+ 0xCD70: 0x753F, //CJK UNIFIED IDEOGRAPH
+ 0xCD71: 0x7540, //CJK UNIFIED IDEOGRAPH
+ 0xCD72: 0x753E, //CJK UNIFIED IDEOGRAPH
+ 0xCD73: 0x758C, //CJK UNIFIED IDEOGRAPH
+ 0xCD74: 0x7598, //CJK UNIFIED IDEOGRAPH
+ 0xCD75: 0x76AF, //CJK UNIFIED IDEOGRAPH
+ 0xCD76: 0x76F3, //CJK UNIFIED IDEOGRAPH
+ 0xCD77: 0x76F1, //CJK UNIFIED IDEOGRAPH
+ 0xCD78: 0x76F0, //CJK UNIFIED IDEOGRAPH
+ 0xCD79: 0x76F5, //CJK UNIFIED IDEOGRAPH
+ 0xCD7A: 0x77F8, //CJK UNIFIED IDEOGRAPH
+ 0xCD7B: 0x77FC, //CJK UNIFIED IDEOGRAPH
+ 0xCD7C: 0x77F9, //CJK UNIFIED IDEOGRAPH
+ 0xCD7D: 0x77FB, //CJK UNIFIED IDEOGRAPH
+ 0xCD7E: 0x77FA, //CJK UNIFIED IDEOGRAPH
+ 0xCDA1: 0x77F7, //CJK UNIFIED IDEOGRAPH
+ 0xCDA2: 0x7942, //CJK UNIFIED IDEOGRAPH
+ 0xCDA3: 0x793F, //CJK UNIFIED IDEOGRAPH
+ 0xCDA4: 0x79C5, //CJK UNIFIED IDEOGRAPH
+ 0xCDA5: 0x7A78, //CJK UNIFIED IDEOGRAPH
+ 0xCDA6: 0x7A7B, //CJK UNIFIED IDEOGRAPH
+ 0xCDA7: 0x7AFB, //CJK UNIFIED IDEOGRAPH
+ 0xCDA8: 0x7C75, //CJK UNIFIED IDEOGRAPH
+ 0xCDA9: 0x7CFD, //CJK UNIFIED IDEOGRAPH
+ 0xCDAA: 0x8035, //CJK UNIFIED IDEOGRAPH
+ 0xCDAB: 0x808F, //CJK UNIFIED IDEOGRAPH
+ 0xCDAC: 0x80AE, //CJK UNIFIED IDEOGRAPH
+ 0xCDAD: 0x80A3, //CJK UNIFIED IDEOGRAPH
+ 0xCDAE: 0x80B8, //CJK UNIFIED IDEOGRAPH
+ 0xCDAF: 0x80B5, //CJK UNIFIED IDEOGRAPH
+ 0xCDB0: 0x80AD, //CJK UNIFIED IDEOGRAPH
+ 0xCDB1: 0x8220, //CJK UNIFIED IDEOGRAPH
+ 0xCDB2: 0x82A0, //CJK UNIFIED IDEOGRAPH
+ 0xCDB3: 0x82C0, //CJK UNIFIED IDEOGRAPH
+ 0xCDB4: 0x82AB, //CJK UNIFIED IDEOGRAPH
+ 0xCDB5: 0x829A, //CJK UNIFIED IDEOGRAPH
+ 0xCDB6: 0x8298, //CJK UNIFIED IDEOGRAPH
+ 0xCDB7: 0x829B, //CJK UNIFIED IDEOGRAPH
+ 0xCDB8: 0x82B5, //CJK UNIFIED IDEOGRAPH
+ 0xCDB9: 0x82A7, //CJK UNIFIED IDEOGRAPH
+ 0xCDBA: 0x82AE, //CJK UNIFIED IDEOGRAPH
+ 0xCDBB: 0x82BC, //CJK UNIFIED IDEOGRAPH
+ 0xCDBC: 0x829E, //CJK UNIFIED IDEOGRAPH
+ 0xCDBD: 0x82BA, //CJK UNIFIED IDEOGRAPH
+ 0xCDBE: 0x82B4, //CJK UNIFIED IDEOGRAPH
+ 0xCDBF: 0x82A8, //CJK UNIFIED IDEOGRAPH
+ 0xCDC0: 0x82A1, //CJK UNIFIED IDEOGRAPH
+ 0xCDC1: 0x82A9, //CJK UNIFIED IDEOGRAPH
+ 0xCDC2: 0x82C2, //CJK UNIFIED IDEOGRAPH
+ 0xCDC3: 0x82A4, //CJK UNIFIED IDEOGRAPH
+ 0xCDC4: 0x82C3, //CJK UNIFIED IDEOGRAPH
+ 0xCDC5: 0x82B6, //CJK UNIFIED IDEOGRAPH
+ 0xCDC6: 0x82A2, //CJK UNIFIED IDEOGRAPH
+ 0xCDC7: 0x8670, //CJK UNIFIED IDEOGRAPH
+ 0xCDC8: 0x866F, //CJK UNIFIED IDEOGRAPH
+ 0xCDC9: 0x866D, //CJK UNIFIED IDEOGRAPH
+ 0xCDCA: 0x866E, //CJK UNIFIED IDEOGRAPH
+ 0xCDCB: 0x8C56, //CJK UNIFIED IDEOGRAPH
+ 0xCDCC: 0x8FD2, //CJK UNIFIED IDEOGRAPH
+ 0xCDCD: 0x8FCB, //CJK UNIFIED IDEOGRAPH
+ 0xCDCE: 0x8FD3, //CJK UNIFIED IDEOGRAPH
+ 0xCDCF: 0x8FCD, //CJK UNIFIED IDEOGRAPH
+ 0xCDD0: 0x8FD6, //CJK UNIFIED IDEOGRAPH
+ 0xCDD1: 0x8FD5, //CJK UNIFIED IDEOGRAPH
+ 0xCDD2: 0x8FD7, //CJK UNIFIED IDEOGRAPH
+ 0xCDD3: 0x90B2, //CJK UNIFIED IDEOGRAPH
+ 0xCDD4: 0x90B4, //CJK UNIFIED IDEOGRAPH
+ 0xCDD5: 0x90AF, //CJK UNIFIED IDEOGRAPH
+ 0xCDD6: 0x90B3, //CJK UNIFIED IDEOGRAPH
+ 0xCDD7: 0x90B0, //CJK UNIFIED IDEOGRAPH
+ 0xCDD8: 0x9639, //CJK UNIFIED IDEOGRAPH
+ 0xCDD9: 0x963D, //CJK UNIFIED IDEOGRAPH
+ 0xCDDA: 0x963C, //CJK UNIFIED IDEOGRAPH
+ 0xCDDB: 0x963A, //CJK UNIFIED IDEOGRAPH
+ 0xCDDC: 0x9643, //CJK UNIFIED IDEOGRAPH
+ 0xCDDD: 0x4FCD, //CJK UNIFIED IDEOGRAPH
+ 0xCDDE: 0x4FC5, //CJK UNIFIED IDEOGRAPH
+ 0xCDDF: 0x4FD3, //CJK UNIFIED IDEOGRAPH
+ 0xCDE0: 0x4FB2, //CJK UNIFIED IDEOGRAPH
+ 0xCDE1: 0x4FC9, //CJK UNIFIED IDEOGRAPH
+ 0xCDE2: 0x4FCB, //CJK UNIFIED IDEOGRAPH
+ 0xCDE3: 0x4FC1, //CJK UNIFIED IDEOGRAPH
+ 0xCDE4: 0x4FD4, //CJK UNIFIED IDEOGRAPH
+ 0xCDE5: 0x4FDC, //CJK UNIFIED IDEOGRAPH
+ 0xCDE6: 0x4FD9, //CJK UNIFIED IDEOGRAPH
+ 0xCDE7: 0x4FBB, //CJK UNIFIED IDEOGRAPH
+ 0xCDE8: 0x4FB3, //CJK UNIFIED IDEOGRAPH
+ 0xCDE9: 0x4FDB, //CJK UNIFIED IDEOGRAPH
+ 0xCDEA: 0x4FC7, //CJK UNIFIED IDEOGRAPH
+ 0xCDEB: 0x4FD6, //CJK UNIFIED IDEOGRAPH
+ 0xCDEC: 0x4FBA, //CJK UNIFIED IDEOGRAPH
+ 0xCDED: 0x4FC0, //CJK UNIFIED IDEOGRAPH
+ 0xCDEE: 0x4FB9, //CJK UNIFIED IDEOGRAPH
+ 0xCDEF: 0x4FEC, //CJK UNIFIED IDEOGRAPH
+ 0xCDF0: 0x5244, //CJK UNIFIED IDEOGRAPH
+ 0xCDF1: 0x5249, //CJK UNIFIED IDEOGRAPH
+ 0xCDF2: 0x52C0, //CJK UNIFIED IDEOGRAPH
+ 0xCDF3: 0x52C2, //CJK UNIFIED IDEOGRAPH
+ 0xCDF4: 0x533D, //CJK UNIFIED IDEOGRAPH
+ 0xCDF5: 0x537C, //CJK UNIFIED IDEOGRAPH
+ 0xCDF6: 0x5397, //CJK UNIFIED IDEOGRAPH
+ 0xCDF7: 0x5396, //CJK UNIFIED IDEOGRAPH
+ 0xCDF8: 0x5399, //CJK UNIFIED IDEOGRAPH
+ 0xCDF9: 0x5398, //CJK UNIFIED IDEOGRAPH
+ 0xCDFA: 0x54BA, //CJK UNIFIED IDEOGRAPH
+ 0xCDFB: 0x54A1, //CJK UNIFIED IDEOGRAPH
+ 0xCDFC: 0x54AD, //CJK UNIFIED IDEOGRAPH
+ 0xCDFD: 0x54A5, //CJK UNIFIED IDEOGRAPH
+ 0xCDFE: 0x54CF, //CJK UNIFIED IDEOGRAPH
+ 0xCE40: 0x54C3, //CJK UNIFIED IDEOGRAPH
+ 0xCE41: 0x830D, //CJK UNIFIED IDEOGRAPH
+ 0xCE42: 0x54B7, //CJK UNIFIED IDEOGRAPH
+ 0xCE43: 0x54AE, //CJK UNIFIED IDEOGRAPH
+ 0xCE44: 0x54D6, //CJK UNIFIED IDEOGRAPH
+ 0xCE45: 0x54B6, //CJK UNIFIED IDEOGRAPH
+ 0xCE46: 0x54C5, //CJK UNIFIED IDEOGRAPH
+ 0xCE47: 0x54C6, //CJK UNIFIED IDEOGRAPH
+ 0xCE48: 0x54A0, //CJK UNIFIED IDEOGRAPH
+ 0xCE49: 0x5470, //CJK UNIFIED IDEOGRAPH
+ 0xCE4A: 0x54BC, //CJK UNIFIED IDEOGRAPH
+ 0xCE4B: 0x54A2, //CJK UNIFIED IDEOGRAPH
+ 0xCE4C: 0x54BE, //CJK UNIFIED IDEOGRAPH
+ 0xCE4D: 0x5472, //CJK UNIFIED IDEOGRAPH
+ 0xCE4E: 0x54DE, //CJK UNIFIED IDEOGRAPH
+ 0xCE4F: 0x54B0, //CJK UNIFIED IDEOGRAPH
+ 0xCE50: 0x57B5, //CJK UNIFIED IDEOGRAPH
+ 0xCE51: 0x579E, //CJK UNIFIED IDEOGRAPH
+ 0xCE52: 0x579F, //CJK UNIFIED IDEOGRAPH
+ 0xCE53: 0x57A4, //CJK UNIFIED IDEOGRAPH
+ 0xCE54: 0x578C, //CJK UNIFIED IDEOGRAPH
+ 0xCE55: 0x5797, //CJK UNIFIED IDEOGRAPH
+ 0xCE56: 0x579D, //CJK UNIFIED IDEOGRAPH
+ 0xCE57: 0x579B, //CJK UNIFIED IDEOGRAPH
+ 0xCE58: 0x5794, //CJK UNIFIED IDEOGRAPH
+ 0xCE59: 0x5798, //CJK UNIFIED IDEOGRAPH
+ 0xCE5A: 0x578F, //CJK UNIFIED IDEOGRAPH
+ 0xCE5B: 0x5799, //CJK UNIFIED IDEOGRAPH
+ 0xCE5C: 0x57A5, //CJK UNIFIED IDEOGRAPH
+ 0xCE5D: 0x579A, //CJK UNIFIED IDEOGRAPH
+ 0xCE5E: 0x5795, //CJK UNIFIED IDEOGRAPH
+ 0xCE5F: 0x58F4, //CJK UNIFIED IDEOGRAPH
+ 0xCE60: 0x590D, //CJK UNIFIED IDEOGRAPH
+ 0xCE61: 0x5953, //CJK UNIFIED IDEOGRAPH
+ 0xCE62: 0x59E1, //CJK UNIFIED IDEOGRAPH
+ 0xCE63: 0x59DE, //CJK UNIFIED IDEOGRAPH
+ 0xCE64: 0x59EE, //CJK UNIFIED IDEOGRAPH
+ 0xCE65: 0x5A00, //CJK UNIFIED IDEOGRAPH
+ 0xCE66: 0x59F1, //CJK UNIFIED IDEOGRAPH
+ 0xCE67: 0x59DD, //CJK UNIFIED IDEOGRAPH
+ 0xCE68: 0x59FA, //CJK UNIFIED IDEOGRAPH
+ 0xCE69: 0x59FD, //CJK UNIFIED IDEOGRAPH
+ 0xCE6A: 0x59FC, //CJK UNIFIED IDEOGRAPH
+ 0xCE6B: 0x59F6, //CJK UNIFIED IDEOGRAPH
+ 0xCE6C: 0x59E4, //CJK UNIFIED IDEOGRAPH
+ 0xCE6D: 0x59F2, //CJK UNIFIED IDEOGRAPH
+ 0xCE6E: 0x59F7, //CJK UNIFIED IDEOGRAPH
+ 0xCE6F: 0x59DB, //CJK UNIFIED IDEOGRAPH
+ 0xCE70: 0x59E9, //CJK UNIFIED IDEOGRAPH
+ 0xCE71: 0x59F3, //CJK UNIFIED IDEOGRAPH
+ 0xCE72: 0x59F5, //CJK UNIFIED IDEOGRAPH
+ 0xCE73: 0x59E0, //CJK UNIFIED IDEOGRAPH
+ 0xCE74: 0x59FE, //CJK UNIFIED IDEOGRAPH
+ 0xCE75: 0x59F4, //CJK UNIFIED IDEOGRAPH
+ 0xCE76: 0x59ED, //CJK UNIFIED IDEOGRAPH
+ 0xCE77: 0x5BA8, //CJK UNIFIED IDEOGRAPH
+ 0xCE78: 0x5C4C, //CJK UNIFIED IDEOGRAPH
+ 0xCE79: 0x5CD0, //CJK UNIFIED IDEOGRAPH
+ 0xCE7A: 0x5CD8, //CJK UNIFIED IDEOGRAPH
+ 0xCE7B: 0x5CCC, //CJK UNIFIED IDEOGRAPH
+ 0xCE7C: 0x5CD7, //CJK UNIFIED IDEOGRAPH
+ 0xCE7D: 0x5CCB, //CJK UNIFIED IDEOGRAPH
+ 0xCE7E: 0x5CDB, //CJK UNIFIED IDEOGRAPH
+ 0xCEA1: 0x5CDE, //CJK UNIFIED IDEOGRAPH
+ 0xCEA2: 0x5CDA, //CJK UNIFIED IDEOGRAPH
+ 0xCEA3: 0x5CC9, //CJK UNIFIED IDEOGRAPH
+ 0xCEA4: 0x5CC7, //CJK UNIFIED IDEOGRAPH
+ 0xCEA5: 0x5CCA, //CJK UNIFIED IDEOGRAPH
+ 0xCEA6: 0x5CD6, //CJK UNIFIED IDEOGRAPH
+ 0xCEA7: 0x5CD3, //CJK UNIFIED IDEOGRAPH
+ 0xCEA8: 0x5CD4, //CJK UNIFIED IDEOGRAPH
+ 0xCEA9: 0x5CCF, //CJK UNIFIED IDEOGRAPH
+ 0xCEAA: 0x5CC8, //CJK UNIFIED IDEOGRAPH
+ 0xCEAB: 0x5CC6, //CJK UNIFIED IDEOGRAPH
+ 0xCEAC: 0x5CCE, //CJK UNIFIED IDEOGRAPH
+ 0xCEAD: 0x5CDF, //CJK UNIFIED IDEOGRAPH
+ 0xCEAE: 0x5CF8, //CJK UNIFIED IDEOGRAPH
+ 0xCEAF: 0x5DF9, //CJK UNIFIED IDEOGRAPH
+ 0xCEB0: 0x5E21, //CJK UNIFIED IDEOGRAPH
+ 0xCEB1: 0x5E22, //CJK UNIFIED IDEOGRAPH
+ 0xCEB2: 0x5E23, //CJK UNIFIED IDEOGRAPH
+ 0xCEB3: 0x5E20, //CJK UNIFIED IDEOGRAPH
+ 0xCEB4: 0x5E24, //CJK UNIFIED IDEOGRAPH
+ 0xCEB5: 0x5EB0, //CJK UNIFIED IDEOGRAPH
+ 0xCEB6: 0x5EA4, //CJK UNIFIED IDEOGRAPH
+ 0xCEB7: 0x5EA2, //CJK UNIFIED IDEOGRAPH
+ 0xCEB8: 0x5E9B, //CJK UNIFIED IDEOGRAPH
+ 0xCEB9: 0x5EA3, //CJK UNIFIED IDEOGRAPH
+ 0xCEBA: 0x5EA5, //CJK UNIFIED IDEOGRAPH
+ 0xCEBB: 0x5F07, //CJK UNIFIED IDEOGRAPH
+ 0xCEBC: 0x5F2E, //CJK UNIFIED IDEOGRAPH
+ 0xCEBD: 0x5F56, //CJK UNIFIED IDEOGRAPH
+ 0xCEBE: 0x5F86, //CJK UNIFIED IDEOGRAPH
+ 0xCEBF: 0x6037, //CJK UNIFIED IDEOGRAPH
+ 0xCEC0: 0x6039, //CJK UNIFIED IDEOGRAPH
+ 0xCEC1: 0x6054, //CJK UNIFIED IDEOGRAPH
+ 0xCEC2: 0x6072, //CJK UNIFIED IDEOGRAPH
+ 0xCEC3: 0x605E, //CJK UNIFIED IDEOGRAPH
+ 0xCEC4: 0x6045, //CJK UNIFIED IDEOGRAPH
+ 0xCEC5: 0x6053, //CJK UNIFIED IDEOGRAPH
+ 0xCEC6: 0x6047, //CJK UNIFIED IDEOGRAPH
+ 0xCEC7: 0x6049, //CJK UNIFIED IDEOGRAPH
+ 0xCEC8: 0x605B, //CJK UNIFIED IDEOGRAPH
+ 0xCEC9: 0x604C, //CJK UNIFIED IDEOGRAPH
+ 0xCECA: 0x6040, //CJK UNIFIED IDEOGRAPH
+ 0xCECB: 0x6042, //CJK UNIFIED IDEOGRAPH
+ 0xCECC: 0x605F, //CJK UNIFIED IDEOGRAPH
+ 0xCECD: 0x6024, //CJK UNIFIED IDEOGRAPH
+ 0xCECE: 0x6044, //CJK UNIFIED IDEOGRAPH
+ 0xCECF: 0x6058, //CJK UNIFIED IDEOGRAPH
+ 0xCED0: 0x6066, //CJK UNIFIED IDEOGRAPH
+ 0xCED1: 0x606E, //CJK UNIFIED IDEOGRAPH
+ 0xCED2: 0x6242, //CJK UNIFIED IDEOGRAPH
+ 0xCED3: 0x6243, //CJK UNIFIED IDEOGRAPH
+ 0xCED4: 0x62CF, //CJK UNIFIED IDEOGRAPH
+ 0xCED5: 0x630D, //CJK UNIFIED IDEOGRAPH
+ 0xCED6: 0x630B, //CJK UNIFIED IDEOGRAPH
+ 0xCED7: 0x62F5, //CJK UNIFIED IDEOGRAPH
+ 0xCED8: 0x630E, //CJK UNIFIED IDEOGRAPH
+ 0xCED9: 0x6303, //CJK UNIFIED IDEOGRAPH
+ 0xCEDA: 0x62EB, //CJK UNIFIED IDEOGRAPH
+ 0xCEDB: 0x62F9, //CJK UNIFIED IDEOGRAPH
+ 0xCEDC: 0x630F, //CJK UNIFIED IDEOGRAPH
+ 0xCEDD: 0x630C, //CJK UNIFIED IDEOGRAPH
+ 0xCEDE: 0x62F8, //CJK UNIFIED IDEOGRAPH
+ 0xCEDF: 0x62F6, //CJK UNIFIED IDEOGRAPH
+ 0xCEE0: 0x6300, //CJK UNIFIED IDEOGRAPH
+ 0xCEE1: 0x6313, //CJK UNIFIED IDEOGRAPH
+ 0xCEE2: 0x6314, //CJK UNIFIED IDEOGRAPH
+ 0xCEE3: 0x62FA, //CJK UNIFIED IDEOGRAPH
+ 0xCEE4: 0x6315, //CJK UNIFIED IDEOGRAPH
+ 0xCEE5: 0x62FB, //CJK UNIFIED IDEOGRAPH
+ 0xCEE6: 0x62F0, //CJK UNIFIED IDEOGRAPH
+ 0xCEE7: 0x6541, //CJK UNIFIED IDEOGRAPH
+ 0xCEE8: 0x6543, //CJK UNIFIED IDEOGRAPH
+ 0xCEE9: 0x65AA, //CJK UNIFIED IDEOGRAPH
+ 0xCEEA: 0x65BF, //CJK UNIFIED IDEOGRAPH
+ 0xCEEB: 0x6636, //CJK UNIFIED IDEOGRAPH
+ 0xCEEC: 0x6621, //CJK UNIFIED IDEOGRAPH
+ 0xCEED: 0x6632, //CJK UNIFIED IDEOGRAPH
+ 0xCEEE: 0x6635, //CJK UNIFIED IDEOGRAPH
+ 0xCEEF: 0x661C, //CJK UNIFIED IDEOGRAPH
+ 0xCEF0: 0x6626, //CJK UNIFIED IDEOGRAPH
+ 0xCEF1: 0x6622, //CJK UNIFIED IDEOGRAPH
+ 0xCEF2: 0x6633, //CJK UNIFIED IDEOGRAPH
+ 0xCEF3: 0x662B, //CJK UNIFIED IDEOGRAPH
+ 0xCEF4: 0x663A, //CJK UNIFIED IDEOGRAPH
+ 0xCEF5: 0x661D, //CJK UNIFIED IDEOGRAPH
+ 0xCEF6: 0x6634, //CJK UNIFIED IDEOGRAPH
+ 0xCEF7: 0x6639, //CJK UNIFIED IDEOGRAPH
+ 0xCEF8: 0x662E, //CJK UNIFIED IDEOGRAPH
+ 0xCEF9: 0x670F, //CJK UNIFIED IDEOGRAPH
+ 0xCEFA: 0x6710, //CJK UNIFIED IDEOGRAPH
+ 0xCEFB: 0x67C1, //CJK UNIFIED IDEOGRAPH
+ 0xCEFC: 0x67F2, //CJK UNIFIED IDEOGRAPH
+ 0xCEFD: 0x67C8, //CJK UNIFIED IDEOGRAPH
+ 0xCEFE: 0x67BA, //CJK UNIFIED IDEOGRAPH
+ 0xCF40: 0x67DC, //CJK UNIFIED IDEOGRAPH
+ 0xCF41: 0x67BB, //CJK UNIFIED IDEOGRAPH
+ 0xCF42: 0x67F8, //CJK UNIFIED IDEOGRAPH
+ 0xCF43: 0x67D8, //CJK UNIFIED IDEOGRAPH
+ 0xCF44: 0x67C0, //CJK UNIFIED IDEOGRAPH
+ 0xCF45: 0x67B7, //CJK UNIFIED IDEOGRAPH
+ 0xCF46: 0x67C5, //CJK UNIFIED IDEOGRAPH
+ 0xCF47: 0x67EB, //CJK UNIFIED IDEOGRAPH
+ 0xCF48: 0x67E4, //CJK UNIFIED IDEOGRAPH
+ 0xCF49: 0x67DF, //CJK UNIFIED IDEOGRAPH
+ 0xCF4A: 0x67B5, //CJK UNIFIED IDEOGRAPH
+ 0xCF4B: 0x67CD, //CJK UNIFIED IDEOGRAPH
+ 0xCF4C: 0x67B3, //CJK UNIFIED IDEOGRAPH
+ 0xCF4D: 0x67F7, //CJK UNIFIED IDEOGRAPH
+ 0xCF4E: 0x67F6, //CJK UNIFIED IDEOGRAPH
+ 0xCF4F: 0x67EE, //CJK UNIFIED IDEOGRAPH
+ 0xCF50: 0x67E3, //CJK UNIFIED IDEOGRAPH
+ 0xCF51: 0x67C2, //CJK UNIFIED IDEOGRAPH
+ 0xCF52: 0x67B9, //CJK UNIFIED IDEOGRAPH
+ 0xCF53: 0x67CE, //CJK UNIFIED IDEOGRAPH
+ 0xCF54: 0x67E7, //CJK UNIFIED IDEOGRAPH
+ 0xCF55: 0x67F0, //CJK UNIFIED IDEOGRAPH
+ 0xCF56: 0x67B2, //CJK UNIFIED IDEOGRAPH
+ 0xCF57: 0x67FC, //CJK UNIFIED IDEOGRAPH
+ 0xCF58: 0x67C6, //CJK UNIFIED IDEOGRAPH
+ 0xCF59: 0x67ED, //CJK UNIFIED IDEOGRAPH
+ 0xCF5A: 0x67CC, //CJK UNIFIED IDEOGRAPH
+ 0xCF5B: 0x67AE, //CJK UNIFIED IDEOGRAPH
+ 0xCF5C: 0x67E6, //CJK UNIFIED IDEOGRAPH
+ 0xCF5D: 0x67DB, //CJK UNIFIED IDEOGRAPH
+ 0xCF5E: 0x67FA, //CJK UNIFIED IDEOGRAPH
+ 0xCF5F: 0x67C9, //CJK UNIFIED IDEOGRAPH
+ 0xCF60: 0x67CA, //CJK UNIFIED IDEOGRAPH
+ 0xCF61: 0x67C3, //CJK UNIFIED IDEOGRAPH
+ 0xCF62: 0x67EA, //CJK UNIFIED IDEOGRAPH
+ 0xCF63: 0x67CB, //CJK UNIFIED IDEOGRAPH
+ 0xCF64: 0x6B28, //CJK UNIFIED IDEOGRAPH
+ 0xCF65: 0x6B82, //CJK UNIFIED IDEOGRAPH
+ 0xCF66: 0x6B84, //CJK UNIFIED IDEOGRAPH
+ 0xCF67: 0x6BB6, //CJK UNIFIED IDEOGRAPH
+ 0xCF68: 0x6BD6, //CJK UNIFIED IDEOGRAPH
+ 0xCF69: 0x6BD8, //CJK UNIFIED IDEOGRAPH
+ 0xCF6A: 0x6BE0, //CJK UNIFIED IDEOGRAPH
+ 0xCF6B: 0x6C20, //CJK UNIFIED IDEOGRAPH
+ 0xCF6C: 0x6C21, //CJK UNIFIED IDEOGRAPH
+ 0xCF6D: 0x6D28, //CJK UNIFIED IDEOGRAPH
+ 0xCF6E: 0x6D34, //CJK UNIFIED IDEOGRAPH
+ 0xCF6F: 0x6D2D, //CJK UNIFIED IDEOGRAPH
+ 0xCF70: 0x6D1F, //CJK UNIFIED IDEOGRAPH
+ 0xCF71: 0x6D3C, //CJK UNIFIED IDEOGRAPH
+ 0xCF72: 0x6D3F, //CJK UNIFIED IDEOGRAPH
+ 0xCF73: 0x6D12, //CJK UNIFIED IDEOGRAPH
+ 0xCF74: 0x6D0A, //CJK UNIFIED IDEOGRAPH
+ 0xCF75: 0x6CDA, //CJK UNIFIED IDEOGRAPH
+ 0xCF76: 0x6D33, //CJK UNIFIED IDEOGRAPH
+ 0xCF77: 0x6D04, //CJK UNIFIED IDEOGRAPH
+ 0xCF78: 0x6D19, //CJK UNIFIED IDEOGRAPH
+ 0xCF79: 0x6D3A, //CJK UNIFIED IDEOGRAPH
+ 0xCF7A: 0x6D1A, //CJK UNIFIED IDEOGRAPH
+ 0xCF7B: 0x6D11, //CJK UNIFIED IDEOGRAPH
+ 0xCF7C: 0x6D00, //CJK UNIFIED IDEOGRAPH
+ 0xCF7D: 0x6D1D, //CJK UNIFIED IDEOGRAPH
+ 0xCF7E: 0x6D42, //CJK UNIFIED IDEOGRAPH
+ 0xCFA1: 0x6D01, //CJK UNIFIED IDEOGRAPH
+ 0xCFA2: 0x6D18, //CJK UNIFIED IDEOGRAPH
+ 0xCFA3: 0x6D37, //CJK UNIFIED IDEOGRAPH
+ 0xCFA4: 0x6D03, //CJK UNIFIED IDEOGRAPH
+ 0xCFA5: 0x6D0F, //CJK UNIFIED IDEOGRAPH
+ 0xCFA6: 0x6D40, //CJK UNIFIED IDEOGRAPH
+ 0xCFA7: 0x6D07, //CJK UNIFIED IDEOGRAPH
+ 0xCFA8: 0x6D20, //CJK UNIFIED IDEOGRAPH
+ 0xCFA9: 0x6D2C, //CJK UNIFIED IDEOGRAPH
+ 0xCFAA: 0x6D08, //CJK UNIFIED IDEOGRAPH
+ 0xCFAB: 0x6D22, //CJK UNIFIED IDEOGRAPH
+ 0xCFAC: 0x6D09, //CJK UNIFIED IDEOGRAPH
+ 0xCFAD: 0x6D10, //CJK UNIFIED IDEOGRAPH
+ 0xCFAE: 0x70B7, //CJK UNIFIED IDEOGRAPH
+ 0xCFAF: 0x709F, //CJK UNIFIED IDEOGRAPH
+ 0xCFB0: 0x70BE, //CJK UNIFIED IDEOGRAPH
+ 0xCFB1: 0x70B1, //CJK UNIFIED IDEOGRAPH
+ 0xCFB2: 0x70B0, //CJK UNIFIED IDEOGRAPH
+ 0xCFB3: 0x70A1, //CJK UNIFIED IDEOGRAPH
+ 0xCFB4: 0x70B4, //CJK UNIFIED IDEOGRAPH
+ 0xCFB5: 0x70B5, //CJK UNIFIED IDEOGRAPH
+ 0xCFB6: 0x70A9, //CJK UNIFIED IDEOGRAPH
+ 0xCFB7: 0x7241, //CJK UNIFIED IDEOGRAPH
+ 0xCFB8: 0x7249, //CJK UNIFIED IDEOGRAPH
+ 0xCFB9: 0x724A, //CJK UNIFIED IDEOGRAPH
+ 0xCFBA: 0x726C, //CJK UNIFIED IDEOGRAPH
+ 0xCFBB: 0x7270, //CJK UNIFIED IDEOGRAPH
+ 0xCFBC: 0x7273, //CJK UNIFIED IDEOGRAPH
+ 0xCFBD: 0x726E, //CJK UNIFIED IDEOGRAPH
+ 0xCFBE: 0x72CA, //CJK UNIFIED IDEOGRAPH
+ 0xCFBF: 0x72E4, //CJK UNIFIED IDEOGRAPH
+ 0xCFC0: 0x72E8, //CJK UNIFIED IDEOGRAPH
+ 0xCFC1: 0x72EB, //CJK UNIFIED IDEOGRAPH
+ 0xCFC2: 0x72DF, //CJK UNIFIED IDEOGRAPH
+ 0xCFC3: 0x72EA, //CJK UNIFIED IDEOGRAPH
+ 0xCFC4: 0x72E6, //CJK UNIFIED IDEOGRAPH
+ 0xCFC5: 0x72E3, //CJK UNIFIED IDEOGRAPH
+ 0xCFC6: 0x7385, //CJK UNIFIED IDEOGRAPH
+ 0xCFC7: 0x73CC, //CJK UNIFIED IDEOGRAPH
+ 0xCFC8: 0x73C2, //CJK UNIFIED IDEOGRAPH
+ 0xCFC9: 0x73C8, //CJK UNIFIED IDEOGRAPH
+ 0xCFCA: 0x73C5, //CJK UNIFIED IDEOGRAPH
+ 0xCFCB: 0x73B9, //CJK UNIFIED IDEOGRAPH
+ 0xCFCC: 0x73B6, //CJK UNIFIED IDEOGRAPH
+ 0xCFCD: 0x73B5, //CJK UNIFIED IDEOGRAPH
+ 0xCFCE: 0x73B4, //CJK UNIFIED IDEOGRAPH
+ 0xCFCF: 0x73EB, //CJK UNIFIED IDEOGRAPH
+ 0xCFD0: 0x73BF, //CJK UNIFIED IDEOGRAPH
+ 0xCFD1: 0x73C7, //CJK UNIFIED IDEOGRAPH
+ 0xCFD2: 0x73BE, //CJK UNIFIED IDEOGRAPH
+ 0xCFD3: 0x73C3, //CJK UNIFIED IDEOGRAPH
+ 0xCFD4: 0x73C6, //CJK UNIFIED IDEOGRAPH
+ 0xCFD5: 0x73B8, //CJK UNIFIED IDEOGRAPH
+ 0xCFD6: 0x73CB, //CJK UNIFIED IDEOGRAPH
+ 0xCFD7: 0x74EC, //CJK UNIFIED IDEOGRAPH
+ 0xCFD8: 0x74EE, //CJK UNIFIED IDEOGRAPH
+ 0xCFD9: 0x752E, //CJK UNIFIED IDEOGRAPH
+ 0xCFDA: 0x7547, //CJK UNIFIED IDEOGRAPH
+ 0xCFDB: 0x7548, //CJK UNIFIED IDEOGRAPH
+ 0xCFDC: 0x75A7, //CJK UNIFIED IDEOGRAPH
+ 0xCFDD: 0x75AA, //CJK UNIFIED IDEOGRAPH
+ 0xCFDE: 0x7679, //CJK UNIFIED IDEOGRAPH
+ 0xCFDF: 0x76C4, //CJK UNIFIED IDEOGRAPH
+ 0xCFE0: 0x7708, //CJK UNIFIED IDEOGRAPH
+ 0xCFE1: 0x7703, //CJK UNIFIED IDEOGRAPH
+ 0xCFE2: 0x7704, //CJK UNIFIED IDEOGRAPH
+ 0xCFE3: 0x7705, //CJK UNIFIED IDEOGRAPH
+ 0xCFE4: 0x770A, //CJK UNIFIED IDEOGRAPH
+ 0xCFE5: 0x76F7, //CJK UNIFIED IDEOGRAPH
+ 0xCFE6: 0x76FB, //CJK UNIFIED IDEOGRAPH
+ 0xCFE7: 0x76FA, //CJK UNIFIED IDEOGRAPH
+ 0xCFE8: 0x77E7, //CJK UNIFIED IDEOGRAPH
+ 0xCFE9: 0x77E8, //CJK UNIFIED IDEOGRAPH
+ 0xCFEA: 0x7806, //CJK UNIFIED IDEOGRAPH
+ 0xCFEB: 0x7811, //CJK UNIFIED IDEOGRAPH
+ 0xCFEC: 0x7812, //CJK UNIFIED IDEOGRAPH
+ 0xCFED: 0x7805, //CJK UNIFIED IDEOGRAPH
+ 0xCFEE: 0x7810, //CJK UNIFIED IDEOGRAPH
+ 0xCFEF: 0x780F, //CJK UNIFIED IDEOGRAPH
+ 0xCFF0: 0x780E, //CJK UNIFIED IDEOGRAPH
+ 0xCFF1: 0x7809, //CJK UNIFIED IDEOGRAPH
+ 0xCFF2: 0x7803, //CJK UNIFIED IDEOGRAPH
+ 0xCFF3: 0x7813, //CJK UNIFIED IDEOGRAPH
+ 0xCFF4: 0x794A, //CJK UNIFIED IDEOGRAPH
+ 0xCFF5: 0x794C, //CJK UNIFIED IDEOGRAPH
+ 0xCFF6: 0x794B, //CJK UNIFIED IDEOGRAPH
+ 0xCFF7: 0x7945, //CJK UNIFIED IDEOGRAPH
+ 0xCFF8: 0x7944, //CJK UNIFIED IDEOGRAPH
+ 0xCFF9: 0x79D5, //CJK UNIFIED IDEOGRAPH
+ 0xCFFA: 0x79CD, //CJK UNIFIED IDEOGRAPH
+ 0xCFFB: 0x79CF, //CJK UNIFIED IDEOGRAPH
+ 0xCFFC: 0x79D6, //CJK UNIFIED IDEOGRAPH
+ 0xCFFD: 0x79CE, //CJK UNIFIED IDEOGRAPH
+ 0xCFFE: 0x7A80, //CJK UNIFIED IDEOGRAPH
+ 0xD040: 0x7A7E, //CJK UNIFIED IDEOGRAPH
+ 0xD041: 0x7AD1, //CJK UNIFIED IDEOGRAPH
+ 0xD042: 0x7B00, //CJK UNIFIED IDEOGRAPH
+ 0xD043: 0x7B01, //CJK UNIFIED IDEOGRAPH
+ 0xD044: 0x7C7A, //CJK UNIFIED IDEOGRAPH
+ 0xD045: 0x7C78, //CJK UNIFIED IDEOGRAPH
+ 0xD046: 0x7C79, //CJK UNIFIED IDEOGRAPH
+ 0xD047: 0x7C7F, //CJK UNIFIED IDEOGRAPH
+ 0xD048: 0x7C80, //CJK UNIFIED IDEOGRAPH
+ 0xD049: 0x7C81, //CJK UNIFIED IDEOGRAPH
+ 0xD04A: 0x7D03, //CJK UNIFIED IDEOGRAPH
+ 0xD04B: 0x7D08, //CJK UNIFIED IDEOGRAPH
+ 0xD04C: 0x7D01, //CJK UNIFIED IDEOGRAPH
+ 0xD04D: 0x7F58, //CJK UNIFIED IDEOGRAPH
+ 0xD04E: 0x7F91, //CJK UNIFIED IDEOGRAPH
+ 0xD04F: 0x7F8D, //CJK UNIFIED IDEOGRAPH
+ 0xD050: 0x7FBE, //CJK UNIFIED IDEOGRAPH
+ 0xD051: 0x8007, //CJK UNIFIED IDEOGRAPH
+ 0xD052: 0x800E, //CJK UNIFIED IDEOGRAPH
+ 0xD053: 0x800F, //CJK UNIFIED IDEOGRAPH
+ 0xD054: 0x8014, //CJK UNIFIED IDEOGRAPH
+ 0xD055: 0x8037, //CJK UNIFIED IDEOGRAPH
+ 0xD056: 0x80D8, //CJK UNIFIED IDEOGRAPH
+ 0xD057: 0x80C7, //CJK UNIFIED IDEOGRAPH
+ 0xD058: 0x80E0, //CJK UNIFIED IDEOGRAPH
+ 0xD059: 0x80D1, //CJK UNIFIED IDEOGRAPH
+ 0xD05A: 0x80C8, //CJK UNIFIED IDEOGRAPH
+ 0xD05B: 0x80C2, //CJK UNIFIED IDEOGRAPH
+ 0xD05C: 0x80D0, //CJK UNIFIED IDEOGRAPH
+ 0xD05D: 0x80C5, //CJK UNIFIED IDEOGRAPH
+ 0xD05E: 0x80E3, //CJK UNIFIED IDEOGRAPH
+ 0xD05F: 0x80D9, //CJK UNIFIED IDEOGRAPH
+ 0xD060: 0x80DC, //CJK UNIFIED IDEOGRAPH
+ 0xD061: 0x80CA, //CJK UNIFIED IDEOGRAPH
+ 0xD062: 0x80D5, //CJK UNIFIED IDEOGRAPH
+ 0xD063: 0x80C9, //CJK UNIFIED IDEOGRAPH
+ 0xD064: 0x80CF, //CJK UNIFIED IDEOGRAPH
+ 0xD065: 0x80D7, //CJK UNIFIED IDEOGRAPH
+ 0xD066: 0x80E6, //CJK UNIFIED IDEOGRAPH
+ 0xD067: 0x80CD, //CJK UNIFIED IDEOGRAPH
+ 0xD068: 0x81FF, //CJK UNIFIED IDEOGRAPH
+ 0xD069: 0x8221, //CJK UNIFIED IDEOGRAPH
+ 0xD06A: 0x8294, //CJK UNIFIED IDEOGRAPH
+ 0xD06B: 0x82D9, //CJK UNIFIED IDEOGRAPH
+ 0xD06C: 0x82FE, //CJK UNIFIED IDEOGRAPH
+ 0xD06D: 0x82F9, //CJK UNIFIED IDEOGRAPH
+ 0xD06E: 0x8307, //CJK UNIFIED IDEOGRAPH
+ 0xD06F: 0x82E8, //CJK UNIFIED IDEOGRAPH
+ 0xD070: 0x8300, //CJK UNIFIED IDEOGRAPH
+ 0xD071: 0x82D5, //CJK UNIFIED IDEOGRAPH
+ 0xD072: 0x833A, //CJK UNIFIED IDEOGRAPH
+ 0xD073: 0x82EB, //CJK UNIFIED IDEOGRAPH
+ 0xD074: 0x82D6, //CJK UNIFIED IDEOGRAPH
+ 0xD075: 0x82F4, //CJK UNIFIED IDEOGRAPH
+ 0xD076: 0x82EC, //CJK UNIFIED IDEOGRAPH
+ 0xD077: 0x82E1, //CJK UNIFIED IDEOGRAPH
+ 0xD078: 0x82F2, //CJK UNIFIED IDEOGRAPH
+ 0xD079: 0x82F5, //CJK UNIFIED IDEOGRAPH
+ 0xD07A: 0x830C, //CJK UNIFIED IDEOGRAPH
+ 0xD07B: 0x82FB, //CJK UNIFIED IDEOGRAPH
+ 0xD07C: 0x82F6, //CJK UNIFIED IDEOGRAPH
+ 0xD07D: 0x82F0, //CJK UNIFIED IDEOGRAPH
+ 0xD07E: 0x82EA, //CJK UNIFIED IDEOGRAPH
+ 0xD0A1: 0x82E4, //CJK UNIFIED IDEOGRAPH
+ 0xD0A2: 0x82E0, //CJK UNIFIED IDEOGRAPH
+ 0xD0A3: 0x82FA, //CJK UNIFIED IDEOGRAPH
+ 0xD0A4: 0x82F3, //CJK UNIFIED IDEOGRAPH
+ 0xD0A5: 0x82ED, //CJK UNIFIED IDEOGRAPH
+ 0xD0A6: 0x8677, //CJK UNIFIED IDEOGRAPH
+ 0xD0A7: 0x8674, //CJK UNIFIED IDEOGRAPH
+ 0xD0A8: 0x867C, //CJK UNIFIED IDEOGRAPH
+ 0xD0A9: 0x8673, //CJK UNIFIED IDEOGRAPH
+ 0xD0AA: 0x8841, //CJK UNIFIED IDEOGRAPH
+ 0xD0AB: 0x884E, //CJK UNIFIED IDEOGRAPH
+ 0xD0AC: 0x8867, //CJK UNIFIED IDEOGRAPH
+ 0xD0AD: 0x886A, //CJK UNIFIED IDEOGRAPH
+ 0xD0AE: 0x8869, //CJK UNIFIED IDEOGRAPH
+ 0xD0AF: 0x89D3, //CJK UNIFIED IDEOGRAPH
+ 0xD0B0: 0x8A04, //CJK UNIFIED IDEOGRAPH
+ 0xD0B1: 0x8A07, //CJK UNIFIED IDEOGRAPH
+ 0xD0B2: 0x8D72, //CJK UNIFIED IDEOGRAPH
+ 0xD0B3: 0x8FE3, //CJK UNIFIED IDEOGRAPH
+ 0xD0B4: 0x8FE1, //CJK UNIFIED IDEOGRAPH
+ 0xD0B5: 0x8FEE, //CJK UNIFIED IDEOGRAPH
+ 0xD0B6: 0x8FE0, //CJK UNIFIED IDEOGRAPH
+ 0xD0B7: 0x90F1, //CJK UNIFIED IDEOGRAPH
+ 0xD0B8: 0x90BD, //CJK UNIFIED IDEOGRAPH
+ 0xD0B9: 0x90BF, //CJK UNIFIED IDEOGRAPH
+ 0xD0BA: 0x90D5, //CJK UNIFIED IDEOGRAPH
+ 0xD0BB: 0x90C5, //CJK UNIFIED IDEOGRAPH
+ 0xD0BC: 0x90BE, //CJK UNIFIED IDEOGRAPH
+ 0xD0BD: 0x90C7, //CJK UNIFIED IDEOGRAPH
+ 0xD0BE: 0x90CB, //CJK UNIFIED IDEOGRAPH
+ 0xD0BF: 0x90C8, //CJK UNIFIED IDEOGRAPH
+ 0xD0C0: 0x91D4, //CJK UNIFIED IDEOGRAPH
+ 0xD0C1: 0x91D3, //CJK UNIFIED IDEOGRAPH
+ 0xD0C2: 0x9654, //CJK UNIFIED IDEOGRAPH
+ 0xD0C3: 0x964F, //CJK UNIFIED IDEOGRAPH
+ 0xD0C4: 0x9651, //CJK UNIFIED IDEOGRAPH
+ 0xD0C5: 0x9653, //CJK UNIFIED IDEOGRAPH
+ 0xD0C6: 0x964A, //CJK UNIFIED IDEOGRAPH
+ 0xD0C7: 0x964E, //CJK UNIFIED IDEOGRAPH
+ 0xD0C8: 0x501E, //CJK UNIFIED IDEOGRAPH
+ 0xD0C9: 0x5005, //CJK UNIFIED IDEOGRAPH
+ 0xD0CA: 0x5007, //CJK UNIFIED IDEOGRAPH
+ 0xD0CB: 0x5013, //CJK UNIFIED IDEOGRAPH
+ 0xD0CC: 0x5022, //CJK UNIFIED IDEOGRAPH
+ 0xD0CD: 0x5030, //CJK UNIFIED IDEOGRAPH
+ 0xD0CE: 0x501B, //CJK UNIFIED IDEOGRAPH
+ 0xD0CF: 0x4FF5, //CJK UNIFIED IDEOGRAPH
+ 0xD0D0: 0x4FF4, //CJK UNIFIED IDEOGRAPH
+ 0xD0D1: 0x5033, //CJK UNIFIED IDEOGRAPH
+ 0xD0D2: 0x5037, //CJK UNIFIED IDEOGRAPH
+ 0xD0D3: 0x502C, //CJK UNIFIED IDEOGRAPH
+ 0xD0D4: 0x4FF6, //CJK UNIFIED IDEOGRAPH
+ 0xD0D5: 0x4FF7, //CJK UNIFIED IDEOGRAPH
+ 0xD0D6: 0x5017, //CJK UNIFIED IDEOGRAPH
+ 0xD0D7: 0x501C, //CJK UNIFIED IDEOGRAPH
+ 0xD0D8: 0x5020, //CJK UNIFIED IDEOGRAPH
+ 0xD0D9: 0x5027, //CJK UNIFIED IDEOGRAPH
+ 0xD0DA: 0x5035, //CJK UNIFIED IDEOGRAPH
+ 0xD0DB: 0x502F, //CJK UNIFIED IDEOGRAPH
+ 0xD0DC: 0x5031, //CJK UNIFIED IDEOGRAPH
+ 0xD0DD: 0x500E, //CJK UNIFIED IDEOGRAPH
+ 0xD0DE: 0x515A, //CJK UNIFIED IDEOGRAPH
+ 0xD0DF: 0x5194, //CJK UNIFIED IDEOGRAPH
+ 0xD0E0: 0x5193, //CJK UNIFIED IDEOGRAPH
+ 0xD0E1: 0x51CA, //CJK UNIFIED IDEOGRAPH
+ 0xD0E2: 0x51C4, //CJK UNIFIED IDEOGRAPH
+ 0xD0E3: 0x51C5, //CJK UNIFIED IDEOGRAPH
+ 0xD0E4: 0x51C8, //CJK UNIFIED IDEOGRAPH
+ 0xD0E5: 0x51CE, //CJK UNIFIED IDEOGRAPH
+ 0xD0E6: 0x5261, //CJK UNIFIED IDEOGRAPH
+ 0xD0E7: 0x525A, //CJK UNIFIED IDEOGRAPH
+ 0xD0E8: 0x5252, //CJK UNIFIED IDEOGRAPH
+ 0xD0E9: 0x525E, //CJK UNIFIED IDEOGRAPH
+ 0xD0EA: 0x525F, //CJK UNIFIED IDEOGRAPH
+ 0xD0EB: 0x5255, //CJK UNIFIED IDEOGRAPH
+ 0xD0EC: 0x5262, //CJK UNIFIED IDEOGRAPH
+ 0xD0ED: 0x52CD, //CJK UNIFIED IDEOGRAPH
+ 0xD0EE: 0x530E, //CJK UNIFIED IDEOGRAPH
+ 0xD0EF: 0x539E, //CJK UNIFIED IDEOGRAPH
+ 0xD0F0: 0x5526, //CJK UNIFIED IDEOGRAPH
+ 0xD0F1: 0x54E2, //CJK UNIFIED IDEOGRAPH
+ 0xD0F2: 0x5517, //CJK UNIFIED IDEOGRAPH
+ 0xD0F3: 0x5512, //CJK UNIFIED IDEOGRAPH
+ 0xD0F4: 0x54E7, //CJK UNIFIED IDEOGRAPH
+ 0xD0F5: 0x54F3, //CJK UNIFIED IDEOGRAPH
+ 0xD0F6: 0x54E4, //CJK UNIFIED IDEOGRAPH
+ 0xD0F7: 0x551A, //CJK UNIFIED IDEOGRAPH
+ 0xD0F8: 0x54FF, //CJK UNIFIED IDEOGRAPH
+ 0xD0F9: 0x5504, //CJK UNIFIED IDEOGRAPH
+ 0xD0FA: 0x5508, //CJK UNIFIED IDEOGRAPH
+ 0xD0FB: 0x54EB, //CJK UNIFIED IDEOGRAPH
+ 0xD0FC: 0x5511, //CJK UNIFIED IDEOGRAPH
+ 0xD0FD: 0x5505, //CJK UNIFIED IDEOGRAPH
+ 0xD0FE: 0x54F1, //CJK UNIFIED IDEOGRAPH
+ 0xD140: 0x550A, //CJK UNIFIED IDEOGRAPH
+ 0xD141: 0x54FB, //CJK UNIFIED IDEOGRAPH
+ 0xD142: 0x54F7, //CJK UNIFIED IDEOGRAPH
+ 0xD143: 0x54F8, //CJK UNIFIED IDEOGRAPH
+ 0xD144: 0x54E0, //CJK UNIFIED IDEOGRAPH
+ 0xD145: 0x550E, //CJK UNIFIED IDEOGRAPH
+ 0xD146: 0x5503, //CJK UNIFIED IDEOGRAPH
+ 0xD147: 0x550B, //CJK UNIFIED IDEOGRAPH
+ 0xD148: 0x5701, //CJK UNIFIED IDEOGRAPH
+ 0xD149: 0x5702, //CJK UNIFIED IDEOGRAPH
+ 0xD14A: 0x57CC, //CJK UNIFIED IDEOGRAPH
+ 0xD14B: 0x5832, //CJK UNIFIED IDEOGRAPH
+ 0xD14C: 0x57D5, //CJK UNIFIED IDEOGRAPH
+ 0xD14D: 0x57D2, //CJK UNIFIED IDEOGRAPH
+ 0xD14E: 0x57BA, //CJK UNIFIED IDEOGRAPH
+ 0xD14F: 0x57C6, //CJK UNIFIED IDEOGRAPH
+ 0xD150: 0x57BD, //CJK UNIFIED IDEOGRAPH
+ 0xD151: 0x57BC, //CJK UNIFIED IDEOGRAPH
+ 0xD152: 0x57B8, //CJK UNIFIED IDEOGRAPH
+ 0xD153: 0x57B6, //CJK UNIFIED IDEOGRAPH
+ 0xD154: 0x57BF, //CJK UNIFIED IDEOGRAPH
+ 0xD155: 0x57C7, //CJK UNIFIED IDEOGRAPH
+ 0xD156: 0x57D0, //CJK UNIFIED IDEOGRAPH
+ 0xD157: 0x57B9, //CJK UNIFIED IDEOGRAPH
+ 0xD158: 0x57C1, //CJK UNIFIED IDEOGRAPH
+ 0xD159: 0x590E, //CJK UNIFIED IDEOGRAPH
+ 0xD15A: 0x594A, //CJK UNIFIED IDEOGRAPH
+ 0xD15B: 0x5A19, //CJK UNIFIED IDEOGRAPH
+ 0xD15C: 0x5A16, //CJK UNIFIED IDEOGRAPH
+ 0xD15D: 0x5A2D, //CJK UNIFIED IDEOGRAPH
+ 0xD15E: 0x5A2E, //CJK UNIFIED IDEOGRAPH
+ 0xD15F: 0x5A15, //CJK UNIFIED IDEOGRAPH
+ 0xD160: 0x5A0F, //CJK UNIFIED IDEOGRAPH
+ 0xD161: 0x5A17, //CJK UNIFIED IDEOGRAPH
+ 0xD162: 0x5A0A, //CJK UNIFIED IDEOGRAPH
+ 0xD163: 0x5A1E, //CJK UNIFIED IDEOGRAPH
+ 0xD164: 0x5A33, //CJK UNIFIED IDEOGRAPH
+ 0xD165: 0x5B6C, //CJK UNIFIED IDEOGRAPH
+ 0xD166: 0x5BA7, //CJK UNIFIED IDEOGRAPH
+ 0xD167: 0x5BAD, //CJK UNIFIED IDEOGRAPH
+ 0xD168: 0x5BAC, //CJK UNIFIED IDEOGRAPH
+ 0xD169: 0x5C03, //CJK UNIFIED IDEOGRAPH
+ 0xD16A: 0x5C56, //CJK UNIFIED IDEOGRAPH
+ 0xD16B: 0x5C54, //CJK UNIFIED IDEOGRAPH
+ 0xD16C: 0x5CEC, //CJK UNIFIED IDEOGRAPH
+ 0xD16D: 0x5CFF, //CJK UNIFIED IDEOGRAPH
+ 0xD16E: 0x5CEE, //CJK UNIFIED IDEOGRAPH
+ 0xD16F: 0x5CF1, //CJK UNIFIED IDEOGRAPH
+ 0xD170: 0x5CF7, //CJK UNIFIED IDEOGRAPH
+ 0xD171: 0x5D00, //CJK UNIFIED IDEOGRAPH
+ 0xD172: 0x5CF9, //CJK UNIFIED IDEOGRAPH
+ 0xD173: 0x5E29, //CJK UNIFIED IDEOGRAPH
+ 0xD174: 0x5E28, //CJK UNIFIED IDEOGRAPH
+ 0xD175: 0x5EA8, //CJK UNIFIED IDEOGRAPH
+ 0xD176: 0x5EAE, //CJK UNIFIED IDEOGRAPH
+ 0xD177: 0x5EAA, //CJK UNIFIED IDEOGRAPH
+ 0xD178: 0x5EAC, //CJK UNIFIED IDEOGRAPH
+ 0xD179: 0x5F33, //CJK UNIFIED IDEOGRAPH
+ 0xD17A: 0x5F30, //CJK UNIFIED IDEOGRAPH
+ 0xD17B: 0x5F67, //CJK UNIFIED IDEOGRAPH
+ 0xD17C: 0x605D, //CJK UNIFIED IDEOGRAPH
+ 0xD17D: 0x605A, //CJK UNIFIED IDEOGRAPH
+ 0xD17E: 0x6067, //CJK UNIFIED IDEOGRAPH
+ 0xD1A1: 0x6041, //CJK UNIFIED IDEOGRAPH
+ 0xD1A2: 0x60A2, //CJK UNIFIED IDEOGRAPH
+ 0xD1A3: 0x6088, //CJK UNIFIED IDEOGRAPH
+ 0xD1A4: 0x6080, //CJK UNIFIED IDEOGRAPH
+ 0xD1A5: 0x6092, //CJK UNIFIED IDEOGRAPH
+ 0xD1A6: 0x6081, //CJK UNIFIED IDEOGRAPH
+ 0xD1A7: 0x609D, //CJK UNIFIED IDEOGRAPH
+ 0xD1A8: 0x6083, //CJK UNIFIED IDEOGRAPH
+ 0xD1A9: 0x6095, //CJK UNIFIED IDEOGRAPH
+ 0xD1AA: 0x609B, //CJK UNIFIED IDEOGRAPH
+ 0xD1AB: 0x6097, //CJK UNIFIED IDEOGRAPH
+ 0xD1AC: 0x6087, //CJK UNIFIED IDEOGRAPH
+ 0xD1AD: 0x609C, //CJK UNIFIED IDEOGRAPH
+ 0xD1AE: 0x608E, //CJK UNIFIED IDEOGRAPH
+ 0xD1AF: 0x6219, //CJK UNIFIED IDEOGRAPH
+ 0xD1B0: 0x6246, //CJK UNIFIED IDEOGRAPH
+ 0xD1B1: 0x62F2, //CJK UNIFIED IDEOGRAPH
+ 0xD1B2: 0x6310, //CJK UNIFIED IDEOGRAPH
+ 0xD1B3: 0x6356, //CJK UNIFIED IDEOGRAPH
+ 0xD1B4: 0x632C, //CJK UNIFIED IDEOGRAPH
+ 0xD1B5: 0x6344, //CJK UNIFIED IDEOGRAPH
+ 0xD1B6: 0x6345, //CJK UNIFIED IDEOGRAPH
+ 0xD1B7: 0x6336, //CJK UNIFIED IDEOGRAPH
+ 0xD1B8: 0x6343, //CJK UNIFIED IDEOGRAPH
+ 0xD1B9: 0x63E4, //CJK UNIFIED IDEOGRAPH
+ 0xD1BA: 0x6339, //CJK UNIFIED IDEOGRAPH
+ 0xD1BB: 0x634B, //CJK UNIFIED IDEOGRAPH
+ 0xD1BC: 0x634A, //CJK UNIFIED IDEOGRAPH
+ 0xD1BD: 0x633C, //CJK UNIFIED IDEOGRAPH
+ 0xD1BE: 0x6329, //CJK UNIFIED IDEOGRAPH
+ 0xD1BF: 0x6341, //CJK UNIFIED IDEOGRAPH
+ 0xD1C0: 0x6334, //CJK UNIFIED IDEOGRAPH
+ 0xD1C1: 0x6358, //CJK UNIFIED IDEOGRAPH
+ 0xD1C2: 0x6354, //CJK UNIFIED IDEOGRAPH
+ 0xD1C3: 0x6359, //CJK UNIFIED IDEOGRAPH
+ 0xD1C4: 0x632D, //CJK UNIFIED IDEOGRAPH
+ 0xD1C5: 0x6347, //CJK UNIFIED IDEOGRAPH
+ 0xD1C6: 0x6333, //CJK UNIFIED IDEOGRAPH
+ 0xD1C7: 0x635A, //CJK UNIFIED IDEOGRAPH
+ 0xD1C8: 0x6351, //CJK UNIFIED IDEOGRAPH
+ 0xD1C9: 0x6338, //CJK UNIFIED IDEOGRAPH
+ 0xD1CA: 0x6357, //CJK UNIFIED IDEOGRAPH
+ 0xD1CB: 0x6340, //CJK UNIFIED IDEOGRAPH
+ 0xD1CC: 0x6348, //CJK UNIFIED IDEOGRAPH
+ 0xD1CD: 0x654A, //CJK UNIFIED IDEOGRAPH
+ 0xD1CE: 0x6546, //CJK UNIFIED IDEOGRAPH
+ 0xD1CF: 0x65C6, //CJK UNIFIED IDEOGRAPH
+ 0xD1D0: 0x65C3, //CJK UNIFIED IDEOGRAPH
+ 0xD1D1: 0x65C4, //CJK UNIFIED IDEOGRAPH
+ 0xD1D2: 0x65C2, //CJK UNIFIED IDEOGRAPH
+ 0xD1D3: 0x664A, //CJK UNIFIED IDEOGRAPH
+ 0xD1D4: 0x665F, //CJK UNIFIED IDEOGRAPH
+ 0xD1D5: 0x6647, //CJK UNIFIED IDEOGRAPH
+ 0xD1D6: 0x6651, //CJK UNIFIED IDEOGRAPH
+ 0xD1D7: 0x6712, //CJK UNIFIED IDEOGRAPH
+ 0xD1D8: 0x6713, //CJK UNIFIED IDEOGRAPH
+ 0xD1D9: 0x681F, //CJK UNIFIED IDEOGRAPH
+ 0xD1DA: 0x681A, //CJK UNIFIED IDEOGRAPH
+ 0xD1DB: 0x6849, //CJK UNIFIED IDEOGRAPH
+ 0xD1DC: 0x6832, //CJK UNIFIED IDEOGRAPH
+ 0xD1DD: 0x6833, //CJK UNIFIED IDEOGRAPH
+ 0xD1DE: 0x683B, //CJK UNIFIED IDEOGRAPH
+ 0xD1DF: 0x684B, //CJK UNIFIED IDEOGRAPH
+ 0xD1E0: 0x684F, //CJK UNIFIED IDEOGRAPH
+ 0xD1E1: 0x6816, //CJK UNIFIED IDEOGRAPH
+ 0xD1E2: 0x6831, //CJK UNIFIED IDEOGRAPH
+ 0xD1E3: 0x681C, //CJK UNIFIED IDEOGRAPH
+ 0xD1E4: 0x6835, //CJK UNIFIED IDEOGRAPH
+ 0xD1E5: 0x682B, //CJK UNIFIED IDEOGRAPH
+ 0xD1E6: 0x682D, //CJK UNIFIED IDEOGRAPH
+ 0xD1E7: 0x682F, //CJK UNIFIED IDEOGRAPH
+ 0xD1E8: 0x684E, //CJK UNIFIED IDEOGRAPH
+ 0xD1E9: 0x6844, //CJK UNIFIED IDEOGRAPH
+ 0xD1EA: 0x6834, //CJK UNIFIED IDEOGRAPH
+ 0xD1EB: 0x681D, //CJK UNIFIED IDEOGRAPH
+ 0xD1EC: 0x6812, //CJK UNIFIED IDEOGRAPH
+ 0xD1ED: 0x6814, //CJK UNIFIED IDEOGRAPH
+ 0xD1EE: 0x6826, //CJK UNIFIED IDEOGRAPH
+ 0xD1EF: 0x6828, //CJK UNIFIED IDEOGRAPH
+ 0xD1F0: 0x682E, //CJK UNIFIED IDEOGRAPH
+ 0xD1F1: 0x684D, //CJK UNIFIED IDEOGRAPH
+ 0xD1F2: 0x683A, //CJK UNIFIED IDEOGRAPH
+ 0xD1F3: 0x6825, //CJK UNIFIED IDEOGRAPH
+ 0xD1F4: 0x6820, //CJK UNIFIED IDEOGRAPH
+ 0xD1F5: 0x6B2C, //CJK UNIFIED IDEOGRAPH
+ 0xD1F6: 0x6B2F, //CJK UNIFIED IDEOGRAPH
+ 0xD1F7: 0x6B2D, //CJK UNIFIED IDEOGRAPH
+ 0xD1F8: 0x6B31, //CJK UNIFIED IDEOGRAPH
+ 0xD1F9: 0x6B34, //CJK UNIFIED IDEOGRAPH
+ 0xD1FA: 0x6B6D, //CJK UNIFIED IDEOGRAPH
+ 0xD1FB: 0x8082, //CJK UNIFIED IDEOGRAPH
+ 0xD1FC: 0x6B88, //CJK UNIFIED IDEOGRAPH
+ 0xD1FD: 0x6BE6, //CJK UNIFIED IDEOGRAPH
+ 0xD1FE: 0x6BE4, //CJK UNIFIED IDEOGRAPH
+ 0xD240: 0x6BE8, //CJK UNIFIED IDEOGRAPH
+ 0xD241: 0x6BE3, //CJK UNIFIED IDEOGRAPH
+ 0xD242: 0x6BE2, //CJK UNIFIED IDEOGRAPH
+ 0xD243: 0x6BE7, //CJK UNIFIED IDEOGRAPH
+ 0xD244: 0x6C25, //CJK UNIFIED IDEOGRAPH
+ 0xD245: 0x6D7A, //CJK UNIFIED IDEOGRAPH
+ 0xD246: 0x6D63, //CJK UNIFIED IDEOGRAPH
+ 0xD247: 0x6D64, //CJK UNIFIED IDEOGRAPH
+ 0xD248: 0x6D76, //CJK UNIFIED IDEOGRAPH
+ 0xD249: 0x6D0D, //CJK UNIFIED IDEOGRAPH
+ 0xD24A: 0x6D61, //CJK UNIFIED IDEOGRAPH
+ 0xD24B: 0x6D92, //CJK UNIFIED IDEOGRAPH
+ 0xD24C: 0x6D58, //CJK UNIFIED IDEOGRAPH
+ 0xD24D: 0x6D62, //CJK UNIFIED IDEOGRAPH
+ 0xD24E: 0x6D6D, //CJK UNIFIED IDEOGRAPH
+ 0xD24F: 0x6D6F, //CJK UNIFIED IDEOGRAPH
+ 0xD250: 0x6D91, //CJK UNIFIED IDEOGRAPH
+ 0xD251: 0x6D8D, //CJK UNIFIED IDEOGRAPH
+ 0xD252: 0x6DEF, //CJK UNIFIED IDEOGRAPH
+ 0xD253: 0x6D7F, //CJK UNIFIED IDEOGRAPH
+ 0xD254: 0x6D86, //CJK UNIFIED IDEOGRAPH
+ 0xD255: 0x6D5E, //CJK UNIFIED IDEOGRAPH
+ 0xD256: 0x6D67, //CJK UNIFIED IDEOGRAPH
+ 0xD257: 0x6D60, //CJK UNIFIED IDEOGRAPH
+ 0xD258: 0x6D97, //CJK UNIFIED IDEOGRAPH
+ 0xD259: 0x6D70, //CJK UNIFIED IDEOGRAPH
+ 0xD25A: 0x6D7C, //CJK UNIFIED IDEOGRAPH
+ 0xD25B: 0x6D5F, //CJK UNIFIED IDEOGRAPH
+ 0xD25C: 0x6D82, //CJK UNIFIED IDEOGRAPH
+ 0xD25D: 0x6D98, //CJK UNIFIED IDEOGRAPH
+ 0xD25E: 0x6D2F, //CJK UNIFIED IDEOGRAPH
+ 0xD25F: 0x6D68, //CJK UNIFIED IDEOGRAPH
+ 0xD260: 0x6D8B, //CJK UNIFIED IDEOGRAPH
+ 0xD261: 0x6D7E, //CJK UNIFIED IDEOGRAPH
+ 0xD262: 0x6D80, //CJK UNIFIED IDEOGRAPH
+ 0xD263: 0x6D84, //CJK UNIFIED IDEOGRAPH
+ 0xD264: 0x6D16, //CJK UNIFIED IDEOGRAPH
+ 0xD265: 0x6D83, //CJK UNIFIED IDEOGRAPH
+ 0xD266: 0x6D7B, //CJK UNIFIED IDEOGRAPH
+ 0xD267: 0x6D7D, //CJK UNIFIED IDEOGRAPH
+ 0xD268: 0x6D75, //CJK UNIFIED IDEOGRAPH
+ 0xD269: 0x6D90, //CJK UNIFIED IDEOGRAPH
+ 0xD26A: 0x70DC, //CJK UNIFIED IDEOGRAPH
+ 0xD26B: 0x70D3, //CJK UNIFIED IDEOGRAPH
+ 0xD26C: 0x70D1, //CJK UNIFIED IDEOGRAPH
+ 0xD26D: 0x70DD, //CJK UNIFIED IDEOGRAPH
+ 0xD26E: 0x70CB, //CJK UNIFIED IDEOGRAPH
+ 0xD26F: 0x7F39, //CJK UNIFIED IDEOGRAPH
+ 0xD270: 0x70E2, //CJK UNIFIED IDEOGRAPH
+ 0xD271: 0x70D7, //CJK UNIFIED IDEOGRAPH
+ 0xD272: 0x70D2, //CJK UNIFIED IDEOGRAPH
+ 0xD273: 0x70DE, //CJK UNIFIED IDEOGRAPH
+ 0xD274: 0x70E0, //CJK UNIFIED IDEOGRAPH
+ 0xD275: 0x70D4, //CJK UNIFIED IDEOGRAPH
+ 0xD276: 0x70CD, //CJK UNIFIED IDEOGRAPH
+ 0xD277: 0x70C5, //CJK UNIFIED IDEOGRAPH
+ 0xD278: 0x70C6, //CJK UNIFIED IDEOGRAPH
+ 0xD279: 0x70C7, //CJK UNIFIED IDEOGRAPH
+ 0xD27A: 0x70DA, //CJK UNIFIED IDEOGRAPH
+ 0xD27B: 0x70CE, //CJK UNIFIED IDEOGRAPH
+ 0xD27C: 0x70E1, //CJK UNIFIED IDEOGRAPH
+ 0xD27D: 0x7242, //CJK UNIFIED IDEOGRAPH
+ 0xD27E: 0x7278, //CJK UNIFIED IDEOGRAPH
+ 0xD2A1: 0x7277, //CJK UNIFIED IDEOGRAPH
+ 0xD2A2: 0x7276, //CJK UNIFIED IDEOGRAPH
+ 0xD2A3: 0x7300, //CJK UNIFIED IDEOGRAPH
+ 0xD2A4: 0x72FA, //CJK UNIFIED IDEOGRAPH
+ 0xD2A5: 0x72F4, //CJK UNIFIED IDEOGRAPH
+ 0xD2A6: 0x72FE, //CJK UNIFIED IDEOGRAPH
+ 0xD2A7: 0x72F6, //CJK UNIFIED IDEOGRAPH
+ 0xD2A8: 0x72F3, //CJK UNIFIED IDEOGRAPH
+ 0xD2A9: 0x72FB, //CJK UNIFIED IDEOGRAPH
+ 0xD2AA: 0x7301, //CJK UNIFIED IDEOGRAPH
+ 0xD2AB: 0x73D3, //CJK UNIFIED IDEOGRAPH
+ 0xD2AC: 0x73D9, //CJK UNIFIED IDEOGRAPH
+ 0xD2AD: 0x73E5, //CJK UNIFIED IDEOGRAPH
+ 0xD2AE: 0x73D6, //CJK UNIFIED IDEOGRAPH
+ 0xD2AF: 0x73BC, //CJK UNIFIED IDEOGRAPH
+ 0xD2B0: 0x73E7, //CJK UNIFIED IDEOGRAPH
+ 0xD2B1: 0x73E3, //CJK UNIFIED IDEOGRAPH
+ 0xD2B2: 0x73E9, //CJK UNIFIED IDEOGRAPH
+ 0xD2B3: 0x73DC, //CJK UNIFIED IDEOGRAPH
+ 0xD2B4: 0x73D2, //CJK UNIFIED IDEOGRAPH
+ 0xD2B5: 0x73DB, //CJK UNIFIED IDEOGRAPH
+ 0xD2B6: 0x73D4, //CJK UNIFIED IDEOGRAPH
+ 0xD2B7: 0x73DD, //CJK UNIFIED IDEOGRAPH
+ 0xD2B8: 0x73DA, //CJK UNIFIED IDEOGRAPH
+ 0xD2B9: 0x73D7, //CJK UNIFIED IDEOGRAPH
+ 0xD2BA: 0x73D8, //CJK UNIFIED IDEOGRAPH
+ 0xD2BB: 0x73E8, //CJK UNIFIED IDEOGRAPH
+ 0xD2BC: 0x74DE, //CJK UNIFIED IDEOGRAPH
+ 0xD2BD: 0x74DF, //CJK UNIFIED IDEOGRAPH
+ 0xD2BE: 0x74F4, //CJK UNIFIED IDEOGRAPH
+ 0xD2BF: 0x74F5, //CJK UNIFIED IDEOGRAPH
+ 0xD2C0: 0x7521, //CJK UNIFIED IDEOGRAPH
+ 0xD2C1: 0x755B, //CJK UNIFIED IDEOGRAPH
+ 0xD2C2: 0x755F, //CJK UNIFIED IDEOGRAPH
+ 0xD2C3: 0x75B0, //CJK UNIFIED IDEOGRAPH
+ 0xD2C4: 0x75C1, //CJK UNIFIED IDEOGRAPH
+ 0xD2C5: 0x75BB, //CJK UNIFIED IDEOGRAPH
+ 0xD2C6: 0x75C4, //CJK UNIFIED IDEOGRAPH
+ 0xD2C7: 0x75C0, //CJK UNIFIED IDEOGRAPH
+ 0xD2C8: 0x75BF, //CJK UNIFIED IDEOGRAPH
+ 0xD2C9: 0x75B6, //CJK UNIFIED IDEOGRAPH
+ 0xD2CA: 0x75BA, //CJK UNIFIED IDEOGRAPH
+ 0xD2CB: 0x768A, //CJK UNIFIED IDEOGRAPH
+ 0xD2CC: 0x76C9, //CJK UNIFIED IDEOGRAPH
+ 0xD2CD: 0x771D, //CJK UNIFIED IDEOGRAPH
+ 0xD2CE: 0x771B, //CJK UNIFIED IDEOGRAPH
+ 0xD2CF: 0x7710, //CJK UNIFIED IDEOGRAPH
+ 0xD2D0: 0x7713, //CJK UNIFIED IDEOGRAPH
+ 0xD2D1: 0x7712, //CJK UNIFIED IDEOGRAPH
+ 0xD2D2: 0x7723, //CJK UNIFIED IDEOGRAPH
+ 0xD2D3: 0x7711, //CJK UNIFIED IDEOGRAPH
+ 0xD2D4: 0x7715, //CJK UNIFIED IDEOGRAPH
+ 0xD2D5: 0x7719, //CJK UNIFIED IDEOGRAPH
+ 0xD2D6: 0x771A, //CJK UNIFIED IDEOGRAPH
+ 0xD2D7: 0x7722, //CJK UNIFIED IDEOGRAPH
+ 0xD2D8: 0x7727, //CJK UNIFIED IDEOGRAPH
+ 0xD2D9: 0x7823, //CJK UNIFIED IDEOGRAPH
+ 0xD2DA: 0x782C, //CJK UNIFIED IDEOGRAPH
+ 0xD2DB: 0x7822, //CJK UNIFIED IDEOGRAPH
+ 0xD2DC: 0x7835, //CJK UNIFIED IDEOGRAPH
+ 0xD2DD: 0x782F, //CJK UNIFIED IDEOGRAPH
+ 0xD2DE: 0x7828, //CJK UNIFIED IDEOGRAPH
+ 0xD2DF: 0x782E, //CJK UNIFIED IDEOGRAPH
+ 0xD2E0: 0x782B, //CJK UNIFIED IDEOGRAPH
+ 0xD2E1: 0x7821, //CJK UNIFIED IDEOGRAPH
+ 0xD2E2: 0x7829, //CJK UNIFIED IDEOGRAPH
+ 0xD2E3: 0x7833, //CJK UNIFIED IDEOGRAPH
+ 0xD2E4: 0x782A, //CJK UNIFIED IDEOGRAPH
+ 0xD2E5: 0x7831, //CJK UNIFIED IDEOGRAPH
+ 0xD2E6: 0x7954, //CJK UNIFIED IDEOGRAPH
+ 0xD2E7: 0x795B, //CJK UNIFIED IDEOGRAPH
+ 0xD2E8: 0x794F, //CJK UNIFIED IDEOGRAPH
+ 0xD2E9: 0x795C, //CJK UNIFIED IDEOGRAPH
+ 0xD2EA: 0x7953, //CJK UNIFIED IDEOGRAPH
+ 0xD2EB: 0x7952, //CJK UNIFIED IDEOGRAPH
+ 0xD2EC: 0x7951, //CJK UNIFIED IDEOGRAPH
+ 0xD2ED: 0x79EB, //CJK UNIFIED IDEOGRAPH
+ 0xD2EE: 0x79EC, //CJK UNIFIED IDEOGRAPH
+ 0xD2EF: 0x79E0, //CJK UNIFIED IDEOGRAPH
+ 0xD2F0: 0x79EE, //CJK UNIFIED IDEOGRAPH
+ 0xD2F1: 0x79ED, //CJK UNIFIED IDEOGRAPH
+ 0xD2F2: 0x79EA, //CJK UNIFIED IDEOGRAPH
+ 0xD2F3: 0x79DC, //CJK UNIFIED IDEOGRAPH
+ 0xD2F4: 0x79DE, //CJK UNIFIED IDEOGRAPH
+ 0xD2F5: 0x79DD, //CJK UNIFIED IDEOGRAPH
+ 0xD2F6: 0x7A86, //CJK UNIFIED IDEOGRAPH
+ 0xD2F7: 0x7A89, //CJK UNIFIED IDEOGRAPH
+ 0xD2F8: 0x7A85, //CJK UNIFIED IDEOGRAPH
+ 0xD2F9: 0x7A8B, //CJK UNIFIED IDEOGRAPH
+ 0xD2FA: 0x7A8C, //CJK UNIFIED IDEOGRAPH
+ 0xD2FB: 0x7A8A, //CJK UNIFIED IDEOGRAPH
+ 0xD2FC: 0x7A87, //CJK UNIFIED IDEOGRAPH
+ 0xD2FD: 0x7AD8, //CJK UNIFIED IDEOGRAPH
+ 0xD2FE: 0x7B10, //CJK UNIFIED IDEOGRAPH
+ 0xD340: 0x7B04, //CJK UNIFIED IDEOGRAPH
+ 0xD341: 0x7B13, //CJK UNIFIED IDEOGRAPH
+ 0xD342: 0x7B05, //CJK UNIFIED IDEOGRAPH
+ 0xD343: 0x7B0F, //CJK UNIFIED IDEOGRAPH
+ 0xD344: 0x7B08, //CJK UNIFIED IDEOGRAPH
+ 0xD345: 0x7B0A, //CJK UNIFIED IDEOGRAPH
+ 0xD346: 0x7B0E, //CJK UNIFIED IDEOGRAPH
+ 0xD347: 0x7B09, //CJK UNIFIED IDEOGRAPH
+ 0xD348: 0x7B12, //CJK UNIFIED IDEOGRAPH
+ 0xD349: 0x7C84, //CJK UNIFIED IDEOGRAPH
+ 0xD34A: 0x7C91, //CJK UNIFIED IDEOGRAPH
+ 0xD34B: 0x7C8A, //CJK UNIFIED IDEOGRAPH
+ 0xD34C: 0x7C8C, //CJK UNIFIED IDEOGRAPH
+ 0xD34D: 0x7C88, //CJK UNIFIED IDEOGRAPH
+ 0xD34E: 0x7C8D, //CJK UNIFIED IDEOGRAPH
+ 0xD34F: 0x7C85, //CJK UNIFIED IDEOGRAPH
+ 0xD350: 0x7D1E, //CJK UNIFIED IDEOGRAPH
+ 0xD351: 0x7D1D, //CJK UNIFIED IDEOGRAPH
+ 0xD352: 0x7D11, //CJK UNIFIED IDEOGRAPH
+ 0xD353: 0x7D0E, //CJK UNIFIED IDEOGRAPH
+ 0xD354: 0x7D18, //CJK UNIFIED IDEOGRAPH
+ 0xD355: 0x7D16, //CJK UNIFIED IDEOGRAPH
+ 0xD356: 0x7D13, //CJK UNIFIED IDEOGRAPH
+ 0xD357: 0x7D1F, //CJK UNIFIED IDEOGRAPH
+ 0xD358: 0x7D12, //CJK UNIFIED IDEOGRAPH
+ 0xD359: 0x7D0F, //CJK UNIFIED IDEOGRAPH
+ 0xD35A: 0x7D0C, //CJK UNIFIED IDEOGRAPH
+ 0xD35B: 0x7F5C, //CJK UNIFIED IDEOGRAPH
+ 0xD35C: 0x7F61, //CJK UNIFIED IDEOGRAPH
+ 0xD35D: 0x7F5E, //CJK UNIFIED IDEOGRAPH
+ 0xD35E: 0x7F60, //CJK UNIFIED IDEOGRAPH
+ 0xD35F: 0x7F5D, //CJK UNIFIED IDEOGRAPH
+ 0xD360: 0x7F5B, //CJK UNIFIED IDEOGRAPH
+ 0xD361: 0x7F96, //CJK UNIFIED IDEOGRAPH
+ 0xD362: 0x7F92, //CJK UNIFIED IDEOGRAPH
+ 0xD363: 0x7FC3, //CJK UNIFIED IDEOGRAPH
+ 0xD364: 0x7FC2, //CJK UNIFIED IDEOGRAPH
+ 0xD365: 0x7FC0, //CJK UNIFIED IDEOGRAPH
+ 0xD366: 0x8016, //CJK UNIFIED IDEOGRAPH
+ 0xD367: 0x803E, //CJK UNIFIED IDEOGRAPH
+ 0xD368: 0x8039, //CJK UNIFIED IDEOGRAPH
+ 0xD369: 0x80FA, //CJK UNIFIED IDEOGRAPH
+ 0xD36A: 0x80F2, //CJK UNIFIED IDEOGRAPH
+ 0xD36B: 0x80F9, //CJK UNIFIED IDEOGRAPH
+ 0xD36C: 0x80F5, //CJK UNIFIED IDEOGRAPH
+ 0xD36D: 0x8101, //CJK UNIFIED IDEOGRAPH
+ 0xD36E: 0x80FB, //CJK UNIFIED IDEOGRAPH
+ 0xD36F: 0x8100, //CJK UNIFIED IDEOGRAPH
+ 0xD370: 0x8201, //CJK UNIFIED IDEOGRAPH
+ 0xD371: 0x822F, //CJK UNIFIED IDEOGRAPH
+ 0xD372: 0x8225, //CJK UNIFIED IDEOGRAPH
+ 0xD373: 0x8333, //CJK UNIFIED IDEOGRAPH
+ 0xD374: 0x832D, //CJK UNIFIED IDEOGRAPH
+ 0xD375: 0x8344, //CJK UNIFIED IDEOGRAPH
+ 0xD376: 0x8319, //CJK UNIFIED IDEOGRAPH
+ 0xD377: 0x8351, //CJK UNIFIED IDEOGRAPH
+ 0xD378: 0x8325, //CJK UNIFIED IDEOGRAPH
+ 0xD379: 0x8356, //CJK UNIFIED IDEOGRAPH
+ 0xD37A: 0x833F, //CJK UNIFIED IDEOGRAPH
+ 0xD37B: 0x8341, //CJK UNIFIED IDEOGRAPH
+ 0xD37C: 0x8326, //CJK UNIFIED IDEOGRAPH
+ 0xD37D: 0x831C, //CJK UNIFIED IDEOGRAPH
+ 0xD37E: 0x8322, //CJK UNIFIED IDEOGRAPH
+ 0xD3A1: 0x8342, //CJK UNIFIED IDEOGRAPH
+ 0xD3A2: 0x834E, //CJK UNIFIED IDEOGRAPH
+ 0xD3A3: 0x831B, //CJK UNIFIED IDEOGRAPH
+ 0xD3A4: 0x832A, //CJK UNIFIED IDEOGRAPH
+ 0xD3A5: 0x8308, //CJK UNIFIED IDEOGRAPH
+ 0xD3A6: 0x833C, //CJK UNIFIED IDEOGRAPH
+ 0xD3A7: 0x834D, //CJK UNIFIED IDEOGRAPH
+ 0xD3A8: 0x8316, //CJK UNIFIED IDEOGRAPH
+ 0xD3A9: 0x8324, //CJK UNIFIED IDEOGRAPH
+ 0xD3AA: 0x8320, //CJK UNIFIED IDEOGRAPH
+ 0xD3AB: 0x8337, //CJK UNIFIED IDEOGRAPH
+ 0xD3AC: 0x832F, //CJK UNIFIED IDEOGRAPH
+ 0xD3AD: 0x8329, //CJK UNIFIED IDEOGRAPH
+ 0xD3AE: 0x8347, //CJK UNIFIED IDEOGRAPH
+ 0xD3AF: 0x8345, //CJK UNIFIED IDEOGRAPH
+ 0xD3B0: 0x834C, //CJK UNIFIED IDEOGRAPH
+ 0xD3B1: 0x8353, //CJK UNIFIED IDEOGRAPH
+ 0xD3B2: 0x831E, //CJK UNIFIED IDEOGRAPH
+ 0xD3B3: 0x832C, //CJK UNIFIED IDEOGRAPH
+ 0xD3B4: 0x834B, //CJK UNIFIED IDEOGRAPH
+ 0xD3B5: 0x8327, //CJK UNIFIED IDEOGRAPH
+ 0xD3B6: 0x8348, //CJK UNIFIED IDEOGRAPH
+ 0xD3B7: 0x8653, //CJK UNIFIED IDEOGRAPH
+ 0xD3B8: 0x8652, //CJK UNIFIED IDEOGRAPH
+ 0xD3B9: 0x86A2, //CJK UNIFIED IDEOGRAPH
+ 0xD3BA: 0x86A8, //CJK UNIFIED IDEOGRAPH
+ 0xD3BB: 0x8696, //CJK UNIFIED IDEOGRAPH
+ 0xD3BC: 0x868D, //CJK UNIFIED IDEOGRAPH
+ 0xD3BD: 0x8691, //CJK UNIFIED IDEOGRAPH
+ 0xD3BE: 0x869E, //CJK UNIFIED IDEOGRAPH
+ 0xD3BF: 0x8687, //CJK UNIFIED IDEOGRAPH
+ 0xD3C0: 0x8697, //CJK UNIFIED IDEOGRAPH
+ 0xD3C1: 0x8686, //CJK UNIFIED IDEOGRAPH
+ 0xD3C2: 0x868B, //CJK UNIFIED IDEOGRAPH
+ 0xD3C3: 0x869A, //CJK UNIFIED IDEOGRAPH
+ 0xD3C4: 0x8685, //CJK UNIFIED IDEOGRAPH
+ 0xD3C5: 0x86A5, //CJK UNIFIED IDEOGRAPH
+ 0xD3C6: 0x8699, //CJK UNIFIED IDEOGRAPH
+ 0xD3C7: 0x86A1, //CJK UNIFIED IDEOGRAPH
+ 0xD3C8: 0x86A7, //CJK UNIFIED IDEOGRAPH
+ 0xD3C9: 0x8695, //CJK UNIFIED IDEOGRAPH
+ 0xD3CA: 0x8698, //CJK UNIFIED IDEOGRAPH
+ 0xD3CB: 0x868E, //CJK UNIFIED IDEOGRAPH
+ 0xD3CC: 0x869D, //CJK UNIFIED IDEOGRAPH
+ 0xD3CD: 0x8690, //CJK UNIFIED IDEOGRAPH
+ 0xD3CE: 0x8694, //CJK UNIFIED IDEOGRAPH
+ 0xD3CF: 0x8843, //CJK UNIFIED IDEOGRAPH
+ 0xD3D0: 0x8844, //CJK UNIFIED IDEOGRAPH
+ 0xD3D1: 0x886D, //CJK UNIFIED IDEOGRAPH
+ 0xD3D2: 0x8875, //CJK UNIFIED IDEOGRAPH
+ 0xD3D3: 0x8876, //CJK UNIFIED IDEOGRAPH
+ 0xD3D4: 0x8872, //CJK UNIFIED IDEOGRAPH
+ 0xD3D5: 0x8880, //CJK UNIFIED IDEOGRAPH
+ 0xD3D6: 0x8871, //CJK UNIFIED IDEOGRAPH
+ 0xD3D7: 0x887F, //CJK UNIFIED IDEOGRAPH
+ 0xD3D8: 0x886F, //CJK UNIFIED IDEOGRAPH
+ 0xD3D9: 0x8883, //CJK UNIFIED IDEOGRAPH
+ 0xD3DA: 0x887E, //CJK UNIFIED IDEOGRAPH
+ 0xD3DB: 0x8874, //CJK UNIFIED IDEOGRAPH
+ 0xD3DC: 0x887C, //CJK UNIFIED IDEOGRAPH
+ 0xD3DD: 0x8A12, //CJK UNIFIED IDEOGRAPH
+ 0xD3DE: 0x8C47, //CJK UNIFIED IDEOGRAPH
+ 0xD3DF: 0x8C57, //CJK UNIFIED IDEOGRAPH
+ 0xD3E0: 0x8C7B, //CJK UNIFIED IDEOGRAPH
+ 0xD3E1: 0x8CA4, //CJK UNIFIED IDEOGRAPH
+ 0xD3E2: 0x8CA3, //CJK UNIFIED IDEOGRAPH
+ 0xD3E3: 0x8D76, //CJK UNIFIED IDEOGRAPH
+ 0xD3E4: 0x8D78, //CJK UNIFIED IDEOGRAPH
+ 0xD3E5: 0x8DB5, //CJK UNIFIED IDEOGRAPH
+ 0xD3E6: 0x8DB7, //CJK UNIFIED IDEOGRAPH
+ 0xD3E7: 0x8DB6, //CJK UNIFIED IDEOGRAPH
+ 0xD3E8: 0x8ED1, //CJK UNIFIED IDEOGRAPH
+ 0xD3E9: 0x8ED3, //CJK UNIFIED IDEOGRAPH
+ 0xD3EA: 0x8FFE, //CJK UNIFIED IDEOGRAPH
+ 0xD3EB: 0x8FF5, //CJK UNIFIED IDEOGRAPH
+ 0xD3EC: 0x9002, //CJK UNIFIED IDEOGRAPH
+ 0xD3ED: 0x8FFF, //CJK UNIFIED IDEOGRAPH
+ 0xD3EE: 0x8FFB, //CJK UNIFIED IDEOGRAPH
+ 0xD3EF: 0x9004, //CJK UNIFIED IDEOGRAPH
+ 0xD3F0: 0x8FFC, //CJK UNIFIED IDEOGRAPH
+ 0xD3F1: 0x8FF6, //CJK UNIFIED IDEOGRAPH
+ 0xD3F2: 0x90D6, //CJK UNIFIED IDEOGRAPH
+ 0xD3F3: 0x90E0, //CJK UNIFIED IDEOGRAPH
+ 0xD3F4: 0x90D9, //CJK UNIFIED IDEOGRAPH
+ 0xD3F5: 0x90DA, //CJK UNIFIED IDEOGRAPH
+ 0xD3F6: 0x90E3, //CJK UNIFIED IDEOGRAPH
+ 0xD3F7: 0x90DF, //CJK UNIFIED IDEOGRAPH
+ 0xD3F8: 0x90E5, //CJK UNIFIED IDEOGRAPH
+ 0xD3F9: 0x90D8, //CJK UNIFIED IDEOGRAPH
+ 0xD3FA: 0x90DB, //CJK UNIFIED IDEOGRAPH
+ 0xD3FB: 0x90D7, //CJK UNIFIED IDEOGRAPH
+ 0xD3FC: 0x90DC, //CJK UNIFIED IDEOGRAPH
+ 0xD3FD: 0x90E4, //CJK UNIFIED IDEOGRAPH
+ 0xD3FE: 0x9150, //CJK UNIFIED IDEOGRAPH
+ 0xD440: 0x914E, //CJK UNIFIED IDEOGRAPH
+ 0xD441: 0x914F, //CJK UNIFIED IDEOGRAPH
+ 0xD442: 0x91D5, //CJK UNIFIED IDEOGRAPH
+ 0xD443: 0x91E2, //CJK UNIFIED IDEOGRAPH
+ 0xD444: 0x91DA, //CJK UNIFIED IDEOGRAPH
+ 0xD445: 0x965C, //CJK UNIFIED IDEOGRAPH
+ 0xD446: 0x965F, //CJK UNIFIED IDEOGRAPH
+ 0xD447: 0x96BC, //CJK UNIFIED IDEOGRAPH
+ 0xD448: 0x98E3, //CJK UNIFIED IDEOGRAPH
+ 0xD449: 0x9ADF, //CJK UNIFIED IDEOGRAPH
+ 0xD44A: 0x9B2F, //CJK UNIFIED IDEOGRAPH
+ 0xD44B: 0x4E7F, //CJK UNIFIED IDEOGRAPH
+ 0xD44C: 0x5070, //CJK UNIFIED IDEOGRAPH
+ 0xD44D: 0x506A, //CJK UNIFIED IDEOGRAPH
+ 0xD44E: 0x5061, //CJK UNIFIED IDEOGRAPH
+ 0xD44F: 0x505E, //CJK UNIFIED IDEOGRAPH
+ 0xD450: 0x5060, //CJK UNIFIED IDEOGRAPH
+ 0xD451: 0x5053, //CJK UNIFIED IDEOGRAPH
+ 0xD452: 0x504B, //CJK UNIFIED IDEOGRAPH
+ 0xD453: 0x505D, //CJK UNIFIED IDEOGRAPH
+ 0xD454: 0x5072, //CJK UNIFIED IDEOGRAPH
+ 0xD455: 0x5048, //CJK UNIFIED IDEOGRAPH
+ 0xD456: 0x504D, //CJK UNIFIED IDEOGRAPH
+ 0xD457: 0x5041, //CJK UNIFIED IDEOGRAPH
+ 0xD458: 0x505B, //CJK UNIFIED IDEOGRAPH
+ 0xD459: 0x504A, //CJK UNIFIED IDEOGRAPH
+ 0xD45A: 0x5062, //CJK UNIFIED IDEOGRAPH
+ 0xD45B: 0x5015, //CJK UNIFIED IDEOGRAPH
+ 0xD45C: 0x5045, //CJK UNIFIED IDEOGRAPH
+ 0xD45D: 0x505F, //CJK UNIFIED IDEOGRAPH
+ 0xD45E: 0x5069, //CJK UNIFIED IDEOGRAPH
+ 0xD45F: 0x506B, //CJK UNIFIED IDEOGRAPH
+ 0xD460: 0x5063, //CJK UNIFIED IDEOGRAPH
+ 0xD461: 0x5064, //CJK UNIFIED IDEOGRAPH
+ 0xD462: 0x5046, //CJK UNIFIED IDEOGRAPH
+ 0xD463: 0x5040, //CJK UNIFIED IDEOGRAPH
+ 0xD464: 0x506E, //CJK UNIFIED IDEOGRAPH
+ 0xD465: 0x5073, //CJK UNIFIED IDEOGRAPH
+ 0xD466: 0x5057, //CJK UNIFIED IDEOGRAPH
+ 0xD467: 0x5051, //CJK UNIFIED IDEOGRAPH
+ 0xD468: 0x51D0, //CJK UNIFIED IDEOGRAPH
+ 0xD469: 0x526B, //CJK UNIFIED IDEOGRAPH
+ 0xD46A: 0x526D, //CJK UNIFIED IDEOGRAPH
+ 0xD46B: 0x526C, //CJK UNIFIED IDEOGRAPH
+ 0xD46C: 0x526E, //CJK UNIFIED IDEOGRAPH
+ 0xD46D: 0x52D6, //CJK UNIFIED IDEOGRAPH
+ 0xD46E: 0x52D3, //CJK UNIFIED IDEOGRAPH
+ 0xD46F: 0x532D, //CJK UNIFIED IDEOGRAPH
+ 0xD470: 0x539C, //CJK UNIFIED IDEOGRAPH
+ 0xD471: 0x5575, //CJK UNIFIED IDEOGRAPH
+ 0xD472: 0x5576, //CJK UNIFIED IDEOGRAPH
+ 0xD473: 0x553C, //CJK UNIFIED IDEOGRAPH
+ 0xD474: 0x554D, //CJK UNIFIED IDEOGRAPH
+ 0xD475: 0x5550, //CJK UNIFIED IDEOGRAPH
+ 0xD476: 0x5534, //CJK UNIFIED IDEOGRAPH
+ 0xD477: 0x552A, //CJK UNIFIED IDEOGRAPH
+ 0xD478: 0x5551, //CJK UNIFIED IDEOGRAPH
+ 0xD479: 0x5562, //CJK UNIFIED IDEOGRAPH
+ 0xD47A: 0x5536, //CJK UNIFIED IDEOGRAPH
+ 0xD47B: 0x5535, //CJK UNIFIED IDEOGRAPH
+ 0xD47C: 0x5530, //CJK UNIFIED IDEOGRAPH
+ 0xD47D: 0x5552, //CJK UNIFIED IDEOGRAPH
+ 0xD47E: 0x5545, //CJK UNIFIED IDEOGRAPH
+ 0xD4A1: 0x550C, //CJK UNIFIED IDEOGRAPH
+ 0xD4A2: 0x5532, //CJK UNIFIED IDEOGRAPH
+ 0xD4A3: 0x5565, //CJK UNIFIED IDEOGRAPH
+ 0xD4A4: 0x554E, //CJK UNIFIED IDEOGRAPH
+ 0xD4A5: 0x5539, //CJK UNIFIED IDEOGRAPH
+ 0xD4A6: 0x5548, //CJK UNIFIED IDEOGRAPH
+ 0xD4A7: 0x552D, //CJK UNIFIED IDEOGRAPH
+ 0xD4A8: 0x553B, //CJK UNIFIED IDEOGRAPH
+ 0xD4A9: 0x5540, //CJK UNIFIED IDEOGRAPH
+ 0xD4AA: 0x554B, //CJK UNIFIED IDEOGRAPH
+ 0xD4AB: 0x570A, //CJK UNIFIED IDEOGRAPH
+ 0xD4AC: 0x5707, //CJK UNIFIED IDEOGRAPH
+ 0xD4AD: 0x57FB, //CJK UNIFIED IDEOGRAPH
+ 0xD4AE: 0x5814, //CJK UNIFIED IDEOGRAPH
+ 0xD4AF: 0x57E2, //CJK UNIFIED IDEOGRAPH
+ 0xD4B0: 0x57F6, //CJK UNIFIED IDEOGRAPH
+ 0xD4B1: 0x57DC, //CJK UNIFIED IDEOGRAPH
+ 0xD4B2: 0x57F4, //CJK UNIFIED IDEOGRAPH
+ 0xD4B3: 0x5800, //CJK UNIFIED IDEOGRAPH
+ 0xD4B4: 0x57ED, //CJK UNIFIED IDEOGRAPH
+ 0xD4B5: 0x57FD, //CJK UNIFIED IDEOGRAPH
+ 0xD4B6: 0x5808, //CJK UNIFIED IDEOGRAPH
+ 0xD4B7: 0x57F8, //CJK UNIFIED IDEOGRAPH
+ 0xD4B8: 0x580B, //CJK UNIFIED IDEOGRAPH
+ 0xD4B9: 0x57F3, //CJK UNIFIED IDEOGRAPH
+ 0xD4BA: 0x57CF, //CJK UNIFIED IDEOGRAPH
+ 0xD4BB: 0x5807, //CJK UNIFIED IDEOGRAPH
+ 0xD4BC: 0x57EE, //CJK UNIFIED IDEOGRAPH
+ 0xD4BD: 0x57E3, //CJK UNIFIED IDEOGRAPH
+ 0xD4BE: 0x57F2, //CJK UNIFIED IDEOGRAPH
+ 0xD4BF: 0x57E5, //CJK UNIFIED IDEOGRAPH
+ 0xD4C0: 0x57EC, //CJK UNIFIED IDEOGRAPH
+ 0xD4C1: 0x57E1, //CJK UNIFIED IDEOGRAPH
+ 0xD4C2: 0x580E, //CJK UNIFIED IDEOGRAPH
+ 0xD4C3: 0x57FC, //CJK UNIFIED IDEOGRAPH
+ 0xD4C4: 0x5810, //CJK UNIFIED IDEOGRAPH
+ 0xD4C5: 0x57E7, //CJK UNIFIED IDEOGRAPH
+ 0xD4C6: 0x5801, //CJK UNIFIED IDEOGRAPH
+ 0xD4C7: 0x580C, //CJK UNIFIED IDEOGRAPH
+ 0xD4C8: 0x57F1, //CJK UNIFIED IDEOGRAPH
+ 0xD4C9: 0x57E9, //CJK UNIFIED IDEOGRAPH
+ 0xD4CA: 0x57F0, //CJK UNIFIED IDEOGRAPH
+ 0xD4CB: 0x580D, //CJK UNIFIED IDEOGRAPH
+ 0xD4CC: 0x5804, //CJK UNIFIED IDEOGRAPH
+ 0xD4CD: 0x595C, //CJK UNIFIED IDEOGRAPH
+ 0xD4CE: 0x5A60, //CJK UNIFIED IDEOGRAPH
+ 0xD4CF: 0x5A58, //CJK UNIFIED IDEOGRAPH
+ 0xD4D0: 0x5A55, //CJK UNIFIED IDEOGRAPH
+ 0xD4D1: 0x5A67, //CJK UNIFIED IDEOGRAPH
+ 0xD4D2: 0x5A5E, //CJK UNIFIED IDEOGRAPH
+ 0xD4D3: 0x5A38, //CJK UNIFIED IDEOGRAPH
+ 0xD4D4: 0x5A35, //CJK UNIFIED IDEOGRAPH
+ 0xD4D5: 0x5A6D, //CJK UNIFIED IDEOGRAPH
+ 0xD4D6: 0x5A50, //CJK UNIFIED IDEOGRAPH
+ 0xD4D7: 0x5A5F, //CJK UNIFIED IDEOGRAPH
+ 0xD4D8: 0x5A65, //CJK UNIFIED IDEOGRAPH
+ 0xD4D9: 0x5A6C, //CJK UNIFIED IDEOGRAPH
+ 0xD4DA: 0x5A53, //CJK UNIFIED IDEOGRAPH
+ 0xD4DB: 0x5A64, //CJK UNIFIED IDEOGRAPH
+ 0xD4DC: 0x5A57, //CJK UNIFIED IDEOGRAPH
+ 0xD4DD: 0x5A43, //CJK UNIFIED IDEOGRAPH
+ 0xD4DE: 0x5A5D, //CJK UNIFIED IDEOGRAPH
+ 0xD4DF: 0x5A52, //CJK UNIFIED IDEOGRAPH
+ 0xD4E0: 0x5A44, //CJK UNIFIED IDEOGRAPH
+ 0xD4E1: 0x5A5B, //CJK UNIFIED IDEOGRAPH
+ 0xD4E2: 0x5A48, //CJK UNIFIED IDEOGRAPH
+ 0xD4E3: 0x5A8E, //CJK UNIFIED IDEOGRAPH
+ 0xD4E4: 0x5A3E, //CJK UNIFIED IDEOGRAPH
+ 0xD4E5: 0x5A4D, //CJK UNIFIED IDEOGRAPH
+ 0xD4E6: 0x5A39, //CJK UNIFIED IDEOGRAPH
+ 0xD4E7: 0x5A4C, //CJK UNIFIED IDEOGRAPH
+ 0xD4E8: 0x5A70, //CJK UNIFIED IDEOGRAPH
+ 0xD4E9: 0x5A69, //CJK UNIFIED IDEOGRAPH
+ 0xD4EA: 0x5A47, //CJK UNIFIED IDEOGRAPH
+ 0xD4EB: 0x5A51, //CJK UNIFIED IDEOGRAPH
+ 0xD4EC: 0x5A56, //CJK UNIFIED IDEOGRAPH
+ 0xD4ED: 0x5A42, //CJK UNIFIED IDEOGRAPH
+ 0xD4EE: 0x5A5C, //CJK UNIFIED IDEOGRAPH
+ 0xD4EF: 0x5B72, //CJK UNIFIED IDEOGRAPH
+ 0xD4F0: 0x5B6E, //CJK UNIFIED IDEOGRAPH
+ 0xD4F1: 0x5BC1, //CJK UNIFIED IDEOGRAPH
+ 0xD4F2: 0x5BC0, //CJK UNIFIED IDEOGRAPH
+ 0xD4F3: 0x5C59, //CJK UNIFIED IDEOGRAPH
+ 0xD4F4: 0x5D1E, //CJK UNIFIED IDEOGRAPH
+ 0xD4F5: 0x5D0B, //CJK UNIFIED IDEOGRAPH
+ 0xD4F6: 0x5D1D, //CJK UNIFIED IDEOGRAPH
+ 0xD4F7: 0x5D1A, //CJK UNIFIED IDEOGRAPH
+ 0xD4F8: 0x5D20, //CJK UNIFIED IDEOGRAPH
+ 0xD4F9: 0x5D0C, //CJK UNIFIED IDEOGRAPH
+ 0xD4FA: 0x5D28, //CJK UNIFIED IDEOGRAPH
+ 0xD4FB: 0x5D0D, //CJK UNIFIED IDEOGRAPH
+ 0xD4FC: 0x5D26, //CJK UNIFIED IDEOGRAPH
+ 0xD4FD: 0x5D25, //CJK UNIFIED IDEOGRAPH
+ 0xD4FE: 0x5D0F, //CJK UNIFIED IDEOGRAPH
+ 0xD540: 0x5D30, //CJK UNIFIED IDEOGRAPH
+ 0xD541: 0x5D12, //CJK UNIFIED IDEOGRAPH
+ 0xD542: 0x5D23, //CJK UNIFIED IDEOGRAPH
+ 0xD543: 0x5D1F, //CJK UNIFIED IDEOGRAPH
+ 0xD544: 0x5D2E, //CJK UNIFIED IDEOGRAPH
+ 0xD545: 0x5E3E, //CJK UNIFIED IDEOGRAPH
+ 0xD546: 0x5E34, //CJK UNIFIED IDEOGRAPH
+ 0xD547: 0x5EB1, //CJK UNIFIED IDEOGRAPH
+ 0xD548: 0x5EB4, //CJK UNIFIED IDEOGRAPH
+ 0xD549: 0x5EB9, //CJK UNIFIED IDEOGRAPH
+ 0xD54A: 0x5EB2, //CJK UNIFIED IDEOGRAPH
+ 0xD54B: 0x5EB3, //CJK UNIFIED IDEOGRAPH
+ 0xD54C: 0x5F36, //CJK UNIFIED IDEOGRAPH
+ 0xD54D: 0x5F38, //CJK UNIFIED IDEOGRAPH
+ 0xD54E: 0x5F9B, //CJK UNIFIED IDEOGRAPH
+ 0xD54F: 0x5F96, //CJK UNIFIED IDEOGRAPH
+ 0xD550: 0x5F9F, //CJK UNIFIED IDEOGRAPH
+ 0xD551: 0x608A, //CJK UNIFIED IDEOGRAPH
+ 0xD552: 0x6090, //CJK UNIFIED IDEOGRAPH
+ 0xD553: 0x6086, //CJK UNIFIED IDEOGRAPH
+ 0xD554: 0x60BE, //CJK UNIFIED IDEOGRAPH
+ 0xD555: 0x60B0, //CJK UNIFIED IDEOGRAPH
+ 0xD556: 0x60BA, //CJK UNIFIED IDEOGRAPH
+ 0xD557: 0x60D3, //CJK UNIFIED IDEOGRAPH
+ 0xD558: 0x60D4, //CJK UNIFIED IDEOGRAPH
+ 0xD559: 0x60CF, //CJK UNIFIED IDEOGRAPH
+ 0xD55A: 0x60E4, //CJK UNIFIED IDEOGRAPH
+ 0xD55B: 0x60D9, //CJK UNIFIED IDEOGRAPH
+ 0xD55C: 0x60DD, //CJK UNIFIED IDEOGRAPH
+ 0xD55D: 0x60C8, //CJK UNIFIED IDEOGRAPH
+ 0xD55E: 0x60B1, //CJK UNIFIED IDEOGRAPH
+ 0xD55F: 0x60DB, //CJK UNIFIED IDEOGRAPH
+ 0xD560: 0x60B7, //CJK UNIFIED IDEOGRAPH
+ 0xD561: 0x60CA, //CJK UNIFIED IDEOGRAPH
+ 0xD562: 0x60BF, //CJK UNIFIED IDEOGRAPH
+ 0xD563: 0x60C3, //CJK UNIFIED IDEOGRAPH
+ 0xD564: 0x60CD, //CJK UNIFIED IDEOGRAPH
+ 0xD565: 0x60C0, //CJK UNIFIED IDEOGRAPH
+ 0xD566: 0x6332, //CJK UNIFIED IDEOGRAPH
+ 0xD567: 0x6365, //CJK UNIFIED IDEOGRAPH
+ 0xD568: 0x638A, //CJK UNIFIED IDEOGRAPH
+ 0xD569: 0x6382, //CJK UNIFIED IDEOGRAPH
+ 0xD56A: 0x637D, //CJK UNIFIED IDEOGRAPH
+ 0xD56B: 0x63BD, //CJK UNIFIED IDEOGRAPH
+ 0xD56C: 0x639E, //CJK UNIFIED IDEOGRAPH
+ 0xD56D: 0x63AD, //CJK UNIFIED IDEOGRAPH
+ 0xD56E: 0x639D, //CJK UNIFIED IDEOGRAPH
+ 0xD56F: 0x6397, //CJK UNIFIED IDEOGRAPH
+ 0xD570: 0x63AB, //CJK UNIFIED IDEOGRAPH
+ 0xD571: 0x638E, //CJK UNIFIED IDEOGRAPH
+ 0xD572: 0x636F, //CJK UNIFIED IDEOGRAPH
+ 0xD573: 0x6387, //CJK UNIFIED IDEOGRAPH
+ 0xD574: 0x6390, //CJK UNIFIED IDEOGRAPH
+ 0xD575: 0x636E, //CJK UNIFIED IDEOGRAPH
+ 0xD576: 0x63AF, //CJK UNIFIED IDEOGRAPH
+ 0xD577: 0x6375, //CJK UNIFIED IDEOGRAPH
+ 0xD578: 0x639C, //CJK UNIFIED IDEOGRAPH
+ 0xD579: 0x636D, //CJK UNIFIED IDEOGRAPH
+ 0xD57A: 0x63AE, //CJK UNIFIED IDEOGRAPH
+ 0xD57B: 0x637C, //CJK UNIFIED IDEOGRAPH
+ 0xD57C: 0x63A4, //CJK UNIFIED IDEOGRAPH
+ 0xD57D: 0x633B, //CJK UNIFIED IDEOGRAPH
+ 0xD57E: 0x639F, //CJK UNIFIED IDEOGRAPH
+ 0xD5A1: 0x6378, //CJK UNIFIED IDEOGRAPH
+ 0xD5A2: 0x6385, //CJK UNIFIED IDEOGRAPH
+ 0xD5A3: 0x6381, //CJK UNIFIED IDEOGRAPH
+ 0xD5A4: 0x6391, //CJK UNIFIED IDEOGRAPH
+ 0xD5A5: 0x638D, //CJK UNIFIED IDEOGRAPH
+ 0xD5A6: 0x6370, //CJK UNIFIED IDEOGRAPH
+ 0xD5A7: 0x6553, //CJK UNIFIED IDEOGRAPH
+ 0xD5A8: 0x65CD, //CJK UNIFIED IDEOGRAPH
+ 0xD5A9: 0x6665, //CJK UNIFIED IDEOGRAPH
+ 0xD5AA: 0x6661, //CJK UNIFIED IDEOGRAPH
+ 0xD5AB: 0x665B, //CJK UNIFIED IDEOGRAPH
+ 0xD5AC: 0x6659, //CJK UNIFIED IDEOGRAPH
+ 0xD5AD: 0x665C, //CJK UNIFIED IDEOGRAPH
+ 0xD5AE: 0x6662, //CJK UNIFIED IDEOGRAPH
+ 0xD5AF: 0x6718, //CJK UNIFIED IDEOGRAPH
+ 0xD5B0: 0x6879, //CJK UNIFIED IDEOGRAPH
+ 0xD5B1: 0x6887, //CJK UNIFIED IDEOGRAPH
+ 0xD5B2: 0x6890, //CJK UNIFIED IDEOGRAPH
+ 0xD5B3: 0x689C, //CJK UNIFIED IDEOGRAPH
+ 0xD5B4: 0x686D, //CJK UNIFIED IDEOGRAPH
+ 0xD5B5: 0x686E, //CJK UNIFIED IDEOGRAPH
+ 0xD5B6: 0x68AE, //CJK UNIFIED IDEOGRAPH
+ 0xD5B7: 0x68AB, //CJK UNIFIED IDEOGRAPH
+ 0xD5B8: 0x6956, //CJK UNIFIED IDEOGRAPH
+ 0xD5B9: 0x686F, //CJK UNIFIED IDEOGRAPH
+ 0xD5BA: 0x68A3, //CJK UNIFIED IDEOGRAPH
+ 0xD5BB: 0x68AC, //CJK UNIFIED IDEOGRAPH
+ 0xD5BC: 0x68A9, //CJK UNIFIED IDEOGRAPH
+ 0xD5BD: 0x6875, //CJK UNIFIED IDEOGRAPH
+ 0xD5BE: 0x6874, //CJK UNIFIED IDEOGRAPH
+ 0xD5BF: 0x68B2, //CJK UNIFIED IDEOGRAPH
+ 0xD5C0: 0x688F, //CJK UNIFIED IDEOGRAPH
+ 0xD5C1: 0x6877, //CJK UNIFIED IDEOGRAPH
+ 0xD5C2: 0x6892, //CJK UNIFIED IDEOGRAPH
+ 0xD5C3: 0x687C, //CJK UNIFIED IDEOGRAPH
+ 0xD5C4: 0x686B, //CJK UNIFIED IDEOGRAPH
+ 0xD5C5: 0x6872, //CJK UNIFIED IDEOGRAPH
+ 0xD5C6: 0x68AA, //CJK UNIFIED IDEOGRAPH
+ 0xD5C7: 0x6880, //CJK UNIFIED IDEOGRAPH
+ 0xD5C8: 0x6871, //CJK UNIFIED IDEOGRAPH
+ 0xD5C9: 0x687E, //CJK UNIFIED IDEOGRAPH
+ 0xD5CA: 0x689B, //CJK UNIFIED IDEOGRAPH
+ 0xD5CB: 0x6896, //CJK UNIFIED IDEOGRAPH
+ 0xD5CC: 0x688B, //CJK UNIFIED IDEOGRAPH
+ 0xD5CD: 0x68A0, //CJK UNIFIED IDEOGRAPH
+ 0xD5CE: 0x6889, //CJK UNIFIED IDEOGRAPH
+ 0xD5CF: 0x68A4, //CJK UNIFIED IDEOGRAPH
+ 0xD5D0: 0x6878, //CJK UNIFIED IDEOGRAPH
+ 0xD5D1: 0x687B, //CJK UNIFIED IDEOGRAPH
+ 0xD5D2: 0x6891, //CJK UNIFIED IDEOGRAPH
+ 0xD5D3: 0x688C, //CJK UNIFIED IDEOGRAPH
+ 0xD5D4: 0x688A, //CJK UNIFIED IDEOGRAPH
+ 0xD5D5: 0x687D, //CJK UNIFIED IDEOGRAPH
+ 0xD5D6: 0x6B36, //CJK UNIFIED IDEOGRAPH
+ 0xD5D7: 0x6B33, //CJK UNIFIED IDEOGRAPH
+ 0xD5D8: 0x6B37, //CJK UNIFIED IDEOGRAPH
+ 0xD5D9: 0x6B38, //CJK UNIFIED IDEOGRAPH
+ 0xD5DA: 0x6B91, //CJK UNIFIED IDEOGRAPH
+ 0xD5DB: 0x6B8F, //CJK UNIFIED IDEOGRAPH
+ 0xD5DC: 0x6B8D, //CJK UNIFIED IDEOGRAPH
+ 0xD5DD: 0x6B8E, //CJK UNIFIED IDEOGRAPH
+ 0xD5DE: 0x6B8C, //CJK UNIFIED IDEOGRAPH
+ 0xD5DF: 0x6C2A, //CJK UNIFIED IDEOGRAPH
+ 0xD5E0: 0x6DC0, //CJK UNIFIED IDEOGRAPH
+ 0xD5E1: 0x6DAB, //CJK UNIFIED IDEOGRAPH
+ 0xD5E2: 0x6DB4, //CJK UNIFIED IDEOGRAPH
+ 0xD5E3: 0x6DB3, //CJK UNIFIED IDEOGRAPH
+ 0xD5E4: 0x6E74, //CJK UNIFIED IDEOGRAPH
+ 0xD5E5: 0x6DAC, //CJK UNIFIED IDEOGRAPH
+ 0xD5E6: 0x6DE9, //CJK UNIFIED IDEOGRAPH
+ 0xD5E7: 0x6DE2, //CJK UNIFIED IDEOGRAPH
+ 0xD5E8: 0x6DB7, //CJK UNIFIED IDEOGRAPH
+ 0xD5E9: 0x6DF6, //CJK UNIFIED IDEOGRAPH
+ 0xD5EA: 0x6DD4, //CJK UNIFIED IDEOGRAPH
+ 0xD5EB: 0x6E00, //CJK UNIFIED IDEOGRAPH
+ 0xD5EC: 0x6DC8, //CJK UNIFIED IDEOGRAPH
+ 0xD5ED: 0x6DE0, //CJK UNIFIED IDEOGRAPH
+ 0xD5EE: 0x6DDF, //CJK UNIFIED IDEOGRAPH
+ 0xD5EF: 0x6DD6, //CJK UNIFIED IDEOGRAPH
+ 0xD5F0: 0x6DBE, //CJK UNIFIED IDEOGRAPH
+ 0xD5F1: 0x6DE5, //CJK UNIFIED IDEOGRAPH
+ 0xD5F2: 0x6DDC, //CJK UNIFIED IDEOGRAPH
+ 0xD5F3: 0x6DDD, //CJK UNIFIED IDEOGRAPH
+ 0xD5F4: 0x6DDB, //CJK UNIFIED IDEOGRAPH
+ 0xD5F5: 0x6DF4, //CJK UNIFIED IDEOGRAPH
+ 0xD5F6: 0x6DCA, //CJK UNIFIED IDEOGRAPH
+ 0xD5F7: 0x6DBD, //CJK UNIFIED IDEOGRAPH
+ 0xD5F8: 0x6DED, //CJK UNIFIED IDEOGRAPH
+ 0xD5F9: 0x6DF0, //CJK UNIFIED IDEOGRAPH
+ 0xD5FA: 0x6DBA, //CJK UNIFIED IDEOGRAPH
+ 0xD5FB: 0x6DD5, //CJK UNIFIED IDEOGRAPH
+ 0xD5FC: 0x6DC2, //CJK UNIFIED IDEOGRAPH
+ 0xD5FD: 0x6DCF, //CJK UNIFIED IDEOGRAPH
+ 0xD5FE: 0x6DC9, //CJK UNIFIED IDEOGRAPH
+ 0xD640: 0x6DD0, //CJK UNIFIED IDEOGRAPH
+ 0xD641: 0x6DF2, //CJK UNIFIED IDEOGRAPH
+ 0xD642: 0x6DD3, //CJK UNIFIED IDEOGRAPH
+ 0xD643: 0x6DFD, //CJK UNIFIED IDEOGRAPH
+ 0xD644: 0x6DD7, //CJK UNIFIED IDEOGRAPH
+ 0xD645: 0x6DCD, //CJK UNIFIED IDEOGRAPH
+ 0xD646: 0x6DE3, //CJK UNIFIED IDEOGRAPH
+ 0xD647: 0x6DBB, //CJK UNIFIED IDEOGRAPH
+ 0xD648: 0x70FA, //CJK UNIFIED IDEOGRAPH
+ 0xD649: 0x710D, //CJK UNIFIED IDEOGRAPH
+ 0xD64A: 0x70F7, //CJK UNIFIED IDEOGRAPH
+ 0xD64B: 0x7117, //CJK UNIFIED IDEOGRAPH
+ 0xD64C: 0x70F4, //CJK UNIFIED IDEOGRAPH
+ 0xD64D: 0x710C, //CJK UNIFIED IDEOGRAPH
+ 0xD64E: 0x70F0, //CJK UNIFIED IDEOGRAPH
+ 0xD64F: 0x7104, //CJK UNIFIED IDEOGRAPH
+ 0xD650: 0x70F3, //CJK UNIFIED IDEOGRAPH
+ 0xD651: 0x7110, //CJK UNIFIED IDEOGRAPH
+ 0xD652: 0x70FC, //CJK UNIFIED IDEOGRAPH
+ 0xD653: 0x70FF, //CJK UNIFIED IDEOGRAPH
+ 0xD654: 0x7106, //CJK UNIFIED IDEOGRAPH
+ 0xD655: 0x7113, //CJK UNIFIED IDEOGRAPH
+ 0xD656: 0x7100, //CJK UNIFIED IDEOGRAPH
+ 0xD657: 0x70F8, //CJK UNIFIED IDEOGRAPH
+ 0xD658: 0x70F6, //CJK UNIFIED IDEOGRAPH
+ 0xD659: 0x710B, //CJK UNIFIED IDEOGRAPH
+ 0xD65A: 0x7102, //CJK UNIFIED IDEOGRAPH
+ 0xD65B: 0x710E, //CJK UNIFIED IDEOGRAPH
+ 0xD65C: 0x727E, //CJK UNIFIED IDEOGRAPH
+ 0xD65D: 0x727B, //CJK UNIFIED IDEOGRAPH
+ 0xD65E: 0x727C, //CJK UNIFIED IDEOGRAPH
+ 0xD65F: 0x727F, //CJK UNIFIED IDEOGRAPH
+ 0xD660: 0x731D, //CJK UNIFIED IDEOGRAPH
+ 0xD661: 0x7317, //CJK UNIFIED IDEOGRAPH
+ 0xD662: 0x7307, //CJK UNIFIED IDEOGRAPH
+ 0xD663: 0x7311, //CJK UNIFIED IDEOGRAPH
+ 0xD664: 0x7318, //CJK UNIFIED IDEOGRAPH
+ 0xD665: 0x730A, //CJK UNIFIED IDEOGRAPH
+ 0xD666: 0x7308, //CJK UNIFIED IDEOGRAPH
+ 0xD667: 0x72FF, //CJK UNIFIED IDEOGRAPH
+ 0xD668: 0x730F, //CJK UNIFIED IDEOGRAPH
+ 0xD669: 0x731E, //CJK UNIFIED IDEOGRAPH
+ 0xD66A: 0x7388, //CJK UNIFIED IDEOGRAPH
+ 0xD66B: 0x73F6, //CJK UNIFIED IDEOGRAPH
+ 0xD66C: 0x73F8, //CJK UNIFIED IDEOGRAPH
+ 0xD66D: 0x73F5, //CJK UNIFIED IDEOGRAPH
+ 0xD66E: 0x7404, //CJK UNIFIED IDEOGRAPH
+ 0xD66F: 0x7401, //CJK UNIFIED IDEOGRAPH
+ 0xD670: 0x73FD, //CJK UNIFIED IDEOGRAPH
+ 0xD671: 0x7407, //CJK UNIFIED IDEOGRAPH
+ 0xD672: 0x7400, //CJK UNIFIED IDEOGRAPH
+ 0xD673: 0x73FA, //CJK UNIFIED IDEOGRAPH
+ 0xD674: 0x73FC, //CJK UNIFIED IDEOGRAPH
+ 0xD675: 0x73FF, //CJK UNIFIED IDEOGRAPH
+ 0xD676: 0x740C, //CJK UNIFIED IDEOGRAPH
+ 0xD677: 0x740B, //CJK UNIFIED IDEOGRAPH
+ 0xD678: 0x73F4, //CJK UNIFIED IDEOGRAPH
+ 0xD679: 0x7408, //CJK UNIFIED IDEOGRAPH
+ 0xD67A: 0x7564, //CJK UNIFIED IDEOGRAPH
+ 0xD67B: 0x7563, //CJK UNIFIED IDEOGRAPH
+ 0xD67C: 0x75CE, //CJK UNIFIED IDEOGRAPH
+ 0xD67D: 0x75D2, //CJK UNIFIED IDEOGRAPH
+ 0xD67E: 0x75CF, //CJK UNIFIED IDEOGRAPH
+ 0xD6A1: 0x75CB, //CJK UNIFIED IDEOGRAPH
+ 0xD6A2: 0x75CC, //CJK UNIFIED IDEOGRAPH
+ 0xD6A3: 0x75D1, //CJK UNIFIED IDEOGRAPH
+ 0xD6A4: 0x75D0, //CJK UNIFIED IDEOGRAPH
+ 0xD6A5: 0x768F, //CJK UNIFIED IDEOGRAPH
+ 0xD6A6: 0x7689, //CJK UNIFIED IDEOGRAPH
+ 0xD6A7: 0x76D3, //CJK UNIFIED IDEOGRAPH
+ 0xD6A8: 0x7739, //CJK UNIFIED IDEOGRAPH
+ 0xD6A9: 0x772F, //CJK UNIFIED IDEOGRAPH
+ 0xD6AA: 0x772D, //CJK UNIFIED IDEOGRAPH
+ 0xD6AB: 0x7731, //CJK UNIFIED IDEOGRAPH
+ 0xD6AC: 0x7732, //CJK UNIFIED IDEOGRAPH
+ 0xD6AD: 0x7734, //CJK UNIFIED IDEOGRAPH
+ 0xD6AE: 0x7733, //CJK UNIFIED IDEOGRAPH
+ 0xD6AF: 0x773D, //CJK UNIFIED IDEOGRAPH
+ 0xD6B0: 0x7725, //CJK UNIFIED IDEOGRAPH
+ 0xD6B1: 0x773B, //CJK UNIFIED IDEOGRAPH
+ 0xD6B2: 0x7735, //CJK UNIFIED IDEOGRAPH
+ 0xD6B3: 0x7848, //CJK UNIFIED IDEOGRAPH
+ 0xD6B4: 0x7852, //CJK UNIFIED IDEOGRAPH
+ 0xD6B5: 0x7849, //CJK UNIFIED IDEOGRAPH
+ 0xD6B6: 0x784D, //CJK UNIFIED IDEOGRAPH
+ 0xD6B7: 0x784A, //CJK UNIFIED IDEOGRAPH
+ 0xD6B8: 0x784C, //CJK UNIFIED IDEOGRAPH
+ 0xD6B9: 0x7826, //CJK UNIFIED IDEOGRAPH
+ 0xD6BA: 0x7845, //CJK UNIFIED IDEOGRAPH
+ 0xD6BB: 0x7850, //CJK UNIFIED IDEOGRAPH
+ 0xD6BC: 0x7964, //CJK UNIFIED IDEOGRAPH
+ 0xD6BD: 0x7967, //CJK UNIFIED IDEOGRAPH
+ 0xD6BE: 0x7969, //CJK UNIFIED IDEOGRAPH
+ 0xD6BF: 0x796A, //CJK UNIFIED IDEOGRAPH
+ 0xD6C0: 0x7963, //CJK UNIFIED IDEOGRAPH
+ 0xD6C1: 0x796B, //CJK UNIFIED IDEOGRAPH
+ 0xD6C2: 0x7961, //CJK UNIFIED IDEOGRAPH
+ 0xD6C3: 0x79BB, //CJK UNIFIED IDEOGRAPH
+ 0xD6C4: 0x79FA, //CJK UNIFIED IDEOGRAPH
+ 0xD6C5: 0x79F8, //CJK UNIFIED IDEOGRAPH
+ 0xD6C6: 0x79F6, //CJK UNIFIED IDEOGRAPH
+ 0xD6C7: 0x79F7, //CJK UNIFIED IDEOGRAPH
+ 0xD6C8: 0x7A8F, //CJK UNIFIED IDEOGRAPH
+ 0xD6C9: 0x7A94, //CJK UNIFIED IDEOGRAPH
+ 0xD6CA: 0x7A90, //CJK UNIFIED IDEOGRAPH
+ 0xD6CB: 0x7B35, //CJK UNIFIED IDEOGRAPH
+ 0xD6CC: 0x7B47, //CJK UNIFIED IDEOGRAPH
+ 0xD6CD: 0x7B34, //CJK UNIFIED IDEOGRAPH
+ 0xD6CE: 0x7B25, //CJK UNIFIED IDEOGRAPH
+ 0xD6CF: 0x7B30, //CJK UNIFIED IDEOGRAPH
+ 0xD6D0: 0x7B22, //CJK UNIFIED IDEOGRAPH
+ 0xD6D1: 0x7B24, //CJK UNIFIED IDEOGRAPH
+ 0xD6D2: 0x7B33, //CJK UNIFIED IDEOGRAPH
+ 0xD6D3: 0x7B18, //CJK UNIFIED IDEOGRAPH
+ 0xD6D4: 0x7B2A, //CJK UNIFIED IDEOGRAPH
+ 0xD6D5: 0x7B1D, //CJK UNIFIED IDEOGRAPH
+ 0xD6D6: 0x7B31, //CJK UNIFIED IDEOGRAPH
+ 0xD6D7: 0x7B2B, //CJK UNIFIED IDEOGRAPH
+ 0xD6D8: 0x7B2D, //CJK UNIFIED IDEOGRAPH
+ 0xD6D9: 0x7B2F, //CJK UNIFIED IDEOGRAPH
+ 0xD6DA: 0x7B32, //CJK UNIFIED IDEOGRAPH
+ 0xD6DB: 0x7B38, //CJK UNIFIED IDEOGRAPH
+ 0xD6DC: 0x7B1A, //CJK UNIFIED IDEOGRAPH
+ 0xD6DD: 0x7B23, //CJK UNIFIED IDEOGRAPH
+ 0xD6DE: 0x7C94, //CJK UNIFIED IDEOGRAPH
+ 0xD6DF: 0x7C98, //CJK UNIFIED IDEOGRAPH
+ 0xD6E0: 0x7C96, //CJK UNIFIED IDEOGRAPH
+ 0xD6E1: 0x7CA3, //CJK UNIFIED IDEOGRAPH
+ 0xD6E2: 0x7D35, //CJK UNIFIED IDEOGRAPH
+ 0xD6E3: 0x7D3D, //CJK UNIFIED IDEOGRAPH
+ 0xD6E4: 0x7D38, //CJK UNIFIED IDEOGRAPH
+ 0xD6E5: 0x7D36, //CJK UNIFIED IDEOGRAPH
+ 0xD6E6: 0x7D3A, //CJK UNIFIED IDEOGRAPH
+ 0xD6E7: 0x7D45, //CJK UNIFIED IDEOGRAPH
+ 0xD6E8: 0x7D2C, //CJK UNIFIED IDEOGRAPH
+ 0xD6E9: 0x7D29, //CJK UNIFIED IDEOGRAPH
+ 0xD6EA: 0x7D41, //CJK UNIFIED IDEOGRAPH
+ 0xD6EB: 0x7D47, //CJK UNIFIED IDEOGRAPH
+ 0xD6EC: 0x7D3E, //CJK UNIFIED IDEOGRAPH
+ 0xD6ED: 0x7D3F, //CJK UNIFIED IDEOGRAPH
+ 0xD6EE: 0x7D4A, //CJK UNIFIED IDEOGRAPH
+ 0xD6EF: 0x7D3B, //CJK UNIFIED IDEOGRAPH
+ 0xD6F0: 0x7D28, //CJK UNIFIED IDEOGRAPH
+ 0xD6F1: 0x7F63, //CJK UNIFIED IDEOGRAPH
+ 0xD6F2: 0x7F95, //CJK UNIFIED IDEOGRAPH
+ 0xD6F3: 0x7F9C, //CJK UNIFIED IDEOGRAPH
+ 0xD6F4: 0x7F9D, //CJK UNIFIED IDEOGRAPH
+ 0xD6F5: 0x7F9B, //CJK UNIFIED IDEOGRAPH
+ 0xD6F6: 0x7FCA, //CJK UNIFIED IDEOGRAPH
+ 0xD6F7: 0x7FCB, //CJK UNIFIED IDEOGRAPH
+ 0xD6F8: 0x7FCD, //CJK UNIFIED IDEOGRAPH
+ 0xD6F9: 0x7FD0, //CJK UNIFIED IDEOGRAPH
+ 0xD6FA: 0x7FD1, //CJK UNIFIED IDEOGRAPH
+ 0xD6FB: 0x7FC7, //CJK UNIFIED IDEOGRAPH
+ 0xD6FC: 0x7FCF, //CJK UNIFIED IDEOGRAPH
+ 0xD6FD: 0x7FC9, //CJK UNIFIED IDEOGRAPH
+ 0xD6FE: 0x801F, //CJK UNIFIED IDEOGRAPH
+ 0xD740: 0x801E, //CJK UNIFIED IDEOGRAPH
+ 0xD741: 0x801B, //CJK UNIFIED IDEOGRAPH
+ 0xD742: 0x8047, //CJK UNIFIED IDEOGRAPH
+ 0xD743: 0x8043, //CJK UNIFIED IDEOGRAPH
+ 0xD744: 0x8048, //CJK UNIFIED IDEOGRAPH
+ 0xD745: 0x8118, //CJK UNIFIED IDEOGRAPH
+ 0xD746: 0x8125, //CJK UNIFIED IDEOGRAPH
+ 0xD747: 0x8119, //CJK UNIFIED IDEOGRAPH
+ 0xD748: 0x811B, //CJK UNIFIED IDEOGRAPH
+ 0xD749: 0x812D, //CJK UNIFIED IDEOGRAPH
+ 0xD74A: 0x811F, //CJK UNIFIED IDEOGRAPH
+ 0xD74B: 0x812C, //CJK UNIFIED IDEOGRAPH
+ 0xD74C: 0x811E, //CJK UNIFIED IDEOGRAPH
+ 0xD74D: 0x8121, //CJK UNIFIED IDEOGRAPH
+ 0xD74E: 0x8115, //CJK UNIFIED IDEOGRAPH
+ 0xD74F: 0x8127, //CJK UNIFIED IDEOGRAPH
+ 0xD750: 0x811D, //CJK UNIFIED IDEOGRAPH
+ 0xD751: 0x8122, //CJK UNIFIED IDEOGRAPH
+ 0xD752: 0x8211, //CJK UNIFIED IDEOGRAPH
+ 0xD753: 0x8238, //CJK UNIFIED IDEOGRAPH
+ 0xD754: 0x8233, //CJK UNIFIED IDEOGRAPH
+ 0xD755: 0x823A, //CJK UNIFIED IDEOGRAPH
+ 0xD756: 0x8234, //CJK UNIFIED IDEOGRAPH
+ 0xD757: 0x8232, //CJK UNIFIED IDEOGRAPH
+ 0xD758: 0x8274, //CJK UNIFIED IDEOGRAPH
+ 0xD759: 0x8390, //CJK UNIFIED IDEOGRAPH
+ 0xD75A: 0x83A3, //CJK UNIFIED IDEOGRAPH
+ 0xD75B: 0x83A8, //CJK UNIFIED IDEOGRAPH
+ 0xD75C: 0x838D, //CJK UNIFIED IDEOGRAPH
+ 0xD75D: 0x837A, //CJK UNIFIED IDEOGRAPH
+ 0xD75E: 0x8373, //CJK UNIFIED IDEOGRAPH
+ 0xD75F: 0x83A4, //CJK UNIFIED IDEOGRAPH
+ 0xD760: 0x8374, //CJK UNIFIED IDEOGRAPH
+ 0xD761: 0x838F, //CJK UNIFIED IDEOGRAPH
+ 0xD762: 0x8381, //CJK UNIFIED IDEOGRAPH
+ 0xD763: 0x8395, //CJK UNIFIED IDEOGRAPH
+ 0xD764: 0x8399, //CJK UNIFIED IDEOGRAPH
+ 0xD765: 0x8375, //CJK UNIFIED IDEOGRAPH
+ 0xD766: 0x8394, //CJK UNIFIED IDEOGRAPH
+ 0xD767: 0x83A9, //CJK UNIFIED IDEOGRAPH
+ 0xD768: 0x837D, //CJK UNIFIED IDEOGRAPH
+ 0xD769: 0x8383, //CJK UNIFIED IDEOGRAPH
+ 0xD76A: 0x838C, //CJK UNIFIED IDEOGRAPH
+ 0xD76B: 0x839D, //CJK UNIFIED IDEOGRAPH
+ 0xD76C: 0x839B, //CJK UNIFIED IDEOGRAPH
+ 0xD76D: 0x83AA, //CJK UNIFIED IDEOGRAPH
+ 0xD76E: 0x838B, //CJK UNIFIED IDEOGRAPH
+ 0xD76F: 0x837E, //CJK UNIFIED IDEOGRAPH
+ 0xD770: 0x83A5, //CJK UNIFIED IDEOGRAPH
+ 0xD771: 0x83AF, //CJK UNIFIED IDEOGRAPH
+ 0xD772: 0x8388, //CJK UNIFIED IDEOGRAPH
+ 0xD773: 0x8397, //CJK UNIFIED IDEOGRAPH
+ 0xD774: 0x83B0, //CJK UNIFIED IDEOGRAPH
+ 0xD775: 0x837F, //CJK UNIFIED IDEOGRAPH
+ 0xD776: 0x83A6, //CJK UNIFIED IDEOGRAPH
+ 0xD777: 0x8387, //CJK UNIFIED IDEOGRAPH
+ 0xD778: 0x83AE, //CJK UNIFIED IDEOGRAPH
+ 0xD779: 0x8376, //CJK UNIFIED IDEOGRAPH
+ 0xD77A: 0x839A, //CJK UNIFIED IDEOGRAPH
+ 0xD77B: 0x8659, //CJK UNIFIED IDEOGRAPH
+ 0xD77C: 0x8656, //CJK UNIFIED IDEOGRAPH
+ 0xD77D: 0x86BF, //CJK UNIFIED IDEOGRAPH
+ 0xD77E: 0x86B7, //CJK UNIFIED IDEOGRAPH
+ 0xD7A1: 0x86C2, //CJK UNIFIED IDEOGRAPH
+ 0xD7A2: 0x86C1, //CJK UNIFIED IDEOGRAPH
+ 0xD7A3: 0x86C5, //CJK UNIFIED IDEOGRAPH
+ 0xD7A4: 0x86BA, //CJK UNIFIED IDEOGRAPH
+ 0xD7A5: 0x86B0, //CJK UNIFIED IDEOGRAPH
+ 0xD7A6: 0x86C8, //CJK UNIFIED IDEOGRAPH
+ 0xD7A7: 0x86B9, //CJK UNIFIED IDEOGRAPH
+ 0xD7A8: 0x86B3, //CJK UNIFIED IDEOGRAPH
+ 0xD7A9: 0x86B8, //CJK UNIFIED IDEOGRAPH
+ 0xD7AA: 0x86CC, //CJK UNIFIED IDEOGRAPH
+ 0xD7AB: 0x86B4, //CJK UNIFIED IDEOGRAPH
+ 0xD7AC: 0x86BB, //CJK UNIFIED IDEOGRAPH
+ 0xD7AD: 0x86BC, //CJK UNIFIED IDEOGRAPH
+ 0xD7AE: 0x86C3, //CJK UNIFIED IDEOGRAPH
+ 0xD7AF: 0x86BD, //CJK UNIFIED IDEOGRAPH
+ 0xD7B0: 0x86BE, //CJK UNIFIED IDEOGRAPH
+ 0xD7B1: 0x8852, //CJK UNIFIED IDEOGRAPH
+ 0xD7B2: 0x8889, //CJK UNIFIED IDEOGRAPH
+ 0xD7B3: 0x8895, //CJK UNIFIED IDEOGRAPH
+ 0xD7B4: 0x88A8, //CJK UNIFIED IDEOGRAPH
+ 0xD7B5: 0x88A2, //CJK UNIFIED IDEOGRAPH
+ 0xD7B6: 0x88AA, //CJK UNIFIED IDEOGRAPH
+ 0xD7B7: 0x889A, //CJK UNIFIED IDEOGRAPH
+ 0xD7B8: 0x8891, //CJK UNIFIED IDEOGRAPH
+ 0xD7B9: 0x88A1, //CJK UNIFIED IDEOGRAPH
+ 0xD7BA: 0x889F, //CJK UNIFIED IDEOGRAPH
+ 0xD7BB: 0x8898, //CJK UNIFIED IDEOGRAPH
+ 0xD7BC: 0x88A7, //CJK UNIFIED IDEOGRAPH
+ 0xD7BD: 0x8899, //CJK UNIFIED IDEOGRAPH
+ 0xD7BE: 0x889B, //CJK UNIFIED IDEOGRAPH
+ 0xD7BF: 0x8897, //CJK UNIFIED IDEOGRAPH
+ 0xD7C0: 0x88A4, //CJK UNIFIED IDEOGRAPH
+ 0xD7C1: 0x88AC, //CJK UNIFIED IDEOGRAPH
+ 0xD7C2: 0x888C, //CJK UNIFIED IDEOGRAPH
+ 0xD7C3: 0x8893, //CJK UNIFIED IDEOGRAPH
+ 0xD7C4: 0x888E, //CJK UNIFIED IDEOGRAPH
+ 0xD7C5: 0x8982, //CJK UNIFIED IDEOGRAPH
+ 0xD7C6: 0x89D6, //CJK UNIFIED IDEOGRAPH
+ 0xD7C7: 0x89D9, //CJK UNIFIED IDEOGRAPH
+ 0xD7C8: 0x89D5, //CJK UNIFIED IDEOGRAPH
+ 0xD7C9: 0x8A30, //CJK UNIFIED IDEOGRAPH
+ 0xD7CA: 0x8A27, //CJK UNIFIED IDEOGRAPH
+ 0xD7CB: 0x8A2C, //CJK UNIFIED IDEOGRAPH
+ 0xD7CC: 0x8A1E, //CJK UNIFIED IDEOGRAPH
+ 0xD7CD: 0x8C39, //CJK UNIFIED IDEOGRAPH
+ 0xD7CE: 0x8C3B, //CJK UNIFIED IDEOGRAPH
+ 0xD7CF: 0x8C5C, //CJK UNIFIED IDEOGRAPH
+ 0xD7D0: 0x8C5D, //CJK UNIFIED IDEOGRAPH
+ 0xD7D1: 0x8C7D, //CJK UNIFIED IDEOGRAPH
+ 0xD7D2: 0x8CA5, //CJK UNIFIED IDEOGRAPH
+ 0xD7D3: 0x8D7D, //CJK UNIFIED IDEOGRAPH
+ 0xD7D4: 0x8D7B, //CJK UNIFIED IDEOGRAPH
+ 0xD7D5: 0x8D79, //CJK UNIFIED IDEOGRAPH
+ 0xD7D6: 0x8DBC, //CJK UNIFIED IDEOGRAPH
+ 0xD7D7: 0x8DC2, //CJK UNIFIED IDEOGRAPH
+ 0xD7D8: 0x8DB9, //CJK UNIFIED IDEOGRAPH
+ 0xD7D9: 0x8DBF, //CJK UNIFIED IDEOGRAPH
+ 0xD7DA: 0x8DC1, //CJK UNIFIED IDEOGRAPH
+ 0xD7DB: 0x8ED8, //CJK UNIFIED IDEOGRAPH
+ 0xD7DC: 0x8EDE, //CJK UNIFIED IDEOGRAPH
+ 0xD7DD: 0x8EDD, //CJK UNIFIED IDEOGRAPH
+ 0xD7DE: 0x8EDC, //CJK UNIFIED IDEOGRAPH
+ 0xD7DF: 0x8ED7, //CJK UNIFIED IDEOGRAPH
+ 0xD7E0: 0x8EE0, //CJK UNIFIED IDEOGRAPH
+ 0xD7E1: 0x8EE1, //CJK UNIFIED IDEOGRAPH
+ 0xD7E2: 0x9024, //CJK UNIFIED IDEOGRAPH
+ 0xD7E3: 0x900B, //CJK UNIFIED IDEOGRAPH
+ 0xD7E4: 0x9011, //CJK UNIFIED IDEOGRAPH
+ 0xD7E5: 0x901C, //CJK UNIFIED IDEOGRAPH
+ 0xD7E6: 0x900C, //CJK UNIFIED IDEOGRAPH
+ 0xD7E7: 0x9021, //CJK UNIFIED IDEOGRAPH
+ 0xD7E8: 0x90EF, //CJK UNIFIED IDEOGRAPH
+ 0xD7E9: 0x90EA, //CJK UNIFIED IDEOGRAPH
+ 0xD7EA: 0x90F0, //CJK UNIFIED IDEOGRAPH
+ 0xD7EB: 0x90F4, //CJK UNIFIED IDEOGRAPH
+ 0xD7EC: 0x90F2, //CJK UNIFIED IDEOGRAPH
+ 0xD7ED: 0x90F3, //CJK UNIFIED IDEOGRAPH
+ 0xD7EE: 0x90D4, //CJK UNIFIED IDEOGRAPH
+ 0xD7EF: 0x90EB, //CJK UNIFIED IDEOGRAPH
+ 0xD7F0: 0x90EC, //CJK UNIFIED IDEOGRAPH
+ 0xD7F1: 0x90E9, //CJK UNIFIED IDEOGRAPH
+ 0xD7F2: 0x9156, //CJK UNIFIED IDEOGRAPH
+ 0xD7F3: 0x9158, //CJK UNIFIED IDEOGRAPH
+ 0xD7F4: 0x915A, //CJK UNIFIED IDEOGRAPH
+ 0xD7F5: 0x9153, //CJK UNIFIED IDEOGRAPH
+ 0xD7F6: 0x9155, //CJK UNIFIED IDEOGRAPH
+ 0xD7F7: 0x91EC, //CJK UNIFIED IDEOGRAPH
+ 0xD7F8: 0x91F4, //CJK UNIFIED IDEOGRAPH
+ 0xD7F9: 0x91F1, //CJK UNIFIED IDEOGRAPH
+ 0xD7FA: 0x91F3, //CJK UNIFIED IDEOGRAPH
+ 0xD7FB: 0x91F8, //CJK UNIFIED IDEOGRAPH
+ 0xD7FC: 0x91E4, //CJK UNIFIED IDEOGRAPH
+ 0xD7FD: 0x91F9, //CJK UNIFIED IDEOGRAPH
+ 0xD7FE: 0x91EA, //CJK UNIFIED IDEOGRAPH
+ 0xD840: 0x91EB, //CJK UNIFIED IDEOGRAPH
+ 0xD841: 0x91F7, //CJK UNIFIED IDEOGRAPH
+ 0xD842: 0x91E8, //CJK UNIFIED IDEOGRAPH
+ 0xD843: 0x91EE, //CJK UNIFIED IDEOGRAPH
+ 0xD844: 0x957A, //CJK UNIFIED IDEOGRAPH
+ 0xD845: 0x9586, //CJK UNIFIED IDEOGRAPH
+ 0xD846: 0x9588, //CJK UNIFIED IDEOGRAPH
+ 0xD847: 0x967C, //CJK UNIFIED IDEOGRAPH
+ 0xD848: 0x966D, //CJK UNIFIED IDEOGRAPH
+ 0xD849: 0x966B, //CJK UNIFIED IDEOGRAPH
+ 0xD84A: 0x9671, //CJK UNIFIED IDEOGRAPH
+ 0xD84B: 0x966F, //CJK UNIFIED IDEOGRAPH
+ 0xD84C: 0x96BF, //CJK UNIFIED IDEOGRAPH
+ 0xD84D: 0x976A, //CJK UNIFIED IDEOGRAPH
+ 0xD84E: 0x9804, //CJK UNIFIED IDEOGRAPH
+ 0xD84F: 0x98E5, //CJK UNIFIED IDEOGRAPH
+ 0xD850: 0x9997, //CJK UNIFIED IDEOGRAPH
+ 0xD851: 0x509B, //CJK UNIFIED IDEOGRAPH
+ 0xD852: 0x5095, //CJK UNIFIED IDEOGRAPH
+ 0xD853: 0x5094, //CJK UNIFIED IDEOGRAPH
+ 0xD854: 0x509E, //CJK UNIFIED IDEOGRAPH
+ 0xD855: 0x508B, //CJK UNIFIED IDEOGRAPH
+ 0xD856: 0x50A3, //CJK UNIFIED IDEOGRAPH
+ 0xD857: 0x5083, //CJK UNIFIED IDEOGRAPH
+ 0xD858: 0x508C, //CJK UNIFIED IDEOGRAPH
+ 0xD859: 0x508E, //CJK UNIFIED IDEOGRAPH
+ 0xD85A: 0x509D, //CJK UNIFIED IDEOGRAPH
+ 0xD85B: 0x5068, //CJK UNIFIED IDEOGRAPH
+ 0xD85C: 0x509C, //CJK UNIFIED IDEOGRAPH
+ 0xD85D: 0x5092, //CJK UNIFIED IDEOGRAPH
+ 0xD85E: 0x5082, //CJK UNIFIED IDEOGRAPH
+ 0xD85F: 0x5087, //CJK UNIFIED IDEOGRAPH
+ 0xD860: 0x515F, //CJK UNIFIED IDEOGRAPH
+ 0xD861: 0x51D4, //CJK UNIFIED IDEOGRAPH
+ 0xD862: 0x5312, //CJK UNIFIED IDEOGRAPH
+ 0xD863: 0x5311, //CJK UNIFIED IDEOGRAPH
+ 0xD864: 0x53A4, //CJK UNIFIED IDEOGRAPH
+ 0xD865: 0x53A7, //CJK UNIFIED IDEOGRAPH
+ 0xD866: 0x5591, //CJK UNIFIED IDEOGRAPH
+ 0xD867: 0x55A8, //CJK UNIFIED IDEOGRAPH
+ 0xD868: 0x55A5, //CJK UNIFIED IDEOGRAPH
+ 0xD869: 0x55AD, //CJK UNIFIED IDEOGRAPH
+ 0xD86A: 0x5577, //CJK UNIFIED IDEOGRAPH
+ 0xD86B: 0x5645, //CJK UNIFIED IDEOGRAPH
+ 0xD86C: 0x55A2, //CJK UNIFIED IDEOGRAPH
+ 0xD86D: 0x5593, //CJK UNIFIED IDEOGRAPH
+ 0xD86E: 0x5588, //CJK UNIFIED IDEOGRAPH
+ 0xD86F: 0x558F, //CJK UNIFIED IDEOGRAPH
+ 0xD870: 0x55B5, //CJK UNIFIED IDEOGRAPH
+ 0xD871: 0x5581, //CJK UNIFIED IDEOGRAPH
+ 0xD872: 0x55A3, //CJK UNIFIED IDEOGRAPH
+ 0xD873: 0x5592, //CJK UNIFIED IDEOGRAPH
+ 0xD874: 0x55A4, //CJK UNIFIED IDEOGRAPH
+ 0xD875: 0x557D, //CJK UNIFIED IDEOGRAPH
+ 0xD876: 0x558C, //CJK UNIFIED IDEOGRAPH
+ 0xD877: 0x55A6, //CJK UNIFIED IDEOGRAPH
+ 0xD878: 0x557F, //CJK UNIFIED IDEOGRAPH
+ 0xD879: 0x5595, //CJK UNIFIED IDEOGRAPH
+ 0xD87A: 0x55A1, //CJK UNIFIED IDEOGRAPH
+ 0xD87B: 0x558E, //CJK UNIFIED IDEOGRAPH
+ 0xD87C: 0x570C, //CJK UNIFIED IDEOGRAPH
+ 0xD87D: 0x5829, //CJK UNIFIED IDEOGRAPH
+ 0xD87E: 0x5837, //CJK UNIFIED IDEOGRAPH
+ 0xD8A1: 0x5819, //CJK UNIFIED IDEOGRAPH
+ 0xD8A2: 0x581E, //CJK UNIFIED IDEOGRAPH
+ 0xD8A3: 0x5827, //CJK UNIFIED IDEOGRAPH
+ 0xD8A4: 0x5823, //CJK UNIFIED IDEOGRAPH
+ 0xD8A5: 0x5828, //CJK UNIFIED IDEOGRAPH
+ 0xD8A6: 0x57F5, //CJK UNIFIED IDEOGRAPH
+ 0xD8A7: 0x5848, //CJK UNIFIED IDEOGRAPH
+ 0xD8A8: 0x5825, //CJK UNIFIED IDEOGRAPH
+ 0xD8A9: 0x581C, //CJK UNIFIED IDEOGRAPH
+ 0xD8AA: 0x581B, //CJK UNIFIED IDEOGRAPH
+ 0xD8AB: 0x5833, //CJK UNIFIED IDEOGRAPH
+ 0xD8AC: 0x583F, //CJK UNIFIED IDEOGRAPH
+ 0xD8AD: 0x5836, //CJK UNIFIED IDEOGRAPH
+ 0xD8AE: 0x582E, //CJK UNIFIED IDEOGRAPH
+ 0xD8AF: 0x5839, //CJK UNIFIED IDEOGRAPH
+ 0xD8B0: 0x5838, //CJK UNIFIED IDEOGRAPH
+ 0xD8B1: 0x582D, //CJK UNIFIED IDEOGRAPH
+ 0xD8B2: 0x582C, //CJK UNIFIED IDEOGRAPH
+ 0xD8B3: 0x583B, //CJK UNIFIED IDEOGRAPH
+ 0xD8B4: 0x5961, //CJK UNIFIED IDEOGRAPH
+ 0xD8B5: 0x5AAF, //CJK UNIFIED IDEOGRAPH
+ 0xD8B6: 0x5A94, //CJK UNIFIED IDEOGRAPH
+ 0xD8B7: 0x5A9F, //CJK UNIFIED IDEOGRAPH
+ 0xD8B8: 0x5A7A, //CJK UNIFIED IDEOGRAPH
+ 0xD8B9: 0x5AA2, //CJK UNIFIED IDEOGRAPH
+ 0xD8BA: 0x5A9E, //CJK UNIFIED IDEOGRAPH
+ 0xD8BB: 0x5A78, //CJK UNIFIED IDEOGRAPH
+ 0xD8BC: 0x5AA6, //CJK UNIFIED IDEOGRAPH
+ 0xD8BD: 0x5A7C, //CJK UNIFIED IDEOGRAPH
+ 0xD8BE: 0x5AA5, //CJK UNIFIED IDEOGRAPH
+ 0xD8BF: 0x5AAC, //CJK UNIFIED IDEOGRAPH
+ 0xD8C0: 0x5A95, //CJK UNIFIED IDEOGRAPH
+ 0xD8C1: 0x5AAE, //CJK UNIFIED IDEOGRAPH
+ 0xD8C2: 0x5A37, //CJK UNIFIED IDEOGRAPH
+ 0xD8C3: 0x5A84, //CJK UNIFIED IDEOGRAPH
+ 0xD8C4: 0x5A8A, //CJK UNIFIED IDEOGRAPH
+ 0xD8C5: 0x5A97, //CJK UNIFIED IDEOGRAPH
+ 0xD8C6: 0x5A83, //CJK UNIFIED IDEOGRAPH
+ 0xD8C7: 0x5A8B, //CJK UNIFIED IDEOGRAPH
+ 0xD8C8: 0x5AA9, //CJK UNIFIED IDEOGRAPH
+ 0xD8C9: 0x5A7B, //CJK UNIFIED IDEOGRAPH
+ 0xD8CA: 0x5A7D, //CJK UNIFIED IDEOGRAPH
+ 0xD8CB: 0x5A8C, //CJK UNIFIED IDEOGRAPH
+ 0xD8CC: 0x5A9C, //CJK UNIFIED IDEOGRAPH
+ 0xD8CD: 0x5A8F, //CJK UNIFIED IDEOGRAPH
+ 0xD8CE: 0x5A93, //CJK UNIFIED IDEOGRAPH
+ 0xD8CF: 0x5A9D, //CJK UNIFIED IDEOGRAPH
+ 0xD8D0: 0x5BEA, //CJK UNIFIED IDEOGRAPH
+ 0xD8D1: 0x5BCD, //CJK UNIFIED IDEOGRAPH
+ 0xD8D2: 0x5BCB, //CJK UNIFIED IDEOGRAPH
+ 0xD8D3: 0x5BD4, //CJK UNIFIED IDEOGRAPH
+ 0xD8D4: 0x5BD1, //CJK UNIFIED IDEOGRAPH
+ 0xD8D5: 0x5BCA, //CJK UNIFIED IDEOGRAPH
+ 0xD8D6: 0x5BCE, //CJK UNIFIED IDEOGRAPH
+ 0xD8D7: 0x5C0C, //CJK UNIFIED IDEOGRAPH
+ 0xD8D8: 0x5C30, //CJK UNIFIED IDEOGRAPH
+ 0xD8D9: 0x5D37, //CJK UNIFIED IDEOGRAPH
+ 0xD8DA: 0x5D43, //CJK UNIFIED IDEOGRAPH
+ 0xD8DB: 0x5D6B, //CJK UNIFIED IDEOGRAPH
+ 0xD8DC: 0x5D41, //CJK UNIFIED IDEOGRAPH
+ 0xD8DD: 0x5D4B, //CJK UNIFIED IDEOGRAPH
+ 0xD8DE: 0x5D3F, //CJK UNIFIED IDEOGRAPH
+ 0xD8DF: 0x5D35, //CJK UNIFIED IDEOGRAPH
+ 0xD8E0: 0x5D51, //CJK UNIFIED IDEOGRAPH
+ 0xD8E1: 0x5D4E, //CJK UNIFIED IDEOGRAPH
+ 0xD8E2: 0x5D55, //CJK UNIFIED IDEOGRAPH
+ 0xD8E3: 0x5D33, //CJK UNIFIED IDEOGRAPH
+ 0xD8E4: 0x5D3A, //CJK UNIFIED IDEOGRAPH
+ 0xD8E5: 0x5D52, //CJK UNIFIED IDEOGRAPH
+ 0xD8E6: 0x5D3D, //CJK UNIFIED IDEOGRAPH
+ 0xD8E7: 0x5D31, //CJK UNIFIED IDEOGRAPH
+ 0xD8E8: 0x5D59, //CJK UNIFIED IDEOGRAPH
+ 0xD8E9: 0x5D42, //CJK UNIFIED IDEOGRAPH
+ 0xD8EA: 0x5D39, //CJK UNIFIED IDEOGRAPH
+ 0xD8EB: 0x5D49, //CJK UNIFIED IDEOGRAPH
+ 0xD8EC: 0x5D38, //CJK UNIFIED IDEOGRAPH
+ 0xD8ED: 0x5D3C, //CJK UNIFIED IDEOGRAPH
+ 0xD8EE: 0x5D32, //CJK UNIFIED IDEOGRAPH
+ 0xD8EF: 0x5D36, //CJK UNIFIED IDEOGRAPH
+ 0xD8F0: 0x5D40, //CJK UNIFIED IDEOGRAPH
+ 0xD8F1: 0x5D45, //CJK UNIFIED IDEOGRAPH
+ 0xD8F2: 0x5E44, //CJK UNIFIED IDEOGRAPH
+ 0xD8F3: 0x5E41, //CJK UNIFIED IDEOGRAPH
+ 0xD8F4: 0x5F58, //CJK UNIFIED IDEOGRAPH
+ 0xD8F5: 0x5FA6, //CJK UNIFIED IDEOGRAPH
+ 0xD8F6: 0x5FA5, //CJK UNIFIED IDEOGRAPH
+ 0xD8F7: 0x5FAB, //CJK UNIFIED IDEOGRAPH
+ 0xD8F8: 0x60C9, //CJK UNIFIED IDEOGRAPH
+ 0xD8F9: 0x60B9, //CJK UNIFIED IDEOGRAPH
+ 0xD8FA: 0x60CC, //CJK UNIFIED IDEOGRAPH
+ 0xD8FB: 0x60E2, //CJK UNIFIED IDEOGRAPH
+ 0xD8FC: 0x60CE, //CJK UNIFIED IDEOGRAPH
+ 0xD8FD: 0x60C4, //CJK UNIFIED IDEOGRAPH
+ 0xD8FE: 0x6114, //CJK UNIFIED IDEOGRAPH
+ 0xD940: 0x60F2, //CJK UNIFIED IDEOGRAPH
+ 0xD941: 0x610A, //CJK UNIFIED IDEOGRAPH
+ 0xD942: 0x6116, //CJK UNIFIED IDEOGRAPH
+ 0xD943: 0x6105, //CJK UNIFIED IDEOGRAPH
+ 0xD944: 0x60F5, //CJK UNIFIED IDEOGRAPH
+ 0xD945: 0x6113, //CJK UNIFIED IDEOGRAPH
+ 0xD946: 0x60F8, //CJK UNIFIED IDEOGRAPH
+ 0xD947: 0x60FC, //CJK UNIFIED IDEOGRAPH
+ 0xD948: 0x60FE, //CJK UNIFIED IDEOGRAPH
+ 0xD949: 0x60C1, //CJK UNIFIED IDEOGRAPH
+ 0xD94A: 0x6103, //CJK UNIFIED IDEOGRAPH
+ 0xD94B: 0x6118, //CJK UNIFIED IDEOGRAPH
+ 0xD94C: 0x611D, //CJK UNIFIED IDEOGRAPH
+ 0xD94D: 0x6110, //CJK UNIFIED IDEOGRAPH
+ 0xD94E: 0x60FF, //CJK UNIFIED IDEOGRAPH
+ 0xD94F: 0x6104, //CJK UNIFIED IDEOGRAPH
+ 0xD950: 0x610B, //CJK UNIFIED IDEOGRAPH
+ 0xD951: 0x624A, //CJK UNIFIED IDEOGRAPH
+ 0xD952: 0x6394, //CJK UNIFIED IDEOGRAPH
+ 0xD953: 0x63B1, //CJK UNIFIED IDEOGRAPH
+ 0xD954: 0x63B0, //CJK UNIFIED IDEOGRAPH
+ 0xD955: 0x63CE, //CJK UNIFIED IDEOGRAPH
+ 0xD956: 0x63E5, //CJK UNIFIED IDEOGRAPH
+ 0xD957: 0x63E8, //CJK UNIFIED IDEOGRAPH
+ 0xD958: 0x63EF, //CJK UNIFIED IDEOGRAPH
+ 0xD959: 0x63C3, //CJK UNIFIED IDEOGRAPH
+ 0xD95A: 0x649D, //CJK UNIFIED IDEOGRAPH
+ 0xD95B: 0x63F3, //CJK UNIFIED IDEOGRAPH
+ 0xD95C: 0x63CA, //CJK UNIFIED IDEOGRAPH
+ 0xD95D: 0x63E0, //CJK UNIFIED IDEOGRAPH
+ 0xD95E: 0x63F6, //CJK UNIFIED IDEOGRAPH
+ 0xD95F: 0x63D5, //CJK UNIFIED IDEOGRAPH
+ 0xD960: 0x63F2, //CJK UNIFIED IDEOGRAPH
+ 0xD961: 0x63F5, //CJK UNIFIED IDEOGRAPH
+ 0xD962: 0x6461, //CJK UNIFIED IDEOGRAPH
+ 0xD963: 0x63DF, //CJK UNIFIED IDEOGRAPH
+ 0xD964: 0x63BE, //CJK UNIFIED IDEOGRAPH
+ 0xD965: 0x63DD, //CJK UNIFIED IDEOGRAPH
+ 0xD966: 0x63DC, //CJK UNIFIED IDEOGRAPH
+ 0xD967: 0x63C4, //CJK UNIFIED IDEOGRAPH
+ 0xD968: 0x63D8, //CJK UNIFIED IDEOGRAPH
+ 0xD969: 0x63D3, //CJK UNIFIED IDEOGRAPH
+ 0xD96A: 0x63C2, //CJK UNIFIED IDEOGRAPH
+ 0xD96B: 0x63C7, //CJK UNIFIED IDEOGRAPH
+ 0xD96C: 0x63CC, //CJK UNIFIED IDEOGRAPH
+ 0xD96D: 0x63CB, //CJK UNIFIED IDEOGRAPH
+ 0xD96E: 0x63C8, //CJK UNIFIED IDEOGRAPH
+ 0xD96F: 0x63F0, //CJK UNIFIED IDEOGRAPH
+ 0xD970: 0x63D7, //CJK UNIFIED IDEOGRAPH
+ 0xD971: 0x63D9, //CJK UNIFIED IDEOGRAPH
+ 0xD972: 0x6532, //CJK UNIFIED IDEOGRAPH
+ 0xD973: 0x6567, //CJK UNIFIED IDEOGRAPH
+ 0xD974: 0x656A, //CJK UNIFIED IDEOGRAPH
+ 0xD975: 0x6564, //CJK UNIFIED IDEOGRAPH
+ 0xD976: 0x655C, //CJK UNIFIED IDEOGRAPH
+ 0xD977: 0x6568, //CJK UNIFIED IDEOGRAPH
+ 0xD978: 0x6565, //CJK UNIFIED IDEOGRAPH
+ 0xD979: 0x658C, //CJK UNIFIED IDEOGRAPH
+ 0xD97A: 0x659D, //CJK UNIFIED IDEOGRAPH
+ 0xD97B: 0x659E, //CJK UNIFIED IDEOGRAPH
+ 0xD97C: 0x65AE, //CJK UNIFIED IDEOGRAPH
+ 0xD97D: 0x65D0, //CJK UNIFIED IDEOGRAPH
+ 0xD97E: 0x65D2, //CJK UNIFIED IDEOGRAPH
+ 0xD9A1: 0x667C, //CJK UNIFIED IDEOGRAPH
+ 0xD9A2: 0x666C, //CJK UNIFIED IDEOGRAPH
+ 0xD9A3: 0x667B, //CJK UNIFIED IDEOGRAPH
+ 0xD9A4: 0x6680, //CJK UNIFIED IDEOGRAPH
+ 0xD9A5: 0x6671, //CJK UNIFIED IDEOGRAPH
+ 0xD9A6: 0x6679, //CJK UNIFIED IDEOGRAPH
+ 0xD9A7: 0x666A, //CJK UNIFIED IDEOGRAPH
+ 0xD9A8: 0x6672, //CJK UNIFIED IDEOGRAPH
+ 0xD9A9: 0x6701, //CJK UNIFIED IDEOGRAPH
+ 0xD9AA: 0x690C, //CJK UNIFIED IDEOGRAPH
+ 0xD9AB: 0x68D3, //CJK UNIFIED IDEOGRAPH
+ 0xD9AC: 0x6904, //CJK UNIFIED IDEOGRAPH
+ 0xD9AD: 0x68DC, //CJK UNIFIED IDEOGRAPH
+ 0xD9AE: 0x692A, //CJK UNIFIED IDEOGRAPH
+ 0xD9AF: 0x68EC, //CJK UNIFIED IDEOGRAPH
+ 0xD9B0: 0x68EA, //CJK UNIFIED IDEOGRAPH
+ 0xD9B1: 0x68F1, //CJK UNIFIED IDEOGRAPH
+ 0xD9B2: 0x690F, //CJK UNIFIED IDEOGRAPH
+ 0xD9B3: 0x68D6, //CJK UNIFIED IDEOGRAPH
+ 0xD9B4: 0x68F7, //CJK UNIFIED IDEOGRAPH
+ 0xD9B5: 0x68EB, //CJK UNIFIED IDEOGRAPH
+ 0xD9B6: 0x68E4, //CJK UNIFIED IDEOGRAPH
+ 0xD9B7: 0x68F6, //CJK UNIFIED IDEOGRAPH
+ 0xD9B8: 0x6913, //CJK UNIFIED IDEOGRAPH
+ 0xD9B9: 0x6910, //CJK UNIFIED IDEOGRAPH
+ 0xD9BA: 0x68F3, //CJK UNIFIED IDEOGRAPH
+ 0xD9BB: 0x68E1, //CJK UNIFIED IDEOGRAPH
+ 0xD9BC: 0x6907, //CJK UNIFIED IDEOGRAPH
+ 0xD9BD: 0x68CC, //CJK UNIFIED IDEOGRAPH
+ 0xD9BE: 0x6908, //CJK UNIFIED IDEOGRAPH
+ 0xD9BF: 0x6970, //CJK UNIFIED IDEOGRAPH
+ 0xD9C0: 0x68B4, //CJK UNIFIED IDEOGRAPH
+ 0xD9C1: 0x6911, //CJK UNIFIED IDEOGRAPH
+ 0xD9C2: 0x68EF, //CJK UNIFIED IDEOGRAPH
+ 0xD9C3: 0x68C6, //CJK UNIFIED IDEOGRAPH
+ 0xD9C4: 0x6914, //CJK UNIFIED IDEOGRAPH
+ 0xD9C5: 0x68F8, //CJK UNIFIED IDEOGRAPH
+ 0xD9C6: 0x68D0, //CJK UNIFIED IDEOGRAPH
+ 0xD9C7: 0x68FD, //CJK UNIFIED IDEOGRAPH
+ 0xD9C8: 0x68FC, //CJK UNIFIED IDEOGRAPH
+ 0xD9C9: 0x68E8, //CJK UNIFIED IDEOGRAPH
+ 0xD9CA: 0x690B, //CJK UNIFIED IDEOGRAPH
+ 0xD9CB: 0x690A, //CJK UNIFIED IDEOGRAPH
+ 0xD9CC: 0x6917, //CJK UNIFIED IDEOGRAPH
+ 0xD9CD: 0x68CE, //CJK UNIFIED IDEOGRAPH
+ 0xD9CE: 0x68C8, //CJK UNIFIED IDEOGRAPH
+ 0xD9CF: 0x68DD, //CJK UNIFIED IDEOGRAPH
+ 0xD9D0: 0x68DE, //CJK UNIFIED IDEOGRAPH
+ 0xD9D1: 0x68E6, //CJK UNIFIED IDEOGRAPH
+ 0xD9D2: 0x68F4, //CJK UNIFIED IDEOGRAPH
+ 0xD9D3: 0x68D1, //CJK UNIFIED IDEOGRAPH
+ 0xD9D4: 0x6906, //CJK UNIFIED IDEOGRAPH
+ 0xD9D5: 0x68D4, //CJK UNIFIED IDEOGRAPH
+ 0xD9D6: 0x68E9, //CJK UNIFIED IDEOGRAPH
+ 0xD9D7: 0x6915, //CJK UNIFIED IDEOGRAPH
+ 0xD9D8: 0x6925, //CJK UNIFIED IDEOGRAPH
+ 0xD9D9: 0x68C7, //CJK UNIFIED IDEOGRAPH
+ 0xD9DA: 0x6B39, //CJK UNIFIED IDEOGRAPH
+ 0xD9DB: 0x6B3B, //CJK UNIFIED IDEOGRAPH
+ 0xD9DC: 0x6B3F, //CJK UNIFIED IDEOGRAPH
+ 0xD9DD: 0x6B3C, //CJK UNIFIED IDEOGRAPH
+ 0xD9DE: 0x6B94, //CJK UNIFIED IDEOGRAPH
+ 0xD9DF: 0x6B97, //CJK UNIFIED IDEOGRAPH
+ 0xD9E0: 0x6B99, //CJK UNIFIED IDEOGRAPH
+ 0xD9E1: 0x6B95, //CJK UNIFIED IDEOGRAPH
+ 0xD9E2: 0x6BBD, //CJK UNIFIED IDEOGRAPH
+ 0xD9E3: 0x6BF0, //CJK UNIFIED IDEOGRAPH
+ 0xD9E4: 0x6BF2, //CJK UNIFIED IDEOGRAPH
+ 0xD9E5: 0x6BF3, //CJK UNIFIED IDEOGRAPH
+ 0xD9E6: 0x6C30, //CJK UNIFIED IDEOGRAPH
+ 0xD9E7: 0x6DFC, //CJK UNIFIED IDEOGRAPH
+ 0xD9E8: 0x6E46, //CJK UNIFIED IDEOGRAPH
+ 0xD9E9: 0x6E47, //CJK UNIFIED IDEOGRAPH
+ 0xD9EA: 0x6E1F, //CJK UNIFIED IDEOGRAPH
+ 0xD9EB: 0x6E49, //CJK UNIFIED IDEOGRAPH
+ 0xD9EC: 0x6E88, //CJK UNIFIED IDEOGRAPH
+ 0xD9ED: 0x6E3C, //CJK UNIFIED IDEOGRAPH
+ 0xD9EE: 0x6E3D, //CJK UNIFIED IDEOGRAPH
+ 0xD9EF: 0x6E45, //CJK UNIFIED IDEOGRAPH
+ 0xD9F0: 0x6E62, //CJK UNIFIED IDEOGRAPH
+ 0xD9F1: 0x6E2B, //CJK UNIFIED IDEOGRAPH
+ 0xD9F2: 0x6E3F, //CJK UNIFIED IDEOGRAPH
+ 0xD9F3: 0x6E41, //CJK UNIFIED IDEOGRAPH
+ 0xD9F4: 0x6E5D, //CJK UNIFIED IDEOGRAPH
+ 0xD9F5: 0x6E73, //CJK UNIFIED IDEOGRAPH
+ 0xD9F6: 0x6E1C, //CJK UNIFIED IDEOGRAPH
+ 0xD9F7: 0x6E33, //CJK UNIFIED IDEOGRAPH
+ 0xD9F8: 0x6E4B, //CJK UNIFIED IDEOGRAPH
+ 0xD9F9: 0x6E40, //CJK UNIFIED IDEOGRAPH
+ 0xD9FA: 0x6E51, //CJK UNIFIED IDEOGRAPH
+ 0xD9FB: 0x6E3B, //CJK UNIFIED IDEOGRAPH
+ 0xD9FC: 0x6E03, //CJK UNIFIED IDEOGRAPH
+ 0xD9FD: 0x6E2E, //CJK UNIFIED IDEOGRAPH
+ 0xD9FE: 0x6E5E, //CJK UNIFIED IDEOGRAPH
+ 0xDA40: 0x6E68, //CJK UNIFIED IDEOGRAPH
+ 0xDA41: 0x6E5C, //CJK UNIFIED IDEOGRAPH
+ 0xDA42: 0x6E61, //CJK UNIFIED IDEOGRAPH
+ 0xDA43: 0x6E31, //CJK UNIFIED IDEOGRAPH
+ 0xDA44: 0x6E28, //CJK UNIFIED IDEOGRAPH
+ 0xDA45: 0x6E60, //CJK UNIFIED IDEOGRAPH
+ 0xDA46: 0x6E71, //CJK UNIFIED IDEOGRAPH
+ 0xDA47: 0x6E6B, //CJK UNIFIED IDEOGRAPH
+ 0xDA48: 0x6E39, //CJK UNIFIED IDEOGRAPH
+ 0xDA49: 0x6E22, //CJK UNIFIED IDEOGRAPH
+ 0xDA4A: 0x6E30, //CJK UNIFIED IDEOGRAPH
+ 0xDA4B: 0x6E53, //CJK UNIFIED IDEOGRAPH
+ 0xDA4C: 0x6E65, //CJK UNIFIED IDEOGRAPH
+ 0xDA4D: 0x6E27, //CJK UNIFIED IDEOGRAPH
+ 0xDA4E: 0x6E78, //CJK UNIFIED IDEOGRAPH
+ 0xDA4F: 0x6E64, //CJK UNIFIED IDEOGRAPH
+ 0xDA50: 0x6E77, //CJK UNIFIED IDEOGRAPH
+ 0xDA51: 0x6E55, //CJK UNIFIED IDEOGRAPH
+ 0xDA52: 0x6E79, //CJK UNIFIED IDEOGRAPH
+ 0xDA53: 0x6E52, //CJK UNIFIED IDEOGRAPH
+ 0xDA54: 0x6E66, //CJK UNIFIED IDEOGRAPH
+ 0xDA55: 0x6E35, //CJK UNIFIED IDEOGRAPH
+ 0xDA56: 0x6E36, //CJK UNIFIED IDEOGRAPH
+ 0xDA57: 0x6E5A, //CJK UNIFIED IDEOGRAPH
+ 0xDA58: 0x7120, //CJK UNIFIED IDEOGRAPH
+ 0xDA59: 0x711E, //CJK UNIFIED IDEOGRAPH
+ 0xDA5A: 0x712F, //CJK UNIFIED IDEOGRAPH
+ 0xDA5B: 0x70FB, //CJK UNIFIED IDEOGRAPH
+ 0xDA5C: 0x712E, //CJK UNIFIED IDEOGRAPH
+ 0xDA5D: 0x7131, //CJK UNIFIED IDEOGRAPH
+ 0xDA5E: 0x7123, //CJK UNIFIED IDEOGRAPH
+ 0xDA5F: 0x7125, //CJK UNIFIED IDEOGRAPH
+ 0xDA60: 0x7122, //CJK UNIFIED IDEOGRAPH
+ 0xDA61: 0x7132, //CJK UNIFIED IDEOGRAPH
+ 0xDA62: 0x711F, //CJK UNIFIED IDEOGRAPH
+ 0xDA63: 0x7128, //CJK UNIFIED IDEOGRAPH
+ 0xDA64: 0x713A, //CJK UNIFIED IDEOGRAPH
+ 0xDA65: 0x711B, //CJK UNIFIED IDEOGRAPH
+ 0xDA66: 0x724B, //CJK UNIFIED IDEOGRAPH
+ 0xDA67: 0x725A, //CJK UNIFIED IDEOGRAPH
+ 0xDA68: 0x7288, //CJK UNIFIED IDEOGRAPH
+ 0xDA69: 0x7289, //CJK UNIFIED IDEOGRAPH
+ 0xDA6A: 0x7286, //CJK UNIFIED IDEOGRAPH
+ 0xDA6B: 0x7285, //CJK UNIFIED IDEOGRAPH
+ 0xDA6C: 0x728B, //CJK UNIFIED IDEOGRAPH
+ 0xDA6D: 0x7312, //CJK UNIFIED IDEOGRAPH
+ 0xDA6E: 0x730B, //CJK UNIFIED IDEOGRAPH
+ 0xDA6F: 0x7330, //CJK UNIFIED IDEOGRAPH
+ 0xDA70: 0x7322, //CJK UNIFIED IDEOGRAPH
+ 0xDA71: 0x7331, //CJK UNIFIED IDEOGRAPH
+ 0xDA72: 0x7333, //CJK UNIFIED IDEOGRAPH
+ 0xDA73: 0x7327, //CJK UNIFIED IDEOGRAPH
+ 0xDA74: 0x7332, //CJK UNIFIED IDEOGRAPH
+ 0xDA75: 0x732D, //CJK UNIFIED IDEOGRAPH
+ 0xDA76: 0x7326, //CJK UNIFIED IDEOGRAPH
+ 0xDA77: 0x7323, //CJK UNIFIED IDEOGRAPH
+ 0xDA78: 0x7335, //CJK UNIFIED IDEOGRAPH
+ 0xDA79: 0x730C, //CJK UNIFIED IDEOGRAPH
+ 0xDA7A: 0x742E, //CJK UNIFIED IDEOGRAPH
+ 0xDA7B: 0x742C, //CJK UNIFIED IDEOGRAPH
+ 0xDA7C: 0x7430, //CJK UNIFIED IDEOGRAPH
+ 0xDA7D: 0x742B, //CJK UNIFIED IDEOGRAPH
+ 0xDA7E: 0x7416, //CJK UNIFIED IDEOGRAPH
+ 0xDAA1: 0x741A, //CJK UNIFIED IDEOGRAPH
+ 0xDAA2: 0x7421, //CJK UNIFIED IDEOGRAPH
+ 0xDAA3: 0x742D, //CJK UNIFIED IDEOGRAPH
+ 0xDAA4: 0x7431, //CJK UNIFIED IDEOGRAPH
+ 0xDAA5: 0x7424, //CJK UNIFIED IDEOGRAPH
+ 0xDAA6: 0x7423, //CJK UNIFIED IDEOGRAPH
+ 0xDAA7: 0x741D, //CJK UNIFIED IDEOGRAPH
+ 0xDAA8: 0x7429, //CJK UNIFIED IDEOGRAPH
+ 0xDAA9: 0x7420, //CJK UNIFIED IDEOGRAPH
+ 0xDAAA: 0x7432, //CJK UNIFIED IDEOGRAPH
+ 0xDAAB: 0x74FB, //CJK UNIFIED IDEOGRAPH
+ 0xDAAC: 0x752F, //CJK UNIFIED IDEOGRAPH
+ 0xDAAD: 0x756F, //CJK UNIFIED IDEOGRAPH
+ 0xDAAE: 0x756C, //CJK UNIFIED IDEOGRAPH
+ 0xDAAF: 0x75E7, //CJK UNIFIED IDEOGRAPH
+ 0xDAB0: 0x75DA, //CJK UNIFIED IDEOGRAPH
+ 0xDAB1: 0x75E1, //CJK UNIFIED IDEOGRAPH
+ 0xDAB2: 0x75E6, //CJK UNIFIED IDEOGRAPH
+ 0xDAB3: 0x75DD, //CJK UNIFIED IDEOGRAPH
+ 0xDAB4: 0x75DF, //CJK UNIFIED IDEOGRAPH
+ 0xDAB5: 0x75E4, //CJK UNIFIED IDEOGRAPH
+ 0xDAB6: 0x75D7, //CJK UNIFIED IDEOGRAPH
+ 0xDAB7: 0x7695, //CJK UNIFIED IDEOGRAPH
+ 0xDAB8: 0x7692, //CJK UNIFIED IDEOGRAPH
+ 0xDAB9: 0x76DA, //CJK UNIFIED IDEOGRAPH
+ 0xDABA: 0x7746, //CJK UNIFIED IDEOGRAPH
+ 0xDABB: 0x7747, //CJK UNIFIED IDEOGRAPH
+ 0xDABC: 0x7744, //CJK UNIFIED IDEOGRAPH
+ 0xDABD: 0x774D, //CJK UNIFIED IDEOGRAPH
+ 0xDABE: 0x7745, //CJK UNIFIED IDEOGRAPH
+ 0xDABF: 0x774A, //CJK UNIFIED IDEOGRAPH
+ 0xDAC0: 0x774E, //CJK UNIFIED IDEOGRAPH
+ 0xDAC1: 0x774B, //CJK UNIFIED IDEOGRAPH
+ 0xDAC2: 0x774C, //CJK UNIFIED IDEOGRAPH
+ 0xDAC3: 0x77DE, //CJK UNIFIED IDEOGRAPH
+ 0xDAC4: 0x77EC, //CJK UNIFIED IDEOGRAPH
+ 0xDAC5: 0x7860, //CJK UNIFIED IDEOGRAPH
+ 0xDAC6: 0x7864, //CJK UNIFIED IDEOGRAPH
+ 0xDAC7: 0x7865, //CJK UNIFIED IDEOGRAPH
+ 0xDAC8: 0x785C, //CJK UNIFIED IDEOGRAPH
+ 0xDAC9: 0x786D, //CJK UNIFIED IDEOGRAPH
+ 0xDACA: 0x7871, //CJK UNIFIED IDEOGRAPH
+ 0xDACB: 0x786A, //CJK UNIFIED IDEOGRAPH
+ 0xDACC: 0x786E, //CJK UNIFIED IDEOGRAPH
+ 0xDACD: 0x7870, //CJK UNIFIED IDEOGRAPH
+ 0xDACE: 0x7869, //CJK UNIFIED IDEOGRAPH
+ 0xDACF: 0x7868, //CJK UNIFIED IDEOGRAPH
+ 0xDAD0: 0x785E, //CJK UNIFIED IDEOGRAPH
+ 0xDAD1: 0x7862, //CJK UNIFIED IDEOGRAPH
+ 0xDAD2: 0x7974, //CJK UNIFIED IDEOGRAPH
+ 0xDAD3: 0x7973, //CJK UNIFIED IDEOGRAPH
+ 0xDAD4: 0x7972, //CJK UNIFIED IDEOGRAPH
+ 0xDAD5: 0x7970, //CJK UNIFIED IDEOGRAPH
+ 0xDAD6: 0x7A02, //CJK UNIFIED IDEOGRAPH
+ 0xDAD7: 0x7A0A, //CJK UNIFIED IDEOGRAPH
+ 0xDAD8: 0x7A03, //CJK UNIFIED IDEOGRAPH
+ 0xDAD9: 0x7A0C, //CJK UNIFIED IDEOGRAPH
+ 0xDADA: 0x7A04, //CJK UNIFIED IDEOGRAPH
+ 0xDADB: 0x7A99, //CJK UNIFIED IDEOGRAPH
+ 0xDADC: 0x7AE6, //CJK UNIFIED IDEOGRAPH
+ 0xDADD: 0x7AE4, //CJK UNIFIED IDEOGRAPH
+ 0xDADE: 0x7B4A, //CJK UNIFIED IDEOGRAPH
+ 0xDADF: 0x7B3B, //CJK UNIFIED IDEOGRAPH
+ 0xDAE0: 0x7B44, //CJK UNIFIED IDEOGRAPH
+ 0xDAE1: 0x7B48, //CJK UNIFIED IDEOGRAPH
+ 0xDAE2: 0x7B4C, //CJK UNIFIED IDEOGRAPH
+ 0xDAE3: 0x7B4E, //CJK UNIFIED IDEOGRAPH
+ 0xDAE4: 0x7B40, //CJK UNIFIED IDEOGRAPH
+ 0xDAE5: 0x7B58, //CJK UNIFIED IDEOGRAPH
+ 0xDAE6: 0x7B45, //CJK UNIFIED IDEOGRAPH
+ 0xDAE7: 0x7CA2, //CJK UNIFIED IDEOGRAPH
+ 0xDAE8: 0x7C9E, //CJK UNIFIED IDEOGRAPH
+ 0xDAE9: 0x7CA8, //CJK UNIFIED IDEOGRAPH
+ 0xDAEA: 0x7CA1, //CJK UNIFIED IDEOGRAPH
+ 0xDAEB: 0x7D58, //CJK UNIFIED IDEOGRAPH
+ 0xDAEC: 0x7D6F, //CJK UNIFIED IDEOGRAPH
+ 0xDAED: 0x7D63, //CJK UNIFIED IDEOGRAPH
+ 0xDAEE: 0x7D53, //CJK UNIFIED IDEOGRAPH
+ 0xDAEF: 0x7D56, //CJK UNIFIED IDEOGRAPH
+ 0xDAF0: 0x7D67, //CJK UNIFIED IDEOGRAPH
+ 0xDAF1: 0x7D6A, //CJK UNIFIED IDEOGRAPH
+ 0xDAF2: 0x7D4F, //CJK UNIFIED IDEOGRAPH
+ 0xDAF3: 0x7D6D, //CJK UNIFIED IDEOGRAPH
+ 0xDAF4: 0x7D5C, //CJK UNIFIED IDEOGRAPH
+ 0xDAF5: 0x7D6B, //CJK UNIFIED IDEOGRAPH
+ 0xDAF6: 0x7D52, //CJK UNIFIED IDEOGRAPH
+ 0xDAF7: 0x7D54, //CJK UNIFIED IDEOGRAPH
+ 0xDAF8: 0x7D69, //CJK UNIFIED IDEOGRAPH
+ 0xDAF9: 0x7D51, //CJK UNIFIED IDEOGRAPH
+ 0xDAFA: 0x7D5F, //CJK UNIFIED IDEOGRAPH
+ 0xDAFB: 0x7D4E, //CJK UNIFIED IDEOGRAPH
+ 0xDAFC: 0x7F3E, //CJK UNIFIED IDEOGRAPH
+ 0xDAFD: 0x7F3F, //CJK UNIFIED IDEOGRAPH
+ 0xDAFE: 0x7F65, //CJK UNIFIED IDEOGRAPH
+ 0xDB40: 0x7F66, //CJK UNIFIED IDEOGRAPH
+ 0xDB41: 0x7FA2, //CJK UNIFIED IDEOGRAPH
+ 0xDB42: 0x7FA0, //CJK UNIFIED IDEOGRAPH
+ 0xDB43: 0x7FA1, //CJK UNIFIED IDEOGRAPH
+ 0xDB44: 0x7FD7, //CJK UNIFIED IDEOGRAPH
+ 0xDB45: 0x8051, //CJK UNIFIED IDEOGRAPH
+ 0xDB46: 0x804F, //CJK UNIFIED IDEOGRAPH
+ 0xDB47: 0x8050, //CJK UNIFIED IDEOGRAPH
+ 0xDB48: 0x80FE, //CJK UNIFIED IDEOGRAPH
+ 0xDB49: 0x80D4, //CJK UNIFIED IDEOGRAPH
+ 0xDB4A: 0x8143, //CJK UNIFIED IDEOGRAPH
+ 0xDB4B: 0x814A, //CJK UNIFIED IDEOGRAPH
+ 0xDB4C: 0x8152, //CJK UNIFIED IDEOGRAPH
+ 0xDB4D: 0x814F, //CJK UNIFIED IDEOGRAPH
+ 0xDB4E: 0x8147, //CJK UNIFIED IDEOGRAPH
+ 0xDB4F: 0x813D, //CJK UNIFIED IDEOGRAPH
+ 0xDB50: 0x814D, //CJK UNIFIED IDEOGRAPH
+ 0xDB51: 0x813A, //CJK UNIFIED IDEOGRAPH
+ 0xDB52: 0x81E6, //CJK UNIFIED IDEOGRAPH
+ 0xDB53: 0x81EE, //CJK UNIFIED IDEOGRAPH
+ 0xDB54: 0x81F7, //CJK UNIFIED IDEOGRAPH
+ 0xDB55: 0x81F8, //CJK UNIFIED IDEOGRAPH
+ 0xDB56: 0x81F9, //CJK UNIFIED IDEOGRAPH
+ 0xDB57: 0x8204, //CJK UNIFIED IDEOGRAPH
+ 0xDB58: 0x823C, //CJK UNIFIED IDEOGRAPH
+ 0xDB59: 0x823D, //CJK UNIFIED IDEOGRAPH
+ 0xDB5A: 0x823F, //CJK UNIFIED IDEOGRAPH
+ 0xDB5B: 0x8275, //CJK UNIFIED IDEOGRAPH
+ 0xDB5C: 0x833B, //CJK UNIFIED IDEOGRAPH
+ 0xDB5D: 0x83CF, //CJK UNIFIED IDEOGRAPH
+ 0xDB5E: 0x83F9, //CJK UNIFIED IDEOGRAPH
+ 0xDB5F: 0x8423, //CJK UNIFIED IDEOGRAPH
+ 0xDB60: 0x83C0, //CJK UNIFIED IDEOGRAPH
+ 0xDB61: 0x83E8, //CJK UNIFIED IDEOGRAPH
+ 0xDB62: 0x8412, //CJK UNIFIED IDEOGRAPH
+ 0xDB63: 0x83E7, //CJK UNIFIED IDEOGRAPH
+ 0xDB64: 0x83E4, //CJK UNIFIED IDEOGRAPH
+ 0xDB65: 0x83FC, //CJK UNIFIED IDEOGRAPH
+ 0xDB66: 0x83F6, //CJK UNIFIED IDEOGRAPH
+ 0xDB67: 0x8410, //CJK UNIFIED IDEOGRAPH
+ 0xDB68: 0x83C6, //CJK UNIFIED IDEOGRAPH
+ 0xDB69: 0x83C8, //CJK UNIFIED IDEOGRAPH
+ 0xDB6A: 0x83EB, //CJK UNIFIED IDEOGRAPH
+ 0xDB6B: 0x83E3, //CJK UNIFIED IDEOGRAPH
+ 0xDB6C: 0x83BF, //CJK UNIFIED IDEOGRAPH
+ 0xDB6D: 0x8401, //CJK UNIFIED IDEOGRAPH
+ 0xDB6E: 0x83DD, //CJK UNIFIED IDEOGRAPH
+ 0xDB6F: 0x83E5, //CJK UNIFIED IDEOGRAPH
+ 0xDB70: 0x83D8, //CJK UNIFIED IDEOGRAPH
+ 0xDB71: 0x83FF, //CJK UNIFIED IDEOGRAPH
+ 0xDB72: 0x83E1, //CJK UNIFIED IDEOGRAPH
+ 0xDB73: 0x83CB, //CJK UNIFIED IDEOGRAPH
+ 0xDB74: 0x83CE, //CJK UNIFIED IDEOGRAPH
+ 0xDB75: 0x83D6, //CJK UNIFIED IDEOGRAPH
+ 0xDB76: 0x83F5, //CJK UNIFIED IDEOGRAPH
+ 0xDB77: 0x83C9, //CJK UNIFIED IDEOGRAPH
+ 0xDB78: 0x8409, //CJK UNIFIED IDEOGRAPH
+ 0xDB79: 0x840F, //CJK UNIFIED IDEOGRAPH
+ 0xDB7A: 0x83DE, //CJK UNIFIED IDEOGRAPH
+ 0xDB7B: 0x8411, //CJK UNIFIED IDEOGRAPH
+ 0xDB7C: 0x8406, //CJK UNIFIED IDEOGRAPH
+ 0xDB7D: 0x83C2, //CJK UNIFIED IDEOGRAPH
+ 0xDB7E: 0x83F3, //CJK UNIFIED IDEOGRAPH
+ 0xDBA1: 0x83D5, //CJK UNIFIED IDEOGRAPH
+ 0xDBA2: 0x83FA, //CJK UNIFIED IDEOGRAPH
+ 0xDBA3: 0x83C7, //CJK UNIFIED IDEOGRAPH
+ 0xDBA4: 0x83D1, //CJK UNIFIED IDEOGRAPH
+ 0xDBA5: 0x83EA, //CJK UNIFIED IDEOGRAPH
+ 0xDBA6: 0x8413, //CJK UNIFIED IDEOGRAPH
+ 0xDBA7: 0x83C3, //CJK UNIFIED IDEOGRAPH
+ 0xDBA8: 0x83EC, //CJK UNIFIED IDEOGRAPH
+ 0xDBA9: 0x83EE, //CJK UNIFIED IDEOGRAPH
+ 0xDBAA: 0x83C4, //CJK UNIFIED IDEOGRAPH
+ 0xDBAB: 0x83FB, //CJK UNIFIED IDEOGRAPH
+ 0xDBAC: 0x83D7, //CJK UNIFIED IDEOGRAPH
+ 0xDBAD: 0x83E2, //CJK UNIFIED IDEOGRAPH
+ 0xDBAE: 0x841B, //CJK UNIFIED IDEOGRAPH
+ 0xDBAF: 0x83DB, //CJK UNIFIED IDEOGRAPH
+ 0xDBB0: 0x83FE, //CJK UNIFIED IDEOGRAPH
+ 0xDBB1: 0x86D8, //CJK UNIFIED IDEOGRAPH
+ 0xDBB2: 0x86E2, //CJK UNIFIED IDEOGRAPH
+ 0xDBB3: 0x86E6, //CJK UNIFIED IDEOGRAPH
+ 0xDBB4: 0x86D3, //CJK UNIFIED IDEOGRAPH
+ 0xDBB5: 0x86E3, //CJK UNIFIED IDEOGRAPH
+ 0xDBB6: 0x86DA, //CJK UNIFIED IDEOGRAPH
+ 0xDBB7: 0x86EA, //CJK UNIFIED IDEOGRAPH
+ 0xDBB8: 0x86DD, //CJK UNIFIED IDEOGRAPH
+ 0xDBB9: 0x86EB, //CJK UNIFIED IDEOGRAPH
+ 0xDBBA: 0x86DC, //CJK UNIFIED IDEOGRAPH
+ 0xDBBB: 0x86EC, //CJK UNIFIED IDEOGRAPH
+ 0xDBBC: 0x86E9, //CJK UNIFIED IDEOGRAPH
+ 0xDBBD: 0x86D7, //CJK UNIFIED IDEOGRAPH
+ 0xDBBE: 0x86E8, //CJK UNIFIED IDEOGRAPH
+ 0xDBBF: 0x86D1, //CJK UNIFIED IDEOGRAPH
+ 0xDBC0: 0x8848, //CJK UNIFIED IDEOGRAPH
+ 0xDBC1: 0x8856, //CJK UNIFIED IDEOGRAPH
+ 0xDBC2: 0x8855, //CJK UNIFIED IDEOGRAPH
+ 0xDBC3: 0x88BA, //CJK UNIFIED IDEOGRAPH
+ 0xDBC4: 0x88D7, //CJK UNIFIED IDEOGRAPH
+ 0xDBC5: 0x88B9, //CJK UNIFIED IDEOGRAPH
+ 0xDBC6: 0x88B8, //CJK UNIFIED IDEOGRAPH
+ 0xDBC7: 0x88C0, //CJK UNIFIED IDEOGRAPH
+ 0xDBC8: 0x88BE, //CJK UNIFIED IDEOGRAPH
+ 0xDBC9: 0x88B6, //CJK UNIFIED IDEOGRAPH
+ 0xDBCA: 0x88BC, //CJK UNIFIED IDEOGRAPH
+ 0xDBCB: 0x88B7, //CJK UNIFIED IDEOGRAPH
+ 0xDBCC: 0x88BD, //CJK UNIFIED IDEOGRAPH
+ 0xDBCD: 0x88B2, //CJK UNIFIED IDEOGRAPH
+ 0xDBCE: 0x8901, //CJK UNIFIED IDEOGRAPH
+ 0xDBCF: 0x88C9, //CJK UNIFIED IDEOGRAPH
+ 0xDBD0: 0x8995, //CJK UNIFIED IDEOGRAPH
+ 0xDBD1: 0x8998, //CJK UNIFIED IDEOGRAPH
+ 0xDBD2: 0x8997, //CJK UNIFIED IDEOGRAPH
+ 0xDBD3: 0x89DD, //CJK UNIFIED IDEOGRAPH
+ 0xDBD4: 0x89DA, //CJK UNIFIED IDEOGRAPH
+ 0xDBD5: 0x89DB, //CJK UNIFIED IDEOGRAPH
+ 0xDBD6: 0x8A4E, //CJK UNIFIED IDEOGRAPH
+ 0xDBD7: 0x8A4D, //CJK UNIFIED IDEOGRAPH
+ 0xDBD8: 0x8A39, //CJK UNIFIED IDEOGRAPH
+ 0xDBD9: 0x8A59, //CJK UNIFIED IDEOGRAPH
+ 0xDBDA: 0x8A40, //CJK UNIFIED IDEOGRAPH
+ 0xDBDB: 0x8A57, //CJK UNIFIED IDEOGRAPH
+ 0xDBDC: 0x8A58, //CJK UNIFIED IDEOGRAPH
+ 0xDBDD: 0x8A44, //CJK UNIFIED IDEOGRAPH
+ 0xDBDE: 0x8A45, //CJK UNIFIED IDEOGRAPH
+ 0xDBDF: 0x8A52, //CJK UNIFIED IDEOGRAPH
+ 0xDBE0: 0x8A48, //CJK UNIFIED IDEOGRAPH
+ 0xDBE1: 0x8A51, //CJK UNIFIED IDEOGRAPH
+ 0xDBE2: 0x8A4A, //CJK UNIFIED IDEOGRAPH
+ 0xDBE3: 0x8A4C, //CJK UNIFIED IDEOGRAPH
+ 0xDBE4: 0x8A4F, //CJK UNIFIED IDEOGRAPH
+ 0xDBE5: 0x8C5F, //CJK UNIFIED IDEOGRAPH
+ 0xDBE6: 0x8C81, //CJK UNIFIED IDEOGRAPH
+ 0xDBE7: 0x8C80, //CJK UNIFIED IDEOGRAPH
+ 0xDBE8: 0x8CBA, //CJK UNIFIED IDEOGRAPH
+ 0xDBE9: 0x8CBE, //CJK UNIFIED IDEOGRAPH
+ 0xDBEA: 0x8CB0, //CJK UNIFIED IDEOGRAPH
+ 0xDBEB: 0x8CB9, //CJK UNIFIED IDEOGRAPH
+ 0xDBEC: 0x8CB5, //CJK UNIFIED IDEOGRAPH
+ 0xDBED: 0x8D84, //CJK UNIFIED IDEOGRAPH
+ 0xDBEE: 0x8D80, //CJK UNIFIED IDEOGRAPH
+ 0xDBEF: 0x8D89, //CJK UNIFIED IDEOGRAPH
+ 0xDBF0: 0x8DD8, //CJK UNIFIED IDEOGRAPH
+ 0xDBF1: 0x8DD3, //CJK UNIFIED IDEOGRAPH
+ 0xDBF2: 0x8DCD, //CJK UNIFIED IDEOGRAPH
+ 0xDBF3: 0x8DC7, //CJK UNIFIED IDEOGRAPH
+ 0xDBF4: 0x8DD6, //CJK UNIFIED IDEOGRAPH
+ 0xDBF5: 0x8DDC, //CJK UNIFIED IDEOGRAPH
+ 0xDBF6: 0x8DCF, //CJK UNIFIED IDEOGRAPH
+ 0xDBF7: 0x8DD5, //CJK UNIFIED IDEOGRAPH
+ 0xDBF8: 0x8DD9, //CJK UNIFIED IDEOGRAPH
+ 0xDBF9: 0x8DC8, //CJK UNIFIED IDEOGRAPH
+ 0xDBFA: 0x8DD7, //CJK UNIFIED IDEOGRAPH
+ 0xDBFB: 0x8DC5, //CJK UNIFIED IDEOGRAPH
+ 0xDBFC: 0x8EEF, //CJK UNIFIED IDEOGRAPH
+ 0xDBFD: 0x8EF7, //CJK UNIFIED IDEOGRAPH
+ 0xDBFE: 0x8EFA, //CJK UNIFIED IDEOGRAPH
+ 0xDC40: 0x8EF9, //CJK UNIFIED IDEOGRAPH
+ 0xDC41: 0x8EE6, //CJK UNIFIED IDEOGRAPH
+ 0xDC42: 0x8EEE, //CJK UNIFIED IDEOGRAPH
+ 0xDC43: 0x8EE5, //CJK UNIFIED IDEOGRAPH
+ 0xDC44: 0x8EF5, //CJK UNIFIED IDEOGRAPH
+ 0xDC45: 0x8EE7, //CJK UNIFIED IDEOGRAPH
+ 0xDC46: 0x8EE8, //CJK UNIFIED IDEOGRAPH
+ 0xDC47: 0x8EF6, //CJK UNIFIED IDEOGRAPH
+ 0xDC48: 0x8EEB, //CJK UNIFIED IDEOGRAPH
+ 0xDC49: 0x8EF1, //CJK UNIFIED IDEOGRAPH
+ 0xDC4A: 0x8EEC, //CJK UNIFIED IDEOGRAPH
+ 0xDC4B: 0x8EF4, //CJK UNIFIED IDEOGRAPH
+ 0xDC4C: 0x8EE9, //CJK UNIFIED IDEOGRAPH
+ 0xDC4D: 0x902D, //CJK UNIFIED IDEOGRAPH
+ 0xDC4E: 0x9034, //CJK UNIFIED IDEOGRAPH
+ 0xDC4F: 0x902F, //CJK UNIFIED IDEOGRAPH
+ 0xDC50: 0x9106, //CJK UNIFIED IDEOGRAPH
+ 0xDC51: 0x912C, //CJK UNIFIED IDEOGRAPH
+ 0xDC52: 0x9104, //CJK UNIFIED IDEOGRAPH
+ 0xDC53: 0x90FF, //CJK UNIFIED IDEOGRAPH
+ 0xDC54: 0x90FC, //CJK UNIFIED IDEOGRAPH
+ 0xDC55: 0x9108, //CJK UNIFIED IDEOGRAPH
+ 0xDC56: 0x90F9, //CJK UNIFIED IDEOGRAPH
+ 0xDC57: 0x90FB, //CJK UNIFIED IDEOGRAPH
+ 0xDC58: 0x9101, //CJK UNIFIED IDEOGRAPH
+ 0xDC59: 0x9100, //CJK UNIFIED IDEOGRAPH
+ 0xDC5A: 0x9107, //CJK UNIFIED IDEOGRAPH
+ 0xDC5B: 0x9105, //CJK UNIFIED IDEOGRAPH
+ 0xDC5C: 0x9103, //CJK UNIFIED IDEOGRAPH
+ 0xDC5D: 0x9161, //CJK UNIFIED IDEOGRAPH
+ 0xDC5E: 0x9164, //CJK UNIFIED IDEOGRAPH
+ 0xDC5F: 0x915F, //CJK UNIFIED IDEOGRAPH
+ 0xDC60: 0x9162, //CJK UNIFIED IDEOGRAPH
+ 0xDC61: 0x9160, //CJK UNIFIED IDEOGRAPH
+ 0xDC62: 0x9201, //CJK UNIFIED IDEOGRAPH
+ 0xDC63: 0x920A, //CJK UNIFIED IDEOGRAPH
+ 0xDC64: 0x9225, //CJK UNIFIED IDEOGRAPH
+ 0xDC65: 0x9203, //CJK UNIFIED IDEOGRAPH
+ 0xDC66: 0x921A, //CJK UNIFIED IDEOGRAPH
+ 0xDC67: 0x9226, //CJK UNIFIED IDEOGRAPH
+ 0xDC68: 0x920F, //CJK UNIFIED IDEOGRAPH
+ 0xDC69: 0x920C, //CJK UNIFIED IDEOGRAPH
+ 0xDC6A: 0x9200, //CJK UNIFIED IDEOGRAPH
+ 0xDC6B: 0x9212, //CJK UNIFIED IDEOGRAPH
+ 0xDC6C: 0x91FF, //CJK UNIFIED IDEOGRAPH
+ 0xDC6D: 0x91FD, //CJK UNIFIED IDEOGRAPH
+ 0xDC6E: 0x9206, //CJK UNIFIED IDEOGRAPH
+ 0xDC6F: 0x9204, //CJK UNIFIED IDEOGRAPH
+ 0xDC70: 0x9227, //CJK UNIFIED IDEOGRAPH
+ 0xDC71: 0x9202, //CJK UNIFIED IDEOGRAPH
+ 0xDC72: 0x921C, //CJK UNIFIED IDEOGRAPH
+ 0xDC73: 0x9224, //CJK UNIFIED IDEOGRAPH
+ 0xDC74: 0x9219, //CJK UNIFIED IDEOGRAPH
+ 0xDC75: 0x9217, //CJK UNIFIED IDEOGRAPH
+ 0xDC76: 0x9205, //CJK UNIFIED IDEOGRAPH
+ 0xDC77: 0x9216, //CJK UNIFIED IDEOGRAPH
+ 0xDC78: 0x957B, //CJK UNIFIED IDEOGRAPH
+ 0xDC79: 0x958D, //CJK UNIFIED IDEOGRAPH
+ 0xDC7A: 0x958C, //CJK UNIFIED IDEOGRAPH
+ 0xDC7B: 0x9590, //CJK UNIFIED IDEOGRAPH
+ 0xDC7C: 0x9687, //CJK UNIFIED IDEOGRAPH
+ 0xDC7D: 0x967E, //CJK UNIFIED IDEOGRAPH
+ 0xDC7E: 0x9688, //CJK UNIFIED IDEOGRAPH
+ 0xDCA1: 0x9689, //CJK UNIFIED IDEOGRAPH
+ 0xDCA2: 0x9683, //CJK UNIFIED IDEOGRAPH
+ 0xDCA3: 0x9680, //CJK UNIFIED IDEOGRAPH
+ 0xDCA4: 0x96C2, //CJK UNIFIED IDEOGRAPH
+ 0xDCA5: 0x96C8, //CJK UNIFIED IDEOGRAPH
+ 0xDCA6: 0x96C3, //CJK UNIFIED IDEOGRAPH
+ 0xDCA7: 0x96F1, //CJK UNIFIED IDEOGRAPH
+ 0xDCA8: 0x96F0, //CJK UNIFIED IDEOGRAPH
+ 0xDCA9: 0x976C, //CJK UNIFIED IDEOGRAPH
+ 0xDCAA: 0x9770, //CJK UNIFIED IDEOGRAPH
+ 0xDCAB: 0x976E, //CJK UNIFIED IDEOGRAPH
+ 0xDCAC: 0x9807, //CJK UNIFIED IDEOGRAPH
+ 0xDCAD: 0x98A9, //CJK UNIFIED IDEOGRAPH
+ 0xDCAE: 0x98EB, //CJK UNIFIED IDEOGRAPH
+ 0xDCAF: 0x9CE6, //CJK UNIFIED IDEOGRAPH
+ 0xDCB0: 0x9EF9, //CJK UNIFIED IDEOGRAPH
+ 0xDCB1: 0x4E83, //CJK UNIFIED IDEOGRAPH
+ 0xDCB2: 0x4E84, //CJK UNIFIED IDEOGRAPH
+ 0xDCB3: 0x4EB6, //CJK UNIFIED IDEOGRAPH
+ 0xDCB4: 0x50BD, //CJK UNIFIED IDEOGRAPH
+ 0xDCB5: 0x50BF, //CJK UNIFIED IDEOGRAPH
+ 0xDCB6: 0x50C6, //CJK UNIFIED IDEOGRAPH
+ 0xDCB7: 0x50AE, //CJK UNIFIED IDEOGRAPH
+ 0xDCB8: 0x50C4, //CJK UNIFIED IDEOGRAPH
+ 0xDCB9: 0x50CA, //CJK UNIFIED IDEOGRAPH
+ 0xDCBA: 0x50B4, //CJK UNIFIED IDEOGRAPH
+ 0xDCBB: 0x50C8, //CJK UNIFIED IDEOGRAPH
+ 0xDCBC: 0x50C2, //CJK UNIFIED IDEOGRAPH
+ 0xDCBD: 0x50B0, //CJK UNIFIED IDEOGRAPH
+ 0xDCBE: 0x50C1, //CJK UNIFIED IDEOGRAPH
+ 0xDCBF: 0x50BA, //CJK UNIFIED IDEOGRAPH
+ 0xDCC0: 0x50B1, //CJK UNIFIED IDEOGRAPH
+ 0xDCC1: 0x50CB, //CJK UNIFIED IDEOGRAPH
+ 0xDCC2: 0x50C9, //CJK UNIFIED IDEOGRAPH
+ 0xDCC3: 0x50B6, //CJK UNIFIED IDEOGRAPH
+ 0xDCC4: 0x50B8, //CJK UNIFIED IDEOGRAPH
+ 0xDCC5: 0x51D7, //CJK UNIFIED IDEOGRAPH
+ 0xDCC6: 0x527A, //CJK UNIFIED IDEOGRAPH
+ 0xDCC7: 0x5278, //CJK UNIFIED IDEOGRAPH
+ 0xDCC8: 0x527B, //CJK UNIFIED IDEOGRAPH
+ 0xDCC9: 0x527C, //CJK UNIFIED IDEOGRAPH
+ 0xDCCA: 0x55C3, //CJK UNIFIED IDEOGRAPH
+ 0xDCCB: 0x55DB, //CJK UNIFIED IDEOGRAPH
+ 0xDCCC: 0x55CC, //CJK UNIFIED IDEOGRAPH
+ 0xDCCD: 0x55D0, //CJK UNIFIED IDEOGRAPH
+ 0xDCCE: 0x55CB, //CJK UNIFIED IDEOGRAPH
+ 0xDCCF: 0x55CA, //CJK UNIFIED IDEOGRAPH
+ 0xDCD0: 0x55DD, //CJK UNIFIED IDEOGRAPH
+ 0xDCD1: 0x55C0, //CJK UNIFIED IDEOGRAPH
+ 0xDCD2: 0x55D4, //CJK UNIFIED IDEOGRAPH
+ 0xDCD3: 0x55C4, //CJK UNIFIED IDEOGRAPH
+ 0xDCD4: 0x55E9, //CJK UNIFIED IDEOGRAPH
+ 0xDCD5: 0x55BF, //CJK UNIFIED IDEOGRAPH
+ 0xDCD6: 0x55D2, //CJK UNIFIED IDEOGRAPH
+ 0xDCD7: 0x558D, //CJK UNIFIED IDEOGRAPH
+ 0xDCD8: 0x55CF, //CJK UNIFIED IDEOGRAPH
+ 0xDCD9: 0x55D5, //CJK UNIFIED IDEOGRAPH
+ 0xDCDA: 0x55E2, //CJK UNIFIED IDEOGRAPH
+ 0xDCDB: 0x55D6, //CJK UNIFIED IDEOGRAPH
+ 0xDCDC: 0x55C8, //CJK UNIFIED IDEOGRAPH
+ 0xDCDD: 0x55F2, //CJK UNIFIED IDEOGRAPH
+ 0xDCDE: 0x55CD, //CJK UNIFIED IDEOGRAPH
+ 0xDCDF: 0x55D9, //CJK UNIFIED IDEOGRAPH
+ 0xDCE0: 0x55C2, //CJK UNIFIED IDEOGRAPH
+ 0xDCE1: 0x5714, //CJK UNIFIED IDEOGRAPH
+ 0xDCE2: 0x5853, //CJK UNIFIED IDEOGRAPH
+ 0xDCE3: 0x5868, //CJK UNIFIED IDEOGRAPH
+ 0xDCE4: 0x5864, //CJK UNIFIED IDEOGRAPH
+ 0xDCE5: 0x584F, //CJK UNIFIED IDEOGRAPH
+ 0xDCE6: 0x584D, //CJK UNIFIED IDEOGRAPH
+ 0xDCE7: 0x5849, //CJK UNIFIED IDEOGRAPH
+ 0xDCE8: 0x586F, //CJK UNIFIED IDEOGRAPH
+ 0xDCE9: 0x5855, //CJK UNIFIED IDEOGRAPH
+ 0xDCEA: 0x584E, //CJK UNIFIED IDEOGRAPH
+ 0xDCEB: 0x585D, //CJK UNIFIED IDEOGRAPH
+ 0xDCEC: 0x5859, //CJK UNIFIED IDEOGRAPH
+ 0xDCED: 0x5865, //CJK UNIFIED IDEOGRAPH
+ 0xDCEE: 0x585B, //CJK UNIFIED IDEOGRAPH
+ 0xDCEF: 0x583D, //CJK UNIFIED IDEOGRAPH
+ 0xDCF0: 0x5863, //CJK UNIFIED IDEOGRAPH
+ 0xDCF1: 0x5871, //CJK UNIFIED IDEOGRAPH
+ 0xDCF2: 0x58FC, //CJK UNIFIED IDEOGRAPH
+ 0xDCF3: 0x5AC7, //CJK UNIFIED IDEOGRAPH
+ 0xDCF4: 0x5AC4, //CJK UNIFIED IDEOGRAPH
+ 0xDCF5: 0x5ACB, //CJK UNIFIED IDEOGRAPH
+ 0xDCF6: 0x5ABA, //CJK UNIFIED IDEOGRAPH
+ 0xDCF7: 0x5AB8, //CJK UNIFIED IDEOGRAPH
+ 0xDCF8: 0x5AB1, //CJK UNIFIED IDEOGRAPH
+ 0xDCF9: 0x5AB5, //CJK UNIFIED IDEOGRAPH
+ 0xDCFA: 0x5AB0, //CJK UNIFIED IDEOGRAPH
+ 0xDCFB: 0x5ABF, //CJK UNIFIED IDEOGRAPH
+ 0xDCFC: 0x5AC8, //CJK UNIFIED IDEOGRAPH
+ 0xDCFD: 0x5ABB, //CJK UNIFIED IDEOGRAPH
+ 0xDCFE: 0x5AC6, //CJK UNIFIED IDEOGRAPH
+ 0xDD40: 0x5AB7, //CJK UNIFIED IDEOGRAPH
+ 0xDD41: 0x5AC0, //CJK UNIFIED IDEOGRAPH
+ 0xDD42: 0x5ACA, //CJK UNIFIED IDEOGRAPH
+ 0xDD43: 0x5AB4, //CJK UNIFIED IDEOGRAPH
+ 0xDD44: 0x5AB6, //CJK UNIFIED IDEOGRAPH
+ 0xDD45: 0x5ACD, //CJK UNIFIED IDEOGRAPH
+ 0xDD46: 0x5AB9, //CJK UNIFIED IDEOGRAPH
+ 0xDD47: 0x5A90, //CJK UNIFIED IDEOGRAPH
+ 0xDD48: 0x5BD6, //CJK UNIFIED IDEOGRAPH
+ 0xDD49: 0x5BD8, //CJK UNIFIED IDEOGRAPH
+ 0xDD4A: 0x5BD9, //CJK UNIFIED IDEOGRAPH
+ 0xDD4B: 0x5C1F, //CJK UNIFIED IDEOGRAPH
+ 0xDD4C: 0x5C33, //CJK UNIFIED IDEOGRAPH
+ 0xDD4D: 0x5D71, //CJK UNIFIED IDEOGRAPH
+ 0xDD4E: 0x5D63, //CJK UNIFIED IDEOGRAPH
+ 0xDD4F: 0x5D4A, //CJK UNIFIED IDEOGRAPH
+ 0xDD50: 0x5D65, //CJK UNIFIED IDEOGRAPH
+ 0xDD51: 0x5D72, //CJK UNIFIED IDEOGRAPH
+ 0xDD52: 0x5D6C, //CJK UNIFIED IDEOGRAPH
+ 0xDD53: 0x5D5E, //CJK UNIFIED IDEOGRAPH
+ 0xDD54: 0x5D68, //CJK UNIFIED IDEOGRAPH
+ 0xDD55: 0x5D67, //CJK UNIFIED IDEOGRAPH
+ 0xDD56: 0x5D62, //CJK UNIFIED IDEOGRAPH
+ 0xDD57: 0x5DF0, //CJK UNIFIED IDEOGRAPH
+ 0xDD58: 0x5E4F, //CJK UNIFIED IDEOGRAPH
+ 0xDD59: 0x5E4E, //CJK UNIFIED IDEOGRAPH
+ 0xDD5A: 0x5E4A, //CJK UNIFIED IDEOGRAPH
+ 0xDD5B: 0x5E4D, //CJK UNIFIED IDEOGRAPH
+ 0xDD5C: 0x5E4B, //CJK UNIFIED IDEOGRAPH
+ 0xDD5D: 0x5EC5, //CJK UNIFIED IDEOGRAPH
+ 0xDD5E: 0x5ECC, //CJK UNIFIED IDEOGRAPH
+ 0xDD5F: 0x5EC6, //CJK UNIFIED IDEOGRAPH
+ 0xDD60: 0x5ECB, //CJK UNIFIED IDEOGRAPH
+ 0xDD61: 0x5EC7, //CJK UNIFIED IDEOGRAPH
+ 0xDD62: 0x5F40, //CJK UNIFIED IDEOGRAPH
+ 0xDD63: 0x5FAF, //CJK UNIFIED IDEOGRAPH
+ 0xDD64: 0x5FAD, //CJK UNIFIED IDEOGRAPH
+ 0xDD65: 0x60F7, //CJK UNIFIED IDEOGRAPH
+ 0xDD66: 0x6149, //CJK UNIFIED IDEOGRAPH
+ 0xDD67: 0x614A, //CJK UNIFIED IDEOGRAPH
+ 0xDD68: 0x612B, //CJK UNIFIED IDEOGRAPH
+ 0xDD69: 0x6145, //CJK UNIFIED IDEOGRAPH
+ 0xDD6A: 0x6136, //CJK UNIFIED IDEOGRAPH
+ 0xDD6B: 0x6132, //CJK UNIFIED IDEOGRAPH
+ 0xDD6C: 0x612E, //CJK UNIFIED IDEOGRAPH
+ 0xDD6D: 0x6146, //CJK UNIFIED IDEOGRAPH
+ 0xDD6E: 0x612F, //CJK UNIFIED IDEOGRAPH
+ 0xDD6F: 0x614F, //CJK UNIFIED IDEOGRAPH
+ 0xDD70: 0x6129, //CJK UNIFIED IDEOGRAPH
+ 0xDD71: 0x6140, //CJK UNIFIED IDEOGRAPH
+ 0xDD72: 0x6220, //CJK UNIFIED IDEOGRAPH
+ 0xDD73: 0x9168, //CJK UNIFIED IDEOGRAPH
+ 0xDD74: 0x6223, //CJK UNIFIED IDEOGRAPH
+ 0xDD75: 0x6225, //CJK UNIFIED IDEOGRAPH
+ 0xDD76: 0x6224, //CJK UNIFIED IDEOGRAPH
+ 0xDD77: 0x63C5, //CJK UNIFIED IDEOGRAPH
+ 0xDD78: 0x63F1, //CJK UNIFIED IDEOGRAPH
+ 0xDD79: 0x63EB, //CJK UNIFIED IDEOGRAPH
+ 0xDD7A: 0x6410, //CJK UNIFIED IDEOGRAPH
+ 0xDD7B: 0x6412, //CJK UNIFIED IDEOGRAPH
+ 0xDD7C: 0x6409, //CJK UNIFIED IDEOGRAPH
+ 0xDD7D: 0x6420, //CJK UNIFIED IDEOGRAPH
+ 0xDD7E: 0x6424, //CJK UNIFIED IDEOGRAPH
+ 0xDDA1: 0x6433, //CJK UNIFIED IDEOGRAPH
+ 0xDDA2: 0x6443, //CJK UNIFIED IDEOGRAPH
+ 0xDDA3: 0x641F, //CJK UNIFIED IDEOGRAPH
+ 0xDDA4: 0x6415, //CJK UNIFIED IDEOGRAPH
+ 0xDDA5: 0x6418, //CJK UNIFIED IDEOGRAPH
+ 0xDDA6: 0x6439, //CJK UNIFIED IDEOGRAPH
+ 0xDDA7: 0x6437, //CJK UNIFIED IDEOGRAPH
+ 0xDDA8: 0x6422, //CJK UNIFIED IDEOGRAPH
+ 0xDDA9: 0x6423, //CJK UNIFIED IDEOGRAPH
+ 0xDDAA: 0x640C, //CJK UNIFIED IDEOGRAPH
+ 0xDDAB: 0x6426, //CJK UNIFIED IDEOGRAPH
+ 0xDDAC: 0x6430, //CJK UNIFIED IDEOGRAPH
+ 0xDDAD: 0x6428, //CJK UNIFIED IDEOGRAPH
+ 0xDDAE: 0x6441, //CJK UNIFIED IDEOGRAPH
+ 0xDDAF: 0x6435, //CJK UNIFIED IDEOGRAPH
+ 0xDDB0: 0x642F, //CJK UNIFIED IDEOGRAPH
+ 0xDDB1: 0x640A, //CJK UNIFIED IDEOGRAPH
+ 0xDDB2: 0x641A, //CJK UNIFIED IDEOGRAPH
+ 0xDDB3: 0x6440, //CJK UNIFIED IDEOGRAPH
+ 0xDDB4: 0x6425, //CJK UNIFIED IDEOGRAPH
+ 0xDDB5: 0x6427, //CJK UNIFIED IDEOGRAPH
+ 0xDDB6: 0x640B, //CJK UNIFIED IDEOGRAPH
+ 0xDDB7: 0x63E7, //CJK UNIFIED IDEOGRAPH
+ 0xDDB8: 0x641B, //CJK UNIFIED IDEOGRAPH
+ 0xDDB9: 0x642E, //CJK UNIFIED IDEOGRAPH
+ 0xDDBA: 0x6421, //CJK UNIFIED IDEOGRAPH
+ 0xDDBB: 0x640E, //CJK UNIFIED IDEOGRAPH
+ 0xDDBC: 0x656F, //CJK UNIFIED IDEOGRAPH
+ 0xDDBD: 0x6592, //CJK UNIFIED IDEOGRAPH
+ 0xDDBE: 0x65D3, //CJK UNIFIED IDEOGRAPH
+ 0xDDBF: 0x6686, //CJK UNIFIED IDEOGRAPH
+ 0xDDC0: 0x668C, //CJK UNIFIED IDEOGRAPH
+ 0xDDC1: 0x6695, //CJK UNIFIED IDEOGRAPH
+ 0xDDC2: 0x6690, //CJK UNIFIED IDEOGRAPH
+ 0xDDC3: 0x668B, //CJK UNIFIED IDEOGRAPH
+ 0xDDC4: 0x668A, //CJK UNIFIED IDEOGRAPH
+ 0xDDC5: 0x6699, //CJK UNIFIED IDEOGRAPH
+ 0xDDC6: 0x6694, //CJK UNIFIED IDEOGRAPH
+ 0xDDC7: 0x6678, //CJK UNIFIED IDEOGRAPH
+ 0xDDC8: 0x6720, //CJK UNIFIED IDEOGRAPH
+ 0xDDC9: 0x6966, //CJK UNIFIED IDEOGRAPH
+ 0xDDCA: 0x695F, //CJK UNIFIED IDEOGRAPH
+ 0xDDCB: 0x6938, //CJK UNIFIED IDEOGRAPH
+ 0xDDCC: 0x694E, //CJK UNIFIED IDEOGRAPH
+ 0xDDCD: 0x6962, //CJK UNIFIED IDEOGRAPH
+ 0xDDCE: 0x6971, //CJK UNIFIED IDEOGRAPH
+ 0xDDCF: 0x693F, //CJK UNIFIED IDEOGRAPH
+ 0xDDD0: 0x6945, //CJK UNIFIED IDEOGRAPH
+ 0xDDD1: 0x696A, //CJK UNIFIED IDEOGRAPH
+ 0xDDD2: 0x6939, //CJK UNIFIED IDEOGRAPH
+ 0xDDD3: 0x6942, //CJK UNIFIED IDEOGRAPH
+ 0xDDD4: 0x6957, //CJK UNIFIED IDEOGRAPH
+ 0xDDD5: 0x6959, //CJK UNIFIED IDEOGRAPH
+ 0xDDD6: 0x697A, //CJK UNIFIED IDEOGRAPH
+ 0xDDD7: 0x6948, //CJK UNIFIED IDEOGRAPH
+ 0xDDD8: 0x6949, //CJK UNIFIED IDEOGRAPH
+ 0xDDD9: 0x6935, //CJK UNIFIED IDEOGRAPH
+ 0xDDDA: 0x696C, //CJK UNIFIED IDEOGRAPH
+ 0xDDDB: 0x6933, //CJK UNIFIED IDEOGRAPH
+ 0xDDDC: 0x693D, //CJK UNIFIED IDEOGRAPH
+ 0xDDDD: 0x6965, //CJK UNIFIED IDEOGRAPH
+ 0xDDDE: 0x68F0, //CJK UNIFIED IDEOGRAPH
+ 0xDDDF: 0x6978, //CJK UNIFIED IDEOGRAPH
+ 0xDDE0: 0x6934, //CJK UNIFIED IDEOGRAPH
+ 0xDDE1: 0x6969, //CJK UNIFIED IDEOGRAPH
+ 0xDDE2: 0x6940, //CJK UNIFIED IDEOGRAPH
+ 0xDDE3: 0x696F, //CJK UNIFIED IDEOGRAPH
+ 0xDDE4: 0x6944, //CJK UNIFIED IDEOGRAPH
+ 0xDDE5: 0x6976, //CJK UNIFIED IDEOGRAPH
+ 0xDDE6: 0x6958, //CJK UNIFIED IDEOGRAPH
+ 0xDDE7: 0x6941, //CJK UNIFIED IDEOGRAPH
+ 0xDDE8: 0x6974, //CJK UNIFIED IDEOGRAPH
+ 0xDDE9: 0x694C, //CJK UNIFIED IDEOGRAPH
+ 0xDDEA: 0x693B, //CJK UNIFIED IDEOGRAPH
+ 0xDDEB: 0x694B, //CJK UNIFIED IDEOGRAPH
+ 0xDDEC: 0x6937, //CJK UNIFIED IDEOGRAPH
+ 0xDDED: 0x695C, //CJK UNIFIED IDEOGRAPH
+ 0xDDEE: 0x694F, //CJK UNIFIED IDEOGRAPH
+ 0xDDEF: 0x6951, //CJK UNIFIED IDEOGRAPH
+ 0xDDF0: 0x6932, //CJK UNIFIED IDEOGRAPH
+ 0xDDF1: 0x6952, //CJK UNIFIED IDEOGRAPH
+ 0xDDF2: 0x692F, //CJK UNIFIED IDEOGRAPH
+ 0xDDF3: 0x697B, //CJK UNIFIED IDEOGRAPH
+ 0xDDF4: 0x693C, //CJK UNIFIED IDEOGRAPH
+ 0xDDF5: 0x6B46, //CJK UNIFIED IDEOGRAPH
+ 0xDDF6: 0x6B45, //CJK UNIFIED IDEOGRAPH
+ 0xDDF7: 0x6B43, //CJK UNIFIED IDEOGRAPH
+ 0xDDF8: 0x6B42, //CJK UNIFIED IDEOGRAPH
+ 0xDDF9: 0x6B48, //CJK UNIFIED IDEOGRAPH
+ 0xDDFA: 0x6B41, //CJK UNIFIED IDEOGRAPH
+ 0xDDFB: 0x6B9B, //CJK UNIFIED IDEOGRAPH
+ 0xDDFC: 0xFA0D, //CJK COMPATIBILITY IDEOGRAPH
+ 0xDDFD: 0x6BFB, //CJK UNIFIED IDEOGRAPH
+ 0xDDFE: 0x6BFC, //CJK UNIFIED IDEOGRAPH
+ 0xDE40: 0x6BF9, //CJK UNIFIED IDEOGRAPH
+ 0xDE41: 0x6BF7, //CJK UNIFIED IDEOGRAPH
+ 0xDE42: 0x6BF8, //CJK UNIFIED IDEOGRAPH
+ 0xDE43: 0x6E9B, //CJK UNIFIED IDEOGRAPH
+ 0xDE44: 0x6ED6, //CJK UNIFIED IDEOGRAPH
+ 0xDE45: 0x6EC8, //CJK UNIFIED IDEOGRAPH
+ 0xDE46: 0x6E8F, //CJK UNIFIED IDEOGRAPH
+ 0xDE47: 0x6EC0, //CJK UNIFIED IDEOGRAPH
+ 0xDE48: 0x6E9F, //CJK UNIFIED IDEOGRAPH
+ 0xDE49: 0x6E93, //CJK UNIFIED IDEOGRAPH
+ 0xDE4A: 0x6E94, //CJK UNIFIED IDEOGRAPH
+ 0xDE4B: 0x6EA0, //CJK UNIFIED IDEOGRAPH
+ 0xDE4C: 0x6EB1, //CJK UNIFIED IDEOGRAPH
+ 0xDE4D: 0x6EB9, //CJK UNIFIED IDEOGRAPH
+ 0xDE4E: 0x6EC6, //CJK UNIFIED IDEOGRAPH
+ 0xDE4F: 0x6ED2, //CJK UNIFIED IDEOGRAPH
+ 0xDE50: 0x6EBD, //CJK UNIFIED IDEOGRAPH
+ 0xDE51: 0x6EC1, //CJK UNIFIED IDEOGRAPH
+ 0xDE52: 0x6E9E, //CJK UNIFIED IDEOGRAPH
+ 0xDE53: 0x6EC9, //CJK UNIFIED IDEOGRAPH
+ 0xDE54: 0x6EB7, //CJK UNIFIED IDEOGRAPH
+ 0xDE55: 0x6EB0, //CJK UNIFIED IDEOGRAPH
+ 0xDE56: 0x6ECD, //CJK UNIFIED IDEOGRAPH
+ 0xDE57: 0x6EA6, //CJK UNIFIED IDEOGRAPH
+ 0xDE58: 0x6ECF, //CJK UNIFIED IDEOGRAPH
+ 0xDE59: 0x6EB2, //CJK UNIFIED IDEOGRAPH
+ 0xDE5A: 0x6EBE, //CJK UNIFIED IDEOGRAPH
+ 0xDE5B: 0x6EC3, //CJK UNIFIED IDEOGRAPH
+ 0xDE5C: 0x6EDC, //CJK UNIFIED IDEOGRAPH
+ 0xDE5D: 0x6ED8, //CJK UNIFIED IDEOGRAPH
+ 0xDE5E: 0x6E99, //CJK UNIFIED IDEOGRAPH
+ 0xDE5F: 0x6E92, //CJK UNIFIED IDEOGRAPH
+ 0xDE60: 0x6E8E, //CJK UNIFIED IDEOGRAPH
+ 0xDE61: 0x6E8D, //CJK UNIFIED IDEOGRAPH
+ 0xDE62: 0x6EA4, //CJK UNIFIED IDEOGRAPH
+ 0xDE63: 0x6EA1, //CJK UNIFIED IDEOGRAPH
+ 0xDE64: 0x6EBF, //CJK UNIFIED IDEOGRAPH
+ 0xDE65: 0x6EB3, //CJK UNIFIED IDEOGRAPH
+ 0xDE66: 0x6ED0, //CJK UNIFIED IDEOGRAPH
+ 0xDE67: 0x6ECA, //CJK UNIFIED IDEOGRAPH
+ 0xDE68: 0x6E97, //CJK UNIFIED IDEOGRAPH
+ 0xDE69: 0x6EAE, //CJK UNIFIED IDEOGRAPH
+ 0xDE6A: 0x6EA3, //CJK UNIFIED IDEOGRAPH
+ 0xDE6B: 0x7147, //CJK UNIFIED IDEOGRAPH
+ 0xDE6C: 0x7154, //CJK UNIFIED IDEOGRAPH
+ 0xDE6D: 0x7152, //CJK UNIFIED IDEOGRAPH
+ 0xDE6E: 0x7163, //CJK UNIFIED IDEOGRAPH
+ 0xDE6F: 0x7160, //CJK UNIFIED IDEOGRAPH
+ 0xDE70: 0x7141, //CJK UNIFIED IDEOGRAPH
+ 0xDE71: 0x715D, //CJK UNIFIED IDEOGRAPH
+ 0xDE72: 0x7162, //CJK UNIFIED IDEOGRAPH
+ 0xDE73: 0x7172, //CJK UNIFIED IDEOGRAPH
+ 0xDE74: 0x7178, //CJK UNIFIED IDEOGRAPH
+ 0xDE75: 0x716A, //CJK UNIFIED IDEOGRAPH
+ 0xDE76: 0x7161, //CJK UNIFIED IDEOGRAPH
+ 0xDE77: 0x7142, //CJK UNIFIED IDEOGRAPH
+ 0xDE78: 0x7158, //CJK UNIFIED IDEOGRAPH
+ 0xDE79: 0x7143, //CJK UNIFIED IDEOGRAPH
+ 0xDE7A: 0x714B, //CJK UNIFIED IDEOGRAPH
+ 0xDE7B: 0x7170, //CJK UNIFIED IDEOGRAPH
+ 0xDE7C: 0x715F, //CJK UNIFIED IDEOGRAPH
+ 0xDE7D: 0x7150, //CJK UNIFIED IDEOGRAPH
+ 0xDE7E: 0x7153, //CJK UNIFIED IDEOGRAPH
+ 0xDEA1: 0x7144, //CJK UNIFIED IDEOGRAPH
+ 0xDEA2: 0x714D, //CJK UNIFIED IDEOGRAPH
+ 0xDEA3: 0x715A, //CJK UNIFIED IDEOGRAPH
+ 0xDEA4: 0x724F, //CJK UNIFIED IDEOGRAPH
+ 0xDEA5: 0x728D, //CJK UNIFIED IDEOGRAPH
+ 0xDEA6: 0x728C, //CJK UNIFIED IDEOGRAPH
+ 0xDEA7: 0x7291, //CJK UNIFIED IDEOGRAPH
+ 0xDEA8: 0x7290, //CJK UNIFIED IDEOGRAPH
+ 0xDEA9: 0x728E, //CJK UNIFIED IDEOGRAPH
+ 0xDEAA: 0x733C, //CJK UNIFIED IDEOGRAPH
+ 0xDEAB: 0x7342, //CJK UNIFIED IDEOGRAPH
+ 0xDEAC: 0x733B, //CJK UNIFIED IDEOGRAPH
+ 0xDEAD: 0x733A, //CJK UNIFIED IDEOGRAPH
+ 0xDEAE: 0x7340, //CJK UNIFIED IDEOGRAPH
+ 0xDEAF: 0x734A, //CJK UNIFIED IDEOGRAPH
+ 0xDEB0: 0x7349, //CJK UNIFIED IDEOGRAPH
+ 0xDEB1: 0x7444, //CJK UNIFIED IDEOGRAPH
+ 0xDEB2: 0x744A, //CJK UNIFIED IDEOGRAPH
+ 0xDEB3: 0x744B, //CJK UNIFIED IDEOGRAPH
+ 0xDEB4: 0x7452, //CJK UNIFIED IDEOGRAPH
+ 0xDEB5: 0x7451, //CJK UNIFIED IDEOGRAPH
+ 0xDEB6: 0x7457, //CJK UNIFIED IDEOGRAPH
+ 0xDEB7: 0x7440, //CJK UNIFIED IDEOGRAPH
+ 0xDEB8: 0x744F, //CJK UNIFIED IDEOGRAPH
+ 0xDEB9: 0x7450, //CJK UNIFIED IDEOGRAPH
+ 0xDEBA: 0x744E, //CJK UNIFIED IDEOGRAPH
+ 0xDEBB: 0x7442, //CJK UNIFIED IDEOGRAPH
+ 0xDEBC: 0x7446, //CJK UNIFIED IDEOGRAPH
+ 0xDEBD: 0x744D, //CJK UNIFIED IDEOGRAPH
+ 0xDEBE: 0x7454, //CJK UNIFIED IDEOGRAPH
+ 0xDEBF: 0x74E1, //CJK UNIFIED IDEOGRAPH
+ 0xDEC0: 0x74FF, //CJK UNIFIED IDEOGRAPH
+ 0xDEC1: 0x74FE, //CJK UNIFIED IDEOGRAPH
+ 0xDEC2: 0x74FD, //CJK UNIFIED IDEOGRAPH
+ 0xDEC3: 0x751D, //CJK UNIFIED IDEOGRAPH
+ 0xDEC4: 0x7579, //CJK UNIFIED IDEOGRAPH
+ 0xDEC5: 0x7577, //CJK UNIFIED IDEOGRAPH
+ 0xDEC6: 0x6983, //CJK UNIFIED IDEOGRAPH
+ 0xDEC7: 0x75EF, //CJK UNIFIED IDEOGRAPH
+ 0xDEC8: 0x760F, //CJK UNIFIED IDEOGRAPH
+ 0xDEC9: 0x7603, //CJK UNIFIED IDEOGRAPH
+ 0xDECA: 0x75F7, //CJK UNIFIED IDEOGRAPH
+ 0xDECB: 0x75FE, //CJK UNIFIED IDEOGRAPH
+ 0xDECC: 0x75FC, //CJK UNIFIED IDEOGRAPH
+ 0xDECD: 0x75F9, //CJK UNIFIED IDEOGRAPH
+ 0xDECE: 0x75F8, //CJK UNIFIED IDEOGRAPH
+ 0xDECF: 0x7610, //CJK UNIFIED IDEOGRAPH
+ 0xDED0: 0x75FB, //CJK UNIFIED IDEOGRAPH
+ 0xDED1: 0x75F6, //CJK UNIFIED IDEOGRAPH
+ 0xDED2: 0x75ED, //CJK UNIFIED IDEOGRAPH
+ 0xDED3: 0x75F5, //CJK UNIFIED IDEOGRAPH
+ 0xDED4: 0x75FD, //CJK UNIFIED IDEOGRAPH
+ 0xDED5: 0x7699, //CJK UNIFIED IDEOGRAPH
+ 0xDED6: 0x76B5, //CJK UNIFIED IDEOGRAPH
+ 0xDED7: 0x76DD, //CJK UNIFIED IDEOGRAPH
+ 0xDED8: 0x7755, //CJK UNIFIED IDEOGRAPH
+ 0xDED9: 0x775F, //CJK UNIFIED IDEOGRAPH
+ 0xDEDA: 0x7760, //CJK UNIFIED IDEOGRAPH
+ 0xDEDB: 0x7752, //CJK UNIFIED IDEOGRAPH
+ 0xDEDC: 0x7756, //CJK UNIFIED IDEOGRAPH
+ 0xDEDD: 0x775A, //CJK UNIFIED IDEOGRAPH
+ 0xDEDE: 0x7769, //CJK UNIFIED IDEOGRAPH
+ 0xDEDF: 0x7767, //CJK UNIFIED IDEOGRAPH
+ 0xDEE0: 0x7754, //CJK UNIFIED IDEOGRAPH
+ 0xDEE1: 0x7759, //CJK UNIFIED IDEOGRAPH
+ 0xDEE2: 0x776D, //CJK UNIFIED IDEOGRAPH
+ 0xDEE3: 0x77E0, //CJK UNIFIED IDEOGRAPH
+ 0xDEE4: 0x7887, //CJK UNIFIED IDEOGRAPH
+ 0xDEE5: 0x789A, //CJK UNIFIED IDEOGRAPH
+ 0xDEE6: 0x7894, //CJK UNIFIED IDEOGRAPH
+ 0xDEE7: 0x788F, //CJK UNIFIED IDEOGRAPH
+ 0xDEE8: 0x7884, //CJK UNIFIED IDEOGRAPH
+ 0xDEE9: 0x7895, //CJK UNIFIED IDEOGRAPH
+ 0xDEEA: 0x7885, //CJK UNIFIED IDEOGRAPH
+ 0xDEEB: 0x7886, //CJK UNIFIED IDEOGRAPH
+ 0xDEEC: 0x78A1, //CJK UNIFIED IDEOGRAPH
+ 0xDEED: 0x7883, //CJK UNIFIED IDEOGRAPH
+ 0xDEEE: 0x7879, //CJK UNIFIED IDEOGRAPH
+ 0xDEEF: 0x7899, //CJK UNIFIED IDEOGRAPH
+ 0xDEF0: 0x7880, //CJK UNIFIED IDEOGRAPH
+ 0xDEF1: 0x7896, //CJK UNIFIED IDEOGRAPH
+ 0xDEF2: 0x787B, //CJK UNIFIED IDEOGRAPH
+ 0xDEF3: 0x797C, //CJK UNIFIED IDEOGRAPH
+ 0xDEF4: 0x7982, //CJK UNIFIED IDEOGRAPH
+ 0xDEF5: 0x797D, //CJK UNIFIED IDEOGRAPH
+ 0xDEF6: 0x7979, //CJK UNIFIED IDEOGRAPH
+ 0xDEF7: 0x7A11, //CJK UNIFIED IDEOGRAPH
+ 0xDEF8: 0x7A18, //CJK UNIFIED IDEOGRAPH
+ 0xDEF9: 0x7A19, //CJK UNIFIED IDEOGRAPH
+ 0xDEFA: 0x7A12, //CJK UNIFIED IDEOGRAPH
+ 0xDEFB: 0x7A17, //CJK UNIFIED IDEOGRAPH
+ 0xDEFC: 0x7A15, //CJK UNIFIED IDEOGRAPH
+ 0xDEFD: 0x7A22, //CJK UNIFIED IDEOGRAPH
+ 0xDEFE: 0x7A13, //CJK UNIFIED IDEOGRAPH
+ 0xDF40: 0x7A1B, //CJK UNIFIED IDEOGRAPH
+ 0xDF41: 0x7A10, //CJK UNIFIED IDEOGRAPH
+ 0xDF42: 0x7AA3, //CJK UNIFIED IDEOGRAPH
+ 0xDF43: 0x7AA2, //CJK UNIFIED IDEOGRAPH
+ 0xDF44: 0x7A9E, //CJK UNIFIED IDEOGRAPH
+ 0xDF45: 0x7AEB, //CJK UNIFIED IDEOGRAPH
+ 0xDF46: 0x7B66, //CJK UNIFIED IDEOGRAPH
+ 0xDF47: 0x7B64, //CJK UNIFIED IDEOGRAPH
+ 0xDF48: 0x7B6D, //CJK UNIFIED IDEOGRAPH
+ 0xDF49: 0x7B74, //CJK UNIFIED IDEOGRAPH
+ 0xDF4A: 0x7B69, //CJK UNIFIED IDEOGRAPH
+ 0xDF4B: 0x7B72, //CJK UNIFIED IDEOGRAPH
+ 0xDF4C: 0x7B65, //CJK UNIFIED IDEOGRAPH
+ 0xDF4D: 0x7B73, //CJK UNIFIED IDEOGRAPH
+ 0xDF4E: 0x7B71, //CJK UNIFIED IDEOGRAPH
+ 0xDF4F: 0x7B70, //CJK UNIFIED IDEOGRAPH
+ 0xDF50: 0x7B61, //CJK UNIFIED IDEOGRAPH
+ 0xDF51: 0x7B78, //CJK UNIFIED IDEOGRAPH
+ 0xDF52: 0x7B76, //CJK UNIFIED IDEOGRAPH
+ 0xDF53: 0x7B63, //CJK UNIFIED IDEOGRAPH
+ 0xDF54: 0x7CB2, //CJK UNIFIED IDEOGRAPH
+ 0xDF55: 0x7CB4, //CJK UNIFIED IDEOGRAPH
+ 0xDF56: 0x7CAF, //CJK UNIFIED IDEOGRAPH
+ 0xDF57: 0x7D88, //CJK UNIFIED IDEOGRAPH
+ 0xDF58: 0x7D86, //CJK UNIFIED IDEOGRAPH
+ 0xDF59: 0x7D80, //CJK UNIFIED IDEOGRAPH
+ 0xDF5A: 0x7D8D, //CJK UNIFIED IDEOGRAPH
+ 0xDF5B: 0x7D7F, //CJK UNIFIED IDEOGRAPH
+ 0xDF5C: 0x7D85, //CJK UNIFIED IDEOGRAPH
+ 0xDF5D: 0x7D7A, //CJK UNIFIED IDEOGRAPH
+ 0xDF5E: 0x7D8E, //CJK UNIFIED IDEOGRAPH
+ 0xDF5F: 0x7D7B, //CJK UNIFIED IDEOGRAPH
+ 0xDF60: 0x7D83, //CJK UNIFIED IDEOGRAPH
+ 0xDF61: 0x7D7C, //CJK UNIFIED IDEOGRAPH
+ 0xDF62: 0x7D8C, //CJK UNIFIED IDEOGRAPH
+ 0xDF63: 0x7D94, //CJK UNIFIED IDEOGRAPH
+ 0xDF64: 0x7D84, //CJK UNIFIED IDEOGRAPH
+ 0xDF65: 0x7D7D, //CJK UNIFIED IDEOGRAPH
+ 0xDF66: 0x7D92, //CJK UNIFIED IDEOGRAPH
+ 0xDF67: 0x7F6D, //CJK UNIFIED IDEOGRAPH
+ 0xDF68: 0x7F6B, //CJK UNIFIED IDEOGRAPH
+ 0xDF69: 0x7F67, //CJK UNIFIED IDEOGRAPH
+ 0xDF6A: 0x7F68, //CJK UNIFIED IDEOGRAPH
+ 0xDF6B: 0x7F6C, //CJK UNIFIED IDEOGRAPH
+ 0xDF6C: 0x7FA6, //CJK UNIFIED IDEOGRAPH
+ 0xDF6D: 0x7FA5, //CJK UNIFIED IDEOGRAPH
+ 0xDF6E: 0x7FA7, //CJK UNIFIED IDEOGRAPH
+ 0xDF6F: 0x7FDB, //CJK UNIFIED IDEOGRAPH
+ 0xDF70: 0x7FDC, //CJK UNIFIED IDEOGRAPH
+ 0xDF71: 0x8021, //CJK UNIFIED IDEOGRAPH
+ 0xDF72: 0x8164, //CJK UNIFIED IDEOGRAPH
+ 0xDF73: 0x8160, //CJK UNIFIED IDEOGRAPH
+ 0xDF74: 0x8177, //CJK UNIFIED IDEOGRAPH
+ 0xDF75: 0x815C, //CJK UNIFIED IDEOGRAPH
+ 0xDF76: 0x8169, //CJK UNIFIED IDEOGRAPH
+ 0xDF77: 0x815B, //CJK UNIFIED IDEOGRAPH
+ 0xDF78: 0x8162, //CJK UNIFIED IDEOGRAPH
+ 0xDF79: 0x8172, //CJK UNIFIED IDEOGRAPH
+ 0xDF7A: 0x6721, //CJK UNIFIED IDEOGRAPH
+ 0xDF7B: 0x815E, //CJK UNIFIED IDEOGRAPH
+ 0xDF7C: 0x8176, //CJK UNIFIED IDEOGRAPH
+ 0xDF7D: 0x8167, //CJK UNIFIED IDEOGRAPH
+ 0xDF7E: 0x816F, //CJK UNIFIED IDEOGRAPH
+ 0xDFA1: 0x8144, //CJK UNIFIED IDEOGRAPH
+ 0xDFA2: 0x8161, //CJK UNIFIED IDEOGRAPH
+ 0xDFA3: 0x821D, //CJK UNIFIED IDEOGRAPH
+ 0xDFA4: 0x8249, //CJK UNIFIED IDEOGRAPH
+ 0xDFA5: 0x8244, //CJK UNIFIED IDEOGRAPH
+ 0xDFA6: 0x8240, //CJK UNIFIED IDEOGRAPH
+ 0xDFA7: 0x8242, //CJK UNIFIED IDEOGRAPH
+ 0xDFA8: 0x8245, //CJK UNIFIED IDEOGRAPH
+ 0xDFA9: 0x84F1, //CJK UNIFIED IDEOGRAPH
+ 0xDFAA: 0x843F, //CJK UNIFIED IDEOGRAPH
+ 0xDFAB: 0x8456, //CJK UNIFIED IDEOGRAPH
+ 0xDFAC: 0x8476, //CJK UNIFIED IDEOGRAPH
+ 0xDFAD: 0x8479, //CJK UNIFIED IDEOGRAPH
+ 0xDFAE: 0x848F, //CJK UNIFIED IDEOGRAPH
+ 0xDFAF: 0x848D, //CJK UNIFIED IDEOGRAPH
+ 0xDFB0: 0x8465, //CJK UNIFIED IDEOGRAPH
+ 0xDFB1: 0x8451, //CJK UNIFIED IDEOGRAPH
+ 0xDFB2: 0x8440, //CJK UNIFIED IDEOGRAPH
+ 0xDFB3: 0x8486, //CJK UNIFIED IDEOGRAPH
+ 0xDFB4: 0x8467, //CJK UNIFIED IDEOGRAPH
+ 0xDFB5: 0x8430, //CJK UNIFIED IDEOGRAPH
+ 0xDFB6: 0x844D, //CJK UNIFIED IDEOGRAPH
+ 0xDFB7: 0x847D, //CJK UNIFIED IDEOGRAPH
+ 0xDFB8: 0x845A, //CJK UNIFIED IDEOGRAPH
+ 0xDFB9: 0x8459, //CJK UNIFIED IDEOGRAPH
+ 0xDFBA: 0x8474, //CJK UNIFIED IDEOGRAPH
+ 0xDFBB: 0x8473, //CJK UNIFIED IDEOGRAPH
+ 0xDFBC: 0x845D, //CJK UNIFIED IDEOGRAPH
+ 0xDFBD: 0x8507, //CJK UNIFIED IDEOGRAPH
+ 0xDFBE: 0x845E, //CJK UNIFIED IDEOGRAPH
+ 0xDFBF: 0x8437, //CJK UNIFIED IDEOGRAPH
+ 0xDFC0: 0x843A, //CJK UNIFIED IDEOGRAPH
+ 0xDFC1: 0x8434, //CJK UNIFIED IDEOGRAPH
+ 0xDFC2: 0x847A, //CJK UNIFIED IDEOGRAPH
+ 0xDFC3: 0x8443, //CJK UNIFIED IDEOGRAPH
+ 0xDFC4: 0x8478, //CJK UNIFIED IDEOGRAPH
+ 0xDFC5: 0x8432, //CJK UNIFIED IDEOGRAPH
+ 0xDFC6: 0x8445, //CJK UNIFIED IDEOGRAPH
+ 0xDFC7: 0x8429, //CJK UNIFIED IDEOGRAPH
+ 0xDFC8: 0x83D9, //CJK UNIFIED IDEOGRAPH
+ 0xDFC9: 0x844B, //CJK UNIFIED IDEOGRAPH
+ 0xDFCA: 0x842F, //CJK UNIFIED IDEOGRAPH
+ 0xDFCB: 0x8442, //CJK UNIFIED IDEOGRAPH
+ 0xDFCC: 0x842D, //CJK UNIFIED IDEOGRAPH
+ 0xDFCD: 0x845F, //CJK UNIFIED IDEOGRAPH
+ 0xDFCE: 0x8470, //CJK UNIFIED IDEOGRAPH
+ 0xDFCF: 0x8439, //CJK UNIFIED IDEOGRAPH
+ 0xDFD0: 0x844E, //CJK UNIFIED IDEOGRAPH
+ 0xDFD1: 0x844C, //CJK UNIFIED IDEOGRAPH
+ 0xDFD2: 0x8452, //CJK UNIFIED IDEOGRAPH
+ 0xDFD3: 0x846F, //CJK UNIFIED IDEOGRAPH
+ 0xDFD4: 0x84C5, //CJK UNIFIED IDEOGRAPH
+ 0xDFD5: 0x848E, //CJK UNIFIED IDEOGRAPH
+ 0xDFD6: 0x843B, //CJK UNIFIED IDEOGRAPH
+ 0xDFD7: 0x8447, //CJK UNIFIED IDEOGRAPH
+ 0xDFD8: 0x8436, //CJK UNIFIED IDEOGRAPH
+ 0xDFD9: 0x8433, //CJK UNIFIED IDEOGRAPH
+ 0xDFDA: 0x8468, //CJK UNIFIED IDEOGRAPH
+ 0xDFDB: 0x847E, //CJK UNIFIED IDEOGRAPH
+ 0xDFDC: 0x8444, //CJK UNIFIED IDEOGRAPH
+ 0xDFDD: 0x842B, //CJK UNIFIED IDEOGRAPH
+ 0xDFDE: 0x8460, //CJK UNIFIED IDEOGRAPH
+ 0xDFDF: 0x8454, //CJK UNIFIED IDEOGRAPH
+ 0xDFE0: 0x846E, //CJK UNIFIED IDEOGRAPH
+ 0xDFE1: 0x8450, //CJK UNIFIED IDEOGRAPH
+ 0xDFE2: 0x870B, //CJK UNIFIED IDEOGRAPH
+ 0xDFE3: 0x8704, //CJK UNIFIED IDEOGRAPH
+ 0xDFE4: 0x86F7, //CJK UNIFIED IDEOGRAPH
+ 0xDFE5: 0x870C, //CJK UNIFIED IDEOGRAPH
+ 0xDFE6: 0x86FA, //CJK UNIFIED IDEOGRAPH
+ 0xDFE7: 0x86D6, //CJK UNIFIED IDEOGRAPH
+ 0xDFE8: 0x86F5, //CJK UNIFIED IDEOGRAPH
+ 0xDFE9: 0x874D, //CJK UNIFIED IDEOGRAPH
+ 0xDFEA: 0x86F8, //CJK UNIFIED IDEOGRAPH
+ 0xDFEB: 0x870E, //CJK UNIFIED IDEOGRAPH
+ 0xDFEC: 0x8709, //CJK UNIFIED IDEOGRAPH
+ 0xDFED: 0x8701, //CJK UNIFIED IDEOGRAPH
+ 0xDFEE: 0x86F6, //CJK UNIFIED IDEOGRAPH
+ 0xDFEF: 0x870D, //CJK UNIFIED IDEOGRAPH
+ 0xDFF0: 0x8705, //CJK UNIFIED IDEOGRAPH
+ 0xDFF1: 0x88D6, //CJK UNIFIED IDEOGRAPH
+ 0xDFF2: 0x88CB, //CJK UNIFIED IDEOGRAPH
+ 0xDFF3: 0x88CD, //CJK UNIFIED IDEOGRAPH
+ 0xDFF4: 0x88CE, //CJK UNIFIED IDEOGRAPH
+ 0xDFF5: 0x88DE, //CJK UNIFIED IDEOGRAPH
+ 0xDFF6: 0x88DB, //CJK UNIFIED IDEOGRAPH
+ 0xDFF7: 0x88DA, //CJK UNIFIED IDEOGRAPH
+ 0xDFF8: 0x88CC, //CJK UNIFIED IDEOGRAPH
+ 0xDFF9: 0x88D0, //CJK UNIFIED IDEOGRAPH
+ 0xDFFA: 0x8985, //CJK UNIFIED IDEOGRAPH
+ 0xDFFB: 0x899B, //CJK UNIFIED IDEOGRAPH
+ 0xDFFC: 0x89DF, //CJK UNIFIED IDEOGRAPH
+ 0xDFFD: 0x89E5, //CJK UNIFIED IDEOGRAPH
+ 0xDFFE: 0x89E4, //CJK UNIFIED IDEOGRAPH
+ 0xE040: 0x89E1, //CJK UNIFIED IDEOGRAPH
+ 0xE041: 0x89E0, //CJK UNIFIED IDEOGRAPH
+ 0xE042: 0x89E2, //CJK UNIFIED IDEOGRAPH
+ 0xE043: 0x89DC, //CJK UNIFIED IDEOGRAPH
+ 0xE044: 0x89E6, //CJK UNIFIED IDEOGRAPH
+ 0xE045: 0x8A76, //CJK UNIFIED IDEOGRAPH
+ 0xE046: 0x8A86, //CJK UNIFIED IDEOGRAPH
+ 0xE047: 0x8A7F, //CJK UNIFIED IDEOGRAPH
+ 0xE048: 0x8A61, //CJK UNIFIED IDEOGRAPH
+ 0xE049: 0x8A3F, //CJK UNIFIED IDEOGRAPH
+ 0xE04A: 0x8A77, //CJK UNIFIED IDEOGRAPH
+ 0xE04B: 0x8A82, //CJK UNIFIED IDEOGRAPH
+ 0xE04C: 0x8A84, //CJK UNIFIED IDEOGRAPH
+ 0xE04D: 0x8A75, //CJK UNIFIED IDEOGRAPH
+ 0xE04E: 0x8A83, //CJK UNIFIED IDEOGRAPH
+ 0xE04F: 0x8A81, //CJK UNIFIED IDEOGRAPH
+ 0xE050: 0x8A74, //CJK UNIFIED IDEOGRAPH
+ 0xE051: 0x8A7A, //CJK UNIFIED IDEOGRAPH
+ 0xE052: 0x8C3C, //CJK UNIFIED IDEOGRAPH
+ 0xE053: 0x8C4B, //CJK UNIFIED IDEOGRAPH
+ 0xE054: 0x8C4A, //CJK UNIFIED IDEOGRAPH
+ 0xE055: 0x8C65, //CJK UNIFIED IDEOGRAPH
+ 0xE056: 0x8C64, //CJK UNIFIED IDEOGRAPH
+ 0xE057: 0x8C66, //CJK UNIFIED IDEOGRAPH
+ 0xE058: 0x8C86, //CJK UNIFIED IDEOGRAPH
+ 0xE059: 0x8C84, //CJK UNIFIED IDEOGRAPH
+ 0xE05A: 0x8C85, //CJK UNIFIED IDEOGRAPH
+ 0xE05B: 0x8CCC, //CJK UNIFIED IDEOGRAPH
+ 0xE05C: 0x8D68, //CJK UNIFIED IDEOGRAPH
+ 0xE05D: 0x8D69, //CJK UNIFIED IDEOGRAPH
+ 0xE05E: 0x8D91, //CJK UNIFIED IDEOGRAPH
+ 0xE05F: 0x8D8C, //CJK UNIFIED IDEOGRAPH
+ 0xE060: 0x8D8E, //CJK UNIFIED IDEOGRAPH
+ 0xE061: 0x8D8F, //CJK UNIFIED IDEOGRAPH
+ 0xE062: 0x8D8D, //CJK UNIFIED IDEOGRAPH
+ 0xE063: 0x8D93, //CJK UNIFIED IDEOGRAPH
+ 0xE064: 0x8D94, //CJK UNIFIED IDEOGRAPH
+ 0xE065: 0x8D90, //CJK UNIFIED IDEOGRAPH
+ 0xE066: 0x8D92, //CJK UNIFIED IDEOGRAPH
+ 0xE067: 0x8DF0, //CJK UNIFIED IDEOGRAPH
+ 0xE068: 0x8DE0, //CJK UNIFIED IDEOGRAPH
+ 0xE069: 0x8DEC, //CJK UNIFIED IDEOGRAPH
+ 0xE06A: 0x8DF1, //CJK UNIFIED IDEOGRAPH
+ 0xE06B: 0x8DEE, //CJK UNIFIED IDEOGRAPH
+ 0xE06C: 0x8DD0, //CJK UNIFIED IDEOGRAPH
+ 0xE06D: 0x8DE9, //CJK UNIFIED IDEOGRAPH
+ 0xE06E: 0x8DE3, //CJK UNIFIED IDEOGRAPH
+ 0xE06F: 0x8DE2, //CJK UNIFIED IDEOGRAPH
+ 0xE070: 0x8DE7, //CJK UNIFIED IDEOGRAPH
+ 0xE071: 0x8DF2, //CJK UNIFIED IDEOGRAPH
+ 0xE072: 0x8DEB, //CJK UNIFIED IDEOGRAPH
+ 0xE073: 0x8DF4, //CJK UNIFIED IDEOGRAPH
+ 0xE074: 0x8F06, //CJK UNIFIED IDEOGRAPH
+ 0xE075: 0x8EFF, //CJK UNIFIED IDEOGRAPH
+ 0xE076: 0x8F01, //CJK UNIFIED IDEOGRAPH
+ 0xE077: 0x8F00, //CJK UNIFIED IDEOGRAPH
+ 0xE078: 0x8F05, //CJK UNIFIED IDEOGRAPH
+ 0xE079: 0x8F07, //CJK UNIFIED IDEOGRAPH
+ 0xE07A: 0x8F08, //CJK UNIFIED IDEOGRAPH
+ 0xE07B: 0x8F02, //CJK UNIFIED IDEOGRAPH
+ 0xE07C: 0x8F0B, //CJK UNIFIED IDEOGRAPH
+ 0xE07D: 0x9052, //CJK UNIFIED IDEOGRAPH
+ 0xE07E: 0x903F, //CJK UNIFIED IDEOGRAPH
+ 0xE0A1: 0x9044, //CJK UNIFIED IDEOGRAPH
+ 0xE0A2: 0x9049, //CJK UNIFIED IDEOGRAPH
+ 0xE0A3: 0x903D, //CJK UNIFIED IDEOGRAPH
+ 0xE0A4: 0x9110, //CJK UNIFIED IDEOGRAPH
+ 0xE0A5: 0x910D, //CJK UNIFIED IDEOGRAPH
+ 0xE0A6: 0x910F, //CJK UNIFIED IDEOGRAPH
+ 0xE0A7: 0x9111, //CJK UNIFIED IDEOGRAPH
+ 0xE0A8: 0x9116, //CJK UNIFIED IDEOGRAPH
+ 0xE0A9: 0x9114, //CJK UNIFIED IDEOGRAPH
+ 0xE0AA: 0x910B, //CJK UNIFIED IDEOGRAPH
+ 0xE0AB: 0x910E, //CJK UNIFIED IDEOGRAPH
+ 0xE0AC: 0x916E, //CJK UNIFIED IDEOGRAPH
+ 0xE0AD: 0x916F, //CJK UNIFIED IDEOGRAPH
+ 0xE0AE: 0x9248, //CJK UNIFIED IDEOGRAPH
+ 0xE0AF: 0x9252, //CJK UNIFIED IDEOGRAPH
+ 0xE0B0: 0x9230, //CJK UNIFIED IDEOGRAPH
+ 0xE0B1: 0x923A, //CJK UNIFIED IDEOGRAPH
+ 0xE0B2: 0x9266, //CJK UNIFIED IDEOGRAPH
+ 0xE0B3: 0x9233, //CJK UNIFIED IDEOGRAPH
+ 0xE0B4: 0x9265, //CJK UNIFIED IDEOGRAPH
+ 0xE0B5: 0x925E, //CJK UNIFIED IDEOGRAPH
+ 0xE0B6: 0x9283, //CJK UNIFIED IDEOGRAPH
+ 0xE0B7: 0x922E, //CJK UNIFIED IDEOGRAPH
+ 0xE0B8: 0x924A, //CJK UNIFIED IDEOGRAPH
+ 0xE0B9: 0x9246, //CJK UNIFIED IDEOGRAPH
+ 0xE0BA: 0x926D, //CJK UNIFIED IDEOGRAPH
+ 0xE0BB: 0x926C, //CJK UNIFIED IDEOGRAPH
+ 0xE0BC: 0x924F, //CJK UNIFIED IDEOGRAPH
+ 0xE0BD: 0x9260, //CJK UNIFIED IDEOGRAPH
+ 0xE0BE: 0x9267, //CJK UNIFIED IDEOGRAPH
+ 0xE0BF: 0x926F, //CJK UNIFIED IDEOGRAPH
+ 0xE0C0: 0x9236, //CJK UNIFIED IDEOGRAPH
+ 0xE0C1: 0x9261, //CJK UNIFIED IDEOGRAPH
+ 0xE0C2: 0x9270, //CJK UNIFIED IDEOGRAPH
+ 0xE0C3: 0x9231, //CJK UNIFIED IDEOGRAPH
+ 0xE0C4: 0x9254, //CJK UNIFIED IDEOGRAPH
+ 0xE0C5: 0x9263, //CJK UNIFIED IDEOGRAPH
+ 0xE0C6: 0x9250, //CJK UNIFIED IDEOGRAPH
+ 0xE0C7: 0x9272, //CJK UNIFIED IDEOGRAPH
+ 0xE0C8: 0x924E, //CJK UNIFIED IDEOGRAPH
+ 0xE0C9: 0x9253, //CJK UNIFIED IDEOGRAPH
+ 0xE0CA: 0x924C, //CJK UNIFIED IDEOGRAPH
+ 0xE0CB: 0x9256, //CJK UNIFIED IDEOGRAPH
+ 0xE0CC: 0x9232, //CJK UNIFIED IDEOGRAPH
+ 0xE0CD: 0x959F, //CJK UNIFIED IDEOGRAPH
+ 0xE0CE: 0x959C, //CJK UNIFIED IDEOGRAPH
+ 0xE0CF: 0x959E, //CJK UNIFIED IDEOGRAPH
+ 0xE0D0: 0x959B, //CJK UNIFIED IDEOGRAPH
+ 0xE0D1: 0x9692, //CJK UNIFIED IDEOGRAPH
+ 0xE0D2: 0x9693, //CJK UNIFIED IDEOGRAPH
+ 0xE0D3: 0x9691, //CJK UNIFIED IDEOGRAPH
+ 0xE0D4: 0x9697, //CJK UNIFIED IDEOGRAPH
+ 0xE0D5: 0x96CE, //CJK UNIFIED IDEOGRAPH
+ 0xE0D6: 0x96FA, //CJK UNIFIED IDEOGRAPH
+ 0xE0D7: 0x96FD, //CJK UNIFIED IDEOGRAPH
+ 0xE0D8: 0x96F8, //CJK UNIFIED IDEOGRAPH
+ 0xE0D9: 0x96F5, //CJK UNIFIED IDEOGRAPH
+ 0xE0DA: 0x9773, //CJK UNIFIED IDEOGRAPH
+ 0xE0DB: 0x9777, //CJK UNIFIED IDEOGRAPH
+ 0xE0DC: 0x9778, //CJK UNIFIED IDEOGRAPH
+ 0xE0DD: 0x9772, //CJK UNIFIED IDEOGRAPH
+ 0xE0DE: 0x980F, //CJK UNIFIED IDEOGRAPH
+ 0xE0DF: 0x980D, //CJK UNIFIED IDEOGRAPH
+ 0xE0E0: 0x980E, //CJK UNIFIED IDEOGRAPH
+ 0xE0E1: 0x98AC, //CJK UNIFIED IDEOGRAPH
+ 0xE0E2: 0x98F6, //CJK UNIFIED IDEOGRAPH
+ 0xE0E3: 0x98F9, //CJK UNIFIED IDEOGRAPH
+ 0xE0E4: 0x99AF, //CJK UNIFIED IDEOGRAPH
+ 0xE0E5: 0x99B2, //CJK UNIFIED IDEOGRAPH
+ 0xE0E6: 0x99B0, //CJK UNIFIED IDEOGRAPH
+ 0xE0E7: 0x99B5, //CJK UNIFIED IDEOGRAPH
+ 0xE0E8: 0x9AAD, //CJK UNIFIED IDEOGRAPH
+ 0xE0E9: 0x9AAB, //CJK UNIFIED IDEOGRAPH
+ 0xE0EA: 0x9B5B, //CJK UNIFIED IDEOGRAPH
+ 0xE0EB: 0x9CEA, //CJK UNIFIED IDEOGRAPH
+ 0xE0EC: 0x9CED, //CJK UNIFIED IDEOGRAPH
+ 0xE0ED: 0x9CE7, //CJK UNIFIED IDEOGRAPH
+ 0xE0EE: 0x9E80, //CJK UNIFIED IDEOGRAPH
+ 0xE0EF: 0x9EFD, //CJK UNIFIED IDEOGRAPH
+ 0xE0F0: 0x50E6, //CJK UNIFIED IDEOGRAPH
+ 0xE0F1: 0x50D4, //CJK UNIFIED IDEOGRAPH
+ 0xE0F2: 0x50D7, //CJK UNIFIED IDEOGRAPH
+ 0xE0F3: 0x50E8, //CJK UNIFIED IDEOGRAPH
+ 0xE0F4: 0x50F3, //CJK UNIFIED IDEOGRAPH
+ 0xE0F5: 0x50DB, //CJK UNIFIED IDEOGRAPH
+ 0xE0F6: 0x50EA, //CJK UNIFIED IDEOGRAPH
+ 0xE0F7: 0x50DD, //CJK UNIFIED IDEOGRAPH
+ 0xE0F8: 0x50E4, //CJK UNIFIED IDEOGRAPH
+ 0xE0F9: 0x50D3, //CJK UNIFIED IDEOGRAPH
+ 0xE0FA: 0x50EC, //CJK UNIFIED IDEOGRAPH
+ 0xE0FB: 0x50F0, //CJK UNIFIED IDEOGRAPH
+ 0xE0FC: 0x50EF, //CJK UNIFIED IDEOGRAPH
+ 0xE0FD: 0x50E3, //CJK UNIFIED IDEOGRAPH
+ 0xE0FE: 0x50E0, //CJK UNIFIED IDEOGRAPH
+ 0xE140: 0x51D8, //CJK UNIFIED IDEOGRAPH
+ 0xE141: 0x5280, //CJK UNIFIED IDEOGRAPH
+ 0xE142: 0x5281, //CJK UNIFIED IDEOGRAPH
+ 0xE143: 0x52E9, //CJK UNIFIED IDEOGRAPH
+ 0xE144: 0x52EB, //CJK UNIFIED IDEOGRAPH
+ 0xE145: 0x5330, //CJK UNIFIED IDEOGRAPH
+ 0xE146: 0x53AC, //CJK UNIFIED IDEOGRAPH
+ 0xE147: 0x5627, //CJK UNIFIED IDEOGRAPH
+ 0xE148: 0x5615, //CJK UNIFIED IDEOGRAPH
+ 0xE149: 0x560C, //CJK UNIFIED IDEOGRAPH
+ 0xE14A: 0x5612, //CJK UNIFIED IDEOGRAPH
+ 0xE14B: 0x55FC, //CJK UNIFIED IDEOGRAPH
+ 0xE14C: 0x560F, //CJK UNIFIED IDEOGRAPH
+ 0xE14D: 0x561C, //CJK UNIFIED IDEOGRAPH
+ 0xE14E: 0x5601, //CJK UNIFIED IDEOGRAPH
+ 0xE14F: 0x5613, //CJK UNIFIED IDEOGRAPH
+ 0xE150: 0x5602, //CJK UNIFIED IDEOGRAPH
+ 0xE151: 0x55FA, //CJK UNIFIED IDEOGRAPH
+ 0xE152: 0x561D, //CJK UNIFIED IDEOGRAPH
+ 0xE153: 0x5604, //CJK UNIFIED IDEOGRAPH
+ 0xE154: 0x55FF, //CJK UNIFIED IDEOGRAPH
+ 0xE155: 0x55F9, //CJK UNIFIED IDEOGRAPH
+ 0xE156: 0x5889, //CJK UNIFIED IDEOGRAPH
+ 0xE157: 0x587C, //CJK UNIFIED IDEOGRAPH
+ 0xE158: 0x5890, //CJK UNIFIED IDEOGRAPH
+ 0xE159: 0x5898, //CJK UNIFIED IDEOGRAPH
+ 0xE15A: 0x5886, //CJK UNIFIED IDEOGRAPH
+ 0xE15B: 0x5881, //CJK UNIFIED IDEOGRAPH
+ 0xE15C: 0x587F, //CJK UNIFIED IDEOGRAPH
+ 0xE15D: 0x5874, //CJK UNIFIED IDEOGRAPH
+ 0xE15E: 0x588B, //CJK UNIFIED IDEOGRAPH
+ 0xE15F: 0x587A, //CJK UNIFIED IDEOGRAPH
+ 0xE160: 0x5887, //CJK UNIFIED IDEOGRAPH
+ 0xE161: 0x5891, //CJK UNIFIED IDEOGRAPH
+ 0xE162: 0x588E, //CJK UNIFIED IDEOGRAPH
+ 0xE163: 0x5876, //CJK UNIFIED IDEOGRAPH
+ 0xE164: 0x5882, //CJK UNIFIED IDEOGRAPH
+ 0xE165: 0x5888, //CJK UNIFIED IDEOGRAPH
+ 0xE166: 0x587B, //CJK UNIFIED IDEOGRAPH
+ 0xE167: 0x5894, //CJK UNIFIED IDEOGRAPH
+ 0xE168: 0x588F, //CJK UNIFIED IDEOGRAPH
+ 0xE169: 0x58FE, //CJK UNIFIED IDEOGRAPH
+ 0xE16A: 0x596B, //CJK UNIFIED IDEOGRAPH
+ 0xE16B: 0x5ADC, //CJK UNIFIED IDEOGRAPH
+ 0xE16C: 0x5AEE, //CJK UNIFIED IDEOGRAPH
+ 0xE16D: 0x5AE5, //CJK UNIFIED IDEOGRAPH
+ 0xE16E: 0x5AD5, //CJK UNIFIED IDEOGRAPH
+ 0xE16F: 0x5AEA, //CJK UNIFIED IDEOGRAPH
+ 0xE170: 0x5ADA, //CJK UNIFIED IDEOGRAPH
+ 0xE171: 0x5AED, //CJK UNIFIED IDEOGRAPH
+ 0xE172: 0x5AEB, //CJK UNIFIED IDEOGRAPH
+ 0xE173: 0x5AF3, //CJK UNIFIED IDEOGRAPH
+ 0xE174: 0x5AE2, //CJK UNIFIED IDEOGRAPH
+ 0xE175: 0x5AE0, //CJK UNIFIED IDEOGRAPH
+ 0xE176: 0x5ADB, //CJK UNIFIED IDEOGRAPH
+ 0xE177: 0x5AEC, //CJK UNIFIED IDEOGRAPH
+ 0xE178: 0x5ADE, //CJK UNIFIED IDEOGRAPH
+ 0xE179: 0x5ADD, //CJK UNIFIED IDEOGRAPH
+ 0xE17A: 0x5AD9, //CJK UNIFIED IDEOGRAPH
+ 0xE17B: 0x5AE8, //CJK UNIFIED IDEOGRAPH
+ 0xE17C: 0x5ADF, //CJK UNIFIED IDEOGRAPH
+ 0xE17D: 0x5B77, //CJK UNIFIED IDEOGRAPH
+ 0xE17E: 0x5BE0, //CJK UNIFIED IDEOGRAPH
+ 0xE1A1: 0x5BE3, //CJK UNIFIED IDEOGRAPH
+ 0xE1A2: 0x5C63, //CJK UNIFIED IDEOGRAPH
+ 0xE1A3: 0x5D82, //CJK UNIFIED IDEOGRAPH
+ 0xE1A4: 0x5D80, //CJK UNIFIED IDEOGRAPH
+ 0xE1A5: 0x5D7D, //CJK UNIFIED IDEOGRAPH
+ 0xE1A6: 0x5D86, //CJK UNIFIED IDEOGRAPH
+ 0xE1A7: 0x5D7A, //CJK UNIFIED IDEOGRAPH
+ 0xE1A8: 0x5D81, //CJK UNIFIED IDEOGRAPH
+ 0xE1A9: 0x5D77, //CJK UNIFIED IDEOGRAPH
+ 0xE1AA: 0x5D8A, //CJK UNIFIED IDEOGRAPH
+ 0xE1AB: 0x5D89, //CJK UNIFIED IDEOGRAPH
+ 0xE1AC: 0x5D88, //CJK UNIFIED IDEOGRAPH
+ 0xE1AD: 0x5D7E, //CJK UNIFIED IDEOGRAPH
+ 0xE1AE: 0x5D7C, //CJK UNIFIED IDEOGRAPH
+ 0xE1AF: 0x5D8D, //CJK UNIFIED IDEOGRAPH
+ 0xE1B0: 0x5D79, //CJK UNIFIED IDEOGRAPH
+ 0xE1B1: 0x5D7F, //CJK UNIFIED IDEOGRAPH
+ 0xE1B2: 0x5E58, //CJK UNIFIED IDEOGRAPH
+ 0xE1B3: 0x5E59, //CJK UNIFIED IDEOGRAPH
+ 0xE1B4: 0x5E53, //CJK UNIFIED IDEOGRAPH
+ 0xE1B5: 0x5ED8, //CJK UNIFIED IDEOGRAPH
+ 0xE1B6: 0x5ED1, //CJK UNIFIED IDEOGRAPH
+ 0xE1B7: 0x5ED7, //CJK UNIFIED IDEOGRAPH
+ 0xE1B8: 0x5ECE, //CJK UNIFIED IDEOGRAPH
+ 0xE1B9: 0x5EDC, //CJK UNIFIED IDEOGRAPH
+ 0xE1BA: 0x5ED5, //CJK UNIFIED IDEOGRAPH
+ 0xE1BB: 0x5ED9, //CJK UNIFIED IDEOGRAPH
+ 0xE1BC: 0x5ED2, //CJK UNIFIED IDEOGRAPH
+ 0xE1BD: 0x5ED4, //CJK UNIFIED IDEOGRAPH
+ 0xE1BE: 0x5F44, //CJK UNIFIED IDEOGRAPH
+ 0xE1BF: 0x5F43, //CJK UNIFIED IDEOGRAPH
+ 0xE1C0: 0x5F6F, //CJK UNIFIED IDEOGRAPH
+ 0xE1C1: 0x5FB6, //CJK UNIFIED IDEOGRAPH
+ 0xE1C2: 0x612C, //CJK UNIFIED IDEOGRAPH
+ 0xE1C3: 0x6128, //CJK UNIFIED IDEOGRAPH
+ 0xE1C4: 0x6141, //CJK UNIFIED IDEOGRAPH
+ 0xE1C5: 0x615E, //CJK UNIFIED IDEOGRAPH
+ 0xE1C6: 0x6171, //CJK UNIFIED IDEOGRAPH
+ 0xE1C7: 0x6173, //CJK UNIFIED IDEOGRAPH
+ 0xE1C8: 0x6152, //CJK UNIFIED IDEOGRAPH
+ 0xE1C9: 0x6153, //CJK UNIFIED IDEOGRAPH
+ 0xE1CA: 0x6172, //CJK UNIFIED IDEOGRAPH
+ 0xE1CB: 0x616C, //CJK UNIFIED IDEOGRAPH
+ 0xE1CC: 0x6180, //CJK UNIFIED IDEOGRAPH
+ 0xE1CD: 0x6174, //CJK UNIFIED IDEOGRAPH
+ 0xE1CE: 0x6154, //CJK UNIFIED IDEOGRAPH
+ 0xE1CF: 0x617A, //CJK UNIFIED IDEOGRAPH
+ 0xE1D0: 0x615B, //CJK UNIFIED IDEOGRAPH
+ 0xE1D1: 0x6165, //CJK UNIFIED IDEOGRAPH
+ 0xE1D2: 0x613B, //CJK UNIFIED IDEOGRAPH
+ 0xE1D3: 0x616A, //CJK UNIFIED IDEOGRAPH
+ 0xE1D4: 0x6161, //CJK UNIFIED IDEOGRAPH
+ 0xE1D5: 0x6156, //CJK UNIFIED IDEOGRAPH
+ 0xE1D6: 0x6229, //CJK UNIFIED IDEOGRAPH
+ 0xE1D7: 0x6227, //CJK UNIFIED IDEOGRAPH
+ 0xE1D8: 0x622B, //CJK UNIFIED IDEOGRAPH
+ 0xE1D9: 0x642B, //CJK UNIFIED IDEOGRAPH
+ 0xE1DA: 0x644D, //CJK UNIFIED IDEOGRAPH
+ 0xE1DB: 0x645B, //CJK UNIFIED IDEOGRAPH
+ 0xE1DC: 0x645D, //CJK UNIFIED IDEOGRAPH
+ 0xE1DD: 0x6474, //CJK UNIFIED IDEOGRAPH
+ 0xE1DE: 0x6476, //CJK UNIFIED IDEOGRAPH
+ 0xE1DF: 0x6472, //CJK UNIFIED IDEOGRAPH
+ 0xE1E0: 0x6473, //CJK UNIFIED IDEOGRAPH
+ 0xE1E1: 0x647D, //CJK UNIFIED IDEOGRAPH
+ 0xE1E2: 0x6475, //CJK UNIFIED IDEOGRAPH
+ 0xE1E3: 0x6466, //CJK UNIFIED IDEOGRAPH
+ 0xE1E4: 0x64A6, //CJK UNIFIED IDEOGRAPH
+ 0xE1E5: 0x644E, //CJK UNIFIED IDEOGRAPH
+ 0xE1E6: 0x6482, //CJK UNIFIED IDEOGRAPH
+ 0xE1E7: 0x645E, //CJK UNIFIED IDEOGRAPH
+ 0xE1E8: 0x645C, //CJK UNIFIED IDEOGRAPH
+ 0xE1E9: 0x644B, //CJK UNIFIED IDEOGRAPH
+ 0xE1EA: 0x6453, //CJK UNIFIED IDEOGRAPH
+ 0xE1EB: 0x6460, //CJK UNIFIED IDEOGRAPH
+ 0xE1EC: 0x6450, //CJK UNIFIED IDEOGRAPH
+ 0xE1ED: 0x647F, //CJK UNIFIED IDEOGRAPH
+ 0xE1EE: 0x643F, //CJK UNIFIED IDEOGRAPH
+ 0xE1EF: 0x646C, //CJK UNIFIED IDEOGRAPH
+ 0xE1F0: 0x646B, //CJK UNIFIED IDEOGRAPH
+ 0xE1F1: 0x6459, //CJK UNIFIED IDEOGRAPH
+ 0xE1F2: 0x6465, //CJK UNIFIED IDEOGRAPH
+ 0xE1F3: 0x6477, //CJK UNIFIED IDEOGRAPH
+ 0xE1F4: 0x6573, //CJK UNIFIED IDEOGRAPH
+ 0xE1F5: 0x65A0, //CJK UNIFIED IDEOGRAPH
+ 0xE1F6: 0x66A1, //CJK UNIFIED IDEOGRAPH
+ 0xE1F7: 0x66A0, //CJK UNIFIED IDEOGRAPH
+ 0xE1F8: 0x669F, //CJK UNIFIED IDEOGRAPH
+ 0xE1F9: 0x6705, //CJK UNIFIED IDEOGRAPH
+ 0xE1FA: 0x6704, //CJK UNIFIED IDEOGRAPH
+ 0xE1FB: 0x6722, //CJK UNIFIED IDEOGRAPH
+ 0xE1FC: 0x69B1, //CJK UNIFIED IDEOGRAPH
+ 0xE1FD: 0x69B6, //CJK UNIFIED IDEOGRAPH
+ 0xE1FE: 0x69C9, //CJK UNIFIED IDEOGRAPH
+ 0xE240: 0x69A0, //CJK UNIFIED IDEOGRAPH
+ 0xE241: 0x69CE, //CJK UNIFIED IDEOGRAPH
+ 0xE242: 0x6996, //CJK UNIFIED IDEOGRAPH
+ 0xE243: 0x69B0, //CJK UNIFIED IDEOGRAPH
+ 0xE244: 0x69AC, //CJK UNIFIED IDEOGRAPH
+ 0xE245: 0x69BC, //CJK UNIFIED IDEOGRAPH
+ 0xE246: 0x6991, //CJK UNIFIED IDEOGRAPH
+ 0xE247: 0x6999, //CJK UNIFIED IDEOGRAPH
+ 0xE248: 0x698E, //CJK UNIFIED IDEOGRAPH
+ 0xE249: 0x69A7, //CJK UNIFIED IDEOGRAPH
+ 0xE24A: 0x698D, //CJK UNIFIED IDEOGRAPH
+ 0xE24B: 0x69A9, //CJK UNIFIED IDEOGRAPH
+ 0xE24C: 0x69BE, //CJK UNIFIED IDEOGRAPH
+ 0xE24D: 0x69AF, //CJK UNIFIED IDEOGRAPH
+ 0xE24E: 0x69BF, //CJK UNIFIED IDEOGRAPH
+ 0xE24F: 0x69C4, //CJK UNIFIED IDEOGRAPH
+ 0xE250: 0x69BD, //CJK UNIFIED IDEOGRAPH
+ 0xE251: 0x69A4, //CJK UNIFIED IDEOGRAPH
+ 0xE252: 0x69D4, //CJK UNIFIED IDEOGRAPH
+ 0xE253: 0x69B9, //CJK UNIFIED IDEOGRAPH
+ 0xE254: 0x69CA, //CJK UNIFIED IDEOGRAPH
+ 0xE255: 0x699A, //CJK UNIFIED IDEOGRAPH
+ 0xE256: 0x69CF, //CJK UNIFIED IDEOGRAPH
+ 0xE257: 0x69B3, //CJK UNIFIED IDEOGRAPH
+ 0xE258: 0x6993, //CJK UNIFIED IDEOGRAPH
+ 0xE259: 0x69AA, //CJK UNIFIED IDEOGRAPH
+ 0xE25A: 0x69A1, //CJK UNIFIED IDEOGRAPH
+ 0xE25B: 0x699E, //CJK UNIFIED IDEOGRAPH
+ 0xE25C: 0x69D9, //CJK UNIFIED IDEOGRAPH
+ 0xE25D: 0x6997, //CJK UNIFIED IDEOGRAPH
+ 0xE25E: 0x6990, //CJK UNIFIED IDEOGRAPH
+ 0xE25F: 0x69C2, //CJK UNIFIED IDEOGRAPH
+ 0xE260: 0x69B5, //CJK UNIFIED IDEOGRAPH
+ 0xE261: 0x69A5, //CJK UNIFIED IDEOGRAPH
+ 0xE262: 0x69C6, //CJK UNIFIED IDEOGRAPH
+ 0xE263: 0x6B4A, //CJK UNIFIED IDEOGRAPH
+ 0xE264: 0x6B4D, //CJK UNIFIED IDEOGRAPH
+ 0xE265: 0x6B4B, //CJK UNIFIED IDEOGRAPH
+ 0xE266: 0x6B9E, //CJK UNIFIED IDEOGRAPH
+ 0xE267: 0x6B9F, //CJK UNIFIED IDEOGRAPH
+ 0xE268: 0x6BA0, //CJK UNIFIED IDEOGRAPH
+ 0xE269: 0x6BC3, //CJK UNIFIED IDEOGRAPH
+ 0xE26A: 0x6BC4, //CJK UNIFIED IDEOGRAPH
+ 0xE26B: 0x6BFE, //CJK UNIFIED IDEOGRAPH
+ 0xE26C: 0x6ECE, //CJK UNIFIED IDEOGRAPH
+ 0xE26D: 0x6EF5, //CJK UNIFIED IDEOGRAPH
+ 0xE26E: 0x6EF1, //CJK UNIFIED IDEOGRAPH
+ 0xE26F: 0x6F03, //CJK UNIFIED IDEOGRAPH
+ 0xE270: 0x6F25, //CJK UNIFIED IDEOGRAPH
+ 0xE271: 0x6EF8, //CJK UNIFIED IDEOGRAPH
+ 0xE272: 0x6F37, //CJK UNIFIED IDEOGRAPH
+ 0xE273: 0x6EFB, //CJK UNIFIED IDEOGRAPH
+ 0xE274: 0x6F2E, //CJK UNIFIED IDEOGRAPH
+ 0xE275: 0x6F09, //CJK UNIFIED IDEOGRAPH
+ 0xE276: 0x6F4E, //CJK UNIFIED IDEOGRAPH
+ 0xE277: 0x6F19, //CJK UNIFIED IDEOGRAPH
+ 0xE278: 0x6F1A, //CJK UNIFIED IDEOGRAPH
+ 0xE279: 0x6F27, //CJK UNIFIED IDEOGRAPH
+ 0xE27A: 0x6F18, //CJK UNIFIED IDEOGRAPH
+ 0xE27B: 0x6F3B, //CJK UNIFIED IDEOGRAPH
+ 0xE27C: 0x6F12, //CJK UNIFIED IDEOGRAPH
+ 0xE27D: 0x6EED, //CJK UNIFIED IDEOGRAPH
+ 0xE27E: 0x6F0A, //CJK UNIFIED IDEOGRAPH
+ 0xE2A1: 0x6F36, //CJK UNIFIED IDEOGRAPH
+ 0xE2A2: 0x6F73, //CJK UNIFIED IDEOGRAPH
+ 0xE2A3: 0x6EF9, //CJK UNIFIED IDEOGRAPH
+ 0xE2A4: 0x6EEE, //CJK UNIFIED IDEOGRAPH
+ 0xE2A5: 0x6F2D, //CJK UNIFIED IDEOGRAPH
+ 0xE2A6: 0x6F40, //CJK UNIFIED IDEOGRAPH
+ 0xE2A7: 0x6F30, //CJK UNIFIED IDEOGRAPH
+ 0xE2A8: 0x6F3C, //CJK UNIFIED IDEOGRAPH
+ 0xE2A9: 0x6F35, //CJK UNIFIED IDEOGRAPH
+ 0xE2AA: 0x6EEB, //CJK UNIFIED IDEOGRAPH
+ 0xE2AB: 0x6F07, //CJK UNIFIED IDEOGRAPH
+ 0xE2AC: 0x6F0E, //CJK UNIFIED IDEOGRAPH
+ 0xE2AD: 0x6F43, //CJK UNIFIED IDEOGRAPH
+ 0xE2AE: 0x6F05, //CJK UNIFIED IDEOGRAPH
+ 0xE2AF: 0x6EFD, //CJK UNIFIED IDEOGRAPH
+ 0xE2B0: 0x6EF6, //CJK UNIFIED IDEOGRAPH
+ 0xE2B1: 0x6F39, //CJK UNIFIED IDEOGRAPH
+ 0xE2B2: 0x6F1C, //CJK UNIFIED IDEOGRAPH
+ 0xE2B3: 0x6EFC, //CJK UNIFIED IDEOGRAPH
+ 0xE2B4: 0x6F3A, //CJK UNIFIED IDEOGRAPH
+ 0xE2B5: 0x6F1F, //CJK UNIFIED IDEOGRAPH
+ 0xE2B6: 0x6F0D, //CJK UNIFIED IDEOGRAPH
+ 0xE2B7: 0x6F1E, //CJK UNIFIED IDEOGRAPH
+ 0xE2B8: 0x6F08, //CJK UNIFIED IDEOGRAPH
+ 0xE2B9: 0x6F21, //CJK UNIFIED IDEOGRAPH
+ 0xE2BA: 0x7187, //CJK UNIFIED IDEOGRAPH
+ 0xE2BB: 0x7190, //CJK UNIFIED IDEOGRAPH
+ 0xE2BC: 0x7189, //CJK UNIFIED IDEOGRAPH
+ 0xE2BD: 0x7180, //CJK UNIFIED IDEOGRAPH
+ 0xE2BE: 0x7185, //CJK UNIFIED IDEOGRAPH
+ 0xE2BF: 0x7182, //CJK UNIFIED IDEOGRAPH
+ 0xE2C0: 0x718F, //CJK UNIFIED IDEOGRAPH
+ 0xE2C1: 0x717B, //CJK UNIFIED IDEOGRAPH
+ 0xE2C2: 0x7186, //CJK UNIFIED IDEOGRAPH
+ 0xE2C3: 0x7181, //CJK UNIFIED IDEOGRAPH
+ 0xE2C4: 0x7197, //CJK UNIFIED IDEOGRAPH
+ 0xE2C5: 0x7244, //CJK UNIFIED IDEOGRAPH
+ 0xE2C6: 0x7253, //CJK UNIFIED IDEOGRAPH
+ 0xE2C7: 0x7297, //CJK UNIFIED IDEOGRAPH
+ 0xE2C8: 0x7295, //CJK UNIFIED IDEOGRAPH
+ 0xE2C9: 0x7293, //CJK UNIFIED IDEOGRAPH
+ 0xE2CA: 0x7343, //CJK UNIFIED IDEOGRAPH
+ 0xE2CB: 0x734D, //CJK UNIFIED IDEOGRAPH
+ 0xE2CC: 0x7351, //CJK UNIFIED IDEOGRAPH
+ 0xE2CD: 0x734C, //CJK UNIFIED IDEOGRAPH
+ 0xE2CE: 0x7462, //CJK UNIFIED IDEOGRAPH
+ 0xE2CF: 0x7473, //CJK UNIFIED IDEOGRAPH
+ 0xE2D0: 0x7471, //CJK UNIFIED IDEOGRAPH
+ 0xE2D1: 0x7475, //CJK UNIFIED IDEOGRAPH
+ 0xE2D2: 0x7472, //CJK UNIFIED IDEOGRAPH
+ 0xE2D3: 0x7467, //CJK UNIFIED IDEOGRAPH
+ 0xE2D4: 0x746E, //CJK UNIFIED IDEOGRAPH
+ 0xE2D5: 0x7500, //CJK UNIFIED IDEOGRAPH
+ 0xE2D6: 0x7502, //CJK UNIFIED IDEOGRAPH
+ 0xE2D7: 0x7503, //CJK UNIFIED IDEOGRAPH
+ 0xE2D8: 0x757D, //CJK UNIFIED IDEOGRAPH
+ 0xE2D9: 0x7590, //CJK UNIFIED IDEOGRAPH
+ 0xE2DA: 0x7616, //CJK UNIFIED IDEOGRAPH
+ 0xE2DB: 0x7608, //CJK UNIFIED IDEOGRAPH
+ 0xE2DC: 0x760C, //CJK UNIFIED IDEOGRAPH
+ 0xE2DD: 0x7615, //CJK UNIFIED IDEOGRAPH
+ 0xE2DE: 0x7611, //CJK UNIFIED IDEOGRAPH
+ 0xE2DF: 0x760A, //CJK UNIFIED IDEOGRAPH
+ 0xE2E0: 0x7614, //CJK UNIFIED IDEOGRAPH
+ 0xE2E1: 0x76B8, //CJK UNIFIED IDEOGRAPH
+ 0xE2E2: 0x7781, //CJK UNIFIED IDEOGRAPH
+ 0xE2E3: 0x777C, //CJK UNIFIED IDEOGRAPH
+ 0xE2E4: 0x7785, //CJK UNIFIED IDEOGRAPH
+ 0xE2E5: 0x7782, //CJK UNIFIED IDEOGRAPH
+ 0xE2E6: 0x776E, //CJK UNIFIED IDEOGRAPH
+ 0xE2E7: 0x7780, //CJK UNIFIED IDEOGRAPH
+ 0xE2E8: 0x776F, //CJK UNIFIED IDEOGRAPH
+ 0xE2E9: 0x777E, //CJK UNIFIED IDEOGRAPH
+ 0xE2EA: 0x7783, //CJK UNIFIED IDEOGRAPH
+ 0xE2EB: 0x78B2, //CJK UNIFIED IDEOGRAPH
+ 0xE2EC: 0x78AA, //CJK UNIFIED IDEOGRAPH
+ 0xE2ED: 0x78B4, //CJK UNIFIED IDEOGRAPH
+ 0xE2EE: 0x78AD, //CJK UNIFIED IDEOGRAPH
+ 0xE2EF: 0x78A8, //CJK UNIFIED IDEOGRAPH
+ 0xE2F0: 0x787E, //CJK UNIFIED IDEOGRAPH
+ 0xE2F1: 0x78AB, //CJK UNIFIED IDEOGRAPH
+ 0xE2F2: 0x789E, //CJK UNIFIED IDEOGRAPH
+ 0xE2F3: 0x78A5, //CJK UNIFIED IDEOGRAPH
+ 0xE2F4: 0x78A0, //CJK UNIFIED IDEOGRAPH
+ 0xE2F5: 0x78AC, //CJK UNIFIED IDEOGRAPH
+ 0xE2F6: 0x78A2, //CJK UNIFIED IDEOGRAPH
+ 0xE2F7: 0x78A4, //CJK UNIFIED IDEOGRAPH
+ 0xE2F8: 0x7998, //CJK UNIFIED IDEOGRAPH
+ 0xE2F9: 0x798A, //CJK UNIFIED IDEOGRAPH
+ 0xE2FA: 0x798B, //CJK UNIFIED IDEOGRAPH
+ 0xE2FB: 0x7996, //CJK UNIFIED IDEOGRAPH
+ 0xE2FC: 0x7995, //CJK UNIFIED IDEOGRAPH
+ 0xE2FD: 0x7994, //CJK UNIFIED IDEOGRAPH
+ 0xE2FE: 0x7993, //CJK UNIFIED IDEOGRAPH
+ 0xE340: 0x7997, //CJK UNIFIED IDEOGRAPH
+ 0xE341: 0x7988, //CJK UNIFIED IDEOGRAPH
+ 0xE342: 0x7992, //CJK UNIFIED IDEOGRAPH
+ 0xE343: 0x7990, //CJK UNIFIED IDEOGRAPH
+ 0xE344: 0x7A2B, //CJK UNIFIED IDEOGRAPH
+ 0xE345: 0x7A4A, //CJK UNIFIED IDEOGRAPH
+ 0xE346: 0x7A30, //CJK UNIFIED IDEOGRAPH
+ 0xE347: 0x7A2F, //CJK UNIFIED IDEOGRAPH
+ 0xE348: 0x7A28, //CJK UNIFIED IDEOGRAPH
+ 0xE349: 0x7A26, //CJK UNIFIED IDEOGRAPH
+ 0xE34A: 0x7AA8, //CJK UNIFIED IDEOGRAPH
+ 0xE34B: 0x7AAB, //CJK UNIFIED IDEOGRAPH
+ 0xE34C: 0x7AAC, //CJK UNIFIED IDEOGRAPH
+ 0xE34D: 0x7AEE, //CJK UNIFIED IDEOGRAPH
+ 0xE34E: 0x7B88, //CJK UNIFIED IDEOGRAPH
+ 0xE34F: 0x7B9C, //CJK UNIFIED IDEOGRAPH
+ 0xE350: 0x7B8A, //CJK UNIFIED IDEOGRAPH
+ 0xE351: 0x7B91, //CJK UNIFIED IDEOGRAPH
+ 0xE352: 0x7B90, //CJK UNIFIED IDEOGRAPH
+ 0xE353: 0x7B96, //CJK UNIFIED IDEOGRAPH
+ 0xE354: 0x7B8D, //CJK UNIFIED IDEOGRAPH
+ 0xE355: 0x7B8C, //CJK UNIFIED IDEOGRAPH
+ 0xE356: 0x7B9B, //CJK UNIFIED IDEOGRAPH
+ 0xE357: 0x7B8E, //CJK UNIFIED IDEOGRAPH
+ 0xE358: 0x7B85, //CJK UNIFIED IDEOGRAPH
+ 0xE359: 0x7B98, //CJK UNIFIED IDEOGRAPH
+ 0xE35A: 0x5284, //CJK UNIFIED IDEOGRAPH
+ 0xE35B: 0x7B99, //CJK UNIFIED IDEOGRAPH
+ 0xE35C: 0x7BA4, //CJK UNIFIED IDEOGRAPH
+ 0xE35D: 0x7B82, //CJK UNIFIED IDEOGRAPH
+ 0xE35E: 0x7CBB, //CJK UNIFIED IDEOGRAPH
+ 0xE35F: 0x7CBF, //CJK UNIFIED IDEOGRAPH
+ 0xE360: 0x7CBC, //CJK UNIFIED IDEOGRAPH
+ 0xE361: 0x7CBA, //CJK UNIFIED IDEOGRAPH
+ 0xE362: 0x7DA7, //CJK UNIFIED IDEOGRAPH
+ 0xE363: 0x7DB7, //CJK UNIFIED IDEOGRAPH
+ 0xE364: 0x7DC2, //CJK UNIFIED IDEOGRAPH
+ 0xE365: 0x7DA3, //CJK UNIFIED IDEOGRAPH
+ 0xE366: 0x7DAA, //CJK UNIFIED IDEOGRAPH
+ 0xE367: 0x7DC1, //CJK UNIFIED IDEOGRAPH
+ 0xE368: 0x7DC0, //CJK UNIFIED IDEOGRAPH
+ 0xE369: 0x7DC5, //CJK UNIFIED IDEOGRAPH
+ 0xE36A: 0x7D9D, //CJK UNIFIED IDEOGRAPH
+ 0xE36B: 0x7DCE, //CJK UNIFIED IDEOGRAPH
+ 0xE36C: 0x7DC4, //CJK UNIFIED IDEOGRAPH
+ 0xE36D: 0x7DC6, //CJK UNIFIED IDEOGRAPH
+ 0xE36E: 0x7DCB, //CJK UNIFIED IDEOGRAPH
+ 0xE36F: 0x7DCC, //CJK UNIFIED IDEOGRAPH
+ 0xE370: 0x7DAF, //CJK UNIFIED IDEOGRAPH
+ 0xE371: 0x7DB9, //CJK UNIFIED IDEOGRAPH
+ 0xE372: 0x7D96, //CJK UNIFIED IDEOGRAPH
+ 0xE373: 0x7DBC, //CJK UNIFIED IDEOGRAPH
+ 0xE374: 0x7D9F, //CJK UNIFIED IDEOGRAPH
+ 0xE375: 0x7DA6, //CJK UNIFIED IDEOGRAPH
+ 0xE376: 0x7DAE, //CJK UNIFIED IDEOGRAPH
+ 0xE377: 0x7DA9, //CJK UNIFIED IDEOGRAPH
+ 0xE378: 0x7DA1, //CJK UNIFIED IDEOGRAPH
+ 0xE379: 0x7DC9, //CJK UNIFIED IDEOGRAPH
+ 0xE37A: 0x7F73, //CJK UNIFIED IDEOGRAPH
+ 0xE37B: 0x7FE2, //CJK UNIFIED IDEOGRAPH
+ 0xE37C: 0x7FE3, //CJK UNIFIED IDEOGRAPH
+ 0xE37D: 0x7FE5, //CJK UNIFIED IDEOGRAPH
+ 0xE37E: 0x7FDE, //CJK UNIFIED IDEOGRAPH
+ 0xE3A1: 0x8024, //CJK UNIFIED IDEOGRAPH
+ 0xE3A2: 0x805D, //CJK UNIFIED IDEOGRAPH
+ 0xE3A3: 0x805C, //CJK UNIFIED IDEOGRAPH
+ 0xE3A4: 0x8189, //CJK UNIFIED IDEOGRAPH
+ 0xE3A5: 0x8186, //CJK UNIFIED IDEOGRAPH
+ 0xE3A6: 0x8183, //CJK UNIFIED IDEOGRAPH
+ 0xE3A7: 0x8187, //CJK UNIFIED IDEOGRAPH
+ 0xE3A8: 0x818D, //CJK UNIFIED IDEOGRAPH
+ 0xE3A9: 0x818C, //CJK UNIFIED IDEOGRAPH
+ 0xE3AA: 0x818B, //CJK UNIFIED IDEOGRAPH
+ 0xE3AB: 0x8215, //CJK UNIFIED IDEOGRAPH
+ 0xE3AC: 0x8497, //CJK UNIFIED IDEOGRAPH
+ 0xE3AD: 0x84A4, //CJK UNIFIED IDEOGRAPH
+ 0xE3AE: 0x84A1, //CJK UNIFIED IDEOGRAPH
+ 0xE3AF: 0x849F, //CJK UNIFIED IDEOGRAPH
+ 0xE3B0: 0x84BA, //CJK UNIFIED IDEOGRAPH
+ 0xE3B1: 0x84CE, //CJK UNIFIED IDEOGRAPH
+ 0xE3B2: 0x84C2, //CJK UNIFIED IDEOGRAPH
+ 0xE3B3: 0x84AC, //CJK UNIFIED IDEOGRAPH
+ 0xE3B4: 0x84AE, //CJK UNIFIED IDEOGRAPH
+ 0xE3B5: 0x84AB, //CJK UNIFIED IDEOGRAPH
+ 0xE3B6: 0x84B9, //CJK UNIFIED IDEOGRAPH
+ 0xE3B7: 0x84B4, //CJK UNIFIED IDEOGRAPH
+ 0xE3B8: 0x84C1, //CJK UNIFIED IDEOGRAPH
+ 0xE3B9: 0x84CD, //CJK UNIFIED IDEOGRAPH
+ 0xE3BA: 0x84AA, //CJK UNIFIED IDEOGRAPH
+ 0xE3BB: 0x849A, //CJK UNIFIED IDEOGRAPH
+ 0xE3BC: 0x84B1, //CJK UNIFIED IDEOGRAPH
+ 0xE3BD: 0x84D0, //CJK UNIFIED IDEOGRAPH
+ 0xE3BE: 0x849D, //CJK UNIFIED IDEOGRAPH
+ 0xE3BF: 0x84A7, //CJK UNIFIED IDEOGRAPH
+ 0xE3C0: 0x84BB, //CJK UNIFIED IDEOGRAPH
+ 0xE3C1: 0x84A2, //CJK UNIFIED IDEOGRAPH
+ 0xE3C2: 0x8494, //CJK UNIFIED IDEOGRAPH
+ 0xE3C3: 0x84C7, //CJK UNIFIED IDEOGRAPH
+ 0xE3C4: 0x84CC, //CJK UNIFIED IDEOGRAPH
+ 0xE3C5: 0x849B, //CJK UNIFIED IDEOGRAPH
+ 0xE3C6: 0x84A9, //CJK UNIFIED IDEOGRAPH
+ 0xE3C7: 0x84AF, //CJK UNIFIED IDEOGRAPH
+ 0xE3C8: 0x84A8, //CJK UNIFIED IDEOGRAPH
+ 0xE3C9: 0x84D6, //CJK UNIFIED IDEOGRAPH
+ 0xE3CA: 0x8498, //CJK UNIFIED IDEOGRAPH
+ 0xE3CB: 0x84B6, //CJK UNIFIED IDEOGRAPH
+ 0xE3CC: 0x84CF, //CJK UNIFIED IDEOGRAPH
+ 0xE3CD: 0x84A0, //CJK UNIFIED IDEOGRAPH
+ 0xE3CE: 0x84D7, //CJK UNIFIED IDEOGRAPH
+ 0xE3CF: 0x84D4, //CJK UNIFIED IDEOGRAPH
+ 0xE3D0: 0x84D2, //CJK UNIFIED IDEOGRAPH
+ 0xE3D1: 0x84DB, //CJK UNIFIED IDEOGRAPH
+ 0xE3D2: 0x84B0, //CJK UNIFIED IDEOGRAPH
+ 0xE3D3: 0x8491, //CJK UNIFIED IDEOGRAPH
+ 0xE3D4: 0x8661, //CJK UNIFIED IDEOGRAPH
+ 0xE3D5: 0x8733, //CJK UNIFIED IDEOGRAPH
+ 0xE3D6: 0x8723, //CJK UNIFIED IDEOGRAPH
+ 0xE3D7: 0x8728, //CJK UNIFIED IDEOGRAPH
+ 0xE3D8: 0x876B, //CJK UNIFIED IDEOGRAPH
+ 0xE3D9: 0x8740, //CJK UNIFIED IDEOGRAPH
+ 0xE3DA: 0x872E, //CJK UNIFIED IDEOGRAPH
+ 0xE3DB: 0x871E, //CJK UNIFIED IDEOGRAPH
+ 0xE3DC: 0x8721, //CJK UNIFIED IDEOGRAPH
+ 0xE3DD: 0x8719, //CJK UNIFIED IDEOGRAPH
+ 0xE3DE: 0x871B, //CJK UNIFIED IDEOGRAPH
+ 0xE3DF: 0x8743, //CJK UNIFIED IDEOGRAPH
+ 0xE3E0: 0x872C, //CJK UNIFIED IDEOGRAPH
+ 0xE3E1: 0x8741, //CJK UNIFIED IDEOGRAPH
+ 0xE3E2: 0x873E, //CJK UNIFIED IDEOGRAPH
+ 0xE3E3: 0x8746, //CJK UNIFIED IDEOGRAPH
+ 0xE3E4: 0x8720, //CJK UNIFIED IDEOGRAPH
+ 0xE3E5: 0x8732, //CJK UNIFIED IDEOGRAPH
+ 0xE3E6: 0x872A, //CJK UNIFIED IDEOGRAPH
+ 0xE3E7: 0x872D, //CJK UNIFIED IDEOGRAPH
+ 0xE3E8: 0x873C, //CJK UNIFIED IDEOGRAPH
+ 0xE3E9: 0x8712, //CJK UNIFIED IDEOGRAPH
+ 0xE3EA: 0x873A, //CJK UNIFIED IDEOGRAPH
+ 0xE3EB: 0x8731, //CJK UNIFIED IDEOGRAPH
+ 0xE3EC: 0x8735, //CJK UNIFIED IDEOGRAPH
+ 0xE3ED: 0x8742, //CJK UNIFIED IDEOGRAPH
+ 0xE3EE: 0x8726, //CJK UNIFIED IDEOGRAPH
+ 0xE3EF: 0x8727, //CJK UNIFIED IDEOGRAPH
+ 0xE3F0: 0x8738, //CJK UNIFIED IDEOGRAPH
+ 0xE3F1: 0x8724, //CJK UNIFIED IDEOGRAPH
+ 0xE3F2: 0x871A, //CJK UNIFIED IDEOGRAPH
+ 0xE3F3: 0x8730, //CJK UNIFIED IDEOGRAPH
+ 0xE3F4: 0x8711, //CJK UNIFIED IDEOGRAPH
+ 0xE3F5: 0x88F7, //CJK UNIFIED IDEOGRAPH
+ 0xE3F6: 0x88E7, //CJK UNIFIED IDEOGRAPH
+ 0xE3F7: 0x88F1, //CJK UNIFIED IDEOGRAPH
+ 0xE3F8: 0x88F2, //CJK UNIFIED IDEOGRAPH
+ 0xE3F9: 0x88FA, //CJK UNIFIED IDEOGRAPH
+ 0xE3FA: 0x88FE, //CJK UNIFIED IDEOGRAPH
+ 0xE3FB: 0x88EE, //CJK UNIFIED IDEOGRAPH
+ 0xE3FC: 0x88FC, //CJK UNIFIED IDEOGRAPH
+ 0xE3FD: 0x88F6, //CJK UNIFIED IDEOGRAPH
+ 0xE3FE: 0x88FB, //CJK UNIFIED IDEOGRAPH
+ 0xE440: 0x88F0, //CJK UNIFIED IDEOGRAPH
+ 0xE441: 0x88EC, //CJK UNIFIED IDEOGRAPH
+ 0xE442: 0x88EB, //CJK UNIFIED IDEOGRAPH
+ 0xE443: 0x899D, //CJK UNIFIED IDEOGRAPH
+ 0xE444: 0x89A1, //CJK UNIFIED IDEOGRAPH
+ 0xE445: 0x899F, //CJK UNIFIED IDEOGRAPH
+ 0xE446: 0x899E, //CJK UNIFIED IDEOGRAPH
+ 0xE447: 0x89E9, //CJK UNIFIED IDEOGRAPH
+ 0xE448: 0x89EB, //CJK UNIFIED IDEOGRAPH
+ 0xE449: 0x89E8, //CJK UNIFIED IDEOGRAPH
+ 0xE44A: 0x8AAB, //CJK UNIFIED IDEOGRAPH
+ 0xE44B: 0x8A99, //CJK UNIFIED IDEOGRAPH
+ 0xE44C: 0x8A8B, //CJK UNIFIED IDEOGRAPH
+ 0xE44D: 0x8A92, //CJK UNIFIED IDEOGRAPH
+ 0xE44E: 0x8A8F, //CJK UNIFIED IDEOGRAPH
+ 0xE44F: 0x8A96, //CJK UNIFIED IDEOGRAPH
+ 0xE450: 0x8C3D, //CJK UNIFIED IDEOGRAPH
+ 0xE451: 0x8C68, //CJK UNIFIED IDEOGRAPH
+ 0xE452: 0x8C69, //CJK UNIFIED IDEOGRAPH
+ 0xE453: 0x8CD5, //CJK UNIFIED IDEOGRAPH
+ 0xE454: 0x8CCF, //CJK UNIFIED IDEOGRAPH
+ 0xE455: 0x8CD7, //CJK UNIFIED IDEOGRAPH
+ 0xE456: 0x8D96, //CJK UNIFIED IDEOGRAPH
+ 0xE457: 0x8E09, //CJK UNIFIED IDEOGRAPH
+ 0xE458: 0x8E02, //CJK UNIFIED IDEOGRAPH
+ 0xE459: 0x8DFF, //CJK UNIFIED IDEOGRAPH
+ 0xE45A: 0x8E0D, //CJK UNIFIED IDEOGRAPH
+ 0xE45B: 0x8DFD, //CJK UNIFIED IDEOGRAPH
+ 0xE45C: 0x8E0A, //CJK UNIFIED IDEOGRAPH
+ 0xE45D: 0x8E03, //CJK UNIFIED IDEOGRAPH
+ 0xE45E: 0x8E07, //CJK UNIFIED IDEOGRAPH
+ 0xE45F: 0x8E06, //CJK UNIFIED IDEOGRAPH
+ 0xE460: 0x8E05, //CJK UNIFIED IDEOGRAPH
+ 0xE461: 0x8DFE, //CJK UNIFIED IDEOGRAPH
+ 0xE462: 0x8E00, //CJK UNIFIED IDEOGRAPH
+ 0xE463: 0x8E04, //CJK UNIFIED IDEOGRAPH
+ 0xE464: 0x8F10, //CJK UNIFIED IDEOGRAPH
+ 0xE465: 0x8F11, //CJK UNIFIED IDEOGRAPH
+ 0xE466: 0x8F0E, //CJK UNIFIED IDEOGRAPH
+ 0xE467: 0x8F0D, //CJK UNIFIED IDEOGRAPH
+ 0xE468: 0x9123, //CJK UNIFIED IDEOGRAPH
+ 0xE469: 0x911C, //CJK UNIFIED IDEOGRAPH
+ 0xE46A: 0x9120, //CJK UNIFIED IDEOGRAPH
+ 0xE46B: 0x9122, //CJK UNIFIED IDEOGRAPH
+ 0xE46C: 0x911F, //CJK UNIFIED IDEOGRAPH
+ 0xE46D: 0x911D, //CJK UNIFIED IDEOGRAPH
+ 0xE46E: 0x911A, //CJK UNIFIED IDEOGRAPH
+ 0xE46F: 0x9124, //CJK UNIFIED IDEOGRAPH
+ 0xE470: 0x9121, //CJK UNIFIED IDEOGRAPH
+ 0xE471: 0x911B, //CJK UNIFIED IDEOGRAPH
+ 0xE472: 0x917A, //CJK UNIFIED IDEOGRAPH
+ 0xE473: 0x9172, //CJK UNIFIED IDEOGRAPH
+ 0xE474: 0x9179, //CJK UNIFIED IDEOGRAPH
+ 0xE475: 0x9173, //CJK UNIFIED IDEOGRAPH
+ 0xE476: 0x92A5, //CJK UNIFIED IDEOGRAPH
+ 0xE477: 0x92A4, //CJK UNIFIED IDEOGRAPH
+ 0xE478: 0x9276, //CJK UNIFIED IDEOGRAPH
+ 0xE479: 0x929B, //CJK UNIFIED IDEOGRAPH
+ 0xE47A: 0x927A, //CJK UNIFIED IDEOGRAPH
+ 0xE47B: 0x92A0, //CJK UNIFIED IDEOGRAPH
+ 0xE47C: 0x9294, //CJK UNIFIED IDEOGRAPH
+ 0xE47D: 0x92AA, //CJK UNIFIED IDEOGRAPH
+ 0xE47E: 0x928D, //CJK UNIFIED IDEOGRAPH
+ 0xE4A1: 0x92A6, //CJK UNIFIED IDEOGRAPH
+ 0xE4A2: 0x929A, //CJK UNIFIED IDEOGRAPH
+ 0xE4A3: 0x92AB, //CJK UNIFIED IDEOGRAPH
+ 0xE4A4: 0x9279, //CJK UNIFIED IDEOGRAPH
+ 0xE4A5: 0x9297, //CJK UNIFIED IDEOGRAPH
+ 0xE4A6: 0x927F, //CJK UNIFIED IDEOGRAPH
+ 0xE4A7: 0x92A3, //CJK UNIFIED IDEOGRAPH
+ 0xE4A8: 0x92EE, //CJK UNIFIED IDEOGRAPH
+ 0xE4A9: 0x928E, //CJK UNIFIED IDEOGRAPH
+ 0xE4AA: 0x9282, //CJK UNIFIED IDEOGRAPH
+ 0xE4AB: 0x9295, //CJK UNIFIED IDEOGRAPH
+ 0xE4AC: 0x92A2, //CJK UNIFIED IDEOGRAPH
+ 0xE4AD: 0x927D, //CJK UNIFIED IDEOGRAPH
+ 0xE4AE: 0x9288, //CJK UNIFIED IDEOGRAPH
+ 0xE4AF: 0x92A1, //CJK UNIFIED IDEOGRAPH
+ 0xE4B0: 0x928A, //CJK UNIFIED IDEOGRAPH
+ 0xE4B1: 0x9286, //CJK UNIFIED IDEOGRAPH
+ 0xE4B2: 0x928C, //CJK UNIFIED IDEOGRAPH
+ 0xE4B3: 0x9299, //CJK UNIFIED IDEOGRAPH
+ 0xE4B4: 0x92A7, //CJK UNIFIED IDEOGRAPH
+ 0xE4B5: 0x927E, //CJK UNIFIED IDEOGRAPH
+ 0xE4B6: 0x9287, //CJK UNIFIED IDEOGRAPH
+ 0xE4B7: 0x92A9, //CJK UNIFIED IDEOGRAPH
+ 0xE4B8: 0x929D, //CJK UNIFIED IDEOGRAPH
+ 0xE4B9: 0x928B, //CJK UNIFIED IDEOGRAPH
+ 0xE4BA: 0x922D, //CJK UNIFIED IDEOGRAPH
+ 0xE4BB: 0x969E, //CJK UNIFIED IDEOGRAPH
+ 0xE4BC: 0x96A1, //CJK UNIFIED IDEOGRAPH
+ 0xE4BD: 0x96FF, //CJK UNIFIED IDEOGRAPH
+ 0xE4BE: 0x9758, //CJK UNIFIED IDEOGRAPH
+ 0xE4BF: 0x977D, //CJK UNIFIED IDEOGRAPH
+ 0xE4C0: 0x977A, //CJK UNIFIED IDEOGRAPH
+ 0xE4C1: 0x977E, //CJK UNIFIED IDEOGRAPH
+ 0xE4C2: 0x9783, //CJK UNIFIED IDEOGRAPH
+ 0xE4C3: 0x9780, //CJK UNIFIED IDEOGRAPH
+ 0xE4C4: 0x9782, //CJK UNIFIED IDEOGRAPH
+ 0xE4C5: 0x977B, //CJK UNIFIED IDEOGRAPH
+ 0xE4C6: 0x9784, //CJK UNIFIED IDEOGRAPH
+ 0xE4C7: 0x9781, //CJK UNIFIED IDEOGRAPH
+ 0xE4C8: 0x977F, //CJK UNIFIED IDEOGRAPH
+ 0xE4C9: 0x97CE, //CJK UNIFIED IDEOGRAPH
+ 0xE4CA: 0x97CD, //CJK UNIFIED IDEOGRAPH
+ 0xE4CB: 0x9816, //CJK UNIFIED IDEOGRAPH
+ 0xE4CC: 0x98AD, //CJK UNIFIED IDEOGRAPH
+ 0xE4CD: 0x98AE, //CJK UNIFIED IDEOGRAPH
+ 0xE4CE: 0x9902, //CJK UNIFIED IDEOGRAPH
+ 0xE4CF: 0x9900, //CJK UNIFIED IDEOGRAPH
+ 0xE4D0: 0x9907, //CJK UNIFIED IDEOGRAPH
+ 0xE4D1: 0x999D, //CJK UNIFIED IDEOGRAPH
+ 0xE4D2: 0x999C, //CJK UNIFIED IDEOGRAPH
+ 0xE4D3: 0x99C3, //CJK UNIFIED IDEOGRAPH
+ 0xE4D4: 0x99B9, //CJK UNIFIED IDEOGRAPH
+ 0xE4D5: 0x99BB, //CJK UNIFIED IDEOGRAPH
+ 0xE4D6: 0x99BA, //CJK UNIFIED IDEOGRAPH
+ 0xE4D7: 0x99C2, //CJK UNIFIED IDEOGRAPH
+ 0xE4D8: 0x99BD, //CJK UNIFIED IDEOGRAPH
+ 0xE4D9: 0x99C7, //CJK UNIFIED IDEOGRAPH
+ 0xE4DA: 0x9AB1, //CJK UNIFIED IDEOGRAPH
+ 0xE4DB: 0x9AE3, //CJK UNIFIED IDEOGRAPH
+ 0xE4DC: 0x9AE7, //CJK UNIFIED IDEOGRAPH
+ 0xE4DD: 0x9B3E, //CJK UNIFIED IDEOGRAPH
+ 0xE4DE: 0x9B3F, //CJK UNIFIED IDEOGRAPH
+ 0xE4DF: 0x9B60, //CJK UNIFIED IDEOGRAPH
+ 0xE4E0: 0x9B61, //CJK UNIFIED IDEOGRAPH
+ 0xE4E1: 0x9B5F, //CJK UNIFIED IDEOGRAPH
+ 0xE4E2: 0x9CF1, //CJK UNIFIED IDEOGRAPH
+ 0xE4E3: 0x9CF2, //CJK UNIFIED IDEOGRAPH
+ 0xE4E4: 0x9CF5, //CJK UNIFIED IDEOGRAPH
+ 0xE4E5: 0x9EA7, //CJK UNIFIED IDEOGRAPH
+ 0xE4E6: 0x50FF, //CJK UNIFIED IDEOGRAPH
+ 0xE4E7: 0x5103, //CJK UNIFIED IDEOGRAPH
+ 0xE4E8: 0x5130, //CJK UNIFIED IDEOGRAPH
+ 0xE4E9: 0x50F8, //CJK UNIFIED IDEOGRAPH
+ 0xE4EA: 0x5106, //CJK UNIFIED IDEOGRAPH
+ 0xE4EB: 0x5107, //CJK UNIFIED IDEOGRAPH
+ 0xE4EC: 0x50F6, //CJK UNIFIED IDEOGRAPH
+ 0xE4ED: 0x50FE, //CJK UNIFIED IDEOGRAPH
+ 0xE4EE: 0x510B, //CJK UNIFIED IDEOGRAPH
+ 0xE4EF: 0x510C, //CJK UNIFIED IDEOGRAPH
+ 0xE4F0: 0x50FD, //CJK UNIFIED IDEOGRAPH
+ 0xE4F1: 0x510A, //CJK UNIFIED IDEOGRAPH
+ 0xE4F2: 0x528B, //CJK UNIFIED IDEOGRAPH
+ 0xE4F3: 0x528C, //CJK UNIFIED IDEOGRAPH
+ 0xE4F4: 0x52F1, //CJK UNIFIED IDEOGRAPH
+ 0xE4F5: 0x52EF, //CJK UNIFIED IDEOGRAPH
+ 0xE4F6: 0x5648, //CJK UNIFIED IDEOGRAPH
+ 0xE4F7: 0x5642, //CJK UNIFIED IDEOGRAPH
+ 0xE4F8: 0x564C, //CJK UNIFIED IDEOGRAPH
+ 0xE4F9: 0x5635, //CJK UNIFIED IDEOGRAPH
+ 0xE4FA: 0x5641, //CJK UNIFIED IDEOGRAPH
+ 0xE4FB: 0x564A, //CJK UNIFIED IDEOGRAPH
+ 0xE4FC: 0x5649, //CJK UNIFIED IDEOGRAPH
+ 0xE4FD: 0x5646, //CJK UNIFIED IDEOGRAPH
+ 0xE4FE: 0x5658, //CJK UNIFIED IDEOGRAPH
+ 0xE540: 0x565A, //CJK UNIFIED IDEOGRAPH
+ 0xE541: 0x5640, //CJK UNIFIED IDEOGRAPH
+ 0xE542: 0x5633, //CJK UNIFIED IDEOGRAPH
+ 0xE543: 0x563D, //CJK UNIFIED IDEOGRAPH
+ 0xE544: 0x562C, //CJK UNIFIED IDEOGRAPH
+ 0xE545: 0x563E, //CJK UNIFIED IDEOGRAPH
+ 0xE546: 0x5638, //CJK UNIFIED IDEOGRAPH
+ 0xE547: 0x562A, //CJK UNIFIED IDEOGRAPH
+ 0xE548: 0x563A, //CJK UNIFIED IDEOGRAPH
+ 0xE549: 0x571A, //CJK UNIFIED IDEOGRAPH
+ 0xE54A: 0x58AB, //CJK UNIFIED IDEOGRAPH
+ 0xE54B: 0x589D, //CJK UNIFIED IDEOGRAPH
+ 0xE54C: 0x58B1, //CJK UNIFIED IDEOGRAPH
+ 0xE54D: 0x58A0, //CJK UNIFIED IDEOGRAPH
+ 0xE54E: 0x58A3, //CJK UNIFIED IDEOGRAPH
+ 0xE54F: 0x58AF, //CJK UNIFIED IDEOGRAPH
+ 0xE550: 0x58AC, //CJK UNIFIED IDEOGRAPH
+ 0xE551: 0x58A5, //CJK UNIFIED IDEOGRAPH
+ 0xE552: 0x58A1, //CJK UNIFIED IDEOGRAPH
+ 0xE553: 0x58FF, //CJK UNIFIED IDEOGRAPH
+ 0xE554: 0x5AFF, //CJK UNIFIED IDEOGRAPH
+ 0xE555: 0x5AF4, //CJK UNIFIED IDEOGRAPH
+ 0xE556: 0x5AFD, //CJK UNIFIED IDEOGRAPH
+ 0xE557: 0x5AF7, //CJK UNIFIED IDEOGRAPH
+ 0xE558: 0x5AF6, //CJK UNIFIED IDEOGRAPH
+ 0xE559: 0x5B03, //CJK UNIFIED IDEOGRAPH
+ 0xE55A: 0x5AF8, //CJK UNIFIED IDEOGRAPH
+ 0xE55B: 0x5B02, //CJK UNIFIED IDEOGRAPH
+ 0xE55C: 0x5AF9, //CJK UNIFIED IDEOGRAPH
+ 0xE55D: 0x5B01, //CJK UNIFIED IDEOGRAPH
+ 0xE55E: 0x5B07, //CJK UNIFIED IDEOGRAPH
+ 0xE55F: 0x5B05, //CJK UNIFIED IDEOGRAPH
+ 0xE560: 0x5B0F, //CJK UNIFIED IDEOGRAPH
+ 0xE561: 0x5C67, //CJK UNIFIED IDEOGRAPH
+ 0xE562: 0x5D99, //CJK UNIFIED IDEOGRAPH
+ 0xE563: 0x5D97, //CJK UNIFIED IDEOGRAPH
+ 0xE564: 0x5D9F, //CJK UNIFIED IDEOGRAPH
+ 0xE565: 0x5D92, //CJK UNIFIED IDEOGRAPH
+ 0xE566: 0x5DA2, //CJK UNIFIED IDEOGRAPH
+ 0xE567: 0x5D93, //CJK UNIFIED IDEOGRAPH
+ 0xE568: 0x5D95, //CJK UNIFIED IDEOGRAPH
+ 0xE569: 0x5DA0, //CJK UNIFIED IDEOGRAPH
+ 0xE56A: 0x5D9C, //CJK UNIFIED IDEOGRAPH
+ 0xE56B: 0x5DA1, //CJK UNIFIED IDEOGRAPH
+ 0xE56C: 0x5D9A, //CJK UNIFIED IDEOGRAPH
+ 0xE56D: 0x5D9E, //CJK UNIFIED IDEOGRAPH
+ 0xE56E: 0x5E69, //CJK UNIFIED IDEOGRAPH
+ 0xE56F: 0x5E5D, //CJK UNIFIED IDEOGRAPH
+ 0xE570: 0x5E60, //CJK UNIFIED IDEOGRAPH
+ 0xE571: 0x5E5C, //CJK UNIFIED IDEOGRAPH
+ 0xE572: 0x7DF3, //CJK UNIFIED IDEOGRAPH
+ 0xE573: 0x5EDB, //CJK UNIFIED IDEOGRAPH
+ 0xE574: 0x5EDE, //CJK UNIFIED IDEOGRAPH
+ 0xE575: 0x5EE1, //CJK UNIFIED IDEOGRAPH
+ 0xE576: 0x5F49, //CJK UNIFIED IDEOGRAPH
+ 0xE577: 0x5FB2, //CJK UNIFIED IDEOGRAPH
+ 0xE578: 0x618B, //CJK UNIFIED IDEOGRAPH
+ 0xE579: 0x6183, //CJK UNIFIED IDEOGRAPH
+ 0xE57A: 0x6179, //CJK UNIFIED IDEOGRAPH
+ 0xE57B: 0x61B1, //CJK UNIFIED IDEOGRAPH
+ 0xE57C: 0x61B0, //CJK UNIFIED IDEOGRAPH
+ 0xE57D: 0x61A2, //CJK UNIFIED IDEOGRAPH
+ 0xE57E: 0x6189, //CJK UNIFIED IDEOGRAPH
+ 0xE5A1: 0x619B, //CJK UNIFIED IDEOGRAPH
+ 0xE5A2: 0x6193, //CJK UNIFIED IDEOGRAPH
+ 0xE5A3: 0x61AF, //CJK UNIFIED IDEOGRAPH
+ 0xE5A4: 0x61AD, //CJK UNIFIED IDEOGRAPH
+ 0xE5A5: 0x619F, //CJK UNIFIED IDEOGRAPH
+ 0xE5A6: 0x6192, //CJK UNIFIED IDEOGRAPH
+ 0xE5A7: 0x61AA, //CJK UNIFIED IDEOGRAPH
+ 0xE5A8: 0x61A1, //CJK UNIFIED IDEOGRAPH
+ 0xE5A9: 0x618D, //CJK UNIFIED IDEOGRAPH
+ 0xE5AA: 0x6166, //CJK UNIFIED IDEOGRAPH
+ 0xE5AB: 0x61B3, //CJK UNIFIED IDEOGRAPH
+ 0xE5AC: 0x622D, //CJK UNIFIED IDEOGRAPH
+ 0xE5AD: 0x646E, //CJK UNIFIED IDEOGRAPH
+ 0xE5AE: 0x6470, //CJK UNIFIED IDEOGRAPH
+ 0xE5AF: 0x6496, //CJK UNIFIED IDEOGRAPH
+ 0xE5B0: 0x64A0, //CJK UNIFIED IDEOGRAPH
+ 0xE5B1: 0x6485, //CJK UNIFIED IDEOGRAPH
+ 0xE5B2: 0x6497, //CJK UNIFIED IDEOGRAPH
+ 0xE5B3: 0x649C, //CJK UNIFIED IDEOGRAPH
+ 0xE5B4: 0x648F, //CJK UNIFIED IDEOGRAPH
+ 0xE5B5: 0x648B, //CJK UNIFIED IDEOGRAPH
+ 0xE5B6: 0x648A, //CJK UNIFIED IDEOGRAPH
+ 0xE5B7: 0x648C, //CJK UNIFIED IDEOGRAPH
+ 0xE5B8: 0x64A3, //CJK UNIFIED IDEOGRAPH
+ 0xE5B9: 0x649F, //CJK UNIFIED IDEOGRAPH
+ 0xE5BA: 0x6468, //CJK UNIFIED IDEOGRAPH
+ 0xE5BB: 0x64B1, //CJK UNIFIED IDEOGRAPH
+ 0xE5BC: 0x6498, //CJK UNIFIED IDEOGRAPH
+ 0xE5BD: 0x6576, //CJK UNIFIED IDEOGRAPH
+ 0xE5BE: 0x657A, //CJK UNIFIED IDEOGRAPH
+ 0xE5BF: 0x6579, //CJK UNIFIED IDEOGRAPH
+ 0xE5C0: 0x657B, //CJK UNIFIED IDEOGRAPH
+ 0xE5C1: 0x65B2, //CJK UNIFIED IDEOGRAPH
+ 0xE5C2: 0x65B3, //CJK UNIFIED IDEOGRAPH
+ 0xE5C3: 0x66B5, //CJK UNIFIED IDEOGRAPH
+ 0xE5C4: 0x66B0, //CJK UNIFIED IDEOGRAPH
+ 0xE5C5: 0x66A9, //CJK UNIFIED IDEOGRAPH
+ 0xE5C6: 0x66B2, //CJK UNIFIED IDEOGRAPH
+ 0xE5C7: 0x66B7, //CJK UNIFIED IDEOGRAPH
+ 0xE5C8: 0x66AA, //CJK UNIFIED IDEOGRAPH
+ 0xE5C9: 0x66AF, //CJK UNIFIED IDEOGRAPH
+ 0xE5CA: 0x6A00, //CJK UNIFIED IDEOGRAPH
+ 0xE5CB: 0x6A06, //CJK UNIFIED IDEOGRAPH
+ 0xE5CC: 0x6A17, //CJK UNIFIED IDEOGRAPH
+ 0xE5CD: 0x69E5, //CJK UNIFIED IDEOGRAPH
+ 0xE5CE: 0x69F8, //CJK UNIFIED IDEOGRAPH
+ 0xE5CF: 0x6A15, //CJK UNIFIED IDEOGRAPH
+ 0xE5D0: 0x69F1, //CJK UNIFIED IDEOGRAPH
+ 0xE5D1: 0x69E4, //CJK UNIFIED IDEOGRAPH
+ 0xE5D2: 0x6A20, //CJK UNIFIED IDEOGRAPH
+ 0xE5D3: 0x69FF, //CJK UNIFIED IDEOGRAPH
+ 0xE5D4: 0x69EC, //CJK UNIFIED IDEOGRAPH
+ 0xE5D5: 0x69E2, //CJK UNIFIED IDEOGRAPH
+ 0xE5D6: 0x6A1B, //CJK UNIFIED IDEOGRAPH
+ 0xE5D7: 0x6A1D, //CJK UNIFIED IDEOGRAPH
+ 0xE5D8: 0x69FE, //CJK UNIFIED IDEOGRAPH
+ 0xE5D9: 0x6A27, //CJK UNIFIED IDEOGRAPH
+ 0xE5DA: 0x69F2, //CJK UNIFIED IDEOGRAPH
+ 0xE5DB: 0x69EE, //CJK UNIFIED IDEOGRAPH
+ 0xE5DC: 0x6A14, //CJK UNIFIED IDEOGRAPH
+ 0xE5DD: 0x69F7, //CJK UNIFIED IDEOGRAPH
+ 0xE5DE: 0x69E7, //CJK UNIFIED IDEOGRAPH
+ 0xE5DF: 0x6A40, //CJK UNIFIED IDEOGRAPH
+ 0xE5E0: 0x6A08, //CJK UNIFIED IDEOGRAPH
+ 0xE5E1: 0x69E6, //CJK UNIFIED IDEOGRAPH
+ 0xE5E2: 0x69FB, //CJK UNIFIED IDEOGRAPH
+ 0xE5E3: 0x6A0D, //CJK UNIFIED IDEOGRAPH
+ 0xE5E4: 0x69FC, //CJK UNIFIED IDEOGRAPH
+ 0xE5E5: 0x69EB, //CJK UNIFIED IDEOGRAPH
+ 0xE5E6: 0x6A09, //CJK UNIFIED IDEOGRAPH
+ 0xE5E7: 0x6A04, //CJK UNIFIED IDEOGRAPH
+ 0xE5E8: 0x6A18, //CJK UNIFIED IDEOGRAPH
+ 0xE5E9: 0x6A25, //CJK UNIFIED IDEOGRAPH
+ 0xE5EA: 0x6A0F, //CJK UNIFIED IDEOGRAPH
+ 0xE5EB: 0x69F6, //CJK UNIFIED IDEOGRAPH
+ 0xE5EC: 0x6A26, //CJK UNIFIED IDEOGRAPH
+ 0xE5ED: 0x6A07, //CJK UNIFIED IDEOGRAPH
+ 0xE5EE: 0x69F4, //CJK UNIFIED IDEOGRAPH
+ 0xE5EF: 0x6A16, //CJK UNIFIED IDEOGRAPH
+ 0xE5F0: 0x6B51, //CJK UNIFIED IDEOGRAPH
+ 0xE5F1: 0x6BA5, //CJK UNIFIED IDEOGRAPH
+ 0xE5F2: 0x6BA3, //CJK UNIFIED IDEOGRAPH
+ 0xE5F3: 0x6BA2, //CJK UNIFIED IDEOGRAPH
+ 0xE5F4: 0x6BA6, //CJK UNIFIED IDEOGRAPH
+ 0xE5F5: 0x6C01, //CJK UNIFIED IDEOGRAPH
+ 0xE5F6: 0x6C00, //CJK UNIFIED IDEOGRAPH
+ 0xE5F7: 0x6BFF, //CJK UNIFIED IDEOGRAPH
+ 0xE5F8: 0x6C02, //CJK UNIFIED IDEOGRAPH
+ 0xE5F9: 0x6F41, //CJK UNIFIED IDEOGRAPH
+ 0xE5FA: 0x6F26, //CJK UNIFIED IDEOGRAPH
+ 0xE5FB: 0x6F7E, //CJK UNIFIED IDEOGRAPH
+ 0xE5FC: 0x6F87, //CJK UNIFIED IDEOGRAPH
+ 0xE5FD: 0x6FC6, //CJK UNIFIED IDEOGRAPH
+ 0xE5FE: 0x6F92, //CJK UNIFIED IDEOGRAPH
+ 0xE640: 0x6F8D, //CJK UNIFIED IDEOGRAPH
+ 0xE641: 0x6F89, //CJK UNIFIED IDEOGRAPH
+ 0xE642: 0x6F8C, //CJK UNIFIED IDEOGRAPH
+ 0xE643: 0x6F62, //CJK UNIFIED IDEOGRAPH
+ 0xE644: 0x6F4F, //CJK UNIFIED IDEOGRAPH
+ 0xE645: 0x6F85, //CJK UNIFIED IDEOGRAPH
+ 0xE646: 0x6F5A, //CJK UNIFIED IDEOGRAPH
+ 0xE647: 0x6F96, //CJK UNIFIED IDEOGRAPH
+ 0xE648: 0x6F76, //CJK UNIFIED IDEOGRAPH
+ 0xE649: 0x6F6C, //CJK UNIFIED IDEOGRAPH
+ 0xE64A: 0x6F82, //CJK UNIFIED IDEOGRAPH
+ 0xE64B: 0x6F55, //CJK UNIFIED IDEOGRAPH
+ 0xE64C: 0x6F72, //CJK UNIFIED IDEOGRAPH
+ 0xE64D: 0x6F52, //CJK UNIFIED IDEOGRAPH
+ 0xE64E: 0x6F50, //CJK UNIFIED IDEOGRAPH
+ 0xE64F: 0x6F57, //CJK UNIFIED IDEOGRAPH
+ 0xE650: 0x6F94, //CJK UNIFIED IDEOGRAPH
+ 0xE651: 0x6F93, //CJK UNIFIED IDEOGRAPH
+ 0xE652: 0x6F5D, //CJK UNIFIED IDEOGRAPH
+ 0xE653: 0x6F00, //CJK UNIFIED IDEOGRAPH
+ 0xE654: 0x6F61, //CJK UNIFIED IDEOGRAPH
+ 0xE655: 0x6F6B, //CJK UNIFIED IDEOGRAPH
+ 0xE656: 0x6F7D, //CJK UNIFIED IDEOGRAPH
+ 0xE657: 0x6F67, //CJK UNIFIED IDEOGRAPH
+ 0xE658: 0x6F90, //CJK UNIFIED IDEOGRAPH
+ 0xE659: 0x6F53, //CJK UNIFIED IDEOGRAPH
+ 0xE65A: 0x6F8B, //CJK UNIFIED IDEOGRAPH
+ 0xE65B: 0x6F69, //CJK UNIFIED IDEOGRAPH
+ 0xE65C: 0x6F7F, //CJK UNIFIED IDEOGRAPH
+ 0xE65D: 0x6F95, //CJK UNIFIED IDEOGRAPH
+ 0xE65E: 0x6F63, //CJK UNIFIED IDEOGRAPH
+ 0xE65F: 0x6F77, //CJK UNIFIED IDEOGRAPH
+ 0xE660: 0x6F6A, //CJK UNIFIED IDEOGRAPH
+ 0xE661: 0x6F7B, //CJK UNIFIED IDEOGRAPH
+ 0xE662: 0x71B2, //CJK UNIFIED IDEOGRAPH
+ 0xE663: 0x71AF, //CJK UNIFIED IDEOGRAPH
+ 0xE664: 0x719B, //CJK UNIFIED IDEOGRAPH
+ 0xE665: 0x71B0, //CJK UNIFIED IDEOGRAPH
+ 0xE666: 0x71A0, //CJK UNIFIED IDEOGRAPH
+ 0xE667: 0x719A, //CJK UNIFIED IDEOGRAPH
+ 0xE668: 0x71A9, //CJK UNIFIED IDEOGRAPH
+ 0xE669: 0x71B5, //CJK UNIFIED IDEOGRAPH
+ 0xE66A: 0x719D, //CJK UNIFIED IDEOGRAPH
+ 0xE66B: 0x71A5, //CJK UNIFIED IDEOGRAPH
+ 0xE66C: 0x719E, //CJK UNIFIED IDEOGRAPH
+ 0xE66D: 0x71A4, //CJK UNIFIED IDEOGRAPH
+ 0xE66E: 0x71A1, //CJK UNIFIED IDEOGRAPH
+ 0xE66F: 0x71AA, //CJK UNIFIED IDEOGRAPH
+ 0xE670: 0x719C, //CJK UNIFIED IDEOGRAPH
+ 0xE671: 0x71A7, //CJK UNIFIED IDEOGRAPH
+ 0xE672: 0x71B3, //CJK UNIFIED IDEOGRAPH
+ 0xE673: 0x7298, //CJK UNIFIED IDEOGRAPH
+ 0xE674: 0x729A, //CJK UNIFIED IDEOGRAPH
+ 0xE675: 0x7358, //CJK UNIFIED IDEOGRAPH
+ 0xE676: 0x7352, //CJK UNIFIED IDEOGRAPH
+ 0xE677: 0x735E, //CJK UNIFIED IDEOGRAPH
+ 0xE678: 0x735F, //CJK UNIFIED IDEOGRAPH
+ 0xE679: 0x7360, //CJK UNIFIED IDEOGRAPH
+ 0xE67A: 0x735D, //CJK UNIFIED IDEOGRAPH
+ 0xE67B: 0x735B, //CJK UNIFIED IDEOGRAPH
+ 0xE67C: 0x7361, //CJK UNIFIED IDEOGRAPH
+ 0xE67D: 0x735A, //CJK UNIFIED IDEOGRAPH
+ 0xE67E: 0x7359, //CJK UNIFIED IDEOGRAPH
+ 0xE6A1: 0x7362, //CJK UNIFIED IDEOGRAPH
+ 0xE6A2: 0x7487, //CJK UNIFIED IDEOGRAPH
+ 0xE6A3: 0x7489, //CJK UNIFIED IDEOGRAPH
+ 0xE6A4: 0x748A, //CJK UNIFIED IDEOGRAPH
+ 0xE6A5: 0x7486, //CJK UNIFIED IDEOGRAPH
+ 0xE6A6: 0x7481, //CJK UNIFIED IDEOGRAPH
+ 0xE6A7: 0x747D, //CJK UNIFIED IDEOGRAPH
+ 0xE6A8: 0x7485, //CJK UNIFIED IDEOGRAPH
+ 0xE6A9: 0x7488, //CJK UNIFIED IDEOGRAPH
+ 0xE6AA: 0x747C, //CJK UNIFIED IDEOGRAPH
+ 0xE6AB: 0x7479, //CJK UNIFIED IDEOGRAPH
+ 0xE6AC: 0x7508, //CJK UNIFIED IDEOGRAPH
+ 0xE6AD: 0x7507, //CJK UNIFIED IDEOGRAPH
+ 0xE6AE: 0x757E, //CJK UNIFIED IDEOGRAPH
+ 0xE6AF: 0x7625, //CJK UNIFIED IDEOGRAPH
+ 0xE6B0: 0x761E, //CJK UNIFIED IDEOGRAPH
+ 0xE6B1: 0x7619, //CJK UNIFIED IDEOGRAPH
+ 0xE6B2: 0x761D, //CJK UNIFIED IDEOGRAPH
+ 0xE6B3: 0x761C, //CJK UNIFIED IDEOGRAPH
+ 0xE6B4: 0x7623, //CJK UNIFIED IDEOGRAPH
+ 0xE6B5: 0x761A, //CJK UNIFIED IDEOGRAPH
+ 0xE6B6: 0x7628, //CJK UNIFIED IDEOGRAPH
+ 0xE6B7: 0x761B, //CJK UNIFIED IDEOGRAPH
+ 0xE6B8: 0x769C, //CJK UNIFIED IDEOGRAPH
+ 0xE6B9: 0x769D, //CJK UNIFIED IDEOGRAPH
+ 0xE6BA: 0x769E, //CJK UNIFIED IDEOGRAPH
+ 0xE6BB: 0x769B, //CJK UNIFIED IDEOGRAPH
+ 0xE6BC: 0x778D, //CJK UNIFIED IDEOGRAPH
+ 0xE6BD: 0x778F, //CJK UNIFIED IDEOGRAPH
+ 0xE6BE: 0x7789, //CJK UNIFIED IDEOGRAPH
+ 0xE6BF: 0x7788, //CJK UNIFIED IDEOGRAPH
+ 0xE6C0: 0x78CD, //CJK UNIFIED IDEOGRAPH
+ 0xE6C1: 0x78BB, //CJK UNIFIED IDEOGRAPH
+ 0xE6C2: 0x78CF, //CJK UNIFIED IDEOGRAPH
+ 0xE6C3: 0x78CC, //CJK UNIFIED IDEOGRAPH
+ 0xE6C4: 0x78D1, //CJK UNIFIED IDEOGRAPH
+ 0xE6C5: 0x78CE, //CJK UNIFIED IDEOGRAPH
+ 0xE6C6: 0x78D4, //CJK UNIFIED IDEOGRAPH
+ 0xE6C7: 0x78C8, //CJK UNIFIED IDEOGRAPH
+ 0xE6C8: 0x78C3, //CJK UNIFIED IDEOGRAPH
+ 0xE6C9: 0x78C4, //CJK UNIFIED IDEOGRAPH
+ 0xE6CA: 0x78C9, //CJK UNIFIED IDEOGRAPH
+ 0xE6CB: 0x799A, //CJK UNIFIED IDEOGRAPH
+ 0xE6CC: 0x79A1, //CJK UNIFIED IDEOGRAPH
+ 0xE6CD: 0x79A0, //CJK UNIFIED IDEOGRAPH
+ 0xE6CE: 0x799C, //CJK UNIFIED IDEOGRAPH
+ 0xE6CF: 0x79A2, //CJK UNIFIED IDEOGRAPH
+ 0xE6D0: 0x799B, //CJK UNIFIED IDEOGRAPH
+ 0xE6D1: 0x6B76, //CJK UNIFIED IDEOGRAPH
+ 0xE6D2: 0x7A39, //CJK UNIFIED IDEOGRAPH
+ 0xE6D3: 0x7AB2, //CJK UNIFIED IDEOGRAPH
+ 0xE6D4: 0x7AB4, //CJK UNIFIED IDEOGRAPH
+ 0xE6D5: 0x7AB3, //CJK UNIFIED IDEOGRAPH
+ 0xE6D6: 0x7BB7, //CJK UNIFIED IDEOGRAPH
+ 0xE6D7: 0x7BCB, //CJK UNIFIED IDEOGRAPH
+ 0xE6D8: 0x7BBE, //CJK UNIFIED IDEOGRAPH
+ 0xE6D9: 0x7BAC, //CJK UNIFIED IDEOGRAPH
+ 0xE6DA: 0x7BCE, //CJK UNIFIED IDEOGRAPH
+ 0xE6DB: 0x7BAF, //CJK UNIFIED IDEOGRAPH
+ 0xE6DC: 0x7BB9, //CJK UNIFIED IDEOGRAPH
+ 0xE6DD: 0x7BCA, //CJK UNIFIED IDEOGRAPH
+ 0xE6DE: 0x7BB5, //CJK UNIFIED IDEOGRAPH
+ 0xE6DF: 0x7CC5, //CJK UNIFIED IDEOGRAPH
+ 0xE6E0: 0x7CC8, //CJK UNIFIED IDEOGRAPH
+ 0xE6E1: 0x7CCC, //CJK UNIFIED IDEOGRAPH
+ 0xE6E2: 0x7CCB, //CJK UNIFIED IDEOGRAPH
+ 0xE6E3: 0x7DF7, //CJK UNIFIED IDEOGRAPH
+ 0xE6E4: 0x7DDB, //CJK UNIFIED IDEOGRAPH
+ 0xE6E5: 0x7DEA, //CJK UNIFIED IDEOGRAPH
+ 0xE6E6: 0x7DE7, //CJK UNIFIED IDEOGRAPH
+ 0xE6E7: 0x7DD7, //CJK UNIFIED IDEOGRAPH
+ 0xE6E8: 0x7DE1, //CJK UNIFIED IDEOGRAPH
+ 0xE6E9: 0x7E03, //CJK UNIFIED IDEOGRAPH
+ 0xE6EA: 0x7DFA, //CJK UNIFIED IDEOGRAPH
+ 0xE6EB: 0x7DE6, //CJK UNIFIED IDEOGRAPH
+ 0xE6EC: 0x7DF6, //CJK UNIFIED IDEOGRAPH
+ 0xE6ED: 0x7DF1, //CJK UNIFIED IDEOGRAPH
+ 0xE6EE: 0x7DF0, //CJK UNIFIED IDEOGRAPH
+ 0xE6EF: 0x7DEE, //CJK UNIFIED IDEOGRAPH
+ 0xE6F0: 0x7DDF, //CJK UNIFIED IDEOGRAPH
+ 0xE6F1: 0x7F76, //CJK UNIFIED IDEOGRAPH
+ 0xE6F2: 0x7FAC, //CJK UNIFIED IDEOGRAPH
+ 0xE6F3: 0x7FB0, //CJK UNIFIED IDEOGRAPH
+ 0xE6F4: 0x7FAD, //CJK UNIFIED IDEOGRAPH
+ 0xE6F5: 0x7FED, //CJK UNIFIED IDEOGRAPH
+ 0xE6F6: 0x7FEB, //CJK UNIFIED IDEOGRAPH
+ 0xE6F7: 0x7FEA, //CJK UNIFIED IDEOGRAPH
+ 0xE6F8: 0x7FEC, //CJK UNIFIED IDEOGRAPH
+ 0xE6F9: 0x7FE6, //CJK UNIFIED IDEOGRAPH
+ 0xE6FA: 0x7FE8, //CJK UNIFIED IDEOGRAPH
+ 0xE6FB: 0x8064, //CJK UNIFIED IDEOGRAPH
+ 0xE6FC: 0x8067, //CJK UNIFIED IDEOGRAPH
+ 0xE6FD: 0x81A3, //CJK UNIFIED IDEOGRAPH
+ 0xE6FE: 0x819F, //CJK UNIFIED IDEOGRAPH
+ 0xE740: 0x819E, //CJK UNIFIED IDEOGRAPH
+ 0xE741: 0x8195, //CJK UNIFIED IDEOGRAPH
+ 0xE742: 0x81A2, //CJK UNIFIED IDEOGRAPH
+ 0xE743: 0x8199, //CJK UNIFIED IDEOGRAPH
+ 0xE744: 0x8197, //CJK UNIFIED IDEOGRAPH
+ 0xE745: 0x8216, //CJK UNIFIED IDEOGRAPH
+ 0xE746: 0x824F, //CJK UNIFIED IDEOGRAPH
+ 0xE747: 0x8253, //CJK UNIFIED IDEOGRAPH
+ 0xE748: 0x8252, //CJK UNIFIED IDEOGRAPH
+ 0xE749: 0x8250, //CJK UNIFIED IDEOGRAPH
+ 0xE74A: 0x824E, //CJK UNIFIED IDEOGRAPH
+ 0xE74B: 0x8251, //CJK UNIFIED IDEOGRAPH
+ 0xE74C: 0x8524, //CJK UNIFIED IDEOGRAPH
+ 0xE74D: 0x853B, //CJK UNIFIED IDEOGRAPH
+ 0xE74E: 0x850F, //CJK UNIFIED IDEOGRAPH
+ 0xE74F: 0x8500, //CJK UNIFIED IDEOGRAPH
+ 0xE750: 0x8529, //CJK UNIFIED IDEOGRAPH
+ 0xE751: 0x850E, //CJK UNIFIED IDEOGRAPH
+ 0xE752: 0x8509, //CJK UNIFIED IDEOGRAPH
+ 0xE753: 0x850D, //CJK UNIFIED IDEOGRAPH
+ 0xE754: 0x851F, //CJK UNIFIED IDEOGRAPH
+ 0xE755: 0x850A, //CJK UNIFIED IDEOGRAPH
+ 0xE756: 0x8527, //CJK UNIFIED IDEOGRAPH
+ 0xE757: 0x851C, //CJK UNIFIED IDEOGRAPH
+ 0xE758: 0x84FB, //CJK UNIFIED IDEOGRAPH
+ 0xE759: 0x852B, //CJK UNIFIED IDEOGRAPH
+ 0xE75A: 0x84FA, //CJK UNIFIED IDEOGRAPH
+ 0xE75B: 0x8508, //CJK UNIFIED IDEOGRAPH
+ 0xE75C: 0x850C, //CJK UNIFIED IDEOGRAPH
+ 0xE75D: 0x84F4, //CJK UNIFIED IDEOGRAPH
+ 0xE75E: 0x852A, //CJK UNIFIED IDEOGRAPH
+ 0xE75F: 0x84F2, //CJK UNIFIED IDEOGRAPH
+ 0xE760: 0x8515, //CJK UNIFIED IDEOGRAPH
+ 0xE761: 0x84F7, //CJK UNIFIED IDEOGRAPH
+ 0xE762: 0x84EB, //CJK UNIFIED IDEOGRAPH
+ 0xE763: 0x84F3, //CJK UNIFIED IDEOGRAPH
+ 0xE764: 0x84FC, //CJK UNIFIED IDEOGRAPH
+ 0xE765: 0x8512, //CJK UNIFIED IDEOGRAPH
+ 0xE766: 0x84EA, //CJK UNIFIED IDEOGRAPH
+ 0xE767: 0x84E9, //CJK UNIFIED IDEOGRAPH
+ 0xE768: 0x8516, //CJK UNIFIED IDEOGRAPH
+ 0xE769: 0x84FE, //CJK UNIFIED IDEOGRAPH
+ 0xE76A: 0x8528, //CJK UNIFIED IDEOGRAPH
+ 0xE76B: 0x851D, //CJK UNIFIED IDEOGRAPH
+ 0xE76C: 0x852E, //CJK UNIFIED IDEOGRAPH
+ 0xE76D: 0x8502, //CJK UNIFIED IDEOGRAPH
+ 0xE76E: 0x84FD, //CJK UNIFIED IDEOGRAPH
+ 0xE76F: 0x851E, //CJK UNIFIED IDEOGRAPH
+ 0xE770: 0x84F6, //CJK UNIFIED IDEOGRAPH
+ 0xE771: 0x8531, //CJK UNIFIED IDEOGRAPH
+ 0xE772: 0x8526, //CJK UNIFIED IDEOGRAPH
+ 0xE773: 0x84E7, //CJK UNIFIED IDEOGRAPH
+ 0xE774: 0x84E8, //CJK UNIFIED IDEOGRAPH
+ 0xE775: 0x84F0, //CJK UNIFIED IDEOGRAPH
+ 0xE776: 0x84EF, //CJK UNIFIED IDEOGRAPH
+ 0xE777: 0x84F9, //CJK UNIFIED IDEOGRAPH
+ 0xE778: 0x8518, //CJK UNIFIED IDEOGRAPH
+ 0xE779: 0x8520, //CJK UNIFIED IDEOGRAPH
+ 0xE77A: 0x8530, //CJK UNIFIED IDEOGRAPH
+ 0xE77B: 0x850B, //CJK UNIFIED IDEOGRAPH
+ 0xE77C: 0x8519, //CJK UNIFIED IDEOGRAPH
+ 0xE77D: 0x852F, //CJK UNIFIED IDEOGRAPH
+ 0xE77E: 0x8662, //CJK UNIFIED IDEOGRAPH
+ 0xE7A1: 0x8756, //CJK UNIFIED IDEOGRAPH
+ 0xE7A2: 0x8763, //CJK UNIFIED IDEOGRAPH
+ 0xE7A3: 0x8764, //CJK UNIFIED IDEOGRAPH
+ 0xE7A4: 0x8777, //CJK UNIFIED IDEOGRAPH
+ 0xE7A5: 0x87E1, //CJK UNIFIED IDEOGRAPH
+ 0xE7A6: 0x8773, //CJK UNIFIED IDEOGRAPH
+ 0xE7A7: 0x8758, //CJK UNIFIED IDEOGRAPH
+ 0xE7A8: 0x8754, //CJK UNIFIED IDEOGRAPH
+ 0xE7A9: 0x875B, //CJK UNIFIED IDEOGRAPH
+ 0xE7AA: 0x8752, //CJK UNIFIED IDEOGRAPH
+ 0xE7AB: 0x8761, //CJK UNIFIED IDEOGRAPH
+ 0xE7AC: 0x875A, //CJK UNIFIED IDEOGRAPH
+ 0xE7AD: 0x8751, //CJK UNIFIED IDEOGRAPH
+ 0xE7AE: 0x875E, //CJK UNIFIED IDEOGRAPH
+ 0xE7AF: 0x876D, //CJK UNIFIED IDEOGRAPH
+ 0xE7B0: 0x876A, //CJK UNIFIED IDEOGRAPH
+ 0xE7B1: 0x8750, //CJK UNIFIED IDEOGRAPH
+ 0xE7B2: 0x874E, //CJK UNIFIED IDEOGRAPH
+ 0xE7B3: 0x875F, //CJK UNIFIED IDEOGRAPH
+ 0xE7B4: 0x875D, //CJK UNIFIED IDEOGRAPH
+ 0xE7B5: 0x876F, //CJK UNIFIED IDEOGRAPH
+ 0xE7B6: 0x876C, //CJK UNIFIED IDEOGRAPH
+ 0xE7B7: 0x877A, //CJK UNIFIED IDEOGRAPH
+ 0xE7B8: 0x876E, //CJK UNIFIED IDEOGRAPH
+ 0xE7B9: 0x875C, //CJK UNIFIED IDEOGRAPH
+ 0xE7BA: 0x8765, //CJK UNIFIED IDEOGRAPH
+ 0xE7BB: 0x874F, //CJK UNIFIED IDEOGRAPH
+ 0xE7BC: 0x877B, //CJK UNIFIED IDEOGRAPH
+ 0xE7BD: 0x8775, //CJK UNIFIED IDEOGRAPH
+ 0xE7BE: 0x8762, //CJK UNIFIED IDEOGRAPH
+ 0xE7BF: 0x8767, //CJK UNIFIED IDEOGRAPH
+ 0xE7C0: 0x8769, //CJK UNIFIED IDEOGRAPH
+ 0xE7C1: 0x885A, //CJK UNIFIED IDEOGRAPH
+ 0xE7C2: 0x8905, //CJK UNIFIED IDEOGRAPH
+ 0xE7C3: 0x890C, //CJK UNIFIED IDEOGRAPH
+ 0xE7C4: 0x8914, //CJK UNIFIED IDEOGRAPH
+ 0xE7C5: 0x890B, //CJK UNIFIED IDEOGRAPH
+ 0xE7C6: 0x8917, //CJK UNIFIED IDEOGRAPH
+ 0xE7C7: 0x8918, //CJK UNIFIED IDEOGRAPH
+ 0xE7C8: 0x8919, //CJK UNIFIED IDEOGRAPH
+ 0xE7C9: 0x8906, //CJK UNIFIED IDEOGRAPH
+ 0xE7CA: 0x8916, //CJK UNIFIED IDEOGRAPH
+ 0xE7CB: 0x8911, //CJK UNIFIED IDEOGRAPH
+ 0xE7CC: 0x890E, //CJK UNIFIED IDEOGRAPH
+ 0xE7CD: 0x8909, //CJK UNIFIED IDEOGRAPH
+ 0xE7CE: 0x89A2, //CJK UNIFIED IDEOGRAPH
+ 0xE7CF: 0x89A4, //CJK UNIFIED IDEOGRAPH
+ 0xE7D0: 0x89A3, //CJK UNIFIED IDEOGRAPH
+ 0xE7D1: 0x89ED, //CJK UNIFIED IDEOGRAPH
+ 0xE7D2: 0x89F0, //CJK UNIFIED IDEOGRAPH
+ 0xE7D3: 0x89EC, //CJK UNIFIED IDEOGRAPH
+ 0xE7D4: 0x8ACF, //CJK UNIFIED IDEOGRAPH
+ 0xE7D5: 0x8AC6, //CJK UNIFIED IDEOGRAPH
+ 0xE7D6: 0x8AB8, //CJK UNIFIED IDEOGRAPH
+ 0xE7D7: 0x8AD3, //CJK UNIFIED IDEOGRAPH
+ 0xE7D8: 0x8AD1, //CJK UNIFIED IDEOGRAPH
+ 0xE7D9: 0x8AD4, //CJK UNIFIED IDEOGRAPH
+ 0xE7DA: 0x8AD5, //CJK UNIFIED IDEOGRAPH
+ 0xE7DB: 0x8ABB, //CJK UNIFIED IDEOGRAPH
+ 0xE7DC: 0x8AD7, //CJK UNIFIED IDEOGRAPH
+ 0xE7DD: 0x8ABE, //CJK UNIFIED IDEOGRAPH
+ 0xE7DE: 0x8AC0, //CJK UNIFIED IDEOGRAPH
+ 0xE7DF: 0x8AC5, //CJK UNIFIED IDEOGRAPH
+ 0xE7E0: 0x8AD8, //CJK UNIFIED IDEOGRAPH
+ 0xE7E1: 0x8AC3, //CJK UNIFIED IDEOGRAPH
+ 0xE7E2: 0x8ABA, //CJK UNIFIED IDEOGRAPH
+ 0xE7E3: 0x8ABD, //CJK UNIFIED IDEOGRAPH
+ 0xE7E4: 0x8AD9, //CJK UNIFIED IDEOGRAPH
+ 0xE7E5: 0x8C3E, //CJK UNIFIED IDEOGRAPH
+ 0xE7E6: 0x8C4D, //CJK UNIFIED IDEOGRAPH
+ 0xE7E7: 0x8C8F, //CJK UNIFIED IDEOGRAPH
+ 0xE7E8: 0x8CE5, //CJK UNIFIED IDEOGRAPH
+ 0xE7E9: 0x8CDF, //CJK UNIFIED IDEOGRAPH
+ 0xE7EA: 0x8CD9, //CJK UNIFIED IDEOGRAPH
+ 0xE7EB: 0x8CE8, //CJK UNIFIED IDEOGRAPH
+ 0xE7EC: 0x8CDA, //CJK UNIFIED IDEOGRAPH
+ 0xE7ED: 0x8CDD, //CJK UNIFIED IDEOGRAPH
+ 0xE7EE: 0x8CE7, //CJK UNIFIED IDEOGRAPH
+ 0xE7EF: 0x8DA0, //CJK UNIFIED IDEOGRAPH
+ 0xE7F0: 0x8D9C, //CJK UNIFIED IDEOGRAPH
+ 0xE7F1: 0x8DA1, //CJK UNIFIED IDEOGRAPH
+ 0xE7F2: 0x8D9B, //CJK UNIFIED IDEOGRAPH
+ 0xE7F3: 0x8E20, //CJK UNIFIED IDEOGRAPH
+ 0xE7F4: 0x8E23, //CJK UNIFIED IDEOGRAPH
+ 0xE7F5: 0x8E25, //CJK UNIFIED IDEOGRAPH
+ 0xE7F6: 0x8E24, //CJK UNIFIED IDEOGRAPH
+ 0xE7F7: 0x8E2E, //CJK UNIFIED IDEOGRAPH
+ 0xE7F8: 0x8E15, //CJK UNIFIED IDEOGRAPH
+ 0xE7F9: 0x8E1B, //CJK UNIFIED IDEOGRAPH
+ 0xE7FA: 0x8E16, //CJK UNIFIED IDEOGRAPH
+ 0xE7FB: 0x8E11, //CJK UNIFIED IDEOGRAPH
+ 0xE7FC: 0x8E19, //CJK UNIFIED IDEOGRAPH
+ 0xE7FD: 0x8E26, //CJK UNIFIED IDEOGRAPH
+ 0xE7FE: 0x8E27, //CJK UNIFIED IDEOGRAPH
+ 0xE840: 0x8E14, //CJK UNIFIED IDEOGRAPH
+ 0xE841: 0x8E12, //CJK UNIFIED IDEOGRAPH
+ 0xE842: 0x8E18, //CJK UNIFIED IDEOGRAPH
+ 0xE843: 0x8E13, //CJK UNIFIED IDEOGRAPH
+ 0xE844: 0x8E1C, //CJK UNIFIED IDEOGRAPH
+ 0xE845: 0x8E17, //CJK UNIFIED IDEOGRAPH
+ 0xE846: 0x8E1A, //CJK UNIFIED IDEOGRAPH
+ 0xE847: 0x8F2C, //CJK UNIFIED IDEOGRAPH
+ 0xE848: 0x8F24, //CJK UNIFIED IDEOGRAPH
+ 0xE849: 0x8F18, //CJK UNIFIED IDEOGRAPH
+ 0xE84A: 0x8F1A, //CJK UNIFIED IDEOGRAPH
+ 0xE84B: 0x8F20, //CJK UNIFIED IDEOGRAPH
+ 0xE84C: 0x8F23, //CJK UNIFIED IDEOGRAPH
+ 0xE84D: 0x8F16, //CJK UNIFIED IDEOGRAPH
+ 0xE84E: 0x8F17, //CJK UNIFIED IDEOGRAPH
+ 0xE84F: 0x9073, //CJK UNIFIED IDEOGRAPH
+ 0xE850: 0x9070, //CJK UNIFIED IDEOGRAPH
+ 0xE851: 0x906F, //CJK UNIFIED IDEOGRAPH
+ 0xE852: 0x9067, //CJK UNIFIED IDEOGRAPH
+ 0xE853: 0x906B, //CJK UNIFIED IDEOGRAPH
+ 0xE854: 0x912F, //CJK UNIFIED IDEOGRAPH
+ 0xE855: 0x912B, //CJK UNIFIED IDEOGRAPH
+ 0xE856: 0x9129, //CJK UNIFIED IDEOGRAPH
+ 0xE857: 0x912A, //CJK UNIFIED IDEOGRAPH
+ 0xE858: 0x9132, //CJK UNIFIED IDEOGRAPH
+ 0xE859: 0x9126, //CJK UNIFIED IDEOGRAPH
+ 0xE85A: 0x912E, //CJK UNIFIED IDEOGRAPH
+ 0xE85B: 0x9185, //CJK UNIFIED IDEOGRAPH
+ 0xE85C: 0x9186, //CJK UNIFIED IDEOGRAPH
+ 0xE85D: 0x918A, //CJK UNIFIED IDEOGRAPH
+ 0xE85E: 0x9181, //CJK UNIFIED IDEOGRAPH
+ 0xE85F: 0x9182, //CJK UNIFIED IDEOGRAPH
+ 0xE860: 0x9184, //CJK UNIFIED IDEOGRAPH
+ 0xE861: 0x9180, //CJK UNIFIED IDEOGRAPH
+ 0xE862: 0x92D0, //CJK UNIFIED IDEOGRAPH
+ 0xE863: 0x92C3, //CJK UNIFIED IDEOGRAPH
+ 0xE864: 0x92C4, //CJK UNIFIED IDEOGRAPH
+ 0xE865: 0x92C0, //CJK UNIFIED IDEOGRAPH
+ 0xE866: 0x92D9, //CJK UNIFIED IDEOGRAPH
+ 0xE867: 0x92B6, //CJK UNIFIED IDEOGRAPH
+ 0xE868: 0x92CF, //CJK UNIFIED IDEOGRAPH
+ 0xE869: 0x92F1, //CJK UNIFIED IDEOGRAPH
+ 0xE86A: 0x92DF, //CJK UNIFIED IDEOGRAPH
+ 0xE86B: 0x92D8, //CJK UNIFIED IDEOGRAPH
+ 0xE86C: 0x92E9, //CJK UNIFIED IDEOGRAPH
+ 0xE86D: 0x92D7, //CJK UNIFIED IDEOGRAPH
+ 0xE86E: 0x92DD, //CJK UNIFIED IDEOGRAPH
+ 0xE86F: 0x92CC, //CJK UNIFIED IDEOGRAPH
+ 0xE870: 0x92EF, //CJK UNIFIED IDEOGRAPH
+ 0xE871: 0x92C2, //CJK UNIFIED IDEOGRAPH
+ 0xE872: 0x92E8, //CJK UNIFIED IDEOGRAPH
+ 0xE873: 0x92CA, //CJK UNIFIED IDEOGRAPH
+ 0xE874: 0x92C8, //CJK UNIFIED IDEOGRAPH
+ 0xE875: 0x92CE, //CJK UNIFIED IDEOGRAPH
+ 0xE876: 0x92E6, //CJK UNIFIED IDEOGRAPH
+ 0xE877: 0x92CD, //CJK UNIFIED IDEOGRAPH
+ 0xE878: 0x92D5, //CJK UNIFIED IDEOGRAPH
+ 0xE879: 0x92C9, //CJK UNIFIED IDEOGRAPH
+ 0xE87A: 0x92E0, //CJK UNIFIED IDEOGRAPH
+ 0xE87B: 0x92DE, //CJK UNIFIED IDEOGRAPH
+ 0xE87C: 0x92E7, //CJK UNIFIED IDEOGRAPH
+ 0xE87D: 0x92D1, //CJK UNIFIED IDEOGRAPH
+ 0xE87E: 0x92D3, //CJK UNIFIED IDEOGRAPH
+ 0xE8A1: 0x92B5, //CJK UNIFIED IDEOGRAPH
+ 0xE8A2: 0x92E1, //CJK UNIFIED IDEOGRAPH
+ 0xE8A3: 0x92C6, //CJK UNIFIED IDEOGRAPH
+ 0xE8A4: 0x92B4, //CJK UNIFIED IDEOGRAPH
+ 0xE8A5: 0x957C, //CJK UNIFIED IDEOGRAPH
+ 0xE8A6: 0x95AC, //CJK UNIFIED IDEOGRAPH
+ 0xE8A7: 0x95AB, //CJK UNIFIED IDEOGRAPH
+ 0xE8A8: 0x95AE, //CJK UNIFIED IDEOGRAPH
+ 0xE8A9: 0x95B0, //CJK UNIFIED IDEOGRAPH
+ 0xE8AA: 0x96A4, //CJK UNIFIED IDEOGRAPH
+ 0xE8AB: 0x96A2, //CJK UNIFIED IDEOGRAPH
+ 0xE8AC: 0x96D3, //CJK UNIFIED IDEOGRAPH
+ 0xE8AD: 0x9705, //CJK UNIFIED IDEOGRAPH
+ 0xE8AE: 0x9708, //CJK UNIFIED IDEOGRAPH
+ 0xE8AF: 0x9702, //CJK UNIFIED IDEOGRAPH
+ 0xE8B0: 0x975A, //CJK UNIFIED IDEOGRAPH
+ 0xE8B1: 0x978A, //CJK UNIFIED IDEOGRAPH
+ 0xE8B2: 0x978E, //CJK UNIFIED IDEOGRAPH
+ 0xE8B3: 0x9788, //CJK UNIFIED IDEOGRAPH
+ 0xE8B4: 0x97D0, //CJK UNIFIED IDEOGRAPH
+ 0xE8B5: 0x97CF, //CJK UNIFIED IDEOGRAPH
+ 0xE8B6: 0x981E, //CJK UNIFIED IDEOGRAPH
+ 0xE8B7: 0x981D, //CJK UNIFIED IDEOGRAPH
+ 0xE8B8: 0x9826, //CJK UNIFIED IDEOGRAPH
+ 0xE8B9: 0x9829, //CJK UNIFIED IDEOGRAPH
+ 0xE8BA: 0x9828, //CJK UNIFIED IDEOGRAPH
+ 0xE8BB: 0x9820, //CJK UNIFIED IDEOGRAPH
+ 0xE8BC: 0x981B, //CJK UNIFIED IDEOGRAPH
+ 0xE8BD: 0x9827, //CJK UNIFIED IDEOGRAPH
+ 0xE8BE: 0x98B2, //CJK UNIFIED IDEOGRAPH
+ 0xE8BF: 0x9908, //CJK UNIFIED IDEOGRAPH
+ 0xE8C0: 0x98FA, //CJK UNIFIED IDEOGRAPH
+ 0xE8C1: 0x9911, //CJK UNIFIED IDEOGRAPH
+ 0xE8C2: 0x9914, //CJK UNIFIED IDEOGRAPH
+ 0xE8C3: 0x9916, //CJK UNIFIED IDEOGRAPH
+ 0xE8C4: 0x9917, //CJK UNIFIED IDEOGRAPH
+ 0xE8C5: 0x9915, //CJK UNIFIED IDEOGRAPH
+ 0xE8C6: 0x99DC, //CJK UNIFIED IDEOGRAPH
+ 0xE8C7: 0x99CD, //CJK UNIFIED IDEOGRAPH
+ 0xE8C8: 0x99CF, //CJK UNIFIED IDEOGRAPH
+ 0xE8C9: 0x99D3, //CJK UNIFIED IDEOGRAPH
+ 0xE8CA: 0x99D4, //CJK UNIFIED IDEOGRAPH
+ 0xE8CB: 0x99CE, //CJK UNIFIED IDEOGRAPH
+ 0xE8CC: 0x99C9, //CJK UNIFIED IDEOGRAPH
+ 0xE8CD: 0x99D6, //CJK UNIFIED IDEOGRAPH
+ 0xE8CE: 0x99D8, //CJK UNIFIED IDEOGRAPH
+ 0xE8CF: 0x99CB, //CJK UNIFIED IDEOGRAPH
+ 0xE8D0: 0x99D7, //CJK UNIFIED IDEOGRAPH
+ 0xE8D1: 0x99CC, //CJK UNIFIED IDEOGRAPH
+ 0xE8D2: 0x9AB3, //CJK UNIFIED IDEOGRAPH
+ 0xE8D3: 0x9AEC, //CJK UNIFIED IDEOGRAPH
+ 0xE8D4: 0x9AEB, //CJK UNIFIED IDEOGRAPH
+ 0xE8D5: 0x9AF3, //CJK UNIFIED IDEOGRAPH
+ 0xE8D6: 0x9AF2, //CJK UNIFIED IDEOGRAPH
+ 0xE8D7: 0x9AF1, //CJK UNIFIED IDEOGRAPH
+ 0xE8D8: 0x9B46, //CJK UNIFIED IDEOGRAPH
+ 0xE8D9: 0x9B43, //CJK UNIFIED IDEOGRAPH
+ 0xE8DA: 0x9B67, //CJK UNIFIED IDEOGRAPH
+ 0xE8DB: 0x9B74, //CJK UNIFIED IDEOGRAPH
+ 0xE8DC: 0x9B71, //CJK UNIFIED IDEOGRAPH
+ 0xE8DD: 0x9B66, //CJK UNIFIED IDEOGRAPH
+ 0xE8DE: 0x9B76, //CJK UNIFIED IDEOGRAPH
+ 0xE8DF: 0x9B75, //CJK UNIFIED IDEOGRAPH
+ 0xE8E0: 0x9B70, //CJK UNIFIED IDEOGRAPH
+ 0xE8E1: 0x9B68, //CJK UNIFIED IDEOGRAPH
+ 0xE8E2: 0x9B64, //CJK UNIFIED IDEOGRAPH
+ 0xE8E3: 0x9B6C, //CJK UNIFIED IDEOGRAPH
+ 0xE8E4: 0x9CFC, //CJK UNIFIED IDEOGRAPH
+ 0xE8E5: 0x9CFA, //CJK UNIFIED IDEOGRAPH
+ 0xE8E6: 0x9CFD, //CJK UNIFIED IDEOGRAPH
+ 0xE8E7: 0x9CFF, //CJK UNIFIED IDEOGRAPH
+ 0xE8E8: 0x9CF7, //CJK UNIFIED IDEOGRAPH
+ 0xE8E9: 0x9D07, //CJK UNIFIED IDEOGRAPH
+ 0xE8EA: 0x9D00, //CJK UNIFIED IDEOGRAPH
+ 0xE8EB: 0x9CF9, //CJK UNIFIED IDEOGRAPH
+ 0xE8EC: 0x9CFB, //CJK UNIFIED IDEOGRAPH
+ 0xE8ED: 0x9D08, //CJK UNIFIED IDEOGRAPH
+ 0xE8EE: 0x9D05, //CJK UNIFIED IDEOGRAPH
+ 0xE8EF: 0x9D04, //CJK UNIFIED IDEOGRAPH
+ 0xE8F0: 0x9E83, //CJK UNIFIED IDEOGRAPH
+ 0xE8F1: 0x9ED3, //CJK UNIFIED IDEOGRAPH
+ 0xE8F2: 0x9F0F, //CJK UNIFIED IDEOGRAPH
+ 0xE8F3: 0x9F10, //CJK UNIFIED IDEOGRAPH
+ 0xE8F4: 0x511C, //CJK UNIFIED IDEOGRAPH
+ 0xE8F5: 0x5113, //CJK UNIFIED IDEOGRAPH
+ 0xE8F6: 0x5117, //CJK UNIFIED IDEOGRAPH
+ 0xE8F7: 0x511A, //CJK UNIFIED IDEOGRAPH
+ 0xE8F8: 0x5111, //CJK UNIFIED IDEOGRAPH
+ 0xE8F9: 0x51DE, //CJK UNIFIED IDEOGRAPH
+ 0xE8FA: 0x5334, //CJK UNIFIED IDEOGRAPH
+ 0xE8FB: 0x53E1, //CJK UNIFIED IDEOGRAPH
+ 0xE8FC: 0x5670, //CJK UNIFIED IDEOGRAPH
+ 0xE8FD: 0x5660, //CJK UNIFIED IDEOGRAPH
+ 0xE8FE: 0x566E, //CJK UNIFIED IDEOGRAPH
+ 0xE940: 0x5673, //CJK UNIFIED IDEOGRAPH
+ 0xE941: 0x5666, //CJK UNIFIED IDEOGRAPH
+ 0xE942: 0x5663, //CJK UNIFIED IDEOGRAPH
+ 0xE943: 0x566D, //CJK UNIFIED IDEOGRAPH
+ 0xE944: 0x5672, //CJK UNIFIED IDEOGRAPH
+ 0xE945: 0x565E, //CJK UNIFIED IDEOGRAPH
+ 0xE946: 0x5677, //CJK UNIFIED IDEOGRAPH
+ 0xE947: 0x571C, //CJK UNIFIED IDEOGRAPH
+ 0xE948: 0x571B, //CJK UNIFIED IDEOGRAPH
+ 0xE949: 0x58C8, //CJK UNIFIED IDEOGRAPH
+ 0xE94A: 0x58BD, //CJK UNIFIED IDEOGRAPH
+ 0xE94B: 0x58C9, //CJK UNIFIED IDEOGRAPH
+ 0xE94C: 0x58BF, //CJK UNIFIED IDEOGRAPH
+ 0xE94D: 0x58BA, //CJK UNIFIED IDEOGRAPH
+ 0xE94E: 0x58C2, //CJK UNIFIED IDEOGRAPH
+ 0xE94F: 0x58BC, //CJK UNIFIED IDEOGRAPH
+ 0xE950: 0x58C6, //CJK UNIFIED IDEOGRAPH
+ 0xE951: 0x5B17, //CJK UNIFIED IDEOGRAPH
+ 0xE952: 0x5B19, //CJK UNIFIED IDEOGRAPH
+ 0xE953: 0x5B1B, //CJK UNIFIED IDEOGRAPH
+ 0xE954: 0x5B21, //CJK UNIFIED IDEOGRAPH
+ 0xE955: 0x5B14, //CJK UNIFIED IDEOGRAPH
+ 0xE956: 0x5B13, //CJK UNIFIED IDEOGRAPH
+ 0xE957: 0x5B10, //CJK UNIFIED IDEOGRAPH
+ 0xE958: 0x5B16, //CJK UNIFIED IDEOGRAPH
+ 0xE959: 0x5B28, //CJK UNIFIED IDEOGRAPH
+ 0xE95A: 0x5B1A, //CJK UNIFIED IDEOGRAPH
+ 0xE95B: 0x5B20, //CJK UNIFIED IDEOGRAPH
+ 0xE95C: 0x5B1E, //CJK UNIFIED IDEOGRAPH
+ 0xE95D: 0x5BEF, //CJK UNIFIED IDEOGRAPH
+ 0xE95E: 0x5DAC, //CJK UNIFIED IDEOGRAPH
+ 0xE95F: 0x5DB1, //CJK UNIFIED IDEOGRAPH
+ 0xE960: 0x5DA9, //CJK UNIFIED IDEOGRAPH
+ 0xE961: 0x5DA7, //CJK UNIFIED IDEOGRAPH
+ 0xE962: 0x5DB5, //CJK UNIFIED IDEOGRAPH
+ 0xE963: 0x5DB0, //CJK UNIFIED IDEOGRAPH
+ 0xE964: 0x5DAE, //CJK UNIFIED IDEOGRAPH
+ 0xE965: 0x5DAA, //CJK UNIFIED IDEOGRAPH
+ 0xE966: 0x5DA8, //CJK UNIFIED IDEOGRAPH
+ 0xE967: 0x5DB2, //CJK UNIFIED IDEOGRAPH
+ 0xE968: 0x5DAD, //CJK UNIFIED IDEOGRAPH
+ 0xE969: 0x5DAF, //CJK UNIFIED IDEOGRAPH
+ 0xE96A: 0x5DB4, //CJK UNIFIED IDEOGRAPH
+ 0xE96B: 0x5E67, //CJK UNIFIED IDEOGRAPH
+ 0xE96C: 0x5E68, //CJK UNIFIED IDEOGRAPH
+ 0xE96D: 0x5E66, //CJK UNIFIED IDEOGRAPH
+ 0xE96E: 0x5E6F, //CJK UNIFIED IDEOGRAPH
+ 0xE96F: 0x5EE9, //CJK UNIFIED IDEOGRAPH
+ 0xE970: 0x5EE7, //CJK UNIFIED IDEOGRAPH
+ 0xE971: 0x5EE6, //CJK UNIFIED IDEOGRAPH
+ 0xE972: 0x5EE8, //CJK UNIFIED IDEOGRAPH
+ 0xE973: 0x5EE5, //CJK UNIFIED IDEOGRAPH
+ 0xE974: 0x5F4B, //CJK UNIFIED IDEOGRAPH
+ 0xE975: 0x5FBC, //CJK UNIFIED IDEOGRAPH
+ 0xE976: 0x619D, //CJK UNIFIED IDEOGRAPH
+ 0xE977: 0x61A8, //CJK UNIFIED IDEOGRAPH
+ 0xE978: 0x6196, //CJK UNIFIED IDEOGRAPH
+ 0xE979: 0x61C5, //CJK UNIFIED IDEOGRAPH
+ 0xE97A: 0x61B4, //CJK UNIFIED IDEOGRAPH
+ 0xE97B: 0x61C6, //CJK UNIFIED IDEOGRAPH
+ 0xE97C: 0x61C1, //CJK UNIFIED IDEOGRAPH
+ 0xE97D: 0x61CC, //CJK UNIFIED IDEOGRAPH
+ 0xE97E: 0x61BA, //CJK UNIFIED IDEOGRAPH
+ 0xE9A1: 0x61BF, //CJK UNIFIED IDEOGRAPH
+ 0xE9A2: 0x61B8, //CJK UNIFIED IDEOGRAPH
+ 0xE9A3: 0x618C, //CJK UNIFIED IDEOGRAPH
+ 0xE9A4: 0x64D7, //CJK UNIFIED IDEOGRAPH
+ 0xE9A5: 0x64D6, //CJK UNIFIED IDEOGRAPH
+ 0xE9A6: 0x64D0, //CJK UNIFIED IDEOGRAPH
+ 0xE9A7: 0x64CF, //CJK UNIFIED IDEOGRAPH
+ 0xE9A8: 0x64C9, //CJK UNIFIED IDEOGRAPH
+ 0xE9A9: 0x64BD, //CJK UNIFIED IDEOGRAPH
+ 0xE9AA: 0x6489, //CJK UNIFIED IDEOGRAPH
+ 0xE9AB: 0x64C3, //CJK UNIFIED IDEOGRAPH
+ 0xE9AC: 0x64DB, //CJK UNIFIED IDEOGRAPH
+ 0xE9AD: 0x64F3, //CJK UNIFIED IDEOGRAPH
+ 0xE9AE: 0x64D9, //CJK UNIFIED IDEOGRAPH
+ 0xE9AF: 0x6533, //CJK UNIFIED IDEOGRAPH
+ 0xE9B0: 0x657F, //CJK UNIFIED IDEOGRAPH
+ 0xE9B1: 0x657C, //CJK UNIFIED IDEOGRAPH
+ 0xE9B2: 0x65A2, //CJK UNIFIED IDEOGRAPH
+ 0xE9B3: 0x66C8, //CJK UNIFIED IDEOGRAPH
+ 0xE9B4: 0x66BE, //CJK UNIFIED IDEOGRAPH
+ 0xE9B5: 0x66C0, //CJK UNIFIED IDEOGRAPH
+ 0xE9B6: 0x66CA, //CJK UNIFIED IDEOGRAPH
+ 0xE9B7: 0x66CB, //CJK UNIFIED IDEOGRAPH
+ 0xE9B8: 0x66CF, //CJK UNIFIED IDEOGRAPH
+ 0xE9B9: 0x66BD, //CJK UNIFIED IDEOGRAPH
+ 0xE9BA: 0x66BB, //CJK UNIFIED IDEOGRAPH
+ 0xE9BB: 0x66BA, //CJK UNIFIED IDEOGRAPH
+ 0xE9BC: 0x66CC, //CJK UNIFIED IDEOGRAPH
+ 0xE9BD: 0x6723, //CJK UNIFIED IDEOGRAPH
+ 0xE9BE: 0x6A34, //CJK UNIFIED IDEOGRAPH
+ 0xE9BF: 0x6A66, //CJK UNIFIED IDEOGRAPH
+ 0xE9C0: 0x6A49, //CJK UNIFIED IDEOGRAPH
+ 0xE9C1: 0x6A67, //CJK UNIFIED IDEOGRAPH
+ 0xE9C2: 0x6A32, //CJK UNIFIED IDEOGRAPH
+ 0xE9C3: 0x6A68, //CJK UNIFIED IDEOGRAPH
+ 0xE9C4: 0x6A3E, //CJK UNIFIED IDEOGRAPH
+ 0xE9C5: 0x6A5D, //CJK UNIFIED IDEOGRAPH
+ 0xE9C6: 0x6A6D, //CJK UNIFIED IDEOGRAPH
+ 0xE9C7: 0x6A76, //CJK UNIFIED IDEOGRAPH
+ 0xE9C8: 0x6A5B, //CJK UNIFIED IDEOGRAPH
+ 0xE9C9: 0x6A51, //CJK UNIFIED IDEOGRAPH
+ 0xE9CA: 0x6A28, //CJK UNIFIED IDEOGRAPH
+ 0xE9CB: 0x6A5A, //CJK UNIFIED IDEOGRAPH
+ 0xE9CC: 0x6A3B, //CJK UNIFIED IDEOGRAPH
+ 0xE9CD: 0x6A3F, //CJK UNIFIED IDEOGRAPH
+ 0xE9CE: 0x6A41, //CJK UNIFIED IDEOGRAPH
+ 0xE9CF: 0x6A6A, //CJK UNIFIED IDEOGRAPH
+ 0xE9D0: 0x6A64, //CJK UNIFIED IDEOGRAPH
+ 0xE9D1: 0x6A50, //CJK UNIFIED IDEOGRAPH
+ 0xE9D2: 0x6A4F, //CJK UNIFIED IDEOGRAPH
+ 0xE9D3: 0x6A54, //CJK UNIFIED IDEOGRAPH
+ 0xE9D4: 0x6A6F, //CJK UNIFIED IDEOGRAPH
+ 0xE9D5: 0x6A69, //CJK UNIFIED IDEOGRAPH
+ 0xE9D6: 0x6A60, //CJK UNIFIED IDEOGRAPH
+ 0xE9D7: 0x6A3C, //CJK UNIFIED IDEOGRAPH
+ 0xE9D8: 0x6A5E, //CJK UNIFIED IDEOGRAPH
+ 0xE9D9: 0x6A56, //CJK UNIFIED IDEOGRAPH
+ 0xE9DA: 0x6A55, //CJK UNIFIED IDEOGRAPH
+ 0xE9DB: 0x6A4D, //CJK UNIFIED IDEOGRAPH
+ 0xE9DC: 0x6A4E, //CJK UNIFIED IDEOGRAPH
+ 0xE9DD: 0x6A46, //CJK UNIFIED IDEOGRAPH
+ 0xE9DE: 0x6B55, //CJK UNIFIED IDEOGRAPH
+ 0xE9DF: 0x6B54, //CJK UNIFIED IDEOGRAPH
+ 0xE9E0: 0x6B56, //CJK UNIFIED IDEOGRAPH
+ 0xE9E1: 0x6BA7, //CJK UNIFIED IDEOGRAPH
+ 0xE9E2: 0x6BAA, //CJK UNIFIED IDEOGRAPH
+ 0xE9E3: 0x6BAB, //CJK UNIFIED IDEOGRAPH
+ 0xE9E4: 0x6BC8, //CJK UNIFIED IDEOGRAPH
+ 0xE9E5: 0x6BC7, //CJK UNIFIED IDEOGRAPH
+ 0xE9E6: 0x6C04, //CJK UNIFIED IDEOGRAPH
+ 0xE9E7: 0x6C03, //CJK UNIFIED IDEOGRAPH
+ 0xE9E8: 0x6C06, //CJK UNIFIED IDEOGRAPH
+ 0xE9E9: 0x6FAD, //CJK UNIFIED IDEOGRAPH
+ 0xE9EA: 0x6FCB, //CJK UNIFIED IDEOGRAPH
+ 0xE9EB: 0x6FA3, //CJK UNIFIED IDEOGRAPH
+ 0xE9EC: 0x6FC7, //CJK UNIFIED IDEOGRAPH
+ 0xE9ED: 0x6FBC, //CJK UNIFIED IDEOGRAPH
+ 0xE9EE: 0x6FCE, //CJK UNIFIED IDEOGRAPH
+ 0xE9EF: 0x6FC8, //CJK UNIFIED IDEOGRAPH
+ 0xE9F0: 0x6F5E, //CJK UNIFIED IDEOGRAPH
+ 0xE9F1: 0x6FC4, //CJK UNIFIED IDEOGRAPH
+ 0xE9F2: 0x6FBD, //CJK UNIFIED IDEOGRAPH
+ 0xE9F3: 0x6F9E, //CJK UNIFIED IDEOGRAPH
+ 0xE9F4: 0x6FCA, //CJK UNIFIED IDEOGRAPH
+ 0xE9F5: 0x6FA8, //CJK UNIFIED IDEOGRAPH
+ 0xE9F6: 0x7004, //CJK UNIFIED IDEOGRAPH
+ 0xE9F7: 0x6FA5, //CJK UNIFIED IDEOGRAPH
+ 0xE9F8: 0x6FAE, //CJK UNIFIED IDEOGRAPH
+ 0xE9F9: 0x6FBA, //CJK UNIFIED IDEOGRAPH
+ 0xE9FA: 0x6FAC, //CJK UNIFIED IDEOGRAPH
+ 0xE9FB: 0x6FAA, //CJK UNIFIED IDEOGRAPH
+ 0xE9FC: 0x6FCF, //CJK UNIFIED IDEOGRAPH
+ 0xE9FD: 0x6FBF, //CJK UNIFIED IDEOGRAPH
+ 0xE9FE: 0x6FB8, //CJK UNIFIED IDEOGRAPH
+ 0xEA40: 0x6FA2, //CJK UNIFIED IDEOGRAPH
+ 0xEA41: 0x6FC9, //CJK UNIFIED IDEOGRAPH
+ 0xEA42: 0x6FAB, //CJK UNIFIED IDEOGRAPH
+ 0xEA43: 0x6FCD, //CJK UNIFIED IDEOGRAPH
+ 0xEA44: 0x6FAF, //CJK UNIFIED IDEOGRAPH
+ 0xEA45: 0x6FB2, //CJK UNIFIED IDEOGRAPH
+ 0xEA46: 0x6FB0, //CJK UNIFIED IDEOGRAPH
+ 0xEA47: 0x71C5, //CJK UNIFIED IDEOGRAPH
+ 0xEA48: 0x71C2, //CJK UNIFIED IDEOGRAPH
+ 0xEA49: 0x71BF, //CJK UNIFIED IDEOGRAPH
+ 0xEA4A: 0x71B8, //CJK UNIFIED IDEOGRAPH
+ 0xEA4B: 0x71D6, //CJK UNIFIED IDEOGRAPH
+ 0xEA4C: 0x71C0, //CJK UNIFIED IDEOGRAPH
+ 0xEA4D: 0x71C1, //CJK UNIFIED IDEOGRAPH
+ 0xEA4E: 0x71CB, //CJK UNIFIED IDEOGRAPH
+ 0xEA4F: 0x71D4, //CJK UNIFIED IDEOGRAPH
+ 0xEA50: 0x71CA, //CJK UNIFIED IDEOGRAPH
+ 0xEA51: 0x71C7, //CJK UNIFIED IDEOGRAPH
+ 0xEA52: 0x71CF, //CJK UNIFIED IDEOGRAPH
+ 0xEA53: 0x71BD, //CJK UNIFIED IDEOGRAPH
+ 0xEA54: 0x71D8, //CJK UNIFIED IDEOGRAPH
+ 0xEA55: 0x71BC, //CJK UNIFIED IDEOGRAPH
+ 0xEA56: 0x71C6, //CJK UNIFIED IDEOGRAPH
+ 0xEA57: 0x71DA, //CJK UNIFIED IDEOGRAPH
+ 0xEA58: 0x71DB, //CJK UNIFIED IDEOGRAPH
+ 0xEA59: 0x729D, //CJK UNIFIED IDEOGRAPH
+ 0xEA5A: 0x729E, //CJK UNIFIED IDEOGRAPH
+ 0xEA5B: 0x7369, //CJK UNIFIED IDEOGRAPH
+ 0xEA5C: 0x7366, //CJK UNIFIED IDEOGRAPH
+ 0xEA5D: 0x7367, //CJK UNIFIED IDEOGRAPH
+ 0xEA5E: 0x736C, //CJK UNIFIED IDEOGRAPH
+ 0xEA5F: 0x7365, //CJK UNIFIED IDEOGRAPH
+ 0xEA60: 0x736B, //CJK UNIFIED IDEOGRAPH
+ 0xEA61: 0x736A, //CJK UNIFIED IDEOGRAPH
+ 0xEA62: 0x747F, //CJK UNIFIED IDEOGRAPH
+ 0xEA63: 0x749A, //CJK UNIFIED IDEOGRAPH
+ 0xEA64: 0x74A0, //CJK UNIFIED IDEOGRAPH
+ 0xEA65: 0x7494, //CJK UNIFIED IDEOGRAPH
+ 0xEA66: 0x7492, //CJK UNIFIED IDEOGRAPH
+ 0xEA67: 0x7495, //CJK UNIFIED IDEOGRAPH
+ 0xEA68: 0x74A1, //CJK UNIFIED IDEOGRAPH
+ 0xEA69: 0x750B, //CJK UNIFIED IDEOGRAPH
+ 0xEA6A: 0x7580, //CJK UNIFIED IDEOGRAPH
+ 0xEA6B: 0x762F, //CJK UNIFIED IDEOGRAPH
+ 0xEA6C: 0x762D, //CJK UNIFIED IDEOGRAPH
+ 0xEA6D: 0x7631, //CJK UNIFIED IDEOGRAPH
+ 0xEA6E: 0x763D, //CJK UNIFIED IDEOGRAPH
+ 0xEA6F: 0x7633, //CJK UNIFIED IDEOGRAPH
+ 0xEA70: 0x763C, //CJK UNIFIED IDEOGRAPH
+ 0xEA71: 0x7635, //CJK UNIFIED IDEOGRAPH
+ 0xEA72: 0x7632, //CJK UNIFIED IDEOGRAPH
+ 0xEA73: 0x7630, //CJK UNIFIED IDEOGRAPH
+ 0xEA74: 0x76BB, //CJK UNIFIED IDEOGRAPH
+ 0xEA75: 0x76E6, //CJK UNIFIED IDEOGRAPH
+ 0xEA76: 0x779A, //CJK UNIFIED IDEOGRAPH
+ 0xEA77: 0x779D, //CJK UNIFIED IDEOGRAPH
+ 0xEA78: 0x77A1, //CJK UNIFIED IDEOGRAPH
+ 0xEA79: 0x779C, //CJK UNIFIED IDEOGRAPH
+ 0xEA7A: 0x779B, //CJK UNIFIED IDEOGRAPH
+ 0xEA7B: 0x77A2, //CJK UNIFIED IDEOGRAPH
+ 0xEA7C: 0x77A3, //CJK UNIFIED IDEOGRAPH
+ 0xEA7D: 0x7795, //CJK UNIFIED IDEOGRAPH
+ 0xEA7E: 0x7799, //CJK UNIFIED IDEOGRAPH
+ 0xEAA1: 0x7797, //CJK UNIFIED IDEOGRAPH
+ 0xEAA2: 0x78DD, //CJK UNIFIED IDEOGRAPH
+ 0xEAA3: 0x78E9, //CJK UNIFIED IDEOGRAPH
+ 0xEAA4: 0x78E5, //CJK UNIFIED IDEOGRAPH
+ 0xEAA5: 0x78EA, //CJK UNIFIED IDEOGRAPH
+ 0xEAA6: 0x78DE, //CJK UNIFIED IDEOGRAPH
+ 0xEAA7: 0x78E3, //CJK UNIFIED IDEOGRAPH
+ 0xEAA8: 0x78DB, //CJK UNIFIED IDEOGRAPH
+ 0xEAA9: 0x78E1, //CJK UNIFIED IDEOGRAPH
+ 0xEAAA: 0x78E2, //CJK UNIFIED IDEOGRAPH
+ 0xEAAB: 0x78ED, //CJK UNIFIED IDEOGRAPH
+ 0xEAAC: 0x78DF, //CJK UNIFIED IDEOGRAPH
+ 0xEAAD: 0x78E0, //CJK UNIFIED IDEOGRAPH
+ 0xEAAE: 0x79A4, //CJK UNIFIED IDEOGRAPH
+ 0xEAAF: 0x7A44, //CJK UNIFIED IDEOGRAPH
+ 0xEAB0: 0x7A48, //CJK UNIFIED IDEOGRAPH
+ 0xEAB1: 0x7A47, //CJK UNIFIED IDEOGRAPH
+ 0xEAB2: 0x7AB6, //CJK UNIFIED IDEOGRAPH
+ 0xEAB3: 0x7AB8, //CJK UNIFIED IDEOGRAPH
+ 0xEAB4: 0x7AB5, //CJK UNIFIED IDEOGRAPH
+ 0xEAB5: 0x7AB1, //CJK UNIFIED IDEOGRAPH
+ 0xEAB6: 0x7AB7, //CJK UNIFIED IDEOGRAPH
+ 0xEAB7: 0x7BDE, //CJK UNIFIED IDEOGRAPH
+ 0xEAB8: 0x7BE3, //CJK UNIFIED IDEOGRAPH
+ 0xEAB9: 0x7BE7, //CJK UNIFIED IDEOGRAPH
+ 0xEABA: 0x7BDD, //CJK UNIFIED IDEOGRAPH
+ 0xEABB: 0x7BD5, //CJK UNIFIED IDEOGRAPH
+ 0xEABC: 0x7BE5, //CJK UNIFIED IDEOGRAPH
+ 0xEABD: 0x7BDA, //CJK UNIFIED IDEOGRAPH
+ 0xEABE: 0x7BE8, //CJK UNIFIED IDEOGRAPH
+ 0xEABF: 0x7BF9, //CJK UNIFIED IDEOGRAPH
+ 0xEAC0: 0x7BD4, //CJK UNIFIED IDEOGRAPH
+ 0xEAC1: 0x7BEA, //CJK UNIFIED IDEOGRAPH
+ 0xEAC2: 0x7BE2, //CJK UNIFIED IDEOGRAPH
+ 0xEAC3: 0x7BDC, //CJK UNIFIED IDEOGRAPH
+ 0xEAC4: 0x7BEB, //CJK UNIFIED IDEOGRAPH
+ 0xEAC5: 0x7BD8, //CJK UNIFIED IDEOGRAPH
+ 0xEAC6: 0x7BDF, //CJK UNIFIED IDEOGRAPH
+ 0xEAC7: 0x7CD2, //CJK UNIFIED IDEOGRAPH
+ 0xEAC8: 0x7CD4, //CJK UNIFIED IDEOGRAPH
+ 0xEAC9: 0x7CD7, //CJK UNIFIED IDEOGRAPH
+ 0xEACA: 0x7CD0, //CJK UNIFIED IDEOGRAPH
+ 0xEACB: 0x7CD1, //CJK UNIFIED IDEOGRAPH
+ 0xEACC: 0x7E12, //CJK UNIFIED IDEOGRAPH
+ 0xEACD: 0x7E21, //CJK UNIFIED IDEOGRAPH
+ 0xEACE: 0x7E17, //CJK UNIFIED IDEOGRAPH
+ 0xEACF: 0x7E0C, //CJK UNIFIED IDEOGRAPH
+ 0xEAD0: 0x7E1F, //CJK UNIFIED IDEOGRAPH
+ 0xEAD1: 0x7E20, //CJK UNIFIED IDEOGRAPH
+ 0xEAD2: 0x7E13, //CJK UNIFIED IDEOGRAPH
+ 0xEAD3: 0x7E0E, //CJK UNIFIED IDEOGRAPH
+ 0xEAD4: 0x7E1C, //CJK UNIFIED IDEOGRAPH
+ 0xEAD5: 0x7E15, //CJK UNIFIED IDEOGRAPH
+ 0xEAD6: 0x7E1A, //CJK UNIFIED IDEOGRAPH
+ 0xEAD7: 0x7E22, //CJK UNIFIED IDEOGRAPH
+ 0xEAD8: 0x7E0B, //CJK UNIFIED IDEOGRAPH
+ 0xEAD9: 0x7E0F, //CJK UNIFIED IDEOGRAPH
+ 0xEADA: 0x7E16, //CJK UNIFIED IDEOGRAPH
+ 0xEADB: 0x7E0D, //CJK UNIFIED IDEOGRAPH
+ 0xEADC: 0x7E14, //CJK UNIFIED IDEOGRAPH
+ 0xEADD: 0x7E25, //CJK UNIFIED IDEOGRAPH
+ 0xEADE: 0x7E24, //CJK UNIFIED IDEOGRAPH
+ 0xEADF: 0x7F43, //CJK UNIFIED IDEOGRAPH
+ 0xEAE0: 0x7F7B, //CJK UNIFIED IDEOGRAPH
+ 0xEAE1: 0x7F7C, //CJK UNIFIED IDEOGRAPH
+ 0xEAE2: 0x7F7A, //CJK UNIFIED IDEOGRAPH
+ 0xEAE3: 0x7FB1, //CJK UNIFIED IDEOGRAPH
+ 0xEAE4: 0x7FEF, //CJK UNIFIED IDEOGRAPH
+ 0xEAE5: 0x802A, //CJK UNIFIED IDEOGRAPH
+ 0xEAE6: 0x8029, //CJK UNIFIED IDEOGRAPH
+ 0xEAE7: 0x806C, //CJK UNIFIED IDEOGRAPH
+ 0xEAE8: 0x81B1, //CJK UNIFIED IDEOGRAPH
+ 0xEAE9: 0x81A6, //CJK UNIFIED IDEOGRAPH
+ 0xEAEA: 0x81AE, //CJK UNIFIED IDEOGRAPH
+ 0xEAEB: 0x81B9, //CJK UNIFIED IDEOGRAPH
+ 0xEAEC: 0x81B5, //CJK UNIFIED IDEOGRAPH
+ 0xEAED: 0x81AB, //CJK UNIFIED IDEOGRAPH
+ 0xEAEE: 0x81B0, //CJK UNIFIED IDEOGRAPH
+ 0xEAEF: 0x81AC, //CJK UNIFIED IDEOGRAPH
+ 0xEAF0: 0x81B4, //CJK UNIFIED IDEOGRAPH
+ 0xEAF1: 0x81B2, //CJK UNIFIED IDEOGRAPH
+ 0xEAF2: 0x81B7, //CJK UNIFIED IDEOGRAPH
+ 0xEAF3: 0x81A7, //CJK UNIFIED IDEOGRAPH
+ 0xEAF4: 0x81F2, //CJK UNIFIED IDEOGRAPH
+ 0xEAF5: 0x8255, //CJK UNIFIED IDEOGRAPH
+ 0xEAF6: 0x8256, //CJK UNIFIED IDEOGRAPH
+ 0xEAF7: 0x8257, //CJK UNIFIED IDEOGRAPH
+ 0xEAF8: 0x8556, //CJK UNIFIED IDEOGRAPH
+ 0xEAF9: 0x8545, //CJK UNIFIED IDEOGRAPH
+ 0xEAFA: 0x856B, //CJK UNIFIED IDEOGRAPH
+ 0xEAFB: 0x854D, //CJK UNIFIED IDEOGRAPH
+ 0xEAFC: 0x8553, //CJK UNIFIED IDEOGRAPH
+ 0xEAFD: 0x8561, //CJK UNIFIED IDEOGRAPH
+ 0xEAFE: 0x8558, //CJK UNIFIED IDEOGRAPH
+ 0xEB40: 0x8540, //CJK UNIFIED IDEOGRAPH
+ 0xEB41: 0x8546, //CJK UNIFIED IDEOGRAPH
+ 0xEB42: 0x8564, //CJK UNIFIED IDEOGRAPH
+ 0xEB43: 0x8541, //CJK UNIFIED IDEOGRAPH
+ 0xEB44: 0x8562, //CJK UNIFIED IDEOGRAPH
+ 0xEB45: 0x8544, //CJK UNIFIED IDEOGRAPH
+ 0xEB46: 0x8551, //CJK UNIFIED IDEOGRAPH
+ 0xEB47: 0x8547, //CJK UNIFIED IDEOGRAPH
+ 0xEB48: 0x8563, //CJK UNIFIED IDEOGRAPH
+ 0xEB49: 0x853E, //CJK UNIFIED IDEOGRAPH
+ 0xEB4A: 0x855B, //CJK UNIFIED IDEOGRAPH
+ 0xEB4B: 0x8571, //CJK UNIFIED IDEOGRAPH
+ 0xEB4C: 0x854E, //CJK UNIFIED IDEOGRAPH
+ 0xEB4D: 0x856E, //CJK UNIFIED IDEOGRAPH
+ 0xEB4E: 0x8575, //CJK UNIFIED IDEOGRAPH
+ 0xEB4F: 0x8555, //CJK UNIFIED IDEOGRAPH
+ 0xEB50: 0x8567, //CJK UNIFIED IDEOGRAPH
+ 0xEB51: 0x8560, //CJK UNIFIED IDEOGRAPH
+ 0xEB52: 0x858C, //CJK UNIFIED IDEOGRAPH
+ 0xEB53: 0x8566, //CJK UNIFIED IDEOGRAPH
+ 0xEB54: 0x855D, //CJK UNIFIED IDEOGRAPH
+ 0xEB55: 0x8554, //CJK UNIFIED IDEOGRAPH
+ 0xEB56: 0x8565, //CJK UNIFIED IDEOGRAPH
+ 0xEB57: 0x856C, //CJK UNIFIED IDEOGRAPH
+ 0xEB58: 0x8663, //CJK UNIFIED IDEOGRAPH
+ 0xEB59: 0x8665, //CJK UNIFIED IDEOGRAPH
+ 0xEB5A: 0x8664, //CJK UNIFIED IDEOGRAPH
+ 0xEB5B: 0x879B, //CJK UNIFIED IDEOGRAPH
+ 0xEB5C: 0x878F, //CJK UNIFIED IDEOGRAPH
+ 0xEB5D: 0x8797, //CJK UNIFIED IDEOGRAPH
+ 0xEB5E: 0x8793, //CJK UNIFIED IDEOGRAPH
+ 0xEB5F: 0x8792, //CJK UNIFIED IDEOGRAPH
+ 0xEB60: 0x8788, //CJK UNIFIED IDEOGRAPH
+ 0xEB61: 0x8781, //CJK UNIFIED IDEOGRAPH
+ 0xEB62: 0x8796, //CJK UNIFIED IDEOGRAPH
+ 0xEB63: 0x8798, //CJK UNIFIED IDEOGRAPH
+ 0xEB64: 0x8779, //CJK UNIFIED IDEOGRAPH
+ 0xEB65: 0x8787, //CJK UNIFIED IDEOGRAPH
+ 0xEB66: 0x87A3, //CJK UNIFIED IDEOGRAPH
+ 0xEB67: 0x8785, //CJK UNIFIED IDEOGRAPH
+ 0xEB68: 0x8790, //CJK UNIFIED IDEOGRAPH
+ 0xEB69: 0x8791, //CJK UNIFIED IDEOGRAPH
+ 0xEB6A: 0x879D, //CJK UNIFIED IDEOGRAPH
+ 0xEB6B: 0x8784, //CJK UNIFIED IDEOGRAPH
+ 0xEB6C: 0x8794, //CJK UNIFIED IDEOGRAPH
+ 0xEB6D: 0x879C, //CJK UNIFIED IDEOGRAPH
+ 0xEB6E: 0x879A, //CJK UNIFIED IDEOGRAPH
+ 0xEB6F: 0x8789, //CJK UNIFIED IDEOGRAPH
+ 0xEB70: 0x891E, //CJK UNIFIED IDEOGRAPH
+ 0xEB71: 0x8926, //CJK UNIFIED IDEOGRAPH
+ 0xEB72: 0x8930, //CJK UNIFIED IDEOGRAPH
+ 0xEB73: 0x892D, //CJK UNIFIED IDEOGRAPH
+ 0xEB74: 0x892E, //CJK UNIFIED IDEOGRAPH
+ 0xEB75: 0x8927, //CJK UNIFIED IDEOGRAPH
+ 0xEB76: 0x8931, //CJK UNIFIED IDEOGRAPH
+ 0xEB77: 0x8922, //CJK UNIFIED IDEOGRAPH
+ 0xEB78: 0x8929, //CJK UNIFIED IDEOGRAPH
+ 0xEB79: 0x8923, //CJK UNIFIED IDEOGRAPH
+ 0xEB7A: 0x892F, //CJK UNIFIED IDEOGRAPH
+ 0xEB7B: 0x892C, //CJK UNIFIED IDEOGRAPH
+ 0xEB7C: 0x891F, //CJK UNIFIED IDEOGRAPH
+ 0xEB7D: 0x89F1, //CJK UNIFIED IDEOGRAPH
+ 0xEB7E: 0x8AE0, //CJK UNIFIED IDEOGRAPH
+ 0xEBA1: 0x8AE2, //CJK UNIFIED IDEOGRAPH
+ 0xEBA2: 0x8AF2, //CJK UNIFIED IDEOGRAPH
+ 0xEBA3: 0x8AF4, //CJK UNIFIED IDEOGRAPH
+ 0xEBA4: 0x8AF5, //CJK UNIFIED IDEOGRAPH
+ 0xEBA5: 0x8ADD, //CJK UNIFIED IDEOGRAPH
+ 0xEBA6: 0x8B14, //CJK UNIFIED IDEOGRAPH
+ 0xEBA7: 0x8AE4, //CJK UNIFIED IDEOGRAPH
+ 0xEBA8: 0x8ADF, //CJK UNIFIED IDEOGRAPH
+ 0xEBA9: 0x8AF0, //CJK UNIFIED IDEOGRAPH
+ 0xEBAA: 0x8AC8, //CJK UNIFIED IDEOGRAPH
+ 0xEBAB: 0x8ADE, //CJK UNIFIED IDEOGRAPH
+ 0xEBAC: 0x8AE1, //CJK UNIFIED IDEOGRAPH
+ 0xEBAD: 0x8AE8, //CJK UNIFIED IDEOGRAPH
+ 0xEBAE: 0x8AFF, //CJK UNIFIED IDEOGRAPH
+ 0xEBAF: 0x8AEF, //CJK UNIFIED IDEOGRAPH
+ 0xEBB0: 0x8AFB, //CJK UNIFIED IDEOGRAPH
+ 0xEBB1: 0x8C91, //CJK UNIFIED IDEOGRAPH
+ 0xEBB2: 0x8C92, //CJK UNIFIED IDEOGRAPH
+ 0xEBB3: 0x8C90, //CJK UNIFIED IDEOGRAPH
+ 0xEBB4: 0x8CF5, //CJK UNIFIED IDEOGRAPH
+ 0xEBB5: 0x8CEE, //CJK UNIFIED IDEOGRAPH
+ 0xEBB6: 0x8CF1, //CJK UNIFIED IDEOGRAPH
+ 0xEBB7: 0x8CF0, //CJK UNIFIED IDEOGRAPH
+ 0xEBB8: 0x8CF3, //CJK UNIFIED IDEOGRAPH
+ 0xEBB9: 0x8D6C, //CJK UNIFIED IDEOGRAPH
+ 0xEBBA: 0x8D6E, //CJK UNIFIED IDEOGRAPH
+ 0xEBBB: 0x8DA5, //CJK UNIFIED IDEOGRAPH
+ 0xEBBC: 0x8DA7, //CJK UNIFIED IDEOGRAPH
+ 0xEBBD: 0x8E33, //CJK UNIFIED IDEOGRAPH
+ 0xEBBE: 0x8E3E, //CJK UNIFIED IDEOGRAPH
+ 0xEBBF: 0x8E38, //CJK UNIFIED IDEOGRAPH
+ 0xEBC0: 0x8E40, //CJK UNIFIED IDEOGRAPH
+ 0xEBC1: 0x8E45, //CJK UNIFIED IDEOGRAPH
+ 0xEBC2: 0x8E36, //CJK UNIFIED IDEOGRAPH
+ 0xEBC3: 0x8E3C, //CJK UNIFIED IDEOGRAPH
+ 0xEBC4: 0x8E3D, //CJK UNIFIED IDEOGRAPH
+ 0xEBC5: 0x8E41, //CJK UNIFIED IDEOGRAPH
+ 0xEBC6: 0x8E30, //CJK UNIFIED IDEOGRAPH
+ 0xEBC7: 0x8E3F, //CJK UNIFIED IDEOGRAPH
+ 0xEBC8: 0x8EBD, //CJK UNIFIED IDEOGRAPH
+ 0xEBC9: 0x8F36, //CJK UNIFIED IDEOGRAPH
+ 0xEBCA: 0x8F2E, //CJK UNIFIED IDEOGRAPH
+ 0xEBCB: 0x8F35, //CJK UNIFIED IDEOGRAPH
+ 0xEBCC: 0x8F32, //CJK UNIFIED IDEOGRAPH
+ 0xEBCD: 0x8F39, //CJK UNIFIED IDEOGRAPH
+ 0xEBCE: 0x8F37, //CJK UNIFIED IDEOGRAPH
+ 0xEBCF: 0x8F34, //CJK UNIFIED IDEOGRAPH
+ 0xEBD0: 0x9076, //CJK UNIFIED IDEOGRAPH
+ 0xEBD1: 0x9079, //CJK UNIFIED IDEOGRAPH
+ 0xEBD2: 0x907B, //CJK UNIFIED IDEOGRAPH
+ 0xEBD3: 0x9086, //CJK UNIFIED IDEOGRAPH
+ 0xEBD4: 0x90FA, //CJK UNIFIED IDEOGRAPH
+ 0xEBD5: 0x9133, //CJK UNIFIED IDEOGRAPH
+ 0xEBD6: 0x9135, //CJK UNIFIED IDEOGRAPH
+ 0xEBD7: 0x9136, //CJK UNIFIED IDEOGRAPH
+ 0xEBD8: 0x9193, //CJK UNIFIED IDEOGRAPH
+ 0xEBD9: 0x9190, //CJK UNIFIED IDEOGRAPH
+ 0xEBDA: 0x9191, //CJK UNIFIED IDEOGRAPH
+ 0xEBDB: 0x918D, //CJK UNIFIED IDEOGRAPH
+ 0xEBDC: 0x918F, //CJK UNIFIED IDEOGRAPH
+ 0xEBDD: 0x9327, //CJK UNIFIED IDEOGRAPH
+ 0xEBDE: 0x931E, //CJK UNIFIED IDEOGRAPH
+ 0xEBDF: 0x9308, //CJK UNIFIED IDEOGRAPH
+ 0xEBE0: 0x931F, //CJK UNIFIED IDEOGRAPH
+ 0xEBE1: 0x9306, //CJK UNIFIED IDEOGRAPH
+ 0xEBE2: 0x930F, //CJK UNIFIED IDEOGRAPH
+ 0xEBE3: 0x937A, //CJK UNIFIED IDEOGRAPH
+ 0xEBE4: 0x9338, //CJK UNIFIED IDEOGRAPH
+ 0xEBE5: 0x933C, //CJK UNIFIED IDEOGRAPH
+ 0xEBE6: 0x931B, //CJK UNIFIED IDEOGRAPH
+ 0xEBE7: 0x9323, //CJK UNIFIED IDEOGRAPH
+ 0xEBE8: 0x9312, //CJK UNIFIED IDEOGRAPH
+ 0xEBE9: 0x9301, //CJK UNIFIED IDEOGRAPH
+ 0xEBEA: 0x9346, //CJK UNIFIED IDEOGRAPH
+ 0xEBEB: 0x932D, //CJK UNIFIED IDEOGRAPH
+ 0xEBEC: 0x930E, //CJK UNIFIED IDEOGRAPH
+ 0xEBED: 0x930D, //CJK UNIFIED IDEOGRAPH
+ 0xEBEE: 0x92CB, //CJK UNIFIED IDEOGRAPH
+ 0xEBEF: 0x931D, //CJK UNIFIED IDEOGRAPH
+ 0xEBF0: 0x92FA, //CJK UNIFIED IDEOGRAPH
+ 0xEBF1: 0x9325, //CJK UNIFIED IDEOGRAPH
+ 0xEBF2: 0x9313, //CJK UNIFIED IDEOGRAPH
+ 0xEBF3: 0x92F9, //CJK UNIFIED IDEOGRAPH
+ 0xEBF4: 0x92F7, //CJK UNIFIED IDEOGRAPH
+ 0xEBF5: 0x9334, //CJK UNIFIED IDEOGRAPH
+ 0xEBF6: 0x9302, //CJK UNIFIED IDEOGRAPH
+ 0xEBF7: 0x9324, //CJK UNIFIED IDEOGRAPH
+ 0xEBF8: 0x92FF, //CJK UNIFIED IDEOGRAPH
+ 0xEBF9: 0x9329, //CJK UNIFIED IDEOGRAPH
+ 0xEBFA: 0x9339, //CJK UNIFIED IDEOGRAPH
+ 0xEBFB: 0x9335, //CJK UNIFIED IDEOGRAPH
+ 0xEBFC: 0x932A, //CJK UNIFIED IDEOGRAPH
+ 0xEBFD: 0x9314, //CJK UNIFIED IDEOGRAPH
+ 0xEBFE: 0x930C, //CJK UNIFIED IDEOGRAPH
+ 0xEC40: 0x930B, //CJK UNIFIED IDEOGRAPH
+ 0xEC41: 0x92FE, //CJK UNIFIED IDEOGRAPH
+ 0xEC42: 0x9309, //CJK UNIFIED IDEOGRAPH
+ 0xEC43: 0x9300, //CJK UNIFIED IDEOGRAPH
+ 0xEC44: 0x92FB, //CJK UNIFIED IDEOGRAPH
+ 0xEC45: 0x9316, //CJK UNIFIED IDEOGRAPH
+ 0xEC46: 0x95BC, //CJK UNIFIED IDEOGRAPH
+ 0xEC47: 0x95CD, //CJK UNIFIED IDEOGRAPH
+ 0xEC48: 0x95BE, //CJK UNIFIED IDEOGRAPH
+ 0xEC49: 0x95B9, //CJK UNIFIED IDEOGRAPH
+ 0xEC4A: 0x95BA, //CJK UNIFIED IDEOGRAPH
+ 0xEC4B: 0x95B6, //CJK UNIFIED IDEOGRAPH
+ 0xEC4C: 0x95BF, //CJK UNIFIED IDEOGRAPH
+ 0xEC4D: 0x95B5, //CJK UNIFIED IDEOGRAPH
+ 0xEC4E: 0x95BD, //CJK UNIFIED IDEOGRAPH
+ 0xEC4F: 0x96A9, //CJK UNIFIED IDEOGRAPH
+ 0xEC50: 0x96D4, //CJK UNIFIED IDEOGRAPH
+ 0xEC51: 0x970B, //CJK UNIFIED IDEOGRAPH
+ 0xEC52: 0x9712, //CJK UNIFIED IDEOGRAPH
+ 0xEC53: 0x9710, //CJK UNIFIED IDEOGRAPH
+ 0xEC54: 0x9799, //CJK UNIFIED IDEOGRAPH
+ 0xEC55: 0x9797, //CJK UNIFIED IDEOGRAPH
+ 0xEC56: 0x9794, //CJK UNIFIED IDEOGRAPH
+ 0xEC57: 0x97F0, //CJK UNIFIED IDEOGRAPH
+ 0xEC58: 0x97F8, //CJK UNIFIED IDEOGRAPH
+ 0xEC59: 0x9835, //CJK UNIFIED IDEOGRAPH
+ 0xEC5A: 0x982F, //CJK UNIFIED IDEOGRAPH
+ 0xEC5B: 0x9832, //CJK UNIFIED IDEOGRAPH
+ 0xEC5C: 0x9924, //CJK UNIFIED IDEOGRAPH
+ 0xEC5D: 0x991F, //CJK UNIFIED IDEOGRAPH
+ 0xEC5E: 0x9927, //CJK UNIFIED IDEOGRAPH
+ 0xEC5F: 0x9929, //CJK UNIFIED IDEOGRAPH
+ 0xEC60: 0x999E, //CJK UNIFIED IDEOGRAPH
+ 0xEC61: 0x99EE, //CJK UNIFIED IDEOGRAPH
+ 0xEC62: 0x99EC, //CJK UNIFIED IDEOGRAPH
+ 0xEC63: 0x99E5, //CJK UNIFIED IDEOGRAPH
+ 0xEC64: 0x99E4, //CJK UNIFIED IDEOGRAPH
+ 0xEC65: 0x99F0, //CJK UNIFIED IDEOGRAPH
+ 0xEC66: 0x99E3, //CJK UNIFIED IDEOGRAPH
+ 0xEC67: 0x99EA, //CJK UNIFIED IDEOGRAPH
+ 0xEC68: 0x99E9, //CJK UNIFIED IDEOGRAPH
+ 0xEC69: 0x99E7, //CJK UNIFIED IDEOGRAPH
+ 0xEC6A: 0x9AB9, //CJK UNIFIED IDEOGRAPH
+ 0xEC6B: 0x9ABF, //CJK UNIFIED IDEOGRAPH
+ 0xEC6C: 0x9AB4, //CJK UNIFIED IDEOGRAPH
+ 0xEC6D: 0x9ABB, //CJK UNIFIED IDEOGRAPH
+ 0xEC6E: 0x9AF6, //CJK UNIFIED IDEOGRAPH
+ 0xEC6F: 0x9AFA, //CJK UNIFIED IDEOGRAPH
+ 0xEC70: 0x9AF9, //CJK UNIFIED IDEOGRAPH
+ 0xEC71: 0x9AF7, //CJK UNIFIED IDEOGRAPH
+ 0xEC72: 0x9B33, //CJK UNIFIED IDEOGRAPH
+ 0xEC73: 0x9B80, //CJK UNIFIED IDEOGRAPH
+ 0xEC74: 0x9B85, //CJK UNIFIED IDEOGRAPH
+ 0xEC75: 0x9B87, //CJK UNIFIED IDEOGRAPH
+ 0xEC76: 0x9B7C, //CJK UNIFIED IDEOGRAPH
+ 0xEC77: 0x9B7E, //CJK UNIFIED IDEOGRAPH
+ 0xEC78: 0x9B7B, //CJK UNIFIED IDEOGRAPH
+ 0xEC79: 0x9B82, //CJK UNIFIED IDEOGRAPH
+ 0xEC7A: 0x9B93, //CJK UNIFIED IDEOGRAPH
+ 0xEC7B: 0x9B92, //CJK UNIFIED IDEOGRAPH
+ 0xEC7C: 0x9B90, //CJK UNIFIED IDEOGRAPH
+ 0xEC7D: 0x9B7A, //CJK UNIFIED IDEOGRAPH
+ 0xEC7E: 0x9B95, //CJK UNIFIED IDEOGRAPH
+ 0xECA1: 0x9B7D, //CJK UNIFIED IDEOGRAPH
+ 0xECA2: 0x9B88, //CJK UNIFIED IDEOGRAPH
+ 0xECA3: 0x9D25, //CJK UNIFIED IDEOGRAPH
+ 0xECA4: 0x9D17, //CJK UNIFIED IDEOGRAPH
+ 0xECA5: 0x9D20, //CJK UNIFIED IDEOGRAPH
+ 0xECA6: 0x9D1E, //CJK UNIFIED IDEOGRAPH
+ 0xECA7: 0x9D14, //CJK UNIFIED IDEOGRAPH
+ 0xECA8: 0x9D29, //CJK UNIFIED IDEOGRAPH
+ 0xECA9: 0x9D1D, //CJK UNIFIED IDEOGRAPH
+ 0xECAA: 0x9D18, //CJK UNIFIED IDEOGRAPH
+ 0xECAB: 0x9D22, //CJK UNIFIED IDEOGRAPH
+ 0xECAC: 0x9D10, //CJK UNIFIED IDEOGRAPH
+ 0xECAD: 0x9D19, //CJK UNIFIED IDEOGRAPH
+ 0xECAE: 0x9D1F, //CJK UNIFIED IDEOGRAPH
+ 0xECAF: 0x9E88, //CJK UNIFIED IDEOGRAPH
+ 0xECB0: 0x9E86, //CJK UNIFIED IDEOGRAPH
+ 0xECB1: 0x9E87, //CJK UNIFIED IDEOGRAPH
+ 0xECB2: 0x9EAE, //CJK UNIFIED IDEOGRAPH
+ 0xECB3: 0x9EAD, //CJK UNIFIED IDEOGRAPH
+ 0xECB4: 0x9ED5, //CJK UNIFIED IDEOGRAPH
+ 0xECB5: 0x9ED6, //CJK UNIFIED IDEOGRAPH
+ 0xECB6: 0x9EFA, //CJK UNIFIED IDEOGRAPH
+ 0xECB7: 0x9F12, //CJK UNIFIED IDEOGRAPH
+ 0xECB8: 0x9F3D, //CJK UNIFIED IDEOGRAPH
+ 0xECB9: 0x5126, //CJK UNIFIED IDEOGRAPH
+ 0xECBA: 0x5125, //CJK UNIFIED IDEOGRAPH
+ 0xECBB: 0x5122, //CJK UNIFIED IDEOGRAPH
+ 0xECBC: 0x5124, //CJK UNIFIED IDEOGRAPH
+ 0xECBD: 0x5120, //CJK UNIFIED IDEOGRAPH
+ 0xECBE: 0x5129, //CJK UNIFIED IDEOGRAPH
+ 0xECBF: 0x52F4, //CJK UNIFIED IDEOGRAPH
+ 0xECC0: 0x5693, //CJK UNIFIED IDEOGRAPH
+ 0xECC1: 0x568C, //CJK UNIFIED IDEOGRAPH
+ 0xECC2: 0x568D, //CJK UNIFIED IDEOGRAPH
+ 0xECC3: 0x5686, //CJK UNIFIED IDEOGRAPH
+ 0xECC4: 0x5684, //CJK UNIFIED IDEOGRAPH
+ 0xECC5: 0x5683, //CJK UNIFIED IDEOGRAPH
+ 0xECC6: 0x567E, //CJK UNIFIED IDEOGRAPH
+ 0xECC7: 0x5682, //CJK UNIFIED IDEOGRAPH
+ 0xECC8: 0x567F, //CJK UNIFIED IDEOGRAPH
+ 0xECC9: 0x5681, //CJK UNIFIED IDEOGRAPH
+ 0xECCA: 0x58D6, //CJK UNIFIED IDEOGRAPH
+ 0xECCB: 0x58D4, //CJK UNIFIED IDEOGRAPH
+ 0xECCC: 0x58CF, //CJK UNIFIED IDEOGRAPH
+ 0xECCD: 0x58D2, //CJK UNIFIED IDEOGRAPH
+ 0xECCE: 0x5B2D, //CJK UNIFIED IDEOGRAPH
+ 0xECCF: 0x5B25, //CJK UNIFIED IDEOGRAPH
+ 0xECD0: 0x5B32, //CJK UNIFIED IDEOGRAPH
+ 0xECD1: 0x5B23, //CJK UNIFIED IDEOGRAPH
+ 0xECD2: 0x5B2C, //CJK UNIFIED IDEOGRAPH
+ 0xECD3: 0x5B27, //CJK UNIFIED IDEOGRAPH
+ 0xECD4: 0x5B26, //CJK UNIFIED IDEOGRAPH
+ 0xECD5: 0x5B2F, //CJK UNIFIED IDEOGRAPH
+ 0xECD6: 0x5B2E, //CJK UNIFIED IDEOGRAPH
+ 0xECD7: 0x5B7B, //CJK UNIFIED IDEOGRAPH
+ 0xECD8: 0x5BF1, //CJK UNIFIED IDEOGRAPH
+ 0xECD9: 0x5BF2, //CJK UNIFIED IDEOGRAPH
+ 0xECDA: 0x5DB7, //CJK UNIFIED IDEOGRAPH
+ 0xECDB: 0x5E6C, //CJK UNIFIED IDEOGRAPH
+ 0xECDC: 0x5E6A, //CJK UNIFIED IDEOGRAPH
+ 0xECDD: 0x5FBE, //CJK UNIFIED IDEOGRAPH
+ 0xECDE: 0x5FBB, //CJK UNIFIED IDEOGRAPH
+ 0xECDF: 0x61C3, //CJK UNIFIED IDEOGRAPH
+ 0xECE0: 0x61B5, //CJK UNIFIED IDEOGRAPH
+ 0xECE1: 0x61BC, //CJK UNIFIED IDEOGRAPH
+ 0xECE2: 0x61E7, //CJK UNIFIED IDEOGRAPH
+ 0xECE3: 0x61E0, //CJK UNIFIED IDEOGRAPH
+ 0xECE4: 0x61E5, //CJK UNIFIED IDEOGRAPH
+ 0xECE5: 0x61E4, //CJK UNIFIED IDEOGRAPH
+ 0xECE6: 0x61E8, //CJK UNIFIED IDEOGRAPH
+ 0xECE7: 0x61DE, //CJK UNIFIED IDEOGRAPH
+ 0xECE8: 0x64EF, //CJK UNIFIED IDEOGRAPH
+ 0xECE9: 0x64E9, //CJK UNIFIED IDEOGRAPH
+ 0xECEA: 0x64E3, //CJK UNIFIED IDEOGRAPH
+ 0xECEB: 0x64EB, //CJK UNIFIED IDEOGRAPH
+ 0xECEC: 0x64E4, //CJK UNIFIED IDEOGRAPH
+ 0xECED: 0x64E8, //CJK UNIFIED IDEOGRAPH
+ 0xECEE: 0x6581, //CJK UNIFIED IDEOGRAPH
+ 0xECEF: 0x6580, //CJK UNIFIED IDEOGRAPH
+ 0xECF0: 0x65B6, //CJK UNIFIED IDEOGRAPH
+ 0xECF1: 0x65DA, //CJK UNIFIED IDEOGRAPH
+ 0xECF2: 0x66D2, //CJK UNIFIED IDEOGRAPH
+ 0xECF3: 0x6A8D, //CJK UNIFIED IDEOGRAPH
+ 0xECF4: 0x6A96, //CJK UNIFIED IDEOGRAPH
+ 0xECF5: 0x6A81, //CJK UNIFIED IDEOGRAPH
+ 0xECF6: 0x6AA5, //CJK UNIFIED IDEOGRAPH
+ 0xECF7: 0x6A89, //CJK UNIFIED IDEOGRAPH
+ 0xECF8: 0x6A9F, //CJK UNIFIED IDEOGRAPH
+ 0xECF9: 0x6A9B, //CJK UNIFIED IDEOGRAPH
+ 0xECFA: 0x6AA1, //CJK UNIFIED IDEOGRAPH
+ 0xECFB: 0x6A9E, //CJK UNIFIED IDEOGRAPH
+ 0xECFC: 0x6A87, //CJK UNIFIED IDEOGRAPH
+ 0xECFD: 0x6A93, //CJK UNIFIED IDEOGRAPH
+ 0xECFE: 0x6A8E, //CJK UNIFIED IDEOGRAPH
+ 0xED40: 0x6A95, //CJK UNIFIED IDEOGRAPH
+ 0xED41: 0x6A83, //CJK UNIFIED IDEOGRAPH
+ 0xED42: 0x6AA8, //CJK UNIFIED IDEOGRAPH
+ 0xED43: 0x6AA4, //CJK UNIFIED IDEOGRAPH
+ 0xED44: 0x6A91, //CJK UNIFIED IDEOGRAPH
+ 0xED45: 0x6A7F, //CJK UNIFIED IDEOGRAPH
+ 0xED46: 0x6AA6, //CJK UNIFIED IDEOGRAPH
+ 0xED47: 0x6A9A, //CJK UNIFIED IDEOGRAPH
+ 0xED48: 0x6A85, //CJK UNIFIED IDEOGRAPH
+ 0xED49: 0x6A8C, //CJK UNIFIED IDEOGRAPH
+ 0xED4A: 0x6A92, //CJK UNIFIED IDEOGRAPH
+ 0xED4B: 0x6B5B, //CJK UNIFIED IDEOGRAPH
+ 0xED4C: 0x6BAD, //CJK UNIFIED IDEOGRAPH
+ 0xED4D: 0x6C09, //CJK UNIFIED IDEOGRAPH
+ 0xED4E: 0x6FCC, //CJK UNIFIED IDEOGRAPH
+ 0xED4F: 0x6FA9, //CJK UNIFIED IDEOGRAPH
+ 0xED50: 0x6FF4, //CJK UNIFIED IDEOGRAPH
+ 0xED51: 0x6FD4, //CJK UNIFIED IDEOGRAPH
+ 0xED52: 0x6FE3, //CJK UNIFIED IDEOGRAPH
+ 0xED53: 0x6FDC, //CJK UNIFIED IDEOGRAPH
+ 0xED54: 0x6FED, //CJK UNIFIED IDEOGRAPH
+ 0xED55: 0x6FE7, //CJK UNIFIED IDEOGRAPH
+ 0xED56: 0x6FE6, //CJK UNIFIED IDEOGRAPH
+ 0xED57: 0x6FDE, //CJK UNIFIED IDEOGRAPH
+ 0xED58: 0x6FF2, //CJK UNIFIED IDEOGRAPH
+ 0xED59: 0x6FDD, //CJK UNIFIED IDEOGRAPH
+ 0xED5A: 0x6FE2, //CJK UNIFIED IDEOGRAPH
+ 0xED5B: 0x6FE8, //CJK UNIFIED IDEOGRAPH
+ 0xED5C: 0x71E1, //CJK UNIFIED IDEOGRAPH
+ 0xED5D: 0x71F1, //CJK UNIFIED IDEOGRAPH
+ 0xED5E: 0x71E8, //CJK UNIFIED IDEOGRAPH
+ 0xED5F: 0x71F2, //CJK UNIFIED IDEOGRAPH
+ 0xED60: 0x71E4, //CJK UNIFIED IDEOGRAPH
+ 0xED61: 0x71F0, //CJK UNIFIED IDEOGRAPH
+ 0xED62: 0x71E2, //CJK UNIFIED IDEOGRAPH
+ 0xED63: 0x7373, //CJK UNIFIED IDEOGRAPH
+ 0xED64: 0x736E, //CJK UNIFIED IDEOGRAPH
+ 0xED65: 0x736F, //CJK UNIFIED IDEOGRAPH
+ 0xED66: 0x7497, //CJK UNIFIED IDEOGRAPH
+ 0xED67: 0x74B2, //CJK UNIFIED IDEOGRAPH
+ 0xED68: 0x74AB, //CJK UNIFIED IDEOGRAPH
+ 0xED69: 0x7490, //CJK UNIFIED IDEOGRAPH
+ 0xED6A: 0x74AA, //CJK UNIFIED IDEOGRAPH
+ 0xED6B: 0x74AD, //CJK UNIFIED IDEOGRAPH
+ 0xED6C: 0x74B1, //CJK UNIFIED IDEOGRAPH
+ 0xED6D: 0x74A5, //CJK UNIFIED IDEOGRAPH
+ 0xED6E: 0x74AF, //CJK UNIFIED IDEOGRAPH
+ 0xED6F: 0x7510, //CJK UNIFIED IDEOGRAPH
+ 0xED70: 0x7511, //CJK UNIFIED IDEOGRAPH
+ 0xED71: 0x7512, //CJK UNIFIED IDEOGRAPH
+ 0xED72: 0x750F, //CJK UNIFIED IDEOGRAPH
+ 0xED73: 0x7584, //CJK UNIFIED IDEOGRAPH
+ 0xED74: 0x7643, //CJK UNIFIED IDEOGRAPH
+ 0xED75: 0x7648, //CJK UNIFIED IDEOGRAPH
+ 0xED76: 0x7649, //CJK UNIFIED IDEOGRAPH
+ 0xED77: 0x7647, //CJK UNIFIED IDEOGRAPH
+ 0xED78: 0x76A4, //CJK UNIFIED IDEOGRAPH
+ 0xED79: 0x76E9, //CJK UNIFIED IDEOGRAPH
+ 0xED7A: 0x77B5, //CJK UNIFIED IDEOGRAPH
+ 0xED7B: 0x77AB, //CJK UNIFIED IDEOGRAPH
+ 0xED7C: 0x77B2, //CJK UNIFIED IDEOGRAPH
+ 0xED7D: 0x77B7, //CJK UNIFIED IDEOGRAPH
+ 0xED7E: 0x77B6, //CJK UNIFIED IDEOGRAPH
+ 0xEDA1: 0x77B4, //CJK UNIFIED IDEOGRAPH
+ 0xEDA2: 0x77B1, //CJK UNIFIED IDEOGRAPH
+ 0xEDA3: 0x77A8, //CJK UNIFIED IDEOGRAPH
+ 0xEDA4: 0x77F0, //CJK UNIFIED IDEOGRAPH
+ 0xEDA5: 0x78F3, //CJK UNIFIED IDEOGRAPH
+ 0xEDA6: 0x78FD, //CJK UNIFIED IDEOGRAPH
+ 0xEDA7: 0x7902, //CJK UNIFIED IDEOGRAPH
+ 0xEDA8: 0x78FB, //CJK UNIFIED IDEOGRAPH
+ 0xEDA9: 0x78FC, //CJK UNIFIED IDEOGRAPH
+ 0xEDAA: 0x78F2, //CJK UNIFIED IDEOGRAPH
+ 0xEDAB: 0x7905, //CJK UNIFIED IDEOGRAPH
+ 0xEDAC: 0x78F9, //CJK UNIFIED IDEOGRAPH
+ 0xEDAD: 0x78FE, //CJK UNIFIED IDEOGRAPH
+ 0xEDAE: 0x7904, //CJK UNIFIED IDEOGRAPH
+ 0xEDAF: 0x79AB, //CJK UNIFIED IDEOGRAPH
+ 0xEDB0: 0x79A8, //CJK UNIFIED IDEOGRAPH
+ 0xEDB1: 0x7A5C, //CJK UNIFIED IDEOGRAPH
+ 0xEDB2: 0x7A5B, //CJK UNIFIED IDEOGRAPH
+ 0xEDB3: 0x7A56, //CJK UNIFIED IDEOGRAPH
+ 0xEDB4: 0x7A58, //CJK UNIFIED IDEOGRAPH
+ 0xEDB5: 0x7A54, //CJK UNIFIED IDEOGRAPH
+ 0xEDB6: 0x7A5A, //CJK UNIFIED IDEOGRAPH
+ 0xEDB7: 0x7ABE, //CJK UNIFIED IDEOGRAPH
+ 0xEDB8: 0x7AC0, //CJK UNIFIED IDEOGRAPH
+ 0xEDB9: 0x7AC1, //CJK UNIFIED IDEOGRAPH
+ 0xEDBA: 0x7C05, //CJK UNIFIED IDEOGRAPH
+ 0xEDBB: 0x7C0F, //CJK UNIFIED IDEOGRAPH
+ 0xEDBC: 0x7BF2, //CJK UNIFIED IDEOGRAPH
+ 0xEDBD: 0x7C00, //CJK UNIFIED IDEOGRAPH
+ 0xEDBE: 0x7BFF, //CJK UNIFIED IDEOGRAPH
+ 0xEDBF: 0x7BFB, //CJK UNIFIED IDEOGRAPH
+ 0xEDC0: 0x7C0E, //CJK UNIFIED IDEOGRAPH
+ 0xEDC1: 0x7BF4, //CJK UNIFIED IDEOGRAPH
+ 0xEDC2: 0x7C0B, //CJK UNIFIED IDEOGRAPH
+ 0xEDC3: 0x7BF3, //CJK UNIFIED IDEOGRAPH
+ 0xEDC4: 0x7C02, //CJK UNIFIED IDEOGRAPH
+ 0xEDC5: 0x7C09, //CJK UNIFIED IDEOGRAPH
+ 0xEDC6: 0x7C03, //CJK UNIFIED IDEOGRAPH
+ 0xEDC7: 0x7C01, //CJK UNIFIED IDEOGRAPH
+ 0xEDC8: 0x7BF8, //CJK UNIFIED IDEOGRAPH
+ 0xEDC9: 0x7BFD, //CJK UNIFIED IDEOGRAPH
+ 0xEDCA: 0x7C06, //CJK UNIFIED IDEOGRAPH
+ 0xEDCB: 0x7BF0, //CJK UNIFIED IDEOGRAPH
+ 0xEDCC: 0x7BF1, //CJK UNIFIED IDEOGRAPH
+ 0xEDCD: 0x7C10, //CJK UNIFIED IDEOGRAPH
+ 0xEDCE: 0x7C0A, //CJK UNIFIED IDEOGRAPH
+ 0xEDCF: 0x7CE8, //CJK UNIFIED IDEOGRAPH
+ 0xEDD0: 0x7E2D, //CJK UNIFIED IDEOGRAPH
+ 0xEDD1: 0x7E3C, //CJK UNIFIED IDEOGRAPH
+ 0xEDD2: 0x7E42, //CJK UNIFIED IDEOGRAPH
+ 0xEDD3: 0x7E33, //CJK UNIFIED IDEOGRAPH
+ 0xEDD4: 0x9848, //CJK UNIFIED IDEOGRAPH
+ 0xEDD5: 0x7E38, //CJK UNIFIED IDEOGRAPH
+ 0xEDD6: 0x7E2A, //CJK UNIFIED IDEOGRAPH
+ 0xEDD7: 0x7E49, //CJK UNIFIED IDEOGRAPH
+ 0xEDD8: 0x7E40, //CJK UNIFIED IDEOGRAPH
+ 0xEDD9: 0x7E47, //CJK UNIFIED IDEOGRAPH
+ 0xEDDA: 0x7E29, //CJK UNIFIED IDEOGRAPH
+ 0xEDDB: 0x7E4C, //CJK UNIFIED IDEOGRAPH
+ 0xEDDC: 0x7E30, //CJK UNIFIED IDEOGRAPH
+ 0xEDDD: 0x7E3B, //CJK UNIFIED IDEOGRAPH
+ 0xEDDE: 0x7E36, //CJK UNIFIED IDEOGRAPH
+ 0xEDDF: 0x7E44, //CJK UNIFIED IDEOGRAPH
+ 0xEDE0: 0x7E3A, //CJK UNIFIED IDEOGRAPH
+ 0xEDE1: 0x7F45, //CJK UNIFIED IDEOGRAPH
+ 0xEDE2: 0x7F7F, //CJK UNIFIED IDEOGRAPH
+ 0xEDE3: 0x7F7E, //CJK UNIFIED IDEOGRAPH
+ 0xEDE4: 0x7F7D, //CJK UNIFIED IDEOGRAPH
+ 0xEDE5: 0x7FF4, //CJK UNIFIED IDEOGRAPH
+ 0xEDE6: 0x7FF2, //CJK UNIFIED IDEOGRAPH
+ 0xEDE7: 0x802C, //CJK UNIFIED IDEOGRAPH
+ 0xEDE8: 0x81BB, //CJK UNIFIED IDEOGRAPH
+ 0xEDE9: 0x81C4, //CJK UNIFIED IDEOGRAPH
+ 0xEDEA: 0x81CC, //CJK UNIFIED IDEOGRAPH
+ 0xEDEB: 0x81CA, //CJK UNIFIED IDEOGRAPH
+ 0xEDEC: 0x81C5, //CJK UNIFIED IDEOGRAPH
+ 0xEDED: 0x81C7, //CJK UNIFIED IDEOGRAPH
+ 0xEDEE: 0x81BC, //CJK UNIFIED IDEOGRAPH
+ 0xEDEF: 0x81E9, //CJK UNIFIED IDEOGRAPH
+ 0xEDF0: 0x825B, //CJK UNIFIED IDEOGRAPH
+ 0xEDF1: 0x825A, //CJK UNIFIED IDEOGRAPH
+ 0xEDF2: 0x825C, //CJK UNIFIED IDEOGRAPH
+ 0xEDF3: 0x8583, //CJK UNIFIED IDEOGRAPH
+ 0xEDF4: 0x8580, //CJK UNIFIED IDEOGRAPH
+ 0xEDF5: 0x858F, //CJK UNIFIED IDEOGRAPH
+ 0xEDF6: 0x85A7, //CJK UNIFIED IDEOGRAPH
+ 0xEDF7: 0x8595, //CJK UNIFIED IDEOGRAPH
+ 0xEDF8: 0x85A0, //CJK UNIFIED IDEOGRAPH
+ 0xEDF9: 0x858B, //CJK UNIFIED IDEOGRAPH
+ 0xEDFA: 0x85A3, //CJK UNIFIED IDEOGRAPH
+ 0xEDFB: 0x857B, //CJK UNIFIED IDEOGRAPH
+ 0xEDFC: 0x85A4, //CJK UNIFIED IDEOGRAPH
+ 0xEDFD: 0x859A, //CJK UNIFIED IDEOGRAPH
+ 0xEDFE: 0x859E, //CJK UNIFIED IDEOGRAPH
+ 0xEE40: 0x8577, //CJK UNIFIED IDEOGRAPH
+ 0xEE41: 0x857C, //CJK UNIFIED IDEOGRAPH
+ 0xEE42: 0x8589, //CJK UNIFIED IDEOGRAPH
+ 0xEE43: 0x85A1, //CJK UNIFIED IDEOGRAPH
+ 0xEE44: 0x857A, //CJK UNIFIED IDEOGRAPH
+ 0xEE45: 0x8578, //CJK UNIFIED IDEOGRAPH
+ 0xEE46: 0x8557, //CJK UNIFIED IDEOGRAPH
+ 0xEE47: 0x858E, //CJK UNIFIED IDEOGRAPH
+ 0xEE48: 0x8596, //CJK UNIFIED IDEOGRAPH
+ 0xEE49: 0x8586, //CJK UNIFIED IDEOGRAPH
+ 0xEE4A: 0x858D, //CJK UNIFIED IDEOGRAPH
+ 0xEE4B: 0x8599, //CJK UNIFIED IDEOGRAPH
+ 0xEE4C: 0x859D, //CJK UNIFIED IDEOGRAPH
+ 0xEE4D: 0x8581, //CJK UNIFIED IDEOGRAPH
+ 0xEE4E: 0x85A2, //CJK UNIFIED IDEOGRAPH
+ 0xEE4F: 0x8582, //CJK UNIFIED IDEOGRAPH
+ 0xEE50: 0x8588, //CJK UNIFIED IDEOGRAPH
+ 0xEE51: 0x8585, //CJK UNIFIED IDEOGRAPH
+ 0xEE52: 0x8579, //CJK UNIFIED IDEOGRAPH
+ 0xEE53: 0x8576, //CJK UNIFIED IDEOGRAPH
+ 0xEE54: 0x8598, //CJK UNIFIED IDEOGRAPH
+ 0xEE55: 0x8590, //CJK UNIFIED IDEOGRAPH
+ 0xEE56: 0x859F, //CJK UNIFIED IDEOGRAPH
+ 0xEE57: 0x8668, //CJK UNIFIED IDEOGRAPH
+ 0xEE58: 0x87BE, //CJK UNIFIED IDEOGRAPH
+ 0xEE59: 0x87AA, //CJK UNIFIED IDEOGRAPH
+ 0xEE5A: 0x87AD, //CJK UNIFIED IDEOGRAPH
+ 0xEE5B: 0x87C5, //CJK UNIFIED IDEOGRAPH
+ 0xEE5C: 0x87B0, //CJK UNIFIED IDEOGRAPH
+ 0xEE5D: 0x87AC, //CJK UNIFIED IDEOGRAPH
+ 0xEE5E: 0x87B9, //CJK UNIFIED IDEOGRAPH
+ 0xEE5F: 0x87B5, //CJK UNIFIED IDEOGRAPH
+ 0xEE60: 0x87BC, //CJK UNIFIED IDEOGRAPH
+ 0xEE61: 0x87AE, //CJK UNIFIED IDEOGRAPH
+ 0xEE62: 0x87C9, //CJK UNIFIED IDEOGRAPH
+ 0xEE63: 0x87C3, //CJK UNIFIED IDEOGRAPH
+ 0xEE64: 0x87C2, //CJK UNIFIED IDEOGRAPH
+ 0xEE65: 0x87CC, //CJK UNIFIED IDEOGRAPH
+ 0xEE66: 0x87B7, //CJK UNIFIED IDEOGRAPH
+ 0xEE67: 0x87AF, //CJK UNIFIED IDEOGRAPH
+ 0xEE68: 0x87C4, //CJK UNIFIED IDEOGRAPH
+ 0xEE69: 0x87CA, //CJK UNIFIED IDEOGRAPH
+ 0xEE6A: 0x87B4, //CJK UNIFIED IDEOGRAPH
+ 0xEE6B: 0x87B6, //CJK UNIFIED IDEOGRAPH
+ 0xEE6C: 0x87BF, //CJK UNIFIED IDEOGRAPH
+ 0xEE6D: 0x87B8, //CJK UNIFIED IDEOGRAPH
+ 0xEE6E: 0x87BD, //CJK UNIFIED IDEOGRAPH
+ 0xEE6F: 0x87DE, //CJK UNIFIED IDEOGRAPH
+ 0xEE70: 0x87B2, //CJK UNIFIED IDEOGRAPH
+ 0xEE71: 0x8935, //CJK UNIFIED IDEOGRAPH
+ 0xEE72: 0x8933, //CJK UNIFIED IDEOGRAPH
+ 0xEE73: 0x893C, //CJK UNIFIED IDEOGRAPH
+ 0xEE74: 0x893E, //CJK UNIFIED IDEOGRAPH
+ 0xEE75: 0x8941, //CJK UNIFIED IDEOGRAPH
+ 0xEE76: 0x8952, //CJK UNIFIED IDEOGRAPH
+ 0xEE77: 0x8937, //CJK UNIFIED IDEOGRAPH
+ 0xEE78: 0x8942, //CJK UNIFIED IDEOGRAPH
+ 0xEE79: 0x89AD, //CJK UNIFIED IDEOGRAPH
+ 0xEE7A: 0x89AF, //CJK UNIFIED IDEOGRAPH
+ 0xEE7B: 0x89AE, //CJK UNIFIED IDEOGRAPH
+ 0xEE7C: 0x89F2, //CJK UNIFIED IDEOGRAPH
+ 0xEE7D: 0x89F3, //CJK UNIFIED IDEOGRAPH
+ 0xEE7E: 0x8B1E, //CJK UNIFIED IDEOGRAPH
+ 0xEEA1: 0x8B18, //CJK UNIFIED IDEOGRAPH
+ 0xEEA2: 0x8B16, //CJK UNIFIED IDEOGRAPH
+ 0xEEA3: 0x8B11, //CJK UNIFIED IDEOGRAPH
+ 0xEEA4: 0x8B05, //CJK UNIFIED IDEOGRAPH
+ 0xEEA5: 0x8B0B, //CJK UNIFIED IDEOGRAPH
+ 0xEEA6: 0x8B22, //CJK UNIFIED IDEOGRAPH
+ 0xEEA7: 0x8B0F, //CJK UNIFIED IDEOGRAPH
+ 0xEEA8: 0x8B12, //CJK UNIFIED IDEOGRAPH
+ 0xEEA9: 0x8B15, //CJK UNIFIED IDEOGRAPH
+ 0xEEAA: 0x8B07, //CJK UNIFIED IDEOGRAPH
+ 0xEEAB: 0x8B0D, //CJK UNIFIED IDEOGRAPH
+ 0xEEAC: 0x8B08, //CJK UNIFIED IDEOGRAPH
+ 0xEEAD: 0x8B06, //CJK UNIFIED IDEOGRAPH
+ 0xEEAE: 0x8B1C, //CJK UNIFIED IDEOGRAPH
+ 0xEEAF: 0x8B13, //CJK UNIFIED IDEOGRAPH
+ 0xEEB0: 0x8B1A, //CJK UNIFIED IDEOGRAPH
+ 0xEEB1: 0x8C4F, //CJK UNIFIED IDEOGRAPH
+ 0xEEB2: 0x8C70, //CJK UNIFIED IDEOGRAPH
+ 0xEEB3: 0x8C72, //CJK UNIFIED IDEOGRAPH
+ 0xEEB4: 0x8C71, //CJK UNIFIED IDEOGRAPH
+ 0xEEB5: 0x8C6F, //CJK UNIFIED IDEOGRAPH
+ 0xEEB6: 0x8C95, //CJK UNIFIED IDEOGRAPH
+ 0xEEB7: 0x8C94, //CJK UNIFIED IDEOGRAPH
+ 0xEEB8: 0x8CF9, //CJK UNIFIED IDEOGRAPH
+ 0xEEB9: 0x8D6F, //CJK UNIFIED IDEOGRAPH
+ 0xEEBA: 0x8E4E, //CJK UNIFIED IDEOGRAPH
+ 0xEEBB: 0x8E4D, //CJK UNIFIED IDEOGRAPH
+ 0xEEBC: 0x8E53, //CJK UNIFIED IDEOGRAPH
+ 0xEEBD: 0x8E50, //CJK UNIFIED IDEOGRAPH
+ 0xEEBE: 0x8E4C, //CJK UNIFIED IDEOGRAPH
+ 0xEEBF: 0x8E47, //CJK UNIFIED IDEOGRAPH
+ 0xEEC0: 0x8F43, //CJK UNIFIED IDEOGRAPH
+ 0xEEC1: 0x8F40, //CJK UNIFIED IDEOGRAPH
+ 0xEEC2: 0x9085, //CJK UNIFIED IDEOGRAPH
+ 0xEEC3: 0x907E, //CJK UNIFIED IDEOGRAPH
+ 0xEEC4: 0x9138, //CJK UNIFIED IDEOGRAPH
+ 0xEEC5: 0x919A, //CJK UNIFIED IDEOGRAPH
+ 0xEEC6: 0x91A2, //CJK UNIFIED IDEOGRAPH
+ 0xEEC7: 0x919B, //CJK UNIFIED IDEOGRAPH
+ 0xEEC8: 0x9199, //CJK UNIFIED IDEOGRAPH
+ 0xEEC9: 0x919F, //CJK UNIFIED IDEOGRAPH
+ 0xEECA: 0x91A1, //CJK UNIFIED IDEOGRAPH
+ 0xEECB: 0x919D, //CJK UNIFIED IDEOGRAPH
+ 0xEECC: 0x91A0, //CJK UNIFIED IDEOGRAPH
+ 0xEECD: 0x93A1, //CJK UNIFIED IDEOGRAPH
+ 0xEECE: 0x9383, //CJK UNIFIED IDEOGRAPH
+ 0xEECF: 0x93AF, //CJK UNIFIED IDEOGRAPH
+ 0xEED0: 0x9364, //CJK UNIFIED IDEOGRAPH
+ 0xEED1: 0x9356, //CJK UNIFIED IDEOGRAPH
+ 0xEED2: 0x9347, //CJK UNIFIED IDEOGRAPH
+ 0xEED3: 0x937C, //CJK UNIFIED IDEOGRAPH
+ 0xEED4: 0x9358, //CJK UNIFIED IDEOGRAPH
+ 0xEED5: 0x935C, //CJK UNIFIED IDEOGRAPH
+ 0xEED6: 0x9376, //CJK UNIFIED IDEOGRAPH
+ 0xEED7: 0x9349, //CJK UNIFIED IDEOGRAPH
+ 0xEED8: 0x9350, //CJK UNIFIED IDEOGRAPH
+ 0xEED9: 0x9351, //CJK UNIFIED IDEOGRAPH
+ 0xEEDA: 0x9360, //CJK UNIFIED IDEOGRAPH
+ 0xEEDB: 0x936D, //CJK UNIFIED IDEOGRAPH
+ 0xEEDC: 0x938F, //CJK UNIFIED IDEOGRAPH
+ 0xEEDD: 0x934C, //CJK UNIFIED IDEOGRAPH
+ 0xEEDE: 0x936A, //CJK UNIFIED IDEOGRAPH
+ 0xEEDF: 0x9379, //CJK UNIFIED IDEOGRAPH
+ 0xEEE0: 0x9357, //CJK UNIFIED IDEOGRAPH
+ 0xEEE1: 0x9355, //CJK UNIFIED IDEOGRAPH
+ 0xEEE2: 0x9352, //CJK UNIFIED IDEOGRAPH
+ 0xEEE3: 0x934F, //CJK UNIFIED IDEOGRAPH
+ 0xEEE4: 0x9371, //CJK UNIFIED IDEOGRAPH
+ 0xEEE5: 0x9377, //CJK UNIFIED IDEOGRAPH
+ 0xEEE6: 0x937B, //CJK UNIFIED IDEOGRAPH
+ 0xEEE7: 0x9361, //CJK UNIFIED IDEOGRAPH
+ 0xEEE8: 0x935E, //CJK UNIFIED IDEOGRAPH
+ 0xEEE9: 0x9363, //CJK UNIFIED IDEOGRAPH
+ 0xEEEA: 0x9367, //CJK UNIFIED IDEOGRAPH
+ 0xEEEB: 0x9380, //CJK UNIFIED IDEOGRAPH
+ 0xEEEC: 0x934E, //CJK UNIFIED IDEOGRAPH
+ 0xEEED: 0x9359, //CJK UNIFIED IDEOGRAPH
+ 0xEEEE: 0x95C7, //CJK UNIFIED IDEOGRAPH
+ 0xEEEF: 0x95C0, //CJK UNIFIED IDEOGRAPH
+ 0xEEF0: 0x95C9, //CJK UNIFIED IDEOGRAPH
+ 0xEEF1: 0x95C3, //CJK UNIFIED IDEOGRAPH
+ 0xEEF2: 0x95C5, //CJK UNIFIED IDEOGRAPH
+ 0xEEF3: 0x95B7, //CJK UNIFIED IDEOGRAPH
+ 0xEEF4: 0x96AE, //CJK UNIFIED IDEOGRAPH
+ 0xEEF5: 0x96B0, //CJK UNIFIED IDEOGRAPH
+ 0xEEF6: 0x96AC, //CJK UNIFIED IDEOGRAPH
+ 0xEEF7: 0x9720, //CJK UNIFIED IDEOGRAPH
+ 0xEEF8: 0x971F, //CJK UNIFIED IDEOGRAPH
+ 0xEEF9: 0x9718, //CJK UNIFIED IDEOGRAPH
+ 0xEEFA: 0x971D, //CJK UNIFIED IDEOGRAPH
+ 0xEEFB: 0x9719, //CJK UNIFIED IDEOGRAPH
+ 0xEEFC: 0x979A, //CJK UNIFIED IDEOGRAPH
+ 0xEEFD: 0x97A1, //CJK UNIFIED IDEOGRAPH
+ 0xEEFE: 0x979C, //CJK UNIFIED IDEOGRAPH
+ 0xEF40: 0x979E, //CJK UNIFIED IDEOGRAPH
+ 0xEF41: 0x979D, //CJK UNIFIED IDEOGRAPH
+ 0xEF42: 0x97D5, //CJK UNIFIED IDEOGRAPH
+ 0xEF43: 0x97D4, //CJK UNIFIED IDEOGRAPH
+ 0xEF44: 0x97F1, //CJK UNIFIED IDEOGRAPH
+ 0xEF45: 0x9841, //CJK UNIFIED IDEOGRAPH
+ 0xEF46: 0x9844, //CJK UNIFIED IDEOGRAPH
+ 0xEF47: 0x984A, //CJK UNIFIED IDEOGRAPH
+ 0xEF48: 0x9849, //CJK UNIFIED IDEOGRAPH
+ 0xEF49: 0x9845, //CJK UNIFIED IDEOGRAPH
+ 0xEF4A: 0x9843, //CJK UNIFIED IDEOGRAPH
+ 0xEF4B: 0x9925, //CJK UNIFIED IDEOGRAPH
+ 0xEF4C: 0x992B, //CJK UNIFIED IDEOGRAPH
+ 0xEF4D: 0x992C, //CJK UNIFIED IDEOGRAPH
+ 0xEF4E: 0x992A, //CJK UNIFIED IDEOGRAPH
+ 0xEF4F: 0x9933, //CJK UNIFIED IDEOGRAPH
+ 0xEF50: 0x9932, //CJK UNIFIED IDEOGRAPH
+ 0xEF51: 0x992F, //CJK UNIFIED IDEOGRAPH
+ 0xEF52: 0x992D, //CJK UNIFIED IDEOGRAPH
+ 0xEF53: 0x9931, //CJK UNIFIED IDEOGRAPH
+ 0xEF54: 0x9930, //CJK UNIFIED IDEOGRAPH
+ 0xEF55: 0x9998, //CJK UNIFIED IDEOGRAPH
+ 0xEF56: 0x99A3, //CJK UNIFIED IDEOGRAPH
+ 0xEF57: 0x99A1, //CJK UNIFIED IDEOGRAPH
+ 0xEF58: 0x9A02, //CJK UNIFIED IDEOGRAPH
+ 0xEF59: 0x99FA, //CJK UNIFIED IDEOGRAPH
+ 0xEF5A: 0x99F4, //CJK UNIFIED IDEOGRAPH
+ 0xEF5B: 0x99F7, //CJK UNIFIED IDEOGRAPH
+ 0xEF5C: 0x99F9, //CJK UNIFIED IDEOGRAPH
+ 0xEF5D: 0x99F8, //CJK UNIFIED IDEOGRAPH
+ 0xEF5E: 0x99F6, //CJK UNIFIED IDEOGRAPH
+ 0xEF5F: 0x99FB, //CJK UNIFIED IDEOGRAPH
+ 0xEF60: 0x99FD, //CJK UNIFIED IDEOGRAPH
+ 0xEF61: 0x99FE, //CJK UNIFIED IDEOGRAPH
+ 0xEF62: 0x99FC, //CJK UNIFIED IDEOGRAPH
+ 0xEF63: 0x9A03, //CJK UNIFIED IDEOGRAPH
+ 0xEF64: 0x9ABE, //CJK UNIFIED IDEOGRAPH
+ 0xEF65: 0x9AFE, //CJK UNIFIED IDEOGRAPH
+ 0xEF66: 0x9AFD, //CJK UNIFIED IDEOGRAPH
+ 0xEF67: 0x9B01, //CJK UNIFIED IDEOGRAPH
+ 0xEF68: 0x9AFC, //CJK UNIFIED IDEOGRAPH
+ 0xEF69: 0x9B48, //CJK UNIFIED IDEOGRAPH
+ 0xEF6A: 0x9B9A, //CJK UNIFIED IDEOGRAPH
+ 0xEF6B: 0x9BA8, //CJK UNIFIED IDEOGRAPH
+ 0xEF6C: 0x9B9E, //CJK UNIFIED IDEOGRAPH
+ 0xEF6D: 0x9B9B, //CJK UNIFIED IDEOGRAPH
+ 0xEF6E: 0x9BA6, //CJK UNIFIED IDEOGRAPH
+ 0xEF6F: 0x9BA1, //CJK UNIFIED IDEOGRAPH
+ 0xEF70: 0x9BA5, //CJK UNIFIED IDEOGRAPH
+ 0xEF71: 0x9BA4, //CJK UNIFIED IDEOGRAPH
+ 0xEF72: 0x9B86, //CJK UNIFIED IDEOGRAPH
+ 0xEF73: 0x9BA2, //CJK UNIFIED IDEOGRAPH
+ 0xEF74: 0x9BA0, //CJK UNIFIED IDEOGRAPH
+ 0xEF75: 0x9BAF, //CJK UNIFIED IDEOGRAPH
+ 0xEF76: 0x9D33, //CJK UNIFIED IDEOGRAPH
+ 0xEF77: 0x9D41, //CJK UNIFIED IDEOGRAPH
+ 0xEF78: 0x9D67, //CJK UNIFIED IDEOGRAPH
+ 0xEF79: 0x9D36, //CJK UNIFIED IDEOGRAPH
+ 0xEF7A: 0x9D2E, //CJK UNIFIED IDEOGRAPH
+ 0xEF7B: 0x9D2F, //CJK UNIFIED IDEOGRAPH
+ 0xEF7C: 0x9D31, //CJK UNIFIED IDEOGRAPH
+ 0xEF7D: 0x9D38, //CJK UNIFIED IDEOGRAPH
+ 0xEF7E: 0x9D30, //CJK UNIFIED IDEOGRAPH
+ 0xEFA1: 0x9D45, //CJK UNIFIED IDEOGRAPH
+ 0xEFA2: 0x9D42, //CJK UNIFIED IDEOGRAPH
+ 0xEFA3: 0x9D43, //CJK UNIFIED IDEOGRAPH
+ 0xEFA4: 0x9D3E, //CJK UNIFIED IDEOGRAPH
+ 0xEFA5: 0x9D37, //CJK UNIFIED IDEOGRAPH
+ 0xEFA6: 0x9D40, //CJK UNIFIED IDEOGRAPH
+ 0xEFA7: 0x9D3D, //CJK UNIFIED IDEOGRAPH
+ 0xEFA8: 0x7FF5, //CJK UNIFIED IDEOGRAPH
+ 0xEFA9: 0x9D2D, //CJK UNIFIED IDEOGRAPH
+ 0xEFAA: 0x9E8A, //CJK UNIFIED IDEOGRAPH
+ 0xEFAB: 0x9E89, //CJK UNIFIED IDEOGRAPH
+ 0xEFAC: 0x9E8D, //CJK UNIFIED IDEOGRAPH
+ 0xEFAD: 0x9EB0, //CJK UNIFIED IDEOGRAPH
+ 0xEFAE: 0x9EC8, //CJK UNIFIED IDEOGRAPH
+ 0xEFAF: 0x9EDA, //CJK UNIFIED IDEOGRAPH
+ 0xEFB0: 0x9EFB, //CJK UNIFIED IDEOGRAPH
+ 0xEFB1: 0x9EFF, //CJK UNIFIED IDEOGRAPH
+ 0xEFB2: 0x9F24, //CJK UNIFIED IDEOGRAPH
+ 0xEFB3: 0x9F23, //CJK UNIFIED IDEOGRAPH
+ 0xEFB4: 0x9F22, //CJK UNIFIED IDEOGRAPH
+ 0xEFB5: 0x9F54, //CJK UNIFIED IDEOGRAPH
+ 0xEFB6: 0x9FA0, //CJK UNIFIED IDEOGRAPH
+ 0xEFB7: 0x5131, //CJK UNIFIED IDEOGRAPH
+ 0xEFB8: 0x512D, //CJK UNIFIED IDEOGRAPH
+ 0xEFB9: 0x512E, //CJK UNIFIED IDEOGRAPH
+ 0xEFBA: 0x5698, //CJK UNIFIED IDEOGRAPH
+ 0xEFBB: 0x569C, //CJK UNIFIED IDEOGRAPH
+ 0xEFBC: 0x5697, //CJK UNIFIED IDEOGRAPH
+ 0xEFBD: 0x569A, //CJK UNIFIED IDEOGRAPH
+ 0xEFBE: 0x569D, //CJK UNIFIED IDEOGRAPH
+ 0xEFBF: 0x5699, //CJK UNIFIED IDEOGRAPH
+ 0xEFC0: 0x5970, //CJK UNIFIED IDEOGRAPH
+ 0xEFC1: 0x5B3C, //CJK UNIFIED IDEOGRAPH
+ 0xEFC2: 0x5C69, //CJK UNIFIED IDEOGRAPH
+ 0xEFC3: 0x5C6A, //CJK UNIFIED IDEOGRAPH
+ 0xEFC4: 0x5DC0, //CJK UNIFIED IDEOGRAPH
+ 0xEFC5: 0x5E6D, //CJK UNIFIED IDEOGRAPH
+ 0xEFC6: 0x5E6E, //CJK UNIFIED IDEOGRAPH
+ 0xEFC7: 0x61D8, //CJK UNIFIED IDEOGRAPH
+ 0xEFC8: 0x61DF, //CJK UNIFIED IDEOGRAPH
+ 0xEFC9: 0x61ED, //CJK UNIFIED IDEOGRAPH
+ 0xEFCA: 0x61EE, //CJK UNIFIED IDEOGRAPH
+ 0xEFCB: 0x61F1, //CJK UNIFIED IDEOGRAPH
+ 0xEFCC: 0x61EA, //CJK UNIFIED IDEOGRAPH
+ 0xEFCD: 0x61F0, //CJK UNIFIED IDEOGRAPH
+ 0xEFCE: 0x61EB, //CJK UNIFIED IDEOGRAPH
+ 0xEFCF: 0x61D6, //CJK UNIFIED IDEOGRAPH
+ 0xEFD0: 0x61E9, //CJK UNIFIED IDEOGRAPH
+ 0xEFD1: 0x64FF, //CJK UNIFIED IDEOGRAPH
+ 0xEFD2: 0x6504, //CJK UNIFIED IDEOGRAPH
+ 0xEFD3: 0x64FD, //CJK UNIFIED IDEOGRAPH
+ 0xEFD4: 0x64F8, //CJK UNIFIED IDEOGRAPH
+ 0xEFD5: 0x6501, //CJK UNIFIED IDEOGRAPH
+ 0xEFD6: 0x6503, //CJK UNIFIED IDEOGRAPH
+ 0xEFD7: 0x64FC, //CJK UNIFIED IDEOGRAPH
+ 0xEFD8: 0x6594, //CJK UNIFIED IDEOGRAPH
+ 0xEFD9: 0x65DB, //CJK UNIFIED IDEOGRAPH
+ 0xEFDA: 0x66DA, //CJK UNIFIED IDEOGRAPH
+ 0xEFDB: 0x66DB, //CJK UNIFIED IDEOGRAPH
+ 0xEFDC: 0x66D8, //CJK UNIFIED IDEOGRAPH
+ 0xEFDD: 0x6AC5, //CJK UNIFIED IDEOGRAPH
+ 0xEFDE: 0x6AB9, //CJK UNIFIED IDEOGRAPH
+ 0xEFDF: 0x6ABD, //CJK UNIFIED IDEOGRAPH
+ 0xEFE0: 0x6AE1, //CJK UNIFIED IDEOGRAPH
+ 0xEFE1: 0x6AC6, //CJK UNIFIED IDEOGRAPH
+ 0xEFE2: 0x6ABA, //CJK UNIFIED IDEOGRAPH
+ 0xEFE3: 0x6AB6, //CJK UNIFIED IDEOGRAPH
+ 0xEFE4: 0x6AB7, //CJK UNIFIED IDEOGRAPH
+ 0xEFE5: 0x6AC7, //CJK UNIFIED IDEOGRAPH
+ 0xEFE6: 0x6AB4, //CJK UNIFIED IDEOGRAPH
+ 0xEFE7: 0x6AAD, //CJK UNIFIED IDEOGRAPH
+ 0xEFE8: 0x6B5E, //CJK UNIFIED IDEOGRAPH
+ 0xEFE9: 0x6BC9, //CJK UNIFIED IDEOGRAPH
+ 0xEFEA: 0x6C0B, //CJK UNIFIED IDEOGRAPH
+ 0xEFEB: 0x7007, //CJK UNIFIED IDEOGRAPH
+ 0xEFEC: 0x700C, //CJK UNIFIED IDEOGRAPH
+ 0xEFED: 0x700D, //CJK UNIFIED IDEOGRAPH
+ 0xEFEE: 0x7001, //CJK UNIFIED IDEOGRAPH
+ 0xEFEF: 0x7005, //CJK UNIFIED IDEOGRAPH
+ 0xEFF0: 0x7014, //CJK UNIFIED IDEOGRAPH
+ 0xEFF1: 0x700E, //CJK UNIFIED IDEOGRAPH
+ 0xEFF2: 0x6FFF, //CJK UNIFIED IDEOGRAPH
+ 0xEFF3: 0x7000, //CJK UNIFIED IDEOGRAPH
+ 0xEFF4: 0x6FFB, //CJK UNIFIED IDEOGRAPH
+ 0xEFF5: 0x7026, //CJK UNIFIED IDEOGRAPH
+ 0xEFF6: 0x6FFC, //CJK UNIFIED IDEOGRAPH
+ 0xEFF7: 0x6FF7, //CJK UNIFIED IDEOGRAPH
+ 0xEFF8: 0x700A, //CJK UNIFIED IDEOGRAPH
+ 0xEFF9: 0x7201, //CJK UNIFIED IDEOGRAPH
+ 0xEFFA: 0x71FF, //CJK UNIFIED IDEOGRAPH
+ 0xEFFB: 0x71F9, //CJK UNIFIED IDEOGRAPH
+ 0xEFFC: 0x7203, //CJK UNIFIED IDEOGRAPH
+ 0xEFFD: 0x71FD, //CJK UNIFIED IDEOGRAPH
+ 0xEFFE: 0x7376, //CJK UNIFIED IDEOGRAPH
+ 0xF040: 0x74B8, //CJK UNIFIED IDEOGRAPH
+ 0xF041: 0x74C0, //CJK UNIFIED IDEOGRAPH
+ 0xF042: 0x74B5, //CJK UNIFIED IDEOGRAPH
+ 0xF043: 0x74C1, //CJK UNIFIED IDEOGRAPH
+ 0xF044: 0x74BE, //CJK UNIFIED IDEOGRAPH
+ 0xF045: 0x74B6, //CJK UNIFIED IDEOGRAPH
+ 0xF046: 0x74BB, //CJK UNIFIED IDEOGRAPH
+ 0xF047: 0x74C2, //CJK UNIFIED IDEOGRAPH
+ 0xF048: 0x7514, //CJK UNIFIED IDEOGRAPH
+ 0xF049: 0x7513, //CJK UNIFIED IDEOGRAPH
+ 0xF04A: 0x765C, //CJK UNIFIED IDEOGRAPH
+ 0xF04B: 0x7664, //CJK UNIFIED IDEOGRAPH
+ 0xF04C: 0x7659, //CJK UNIFIED IDEOGRAPH
+ 0xF04D: 0x7650, //CJK UNIFIED IDEOGRAPH
+ 0xF04E: 0x7653, //CJK UNIFIED IDEOGRAPH
+ 0xF04F: 0x7657, //CJK UNIFIED IDEOGRAPH
+ 0xF050: 0x765A, //CJK UNIFIED IDEOGRAPH
+ 0xF051: 0x76A6, //CJK UNIFIED IDEOGRAPH
+ 0xF052: 0x76BD, //CJK UNIFIED IDEOGRAPH
+ 0xF053: 0x76EC, //CJK UNIFIED IDEOGRAPH
+ 0xF054: 0x77C2, //CJK UNIFIED IDEOGRAPH
+ 0xF055: 0x77BA, //CJK UNIFIED IDEOGRAPH
+ 0xF056: 0x78FF, //CJK UNIFIED IDEOGRAPH
+ 0xF057: 0x790C, //CJK UNIFIED IDEOGRAPH
+ 0xF058: 0x7913, //CJK UNIFIED IDEOGRAPH
+ 0xF059: 0x7914, //CJK UNIFIED IDEOGRAPH
+ 0xF05A: 0x7909, //CJK UNIFIED IDEOGRAPH
+ 0xF05B: 0x7910, //CJK UNIFIED IDEOGRAPH
+ 0xF05C: 0x7912, //CJK UNIFIED IDEOGRAPH
+ 0xF05D: 0x7911, //CJK UNIFIED IDEOGRAPH
+ 0xF05E: 0x79AD, //CJK UNIFIED IDEOGRAPH
+ 0xF05F: 0x79AC, //CJK UNIFIED IDEOGRAPH
+ 0xF060: 0x7A5F, //CJK UNIFIED IDEOGRAPH
+ 0xF061: 0x7C1C, //CJK UNIFIED IDEOGRAPH
+ 0xF062: 0x7C29, //CJK UNIFIED IDEOGRAPH
+ 0xF063: 0x7C19, //CJK UNIFIED IDEOGRAPH
+ 0xF064: 0x7C20, //CJK UNIFIED IDEOGRAPH
+ 0xF065: 0x7C1F, //CJK UNIFIED IDEOGRAPH
+ 0xF066: 0x7C2D, //CJK UNIFIED IDEOGRAPH
+ 0xF067: 0x7C1D, //CJK UNIFIED IDEOGRAPH
+ 0xF068: 0x7C26, //CJK UNIFIED IDEOGRAPH
+ 0xF069: 0x7C28, //CJK UNIFIED IDEOGRAPH
+ 0xF06A: 0x7C22, //CJK UNIFIED IDEOGRAPH
+ 0xF06B: 0x7C25, //CJK UNIFIED IDEOGRAPH
+ 0xF06C: 0x7C30, //CJK UNIFIED IDEOGRAPH
+ 0xF06D: 0x7E5C, //CJK UNIFIED IDEOGRAPH
+ 0xF06E: 0x7E50, //CJK UNIFIED IDEOGRAPH
+ 0xF06F: 0x7E56, //CJK UNIFIED IDEOGRAPH
+ 0xF070: 0x7E63, //CJK UNIFIED IDEOGRAPH
+ 0xF071: 0x7E58, //CJK UNIFIED IDEOGRAPH
+ 0xF072: 0x7E62, //CJK UNIFIED IDEOGRAPH
+ 0xF073: 0x7E5F, //CJK UNIFIED IDEOGRAPH
+ 0xF074: 0x7E51, //CJK UNIFIED IDEOGRAPH
+ 0xF075: 0x7E60, //CJK UNIFIED IDEOGRAPH
+ 0xF076: 0x7E57, //CJK UNIFIED IDEOGRAPH
+ 0xF077: 0x7E53, //CJK UNIFIED IDEOGRAPH
+ 0xF078: 0x7FB5, //CJK UNIFIED IDEOGRAPH
+ 0xF079: 0x7FB3, //CJK UNIFIED IDEOGRAPH
+ 0xF07A: 0x7FF7, //CJK UNIFIED IDEOGRAPH
+ 0xF07B: 0x7FF8, //CJK UNIFIED IDEOGRAPH
+ 0xF07C: 0x8075, //CJK UNIFIED IDEOGRAPH
+ 0xF07D: 0x81D1, //CJK UNIFIED IDEOGRAPH
+ 0xF07E: 0x81D2, //CJK UNIFIED IDEOGRAPH
+ 0xF0A1: 0x81D0, //CJK UNIFIED IDEOGRAPH
+ 0xF0A2: 0x825F, //CJK UNIFIED IDEOGRAPH
+ 0xF0A3: 0x825E, //CJK UNIFIED IDEOGRAPH
+ 0xF0A4: 0x85B4, //CJK UNIFIED IDEOGRAPH
+ 0xF0A5: 0x85C6, //CJK UNIFIED IDEOGRAPH
+ 0xF0A6: 0x85C0, //CJK UNIFIED IDEOGRAPH
+ 0xF0A7: 0x85C3, //CJK UNIFIED IDEOGRAPH
+ 0xF0A8: 0x85C2, //CJK UNIFIED IDEOGRAPH
+ 0xF0A9: 0x85B3, //CJK UNIFIED IDEOGRAPH
+ 0xF0AA: 0x85B5, //CJK UNIFIED IDEOGRAPH
+ 0xF0AB: 0x85BD, //CJK UNIFIED IDEOGRAPH
+ 0xF0AC: 0x85C7, //CJK UNIFIED IDEOGRAPH
+ 0xF0AD: 0x85C4, //CJK UNIFIED IDEOGRAPH
+ 0xF0AE: 0x85BF, //CJK UNIFIED IDEOGRAPH
+ 0xF0AF: 0x85CB, //CJK UNIFIED IDEOGRAPH
+ 0xF0B0: 0x85CE, //CJK UNIFIED IDEOGRAPH
+ 0xF0B1: 0x85C8, //CJK UNIFIED IDEOGRAPH
+ 0xF0B2: 0x85C5, //CJK UNIFIED IDEOGRAPH
+ 0xF0B3: 0x85B1, //CJK UNIFIED IDEOGRAPH
+ 0xF0B4: 0x85B6, //CJK UNIFIED IDEOGRAPH
+ 0xF0B5: 0x85D2, //CJK UNIFIED IDEOGRAPH
+ 0xF0B6: 0x8624, //CJK UNIFIED IDEOGRAPH
+ 0xF0B7: 0x85B8, //CJK UNIFIED IDEOGRAPH
+ 0xF0B8: 0x85B7, //CJK UNIFIED IDEOGRAPH
+ 0xF0B9: 0x85BE, //CJK UNIFIED IDEOGRAPH
+ 0xF0BA: 0x8669, //CJK UNIFIED IDEOGRAPH
+ 0xF0BB: 0x87E7, //CJK UNIFIED IDEOGRAPH
+ 0xF0BC: 0x87E6, //CJK UNIFIED IDEOGRAPH
+ 0xF0BD: 0x87E2, //CJK UNIFIED IDEOGRAPH
+ 0xF0BE: 0x87DB, //CJK UNIFIED IDEOGRAPH
+ 0xF0BF: 0x87EB, //CJK UNIFIED IDEOGRAPH
+ 0xF0C0: 0x87EA, //CJK UNIFIED IDEOGRAPH
+ 0xF0C1: 0x87E5, //CJK UNIFIED IDEOGRAPH
+ 0xF0C2: 0x87DF, //CJK UNIFIED IDEOGRAPH
+ 0xF0C3: 0x87F3, //CJK UNIFIED IDEOGRAPH
+ 0xF0C4: 0x87E4, //CJK UNIFIED IDEOGRAPH
+ 0xF0C5: 0x87D4, //CJK UNIFIED IDEOGRAPH
+ 0xF0C6: 0x87DC, //CJK UNIFIED IDEOGRAPH
+ 0xF0C7: 0x87D3, //CJK UNIFIED IDEOGRAPH
+ 0xF0C8: 0x87ED, //CJK UNIFIED IDEOGRAPH
+ 0xF0C9: 0x87D8, //CJK UNIFIED IDEOGRAPH
+ 0xF0CA: 0x87E3, //CJK UNIFIED IDEOGRAPH
+ 0xF0CB: 0x87A4, //CJK UNIFIED IDEOGRAPH
+ 0xF0CC: 0x87D7, //CJK UNIFIED IDEOGRAPH
+ 0xF0CD: 0x87D9, //CJK UNIFIED IDEOGRAPH
+ 0xF0CE: 0x8801, //CJK UNIFIED IDEOGRAPH
+ 0xF0CF: 0x87F4, //CJK UNIFIED IDEOGRAPH
+ 0xF0D0: 0x87E8, //CJK UNIFIED IDEOGRAPH
+ 0xF0D1: 0x87DD, //CJK UNIFIED IDEOGRAPH
+ 0xF0D2: 0x8953, //CJK UNIFIED IDEOGRAPH
+ 0xF0D3: 0x894B, //CJK UNIFIED IDEOGRAPH
+ 0xF0D4: 0x894F, //CJK UNIFIED IDEOGRAPH
+ 0xF0D5: 0x894C, //CJK UNIFIED IDEOGRAPH
+ 0xF0D6: 0x8946, //CJK UNIFIED IDEOGRAPH
+ 0xF0D7: 0x8950, //CJK UNIFIED IDEOGRAPH
+ 0xF0D8: 0x8951, //CJK UNIFIED IDEOGRAPH
+ 0xF0D9: 0x8949, //CJK UNIFIED IDEOGRAPH
+ 0xF0DA: 0x8B2A, //CJK UNIFIED IDEOGRAPH
+ 0xF0DB: 0x8B27, //CJK UNIFIED IDEOGRAPH
+ 0xF0DC: 0x8B23, //CJK UNIFIED IDEOGRAPH
+ 0xF0DD: 0x8B33, //CJK UNIFIED IDEOGRAPH
+ 0xF0DE: 0x8B30, //CJK UNIFIED IDEOGRAPH
+ 0xF0DF: 0x8B35, //CJK UNIFIED IDEOGRAPH
+ 0xF0E0: 0x8B47, //CJK UNIFIED IDEOGRAPH
+ 0xF0E1: 0x8B2F, //CJK UNIFIED IDEOGRAPH
+ 0xF0E2: 0x8B3C, //CJK UNIFIED IDEOGRAPH
+ 0xF0E3: 0x8B3E, //CJK UNIFIED IDEOGRAPH
+ 0xF0E4: 0x8B31, //CJK UNIFIED IDEOGRAPH
+ 0xF0E5: 0x8B25, //CJK UNIFIED IDEOGRAPH
+ 0xF0E6: 0x8B37, //CJK UNIFIED IDEOGRAPH
+ 0xF0E7: 0x8B26, //CJK UNIFIED IDEOGRAPH
+ 0xF0E8: 0x8B36, //CJK UNIFIED IDEOGRAPH
+ 0xF0E9: 0x8B2E, //CJK UNIFIED IDEOGRAPH
+ 0xF0EA: 0x8B24, //CJK UNIFIED IDEOGRAPH
+ 0xF0EB: 0x8B3B, //CJK UNIFIED IDEOGRAPH
+ 0xF0EC: 0x8B3D, //CJK UNIFIED IDEOGRAPH
+ 0xF0ED: 0x8B3A, //CJK UNIFIED IDEOGRAPH
+ 0xF0EE: 0x8C42, //CJK UNIFIED IDEOGRAPH
+ 0xF0EF: 0x8C75, //CJK UNIFIED IDEOGRAPH
+ 0xF0F0: 0x8C99, //CJK UNIFIED IDEOGRAPH
+ 0xF0F1: 0x8C98, //CJK UNIFIED IDEOGRAPH
+ 0xF0F2: 0x8C97, //CJK UNIFIED IDEOGRAPH
+ 0xF0F3: 0x8CFE, //CJK UNIFIED IDEOGRAPH
+ 0xF0F4: 0x8D04, //CJK UNIFIED IDEOGRAPH
+ 0xF0F5: 0x8D02, //CJK UNIFIED IDEOGRAPH
+ 0xF0F6: 0x8D00, //CJK UNIFIED IDEOGRAPH
+ 0xF0F7: 0x8E5C, //CJK UNIFIED IDEOGRAPH
+ 0xF0F8: 0x8E62, //CJK UNIFIED IDEOGRAPH
+ 0xF0F9: 0x8E60, //CJK UNIFIED IDEOGRAPH
+ 0xF0FA: 0x8E57, //CJK UNIFIED IDEOGRAPH
+ 0xF0FB: 0x8E56, //CJK UNIFIED IDEOGRAPH
+ 0xF0FC: 0x8E5E, //CJK UNIFIED IDEOGRAPH
+ 0xF0FD: 0x8E65, //CJK UNIFIED IDEOGRAPH
+ 0xF0FE: 0x8E67, //CJK UNIFIED IDEOGRAPH
+ 0xF140: 0x8E5B, //CJK UNIFIED IDEOGRAPH
+ 0xF141: 0x8E5A, //CJK UNIFIED IDEOGRAPH
+ 0xF142: 0x8E61, //CJK UNIFIED IDEOGRAPH
+ 0xF143: 0x8E5D, //CJK UNIFIED IDEOGRAPH
+ 0xF144: 0x8E69, //CJK UNIFIED IDEOGRAPH
+ 0xF145: 0x8E54, //CJK UNIFIED IDEOGRAPH
+ 0xF146: 0x8F46, //CJK UNIFIED IDEOGRAPH
+ 0xF147: 0x8F47, //CJK UNIFIED IDEOGRAPH
+ 0xF148: 0x8F48, //CJK UNIFIED IDEOGRAPH
+ 0xF149: 0x8F4B, //CJK UNIFIED IDEOGRAPH
+ 0xF14A: 0x9128, //CJK UNIFIED IDEOGRAPH
+ 0xF14B: 0x913A, //CJK UNIFIED IDEOGRAPH
+ 0xF14C: 0x913B, //CJK UNIFIED IDEOGRAPH
+ 0xF14D: 0x913E, //CJK UNIFIED IDEOGRAPH
+ 0xF14E: 0x91A8, //CJK UNIFIED IDEOGRAPH
+ 0xF14F: 0x91A5, //CJK UNIFIED IDEOGRAPH
+ 0xF150: 0x91A7, //CJK UNIFIED IDEOGRAPH
+ 0xF151: 0x91AF, //CJK UNIFIED IDEOGRAPH
+ 0xF152: 0x91AA, //CJK UNIFIED IDEOGRAPH
+ 0xF153: 0x93B5, //CJK UNIFIED IDEOGRAPH
+ 0xF154: 0x938C, //CJK UNIFIED IDEOGRAPH
+ 0xF155: 0x9392, //CJK UNIFIED IDEOGRAPH
+ 0xF156: 0x93B7, //CJK UNIFIED IDEOGRAPH
+ 0xF157: 0x939B, //CJK UNIFIED IDEOGRAPH
+ 0xF158: 0x939D, //CJK UNIFIED IDEOGRAPH
+ 0xF159: 0x9389, //CJK UNIFIED IDEOGRAPH
+ 0xF15A: 0x93A7, //CJK UNIFIED IDEOGRAPH
+ 0xF15B: 0x938E, //CJK UNIFIED IDEOGRAPH
+ 0xF15C: 0x93AA, //CJK UNIFIED IDEOGRAPH
+ 0xF15D: 0x939E, //CJK UNIFIED IDEOGRAPH
+ 0xF15E: 0x93A6, //CJK UNIFIED IDEOGRAPH
+ 0xF15F: 0x9395, //CJK UNIFIED IDEOGRAPH
+ 0xF160: 0x9388, //CJK UNIFIED IDEOGRAPH
+ 0xF161: 0x9399, //CJK UNIFIED IDEOGRAPH
+ 0xF162: 0x939F, //CJK UNIFIED IDEOGRAPH
+ 0xF163: 0x938D, //CJK UNIFIED IDEOGRAPH
+ 0xF164: 0x93B1, //CJK UNIFIED IDEOGRAPH
+ 0xF165: 0x9391, //CJK UNIFIED IDEOGRAPH
+ 0xF166: 0x93B2, //CJK UNIFIED IDEOGRAPH
+ 0xF167: 0x93A4, //CJK UNIFIED IDEOGRAPH
+ 0xF168: 0x93A8, //CJK UNIFIED IDEOGRAPH
+ 0xF169: 0x93B4, //CJK UNIFIED IDEOGRAPH
+ 0xF16A: 0x93A3, //CJK UNIFIED IDEOGRAPH
+ 0xF16B: 0x93A5, //CJK UNIFIED IDEOGRAPH
+ 0xF16C: 0x95D2, //CJK UNIFIED IDEOGRAPH
+ 0xF16D: 0x95D3, //CJK UNIFIED IDEOGRAPH
+ 0xF16E: 0x95D1, //CJK UNIFIED IDEOGRAPH
+ 0xF16F: 0x96B3, //CJK UNIFIED IDEOGRAPH
+ 0xF170: 0x96D7, //CJK UNIFIED IDEOGRAPH
+ 0xF171: 0x96DA, //CJK UNIFIED IDEOGRAPH
+ 0xF172: 0x5DC2, //CJK UNIFIED IDEOGRAPH
+ 0xF173: 0x96DF, //CJK UNIFIED IDEOGRAPH
+ 0xF174: 0x96D8, //CJK UNIFIED IDEOGRAPH
+ 0xF175: 0x96DD, //CJK UNIFIED IDEOGRAPH
+ 0xF176: 0x9723, //CJK UNIFIED IDEOGRAPH
+ 0xF177: 0x9722, //CJK UNIFIED IDEOGRAPH
+ 0xF178: 0x9725, //CJK UNIFIED IDEOGRAPH
+ 0xF179: 0x97AC, //CJK UNIFIED IDEOGRAPH
+ 0xF17A: 0x97AE, //CJK UNIFIED IDEOGRAPH
+ 0xF17B: 0x97A8, //CJK UNIFIED IDEOGRAPH
+ 0xF17C: 0x97AB, //CJK UNIFIED IDEOGRAPH
+ 0xF17D: 0x97A4, //CJK UNIFIED IDEOGRAPH
+ 0xF17E: 0x97AA, //CJK UNIFIED IDEOGRAPH
+ 0xF1A1: 0x97A2, //CJK UNIFIED IDEOGRAPH
+ 0xF1A2: 0x97A5, //CJK UNIFIED IDEOGRAPH
+ 0xF1A3: 0x97D7, //CJK UNIFIED IDEOGRAPH
+ 0xF1A4: 0x97D9, //CJK UNIFIED IDEOGRAPH
+ 0xF1A5: 0x97D6, //CJK UNIFIED IDEOGRAPH
+ 0xF1A6: 0x97D8, //CJK UNIFIED IDEOGRAPH
+ 0xF1A7: 0x97FA, //CJK UNIFIED IDEOGRAPH
+ 0xF1A8: 0x9850, //CJK UNIFIED IDEOGRAPH
+ 0xF1A9: 0x9851, //CJK UNIFIED IDEOGRAPH
+ 0xF1AA: 0x9852, //CJK UNIFIED IDEOGRAPH
+ 0xF1AB: 0x98B8, //CJK UNIFIED IDEOGRAPH
+ 0xF1AC: 0x9941, //CJK UNIFIED IDEOGRAPH
+ 0xF1AD: 0x993C, //CJK UNIFIED IDEOGRAPH
+ 0xF1AE: 0x993A, //CJK UNIFIED IDEOGRAPH
+ 0xF1AF: 0x9A0F, //CJK UNIFIED IDEOGRAPH
+ 0xF1B0: 0x9A0B, //CJK UNIFIED IDEOGRAPH
+ 0xF1B1: 0x9A09, //CJK UNIFIED IDEOGRAPH
+ 0xF1B2: 0x9A0D, //CJK UNIFIED IDEOGRAPH
+ 0xF1B3: 0x9A04, //CJK UNIFIED IDEOGRAPH
+ 0xF1B4: 0x9A11, //CJK UNIFIED IDEOGRAPH
+ 0xF1B5: 0x9A0A, //CJK UNIFIED IDEOGRAPH
+ 0xF1B6: 0x9A05, //CJK UNIFIED IDEOGRAPH
+ 0xF1B7: 0x9A07, //CJK UNIFIED IDEOGRAPH
+ 0xF1B8: 0x9A06, //CJK UNIFIED IDEOGRAPH
+ 0xF1B9: 0x9AC0, //CJK UNIFIED IDEOGRAPH
+ 0xF1BA: 0x9ADC, //CJK UNIFIED IDEOGRAPH
+ 0xF1BB: 0x9B08, //CJK UNIFIED IDEOGRAPH
+ 0xF1BC: 0x9B04, //CJK UNIFIED IDEOGRAPH
+ 0xF1BD: 0x9B05, //CJK UNIFIED IDEOGRAPH
+ 0xF1BE: 0x9B29, //CJK UNIFIED IDEOGRAPH
+ 0xF1BF: 0x9B35, //CJK UNIFIED IDEOGRAPH
+ 0xF1C0: 0x9B4A, //CJK UNIFIED IDEOGRAPH
+ 0xF1C1: 0x9B4C, //CJK UNIFIED IDEOGRAPH
+ 0xF1C2: 0x9B4B, //CJK UNIFIED IDEOGRAPH
+ 0xF1C3: 0x9BC7, //CJK UNIFIED IDEOGRAPH
+ 0xF1C4: 0x9BC6, //CJK UNIFIED IDEOGRAPH
+ 0xF1C5: 0x9BC3, //CJK UNIFIED IDEOGRAPH
+ 0xF1C6: 0x9BBF, //CJK UNIFIED IDEOGRAPH
+ 0xF1C7: 0x9BC1, //CJK UNIFIED IDEOGRAPH
+ 0xF1C8: 0x9BB5, //CJK UNIFIED IDEOGRAPH
+ 0xF1C9: 0x9BB8, //CJK UNIFIED IDEOGRAPH
+ 0xF1CA: 0x9BD3, //CJK UNIFIED IDEOGRAPH
+ 0xF1CB: 0x9BB6, //CJK UNIFIED IDEOGRAPH
+ 0xF1CC: 0x9BC4, //CJK UNIFIED IDEOGRAPH
+ 0xF1CD: 0x9BB9, //CJK UNIFIED IDEOGRAPH
+ 0xF1CE: 0x9BBD, //CJK UNIFIED IDEOGRAPH
+ 0xF1CF: 0x9D5C, //CJK UNIFIED IDEOGRAPH
+ 0xF1D0: 0x9D53, //CJK UNIFIED IDEOGRAPH
+ 0xF1D1: 0x9D4F, //CJK UNIFIED IDEOGRAPH
+ 0xF1D2: 0x9D4A, //CJK UNIFIED IDEOGRAPH
+ 0xF1D3: 0x9D5B, //CJK UNIFIED IDEOGRAPH
+ 0xF1D4: 0x9D4B, //CJK UNIFIED IDEOGRAPH
+ 0xF1D5: 0x9D59, //CJK UNIFIED IDEOGRAPH
+ 0xF1D6: 0x9D56, //CJK UNIFIED IDEOGRAPH
+ 0xF1D7: 0x9D4C, //CJK UNIFIED IDEOGRAPH
+ 0xF1D8: 0x9D57, //CJK UNIFIED IDEOGRAPH
+ 0xF1D9: 0x9D52, //CJK UNIFIED IDEOGRAPH
+ 0xF1DA: 0x9D54, //CJK UNIFIED IDEOGRAPH
+ 0xF1DB: 0x9D5F, //CJK UNIFIED IDEOGRAPH
+ 0xF1DC: 0x9D58, //CJK UNIFIED IDEOGRAPH
+ 0xF1DD: 0x9D5A, //CJK UNIFIED IDEOGRAPH
+ 0xF1DE: 0x9E8E, //CJK UNIFIED IDEOGRAPH
+ 0xF1DF: 0x9E8C, //CJK UNIFIED IDEOGRAPH
+ 0xF1E0: 0x9EDF, //CJK UNIFIED IDEOGRAPH
+ 0xF1E1: 0x9F01, //CJK UNIFIED IDEOGRAPH
+ 0xF1E2: 0x9F00, //CJK UNIFIED IDEOGRAPH
+ 0xF1E3: 0x9F16, //CJK UNIFIED IDEOGRAPH
+ 0xF1E4: 0x9F25, //CJK UNIFIED IDEOGRAPH
+ 0xF1E5: 0x9F2B, //CJK UNIFIED IDEOGRAPH
+ 0xF1E6: 0x9F2A, //CJK UNIFIED IDEOGRAPH
+ 0xF1E7: 0x9F29, //CJK UNIFIED IDEOGRAPH
+ 0xF1E8: 0x9F28, //CJK UNIFIED IDEOGRAPH
+ 0xF1E9: 0x9F4C, //CJK UNIFIED IDEOGRAPH
+ 0xF1EA: 0x9F55, //CJK UNIFIED IDEOGRAPH
+ 0xF1EB: 0x5134, //CJK UNIFIED IDEOGRAPH
+ 0xF1EC: 0x5135, //CJK UNIFIED IDEOGRAPH
+ 0xF1ED: 0x5296, //CJK UNIFIED IDEOGRAPH
+ 0xF1EE: 0x52F7, //CJK UNIFIED IDEOGRAPH
+ 0xF1EF: 0x53B4, //CJK UNIFIED IDEOGRAPH
+ 0xF1F0: 0x56AB, //CJK UNIFIED IDEOGRAPH
+ 0xF1F1: 0x56AD, //CJK UNIFIED IDEOGRAPH
+ 0xF1F2: 0x56A6, //CJK UNIFIED IDEOGRAPH
+ 0xF1F3: 0x56A7, //CJK UNIFIED IDEOGRAPH
+ 0xF1F4: 0x56AA, //CJK UNIFIED IDEOGRAPH
+ 0xF1F5: 0x56AC, //CJK UNIFIED IDEOGRAPH
+ 0xF1F6: 0x58DA, //CJK UNIFIED IDEOGRAPH
+ 0xF1F7: 0x58DD, //CJK UNIFIED IDEOGRAPH
+ 0xF1F8: 0x58DB, //CJK UNIFIED IDEOGRAPH
+ 0xF1F9: 0x5912, //CJK UNIFIED IDEOGRAPH
+ 0xF1FA: 0x5B3D, //CJK UNIFIED IDEOGRAPH
+ 0xF1FB: 0x5B3E, //CJK UNIFIED IDEOGRAPH
+ 0xF1FC: 0x5B3F, //CJK UNIFIED IDEOGRAPH
+ 0xF1FD: 0x5DC3, //CJK UNIFIED IDEOGRAPH
+ 0xF1FE: 0x5E70, //CJK UNIFIED IDEOGRAPH
+ 0xF240: 0x5FBF, //CJK UNIFIED IDEOGRAPH
+ 0xF241: 0x61FB, //CJK UNIFIED IDEOGRAPH
+ 0xF242: 0x6507, //CJK UNIFIED IDEOGRAPH
+ 0xF243: 0x6510, //CJK UNIFIED IDEOGRAPH
+ 0xF244: 0x650D, //CJK UNIFIED IDEOGRAPH
+ 0xF245: 0x6509, //CJK UNIFIED IDEOGRAPH
+ 0xF246: 0x650C, //CJK UNIFIED IDEOGRAPH
+ 0xF247: 0x650E, //CJK UNIFIED IDEOGRAPH
+ 0xF248: 0x6584, //CJK UNIFIED IDEOGRAPH
+ 0xF249: 0x65DE, //CJK UNIFIED IDEOGRAPH
+ 0xF24A: 0x65DD, //CJK UNIFIED IDEOGRAPH
+ 0xF24B: 0x66DE, //CJK UNIFIED IDEOGRAPH
+ 0xF24C: 0x6AE7, //CJK UNIFIED IDEOGRAPH
+ 0xF24D: 0x6AE0, //CJK UNIFIED IDEOGRAPH
+ 0xF24E: 0x6ACC, //CJK UNIFIED IDEOGRAPH
+ 0xF24F: 0x6AD1, //CJK UNIFIED IDEOGRAPH
+ 0xF250: 0x6AD9, //CJK UNIFIED IDEOGRAPH
+ 0xF251: 0x6ACB, //CJK UNIFIED IDEOGRAPH
+ 0xF252: 0x6ADF, //CJK UNIFIED IDEOGRAPH
+ 0xF253: 0x6ADC, //CJK UNIFIED IDEOGRAPH
+ 0xF254: 0x6AD0, //CJK UNIFIED IDEOGRAPH
+ 0xF255: 0x6AEB, //CJK UNIFIED IDEOGRAPH
+ 0xF256: 0x6ACF, //CJK UNIFIED IDEOGRAPH
+ 0xF257: 0x6ACD, //CJK UNIFIED IDEOGRAPH
+ 0xF258: 0x6ADE, //CJK UNIFIED IDEOGRAPH
+ 0xF259: 0x6B60, //CJK UNIFIED IDEOGRAPH
+ 0xF25A: 0x6BB0, //CJK UNIFIED IDEOGRAPH
+ 0xF25B: 0x6C0C, //CJK UNIFIED IDEOGRAPH
+ 0xF25C: 0x7019, //CJK UNIFIED IDEOGRAPH
+ 0xF25D: 0x7027, //CJK UNIFIED IDEOGRAPH
+ 0xF25E: 0x7020, //CJK UNIFIED IDEOGRAPH
+ 0xF25F: 0x7016, //CJK UNIFIED IDEOGRAPH
+ 0xF260: 0x702B, //CJK UNIFIED IDEOGRAPH
+ 0xF261: 0x7021, //CJK UNIFIED IDEOGRAPH
+ 0xF262: 0x7022, //CJK UNIFIED IDEOGRAPH
+ 0xF263: 0x7023, //CJK UNIFIED IDEOGRAPH
+ 0xF264: 0x7029, //CJK UNIFIED IDEOGRAPH
+ 0xF265: 0x7017, //CJK UNIFIED IDEOGRAPH
+ 0xF266: 0x7024, //CJK UNIFIED IDEOGRAPH
+ 0xF267: 0x701C, //CJK UNIFIED IDEOGRAPH
+ 0xF268: 0x702A, //CJK UNIFIED IDEOGRAPH
+ 0xF269: 0x720C, //CJK UNIFIED IDEOGRAPH
+ 0xF26A: 0x720A, //CJK UNIFIED IDEOGRAPH
+ 0xF26B: 0x7207, //CJK UNIFIED IDEOGRAPH
+ 0xF26C: 0x7202, //CJK UNIFIED IDEOGRAPH
+ 0xF26D: 0x7205, //CJK UNIFIED IDEOGRAPH
+ 0xF26E: 0x72A5, //CJK UNIFIED IDEOGRAPH
+ 0xF26F: 0x72A6, //CJK UNIFIED IDEOGRAPH
+ 0xF270: 0x72A4, //CJK UNIFIED IDEOGRAPH
+ 0xF271: 0x72A3, //CJK UNIFIED IDEOGRAPH
+ 0xF272: 0x72A1, //CJK UNIFIED IDEOGRAPH
+ 0xF273: 0x74CB, //CJK UNIFIED IDEOGRAPH
+ 0xF274: 0x74C5, //CJK UNIFIED IDEOGRAPH
+ 0xF275: 0x74B7, //CJK UNIFIED IDEOGRAPH
+ 0xF276: 0x74C3, //CJK UNIFIED IDEOGRAPH
+ 0xF277: 0x7516, //CJK UNIFIED IDEOGRAPH
+ 0xF278: 0x7660, //CJK UNIFIED IDEOGRAPH
+ 0xF279: 0x77C9, //CJK UNIFIED IDEOGRAPH
+ 0xF27A: 0x77CA, //CJK UNIFIED IDEOGRAPH
+ 0xF27B: 0x77C4, //CJK UNIFIED IDEOGRAPH
+ 0xF27C: 0x77F1, //CJK UNIFIED IDEOGRAPH
+ 0xF27D: 0x791D, //CJK UNIFIED IDEOGRAPH
+ 0xF27E: 0x791B, //CJK UNIFIED IDEOGRAPH
+ 0xF2A1: 0x7921, //CJK UNIFIED IDEOGRAPH
+ 0xF2A2: 0x791C, //CJK UNIFIED IDEOGRAPH
+ 0xF2A3: 0x7917, //CJK UNIFIED IDEOGRAPH
+ 0xF2A4: 0x791E, //CJK UNIFIED IDEOGRAPH
+ 0xF2A5: 0x79B0, //CJK UNIFIED IDEOGRAPH
+ 0xF2A6: 0x7A67, //CJK UNIFIED IDEOGRAPH
+ 0xF2A7: 0x7A68, //CJK UNIFIED IDEOGRAPH
+ 0xF2A8: 0x7C33, //CJK UNIFIED IDEOGRAPH
+ 0xF2A9: 0x7C3C, //CJK UNIFIED IDEOGRAPH
+ 0xF2AA: 0x7C39, //CJK UNIFIED IDEOGRAPH
+ 0xF2AB: 0x7C2C, //CJK UNIFIED IDEOGRAPH
+ 0xF2AC: 0x7C3B, //CJK UNIFIED IDEOGRAPH
+ 0xF2AD: 0x7CEC, //CJK UNIFIED IDEOGRAPH
+ 0xF2AE: 0x7CEA, //CJK UNIFIED IDEOGRAPH
+ 0xF2AF: 0x7E76, //CJK UNIFIED IDEOGRAPH
+ 0xF2B0: 0x7E75, //CJK UNIFIED IDEOGRAPH
+ 0xF2B1: 0x7E78, //CJK UNIFIED IDEOGRAPH
+ 0xF2B2: 0x7E70, //CJK UNIFIED IDEOGRAPH
+ 0xF2B3: 0x7E77, //CJK UNIFIED IDEOGRAPH
+ 0xF2B4: 0x7E6F, //CJK UNIFIED IDEOGRAPH
+ 0xF2B5: 0x7E7A, //CJK UNIFIED IDEOGRAPH
+ 0xF2B6: 0x7E72, //CJK UNIFIED IDEOGRAPH
+ 0xF2B7: 0x7E74, //CJK UNIFIED IDEOGRAPH
+ 0xF2B8: 0x7E68, //CJK UNIFIED IDEOGRAPH
+ 0xF2B9: 0x7F4B, //CJK UNIFIED IDEOGRAPH
+ 0xF2BA: 0x7F4A, //CJK UNIFIED IDEOGRAPH
+ 0xF2BB: 0x7F83, //CJK UNIFIED IDEOGRAPH
+ 0xF2BC: 0x7F86, //CJK UNIFIED IDEOGRAPH
+ 0xF2BD: 0x7FB7, //CJK UNIFIED IDEOGRAPH
+ 0xF2BE: 0x7FFD, //CJK UNIFIED IDEOGRAPH
+ 0xF2BF: 0x7FFE, //CJK UNIFIED IDEOGRAPH
+ 0xF2C0: 0x8078, //CJK UNIFIED IDEOGRAPH
+ 0xF2C1: 0x81D7, //CJK UNIFIED IDEOGRAPH
+ 0xF2C2: 0x81D5, //CJK UNIFIED IDEOGRAPH
+ 0xF2C3: 0x8264, //CJK UNIFIED IDEOGRAPH
+ 0xF2C4: 0x8261, //CJK UNIFIED IDEOGRAPH
+ 0xF2C5: 0x8263, //CJK UNIFIED IDEOGRAPH
+ 0xF2C6: 0x85EB, //CJK UNIFIED IDEOGRAPH
+ 0xF2C7: 0x85F1, //CJK UNIFIED IDEOGRAPH
+ 0xF2C8: 0x85ED, //CJK UNIFIED IDEOGRAPH
+ 0xF2C9: 0x85D9, //CJK UNIFIED IDEOGRAPH
+ 0xF2CA: 0x85E1, //CJK UNIFIED IDEOGRAPH
+ 0xF2CB: 0x85E8, //CJK UNIFIED IDEOGRAPH
+ 0xF2CC: 0x85DA, //CJK UNIFIED IDEOGRAPH
+ 0xF2CD: 0x85D7, //CJK UNIFIED IDEOGRAPH
+ 0xF2CE: 0x85EC, //CJK UNIFIED IDEOGRAPH
+ 0xF2CF: 0x85F2, //CJK UNIFIED IDEOGRAPH
+ 0xF2D0: 0x85F8, //CJK UNIFIED IDEOGRAPH
+ 0xF2D1: 0x85D8, //CJK UNIFIED IDEOGRAPH
+ 0xF2D2: 0x85DF, //CJK UNIFIED IDEOGRAPH
+ 0xF2D3: 0x85E3, //CJK UNIFIED IDEOGRAPH
+ 0xF2D4: 0x85DC, //CJK UNIFIED IDEOGRAPH
+ 0xF2D5: 0x85D1, //CJK UNIFIED IDEOGRAPH
+ 0xF2D6: 0x85F0, //CJK UNIFIED IDEOGRAPH
+ 0xF2D7: 0x85E6, //CJK UNIFIED IDEOGRAPH
+ 0xF2D8: 0x85EF, //CJK UNIFIED IDEOGRAPH
+ 0xF2D9: 0x85DE, //CJK UNIFIED IDEOGRAPH
+ 0xF2DA: 0x85E2, //CJK UNIFIED IDEOGRAPH
+ 0xF2DB: 0x8800, //CJK UNIFIED IDEOGRAPH
+ 0xF2DC: 0x87FA, //CJK UNIFIED IDEOGRAPH
+ 0xF2DD: 0x8803, //CJK UNIFIED IDEOGRAPH
+ 0xF2DE: 0x87F6, //CJK UNIFIED IDEOGRAPH
+ 0xF2DF: 0x87F7, //CJK UNIFIED IDEOGRAPH
+ 0xF2E0: 0x8809, //CJK UNIFIED IDEOGRAPH
+ 0xF2E1: 0x880C, //CJK UNIFIED IDEOGRAPH
+ 0xF2E2: 0x880B, //CJK UNIFIED IDEOGRAPH
+ 0xF2E3: 0x8806, //CJK UNIFIED IDEOGRAPH
+ 0xF2E4: 0x87FC, //CJK UNIFIED IDEOGRAPH
+ 0xF2E5: 0x8808, //CJK UNIFIED IDEOGRAPH
+ 0xF2E6: 0x87FF, //CJK UNIFIED IDEOGRAPH
+ 0xF2E7: 0x880A, //CJK UNIFIED IDEOGRAPH
+ 0xF2E8: 0x8802, //CJK UNIFIED IDEOGRAPH
+ 0xF2E9: 0x8962, //CJK UNIFIED IDEOGRAPH
+ 0xF2EA: 0x895A, //CJK UNIFIED IDEOGRAPH
+ 0xF2EB: 0x895B, //CJK UNIFIED IDEOGRAPH
+ 0xF2EC: 0x8957, //CJK UNIFIED IDEOGRAPH
+ 0xF2ED: 0x8961, //CJK UNIFIED IDEOGRAPH
+ 0xF2EE: 0x895C, //CJK UNIFIED IDEOGRAPH
+ 0xF2EF: 0x8958, //CJK UNIFIED IDEOGRAPH
+ 0xF2F0: 0x895D, //CJK UNIFIED IDEOGRAPH
+ 0xF2F1: 0x8959, //CJK UNIFIED IDEOGRAPH
+ 0xF2F2: 0x8988, //CJK UNIFIED IDEOGRAPH
+ 0xF2F3: 0x89B7, //CJK UNIFIED IDEOGRAPH
+ 0xF2F4: 0x89B6, //CJK UNIFIED IDEOGRAPH
+ 0xF2F5: 0x89F6, //CJK UNIFIED IDEOGRAPH
+ 0xF2F6: 0x8B50, //CJK UNIFIED IDEOGRAPH
+ 0xF2F7: 0x8B48, //CJK UNIFIED IDEOGRAPH
+ 0xF2F8: 0x8B4A, //CJK UNIFIED IDEOGRAPH
+ 0xF2F9: 0x8B40, //CJK UNIFIED IDEOGRAPH
+ 0xF2FA: 0x8B53, //CJK UNIFIED IDEOGRAPH
+ 0xF2FB: 0x8B56, //CJK UNIFIED IDEOGRAPH
+ 0xF2FC: 0x8B54, //CJK UNIFIED IDEOGRAPH
+ 0xF2FD: 0x8B4B, //CJK UNIFIED IDEOGRAPH
+ 0xF2FE: 0x8B55, //CJK UNIFIED IDEOGRAPH
+ 0xF340: 0x8B51, //CJK UNIFIED IDEOGRAPH
+ 0xF341: 0x8B42, //CJK UNIFIED IDEOGRAPH
+ 0xF342: 0x8B52, //CJK UNIFIED IDEOGRAPH
+ 0xF343: 0x8B57, //CJK UNIFIED IDEOGRAPH
+ 0xF344: 0x8C43, //CJK UNIFIED IDEOGRAPH
+ 0xF345: 0x8C77, //CJK UNIFIED IDEOGRAPH
+ 0xF346: 0x8C76, //CJK UNIFIED IDEOGRAPH
+ 0xF347: 0x8C9A, //CJK UNIFIED IDEOGRAPH
+ 0xF348: 0x8D06, //CJK UNIFIED IDEOGRAPH
+ 0xF349: 0x8D07, //CJK UNIFIED IDEOGRAPH
+ 0xF34A: 0x8D09, //CJK UNIFIED IDEOGRAPH
+ 0xF34B: 0x8DAC, //CJK UNIFIED IDEOGRAPH
+ 0xF34C: 0x8DAA, //CJK UNIFIED IDEOGRAPH
+ 0xF34D: 0x8DAD, //CJK UNIFIED IDEOGRAPH
+ 0xF34E: 0x8DAB, //CJK UNIFIED IDEOGRAPH
+ 0xF34F: 0x8E6D, //CJK UNIFIED IDEOGRAPH
+ 0xF350: 0x8E78, //CJK UNIFIED IDEOGRAPH
+ 0xF351: 0x8E73, //CJK UNIFIED IDEOGRAPH
+ 0xF352: 0x8E6A, //CJK UNIFIED IDEOGRAPH
+ 0xF353: 0x8E6F, //CJK UNIFIED IDEOGRAPH
+ 0xF354: 0x8E7B, //CJK UNIFIED IDEOGRAPH
+ 0xF355: 0x8EC2, //CJK UNIFIED IDEOGRAPH
+ 0xF356: 0x8F52, //CJK UNIFIED IDEOGRAPH
+ 0xF357: 0x8F51, //CJK UNIFIED IDEOGRAPH
+ 0xF358: 0x8F4F, //CJK UNIFIED IDEOGRAPH
+ 0xF359: 0x8F50, //CJK UNIFIED IDEOGRAPH
+ 0xF35A: 0x8F53, //CJK UNIFIED IDEOGRAPH
+ 0xF35B: 0x8FB4, //CJK UNIFIED IDEOGRAPH
+ 0xF35C: 0x9140, //CJK UNIFIED IDEOGRAPH
+ 0xF35D: 0x913F, //CJK UNIFIED IDEOGRAPH
+ 0xF35E: 0x91B0, //CJK UNIFIED IDEOGRAPH
+ 0xF35F: 0x91AD, //CJK UNIFIED IDEOGRAPH
+ 0xF360: 0x93DE, //CJK UNIFIED IDEOGRAPH
+ 0xF361: 0x93C7, //CJK UNIFIED IDEOGRAPH
+ 0xF362: 0x93CF, //CJK UNIFIED IDEOGRAPH
+ 0xF363: 0x93C2, //CJK UNIFIED IDEOGRAPH
+ 0xF364: 0x93DA, //CJK UNIFIED IDEOGRAPH
+ 0xF365: 0x93D0, //CJK UNIFIED IDEOGRAPH
+ 0xF366: 0x93F9, //CJK UNIFIED IDEOGRAPH
+ 0xF367: 0x93EC, //CJK UNIFIED IDEOGRAPH
+ 0xF368: 0x93CC, //CJK UNIFIED IDEOGRAPH
+ 0xF369: 0x93D9, //CJK UNIFIED IDEOGRAPH
+ 0xF36A: 0x93A9, //CJK UNIFIED IDEOGRAPH
+ 0xF36B: 0x93E6, //CJK UNIFIED IDEOGRAPH
+ 0xF36C: 0x93CA, //CJK UNIFIED IDEOGRAPH
+ 0xF36D: 0x93D4, //CJK UNIFIED IDEOGRAPH
+ 0xF36E: 0x93EE, //CJK UNIFIED IDEOGRAPH
+ 0xF36F: 0x93E3, //CJK UNIFIED IDEOGRAPH
+ 0xF370: 0x93D5, //CJK UNIFIED IDEOGRAPH
+ 0xF371: 0x93C4, //CJK UNIFIED IDEOGRAPH
+ 0xF372: 0x93CE, //CJK UNIFIED IDEOGRAPH
+ 0xF373: 0x93C0, //CJK UNIFIED IDEOGRAPH
+ 0xF374: 0x93D2, //CJK UNIFIED IDEOGRAPH
+ 0xF375: 0x93E7, //CJK UNIFIED IDEOGRAPH
+ 0xF376: 0x957D, //CJK UNIFIED IDEOGRAPH
+ 0xF377: 0x95DA, //CJK UNIFIED IDEOGRAPH
+ 0xF378: 0x95DB, //CJK UNIFIED IDEOGRAPH
+ 0xF379: 0x96E1, //CJK UNIFIED IDEOGRAPH
+ 0xF37A: 0x9729, //CJK UNIFIED IDEOGRAPH
+ 0xF37B: 0x972B, //CJK UNIFIED IDEOGRAPH
+ 0xF37C: 0x972C, //CJK UNIFIED IDEOGRAPH
+ 0xF37D: 0x9728, //CJK UNIFIED IDEOGRAPH
+ 0xF37E: 0x9726, //CJK UNIFIED IDEOGRAPH
+ 0xF3A1: 0x97B3, //CJK UNIFIED IDEOGRAPH
+ 0xF3A2: 0x97B7, //CJK UNIFIED IDEOGRAPH
+ 0xF3A3: 0x97B6, //CJK UNIFIED IDEOGRAPH
+ 0xF3A4: 0x97DD, //CJK UNIFIED IDEOGRAPH
+ 0xF3A5: 0x97DE, //CJK UNIFIED IDEOGRAPH
+ 0xF3A6: 0x97DF, //CJK UNIFIED IDEOGRAPH
+ 0xF3A7: 0x985C, //CJK UNIFIED IDEOGRAPH
+ 0xF3A8: 0x9859, //CJK UNIFIED IDEOGRAPH
+ 0xF3A9: 0x985D, //CJK UNIFIED IDEOGRAPH
+ 0xF3AA: 0x9857, //CJK UNIFIED IDEOGRAPH
+ 0xF3AB: 0x98BF, //CJK UNIFIED IDEOGRAPH
+ 0xF3AC: 0x98BD, //CJK UNIFIED IDEOGRAPH
+ 0xF3AD: 0x98BB, //CJK UNIFIED IDEOGRAPH
+ 0xF3AE: 0x98BE, //CJK UNIFIED IDEOGRAPH
+ 0xF3AF: 0x9948, //CJK UNIFIED IDEOGRAPH
+ 0xF3B0: 0x9947, //CJK UNIFIED IDEOGRAPH
+ 0xF3B1: 0x9943, //CJK UNIFIED IDEOGRAPH
+ 0xF3B2: 0x99A6, //CJK UNIFIED IDEOGRAPH
+ 0xF3B3: 0x99A7, //CJK UNIFIED IDEOGRAPH
+ 0xF3B4: 0x9A1A, //CJK UNIFIED IDEOGRAPH
+ 0xF3B5: 0x9A15, //CJK UNIFIED IDEOGRAPH
+ 0xF3B6: 0x9A25, //CJK UNIFIED IDEOGRAPH
+ 0xF3B7: 0x9A1D, //CJK UNIFIED IDEOGRAPH
+ 0xF3B8: 0x9A24, //CJK UNIFIED IDEOGRAPH
+ 0xF3B9: 0x9A1B, //CJK UNIFIED IDEOGRAPH
+ 0xF3BA: 0x9A22, //CJK UNIFIED IDEOGRAPH
+ 0xF3BB: 0x9A20, //CJK UNIFIED IDEOGRAPH
+ 0xF3BC: 0x9A27, //CJK UNIFIED IDEOGRAPH
+ 0xF3BD: 0x9A23, //CJK UNIFIED IDEOGRAPH
+ 0xF3BE: 0x9A1E, //CJK UNIFIED IDEOGRAPH
+ 0xF3BF: 0x9A1C, //CJK UNIFIED IDEOGRAPH
+ 0xF3C0: 0x9A14, //CJK UNIFIED IDEOGRAPH
+ 0xF3C1: 0x9AC2, //CJK UNIFIED IDEOGRAPH
+ 0xF3C2: 0x9B0B, //CJK UNIFIED IDEOGRAPH
+ 0xF3C3: 0x9B0A, //CJK UNIFIED IDEOGRAPH
+ 0xF3C4: 0x9B0E, //CJK UNIFIED IDEOGRAPH
+ 0xF3C5: 0x9B0C, //CJK UNIFIED IDEOGRAPH
+ 0xF3C6: 0x9B37, //CJK UNIFIED IDEOGRAPH
+ 0xF3C7: 0x9BEA, //CJK UNIFIED IDEOGRAPH
+ 0xF3C8: 0x9BEB, //CJK UNIFIED IDEOGRAPH
+ 0xF3C9: 0x9BE0, //CJK UNIFIED IDEOGRAPH
+ 0xF3CA: 0x9BDE, //CJK UNIFIED IDEOGRAPH
+ 0xF3CB: 0x9BE4, //CJK UNIFIED IDEOGRAPH
+ 0xF3CC: 0x9BE6, //CJK UNIFIED IDEOGRAPH
+ 0xF3CD: 0x9BE2, //CJK UNIFIED IDEOGRAPH
+ 0xF3CE: 0x9BF0, //CJK UNIFIED IDEOGRAPH
+ 0xF3CF: 0x9BD4, //CJK UNIFIED IDEOGRAPH
+ 0xF3D0: 0x9BD7, //CJK UNIFIED IDEOGRAPH
+ 0xF3D1: 0x9BEC, //CJK UNIFIED IDEOGRAPH
+ 0xF3D2: 0x9BDC, //CJK UNIFIED IDEOGRAPH
+ 0xF3D3: 0x9BD9, //CJK UNIFIED IDEOGRAPH
+ 0xF3D4: 0x9BE5, //CJK UNIFIED IDEOGRAPH
+ 0xF3D5: 0x9BD5, //CJK UNIFIED IDEOGRAPH
+ 0xF3D6: 0x9BE1, //CJK UNIFIED IDEOGRAPH
+ 0xF3D7: 0x9BDA, //CJK UNIFIED IDEOGRAPH
+ 0xF3D8: 0x9D77, //CJK UNIFIED IDEOGRAPH
+ 0xF3D9: 0x9D81, //CJK UNIFIED IDEOGRAPH
+ 0xF3DA: 0x9D8A, //CJK UNIFIED IDEOGRAPH
+ 0xF3DB: 0x9D84, //CJK UNIFIED IDEOGRAPH
+ 0xF3DC: 0x9D88, //CJK UNIFIED IDEOGRAPH
+ 0xF3DD: 0x9D71, //CJK UNIFIED IDEOGRAPH
+ 0xF3DE: 0x9D80, //CJK UNIFIED IDEOGRAPH
+ 0xF3DF: 0x9D78, //CJK UNIFIED IDEOGRAPH
+ 0xF3E0: 0x9D86, //CJK UNIFIED IDEOGRAPH
+ 0xF3E1: 0x9D8B, //CJK UNIFIED IDEOGRAPH
+ 0xF3E2: 0x9D8C, //CJK UNIFIED IDEOGRAPH
+ 0xF3E3: 0x9D7D, //CJK UNIFIED IDEOGRAPH
+ 0xF3E4: 0x9D6B, //CJK UNIFIED IDEOGRAPH
+ 0xF3E5: 0x9D74, //CJK UNIFIED IDEOGRAPH
+ 0xF3E6: 0x9D75, //CJK UNIFIED IDEOGRAPH
+ 0xF3E7: 0x9D70, //CJK UNIFIED IDEOGRAPH
+ 0xF3E8: 0x9D69, //CJK UNIFIED IDEOGRAPH
+ 0xF3E9: 0x9D85, //CJK UNIFIED IDEOGRAPH
+ 0xF3EA: 0x9D73, //CJK UNIFIED IDEOGRAPH
+ 0xF3EB: 0x9D7B, //CJK UNIFIED IDEOGRAPH
+ 0xF3EC: 0x9D82, //CJK UNIFIED IDEOGRAPH
+ 0xF3ED: 0x9D6F, //CJK UNIFIED IDEOGRAPH
+ 0xF3EE: 0x9D79, //CJK UNIFIED IDEOGRAPH
+ 0xF3EF: 0x9D7F, //CJK UNIFIED IDEOGRAPH
+ 0xF3F0: 0x9D87, //CJK UNIFIED IDEOGRAPH
+ 0xF3F1: 0x9D68, //CJK UNIFIED IDEOGRAPH
+ 0xF3F2: 0x9E94, //CJK UNIFIED IDEOGRAPH
+ 0xF3F3: 0x9E91, //CJK UNIFIED IDEOGRAPH
+ 0xF3F4: 0x9EC0, //CJK UNIFIED IDEOGRAPH
+ 0xF3F5: 0x9EFC, //CJK UNIFIED IDEOGRAPH
+ 0xF3F6: 0x9F2D, //CJK UNIFIED IDEOGRAPH
+ 0xF3F7: 0x9F40, //CJK UNIFIED IDEOGRAPH
+ 0xF3F8: 0x9F41, //CJK UNIFIED IDEOGRAPH
+ 0xF3F9: 0x9F4D, //CJK UNIFIED IDEOGRAPH
+ 0xF3FA: 0x9F56, //CJK UNIFIED IDEOGRAPH
+ 0xF3FB: 0x9F57, //CJK UNIFIED IDEOGRAPH
+ 0xF3FC: 0x9F58, //CJK UNIFIED IDEOGRAPH
+ 0xF3FD: 0x5337, //CJK UNIFIED IDEOGRAPH
+ 0xF3FE: 0x56B2, //CJK UNIFIED IDEOGRAPH
+ 0xF440: 0x56B5, //CJK UNIFIED IDEOGRAPH
+ 0xF441: 0x56B3, //CJK UNIFIED IDEOGRAPH
+ 0xF442: 0x58E3, //CJK UNIFIED IDEOGRAPH
+ 0xF443: 0x5B45, //CJK UNIFIED IDEOGRAPH
+ 0xF444: 0x5DC6, //CJK UNIFIED IDEOGRAPH
+ 0xF445: 0x5DC7, //CJK UNIFIED IDEOGRAPH
+ 0xF446: 0x5EEE, //CJK UNIFIED IDEOGRAPH
+ 0xF447: 0x5EEF, //CJK UNIFIED IDEOGRAPH
+ 0xF448: 0x5FC0, //CJK UNIFIED IDEOGRAPH
+ 0xF449: 0x5FC1, //CJK UNIFIED IDEOGRAPH
+ 0xF44A: 0x61F9, //CJK UNIFIED IDEOGRAPH
+ 0xF44B: 0x6517, //CJK UNIFIED IDEOGRAPH
+ 0xF44C: 0x6516, //CJK UNIFIED IDEOGRAPH
+ 0xF44D: 0x6515, //CJK UNIFIED IDEOGRAPH
+ 0xF44E: 0x6513, //CJK UNIFIED IDEOGRAPH
+ 0xF44F: 0x65DF, //CJK UNIFIED IDEOGRAPH
+ 0xF450: 0x66E8, //CJK UNIFIED IDEOGRAPH
+ 0xF451: 0x66E3, //CJK UNIFIED IDEOGRAPH
+ 0xF452: 0x66E4, //CJK UNIFIED IDEOGRAPH
+ 0xF453: 0x6AF3, //CJK UNIFIED IDEOGRAPH
+ 0xF454: 0x6AF0, //CJK UNIFIED IDEOGRAPH
+ 0xF455: 0x6AEA, //CJK UNIFIED IDEOGRAPH
+ 0xF456: 0x6AE8, //CJK UNIFIED IDEOGRAPH
+ 0xF457: 0x6AF9, //CJK UNIFIED IDEOGRAPH
+ 0xF458: 0x6AF1, //CJK UNIFIED IDEOGRAPH
+ 0xF459: 0x6AEE, //CJK UNIFIED IDEOGRAPH
+ 0xF45A: 0x6AEF, //CJK UNIFIED IDEOGRAPH
+ 0xF45B: 0x703C, //CJK UNIFIED IDEOGRAPH
+ 0xF45C: 0x7035, //CJK UNIFIED IDEOGRAPH
+ 0xF45D: 0x702F, //CJK UNIFIED IDEOGRAPH
+ 0xF45E: 0x7037, //CJK UNIFIED IDEOGRAPH
+ 0xF45F: 0x7034, //CJK UNIFIED IDEOGRAPH
+ 0xF460: 0x7031, //CJK UNIFIED IDEOGRAPH
+ 0xF461: 0x7042, //CJK UNIFIED IDEOGRAPH
+ 0xF462: 0x7038, //CJK UNIFIED IDEOGRAPH
+ 0xF463: 0x703F, //CJK UNIFIED IDEOGRAPH
+ 0xF464: 0x703A, //CJK UNIFIED IDEOGRAPH
+ 0xF465: 0x7039, //CJK UNIFIED IDEOGRAPH
+ 0xF466: 0x7040, //CJK UNIFIED IDEOGRAPH
+ 0xF467: 0x703B, //CJK UNIFIED IDEOGRAPH
+ 0xF468: 0x7033, //CJK UNIFIED IDEOGRAPH
+ 0xF469: 0x7041, //CJK UNIFIED IDEOGRAPH
+ 0xF46A: 0x7213, //CJK UNIFIED IDEOGRAPH
+ 0xF46B: 0x7214, //CJK UNIFIED IDEOGRAPH
+ 0xF46C: 0x72A8, //CJK UNIFIED IDEOGRAPH
+ 0xF46D: 0x737D, //CJK UNIFIED IDEOGRAPH
+ 0xF46E: 0x737C, //CJK UNIFIED IDEOGRAPH
+ 0xF46F: 0x74BA, //CJK UNIFIED IDEOGRAPH
+ 0xF470: 0x76AB, //CJK UNIFIED IDEOGRAPH
+ 0xF471: 0x76AA, //CJK UNIFIED IDEOGRAPH
+ 0xF472: 0x76BE, //CJK UNIFIED IDEOGRAPH
+ 0xF473: 0x76ED, //CJK UNIFIED IDEOGRAPH
+ 0xF474: 0x77CC, //CJK UNIFIED IDEOGRAPH
+ 0xF475: 0x77CE, //CJK UNIFIED IDEOGRAPH
+ 0xF476: 0x77CF, //CJK UNIFIED IDEOGRAPH
+ 0xF477: 0x77CD, //CJK UNIFIED IDEOGRAPH
+ 0xF478: 0x77F2, //CJK UNIFIED IDEOGRAPH
+ 0xF479: 0x7925, //CJK UNIFIED IDEOGRAPH
+ 0xF47A: 0x7923, //CJK UNIFIED IDEOGRAPH
+ 0xF47B: 0x7927, //CJK UNIFIED IDEOGRAPH
+ 0xF47C: 0x7928, //CJK UNIFIED IDEOGRAPH
+ 0xF47D: 0x7924, //CJK UNIFIED IDEOGRAPH
+ 0xF47E: 0x7929, //CJK UNIFIED IDEOGRAPH
+ 0xF4A1: 0x79B2, //CJK UNIFIED IDEOGRAPH
+ 0xF4A2: 0x7A6E, //CJK UNIFIED IDEOGRAPH
+ 0xF4A3: 0x7A6C, //CJK UNIFIED IDEOGRAPH
+ 0xF4A4: 0x7A6D, //CJK UNIFIED IDEOGRAPH
+ 0xF4A5: 0x7AF7, //CJK UNIFIED IDEOGRAPH
+ 0xF4A6: 0x7C49, //CJK UNIFIED IDEOGRAPH
+ 0xF4A7: 0x7C48, //CJK UNIFIED IDEOGRAPH
+ 0xF4A8: 0x7C4A, //CJK UNIFIED IDEOGRAPH
+ 0xF4A9: 0x7C47, //CJK UNIFIED IDEOGRAPH
+ 0xF4AA: 0x7C45, //CJK UNIFIED IDEOGRAPH
+ 0xF4AB: 0x7CEE, //CJK UNIFIED IDEOGRAPH
+ 0xF4AC: 0x7E7B, //CJK UNIFIED IDEOGRAPH
+ 0xF4AD: 0x7E7E, //CJK UNIFIED IDEOGRAPH
+ 0xF4AE: 0x7E81, //CJK UNIFIED IDEOGRAPH
+ 0xF4AF: 0x7E80, //CJK UNIFIED IDEOGRAPH
+ 0xF4B0: 0x7FBA, //CJK UNIFIED IDEOGRAPH
+ 0xF4B1: 0x7FFF, //CJK UNIFIED IDEOGRAPH
+ 0xF4B2: 0x8079, //CJK UNIFIED IDEOGRAPH
+ 0xF4B3: 0x81DB, //CJK UNIFIED IDEOGRAPH
+ 0xF4B4: 0x81D9, //CJK UNIFIED IDEOGRAPH
+ 0xF4B5: 0x820B, //CJK UNIFIED IDEOGRAPH
+ 0xF4B6: 0x8268, //CJK UNIFIED IDEOGRAPH
+ 0xF4B7: 0x8269, //CJK UNIFIED IDEOGRAPH
+ 0xF4B8: 0x8622, //CJK UNIFIED IDEOGRAPH
+ 0xF4B9: 0x85FF, //CJK UNIFIED IDEOGRAPH
+ 0xF4BA: 0x8601, //CJK UNIFIED IDEOGRAPH
+ 0xF4BB: 0x85FE, //CJK UNIFIED IDEOGRAPH
+ 0xF4BC: 0x861B, //CJK UNIFIED IDEOGRAPH
+ 0xF4BD: 0x8600, //CJK UNIFIED IDEOGRAPH
+ 0xF4BE: 0x85F6, //CJK UNIFIED IDEOGRAPH
+ 0xF4BF: 0x8604, //CJK UNIFIED IDEOGRAPH
+ 0xF4C0: 0x8609, //CJK UNIFIED IDEOGRAPH
+ 0xF4C1: 0x8605, //CJK UNIFIED IDEOGRAPH
+ 0xF4C2: 0x860C, //CJK UNIFIED IDEOGRAPH
+ 0xF4C3: 0x85FD, //CJK UNIFIED IDEOGRAPH
+ 0xF4C4: 0x8819, //CJK UNIFIED IDEOGRAPH
+ 0xF4C5: 0x8810, //CJK UNIFIED IDEOGRAPH
+ 0xF4C6: 0x8811, //CJK UNIFIED IDEOGRAPH
+ 0xF4C7: 0x8817, //CJK UNIFIED IDEOGRAPH
+ 0xF4C8: 0x8813, //CJK UNIFIED IDEOGRAPH
+ 0xF4C9: 0x8816, //CJK UNIFIED IDEOGRAPH
+ 0xF4CA: 0x8963, //CJK UNIFIED IDEOGRAPH
+ 0xF4CB: 0x8966, //CJK UNIFIED IDEOGRAPH
+ 0xF4CC: 0x89B9, //CJK UNIFIED IDEOGRAPH
+ 0xF4CD: 0x89F7, //CJK UNIFIED IDEOGRAPH
+ 0xF4CE: 0x8B60, //CJK UNIFIED IDEOGRAPH
+ 0xF4CF: 0x8B6A, //CJK UNIFIED IDEOGRAPH
+ 0xF4D0: 0x8B5D, //CJK UNIFIED IDEOGRAPH
+ 0xF4D1: 0x8B68, //CJK UNIFIED IDEOGRAPH
+ 0xF4D2: 0x8B63, //CJK UNIFIED IDEOGRAPH
+ 0xF4D3: 0x8B65, //CJK UNIFIED IDEOGRAPH
+ 0xF4D4: 0x8B67, //CJK UNIFIED IDEOGRAPH
+ 0xF4D5: 0x8B6D, //CJK UNIFIED IDEOGRAPH
+ 0xF4D6: 0x8DAE, //CJK UNIFIED IDEOGRAPH
+ 0xF4D7: 0x8E86, //CJK UNIFIED IDEOGRAPH
+ 0xF4D8: 0x8E88, //CJK UNIFIED IDEOGRAPH
+ 0xF4D9: 0x8E84, //CJK UNIFIED IDEOGRAPH
+ 0xF4DA: 0x8F59, //CJK UNIFIED IDEOGRAPH
+ 0xF4DB: 0x8F56, //CJK UNIFIED IDEOGRAPH
+ 0xF4DC: 0x8F57, //CJK UNIFIED IDEOGRAPH
+ 0xF4DD: 0x8F55, //CJK UNIFIED IDEOGRAPH
+ 0xF4DE: 0x8F58, //CJK UNIFIED IDEOGRAPH
+ 0xF4DF: 0x8F5A, //CJK UNIFIED IDEOGRAPH
+ 0xF4E0: 0x908D, //CJK UNIFIED IDEOGRAPH
+ 0xF4E1: 0x9143, //CJK UNIFIED IDEOGRAPH
+ 0xF4E2: 0x9141, //CJK UNIFIED IDEOGRAPH
+ 0xF4E3: 0x91B7, //CJK UNIFIED IDEOGRAPH
+ 0xF4E4: 0x91B5, //CJK UNIFIED IDEOGRAPH
+ 0xF4E5: 0x91B2, //CJK UNIFIED IDEOGRAPH
+ 0xF4E6: 0x91B3, //CJK UNIFIED IDEOGRAPH
+ 0xF4E7: 0x940B, //CJK UNIFIED IDEOGRAPH
+ 0xF4E8: 0x9413, //CJK UNIFIED IDEOGRAPH
+ 0xF4E9: 0x93FB, //CJK UNIFIED IDEOGRAPH
+ 0xF4EA: 0x9420, //CJK UNIFIED IDEOGRAPH
+ 0xF4EB: 0x940F, //CJK UNIFIED IDEOGRAPH
+ 0xF4EC: 0x9414, //CJK UNIFIED IDEOGRAPH
+ 0xF4ED: 0x93FE, //CJK UNIFIED IDEOGRAPH
+ 0xF4EE: 0x9415, //CJK UNIFIED IDEOGRAPH
+ 0xF4EF: 0x9410, //CJK UNIFIED IDEOGRAPH
+ 0xF4F0: 0x9428, //CJK UNIFIED IDEOGRAPH
+ 0xF4F1: 0x9419, //CJK UNIFIED IDEOGRAPH
+ 0xF4F2: 0x940D, //CJK UNIFIED IDEOGRAPH
+ 0xF4F3: 0x93F5, //CJK UNIFIED IDEOGRAPH
+ 0xF4F4: 0x9400, //CJK UNIFIED IDEOGRAPH
+ 0xF4F5: 0x93F7, //CJK UNIFIED IDEOGRAPH
+ 0xF4F6: 0x9407, //CJK UNIFIED IDEOGRAPH
+ 0xF4F7: 0x940E, //CJK UNIFIED IDEOGRAPH
+ 0xF4F8: 0x9416, //CJK UNIFIED IDEOGRAPH
+ 0xF4F9: 0x9412, //CJK UNIFIED IDEOGRAPH
+ 0xF4FA: 0x93FA, //CJK UNIFIED IDEOGRAPH
+ 0xF4FB: 0x9409, //CJK UNIFIED IDEOGRAPH
+ 0xF4FC: 0x93F8, //CJK UNIFIED IDEOGRAPH
+ 0xF4FD: 0x940A, //CJK UNIFIED IDEOGRAPH
+ 0xF4FE: 0x93FF, //CJK UNIFIED IDEOGRAPH
+ 0xF540: 0x93FC, //CJK UNIFIED IDEOGRAPH
+ 0xF541: 0x940C, //CJK UNIFIED IDEOGRAPH
+ 0xF542: 0x93F6, //CJK UNIFIED IDEOGRAPH
+ 0xF543: 0x9411, //CJK UNIFIED IDEOGRAPH
+ 0xF544: 0x9406, //CJK UNIFIED IDEOGRAPH
+ 0xF545: 0x95DE, //CJK UNIFIED IDEOGRAPH
+ 0xF546: 0x95E0, //CJK UNIFIED IDEOGRAPH
+ 0xF547: 0x95DF, //CJK UNIFIED IDEOGRAPH
+ 0xF548: 0x972E, //CJK UNIFIED IDEOGRAPH
+ 0xF549: 0x972F, //CJK UNIFIED IDEOGRAPH
+ 0xF54A: 0x97B9, //CJK UNIFIED IDEOGRAPH
+ 0xF54B: 0x97BB, //CJK UNIFIED IDEOGRAPH
+ 0xF54C: 0x97FD, //CJK UNIFIED IDEOGRAPH
+ 0xF54D: 0x97FE, //CJK UNIFIED IDEOGRAPH
+ 0xF54E: 0x9860, //CJK UNIFIED IDEOGRAPH
+ 0xF54F: 0x9862, //CJK UNIFIED IDEOGRAPH
+ 0xF550: 0x9863, //CJK UNIFIED IDEOGRAPH
+ 0xF551: 0x985F, //CJK UNIFIED IDEOGRAPH
+ 0xF552: 0x98C1, //CJK UNIFIED IDEOGRAPH
+ 0xF553: 0x98C2, //CJK UNIFIED IDEOGRAPH
+ 0xF554: 0x9950, //CJK UNIFIED IDEOGRAPH
+ 0xF555: 0x994E, //CJK UNIFIED IDEOGRAPH
+ 0xF556: 0x9959, //CJK UNIFIED IDEOGRAPH
+ 0xF557: 0x994C, //CJK UNIFIED IDEOGRAPH
+ 0xF558: 0x994B, //CJK UNIFIED IDEOGRAPH
+ 0xF559: 0x9953, //CJK UNIFIED IDEOGRAPH
+ 0xF55A: 0x9A32, //CJK UNIFIED IDEOGRAPH
+ 0xF55B: 0x9A34, //CJK UNIFIED IDEOGRAPH
+ 0xF55C: 0x9A31, //CJK UNIFIED IDEOGRAPH
+ 0xF55D: 0x9A2C, //CJK UNIFIED IDEOGRAPH
+ 0xF55E: 0x9A2A, //CJK UNIFIED IDEOGRAPH
+ 0xF55F: 0x9A36, //CJK UNIFIED IDEOGRAPH
+ 0xF560: 0x9A29, //CJK UNIFIED IDEOGRAPH
+ 0xF561: 0x9A2E, //CJK UNIFIED IDEOGRAPH
+ 0xF562: 0x9A38, //CJK UNIFIED IDEOGRAPH
+ 0xF563: 0x9A2D, //CJK UNIFIED IDEOGRAPH
+ 0xF564: 0x9AC7, //CJK UNIFIED IDEOGRAPH
+ 0xF565: 0x9ACA, //CJK UNIFIED IDEOGRAPH
+ 0xF566: 0x9AC6, //CJK UNIFIED IDEOGRAPH
+ 0xF567: 0x9B10, //CJK UNIFIED IDEOGRAPH
+ 0xF568: 0x9B12, //CJK UNIFIED IDEOGRAPH
+ 0xF569: 0x9B11, //CJK UNIFIED IDEOGRAPH
+ 0xF56A: 0x9C0B, //CJK UNIFIED IDEOGRAPH
+ 0xF56B: 0x9C08, //CJK UNIFIED IDEOGRAPH
+ 0xF56C: 0x9BF7, //CJK UNIFIED IDEOGRAPH
+ 0xF56D: 0x9C05, //CJK UNIFIED IDEOGRAPH
+ 0xF56E: 0x9C12, //CJK UNIFIED IDEOGRAPH
+ 0xF56F: 0x9BF8, //CJK UNIFIED IDEOGRAPH
+ 0xF570: 0x9C40, //CJK UNIFIED IDEOGRAPH
+ 0xF571: 0x9C07, //CJK UNIFIED IDEOGRAPH
+ 0xF572: 0x9C0E, //CJK UNIFIED IDEOGRAPH
+ 0xF573: 0x9C06, //CJK UNIFIED IDEOGRAPH
+ 0xF574: 0x9C17, //CJK UNIFIED IDEOGRAPH
+ 0xF575: 0x9C14, //CJK UNIFIED IDEOGRAPH
+ 0xF576: 0x9C09, //CJK UNIFIED IDEOGRAPH
+ 0xF577: 0x9D9F, //CJK UNIFIED IDEOGRAPH
+ 0xF578: 0x9D99, //CJK UNIFIED IDEOGRAPH
+ 0xF579: 0x9DA4, //CJK UNIFIED IDEOGRAPH
+ 0xF57A: 0x9D9D, //CJK UNIFIED IDEOGRAPH
+ 0xF57B: 0x9D92, //CJK UNIFIED IDEOGRAPH
+ 0xF57C: 0x9D98, //CJK UNIFIED IDEOGRAPH
+ 0xF57D: 0x9D90, //CJK UNIFIED IDEOGRAPH
+ 0xF57E: 0x9D9B, //CJK UNIFIED IDEOGRAPH
+ 0xF5A1: 0x9DA0, //CJK UNIFIED IDEOGRAPH
+ 0xF5A2: 0x9D94, //CJK UNIFIED IDEOGRAPH
+ 0xF5A3: 0x9D9C, //CJK UNIFIED IDEOGRAPH
+ 0xF5A4: 0x9DAA, //CJK UNIFIED IDEOGRAPH
+ 0xF5A5: 0x9D97, //CJK UNIFIED IDEOGRAPH
+ 0xF5A6: 0x9DA1, //CJK UNIFIED IDEOGRAPH
+ 0xF5A7: 0x9D9A, //CJK UNIFIED IDEOGRAPH
+ 0xF5A8: 0x9DA2, //CJK UNIFIED IDEOGRAPH
+ 0xF5A9: 0x9DA8, //CJK UNIFIED IDEOGRAPH
+ 0xF5AA: 0x9D9E, //CJK UNIFIED IDEOGRAPH
+ 0xF5AB: 0x9DA3, //CJK UNIFIED IDEOGRAPH
+ 0xF5AC: 0x9DBF, //CJK UNIFIED IDEOGRAPH
+ 0xF5AD: 0x9DA9, //CJK UNIFIED IDEOGRAPH
+ 0xF5AE: 0x9D96, //CJK UNIFIED IDEOGRAPH
+ 0xF5AF: 0x9DA6, //CJK UNIFIED IDEOGRAPH
+ 0xF5B0: 0x9DA7, //CJK UNIFIED IDEOGRAPH
+ 0xF5B1: 0x9E99, //CJK UNIFIED IDEOGRAPH
+ 0xF5B2: 0x9E9B, //CJK UNIFIED IDEOGRAPH
+ 0xF5B3: 0x9E9A, //CJK UNIFIED IDEOGRAPH
+ 0xF5B4: 0x9EE5, //CJK UNIFIED IDEOGRAPH
+ 0xF5B5: 0x9EE4, //CJK UNIFIED IDEOGRAPH
+ 0xF5B6: 0x9EE7, //CJK UNIFIED IDEOGRAPH
+ 0xF5B7: 0x9EE6, //CJK UNIFIED IDEOGRAPH
+ 0xF5B8: 0x9F30, //CJK UNIFIED IDEOGRAPH
+ 0xF5B9: 0x9F2E, //CJK UNIFIED IDEOGRAPH
+ 0xF5BA: 0x9F5B, //CJK UNIFIED IDEOGRAPH
+ 0xF5BB: 0x9F60, //CJK UNIFIED IDEOGRAPH
+ 0xF5BC: 0x9F5E, //CJK UNIFIED IDEOGRAPH
+ 0xF5BD: 0x9F5D, //CJK UNIFIED IDEOGRAPH
+ 0xF5BE: 0x9F59, //CJK UNIFIED IDEOGRAPH
+ 0xF5BF: 0x9F91, //CJK UNIFIED IDEOGRAPH
+ 0xF5C0: 0x513A, //CJK UNIFIED IDEOGRAPH
+ 0xF5C1: 0x5139, //CJK UNIFIED IDEOGRAPH
+ 0xF5C2: 0x5298, //CJK UNIFIED IDEOGRAPH
+ 0xF5C3: 0x5297, //CJK UNIFIED IDEOGRAPH
+ 0xF5C4: 0x56C3, //CJK UNIFIED IDEOGRAPH
+ 0xF5C5: 0x56BD, //CJK UNIFIED IDEOGRAPH
+ 0xF5C6: 0x56BE, //CJK UNIFIED IDEOGRAPH
+ 0xF5C7: 0x5B48, //CJK UNIFIED IDEOGRAPH
+ 0xF5C8: 0x5B47, //CJK UNIFIED IDEOGRAPH
+ 0xF5C9: 0x5DCB, //CJK UNIFIED IDEOGRAPH
+ 0xF5CA: 0x5DCF, //CJK UNIFIED IDEOGRAPH
+ 0xF5CB: 0x5EF1, //CJK UNIFIED IDEOGRAPH
+ 0xF5CC: 0x61FD, //CJK UNIFIED IDEOGRAPH
+ 0xF5CD: 0x651B, //CJK UNIFIED IDEOGRAPH
+ 0xF5CE: 0x6B02, //CJK UNIFIED IDEOGRAPH
+ 0xF5CF: 0x6AFC, //CJK UNIFIED IDEOGRAPH
+ 0xF5D0: 0x6B03, //CJK UNIFIED IDEOGRAPH
+ 0xF5D1: 0x6AF8, //CJK UNIFIED IDEOGRAPH
+ 0xF5D2: 0x6B00, //CJK UNIFIED IDEOGRAPH
+ 0xF5D3: 0x7043, //CJK UNIFIED IDEOGRAPH
+ 0xF5D4: 0x7044, //CJK UNIFIED IDEOGRAPH
+ 0xF5D5: 0x704A, //CJK UNIFIED IDEOGRAPH
+ 0xF5D6: 0x7048, //CJK UNIFIED IDEOGRAPH
+ 0xF5D7: 0x7049, //CJK UNIFIED IDEOGRAPH
+ 0xF5D8: 0x7045, //CJK UNIFIED IDEOGRAPH
+ 0xF5D9: 0x7046, //CJK UNIFIED IDEOGRAPH
+ 0xF5DA: 0x721D, //CJK UNIFIED IDEOGRAPH
+ 0xF5DB: 0x721A, //CJK UNIFIED IDEOGRAPH
+ 0xF5DC: 0x7219, //CJK UNIFIED IDEOGRAPH
+ 0xF5DD: 0x737E, //CJK UNIFIED IDEOGRAPH
+ 0xF5DE: 0x7517, //CJK UNIFIED IDEOGRAPH
+ 0xF5DF: 0x766A, //CJK UNIFIED IDEOGRAPH
+ 0xF5E0: 0x77D0, //CJK UNIFIED IDEOGRAPH
+ 0xF5E1: 0x792D, //CJK UNIFIED IDEOGRAPH
+ 0xF5E2: 0x7931, //CJK UNIFIED IDEOGRAPH
+ 0xF5E3: 0x792F, //CJK UNIFIED IDEOGRAPH
+ 0xF5E4: 0x7C54, //CJK UNIFIED IDEOGRAPH
+ 0xF5E5: 0x7C53, //CJK UNIFIED IDEOGRAPH
+ 0xF5E6: 0x7CF2, //CJK UNIFIED IDEOGRAPH
+ 0xF5E7: 0x7E8A, //CJK UNIFIED IDEOGRAPH
+ 0xF5E8: 0x7E87, //CJK UNIFIED IDEOGRAPH
+ 0xF5E9: 0x7E88, //CJK UNIFIED IDEOGRAPH
+ 0xF5EA: 0x7E8B, //CJK UNIFIED IDEOGRAPH
+ 0xF5EB: 0x7E86, //CJK UNIFIED IDEOGRAPH
+ 0xF5EC: 0x7E8D, //CJK UNIFIED IDEOGRAPH
+ 0xF5ED: 0x7F4D, //CJK UNIFIED IDEOGRAPH
+ 0xF5EE: 0x7FBB, //CJK UNIFIED IDEOGRAPH
+ 0xF5EF: 0x8030, //CJK UNIFIED IDEOGRAPH
+ 0xF5F0: 0x81DD, //CJK UNIFIED IDEOGRAPH
+ 0xF5F1: 0x8618, //CJK UNIFIED IDEOGRAPH
+ 0xF5F2: 0x862A, //CJK UNIFIED IDEOGRAPH
+ 0xF5F3: 0x8626, //CJK UNIFIED IDEOGRAPH
+ 0xF5F4: 0x861F, //CJK UNIFIED IDEOGRAPH
+ 0xF5F5: 0x8623, //CJK UNIFIED IDEOGRAPH
+ 0xF5F6: 0x861C, //CJK UNIFIED IDEOGRAPH
+ 0xF5F7: 0x8619, //CJK UNIFIED IDEOGRAPH
+ 0xF5F8: 0x8627, //CJK UNIFIED IDEOGRAPH
+ 0xF5F9: 0x862E, //CJK UNIFIED IDEOGRAPH
+ 0xF5FA: 0x8621, //CJK UNIFIED IDEOGRAPH
+ 0xF5FB: 0x8620, //CJK UNIFIED IDEOGRAPH
+ 0xF5FC: 0x8629, //CJK UNIFIED IDEOGRAPH
+ 0xF5FD: 0x861E, //CJK UNIFIED IDEOGRAPH
+ 0xF5FE: 0x8625, //CJK UNIFIED IDEOGRAPH
+ 0xF640: 0x8829, //CJK UNIFIED IDEOGRAPH
+ 0xF641: 0x881D, //CJK UNIFIED IDEOGRAPH
+ 0xF642: 0x881B, //CJK UNIFIED IDEOGRAPH
+ 0xF643: 0x8820, //CJK UNIFIED IDEOGRAPH
+ 0xF644: 0x8824, //CJK UNIFIED IDEOGRAPH
+ 0xF645: 0x881C, //CJK UNIFIED IDEOGRAPH
+ 0xF646: 0x882B, //CJK UNIFIED IDEOGRAPH
+ 0xF647: 0x884A, //CJK UNIFIED IDEOGRAPH
+ 0xF648: 0x896D, //CJK UNIFIED IDEOGRAPH
+ 0xF649: 0x8969, //CJK UNIFIED IDEOGRAPH
+ 0xF64A: 0x896E, //CJK UNIFIED IDEOGRAPH
+ 0xF64B: 0x896B, //CJK UNIFIED IDEOGRAPH
+ 0xF64C: 0x89FA, //CJK UNIFIED IDEOGRAPH
+ 0xF64D: 0x8B79, //CJK UNIFIED IDEOGRAPH
+ 0xF64E: 0x8B78, //CJK UNIFIED IDEOGRAPH
+ 0xF64F: 0x8B45, //CJK UNIFIED IDEOGRAPH
+ 0xF650: 0x8B7A, //CJK UNIFIED IDEOGRAPH
+ 0xF651: 0x8B7B, //CJK UNIFIED IDEOGRAPH
+ 0xF652: 0x8D10, //CJK UNIFIED IDEOGRAPH
+ 0xF653: 0x8D14, //CJK UNIFIED IDEOGRAPH
+ 0xF654: 0x8DAF, //CJK UNIFIED IDEOGRAPH
+ 0xF655: 0x8E8E, //CJK UNIFIED IDEOGRAPH
+ 0xF656: 0x8E8C, //CJK UNIFIED IDEOGRAPH
+ 0xF657: 0x8F5E, //CJK UNIFIED IDEOGRAPH
+ 0xF658: 0x8F5B, //CJK UNIFIED IDEOGRAPH
+ 0xF659: 0x8F5D, //CJK UNIFIED IDEOGRAPH
+ 0xF65A: 0x9146, //CJK UNIFIED IDEOGRAPH
+ 0xF65B: 0x9144, //CJK UNIFIED IDEOGRAPH
+ 0xF65C: 0x9145, //CJK UNIFIED IDEOGRAPH
+ 0xF65D: 0x91B9, //CJK UNIFIED IDEOGRAPH
+ 0xF65E: 0x943F, //CJK UNIFIED IDEOGRAPH
+ 0xF65F: 0x943B, //CJK UNIFIED IDEOGRAPH
+ 0xF660: 0x9436, //CJK UNIFIED IDEOGRAPH
+ 0xF661: 0x9429, //CJK UNIFIED IDEOGRAPH
+ 0xF662: 0x943D, //CJK UNIFIED IDEOGRAPH
+ 0xF663: 0x943C, //CJK UNIFIED IDEOGRAPH
+ 0xF664: 0x9430, //CJK UNIFIED IDEOGRAPH
+ 0xF665: 0x9439, //CJK UNIFIED IDEOGRAPH
+ 0xF666: 0x942A, //CJK UNIFIED IDEOGRAPH
+ 0xF667: 0x9437, //CJK UNIFIED IDEOGRAPH
+ 0xF668: 0x942C, //CJK UNIFIED IDEOGRAPH
+ 0xF669: 0x9440, //CJK UNIFIED IDEOGRAPH
+ 0xF66A: 0x9431, //CJK UNIFIED IDEOGRAPH
+ 0xF66B: 0x95E5, //CJK UNIFIED IDEOGRAPH
+ 0xF66C: 0x95E4, //CJK UNIFIED IDEOGRAPH
+ 0xF66D: 0x95E3, //CJK UNIFIED IDEOGRAPH
+ 0xF66E: 0x9735, //CJK UNIFIED IDEOGRAPH
+ 0xF66F: 0x973A, //CJK UNIFIED IDEOGRAPH
+ 0xF670: 0x97BF, //CJK UNIFIED IDEOGRAPH
+ 0xF671: 0x97E1, //CJK UNIFIED IDEOGRAPH
+ 0xF672: 0x9864, //CJK UNIFIED IDEOGRAPH
+ 0xF673: 0x98C9, //CJK UNIFIED IDEOGRAPH
+ 0xF674: 0x98C6, //CJK UNIFIED IDEOGRAPH
+ 0xF675: 0x98C0, //CJK UNIFIED IDEOGRAPH
+ 0xF676: 0x9958, //CJK UNIFIED IDEOGRAPH
+ 0xF677: 0x9956, //CJK UNIFIED IDEOGRAPH
+ 0xF678: 0x9A39, //CJK UNIFIED IDEOGRAPH
+ 0xF679: 0x9A3D, //CJK UNIFIED IDEOGRAPH
+ 0xF67A: 0x9A46, //CJK UNIFIED IDEOGRAPH
+ 0xF67B: 0x9A44, //CJK UNIFIED IDEOGRAPH
+ 0xF67C: 0x9A42, //CJK UNIFIED IDEOGRAPH
+ 0xF67D: 0x9A41, //CJK UNIFIED IDEOGRAPH
+ 0xF67E: 0x9A3A, //CJK UNIFIED IDEOGRAPH
+ 0xF6A1: 0x9A3F, //CJK UNIFIED IDEOGRAPH
+ 0xF6A2: 0x9ACD, //CJK UNIFIED IDEOGRAPH
+ 0xF6A3: 0x9B15, //CJK UNIFIED IDEOGRAPH
+ 0xF6A4: 0x9B17, //CJK UNIFIED IDEOGRAPH
+ 0xF6A5: 0x9B18, //CJK UNIFIED IDEOGRAPH
+ 0xF6A6: 0x9B16, //CJK UNIFIED IDEOGRAPH
+ 0xF6A7: 0x9B3A, //CJK UNIFIED IDEOGRAPH
+ 0xF6A8: 0x9B52, //CJK UNIFIED IDEOGRAPH
+ 0xF6A9: 0x9C2B, //CJK UNIFIED IDEOGRAPH
+ 0xF6AA: 0x9C1D, //CJK UNIFIED IDEOGRAPH
+ 0xF6AB: 0x9C1C, //CJK UNIFIED IDEOGRAPH
+ 0xF6AC: 0x9C2C, //CJK UNIFIED IDEOGRAPH
+ 0xF6AD: 0x9C23, //CJK UNIFIED IDEOGRAPH
+ 0xF6AE: 0x9C28, //CJK UNIFIED IDEOGRAPH
+ 0xF6AF: 0x9C29, //CJK UNIFIED IDEOGRAPH
+ 0xF6B0: 0x9C24, //CJK UNIFIED IDEOGRAPH
+ 0xF6B1: 0x9C21, //CJK UNIFIED IDEOGRAPH
+ 0xF6B2: 0x9DB7, //CJK UNIFIED IDEOGRAPH
+ 0xF6B3: 0x9DB6, //CJK UNIFIED IDEOGRAPH
+ 0xF6B4: 0x9DBC, //CJK UNIFIED IDEOGRAPH
+ 0xF6B5: 0x9DC1, //CJK UNIFIED IDEOGRAPH
+ 0xF6B6: 0x9DC7, //CJK UNIFIED IDEOGRAPH
+ 0xF6B7: 0x9DCA, //CJK UNIFIED IDEOGRAPH
+ 0xF6B8: 0x9DCF, //CJK UNIFIED IDEOGRAPH
+ 0xF6B9: 0x9DBE, //CJK UNIFIED IDEOGRAPH
+ 0xF6BA: 0x9DC5, //CJK UNIFIED IDEOGRAPH
+ 0xF6BB: 0x9DC3, //CJK UNIFIED IDEOGRAPH
+ 0xF6BC: 0x9DBB, //CJK UNIFIED IDEOGRAPH
+ 0xF6BD: 0x9DB5, //CJK UNIFIED IDEOGRAPH
+ 0xF6BE: 0x9DCE, //CJK UNIFIED IDEOGRAPH
+ 0xF6BF: 0x9DB9, //CJK UNIFIED IDEOGRAPH
+ 0xF6C0: 0x9DBA, //CJK UNIFIED IDEOGRAPH
+ 0xF6C1: 0x9DAC, //CJK UNIFIED IDEOGRAPH
+ 0xF6C2: 0x9DC8, //CJK UNIFIED IDEOGRAPH
+ 0xF6C3: 0x9DB1, //CJK UNIFIED IDEOGRAPH
+ 0xF6C4: 0x9DAD, //CJK UNIFIED IDEOGRAPH
+ 0xF6C5: 0x9DCC, //CJK UNIFIED IDEOGRAPH
+ 0xF6C6: 0x9DB3, //CJK UNIFIED IDEOGRAPH
+ 0xF6C7: 0x9DCD, //CJK UNIFIED IDEOGRAPH
+ 0xF6C8: 0x9DB2, //CJK UNIFIED IDEOGRAPH
+ 0xF6C9: 0x9E7A, //CJK UNIFIED IDEOGRAPH
+ 0xF6CA: 0x9E9C, //CJK UNIFIED IDEOGRAPH
+ 0xF6CB: 0x9EEB, //CJK UNIFIED IDEOGRAPH
+ 0xF6CC: 0x9EEE, //CJK UNIFIED IDEOGRAPH
+ 0xF6CD: 0x9EED, //CJK UNIFIED IDEOGRAPH
+ 0xF6CE: 0x9F1B, //CJK UNIFIED IDEOGRAPH
+ 0xF6CF: 0x9F18, //CJK UNIFIED IDEOGRAPH
+ 0xF6D0: 0x9F1A, //CJK UNIFIED IDEOGRAPH
+ 0xF6D1: 0x9F31, //CJK UNIFIED IDEOGRAPH
+ 0xF6D2: 0x9F4E, //CJK UNIFIED IDEOGRAPH
+ 0xF6D3: 0x9F65, //CJK UNIFIED IDEOGRAPH
+ 0xF6D4: 0x9F64, //CJK UNIFIED IDEOGRAPH
+ 0xF6D5: 0x9F92, //CJK UNIFIED IDEOGRAPH
+ 0xF6D6: 0x4EB9, //CJK UNIFIED IDEOGRAPH
+ 0xF6D7: 0x56C6, //CJK UNIFIED IDEOGRAPH
+ 0xF6D8: 0x56C5, //CJK UNIFIED IDEOGRAPH
+ 0xF6D9: 0x56CB, //CJK UNIFIED IDEOGRAPH
+ 0xF6DA: 0x5971, //CJK UNIFIED IDEOGRAPH
+ 0xF6DB: 0x5B4B, //CJK UNIFIED IDEOGRAPH
+ 0xF6DC: 0x5B4C, //CJK UNIFIED IDEOGRAPH
+ 0xF6DD: 0x5DD5, //CJK UNIFIED IDEOGRAPH
+ 0xF6DE: 0x5DD1, //CJK UNIFIED IDEOGRAPH
+ 0xF6DF: 0x5EF2, //CJK UNIFIED IDEOGRAPH
+ 0xF6E0: 0x6521, //CJK UNIFIED IDEOGRAPH
+ 0xF6E1: 0x6520, //CJK UNIFIED IDEOGRAPH
+ 0xF6E2: 0x6526, //CJK UNIFIED IDEOGRAPH
+ 0xF6E3: 0x6522, //CJK UNIFIED IDEOGRAPH
+ 0xF6E4: 0x6B0B, //CJK UNIFIED IDEOGRAPH
+ 0xF6E5: 0x6B08, //CJK UNIFIED IDEOGRAPH
+ 0xF6E6: 0x6B09, //CJK UNIFIED IDEOGRAPH
+ 0xF6E7: 0x6C0D, //CJK UNIFIED IDEOGRAPH
+ 0xF6E8: 0x7055, //CJK UNIFIED IDEOGRAPH
+ 0xF6E9: 0x7056, //CJK UNIFIED IDEOGRAPH
+ 0xF6EA: 0x7057, //CJK UNIFIED IDEOGRAPH
+ 0xF6EB: 0x7052, //CJK UNIFIED IDEOGRAPH
+ 0xF6EC: 0x721E, //CJK UNIFIED IDEOGRAPH
+ 0xF6ED: 0x721F, //CJK UNIFIED IDEOGRAPH
+ 0xF6EE: 0x72A9, //CJK UNIFIED IDEOGRAPH
+ 0xF6EF: 0x737F, //CJK UNIFIED IDEOGRAPH
+ 0xF6F0: 0x74D8, //CJK UNIFIED IDEOGRAPH
+ 0xF6F1: 0x74D5, //CJK UNIFIED IDEOGRAPH
+ 0xF6F2: 0x74D9, //CJK UNIFIED IDEOGRAPH
+ 0xF6F3: 0x74D7, //CJK UNIFIED IDEOGRAPH
+ 0xF6F4: 0x766D, //CJK UNIFIED IDEOGRAPH
+ 0xF6F5: 0x76AD, //CJK UNIFIED IDEOGRAPH
+ 0xF6F6: 0x7935, //CJK UNIFIED IDEOGRAPH
+ 0xF6F7: 0x79B4, //CJK UNIFIED IDEOGRAPH
+ 0xF6F8: 0x7A70, //CJK UNIFIED IDEOGRAPH
+ 0xF6F9: 0x7A71, //CJK UNIFIED IDEOGRAPH
+ 0xF6FA: 0x7C57, //CJK UNIFIED IDEOGRAPH
+ 0xF6FB: 0x7C5C, //CJK UNIFIED IDEOGRAPH
+ 0xF6FC: 0x7C59, //CJK UNIFIED IDEOGRAPH
+ 0xF6FD: 0x7C5B, //CJK UNIFIED IDEOGRAPH
+ 0xF6FE: 0x7C5A, //CJK UNIFIED IDEOGRAPH
+ 0xF740: 0x7CF4, //CJK UNIFIED IDEOGRAPH
+ 0xF741: 0x7CF1, //CJK UNIFIED IDEOGRAPH
+ 0xF742: 0x7E91, //CJK UNIFIED IDEOGRAPH
+ 0xF743: 0x7F4F, //CJK UNIFIED IDEOGRAPH
+ 0xF744: 0x7F87, //CJK UNIFIED IDEOGRAPH
+ 0xF745: 0x81DE, //CJK UNIFIED IDEOGRAPH
+ 0xF746: 0x826B, //CJK UNIFIED IDEOGRAPH
+ 0xF747: 0x8634, //CJK UNIFIED IDEOGRAPH
+ 0xF748: 0x8635, //CJK UNIFIED IDEOGRAPH
+ 0xF749: 0x8633, //CJK UNIFIED IDEOGRAPH
+ 0xF74A: 0x862C, //CJK UNIFIED IDEOGRAPH
+ 0xF74B: 0x8632, //CJK UNIFIED IDEOGRAPH
+ 0xF74C: 0x8636, //CJK UNIFIED IDEOGRAPH
+ 0xF74D: 0x882C, //CJK UNIFIED IDEOGRAPH
+ 0xF74E: 0x8828, //CJK UNIFIED IDEOGRAPH
+ 0xF74F: 0x8826, //CJK UNIFIED IDEOGRAPH
+ 0xF750: 0x882A, //CJK UNIFIED IDEOGRAPH
+ 0xF751: 0x8825, //CJK UNIFIED IDEOGRAPH
+ 0xF752: 0x8971, //CJK UNIFIED IDEOGRAPH
+ 0xF753: 0x89BF, //CJK UNIFIED IDEOGRAPH
+ 0xF754: 0x89BE, //CJK UNIFIED IDEOGRAPH
+ 0xF755: 0x89FB, //CJK UNIFIED IDEOGRAPH
+ 0xF756: 0x8B7E, //CJK UNIFIED IDEOGRAPH
+ 0xF757: 0x8B84, //CJK UNIFIED IDEOGRAPH
+ 0xF758: 0x8B82, //CJK UNIFIED IDEOGRAPH
+ 0xF759: 0x8B86, //CJK UNIFIED IDEOGRAPH
+ 0xF75A: 0x8B85, //CJK UNIFIED IDEOGRAPH
+ 0xF75B: 0x8B7F, //CJK UNIFIED IDEOGRAPH
+ 0xF75C: 0x8D15, //CJK UNIFIED IDEOGRAPH
+ 0xF75D: 0x8E95, //CJK UNIFIED IDEOGRAPH
+ 0xF75E: 0x8E94, //CJK UNIFIED IDEOGRAPH
+ 0xF75F: 0x8E9A, //CJK UNIFIED IDEOGRAPH
+ 0xF760: 0x8E92, //CJK UNIFIED IDEOGRAPH
+ 0xF761: 0x8E90, //CJK UNIFIED IDEOGRAPH
+ 0xF762: 0x8E96, //CJK UNIFIED IDEOGRAPH
+ 0xF763: 0x8E97, //CJK UNIFIED IDEOGRAPH
+ 0xF764: 0x8F60, //CJK UNIFIED IDEOGRAPH
+ 0xF765: 0x8F62, //CJK UNIFIED IDEOGRAPH
+ 0xF766: 0x9147, //CJK UNIFIED IDEOGRAPH
+ 0xF767: 0x944C, //CJK UNIFIED IDEOGRAPH
+ 0xF768: 0x9450, //CJK UNIFIED IDEOGRAPH
+ 0xF769: 0x944A, //CJK UNIFIED IDEOGRAPH
+ 0xF76A: 0x944B, //CJK UNIFIED IDEOGRAPH
+ 0xF76B: 0x944F, //CJK UNIFIED IDEOGRAPH
+ 0xF76C: 0x9447, //CJK UNIFIED IDEOGRAPH
+ 0xF76D: 0x9445, //CJK UNIFIED IDEOGRAPH
+ 0xF76E: 0x9448, //CJK UNIFIED IDEOGRAPH
+ 0xF76F: 0x9449, //CJK UNIFIED IDEOGRAPH
+ 0xF770: 0x9446, //CJK UNIFIED IDEOGRAPH
+ 0xF771: 0x973F, //CJK UNIFIED IDEOGRAPH
+ 0xF772: 0x97E3, //CJK UNIFIED IDEOGRAPH
+ 0xF773: 0x986A, //CJK UNIFIED IDEOGRAPH
+ 0xF774: 0x9869, //CJK UNIFIED IDEOGRAPH
+ 0xF775: 0x98CB, //CJK UNIFIED IDEOGRAPH
+ 0xF776: 0x9954, //CJK UNIFIED IDEOGRAPH
+ 0xF777: 0x995B, //CJK UNIFIED IDEOGRAPH
+ 0xF778: 0x9A4E, //CJK UNIFIED IDEOGRAPH
+ 0xF779: 0x9A53, //CJK UNIFIED IDEOGRAPH
+ 0xF77A: 0x9A54, //CJK UNIFIED IDEOGRAPH
+ 0xF77B: 0x9A4C, //CJK UNIFIED IDEOGRAPH
+ 0xF77C: 0x9A4F, //CJK UNIFIED IDEOGRAPH
+ 0xF77D: 0x9A48, //CJK UNIFIED IDEOGRAPH
+ 0xF77E: 0x9A4A, //CJK UNIFIED IDEOGRAPH
+ 0xF7A1: 0x9A49, //CJK UNIFIED IDEOGRAPH
+ 0xF7A2: 0x9A52, //CJK UNIFIED IDEOGRAPH
+ 0xF7A3: 0x9A50, //CJK UNIFIED IDEOGRAPH
+ 0xF7A4: 0x9AD0, //CJK UNIFIED IDEOGRAPH
+ 0xF7A5: 0x9B19, //CJK UNIFIED IDEOGRAPH
+ 0xF7A6: 0x9B2B, //CJK UNIFIED IDEOGRAPH
+ 0xF7A7: 0x9B3B, //CJK UNIFIED IDEOGRAPH
+ 0xF7A8: 0x9B56, //CJK UNIFIED IDEOGRAPH
+ 0xF7A9: 0x9B55, //CJK UNIFIED IDEOGRAPH
+ 0xF7AA: 0x9C46, //CJK UNIFIED IDEOGRAPH
+ 0xF7AB: 0x9C48, //CJK UNIFIED IDEOGRAPH
+ 0xF7AC: 0x9C3F, //CJK UNIFIED IDEOGRAPH
+ 0xF7AD: 0x9C44, //CJK UNIFIED IDEOGRAPH
+ 0xF7AE: 0x9C39, //CJK UNIFIED IDEOGRAPH
+ 0xF7AF: 0x9C33, //CJK UNIFIED IDEOGRAPH
+ 0xF7B0: 0x9C41, //CJK UNIFIED IDEOGRAPH
+ 0xF7B1: 0x9C3C, //CJK UNIFIED IDEOGRAPH
+ 0xF7B2: 0x9C37, //CJK UNIFIED IDEOGRAPH
+ 0xF7B3: 0x9C34, //CJK UNIFIED IDEOGRAPH
+ 0xF7B4: 0x9C32, //CJK UNIFIED IDEOGRAPH
+ 0xF7B5: 0x9C3D, //CJK UNIFIED IDEOGRAPH
+ 0xF7B6: 0x9C36, //CJK UNIFIED IDEOGRAPH
+ 0xF7B7: 0x9DDB, //CJK UNIFIED IDEOGRAPH
+ 0xF7B8: 0x9DD2, //CJK UNIFIED IDEOGRAPH
+ 0xF7B9: 0x9DDE, //CJK UNIFIED IDEOGRAPH
+ 0xF7BA: 0x9DDA, //CJK UNIFIED IDEOGRAPH
+ 0xF7BB: 0x9DCB, //CJK UNIFIED IDEOGRAPH
+ 0xF7BC: 0x9DD0, //CJK UNIFIED IDEOGRAPH
+ 0xF7BD: 0x9DDC, //CJK UNIFIED IDEOGRAPH
+ 0xF7BE: 0x9DD1, //CJK UNIFIED IDEOGRAPH
+ 0xF7BF: 0x9DDF, //CJK UNIFIED IDEOGRAPH
+ 0xF7C0: 0x9DE9, //CJK UNIFIED IDEOGRAPH
+ 0xF7C1: 0x9DD9, //CJK UNIFIED IDEOGRAPH
+ 0xF7C2: 0x9DD8, //CJK UNIFIED IDEOGRAPH
+ 0xF7C3: 0x9DD6, //CJK UNIFIED IDEOGRAPH
+ 0xF7C4: 0x9DF5, //CJK UNIFIED IDEOGRAPH
+ 0xF7C5: 0x9DD5, //CJK UNIFIED IDEOGRAPH
+ 0xF7C6: 0x9DDD, //CJK UNIFIED IDEOGRAPH
+ 0xF7C7: 0x9EB6, //CJK UNIFIED IDEOGRAPH
+ 0xF7C8: 0x9EF0, //CJK UNIFIED IDEOGRAPH
+ 0xF7C9: 0x9F35, //CJK UNIFIED IDEOGRAPH
+ 0xF7CA: 0x9F33, //CJK UNIFIED IDEOGRAPH
+ 0xF7CB: 0x9F32, //CJK UNIFIED IDEOGRAPH
+ 0xF7CC: 0x9F42, //CJK UNIFIED IDEOGRAPH
+ 0xF7CD: 0x9F6B, //CJK UNIFIED IDEOGRAPH
+ 0xF7CE: 0x9F95, //CJK UNIFIED IDEOGRAPH
+ 0xF7CF: 0x9FA2, //CJK UNIFIED IDEOGRAPH
+ 0xF7D0: 0x513D, //CJK UNIFIED IDEOGRAPH
+ 0xF7D1: 0x5299, //CJK UNIFIED IDEOGRAPH
+ 0xF7D2: 0x58E8, //CJK UNIFIED IDEOGRAPH
+ 0xF7D3: 0x58E7, //CJK UNIFIED IDEOGRAPH
+ 0xF7D4: 0x5972, //CJK UNIFIED IDEOGRAPH
+ 0xF7D5: 0x5B4D, //CJK UNIFIED IDEOGRAPH
+ 0xF7D6: 0x5DD8, //CJK UNIFIED IDEOGRAPH
+ 0xF7D7: 0x882F, //CJK UNIFIED IDEOGRAPH
+ 0xF7D8: 0x5F4F, //CJK UNIFIED IDEOGRAPH
+ 0xF7D9: 0x6201, //CJK UNIFIED IDEOGRAPH
+ 0xF7DA: 0x6203, //CJK UNIFIED IDEOGRAPH
+ 0xF7DB: 0x6204, //CJK UNIFIED IDEOGRAPH
+ 0xF7DC: 0x6529, //CJK UNIFIED IDEOGRAPH
+ 0xF7DD: 0x6525, //CJK UNIFIED IDEOGRAPH
+ 0xF7DE: 0x6596, //CJK UNIFIED IDEOGRAPH
+ 0xF7DF: 0x66EB, //CJK UNIFIED IDEOGRAPH
+ 0xF7E0: 0x6B11, //CJK UNIFIED IDEOGRAPH
+ 0xF7E1: 0x6B12, //CJK UNIFIED IDEOGRAPH
+ 0xF7E2: 0x6B0F, //CJK UNIFIED IDEOGRAPH
+ 0xF7E3: 0x6BCA, //CJK UNIFIED IDEOGRAPH
+ 0xF7E4: 0x705B, //CJK UNIFIED IDEOGRAPH
+ 0xF7E5: 0x705A, //CJK UNIFIED IDEOGRAPH
+ 0xF7E6: 0x7222, //CJK UNIFIED IDEOGRAPH
+ 0xF7E7: 0x7382, //CJK UNIFIED IDEOGRAPH
+ 0xF7E8: 0x7381, //CJK UNIFIED IDEOGRAPH
+ 0xF7E9: 0x7383, //CJK UNIFIED IDEOGRAPH
+ 0xF7EA: 0x7670, //CJK UNIFIED IDEOGRAPH
+ 0xF7EB: 0x77D4, //CJK UNIFIED IDEOGRAPH
+ 0xF7EC: 0x7C67, //CJK UNIFIED IDEOGRAPH
+ 0xF7ED: 0x7C66, //CJK UNIFIED IDEOGRAPH
+ 0xF7EE: 0x7E95, //CJK UNIFIED IDEOGRAPH
+ 0xF7EF: 0x826C, //CJK UNIFIED IDEOGRAPH
+ 0xF7F0: 0x863A, //CJK UNIFIED IDEOGRAPH
+ 0xF7F1: 0x8640, //CJK UNIFIED IDEOGRAPH
+ 0xF7F2: 0x8639, //CJK UNIFIED IDEOGRAPH
+ 0xF7F3: 0x863C, //CJK UNIFIED IDEOGRAPH
+ 0xF7F4: 0x8631, //CJK UNIFIED IDEOGRAPH
+ 0xF7F5: 0x863B, //CJK UNIFIED IDEOGRAPH
+ 0xF7F6: 0x863E, //CJK UNIFIED IDEOGRAPH
+ 0xF7F7: 0x8830, //CJK UNIFIED IDEOGRAPH
+ 0xF7F8: 0x8832, //CJK UNIFIED IDEOGRAPH
+ 0xF7F9: 0x882E, //CJK UNIFIED IDEOGRAPH
+ 0xF7FA: 0x8833, //CJK UNIFIED IDEOGRAPH
+ 0xF7FB: 0x8976, //CJK UNIFIED IDEOGRAPH
+ 0xF7FC: 0x8974, //CJK UNIFIED IDEOGRAPH
+ 0xF7FD: 0x8973, //CJK UNIFIED IDEOGRAPH
+ 0xF7FE: 0x89FE, //CJK UNIFIED IDEOGRAPH
+ 0xF840: 0x8B8C, //CJK UNIFIED IDEOGRAPH
+ 0xF841: 0x8B8E, //CJK UNIFIED IDEOGRAPH
+ 0xF842: 0x8B8B, //CJK UNIFIED IDEOGRAPH
+ 0xF843: 0x8B88, //CJK UNIFIED IDEOGRAPH
+ 0xF844: 0x8C45, //CJK UNIFIED IDEOGRAPH
+ 0xF845: 0x8D19, //CJK UNIFIED IDEOGRAPH
+ 0xF846: 0x8E98, //CJK UNIFIED IDEOGRAPH
+ 0xF847: 0x8F64, //CJK UNIFIED IDEOGRAPH
+ 0xF848: 0x8F63, //CJK UNIFIED IDEOGRAPH
+ 0xF849: 0x91BC, //CJK UNIFIED IDEOGRAPH
+ 0xF84A: 0x9462, //CJK UNIFIED IDEOGRAPH
+ 0xF84B: 0x9455, //CJK UNIFIED IDEOGRAPH
+ 0xF84C: 0x945D, //CJK UNIFIED IDEOGRAPH
+ 0xF84D: 0x9457, //CJK UNIFIED IDEOGRAPH
+ 0xF84E: 0x945E, //CJK UNIFIED IDEOGRAPH
+ 0xF84F: 0x97C4, //CJK UNIFIED IDEOGRAPH
+ 0xF850: 0x97C5, //CJK UNIFIED IDEOGRAPH
+ 0xF851: 0x9800, //CJK UNIFIED IDEOGRAPH
+ 0xF852: 0x9A56, //CJK UNIFIED IDEOGRAPH
+ 0xF853: 0x9A59, //CJK UNIFIED IDEOGRAPH
+ 0xF854: 0x9B1E, //CJK UNIFIED IDEOGRAPH
+ 0xF855: 0x9B1F, //CJK UNIFIED IDEOGRAPH
+ 0xF856: 0x9B20, //CJK UNIFIED IDEOGRAPH
+ 0xF857: 0x9C52, //CJK UNIFIED IDEOGRAPH
+ 0xF858: 0x9C58, //CJK UNIFIED IDEOGRAPH
+ 0xF859: 0x9C50, //CJK UNIFIED IDEOGRAPH
+ 0xF85A: 0x9C4A, //CJK UNIFIED IDEOGRAPH
+ 0xF85B: 0x9C4D, //CJK UNIFIED IDEOGRAPH
+ 0xF85C: 0x9C4B, //CJK UNIFIED IDEOGRAPH
+ 0xF85D: 0x9C55, //CJK UNIFIED IDEOGRAPH
+ 0xF85E: 0x9C59, //CJK UNIFIED IDEOGRAPH
+ 0xF85F: 0x9C4C, //CJK UNIFIED IDEOGRAPH
+ 0xF860: 0x9C4E, //CJK UNIFIED IDEOGRAPH
+ 0xF861: 0x9DFB, //CJK UNIFIED IDEOGRAPH
+ 0xF862: 0x9DF7, //CJK UNIFIED IDEOGRAPH
+ 0xF863: 0x9DEF, //CJK UNIFIED IDEOGRAPH
+ 0xF864: 0x9DE3, //CJK UNIFIED IDEOGRAPH
+ 0xF865: 0x9DEB, //CJK UNIFIED IDEOGRAPH
+ 0xF866: 0x9DF8, //CJK UNIFIED IDEOGRAPH
+ 0xF867: 0x9DE4, //CJK UNIFIED IDEOGRAPH
+ 0xF868: 0x9DF6, //CJK UNIFIED IDEOGRAPH
+ 0xF869: 0x9DE1, //CJK UNIFIED IDEOGRAPH
+ 0xF86A: 0x9DEE, //CJK UNIFIED IDEOGRAPH
+ 0xF86B: 0x9DE6, //CJK UNIFIED IDEOGRAPH
+ 0xF86C: 0x9DF2, //CJK UNIFIED IDEOGRAPH
+ 0xF86D: 0x9DF0, //CJK UNIFIED IDEOGRAPH
+ 0xF86E: 0x9DE2, //CJK UNIFIED IDEOGRAPH
+ 0xF86F: 0x9DEC, //CJK UNIFIED IDEOGRAPH
+ 0xF870: 0x9DF4, //CJK UNIFIED IDEOGRAPH
+ 0xF871: 0x9DF3, //CJK UNIFIED IDEOGRAPH
+ 0xF872: 0x9DE8, //CJK UNIFIED IDEOGRAPH
+ 0xF873: 0x9DED, //CJK UNIFIED IDEOGRAPH
+ 0xF874: 0x9EC2, //CJK UNIFIED IDEOGRAPH
+ 0xF875: 0x9ED0, //CJK UNIFIED IDEOGRAPH
+ 0xF876: 0x9EF2, //CJK UNIFIED IDEOGRAPH
+ 0xF877: 0x9EF3, //CJK UNIFIED IDEOGRAPH
+ 0xF878: 0x9F06, //CJK UNIFIED IDEOGRAPH
+ 0xF879: 0x9F1C, //CJK UNIFIED IDEOGRAPH
+ 0xF87A: 0x9F38, //CJK UNIFIED IDEOGRAPH
+ 0xF87B: 0x9F37, //CJK UNIFIED IDEOGRAPH
+ 0xF87C: 0x9F36, //CJK UNIFIED IDEOGRAPH
+ 0xF87D: 0x9F43, //CJK UNIFIED IDEOGRAPH
+ 0xF87E: 0x9F4F, //CJK UNIFIED IDEOGRAPH
+ 0xF8A1: 0x9F71, //CJK UNIFIED IDEOGRAPH
+ 0xF8A2: 0x9F70, //CJK UNIFIED IDEOGRAPH
+ 0xF8A3: 0x9F6E, //CJK UNIFIED IDEOGRAPH
+ 0xF8A4: 0x9F6F, //CJK UNIFIED IDEOGRAPH
+ 0xF8A5: 0x56D3, //CJK UNIFIED IDEOGRAPH
+ 0xF8A6: 0x56CD, //CJK UNIFIED IDEOGRAPH
+ 0xF8A7: 0x5B4E, //CJK UNIFIED IDEOGRAPH
+ 0xF8A8: 0x5C6D, //CJK UNIFIED IDEOGRAPH
+ 0xF8A9: 0x652D, //CJK UNIFIED IDEOGRAPH
+ 0xF8AA: 0x66ED, //CJK UNIFIED IDEOGRAPH
+ 0xF8AB: 0x66EE, //CJK UNIFIED IDEOGRAPH
+ 0xF8AC: 0x6B13, //CJK UNIFIED IDEOGRAPH
+ 0xF8AD: 0x705F, //CJK UNIFIED IDEOGRAPH
+ 0xF8AE: 0x7061, //CJK UNIFIED IDEOGRAPH
+ 0xF8AF: 0x705D, //CJK UNIFIED IDEOGRAPH
+ 0xF8B0: 0x7060, //CJK UNIFIED IDEOGRAPH
+ 0xF8B1: 0x7223, //CJK UNIFIED IDEOGRAPH
+ 0xF8B2: 0x74DB, //CJK UNIFIED IDEOGRAPH
+ 0xF8B3: 0x74E5, //CJK UNIFIED IDEOGRAPH
+ 0xF8B4: 0x77D5, //CJK UNIFIED IDEOGRAPH
+ 0xF8B5: 0x7938, //CJK UNIFIED IDEOGRAPH
+ 0xF8B6: 0x79B7, //CJK UNIFIED IDEOGRAPH
+ 0xF8B7: 0x79B6, //CJK UNIFIED IDEOGRAPH
+ 0xF8B8: 0x7C6A, //CJK UNIFIED IDEOGRAPH
+ 0xF8B9: 0x7E97, //CJK UNIFIED IDEOGRAPH
+ 0xF8BA: 0x7F89, //CJK UNIFIED IDEOGRAPH
+ 0xF8BB: 0x826D, //CJK UNIFIED IDEOGRAPH
+ 0xF8BC: 0x8643, //CJK UNIFIED IDEOGRAPH
+ 0xF8BD: 0x8838, //CJK UNIFIED IDEOGRAPH
+ 0xF8BE: 0x8837, //CJK UNIFIED IDEOGRAPH
+ 0xF8BF: 0x8835, //CJK UNIFIED IDEOGRAPH
+ 0xF8C0: 0x884B, //CJK UNIFIED IDEOGRAPH
+ 0xF8C1: 0x8B94, //CJK UNIFIED IDEOGRAPH
+ 0xF8C2: 0x8B95, //CJK UNIFIED IDEOGRAPH
+ 0xF8C3: 0x8E9E, //CJK UNIFIED IDEOGRAPH
+ 0xF8C4: 0x8E9F, //CJK UNIFIED IDEOGRAPH
+ 0xF8C5: 0x8EA0, //CJK UNIFIED IDEOGRAPH
+ 0xF8C6: 0x8E9D, //CJK UNIFIED IDEOGRAPH
+ 0xF8C7: 0x91BE, //CJK UNIFIED IDEOGRAPH
+ 0xF8C8: 0x91BD, //CJK UNIFIED IDEOGRAPH
+ 0xF8C9: 0x91C2, //CJK UNIFIED IDEOGRAPH
+ 0xF8CA: 0x946B, //CJK UNIFIED IDEOGRAPH
+ 0xF8CB: 0x9468, //CJK UNIFIED IDEOGRAPH
+ 0xF8CC: 0x9469, //CJK UNIFIED IDEOGRAPH
+ 0xF8CD: 0x96E5, //CJK UNIFIED IDEOGRAPH
+ 0xF8CE: 0x9746, //CJK UNIFIED IDEOGRAPH
+ 0xF8CF: 0x9743, //CJK UNIFIED IDEOGRAPH
+ 0xF8D0: 0x9747, //CJK UNIFIED IDEOGRAPH
+ 0xF8D1: 0x97C7, //CJK UNIFIED IDEOGRAPH
+ 0xF8D2: 0x97E5, //CJK UNIFIED IDEOGRAPH
+ 0xF8D3: 0x9A5E, //CJK UNIFIED IDEOGRAPH
+ 0xF8D4: 0x9AD5, //CJK UNIFIED IDEOGRAPH
+ 0xF8D5: 0x9B59, //CJK UNIFIED IDEOGRAPH
+ 0xF8D6: 0x9C63, //CJK UNIFIED IDEOGRAPH
+ 0xF8D7: 0x9C67, //CJK UNIFIED IDEOGRAPH
+ 0xF8D8: 0x9C66, //CJK UNIFIED IDEOGRAPH
+ 0xF8D9: 0x9C62, //CJK UNIFIED IDEOGRAPH
+ 0xF8DA: 0x9C5E, //CJK UNIFIED IDEOGRAPH
+ 0xF8DB: 0x9C60, //CJK UNIFIED IDEOGRAPH
+ 0xF8DC: 0x9E02, //CJK UNIFIED IDEOGRAPH
+ 0xF8DD: 0x9DFE, //CJK UNIFIED IDEOGRAPH
+ 0xF8DE: 0x9E07, //CJK UNIFIED IDEOGRAPH
+ 0xF8DF: 0x9E03, //CJK UNIFIED IDEOGRAPH
+ 0xF8E0: 0x9E06, //CJK UNIFIED IDEOGRAPH
+ 0xF8E1: 0x9E05, //CJK UNIFIED IDEOGRAPH
+ 0xF8E2: 0x9E00, //CJK UNIFIED IDEOGRAPH
+ 0xF8E3: 0x9E01, //CJK UNIFIED IDEOGRAPH
+ 0xF8E4: 0x9E09, //CJK UNIFIED IDEOGRAPH
+ 0xF8E5: 0x9DFF, //CJK UNIFIED IDEOGRAPH
+ 0xF8E6: 0x9DFD, //CJK UNIFIED IDEOGRAPH
+ 0xF8E7: 0x9E04, //CJK UNIFIED IDEOGRAPH
+ 0xF8E8: 0x9EA0, //CJK UNIFIED IDEOGRAPH
+ 0xF8E9: 0x9F1E, //CJK UNIFIED IDEOGRAPH
+ 0xF8EA: 0x9F46, //CJK UNIFIED IDEOGRAPH
+ 0xF8EB: 0x9F74, //CJK UNIFIED IDEOGRAPH
+ 0xF8EC: 0x9F75, //CJK UNIFIED IDEOGRAPH
+ 0xF8ED: 0x9F76, //CJK UNIFIED IDEOGRAPH
+ 0xF8EE: 0x56D4, //CJK UNIFIED IDEOGRAPH
+ 0xF8EF: 0x652E, //CJK UNIFIED IDEOGRAPH
+ 0xF8F0: 0x65B8, //CJK UNIFIED IDEOGRAPH
+ 0xF8F1: 0x6B18, //CJK UNIFIED IDEOGRAPH
+ 0xF8F2: 0x6B19, //CJK UNIFIED IDEOGRAPH
+ 0xF8F3: 0x6B17, //CJK UNIFIED IDEOGRAPH
+ 0xF8F4: 0x6B1A, //CJK UNIFIED IDEOGRAPH
+ 0xF8F5: 0x7062, //CJK UNIFIED IDEOGRAPH
+ 0xF8F6: 0x7226, //CJK UNIFIED IDEOGRAPH
+ 0xF8F7: 0x72AA, //CJK UNIFIED IDEOGRAPH
+ 0xF8F8: 0x77D8, //CJK UNIFIED IDEOGRAPH
+ 0xF8F9: 0x77D9, //CJK UNIFIED IDEOGRAPH
+ 0xF8FA: 0x7939, //CJK UNIFIED IDEOGRAPH
+ 0xF8FB: 0x7C69, //CJK UNIFIED IDEOGRAPH
+ 0xF8FC: 0x7C6B, //CJK UNIFIED IDEOGRAPH
+ 0xF8FD: 0x7CF6, //CJK UNIFIED IDEOGRAPH
+ 0xF8FE: 0x7E9A, //CJK UNIFIED IDEOGRAPH
+ 0xF940: 0x7E98, //CJK UNIFIED IDEOGRAPH
+ 0xF941: 0x7E9B, //CJK UNIFIED IDEOGRAPH
+ 0xF942: 0x7E99, //CJK UNIFIED IDEOGRAPH
+ 0xF943: 0x81E0, //CJK UNIFIED IDEOGRAPH
+ 0xF944: 0x81E1, //CJK UNIFIED IDEOGRAPH
+ 0xF945: 0x8646, //CJK UNIFIED IDEOGRAPH
+ 0xF946: 0x8647, //CJK UNIFIED IDEOGRAPH
+ 0xF947: 0x8648, //CJK UNIFIED IDEOGRAPH
+ 0xF948: 0x8979, //CJK UNIFIED IDEOGRAPH
+ 0xF949: 0x897A, //CJK UNIFIED IDEOGRAPH
+ 0xF94A: 0x897C, //CJK UNIFIED IDEOGRAPH
+ 0xF94B: 0x897B, //CJK UNIFIED IDEOGRAPH
+ 0xF94C: 0x89FF, //CJK UNIFIED IDEOGRAPH
+ 0xF94D: 0x8B98, //CJK UNIFIED IDEOGRAPH
+ 0xF94E: 0x8B99, //CJK UNIFIED IDEOGRAPH
+ 0xF94F: 0x8EA5, //CJK UNIFIED IDEOGRAPH
+ 0xF950: 0x8EA4, //CJK UNIFIED IDEOGRAPH
+ 0xF951: 0x8EA3, //CJK UNIFIED IDEOGRAPH
+ 0xF952: 0x946E, //CJK UNIFIED IDEOGRAPH
+ 0xF953: 0x946D, //CJK UNIFIED IDEOGRAPH
+ 0xF954: 0x946F, //CJK UNIFIED IDEOGRAPH
+ 0xF955: 0x9471, //CJK UNIFIED IDEOGRAPH
+ 0xF956: 0x9473, //CJK UNIFIED IDEOGRAPH
+ 0xF957: 0x9749, //CJK UNIFIED IDEOGRAPH
+ 0xF958: 0x9872, //CJK UNIFIED IDEOGRAPH
+ 0xF959: 0x995F, //CJK UNIFIED IDEOGRAPH
+ 0xF95A: 0x9C68, //CJK UNIFIED IDEOGRAPH
+ 0xF95B: 0x9C6E, //CJK UNIFIED IDEOGRAPH
+ 0xF95C: 0x9C6D, //CJK UNIFIED IDEOGRAPH
+ 0xF95D: 0x9E0B, //CJK UNIFIED IDEOGRAPH
+ 0xF95E: 0x9E0D, //CJK UNIFIED IDEOGRAPH
+ 0xF95F: 0x9E10, //CJK UNIFIED IDEOGRAPH
+ 0xF960: 0x9E0F, //CJK UNIFIED IDEOGRAPH
+ 0xF961: 0x9E12, //CJK UNIFIED IDEOGRAPH
+ 0xF962: 0x9E11, //CJK UNIFIED IDEOGRAPH
+ 0xF963: 0x9EA1, //CJK UNIFIED IDEOGRAPH
+ 0xF964: 0x9EF5, //CJK UNIFIED IDEOGRAPH
+ 0xF965: 0x9F09, //CJK UNIFIED IDEOGRAPH
+ 0xF966: 0x9F47, //CJK UNIFIED IDEOGRAPH
+ 0xF967: 0x9F78, //CJK UNIFIED IDEOGRAPH
+ 0xF968: 0x9F7B, //CJK UNIFIED IDEOGRAPH
+ 0xF969: 0x9F7A, //CJK UNIFIED IDEOGRAPH
+ 0xF96A: 0x9F79, //CJK UNIFIED IDEOGRAPH
+ 0xF96B: 0x571E, //CJK UNIFIED IDEOGRAPH
+ 0xF96C: 0x7066, //CJK UNIFIED IDEOGRAPH
+ 0xF96D: 0x7C6F, //CJK UNIFIED IDEOGRAPH
+ 0xF96E: 0x883C, //CJK UNIFIED IDEOGRAPH
+ 0xF96F: 0x8DB2, //CJK UNIFIED IDEOGRAPH
+ 0xF970: 0x8EA6, //CJK UNIFIED IDEOGRAPH
+ 0xF971: 0x91C3, //CJK UNIFIED IDEOGRAPH
+ 0xF972: 0x9474, //CJK UNIFIED IDEOGRAPH
+ 0xF973: 0x9478, //CJK UNIFIED IDEOGRAPH
+ 0xF974: 0x9476, //CJK UNIFIED IDEOGRAPH
+ 0xF975: 0x9475, //CJK UNIFIED IDEOGRAPH
+ 0xF976: 0x9A60, //CJK UNIFIED IDEOGRAPH
+ 0xF977: 0x9C74, //CJK UNIFIED IDEOGRAPH
+ 0xF978: 0x9C73, //CJK UNIFIED IDEOGRAPH
+ 0xF979: 0x9C71, //CJK UNIFIED IDEOGRAPH
+ 0xF97A: 0x9C75, //CJK UNIFIED IDEOGRAPH
+ 0xF97B: 0x9E14, //CJK UNIFIED IDEOGRAPH
+ 0xF97C: 0x9E13, //CJK UNIFIED IDEOGRAPH
+ 0xF97D: 0x9EF6, //CJK UNIFIED IDEOGRAPH
+ 0xF97E: 0x9F0A, //CJK UNIFIED IDEOGRAPH
+ 0xF9A1: 0x9FA4, //CJK UNIFIED IDEOGRAPH
+ 0xF9A2: 0x7068, //CJK UNIFIED IDEOGRAPH
+ 0xF9A3: 0x7065, //CJK UNIFIED IDEOGRAPH
+ 0xF9A4: 0x7CF7, //CJK UNIFIED IDEOGRAPH
+ 0xF9A5: 0x866A, //CJK UNIFIED IDEOGRAPH
+ 0xF9A6: 0x883E, //CJK UNIFIED IDEOGRAPH
+ 0xF9A7: 0x883D, //CJK UNIFIED IDEOGRAPH
+ 0xF9A8: 0x883F, //CJK UNIFIED IDEOGRAPH
+ 0xF9A9: 0x8B9E, //CJK UNIFIED IDEOGRAPH
+ 0xF9AA: 0x8C9C, //CJK UNIFIED IDEOGRAPH
+ 0xF9AB: 0x8EA9, //CJK UNIFIED IDEOGRAPH
+ 0xF9AC: 0x8EC9, //CJK UNIFIED IDEOGRAPH
+ 0xF9AD: 0x974B, //CJK UNIFIED IDEOGRAPH
+ 0xF9AE: 0x9873, //CJK UNIFIED IDEOGRAPH
+ 0xF9AF: 0x9874, //CJK UNIFIED IDEOGRAPH
+ 0xF9B0: 0x98CC, //CJK UNIFIED IDEOGRAPH
+ 0xF9B1: 0x9961, //CJK UNIFIED IDEOGRAPH
+ 0xF9B2: 0x99AB, //CJK UNIFIED IDEOGRAPH
+ 0xF9B3: 0x9A64, //CJK UNIFIED IDEOGRAPH
+ 0xF9B4: 0x9A66, //CJK UNIFIED IDEOGRAPH
+ 0xF9B5: 0x9A67, //CJK UNIFIED IDEOGRAPH
+ 0xF9B6: 0x9B24, //CJK UNIFIED IDEOGRAPH
+ 0xF9B7: 0x9E15, //CJK UNIFIED IDEOGRAPH
+ 0xF9B8: 0x9E17, //CJK UNIFIED IDEOGRAPH
+ 0xF9B9: 0x9F48, //CJK UNIFIED IDEOGRAPH
+ 0xF9BA: 0x6207, //CJK UNIFIED IDEOGRAPH
+ 0xF9BB: 0x6B1E, //CJK UNIFIED IDEOGRAPH
+ 0xF9BC: 0x7227, //CJK UNIFIED IDEOGRAPH
+ 0xF9BD: 0x864C, //CJK UNIFIED IDEOGRAPH
+ 0xF9BE: 0x8EA8, //CJK UNIFIED IDEOGRAPH
+ 0xF9BF: 0x9482, //CJK UNIFIED IDEOGRAPH
+ 0xF9C0: 0x9480, //CJK UNIFIED IDEOGRAPH
+ 0xF9C1: 0x9481, //CJK UNIFIED IDEOGRAPH
+ 0xF9C2: 0x9A69, //CJK UNIFIED IDEOGRAPH
+ 0xF9C3: 0x9A68, //CJK UNIFIED IDEOGRAPH
+ 0xF9C4: 0x9B2E, //CJK UNIFIED IDEOGRAPH
+ 0xF9C5: 0x9E19, //CJK UNIFIED IDEOGRAPH
+ 0xF9C6: 0x7229, //CJK UNIFIED IDEOGRAPH
+ 0xF9C7: 0x864B, //CJK UNIFIED IDEOGRAPH
+ 0xF9C8: 0x8B9F, //CJK UNIFIED IDEOGRAPH
+ 0xF9C9: 0x9483, //CJK UNIFIED IDEOGRAPH
+ 0xF9CA: 0x9C79, //CJK UNIFIED IDEOGRAPH
+ 0xF9CB: 0x9EB7, //CJK UNIFIED IDEOGRAPH
+ 0xF9CC: 0x7675, //CJK UNIFIED IDEOGRAPH
+ 0xF9CD: 0x9A6B, //CJK UNIFIED IDEOGRAPH
+ 0xF9CE: 0x9C7A, //CJK UNIFIED IDEOGRAPH
+ 0xF9CF: 0x9E1D, //CJK UNIFIED IDEOGRAPH
+ 0xF9D0: 0x7069, //CJK UNIFIED IDEOGRAPH
+ 0xF9D1: 0x706A, //CJK UNIFIED IDEOGRAPH
+ 0xF9D2: 0x9EA4, //CJK UNIFIED IDEOGRAPH
+ 0xF9D3: 0x9F7E, //CJK UNIFIED IDEOGRAPH
+ 0xF9D4: 0x9F49, //CJK UNIFIED IDEOGRAPH
+ 0xF9D5: 0x9F98, //CJK UNIFIED IDEOGRAPH
+ 0xF9D6: 0x7881, //CJK UNIFIED IDEOGRAPH
+ 0xF9D7: 0x92B9, //CJK UNIFIED IDEOGRAPH
+ 0xF9D8: 0x88CF, //CJK UNIFIED IDEOGRAPH
+ 0xF9D9: 0x58BB, //CJK UNIFIED IDEOGRAPH
+ 0xF9DA: 0x6052, //CJK UNIFIED IDEOGRAPH
+ 0xF9DB: 0x7CA7, //CJK UNIFIED IDEOGRAPH
+ 0xF9DC: 0x5AFA, //CJK UNIFIED IDEOGRAPH
+ 0xF9DD: 0x2554, //BOX DRAWINGS DOUBLE DOWN AND RIGHT
+ 0xF9DE: 0x2566, //BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+ 0xF9DF: 0x2557, //BOX DRAWINGS DOUBLE DOWN AND LEFT
+ 0xF9E0: 0x2560, //BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+ 0xF9E1: 0x256C, //BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+ 0xF9E2: 0x2563, //BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+ 0xF9E3: 0x255A, //BOX DRAWINGS DOUBLE UP AND RIGHT
+ 0xF9E4: 0x2569, //BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+ 0xF9E5: 0x255D, //BOX DRAWINGS DOUBLE UP AND LEFT
+ 0xF9E6: 0x2552, //BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+ 0xF9E7: 0x2564, //BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+ 0xF9E8: 0x2555, //BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+ 0xF9E9: 0x255E, //BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ 0xF9EA: 0x256A, //BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ 0xF9EB: 0x2561, //BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ 0xF9EC: 0x2558, //BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+ 0xF9ED: 0x2567, //BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+ 0xF9EE: 0x255B, //BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+ 0xF9EF: 0x2553, //BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+ 0xF9F0: 0x2565, //BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+ 0xF9F1: 0x2556, //BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+ 0xF9F2: 0x255F, //BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+ 0xF9F3: 0x256B, //BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+ 0xF9F4: 0x2562, //BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+ 0xF9F5: 0x2559, //BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+ 0xF9F6: 0x2568, //BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+ 0xF9F7: 0x255C, //BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+ 0xF9F8: 0x2551, //BOX DRAWINGS DOUBLE VERTICAL
+ 0xF9F9: 0x2550, //BOX DRAWINGS DOUBLE HORIZONTAL
+ 0xF9FA: 0x256D, //BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+ 0xF9FB: 0x256E, //BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+ 0xF9FC: 0x2570, //BOX DRAWINGS LIGHT ARC UP AND RIGHT
+ 0xF9FD: 0x256F, //BOX DRAWINGS LIGHT ARC UP AND LEFT
+ 0xF9FE: 0x2593, //DARK SHADE
+ },
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/decimal.go b/vendor/github.com/denisenkom/go-mssqldb/decimal.go
new file mode 100644
index 000000000..76f3a6b5b
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/decimal.go
@@ -0,0 +1,115 @@
+package mssql
+
+import (
+ "encoding/binary"
+ "errors"
+ "math"
+ "math/big"
+)
+
+// http://msdn.microsoft.com/en-us/library/ee780893.aspx
+type Decimal struct {
+ integer [4]uint32
+ positive bool
+ prec uint8
+ scale uint8
+}
+
+var scaletblflt64 [39]float64
+
+func (d Decimal) ToFloat64() float64 {
+ val := float64(0)
+ for i := 3; i >= 0; i-- {
+ val *= 0x100000000
+ val += float64(d.integer[i])
+ }
+ if !d.positive {
+ val = -val
+ }
+ if d.scale != 0 {
+ val /= scaletblflt64[d.scale]
+ }
+ return val
+}
+
+func Float64ToDecimal(f float64) (Decimal, error) {
+ var dec Decimal
+ if math.IsNaN(f) {
+ return dec, errors.New("NaN")
+ }
+ if math.IsInf(f, 0) {
+ return dec, errors.New("Infinity can't be converted to decimal")
+ }
+ dec.positive = f >= 0
+ if !dec.positive {
+ f = math.Abs(f)
+ }
+ if f > 3.402823669209385e+38 {
+ return dec, errors.New("Float value is out of range")
+ }
+ dec.prec = 20
+ var integer float64
+ for dec.scale = 0; dec.scale <= 20; dec.scale++ {
+ integer = f * scaletblflt64[dec.scale]
+ _, frac := math.Modf(integer)
+ if frac == 0 {
+ break
+ }
+ }
+ for i := 0; i < 4; i++ {
+ mod := math.Mod(integer, 0x100000000)
+ integer -= mod
+ integer /= 0x100000000
+ dec.integer[i] = uint32(mod)
+ }
+ return dec, nil
+}
+
+func init() {
+ var acc float64 = 1
+ for i := 0; i <= 38; i++ {
+ scaletblflt64[i] = acc
+ acc *= 10
+ }
+}
+
+func (d Decimal) Bytes() []byte {
+ bytes := make([]byte, 16)
+ binary.BigEndian.PutUint32(bytes[0:4], d.integer[3])
+ binary.BigEndian.PutUint32(bytes[4:8], d.integer[2])
+ binary.BigEndian.PutUint32(bytes[8:12], d.integer[1])
+ binary.BigEndian.PutUint32(bytes[12:16], d.integer[0])
+ var x big.Int
+ x.SetBytes(bytes)
+ if !d.positive {
+ x.Neg(&x)
+ }
+ return scaleBytes(x.String(), d.scale)
+}
+
+func scaleBytes(s string, scale uint8) []byte {
+ z := make([]byte, 0, len(s)+1)
+ if s[0] == '-' || s[0] == '+' {
+ z = append(z, byte(s[0]))
+ s = s[1:]
+ }
+ pos := len(s) - int(scale)
+ if pos <= 0 {
+ z = append(z, byte('0'))
+ } else if pos > 0 {
+ z = append(z, []byte(s[:pos])...)
+ }
+ if scale > 0 {
+ z = append(z, byte('.'))
+ for pos < 0 {
+ z = append(z, byte('0'))
+ pos++
+ }
+ z = append(z, []byte(s[pos:])...)
+ }
+ return z
+}
+
+func (d Decimal) String() string {
+ return string(d.Bytes())
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/decimal_test.go b/vendor/github.com/denisenkom/go-mssqldb/decimal_test.go
new file mode 100644
index 000000000..80df0da9a
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/decimal_test.go
@@ -0,0 +1,82 @@
+package mssql
+
+import (
+ "testing"
+)
+
+func TestToString(t *testing.T) {
+ values := []struct {
+ dec Decimal
+ s string
+ }{
+ {Decimal{positive: true, prec: 10, scale: 0, integer: [4]uint32{1, 0, 0, 0}}, "1"},
+ {Decimal{positive: false, prec: 10, scale: 0, integer: [4]uint32{1, 0, 0, 0}}, "-1"},
+ {Decimal{positive: true, prec: 10, scale: 1, integer: [4]uint32{1, 0, 0, 0}}, "0.1"},
+ {Decimal{positive: false, prec: 10, scale: 1, integer: [4]uint32{1, 0, 0, 0}}, "-0.1"},
+ {Decimal{positive: true, prec: 10, scale: 2, integer: [4]uint32{100, 0, 0, 0}}, "1.00"},
+ {Decimal{positive: false, prec: 10, scale: 2, integer: [4]uint32{100, 0, 0, 0}}, "-1.00"},
+ {Decimal{positive: true, prec: 30, scale: 0, integer: [4]uint32{0, 1, 0, 0}}, "4294967296"}, // 2^32
+ {Decimal{positive: true, prec: 30, scale: 0, integer: [4]uint32{0, 0, 1, 0}}, "18446744073709551616"}, // 2^64
+ {Decimal{positive: true, prec: 30, scale: 0, integer: [4]uint32{0, 1, 1, 0}}, "18446744078004518912"}, // 2^64+2^32
+ }
+ for _, v := range values {
+ if v.dec.String() != v.s {
+ t.Error("String values don't match ", v.dec.String(), v.s)
+ }
+ }
+}
+
+func TestToFloat64(t *testing.T) {
+ values := []struct {
+ dec Decimal
+ flt float64
+ }{
+ {Decimal{positive: true, prec: 1},
+ 0.0},
+ {Decimal{positive: true, prec: 1, integer: [4]uint32{1}},
+ 1.0},
+ {Decimal{positive: false, prec: 1, integer: [4]uint32{1}},
+ -1.0},
+ {Decimal{positive: true, prec: 1, scale: 1, integer: [4]uint32{5}},
+ 0.5},
+ {Decimal{positive: true, prec: 38, integer: [4]uint32{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}},
+ 3.402823669209385e+38},
+ {Decimal{positive: true, prec: 38, scale: 3, integer: [4]uint32{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}},
+ 3.402823669209385e+35},
+ }
+ for _, v := range values {
+ if v.dec.ToFloat64() != v.flt {
+ t.Error("ToFloat values don't match ", v.dec.ToFloat64(), v.flt)
+ }
+ }
+}
+
+func TestFromFloat64(t *testing.T) {
+ values := []struct {
+ dec Decimal
+ flt float64
+ }{
+ {Decimal{positive: true, prec: 20},
+ 0.0},
+ {Decimal{positive: true, prec: 20, integer: [4]uint32{1}},
+ 1.0},
+ {Decimal{positive: false, prec: 20, integer: [4]uint32{1}},
+ -1.0},
+ {Decimal{positive: true, prec: 20, scale: 1, integer: [4]uint32{5}},
+ 0.5},
+ {Decimal{positive: true, prec: 20, integer: [4]uint32{0, 0, 0xfffff000, 0xffffffff}},
+ 3.402823669209384e+38},
+ //{Decimal{positive: true, prec: 20, scale: 3, integer: [4]uint32{0, 0, 0xfffff000, 0xffffffff}},
+ // 3.402823669209385e+35},
+ }
+ for _, v := range values {
+ decfromflt, err := Float64ToDecimal(v.flt)
+ if err == nil {
+ if decfromflt != v.dec {
+ t.Error("FromFloat values don't match ", decfromflt, v.dec)
+ }
+ } else {
+ t.Error("Float64ToDecimal failed with error:", err.Error())
+ }
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/error.go b/vendor/github.com/denisenkom/go-mssqldb/error.go
new file mode 100644
index 000000000..20a0bb901
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/error.go
@@ -0,0 +1,39 @@
+package mssql
+
+import (
+ "fmt"
+)
+
+type Error struct {
+ Number int32
+ State uint8
+ Class uint8
+ Message string
+ ServerName string
+ ProcName string
+ LineNo int32
+}
+
+func (e Error) Error() string {
+ return "mssql: " + e.Message
+}
+
+type StreamError struct {
+ Message string
+}
+
+func (e StreamError) Error() string {
+ return e.Message
+}
+
+func streamErrorf(format string, v ...interface{}) StreamError {
+ return StreamError{"Invalid TDS stream: " + fmt.Sprintf(format, v...)}
+}
+
+func badStreamPanic(err error) {
+ panic(err)
+}
+
+func badStreamPanicf(format string, v ...interface{}) {
+ panic(streamErrorf(format, v...))
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/examples/simple.go b/vendor/github.com/denisenkom/go-mssqldb/examples/simple.go
new file mode 100644
index 000000000..ce06fa8ee
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/examples/simple.go
@@ -0,0 +1,53 @@
+package main
+
+import _ "github.com/denisenkom/go-mssqldb"
+import "database/sql"
+import "log"
+import "fmt"
+import "flag"
+
+var debug = flag.Bool("debug", false, "enable debugging")
+var password = flag.String("password", "", "the database password")
+var port *int = flag.Int("port", 1433, "the database port")
+var server = flag.String("server", "", "the database server")
+var user = flag.String("user", "", "the database user")
+
+func main() {
+ flag.Parse() // parse the command line args
+
+ if *debug {
+ fmt.Printf(" password:%s\n", *password)
+ fmt.Printf(" port:%d\n", *port)
+ fmt.Printf(" server:%s\n", *server)
+ fmt.Printf(" user:%s\n", *user)
+ }
+
+ connString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d", *server, *user, *password, *port)
+ if *debug {
+ fmt.Printf(" connString:%s\n", connString)
+ }
+ conn, err := sql.Open("mssql", connString)
+ if err != nil {
+ log.Fatal("Open connection failed:", err.Error())
+ }
+ defer conn.Close()
+
+ stmt, err := conn.Prepare("select 1, 'abc'")
+ if err != nil {
+ log.Fatal("Prepare failed:", err.Error())
+ }
+ defer stmt.Close()
+
+ row := stmt.QueryRow()
+ var somenumber int64
+ var somechars string
+ err = row.Scan(&somenumber, &somechars)
+ if err != nil {
+ log.Fatal("Scan failed:", err.Error())
+ }
+ fmt.Printf("somenumber:%d\n", somenumber)
+ fmt.Printf("somechars:%s\n", somechars)
+
+ fmt.Printf("bye\n")
+
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/examples/tsql.go b/vendor/github.com/denisenkom/go-mssqldb/examples/tsql.go
new file mode 100644
index 000000000..409404a0b
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/examples/tsql.go
@@ -0,0 +1,119 @@
+package main
+
+import (
+ "bufio"
+ "database/sql"
+ "flag"
+ "fmt"
+ "io"
+ "os"
+ "time"
+
+ _ "github.com/denisenkom/go-mssqldb"
+)
+
+func main() {
+ var (
+ userid = flag.String("U", "", "login_id")
+ password = flag.String("P", "", "password")
+ server = flag.String("S", "localhost", "server_name[\\instance_name]")
+ database = flag.String("d", "", "db_name")
+ )
+ flag.Parse()
+
+ dsn := "server=" + *server + ";user id=" + *userid + ";password=" + *password + ";database=" + *database
+ db, err := sql.Open("mssql", dsn)
+ if err != nil {
+ fmt.Println("Cannot connect: ", err.Error())
+ return
+ }
+ err = db.Ping()
+ if err != nil {
+ fmt.Println("Cannot connect: ", err.Error())
+ return
+ }
+ defer db.Close()
+ r := bufio.NewReader(os.Stdin)
+ for {
+ _, err = os.Stdout.Write([]byte("> "))
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ cmd, err := r.ReadString('\n')
+ if err != nil {
+ if err == io.EOF {
+ fmt.Println()
+ return
+ }
+ fmt.Println(err)
+ return
+ }
+ err = exec(db, cmd)
+ if err != nil {
+ fmt.Println(err)
+ }
+ }
+}
+
+func exec(db *sql.DB, cmd string) error {
+ rows, err := db.Query(cmd)
+ if err != nil {
+ return err
+ }
+ defer rows.Close()
+ cols, err := rows.Columns()
+ if err != nil {
+ return err
+ }
+ if cols == nil {
+ return nil
+ }
+ vals := make([]interface{}, len(cols))
+ for i := 0; i < len(cols); i++ {
+ vals[i] = new(interface{})
+ if i != 0 {
+ fmt.Print("\t")
+ }
+ fmt.Print(cols[i])
+ }
+ fmt.Println()
+ for rows.Next() {
+ err = rows.Scan(vals...)
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
+ for i := 0; i < len(vals); i++ {
+ if i != 0 {
+ fmt.Print("\t")
+ }
+ printValue(vals[i].(*interface{}))
+ }
+ fmt.Println()
+
+ }
+ if rows.Err() != nil {
+ return rows.Err()
+ }
+ return nil
+}
+
+func printValue(pval *interface{}) {
+ switch v := (*pval).(type) {
+ case nil:
+ fmt.Print("NULL")
+ case bool:
+ if v {
+ fmt.Print("1")
+ } else {
+ fmt.Print("0")
+ }
+ case []byte:
+ fmt.Print(string(v))
+ case time.Time:
+ fmt.Print(v.Format("2006-01-02 15:04:05.999"))
+ default:
+ fmt.Print(v)
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/log.go b/vendor/github.com/denisenkom/go-mssqldb/log.go
new file mode 100644
index 000000000..f350aed09
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/log.go
@@ -0,0 +1,23 @@
+package mssql
+
+import (
+ "log"
+)
+
+type Logger log.Logger
+
+func (logger *Logger) Printf(format string, v ...interface{}) {
+ if logger != nil {
+ (*log.Logger)(logger).Printf(format, v...)
+ } else {
+ log.Printf(format, v...)
+ }
+}
+
+func (logger *Logger) Println(v ...interface{}) {
+ if logger != nil {
+ (*log.Logger)(logger).Println(v...)
+ } else {
+ log.Println(v...)
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/mssql.go b/vendor/github.com/denisenkom/go-mssqldb/mssql.go
new file mode 100644
index 000000000..b675d910e
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/mssql.go
@@ -0,0 +1,472 @@
+package mssql
+
+import (
+ "database/sql"
+ "database/sql/driver"
+ "encoding/binary"
+ "errors"
+ "fmt"
+ "io"
+ "log"
+ "math"
+ "net"
+ "strings"
+ "sync"
+ "time"
+)
+
+var partnersCache partners = partners{mu: sync.RWMutex{}, v: make(map[string]string)}
+
+func init() {
+ sql.Register("mssql", &MssqlDriver{})
+}
+
+type MssqlDriver struct {
+ log *log.Logger
+}
+
+func (d *MssqlDriver) SetLogger(logger *log.Logger) {
+ d.log = logger
+}
+
+func CheckBadConn(err error) error {
+ if err == io.EOF {
+ return driver.ErrBadConn
+ }
+ neterr, ok := err.(net.Error)
+ if !ok || (!neterr.Timeout() && neterr.Temporary()) {
+ return err
+ }
+ return driver.ErrBadConn
+}
+
+type MssqlConn struct {
+ sess *tdsSession
+}
+
+func (c *MssqlConn) Commit() error {
+ headers := []headerStruct{
+ {hdrtype: dataStmHdrTransDescr,
+ data: transDescrHdr{c.sess.tranid, 1}.pack()},
+ }
+ if err := sendCommitXact(c.sess.buf, headers, "", 0, 0, ""); err != nil {
+ return err
+ }
+
+ tokchan := make(chan tokenStruct, 5)
+ go processResponse(c.sess, tokchan)
+ for tok := range tokchan {
+ switch token := tok.(type) {
+ case error:
+ return token
+ }
+ }
+ return nil
+}
+
+func (c *MssqlConn) Rollback() error {
+ headers := []headerStruct{
+ {hdrtype: dataStmHdrTransDescr,
+ data: transDescrHdr{c.sess.tranid, 1}.pack()},
+ }
+ if err := sendRollbackXact(c.sess.buf, headers, "", 0, 0, ""); err != nil {
+ return err
+ }
+
+ tokchan := make(chan tokenStruct, 5)
+ go processResponse(c.sess, tokchan)
+ for tok := range tokchan {
+ switch token := tok.(type) {
+ case error:
+ return token
+ }
+ }
+ return nil
+}
+
+func (c *MssqlConn) Begin() (driver.Tx, error) {
+ headers := []headerStruct{
+ {hdrtype: dataStmHdrTransDescr,
+ data: transDescrHdr{0, 1}.pack()},
+ }
+ if err := sendBeginXact(c.sess.buf, headers, 0, ""); err != nil {
+ return nil, CheckBadConn(err)
+ }
+ tokchan := make(chan tokenStruct, 5)
+ go processResponse(c.sess, tokchan)
+ for tok := range tokchan {
+ switch token := tok.(type) {
+ case error:
+ if c.sess.tranid != 0 {
+ return nil, token
+ }
+ return nil, CheckBadConn(token)
+ }
+ }
+ // successful BEGINXACT request will return sess.tranid
+ // for started transaction
+ return c, nil
+}
+
+func parseConnectionString(dsn string) (res map[string]string) {
+ res = map[string]string{}
+ parts := strings.Split(dsn, ";")
+ for _, part := range parts {
+ if len(part) == 0 {
+ continue
+ }
+ lst := strings.SplitN(part, "=", 2)
+ name := strings.TrimSpace(strings.ToLower(lst[0]))
+ if len(name) == 0 {
+ continue
+ }
+ var value string = ""
+ if len(lst) > 1 {
+ value = strings.TrimSpace(lst[1])
+ }
+ res[name] = value
+ }
+ return res
+}
+
+func (d *MssqlDriver) Open(dsn string) (driver.Conn, error) {
+ params := parseConnectionString(dsn)
+
+ conn, err := openConnection(dsn, params)
+ if err != nil {
+ return nil, err
+ }
+
+ conn.sess.log = (*Logger)(d.log)
+ return conn, nil
+}
+
+func openConnection(dsn string, params map[string]string) (*MssqlConn, error) {
+ sess, err := connect(params)
+ if err != nil {
+ partner := partnersCache.Get(dsn)
+ if partner == "" {
+ partner = params["failoverpartner"]
+ // remove the failoverpartner entry to prevent infinite recursion
+ delete(params, "failoverpartner")
+ if port, ok := params["failoverport"]; ok {
+ params["port"] = port
+ }
+ }
+
+ if partner != "" {
+ params["server"] = partner
+ return openConnection(dsn, params)
+ }
+
+ return nil, err
+ }
+
+ if partner := sess.partner; partner != "" {
+ // append an instance so the port will be ignored when this value is used;
+ // tds does not provide the port number.
+ if !strings.Contains(partner, `\`) {
+ partner += `\.`
+ }
+ partnersCache.Set(dsn, partner)
+ }
+
+ return &MssqlConn{sess}, nil
+}
+
+func (c *MssqlConn) Close() error {
+ return c.sess.buf.transport.Close()
+}
+
+type MssqlStmt struct {
+ c *MssqlConn
+ query string
+ paramCount int
+}
+
+func (c *MssqlConn) Prepare(query string) (driver.Stmt, error) {
+ q, paramCount := parseParams(query)
+ return &MssqlStmt{c, q, paramCount}, nil
+}
+
+func (s *MssqlStmt) Close() error {
+ return nil
+}
+
+func (s *MssqlStmt) NumInput() int {
+ return s.paramCount
+}
+
+func (s *MssqlStmt) sendQuery(args []driver.Value) (err error) {
+ headers := []headerStruct{
+ {hdrtype: dataStmHdrTransDescr,
+ data: transDescrHdr{s.c.sess.tranid, 1}.pack()},
+ }
+ if len(args) != s.paramCount {
+ return errors.New(fmt.Sprintf("sql: expected %d parameters, got %d", s.paramCount, len(args)))
+ }
+ if s.c.sess.logFlags&logSQL != 0 {
+ s.c.sess.log.Println(s.query)
+ }
+ if s.c.sess.logFlags&logParams != 0 && len(args) > 0 {
+ for i := 0; i < len(args); i++ {
+ s.c.sess.log.Printf("\t@p%d\t%v\n", i+1, args[i])
+ }
+
+ }
+ if len(args) == 0 {
+ if err = sendSqlBatch72(s.c.sess.buf, s.query, headers); err != nil {
+ if s.c.sess.tranid != 0 {
+ return err
+ }
+ return CheckBadConn(err)
+ }
+ } else {
+ params := make([]Param, len(args)+2)
+ decls := make([]string, len(args))
+ params[0], err = s.makeParam(s.query)
+ if err != nil {
+ return
+ }
+ for i, val := range args {
+ params[i+2], err = s.makeParam(val)
+ if err != nil {
+ return
+ }
+ name := fmt.Sprintf("@p%d", i+1)
+ params[i+2].Name = name
+ decls[i] = fmt.Sprintf("%s %s", name, makeDecl(params[i+2].ti))
+ }
+ params[1], err = s.makeParam(strings.Join(decls, ","))
+ if err != nil {
+ return
+ }
+ if err = sendRpc(s.c.sess.buf, headers, Sp_ExecuteSql, 0, params); err != nil {
+ if s.c.sess.tranid != 0 {
+ return err
+ }
+ return CheckBadConn(err)
+ }
+ }
+ return
+}
+
+func (s *MssqlStmt) Query(args []driver.Value) (res driver.Rows, err error) {
+ if err = s.sendQuery(args); err != nil {
+ return
+ }
+ tokchan := make(chan tokenStruct, 5)
+ go processResponse(s.c.sess, tokchan)
+ // process metadata
+ var cols []string
+loop:
+ for tok := range tokchan {
+ switch token := tok.(type) {
+ case doneStruct:
+ break loop
+ case []columnStruct:
+ cols = make([]string, len(token))
+ for i, col := range token {
+ cols[i] = col.ColName
+ }
+ break loop
+ case error:
+ if s.c.sess.tranid != 0 {
+ return nil, token
+ }
+ return nil, CheckBadConn(token)
+ }
+ }
+ return &MssqlRows{sess: s.c.sess, tokchan: tokchan, cols: cols}, nil
+}
+
+func (s *MssqlStmt) Exec(args []driver.Value) (res driver.Result, err error) {
+ if err = s.sendQuery(args); err != nil {
+ return
+ }
+ tokchan := make(chan tokenStruct, 5)
+ go processResponse(s.c.sess, tokchan)
+ var rowCount int64
+ for token := range tokchan {
+ switch token := token.(type) {
+ case doneInProcStruct:
+ if token.Status&doneCount != 0 {
+ rowCount = int64(token.RowCount)
+ }
+ case doneStruct:
+ if token.Status&doneCount != 0 {
+ rowCount = int64(token.RowCount)
+ }
+ case error:
+ if s.c.sess.logFlags&logErrors != 0 {
+ s.c.sess.log.Println("got error:", token)
+ }
+ if s.c.sess.tranid != 0 {
+ return nil, token
+ }
+ return nil, CheckBadConn(token)
+ }
+ }
+ return &MssqlResult{s.c, rowCount}, nil
+}
+
+type MssqlRows struct {
+ sess *tdsSession
+ cols []string
+ tokchan chan tokenStruct
+}
+
+func (rc *MssqlRows) Close() error {
+ for _ = range rc.tokchan {
+ }
+ rc.tokchan = nil
+ return nil
+}
+
+func (rc *MssqlRows) Columns() (res []string) {
+ return rc.cols
+}
+
+func (rc *MssqlRows) Next(dest []driver.Value) (err error) {
+ for tok := range rc.tokchan {
+ switch tokdata := tok.(type) {
+ case []columnStruct:
+ return streamErrorf("Unexpected token COLMETADATA")
+ case []interface{}:
+ for i := range dest {
+ dest[i] = tokdata[i]
+ }
+ return nil
+ case error:
+ return tokdata
+ }
+ }
+ return io.EOF
+}
+
+func (s *MssqlStmt) makeParam(val driver.Value) (res Param, err error) {
+ if val == nil {
+ res.ti.TypeId = typeNVarChar
+ res.buffer = nil
+ res.ti.Size = 2
+ return
+ }
+ switch val := val.(type) {
+ case int64:
+ res.ti.TypeId = typeIntN
+ res.buffer = make([]byte, 8)
+ res.ti.Size = 8
+ binary.LittleEndian.PutUint64(res.buffer, uint64(val))
+ case float64:
+ res.ti.TypeId = typeFltN
+ res.ti.Size = 8
+ res.buffer = make([]byte, 8)
+ binary.LittleEndian.PutUint64(res.buffer, math.Float64bits(val))
+ case []byte:
+ res.ti.TypeId = typeBigVarBin
+ res.ti.Size = len(val)
+ res.buffer = val
+ case string:
+ res.ti.TypeId = typeNVarChar
+ res.buffer = str2ucs2(val)
+ res.ti.Size = len(res.buffer)
+ case bool:
+ res.ti.TypeId = typeBitN
+ res.ti.Size = 1
+ res.buffer = make([]byte, 1)
+ if val {
+ res.buffer[0] = 1
+ }
+ case time.Time:
+ if s.c.sess.loginAck.TDSVersion >= verTDS73 {
+ res.ti.TypeId = typeDateTimeOffsetN
+ res.ti.Scale = 7
+ res.ti.Size = 10
+ buf := make([]byte, 10)
+ res.buffer = buf
+ days, ns := dateTime2(val)
+ ns /= 100
+ buf[0] = byte(ns)
+ buf[1] = byte(ns >> 8)
+ buf[2] = byte(ns >> 16)
+ buf[3] = byte(ns >> 24)
+ buf[4] = byte(ns >> 32)
+ buf[5] = byte(days)
+ buf[6] = byte(days >> 8)
+ buf[7] = byte(days >> 16)
+ _, offset := val.Zone()
+ offset /= 60
+ buf[8] = byte(offset)
+ buf[9] = byte(offset >> 8)
+ } else {
+ res.ti.TypeId = typeDateTimeN
+ res.ti.Size = 8
+ res.buffer = make([]byte, 8)
+ ref := time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC)
+ dur := val.Sub(ref)
+ days := dur / (24 * time.Hour)
+ tm := (300 * (dur % (24 * time.Hour))) / time.Second
+ binary.LittleEndian.PutUint32(res.buffer[0:4], uint32(days))
+ binary.LittleEndian.PutUint32(res.buffer[4:8], uint32(tm))
+ }
+ default:
+ err = fmt.Errorf("mssql: unknown type for %T", val)
+ return
+ }
+ return
+}
+
+type MssqlResult struct {
+ c *MssqlConn
+ rowsAffected int64
+}
+
+func (r *MssqlResult) RowsAffected() (int64, error) {
+ return r.rowsAffected, nil
+}
+
+func (r *MssqlResult) LastInsertId() (int64, error) {
+ s, err := r.c.Prepare("select cast(@@identity as bigint)")
+ if err != nil {
+ return 0, err
+ }
+ defer s.Close()
+ rows, err := s.Query(nil)
+ if err != nil {
+ return 0, err
+ }
+ defer rows.Close()
+ dest := make([]driver.Value, 1)
+ err = rows.Next(dest)
+ if err != nil {
+ return 0, err
+ }
+ if dest[0] == nil {
+ return -1, errors.New("There is no generated identity value")
+ }
+ lastInsertId := dest[0].(int64)
+ return lastInsertId, nil
+}
+
+type partners struct {
+ mu sync.RWMutex
+ v map[string]string
+}
+
+func (p *partners) Set(key, value string) error {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+ if _, ok := p.v[key]; ok {
+ return errors.New("key already exists")
+ }
+
+ p.v[key] = value
+ return nil
+}
+
+func (p *partners) Get(key string) (value string) {
+ p.mu.RLock()
+ value = p.v[key]
+ p.mu.RUnlock()
+ return
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/mssql_go1.3.go b/vendor/github.com/denisenkom/go-mssqldb/mssql_go1.3.go
new file mode 100644
index 000000000..22c6891d8
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/mssql_go1.3.go
@@ -0,0 +1,11 @@
+// +build go1.3
+
+package mssql
+
+import (
+ "net"
+)
+
+func createDialer(p *connectParams) *net.Dialer {
+ return &net.Dialer{Timeout: p.dial_timeout, KeepAlive: p.keepAlive}
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/mssql_go1.3pre.go b/vendor/github.com/denisenkom/go-mssqldb/mssql_go1.3pre.go
new file mode 100644
index 000000000..3c7e72716
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/mssql_go1.3pre.go
@@ -0,0 +1,11 @@
+// +build !go1.3
+
+package mssql
+
+import (
+ "net"
+)
+
+func createDialer(p *connectParams) *net.Dialer {
+ return &net.Dialer{Timeout: p.dial_timeout}
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/net.go b/vendor/github.com/denisenkom/go-mssqldb/net.go
new file mode 100644
index 000000000..72a87340d
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/net.go
@@ -0,0 +1,99 @@
+package mssql
+
+import (
+ "fmt"
+ "net"
+ "time"
+)
+
+type timeoutConn struct {
+ c net.Conn
+ timeout time.Duration
+ buf *tdsBuffer
+ packetPending bool
+ continueRead bool
+}
+
+func NewTimeoutConn(conn net.Conn, timeout time.Duration) *timeoutConn {
+ return &timeoutConn{
+ c: conn,
+ timeout: timeout,
+ }
+}
+
+func (c *timeoutConn) Read(b []byte) (n int, err error) {
+ if c.buf != nil {
+ if c.packetPending {
+ c.packetPending = false
+ err = c.buf.FinishPacket()
+ if err != nil {
+ err = fmt.Errorf("Cannot send handshake packet: %s", err.Error())
+ return
+ }
+ c.continueRead = false
+ }
+ if !c.continueRead {
+ var packet uint8
+ packet, err = c.buf.BeginRead()
+ if err != nil {
+ err = fmt.Errorf("Cannot read handshake packet: %s", err.Error())
+ return
+ }
+ if packet != packPrelogin {
+ err = fmt.Errorf("unexpected packet %d, expecting prelogin", packet)
+ return
+ }
+ c.continueRead = true
+ }
+ n, err = c.buf.Read(b)
+ return
+ }
+ err = c.c.SetDeadline(time.Now().Add(c.timeout))
+ if err != nil {
+ return
+ }
+ return c.c.Read(b)
+}
+
+func (c *timeoutConn) Write(b []byte) (n int, err error) {
+ if c.buf != nil {
+ if !c.packetPending {
+ c.buf.BeginPacket(packPrelogin)
+ c.packetPending = true
+ }
+ n, err = c.buf.Write(b)
+ if err != nil {
+ return
+ }
+ return
+ }
+ err = c.c.SetDeadline(time.Now().Add(c.timeout))
+ if err != nil {
+ return
+ }
+ return c.c.Write(b)
+}
+
+func (c timeoutConn) Close() error {
+ return c.c.Close()
+}
+
+func (c timeoutConn) LocalAddr() net.Addr {
+ return c.c.LocalAddr()
+}
+
+func (c timeoutConn) RemoteAddr() net.Addr {
+ return c.c.RemoteAddr()
+}
+
+func (c timeoutConn) SetDeadline(t time.Time) error {
+ panic("Not implemented")
+}
+
+func (c timeoutConn) SetReadDeadline(t time.Time) error {
+ panic("Not implemented")
+}
+
+func (c timeoutConn) SetWriteDeadline(t time.Time) error {
+ panic("Not implemented")
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/ntlm.go b/vendor/github.com/denisenkom/go-mssqldb/ntlm.go
new file mode 100644
index 000000000..f853435c6
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/ntlm.go
@@ -0,0 +1,283 @@
+// +build !windows
+
+package mssql
+
+import (
+ "crypto/des"
+ "crypto/md5"
+ "crypto/rand"
+ "encoding/binary"
+ "errors"
+ "strings"
+ "unicode/utf16"
+
+ "golang.org/x/crypto/md4"
+)
+
+const (
+ NEGOTIATE_MESSAGE = 1
+ CHALLENGE_MESSAGE = 2
+ AUTHENTICATE_MESSAGE = 3
+)
+
+const (
+ NEGOTIATE_UNICODE = 0x00000001
+ NEGOTIATE_OEM = 0x00000002
+ NEGOTIATE_TARGET = 0x00000004
+ NEGOTIATE_SIGN = 0x00000010
+ NEGOTIATE_SEAL = 0x00000020
+ NEGOTIATE_DATAGRAM = 0x00000040
+ NEGOTIATE_LMKEY = 0x00000080
+ NEGOTIATE_NTLM = 0x00000200
+ NEGOTIATE_ANONYMOUS = 0x00000800
+ NEGOTIATE_OEM_DOMAIN_SUPPLIED = 0x00001000
+ NEGOTIATE_OEM_WORKSTATION_SUPPLIED = 0x00002000
+ NEGOTIATE_ALWAYS_SIGN = 0x00008000
+ NEGOTIATE_TARGET_TYPE_DOMAIN = 0x00010000
+ NEGOTIATE_TARGET_TYPE_SERVER = 0x00020000
+ NEGOTIATE_EXTENDED_SESSIONSECURITY = 0x00080000
+ NEGOTIATE_IDENTIFY = 0x00100000
+ REQUEST_NON_NT_SESSION_KEY = 0x00400000
+ NEGOTIATE_TARGET_INFO = 0x00800000
+ NEGOTIATE_VERSION = 0x02000000
+ NEGOTIATE_128 = 0x20000000
+ NEGOTIATE_KEY_EXCH = 0x40000000
+ NEGOTIATE_56 = 0x80000000
+)
+
+const NEGOTIATE_FLAGS = NEGOTIATE_UNICODE |
+ NEGOTIATE_NTLM |
+ NEGOTIATE_OEM_DOMAIN_SUPPLIED |
+ NEGOTIATE_OEM_WORKSTATION_SUPPLIED |
+ NEGOTIATE_ALWAYS_SIGN |
+ NEGOTIATE_EXTENDED_SESSIONSECURITY
+
+type NTLMAuth struct {
+ Domain string
+ UserName string
+ Password string
+ Workstation string
+}
+
+func getAuth(user, password, service, workstation string) (Auth, bool) {
+ if !strings.ContainsRune(user, '\\') {
+ return nil, false
+ }
+ domain_user := strings.SplitN(user, "\\", 2)
+ return &NTLMAuth{
+ Domain: domain_user[0],
+ UserName: domain_user[1],
+ Password: password,
+ Workstation: workstation,
+ }, true
+}
+
+func utf16le(val string) []byte {
+ var v []byte
+ for _, r := range val {
+ if utf16.IsSurrogate(r) {
+ r1, r2 := utf16.EncodeRune(r)
+ v = append(v, byte(r1), byte(r1>>8))
+ v = append(v, byte(r2), byte(r2>>8))
+ } else {
+ v = append(v, byte(r), byte(r>>8))
+ }
+ }
+ return v
+}
+
+func (auth *NTLMAuth) InitialBytes() ([]byte, error) {
+ domain_len := len(auth.Domain)
+ workstation_len := len(auth.Workstation)
+ msg := make([]byte, 40+domain_len+workstation_len)
+ copy(msg, []byte("NTLMSSP\x00"))
+ binary.LittleEndian.PutUint32(msg[8:], NEGOTIATE_MESSAGE)
+ binary.LittleEndian.PutUint32(msg[12:], NEGOTIATE_FLAGS)
+ // Domain Name Fields
+ binary.LittleEndian.PutUint16(msg[16:], uint16(domain_len))
+ binary.LittleEndian.PutUint16(msg[18:], uint16(domain_len))
+ binary.LittleEndian.PutUint32(msg[20:], 40)
+ // Workstation Fields
+ binary.LittleEndian.PutUint16(msg[24:], uint16(workstation_len))
+ binary.LittleEndian.PutUint16(msg[26:], uint16(workstation_len))
+ binary.LittleEndian.PutUint32(msg[28:], uint32(40+domain_len))
+ // Version
+ binary.LittleEndian.PutUint32(msg[32:], 0)
+ binary.LittleEndian.PutUint32(msg[36:], 0)
+ // Payload
+ copy(msg[40:], auth.Domain)
+ copy(msg[40+domain_len:], auth.Workstation)
+ return msg, nil
+}
+
+var errorNTLM = errors.New("NTLM protocol error")
+
+func createDesKey(bytes, material []byte) {
+ material[0] = bytes[0]
+ material[1] = (byte)(bytes[0]<<7 | (bytes[1]&0xff)>>1)
+ material[2] = (byte)(bytes[1]<<6 | (bytes[2]&0xff)>>2)
+ material[3] = (byte)(bytes[2]<<5 | (bytes[3]&0xff)>>3)
+ material[4] = (byte)(bytes[3]<<4 | (bytes[4]&0xff)>>4)
+ material[5] = (byte)(bytes[4]<<3 | (bytes[5]&0xff)>>5)
+ material[6] = (byte)(bytes[5]<<2 | (bytes[6]&0xff)>>6)
+ material[7] = (byte)(bytes[6] << 1)
+}
+
+func oddParity(bytes []byte) {
+ for i := 0; i < len(bytes); i++ {
+ b := bytes[i]
+ needsParity := (((b >> 7) ^ (b >> 6) ^ (b >> 5) ^ (b >> 4) ^ (b >> 3) ^ (b >> 2) ^ (b >> 1)) & 0x01) == 0
+ if needsParity {
+ bytes[i] = bytes[i] | byte(0x01)
+ } else {
+ bytes[i] = bytes[i] & byte(0xfe)
+ }
+ }
+}
+
+func encryptDes(key []byte, cleartext []byte, ciphertext []byte) {
+ var desKey [8]byte
+ createDesKey(key, desKey[:])
+ cipher, err := des.NewCipher(desKey[:])
+ if err != nil {
+ panic(err)
+ }
+ cipher.Encrypt(ciphertext, cleartext)
+}
+
+func response(challenge [8]byte, hash [21]byte) (ret [24]byte) {
+ encryptDes(hash[:7], challenge[:], ret[:8])
+ encryptDes(hash[7:14], challenge[:], ret[8:16])
+ encryptDes(hash[14:], challenge[:], ret[16:])
+ return
+}
+
+func lmHash(password string) (hash [21]byte) {
+ var lmpass [14]byte
+ copy(lmpass[:14], []byte(strings.ToUpper(password)))
+ magic := []byte("KGS!@#$%")
+ encryptDes(lmpass[:7], magic, hash[:8])
+ encryptDes(lmpass[7:], magic, hash[8:])
+ return
+}
+
+func lmResponse(challenge [8]byte, password string) [24]byte {
+ hash := lmHash(password)
+ return response(challenge, hash)
+}
+
+func ntlmHash(password string) (hash [21]byte) {
+ h := md4.New()
+ h.Write(utf16le(password))
+ h.Sum(hash[:0])
+ return
+}
+
+func ntResponse(challenge [8]byte, password string) [24]byte {
+ hash := ntlmHash(password)
+ return response(challenge, hash)
+}
+
+func clientChallenge() (nonce [8]byte) {
+ _, err := rand.Read(nonce[:])
+ if err != nil {
+ panic(err)
+ }
+ return
+}
+
+func ntlmSessionResponse(clientNonce [8]byte, serverChallenge [8]byte, password string) [24]byte {
+ var sessionHash [16]byte
+ h := md5.New()
+ h.Write(serverChallenge[:])
+ h.Write(clientNonce[:])
+ h.Sum(sessionHash[:0])
+ var hash [8]byte
+ copy(hash[:], sessionHash[:8])
+ passwordHash := ntlmHash(password)
+ return response(hash, passwordHash)
+}
+
+func (auth *NTLMAuth) NextBytes(bytes []byte) ([]byte, error) {
+ if string(bytes[0:8]) != "NTLMSSP\x00" {
+ return nil, errorNTLM
+ }
+ if binary.LittleEndian.Uint32(bytes[8:12]) != CHALLENGE_MESSAGE {
+ return nil, errorNTLM
+ }
+ flags := binary.LittleEndian.Uint32(bytes[20:24])
+ var challenge [8]byte
+ copy(challenge[:], bytes[24:32])
+
+ var lm, nt []byte
+ if (flags & NEGOTIATE_EXTENDED_SESSIONSECURITY) != 0 {
+ nonce := clientChallenge()
+ var lm_bytes [24]byte
+ copy(lm_bytes[:8], nonce[:])
+ lm = lm_bytes[:]
+ nt_bytes := ntlmSessionResponse(nonce, challenge, auth.Password)
+ nt = nt_bytes[:]
+ } else {
+ lm_bytes := lmResponse(challenge, auth.Password)
+ lm = lm_bytes[:]
+ nt_bytes := ntResponse(challenge, auth.Password)
+ nt = nt_bytes[:]
+ }
+ lm_len := len(lm)
+ nt_len := len(nt)
+
+ domain16 := utf16le(auth.Domain)
+ domain_len := len(domain16)
+ user16 := utf16le(auth.UserName)
+ user_len := len(user16)
+ workstation16 := utf16le(auth.Workstation)
+ workstation_len := len(workstation16)
+
+ msg := make([]byte, 88+lm_len+nt_len+domain_len+user_len+workstation_len)
+ copy(msg, []byte("NTLMSSP\x00"))
+ binary.LittleEndian.PutUint32(msg[8:], AUTHENTICATE_MESSAGE)
+ // Lm Challenge Response Fields
+ binary.LittleEndian.PutUint16(msg[12:], uint16(lm_len))
+ binary.LittleEndian.PutUint16(msg[14:], uint16(lm_len))
+ binary.LittleEndian.PutUint32(msg[16:], 88)
+ // Nt Challenge Response Fields
+ binary.LittleEndian.PutUint16(msg[20:], uint16(nt_len))
+ binary.LittleEndian.PutUint16(msg[22:], uint16(nt_len))
+ binary.LittleEndian.PutUint32(msg[24:], uint32(88+lm_len))
+ // Domain Name Fields
+ binary.LittleEndian.PutUint16(msg[28:], uint16(domain_len))
+ binary.LittleEndian.PutUint16(msg[30:], uint16(domain_len))
+ binary.LittleEndian.PutUint32(msg[32:], uint32(88+lm_len+nt_len))
+ // User Name Fields
+ binary.LittleEndian.PutUint16(msg[36:], uint16(user_len))
+ binary.LittleEndian.PutUint16(msg[38:], uint16(user_len))
+ binary.LittleEndian.PutUint32(msg[40:], uint32(88+lm_len+nt_len+domain_len))
+ // Workstation Fields
+ binary.LittleEndian.PutUint16(msg[44:], uint16(workstation_len))
+ binary.LittleEndian.PutUint16(msg[46:], uint16(workstation_len))
+ binary.LittleEndian.PutUint32(msg[48:], uint32(88+lm_len+nt_len+domain_len+user_len))
+ // Encrypted Random Session Key Fields
+ binary.LittleEndian.PutUint16(msg[52:], 0)
+ binary.LittleEndian.PutUint16(msg[54:], 0)
+ binary.LittleEndian.PutUint32(msg[56:], uint32(88+lm_len+nt_len+domain_len+user_len+workstation_len))
+ // Negotiate Flags
+ binary.LittleEndian.PutUint32(msg[60:], flags)
+ // Version
+ binary.LittleEndian.PutUint32(msg[64:], 0)
+ binary.LittleEndian.PutUint32(msg[68:], 0)
+ // MIC
+ binary.LittleEndian.PutUint32(msg[72:], 0)
+ binary.LittleEndian.PutUint32(msg[76:], 0)
+ binary.LittleEndian.PutUint32(msg[88:], 0)
+ binary.LittleEndian.PutUint32(msg[84:], 0)
+ // Payload
+ copy(msg[88:], lm)
+ copy(msg[88+lm_len:], nt)
+ copy(msg[88+lm_len+nt_len:], domain16)
+ copy(msg[88+lm_len+nt_len+domain_len:], user16)
+ copy(msg[88+lm_len+nt_len+domain_len+user_len:], workstation16)
+ return msg, nil
+}
+
+func (auth *NTLMAuth) Free() {
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/ntlm_test.go b/vendor/github.com/denisenkom/go-mssqldb/ntlm_test.go
new file mode 100644
index 000000000..db56f4e38
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/ntlm_test.go
@@ -0,0 +1,76 @@
+// +build !windows
+
+package mssql
+
+import (
+ "encoding/hex"
+ "testing"
+)
+
+func TestLMOWFv1(t *testing.T) {
+ hash := lmHash("Password")
+ val := [21]byte{
+ 0xe5, 0x2c, 0xac, 0x67, 0x41, 0x9a, 0x9a, 0x22,
+ 0x4a, 0x3b, 0x10, 0x8f, 0x3f, 0xa6, 0xcb, 0x6d,
+ 0, 0, 0, 0, 0,
+ }
+ if hash != val {
+ t.Errorf("got:\n%sexpected:\n%s", hex.Dump(hash[:]), hex.Dump(val[:]))
+ }
+}
+
+func TestNTLMOWFv1(t *testing.T) {
+ hash := ntlmHash("Password")
+ val := [21]byte{
+ 0xa4, 0xf4, 0x9c, 0x40, 0x65, 0x10, 0xbd, 0xca, 0xb6, 0x82, 0x4e, 0xe7, 0xc3, 0x0f, 0xd8, 0x52,
+ 0, 0, 0, 0, 0,
+ }
+ if hash != val {
+ t.Errorf("got:\n%sexpected:\n%s", hex.Dump(hash[:]), hex.Dump(val[:]))
+ }
+}
+
+func TestNTLMv1Response(t *testing.T) {
+ challenge := [8]byte{
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ }
+ nt := ntResponse(challenge, "Password")
+ val := [24]byte{
+ 0x67, 0xc4, 0x30, 0x11, 0xf3, 0x02, 0x98, 0xa2, 0xad, 0x35, 0xec, 0xe6, 0x4f, 0x16, 0x33, 0x1c,
+ 0x44, 0xbd, 0xbe, 0xd9, 0x27, 0x84, 0x1f, 0x94,
+ }
+ if nt != val {
+ t.Errorf("got:\n%sexpected:\n%s", hex.Dump(nt[:]), hex.Dump(val[:]))
+ }
+}
+
+func TestLMv1Response(t *testing.T) {
+ challenge := [8]byte{
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ }
+ nt := lmResponse(challenge, "Password")
+ val := [24]byte{
+ 0x98, 0xde, 0xf7, 0xb8, 0x7f, 0x88, 0xaa, 0x5d, 0xaf, 0xe2, 0xdf, 0x77, 0x96, 0x88, 0xa1, 0x72,
+ 0xde, 0xf1, 0x1c, 0x7d, 0x5c, 0xcd, 0xef, 0x13,
+ }
+ if nt != val {
+ t.Errorf("got:\n%sexpected:\n%s", hex.Dump(nt[:]), hex.Dump(val[:]))
+ }
+}
+
+func TestNTLMSessionResponse(t *testing.T) {
+ challenge := [8]byte{
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ }
+ nonce := [8]byte{
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+ }
+ nt := ntlmSessionResponse(nonce, challenge, "Password")
+ val := [24]byte{
+ 0x75, 0x37, 0xf8, 0x03, 0xae, 0x36, 0x71, 0x28, 0xca, 0x45, 0x82, 0x04, 0xbd, 0xe7, 0xca, 0xf8,
+ 0x1e, 0x97, 0xed, 0x26, 0x83, 0x26, 0x72, 0x32,
+ }
+ if nt != val {
+ t.Errorf("got:\n%sexpected:\n%s", hex.Dump(nt[:]), hex.Dump(val[:]))
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/parser.go b/vendor/github.com/denisenkom/go-mssqldb/parser.go
new file mode 100644
index 000000000..9e37c16a6
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/parser.go
@@ -0,0 +1,227 @@
+package mssql
+
+import (
+ "bytes"
+ "io"
+ "strconv"
+)
+
+type parser struct {
+ r *bytes.Reader
+ w bytes.Buffer
+ paramCount int
+ paramMax int
+}
+
+func (p *parser) next() (rune, bool) {
+ ch, _, err := p.r.ReadRune()
+ if err != nil {
+ if err != io.EOF {
+ panic(err)
+ }
+ return 0, false
+ }
+ return ch, true
+}
+
+func (p *parser) unread() {
+ err := p.r.UnreadRune()
+ if err != nil {
+ panic(err)
+ }
+}
+
+func (p *parser) write(ch rune) {
+ p.w.WriteRune(ch)
+}
+
+type stateFunc func(*parser) stateFunc
+
+func parseParams(query string) (string, int) {
+ p := &parser{
+ r: bytes.NewReader([]byte(query)),
+ }
+ state := parseNormal
+ for state != nil {
+ state = state(p)
+ }
+ return p.w.String(), p.paramMax
+}
+
+func parseNormal(p *parser) stateFunc {
+ for {
+ ch, ok := p.next()
+ if !ok {
+ return nil
+ }
+ if ch == '?' {
+ return parseParameter
+ } else if ch == '$' || ch == ':' {
+ ch2, ok := p.next()
+ if !ok {
+ p.write(ch)
+ return nil
+ }
+ p.unread()
+ if ch2 >= '0' && ch2 <= '9' {
+ return parseParameter
+ }
+ }
+ p.write(ch)
+ switch ch {
+ case '\'':
+ return parseQuote
+ case '"':
+ return parseDoubleQuote
+ case '[':
+ return parseBracket
+ case '-':
+ return parseLineComment
+ case '/':
+ return parseComment
+ }
+ }
+}
+
+func parseParameter(p *parser) stateFunc {
+ var paramN int
+ var ok bool
+ for {
+ var ch rune
+ ch, ok = p.next()
+ if ok && ch >= '0' && ch <= '9' {
+ paramN = paramN*10 + int(ch-'0')
+ } else {
+ break
+ }
+ }
+ if ok {
+ p.unread()
+ }
+ if paramN == 0 {
+ p.paramCount++
+ paramN = p.paramCount
+ }
+ if paramN > p.paramMax {
+ p.paramMax = paramN
+ }
+ p.w.WriteString("@p")
+ p.w.WriteString(strconv.Itoa(paramN))
+ if !ok {
+ return nil
+ }
+ return parseNormal
+}
+
+func parseQuote(p *parser) stateFunc {
+ for {
+ ch, ok := p.next()
+ if !ok {
+ return nil
+ }
+ p.write(ch)
+ if ch == '\'' {
+ return parseNormal
+ }
+ }
+}
+
+func parseDoubleQuote(p *parser) stateFunc {
+ for {
+ ch, ok := p.next()
+ if !ok {
+ return nil
+ }
+ p.write(ch)
+ if ch == '"' {
+ return parseNormal
+ }
+ }
+}
+
+func parseBracket(p *parser) stateFunc {
+ for {
+ ch, ok := p.next()
+ if !ok {
+ return nil
+ }
+ p.write(ch)
+ if ch == ']' {
+ ch, ok = p.next()
+ if !ok {
+ return nil
+ }
+ if ch != ']' {
+ p.unread()
+ return parseNormal
+ }
+ p.write(ch)
+ }
+ }
+}
+
+func parseLineComment(p *parser) stateFunc {
+ ch, ok := p.next()
+ if !ok {
+ return nil
+ }
+ if ch != '-' {
+ p.unread()
+ return parseNormal
+ }
+ p.write(ch)
+ for {
+ ch, ok = p.next()
+ if !ok {
+ return nil
+ }
+ p.write(ch)
+ if ch == '\n' {
+ return parseNormal
+ }
+ }
+}
+
+func parseComment(p *parser) stateFunc {
+ var nested int
+ ch, ok := p.next()
+ if !ok {
+ return nil
+ }
+ if ch != '*' {
+ p.unread()
+ return parseNormal
+ }
+ p.write(ch)
+ for {
+ ch, ok = p.next()
+ if !ok {
+ return nil
+ }
+ p.write(ch)
+ for ch == '*' {
+ ch, ok = p.next()
+ if !ok {
+ return nil
+ }
+ p.write(ch)
+ if ch == '/' {
+ if nested == 0 {
+ return parseNormal
+ } else {
+ nested--
+ }
+ }
+ }
+ for ch == '/' {
+ ch, ok = p.next()
+ if !ok {
+ return nil
+ }
+ p.write(ch)
+ if ch == '*' {
+ nested++
+ }
+ }
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/parser_test.go b/vendor/github.com/denisenkom/go-mssqldb/parser_test.go
new file mode 100644
index 000000000..0901b2a89
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/parser_test.go
@@ -0,0 +1,50 @@
+package mssql
+
+import (
+ "testing"
+)
+
+func TestParseParams(t *testing.T) {
+ values := []struct {
+ s string
+ d string
+ n int
+ }{
+ {"select ?", "select @p1", 1},
+ {"select ?, ?", "select @p1, @p2", 2},
+ {"select ? -- ?", "select @p1 -- ?", 1},
+ {"select ? -- ?\n, ?", "select @p1 -- ?\n, @p2", 2},
+ {"select ? - ?", "select @p1 - @p2", 2},
+ {"select ? /* ? */, ?", "select @p1 /* ? */, @p2", 2},
+ {"select ? /* ? * ? */, ?", "select @p1 /* ? * ? */, @p2", 2},
+ {"select \"foo?\", [foo?], 'foo?', ?", "select \"foo?\", [foo?], 'foo?', @p1", 1},
+ {"select \"x\"\"y\", [x]]y], 'x''y', ?", "select \"x\"\"y\", [x]]y], 'x''y', @p1", 1},
+ {"select \"foo?\", ?", "select \"foo?\", @p1", 1},
+ {"select 'foo?', ?", "select 'foo?', @p1", 1},
+ {"select [foo?], ?", "select [foo?], @p1", 1},
+ {"select $1", "select @p1", 1},
+ {"select $1, $2", "select @p1, @p2", 2},
+ {"select $1, $1", "select @p1, @p1", 1},
+ {"select :1", "select @p1", 1},
+ {"select :1, :2", "select @p1, @p2", 2},
+ {"select :1, :1", "select @p1, @p1", 1},
+ {"select ?1", "select @p1", 1},
+ {"select ?1, ?2", "select @p1, @p2", 2},
+ {"select ?1, ?1", "select @p1, @p1", 1},
+ {"select $12", "select @p12", 12},
+ {"select ? /* ? /* ? */ ? */ ?", "select @p1 /* ? /* ? */ ? */ @p2", 2},
+ {"select ? /* ? / ? */ ?", "select @p1 /* ? / ? */ @p2", 2},
+ {"select $", "select $", 0},
+ {"select x::y", "select x::y", 0},
+ }
+
+ for _, v := range values {
+ d, n := parseParams(v.s)
+ if d != v.d {
+ t.Error("Parse params don't match ", d, v.d)
+ }
+ if n != v.n {
+ t.Error("Parse number of params don't match", n, v.n)
+ }
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/queries_test.go b/vendor/github.com/denisenkom/go-mssqldb/queries_test.go
new file mode 100644
index 000000000..0f0a7c00e
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/queries_test.go
@@ -0,0 +1,685 @@
+package mssql
+
+import (
+ "bytes"
+ "database/sql"
+ "fmt"
+ "log"
+ "math"
+ "net"
+ "os"
+ "strings"
+ "testing"
+ "time"
+)
+
+func TestSelect(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ type testStruct struct {
+ sql string
+ val interface{}
+ }
+
+ longstr := strings.Repeat("x", 10000)
+
+ values := []testStruct{
+ {"1", int64(1)},
+ {"-1", int64(-1)},
+ {"cast(1 as int)", int64(1)},
+ {"cast(-1 as int)", int64(-1)},
+ {"cast(1 as tinyint)", int64(1)},
+ {"cast(1 as smallint)", int64(1)},
+ {"cast(-1 as smallint)", int64(-1)},
+ {"cast(1 as bigint)", int64(1)},
+ {"cast(-1 as bigint)", int64(-1)},
+ {"cast(1 as bit)", true},
+ {"cast(0 as bit)", false},
+ {"'abc'", string("abc")},
+ {"cast(0.5 as float)", float64(0.5)},
+ {"cast(0.5 as real)", float64(0.5)},
+ {"cast(1 as decimal)", []byte("1")},
+ {"cast(1.2345 as money)", []byte("1.2345")},
+ {"cast(-1.2345 as money)", []byte("-1.2345")},
+ {"cast(1.2345 as smallmoney)", []byte("1.2345")},
+ {"cast(-1.2345 as smallmoney)", []byte("-1.2345")},
+ {"cast(0.5 as decimal(18,1))", []byte("0.5")},
+ {"cast(-0.5 as decimal(18,1))", []byte("-0.5")},
+ {"cast(-0.5 as numeric(18,1))", []byte("-0.5")},
+ {"cast(4294967296 as numeric(20,0))", []byte("4294967296")},
+ {"cast(-0.5 as numeric(18,2))", []byte("-0.50")},
+ {"N'abc'", string("abc")},
+ {"cast(null as nvarchar(3))", nil},
+ {"NULL", nil},
+ {"cast('2000-01-01' as datetime)", time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)},
+ {"cast('2000-01-01T12:13:14.12' as datetime)",
+ time.Date(2000, 1, 1, 12, 13, 14, 120000000, time.UTC)},
+ {"cast('2014-06-26 11:08:09.673' as datetime)", time.Date(2014, 06, 26, 11, 8, 9, 673000000, time.UTC)},
+ {"cast(NULL as datetime)", nil},
+ {"cast('2000-01-01T12:13:00' as smalldatetime)",
+ time.Date(2000, 1, 1, 12, 13, 0, 0, time.UTC)},
+ {"cast(0x6F9619FF8B86D011B42D00C04FC964FF as uniqueidentifier)",
+ []byte{0x6F, 0x96, 0x19, 0xFF, 0x8B, 0x86, 0xD0, 0x11, 0xB4, 0x2D, 0x00, 0xC0, 0x4F, 0xC9, 0x64, 0xFF}},
+ {"cast(NULL as uniqueidentifier)", nil},
+ {"cast(0x1234 as varbinary(2))", []byte{0x12, 0x34}},
+ {"cast(N'abc' as nvarchar(max))", "abc"},
+ {"cast(null as nvarchar(max))", nil},
+ {"cast('' as xml)", ""},
+ {"cast('abc' as text)", "abc"},
+ {"cast(null as text)", nil},
+ {"cast(N'abc' as ntext)", "abc"},
+ {"cast(0x1234 as image)", []byte{0x12, 0x34}},
+ {"cast(N'проверка' as nvarchar(max))", "проверка"},
+ {"cast(N'Δοκιμή' as nvarchar(max))", "Δοκιμή"},
+ {"cast(cast(N'สวัสดี' as nvarchar(max)) collate Thai_CI_AI as varchar(max))", "สวัสดี"}, // cp874
+ {"cast(cast(N'你好' as nvarchar(max)) collate Chinese_PRC_CI_AI as varchar(max))", "你好"}, // cp936
+ {"cast(cast(N'こんにちは' as nvarchar(max)) collate Japanese_CI_AI as varchar(max))", "こんにちは"}, // cp939
+ {"cast(cast(N'안녕하세요.' as nvarchar(max)) collate Korean_90_CI_AI as varchar(max))", "안녕하세요."}, // cp949
+ {"cast(cast(N'你好' as nvarchar(max)) collate Chinese_Hong_Kong_Stroke_90_CI_AI as varchar(max))", "你好"}, // cp950
+ {"cast(cast(N'cześć' as nvarchar(max)) collate Polish_CI_AI as varchar(max))", "cześć"}, // cp1250
+ {"cast(cast(N'Алло' as nvarchar(max)) collate Cyrillic_General_CI_AI as varchar(max))", "Алло"}, // cp1251
+ {"cast(cast(N'Bonjour' as nvarchar(max)) collate French_CI_AI as varchar(max))", "Bonjour"}, // cp1252
+ {"cast(cast(N'Γεια σας' as nvarchar(max)) collate Greek_CI_AI as varchar(max))", "Γεια σας"}, // cp1253
+ {"cast(cast(N'Merhaba' as nvarchar(max)) collate Turkish_CI_AI as varchar(max))", "Merhaba"}, // cp1254
+ {"cast(cast(N'שלום' as nvarchar(max)) collate Hebrew_CI_AI as varchar(max))", "שלום"}, // cp1255
+ {"cast(cast(N'مرحبا' as nvarchar(max)) collate Arabic_CI_AI as varchar(max))", "مرحبا"}, // cp1256
+ {"cast(cast(N'Sveiki' as nvarchar(max)) collate Lithuanian_CI_AI as varchar(max))", "Sveiki"}, // cp1257
+ {"cast(cast(N'chào' as nvarchar(max)) collate Vietnamese_CI_AI as varchar(max))", "chào"}, // cp1258
+ {fmt.Sprintf("cast(N'%s' as nvarchar(max))", longstr), longstr},
+ {"cast(NULL as sql_variant)", nil},
+ {"cast(cast(0x6F9619FF8B86D011B42D00C04FC964FF as uniqueidentifier) as sql_variant)",
+ []byte{0x6F, 0x96, 0x19, 0xFF, 0x8B, 0x86, 0xD0, 0x11, 0xB4, 0x2D, 0x00, 0xC0, 0x4F, 0xC9, 0x64, 0xFF}},
+ {"cast(cast(1 as bit) as sql_variant)", true},
+ {"cast(cast(10 as tinyint) as sql_variant)", int64(10)},
+ {"cast(cast(-10 as smallint) as sql_variant)", int64(-10)},
+ {"cast(cast(-20 as int) as sql_variant)", int64(-20)},
+ {"cast(cast(-20 as bigint) as sql_variant)", int64(-20)},
+ {"cast(cast('2000-01-01' as datetime) as sql_variant)", time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)},
+ {"cast(cast('2000-01-01T12:13:00' as smalldatetime) as sql_variant)",
+ time.Date(2000, 1, 1, 12, 13, 0, 0, time.UTC)},
+ {"cast(cast(0.125 as real) as sql_variant)", float64(0.125)},
+ {"cast(cast(0.125 as float) as sql_variant)", float64(0.125)},
+ {"cast(cast(1.2345 as smallmoney) as sql_variant)", []byte("1.2345")},
+ {"cast(cast(1.2345 as money) as sql_variant)", []byte("1.2345")},
+ {"cast(cast(0x1234 as varbinary(2)) as sql_variant)", []byte{0x12, 0x34}},
+ {"cast(cast(0x1234 as binary(2)) as sql_variant)", []byte{0x12, 0x34}},
+ {"cast(cast(-0.5 as decimal(18,1)) as sql_variant)", []byte("-0.5")},
+ {"cast(cast(-0.5 as numeric(18,1)) as sql_variant)", []byte("-0.5")},
+ {"cast(cast('abc' as varchar(3)) as sql_variant)", "abc"},
+ {"cast(cast('abc' as char(3)) as sql_variant)", "abc"},
+ {"cast(N'abc' as sql_variant)", "abc"},
+ }
+
+ for _, test := range values {
+ stmt, err := conn.Prepare("select " + test.sql)
+ if err != nil {
+ t.Error("Prepare failed:", test.sql, err.Error())
+ return
+ }
+ defer stmt.Close()
+
+ row := stmt.QueryRow()
+ var retval interface{}
+ err = row.Scan(&retval)
+ if err != nil {
+ t.Error("Scan failed:", test.sql, err.Error())
+ continue
+ }
+ var same bool
+ switch decodedval := retval.(type) {
+ case []byte:
+ switch decodedvaltest := test.val.(type) {
+ case []byte:
+ same = bytes.Equal(decodedval, decodedvaltest)
+ default:
+ same = false
+ }
+ default:
+ same = retval == test.val
+ }
+ if !same {
+ t.Errorf("Values don't match '%s' '%s' for test: %s", retval, test.val, test.sql)
+ continue
+ }
+ }
+}
+
+func TestSelectNewTypes(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+ var ver string
+ err := conn.QueryRow("select SERVERPROPERTY('productversion')").Scan(&ver)
+ if err != nil {
+ t.Fatalf("cannot select productversion: %s", err)
+ }
+ var n int
+ _, err = fmt.Sscanf(ver, "%d", &n)
+ if err != nil {
+ t.Fatalf("cannot parse productversion: %s", err)
+ }
+ // 8 is SQL 2000, 9 is SQL 2005, 10 is SQL 2008, 11 is SQL 2012
+ if n < 10 {
+ return
+ }
+ // run tests for new data types available only in SQL Server 2008 and later
+ type testStruct struct {
+ sql string
+ val interface{}
+ }
+ values := []testStruct{
+ {"cast('2000-01-01' as date)",
+ time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)},
+ {"cast(NULL as date)", nil},
+ {"cast('00:00:45.123' as time(3))",
+ time.Date(1, 1, 1, 00, 00, 45, 123000000, time.UTC)},
+ {"cast('11:56:45.123' as time(3))",
+ time.Date(1, 1, 1, 11, 56, 45, 123000000, time.UTC)},
+ {"cast('11:56:45' as time(0))",
+ time.Date(1, 1, 1, 11, 56, 45, 0, time.UTC)},
+ {"cast('2010-11-15T11:56:45.123' as datetime2(3))",
+ time.Date(2010, 11, 15, 11, 56, 45, 123000000, time.UTC)},
+ {"cast('2010-11-15T11:56:45' as datetime2(0))",
+ time.Date(2010, 11, 15, 11, 56, 45, 0, time.UTC)},
+ //{"cast('2010-11-15T11:56:45.123+10:00' as datetimeoffset(3))",
+ // time.Date(2010, 11, 15, 11, 56, 45, 123000000, time.FixedZone("", 10*60*60)) },
+ {"cast(cast('2000-01-01' as date) as sql_variant)",
+ time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)},
+ {"cast(cast('00:00:45.123' as time(3)) as sql_variant)",
+ time.Date(1, 1, 1, 00, 00, 45, 123000000, time.UTC)},
+ {"cast(cast('2010-11-15T11:56:45.123' as datetime2(3)) as sql_variant)",
+ time.Date(2010, 11, 15, 11, 56, 45, 123000000, time.UTC)},
+ //{"cast(cast('2010-11-15T11:56:45.123+10:00' as datetimeoffset(3)) as sql_variant)",
+ // time.Date(2010, 11, 15, 11, 56, 45, 123000000, time.FixedZone("", 10*60*60)) },
+ }
+ for _, test := range values {
+ stmt, err := conn.Prepare("select " + test.sql)
+ if err != nil {
+ t.Error("Prepare failed:", test.sql, err.Error())
+ return
+ }
+ defer stmt.Close()
+
+ row := stmt.QueryRow()
+ var retval interface{}
+ err = row.Scan(&retval)
+ if err != nil {
+ t.Error("Scan failed:", test.sql, err.Error())
+ continue
+ }
+ if retval != test.val {
+ t.Errorf("Values don't match '%s' '%s' for test: %s", retval, test.val, test.sql)
+ continue
+ }
+ }
+}
+
+func TestTrans(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ var tx *sql.Tx
+ var err error
+ if tx, err = conn.Begin(); err != nil {
+ t.Fatal("Begin failed", err.Error())
+ }
+ if err = tx.Commit(); err != nil {
+ t.Fatal("Commit failed", err.Error())
+ }
+
+ if tx, err = conn.Begin(); err != nil {
+ t.Fatal("Begin failed", err.Error())
+ }
+ if _, err = tx.Exec("create table #abc (fld int)"); err != nil {
+ t.Fatal("Create table failed", err.Error())
+ }
+ if err = tx.Rollback(); err != nil {
+ t.Fatal("Rollback failed", err.Error())
+ }
+}
+
+func TestParams(t *testing.T) {
+ longstr := strings.Repeat("x", 10000)
+ longbytes := make([]byte, 10000)
+ values := []interface{}{
+ int64(5),
+ "hello",
+ "",
+ []byte{1, 2, 3},
+ []byte{},
+ float64(1.12313554),
+ true,
+ false,
+ nil,
+ longstr,
+ longbytes,
+ }
+
+ conn := open(t)
+ defer conn.Close()
+
+ for _, val := range values {
+ row := conn.QueryRow("select ?", val)
+ var retval interface{}
+ err := row.Scan(&retval)
+ if err != nil {
+ t.Error("Scan failed", err.Error())
+ return
+ }
+ var same bool
+ switch decodedval := retval.(type) {
+ case []byte:
+ switch decodedvaltest := val.(type) {
+ case []byte:
+ same = bytes.Equal(decodedval, decodedvaltest)
+ default:
+ same = false
+ }
+ default:
+ same = retval == val
+ }
+ if !same {
+ t.Error("Value don't match", retval, val)
+ return
+ }
+ }
+}
+
+func TestExec(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ res, err := conn.Exec("create table #abc (fld int)")
+ if err != nil {
+ t.Fatal("Exec failed", err.Error())
+ }
+ _ = res
+}
+
+func TestDefaultTimeout(t *testing.T) {
+ if testing.Short() {
+ return
+ }
+ conn := open(t)
+ defer conn.Close()
+
+ res, err := conn.Exec("waitfor delay '00:31'")
+ if err == nil {
+ t.Fatal("Exec should fail with timeout")
+ }
+ if neterr, ok := err.(net.Error); !ok || !neterr.Timeout() {
+ t.Fatal("Exec should fail with timeout, failed with", err)
+ }
+ _ = res
+}
+
+func TestShortTimeout(t *testing.T) {
+ if testing.Short() {
+ return
+ }
+ dsn := makeConnStr() + ";Connection Timeout=2"
+ conn, err := sql.Open("mssql", dsn)
+ if err != nil {
+ t.Fatal("Open connection failed:", err.Error())
+ }
+ defer conn.Close()
+
+ res, err := conn.Exec("waitfor delay '00:03'")
+ if err == nil {
+ t.Fatal("Exec should fail with timeout")
+ }
+ if neterr, ok := err.(net.Error); !ok || !neterr.Timeout() {
+ t.Fatal("Exec should fail with timeout, failed with", err)
+ }
+ _ = res
+}
+
+func TestTwoQueries(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ rows, err := conn.Query("select 1")
+ if err != nil {
+ t.Fatal("First exec failed", err)
+ }
+ if !rows.Next() {
+ t.Fatal("First query didn't return row")
+ }
+ var i int
+ if err = rows.Scan(&i); err != nil {
+ t.Fatal("Scan failed", err)
+ }
+ if i != 1 {
+ t.Fatalf("Wrong value returned %d, should be 1", i)
+ }
+
+ if rows, err = conn.Query("select 2"); err != nil {
+ t.Fatal("Second query failed", err)
+ }
+ if !rows.Next() {
+ t.Fatal("Second query didn't return row")
+ }
+ if err = rows.Scan(&i); err != nil {
+ t.Fatal("Scan failed", err)
+ }
+ if i != 2 {
+ t.Fatalf("Wrong value returned %d, should be 2", i)
+ }
+}
+
+func TestError(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ _, err := conn.Query("exec bad")
+ if err == nil {
+ t.Fatal("Query should fail")
+ }
+
+ if sqlerr, ok := err.(Error); !ok {
+ t.Fatalf("Should be sql error, actually %T, %v", err, err)
+ } else {
+ if sqlerr.Number != 2812 { // Could not find stored procedure 'bad'
+ t.Fatalf("Should be specific error code 2812, actually %d %s", sqlerr.Number, sqlerr)
+ }
+ }
+}
+
+func TestQueryNoRows(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ var rows *sql.Rows
+ var err error
+ if rows, err = conn.Query("create table #abc (fld int)"); err != nil {
+ t.Fatal("Query failed", err)
+ }
+ if rows.Next() {
+ t.Fatal("Query shoulnd't return any rows")
+ }
+}
+
+func TestQueryManyNullsRow(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ var row *sql.Row
+ var err error
+ if row = conn.QueryRow("select null, null, null, null, null, null, null, null"); err != nil {
+ t.Fatal("Query failed", err)
+ }
+ var v [8]sql.NullInt64
+ if err = row.Scan(&v[0], &v[1], &v[2], &v[3], &v[4], &v[5], &v[6], &v[7]); err != nil {
+ t.Fatal("Scan failed", err)
+ }
+}
+
+func TestOrderBy(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ tx, err := conn.Begin()
+ if err != nil {
+ t.Fatal("Begin tran failed", err)
+ }
+ defer tx.Rollback()
+
+ _, err = tx.Exec("if (exists(select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME='tbl')) drop table tbl")
+ if err != nil {
+ t.Fatal("Drop table failed", err)
+ }
+
+ _, err = tx.Exec("create table tbl (fld1 int primary key, fld2 int)")
+ if err != nil {
+ t.Fatal("Create table failed", err)
+ }
+ _, err = tx.Exec("insert into tbl (fld1, fld2) values (1, 2)")
+ if err != nil {
+ t.Fatal("Insert failed", err)
+ }
+ _, err = tx.Exec("insert into tbl (fld1, fld2) values (2, 1)")
+ if err != nil {
+ t.Fatal("Insert failed", err)
+ }
+
+ rows, err := tx.Query("select * from tbl order by fld1")
+ if err != nil {
+ t.Fatal("Query failed", err)
+ }
+
+ for rows.Next() {
+ var fld1 int32
+ var fld2 int32
+ err = rows.Scan(&fld1, &fld2)
+ if err != nil {
+ t.Fatal("Scan failed", err)
+ }
+ }
+
+ err = rows.Err()
+ if err != nil {
+ t.Fatal("Rows have errors", err)
+ }
+}
+
+func TestScanDecimal(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ var f float64
+ err := conn.QueryRow("select cast(0.5 as numeric(25,1))").Scan(&f)
+ if err != nil {
+ t.Error("query row / scan failed:", err.Error())
+ return
+ }
+ if math.Abs(f-0.5) > 0.000001 {
+ t.Error("Value is not 0.5:", f)
+ return
+ }
+
+ var s string
+ err = conn.QueryRow("select cast(-0.05 as numeric(25,2))").Scan(&s)
+ if err != nil {
+ t.Error("query row / scan failed:", err.Error())
+ return
+ }
+ if s != "-0.05" {
+ t.Error("Value is not -0.05:", s)
+ return
+ }
+}
+
+func TestAffectedRows(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ tx, err := conn.Begin()
+ if err != nil {
+ t.Fatal("Begin tran failed", err)
+ }
+ defer tx.Rollback()
+
+ res, err := tx.Exec("create table #foo (bar int)")
+ if err != nil {
+ t.Fatal("create table failed")
+ }
+ n, err := res.RowsAffected()
+ if err != nil {
+ t.Fatal("rows affected failed")
+ }
+ if n != 0 {
+ t.Error("Expected 0 rows affected, got ", n)
+ }
+
+ res, err = tx.Exec("insert into #foo (bar) values (1)")
+ if err != nil {
+ t.Fatal("insert failed")
+ }
+ n, err = res.RowsAffected()
+ if err != nil {
+ t.Fatal("rows affected failed")
+ }
+ if n != 1 {
+ t.Error("Expected 1 row affected, got ", n)
+ }
+
+ res, err = tx.Exec("insert into #foo (bar) values (?)", 2)
+ if err != nil {
+ t.Fatal("insert failed")
+ }
+ n, err = res.RowsAffected()
+ if err != nil {
+ t.Fatal("rows affected failed")
+ }
+ if n != 1 {
+ t.Error("Expected 1 row affected, got ", n)
+ }
+}
+
+func TestIdentity(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ tx, err := conn.Begin()
+ if err != nil {
+ t.Fatal("Begin tran failed", err)
+ }
+ defer tx.Rollback()
+
+ res, err := tx.Exec("create table #foo (bar int identity, baz int unique)")
+ if err != nil {
+ t.Fatal("create table failed")
+ }
+
+ res, err = tx.Exec("insert into #foo (baz) values (1)")
+ if err != nil {
+ t.Fatal("insert failed")
+ }
+ n, err := res.LastInsertId()
+ if err != nil {
+ t.Fatal("last insert id failed")
+ }
+ if n != 1 {
+ t.Error("Expected 1 for identity, got ", n)
+ }
+
+ res, err = tx.Exec("insert into #foo (baz) values (20)")
+ if err != nil {
+ t.Fatal("insert failed")
+ }
+ n, err = res.LastInsertId()
+ if err != nil {
+ t.Fatal("last insert id failed")
+ }
+ if n != 2 {
+ t.Error("Expected 2 for identity, got ", n)
+ }
+
+ res, err = tx.Exec("insert into #foo (baz) values (1)")
+ if err == nil {
+ t.Fatal("insert should fail")
+ }
+
+ res, err = tx.Exec("insert into #foo (baz) values (?)", 1)
+ if err == nil {
+ t.Fatal("insert should fail")
+ }
+}
+
+func TestDateTimeParam(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ t1, err := time.Parse("2006-01-02 15:04:05.99", "2004-06-03 12:13:14.15")
+ if err != nil {
+ t.Error("time parse failed", err.Error())
+ return
+ }
+ var t2 time.Time
+ err = conn.QueryRow("select ?", t1).Scan(&t2)
+ if err != nil {
+ t.Error("select / scan failed", err.Error())
+ return
+ }
+ if t1.Sub(t2) != 0 {
+ t.Errorf("datetime does not match: '%s' '%s' delta: %d", t1, t2, t1.Sub(t2))
+ return
+ }
+}
+
+func TestBigQuery(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+ rows, err := conn.Query(`WITH n(n) AS
+ (
+ SELECT 1
+ UNION ALL
+ SELECT n+1 FROM n WHERE n < 10000
+ )
+ SELECT n, @@version FROM n ORDER BY n
+ OPTION (MAXRECURSION 10000);`)
+ if err != nil {
+ t.Fatal("cannot exec query", err)
+ }
+ rows.Next()
+ rows.Close()
+ var res int
+ err = conn.QueryRow("select 0").Scan(&res)
+ if err != nil {
+ t.Fatal("cannot scan value", err)
+ }
+ if res != 0 {
+ t.Fatal("expected 0, got ", res)
+ }
+}
+
+func TestBug32(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ tx, err := conn.Begin()
+ if err != nil {
+ t.Fatal("Begin tran failed", err)
+ }
+ defer tx.Rollback()
+
+ _, err = tx.Exec("if (exists(select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME='tbl')) drop table tbl")
+ if err != nil {
+ t.Fatal("Drop table failed", err)
+ }
+
+ _, err = tx.Exec("create table tbl(a int primary key,fld bit null)")
+ if err != nil {
+ t.Fatal("Create table failed", err)
+ }
+
+ _, err = tx.Exec("insert into tbl (a,fld) values (1,nullif(?, ''))", "")
+ if err != nil {
+ t.Fatal("Insert failed", err)
+ }
+}
+
+func TestLogging(t *testing.T) {
+ flags := log.Flags()
+ defer func() {
+ log.SetFlags(flags)
+ log.SetOutput(os.Stderr)
+ }()
+ log.SetFlags(0)
+ var b bytes.Buffer
+ log.SetOutput(&b)
+
+ dsn := makeConnStr() + ";Log=2"
+ conn, err := sql.Open("mssql", dsn)
+ if err != nil {
+ t.Fatal("Open connection failed:", err.Error())
+ }
+ defer conn.Close()
+ _, err = conn.Exec("print 'test'")
+ if err != nil {
+ t.Fatal("Exec print failed", err.Error())
+ }
+ if b.String() != "test\n" {
+ t.Fatal("logging test failed, got", b.String())
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/rpc.go b/vendor/github.com/denisenkom/go-mssqldb/rpc.go
new file mode 100644
index 000000000..00b9b1e21
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/rpc.go
@@ -0,0 +1,100 @@
+package mssql
+
+import (
+ "encoding/binary"
+)
+
+type ProcId struct {
+ id uint16
+ name string
+}
+
+// parameter flags
+const (
+ fByRevValue = 1
+ fDefaultValue = 2
+)
+
+type Param struct {
+ Name string
+ Flags uint8
+ ti typeInfo
+ buffer []byte
+}
+
+func MakeProcId(name string) (res ProcId) {
+ res.name = name
+ if len(name) == 0 {
+ panic("Proc name shouln't be empty")
+ }
+ if len(name) >= 0xffff {
+ panic("Invalid length of procedure name, should be less than 0xffff")
+ }
+ return res
+}
+
+const (
+ fWithRecomp = 1
+ fNoMetaData = 2
+ fReuseMetaData = 4
+)
+
+var (
+ Sp_Cursor = ProcId{1, ""}
+ Sp_CursorOpen = ProcId{2, ""}
+ Sp_CursorPrepare = ProcId{3, ""}
+ Sp_CursorExecute = ProcId{4, ""}
+ Sp_CursorPrepExec = ProcId{5, ""}
+ Sp_CursorUnprepare = ProcId{6, ""}
+ Sp_CursorFetch = ProcId{7, ""}
+ Sp_CursorOption = ProcId{8, ""}
+ Sp_CursorClose = ProcId{9, ""}
+ Sp_ExecuteSql = ProcId{10, ""}
+ Sp_Prepare = ProcId{11, ""}
+ Sp_PrepExec = ProcId{13, ""}
+ Sp_PrepExecRpc = ProcId{14, ""}
+ Sp_Unprepare = ProcId{15, ""}
+)
+
+// http://msdn.microsoft.com/en-us/library/dd357576.aspx
+func sendRpc(buf *tdsBuffer, headers []headerStruct, proc ProcId, flags uint16, params []Param) (err error) {
+ buf.BeginPacket(packRPCRequest)
+ writeAllHeaders(buf, headers)
+ if len(proc.name) == 0 {
+ var idswitch uint16 = 0xffff
+ err = binary.Write(buf, binary.LittleEndian, &idswitch)
+ if err != nil {
+ return
+ }
+ err = binary.Write(buf, binary.LittleEndian, &proc.id)
+ if err != nil {
+ return
+ }
+ } else {
+ err = writeUsVarChar(buf, proc.name)
+ if err != nil {
+ return
+ }
+ }
+ err = binary.Write(buf, binary.LittleEndian, &flags)
+ if err != nil {
+ return
+ }
+ for _, param := range params {
+ if err = writeBVarChar(buf, param.Name); err != nil {
+ return
+ }
+ if err = binary.Write(buf, binary.LittleEndian, param.Flags); err != nil {
+ return
+ }
+ err = writeTypeInfo(buf, ¶m.ti)
+ if err != nil {
+ return
+ }
+ err = param.ti.Writer(buf, param.ti, param.buffer)
+ if err != nil {
+ return
+ }
+ }
+ return buf.FinishPacket()
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/sspi_windows.go b/vendor/github.com/denisenkom/go-mssqldb/sspi_windows.go
new file mode 100644
index 000000000..a6e95051c
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/sspi_windows.go
@@ -0,0 +1,266 @@
+package mssql
+
+import (
+ "fmt"
+ "strings"
+ "syscall"
+ "unsafe"
+)
+
+var (
+ secur32_dll = syscall.NewLazyDLL("secur32.dll")
+ initSecurityInterface = secur32_dll.NewProc("InitSecurityInterfaceW")
+ sec_fn *SecurityFunctionTable
+)
+
+func init() {
+ ptr, _, _ := initSecurityInterface.Call()
+ sec_fn = (*SecurityFunctionTable)(unsafe.Pointer(ptr))
+}
+
+const (
+ SEC_E_OK = 0
+ SECPKG_CRED_OUTBOUND = 2
+ SEC_WINNT_AUTH_IDENTITY_UNICODE = 2
+ ISC_REQ_DELEGATE = 0x00000001
+ ISC_REQ_REPLAY_DETECT = 0x00000004
+ ISC_REQ_SEQUENCE_DETECT = 0x00000008
+ ISC_REQ_CONFIDENTIALITY = 0x00000010
+ ISC_REQ_CONNECTION = 0x00000800
+ SECURITY_NETWORK_DREP = 0
+ SEC_I_CONTINUE_NEEDED = 0x00090312
+ SEC_I_COMPLETE_NEEDED = 0x00090313
+ SEC_I_COMPLETE_AND_CONTINUE = 0x00090314
+ SECBUFFER_VERSION = 0
+ SECBUFFER_TOKEN = 2
+ NTLMBUF_LEN = 12000
+)
+
+const ISC_REQ = ISC_REQ_CONFIDENTIALITY |
+ ISC_REQ_REPLAY_DETECT |
+ ISC_REQ_SEQUENCE_DETECT |
+ ISC_REQ_CONNECTION |
+ ISC_REQ_DELEGATE
+
+type SecurityFunctionTable struct {
+ dwVersion uint32
+ EnumerateSecurityPackages uintptr
+ QueryCredentialsAttributes uintptr
+ AcquireCredentialsHandle uintptr
+ FreeCredentialsHandle uintptr
+ Reserved2 uintptr
+ InitializeSecurityContext uintptr
+ AcceptSecurityContext uintptr
+ CompleteAuthToken uintptr
+ DeleteSecurityContext uintptr
+ ApplyControlToken uintptr
+ QueryContextAttributes uintptr
+ ImpersonateSecurityContext uintptr
+ RevertSecurityContext uintptr
+ MakeSignature uintptr
+ VerifySignature uintptr
+ FreeContextBuffer uintptr
+ QuerySecurityPackageInfo uintptr
+ Reserved3 uintptr
+ Reserved4 uintptr
+ Reserved5 uintptr
+ Reserved6 uintptr
+ Reserved7 uintptr
+ Reserved8 uintptr
+ QuerySecurityContextToken uintptr
+ EncryptMessage uintptr
+ DecryptMessage uintptr
+}
+
+type SEC_WINNT_AUTH_IDENTITY struct {
+ User *uint16
+ UserLength uint32
+ Domain *uint16
+ DomainLength uint32
+ Password *uint16
+ PasswordLength uint32
+ Flags uint32
+}
+
+type TimeStamp struct {
+ LowPart uint32
+ HighPart int32
+}
+
+type SecHandle struct {
+ dwLower uintptr
+ dwUpper uintptr
+}
+
+type SecBuffer struct {
+ cbBuffer uint32
+ BufferType uint32
+ pvBuffer *byte
+}
+
+type SecBufferDesc struct {
+ ulVersion uint32
+ cBuffers uint32
+ pBuffers *SecBuffer
+}
+
+type SSPIAuth struct {
+ Domain string
+ UserName string
+ Password string
+ Service string
+ cred SecHandle
+ ctxt SecHandle
+}
+
+func getAuth(user, password, service, workstation string) (Auth, bool) {
+ if user == "" {
+ return &SSPIAuth{Service: service}, true
+ }
+ if !strings.ContainsRune(user, '\\') {
+ return nil, false
+ }
+ domain_user := strings.SplitN(user, "\\", 2)
+ return &SSPIAuth{
+ Domain: domain_user[0],
+ UserName: domain_user[1],
+ Password: password,
+ Service: service,
+ }, true
+}
+
+func (auth *SSPIAuth) InitialBytes() ([]byte, error) {
+ var identity *SEC_WINNT_AUTH_IDENTITY
+ if auth.UserName != "" {
+ identity = &SEC_WINNT_AUTH_IDENTITY{
+ Flags: SEC_WINNT_AUTH_IDENTITY_UNICODE,
+ Password: syscall.StringToUTF16Ptr(auth.Password),
+ PasswordLength: uint32(len(auth.Password)),
+ Domain: syscall.StringToUTF16Ptr(auth.Domain),
+ DomainLength: uint32(len(auth.Domain)),
+ User: syscall.StringToUTF16Ptr(auth.UserName),
+ UserLength: uint32(len(auth.UserName)),
+ }
+ }
+ var ts TimeStamp
+ sec_ok, _, _ := syscall.Syscall9(sec_fn.AcquireCredentialsHandle,
+ 9,
+ 0,
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("Negotiate"))),
+ SECPKG_CRED_OUTBOUND,
+ 0,
+ uintptr(unsafe.Pointer(identity)),
+ 0,
+ 0,
+ uintptr(unsafe.Pointer(&auth.cred)),
+ uintptr(unsafe.Pointer(&ts)))
+ if sec_ok != SEC_E_OK {
+ return nil, fmt.Errorf("AcquireCredentialsHandle failed %x", sec_ok)
+ }
+
+ var buf SecBuffer
+ var desc SecBufferDesc
+ desc.ulVersion = SECBUFFER_VERSION
+ desc.cBuffers = 1
+ desc.pBuffers = &buf
+
+ outbuf := make([]byte, NTLMBUF_LEN)
+ buf.cbBuffer = NTLMBUF_LEN
+ buf.BufferType = SECBUFFER_TOKEN
+ buf.pvBuffer = &outbuf[0]
+
+ var attrs uint32
+ sec_ok, _, _ = syscall.Syscall12(sec_fn.InitializeSecurityContext,
+ 12,
+ uintptr(unsafe.Pointer(&auth.cred)),
+ 0,
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(auth.Service))),
+ ISC_REQ,
+ 0,
+ SECURITY_NETWORK_DREP,
+ 0,
+ 0,
+ uintptr(unsafe.Pointer(&auth.ctxt)),
+ uintptr(unsafe.Pointer(&desc)),
+ uintptr(unsafe.Pointer(&attrs)),
+ uintptr(unsafe.Pointer(&ts)))
+ if sec_ok == SEC_I_COMPLETE_AND_CONTINUE ||
+ sec_ok == SEC_I_COMPLETE_NEEDED {
+ syscall.Syscall6(sec_fn.CompleteAuthToken,
+ 2,
+ uintptr(unsafe.Pointer(&auth.ctxt)),
+ uintptr(unsafe.Pointer(&desc)),
+ 0, 0, 0, 0)
+ } else if sec_ok != SEC_E_OK &&
+ sec_ok != SEC_I_CONTINUE_NEEDED {
+ syscall.Syscall6(sec_fn.FreeCredentialsHandle,
+ 1,
+ uintptr(unsafe.Pointer(&auth.cred)),
+ 0, 0, 0, 0, 0)
+ return nil, fmt.Errorf("InitialBytes InitializeSecurityContext failed %x", sec_ok)
+ }
+ return outbuf[:buf.cbBuffer], nil
+}
+
+func (auth *SSPIAuth) NextBytes(bytes []byte) ([]byte, error) {
+ var in_buf, out_buf SecBuffer
+ var in_desc, out_desc SecBufferDesc
+
+ in_desc.ulVersion = SECBUFFER_VERSION
+ in_desc.cBuffers = 1
+ in_desc.pBuffers = &in_buf
+
+ out_desc.ulVersion = SECBUFFER_VERSION
+ out_desc.cBuffers = 1
+ out_desc.pBuffers = &out_buf
+
+ in_buf.BufferType = SECBUFFER_TOKEN
+ in_buf.pvBuffer = &bytes[0]
+ in_buf.cbBuffer = uint32(len(bytes))
+
+ outbuf := make([]byte, NTLMBUF_LEN)
+ out_buf.BufferType = SECBUFFER_TOKEN
+ out_buf.pvBuffer = &outbuf[0]
+ out_buf.cbBuffer = NTLMBUF_LEN
+
+ var attrs uint32
+ var ts TimeStamp
+ sec_ok, _, _ := syscall.Syscall12(sec_fn.InitializeSecurityContext,
+ 12,
+ uintptr(unsafe.Pointer(&auth.cred)),
+ uintptr(unsafe.Pointer(&auth.ctxt)),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(auth.Service))),
+ ISC_REQ,
+ 0,
+ SECURITY_NETWORK_DREP,
+ uintptr(unsafe.Pointer(&in_desc)),
+ 0,
+ uintptr(unsafe.Pointer(&auth.ctxt)),
+ uintptr(unsafe.Pointer(&out_desc)),
+ uintptr(unsafe.Pointer(&attrs)),
+ uintptr(unsafe.Pointer(&ts)))
+ if sec_ok == SEC_I_COMPLETE_AND_CONTINUE ||
+ sec_ok == SEC_I_COMPLETE_NEEDED {
+ syscall.Syscall6(sec_fn.CompleteAuthToken,
+ 2,
+ uintptr(unsafe.Pointer(&auth.ctxt)),
+ uintptr(unsafe.Pointer(&out_desc)),
+ 0, 0, 0, 0)
+ } else if sec_ok != SEC_E_OK &&
+ sec_ok != SEC_I_CONTINUE_NEEDED {
+ return nil, fmt.Errorf("NextBytes InitializeSecurityContext failed %x", sec_ok)
+ }
+
+ return outbuf[:out_buf.cbBuffer], nil
+}
+
+func (auth *SSPIAuth) Free() {
+ syscall.Syscall6(sec_fn.DeleteSecurityContext,
+ 1,
+ uintptr(unsafe.Pointer(&auth.ctxt)),
+ 0, 0, 0, 0, 0)
+ syscall.Syscall6(sec_fn.FreeCredentialsHandle,
+ 1,
+ uintptr(unsafe.Pointer(&auth.cred)),
+ 0, 0, 0, 0, 0)
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/tds.go b/vendor/github.com/denisenkom/go-mssqldb/tds.go
new file mode 100644
index 000000000..16718ee49
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/tds.go
@@ -0,0 +1,995 @@
+package mssql
+
+import (
+ "crypto/tls"
+ "crypto/x509"
+ "encoding/binary"
+ "errors"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net"
+ "os"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+ "unicode/utf16"
+ "unicode/utf8"
+)
+
+func parseInstances(msg []byte) map[string]map[string]string {
+ results := map[string]map[string]string{}
+ if len(msg) > 3 && msg[0] == 5 {
+ out_s := string(msg[3:])
+ tokens := strings.Split(out_s, ";")
+ instdict := map[string]string{}
+ got_name := false
+ var name string
+ for _, token := range tokens {
+ if got_name {
+ instdict[name] = token
+ got_name = false
+ } else {
+ name = token
+ if len(name) == 0 {
+ if len(instdict) == 0 {
+ break
+ }
+ results[strings.ToUpper(instdict["InstanceName"])] = instdict
+ instdict = map[string]string{}
+ continue
+ }
+ got_name = true
+ }
+ }
+ }
+ return results
+}
+
+func getInstances(address string) (map[string]map[string]string, error) {
+ conn, err := net.DialTimeout("udp", address+":1434", 5*time.Second)
+ if err != nil {
+ return nil, err
+ }
+ defer conn.Close()
+ _, err = conn.Write([]byte{3})
+ if err != nil {
+ return nil, err
+ }
+ var resp = make([]byte, 16*1024-1)
+ read, err := conn.Read(resp)
+ if err != nil {
+ return nil, err
+ }
+ return parseInstances(resp[:read]), nil
+}
+
+// tds versions
+const (
+ verTDS70 = 0x70000000
+ verTDS71 = 0x71000000
+ verTDS71rev1 = 0x71000001
+ verTDS72 = 0x72090002
+ verTDS73A = 0x730A0003
+ verTDS73 = verTDS73A
+ verTDS73B = 0x730B0003
+ verTDS74 = 0x74000004
+)
+
+// packet types
+const (
+ packSQLBatch = 1
+ packRPCRequest = 3
+ packReply = 4
+ packCancel = 6
+ packBulkLoadBCP = 7
+ packTransMgrReq = 14
+ packNormal = 15
+ packLogin7 = 16
+ packSSPIMessage = 17
+ packPrelogin = 18
+)
+
+// prelogin fields
+// http://msdn.microsoft.com/en-us/library/dd357559.aspx
+const (
+ preloginVERSION = 0
+ preloginENCRYPTION = 1
+ preloginINSTOPT = 2
+ preloginTHREADID = 3
+ preloginMARS = 4
+ preloginTRACEID = 5
+ preloginTERMINATOR = 0xff
+)
+
+const (
+ encryptOff = 0 // Encryption is available but off.
+ encryptOn = 1 // Encryption is available and on.
+ encryptNotSup = 2 // Encryption is not available.
+ encryptReq = 3 // Encryption is required.
+)
+
+type tdsSession struct {
+ buf *tdsBuffer
+ loginAck loginAckStruct
+ database string
+ partner string
+ columns []columnStruct
+ tranid uint64
+ logFlags uint64
+ log *Logger
+ routedServer string
+ routedPort uint16
+}
+
+const (
+ logErrors = 1
+ logMessages = 2
+ logRows = 4
+ logSQL = 8
+ logParams = 16
+ logTransaction = 32
+)
+
+type columnStruct struct {
+ UserType uint32
+ Flags uint16
+ ColName string
+ ti typeInfo
+}
+
+type KeySlice []uint8
+
+func (p KeySlice) Len() int { return len(p) }
+func (p KeySlice) Less(i, j int) bool { return p[i] < p[j] }
+func (p KeySlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+
+// http://msdn.microsoft.com/en-us/library/dd357559.aspx
+func writePrelogin(w *tdsBuffer, fields map[uint8][]byte) error {
+ var err error
+
+ w.BeginPacket(packPrelogin)
+ offset := uint16(5*len(fields) + 1)
+ keys := make(KeySlice, 0, len(fields))
+ for k, _ := range fields {
+ keys = append(keys, k)
+ }
+ sort.Sort(keys)
+ // writing header
+ for _, k := range keys {
+ err = w.WriteByte(k)
+ if err != nil {
+ return err
+ }
+ err = binary.Write(w, binary.BigEndian, offset)
+ if err != nil {
+ return err
+ }
+ v := fields[k]
+ size := uint16(len(v))
+ err = binary.Write(w, binary.BigEndian, size)
+ if err != nil {
+ return err
+ }
+ offset += size
+ }
+ err = w.WriteByte(preloginTERMINATOR)
+ if err != nil {
+ return err
+ }
+ // writing values
+ for _, k := range keys {
+ v := fields[k]
+ written, err := w.Write(v)
+ if err != nil {
+ return err
+ }
+ if written != len(v) {
+ return errors.New("Write method didn't write the whole value")
+ }
+ }
+ return w.FinishPacket()
+}
+
+func readPrelogin(r *tdsBuffer) (map[uint8][]byte, error) {
+ packet_type, err := r.BeginRead()
+ if err != nil {
+ return nil, err
+ }
+ struct_buf, err := ioutil.ReadAll(r)
+ if err != nil {
+ return nil, err
+ }
+ if packet_type != 4 {
+ return nil, errors.New("Invalid respones, expected packet type 4, PRELOGIN RESPONSE")
+ }
+ offset := 0
+ results := map[uint8][]byte{}
+ for true {
+ rec_type := struct_buf[offset]
+ if rec_type == preloginTERMINATOR {
+ break
+ }
+
+ rec_offset := binary.BigEndian.Uint16(struct_buf[offset+1:])
+ rec_len := binary.BigEndian.Uint16(struct_buf[offset+3:])
+ value := struct_buf[rec_offset : rec_offset+rec_len]
+ results[rec_type] = value
+ offset += 5
+ }
+ return results, nil
+}
+
+// OptionFlags2
+// http://msdn.microsoft.com/en-us/library/dd304019.aspx
+const (
+ fLanguageFatal = 1
+ fODBC = 2
+ fTransBoundary = 4
+ fCacheConnect = 8
+ fIntSecurity = 0x80
+)
+
+// TypeFlags
+const (
+ // 4 bits for fSQLType
+ // 1 bit for fOLEDB
+ fReadOnlyIntent = 32
+)
+
+type login struct {
+ TDSVersion uint32
+ PacketSize uint32
+ ClientProgVer uint32
+ ClientPID uint32
+ ConnectionID uint32
+ OptionFlags1 uint8
+ OptionFlags2 uint8
+ TypeFlags uint8
+ OptionFlags3 uint8
+ ClientTimeZone int32
+ ClientLCID uint32
+ HostName string
+ UserName string
+ Password string
+ AppName string
+ ServerName string
+ CtlIntName string
+ Language string
+ Database string
+ ClientID [6]byte
+ SSPI []byte
+ AtchDBFile string
+ ChangePassword string
+}
+
+type loginHeader struct {
+ Length uint32
+ TDSVersion uint32
+ PacketSize uint32
+ ClientProgVer uint32
+ ClientPID uint32
+ ConnectionID uint32
+ OptionFlags1 uint8
+ OptionFlags2 uint8
+ TypeFlags uint8
+ OptionFlags3 uint8
+ ClientTimeZone int32
+ ClientLCID uint32
+ HostNameOffset uint16
+ HostNameLength uint16
+ UserNameOffset uint16
+ UserNameLength uint16
+ PasswordOffset uint16
+ PasswordLength uint16
+ AppNameOffset uint16
+ AppNameLength uint16
+ ServerNameOffset uint16
+ ServerNameLength uint16
+ ExtensionOffset uint16
+ ExtensionLenght uint16
+ CtlIntNameOffset uint16
+ CtlIntNameLength uint16
+ LanguageOffset uint16
+ LanguageLength uint16
+ DatabaseOffset uint16
+ DatabaseLength uint16
+ ClientID [6]byte
+ SSPIOffset uint16
+ SSPILength uint16
+ AtchDBFileOffset uint16
+ AtchDBFileLength uint16
+ ChangePasswordOffset uint16
+ ChangePasswordLength uint16
+ SSPILongLength uint32
+}
+
+// convert Go string to UTF-16 encoded []byte (littleEndian)
+// done manually rather than using bytes and binary packages
+// for performance reasons
+func str2ucs2(s string) []byte {
+ res := utf16.Encode([]rune(s))
+ ucs2 := make([]byte, 2*len(res))
+ for i := 0; i < len(res); i++ {
+ ucs2[2*i] = byte(res[i])
+ ucs2[2*i+1] = byte(res[i] >> 8)
+ }
+ return ucs2
+}
+
+func ucs22str(s []byte) (string, error) {
+ if len(s)%2 != 0 {
+ return "", fmt.Errorf("Illegal UCS2 string length: %d", len(s))
+ }
+ buf := make([]uint16, len(s)/2)
+ for i := 0; i < len(s); i += 2 {
+ buf[i/2] = binary.LittleEndian.Uint16(s[i:])
+ }
+ return string(utf16.Decode(buf)), nil
+}
+
+func manglePassword(password string) []byte {
+ var ucs2password []byte = str2ucs2(password)
+ for i, ch := range ucs2password {
+ ucs2password[i] = ((ch<<4)&0xff | (ch >> 4)) ^ 0xA5
+ }
+ return ucs2password
+}
+
+// http://msdn.microsoft.com/en-us/library/dd304019.aspx
+func sendLogin(w *tdsBuffer, login login) error {
+ w.BeginPacket(packLogin7)
+ hostname := str2ucs2(login.HostName)
+ username := str2ucs2(login.UserName)
+ password := manglePassword(login.Password)
+ appname := str2ucs2(login.AppName)
+ servername := str2ucs2(login.ServerName)
+ ctlintname := str2ucs2(login.CtlIntName)
+ language := str2ucs2(login.Language)
+ database := str2ucs2(login.Database)
+ atchdbfile := str2ucs2(login.AtchDBFile)
+ changepassword := str2ucs2(login.ChangePassword)
+ hdr := loginHeader{
+ TDSVersion: login.TDSVersion,
+ PacketSize: login.PacketSize,
+ ClientProgVer: login.ClientProgVer,
+ ClientPID: login.ClientPID,
+ ConnectionID: login.ConnectionID,
+ OptionFlags1: login.OptionFlags1,
+ OptionFlags2: login.OptionFlags2,
+ TypeFlags: login.TypeFlags,
+ OptionFlags3: login.OptionFlags3,
+ ClientTimeZone: login.ClientTimeZone,
+ ClientLCID: login.ClientLCID,
+ HostNameLength: uint16(utf8.RuneCountInString(login.HostName)),
+ UserNameLength: uint16(utf8.RuneCountInString(login.UserName)),
+ PasswordLength: uint16(utf8.RuneCountInString(login.Password)),
+ AppNameLength: uint16(utf8.RuneCountInString(login.AppName)),
+ ServerNameLength: uint16(utf8.RuneCountInString(login.ServerName)),
+ CtlIntNameLength: uint16(utf8.RuneCountInString(login.CtlIntName)),
+ LanguageLength: uint16(utf8.RuneCountInString(login.Language)),
+ DatabaseLength: uint16(utf8.RuneCountInString(login.Database)),
+ ClientID: login.ClientID,
+ SSPILength: uint16(len(login.SSPI)),
+ AtchDBFileLength: uint16(utf8.RuneCountInString(login.AtchDBFile)),
+ ChangePasswordLength: uint16(utf8.RuneCountInString(login.ChangePassword)),
+ }
+ offset := uint16(binary.Size(hdr))
+ hdr.HostNameOffset = offset
+ offset += uint16(len(hostname))
+ hdr.UserNameOffset = offset
+ offset += uint16(len(username))
+ hdr.PasswordOffset = offset
+ offset += uint16(len(password))
+ hdr.AppNameOffset = offset
+ offset += uint16(len(appname))
+ hdr.ServerNameOffset = offset
+ offset += uint16(len(servername))
+ hdr.CtlIntNameOffset = offset
+ offset += uint16(len(ctlintname))
+ hdr.LanguageOffset = offset
+ offset += uint16(len(language))
+ hdr.DatabaseOffset = offset
+ offset += uint16(len(database))
+ hdr.SSPIOffset = offset
+ offset += uint16(len(login.SSPI))
+ hdr.AtchDBFileOffset = offset
+ offset += uint16(len(atchdbfile))
+ hdr.ChangePasswordOffset = offset
+ offset += uint16(len(changepassword))
+ hdr.Length = uint32(offset)
+ var err error
+ err = binary.Write(w, binary.LittleEndian, &hdr)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(hostname)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(username)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(password)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(appname)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(servername)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(ctlintname)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(language)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(database)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(login.SSPI)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(atchdbfile)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(changepassword)
+ if err != nil {
+ return err
+ }
+ return w.FinishPacket()
+}
+
+func readUcs2(r io.Reader, numchars int) (res string, err error) {
+ buf := make([]byte, numchars*2)
+ _, err = io.ReadFull(r, buf)
+ if err != nil {
+ return "", err
+ }
+ return ucs22str(buf)
+}
+
+func readUsVarChar(r io.Reader) (res string, err error) {
+ var numchars uint16
+ err = binary.Read(r, binary.LittleEndian, &numchars)
+ if err != nil {
+ return "", err
+ }
+ return readUcs2(r, int(numchars))
+}
+
+func writeUsVarChar(w io.Writer, s string) (err error) {
+ buf := str2ucs2(s)
+ var numchars int = len(buf) / 2
+ if numchars > 0xffff {
+ panic("invalid size for US_VARCHAR")
+ }
+ err = binary.Write(w, binary.LittleEndian, uint16(numchars))
+ if err != nil {
+ return
+ }
+ _, err = w.Write(buf)
+ return
+}
+
+func readBVarChar(r io.Reader) (res string, err error) {
+ var numchars uint8
+ err = binary.Read(r, binary.LittleEndian, &numchars)
+ if err != nil {
+ return "", err
+ }
+ return readUcs2(r, int(numchars))
+}
+
+func writeBVarChar(w io.Writer, s string) (err error) {
+ buf := str2ucs2(s)
+ var numchars int = len(buf) / 2
+ if numchars > 0xff {
+ panic("invalid size for B_VARCHAR")
+ }
+ err = binary.Write(w, binary.LittleEndian, uint8(numchars))
+ if err != nil {
+ return
+ }
+ _, err = w.Write(buf)
+ return
+}
+
+func readBVarByte(r io.Reader) (res []byte, err error) {
+ var length uint8
+ err = binary.Read(r, binary.LittleEndian, &length)
+ if err != nil {
+ return
+ }
+ res = make([]byte, length)
+ _, err = io.ReadFull(r, res)
+ return
+}
+
+func readUshort(r io.Reader) (res uint16, err error) {
+ err = binary.Read(r, binary.LittleEndian, &res)
+ return
+}
+
+func readByte(r io.Reader) (res byte, err error) {
+ var b [1]byte
+ _, err = r.Read(b[:])
+ res = b[0]
+ return
+}
+
+// Packet Data Stream Headers
+// http://msdn.microsoft.com/en-us/library/dd304953.aspx
+type headerStruct struct {
+ hdrtype uint16
+ data []byte
+}
+
+const (
+ dataStmHdrQueryNotif = 1 // query notifications
+ dataStmHdrTransDescr = 2 // MARS transaction descriptor (required)
+ dataStmHdrTraceActivity = 3
+)
+
+// MARS Transaction Descriptor Header
+// http://msdn.microsoft.com/en-us/library/dd340515.aspx
+type transDescrHdr struct {
+ transDescr uint64 // transaction descriptor returned from ENVCHANGE
+ outstandingReqCnt uint32 // outstanding request count
+}
+
+func (hdr transDescrHdr) pack() (res []byte) {
+ res = make([]byte, 8+4)
+ binary.LittleEndian.PutUint64(res, hdr.transDescr)
+ binary.LittleEndian.PutUint32(res[8:], hdr.outstandingReqCnt)
+ return res
+}
+
+func writeAllHeaders(w io.Writer, headers []headerStruct) (err error) {
+ // calculatint total length
+ var totallen uint32 = 4
+ for _, hdr := range headers {
+ totallen += 4 + 2 + uint32(len(hdr.data))
+ }
+ // writing
+ err = binary.Write(w, binary.LittleEndian, totallen)
+ if err != nil {
+ return err
+ }
+ for _, hdr := range headers {
+ var headerlen uint32 = 4 + 2 + uint32(len(hdr.data))
+ err = binary.Write(w, binary.LittleEndian, headerlen)
+ if err != nil {
+ return err
+ }
+ err = binary.Write(w, binary.LittleEndian, hdr.hdrtype)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(hdr.data)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func sendSqlBatch72(buf *tdsBuffer,
+ sqltext string,
+ headers []headerStruct) (err error) {
+ buf.BeginPacket(packSQLBatch)
+
+ writeAllHeaders(buf, headers)
+
+ _, err = buf.Write(str2ucs2(sqltext))
+ if err != nil {
+ return err
+ }
+ return buf.FinishPacket()
+}
+
+type connectParams struct {
+ logFlags uint64
+ port uint64
+ host string
+ instance string
+ database string
+ user string
+ password string
+ dial_timeout time.Duration
+ conn_timeout time.Duration
+ keepAlive time.Duration
+ encrypt bool
+ disableEncryption bool
+ trustServerCertificate bool
+ certificate string
+ hostInCertificate string
+ serverSPN string
+ workstation string
+ appname string
+ typeFlags uint8
+}
+
+func parseConnectParams(params map[string]string) (*connectParams, error) {
+ var p connectParams
+ strlog, ok := params["log"]
+ if ok {
+ var err error
+ p.logFlags, err = strconv.ParseUint(strlog, 10, 0)
+ if err != nil {
+ return nil, fmt.Errorf("Invalid log parameter '%s': %s", strlog, err.Error())
+ }
+ }
+ server := params["server"]
+ parts := strings.SplitN(server, "\\", 2)
+ p.host = parts[0]
+ if p.host == "." || strings.ToUpper(p.host) == "(LOCAL)" || p.host == "" {
+ p.host = "localhost"
+ }
+ if len(parts) > 1 {
+ p.instance = parts[1]
+ }
+ p.database = params["database"]
+ p.user = params["user id"]
+ p.password = params["password"]
+ p.port = 1433
+ if p.instance != "" {
+ p.instance = strings.ToUpper(p.instance)
+ instances, err := getInstances(p.host)
+ if err != nil {
+ f := "Unable to get instances from Sql Server Browser on host %v: %v"
+ return nil, fmt.Errorf(f, p.host, err.Error())
+ }
+ strport, ok := instances[p.instance]["tcp"]
+ if !ok {
+ f := "No instance matching '%v' returned from host '%v'"
+ return nil, fmt.Errorf(f, p.instance, p.host)
+ }
+ p.port, err = strconv.ParseUint(strport, 0, 16)
+ if err != nil {
+ f := "Invalid tcp port returned from Sql Server Browser '%v': %v"
+ return nil, fmt.Errorf(f, strport, err.Error())
+ }
+ } else {
+ strport, ok := params["port"]
+ if ok {
+ var err error
+ p.port, err = strconv.ParseUint(strport, 0, 16)
+ if err != nil {
+ f := "Invalid tcp port '%v': %v"
+ return nil, fmt.Errorf(f, strport, err.Error())
+ }
+ }
+ }
+ p.dial_timeout = 5 * time.Second
+ p.conn_timeout = 30 * time.Second
+ strconntimeout, ok := params["connection timeout"]
+ if ok {
+ timeout, err := strconv.ParseUint(strconntimeout, 0, 16)
+ if err != nil {
+ f := "Invalid connection timeout '%v': %v"
+ return nil, fmt.Errorf(f, strconntimeout, err.Error())
+ }
+ p.conn_timeout = time.Duration(timeout) * time.Second
+ }
+ strdialtimeout, ok := params["dial timeout"]
+ if ok {
+ timeout, err := strconv.ParseUint(strdialtimeout, 0, 16)
+ if err != nil {
+ f := "Invalid dial timeout '%v': %v"
+ return nil, fmt.Errorf(f, strdialtimeout, err.Error())
+ }
+ p.dial_timeout = time.Duration(timeout) * time.Second
+ }
+ keepAlive, ok := params["keepalive"]
+ if ok {
+ timeout, err := strconv.ParseUint(keepAlive, 0, 16)
+ if err != nil {
+ f := "Invalid keepAlive value '%s': %s"
+ return nil, fmt.Errorf(f, keepAlive, err.Error())
+ }
+ p.keepAlive = time.Duration(timeout) * time.Second
+ }
+ encrypt, ok := params["encrypt"]
+ if ok {
+ if strings.ToUpper(encrypt) == "DISABLE" {
+ p.disableEncryption = true
+ } else {
+ var err error
+ p.encrypt, err = strconv.ParseBool(encrypt)
+ if err != nil {
+ f := "Invalid encrypt '%s': %s"
+ return nil, fmt.Errorf(f, encrypt, err.Error())
+ }
+ }
+ } else {
+ p.trustServerCertificate = true
+ }
+ trust, ok := params["trustservercertificate"]
+ if ok {
+ var err error
+ p.trustServerCertificate, err = strconv.ParseBool(trust)
+ if err != nil {
+ f := "Invalid trust server certificate '%s': %s"
+ return nil, fmt.Errorf(f, trust, err.Error())
+ }
+ }
+ p.certificate = params["certificate"]
+ p.hostInCertificate, ok = params["hostnameincertificate"]
+ if !ok {
+ p.hostInCertificate = p.host
+ }
+
+ serverSPN, ok := params["ServerSPN"]
+ if ok {
+ p.serverSPN = serverSPN
+ } else {
+ p.serverSPN = fmt.Sprintf("MSSQLSvc/%s:%d", p.host, p.port)
+ }
+
+ workstation, ok := params["Workstation ID"]
+ if ok {
+ p.workstation = workstation
+ } else {
+ workstation, err := os.Hostname()
+ if err == nil {
+ p.workstation = workstation
+ }
+ }
+
+ appname, ok := params["app name"]
+ if !ok {
+ appname = "go-mssqldb"
+ }
+ p.appname = appname
+
+ appintent, ok := params["applicationintent"]
+ if ok {
+ if appintent == "ReadOnly" {
+ p.typeFlags |= fReadOnlyIntent
+ }
+ }
+
+ return &p, nil
+}
+
+type Auth interface {
+ InitialBytes() ([]byte, error)
+ NextBytes([]byte) ([]byte, error)
+ Free()
+}
+
+// SQL Server AlwaysOn Availability Group Listeners are bound by DNS to a
+// list of IP addresses. So if there is more than one, try them all and
+// use the first one that allows a connection.
+func dialConnection(p *connectParams) (conn net.Conn, err error) {
+ var ips []net.IP
+ ips, err = net.LookupIP(p.host)
+ if err != nil {
+ ip := net.ParseIP(p.host)
+ if ip == nil {
+ return nil, err
+ }
+ ips = []net.IP{ip}
+ }
+ if len(ips) == 1 {
+ d := createDialer(p)
+ addr := net.JoinHostPort(ips[0].String(), strconv.Itoa(int(p.port)))
+ conn, err = d.Dial("tcp", addr)
+
+ } else {
+ //Try Dials in parallel to avoid waiting for timeouts.
+ connChan := make(chan net.Conn, len(ips))
+ errChan := make(chan error, len(ips))
+ for _, ip := range ips {
+ go func(ip net.IP) {
+ d := createDialer(p)
+ addr := net.JoinHostPort(ip.String(), strconv.Itoa(int(p.port)))
+ conn, err := d.Dial("tcp", addr)
+ if err == nil {
+ connChan <- conn
+ } else {
+ errChan <- err
+ }
+ }(ip)
+ }
+ // Wait for either the *first* successful connection, or all the errors
+ wait_loop:
+ for i, _ := range ips {
+ select {
+ case conn = <-connChan:
+ // Got a connection to use, close any others
+ go func(n int) {
+ for i := 0; i < n; i++ {
+ select {
+ case conn := <-connChan:
+ conn.Close()
+ case <-errChan:
+ }
+ }
+ }(len(ips) - i - 1)
+ break wait_loop
+ case err = <-errChan:
+ }
+ }
+ }
+ if err != nil {
+ f := "Unable to open tcp connection with host '%v:%v': %v"
+ return nil, fmt.Errorf(f, p.host, p.port, err.Error())
+ }
+
+ return conn, err
+}
+
+func connect(params map[string]string) (res *tdsSession, err error) {
+ p, err := parseConnectParams(params)
+ if err != nil {
+ return nil, err
+ }
+
+initiate_connection:
+ conn, err := dialConnection(p)
+ if err != nil {
+ return nil, err
+ }
+
+ toconn := NewTimeoutConn(conn, p.conn_timeout)
+
+ outbuf := newTdsBuffer(4096, toconn)
+ sess := tdsSession{
+ buf: outbuf,
+ logFlags: p.logFlags,
+ }
+
+ instance_buf := []byte(p.instance)
+ instance_buf = append(instance_buf, 0) // zero terminate instance name
+ var encrypt byte
+ if p.disableEncryption {
+ encrypt = encryptNotSup
+ } else if p.encrypt {
+ encrypt = encryptOn
+ } else {
+ encrypt = encryptOff
+ }
+ fields := map[uint8][]byte{
+ preloginVERSION: {0, 0, 0, 0, 0, 0},
+ preloginENCRYPTION: {encrypt},
+ preloginINSTOPT: instance_buf,
+ preloginTHREADID: {0, 0, 0, 0},
+ preloginMARS: {0}, // MARS disabled
+ }
+
+ err = writePrelogin(outbuf, fields)
+ if err != nil {
+ return nil, err
+ }
+
+ fields, err = readPrelogin(outbuf)
+ if err != nil {
+ return nil, err
+ }
+
+ encryptBytes, ok := fields[preloginENCRYPTION]
+ if !ok {
+ return nil, fmt.Errorf("Encrypt negotiation failed")
+ }
+ encrypt = encryptBytes[0]
+ if p.encrypt && (encrypt == encryptNotSup || encrypt == encryptOff) {
+ return nil, fmt.Errorf("Server does not support encryption")
+ }
+
+ if encrypt != encryptNotSup {
+ var config tls.Config
+ if p.certificate != "" {
+ pem, err := ioutil.ReadFile(p.certificate)
+ if err != nil {
+ f := "Cannot read certificate '%s': %s"
+ return nil, fmt.Errorf(f, p.certificate, err.Error())
+ }
+ certs := x509.NewCertPool()
+ certs.AppendCertsFromPEM(pem)
+ config.RootCAs = certs
+ }
+ if p.trustServerCertificate {
+ config.InsecureSkipVerify = true
+ }
+ config.ServerName = p.hostInCertificate
+ outbuf.transport = conn
+ toconn.buf = outbuf
+ tlsConn := tls.Client(toconn, &config)
+ err = tlsConn.Handshake()
+ toconn.buf = nil
+ outbuf.transport = tlsConn
+ if err != nil {
+ f := "TLS Handshake failed: %s"
+ return nil, fmt.Errorf(f, err.Error())
+ }
+ if encrypt == encryptOff {
+ outbuf.afterFirst = func() {
+ outbuf.transport = toconn
+ }
+ }
+ }
+
+ login := login{
+ TDSVersion: verTDS74,
+ PacketSize: uint32(len(outbuf.buf)),
+ Database: p.database,
+ OptionFlags2: fODBC, // to get unlimited TEXTSIZE
+ HostName: p.workstation,
+ ServerName: p.host,
+ AppName: p.appname,
+ TypeFlags: p.typeFlags,
+ }
+ auth, auth_ok := getAuth(p.user, p.password, p.serverSPN, p.workstation)
+ if auth_ok {
+ login.SSPI, err = auth.InitialBytes()
+ if err != nil {
+ return nil, err
+ }
+ login.OptionFlags2 |= fIntSecurity
+ defer auth.Free()
+ } else {
+ login.UserName = p.user
+ login.Password = p.password
+ }
+ err = sendLogin(outbuf, login)
+ if err != nil {
+ return nil, err
+ }
+
+ // processing login response
+ var sspi_msg []byte
+continue_login:
+ tokchan := make(chan tokenStruct, 5)
+ go processResponse(&sess, tokchan)
+ success := false
+ for tok := range tokchan {
+ switch token := tok.(type) {
+ case sspiMsg:
+ sspi_msg, err = auth.NextBytes(token)
+ if err != nil {
+ return nil, err
+ }
+ case loginAckStruct:
+ success = true
+ sess.loginAck = token
+ case error:
+ return nil, fmt.Errorf("Login error: %s", token.Error())
+ }
+ }
+ if sspi_msg != nil {
+ outbuf.BeginPacket(packSSPIMessage)
+ _, err = outbuf.Write(sspi_msg)
+ if err != nil {
+ return nil, err
+ }
+ err = outbuf.FinishPacket()
+ if err != nil {
+ return nil, err
+ }
+ sspi_msg = nil
+ goto continue_login
+ }
+ if !success {
+ return nil, fmt.Errorf("Login failed")
+ }
+ if sess.routedServer != "" {
+ toconn.Close()
+ p.host = sess.routedServer
+ p.port = uint64(sess.routedPort)
+ goto initiate_connection
+ }
+ return &sess, nil
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/tds_test.go b/vendor/github.com/denisenkom/go-mssqldb/tds_test.go
new file mode 100644
index 000000000..7d4ddda25
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/tds_test.go
@@ -0,0 +1,336 @@
+package mssql
+
+import (
+ "bytes"
+ "database/sql"
+ "encoding/hex"
+ "fmt"
+ "os"
+ "testing"
+ "time"
+)
+
+type MockTransport struct {
+ bytes.Buffer
+}
+
+func (t *MockTransport) Close() error {
+ return nil
+}
+
+func TestSendLogin(t *testing.T) {
+ buf := newTdsBuffer(1024, new(MockTransport))
+ login := login{
+ TDSVersion: verTDS73,
+ PacketSize: 0x1000,
+ ClientProgVer: 0x01060100,
+ ClientPID: 100,
+ ClientTimeZone: -4 * 60,
+ ClientID: [6]byte{0x12, 0x34, 0x56, 0x78, 0x90, 0xab},
+ OptionFlags1: 0xe0,
+ OptionFlags3: 8,
+ HostName: "subdev1",
+ UserName: "test",
+ Password: "testpwd",
+ AppName: "appname",
+ ServerName: "servername",
+ CtlIntName: "library",
+ Language: "en",
+ Database: "database",
+ ClientLCID: 0x204,
+ AtchDBFile: "filepath",
+ }
+ err := sendLogin(buf, login)
+ if err != nil {
+ t.Error("sendLogin should succeed")
+ }
+ ref := []byte{
+ 16, 1, 0, 222, 0, 0, 1, 0, 198 + 16, 0, 0, 0, 3, 0, 10, 115, 0, 16, 0, 0, 0, 1,
+ 6, 1, 100, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 8, 16, 255, 255, 255, 4, 2, 0,
+ 0, 94, 0, 7, 0, 108, 0, 4, 0, 116, 0, 7, 0, 130, 0, 7, 0, 144, 0, 10, 0, 0,
+ 0, 0, 0, 164, 0, 7, 0, 178, 0, 2, 0, 182, 0, 8, 0, 18, 52, 86, 120, 144, 171,
+ 198, 0, 0, 0, 198, 0, 8, 0, 214, 0, 0, 0, 0, 0, 0, 0, 115, 0, 117, 0, 98,
+ 0, 100, 0, 101, 0, 118, 0, 49, 0, 116, 0, 101, 0, 115, 0, 116, 0, 226, 165,
+ 243, 165, 146, 165, 226, 165, 162, 165, 210, 165, 227, 165, 97, 0, 112,
+ 0, 112, 0, 110, 0, 97, 0, 109, 0, 101, 0, 115, 0, 101, 0, 114, 0, 118, 0,
+ 101, 0, 114, 0, 110, 0, 97, 0, 109, 0, 101, 0, 108, 0, 105, 0, 98, 0, 114,
+ 0, 97, 0, 114, 0, 121, 0, 101, 0, 110, 0, 100, 0, 97, 0, 116, 0, 97, 0, 98,
+ 0, 97, 0, 115, 0, 101, 0, 102, 0, 105, 0, 108, 0, 101, 0, 112, 0, 97, 0,
+ 116, 0, 104, 0}
+ out := buf.buf[:buf.pos]
+ if !bytes.Equal(ref, out) {
+ t.Error("input output don't match")
+ fmt.Print(hex.Dump(ref))
+ fmt.Print(hex.Dump(out))
+ }
+}
+
+func TestSendSqlBatch(t *testing.T) {
+ addr := os.Getenv("HOST")
+ instance := os.Getenv("INSTANCE")
+
+ conn, err := connect(map[string]string{
+ "server": fmt.Sprintf("%s\\%s", addr, instance),
+ "user id": os.Getenv("SQLUSER"),
+ "password": os.Getenv("SQLPASSWORD"),
+ "database": os.Getenv("DATABASE"),
+ })
+ if err != nil {
+ t.Error("Open connection failed:", err.Error())
+ return
+ }
+ defer conn.buf.transport.Close()
+
+ headers := []headerStruct{
+ {hdrtype: dataStmHdrTransDescr,
+ data: transDescrHdr{0, 1}.pack()},
+ }
+ err = sendSqlBatch72(conn.buf, "select 1", headers)
+ if err != nil {
+ t.Error("Sending sql batch failed", err.Error())
+ return
+ }
+
+ ch := make(chan tokenStruct, 5)
+ go processResponse(conn, ch)
+
+ var lastRow []interface{}
+loop:
+ for tok := range ch {
+ switch token := tok.(type) {
+ case doneStruct:
+ break loop
+ case []columnStruct:
+ conn.columns = token
+ case []interface{}:
+ lastRow = token
+ default:
+ fmt.Println("unknown token", tok)
+ }
+ }
+
+ switch value := lastRow[0].(type) {
+ case int32:
+ if value != 1 {
+ t.Error("Invalid value returned, should be 1", value)
+ return
+ }
+ }
+}
+
+func makeConnStr() string {
+ addr := os.Getenv("HOST")
+ instance := os.Getenv("INSTANCE")
+ user := os.Getenv("SQLUSER")
+ password := os.Getenv("SQLPASSWORD")
+ database := os.Getenv("DATABASE")
+ return fmt.Sprintf(
+ "Server=%s\\%s;User Id=%s;Password=%s;Database=%s;log=63",
+ addr, instance, user, password, database)
+}
+
+func open(t *testing.T) *sql.DB {
+ conn, err := sql.Open("mssql", makeConnStr())
+ if err != nil {
+ t.Error("Open connection failed:", err.Error())
+ return nil
+ }
+ return conn
+}
+
+func TestConnect(t *testing.T) {
+ conn, err := sql.Open("mssql", makeConnStr())
+ if err != nil {
+ t.Error("Open connection failed:", err.Error())
+ return
+ }
+ defer conn.Close()
+}
+
+func TestBadConnect(t *testing.T) {
+ badDsns := []string{
+ //"Server=badhost",
+ fmt.Sprintf("Server=%s\\%s;User ID=baduser;Password=badpwd",
+ os.Getenv("HOST"), os.Getenv("INSTANCE")),
+ }
+ for _, badDsn := range badDsns {
+ conn, err := sql.Open("mssql", badDsn)
+ if err != nil {
+ t.Error("Open connection failed:", err.Error())
+ }
+ defer conn.Close()
+ err = conn.Ping()
+ if err == nil {
+ t.Error("Ping should fail for connection: ", badDsn)
+ }
+ }
+}
+
+func simpleQuery(conn *sql.DB, t *testing.T) (stmt *sql.Stmt) {
+ stmt, err := conn.Prepare("select 1 as a")
+ if err != nil {
+ t.Error("Prepare failed:", err.Error())
+ return nil
+ }
+ return stmt
+}
+
+func checkSimpleQuery(rows *sql.Rows, t *testing.T) {
+ numrows := 0
+ for rows.Next() {
+ var val int
+ err := rows.Scan(&val)
+ if err != nil {
+ t.Error("Scan failed:", err.Error())
+ }
+ if val != 1 {
+ t.Error("query should return 1")
+ }
+ numrows++
+ }
+ if numrows != 1 {
+ t.Error("query should return 1 row, returned", numrows)
+ }
+}
+
+func TestQuery(t *testing.T) {
+ conn := open(t)
+ if conn == nil {
+ return
+ }
+ defer conn.Close()
+
+ stmt := simpleQuery(conn, t)
+ if stmt == nil {
+ return
+ }
+ defer stmt.Close()
+
+ rows, err := stmt.Query()
+ if err != nil {
+ t.Error("Query failed:", err.Error())
+ }
+ defer rows.Close()
+
+ columns, err := rows.Columns()
+ if err != nil {
+ t.Error("getting columns failed", err.Error())
+ }
+ if len(columns) != 1 && columns[0] != "a" {
+ t.Error("returned incorrect columns (expected ['a']):", columns)
+ }
+
+ checkSimpleQuery(rows, t)
+}
+
+func TestMultipleQueriesSequentialy(t *testing.T) {
+
+ conn := open(t)
+ defer conn.Close()
+
+ stmt, err := conn.Prepare("select 1 as a")
+ if err != nil {
+ t.Error("Prepare failed:", err.Error())
+ return
+ }
+ defer stmt.Close()
+
+ rows, err := stmt.Query()
+ if err != nil {
+ t.Error("Query failed:", err.Error())
+ return
+ }
+ defer rows.Close()
+ checkSimpleQuery(rows, t)
+
+ rows, err = stmt.Query()
+ if err != nil {
+ t.Error("Query failed:", err.Error())
+ return
+ }
+ defer rows.Close()
+ checkSimpleQuery(rows, t)
+}
+
+func TestMultipleQueryClose(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+
+ stmt, err := conn.Prepare("select 1 as a")
+ if err != nil {
+ t.Error("Prepare failed:", err.Error())
+ return
+ }
+ defer stmt.Close()
+
+ rows, err := stmt.Query()
+ if err != nil {
+ t.Error("Query failed:", err.Error())
+ return
+ }
+ rows.Close()
+
+ rows, err = stmt.Query()
+ if err != nil {
+ t.Error("Query failed:", err.Error())
+ return
+ }
+ defer rows.Close()
+ checkSimpleQuery(rows, t)
+}
+
+func TestPing(t *testing.T) {
+ conn := open(t)
+ defer conn.Close()
+ conn.Ping()
+}
+
+func TestSecureWithInvalidHostName(t *testing.T) {
+ dsn := makeConnStr() + ";Encrypt=true;TrustServerCertificate=false;hostNameInCertificate=foo.bar"
+ conn, err := sql.Open("mssql", dsn)
+ if err != nil {
+ t.Fatal("Open connection failed:", err.Error())
+ }
+ defer conn.Close()
+ err = conn.Ping()
+ if err == nil {
+ t.Fatal("Connected to fake foo.bar server")
+ }
+}
+
+func TestSecureConnection(t *testing.T) {
+ dsn := makeConnStr() + ";Encrypt=true;TrustServerCertificate=true"
+ conn, err := sql.Open("mssql", dsn)
+ if err != nil {
+ t.Fatal("Open connection failed:", err.Error())
+ }
+ defer conn.Close()
+ var msg string
+ err = conn.QueryRow("select 'secret'").Scan(&msg)
+ if err != nil {
+ t.Fatal("cannot scan value", err)
+ }
+ if msg != "secret" {
+ t.Fatal("expected secret, got: ", msg)
+ }
+ var secure bool
+ err = conn.QueryRow("select encrypt_option from sys.dm_exec_connections where session_id=@@SPID").Scan(&secure)
+ if err != nil {
+ t.Fatal("cannot scan value", err)
+ }
+ if !secure {
+ t.Fatal("connection is not encrypted")
+ }
+}
+
+func TestParseConnectParamsKeepAlive(t *testing.T) {
+ params := parseConnectionString("keepAlive=60")
+ parsedParams, err := parseConnectParams(params)
+ if err != nil {
+ t.Fatal("cannot parse params: ", err)
+ }
+
+ if parsedParams.keepAlive != time.Duration(60)*time.Second {
+ t.Fail()
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/token.go b/vendor/github.com/denisenkom/go-mssqldb/token.go
new file mode 100644
index 000000000..3292bf74b
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/token.go
@@ -0,0 +1,432 @@
+package mssql
+
+import (
+ "encoding/binary"
+ "io"
+ "strconv"
+ "strings"
+)
+
+// token ids
+const (
+ tokenReturnStatus = 121 // 0x79
+ tokenColMetadata = 129 // 0x81
+ tokenOrder = 169 // 0xA9
+ tokenError = 170 // 0xAA
+ tokenInfo = 171 // 0xAB
+ tokenLoginAck = 173 // 0xad
+ tokenRow = 209 // 0xd1
+ tokenNbcRow = 210 // 0xd2
+ tokenEnvChange = 227 // 0xE3
+ tokenSSPI = 237 // 0xED
+ tokenDone = 253 // 0xFD
+ tokenDoneProc = 254
+ tokenDoneInProc = 255
+)
+
+// done flags
+const (
+ doneFinal = 0
+ doneMore = 1
+ doneError = 2
+ doneInxact = 4
+ doneCount = 0x10
+ doneAttn = 0x20
+ doneSrvError = 0x100
+)
+
+// ENVCHANGE types
+// http://msdn.microsoft.com/en-us/library/dd303449.aspx
+const (
+ envTypDatabase = 1
+ envTypLanguage = 2
+ envTypCharset = 3
+ envTypPacketSize = 4
+ envTypBeginTran = 8
+ envTypCommitTran = 9
+ envTypRollbackTran = 10
+ envDatabaseMirrorPartner = 13
+ envRouting = 20
+)
+
+// interface for all tokens
+type tokenStruct interface{}
+
+type orderStruct struct {
+ ColIds []uint16
+}
+
+type doneStruct struct {
+ Status uint16
+ CurCmd uint16
+ RowCount uint64
+}
+
+type doneInProcStruct doneStruct
+
+var doneFlags2str = map[uint16]string{
+ doneFinal: "final",
+ doneMore: "more",
+ doneError: "error",
+ doneInxact: "inxact",
+ doneCount: "count",
+ doneAttn: "attn",
+ doneSrvError: "srverror",
+}
+
+func doneFlags2Str(flags uint16) string {
+ strs := make([]string, 0, len(doneFlags2str))
+ for flag, tag := range doneFlags2str {
+ if flags&flag != 0 {
+ strs = append(strs, tag)
+ }
+ }
+ return strings.Join(strs, "|")
+}
+
+// ENVCHANGE stream
+// http://msdn.microsoft.com/en-us/library/dd303449.aspx
+func processEnvChg(sess *tdsSession) {
+ size := sess.buf.uint16()
+ r := &io.LimitedReader{R: sess.buf, N: int64(size)}
+ for {
+ var err error
+ var envtype uint8
+ err = binary.Read(r, binary.LittleEndian, &envtype)
+ if err == io.EOF {
+ return
+ }
+ if err != nil {
+ badStreamPanic(err)
+ }
+ switch envtype {
+ case envTypDatabase:
+ sess.database, err = readBVarChar(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ _, err = readBVarChar(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ case envTypPacketSize:
+ packetsize, err := readBVarChar(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ _, err = readBVarChar(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ packetsizei, err := strconv.Atoi(packetsize)
+ if err != nil {
+ badStreamPanicf("Invalid Packet size value returned from server (%s): %s", packetsize, err.Error())
+ }
+ if len(sess.buf.buf) != packetsizei {
+ newbuf := make([]byte, packetsizei)
+ copy(newbuf, sess.buf.buf)
+ sess.buf.buf = newbuf
+ }
+ case envTypBeginTran:
+ tranid, err := readBVarByte(r)
+ if len(tranid) != 8 {
+ badStreamPanicf("invalid size of transaction identifier: %d", len(tranid))
+ }
+ sess.tranid = binary.LittleEndian.Uint64(tranid)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ if sess.logFlags&logTransaction != 0 {
+ sess.log.Printf("BEGIN TRANSACTION %x\n", sess.tranid)
+ }
+ _, err = readBVarByte(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ case envTypCommitTran, envTypRollbackTran:
+ _, err = readBVarByte(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ _, err = readBVarByte(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ if sess.logFlags&logTransaction != 0 {
+ if envtype == envTypCommitTran {
+ sess.log.Printf("COMMIT TRANSACTION %x\n", sess.tranid)
+ } else {
+ sess.log.Printf("ROLLBACK TRANSACTION %x\n", sess.tranid)
+ }
+ }
+ sess.tranid = 0
+ case envDatabaseMirrorPartner:
+ sess.partner, err = readBVarChar(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ _, err = readBVarChar(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ case envRouting:
+ // RoutingData message is:
+ // ValueLength USHORT
+ // Protocol (TCP = 0) BYTE
+ // ProtocolProperty (new port) USHORT
+ // AlternateServer US_VARCHAR
+ _, err := readUshort(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ protocol, err := readByte(r)
+ if err != nil || protocol != 0 {
+ badStreamPanic(err)
+ }
+ newPort, err := readUshort(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ newServer, err := readUsVarChar(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ // consume the OLDVALUE = %x00 %x00
+ _, err = readUshort(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ sess.routedServer = newServer
+ sess.routedPort = newPort
+ default:
+ // ignore unknown env change types
+ _, err = readBVarByte(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ _, err = readBVarByte(r)
+ if err != nil {
+ badStreamPanic(err)
+ }
+ }
+
+ }
+}
+
+type returnStatus int32
+
+// http://msdn.microsoft.com/en-us/library/dd358180.aspx
+func parseReturnStatus(r *tdsBuffer) returnStatus {
+ return returnStatus(r.int32())
+}
+
+func parseOrder(r *tdsBuffer) (res orderStruct) {
+ len := int(r.uint16())
+ res.ColIds = make([]uint16, len/2)
+ for i := 0; i < len/2; i++ {
+ res.ColIds[i] = r.uint16()
+ }
+ return res
+}
+
+func parseDone(r *tdsBuffer) (res doneStruct) {
+ res.Status = r.uint16()
+ res.CurCmd = r.uint16()
+ res.RowCount = r.uint64()
+ return res
+}
+
+func parseDoneInProc(r *tdsBuffer) (res doneInProcStruct) {
+ res.Status = r.uint16()
+ res.CurCmd = r.uint16()
+ res.RowCount = r.uint64()
+ return res
+}
+
+type sspiMsg []byte
+
+func parseSSPIMsg(r *tdsBuffer) sspiMsg {
+ size := r.uint16()
+ buf := make([]byte, size)
+ r.ReadFull(buf)
+ return sspiMsg(buf)
+}
+
+type loginAckStruct struct {
+ Interface uint8
+ TDSVersion uint32
+ ProgName string
+ ProgVer uint32
+}
+
+func parseLoginAck(r *tdsBuffer) loginAckStruct {
+ size := r.uint16()
+ buf := make([]byte, size)
+ r.ReadFull(buf)
+ var res loginAckStruct
+ res.Interface = buf[0]
+ res.TDSVersion = binary.BigEndian.Uint32(buf[1:])
+ prognamelen := buf[1+4]
+ var err error
+ if res.ProgName, err = ucs22str(buf[1+4+1 : 1+4+1+prognamelen*2]); err != nil {
+ badStreamPanic(err)
+ }
+ res.ProgVer = binary.BigEndian.Uint32(buf[size-4:])
+ return res
+}
+
+// http://msdn.microsoft.com/en-us/library/dd357363.aspx
+func parseColMetadata72(r *tdsBuffer) (columns []columnStruct) {
+ count := r.uint16()
+ if count == 0xffff {
+ // no metadata is sent
+ return nil
+ }
+ columns = make([]columnStruct, count)
+ for i := range columns {
+ column := &columns[i]
+ column.UserType = r.uint32()
+ column.Flags = r.uint16()
+
+ // parsing TYPE_INFO structure
+ column.ti = readTypeInfo(r)
+ column.ColName = r.BVarChar()
+ }
+ return columns
+}
+
+// http://msdn.microsoft.com/en-us/library/dd357254.aspx
+func parseRow(r *tdsBuffer, columns []columnStruct, row []interface{}) {
+ for i, column := range columns {
+ row[i] = column.ti.Reader(&column.ti, r)
+ }
+}
+
+// http://msdn.microsoft.com/en-us/library/dd304783.aspx
+func parseNbcRow(r *tdsBuffer, columns []columnStruct, row []interface{}) {
+ bitlen := (len(columns) + 7) / 8
+ pres := make([]byte, bitlen)
+ r.ReadFull(pres)
+ for i, col := range columns {
+ if pres[i/8]&(1<<(uint(i)%8)) != 0 {
+ row[i] = nil
+ continue
+ }
+ row[i] = col.ti.Reader(&col.ti, r)
+ }
+}
+
+// http://msdn.microsoft.com/en-us/library/dd304156.aspx
+func parseError72(r *tdsBuffer) (res Error) {
+ length := r.uint16()
+ _ = length // ignore length
+ res.Number = r.int32()
+ res.State = r.byte()
+ res.Class = r.byte()
+ res.Message = r.UsVarChar()
+ res.ServerName = r.BVarChar()
+ res.ProcName = r.BVarChar()
+ res.LineNo = r.int32()
+ return
+}
+
+// http://msdn.microsoft.com/en-us/library/dd304156.aspx
+func parseInfo(r *tdsBuffer) (res Error) {
+ length := r.uint16()
+ _ = length // ignore length
+ res.Number = r.int32()
+ res.State = r.byte()
+ res.Class = r.byte()
+ res.Message = r.UsVarChar()
+ res.ServerName = r.BVarChar()
+ res.ProcName = r.BVarChar()
+ res.LineNo = r.int32()
+ return
+}
+
+func processResponse(sess *tdsSession, ch chan tokenStruct) {
+ defer func() {
+ if err := recover(); err != nil {
+ ch <- err
+ }
+ close(ch)
+ }()
+ packet_type, err := sess.buf.BeginRead()
+ if err != nil {
+ ch <- err
+ return
+ }
+ if packet_type != packReply {
+ badStreamPanicf("invalid response packet type, expected REPLY, actual: %d", packet_type)
+ }
+ var columns []columnStruct
+ var lastError Error
+ var failed bool
+ for {
+ token := sess.buf.byte()
+ switch token {
+ case tokenSSPI:
+ ch <- parseSSPIMsg(sess.buf)
+ return
+ case tokenReturnStatus:
+ returnStatus := parseReturnStatus(sess.buf)
+ ch <- returnStatus
+ case tokenLoginAck:
+ loginAck := parseLoginAck(sess.buf)
+ ch <- loginAck
+ case tokenOrder:
+ order := parseOrder(sess.buf)
+ ch <- order
+ case tokenDoneInProc:
+ done := parseDoneInProc(sess.buf)
+ if sess.logFlags&logRows != 0 && done.Status&doneCount != 0 {
+ sess.log.Printf("(%d row(s) affected)\n", done.RowCount)
+ }
+ ch <- done
+ case tokenDone, tokenDoneProc:
+ done := parseDone(sess.buf)
+ if sess.logFlags&logRows != 0 && done.Status&doneCount != 0 {
+ sess.log.Printf("(%d row(s) affected)\n", done.RowCount)
+ }
+ if done.Status&doneError != 0 || failed {
+ ch <- lastError
+ return
+ }
+ if done.Status&doneSrvError != 0 {
+ lastError.Message = "Server Error"
+ ch <- lastError
+ return
+ }
+ ch <- done
+ if done.Status&doneMore == 0 {
+ return
+ }
+ case tokenColMetadata:
+ columns = parseColMetadata72(sess.buf)
+ ch <- columns
+ case tokenRow:
+ row := make([]interface{}, len(columns))
+ parseRow(sess.buf, columns, row)
+ ch <- row
+ case tokenNbcRow:
+ row := make([]interface{}, len(columns))
+ parseNbcRow(sess.buf, columns, row)
+ ch <- row
+ case tokenEnvChange:
+ processEnvChg(sess)
+ case tokenError:
+ lastError = parseError72(sess.buf)
+ failed = true
+ if sess.logFlags&logErrors != 0 {
+ sess.log.Println(lastError.Message)
+ }
+ case tokenInfo:
+ info := parseInfo(sess.buf)
+ if sess.logFlags&logMessages != 0 {
+ sess.log.Println(info.Message)
+ }
+ default:
+ badStreamPanicf("Unknown token type: %d", token)
+ }
+ }
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/tran.go b/vendor/github.com/denisenkom/go-mssqldb/tran.go
new file mode 100644
index 000000000..ae3810766
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/tran.go
@@ -0,0 +1,99 @@
+// Transaction Manager requests
+// http://msdn.microsoft.com/en-us/library/dd339887.aspx
+package mssql
+
+import (
+ "encoding/binary"
+)
+
+const (
+ tmGetDtcAddr = 0
+ tmPropagateXact = 1
+ tmBeginXact = 5
+ tmPromoteXact = 6
+ tmCommitXact = 7
+ tmRollbackXact = 8
+ tmSaveXact = 9
+)
+
+func sendBeginXact(buf *tdsBuffer, headers []headerStruct, isolation uint8,
+ name string) (err error) {
+ buf.BeginPacket(packTransMgrReq)
+ writeAllHeaders(buf, headers)
+ var rqtype uint16 = tmBeginXact
+ err = binary.Write(buf, binary.LittleEndian, &rqtype)
+ if err != nil {
+ return
+ }
+ err = binary.Write(buf, binary.LittleEndian, &isolation)
+ if err != nil {
+ return
+ }
+ err = writeBVarChar(buf, name)
+ if err != nil {
+ return
+ }
+ return buf.FinishPacket()
+}
+
+const (
+ fBeginXact = 1
+)
+
+func sendCommitXact(buf *tdsBuffer, headers []headerStruct, name string, flags uint8, isolation uint8, newname string) error {
+ buf.BeginPacket(packTransMgrReq)
+ writeAllHeaders(buf, headers)
+ var rqtype uint16 = tmCommitXact
+ err := binary.Write(buf, binary.LittleEndian, &rqtype)
+ if err != nil {
+ return err
+ }
+ err = writeBVarChar(buf, name)
+ if err != nil {
+ return err
+ }
+ err = binary.Write(buf, binary.LittleEndian, &flags)
+ if err != nil {
+ return err
+ }
+ if flags&fBeginXact != 0 {
+ err = binary.Write(buf, binary.LittleEndian, &isolation)
+ if err != nil {
+ return err
+ }
+ err = writeBVarChar(buf, name)
+ if err != nil {
+ return err
+ }
+ }
+ return buf.FinishPacket()
+}
+
+func sendRollbackXact(buf *tdsBuffer, headers []headerStruct, name string, flags uint8, isolation uint8, newname string) error {
+ buf.BeginPacket(packTransMgrReq)
+ writeAllHeaders(buf, headers)
+ var rqtype uint16 = tmRollbackXact
+ err := binary.Write(buf, binary.LittleEndian, &rqtype)
+ if err != nil {
+ return err
+ }
+ err = writeBVarChar(buf, name)
+ if err != nil {
+ return err
+ }
+ err = binary.Write(buf, binary.LittleEndian, &flags)
+ if err != nil {
+ return err
+ }
+ if flags&fBeginXact != 0 {
+ err = binary.Write(buf, binary.LittleEndian, &isolation)
+ if err != nil {
+ return err
+ }
+ err = writeBVarChar(buf, name)
+ if err != nil {
+ return err
+ }
+ }
+ return buf.FinishPacket()
+}
diff --git a/vendor/github.com/denisenkom/go-mssqldb/types.go b/vendor/github.com/denisenkom/go-mssqldb/types.go
new file mode 100644
index 000000000..c06d6c7aa
--- /dev/null
+++ b/vendor/github.com/denisenkom/go-mssqldb/types.go
@@ -0,0 +1,847 @@
+package mssql
+
+import (
+ "bytes"
+ "encoding/binary"
+ "fmt"
+ "io"
+ "math"
+ "strconv"
+ "time"
+)
+
+// fixed-length data types
+// http://msdn.microsoft.com/en-us/library/dd341171.aspx
+const (
+ typeNull = 0x1f
+ typeInt1 = 0x30
+ typeBit = 0x32
+ typeInt2 = 0x34
+ typeInt4 = 0x38
+ typeDateTim4 = 0x3a
+ typeFlt4 = 0x3b
+ typeMoney = 0x3c
+ typeDateTime = 0x3d
+ typeFlt8 = 0x3e
+ typeMoney4 = 0x7a
+ typeInt8 = 0x7f
+)
+
+// variable-length data types
+// http://msdn.microsoft.com/en-us/library/dd358341.aspx
+const (
+ // byte len types
+ typeGuid = 0x24
+ typeIntN = 0x26
+ typeDecimal = 0x37 // legacy
+ typeNumeric = 0x3f // legacy
+ typeBitN = 0x68
+ typeDecimalN = 0x6a
+ typeNumericN = 0x6c
+ typeFltN = 0x6d
+ typeMoneyN = 0x6e
+ typeDateTimeN = 0x6f
+ typeDateN = 0x28
+ typeTimeN = 0x29
+ typeDateTime2N = 0x2a
+ typeDateTimeOffsetN = 0x2b
+ typeChar = 0x2f // legacy
+ typeVarChar = 0x27 // legacy
+ typeBinary = 0x2d // legacy
+ typeVarBinary = 0x25 // legacy
+
+ // short length types
+ typeBigVarBin = 0xa5
+ typeBigVarChar = 0xa7
+ typeBigBinary = 0xad
+ typeBigChar = 0xaf
+ typeNVarChar = 0xe7
+ typeNChar = 0xef
+ typeXml = 0xf1
+ typeUdt = 0xf0
+
+ // long length types
+ typeText = 0x23
+ typeImage = 0x22
+ typeNText = 0x63
+ typeVariant = 0x62
+)
+
+// TYPE_INFO rule
+// http://msdn.microsoft.com/en-us/library/dd358284.aspx
+type typeInfo struct {
+ TypeId uint8
+ Size int
+ Scale uint8
+ Prec uint8
+ Buffer []byte
+ Collation collation
+ Reader func(ti *typeInfo, r *tdsBuffer) (res interface{})
+ Writer func(w io.Writer, ti typeInfo, buf []byte) (err error)
+}
+
+func readTypeInfo(r *tdsBuffer) (res typeInfo) {
+ res.TypeId = r.byte()
+ switch res.TypeId {
+ case typeNull, typeInt1, typeBit, typeInt2, typeInt4, typeDateTim4,
+ typeFlt4, typeMoney, typeDateTime, typeFlt8, typeMoney4, typeInt8:
+ // those are fixed length types
+ switch res.TypeId {
+ case typeNull:
+ res.Size = 0
+ case typeInt1, typeBit:
+ res.Size = 1
+ case typeInt2:
+ res.Size = 2
+ case typeInt4, typeDateTim4, typeFlt4, typeMoney4:
+ res.Size = 4
+ case typeMoney, typeDateTime, typeFlt8, typeInt8:
+ res.Size = 8
+ }
+ res.Reader = readFixedType
+ res.Buffer = make([]byte, res.Size)
+ default: // all others are VARLENTYPE
+ readVarLen(&res, r)
+ }
+ return
+}
+
+func writeTypeInfo(w io.Writer, ti *typeInfo) (err error) {
+ err = binary.Write(w, binary.LittleEndian, ti.TypeId)
+ if err != nil {
+ return
+ }
+ switch ti.TypeId {
+ case typeNull, typeInt1, typeBit, typeInt2, typeInt4, typeDateTim4,
+ typeFlt4, typeMoney, typeDateTime, typeFlt8, typeMoney4, typeInt8:
+ // those are fixed length types
+ default: // all others are VARLENTYPE
+ err = writeVarLen(w, ti)
+ if err != nil {
+ return
+ }
+ }
+ return
+}
+
+func writeVarLen(w io.Writer, ti *typeInfo) (err error) {
+ switch ti.TypeId {
+ case typeDateN:
+
+ case typeTimeN, typeDateTime2N, typeDateTimeOffsetN:
+ if err = binary.Write(w, binary.LittleEndian, ti.Scale); err != nil {
+ return
+ }
+ ti.Writer = writeByteLenType
+ case typeGuid, typeIntN, typeDecimal, typeNumeric,
+ typeBitN, typeDecimalN, typeNumericN, typeFltN,
+ typeMoneyN, typeDateTimeN, typeChar,
+ typeVarChar, typeBinary, typeVarBinary:
+ // byle len types
+ if ti.Size > 0xff {
+ panic("Invalid size for BYLELEN_TYPE")
+ }
+ if err = binary.Write(w, binary.LittleEndian, uint8(ti.Size)); err != nil {
+ return
+ }
+ switch ti.TypeId {
+ case typeDecimal, typeNumeric, typeDecimalN, typeNumericN:
+ err = binary.Write(w, binary.LittleEndian, ti.Prec)
+ if err != nil {
+ return
+ }
+ err = binary.Write(w, binary.LittleEndian, ti.Scale)
+ if err != nil {
+ return
+ }
+ }
+ ti.Writer = writeByteLenType
+ case typeBigVarBin, typeBigVarChar, typeBigBinary, typeBigChar,
+ typeNVarChar, typeNChar, typeXml, typeUdt:
+ // short len types
+ if ti.Size > 8000 || ti.Size == 0 {
+ if err = binary.Write(w, binary.LittleEndian, uint16(0xffff)); err != nil {
+ return
+ }
+ ti.Writer = writePLPType
+ } else {
+ if err = binary.Write(w, binary.LittleEndian, uint16(ti.Size)); err != nil {
+ return
+ }
+ ti.Writer = writeShortLenType
+ }
+ switch ti.TypeId {
+ case typeBigVarChar, typeBigChar, typeNVarChar, typeNChar:
+ if err = writeCollation(w, ti.Collation); err != nil {
+ return
+ }
+ case typeXml:
+ var schemapresent uint8 = 0
+ if err = binary.Write(w, binary.LittleEndian, schemapresent); err != nil {
+ return
+ }
+ }
+ case typeText, typeImage, typeNText, typeVariant:
+ // LONGLEN_TYPE
+ panic("LONGLEN_TYPE not implemented")
+ default:
+ panic("Invalid type")
+ }
+ return
+}
+
+// http://msdn.microsoft.com/en-us/library/ee780895.aspx
+func decodeDateTim4(buf []byte) time.Time {
+ days := binary.LittleEndian.Uint16(buf)
+ mins := binary.LittleEndian.Uint16(buf[2:])
+ return time.Date(1900, 1, 1+int(days),
+ 0, int(mins), 0, 0, time.UTC)
+}
+
+func decodeDateTime(buf []byte) time.Time {
+ days := int32(binary.LittleEndian.Uint32(buf))
+ tm := binary.LittleEndian.Uint32(buf[4:])
+ ns := int(math.Trunc(float64(tm%300)/0.3+0.5)) * 1000000
+ secs := int(tm / 300)
+ return time.Date(1900, 1, 1+int(days),
+ 0, 0, secs, ns, time.UTC)
+}
+
+func readFixedType(ti *typeInfo, r *tdsBuffer) (res interface{}) {
+ r.ReadFull(ti.Buffer)
+ buf := ti.Buffer
+ switch ti.TypeId {
+ case typeNull:
+ return nil
+ case typeInt1:
+ return int64(buf[0])
+ case typeBit:
+ return buf[0] != 0
+ case typeInt2:
+ return int64(int16(binary.LittleEndian.Uint16(buf)))
+ case typeInt4:
+ return int64(int32(binary.LittleEndian.Uint32(buf)))
+ case typeDateTim4:
+ return decodeDateTim4(buf)
+ case typeFlt4:
+ return math.Float32frombits(binary.LittleEndian.Uint32(buf))
+ case typeMoney4:
+ return decodeMoney4(buf)
+ case typeMoney:
+ return decodeMoney(buf)
+ case typeDateTime:
+ return decodeDateTime(buf)
+ case typeFlt8:
+ return math.Float64frombits(binary.LittleEndian.Uint64(buf))
+ case typeInt8:
+ return int64(binary.LittleEndian.Uint64(buf))
+ default:
+ badStreamPanicf("Invalid typeid")
+ }
+ panic("shoulnd't get here")
+}
+
+func writeFixedType(w io.Writer, ti typeInfo, buf []byte) (err error) {
+ _, err = w.Write(buf)
+ return
+}
+
+func readByteLenType(ti *typeInfo, r *tdsBuffer) (res interface{}) {
+ size := r.byte()
+ if size == 0 {
+ return nil
+ }
+ r.ReadFull(ti.Buffer[:size])
+ buf := ti.Buffer[:size]
+ switch ti.TypeId {
+ case typeDateN:
+ if len(buf) != 3 {
+ badStreamPanicf("Invalid size for DATENTYPE")
+ }
+ return decodeDate(buf)
+ case typeTimeN:
+ return decodeTime(ti.Scale, buf)
+ case typeDateTime2N:
+ return decodeDateTime2(ti.Scale, buf)
+ case typeDateTimeOffsetN:
+ return decodeDateTimeOffset(ti.Scale, buf)
+ case typeGuid:
+ return decodeGuid(buf)
+ case typeIntN:
+ switch len(buf) {
+ case 1:
+ return int64(buf[0])
+ case 2:
+ return int64(int16((binary.LittleEndian.Uint16(buf))))
+ case 4:
+ return int64(int32(binary.LittleEndian.Uint32(buf)))
+ case 8:
+ return int64(binary.LittleEndian.Uint64(buf))
+ default:
+ badStreamPanicf("Invalid size for INTNTYPE")
+ }
+ case typeDecimal, typeNumeric, typeDecimalN, typeNumericN:
+ return decodeDecimal(ti.Prec, ti.Scale, buf)
+ case typeBitN:
+ if len(buf) != 1 {
+ badStreamPanicf("Invalid size for BITNTYPE")
+ }
+ return buf[0] != 0
+ case typeFltN:
+ switch len(buf) {
+ case 4:
+ return float64(math.Float32frombits(binary.LittleEndian.Uint32(buf)))
+ case 8:
+ return math.Float64frombits(binary.LittleEndian.Uint64(buf))
+ default:
+ badStreamPanicf("Invalid size for FLTNTYPE")
+ }
+ case typeMoneyN:
+ switch len(buf) {
+ case 4:
+ return decodeMoney4(buf)
+ case 8:
+ return decodeMoney(buf)
+ default:
+ badStreamPanicf("Invalid size for MONEYNTYPE")
+ }
+ case typeDateTimeN:
+ switch len(buf) {
+ case 4:
+ return decodeDateTim4(buf)
+ case 8:
+ return decodeDateTime(buf)
+ default:
+ badStreamPanicf("Invalid size for DATETIMENTYPE")
+ }
+ case typeChar, typeVarChar:
+ return decodeChar(ti.Collation, buf)
+ case typeBinary, typeVarBinary:
+ // a copy, because the backing array for ti.Buffer is reused
+ // and can be overwritten by the next row while this row waits
+ // in a buffered chan
+ cpy := make([]byte, len(buf))
+ copy(cpy, buf)
+ return cpy
+ default:
+ badStreamPanicf("Invalid typeid")
+ }
+ panic("shoulnd't get here")
+}
+
+func writeByteLenType(w io.Writer, ti typeInfo, buf []byte) (err error) {
+ if ti.Size > 0xff {
+ panic("Invalid size for BYTELEN_TYPE")
+ }
+ err = binary.Write(w, binary.LittleEndian, uint8(ti.Size))
+ if err != nil {
+ return
+ }
+ _, err = w.Write(buf)
+ return
+}
+
+func readShortLenType(ti *typeInfo, r *tdsBuffer) (res interface{}) {
+ size := r.uint16()
+ if size == 0xffff {
+ return nil
+ }
+ r.ReadFull(ti.Buffer[:size])
+ buf := ti.Buffer[:size]
+ switch ti.TypeId {
+ case typeBigVarChar, typeBigChar:
+ return decodeChar(ti.Collation, buf)
+ case typeBigVarBin, typeBigBinary:
+ // a copy, because the backing array for ti.Buffer is reused
+ // and can be overwritten by the next row while this row waits
+ // in a buffered chan
+ cpy := make([]byte, len(buf))
+ copy(cpy, buf)
+ return cpy
+ case typeNVarChar, typeNChar:
+ return decodeNChar(buf)
+ case typeUdt:
+ return decodeUdt(*ti, buf)
+ default:
+ badStreamPanicf("Invalid typeid")
+ }
+ panic("shoulnd't get here")
+}
+
+func writeShortLenType(w io.Writer, ti typeInfo, buf []byte) (err error) {
+ if buf == nil {
+ err = binary.Write(w, binary.LittleEndian, uint16(0xffff))
+ return
+ }
+ if ti.Size > 0xfffe {
+ panic("Invalid size for USHORTLEN_TYPE")
+ }
+ err = binary.Write(w, binary.LittleEndian, uint16(ti.Size))
+ if err != nil {
+ return
+ }
+ _, err = w.Write(buf)
+ return
+}
+
+func readLongLenType(ti *typeInfo, r *tdsBuffer) (res interface{}) {
+ // information about this format can be found here:
+ // http://msdn.microsoft.com/en-us/library/dd304783.aspx
+ // and here:
+ // http://msdn.microsoft.com/en-us/library/dd357254.aspx
+ textptrsize := r.byte()
+ if textptrsize == 0 {
+ return nil
+ }
+ textptr := make([]byte, textptrsize)
+ r.ReadFull(textptr)
+ timestamp := r.uint64()
+ _ = timestamp // ignore timestamp
+ size := r.int32()
+ if size == -1 {
+ return nil
+ }
+ buf := make([]byte, size)
+ r.ReadFull(buf)
+ switch ti.TypeId {
+ case typeText:
+ return decodeChar(ti.Collation, buf)
+ case typeImage:
+ return buf
+ case typeNText:
+ return decodeNChar(buf)
+ default:
+ badStreamPanicf("Invalid typeid")
+ }
+ panic("shoulnd't get here")
+}
+
+// reads variant value
+// http://msdn.microsoft.com/en-us/library/dd303302.aspx
+func readVariantType(ti *typeInfo, r *tdsBuffer) (res interface{}) {
+ size := r.int32()
+ if size == 0 {
+ return nil
+ }
+ vartype := r.byte()
+ propbytes := int32(r.byte())
+ switch vartype {
+ case typeGuid:
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return buf
+ case typeBit:
+ return r.byte() != 0
+ case typeInt1:
+ return int64(r.byte())
+ case typeInt2:
+ return int64(int16(r.uint16()))
+ case typeInt4:
+ return int64(r.int32())
+ case typeInt8:
+ return int64(r.uint64())
+ case typeDateTime:
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeDateTime(buf)
+ case typeDateTim4:
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeDateTim4(buf)
+ case typeFlt4:
+ return float64(math.Float32frombits(r.uint32()))
+ case typeFlt8:
+ return math.Float64frombits(r.uint64())
+ case typeMoney4:
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeMoney4(buf)
+ case typeMoney:
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeMoney(buf)
+ case typeDateN:
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeDate(buf)
+ case typeTimeN:
+ scale := r.byte()
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeTime(scale, buf)
+ case typeDateTime2N:
+ scale := r.byte()
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeDateTime2(scale, buf)
+ case typeDateTimeOffsetN:
+ scale := r.byte()
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeDateTimeOffset(scale, buf)
+ case typeBigVarBin, typeBigBinary:
+ r.uint16() // max length, ignoring
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return buf
+ case typeDecimalN, typeNumericN:
+ prec := r.byte()
+ scale := r.byte()
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeDecimal(prec, scale, buf)
+ case typeBigVarChar, typeBigChar:
+ col := readCollation(r)
+ r.uint16() // max length, ignoring
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeChar(col, buf)
+ case typeNVarChar, typeNChar:
+ _ = readCollation(r)
+ r.uint16() // max length, ignoring
+ buf := make([]byte, size-2-propbytes)
+ r.ReadFull(buf)
+ return decodeNChar(buf)
+ default:
+ badStreamPanicf("Invalid variant typeid")
+ }
+ panic("shoulnd't get here")
+}
+
+// partially length prefixed stream
+// http://msdn.microsoft.com/en-us/library/dd340469.aspx
+func readPLPType(ti *typeInfo, r *tdsBuffer) (res interface{}) {
+ size := r.uint64()
+ var buf *bytes.Buffer
+ switch size {
+ case 0xffffffffffffffff:
+ // null
+ return nil
+ case 0xfffffffffffffffe:
+ // size unknown
+ buf = bytes.NewBuffer(make([]byte, 0, 1000))
+ default:
+ buf = bytes.NewBuffer(make([]byte, 0, size))
+ }
+ for true {
+ chunksize := r.uint32()
+ if chunksize == 0 {
+ break
+ }
+ if _, err := io.CopyN(buf, r, int64(chunksize)); err != nil {
+ badStreamPanicf("Reading PLP type failed: %s", err.Error())
+ }
+ }
+ switch ti.TypeId {
+ case typeXml:
+ return decodeXml(*ti, buf.Bytes())
+ case typeBigVarChar, typeBigChar, typeText:
+ return decodeChar(ti.Collation, buf.Bytes())
+ case typeBigVarBin, typeBigBinary, typeImage:
+ return buf.Bytes()
+ case typeNVarChar, typeNChar, typeNText:
+ return decodeNChar(buf.Bytes())
+ case typeUdt:
+ return decodeUdt(*ti, buf.Bytes())
+ }
+ panic("shoulnd't get here")
+}
+
+func writePLPType(w io.Writer, ti typeInfo, buf []byte) (err error) {
+ if err = binary.Write(w, binary.LittleEndian, uint64(len(buf))); err != nil {
+ return
+ }
+ for {
+ chunksize := uint32(len(buf))
+ if err = binary.Write(w, binary.LittleEndian, chunksize); err != nil {
+ return
+ }
+ if chunksize == 0 {
+ return
+ }
+ if _, err = w.Write(buf[:chunksize]); err != nil {
+ return
+ }
+ buf = buf[chunksize:]
+ }
+}
+
+func readVarLen(ti *typeInfo, r *tdsBuffer) {
+ switch ti.TypeId {
+ case typeDateN:
+ ti.Size = 3
+ ti.Reader = readByteLenType
+ ti.Buffer = make([]byte, ti.Size)
+ case typeTimeN, typeDateTime2N, typeDateTimeOffsetN:
+ ti.Scale = r.byte()
+ switch ti.Scale {
+ case 0, 1, 2:
+ ti.Size = 3
+ case 3, 4:
+ ti.Size = 4
+ case 5, 6, 7:
+ ti.Size = 5
+ default:
+ badStreamPanicf("Invalid scale for TIME/DATETIME2/DATETIMEOFFSET type")
+ }
+ switch ti.TypeId {
+ case typeDateTime2N:
+ ti.Size += 3
+ case typeDateTimeOffsetN:
+ ti.Size += 5
+ }
+ ti.Reader = readByteLenType
+ ti.Buffer = make([]byte, ti.Size)
+ case typeGuid, typeIntN, typeDecimal, typeNumeric,
+ typeBitN, typeDecimalN, typeNumericN, typeFltN,
+ typeMoneyN, typeDateTimeN, typeChar,
+ typeVarChar, typeBinary, typeVarBinary:
+ // byle len types
+ ti.Size = int(r.byte())
+ ti.Buffer = make([]byte, ti.Size)
+ switch ti.TypeId {
+ case typeDecimal, typeNumeric, typeDecimalN, typeNumericN:
+ ti.Prec = r.byte()
+ ti.Scale = r.byte()
+ }
+ ti.Reader = readByteLenType
+ case typeXml:
+ schemapresent := r.byte()
+ if schemapresent != 0 {
+ // just ignore this for now
+ // dbname
+ r.BVarChar()
+ // owning schema
+ r.BVarChar()
+ // xml schema collection
+ r.UsVarChar()
+ }
+ ti.Reader = readPLPType
+ case typeBigVarBin, typeBigVarChar, typeBigBinary, typeBigChar,
+ typeNVarChar, typeNChar, typeUdt:
+ // short len types
+ ti.Size = int(r.uint16())
+ switch ti.TypeId {
+ case typeBigVarChar, typeBigChar, typeNVarChar, typeNChar:
+ ti.Collation = readCollation(r)
+ }
+ if ti.Size == 0xffff {
+ ti.Reader = readPLPType
+ } else {
+ ti.Buffer = make([]byte, ti.Size)
+ ti.Reader = readShortLenType
+ }
+ case typeText, typeImage, typeNText, typeVariant:
+ // LONGLEN_TYPE
+ ti.Size = int(r.int32())
+ switch ti.TypeId {
+ case typeText, typeNText:
+ ti.Collation = readCollation(r)
+ // ignore tablenames
+ numparts := int(r.byte())
+ for i := 0; i < numparts; i++ {
+ r.UsVarChar()
+ }
+ ti.Reader = readLongLenType
+ case typeImage:
+ // ignore tablenames
+ numparts := int(r.byte())
+ for i := 0; i < numparts; i++ {
+ r.UsVarChar()
+ }
+ ti.Reader = readLongLenType
+ case typeXml:
+ panic("XMLTYPE not implemented")
+ case typeVariant:
+ ti.Reader = readVariantType
+ }
+ default:
+ badStreamPanicf("Invalid type %d", ti.TypeId)
+ }
+ return
+}
+
+func decodeMoney(buf []byte) []byte {
+ money := int64(uint64(buf[4]) |
+ uint64(buf[5])<<8 |
+ uint64(buf[6])<<16 |
+ uint64(buf[7])<<24 |
+ uint64(buf[0])<<32 |
+ uint64(buf[1])<<40 |
+ uint64(buf[2])<<48 |
+ uint64(buf[3])<<56)
+ return scaleBytes(strconv.FormatInt(money, 10), 4)
+}
+
+func decodeMoney4(buf []byte) []byte {
+ money := int32(binary.LittleEndian.Uint32(buf[0:4]))
+ return scaleBytes(strconv.FormatInt(int64(money), 10), 4)
+}
+
+func decodeGuid(buf []byte) []byte {
+ res := make([]byte, 16)
+ copy(res, buf)
+ return res
+}
+
+func decodeDecimal(prec uint8, scale uint8, buf []byte) []byte {
+ var sign uint8
+ sign = buf[0]
+ dec := Decimal{
+ positive: sign != 0,
+ prec: prec,
+ scale: scale,
+ }
+ buf = buf[1:]
+ l := len(buf) / 4
+ for i := 0; i < l; i++ {
+ dec.integer[i] = binary.LittleEndian.Uint32(buf[0:4])
+ buf = buf[4:]
+ }
+ return dec.Bytes()
+}
+
+// http://msdn.microsoft.com/en-us/library/ee780895.aspx
+func decodeDateInt(buf []byte) (days int) {
+ return int(buf[0]) + int(buf[1])*256 + int(buf[2])*256*256
+}
+
+func decodeDate(buf []byte) time.Time {
+ return time.Date(1, 1, 1+decodeDateInt(buf), 0, 0, 0, 0, time.UTC)
+}
+
+func decodeTimeInt(scale uint8, buf []byte) (sec int, ns int) {
+ var acc uint64 = 0
+ for i := len(buf) - 1; i >= 0; i-- {
+ acc <<= 8
+ acc |= uint64(buf[i])
+ }
+ for i := 0; i < 7-int(scale); i++ {
+ acc *= 10
+ }
+ nsbig := acc * 100
+ sec = int(nsbig / 1000000000)
+ ns = int(nsbig % 1000000000)
+ return
+}
+
+func decodeTime(scale uint8, buf []byte) time.Time {
+ sec, ns := decodeTimeInt(scale, buf)
+ return time.Date(1, 1, 1, 0, 0, sec, ns, time.UTC)
+}
+
+func decodeDateTime2(scale uint8, buf []byte) time.Time {
+ timesize := len(buf) - 3
+ sec, ns := decodeTimeInt(scale, buf[:timesize])
+ days := decodeDateInt(buf[timesize:])
+ return time.Date(1, 1, 1+days, 0, 0, sec, ns, time.UTC)
+}
+
+func decodeDateTimeOffset(scale uint8, buf []byte) time.Time {
+ timesize := len(buf) - 3 - 2
+ sec, ns := decodeTimeInt(scale, buf[:timesize])
+ buf = buf[timesize:]
+ days := decodeDateInt(buf[:3])
+ buf = buf[3:]
+ offset := int(int16(binary.LittleEndian.Uint16(buf))) // in mins
+ return time.Date(1, 1, 1+days, 0, 0, sec+offset*60, ns,
+ time.FixedZone("", offset*60))
+}
+
+func divFloor(x int64, y int64) int64 {
+ q := x / y
+ r := x % y
+ if r != 0 && ((r < 0) != (y < 0)) {
+ q--
+ }
+ return q
+}
+
+func dateTime2(t time.Time) (days int32, ns int64) {
+ // number of days since Jan 1 1970 UTC
+ days64 := divFloor(t.Unix(), 24*60*60)
+ // number of days since Jan 1 1 UTC
+ days = int32(days64) + 1969*365 + 1969/4 - 1969/100 + 1969/400
+ // number of seconds within day
+ secs := t.Unix() - days64*24*60*60
+ // number of nanoseconds within day
+ ns = secs*1e9 + int64(t.Nanosecond())
+ return
+}
+
+func decodeChar(col collation, buf []byte) string {
+ return charset2utf8(col, buf)
+}
+
+func decodeUcs2(buf []byte) string {
+ res, err := ucs22str(buf)
+ if err != nil {
+ badStreamPanicf("Invalid UCS2 encoding: %s", err.Error())
+ }
+ return res
+}
+
+func decodeNChar(buf []byte) string {
+ return decodeUcs2(buf)
+}
+
+func decodeXml(ti typeInfo, buf []byte) string {
+ return decodeUcs2(buf)
+}
+
+func decodeUdt(ti typeInfo, buf []byte) int {
+ panic("Not implemented")
+}
+
+func makeDecl(ti typeInfo) string {
+ switch ti.TypeId {
+ case typeInt8:
+ return "bigint"
+ case typeFlt4:
+ return "real"
+ case typeIntN:
+ switch ti.Size {
+ case 1:
+ return "tinyint"
+ case 2:
+ return "smallint"
+ case 4:
+ return "int"
+ case 8:
+ return "bigint"
+ default:
+ panic("invalid size of INTNTYPE")
+ }
+ case typeFlt8:
+ return "float"
+ case typeFltN:
+ switch ti.Size {
+ case 4:
+ return "real"
+ case 8:
+ return "float"
+ default:
+ panic("invalid size of FLNNTYPE")
+ }
+ case typeBigVarBin:
+ if ti.Size > 8000 || ti.Size == 0 {
+ return fmt.Sprintf("varbinary(max)")
+ } else {
+ return fmt.Sprintf("varbinary(%d)", ti.Size)
+ }
+ case typeNVarChar:
+ if ti.Size > 8000 || ti.Size == 0 {
+ return fmt.Sprintf("nvarchar(max)")
+ } else {
+ return fmt.Sprintf("nvarchar(%d)", ti.Size/2)
+ }
+ case typeBit, typeBitN:
+ return "bit"
+ case typeDateTimeN:
+ return "datetime"
+ case typeDateTimeOffsetN:
+ return fmt.Sprintf("datetimeoffset(%d)", ti.Scale)
+ default:
+ panic(fmt.Sprintf("not implemented makeDecl for type %d", ti.TypeId))
+ }
+}
diff --git a/vendor/github.com/dgrijalva/jwt-go/.gitignore b/vendor/github.com/dgrijalva/jwt-go/.gitignore
deleted file mode 100644
index 80bed650e..000000000
--- a/vendor/github.com/dgrijalva/jwt-go/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.DS_Store
-bin
-
-
diff --git a/vendor/github.com/dgrijalva/jwt-go/.travis.yml b/vendor/github.com/dgrijalva/jwt-go/.travis.yml
deleted file mode 100644
index d6089146c..000000000
--- a/vendor/github.com/dgrijalva/jwt-go/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: go
-
-go:
- - 1.3.3
- - 1.4.2
- - 1.5
- - tip
diff --git a/shared/docker/copy.go b/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go
similarity index 65%
rename from shared/docker/copy.go
rename to vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go
index 806b6fa59..684b4d4cd 100644
--- a/shared/docker/copy.go
+++ b/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go
@@ -1,9 +1,11 @@
-package docker
+package stdcopy
import (
"encoding/binary"
"errors"
"io"
+
+ "github.com/Sirupsen/logrus"
)
const (
@@ -26,6 +28,39 @@ type StdWriter struct {
sizeBuf []byte
}
+func (w *StdWriter) Write(buf []byte) (n int, err error) {
+ var n1, n2 int
+ if w == nil || w.Writer == nil {
+ return 0, errors.New("Writer not instantiated")
+ }
+ binary.BigEndian.PutUint32(w.prefix[4:], uint32(len(buf)))
+ n1, err = w.Writer.Write(w.prefix[:])
+ if err != nil {
+ n = n1 - StdWriterPrefixLen
+ } else {
+ n2, err = w.Writer.Write(buf)
+ n = n1 + n2 - StdWriterPrefixLen
+ }
+ if n < 0 {
+ n = 0
+ }
+ return
+}
+
+// NewStdWriter instantiates a new Writer.
+// Everything written to it will be encapsulated using a custom format,
+// and written to the underlying `w` stream.
+// This allows multiple write streams (e.g. stdout and stderr) to be muxed into a single connection.
+// `t` indicates the id of the stream to encapsulate.
+// It can be stdcopy.Stdin, stdcopy.Stdout, stdcopy.Stderr.
+func NewStdWriter(w io.Writer, t StdType) *StdWriter {
+ return &StdWriter{
+ Writer: w,
+ prefix: t,
+ sizeBuf: make([]byte, 4),
+ }
+}
+
var ErrInvalidStdHeader = errors.New("Unrecognized input header")
// StdCopy is a modified version of io.Copy.
@@ -56,11 +91,13 @@ func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error)
nr += nr2
if er == io.EOF {
if nr < StdWriterPrefixLen {
+ logrus.Debugf("Corrupted prefix: %v", buf[:nr])
return written, nil
}
break
}
if er != nil {
+ logrus.Debugf("Error reading header: %s", er)
return 0, er
}
}
@@ -76,15 +113,18 @@ func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error)
// Write on stderr
out = dsterr
default:
+ logrus.Debugf("Error selecting output fd: (%d)", buf[StdWriterFdIndex])
return 0, ErrInvalidStdHeader
}
// Retrieve the size of the frame
frameSize = int(binary.BigEndian.Uint32(buf[StdWriterSizeIndex : StdWriterSizeIndex+4]))
+ logrus.Debugf("framesize: %d", frameSize)
// Check if the buffer is big enough to read the frame.
// Extend it if necessary.
if frameSize+StdWriterPrefixLen > bufLen {
+ logrus.Debugf("Extending buffer cap by %d (was %d)", frameSize+StdWriterPrefixLen-bufLen+1, len(buf))
buf = append(buf, make([]byte, frameSize+StdWriterPrefixLen-bufLen+1)...)
bufLen = len(buf)
}
@@ -96,11 +136,13 @@ func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error)
nr += nr2
if er == io.EOF {
if nr < frameSize+StdWriterPrefixLen {
+ logrus.Debugf("Corrupted frame: %v", buf[StdWriterPrefixLen:nr])
return written, nil
}
break
}
if er != nil {
+ logrus.Debugf("Error reading frame: %s", er)
return 0, er
}
}
@@ -108,10 +150,12 @@ func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error)
// Write the retrieved frame (without header)
nw, ew = out.Write(buf[StdWriterPrefixLen : frameSize+StdWriterPrefixLen])
if ew != nil {
+ logrus.Debugf("Error writing frame: %s", ew)
return 0, ew
}
// If the frame has not been fully written: error
if nw != frameSize {
+ logrus.Debugf("Error Short Write: (%d on %d)", nw, frameSize)
return 0, io.ErrShortWrite
}
written += int64(nw)
diff --git a/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy_test.go b/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy_test.go
new file mode 100644
index 000000000..a9fd73a49
--- /dev/null
+++ b/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy_test.go
@@ -0,0 +1,85 @@
+package stdcopy
+
+import (
+ "bytes"
+ "io/ioutil"
+ "strings"
+ "testing"
+)
+
+func TestNewStdWriter(t *testing.T) {
+ writer := NewStdWriter(ioutil.Discard, Stdout)
+ if writer == nil {
+ t.Fatalf("NewStdWriter with an invalid StdType should not return nil.")
+ }
+}
+
+func TestWriteWithUnitializedStdWriter(t *testing.T) {
+ writer := StdWriter{
+ Writer: nil,
+ prefix: Stdout,
+ sizeBuf: make([]byte, 4),
+ }
+ n, err := writer.Write([]byte("Something here"))
+ if n != 0 || err == nil {
+ t.Fatalf("Should fail when given an uncomplete or uninitialized StdWriter")
+ }
+}
+
+func TestWriteWithNilBytes(t *testing.T) {
+ writer := NewStdWriter(ioutil.Discard, Stdout)
+ n, err := writer.Write(nil)
+ if err != nil {
+ t.Fatalf("Shouldn't have fail when given no data")
+ }
+ if n > 0 {
+ t.Fatalf("Write should have written 0 byte, but has written %d", n)
+ }
+}
+
+func TestWrite(t *testing.T) {
+ writer := NewStdWriter(ioutil.Discard, Stdout)
+ data := []byte("Test StdWrite.Write")
+ n, err := writer.Write(data)
+ if err != nil {
+ t.Fatalf("Error while writing with StdWrite")
+ }
+ if n != len(data) {
+ t.Fatalf("Write should have writen %d byte but wrote %d.", len(data), n)
+ }
+}
+
+func TestStdCopyWithInvalidInputHeader(t *testing.T) {
+ dstOut := NewStdWriter(ioutil.Discard, Stdout)
+ dstErr := NewStdWriter(ioutil.Discard, Stderr)
+ src := strings.NewReader("Invalid input")
+ _, err := StdCopy(dstOut, dstErr, src)
+ if err == nil {
+ t.Fatal("StdCopy with invalid input header should fail.")
+ }
+}
+
+func TestStdCopyWithCorruptedPrefix(t *testing.T) {
+ data := []byte{0x01, 0x02, 0x03}
+ src := bytes.NewReader(data)
+ written, err := StdCopy(nil, nil, src)
+ if err != nil {
+ t.Fatalf("StdCopy should not return an error with corrupted prefix.")
+ }
+ if written != 0 {
+ t.Fatalf("StdCopy should have written 0, but has written %d", written)
+ }
+}
+
+func BenchmarkWrite(b *testing.B) {
+ w := NewStdWriter(ioutil.Discard, Stdout)
+ data := []byte("Test line for testing stdwriter performance\n")
+ data = bytes.Repeat(data, 100)
+ b.SetBytes(int64(len(data)))
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ if _, err := w.Write(data); err != nil {
+ b.Fatal(err)
+ }
+ }
+}
diff --git a/vendor/github.com/docker/docker/pkg/units/duration.go b/vendor/github.com/docker/docker/pkg/units/duration.go
new file mode 100644
index 000000000..44012aafb
--- /dev/null
+++ b/vendor/github.com/docker/docker/pkg/units/duration.go
@@ -0,0 +1,31 @@
+package units
+
+import (
+ "fmt"
+ "time"
+)
+
+// HumanDuration returns a human-readable approximation of a duration
+// (eg. "About a minute", "4 hours ago", etc.)
+func HumanDuration(d time.Duration) string {
+ if seconds := int(d.Seconds()); seconds < 1 {
+ return "Less than a second"
+ } else if seconds < 60 {
+ return fmt.Sprintf("%d seconds", seconds)
+ } else if minutes := int(d.Minutes()); minutes == 1 {
+ return "About a minute"
+ } else if minutes < 60 {
+ return fmt.Sprintf("%d minutes", minutes)
+ } else if hours := int(d.Hours()); hours == 1 {
+ return "About an hour"
+ } else if hours < 48 {
+ return fmt.Sprintf("%d hours", hours)
+ } else if hours < 24*7*2 {
+ return fmt.Sprintf("%d days", hours/24)
+ } else if hours < 24*30*3 {
+ return fmt.Sprintf("%d weeks", hours/24/7)
+ } else if hours < 24*365*2 {
+ return fmt.Sprintf("%d months", hours/24/30)
+ }
+ return fmt.Sprintf("%d years", int(d.Hours())/24/365)
+}
diff --git a/vendor/github.com/docker/docker/pkg/units/duration_test.go b/vendor/github.com/docker/docker/pkg/units/duration_test.go
new file mode 100644
index 000000000..fcfb6b7bb
--- /dev/null
+++ b/vendor/github.com/docker/docker/pkg/units/duration_test.go
@@ -0,0 +1,46 @@
+package units
+
+import (
+ "testing"
+ "time"
+)
+
+func TestHumanDuration(t *testing.T) {
+ // Useful duration abstractions
+ day := 24 * time.Hour
+ week := 7 * day
+ month := 30 * day
+ year := 365 * day
+
+ assertEquals(t, "Less than a second", HumanDuration(450*time.Millisecond))
+ assertEquals(t, "47 seconds", HumanDuration(47*time.Second))
+ assertEquals(t, "About a minute", HumanDuration(1*time.Minute))
+ assertEquals(t, "3 minutes", HumanDuration(3*time.Minute))
+ assertEquals(t, "35 minutes", HumanDuration(35*time.Minute))
+ assertEquals(t, "35 minutes", HumanDuration(35*time.Minute+40*time.Second))
+ assertEquals(t, "About an hour", HumanDuration(1*time.Hour))
+ assertEquals(t, "About an hour", HumanDuration(1*time.Hour+45*time.Minute))
+ assertEquals(t, "3 hours", HumanDuration(3*time.Hour))
+ assertEquals(t, "3 hours", HumanDuration(3*time.Hour+59*time.Minute))
+ assertEquals(t, "4 hours", HumanDuration(3*time.Hour+60*time.Minute))
+ assertEquals(t, "24 hours", HumanDuration(24*time.Hour))
+ assertEquals(t, "36 hours", HumanDuration(1*day+12*time.Hour))
+ assertEquals(t, "2 days", HumanDuration(2*day))
+ assertEquals(t, "7 days", HumanDuration(7*day))
+ assertEquals(t, "13 days", HumanDuration(13*day+5*time.Hour))
+ assertEquals(t, "2 weeks", HumanDuration(2*week))
+ assertEquals(t, "2 weeks", HumanDuration(2*week+4*day))
+ assertEquals(t, "3 weeks", HumanDuration(3*week))
+ assertEquals(t, "4 weeks", HumanDuration(4*week))
+ assertEquals(t, "4 weeks", HumanDuration(4*week+3*day))
+ assertEquals(t, "4 weeks", HumanDuration(1*month))
+ assertEquals(t, "6 weeks", HumanDuration(1*month+2*week))
+ assertEquals(t, "8 weeks", HumanDuration(2*month))
+ assertEquals(t, "3 months", HumanDuration(3*month+1*week))
+ assertEquals(t, "5 months", HumanDuration(5*month+2*week))
+ assertEquals(t, "13 months", HumanDuration(13*month))
+ assertEquals(t, "23 months", HumanDuration(23*month))
+ assertEquals(t, "24 months", HumanDuration(24*month))
+ assertEquals(t, "2 years", HumanDuration(24*month+2*week))
+ assertEquals(t, "3 years", HumanDuration(3*year+2*month))
+}
diff --git a/vendor/github.com/docker/docker/pkg/units/size.go b/vendor/github.com/docker/docker/pkg/units/size.go
new file mode 100644
index 000000000..9e84697ca
--- /dev/null
+++ b/vendor/github.com/docker/docker/pkg/units/size.go
@@ -0,0 +1,93 @@
+package units
+
+import (
+ "fmt"
+ "regexp"
+ "strconv"
+ "strings"
+)
+
+// See: http://en.wikipedia.org/wiki/Binary_prefix
+const (
+ // Decimal
+
+ KB = 1000
+ MB = 1000 * KB
+ GB = 1000 * MB
+ TB = 1000 * GB
+ PB = 1000 * TB
+
+ // Binary
+
+ KiB = 1024
+ MiB = 1024 * KiB
+ GiB = 1024 * MiB
+ TiB = 1024 * GiB
+ PiB = 1024 * TiB
+)
+
+type unitMap map[string]int64
+
+var (
+ decimalMap = unitMap{"k": KB, "m": MB, "g": GB, "t": TB, "p": PB}
+ binaryMap = unitMap{"k": KiB, "m": MiB, "g": GiB, "t": TiB, "p": PiB}
+ sizeRegex = regexp.MustCompile(`^(\d+)([kKmMgGtTpP])?[bB]?$`)
+)
+
+var decimapAbbrs = []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}
+var binaryAbbrs = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"}
+
+// CustomSize returns a human-readable approximation of a size
+// using custom format
+func CustomSize(format string, size float64, base float64, _map []string) string {
+ i := 0
+ for size >= base {
+ size = size / base
+ i++
+ }
+ return fmt.Sprintf(format, size, _map[i])
+}
+
+// HumanSize returns a human-readable approximation of a size
+// using SI standard (eg. "44kB", "17MB")
+func HumanSize(size float64) string {
+ return CustomSize("%.4g %s", size, 1000.0, decimapAbbrs)
+}
+
+func BytesSize(size float64) string {
+ return CustomSize("%.4g %s", size, 1024.0, binaryAbbrs)
+}
+
+// FromHumanSize returns an integer from a human-readable specification of a
+// size using SI standard (eg. "44kB", "17MB")
+func FromHumanSize(size string) (int64, error) {
+ return parseSize(size, decimalMap)
+}
+
+// RAMInBytes parses a human-readable string representing an amount of RAM
+// in bytes, kibibytes, mebibytes, gibibytes, or tebibytes and
+// returns the number of bytes, or -1 if the string is unparseable.
+// Units are case-insensitive, and the 'b' suffix is optional.
+func RAMInBytes(size string) (int64, error) {
+ return parseSize(size, binaryMap)
+}
+
+// Parses the human-readable size string into the amount it represents
+func parseSize(sizeStr string, uMap unitMap) (int64, error) {
+ matches := sizeRegex.FindStringSubmatch(sizeStr)
+ if len(matches) != 3 {
+ return -1, fmt.Errorf("invalid size: '%s'", sizeStr)
+ }
+
+ size, err := strconv.ParseInt(matches[1], 10, 0)
+ if err != nil {
+ return -1, err
+ }
+
+ unitPrefix := strings.ToLower(matches[2])
+ if mul, ok := uMap[unitPrefix]; ok {
+ size *= mul
+ }
+
+ return size, nil
+}
diff --git a/vendor/github.com/docker/docker/pkg/units/size_test.go b/vendor/github.com/docker/docker/pkg/units/size_test.go
new file mode 100644
index 000000000..67c3b81e6
--- /dev/null
+++ b/vendor/github.com/docker/docker/pkg/units/size_test.go
@@ -0,0 +1,108 @@
+package units
+
+import (
+ "reflect"
+ "runtime"
+ "strings"
+ "testing"
+)
+
+func TestBytesSize(t *testing.T) {
+ assertEquals(t, "1 KiB", BytesSize(1024))
+ assertEquals(t, "1 MiB", BytesSize(1024*1024))
+ assertEquals(t, "1 MiB", BytesSize(1048576))
+ assertEquals(t, "2 MiB", BytesSize(2*MiB))
+ assertEquals(t, "3.42 GiB", BytesSize(3.42*GiB))
+ assertEquals(t, "5.372 TiB", BytesSize(5.372*TiB))
+ assertEquals(t, "2.22 PiB", BytesSize(2.22*PiB))
+}
+
+func TestHumanSize(t *testing.T) {
+ assertEquals(t, "1 kB", HumanSize(1000))
+ assertEquals(t, "1.024 kB", HumanSize(1024))
+ assertEquals(t, "1 MB", HumanSize(1000000))
+ assertEquals(t, "1.049 MB", HumanSize(1048576))
+ assertEquals(t, "2 MB", HumanSize(2*MB))
+ assertEquals(t, "3.42 GB", HumanSize(float64(3.42*GB)))
+ assertEquals(t, "5.372 TB", HumanSize(float64(5.372*TB)))
+ assertEquals(t, "2.22 PB", HumanSize(float64(2.22*PB)))
+}
+
+func TestFromHumanSize(t *testing.T) {
+ assertSuccessEquals(t, 32, FromHumanSize, "32")
+ assertSuccessEquals(t, 32, FromHumanSize, "32b")
+ assertSuccessEquals(t, 32, FromHumanSize, "32B")
+ assertSuccessEquals(t, 32*KB, FromHumanSize, "32k")
+ assertSuccessEquals(t, 32*KB, FromHumanSize, "32K")
+ assertSuccessEquals(t, 32*KB, FromHumanSize, "32kb")
+ assertSuccessEquals(t, 32*KB, FromHumanSize, "32Kb")
+ assertSuccessEquals(t, 32*MB, FromHumanSize, "32Mb")
+ assertSuccessEquals(t, 32*GB, FromHumanSize, "32Gb")
+ assertSuccessEquals(t, 32*TB, FromHumanSize, "32Tb")
+ assertSuccessEquals(t, 32*PB, FromHumanSize, "32Pb")
+
+ assertError(t, FromHumanSize, "")
+ assertError(t, FromHumanSize, "hello")
+ assertError(t, FromHumanSize, "-32")
+ assertError(t, FromHumanSize, "32.3")
+ assertError(t, FromHumanSize, " 32 ")
+ assertError(t, FromHumanSize, "32.3Kb")
+ assertError(t, FromHumanSize, "32 mb")
+ assertError(t, FromHumanSize, "32m b")
+ assertError(t, FromHumanSize, "32bm")
+}
+
+func TestRAMInBytes(t *testing.T) {
+ assertSuccessEquals(t, 32, RAMInBytes, "32")
+ assertSuccessEquals(t, 32, RAMInBytes, "32b")
+ assertSuccessEquals(t, 32, RAMInBytes, "32B")
+ assertSuccessEquals(t, 32*KiB, RAMInBytes, "32k")
+ assertSuccessEquals(t, 32*KiB, RAMInBytes, "32K")
+ assertSuccessEquals(t, 32*KiB, RAMInBytes, "32kb")
+ assertSuccessEquals(t, 32*KiB, RAMInBytes, "32Kb")
+ assertSuccessEquals(t, 32*MiB, RAMInBytes, "32Mb")
+ assertSuccessEquals(t, 32*GiB, RAMInBytes, "32Gb")
+ assertSuccessEquals(t, 32*TiB, RAMInBytes, "32Tb")
+ assertSuccessEquals(t, 32*PiB, RAMInBytes, "32Pb")
+ assertSuccessEquals(t, 32*PiB, RAMInBytes, "32PB")
+ assertSuccessEquals(t, 32*PiB, RAMInBytes, "32P")
+
+ assertError(t, RAMInBytes, "")
+ assertError(t, RAMInBytes, "hello")
+ assertError(t, RAMInBytes, "-32")
+ assertError(t, RAMInBytes, "32.3")
+ assertError(t, RAMInBytes, " 32 ")
+ assertError(t, RAMInBytes, "32.3Kb")
+ assertError(t, RAMInBytes, "32 mb")
+ assertError(t, RAMInBytes, "32m b")
+ assertError(t, RAMInBytes, "32bm")
+}
+
+func assertEquals(t *testing.T, expected, actual interface{}) {
+ if expected != actual {
+ t.Errorf("Expected '%v' but got '%v'", expected, actual)
+ }
+}
+
+// func that maps to the parse function signatures as testing abstraction
+type parseFn func(string) (int64, error)
+
+// Define 'String()' for pretty-print
+func (fn parseFn) String() string {
+ fnName := runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name()
+ return fnName[strings.LastIndex(fnName, ".")+1:]
+}
+
+func assertSuccessEquals(t *testing.T, expected int64, fn parseFn, arg string) {
+ res, err := fn(arg)
+ if err != nil || res != expected {
+ t.Errorf("%s(\"%s\") -> expected '%d' but got '%d' with error '%v'", fn, arg, expected, res, err)
+ }
+}
+
+func assertError(t *testing.T, fn parseFn, arg string) {
+ res, err := fn(arg)
+ if err == nil && res != -1 {
+ t.Errorf("%s(\"%s\") -> expected error but got '%d'", fn, arg, res)
+ }
+}
diff --git a/vendor/github.com/vrischmann/envconfig/LICENSE b/vendor/github.com/dustin/go-broadcast/LICENSE
similarity index 96%
rename from vendor/github.com/vrischmann/envconfig/LICENSE
rename to vendor/github.com/dustin/go-broadcast/LICENSE
index e5bf20cdb..b01ef8026 100644
--- a/vendor/github.com/vrischmann/envconfig/LICENSE
+++ b/vendor/github.com/dustin/go-broadcast/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015 Vincent Rischmann
+Copyright (c) 2013 Dustin Sallings
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/github.com/dustin/go-broadcast/README.markdown b/vendor/github.com/dustin/go-broadcast/README.markdown
new file mode 100644
index 000000000..863ae2714
--- /dev/null
+++ b/vendor/github.com/dustin/go-broadcast/README.markdown
@@ -0,0 +1,5 @@
+pubsubbing channels.
+
+This project primarily exists because I've been copying and pasting
+the exact same two files into numerous projects. It does work well,
+though.
diff --git a/vendor/github.com/dustin/go-broadcast/broadcaster.go b/vendor/github.com/dustin/go-broadcast/broadcaster.go
new file mode 100644
index 000000000..9c113f596
--- /dev/null
+++ b/vendor/github.com/dustin/go-broadcast/broadcaster.go
@@ -0,0 +1,86 @@
+/*
+Package broadcast provides pubsub of messages over channels.
+
+A provider has a Broadcaster into which it Submits messages and into
+which subscribers Register to pick up those messages.
+
+*/
+package broadcast
+
+type broadcaster struct {
+ input chan interface{}
+ reg chan chan<- interface{}
+ unreg chan chan<- interface{}
+
+ outputs map[chan<- interface{}]bool
+}
+
+// The Broadcaster interface describes the main entry points to
+// broadcasters.
+type Broadcaster interface {
+ // Register a new channel to receive broadcasts
+ Register(chan<- interface{})
+ // Unregister a channel so that it no longer receives broadcasts.
+ Unregister(chan<- interface{})
+ // Shut this broadcaster down.
+ Close() error
+ // Submit a new object to all subscribers
+ Submit(interface{})
+}
+
+func (b *broadcaster) broadcast(m interface{}) {
+ for ch := range b.outputs {
+ ch <- m
+ }
+}
+
+func (b *broadcaster) run() {
+ for {
+ select {
+ case m := <-b.input:
+ b.broadcast(m)
+ case ch, ok := <-b.reg:
+ if ok {
+ b.outputs[ch] = true
+ } else {
+ return
+ }
+ case ch := <-b.unreg:
+ delete(b.outputs, ch)
+ }
+ }
+}
+
+// NewBroadcaster creates a new broadcaster with the given input
+// channel buffer length.
+func NewBroadcaster(buflen int) Broadcaster {
+ b := &broadcaster{
+ input: make(chan interface{}, buflen),
+ reg: make(chan chan<- interface{}),
+ unreg: make(chan chan<- interface{}),
+ outputs: make(map[chan<- interface{}]bool),
+ }
+
+ go b.run()
+
+ return b
+}
+
+func (b *broadcaster) Register(newch chan<- interface{}) {
+ b.reg <- newch
+}
+
+func (b *broadcaster) Unregister(newch chan<- interface{}) {
+ b.unreg <- newch
+}
+
+func (b *broadcaster) Close() error {
+ close(b.reg)
+ return nil
+}
+
+func (b *broadcaster) Submit(m interface{}) {
+ if b != nil {
+ b.input <- m
+ }
+}
diff --git a/vendor/github.com/dustin/go-broadcast/broadcaster_test.go b/vendor/github.com/dustin/go-broadcast/broadcaster_test.go
new file mode 100644
index 000000000..6c431d5e0
--- /dev/null
+++ b/vendor/github.com/dustin/go-broadcast/broadcaster_test.go
@@ -0,0 +1,100 @@
+package broadcast
+
+import (
+ "sync"
+ "testing"
+)
+
+func TestBroadcast(t *testing.T) {
+ wg := sync.WaitGroup{}
+
+ b := NewBroadcaster(100)
+ defer b.Close()
+
+ for i := 0; i < 5; i++ {
+ wg.Add(1)
+
+ cch := make(chan interface{})
+
+ b.Register(cch)
+
+ go func() {
+ defer wg.Done()
+ defer b.Unregister(cch)
+ <-cch
+ }()
+
+ }
+
+ b.Submit(1)
+
+ wg.Wait()
+}
+
+func TestBroadcastCleanup(t *testing.T) {
+ b := NewBroadcaster(100)
+ b.Register(make(chan interface{}))
+ b.Close()
+}
+
+func echoer(chin, chout chan interface{}) {
+ for m := range chin {
+ chout <- m
+ }
+}
+
+func BenchmarkDirectSend(b *testing.B) {
+ chout := make(chan interface{})
+ chin := make(chan interface{})
+ defer close(chin)
+
+ go echoer(chin, chout)
+
+ for i := 0; i < b.N; i++ {
+ chin <- nil
+ <-chout
+ }
+}
+
+func BenchmarkBrodcast(b *testing.B) {
+ chout := make(chan interface{})
+
+ bc := NewBroadcaster(0)
+ defer bc.Close()
+ bc.Register(chout)
+
+ for i := 0; i < b.N; i++ {
+ bc.Submit(nil)
+ <-chout
+ }
+}
+
+func BenchmarkParallelDirectSend(b *testing.B) {
+ chout := make(chan interface{})
+ chin := make(chan interface{})
+ defer close(chin)
+
+ go echoer(chin, chout)
+
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ chin <- nil
+ <-chout
+ }
+ })
+}
+
+func BenchmarkParallelBrodcast(b *testing.B) {
+ chout := make(chan interface{})
+
+ bc := NewBroadcaster(0)
+ defer bc.Close()
+ bc.Register(chout)
+
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ bc.Submit(nil)
+ <-chout
+ }
+ })
+}
diff --git a/vendor/github.com/dustin/go-broadcast/mux_observer.go b/vendor/github.com/dustin/go-broadcast/mux_observer.go
new file mode 100644
index 000000000..38d0dcb18
--- /dev/null
+++ b/vendor/github.com/dustin/go-broadcast/mux_observer.go
@@ -0,0 +1,133 @@
+package broadcast
+
+type taggedObservation struct {
+ sub *subObserver
+ ob interface{}
+}
+
+const (
+ register = iota
+ unregister
+ purge
+)
+
+type taggedRegReq struct {
+ sub *subObserver
+ ch chan<- interface{}
+ regType int
+}
+
+// A MuxObserver multiplexes several streams of observations onto a
+// single delivery goroutine.
+type MuxObserver struct {
+ subs map[*subObserver]map[chan<- interface{}]bool
+ reg chan taggedRegReq
+ input chan taggedObservation
+}
+
+// NewMuxObserver constructs a new MuxObserver.
+//
+// qlen is the size of the channel buffer for observations sent into
+// the mux observer and reglen is the size of the channel buffer for
+// registration/unregistration events.
+func NewMuxObserver(qlen, reglen int) *MuxObserver {
+ rv := &MuxObserver{
+ subs: map[*subObserver]map[chan<- interface{}]bool{},
+ reg: make(chan taggedRegReq, reglen),
+ input: make(chan taggedObservation, qlen),
+ }
+ go rv.run()
+ return rv
+}
+
+// Close shuts down this mux observer.
+func (m *MuxObserver) Close() error {
+ close(m.reg)
+ return nil
+}
+
+func (m *MuxObserver) broadcast(to taggedObservation) {
+ for ch := range m.subs[to.sub] {
+ ch <- to.ob
+ }
+}
+
+func (m *MuxObserver) doReg(tr taggedRegReq) {
+ mm, exists := m.subs[tr.sub]
+ if !exists {
+ mm = map[chan<- interface{}]bool{}
+ m.subs[tr.sub] = mm
+ }
+ mm[tr.ch] = true
+}
+
+func (m *MuxObserver) doUnreg(tr taggedRegReq) {
+ mm, exists := m.subs[tr.sub]
+ if exists {
+ delete(mm, tr.ch)
+ if len(mm) == 0 {
+ delete(m.subs, tr.sub)
+ }
+ }
+}
+
+func (m *MuxObserver) handleReg(tr taggedRegReq) {
+ switch tr.regType {
+ case register:
+ m.doReg(tr)
+ case unregister:
+ m.doUnreg(tr)
+ case purge:
+ delete(m.subs, tr.sub)
+ }
+}
+
+func (m *MuxObserver) run() {
+ for {
+ select {
+ case tr, ok := <-m.reg:
+ if ok {
+ m.handleReg(tr)
+ } else {
+ return
+ }
+ default:
+ select {
+ case to := <-m.input:
+ m.broadcast(to)
+ case tr, ok := <-m.reg:
+ if ok {
+ m.handleReg(tr)
+ } else {
+ return
+ }
+ }
+ }
+ }
+}
+
+// Sub creates a new sub-broadcaster from this MuxObserver.
+func (m *MuxObserver) Sub() Broadcaster {
+ return &subObserver{m}
+}
+
+type subObserver struct {
+ mo *MuxObserver
+}
+
+func (s *subObserver) Register(ch chan<- interface{}) {
+ s.mo.reg <- taggedRegReq{s, ch, register}
+}
+
+func (s *subObserver) Unregister(ch chan<- interface{}) {
+ s.mo.reg <- taggedRegReq{s, ch, unregister}
+}
+
+func (s *subObserver) Close() error {
+ s.mo.reg <- taggedRegReq{s, nil, purge}
+ return nil
+}
+
+func (s *subObserver) Submit(ob interface{}) {
+ s.mo.input <- taggedObservation{s, ob}
+}
diff --git a/vendor/github.com/dustin/go-broadcast/mux_observer_test.go b/vendor/github.com/dustin/go-broadcast/mux_observer_test.go
new file mode 100644
index 000000000..e395720e2
--- /dev/null
+++ b/vendor/github.com/dustin/go-broadcast/mux_observer_test.go
@@ -0,0 +1,67 @@
+package broadcast
+
+import (
+ "sync"
+ "testing"
+)
+
+func TestMuxBroadcast(t *testing.T) {
+ wg := sync.WaitGroup{}
+
+ mo := NewMuxObserver(0, 0)
+ defer mo.Close()
+
+ b1 := mo.Sub()
+ defer b1.Close()
+
+ b2 := mo.Sub()
+ defer b2.Close()
+
+ for i := 0; i < 5; i++ {
+ wg.Add(2)
+
+ cch1 := make(chan interface{})
+ b1.Register(cch1)
+ cch2 := make(chan interface{})
+ b2.Register(cch2)
+
+ go func() {
+ defer wg.Done()
+ defer b1.Unregister(cch1)
+ <-cch1
+ }()
+ go func() {
+ defer wg.Done()
+ defer b2.Unregister(cch2)
+ <-cch2
+ }()
+
+ }
+
+ go b1.Submit(1)
+ go b2.Submit(1)
+
+ wg.Wait()
+}
+
+func TestMuxBroadcastCleanup(t *testing.T) {
+ mo := NewMuxObserver(0, 0)
+ b := mo.Sub()
+ b.Register(make(chan interface{}))
+ b.Close()
+ mo.Close()
+}
+
+func BenchmarkMuxBrodcast(b *testing.B) {
+ chout := make(chan interface{})
+
+ mo := NewMuxObserver(0, 0)
+ defer mo.Close()
+ bc := mo.Sub()
+ bc.Register(chout)
+
+ for i := 0; i < b.N; i++ {
+ bc.Submit(nil)
+ <-chout
+ }
+}
diff --git a/vendor/github.com/eknkc/amber/README.md b/vendor/github.com/eknkc/amber/README.md
new file mode 100644
index 000000000..711582f14
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/README.md
@@ -0,0 +1,424 @@
+# amber
+--
+ import "github.com/eknkc/amber"
+
+Amber is an elegant templating engine for Go Programming Language
+It is inspired from HAML and Jade
+
+### Tags
+
+A tag is simply a word:
+
+ html
+
+is converted to
+
+
+
+It is possible to add ID and CLASS attributes to tags:
+
+ div#main
+ span.time
+
+are converted to
+
+
+
+
+Any arbitrary attribute name / value pair can be added this way:
+
+ a[href="http://www.google.com"]
+
+You can mix multiple attributes together
+
+ a#someid[href="/"][title="Main Page"].main.link Click Link
+
+gets converted to
+
+ Click Link
+
+It is also possible to define these attributes within the block of a tag
+
+ a
+ #someid
+ [href="/"]
+ [title="Main Page"]
+ .main
+ .link
+ | Click Link
+
+### Doctypes
+
+To add a doctype, use `!!!` or `doctype` keywords:
+
+ !!! transitional
+ //
+
+or use `doctype`
+
+ doctype 5
+ //
+
+Available options: `5`, `default`, `xml`, `transitional`, `strict`, `frameset`, `1.1`, `basic`, `mobile`
+
+### Tag Content
+
+For single line tag text, you can just append the text after tag name:
+
+ p Testing!
+
+would yield
+
+ Testing!
+
+For multi line tag text, or nested tags, use indentation:
+
+ html
+ head
+ title Page Title
+ body
+ div#content
+ p
+ | This is a long page content
+ | These lines are all part of the parent p
+
+ a[href="/"] Go To Main Page
+
+### Data
+
+Input template data can be reached by key names directly. For example, assuming the template has been
+executed with following JSON data:
+
+ {
+ "Name": "Ekin",
+ "LastName": "Koc",
+ "Repositories": [
+ "amber",
+ "dateformat"
+ ],
+ "Avatar": "/images/ekin.jpg",
+ "Friends": 17
+ }
+
+It is possible to interpolate fields using `#{}`
+
+ p Welcome #{Name}!
+
+would print
+
+ Welcome Ekin!
+
+Attributes can have field names as well
+
+ a[title=Name][href="/ekin.koc"]
+
+would print
+
+
+
+### Expressions
+
+Amber can expand basic expressions. For example, it is possible to concatenate strings with + operator:
+
+ p Welcome #{Name + " " + LastName}
+
+Arithmetic expressions are also supported:
+
+ p You need #{50 - Friends} more friends to reach 50!
+
+Expressions can be used within attributes
+
+ img[alt=Name + " " + LastName][src=Avatar]
+
+### Variables
+
+It is possible to define dynamic variables within templates,
+all variables must start with a $ character and can be assigned as in the following example:
+
+ div
+ $fullname = Name + " " + LastName
+ p Welcome #{$fullname}
+
+If you need to access the supplied data itself (i.e. the object containing Name, LastName etc fields.) you can use `$` variable
+
+ p $.Name
+
+### Conditions
+
+For conditional blocks, it is possible to use `if `
+
+ div
+ if Friends > 10
+ p You have more than 10 friends
+ else if Friends > 5
+ p You have more than 5 friends
+ else
+ p You need more friends
+
+Again, it is possible to use arithmetic and boolean operators
+
+ div
+ if Name == "Ekin" && LastName == "Koc"
+ p Hey! I know you..
+
+There is a special syntax for conditional attributes. Only block attributes can have conditions;
+
+ div
+ .hasfriends ? Friends > 0
+
+This would yield a div with `hasfriends` class only if the `Friends > 0` condition holds. It is
+perfectly fine to use the same method for other types of attributes:
+
+ div
+ #foo ? Name == "Ekin"
+ [bar=baz] ? len(Repositories) > 0
+
+### Iterations
+
+It is possible to iterate over arrays and maps using `each`:
+
+ each $repo in Repositories
+ p #{$repo}
+
+would print
+
+ p amber
+ p dateformat
+
+It is also possible to iterate over values and indexes at the same time
+
+ each $i, $repo in Repositories
+ p
+ .even ? $i % 2 == 0
+ .odd ? $i % 2 == 1
+
+### Mixins
+
+Mixins (reusable template blocks that accept arguments) can be defined:
+
+ mixin surprise
+ span Surprise!
+ mixin link($href, $title, $text)
+ a[href=$href][title=$title] #{$text}
+
+and then called multiple times within a template (or even within another mixin definition):
+
+ div
+ +surprise
+ +surprise
+ +link("http://google.com", "Google", "Check out Google")
+
+Template data, variables, expressions, etc., can all be passed as arguments:
+
+ +link(GoogleUrl, $googleTitle, "Check out " + $googleTitle)
+
+### Imports
+
+A template can import other templates using `import`:
+
+ a.amber
+ p this is template a
+
+ b.amber
+ p this is template b
+
+ c.amber
+ div
+ import a
+ import b
+
+gets compiled to
+
+ div
+ p this is template a
+ p this is template b
+
+### Inheritance
+
+A template can inherit other templates. In order to inherit another template, an `extends` keyword should be used.
+Parent template can define several named blocks and child template can modify the blocks.
+
+ master.amber
+ !!! 5
+ html
+ head
+ block meta
+ meta[name="description"][content="This is a great website"]
+
+ title
+ block title
+ | Default title
+ body
+ block content
+
+ subpage.amber
+ extends master
+
+ block title
+ | Some sub page!
+
+ block append meta
+ // This will be added after the description meta tag. It is also possible
+ // to prepend someting to an existing block
+ meta[name="keywords"][content="foo bar"]
+
+ block content
+ div#main
+ p Some content here
+
+### License
+(The MIT License)
+
+Copyright (c) 2012 Ekin Koc
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+## Usage
+
+```go
+var DefaultOptions = Options{true, false}
+var DefaultDirOptions = DirOptions{".amber", true}
+```
+
+#### func Compile
+
+```go
+func Compile(input string, options Options) (*template.Template, error)
+```
+Parses and compiles the supplied amber template string. Returns corresponding Go
+Template (html/templates) instance. Necessary runtime functions will be injected
+and the template will be ready to be executed.
+
+#### func CompileFile
+
+```go
+func CompileFile(filename string, options Options) (*template.Template, error)
+```
+Parses and compiles the contents of supplied filename. Returns corresponding Go
+Template (html/templates) instance. Necessary runtime functions will be injected
+and the template will be ready to be executed.
+
+#### func CompileDir
+```go
+func CompileDir(dirname string, dopt DirOptions, opt Options) (map[string]*template.Template, error)
+```
+Parses and compiles the contents of a supplied directory name. Returns a mapping of template name (extension stripped) to corresponding Go Template (html/template) instance. Necessary runtime functions will be injected and the template will be ready to be executed.
+
+If there are templates in subdirectories, its key in the map will be it's path relative to `dirname`. For example:
+```
+templates/
+ |-- index.amber
+ |-- layouts/
+ |-- base.amber
+```
+```go
+templates, err := amber.CompileDir("templates/", amber.DefaultDirOptions, amber.DefaultOptions)
+templates["index"] // index.amber Go Template
+templates["layouts/base"] // base.amber Go Template
+```
+By default, the search will be recursive and will match only files ending in ".amber". If recursive is turned off, it will only search the top level of the directory. Specified extension must start with a period.
+
+#### type Compiler
+
+```go
+type Compiler struct {
+ // Compiler options
+ Options
+}
+```
+
+Compiler is the main interface of Amber Template Engine. In order to use an
+Amber template, it is required to create a Compiler and compile an Amber source
+to native Go template.
+
+ compiler := amber.New()
+ // Parse the input file
+ err := compiler.ParseFile("./input.amber")
+ if err == nil {
+ // Compile input file to Go template
+ tpl, err := compiler.Compile()
+ if err == nil {
+ // Check built in html/template documentation for further details
+ tpl.Execute(os.Stdout, somedata)
+ }
+ }
+
+#### func New
+
+```go
+func New() *Compiler
+```
+Create and initialize a new Compiler
+
+#### func (*Compiler) Compile
+
+```go
+func (c *Compiler) Compile() (*template.Template, error)
+```
+Compile amber and create a Go Template (html/templates) instance. Necessary
+runtime functions will be injected and the template will be ready to be
+executed.
+
+#### func (*Compiler) CompileString
+
+```go
+func (c *Compiler) CompileString() (string, error)
+```
+Compile template and return the Go Template source You would not be using this
+unless debugging / checking the output. Please use Compile method to obtain a
+template instance directly.
+
+#### func (*Compiler) CompileWriter
+
+```go
+func (c *Compiler) CompileWriter(out io.Writer) (err error)
+```
+Compile amber and write the Go Template source into given io.Writer instance You
+would not be using this unless debugging / checking the output. Please use
+Compile method to obtain a template instance directly.
+
+#### func (*Compiler) Parse
+
+```go
+func (c *Compiler) Parse(input string) (err error)
+```
+Parse given raw amber template string.
+
+#### func (*Compiler) ParseFile
+
+```go
+func (c *Compiler) ParseFile(filename string) (err error)
+```
+Parse the amber template file in given path
+
+#### type Options
+
+```go
+type Options struct {
+ // Setting if pretty printing is enabled.
+ // Pretty printing ensures that the output html is properly indented and in human readable form.
+ // If disabled, produced HTML is compact. This might be more suitable in production environments.
+ // Defaukt: true
+ PrettyPrint bool
+ // Setting if line number emiting is enabled
+ // In this form, Amber emits line number comments in the output template. It is usable in debugging environments.
+ // Default: false
+ LineNumbers bool
+}
+```
+
+#### type DirOptions
+
+```go
+// Used to provide options to directory compilation
+type DirOptions struct {
+ // File extension to match for compilation
+ Ext string
+ // Whether or not to walk subdirectories
+ Recursive bool
+}
+```
diff --git a/vendor/github.com/eknkc/amber/amber_test.go b/vendor/github.com/eknkc/amber/amber_test.go
new file mode 100644
index 000000000..a9f0b4541
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/amber_test.go
@@ -0,0 +1,313 @@
+package amber
+
+import (
+ "bytes"
+ "strings"
+ "testing"
+)
+
+func Test_Doctype(t *testing.T) {
+ res, err := run(`!!! 5`, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, ``, t)
+ }
+}
+
+func Test_Nesting(t *testing.T) {
+ res, err := run(`html
+ head
+ title
+ body`, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, ``, t)
+ }
+}
+
+func Test_Mixin(t *testing.T) {
+ res, err := run(`
+ mixin a($a)
+ p #{$a}
+
+ +a(1)`, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, `1
`, t)
+ }
+}
+
+func Test_Mixin_NoArguments(t *testing.T) {
+ res, err := run(`
+ mixin a()
+ p Testing
+
+ +a()`, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, `Testing
`, t)
+ }
+}
+
+func Test_Mixin_MultiArguments(t *testing.T) {
+ res, err := run(`
+ mixin a($a, $b, $c, $d)
+ p #{$a} #{$b} #{$c} #{$d}
+
+ +a("a", "b", "c", A)`, map[string]int{"A": 2})
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, `a b c 2
`, t)
+ }
+}
+
+func Test_ClassName(t *testing.T) {
+ res, err := run(`div.test
+ p.test1.test2
+ [class=$]
+ .test3`, "test4")
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, ``, t)
+ }
+}
+
+func Test_Id(t *testing.T) {
+ res, err := run(`div#test
+ p#test1#test2`, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, ``, t)
+ }
+}
+
+func Test_Attribute(t *testing.T) {
+ res, err := run(`div[name="Test"][foo="bar"].testclass
+ p
+ [style="text-align: center; color: maroon"]`, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, ``, t)
+ }
+}
+
+func Test_EmptyAttribute(t *testing.T) {
+ res, err := run(`div[name]`, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, ``, t)
+ }
+}
+
+func Test_RawText(t *testing.T) {
+ res, err := run(`html
+ script
+ var a = 5;
+ alert(a)
+ style
+ body {
+ color: white
+ }`, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, "", t)
+ }
+}
+
+func Test_Empty(t *testing.T) {
+ res, err := run(``, nil)
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, ``, t)
+ }
+}
+
+func Test_ArithmeticExpression(t *testing.T) {
+ res, err := run(`#{A + B * C}`, map[string]int{"A": 2, "B": 3, "C": 4})
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, `14`, t)
+ }
+}
+
+func Test_BooleanExpression(t *testing.T) {
+ res, err := run(`#{C - A < B}`, map[string]int{"A": 2, "B": 3, "C": 4})
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, `true`, t)
+ }
+}
+
+func Test_FuncCall(t *testing.T) {
+ res, err := run(`div[data-map=json($)]`, map[string]int{"A": 2, "B": 3, "C": 4})
+
+ if err != nil {
+ t.Fatal(err.Error())
+ } else {
+ expect(res, ``, t)
+ }
+}
+
+func Test_Multiple_File_Inheritance(t *testing.T) {
+ tmpl, err := CompileDir("samples/", DefaultDirOptions, DefaultOptions)
+ if err != nil {
+ t.Fatal(err.Error())
+ }
+
+ t1a, ok := tmpl["multilevel.inheritance.a"]
+ if ok != true || t1a == nil {
+ t.Fatal("CompileDir, template not found.")
+ }
+
+ t1b, ok := tmpl["multilevel.inheritance.b"]
+ if ok != true || t1b == nil {
+ t.Fatal("CompileDir, template not found.")
+ }
+
+ t1c, ok := tmpl["multilevel.inheritance.c"]
+ if ok != true || t1c == nil {
+ t.Fatal("CompileDir, template not found.")
+ }
+
+ var res bytes.Buffer
+ t1c.Execute(&res, nil)
+ expect(strings.TrimSpace(res.String()), "This is C
", t)
+}
+
+func Failing_Test_CompileDir(t *testing.T) {
+ tmpl, err := CompileDir("samples/", DefaultDirOptions, DefaultOptions)
+
+ // Test Compilation
+ if err != nil {
+ t.Fatal(err.Error())
+ }
+
+ // Make sure files are added to map correctly
+ val1, ok := tmpl["basic"]
+ if ok != true || val1 == nil {
+ t.Fatal("CompileDir, template not found.")
+ }
+ val2, ok := tmpl["inherit"]
+ if ok != true || val2 == nil {
+ t.Fatal("CompileDir, template not found.")
+ }
+ val3, ok := tmpl["compiledir_test/basic"]
+ if ok != true || val3 == nil {
+ t.Fatal("CompileDir, template not found.")
+ }
+ val4, ok := tmpl["compiledir_test/compiledir_test/basic"]
+ if ok != true || val4 == nil {
+ t.Fatal("CompileDir, template not found.")
+ }
+
+ // Make sure file parsing is the same
+ var doc1, doc2 bytes.Buffer
+ val1.Execute(&doc1, nil)
+ val4.Execute(&doc2, nil)
+ expect(doc1.String(), doc2.String(), t)
+
+ // Check against CompileFile
+ compilefile, err := CompileFile("samples/basic.amber", DefaultOptions)
+ if err != nil {
+ t.Fatal(err.Error())
+ }
+ var doc3 bytes.Buffer
+ compilefile.Execute(&doc3, nil)
+ expect(doc1.String(), doc3.String(), t)
+ expect(doc2.String(), doc3.String(), t)
+
+}
+
+func Benchmark_Parse(b *testing.B) {
+ code := `
+ !!! 5
+ html
+ head
+ title Test Title
+ body
+ nav#mainNav[data-foo="bar"]
+ div#content
+ div.left
+ div.center
+ block center
+ p Main Content
+ .long ? somevar && someothervar
+ div.right`
+
+ for i := 0; i < b.N; i++ {
+ cmp := New()
+ cmp.Parse(code)
+ }
+}
+
+func Benchmark_Compile(b *testing.B) {
+ b.StopTimer()
+
+ code := `
+ !!! 5
+ html
+ head
+ title Test Title
+ body
+ nav#mainNav[data-foo="bar"]
+ div#content
+ div.left
+ div.center
+ block center
+ p Main Content
+ .long ? somevar && someothervar
+ div.right`
+
+ cmp := New()
+ cmp.Parse(code)
+
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ cmp.CompileString()
+ }
+}
+
+func expect(cur, expected string, t *testing.T) {
+ if cur != expected {
+ t.Fatalf("Expected {%s} got {%s}.", expected, cur)
+ }
+}
+
+func run(tpl string, data interface{}) (string, error) {
+ t, err := Compile(tpl, Options{false, false})
+ if err != nil {
+ return "", err
+ }
+ var buf bytes.Buffer
+ if err = t.Execute(&buf, data); err != nil {
+ return "", err
+ }
+ return strings.TrimSpace(buf.String()), nil
+}
diff --git a/vendor/github.com/eknkc/amber/amberc/cli.go b/vendor/github.com/eknkc/amber/amberc/cli.go
new file mode 100644
index 000000000..4ce316336
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/amberc/cli.go
@@ -0,0 +1,48 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ amber "github.com/eknkc/amber"
+ "os"
+)
+
+var prettyPrint bool
+var lineNumbers bool
+
+func init() {
+ flag.BoolVar(&prettyPrint, "prettyprint", true, "Use pretty indentation in output html.")
+ flag.BoolVar(&prettyPrint, "pp", true, "Use pretty indentation in output html.")
+
+ flag.BoolVar(&lineNumbers, "linenos", true, "Enable debugging information in output html.")
+ flag.BoolVar(&lineNumbers, "ln", true, "Enable debugging information in output html.")
+
+ flag.Parse()
+}
+
+func main() {
+ input := flag.Arg(0)
+
+ if len(input) == 0 {
+ fmt.Fprintln(os.Stderr, "Please provide an input file. (amberc input.amber)")
+ os.Exit(1)
+ }
+
+ cmp := amber.New()
+ cmp.PrettyPrint = prettyPrint
+ cmp.LineNumbers = lineNumbers
+
+ err := cmp.ParseFile(input)
+
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+
+ err = cmp.CompileWriter(os.Stdout)
+
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+}
diff --git a/vendor/github.com/eknkc/amber/compiler.go b/vendor/github.com/eknkc/amber/compiler.go
new file mode 100644
index 000000000..ab862e657
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/compiler.go
@@ -0,0 +1,777 @@
+package amber
+
+import (
+ "bytes"
+ "container/list"
+ "errors"
+ "fmt"
+ "go/ast"
+ gp "go/parser"
+ gt "go/token"
+ "html/template"
+ "io"
+ "os"
+ "path/filepath"
+ "reflect"
+ "regexp"
+ "sort"
+ "strconv"
+ "strings"
+
+ "github.com/eknkc/amber/parser"
+)
+
+var builtinFunctions = [...]string{
+ "len",
+ "print",
+ "printf",
+ "println",
+ "urlquery",
+ "js",
+ "json",
+ "index",
+ "html",
+ "unescaped",
+}
+
+// Compiler is the main interface of Amber Template Engine.
+// In order to use an Amber template, it is required to create a Compiler and
+// compile an Amber source to native Go template.
+// compiler := amber.New()
+// // Parse the input file
+// err := compiler.ParseFile("./input.amber")
+// if err == nil {
+// // Compile input file to Go template
+// tpl, err := compiler.Compile()
+// if err == nil {
+// // Check built in html/template documentation for further details
+// tpl.Execute(os.Stdout, somedata)
+// }
+// }
+type Compiler struct {
+ // Compiler options
+ Options
+ filename string
+ node parser.Node
+ indentLevel int
+ newline bool
+ buffer *bytes.Buffer
+ tempvarIndex int
+ mixins map[string]*parser.Mixin
+}
+
+// New creates and initialize a new Compiler.
+func New() *Compiler {
+ compiler := new(Compiler)
+ compiler.filename = ""
+ compiler.tempvarIndex = 0
+ compiler.PrettyPrint = true
+ compiler.Options = DefaultOptions
+ compiler.mixins = make(map[string]*parser.Mixin)
+
+ return compiler
+}
+
+// Options defines template output behavior.
+type Options struct {
+ // Setting if pretty printing is enabled.
+ // Pretty printing ensures that the output html is properly indented and in human readable form.
+ // If disabled, produced HTML is compact. This might be more suitable in production environments.
+ // Default: true
+ PrettyPrint bool
+ // Setting if line number emitting is enabled
+ // In this form, Amber emits line number comments in the output template. It is usable in debugging environments.
+ // Default: false
+ LineNumbers bool
+}
+
+// DirOptions is used to provide options to directory compilation.
+type DirOptions struct {
+ // File extension to match for compilation
+ Ext string
+ // Whether or not to walk subdirectories
+ Recursive bool
+}
+
+// DefaultOptions sets pretty-printing to true and line numbering to false.
+var DefaultOptions = Options{true, false}
+
+// DefaultDirOptions sets expected file extension to ".amber" and recursive search for templates within a directory to true.
+var DefaultDirOptions = DirOptions{".amber", true}
+
+// Compile parses and compiles the supplied amber template string. Returns corresponding Go Template (html/templates) instance.
+// Necessary runtime functions will be injected and the template will be ready to be executed.
+func Compile(input string, options Options) (*template.Template, error) {
+ comp := New()
+ comp.Options = options
+
+ err := comp.Parse(input)
+ if err != nil {
+ return nil, err
+ }
+
+ return comp.Compile()
+}
+
+// Compile parses and compiles the supplied amber template []byte.
+// Returns corresponding Go Template (html/templates) instance.
+// Necessary runtime functions will be injected and the template will be ready to be executed.
+func CompileData(input []byte, filename string, options Options) (*template.Template, error) {
+ comp := New()
+ comp.Options = options
+
+ err := comp.ParseData(input, filename)
+ if err != nil {
+ return nil, err
+ }
+
+ return comp.Compile()
+}
+
+// MustCompile is the same as Compile, except the input is assumed error free. If else, panic.
+func MustCompile(input string, options Options) *template.Template {
+ t, err := Compile(input, options)
+ if err != nil {
+ panic(err)
+ }
+ return t
+}
+
+// CompileFile parses and compiles the contents of supplied filename. Returns corresponding Go Template (html/templates) instance.
+// Necessary runtime functions will be injected and the template will be ready to be executed.
+func CompileFile(filename string, options Options) (*template.Template, error) {
+ comp := New()
+ comp.Options = options
+
+ err := comp.ParseFile(filename)
+ if err != nil {
+ return nil, err
+ }
+
+ return comp.Compile()
+}
+
+// MustCompileFile is the same as CompileFile, except the input is assumed error free. If else, panic.
+func MustCompileFile(filename string, options Options) *template.Template {
+ t, err := CompileFile(filename, options)
+ if err != nil {
+ panic(err)
+ }
+ return t
+}
+
+// CompileDir parses and compiles the contents of a supplied directory path, with options.
+// Returns a map of a template identifier (key) to a Go Template instance.
+// Ex: if the dirname="templates/" had a file "index.amber" the key would be "index"
+// If option for recursive is True, this parses every file of relevant extension
+// in all subdirectories. The key then is the path e.g: "layouts/layout"
+func CompileDir(dirname string, dopt DirOptions, opt Options) (map[string]*template.Template, error) {
+ dir, err := os.Open(dirname)
+ if err != nil {
+ return nil, err
+ }
+ defer dir.Close()
+
+ files, err := dir.Readdir(0)
+ if err != nil {
+ return nil, err
+ }
+
+ compiled := make(map[string]*template.Template)
+ for _, file := range files {
+ // filename is for example "index.amber"
+ filename := file.Name()
+ fileext := filepath.Ext(filename)
+
+ // If recursive is true and there's a subdirectory, recurse
+ if dopt.Recursive && file.IsDir() {
+ dirpath := filepath.Join(dirname, filename)
+ subcompiled, err := CompileDir(dirpath, dopt, opt)
+ if err != nil {
+ return nil, err
+ }
+ // Copy templates from subdirectory into parent template mapping
+ for k, v := range subcompiled {
+ // Concat with parent directory name for unique paths
+ key := filepath.Join(filename, k)
+ compiled[key] = v
+ }
+ } else if fileext == dopt.Ext {
+ // Otherwise compile the file and add to mapping
+ fullpath := filepath.Join(dirname, filename)
+ tmpl, err := CompileFile(fullpath, opt)
+ if err != nil {
+ return nil, err
+ }
+ // Strip extension
+ key := filename[0 : len(filename)-len(fileext)]
+ compiled[key] = tmpl
+ }
+ }
+
+ return compiled, nil
+}
+
+// MustCompileDir is the same as CompileDir, except input is assumed error free. If else, panic.
+func MustCompileDir(dirname string, dopt DirOptions, opt Options) map[string]*template.Template {
+ m, err := CompileDir(dirname, dopt, opt)
+ if err != nil {
+ panic(err)
+ }
+ return m
+}
+
+// Parse given raw amber template string.
+func (c *Compiler) Parse(input string) (err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ err = errors.New(r.(string))
+ }
+ }()
+
+ parser, err := parser.StringParser(input)
+
+ if err != nil {
+ return
+ }
+
+ c.node = parser.Parse()
+ return
+}
+
+// Parse given raw amber template bytes, and the filename that belongs with it
+func (c *Compiler) ParseData(input []byte, filename string) (err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ err = errors.New(r.(string))
+ }
+ }()
+
+ parser, err := parser.ByteParser(input)
+ parser.SetFilename(filename)
+
+ if err != nil {
+ return
+ }
+
+ c.node = parser.Parse()
+ return
+}
+
+// ParseFile parses the amber template file in given path.
+func (c *Compiler) ParseFile(filename string) (err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ err = errors.New(r.(string))
+ }
+ }()
+
+ parser, err := parser.FileParser(filename)
+
+ if err != nil {
+ return
+ }
+
+ c.node = parser.Parse()
+ c.filename = filename
+ return
+}
+
+// Compile amber and create a Go Template (html/templates) instance.
+// Necessary runtime functions will be injected and the template will be ready to be executed.
+func (c *Compiler) Compile() (*template.Template, error) {
+ return c.CompileWithName(filepath.Base(c.filename))
+}
+
+// CompileWithName is the same as Compile, but allows to specify a name for the template.
+func (c *Compiler) CompileWithName(name string) (*template.Template, error) {
+ return c.CompileWithTemplate(template.New(name))
+}
+
+// CompileWithTemplate is the same as Compile but allows to specify a template.
+func (c *Compiler) CompileWithTemplate(t *template.Template) (*template.Template, error) {
+ data, err := c.CompileString()
+
+ if err != nil {
+ return nil, err
+ }
+
+ tpl, err := t.Funcs(FuncMap).Parse(data)
+
+ if err != nil {
+ return nil, err
+ }
+
+ return tpl, nil
+}
+
+// CompileWriter compiles amber and writes the Go Template source into given io.Writer instance.
+// You would not be using this unless debugging / checking the output. Please use Compile
+// method to obtain a template instance directly.
+func (c *Compiler) CompileWriter(out io.Writer) (err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ err = errors.New(r.(string))
+ }
+ }()
+
+ c.buffer = new(bytes.Buffer)
+ c.visit(c.node)
+
+ if c.buffer.Len() > 0 {
+ c.write("\n")
+ }
+
+ _, err = c.buffer.WriteTo(out)
+ return
+}
+
+// CompileString compiles the template and returns the Go Template source.
+// You would not be using this unless debugging / checking the output. Please use Compile
+// method to obtain a template instance directly.
+func (c *Compiler) CompileString() (string, error) {
+ var buf bytes.Buffer
+
+ if err := c.CompileWriter(&buf); err != nil {
+ return "", err
+ }
+
+ result := buf.String()
+
+ return result, nil
+}
+
+func (c *Compiler) visit(node parser.Node) {
+ defer func() {
+ if r := recover(); r != nil {
+ if rs, ok := r.(string); ok && rs[:len("Amber Error")] == "Amber Error" {
+ panic(r)
+ }
+
+ pos := node.Pos()
+
+ if len(pos.Filename) > 0 {
+ panic(fmt.Sprintf("Amber Error in <%s>: %v - Line: %d, Column: %d, Length: %d", pos.Filename, r, pos.LineNum, pos.ColNum, pos.TokenLength))
+ } else {
+ panic(fmt.Sprintf("Amber Error: %v - Line: %d, Column: %d, Length: %d", r, pos.LineNum, pos.ColNum, pos.TokenLength))
+ }
+ }
+ }()
+
+ switch node.(type) {
+ case *parser.Block:
+ c.visitBlock(node.(*parser.Block))
+ case *parser.Doctype:
+ c.visitDoctype(node.(*parser.Doctype))
+ case *parser.Comment:
+ c.visitComment(node.(*parser.Comment))
+ case *parser.Tag:
+ c.visitTag(node.(*parser.Tag))
+ case *parser.Text:
+ c.visitText(node.(*parser.Text))
+ case *parser.Condition:
+ c.visitCondition(node.(*parser.Condition))
+ case *parser.Each:
+ c.visitEach(node.(*parser.Each))
+ case *parser.Assignment:
+ c.visitAssignment(node.(*parser.Assignment))
+ case *parser.Mixin:
+ c.visitMixin(node.(*parser.Mixin))
+ case *parser.MixinCall:
+ c.visitMixinCall(node.(*parser.MixinCall))
+ }
+}
+
+func (c *Compiler) write(value string) {
+ c.buffer.WriteString(value)
+}
+
+func (c *Compiler) indent(offset int, newline bool) {
+ if !c.PrettyPrint {
+ return
+ }
+
+ if newline && c.buffer.Len() > 0 {
+ c.write("\n")
+ }
+
+ for i := 0; i < c.indentLevel+offset; i++ {
+ c.write("\t")
+ }
+}
+
+func (c *Compiler) tempvar() string {
+ c.tempvarIndex++
+ return "$__amber_" + strconv.Itoa(c.tempvarIndex)
+}
+
+func (c *Compiler) escape(input string) string {
+ return strings.Replace(strings.Replace(input, `\`, `\\`, -1), `"`, `\"`, -1)
+}
+
+func (c *Compiler) visitBlock(block *parser.Block) {
+ for _, node := range block.Children {
+ if _, ok := node.(*parser.Text); !block.CanInline() && ok {
+ c.indent(0, true)
+ }
+
+ c.visit(node)
+ }
+}
+
+func (c *Compiler) visitDoctype(doctype *parser.Doctype) {
+ c.write(doctype.String())
+}
+
+func (c *Compiler) visitComment(comment *parser.Comment) {
+ if comment.Silent {
+ return
+ }
+
+ c.indent(0, false)
+
+ if comment.Block == nil {
+ c.write(`{{unescaped ""}}`)
+ } else {
+ c.write(``)
+ }
+}
+
+func (c *Compiler) visitCondition(condition *parser.Condition) {
+ c.write(`{{if ` + c.visitRawInterpolation(condition.Expression) + `}}`)
+ c.visitBlock(condition.Positive)
+ if condition.Negative != nil {
+ c.write(`{{else}}`)
+ c.visitBlock(condition.Negative)
+ }
+ c.write(`{{end}}`)
+}
+
+func (c *Compiler) visitEach(each *parser.Each) {
+ if each.Block == nil {
+ return
+ }
+
+ if len(each.Y) == 0 {
+ c.write(`{{range ` + each.X + ` := ` + c.visitRawInterpolation(each.Expression) + `}}`)
+ } else {
+ c.write(`{{range ` + each.X + `, ` + each.Y + ` := ` + c.visitRawInterpolation(each.Expression) + `}}`)
+ }
+ c.visitBlock(each.Block)
+ c.write(`{{end}}`)
+}
+
+func (c *Compiler) visitAssignment(assgn *parser.Assignment) {
+ c.write(`{{` + assgn.X + ` := ` + c.visitRawInterpolation(assgn.Expression) + `}}`)
+}
+
+func (c *Compiler) visitTag(tag *parser.Tag) {
+ type attrib struct {
+ name string
+ value string
+ condition string
+ }
+
+ attribs := make(map[string]*attrib)
+
+ for _, item := range tag.Attributes {
+ attr := new(attrib)
+ attr.name = item.Name
+
+ if !item.IsRaw {
+ attr.value = c.visitInterpolation(item.Value)
+ } else if item.Value == "" {
+ attr.value = ""
+ } else {
+ attr.value = item.Value
+ }
+
+ if len(item.Condition) != 0 {
+ attr.condition = c.visitRawInterpolation(item.Condition)
+ }
+
+ if attr.name == "class" && attribs["class"] != nil {
+ prevclass := attribs["class"]
+ attr.value = ` ` + attr.value
+
+ if len(attr.condition) > 0 {
+ attr.value = `{{if ` + attr.condition + `}}` + attr.value + `{{end}}`
+ attr.condition = ""
+ }
+
+ if len(prevclass.condition) > 0 {
+ prevclass.value = `{{if ` + prevclass.condition + `}}` + prevclass.value + `{{end}}`
+ prevclass.condition = ""
+ }
+
+ prevclass.value = prevclass.value + attr.value
+ } else {
+ attribs[item.Name] = attr
+ }
+ }
+
+ keys := make([]string, 0, len(attribs))
+ for key := range attribs {
+ keys = append(keys, key)
+ }
+ sort.Strings(keys)
+
+ c.indent(0, true)
+ c.write("<" + tag.Name)
+
+ for _, name := range keys {
+ value := attribs[name]
+
+ if len(value.condition) > 0 {
+ c.write(`{{if ` + value.condition + `}}`)
+ }
+
+ if value.value == "" {
+ c.write(` ` + name)
+ } else {
+ c.write(` ` + name + `="` + value.value + `"`)
+ }
+
+ if len(value.condition) > 0 {
+ c.write(`{{end}}`)
+ }
+ }
+
+ if tag.IsSelfClosing() {
+ c.write(` />`)
+ } else {
+ c.write(`>`)
+
+ if tag.Block != nil {
+ if !tag.Block.CanInline() {
+ c.indentLevel++
+ }
+
+ c.visitBlock(tag.Block)
+
+ if !tag.Block.CanInline() {
+ c.indentLevel--
+ c.indent(0, true)
+ }
+ }
+
+ c.write(`` + tag.Name + `>`)
+ }
+}
+
+var textInterpolateRegexp = regexp.MustCompile(`#\{(.*?)\}`)
+var textEscapeRegexp = regexp.MustCompile(`\{\{(.*?)\}\}`)
+
+func (c *Compiler) visitText(txt *parser.Text) {
+ value := textEscapeRegexp.ReplaceAllStringFunc(txt.Value, func(value string) string {
+ return `{{"{{"}}` + value[2:len(value)-2] + `{{"}}"}}`
+ })
+
+ value = textInterpolateRegexp.ReplaceAllStringFunc(value, func(value string) string {
+ return c.visitInterpolation(value[2 : len(value)-1])
+ })
+
+ lines := strings.Split(value, "\n")
+ for i := 0; i < len(lines); i++ {
+ c.write(lines[i])
+
+ if i < len(lines)-1 {
+ c.write("\n")
+ c.indent(0, false)
+ }
+ }
+}
+
+func (c *Compiler) visitInterpolation(value string) string {
+ return `{{` + c.visitRawInterpolation(value) + `}}`
+}
+
+func (c *Compiler) visitRawInterpolation(value string) string {
+ value = strings.Replace(value, "$", "__DOLLAR__", -1)
+ expr, err := gp.ParseExpr(value)
+ if err != nil {
+ panic("Unable to parse expression.")
+ }
+ value = strings.Replace(c.visitExpression(expr), "__DOLLAR__", "$", -1)
+ return value
+}
+
+func (c *Compiler) visitExpression(outerexpr ast.Expr) string {
+ stack := list.New()
+
+ pop := func() string {
+ if stack.Front() == nil {
+ return ""
+ }
+
+ val := stack.Front().Value.(string)
+ stack.Remove(stack.Front())
+ return val
+ }
+
+ var exec func(ast.Expr)
+
+ exec = func(expr ast.Expr) {
+ switch expr.(type) {
+ case *ast.BinaryExpr:
+ {
+ be := expr.(*ast.BinaryExpr)
+
+ exec(be.Y)
+ exec(be.X)
+
+ negate := false
+ name := c.tempvar()
+ c.write(`{{` + name + ` := `)
+
+ switch be.Op {
+ case gt.ADD:
+ c.write("__amber_add ")
+ case gt.SUB:
+ c.write("__amber_sub ")
+ case gt.MUL:
+ c.write("__amber_mul ")
+ case gt.QUO:
+ c.write("__amber_quo ")
+ case gt.REM:
+ c.write("__amber_rem ")
+ case gt.LAND:
+ c.write("and ")
+ case gt.LOR:
+ c.write("or ")
+ case gt.EQL:
+ c.write("__amber_eql ")
+ case gt.NEQ:
+ c.write("__amber_eql ")
+ negate = true
+ case gt.LSS:
+ c.write("__amber_lss ")
+ case gt.GTR:
+ c.write("__amber_gtr ")
+ case gt.LEQ:
+ c.write("__amber_gtr ")
+ negate = true
+ case gt.GEQ:
+ c.write("__amber_lss ")
+ negate = true
+ default:
+ panic("Unexpected operator!")
+ }
+
+ c.write(pop() + ` ` + pop() + `}}`)
+
+ if !negate {
+ stack.PushFront(name)
+ } else {
+ negname := c.tempvar()
+ c.write(`{{` + negname + ` := not ` + name + `}}`)
+ stack.PushFront(negname)
+ }
+ }
+ case *ast.UnaryExpr:
+ {
+ ue := expr.(*ast.UnaryExpr)
+
+ exec(ue.X)
+
+ name := c.tempvar()
+ c.write(`{{` + name + ` := `)
+
+ switch ue.Op {
+ case gt.SUB:
+ c.write("__amber_minus ")
+ case gt.ADD:
+ c.write("__amber_plus ")
+ case gt.NOT:
+ c.write("not ")
+ default:
+ panic("Unexpected operator!")
+ }
+
+ c.write(pop() + `}}`)
+ stack.PushFront(name)
+ }
+ case *ast.ParenExpr:
+ exec(expr.(*ast.ParenExpr).X)
+ case *ast.BasicLit:
+ stack.PushFront(expr.(*ast.BasicLit).Value)
+ case *ast.Ident:
+ name := expr.(*ast.Ident).Name
+ if len(name) >= len("__DOLLAR__") && name[:len("__DOLLAR__")] == "__DOLLAR__" {
+ if name == "__DOLLAR__" {
+ stack.PushFront(`.`)
+ } else {
+ stack.PushFront(`$` + expr.(*ast.Ident).Name[len("__DOLLAR__"):])
+ }
+ } else {
+ stack.PushFront(`.` + expr.(*ast.Ident).Name)
+ }
+ case *ast.SelectorExpr:
+ se := expr.(*ast.SelectorExpr)
+ exec(se.X)
+ x := pop()
+
+ if x == "." {
+ x = ""
+ }
+
+ name := c.tempvar()
+ c.write(`{{` + name + ` := ` + x + `.` + se.Sel.Name + `}}`)
+ stack.PushFront(name)
+ case *ast.CallExpr:
+ ce := expr.(*ast.CallExpr)
+
+ for i := len(ce.Args) - 1; i >= 0; i-- {
+ exec(ce.Args[i])
+ }
+
+ name := c.tempvar()
+ builtin := false
+
+ if ident, ok := ce.Fun.(*ast.Ident); ok {
+ for _, fname := range builtinFunctions {
+ if fname == ident.Name {
+ builtin = true
+ break
+ }
+ }
+ }
+
+ if builtin {
+ stack.PushFront(ce.Fun.(*ast.Ident).Name)
+ c.write(`{{` + name + ` := ` + pop())
+ } else {
+ exec(ce.Fun)
+ c.write(`{{` + name + ` := call ` + pop())
+ }
+
+ for i := 0; i < len(ce.Args); i++ {
+ c.write(` `)
+ c.write(pop())
+ }
+
+ c.write(`}}`)
+
+ stack.PushFront(name)
+ default:
+ panic("Unable to parse expression. Unsupported: " + reflect.TypeOf(expr).String())
+ }
+ }
+
+ exec(outerexpr)
+ return pop()
+}
+
+func (c *Compiler) visitMixin(mixin *parser.Mixin) {
+ c.mixins[mixin.Name] = mixin
+}
+
+func (c *Compiler) visitMixinCall(mixinCall *parser.MixinCall) {
+ mixin := c.mixins[mixinCall.Name]
+ for i, arg := range mixin.Args {
+ c.write(fmt.Sprintf(`{{%s := %s}}`, arg, c.visitRawInterpolation(mixinCall.Args[i])))
+ }
+ c.visitBlock(mixin.Block)
+}
diff --git a/vendor/github.com/eknkc/amber/doc.go b/vendor/github.com/eknkc/amber/doc.go
new file mode 100644
index 000000000..76ee96a82
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/doc.go
@@ -0,0 +1,257 @@
+/*
+Package amber is an elegant templating engine for Go Programming Language.
+It is inspired from HAML and Jade.
+
+Tags
+
+A tag is simply a word:
+
+ html
+
+is converted to
+
+
+
+It is possible to add ID and CLASS attributes to tags:
+
+ div#main
+ span.time
+
+are converted to
+
+
+
+
+Any arbitrary attribute name / value pair can be added this way:
+
+ a[href="http://www.google.com"]
+
+You can mix multiple attributes together
+
+ a#someid[href="/"][title="Main Page"].main.link Click Link
+
+gets converted to
+
+ Click Link
+
+It is also possible to define these attributes within the block of a tag
+
+ a
+ #someid
+ [href="/"]
+ [title="Main Page"]
+ .main
+ .link
+ | Click Link
+
+Doctypes
+
+To add a doctype, use `!!!` or `doctype` keywords:
+
+ !!! transitional
+ //
+
+or use `doctype`
+
+ doctype 5
+ //
+
+Available options: `5`, `default`, `xml`, `transitional`, `strict`, `frameset`, `1.1`, `basic`, `mobile`
+
+Tag Content
+
+For single line tag text, you can just append the text after tag name:
+
+ p Testing!
+
+would yield
+
+ Testing!
+
+For multi line tag text, or nested tags, use indentation:
+
+ html
+ head
+ title Page Title
+ body
+ div#content
+ p
+ | This is a long page content
+ | These lines are all part of the parent p
+
+ a[href="/"] Go To Main Page
+
+Data
+
+Input template data can be reached by key names directly. For example, assuming the template has been
+executed with following JSON data:
+
+ {
+ "Name": "Ekin",
+ "LastName": "Koc",
+ "Repositories": [
+ "amber",
+ "dateformat"
+ ],
+ "Avatar": "/images/ekin.jpg",
+ "Friends": 17
+ }
+
+It is possible to interpolate fields using `#{}`
+
+ p Welcome #{Name}!
+
+would print
+
+ Welcome Ekin!
+
+Attributes can have field names as well
+
+ a[title=Name][href="/ekin.koc"]
+
+would print
+
+
+
+Expressions
+
+Amber can expand basic expressions. For example, it is possible to concatenate strings with + operator:
+
+ p Welcome #{Name + " " + LastName}
+
+Arithmetic expressions are also supported:
+
+ p You need #{50 - Friends} more friends to reach 50!
+
+Expressions can be used within attributes
+
+ img[alt=Name + " " + LastName][src=Avatar]
+
+Variables
+
+It is possible to define dynamic variables within templates,
+all variables must start with a $ character and can be assigned as in the following example:
+
+ div
+ $fullname = Name + " " + LastName
+ p Welcome #{$fullname}
+
+If you need to access the supplied data itself (i.e. the object containing Name, LastName etc fields.) you can use `$` variable
+
+ p $.Name
+
+Conditions
+
+For conditional blocks, it is possible to use `if `
+
+ div
+ if Friends > 10
+ p You have more than 10 friends
+ else if Friends > 5
+ p You have more than 5 friends
+ else
+ p You need more friends
+
+Again, it is possible to use arithmetic and boolean operators
+
+ div
+ if Name == "Ekin" && LastName == "Koc"
+ p Hey! I know you..
+
+There is a special syntax for conditional attributes. Only block attributes can have conditions;
+
+ div
+ .hasfriends ? Friends > 0
+
+This would yield a div with `hasfriends` class only if the `Friends > 0` condition holds. It is
+perfectly fine to use the same method for other types of attributes:
+
+ div
+ #foo ? Name == "Ekin"
+ [bar=baz] ? len(Repositories) > 0
+
+Iterations
+
+It is possible to iterate over arrays and maps using `each`:
+
+ each $repo in Repositories
+ p #{$repo}
+
+would print
+
+ p amber
+ p dateformat
+
+It is also possible to iterate over values and indexes at the same time
+
+ each $i, $repo in Repositories
+ p
+ .even ? $i % 2 == 0
+ .odd ? $i % 2 == 1
+
+Includes
+
+A template can include other templates using `include`:
+
+ a.amber
+ p this is template a
+
+ b.amber
+ p this is template b
+
+ c.amber
+ div
+ include a
+ include b
+
+gets compiled to
+
+ div
+ p this is template a
+ p this is template b
+
+Inheritance
+
+A template can inherit other templates. In order to inherit another template, an `extends` keyword should be used.
+Parent template can define several named blocks and child template can modify the blocks.
+
+ master.amber
+ !!! 5
+ html
+ head
+ block meta
+ meta[name="description"][content="This is a great website"]
+
+ title
+ block title
+ | Default title
+ body
+ block content
+
+ subpage.amber
+ extends master
+
+ block title
+ | Some sub page!
+
+ block append meta
+ // This will be added after the description meta tag. It is also possible
+ // to prepend something to an existing block
+ meta[name="keywords"][content="foo bar"]
+
+ block content
+ div#main
+ p Some content here
+
+License
+(The MIT License)
+
+Copyright (c) 2012 Ekin Koc
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+package amber
diff --git a/vendor/github.com/eknkc/amber/parser/nodes.go b/vendor/github.com/eknkc/amber/parser/nodes.go
new file mode 100644
index 000000000..472454648
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/parser/nodes.go
@@ -0,0 +1,281 @@
+package parser
+
+import "regexp"
+import "strings"
+
+var selfClosingTags = [...]string{
+ "meta",
+ "img",
+ "link",
+ "input",
+ "source",
+ "area",
+ "base",
+ "col",
+ "br",
+ "hr",
+}
+
+var doctypes = map[string]string{
+ "5": ``,
+ "default": ``,
+ "xml": ``,
+ "transitional": ``,
+ "strict": ``,
+ "frameset": ``,
+ "1.1": ``,
+ "basic": ``,
+ "mobile": ``,
+}
+
+type Node interface {
+ Pos() SourcePosition
+}
+
+type SourcePosition struct {
+ LineNum int
+ ColNum int
+ TokenLength int
+ Filename string
+}
+
+func (s *SourcePosition) Pos() SourcePosition {
+ return *s
+}
+
+type Doctype struct {
+ SourcePosition
+ Value string
+}
+
+func newDoctype(value string) *Doctype {
+ dt := new(Doctype)
+ dt.Value = value
+ return dt
+}
+
+func (d *Doctype) String() string {
+ if defined := doctypes[d.Value]; len(defined) != 0 {
+ return defined
+ }
+
+ return ``
+}
+
+type Comment struct {
+ SourcePosition
+ Value string
+ Block *Block
+ Silent bool
+}
+
+func newComment(value string) *Comment {
+ dt := new(Comment)
+ dt.Value = value
+ dt.Block = nil
+ dt.Silent = false
+ return dt
+}
+
+type Text struct {
+ SourcePosition
+ Value string
+ Raw bool
+}
+
+func newText(value string, raw bool) *Text {
+ dt := new(Text)
+ dt.Value = value
+ dt.Raw = raw
+ return dt
+}
+
+type Block struct {
+ SourcePosition
+ Children []Node
+}
+
+func newBlock() *Block {
+ block := new(Block)
+ block.Children = make([]Node, 0)
+ return block
+}
+
+func (b *Block) push(node Node) {
+ b.Children = append(b.Children, node)
+}
+
+func (b *Block) pushFront(node Node) {
+ b.Children = append([]Node{node}, b.Children...)
+}
+
+func (b *Block) CanInline() bool {
+ if len(b.Children) == 0 {
+ return true
+ }
+
+ allText := true
+
+ for _, child := range b.Children {
+ if txt, ok := child.(*Text); !ok || txt.Raw {
+ allText = false
+ break
+ }
+ }
+
+ return allText
+}
+
+const (
+ NamedBlockDefault = iota
+ NamedBlockAppend
+ NamedBlockPrepend
+)
+
+type NamedBlock struct {
+ Block
+ Name string
+ Modifier int
+}
+
+func newNamedBlock(name string) *NamedBlock {
+ bb := new(NamedBlock)
+ bb.Name = name
+ bb.Block.Children = make([]Node, 0)
+ bb.Modifier = NamedBlockDefault
+ return bb
+}
+
+type Attribute struct {
+ SourcePosition
+ Name string
+ Value string
+ IsRaw bool
+ Condition string
+}
+
+type Tag struct {
+ SourcePosition
+ Block *Block
+ Name string
+ IsInterpolated bool
+ Attributes []Attribute
+}
+
+func newTag(name string) *Tag {
+ tag := new(Tag)
+ tag.Block = nil
+ tag.Name = name
+ tag.Attributes = make([]Attribute, 0)
+ tag.IsInterpolated = false
+ return tag
+
+}
+
+func (t *Tag) IsSelfClosing() bool {
+ for _, tag := range selfClosingTags {
+ if tag == t.Name {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (t *Tag) IsRawText() bool {
+ return t.Name == "style" || t.Name == "script"
+}
+
+type Condition struct {
+ SourcePosition
+ Positive *Block
+ Negative *Block
+ Expression string
+}
+
+func newCondition(exp string) *Condition {
+ cond := new(Condition)
+ cond.Expression = exp
+ return cond
+}
+
+type Each struct {
+ SourcePosition
+ X string
+ Y string
+ Expression string
+ Block *Block
+}
+
+func newEach(exp string) *Each {
+ each := new(Each)
+ each.Expression = exp
+ return each
+}
+
+type Assignment struct {
+ SourcePosition
+ X string
+ Expression string
+}
+
+func newAssignment(x, expression string) *Assignment {
+ assgn := new(Assignment)
+ assgn.X = x
+ assgn.Expression = expression
+ return assgn
+}
+
+type Mixin struct {
+ SourcePosition
+ Block *Block
+ Name string
+ Args []string
+}
+
+func newMixin(name, args string) *Mixin {
+ mixin := new(Mixin)
+ mixin.Name = name
+
+ delExp := regexp.MustCompile(`,\s`)
+ mixin.Args = delExp.Split(args, -1)
+
+ for i := 0; i < len(mixin.Args); i++ {
+ mixin.Args[i] = strings.TrimSpace(mixin.Args[i])
+ if mixin.Args[i] == "" {
+ mixin.Args = append(mixin.Args[:i], mixin.Args[i+1:]...)
+ i--
+ }
+ }
+
+ return mixin
+}
+
+type MixinCall struct {
+ SourcePosition
+ Name string
+ Args []string
+}
+
+func newMixinCall(name, args string) *MixinCall {
+ mixinCall := new(MixinCall)
+ mixinCall.Name = name
+
+ const t = "%s"
+ quoteExp := regexp.MustCompile(`"(.*?)"`)
+ delExp := regexp.MustCompile(`,\s`)
+
+ quotes := quoteExp.FindAllString(args, -1)
+ replaced := quoteExp.ReplaceAllString(args, t)
+ mixinCall.Args = delExp.Split(replaced, -1)
+
+ qi := 0
+ for i, arg := range mixinCall.Args {
+ if arg == t {
+ mixinCall.Args[i] = quotes[qi]
+ qi++
+ }
+ }
+
+ return mixinCall
+}
diff --git a/vendor/github.com/eknkc/amber/parser/parser.go b/vendor/github.com/eknkc/amber/parser/parser.go
new file mode 100644
index 000000000..380e4a338
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/parser/parser.go
@@ -0,0 +1,454 @@
+package parser
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "path/filepath"
+ "strings"
+)
+
+type Parser struct {
+ scanner *scanner
+ filename string
+ currenttoken *token
+ namedBlocks map[string]*NamedBlock
+ parent *Parser
+ result *Block
+}
+
+func newParser(rdr io.Reader) *Parser {
+ p := new(Parser)
+ p.scanner = newScanner(rdr)
+ p.namedBlocks = make(map[string]*NamedBlock)
+ return p
+}
+
+func StringParser(input string) (*Parser, error) {
+ return newParser(bytes.NewReader([]byte(input))), nil
+}
+
+func ByteParser(input []byte) (*Parser, error) {
+ return newParser(bytes.NewReader(input)), nil
+}
+
+func (p *Parser) SetFilename(filename string) {
+ p.filename = filename
+}
+
+func FileParser(filename string) (*Parser, error) {
+ data, err := ioutil.ReadFile(filename)
+
+ if err != nil {
+ return nil, err
+ }
+
+ parser := newParser(bytes.NewReader(data))
+ parser.filename = filename
+ return parser, nil
+}
+
+func (p *Parser) Parse() *Block {
+ if p.result != nil {
+ return p.result
+ }
+
+ defer func() {
+ if r := recover(); r != nil {
+ if rs, ok := r.(string); ok && rs[:len("Amber Error")] == "Amber Error" {
+ panic(r)
+ }
+
+ pos := p.pos()
+
+ if len(pos.Filename) > 0 {
+ panic(fmt.Sprintf("Amber Error in <%s>: %v - Line: %d, Column: %d, Length: %d", pos.Filename, r, pos.LineNum, pos.ColNum, pos.TokenLength))
+ } else {
+ panic(fmt.Sprintf("Amber Error: %v - Line: %d, Column: %d, Length: %d", r, pos.LineNum, pos.ColNum, pos.TokenLength))
+ }
+ }
+ }()
+
+ block := newBlock()
+ p.advance()
+
+ for {
+ if p.currenttoken == nil || p.currenttoken.Kind == tokEOF {
+ break
+ }
+
+ if p.currenttoken.Kind == tokBlank {
+ p.advance()
+ continue
+ }
+
+ block.push(p.parse())
+ }
+
+ if p.parent != nil {
+ p.parent.Parse()
+
+ for _, prev := range p.parent.namedBlocks {
+ ours := p.namedBlocks[prev.Name]
+
+ if ours == nil {
+ // Put a copy of the named block into current context, so that sub-templates can use the block
+ p.namedBlocks[prev.Name] = prev
+ continue
+ }
+
+ top := findTopmostParentWithNamedBlock(p, prev.Name)
+ nb := top.namedBlocks[prev.Name]
+ switch ours.Modifier {
+ case NamedBlockAppend:
+ for i := 0; i < len(ours.Children); i++ {
+ nb.push(ours.Children[i])
+ }
+ case NamedBlockPrepend:
+ for i := len(ours.Children) - 1; i >= 0; i-- {
+ nb.pushFront(ours.Children[i])
+ }
+ default:
+ nb.Children = ours.Children
+ }
+ }
+
+ block = p.parent.result
+ }
+
+ p.result = block
+ return block
+}
+
+func (p *Parser) pos() SourcePosition {
+ pos := p.scanner.Pos()
+ pos.Filename = p.filename
+ return pos
+}
+
+func (p *Parser) parseRelativeFile(filename string) *Parser {
+ if len(p.filename) == 0 {
+ panic("Unable to import or extend " + filename + " in a non filesystem based parser.")
+ }
+
+ filename = filepath.Join(filepath.Dir(p.filename), filename)
+
+ if strings.IndexRune(filepath.Base(filename), '.') < 0 {
+ filename = filename + ".amber"
+ }
+
+ parser, err := FileParser(filename)
+ if err != nil {
+ panic("Unable to read " + filename + ", Error: " + string(err.Error()))
+ }
+
+ return parser
+}
+
+func (p *Parser) parse() Node {
+ switch p.currenttoken.Kind {
+ case tokDoctype:
+ return p.parseDoctype()
+ case tokComment:
+ return p.parseComment()
+ case tokText:
+ return p.parseText()
+ case tokIf:
+ return p.parseIf()
+ case tokEach:
+ return p.parseEach()
+ case tokImport:
+ return p.parseImport()
+ case tokTag:
+ return p.parseTag()
+ case tokAssignment:
+ return p.parseAssignment()
+ case tokNamedBlock:
+ return p.parseNamedBlock()
+ case tokExtends:
+ return p.parseExtends()
+ case tokIndent:
+ return p.parseBlock(nil)
+ case tokMixin:
+ return p.parseMixin()
+ case tokMixinCall:
+ return p.parseMixinCall()
+ }
+
+ panic(fmt.Sprintf("Unexpected token: %d", p.currenttoken.Kind))
+}
+
+func (p *Parser) expect(typ rune) *token {
+ if p.currenttoken.Kind != typ {
+ panic("Unexpected token!")
+ }
+ curtok := p.currenttoken
+ p.advance()
+ return curtok
+}
+
+func (p *Parser) advance() {
+ p.currenttoken = p.scanner.Next()
+}
+
+func (p *Parser) parseExtends() *Block {
+ if p.parent != nil {
+ panic("Unable to extend multiple parent templates.")
+ }
+
+ tok := p.expect(tokExtends)
+ parser := p.parseRelativeFile(tok.Value)
+ parser.Parse()
+ p.parent = parser
+ return newBlock()
+}
+
+func (p *Parser) parseBlock(parent Node) *Block {
+ p.expect(tokIndent)
+ block := newBlock()
+ block.SourcePosition = p.pos()
+
+ for {
+ if p.currenttoken == nil || p.currenttoken.Kind == tokEOF || p.currenttoken.Kind == tokOutdent {
+ break
+ }
+
+ if p.currenttoken.Kind == tokBlank {
+ p.advance()
+ continue
+ }
+
+ if p.currenttoken.Kind == tokId ||
+ p.currenttoken.Kind == tokClassName ||
+ p.currenttoken.Kind == tokAttribute {
+
+ if tag, ok := parent.(*Tag); ok {
+ attr := p.expect(p.currenttoken.Kind)
+ cond := attr.Data["Condition"]
+
+ switch attr.Kind {
+ case tokId:
+ tag.Attributes = append(tag.Attributes, Attribute{p.pos(), "id", attr.Value, true, cond})
+ case tokClassName:
+ tag.Attributes = append(tag.Attributes, Attribute{p.pos(), "class", attr.Value, true, cond})
+ case tokAttribute:
+ tag.Attributes = append(tag.Attributes, Attribute{p.pos(), attr.Value, attr.Data["Content"], attr.Data["Mode"] == "raw", cond})
+ }
+
+ continue
+ } else {
+ panic("Conditional attributes must be placed immediately within a parent tag.")
+ }
+ }
+
+ block.push(p.parse())
+ }
+
+ p.expect(tokOutdent)
+
+ return block
+}
+
+func (p *Parser) parseIf() *Condition {
+ tok := p.expect(tokIf)
+ cnd := newCondition(tok.Value)
+ cnd.SourcePosition = p.pos()
+
+readmore:
+ switch p.currenttoken.Kind {
+ case tokIndent:
+ cnd.Positive = p.parseBlock(cnd)
+ goto readmore
+ case tokElse:
+ p.expect(tokElse)
+ if p.currenttoken.Kind == tokIf {
+ cnd.Negative = newBlock()
+ cnd.Negative.push(p.parseIf())
+ } else if p.currenttoken.Kind == tokIndent {
+ cnd.Negative = p.parseBlock(cnd)
+ } else {
+ panic("Unexpected token!")
+ }
+ goto readmore
+ }
+
+ return cnd
+}
+
+func (p *Parser) parseEach() *Each {
+ tok := p.expect(tokEach)
+ ech := newEach(tok.Value)
+ ech.SourcePosition = p.pos()
+ ech.X = tok.Data["X"]
+ ech.Y = tok.Data["Y"]
+
+ if p.currenttoken.Kind == tokIndent {
+ ech.Block = p.parseBlock(ech)
+ }
+
+ return ech
+}
+
+func (p *Parser) parseImport() *Block {
+ tok := p.expect(tokImport)
+ node := p.parseRelativeFile(tok.Value).Parse()
+ node.SourcePosition = p.pos()
+ return node
+}
+
+func (p *Parser) parseNamedBlock() *Block {
+ tok := p.expect(tokNamedBlock)
+
+ if p.namedBlocks[tok.Value] != nil {
+ panic("Multiple definitions of named blocks are not permitted. Block " + tok.Value + " has been re defined.")
+ }
+
+ block := newNamedBlock(tok.Value)
+ block.SourcePosition = p.pos()
+
+ if tok.Data["Modifier"] == "append" {
+ block.Modifier = NamedBlockAppend
+ } else if tok.Data["Modifier"] == "prepend" {
+ block.Modifier = NamedBlockPrepend
+ }
+
+ if p.currenttoken.Kind == tokIndent {
+ block.Block = *(p.parseBlock(nil))
+ }
+
+ p.namedBlocks[block.Name] = block
+
+ if block.Modifier == NamedBlockDefault {
+ return &block.Block
+ }
+
+ return newBlock()
+}
+
+func (p *Parser) parseDoctype() *Doctype {
+ tok := p.expect(tokDoctype)
+ node := newDoctype(tok.Value)
+ node.SourcePosition = p.pos()
+ return node
+}
+
+func (p *Parser) parseComment() *Comment {
+ tok := p.expect(tokComment)
+ cmnt := newComment(tok.Value)
+ cmnt.SourcePosition = p.pos()
+ cmnt.Silent = tok.Data["Mode"] == "silent"
+
+ if p.currenttoken.Kind == tokIndent {
+ cmnt.Block = p.parseBlock(cmnt)
+ }
+
+ return cmnt
+}
+
+func (p *Parser) parseText() *Text {
+ tok := p.expect(tokText)
+ node := newText(tok.Value, tok.Data["Mode"] == "raw")
+ node.SourcePosition = p.pos()
+ return node
+}
+
+func (p *Parser) parseAssignment() *Assignment {
+ tok := p.expect(tokAssignment)
+ node := newAssignment(tok.Data["X"], tok.Value)
+ node.SourcePosition = p.pos()
+ return node
+}
+
+func (p *Parser) parseTag() *Tag {
+ tok := p.expect(tokTag)
+ tag := newTag(tok.Value)
+ tag.SourcePosition = p.pos()
+
+ ensureBlock := func() {
+ if tag.Block == nil {
+ tag.Block = newBlock()
+ }
+ }
+
+readmore:
+ switch p.currenttoken.Kind {
+ case tokIndent:
+ if tag.IsRawText() {
+ p.scanner.readRaw = true
+ }
+
+ block := p.parseBlock(tag)
+ if tag.Block == nil {
+ tag.Block = block
+ } else {
+ for _, c := range block.Children {
+ tag.Block.push(c)
+ }
+ }
+ case tokId:
+ id := p.expect(tokId)
+ if len(id.Data["Condition"]) > 0 {
+ panic("Conditional attributes must be placed in a block within a tag.")
+ }
+ tag.Attributes = append(tag.Attributes, Attribute{p.pos(), "id", id.Value, true, ""})
+ goto readmore
+ case tokClassName:
+ cls := p.expect(tokClassName)
+ if len(cls.Data["Condition"]) > 0 {
+ panic("Conditional attributes must be placed in a block within a tag.")
+ }
+ tag.Attributes = append(tag.Attributes, Attribute{p.pos(), "class", cls.Value, true, ""})
+ goto readmore
+ case tokAttribute:
+ attr := p.expect(tokAttribute)
+ if len(attr.Data["Condition"]) > 0 {
+ panic("Conditional attributes must be placed in a block within a tag.")
+ }
+ tag.Attributes = append(tag.Attributes, Attribute{p.pos(), attr.Value, attr.Data["Content"], attr.Data["Mode"] == "raw", ""})
+ goto readmore
+ case tokText:
+ if p.currenttoken.Data["Mode"] != "piped" {
+ ensureBlock()
+ tag.Block.pushFront(p.parseText())
+ goto readmore
+ }
+ }
+
+ return tag
+}
+
+func (p *Parser) parseMixin() *Mixin {
+ tok := p.expect(tokMixin)
+ mixin := newMixin(tok.Value, tok.Data["Args"])
+ mixin.SourcePosition = p.pos()
+
+ if p.currenttoken.Kind == tokIndent {
+ mixin.Block = p.parseBlock(mixin)
+ }
+
+ return mixin
+}
+
+func (p *Parser) parseMixinCall() *MixinCall {
+ tok := p.expect(tokMixinCall)
+ mixinCall := newMixinCall(tok.Value, tok.Data["Args"])
+ mixinCall.SourcePosition = p.pos()
+ return mixinCall
+}
+
+func findTopmostParentWithNamedBlock(p *Parser, name string) *Parser {
+ top := p
+
+ for {
+ if top.namedBlocks[name] == nil {
+ return nil
+ }
+ if top.parent == nil {
+ return top
+ }
+ if top.parent.namedBlocks[name] != nil {
+ top = top.parent
+ }
+ }
+}
diff --git a/vendor/github.com/eknkc/amber/parser/scanner.go b/vendor/github.com/eknkc/amber/parser/scanner.go
new file mode 100644
index 000000000..76b7013f5
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/parser/scanner.go
@@ -0,0 +1,501 @@
+package parser
+
+import (
+ "bufio"
+ "container/list"
+ "fmt"
+ "io"
+ "regexp"
+)
+
+const (
+ tokEOF = -(iota + 1)
+ tokDoctype
+ tokComment
+ tokIndent
+ tokOutdent
+ tokBlank
+ tokId
+ tokClassName
+ tokTag
+ tokText
+ tokAttribute
+ tokIf
+ tokElse
+ tokEach
+ tokAssignment
+ tokImport
+ tokNamedBlock
+ tokExtends
+ tokMixin
+ tokMixinCall
+)
+
+const (
+ scnNewLine = iota
+ scnLine
+ scnEOF
+)
+
+type scanner struct {
+ reader *bufio.Reader
+ indentStack *list.List
+ stash *list.List
+
+ state int32
+ buffer string
+
+ line int
+ col int
+ lastTokenLine int
+ lastTokenCol int
+ lastTokenSize int
+
+ readRaw bool
+}
+
+type token struct {
+ Kind rune
+ Value string
+ Data map[string]string
+}
+
+func newScanner(r io.Reader) *scanner {
+ s := new(scanner)
+ s.reader = bufio.NewReader(r)
+ s.indentStack = list.New()
+ s.stash = list.New()
+ s.state = scnNewLine
+ s.line = -1
+ s.col = 0
+
+ return s
+}
+
+func (s *scanner) Pos() SourcePosition {
+ return SourcePosition{s.lastTokenLine + 1, s.lastTokenCol + 1, s.lastTokenSize, ""}
+}
+
+// Returns next token found in buffer
+func (s *scanner) Next() *token {
+ if s.readRaw {
+ s.readRaw = false
+ return s.NextRaw()
+ }
+
+ s.ensureBuffer()
+
+ if stashed := s.stash.Front(); stashed != nil {
+ tok := stashed.Value.(*token)
+ s.stash.Remove(stashed)
+ return tok
+ }
+
+ switch s.state {
+ case scnEOF:
+ if outdent := s.indentStack.Back(); outdent != nil {
+ s.indentStack.Remove(outdent)
+ return &token{tokOutdent, "", nil}
+ }
+
+ return &token{tokEOF, "", nil}
+ case scnNewLine:
+ s.state = scnLine
+
+ if tok := s.scanIndent(); tok != nil {
+ return tok
+ }
+
+ return s.Next()
+ case scnLine:
+ if tok := s.scanMixin(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanMixinCall(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanDoctype(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanCondition(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanEach(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanImport(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanExtends(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanBlock(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanAssignment(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanTag(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanId(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanClassName(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanAttribute(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanComment(); tok != nil {
+ return tok
+ }
+
+ if tok := s.scanText(); tok != nil {
+ return tok
+ }
+ }
+
+ return nil
+}
+
+func (s *scanner) NextRaw() *token {
+ result := ""
+ level := 0
+
+ for {
+ s.ensureBuffer()
+
+ switch s.state {
+ case scnEOF:
+ return &token{tokText, result, map[string]string{"Mode": "raw"}}
+ case scnNewLine:
+ s.state = scnLine
+
+ if tok := s.scanIndent(); tok != nil {
+ if tok.Kind == tokIndent {
+ level++
+ } else if tok.Kind == tokOutdent {
+ level--
+ } else {
+ result = result + "\n"
+ continue
+ }
+
+ if level < 0 {
+ s.stash.PushBack(&token{tokOutdent, "", nil})
+
+ if len(result) > 0 && result[len(result)-1] == '\n' {
+ result = result[:len(result)-1]
+ }
+
+ return &token{tokText, result, map[string]string{"Mode": "raw"}}
+ }
+ }
+ case scnLine:
+ if len(result) > 0 {
+ result = result + "\n"
+ }
+ for i := 0; i < level; i++ {
+ result += "\t"
+ }
+ result = result + s.buffer
+ s.consume(len(s.buffer))
+ }
+ }
+
+ return nil
+}
+
+var rgxIndent = regexp.MustCompile(`^(\s+)`)
+
+func (s *scanner) scanIndent() *token {
+ if len(s.buffer) == 0 {
+ return &token{tokBlank, "", nil}
+ }
+
+ var head *list.Element
+ for head = s.indentStack.Front(); head != nil; head = head.Next() {
+ value := head.Value.(*regexp.Regexp)
+
+ if match := value.FindString(s.buffer); len(match) != 0 {
+ s.consume(len(match))
+ } else {
+ break
+ }
+ }
+
+ newIndent := rgxIndent.FindString(s.buffer)
+
+ if len(newIndent) != 0 && head == nil {
+ s.indentStack.PushBack(regexp.MustCompile(regexp.QuoteMeta(newIndent)))
+ s.consume(len(newIndent))
+ return &token{tokIndent, newIndent, nil}
+ }
+
+ if len(newIndent) == 0 && head != nil {
+ for head != nil {
+ next := head.Next()
+ s.indentStack.Remove(head)
+ if next == nil {
+ return &token{tokOutdent, "", nil}
+ } else {
+ s.stash.PushBack(&token{tokOutdent, "", nil})
+ }
+ head = next
+ }
+ }
+
+ if len(newIndent) != 0 && head != nil {
+ panic("Mismatching indentation. Please use a coherent indent schema.")
+ }
+
+ return nil
+}
+
+var rgxDoctype = regexp.MustCompile(`^(!!!|doctype)\s*(.*)`)
+
+func (s *scanner) scanDoctype() *token {
+ if sm := rgxDoctype.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ if len(sm[2]) == 0 {
+ sm[2] = "html"
+ }
+
+ s.consume(len(sm[0]))
+ return &token{tokDoctype, sm[2], nil}
+ }
+
+ return nil
+}
+
+var rgxIf = regexp.MustCompile(`^if\s+(.+)$`)
+var rgxElse = regexp.MustCompile(`^else\s*`)
+
+func (s *scanner) scanCondition() *token {
+ if sm := rgxIf.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokIf, sm[1], nil}
+ }
+
+ if sm := rgxElse.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokElse, "", nil}
+ }
+
+ return nil
+}
+
+var rgxEach = regexp.MustCompile(`^each\s+(\$[\w0-9\-_]*)(?:\s*,\s*(\$[\w0-9\-_]*))?\s+in\s+(.+)$`)
+
+func (s *scanner) scanEach() *token {
+ if sm := rgxEach.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokEach, sm[3], map[string]string{"X": sm[1], "Y": sm[2]}}
+ }
+
+ return nil
+}
+
+var rgxAssignment = regexp.MustCompile(`^(\$[\w0-9\-_]*)?\s*=\s*(.+)$`)
+
+func (s *scanner) scanAssignment() *token {
+ if sm := rgxAssignment.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokAssignment, sm[2], map[string]string{"X": sm[1]}}
+ }
+
+ return nil
+}
+
+var rgxComment = regexp.MustCompile(`^\/\/(-)?\s*(.*)$`)
+
+func (s *scanner) scanComment() *token {
+ if sm := rgxComment.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ mode := "embed"
+ if len(sm[1]) != 0 {
+ mode = "silent"
+ }
+
+ s.consume(len(sm[0]))
+ return &token{tokComment, sm[2], map[string]string{"Mode": mode}}
+ }
+
+ return nil
+}
+
+var rgxId = regexp.MustCompile(`^#([\w-]+)(?:\s*\?\s*(.*)$)?`)
+
+func (s *scanner) scanId() *token {
+ if sm := rgxId.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokId, sm[1], map[string]string{"Condition": sm[2]}}
+ }
+
+ return nil
+}
+
+var rgxClassName = regexp.MustCompile(`^\.([\w-]+)(?:\s*\?\s*(.*)$)?`)
+
+func (s *scanner) scanClassName() *token {
+ if sm := rgxClassName.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokClassName, sm[1], map[string]string{"Condition": sm[2]}}
+ }
+
+ return nil
+}
+
+var rgxAttribute = regexp.MustCompile(`^\[([\w\-]+)\s*(?:=\s*(\"([^\"\\]*)\"|([^\]]+)))?\](?:\s*\?\s*(.*)$)?`)
+
+func (s *scanner) scanAttribute() *token {
+ if sm := rgxAttribute.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+
+ if len(sm[3]) != 0 || sm[2] == "" {
+ return &token{tokAttribute, sm[1], map[string]string{"Content": sm[3], "Mode": "raw", "Condition": sm[5]}}
+ }
+
+ return &token{tokAttribute, sm[1], map[string]string{"Content": sm[4], "Mode": "expression", "Condition": sm[5]}}
+ }
+
+ return nil
+}
+
+var rgxImport = regexp.MustCompile(`^import\s+([0-9a-zA-Z_\-\. \/]*)$`)
+
+func (s *scanner) scanImport() *token {
+ if sm := rgxImport.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokImport, sm[1], nil}
+ }
+
+ return nil
+}
+
+var rgxExtends = regexp.MustCompile(`^extends\s+([0-9a-zA-Z_\-\. \/]*)$`)
+
+func (s *scanner) scanExtends() *token {
+ if sm := rgxExtends.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokExtends, sm[1], nil}
+ }
+
+ return nil
+}
+
+var rgxBlock = regexp.MustCompile(`^block\s+(?:(append|prepend)\s+)?([0-9a-zA-Z_\-\. \/]*)$`)
+
+func (s *scanner) scanBlock() *token {
+ if sm := rgxBlock.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokNamedBlock, sm[2], map[string]string{"Modifier": sm[1]}}
+ }
+
+ return nil
+}
+
+var rgxTag = regexp.MustCompile(`^(\w[-:\w]*)`)
+
+func (s *scanner) scanTag() *token {
+ if sm := rgxTag.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokTag, sm[1], nil}
+ }
+
+ return nil
+}
+
+var rgxMixin = regexp.MustCompile(`^mixin ([a-zA-Z_]+\w*)(\(((\$\w*(,\s)?)*)\))?$`)
+
+func (s *scanner) scanMixin() *token {
+ if sm := rgxMixin.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokMixin, sm[1], map[string]string{"Args": sm[3]}}
+ }
+
+ return nil
+}
+
+var rgxMixinCall = regexp.MustCompile(`^\+([A-Za-z_]+\w*)(\((.+(,\s)?)*\))?$`)
+
+func (s *scanner) scanMixinCall() *token {
+ if sm := rgxMixinCall.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+ return &token{tokMixinCall, sm[1], map[string]string{"Args": sm[3]}}
+ }
+
+ return nil
+}
+
+var rgxText = regexp.MustCompile(`^(\|)? ?(.*)$`)
+
+func (s *scanner) scanText() *token {
+ if sm := rgxText.FindStringSubmatch(s.buffer); len(sm) != 0 {
+ s.consume(len(sm[0]))
+
+ mode := "inline"
+ if sm[1] == "|" {
+ mode = "piped"
+ }
+
+ return &token{tokText, sm[2], map[string]string{"Mode": mode}}
+ }
+
+ return nil
+}
+
+// Moves position forward, and removes beginning of s.buffer (len bytes)
+func (s *scanner) consume(runes int) {
+ if len(s.buffer) < runes {
+ panic(fmt.Sprintf("Unable to consume %d runes from buffer.", runes))
+ }
+
+ s.lastTokenLine = s.line
+ s.lastTokenCol = s.col
+ s.lastTokenSize = runes
+
+ s.buffer = s.buffer[runes:]
+ s.col += runes
+}
+
+// Reads string into s.buffer
+func (s *scanner) ensureBuffer() {
+ if len(s.buffer) > 0 {
+ return
+ }
+
+ buf, err := s.reader.ReadString('\n')
+
+ if err != nil && err != io.EOF {
+ panic(err)
+ } else if err != nil && len(buf) == 0 {
+ s.state = scnEOF
+ } else {
+ // endline "LF only" or "\n" use Unix, Linux, modern MacOS X, FreeBSD, BeOS, RISC OS
+ if buf[len(buf)-1] == '\n' {
+ buf = buf[:len(buf)-1]
+ }
+ // endline "CR+LF" or "\r\n" use internet protocols, DEC RT-11, Windows, CP/M, MS-DOS, OS/2, Symbian OS
+ if len(buf) > 0 && buf[len(buf)-1] == '\r' {
+ buf = buf[:len(buf)-1]
+ }
+
+ s.state = scnNewLine
+ s.buffer = buf
+ s.line += 1
+ s.col = 0
+ }
+}
diff --git a/vendor/github.com/eknkc/amber/runtime.go b/vendor/github.com/eknkc/amber/runtime.go
new file mode 100644
index 000000000..6438fd1fc
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/runtime.go
@@ -0,0 +1,287 @@
+package amber
+
+import (
+ "encoding/json"
+ "fmt"
+ "html/template"
+ "reflect"
+)
+
+var FuncMap = template.FuncMap{
+ "__amber_add": runtime_add,
+ "__amber_sub": runtime_sub,
+ "__amber_mul": runtime_mul,
+ "__amber_quo": runtime_quo,
+ "__amber_rem": runtime_rem,
+ "__amber_minus": runtime_minus,
+ "__amber_plus": runtime_plus,
+ "__amber_eql": runtime_eql,
+ "__amber_gtr": runtime_gtr,
+ "__amber_lss": runtime_lss,
+
+ "json": runtime_json,
+ "unescaped": runtime_unescaped,
+}
+
+func runtime_add(x, y interface{}) interface{} {
+ vx, vy := reflect.ValueOf(x), reflect.ValueOf(y)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Int() + vy.Int()
+ case reflect.Float32, reflect.Float64:
+ return float64(vx.Int()) + vy.Float()
+ case reflect.String:
+ return fmt.Sprintf("%d%s", vx.Int(), vy.String())
+ }
+ }
+ case reflect.Float32, reflect.Float64:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Float() + float64(vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return vx.Float() + vy.Float()
+ case reflect.String:
+ return fmt.Sprintf("%f%s", vx.Float(), vy.String())
+ }
+ }
+ case reflect.String:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return fmt.Sprintf("%s%d", vx.String(), vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return fmt.Sprintf("%s%f", vx.String(), vy.Float())
+ case reflect.String:
+ return fmt.Sprintf("%s%s", vx.String(), vy.String())
+ }
+ }
+ }
+
+ return ""
+}
+
+func runtime_sub(x, y interface{}) interface{} {
+ vx, vy := reflect.ValueOf(x), reflect.ValueOf(y)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Int() - vy.Int()
+ case reflect.Float32, reflect.Float64:
+ return float64(vx.Int()) - vy.Float()
+ }
+ }
+ case reflect.Float32, reflect.Float64:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Float() - float64(vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return vx.Float() - vy.Float()
+ }
+ }
+ }
+
+ return ""
+}
+
+func runtime_mul(x, y interface{}) interface{} {
+ vx, vy := reflect.ValueOf(x), reflect.ValueOf(y)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Int() * vy.Int()
+ case reflect.Float32, reflect.Float64:
+ return float64(vx.Int()) * vy.Float()
+ }
+ }
+ case reflect.Float32, reflect.Float64:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Float() * float64(vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return vx.Float() * vy.Float()
+ }
+ }
+ }
+
+ return ""
+}
+
+func runtime_quo(x, y interface{}) interface{} {
+ vx, vy := reflect.ValueOf(x), reflect.ValueOf(y)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Int() / vy.Int()
+ case reflect.Float32, reflect.Float64:
+ return float64(vx.Int()) / vy.Float()
+ }
+ }
+ case reflect.Float32, reflect.Float64:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Float() / float64(vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return vx.Float() / vy.Float()
+ }
+ }
+ }
+
+ return ""
+}
+
+func runtime_rem(x, y interface{}) interface{} {
+ vx, vy := reflect.ValueOf(x), reflect.ValueOf(y)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Int() % vy.Int()
+ }
+ }
+ }
+
+ return ""
+}
+
+func runtime_minus(x interface{}) interface{} {
+ vx := reflect.ValueOf(x)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return -vx.Int()
+ case reflect.Float32, reflect.Float64:
+ return -vx.Float()
+ }
+
+ return ""
+}
+
+func runtime_plus(x interface{}) interface{} {
+ vx := reflect.ValueOf(x)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return +vx.Int()
+ case reflect.Float32, reflect.Float64:
+ return +vx.Float()
+ }
+
+ return ""
+}
+
+func runtime_eql(x, y interface{}) bool {
+ vx, vy := reflect.ValueOf(x), reflect.ValueOf(y)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Int() == vy.Int()
+ case reflect.Float32, reflect.Float64:
+ return float64(vx.Int()) == vy.Float()
+ case reflect.String:
+ return fmt.Sprintf("%d", vx.Int()) == vy.String()
+ }
+ }
+ case reflect.Float32, reflect.Float64:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Float() == float64(vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return vx.Float() == vy.Float()
+ case reflect.String:
+ return fmt.Sprintf("%f", vx.Float()) == vy.String()
+ }
+ }
+ case reflect.String:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.String() == fmt.Sprintf("%d", vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return vx.String() == fmt.Sprintf("%f", vy.Float())
+ case reflect.String:
+ return vx.String() == fmt.Sprintf("%s", vy.String())
+ }
+ }
+ case reflect.Bool:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Bool() && vy.Int() != 0
+ case reflect.Bool:
+ return vx.Bool() == vy.Bool()
+ }
+ }
+ }
+
+ return false
+}
+
+func runtime_lss(x, y interface{}) bool {
+ vx, vy := reflect.ValueOf(x), reflect.ValueOf(y)
+ switch vx.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Int() < vy.Int()
+ case reflect.Float32, reflect.Float64:
+ return float64(vx.Int()) < vy.Float()
+ case reflect.String:
+ return fmt.Sprintf("%d", vx.Int()) < vy.String()
+ }
+ }
+ case reflect.Float32, reflect.Float64:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.Float() < float64(vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return vx.Float() < vy.Float()
+ case reflect.String:
+ return fmt.Sprintf("%f", vx.Float()) < vy.String()
+ }
+ }
+ case reflect.String:
+ {
+ switch vy.Kind() {
+ case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8:
+ return vx.String() < fmt.Sprintf("%d", vy.Int())
+ case reflect.Float32, reflect.Float64:
+ return vx.String() < fmt.Sprintf("%f", vy.Float())
+ case reflect.String:
+ return vx.String() < vy.String()
+ }
+ }
+ }
+
+ return false
+}
+
+func runtime_gtr(x, y interface{}) bool {
+ return !runtime_lss(x, y) && !runtime_eql(x, y)
+}
+
+func runtime_json(x interface{}) (res string, err error) {
+ bres, err := json.Marshal(x)
+ res = string(bres)
+ return
+}
+
+func runtime_unescaped(x string) interface{} {
+ return template.HTML(x)
+}
diff --git a/vendor/github.com/eknkc/amber/samples/basic.amber b/vendor/github.com/eknkc/amber/samples/basic.amber
new file mode 100644
index 000000000..96f73271b
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/samples/basic.amber
@@ -0,0 +1,28 @@
+!!! 5
+html
+ head
+ title Hello
+
+ meta[name="description"][value="This is a sample"]
+
+ script[type="text/javascript"]
+ var hw = "Hello World!"
+ alert(hw)
+
+ style[type="text/css"]
+ body {
+ background: maroon;
+ color: white
+ }
+
+ body
+ header#mainHeader
+ ul
+ li.active
+ a[href="/"] Main Page
+ [title="Main Page"]
+
+ footer
+ | Hey
+ br
+ | There
diff --git a/vendor/github.com/eknkc/amber/samples/compiledir_test/basic.amber b/vendor/github.com/eknkc/amber/samples/compiledir_test/basic.amber
new file mode 100644
index 000000000..96f73271b
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/samples/compiledir_test/basic.amber
@@ -0,0 +1,28 @@
+!!! 5
+html
+ head
+ title Hello
+
+ meta[name="description"][value="This is a sample"]
+
+ script[type="text/javascript"]
+ var hw = "Hello World!"
+ alert(hw)
+
+ style[type="text/css"]
+ body {
+ background: maroon;
+ color: white
+ }
+
+ body
+ header#mainHeader
+ ul
+ li.active
+ a[href="/"] Main Page
+ [title="Main Page"]
+
+ footer
+ | Hey
+ br
+ | There
diff --git a/vendor/github.com/eknkc/amber/samples/compiledir_test/compiledir_test/basic.amber b/vendor/github.com/eknkc/amber/samples/compiledir_test/compiledir_test/basic.amber
new file mode 100644
index 000000000..96f73271b
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/samples/compiledir_test/compiledir_test/basic.amber
@@ -0,0 +1,28 @@
+!!! 5
+html
+ head
+ title Hello
+
+ meta[name="description"][value="This is a sample"]
+
+ script[type="text/javascript"]
+ var hw = "Hello World!"
+ alert(hw)
+
+ style[type="text/css"]
+ body {
+ background: maroon;
+ color: white
+ }
+
+ body
+ header#mainHeader
+ ul
+ li.active
+ a[href="/"] Main Page
+ [title="Main Page"]
+
+ footer
+ | Hey
+ br
+ | There
diff --git a/vendor/github.com/eknkc/amber/samples/inherit.amber b/vendor/github.com/eknkc/amber/samples/inherit.amber
new file mode 100644
index 000000000..afb38bb60
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/samples/inherit.amber
@@ -0,0 +1,11 @@
+extends inherit.master.amber
+
+block append meta
+ meta[name="keywords"][content="These are added by the child template"]
+
+block menu
+ li Item 1
+ li Item 2
+
+block content
+ p Content from child template
diff --git a/vendor/github.com/eknkc/amber/samples/inherit.master.amber b/vendor/github.com/eknkc/amber/samples/inherit.master.amber
new file mode 100644
index 000000000..66cf82cd7
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/samples/inherit.master.amber
@@ -0,0 +1,16 @@
+!!! transitional
+html
+ head
+ title Hello
+
+ block meta
+ meta[name="description"][value="This is a sample"]
+
+ body
+ header#mainHeader
+ ul
+ block menu
+
+ div#content
+ block content
+
diff --git a/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.a.amber b/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.a.amber
new file mode 100644
index 000000000..2e2c45ac4
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.a.amber
@@ -0,0 +1,2 @@
+block overwriteme
+ p This is A
diff --git a/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.b.amber b/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.b.amber
new file mode 100644
index 000000000..23b699f52
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.b.amber
@@ -0,0 +1,4 @@
+extends multilevel.inheritance.a.amber
+
+block overwriteme
+ p This is B
diff --git a/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.c.amber b/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.c.amber
new file mode 100644
index 000000000..3cce2ee93
--- /dev/null
+++ b/vendor/github.com/eknkc/amber/samples/multilevel.inheritance.c.amber
@@ -0,0 +1,4 @@
+extends multilevel.inheritance.b.amber
+
+block overwriteme
+ p This is C
diff --git a/vendor/github.com/franela/goblin/.gitignore b/vendor/github.com/franela/goblin/.gitignore
deleted file mode 100644
index 00268614f..000000000
--- a/vendor/github.com/franela/goblin/.gitignore
+++ /dev/null
@@ -1,22 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
diff --git a/vendor/github.com/franela/goblin/.travis.yml b/vendor/github.com/franela/goblin/.travis.yml
deleted file mode 100644
index 27a631645..000000000
--- a/vendor/github.com/franela/goblin/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: go
-go:
- - 1.1.2
- - tip
-notifications:
- email:
- - ionathan@gmail.com
- - marcosnils@gmail.com
diff --git a/vendor/github.com/franela/goblin/Makefile b/vendor/github.com/franela/goblin/Makefile
deleted file mode 100644
index 66763dc8c..000000000
--- a/vendor/github.com/franela/goblin/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-export GOPATH=$(shell pwd)
-test:
- go test -v
diff --git a/vendor/github.com/franela/goblin/README.md b/vendor/github.com/franela/goblin/README.md
deleted file mode 100644
index 2972b1554..000000000
--- a/vendor/github.com/franela/goblin/README.md
+++ /dev/null
@@ -1,132 +0,0 @@
-[](https://travis-ci.org/franela/goblin)
-Goblin
-======
-
-
-
-A [Mocha](http://visionmedia.github.io/mocha/) like BDD testing framework for Go
-
-No extensive documentation nor complicated steps to get it running
-
-Run tests as usual with `go test`
-
-Colorful reports and beautiful syntax
-
-
-Why Goblin?
------------
-
-Inspired by the flexibility and simplicity of Node BDD and frustrated by the
-rigorousness of Go way of testing, we wanted to bring a new tool to
-write self-describing and comprehensive code.
-
-
-
-What do I get with it?
-----------------------
-
-- Preserve the exact same syntax and behaviour as Node's Mocha
-- Nest as many `Describe` and `It` blocks as you want
-- Use `Before`, `BeforeEach`, `After` and `AfterEach` for setup and teardown your tests
-- No need to remember confusing parameters in `Describe` and `It` blocks
-- Use a declarative and expressive language to write your tests
-- Plug different assertion libraries ([Gomega](https://github.com/onsi/gomega) supported so far)
-- Skip your tests the same way as you would do in Mocha
-- Automatic terminal support for colored outputs
-- Two line setup is all you need to get up running
-
-
-
-How do I use it?
-----------------
-
-Since ```go test``` is not currently extensive, you will have to hook Goblin to it. You do that by
-adding a single test method in your test file. All your goblin tests will be implemented inside this function.
-
-```go
-package foobar
-
-import (
- "testing"
- . "github.com/franela/goblin"
-)
-
-func Test(t *testing.T) {
- g := Goblin(t)
- g.Describe("Numbers", func() {
- g.It("Should add two numbers ", func() {
- g.Assert(1+1).Equal(2)
- })
- g.It("Should match equal numbers", func() {
- g.Assert(2).Equal(4)
- })
- g.It("Should substract two numbers")
- })
-}
-```
-
-Ouput will be something like:
-
-
-
-Nice and easy, right?
-
-Can I do asynchronous tests?
-----------------------------
-
-Yes! Goblin will help you to test asynchronous things, like goroutines, etc. You just need to add a ```done``` parameter to the handler function of your ```It```. This handler function should be called when your test passes.
-
-```go
- ...
- g.Describe("Numbers", func() {
- g.It("Should add two numbers asynchronously", func(done Done) {
- go func() {
- g.Assert(1+1).Equal(2)
- done()
- }()
- })
- })
- ...
-```
-
-Goblin will wait for the ```done``` call, a ```Fail``` call or any false assertion.
-
-How do I use it with Gomega?
-----------------------------
-
-Gomega is a nice assertion framework. But it doesn't provide a nice way to hook it to testing frameworks. It should just panic instead of requiring a fail function. There is an issue about that [here](https://github.com/onsi/gomega/issues/5).
-While this is being discussed and hopefully fixed, the way to use Gomega with Goblin is:
-
-```go
-package foobar
-
-import (
- "testing"
- . "github.com/franela/goblin"
- . "github.com/onsi/gomega"
-)
-
-func Test(t *testing.T) {
- g := Goblin(t)
-
- //special hook for gomega
- RegisterFailHandler(func(m string, _ ...int) { g.Fail(m) })
-
- g.Describe("lala", func() {
- g.It("lslslslsls", func() {
- Expect(1).To(Equal(10))
- })
- })
-}
-```
-
-TODO:
------
-
-We do have a couple of [issues](https://github.com/franela/goblin/issues) pending we'll be addressing soon. But feel free to
-contribute and send us PRs (with tests please :smile:).
-
-Contributions:
-------------
-
-Special thanks to [Leandro Reox](https://github.com/leandroreox) (Leitan) for the goblin logo.
diff --git a/vendor/github.com/franela/goblin/assertions.go b/vendor/github.com/franela/goblin/assertions.go
deleted file mode 100644
index c493358a3..000000000
--- a/vendor/github.com/franela/goblin/assertions.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package goblin
-
-import (
- "fmt"
- "reflect"
- "strings"
-)
-
-type Assertion struct {
- src interface{}
- fail func(interface{})
-}
-
-func objectsAreEqual(a, b interface{}) bool {
- if reflect.TypeOf(a) != reflect.TypeOf(b) {
- return false
- }
-
- if reflect.DeepEqual(a, b) {
- return true
- }
-
- if fmt.Sprintf("%#v", a) == fmt.Sprintf("%#v", b) {
- return true
- }
-
- return false
-}
-
-func formatMessages(messages ...string) string {
- if len(messages) > 0 {
- return ", " + strings.Join(messages, " ")
- }
- return ""
-}
-
-func (a *Assertion) Eql(dst interface{}) {
- a.Equal(dst)
-}
-
-func (a *Assertion) Equal(dst interface{}) {
- if !objectsAreEqual(a.src, dst) {
- a.fail(fmt.Sprintf("%v %s %v", a.src, "does not equal", dst))
- }
-}
-
-func (a *Assertion) IsTrue(messages ...string) {
- if !objectsAreEqual(a.src, true) {
- message := fmt.Sprintf("%v %s%s", a.src, "expected false to be truthy", formatMessages(messages...))
- a.fail(message)
- }
-}
-
-func (a *Assertion) IsFalse(messages ...string) {
- if !objectsAreEqual(a.src, false) {
- message := fmt.Sprintf("%v %s%s", a.src, "expected true to be falsey", formatMessages(messages...))
- a.fail(message)
- }
-}
diff --git a/vendor/github.com/franela/goblin/assertions_test.go b/vendor/github.com/franela/goblin/assertions_test.go
deleted file mode 100644
index ea2550f77..000000000
--- a/vendor/github.com/franela/goblin/assertions_test.go
+++ /dev/null
@@ -1,101 +0,0 @@
-package goblin
-
-import "testing"
-
-// So we can test asserting type against its type alias
-type String string
-
-// Helper for testing Assertion conditions
-type AssertionVerifier struct {
- ShouldPass bool
- didFail bool
- msg interface{}
-}
-
-func (a *AssertionVerifier) FailFunc(msg interface{}) {
- a.didFail = true
- a.msg = msg
-}
-
-func (a *AssertionVerifier) Verify(t *testing.T) {
- if a.didFail == a.ShouldPass {
- t.FailNow()
- }
-}
-
-func (a *AssertionVerifier) VerifyMessage(t *testing.T, message string) {
- a.Verify(t)
- if a.msg.(string) != message {
- t.Fatalf(`"%s" != "%s"`, a.msg, message)
- }
-
-}
-
-func TestEqual(t *testing.T) {
-
- verifier := AssertionVerifier{ShouldPass: true}
- a := Assertion{src: 1, fail: verifier.FailFunc}
- a.Equal(1)
- verifier.Verify(t)
- a.Eql(1)
- verifier.Verify(t)
-
- a = Assertion{src: "foo"}
- a.Equal("foo")
- verifier.Verify(t)
- a.Eql("foo")
- verifier.Verify(t)
-
- a = Assertion{src: map[string]string{"foo": "bar"}}
- a.Equal(map[string]string{"foo": "bar"})
- verifier.Verify(t)
- a.Eql(map[string]string{"foo": "bar"})
- verifier.Verify(t)
-
- verifier = AssertionVerifier{ShouldPass: false}
- a = Assertion{src: String("baz"), fail: verifier.FailFunc}
- a.Equal("baz")
- verifier.Verify(t)
- a.Eql("baz")
- verifier.Verify(t)
-}
-
-func TestIsTrue(t *testing.T) {
- verifier := AssertionVerifier{ShouldPass: true}
- a := Assertion{src: true, fail: verifier.FailFunc}
- a.IsTrue()
- verifier.Verify(t)
-
- verifier = AssertionVerifier{ShouldPass: false}
- a = Assertion{src: false, fail: verifier.FailFunc}
- a.IsTrue()
- verifier.Verify(t)
-}
-
-func TestIsFalse(t *testing.T) {
- verifier := AssertionVerifier{ShouldPass: true}
- a := Assertion{src: false, fail: verifier.FailFunc}
- a.IsFalse()
- verifier.Verify(t)
-
- verifier = AssertionVerifier{ShouldPass: false}
- a = Assertion{src: true, fail: verifier.FailFunc}
- a.IsFalse()
- verifier.Verify(t)
-}
-
-func TestIsFalseWithMessage(t *testing.T) {
- verifier := AssertionVerifier{ShouldPass: false}
- a := Assertion{src: true, fail: verifier.FailFunc}
- a.IsFalse("false is not true")
- verifier.Verify(t)
- verifier.VerifyMessage(t, "true expected true to be falsey, false is not true")
-}
-
-func TestIsTrueWithMessage(t *testing.T) {
- verifier := AssertionVerifier{ShouldPass: false}
- a := Assertion{src: false, fail: verifier.FailFunc}
- a.IsTrue("true is not false")
- verifier.Verify(t)
- verifier.VerifyMessage(t, "false expected false to be truthy, true is not false")
-}
diff --git a/vendor/github.com/franela/goblin/describe_test.go b/vendor/github.com/franela/goblin/describe_test.go
deleted file mode 100644
index b438cc581..000000000
--- a/vendor/github.com/franela/goblin/describe_test.go
+++ /dev/null
@@ -1,173 +0,0 @@
-package goblin
-
-import (
- "testing"
-)
-
-func TestBefore(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- before := 0
-
- g.Before(func() {
- before++
- })
-
- g.It("Should have called before", func() {
- g.Assert(before).Equal(1)
- })
-
- g.It("Should have called before only once", func() {
- g.Assert(before).Equal(1)
- })
- })
-
- if fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestMultipleBefore(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- before := 0
-
- g.Before(func() {
- before++
- })
-
- g.Before(func() {
- before++
- })
-
- g.It("Should have called all the registered before", func() {
- g.Assert(before).Equal(2)
- })
- })
-
- if fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestNestedBefore(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- before := 0
-
- g.Before(func() {
- before++
- })
-
- g.Describe("Addition", func() {
- g.Before(func() {
- before++
- })
-
- g.It("Should have called all the registered before", func() {
- g.Assert(before).Equal(2)
- })
-
- g.It("Should have called all the registered before only once", func() {
- g.Assert(before).Equal(2)
- })
- })
-
- })
-
- if fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestAfter(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
- after := 0
- g.Describe("Numbers", func() {
-
- g.After(func() {
- after++
- })
-
- g.It("Should call after only once", func() {
- g.Assert(after).Equal(0)
- })
-
- g.It("Should call after only once", func() {
- g.Assert(after).Equal(0)
- })
- })
-
- if fakeTest.Failed() || after != 1 {
- t.Fatal()
- }
-}
-
-func TestMultipleAfter(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- after := 0
- g.Describe("Numbers", func() {
-
- g.After(func() {
- after++
- })
-
- g.After(func() {
- after++
- })
-
- g.It("Should call all the registered after", func() {
- g.Assert(after).Equal(0)
- })
- })
-
- if fakeTest.Failed() && after != 2 {
- t.Fatal()
- }
-}
-
-func TestNestedAfter(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
- after := 0
- g.Describe("Numbers", func() {
-
- g.After(func() {
- after++
- })
-
- g.Describe("Addition", func() {
- g.After(func() {
- after++
- })
-
- g.It("Should call all the registered after", func() {
- g.Assert(after).Equal(0)
- })
-
- g.It("Should have called all the registered after only once", func() {
- g.Assert(after).Equal(0)
- })
- })
-
- })
-
- if fakeTest.Failed() || after != 2 {
- t.Fatal()
- }
-}
diff --git a/vendor/github.com/franela/goblin/goblin.go b/vendor/github.com/franela/goblin/goblin.go
deleted file mode 100644
index 891e8b0a0..000000000
--- a/vendor/github.com/franela/goblin/goblin.go
+++ /dev/null
@@ -1,280 +0,0 @@
-package goblin
-
-import (
- "flag"
- "fmt"
- "runtime"
- "testing"
- "time"
-)
-
-type Done func(error ...interface{})
-
-type Runnable interface {
- run(*G) bool
-}
-
-func (g *G) Describe(name string, h func()) {
- d := &Describe{name: name, h: h, parent: g.parent}
-
- if d.parent != nil {
- d.parent.children = append(d.parent.children, Runnable(d))
- }
-
- g.parent = d
-
- h()
-
- g.parent = d.parent
-
- if g.parent == nil {
- g.reporter.begin()
- if d.run(g) {
- g.t.Fail()
- }
- g.reporter.end()
- }
-}
-
-type Describe struct {
- name string
- h func()
- children []Runnable
- befores []func()
- afters []func()
- afterEach []func()
- beforeEach []func()
- hasTests bool
- parent *Describe
-}
-
-func (d *Describe) runBeforeEach() {
- if d.parent != nil {
- d.parent.runBeforeEach()
- }
-
- for _, b := range d.beforeEach {
- b()
- }
-}
-
-func (d *Describe) runAfterEach() {
-
- if d.parent != nil {
- d.parent.runAfterEach()
- }
-
- for _, a := range d.afterEach {
- a()
- }
-}
-
-func (d *Describe) run(g *G) bool {
- g.reporter.beginDescribe(d.name)
-
- failed := ""
-
- if d.hasTests {
- for _, b := range d.befores {
- b()
- }
- }
-
- for _, r := range d.children {
- if r.run(g) {
- failed = "true"
- }
- }
-
- if d.hasTests {
- for _, a := range d.afters {
- a()
- }
- }
-
- g.reporter.endDescribe()
-
- return failed != ""
-}
-
-type Failure struct {
- stack []string
- testName string
- message string
-}
-
-type It struct {
- h interface{}
- name string
- parent *Describe
- failure *Failure
- reporter Reporter
- isAsync bool
-}
-
-func (it *It) run(g *G) bool {
- g.currentIt = it
-
- if it.h == nil {
- g.reporter.itIsPending(it.name)
- return false
- }
- //TODO: should handle errors for beforeEach
- it.parent.runBeforeEach()
-
- runIt(g, it.h)
-
- it.parent.runAfterEach()
-
- failed := false
- if it.failure != nil {
- failed = true
- }
-
- if failed {
- g.reporter.itFailed(it.name)
- g.reporter.failure(it.failure)
- } else {
- g.reporter.itPassed(it.name)
- }
- return failed
-}
-
-func (it *It) failed(msg string, stack []string) {
- it.failure = &Failure{stack: stack, message: msg, testName: it.parent.name + " " + it.name}
-}
-
-var timeout *time.Duration
-var isTty *bool
-
-func init() {
- //Flag parsing
- timeout = flag.Duration("goblin.timeout", 5*time.Second, "Sets default timeouts for all tests")
- isTty = flag.Bool("goblin.tty", true, "Sets the default output format (color / monochrome)")
- flag.Parse()
-}
-
-func Goblin(t *testing.T, arguments ...string) *G {
- var gobtimeout = timeout
- if arguments != nil {
- //Programatic flags
- var args = flag.NewFlagSet("Goblin arguments", flag.ContinueOnError)
- gobtimeout = args.Duration("goblin.timeout", 5*time.Second, "Sets timeouts for tests")
- args.Parse(arguments)
- }
- g := &G{t: t, timeout: *gobtimeout}
- var fancy TextFancier
- if *isTty {
- fancy = &TerminalFancier{}
- } else {
- fancy = &Monochrome{}
- }
-
- g.reporter = Reporter(&DetailedReporter{fancy: fancy})
- return g
-}
-
-func runIt(g *G, h interface{}) {
- defer timeTrack(time.Now(), g)
- g.timedOut = false
- g.shouldContinue = make(chan bool)
- if call, ok := h.(func()); ok {
- // the test is synchronous
- go func() { call(); g.shouldContinue <- true }()
- } else if call, ok := h.(func(Done)); ok {
- doneCalled := 0
- go func() {
- call(func(msg ...interface{}) {
- if len(msg) > 0 {
- g.Fail(msg)
- } else {
- doneCalled++
- if doneCalled > 1 {
- g.Fail("Done called multiple times")
- }
- g.shouldContinue <- true
- }
- })
- }()
- } else {
- panic("Not implemented.")
- }
- select {
- case <-g.shouldContinue:
- case <-time.After(g.timeout):
- fmt.Println("Timedout")
- //Set to nil as it shouldn't continue
- g.shouldContinue = nil
- g.timedOut = true
- g.Fail("Test exceeded " + fmt.Sprintf("%s", g.timeout))
- }
-}
-
-type G struct {
- t *testing.T
- parent *Describe
- currentIt *It
- timeout time.Duration
- reporter Reporter
- timedOut bool
- shouldContinue chan bool
-}
-
-func (g *G) SetReporter(r Reporter) {
- g.reporter = r
-}
-
-func (g *G) It(name string, h ...interface{}) {
- it := &It{name: name, parent: g.parent, reporter: g.reporter}
- notifyParents(g.parent)
- if len(h) > 0 {
- it.h = h[0]
- }
- g.parent.children = append(g.parent.children, Runnable(it))
-}
-
-func notifyParents(d *Describe) {
- d.hasTests = true
- if d.parent != nil {
- notifyParents(d.parent)
- }
-}
-
-func (g *G) Before(h func()) {
- g.parent.befores = append(g.parent.befores, h)
-}
-
-func (g *G) BeforeEach(h func()) {
- g.parent.beforeEach = append(g.parent.beforeEach, h)
-}
-
-func (g *G) After(h func()) {
- g.parent.afters = append(g.parent.afters, h)
-}
-
-func (g *G) AfterEach(h func()) {
- g.parent.afterEach = append(g.parent.afterEach, h)
-}
-
-func (g *G) Assert(src interface{}) *Assertion {
- return &Assertion{src: src, fail: g.Fail}
-}
-
-func timeTrack(start time.Time, g *G) {
- g.reporter.itTook(time.Since(start))
-}
-
-func (g *G) Fail(error interface{}) {
- //Skips 7 stacks due to the functions between the stack and the test
- stack := ResolveStack(4)
- message := fmt.Sprintf("%v", error)
- g.currentIt.failed(message, stack)
- if g.shouldContinue != nil {
- g.shouldContinue <- true
- }
-
- if !g.timedOut {
- //Stop test function execution
- runtime.Goexit()
- }
-}
diff --git a/vendor/github.com/franela/goblin/goblin_logo.jpg b/vendor/github.com/franela/goblin/goblin_logo.jpg
deleted file mode 100644
index 44534f297..000000000
Binary files a/vendor/github.com/franela/goblin/goblin_logo.jpg and /dev/null differ
diff --git a/vendor/github.com/franela/goblin/goblin_output.png b/vendor/github.com/franela/goblin/goblin_output.png
deleted file mode 100644
index be3c9ea7a..000000000
Binary files a/vendor/github.com/franela/goblin/goblin_output.png and /dev/null differ
diff --git a/vendor/github.com/franela/goblin/goblin_test.go b/vendor/github.com/franela/goblin/goblin_test.go
deleted file mode 100644
index 46580dacf..000000000
--- a/vendor/github.com/franela/goblin/goblin_test.go
+++ /dev/null
@@ -1,269 +0,0 @@
-package goblin
-
-import (
- "testing"
- "time"
-)
-
-func TestAddNumbersSucceed(t *testing.T) {
- fakeTest := testing.T{}
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- g.It("Should add numbers", func() {
- sum := 1 + 1
- g.Assert(sum).Equal(2)
- })
- })
-
- if fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestAddNumbersFails(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- g.It("Should add numbers", func() {
- sum := 1 + 1
- g.Assert(sum).Equal(4)
- })
- })
-
- if !fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestMultipleIts(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- count := 0
- g.Describe("Numbers", func() {
- g.It("Should add numbers", func() {
- count++
- sum := 1 + 1
- g.Assert(sum).Equal(2)
- })
-
- g.It("Should add numbers", func() {
- count++
- sum := 1 + 1
- g.Assert(sum).Equal(4)
- })
- })
-
- if count != 2 {
- t.Fatal()
- }
-}
-
-func TestMultipleDescribes(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- count := 0
- g.Describe("Numbers", func() {
-
- g.Describe("Addition", func() {
- g.It("Should add numbers", func() {
- count++
- sum := 1 + 1
- g.Assert(sum).Equal(2)
- })
- })
-
- g.Describe("Substraction", func() {
- g.It("Should substract numbers ", func() {
- count++
- sub := 5 - 5
- g.Assert(sub).Equal(1)
- })
- })
- })
-
- if count != 2 {
- t.Fatal()
- }
-}
-
-func TestPending(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
-
- g.It("Should add numbers")
-
- g.Describe("Substraction", func() {
- g.It("Should substract numbers")
- })
-
- })
-
- if fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestNotRunBeforesOrAfters(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
- var count int
-
- g.Describe("Numbers", func() {
- g.Before(func() {
- count++
- })
- g.BeforeEach(func() {
- count++
- })
-
- g.After(func() {
- count++
- })
- g.AfterEach(func() {
- count++
- })
-
- g.Describe("Letters", func() {
- g.Before(func() {
- count++
- })
- g.BeforeEach(func() {
- count++
- })
-
- g.After(func() {
- count++
- })
- g.AfterEach(func() {
- count++
- })
- })
- })
-
- if count != 0 {
- t.Fatal()
- }
-}
-
-func TestFailOnError(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- g.It("Does something", func() {
- g.Fail("Something")
- })
- })
-
- g.Describe("Errors", func() {
- g.It("Should fail with structs ", func() {
- var s struct{ error string }
- s.error = "Error"
- g.Fail(s)
- })
- })
-
- if !fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestFailImmediately(t *testing.T) {
- fakeTest := testing.T{}
- g := Goblin(&fakeTest)
- reached := false
- g.Describe("Errors", func() {
- g.It("Should fail immediately for sync test ", func() {
- g.Assert(false).IsTrue()
- reached = true
- g.Assert("foo").Equal("bar")
- })
- g.It("Should fail immediately for async test ", func(done Done) {
- go func() {
- g.Assert(false).IsTrue()
- reached = true
- g.Assert("foo").Equal("bar")
- done()
- }()
- })
- })
-
- if reached {
- t.Fatal()
- }
-}
-
-func TestAsync(t *testing.T) {
- fakeTest := testing.T{}
- g := Goblin(&fakeTest)
-
- g.Describe("Async test", func() {
- g.It("Should fail when Fail is called immediately", func(done Done) {
- g.Fail("Failed")
- })
- g.It("Should fail when fail is called", func(done Done) {
- go func() {
- time.Sleep(100 * time.Millisecond)
- g.Fail("foo is not bar")
- }()
- })
-
- g.It("Should fail if done receives a parameter ", func(done Done) {
- go func() {
- time.Sleep(100 * time.Millisecond)
- done("Error")
- }()
- })
-
- g.It("Should pass when done is called", func(done Done) {
- go func() {
- time.Sleep(100 * time.Millisecond)
- done()
- }()
- })
-
- g.It("Should fail if done has been called multiple times", func(done Done) {
- go func() {
- time.Sleep(100 * time.Millisecond)
- done()
- done()
- }()
- })
- })
-
- if !fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestTimeout(t *testing.T) {
- fakeTest := testing.T{}
- g := Goblin(&fakeTest, "-goblin.timeout=10ms")
-
- g.Describe("Test", func() {
- g.It("Should fail if test exceeds the specified timeout with sync test", func() {
- time.Sleep(100 * time.Millisecond)
- })
-
- g.It("Should fail if test exceeds the specified timeout with async test", func(done Done) {
- time.Sleep(100 * time.Millisecond)
- done()
- })
- })
-
- if !fakeTest.Failed() {
- t.Fatal()
- }
-}
diff --git a/vendor/github.com/franela/goblin/it_test.go b/vendor/github.com/franela/goblin/it_test.go
deleted file mode 100644
index a8089d375..000000000
--- a/vendor/github.com/franela/goblin/it_test.go
+++ /dev/null
@@ -1,174 +0,0 @@
-package goblin
-
-import (
- "testing"
-)
-
-func TestBeforeEach(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- before := 0
-
- g.BeforeEach(func() {
- before++
- })
-
- g.It("Should have called beforeEach", func() {
- g.Assert(before).Equal(1)
- })
-
- g.It("Should have called beforeEach also for this one", func() {
- g.Assert(before).Equal(2)
- })
- })
-
- if fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestMultipleBeforeEach(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- before := 0
-
- g.BeforeEach(func() {
- before++
- })
-
- g.BeforeEach(func() {
- before++
- })
-
- g.It("Should have called all the registered beforeEach", func() {
- g.Assert(before).Equal(2)
- })
- })
-
- if fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestNestedBeforeEach(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- g.Describe("Numbers", func() {
- before := 0
-
- g.BeforeEach(func() {
- before++
- })
-
- g.Describe("Addition", func() {
- g.BeforeEach(func() {
- before++
- })
-
- g.It("Should have called all the registered beforeEach", func() {
- g.Assert(before).Equal(2)
- })
-
- g.It("Should have called all the registered beforeEach also for this one", func() {
- g.Assert(before).Equal(4)
- })
- })
-
- })
-
- if fakeTest.Failed() {
- t.Fatal()
- }
-}
-
-func TestAfterEach(t *testing.T) {
- fakeTest := testing.T{}
- after := 0
-
- g := Goblin(&fakeTest)
- g.Describe("Numbers", func() {
-
- g.AfterEach(func() {
- after++
- })
-
- g.It("Should call afterEach after this test", func() {
- g.Assert(after).Equal(0)
- })
-
- g.It("Should have called afterEach before this test ", func() {
- g.Assert(after).Equal(1)
- })
- })
-
- if fakeTest.Failed() || after != 2 {
- t.Fatal()
- }
-}
-
-func TestMultipleAfterEach(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
-
- after := 0
- g.Describe("Numbers", func() {
-
- g.AfterEach(func() {
- after++
- })
-
- g.AfterEach(func() {
- after++
- })
-
- g.It("Should call all the registered afterEach", func() {
- g.Assert(after).Equal(0)
- })
- })
-
- if fakeTest.Failed() || after != 2 {
- t.Fatal()
- }
-}
-
-func TestNestedAfterEach(t *testing.T) {
- fakeTest := testing.T{}
-
- g := Goblin(&fakeTest)
- after := 0
-
- g.Describe("Numbers", func() {
-
- g.AfterEach(func() {
- after++
- })
-
- g.Describe("Addition", func() {
- g.AfterEach(func() {
- after++
- })
-
- g.It("Should call all the registered afterEach", func() {
- g.Assert(after).Equal(0)
- })
-
- g.It("Should have called all the registered aftearEach", func() {
- g.Assert(after).Equal(2)
- })
- })
-
- })
-
- if fakeTest.Failed() || after != 4 {
- t.Fatal()
- }
-}
diff --git a/vendor/github.com/franela/goblin/mono_reporter.go b/vendor/github.com/franela/goblin/mono_reporter.go
deleted file mode 100644
index 04d6e5e3a..000000000
--- a/vendor/github.com/franela/goblin/mono_reporter.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package goblin
-
-import ()
-
-type Monochrome struct {
-}
-
-func (self *Monochrome) Red(text string) string {
- return "!" + text
-}
-
-func (self *Monochrome) Gray(text string) string {
- return text
-}
-
-func (self *Monochrome) Cyan(text string) string {
- return text
-}
-
-func (self *Monochrome) WithCheck(text string) string {
- return ">>>" + text
-}
-
-func (self *Monochrome) Green(text string) string {
- return text
-}
diff --git a/vendor/github.com/franela/goblin/reporting.go b/vendor/github.com/franela/goblin/reporting.go
deleted file mode 100644
index 1d67d662d..000000000
--- a/vendor/github.com/franela/goblin/reporting.go
+++ /dev/null
@@ -1,137 +0,0 @@
-package goblin
-
-import (
- "fmt"
- "strconv"
- "strings"
- "time"
-)
-
-type Reporter interface {
- beginDescribe(string)
- endDescribe()
- begin()
- end()
- failure(*Failure)
- itTook(time.Duration)
- itFailed(string)
- itPassed(string)
- itIsPending(string)
-}
-
-type TextFancier interface {
- Red(text string) string
- Gray(text string) string
- Cyan(text string) string
- Green(text string) string
- WithCheck(text string) string
-}
-
-type DetailedReporter struct {
- level, failed, passed, pending int
- failures []*Failure
- executionTime, totalExecutionTime time.Duration
- fancy TextFancier
-}
-
-func (r *DetailedReporter) SetTextFancier(f TextFancier) {
- r.fancy = f
-}
-
-type TerminalFancier struct {
-}
-
-func (self *TerminalFancier) Red(text string) string {
- return "\033[31m" + text + "\033[0m"
-}
-
-func (self *TerminalFancier) Gray(text string) string {
- return "\033[90m" + text + "\033[0m"
-}
-
-func (self *TerminalFancier) Cyan(text string) string {
- return "\033[36m" + text + "\033[0m"
-}
-
-func (self *TerminalFancier) Green(text string) string {
- return "\033[32m" + text + "\033[0m"
-}
-
-func (self *TerminalFancier) WithCheck(text string) string {
- return "\033[32m\u2713\033[0m " + text
-}
-
-func (r *DetailedReporter) getSpace() string {
- return strings.Repeat(" ", (r.level+1)*2)
-}
-
-func (r *DetailedReporter) failure(failure *Failure) {
- r.failures = append(r.failures, failure)
-}
-
-func (r *DetailedReporter) print(text string) {
- fmt.Printf("%v%v\n", r.getSpace(), text)
-}
-
-func (r *DetailedReporter) printWithCheck(text string) {
- fmt.Printf("%v%v\n", r.getSpace(), r.fancy.WithCheck(text))
-}
-
-func (r *DetailedReporter) beginDescribe(name string) {
- fmt.Println("")
- r.print(name)
- r.level++
-}
-
-func (r *DetailedReporter) endDescribe() {
- r.level--
-}
-
-func (r *DetailedReporter) itTook(duration time.Duration) {
- r.executionTime = duration
- r.totalExecutionTime += duration
-}
-
-func (r *DetailedReporter) itFailed(name string) {
- r.failed++
- r.print(r.fancy.Red(strconv.Itoa(r.failed) + ") " + name))
-}
-
-func (r *DetailedReporter) itPassed(name string) {
- r.passed++
- r.printWithCheck(r.fancy.Gray(name))
-}
-
-func (r *DetailedReporter) itIsPending(name string) {
- r.pending++
- r.print(r.fancy.Cyan("- " + name))
-}
-
-func (r *DetailedReporter) begin() {
-}
-
-func (r *DetailedReporter) end() {
- comp := fmt.Sprintf("%d tests complete", r.passed)
- t := fmt.Sprintf("(%d ms)", r.totalExecutionTime/time.Millisecond)
-
- //fmt.Printf("\n\n \033[32m%d tests complete\033[0m \033[90m(%d ms)\033[0m\n", r.passed, r.totalExecutionTime/time.Millisecond)
- fmt.Printf("\n\n %v %v\n", r.fancy.Green(comp), r.fancy.Gray(t))
-
- if r.pending > 0 {
- pend := fmt.Sprintf("%d test(s) pending", r.pending)
- fmt.Printf(" %v\n\n", r.fancy.Cyan(pend))
- }
-
- if len(r.failures) > 0 {
- fmt.Printf("%s \n\n", r.fancy.Red(fmt.Sprintf(" %d tests failed:", len(r.failures))))
-
- }
-
- for i, failure := range r.failures {
- fmt.Printf(" %d) %s:\n\n", i+1, failure.testName)
- fmt.Printf(" %s\n", r.fancy.Red(failure.message))
- for _, stackItem := range failure.stack {
- fmt.Printf(" %s\n", r.fancy.Gray(stackItem))
- }
- }
-}
diff --git a/vendor/github.com/franela/goblin/reporting_test.go b/vendor/github.com/franela/goblin/reporting_test.go
deleted file mode 100644
index 24393a1c4..000000000
--- a/vendor/github.com/franela/goblin/reporting_test.go
+++ /dev/null
@@ -1,163 +0,0 @@
-package goblin
-
-import (
- "reflect"
- "testing"
- "time"
-)
-
-type FakeReporter struct {
- describes []string
- fails []string
- passes []string
- pending []string
- ends int
- failures int
- executionTime time.Duration
- totalExecutionTime time.Duration
- beginFlag, endFlag bool
-}
-
-func (r *FakeReporter) beginDescribe(name string) {
- r.describes = append(r.describes, name)
-}
-
-func (r *FakeReporter) endDescribe() {
- r.ends++
-}
-
-func (r *FakeReporter) failure(failure *Failure) {
- r.failures++
-}
-
-func (r *FakeReporter) itFailed(name string) {
- r.fails = append(r.fails, name)
-}
-
-func (r *FakeReporter) itPassed(name string) {
- r.passes = append(r.passes, name)
-}
-
-func (r *FakeReporter) itIsPending(name string) {
- r.pending = append(r.pending, name)
-}
-
-func (r *FakeReporter) itTook(duration time.Duration) {
- r.executionTime = duration
- r.totalExecutionTime += duration
-}
-
-func (r *FakeReporter) begin() {
- r.beginFlag = true
-}
-
-func (r *FakeReporter) end() {
- r.endFlag = true
-}
-
-func TestReporting(t *testing.T) {
- fakeTest := &testing.T{}
- reporter := FakeReporter{}
- fakeReporter := Reporter(&reporter)
-
- g := Goblin(fakeTest)
- g.SetReporter(fakeReporter)
-
- g.Describe("One", func() {
- g.It("Foo", func() {
- g.Assert(0).Equal(1)
- })
- g.Describe("Two", func() {
- g.It("Bar", func() {
- g.Assert(0).Equal(0)
- })
- })
- })
-
- if !reflect.DeepEqual(reporter.describes, []string{"One", "Two"}) {
- t.FailNow()
- }
- if !reflect.DeepEqual(reporter.fails, []string{"Foo"}) {
- t.FailNow()
- }
- if !reflect.DeepEqual(reporter.passes, []string{"Bar"}) {
- t.FailNow()
- }
- if reporter.ends != 2 {
- t.FailNow()
- }
-
- if !reporter.beginFlag || !reporter.endFlag {
- t.FailNow()
- }
-}
-
-func TestReportingTime(t *testing.T) {
- fakeTest := &testing.T{}
- reporter := FakeReporter{}
- fakeReporter := Reporter(&reporter)
-
- g := Goblin(fakeTest)
- g.SetReporter(fakeReporter)
-
- g.Describe("One", func() {
- g.AfterEach(func() {
- //TODO: Make this an assertion
- if int64(reporter.executionTime/time.Millisecond) < 5 || int64(reporter.executionTime/time.Millisecond) >= 6 {
- t.FailNow()
- }
- })
- g.It("Foo", func() {
- time.Sleep(5 * time.Millisecond)
- })
- g.Describe("Two", func() {
- g.It("Bar", func() {
- time.Sleep(5 * time.Millisecond)
- })
- })
- })
-
- if int64(reporter.totalExecutionTime/time.Millisecond) < 10 {
- t.FailNow()
- }
-}
-
-func TestReportingPending(t *testing.T) {
- fakeTest := &testing.T{}
- reporter := FakeReporter{}
- fakeReporter := Reporter(&reporter)
-
- g := Goblin(fakeTest)
- g.SetReporter(fakeReporter)
-
- g.Describe("One", func() {
- g.It("One")
- g.Describe("Two", func() {
- g.It("Two")
- })
- })
-
- if !reflect.DeepEqual(reporter.pending, []string{"One", "Two"}) {
- t.FailNow()
- }
-}
-
-func TestReportingErrors(t *testing.T) {
- fakeTest := &testing.T{}
- reporter := FakeReporter{}
- fakeReporter := Reporter(&reporter)
-
- g := Goblin(fakeTest)
- g.SetReporter(fakeReporter)
-
- g.Describe("Numbers", func() {
- g.It("Should make reporting add two errors ", func() {
- g.Assert(0).Equal(1)
- g.Assert(0).Equal(1)
- })
- })
-
- if reporter.failures != 1 {
- t.FailNow()
- }
-}
diff --git a/vendor/github.com/franela/goblin/resolver.go b/vendor/github.com/franela/goblin/resolver.go
deleted file mode 100644
index 125fcec9c..000000000
--- a/vendor/github.com/franela/goblin/resolver.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package goblin
-
-import (
- "runtime/debug"
- "strings"
-)
-
-func ResolveStack(skip int) []string {
- return cleanStack(debug.Stack(), skip)
-}
-
-func cleanStack(stack []byte, skip int) []string {
- arrayStack := strings.Split(string(stack), "\n")
- var finalStack []string
- for i := skip; i < len(arrayStack); i++ {
- if strings.Contains(arrayStack[i], ".go") {
- finalStack = append(finalStack, arrayStack[i])
- }
- }
- return finalStack
-}
diff --git a/vendor/github.com/franela/goblin/resolver_test.go b/vendor/github.com/franela/goblin/resolver_test.go
deleted file mode 100644
index 76f6ec17a..000000000
--- a/vendor/github.com/franela/goblin/resolver_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package goblin
-
-import (
- "testing"
-)
-
-func TestResolver(t *testing.T) {
- g := Goblin(t)
-
- g.Describe("Resolver", func() {
- g.It("Should resolve the stack until the test", func() {
- dummyFunc(g)
- })
- })
-}
-
-func dummyFunc(g *G) {
- stack := ResolveStack(1)
- g.Assert(len(stack)).Equal(3)
-}
diff --git a/vendor/github.com/getsentry/raven-go/Dockerfile.test b/vendor/github.com/getsentry/raven-go/Dockerfile.test
new file mode 100644
index 000000000..e0aa037b1
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/Dockerfile.test
@@ -0,0 +1,11 @@
+FROM golang:1.4
+
+RUN mkdir -p /go/src/github.com/getsentry/raven-go
+WORKDIR /go/src/github.com/getsentry/raven-go
+ENV GOPATH /go
+
+RUN go install -race std && go get golang.org/x/tools/cmd/cover
+
+COPY . /go/src/github.com/getsentry/raven-go
+
+CMD ["./runtests.sh"]
diff --git a/vendor/github.com/namsral/flag/LICENSE b/vendor/github.com/getsentry/raven-go/LICENSE
similarity index 87%
rename from vendor/github.com/namsral/flag/LICENSE
rename to vendor/github.com/getsentry/raven-go/LICENSE
index 0f2498b19..b0301b57e 100644
--- a/vendor/github.com/namsral/flag/LICENSE
+++ b/vendor/github.com/getsentry/raven-go/LICENSE
@@ -1,4 +1,5 @@
-Copyright (c) 2012 The Go Authors. All rights reserved.
+Copyright (c) 2013 Apollic Software, LLC. All rights reserved.
+Copyright (c) 2015 Functional Software, Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -10,7 +11,7 @@ notice, this list of conditions and the following disclaimer.
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
- * Neither the name of Google Inc. nor the names of its
+ * Neither the name of Apollic Software, LLC nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
@@ -24,4 +25,4 @@ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/getsentry/raven-go/README.md b/vendor/github.com/getsentry/raven-go/README.md
new file mode 100644
index 000000000..a5373ce87
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/README.md
@@ -0,0 +1,12 @@
+# raven [](https://travis-ci.org/getsentry/raven-go)
+
+raven is a Go client for the [Sentry](https://github.com/getsentry/sentry)
+event/error logging system.
+
+[**Documentation**](http://godoc.org/github.com/getsentry/raven-go).
+
+## Installation
+
+```text
+go get github.com/getsentry/raven-go
+```
diff --git a/vendor/github.com/getsentry/raven-go/client.go b/vendor/github.com/getsentry/raven-go/client.go
new file mode 100644
index 000000000..f514c7456
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/client.go
@@ -0,0 +1,683 @@
+// Package raven implements a client for the Sentry error logging service.
+package raven
+
+import (
+ "bytes"
+ "compress/zlib"
+ "crypto/rand"
+ "encoding/base64"
+ "encoding/hex"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net/http"
+ "net/url"
+ "os"
+ "runtime"
+ "strings"
+ "sync"
+ "time"
+)
+
+const (
+ userAgent = "raven-go/1.0"
+ timestampFormat = `"2006-01-02T15:04:05"`
+)
+
+var (
+ ErrPacketDropped = errors.New("raven: packet dropped")
+ ErrUnableToUnmarshalJSON = errors.New("raven: unable to unmarshal JSON")
+ ErrMissingUser = errors.New("raven: dsn missing public key and/or password")
+ ErrMissingPrivateKey = errors.New("raven: dsn missing private key")
+ ErrMissingProjectID = errors.New("raven: dsn missing project id")
+)
+
+type Severity string
+
+// http://docs.python.org/2/howto/logging.html#logging-levels
+const (
+ DEBUG = Severity("debug")
+ INFO = Severity("info")
+ WARNING = Severity("warning")
+ ERROR = Severity("error")
+ FATAL = Severity("fatal")
+)
+
+type Timestamp time.Time
+
+func (t Timestamp) MarshalJSON() ([]byte, error) {
+ return []byte(time.Time(t).UTC().Format(timestampFormat)), nil
+}
+
+func (timestamp *Timestamp) UnmarshalJSON(data []byte) error {
+ t, err := time.Parse(timestampFormat, string(data))
+ if err != nil {
+ return err
+ }
+
+ *timestamp = Timestamp(t)
+ return nil
+}
+
+// An Interface is a Sentry interface that will be serialized as JSON.
+// It must implement json.Marshaler or use json struct tags.
+type Interface interface {
+ // The Sentry class name. Example: sentry.interfaces.Stacktrace
+ Class() string
+}
+
+type Culpriter interface {
+ Culprit() string
+}
+
+type Transport interface {
+ Send(url, authHeader string, packet *Packet) error
+}
+
+type outgoingPacket struct {
+ packet *Packet
+ ch chan error
+}
+
+type Tag struct {
+ Key string
+ Value string
+}
+
+type Tags []Tag
+
+func (tag *Tag) MarshalJSON() ([]byte, error) {
+ return json.Marshal([2]string{tag.Key, tag.Value})
+}
+
+func (t *Tag) UnmarshalJSON(data []byte) error {
+ var tag [2]string
+ if err := json.Unmarshal(data, &tag); err != nil {
+ return err
+ }
+ *t = Tag{tag[0], tag[1]}
+ return nil
+}
+
+func (t *Tags) UnmarshalJSON(data []byte) error {
+ var tags []Tag
+
+ switch data[0] {
+ case '[':
+ // Unmarshal into []Tag
+ if err := json.Unmarshal(data, &tags); err != nil {
+ return err
+ }
+ case '{':
+ // Unmarshal into map[string]string
+ tagMap := make(map[string]string)
+ if err := json.Unmarshal(data, &tagMap); err != nil {
+ return err
+ }
+
+ // Convert to []Tag
+ for k, v := range tagMap {
+ tags = append(tags, Tag{k, v})
+ }
+ default:
+ return ErrUnableToUnmarshalJSON
+ }
+
+ *t = tags
+ return nil
+}
+
+// http://sentry.readthedocs.org/en/latest/developer/client/index.html#building-the-json-packet
+type Packet struct {
+ // Required
+ Message string `json:"message"`
+
+ // Required, set automatically by Client.Send/Report via Packet.Init if blank
+ EventID string `json:"event_id"`
+ Project string `json:"project"`
+ Timestamp Timestamp `json:"timestamp"`
+ Level Severity `json:"level"`
+ Logger string `json:"logger"`
+
+ // Optional
+ Platform string `json:"platform,omitempty"`
+ Culprit string `json:"culprit,omitempty"`
+ ServerName string `json:"server_name,omitempty"`
+ Release string `json:"release,omitempty"`
+ Tags Tags `json:"tags,omitempty"`
+ Modules []map[string]string `json:"modules,omitempty"`
+ Extra map[string]interface{} `json:"extra,omitempty"`
+
+ Interfaces []Interface `json:"-"`
+}
+
+// NewPacket constructs a packet with the specified message and interfaces.
+func NewPacket(message string, interfaces ...Interface) *Packet {
+ extra := map[string]interface{}{
+ "runtime.Version": runtime.Version(),
+ "runtime.NumCPU": runtime.NumCPU(),
+ "runtime.GOMAXPROCS": runtime.GOMAXPROCS(0), // 0 just returns the current value
+ "runtime.NumGoroutine": runtime.NumGoroutine(),
+ }
+ return &Packet{
+ Message: message,
+ Interfaces: interfaces,
+ Extra: extra,
+ }
+}
+
+// Init initializes required fields in a packet. It is typically called by
+// Client.Send/Report automatically.
+func (packet *Packet) Init(project string) error {
+ if packet.Project == "" {
+ packet.Project = project
+ }
+ if packet.EventID == "" {
+ var err error
+ packet.EventID, err = uuid()
+ if err != nil {
+ return err
+ }
+ }
+ if time.Time(packet.Timestamp).IsZero() {
+ packet.Timestamp = Timestamp(time.Now())
+ }
+ if packet.Level == "" {
+ packet.Level = ERROR
+ }
+ if packet.Logger == "" {
+ packet.Logger = "root"
+ }
+ if packet.ServerName == "" {
+ packet.ServerName = hostname
+ }
+ if packet.Platform == "" {
+ packet.Platform = "go"
+ }
+
+ if packet.Culprit == "" {
+ for _, inter := range packet.Interfaces {
+ if c, ok := inter.(Culpriter); ok {
+ packet.Culprit = c.Culprit()
+ if packet.Culprit != "" {
+ break
+ }
+ }
+ }
+ }
+
+ return nil
+}
+
+func (packet *Packet) AddTags(tags map[string]string) {
+ for k, v := range tags {
+ packet.Tags = append(packet.Tags, Tag{k, v})
+ }
+}
+
+func uuid() (string, error) {
+ id := make([]byte, 16)
+ _, err := io.ReadFull(rand.Reader, id)
+ if err != nil {
+ return "", err
+ }
+ id[6] &= 0x0F // clear version
+ id[6] |= 0x40 // set version to 4 (random uuid)
+ id[8] &= 0x3F // clear variant
+ id[8] |= 0x80 // set to IETF variant
+ return hex.EncodeToString(id), nil
+}
+
+func (packet *Packet) JSON() []byte {
+ packetJSON, _ := json.Marshal(packet)
+
+ interfaces := make(map[string]Interface, len(packet.Interfaces))
+ for _, inter := range packet.Interfaces {
+ interfaces[inter.Class()] = inter
+ }
+
+ if len(interfaces) > 0 {
+ interfaceJSON, _ := json.Marshal(interfaces)
+ packetJSON[len(packetJSON)-1] = ','
+ packetJSON = append(packetJSON, interfaceJSON[1:]...)
+ }
+
+ return packetJSON
+}
+
+type context struct {
+ user *User
+ http *Http
+ tags map[string]string
+}
+
+func (c *context) SetUser(u *User) { c.user = u }
+func (c *context) SetHttp(h *Http) { c.http = h }
+func (c *context) SetTags(t map[string]string) {
+ if c.tags == nil {
+ c.tags = make(map[string]string)
+ }
+ for k, v := range t {
+ c.tags[k] = v
+ }
+}
+func (c *context) Clear() {
+ c.user = nil
+ c.http = nil
+ c.tags = nil
+}
+
+// Return a list of interfaces to be used in appending with the rest
+func (c *context) interfaces() []Interface {
+ len, i := 0, 0
+ if c.user != nil {
+ len++
+ }
+ if c.http != nil {
+ len++
+ }
+ interfaces := make([]Interface, len)
+ if c.user != nil {
+ interfaces[i] = c.user
+ i++
+ }
+ if c.http != nil {
+ interfaces[i] = c.http
+ i++
+ }
+ return interfaces
+}
+
+// The maximum number of packets that will be buffered waiting to be delivered.
+// Packets will be dropped if the buffer is full. Used by NewClient.
+var MaxQueueBuffer = 100
+
+func newClient(tags map[string]string) *Client {
+ client := &Client{
+ Transport: &HTTPTransport{},
+ Tags: tags,
+ context: &context{},
+ queue: make(chan *outgoingPacket, MaxQueueBuffer),
+ }
+ go client.worker()
+ client.SetDSN(os.Getenv("SENTRY_DSN"))
+ return client
+}
+
+// New constructs a new Sentry client instance
+func New(dsn string) (*Client, error) {
+ client := newClient(nil)
+ return client, client.SetDSN(dsn)
+}
+
+// NewWithTags constructs a new Sentry client instance with default tags.
+func NewWithTags(dsn string, tags map[string]string) (*Client, error) {
+ client := newClient(tags)
+ return client, client.SetDSN(dsn)
+}
+
+// NewClient constructs a Sentry client and spawns a background goroutine to
+// handle packets sent by Client.Report.
+//
+// Deprecated: use New and NewWithTags instead
+func NewClient(dsn string, tags map[string]string) (*Client, error) {
+ client := newClient(tags)
+ return client, client.SetDSN(dsn)
+}
+
+// Client encapsulates a connection to a Sentry server. It must be initialized
+// by calling NewClient. Modification of fields concurrently with Send or after
+// calling Report for the first time is not thread-safe.
+type Client struct {
+ Tags map[string]string
+
+ Transport Transport
+
+ // DropHandler is called when a packet is dropped because the buffer is full.
+ DropHandler func(*Packet)
+
+ // Context that will get appending to all packets
+ context *context
+
+ mu sync.RWMutex
+ url string
+ projectID string
+ authHeader string
+ release string
+ queue chan *outgoingPacket
+
+ // A WaitGroup to keep track of all currently in-progress captures
+ // This is intended to be used with Client.Wait() to assure that
+ // all messages have been transported before exiting the process.
+ wg sync.WaitGroup
+}
+
+// Initialize a default *Client instance
+var DefaultClient = newClient(nil)
+
+// SetDSN updates a client with a new DSN. It safe to call after and
+// concurrently with calls to Report and Send.
+func (client *Client) SetDSN(dsn string) error {
+ if dsn == "" {
+ return nil
+ }
+
+ client.mu.Lock()
+ defer client.mu.Unlock()
+
+ uri, err := url.Parse(dsn)
+ if err != nil {
+ return err
+ }
+
+ if uri.User == nil {
+ return ErrMissingUser
+ }
+ publicKey := uri.User.Username()
+ secretKey, ok := uri.User.Password()
+ if !ok {
+ return ErrMissingPrivateKey
+ }
+ uri.User = nil
+
+ if idx := strings.LastIndex(uri.Path, "/"); idx != -1 {
+ client.projectID = uri.Path[idx+1:]
+ uri.Path = uri.Path[:idx+1] + "api/" + client.projectID + "/store/"
+ }
+ if client.projectID == "" {
+ return ErrMissingProjectID
+ }
+
+ client.url = uri.String()
+
+ client.authHeader = fmt.Sprintf("Sentry sentry_version=4, sentry_key=%s, sentry_secret=%s", publicKey, secretKey)
+
+ return nil
+}
+
+// Sets the DSN for the default *Client instance
+func SetDSN(dsn string) error { return DefaultClient.SetDSN(dsn) }
+
+// SetRelease sets the "release" tag.
+func (client *Client) SetRelease(release string) {
+ client.mu.Lock()
+ defer client.mu.Unlock()
+ client.release = release
+}
+
+// SetRelease sets the "release" tag on the default *Client
+func SetRelease(release string) { DefaultClient.SetRelease(release) }
+
+func (client *Client) worker() {
+ for outgoingPacket := range client.queue {
+
+ client.mu.RLock()
+ url, authHeader := client.url, client.authHeader
+ client.mu.RUnlock()
+
+ outgoingPacket.ch <- client.Transport.Send(url, authHeader, outgoingPacket.packet)
+ client.wg.Done()
+ }
+}
+
+// Capture asynchronously delivers a packet to the Sentry server. It is a no-op
+// when client is nil. A channel is provided if it is important to check for a
+// send's success.
+func (client *Client) Capture(packet *Packet, captureTags map[string]string) (eventID string, ch chan error) {
+ if client == nil {
+ return
+ }
+
+ // Keep track of all running Captures so that we can wait for them all to finish
+ // *Must* call client.wg.Done() on any path that indicates that an event was
+ // finished being acted upon, whether success or failure
+ client.wg.Add(1)
+
+ ch = make(chan error, 1)
+
+ // Merge capture tags and client tags
+ packet.AddTags(captureTags)
+ packet.AddTags(client.Tags)
+ packet.AddTags(client.context.tags)
+
+ // Initialize any required packet fields
+ client.mu.RLock()
+ projectID := client.projectID
+ release := client.release
+ client.mu.RUnlock()
+
+ err := packet.Init(projectID)
+ if err != nil {
+ ch <- err
+ client.wg.Done()
+ return
+ }
+ packet.Release = release
+
+ outgoingPacket := &outgoingPacket{packet, ch}
+
+ select {
+ case client.queue <- outgoingPacket:
+ default:
+ // Send would block, drop the packet
+ if client.DropHandler != nil {
+ client.DropHandler(packet)
+ }
+ ch <- ErrPacketDropped
+ client.wg.Done()
+ }
+
+ return packet.EventID, ch
+}
+
+// Capture asynchronously delivers a packet to the Sentry server with the default *Client.
+// It is a no-op when client is nil. A channel is provided if it is important to check for a
+// send's success.
+func Capture(packet *Packet, captureTags map[string]string) (eventID string, ch chan error) {
+ return DefaultClient.Capture(packet, captureTags)
+}
+
+// CaptureMessage formats and delivers a string message to the Sentry server.
+func (client *Client) CaptureMessage(message string, tags map[string]string, interfaces ...Interface) string {
+ if client == nil {
+ return ""
+ }
+
+ packet := NewPacket(message, append(append(interfaces, client.context.interfaces()...), &Message{message, nil})...)
+ eventID, _ := client.Capture(packet, tags)
+
+ return eventID
+}
+
+// CaptureMessage formats and delivers a string message to the Sentry server with the default *Client
+func CaptureMessage(message string, tags map[string]string, interfaces ...Interface) string {
+ return DefaultClient.CaptureMessage(message, tags, interfaces...)
+}
+
+// CaptureMessageAndWait is identical to CaptureMessage except it blocks and waits for the message to be sent.
+func (client *Client) CaptureMessageAndWait(message string, tags map[string]string, interfaces ...Interface) string {
+ if client == nil {
+ return ""
+ }
+
+ packet := NewPacket(message, append(append(interfaces, client.context.interfaces()...), &Message{message, nil})...)
+ eventID, ch := client.Capture(packet, tags)
+ <-ch
+
+ return eventID
+}
+
+// CaptureMessageAndWait is identical to CaptureMessage except it blocks and waits for the message to be sent.
+func CaptureMessageAndWait(message string, tags map[string]string, interfaces ...Interface) string {
+ return DefaultClient.CaptureMessageAndWait(message, tags, interfaces...)
+}
+
+// CaptureErrors formats and delivers an error to the Sentry server.
+// Adds a stacktrace to the packet, excluding the call to this method.
+func (client *Client) CaptureError(err error, tags map[string]string, interfaces ...Interface) string {
+ if client == nil {
+ return ""
+ }
+
+ packet := NewPacket(err.Error(), append(append(interfaces, client.context.interfaces()...), NewException(err, NewStacktrace(1, 3, nil)))...)
+ eventID, _ := client.Capture(packet, tags)
+
+ return eventID
+}
+
+// CaptureErrors formats and delivers an error to the Sentry server using the default *Client.
+// Adds a stacktrace to the packet, excluding the call to this method.
+func CaptureError(err error, tags map[string]string, interfaces ...Interface) string {
+ return DefaultClient.CaptureError(err, tags, interfaces...)
+}
+
+// CaptureErrorAndWait is identical to CaptureError, except it blocks and assures that the event was sent
+func (client *Client) CaptureErrorAndWait(err error, tags map[string]string, interfaces ...Interface) string {
+ if client == nil {
+ return ""
+ }
+
+ packet := NewPacket(err.Error(), append(append(interfaces, client.context.interfaces()...), NewException(err, NewStacktrace(1, 3, nil)))...)
+ eventID, ch := client.Capture(packet, tags)
+ <-ch
+
+ return eventID
+}
+
+// CaptureErrorAndWait is identical to CaptureError, except it blocks and assures that the event was sent
+func CaptureErrorAndWait(err error, tags map[string]string, interfaces ...Interface) string {
+ return DefaultClient.CaptureErrorAndWait(err, tags, interfaces...)
+}
+
+// CapturePanic calls f and then recovers and reports a panic to the Sentry server if it occurs.
+func (client *Client) CapturePanic(f func(), tags map[string]string, interfaces ...Interface) {
+ // Note: This doesn't need to check for client, because we still want to go through the defer/recover path
+ // Down the line, Capture will be noop'd, so while this does a _tiny_ bit of overhead constructing the
+ // *Packet just to be thrown away, this should not be the normal case. Could be refactored to
+ // be completely noop though if we cared.
+ defer func() {
+ var packet *Packet
+ switch rval := recover().(type) {
+ case nil:
+ return
+ case error:
+ packet = NewPacket(rval.Error(), append(append(interfaces, client.context.interfaces()...), NewException(rval, NewStacktrace(2, 3, nil)))...)
+ default:
+ rvalStr := fmt.Sprint(rval)
+ packet = NewPacket(rvalStr, append(append(interfaces, client.context.interfaces()...), NewException(errors.New(rvalStr), NewStacktrace(2, 3, nil)))...)
+ }
+
+ client.Capture(packet, tags)
+ }()
+
+ f()
+}
+
+// CapturePanic calls f and then recovers and reports a panic to the Sentry server if it occurs.
+func CapturePanic(f func(), tags map[string]string, interfaces ...Interface) {
+ DefaultClient.CapturePanic(f, tags, interfaces...)
+}
+
+func (client *Client) Close() {
+ close(client.queue)
+}
+
+func Close() { DefaultClient.Close() }
+
+// Wait blocks and waits for all events to finish being sent to Sentry server
+func (client *Client) Wait() {
+ client.wg.Wait()
+}
+
+// Wait blocks and waits for all events to finish being sent to Sentry server
+func Wait() { DefaultClient.Wait() }
+
+func (client *Client) URL() string {
+ client.mu.RLock()
+ defer client.mu.RUnlock()
+
+ return client.url
+}
+
+func URL() string { return DefaultClient.URL() }
+
+func (client *Client) ProjectID() string {
+ client.mu.RLock()
+ defer client.mu.RUnlock()
+
+ return client.projectID
+}
+
+func ProjectID() string { return DefaultClient.ProjectID() }
+
+func (client *Client) Release() string {
+ client.mu.RLock()
+ defer client.mu.RUnlock()
+
+ return client.release
+}
+
+func Release() string { return DefaultClient.Release() }
+
+func (c *Client) SetUserContext(u *User) { c.context.SetUser(u) }
+func (c *Client) SetHttpContext(h *Http) { c.context.SetHttp(h) }
+func (c *Client) SetTagsContext(t map[string]string) { c.context.SetTags(t) }
+func (c *Client) ClearContext() { c.context.Clear() }
+
+func SetUserContext(u *User) { DefaultClient.SetUserContext(u) }
+func SetHttpContext(h *Http) { DefaultClient.SetHttpContext(h) }
+func SetTagsContext(t map[string]string) { DefaultClient.SetTagsContext(t) }
+func ClearContext() { DefaultClient.ClearContext() }
+
+// HTTPTransport is the default transport, delivering packets to Sentry via the
+// HTTP API.
+type HTTPTransport struct {
+ Http http.Client
+}
+
+func (t *HTTPTransport) Send(url, authHeader string, packet *Packet) error {
+ if url == "" {
+ return nil
+ }
+
+ body, contentType := serializedPacket(packet)
+ req, _ := http.NewRequest("POST", url, body)
+ req.Header.Set("X-Sentry-Auth", authHeader)
+ req.Header.Set("User-Agent", userAgent)
+ req.Header.Set("Content-Type", contentType)
+ res, err := t.Http.Do(req)
+ if err != nil {
+ return err
+ }
+ io.Copy(ioutil.Discard, res.Body)
+ res.Body.Close()
+ if res.StatusCode != 200 {
+ return fmt.Errorf("raven: got http status %d", res.StatusCode)
+ }
+ return nil
+}
+
+func serializedPacket(packet *Packet) (r io.Reader, contentType string) {
+ packetJSON := packet.JSON()
+
+ // Only deflate/base64 the packet if it is bigger than 1KB, as there is
+ // overhead.
+ if len(packetJSON) > 1000 {
+ buf := &bytes.Buffer{}
+ b64 := base64.NewEncoder(base64.StdEncoding, buf)
+ deflate, _ := zlib.NewWriterLevel(b64, zlib.BestCompression)
+ deflate.Write(packetJSON)
+ deflate.Close()
+ b64.Close()
+ return buf, "application/octet-stream"
+ }
+ return bytes.NewReader(packetJSON), "application/json"
+}
+
+var hostname string
+
+func init() {
+ hostname, _ = os.Hostname()
+}
diff --git a/vendor/github.com/getsentry/raven-go/client_test.go b/vendor/github.com/getsentry/raven-go/client_test.go
new file mode 100644
index 000000000..632c8d4a0
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/client_test.go
@@ -0,0 +1,150 @@
+package raven
+
+import (
+ "encoding/json"
+ "reflect"
+ "testing"
+ "time"
+)
+
+type testInterface struct{}
+
+func (t *testInterface) Class() string { return "sentry.interfaces.Test" }
+func (t *testInterface) Culprit() string { return "codez" }
+
+func TestPacketJSON(t *testing.T) {
+ packet := &Packet{
+ Project: "1",
+ EventID: "2",
+ Platform: "linux",
+ Culprit: "caused_by",
+ ServerName: "host1",
+ Release: "721e41770371db95eee98ca2707686226b993eda",
+ Message: "test",
+ Timestamp: Timestamp(time.Date(2000, 01, 01, 0, 0, 0, 0, time.UTC)),
+ Level: ERROR,
+ Logger: "com.getsentry.raven-go.logger-test-packet-json",
+ Tags: []Tag{Tag{"foo", "bar"}},
+ Interfaces: []Interface{&Message{Message: "foo"}},
+ }
+
+ packet.AddTags(map[string]string{"foo": "foo"})
+ packet.AddTags(map[string]string{"baz": "buzz"})
+
+ expected := `{"message":"test","event_id":"2","project":"1","timestamp":"2000-01-01T00:00:00","level":"error","logger":"com.getsentry.raven-go.logger-test-packet-json","platform":"linux","culprit":"caused_by","server_name":"host1","release":"721e41770371db95eee98ca2707686226b993eda","tags":[["foo","bar"],["foo","foo"],["baz","buzz"]],"logentry":{"message":"foo"}}`
+ actual := string(packet.JSON())
+
+ if actual != expected {
+ t.Errorf("incorrect json; got %s, want %s", actual, expected)
+ }
+}
+
+func TestPacketInit(t *testing.T) {
+ packet := &Packet{Message: "a", Interfaces: []Interface{&testInterface{}}}
+ packet.Init("foo")
+
+ if packet.Project != "foo" {
+ t.Error("incorrect Project:", packet.Project)
+ }
+ if packet.Culprit != "codez" {
+ t.Error("incorrect Culprit:", packet.Culprit)
+ }
+ if packet.ServerName == "" {
+ t.Errorf("ServerName should not be empty")
+ }
+ if packet.Level != ERROR {
+ t.Errorf("incorrect Level: got %d, want %d", packet.Level, ERROR)
+ }
+ if packet.Logger != "root" {
+ t.Errorf("incorrect Logger: got %s, want %s", packet.Logger, "root")
+ }
+ if time.Time(packet.Timestamp).IsZero() {
+ t.Error("Timestamp is zero")
+ }
+ if len(packet.EventID) != 32 {
+ t.Error("incorrect EventID:", packet.EventID)
+ }
+}
+
+func TestSetDSN(t *testing.T) {
+ client := &Client{}
+ client.SetDSN("https://u:p@example.com/sentry/1")
+
+ if client.url != "https://example.com/sentry/api/1/store/" {
+ t.Error("incorrect url:", client.url)
+ }
+ if client.projectID != "1" {
+ t.Error("incorrect projectID:", client.projectID)
+ }
+ if client.authHeader != "Sentry sentry_version=4, sentry_key=u, sentry_secret=p" {
+ t.Error("incorrect authHeader:", client.authHeader)
+ }
+}
+
+func TestUnmarshalTag(t *testing.T) {
+ actual := new(Tag)
+ if err := json.Unmarshal([]byte(`["foo","bar"]`), actual); err != nil {
+ t.Fatal("unable to decode JSON:", err)
+ }
+
+ expected := &Tag{Key: "foo", Value: "bar"}
+ if !reflect.DeepEqual(actual, expected) {
+ t.Errorf("incorrect Tag: wanted '%+v' and got '%+v'", expected, actual)
+ }
+}
+
+func TestUnmarshalTags(t *testing.T) {
+ tests := []struct {
+ Input string
+ Expected Tags
+ }{
+ {
+ `{"foo":"bar"}`,
+ Tags{Tag{Key: "foo", Value: "bar"}},
+ },
+ {
+ `[["foo","bar"],["bar","baz"]]`,
+ Tags{Tag{Key: "foo", Value: "bar"}, Tag{Key: "bar", Value: "baz"}},
+ },
+ }
+
+ for _, test := range tests {
+ var actual Tags
+ if err := json.Unmarshal([]byte(test.Input), &actual); err != nil {
+ t.Fatal("unable to decode JSON:", err)
+ }
+
+ if !reflect.DeepEqual(actual, test.Expected) {
+ t.Errorf("incorrect Tags: wanted '%+v' and got '%+v'", test.Expected, actual)
+ }
+ }
+}
+
+func TestMarshalTimestamp(t *testing.T) {
+ timestamp := Timestamp(time.Date(2000, 01, 02, 03, 04, 05, 0, time.UTC))
+ expected := `"2000-01-02T03:04:05"`
+
+ actual, err := json.Marshal(timestamp)
+ if err != nil {
+ t.Error(err)
+ }
+
+ if string(actual) != expected {
+ t.Errorf("incorrect string; got %s, want %s", actual, expected)
+ }
+}
+
+func TestUnmarshalTimestamp(t *testing.T) {
+ timestamp := `"2000-01-02T03:04:05"`
+ expected := Timestamp(time.Date(2000, 01, 02, 03, 04, 05, 0, time.UTC))
+
+ var actual Timestamp
+ err := json.Unmarshal([]byte(timestamp), &actual)
+ if err != nil {
+ t.Error(err)
+ }
+
+ if actual != expected {
+ t.Errorf("incorrect string; got %s, want %s", actual, expected)
+ }
+}
diff --git a/vendor/github.com/getsentry/raven-go/docs/Makefile b/vendor/github.com/getsentry/raven-go/docs/Makefile
new file mode 100644
index 000000000..60f8b8439
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/docs/Makefile
@@ -0,0 +1,153 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = _build
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+ @echo "Please use \`make ' where is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " texinfo to make Texinfo files"
+ @echo " info to make Texinfo files and run them through makeinfo"
+ @echo " gettext to make PO message catalogs"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ -rm -rf $(BUILDDIR)/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/raven-js.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/raven-js.qhc"
+
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/raven-js"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/raven-js"
+ @echo "# devhelp"
+
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+ @echo
+ @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+ @echo "Run \`make' in that directory to run these through makeinfo" \
+ "(use \`make info' here to do that automatically)."
+
+info:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+ @echo "Running Texinfo files through makeinfo..."
+ make -C $(BUILDDIR)/texinfo info
+ @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+ $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+ @echo
+ @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/vendor/github.com/getsentry/raven-go/docs/conf.py b/vendor/github.com/getsentry/raven-go/docs/conf.py
new file mode 100644
index 000000000..611c0012d
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/docs/conf.py
@@ -0,0 +1,248 @@
+# -*- coding: utf-8 -*-
+#
+# raven-go documentation build configuration file, created by
+# sphinx-quickstart on Mon Jan 21 21:04:27 2013.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os, datetime
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'raven-go'
+copyright = u'%s, Functional Software Inc.' % datetime.date.today().year
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+
+# The full version, including alpha/beta/rc tags.
+release = '0.0.0'
+# The short X.Y version.
+version = release.rsplit('.', 1)[0]
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# " v documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'raven-godoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+ ('index', 'raven-go.tex', u'raven-go Documentation',
+ u'Functional Software Inc.', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'raven-go', u'raven-go Documentation',
+ [u'Functional Software Inc.'], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output ------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ ('index', 'raven-go', u'raven-go Documentation',
+ u'Functional Software Inc.', 'raven-go', 'One line description of project.',
+ 'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+if os.environ.get('SENTRY_FEDERATED_DOCS') != '1':
+ sys.path.insert(0, os.path.abspath('_sentryext'))
+ import sentryext
+ sentryext.activate()
diff --git a/vendor/github.com/getsentry/raven-go/docs/index.rst b/vendor/github.com/getsentry/raven-go/docs/index.rst
new file mode 100644
index 000000000..b570b9497
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/docs/index.rst
@@ -0,0 +1,41 @@
+.. sentry:edition:: self
+
+ Raven Go
+ ========
+
+.. sentry:edition:: hosted, on-premise
+
+ .. class:: platform-go
+
+ Go
+ ==
+
+Raven-Go provides a Sentry client implementation for the Go programming
+language.
+
+Installation
+------------
+
+Raven-Go can be installed like any other Go library through ``go get``::
+
+ $ go get github.com/getsentry/raven-go
+
+Minimal Example
+---------------
+
+.. sourcecode:: go
+
+ package main
+
+ import (
+ "github.com/getsentry/raven-go"
+ )
+
+ func main() {
+ raven.SetDSN("___DSN___")
+
+ _, err := DoSomethingThatFails()
+ if err != nil {
+ raven.CaptureErrorAndWait(err, nil);
+ }
+ }
diff --git a/vendor/github.com/getsentry/raven-go/docs/make.bat b/vendor/github.com/getsentry/raven-go/docs/make.bat
new file mode 100644
index 000000000..13e2848a4
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/docs/make.bat
@@ -0,0 +1,190 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+ set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+ set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+ :help
+ echo.Please use `make ^` where ^ is one of
+ echo. html to make standalone HTML files
+ echo. dirhtml to make HTML files named index.html in directories
+ echo. singlehtml to make a single large HTML file
+ echo. pickle to make pickle files
+ echo. json to make JSON files
+ echo. htmlhelp to make HTML files and a HTML help project
+ echo. qthelp to make HTML files and a qthelp project
+ echo. devhelp to make HTML files and a Devhelp project
+ echo. epub to make an epub
+ echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+ echo. text to make text files
+ echo. man to make manual pages
+ echo. texinfo to make Texinfo files
+ echo. gettext to make PO message catalogs
+ echo. changes to make an overview over all changed/added/deprecated items
+ echo. linkcheck to check all external links for integrity
+ echo. doctest to run all doctests embedded in the documentation if enabled
+ goto end
+)
+
+if "%1" == "clean" (
+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+ del /q /s %BUILDDIR%\*
+ goto end
+)
+
+if "%1" == "html" (
+ %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+ goto end
+)
+
+if "%1" == "dirhtml" (
+ %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+ goto end
+)
+
+if "%1" == "singlehtml" (
+ %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+ goto end
+)
+
+if "%1" == "pickle" (
+ %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can process the pickle files.
+ goto end
+)
+
+if "%1" == "json" (
+ %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can process the JSON files.
+ goto end
+)
+
+if "%1" == "htmlhelp" (
+ %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+ goto end
+)
+
+if "%1" == "qthelp" (
+ %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+ echo.^> qcollectiongenerator %BUILDDIR%\qthelp\raven-js.qhcp
+ echo.To view the help file:
+ echo.^> assistant -collectionFile %BUILDDIR%\qthelp\raven-js.ghc
+ goto end
+)
+
+if "%1" == "devhelp" (
+ %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished.
+ goto end
+)
+
+if "%1" == "epub" (
+ %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The epub file is in %BUILDDIR%/epub.
+ goto end
+)
+
+if "%1" == "latex" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "text" (
+ %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The text files are in %BUILDDIR%/text.
+ goto end
+)
+
+if "%1" == "man" (
+ %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The manual pages are in %BUILDDIR%/man.
+ goto end
+)
+
+if "%1" == "texinfo" (
+ %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
+ goto end
+)
+
+if "%1" == "gettext" (
+ %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
+ goto end
+)
+
+if "%1" == "changes" (
+ %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.The overview file is in %BUILDDIR%/changes.
+ goto end
+)
+
+if "%1" == "linkcheck" (
+ %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+ goto end
+)
+
+if "%1" == "doctest" (
+ %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+ goto end
+)
+
+:end
diff --git a/vendor/github.com/getsentry/raven-go/docs/sentry-doc-config.json b/vendor/github.com/getsentry/raven-go/docs/sentry-doc-config.json
new file mode 100644
index 000000000..fbbb91979
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/docs/sentry-doc-config.json
@@ -0,0 +1,15 @@
+{
+ "wizards": {
+ "go": {
+ "name": "Go",
+ "client_lib": "raven-go",
+ "is_framework": false,
+ "doc_link": "",
+ "snippets": [
+ "index#installation",
+ "index#configuring-the-client",
+ "index#reporting-errors"
+ ]
+ }
+ }
+}
diff --git a/vendor/github.com/getsentry/raven-go/example/example.go b/vendor/github.com/getsentry/raven-go/example/example.go
new file mode 100644
index 000000000..43d887a2c
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/example/example.go
@@ -0,0 +1,42 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+ "github.com/getsentry/raven-go"
+ "log"
+ "net/http"
+ "os"
+)
+
+func trace() *raven.Stacktrace {
+ return raven.NewStacktrace(0, 2, nil)
+}
+
+func main() {
+ client, err := raven.NewWithTags(os.Args[1], map[string]string{"foo": "bar"})
+ if err != nil {
+ log.Fatal(err)
+ }
+ httpReq, _ := http.NewRequest("GET", "http://example.com/foo?bar=true", nil)
+ httpReq.RemoteAddr = "127.0.0.1:80"
+ httpReq.Header = http.Header{"Content-Type": {"text/html"}, "Content-Length": {"42"}}
+ packet := &raven.Packet{Message: "Test report", Interfaces: []raven.Interface{raven.NewException(errors.New("example"), trace()), raven.NewHttp(httpReq)}}
+ _, ch := client.Capture(packet, nil)
+ if err = <-ch; err != nil {
+ log.Fatal(err)
+ }
+ log.Print("sent packet successfully")
+}
+
+// CheckError sends error report to sentry and records event id and error name to the logs
+func CheckError(err error, r *http.Request) {
+ client, err := raven.NewWithTags(os.Args[1], map[string]string{"foo": "bar"})
+ if err != nil {
+ log.Fatal(err)
+ }
+ packet := raven.NewPacket(err.Error(), raven.NewException(err, trace()), raven.NewHttp(r))
+ eventID, _ := client.Capture(packet, nil)
+ message := fmt.Sprintf("Error event with id \"%s\" - %s", eventID, err.Error())
+ log.Println(message)
+}
diff --git a/vendor/github.com/getsentry/raven-go/examples_test.go b/vendor/github.com/getsentry/raven-go/examples_test.go
new file mode 100644
index 000000000..57b90d170
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/examples_test.go
@@ -0,0 +1,28 @@
+package raven
+
+import (
+ "fmt"
+ "log"
+ "net/http"
+)
+
+func Example() {
+ // ... i.e. raisedErr is incoming error
+ var raisedErr error
+ // sentry DSN generated by Sentry server
+ var sentryDSN string
+ // r is a request performed when error occured
+ var r *http.Request
+ client, err := New(sentryDSN)
+ if err != nil {
+ log.Fatal(err)
+ }
+ trace := NewStacktrace(0, 2, nil)
+ packet := NewPacket(raisedErr.Error(), NewException(raisedErr, trace), NewHttp(r))
+ eventID, ch := client.Capture(packet, nil)
+ if err = <-ch; err != nil {
+ log.Fatal(err)
+ }
+ message := fmt.Sprintf("Captured error with id %s: %q", eventID, raisedErr)
+ log.Println(message)
+}
diff --git a/vendor/github.com/getsentry/raven-go/exception.go b/vendor/github.com/getsentry/raven-go/exception.go
new file mode 100644
index 000000000..14a42a442
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/exception.go
@@ -0,0 +1,41 @@
+package raven
+
+import (
+ "reflect"
+ "regexp"
+)
+
+var errorMsgPattern = regexp.MustCompile(`\A(\w+): (.+)\z`)
+
+func NewException(err error, stacktrace *Stacktrace) *Exception {
+ msg := err.Error()
+ ex := &Exception{
+ Stacktrace: stacktrace,
+ Value: msg,
+ Type: reflect.TypeOf(err).String(),
+ }
+ if m := errorMsgPattern.FindStringSubmatch(msg); m != nil {
+ ex.Module, ex.Value = m[1], m[2]
+ }
+ return ex
+}
+
+// http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html#sentry.interfaces.Exception
+type Exception struct {
+ // Required
+ Value string `json:"value"`
+
+ // Optional
+ Type string `json:"type,omitempty"`
+ Module string `json:"module,omitempty"`
+ Stacktrace *Stacktrace `json:"stacktrace,omitempty"`
+}
+
+func (e *Exception) Class() string { return "exception" }
+
+func (e *Exception) Culprit() string {
+ if e.Stacktrace == nil {
+ return ""
+ }
+ return e.Stacktrace.Culprit()
+}
diff --git a/vendor/github.com/getsentry/raven-go/exception_test.go b/vendor/github.com/getsentry/raven-go/exception_test.go
new file mode 100644
index 000000000..f7d3ce43d
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/exception_test.go
@@ -0,0 +1,29 @@
+package raven
+
+import (
+ "errors"
+ "testing"
+)
+
+var newExceptionTests = []struct {
+ err error
+ Exception
+}{
+ {errors.New("foobar"), Exception{Value: "foobar", Type: "*errors.errorString"}},
+ {errors.New("bar: foobar"), Exception{Value: "foobar", Type: "*errors.errorString", Module: "bar"}},
+}
+
+func TestNewException(t *testing.T) {
+ for _, test := range newExceptionTests {
+ actual := NewException(test.err, nil)
+ if actual.Value != test.Value {
+ t.Errorf("incorrect Value: got %s, want %s", actual.Value, test.Value)
+ }
+ if actual.Type != test.Type {
+ t.Errorf("incorrect Type: got %s, want %s", actual.Type, test.Type)
+ }
+ if actual.Module != test.Module {
+ t.Errorf("incorrect Module: got %s, want %s", actual.Module, test.Module)
+ }
+ }
+}
diff --git a/vendor/github.com/getsentry/raven-go/http.go b/vendor/github.com/getsentry/raven-go/http.go
new file mode 100644
index 000000000..ac75f4b3c
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/http.go
@@ -0,0 +1,84 @@
+package raven
+
+import (
+ "errors"
+ "fmt"
+ "net"
+ "net/http"
+ "net/url"
+ "runtime/debug"
+ "strings"
+)
+
+func NewHttp(req *http.Request) *Http {
+ proto := "http"
+ if req.TLS != nil || req.Header.Get("X-Forwarded-Proto") == "https" {
+ proto = "https"
+ }
+ h := &Http{
+ Method: req.Method,
+ Cookies: req.Header.Get("Cookie"),
+ Query: sanitizeQuery(req.URL.Query()).Encode(),
+ URL: proto + "://" + req.Host + req.URL.Path,
+ Headers: make(map[string]string, len(req.Header)),
+ }
+ if addr, port, err := net.SplitHostPort(req.RemoteAddr); err == nil {
+ h.Env = map[string]string{"REMOTE_ADDR": addr, "REMOTE_PORT": port}
+ }
+ for k, v := range req.Header {
+ h.Headers[k] = strings.Join(v, ",")
+ }
+ return h
+}
+
+var querySecretFields = []string{"password", "passphrase", "passwd", "secret"}
+
+func sanitizeQuery(query url.Values) url.Values {
+ for _, keyword := range querySecretFields {
+ for field := range query {
+ if strings.Contains(field, keyword) {
+ query[field] = []string{"********"}
+ }
+ }
+ }
+ return query
+}
+
+// http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html#sentry.interfaces.Http
+type Http struct {
+ // Required
+ URL string `json:"url"`
+ Method string `json:"method"`
+ Query string `json:"query_string,omitempty"`
+
+ // Optional
+ Cookies string `json:"cookies,omitempty"`
+ Headers map[string]string `json:"headers,omitempty"`
+ Env map[string]string `json:"env,omitempty"`
+
+ // Must be either a string or map[string]string
+ Data interface{} `json:"data,omitempty"`
+}
+
+func (h *Http) Class() string { return "request" }
+
+// Recovery handler to wrap the stdlib net/http Mux.
+// Example:
+// http.HandleFunc("/", raven.RecoveryHandler(func(w http.ResponseWriter, r *http.Request) {
+// ...
+// }))
+func RecoveryHandler(handler func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ defer func() {
+ if rval := recover(); rval != nil {
+ debug.PrintStack()
+ rvalStr := fmt.Sprint(rval)
+ packet := NewPacket(rvalStr, NewException(errors.New(rvalStr), NewStacktrace(2, 3, nil)), NewHttp(r))
+ Capture(packet, nil)
+ w.WriteHeader(http.StatusInternalServerError)
+ }
+ }()
+
+ handler(w, r)
+ }
+}
diff --git a/vendor/github.com/getsentry/raven-go/http_test.go b/vendor/github.com/getsentry/raven-go/http_test.go
new file mode 100644
index 000000000..7d611b1e3
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/http_test.go
@@ -0,0 +1,149 @@
+package raven
+
+import (
+ "net/http"
+ "net/url"
+ "reflect"
+ "testing"
+)
+
+type testcase struct {
+ request *http.Request
+ *Http
+}
+
+func newBaseRequest() *http.Request {
+ u, _ := url.Parse("http://example.com/")
+ header := make(http.Header)
+ header.Add("Foo", "bar")
+
+ req := &http.Request{
+ Method: "GET",
+ URL: u,
+ Proto: "HTTP/1.1",
+ ProtoMajor: 1,
+ ProtoMinor: 1,
+ Header: header,
+ Host: u.Host,
+ RemoteAddr: "127.0.0.1:8000",
+ }
+ return req
+}
+
+func newBaseHttp() *Http {
+ h := &Http{
+ Method: "GET",
+ Cookies: "",
+ Query: "",
+ URL: "http://example.com/",
+ Headers: map[string]string{"Foo": "bar"},
+ Env: map[string]string{"REMOTE_ADDR": "127.0.0.1", "REMOTE_PORT": "8000"},
+ }
+ return h
+}
+
+func NewRequest() testcase {
+ return testcase{newBaseRequest(), newBaseHttp()}
+}
+
+func NewRequestIPV6() testcase {
+ req := newBaseRequest()
+ req.RemoteAddr = "[:1]:8000"
+
+ h := newBaseHttp()
+ h.Env = map[string]string{"REMOTE_ADDR": ":1", "REMOTE_PORT": "8000"}
+ return testcase{req, h}
+}
+
+func NewRequestMultipleHeaders() testcase {
+ req := newBaseRequest()
+ req.Header.Add("Foo", "baz")
+
+ h := newBaseHttp()
+ h.Headers["Foo"] = "bar,baz"
+ return testcase{req, h}
+}
+
+func NewSecureRequest() testcase {
+ req := newBaseRequest()
+ req.Header.Add("X-Forwarded-Proto", "https")
+
+ h := newBaseHttp()
+ h.URL = "https://example.com/"
+ h.Headers["X-Forwarded-Proto"] = "https"
+ return testcase{req, h}
+}
+
+func NewCookiesRequest() testcase {
+ val := "foo=bar; bar=baz"
+ req := newBaseRequest()
+ req.Header.Add("Cookie", val)
+
+ h := newBaseHttp()
+ h.Cookies = val
+ h.Headers["Cookie"] = val
+ return testcase{req, h}
+}
+
+var newHttpTests = []testcase{
+ NewRequest(),
+ NewRequestIPV6(),
+ NewRequestMultipleHeaders(),
+ NewSecureRequest(),
+ NewCookiesRequest(),
+}
+
+func TestNewHttp(t *testing.T) {
+ for _, test := range newHttpTests {
+ actual := NewHttp(test.request)
+ if actual.Method != test.Method {
+ t.Errorf("incorrect Method: got %s, want %s", actual.Method, test.Method)
+ }
+ if actual.Cookies != test.Cookies {
+ t.Errorf("incorrect Cookies: got %s, want %s", actual.Cookies, test.Cookies)
+ }
+ if actual.Query != test.Query {
+ t.Errorf("incorrect Query: got %s, want %s", actual.Query, test.Query)
+ }
+ if actual.URL != test.URL {
+ t.Errorf("incorrect URL: got %s, want %s", actual.URL, test.URL)
+ }
+ if !reflect.DeepEqual(actual.Headers, test.Headers) {
+ t.Errorf("incorrect Headers: got %+v, want %+v", actual.Headers, test.Headers)
+ }
+ if !reflect.DeepEqual(actual.Env, test.Env) {
+ t.Errorf("incorrect Env: got %+v, want %+v", actual.Env, test.Env)
+ }
+ if !reflect.DeepEqual(actual.Data, test.Data) {
+ t.Errorf("incorrect Data: got %+v, want %+v", actual.Data, test.Data)
+ }
+ }
+}
+
+var sanitizeQueryTests = []struct {
+ input, output string
+}{
+ {"foo=bar", "foo=bar"},
+ {"password=foo", "password=********"},
+ {"passphrase=foo", "passphrase=********"},
+ {"passwd=foo", "passwd=********"},
+ {"secret=foo", "secret=********"},
+ {"secretstuff=foo", "secretstuff=********"},
+ {"foo=bar&secret=foo", "foo=bar&secret=********"},
+ {"secret=foo&secret=bar", "secret=********"},
+}
+
+func parseQuery(q string) url.Values {
+ r, _ := url.ParseQuery(q)
+ return r
+}
+
+func TestSanitizeQuery(t *testing.T) {
+ for _, test := range sanitizeQueryTests {
+ actual := sanitizeQuery(parseQuery(test.input))
+ expected := parseQuery(test.output)
+ if !reflect.DeepEqual(actual, expected) {
+ t.Errorf("incorrect sanitization: got %+v, want %+v", actual, expected)
+ }
+ }
+}
diff --git a/vendor/github.com/getsentry/raven-go/interfaces.go b/vendor/github.com/getsentry/raven-go/interfaces.go
new file mode 100644
index 000000000..5eea1e232
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/interfaces.go
@@ -0,0 +1,49 @@
+package raven
+
+// http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html#sentry.interfaces.Message
+type Message struct {
+ // Required
+ Message string `json:"message"`
+
+ // Optional
+ Params []interface{} `json:"params,omitempty"`
+}
+
+func (m *Message) Class() string { return "logentry" }
+
+// http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html#sentry.interfaces.Template
+type Template struct {
+ // Required
+ Filename string `json:"filename"`
+ Lineno int `json:"lineno"`
+ ContextLine string `json:"context_line"`
+
+ // Optional
+ PreContext []string `json:"pre_context,omitempty"`
+ PostContext []string `json:"post_context,omitempty"`
+ AbsolutePath string `json:"abs_path,omitempty"`
+}
+
+func (t *Template) Class() string { return "template" }
+
+// http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html#sentry.interfaces.User
+type User struct {
+ // All fields are optional
+ ID string `json:"id,omitempty"`
+ Username string `json:"username,omitempty"`
+ Email string `json:"email,omitempty"`
+ IP string `json:"ip_address,omitempty"`
+}
+
+func (h *User) Class() string { return "user" }
+
+// http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html#sentry.interfaces.Query
+type Query struct {
+ // Required
+ Query string `json:"query"`
+
+ // Optional
+ Engine string `json:"engine,omitempty"`
+}
+
+func (q *Query) Class() string { return "query" }
diff --git a/vendor/github.com/getsentry/raven-go/runtests.sh b/vendor/github.com/getsentry/raven-go/runtests.sh
new file mode 100644
index 000000000..9ed279c96
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/runtests.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+go test -race ./...
+go test -cover ./...
+go test -v ./...
diff --git a/vendor/github.com/getsentry/raven-go/stacktrace.go b/vendor/github.com/getsentry/raven-go/stacktrace.go
new file mode 100644
index 000000000..642569d63
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/stacktrace.go
@@ -0,0 +1,205 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+// Some code from the runtime/debug package of the Go standard library.
+
+package raven
+
+import (
+ "bytes"
+ "go/build"
+ "io/ioutil"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "sync"
+)
+
+// http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html#sentry.interfaces.Stacktrace
+type Stacktrace struct {
+ // Required
+ Frames []*StacktraceFrame `json:"frames"`
+}
+
+func (s *Stacktrace) Class() string { return "stacktrace" }
+
+func (s *Stacktrace) Culprit() string {
+ for i := len(s.Frames) - 1; i >= 0; i-- {
+ frame := s.Frames[i]
+ if frame.InApp == true && frame.Module != "" && frame.Function != "" {
+ return frame.Module + "." + frame.Function
+ }
+ }
+ return ""
+}
+
+type StacktraceFrame struct {
+ // At least one required
+ Filename string `json:"filename,omitempty"`
+ Function string `json:"function,omitempty"`
+ Module string `json:"module,omitempty"`
+
+ // Optional
+ Lineno int `json:"lineno,omitempty"`
+ Colno int `json:"colno,omitempty"`
+ AbsolutePath string `json:"abs_path,omitempty"`
+ ContextLine string `json:"context_line,omitempty"`
+ PreContext []string `json:"pre_context,omitempty"`
+ PostContext []string `json:"post_context,omitempty"`
+ InApp bool `json:"in_app"`
+}
+
+// Intialize and populate a new stacktrace, skipping skip frames.
+//
+// context is the number of surrounding lines that should be included for context.
+// Setting context to 3 would try to get seven lines. Setting context to -1 returns
+// one line with no surrounding context, and 0 returns no context.
+//
+// appPackagePrefixes is a list of prefixes used to check whether a package should
+// be considered "in app".
+func NewStacktrace(skip int, context int, appPackagePrefixes []string) *Stacktrace {
+ var frames []*StacktraceFrame
+ for i := 1 + skip; ; i++ {
+ pc, file, line, ok := runtime.Caller(i)
+ if !ok {
+ break
+ }
+ frame := NewStacktraceFrame(pc, file, line, context, appPackagePrefixes)
+ if frame != nil {
+ frames = append(frames, frame)
+ }
+ }
+ // Sentry wants the frames with the oldest first, so reverse them
+ for i, j := 0, len(frames)-1; i < j; i, j = i+1, j-1 {
+ frames[i], frames[j] = frames[j], frames[i]
+ }
+ return &Stacktrace{frames}
+}
+
+// Build a single frame using data returned from runtime.Caller.
+//
+// context is the number of surrounding lines that should be included for context.
+// Setting context to 3 would try to get seven lines. Setting context to -1 returns
+// one line with no surrounding context, and 0 returns no context.
+//
+// appPackagePrefixes is a list of prefixes used to check whether a package should
+// be considered "in app".
+func NewStacktraceFrame(pc uintptr, file string, line, context int, appPackagePrefixes []string) *StacktraceFrame {
+ frame := &StacktraceFrame{AbsolutePath: file, Filename: trimPath(file), Lineno: line, InApp: false}
+ frame.Module, frame.Function = functionName(pc)
+
+ // `runtime.goexit` is effectively a placeholder that comes from
+ // runtime/asm_amd64.s and is meaningless.
+ if frame.Module == "runtime" && frame.Function == "goexit" {
+ return nil
+ }
+
+ if frame.Module == "main" {
+ frame.InApp = true
+ } else {
+ for _, prefix := range appPackagePrefixes {
+ if strings.HasPrefix(frame.Module, prefix) && !strings.Contains(frame.Module, "vendor") && !strings.Contains(frame.Module, "third_party") {
+ frame.InApp = true
+ }
+ }
+ }
+
+ if context > 0 {
+ contextLines, lineIdx := fileContext(file, line, context)
+ if len(contextLines) > 0 {
+ for i, line := range contextLines {
+ switch {
+ case i < lineIdx:
+ frame.PreContext = append(frame.PreContext, string(line))
+ case i == lineIdx:
+ frame.ContextLine = string(line)
+ default:
+ frame.PostContext = append(frame.PostContext, string(line))
+ }
+ }
+ }
+ } else if context == -1 {
+ contextLine, _ := fileContext(file, line, 0)
+ if len(contextLine) > 0 {
+ frame.ContextLine = string(contextLine[0])
+ }
+ }
+ return frame
+}
+
+// Retrieve the name of the package and function containing the PC.
+func functionName(pc uintptr) (pack string, name string) {
+ fn := runtime.FuncForPC(pc)
+ if fn == nil {
+ return
+ }
+ name = fn.Name()
+ // We get this:
+ // runtime/debug.*T·ptrmethod
+ // and want this:
+ // pack = runtime/debug
+ // name = *T.ptrmethod
+ if idx := strings.LastIndex(name, "."); idx != -1 {
+ pack = name[:idx]
+ name = name[idx+1:]
+ }
+ name = strings.Replace(name, "·", ".", -1)
+ return
+}
+
+var fileCacheLock sync.Mutex
+var fileCache = make(map[string][][]byte)
+
+func fileContext(filename string, line, context int) ([][]byte, int) {
+ fileCacheLock.Lock()
+ defer fileCacheLock.Unlock()
+ lines, ok := fileCache[filename]
+ if !ok {
+ data, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return nil, 0
+ }
+ lines = bytes.Split(data, []byte{'\n'})
+ fileCache[filename] = lines
+ }
+ line-- // stack trace lines are 1-indexed
+ start := line - context
+ var idx int
+ if start < 0 {
+ start = 0
+ idx = line
+ } else {
+ idx = context
+ }
+ end := line + context + 1
+ if line >= len(lines) {
+ return nil, 0
+ }
+ if end > len(lines) {
+ end = len(lines)
+ }
+ return lines[start:end], idx
+}
+
+var trimPaths []string
+
+// Try to trim the GOROOT or GOPATH prefix off of a filename
+func trimPath(filename string) string {
+ for _, prefix := range trimPaths {
+ if trimmed := strings.TrimPrefix(filename, prefix); len(trimmed) < len(filename) {
+ return trimmed
+ }
+ }
+ return filename
+}
+
+func init() {
+ // Collect all source directories, and make sure they
+ // end in a trailing "separator"
+ for _, prefix := range build.Default.SrcDirs() {
+ if prefix[len(prefix)-1] != filepath.Separator {
+ prefix += string(filepath.Separator)
+ }
+ trimPaths = append(trimPaths, prefix)
+ }
+}
diff --git a/vendor/github.com/getsentry/raven-go/stacktrace_test.go b/vendor/github.com/getsentry/raven-go/stacktrace_test.go
new file mode 100644
index 000000000..b213c8191
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/stacktrace_test.go
@@ -0,0 +1,133 @@
+package raven
+
+import (
+ "fmt"
+ "go/build"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "testing"
+)
+
+type FunctionNameTest struct {
+ skip int
+ pack string
+ name string
+}
+
+var (
+ thisFile string
+ thisPackage string
+ functionNameTests []FunctionNameTest
+)
+
+func TestFunctionName(t *testing.T) {
+ for _, test := range functionNameTests {
+ pc, _, _, _ := runtime.Caller(test.skip)
+ pack, name := functionName(pc)
+
+ if pack != test.pack {
+ t.Errorf("incorrect package; got %s, want %s", pack, test.pack)
+ }
+ if name != test.name {
+ t.Errorf("incorrect function; got %s, want %s", name, test.name)
+ }
+ }
+}
+
+func TestStacktrace(t *testing.T) {
+ st := trace()
+ if st == nil {
+ t.Error("got nil stacktrace")
+ }
+ if len(st.Frames) == 0 {
+ t.Error("got zero frames")
+ }
+
+ f := st.Frames[len(st.Frames)-1]
+ if f.Filename != thisFile {
+ t.Errorf("incorrect Filename; got %s, want %s", f.Filename, thisFile)
+ }
+ if !strings.HasSuffix(f.AbsolutePath, thisFile) {
+ t.Error("incorrect AbsolutePath:", f.AbsolutePath)
+ }
+ if f.Function != "trace" {
+ t.Error("incorrect Function:", f.Function)
+ }
+ if f.Module != thisPackage {
+ t.Error("incorrect Module:", f.Module)
+ }
+ if f.Lineno != 83 {
+ t.Error("incorrect Lineno:", f.Lineno)
+ }
+ if f.ContextLine != "\treturn NewStacktrace(0, 2, []string{thisPackage})" {
+ t.Errorf("incorrect ContextLine: %#v", f.ContextLine)
+ }
+ if len(f.PreContext) != 2 || f.PreContext[0] != "// a" || f.PreContext[1] != "func trace() *Stacktrace {" {
+ t.Errorf("incorrect PreContext %#v", f.PreContext)
+ }
+ if len(f.PostContext) != 2 || f.PostContext[0] != "\t// b" || f.PostContext[1] != "}" {
+ t.Errorf("incorrect PostContext %#v", f.PostContext)
+ }
+ if !f.InApp {
+ t.Error("expected InApp to be true")
+ }
+
+ if st.Culprit() != fmt.Sprintf("%s.trace", thisPackage) {
+ t.Error("incorrect Culprit:", st.Culprit())
+ }
+}
+
+// a
+func trace() *Stacktrace {
+ return NewStacktrace(0, 2, []string{thisPackage})
+ // b
+}
+
+func derivePackage() (file, pack string) {
+ // Get file name by seeking caller's file name.
+ _, callerFile, _, ok := runtime.Caller(1)
+ if !ok {
+ return
+ }
+
+ // Trim file name
+ file = callerFile
+ for _, dir := range build.Default.SrcDirs() {
+ dir := dir + string(filepath.Separator)
+ if trimmed := strings.TrimPrefix(callerFile, dir); len(trimmed) < len(file) {
+ file = trimmed
+ }
+ }
+
+ // Now derive package name
+ dir := filepath.Dir(callerFile)
+
+ dirPkg, err := build.ImportDir(dir, build.AllowBinary)
+ if err != nil {
+ return
+ }
+
+ pack = dirPkg.ImportPath
+ return
+}
+
+func init() {
+ thisFile, thisPackage = derivePackage()
+ functionNameTests = []FunctionNameTest{
+ {0, thisPackage, "TestFunctionName"},
+ {1, "testing", "tRunner"},
+ {2, "runtime", "goexit"},
+ {100, "", ""},
+ }
+}
+
+// TestNewStacktrace_outOfBounds verifies that a context exceeding the number
+// of lines in a file does not cause a panic.
+func TestNewStacktrace_outOfBounds(t *testing.T) {
+ st := NewStacktrace(0, 1000000, []string{thisPackage})
+ f := st.Frames[len(st.Frames)-1]
+ if f.ContextLine != "\tst := NewStacktrace(0, 1000000, []string{thisPackage})" {
+ t.Errorf("incorrect ContextLine: %#v", f.ContextLine)
+ }
+}
diff --git a/vendor/github.com/getsentry/raven-go/writer.go b/vendor/github.com/getsentry/raven-go/writer.go
new file mode 100644
index 000000000..61f7a9108
--- /dev/null
+++ b/vendor/github.com/getsentry/raven-go/writer.go
@@ -0,0 +1,20 @@
+package raven
+
+type Writer struct {
+ Client *Client
+ Level Severity
+ Logger string // Logger name reported to Sentry
+}
+
+// Write formats the byte slice p into a string, and sends a message to
+// Sentry at the severity level indicated by the Writer w.
+func (w *Writer) Write(p []byte) (int, error) {
+ message := string(p)
+
+ packet := NewPacket(message, &Message{message, nil})
+ packet.Level = w.Level
+ packet.Logger = w.Logger
+ w.Client.Capture(packet, nil)
+
+ return len(p), nil
+}
diff --git a/vendor/github.com/gin-gonic/gin/.gitignore b/vendor/github.com/gin-gonic/gin/.gitignore
deleted file mode 100644
index 9f48f1425..000000000
--- a/vendor/github.com/gin-gonic/gin/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Godeps/*
-!Godeps/Godeps.json
-coverage.out
-count.out
diff --git a/vendor/github.com/gin-gonic/gin/.travis.yml b/vendor/github.com/gin-gonic/gin/.travis.yml
deleted file mode 100644
index 8103a5e05..000000000
--- a/vendor/github.com/gin-gonic/gin/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: go
-sudo: false
-go:
- - 1.4
- - 1.4.2
- - tip
-
-script:
- - go get golang.org/x/tools/cmd/cover
- - go get github.com/mattn/goveralls
- - go test -v -covermode=count -coverprofile=coverage.out
- - goveralls -coverprofile=coverage.out -service=travis-ci -repotoken yFj7FrCeddvBzUaaCyG33jCLfWXeb93eA
-
-notifications:
- webhooks:
- urls:
- - https://webhooks.gitter.im/e/acc2c57482e94b44f557
- on_success: change # options: [always|never|change] default: always
- on_failure: always # options: [always|never|change] default: always
- on_start: false # default: false
diff --git a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md
new file mode 100644
index 000000000..181f75b36
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md
@@ -0,0 +1,298 @@
+**Machine:** intel i7 ivy bridge quad-core. 8GB RAM.
+**Date:** June 4th, 2015
+[https://github.com/gin-gonic/go-http-routing-benchmark](https://github.com/gin-gonic/go-http-routing-benchmark)
+
+```
+BenchmarkAce_Param 5000000 372 ns/op 32 B/op 1 allocs/op
+BenchmarkBear_Param 1000000 1165 ns/op 424 B/op 5 allocs/op
+BenchmarkBeego_Param 1000000 2440 ns/op 720 B/op 10 allocs/op
+BenchmarkBone_Param 1000000 1067 ns/op 384 B/op 3 allocs/op
+BenchmarkDenco_Param 5000000 240 ns/op 32 B/op 1 allocs/op
+BenchmarkEcho_Param 10000000 130 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_Param 10000000 133 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_Param 1000000 1826 ns/op 656 B/op 9 allocs/op
+BenchmarkGoji_Param 2000000 957 ns/op 336 B/op 2 allocs/op
+BenchmarkGoJsonRest_Param 1000000 2021 ns/op 657 B/op 14 allocs/op
+BenchmarkGoRestful_Param 200000 8825 ns/op 2496 B/op 31 allocs/op
+BenchmarkGorillaMux_Param 500000 3340 ns/op 784 B/op 9 allocs/op
+BenchmarkHttpRouter_Param 10000000 152 ns/op 32 B/op 1 allocs/op
+BenchmarkHttpTreeMux_Param 2000000 717 ns/op 336 B/op 2 allocs/op
+BenchmarkKocha_Param 3000000 423 ns/op 56 B/op 3 allocs/op
+BenchmarkMacaron_Param 1000000 3410 ns/op 1104 B/op 11 allocs/op
+BenchmarkMartini_Param 200000 7101 ns/op 1152 B/op 12 allocs/op
+BenchmarkPat_Param 1000000 2040 ns/op 656 B/op 14 allocs/op
+BenchmarkPossum_Param 1000000 2048 ns/op 624 B/op 7 allocs/op
+BenchmarkR2router_Param 1000000 1144 ns/op 432 B/op 6 allocs/op
+BenchmarkRevel_Param 200000 6725 ns/op 1672 B/op 28 allocs/op
+BenchmarkRivet_Param 1000000 1121 ns/op 464 B/op 5 allocs/op
+BenchmarkTango_Param 1000000 1479 ns/op 256 B/op 10 allocs/op
+BenchmarkTigerTonic_Param 1000000 3393 ns/op 992 B/op 19 allocs/op
+BenchmarkTraffic_Param 300000 5525 ns/op 1984 B/op 23 allocs/op
+BenchmarkVulcan_Param 2000000 924 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_Param 1000000 1084 ns/op 368 B/op 3 allocs/op
+BenchmarkAce_Param5 3000000 614 ns/op 160 B/op 1 allocs/op
+BenchmarkBear_Param5 1000000 1617 ns/op 469 B/op 5 allocs/op
+BenchmarkBeego_Param5 1000000 3373 ns/op 992 B/op 13 allocs/op
+BenchmarkBone_Param5 1000000 1478 ns/op 432 B/op 3 allocs/op
+BenchmarkDenco_Param5 3000000 570 ns/op 160 B/op 1 allocs/op
+BenchmarkEcho_Param5 5000000 256 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_Param5 10000000 222 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_Param5 1000000 2789 ns/op 928 B/op 12 allocs/op
+BenchmarkGoji_Param5 1000000 1287 ns/op 336 B/op 2 allocs/op
+BenchmarkGoJsonRest_Param5 1000000 3670 ns/op 1105 B/op 17 allocs/op
+BenchmarkGoRestful_Param5 200000 10756 ns/op 2672 B/op 31 allocs/op
+BenchmarkGorillaMux_Param5 300000 5543 ns/op 912 B/op 9 allocs/op
+BenchmarkHttpRouter_Param5 5000000 403 ns/op 160 B/op 1 allocs/op
+BenchmarkHttpTreeMux_Param5 1000000 1089 ns/op 336 B/op 2 allocs/op
+BenchmarkKocha_Param5 1000000 1682 ns/op 440 B/op 10 allocs/op
+BenchmarkMacaron_Param5 300000 4596 ns/op 1376 B/op 14 allocs/op
+BenchmarkMartini_Param5 100000 15703 ns/op 1280 B/op 12 allocs/op
+BenchmarkPat_Param5 300000 5320 ns/op 1008 B/op 42 allocs/op
+BenchmarkPossum_Param5 1000000 2155 ns/op 624 B/op 7 allocs/op
+BenchmarkR2router_Param5 1000000 1559 ns/op 432 B/op 6 allocs/op
+BenchmarkRevel_Param5 200000 8184 ns/op 2024 B/op 35 allocs/op
+BenchmarkRivet_Param5 1000000 1914 ns/op 528 B/op 9 allocs/op
+BenchmarkTango_Param5 1000000 3280 ns/op 944 B/op 18 allocs/op
+BenchmarkTigerTonic_Param5 200000 11638 ns/op 2519 B/op 53 allocs/op
+BenchmarkTraffic_Param5 200000 8941 ns/op 2280 B/op 31 allocs/op
+BenchmarkVulcan_Param5 1000000 1279 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_Param5 1000000 1574 ns/op 416 B/op 3 allocs/op
+BenchmarkAce_Param20 1000000 1528 ns/op 640 B/op 1 allocs/op
+BenchmarkBear_Param20 300000 4906 ns/op 1633 B/op 5 allocs/op
+BenchmarkBeego_Param20 200000 10529 ns/op 3868 B/op 17 allocs/op
+BenchmarkBone_Param20 300000 7362 ns/op 2539 B/op 5 allocs/op
+BenchmarkDenco_Param20 1000000 1884 ns/op 640 B/op 1 allocs/op
+BenchmarkEcho_Param20 2000000 689 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_Param20 3000000 545 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_Param20 200000 9437 ns/op 3804 B/op 16 allocs/op
+BenchmarkGoji_Param20 500000 3987 ns/op 1246 B/op 2 allocs/op
+BenchmarkGoJsonRest_Param20 100000 12799 ns/op 4492 B/op 21 allocs/op
+BenchmarkGoRestful_Param20 100000 19451 ns/op 5244 B/op 33 allocs/op
+BenchmarkGorillaMux_Param20 100000 12456 ns/op 3275 B/op 11 allocs/op
+BenchmarkHttpRouter_Param20 1000000 1333 ns/op 640 B/op 1 allocs/op
+BenchmarkHttpTreeMux_Param20 300000 6490 ns/op 2187 B/op 4 allocs/op
+BenchmarkKocha_Param20 300000 5335 ns/op 1808 B/op 27 allocs/op
+BenchmarkMacaron_Param20 200000 11325 ns/op 4252 B/op 18 allocs/op
+BenchmarkMartini_Param20 20000 64419 ns/op 3644 B/op 14 allocs/op
+BenchmarkPat_Param20 50000 24672 ns/op 4888 B/op 151 allocs/op
+BenchmarkPossum_Param20 1000000 2085 ns/op 624 B/op 7 allocs/op
+BenchmarkR2router_Param20 300000 6809 ns/op 2283 B/op 8 allocs/op
+BenchmarkRevel_Param20 100000 16600 ns/op 5551 B/op 54 allocs/op
+BenchmarkRivet_Param20 200000 8428 ns/op 2620 B/op 26 allocs/op
+BenchmarkTango_Param20 100000 16302 ns/op 8224 B/op 48 allocs/op
+BenchmarkTigerTonic_Param20 30000 46828 ns/op 10538 B/op 178 allocs/op
+BenchmarkTraffic_Param20 50000 28871 ns/op 7998 B/op 66 allocs/op
+BenchmarkVulcan_Param20 1000000 2267 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_Param20 300000 6828 ns/op 2507 B/op 5 allocs/op
+BenchmarkAce_ParamWrite 3000000 502 ns/op 40 B/op 2 allocs/op
+BenchmarkBear_ParamWrite 1000000 1303 ns/op 424 B/op 5 allocs/op
+BenchmarkBeego_ParamWrite 1000000 2489 ns/op 728 B/op 11 allocs/op
+BenchmarkBone_ParamWrite 1000000 1181 ns/op 384 B/op 3 allocs/op
+BenchmarkDenco_ParamWrite 5000000 315 ns/op 32 B/op 1 allocs/op
+BenchmarkEcho_ParamWrite 10000000 237 ns/op 8 B/op 1 allocs/op
+BenchmarkGin_ParamWrite 5000000 336 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_ParamWrite 1000000 2079 ns/op 664 B/op 10 allocs/op
+BenchmarkGoji_ParamWrite 1000000 1092 ns/op 336 B/op 2 allocs/op
+BenchmarkGoJsonRest_ParamWrite 1000000 3329 ns/op 1136 B/op 19 allocs/op
+BenchmarkGoRestful_ParamWrite 200000 9273 ns/op 2504 B/op 32 allocs/op
+BenchmarkGorillaMux_ParamWrite 500000 3919 ns/op 792 B/op 10 allocs/op
+BenchmarkHttpRouter_ParamWrite 10000000 223 ns/op 32 B/op 1 allocs/op
+BenchmarkHttpTreeMux_ParamWrite 2000000 788 ns/op 336 B/op 2 allocs/op
+BenchmarkKocha_ParamWrite 3000000 549 ns/op 56 B/op 3 allocs/op
+BenchmarkMacaron_ParamWrite 500000 4558 ns/op 1216 B/op 16 allocs/op
+BenchmarkMartini_ParamWrite 200000 8850 ns/op 1256 B/op 16 allocs/op
+BenchmarkPat_ParamWrite 500000 3679 ns/op 1088 B/op 19 allocs/op
+BenchmarkPossum_ParamWrite 1000000 2114 ns/op 624 B/op 7 allocs/op
+BenchmarkR2router_ParamWrite 1000000 1320 ns/op 432 B/op 6 allocs/op
+BenchmarkRevel_ParamWrite 200000 8048 ns/op 2128 B/op 33 allocs/op
+BenchmarkRivet_ParamWrite 1000000 1393 ns/op 472 B/op 6 allocs/op
+BenchmarkTango_ParamWrite 2000000 819 ns/op 136 B/op 5 allocs/op
+BenchmarkTigerTonic_ParamWrite 300000 5860 ns/op 1440 B/op 25 allocs/op
+BenchmarkTraffic_ParamWrite 200000 7429 ns/op 2400 B/op 27 allocs/op
+BenchmarkVulcan_ParamWrite 2000000 972 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_ParamWrite 1000000 1226 ns/op 368 B/op 3 allocs/op
+BenchmarkAce_GithubStatic 5000000 294 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GithubStatic 3000000 575 ns/op 88 B/op 3 allocs/op
+BenchmarkBeego_GithubStatic 1000000 1561 ns/op 368 B/op 7 allocs/op
+BenchmarkBone_GithubStatic 200000 12301 ns/op 2880 B/op 60 allocs/op
+BenchmarkDenco_GithubStatic 20000000 74.6 ns/op 0 B/op 0 allocs/op
+BenchmarkEcho_GithubStatic 10000000 176 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GithubStatic 10000000 159 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GithubStatic 1000000 1116 ns/op 304 B/op 6 allocs/op
+BenchmarkGoji_GithubStatic 5000000 413 ns/op 0 B/op 0 allocs/op
+BenchmarkGoRestful_GithubStatic 30000 55200 ns/op 3520 B/op 36 allocs/op
+BenchmarkGoJsonRest_GithubStatic 1000000 1504 ns/op 337 B/op 12 allocs/op
+BenchmarkGorillaMux_GithubStatic 100000 23620 ns/op 464 B/op 8 allocs/op
+BenchmarkHttpRouter_GithubStatic 20000000 78.3 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GithubStatic 20000000 84.9 ns/op 0 B/op 0 allocs/op
+BenchmarkKocha_GithubStatic 20000000 111 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GithubStatic 1000000 2686 ns/op 752 B/op 8 allocs/op
+BenchmarkMartini_GithubStatic 100000 22244 ns/op 832 B/op 11 allocs/op
+BenchmarkPat_GithubStatic 100000 13278 ns/op 3648 B/op 76 allocs/op
+BenchmarkPossum_GithubStatic 1000000 1429 ns/op 480 B/op 4 allocs/op
+BenchmarkR2router_GithubStatic 2000000 726 ns/op 144 B/op 5 allocs/op
+BenchmarkRevel_GithubStatic 300000 6271 ns/op 1288 B/op 25 allocs/op
+BenchmarkRivet_GithubStatic 3000000 474 ns/op 112 B/op 2 allocs/op
+BenchmarkTango_GithubStatic 1000000 1842 ns/op 256 B/op 10 allocs/op
+BenchmarkTigerTonic_GithubStatic 5000000 361 ns/op 48 B/op 1 allocs/op
+BenchmarkTraffic_GithubStatic 30000 47197 ns/op 18920 B/op 149 allocs/op
+BenchmarkVulcan_GithubStatic 1000000 1415 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_GithubStatic 1000000 2522 ns/op 512 B/op 11 allocs/op
+BenchmarkAce_GithubParam 3000000 578 ns/op 96 B/op 1 allocs/op
+BenchmarkBear_GithubParam 1000000 1592 ns/op 464 B/op 5 allocs/op
+BenchmarkBeego_GithubParam 1000000 2891 ns/op 784 B/op 11 allocs/op
+BenchmarkBone_GithubParam 300000 6440 ns/op 1456 B/op 16 allocs/op
+BenchmarkDenco_GithubParam 3000000 514 ns/op 128 B/op 1 allocs/op
+BenchmarkEcho_GithubParam 5000000 292 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GithubParam 10000000 242 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GithubParam 1000000 2343 ns/op 720 B/op 10 allocs/op
+BenchmarkGoji_GithubParam 1000000 1566 ns/op 336 B/op 2 allocs/op
+BenchmarkGoJsonRest_GithubParam 1000000 2828 ns/op 721 B/op 15 allocs/op
+BenchmarkGoRestful_GithubParam 10000 177711 ns/op 2816 B/op 35 allocs/op
+BenchmarkGorillaMux_GithubParam 100000 13591 ns/op 816 B/op 9 allocs/op
+BenchmarkHttpRouter_GithubParam 5000000 352 ns/op 96 B/op 1 allocs/op
+BenchmarkHttpTreeMux_GithubParam 2000000 973 ns/op 336 B/op 2 allocs/op
+BenchmarkKocha_GithubParam 2000000 889 ns/op 128 B/op 5 allocs/op
+BenchmarkMacaron_GithubParam 500000 4047 ns/op 1168 B/op 12 allocs/op
+BenchmarkMartini_GithubParam 50000 28982 ns/op 1184 B/op 12 allocs/op
+BenchmarkPat_GithubParam 200000 8747 ns/op 2480 B/op 56 allocs/op
+BenchmarkPossum_GithubParam 1000000 2158 ns/op 624 B/op 7 allocs/op
+BenchmarkR2router_GithubParam 1000000 1352 ns/op 432 B/op 6 allocs/op
+BenchmarkRevel_GithubParam 200000 7673 ns/op 1784 B/op 30 allocs/op
+BenchmarkRivet_GithubParam 1000000 1573 ns/op 480 B/op 6 allocs/op
+BenchmarkTango_GithubParam 1000000 2418 ns/op 480 B/op 13 allocs/op
+BenchmarkTigerTonic_GithubParam 300000 6048 ns/op 1440 B/op 28 allocs/op
+BenchmarkTraffic_GithubParam 100000 20143 ns/op 6024 B/op 55 allocs/op
+BenchmarkVulcan_GithubParam 1000000 2224 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_GithubParam 500000 4156 ns/op 1312 B/op 12 allocs/op
+BenchmarkAce_GithubAll 10000 109482 ns/op 13792 B/op 167 allocs/op
+BenchmarkBear_GithubAll 10000 287490 ns/op 79952 B/op 943 allocs/op
+BenchmarkBeego_GithubAll 3000 562184 ns/op 146272 B/op 2092 allocs/op
+BenchmarkBone_GithubAll 500 2578716 ns/op 648016 B/op 8119 allocs/op
+BenchmarkDenco_GithubAll 20000 94955 ns/op 20224 B/op 167 allocs/op
+BenchmarkEcho_GithubAll 30000 58705 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GithubAll 30000 50991 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GithubAll 5000 449648 ns/op 133280 B/op 1889 allocs/op
+BenchmarkGoji_GithubAll 2000 689748 ns/op 56113 B/op 334 allocs/op
+BenchmarkGoJsonRest_GithubAll 5000 537769 ns/op 135995 B/op 2940 allocs/op
+BenchmarkGoRestful_GithubAll 100 18410628 ns/op 797236 B/op 7725 allocs/op
+BenchmarkGorillaMux_GithubAll 200 8036360 ns/op 153137 B/op 1791 allocs/op
+BenchmarkHttpRouter_GithubAll 20000 63506 ns/op 13792 B/op 167 allocs/op
+BenchmarkHttpTreeMux_GithubAll 10000 165927 ns/op 56112 B/op 334 allocs/op
+BenchmarkKocha_GithubAll 10000 171362 ns/op 23304 B/op 843 allocs/op
+BenchmarkMacaron_GithubAll 2000 817008 ns/op 224960 B/op 2315 allocs/op
+BenchmarkMartini_GithubAll 100 12609209 ns/op 237952 B/op 2686 allocs/op
+BenchmarkPat_GithubAll 300 4830398 ns/op 1504101 B/op 32222 allocs/op
+BenchmarkPossum_GithubAll 10000 301716 ns/op 97440 B/op 812 allocs/op
+BenchmarkR2router_GithubAll 10000 270691 ns/op 77328 B/op 1182 allocs/op
+BenchmarkRevel_GithubAll 1000 1491919 ns/op 345553 B/op 5918 allocs/op
+BenchmarkRivet_GithubAll 10000 283860 ns/op 84272 B/op 1079 allocs/op
+BenchmarkTango_GithubAll 5000 473821 ns/op 87078 B/op 2470 allocs/op
+BenchmarkTigerTonic_GithubAll 2000 1120131 ns/op 241088 B/op 6052 allocs/op
+BenchmarkTraffic_GithubAll 200 8708979 ns/op 2664762 B/op 22390 allocs/op
+BenchmarkVulcan_GithubAll 5000 353392 ns/op 19894 B/op 609 allocs/op
+BenchmarkZeus_GithubAll 2000 944234 ns/op 300688 B/op 2648 allocs/op
+BenchmarkAce_GPlusStatic 5000000 251 ns/op 0 B/op 0 allocs/op
+BenchmarkBear_GPlusStatic 3000000 415 ns/op 72 B/op 3 allocs/op
+BenchmarkBeego_GPlusStatic 1000000 1416 ns/op 352 B/op 7 allocs/op
+BenchmarkBone_GPlusStatic 10000000 192 ns/op 32 B/op 1 allocs/op
+BenchmarkDenco_GPlusStatic 30000000 47.6 ns/op 0 B/op 0 allocs/op
+BenchmarkEcho_GPlusStatic 10000000 131 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GPlusStatic 10000000 131 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GPlusStatic 1000000 1035 ns/op 288 B/op 6 allocs/op
+BenchmarkGoji_GPlusStatic 5000000 304 ns/op 0 B/op 0 allocs/op
+BenchmarkGoJsonRest_GPlusStatic 1000000 1286 ns/op 337 B/op 12 allocs/op
+BenchmarkGoRestful_GPlusStatic 200000 9649 ns/op 2160 B/op 30 allocs/op
+BenchmarkGorillaMux_GPlusStatic 1000000 2346 ns/op 464 B/op 8 allocs/op
+BenchmarkHttpRouter_GPlusStatic 30000000 42.7 ns/op 0 B/op 0 allocs/op
+BenchmarkHttpTreeMux_GPlusStatic 30000000 49.5 ns/op 0 B/op 0 allocs/op
+BenchmarkKocha_GPlusStatic 20000000 74.8 ns/op 0 B/op 0 allocs/op
+BenchmarkMacaron_GPlusStatic 1000000 2520 ns/op 736 B/op 8 allocs/op
+BenchmarkMartini_GPlusStatic 300000 5310 ns/op 832 B/op 11 allocs/op
+BenchmarkPat_GPlusStatic 5000000 398 ns/op 96 B/op 2 allocs/op
+BenchmarkPossum_GPlusStatic 1000000 1434 ns/op 480 B/op 4 allocs/op
+BenchmarkR2router_GPlusStatic 2000000 646 ns/op 144 B/op 5 allocs/op
+BenchmarkRevel_GPlusStatic 300000 6172 ns/op 1272 B/op 25 allocs/op
+BenchmarkRivet_GPlusStatic 3000000 444 ns/op 112 B/op 2 allocs/op
+BenchmarkTango_GPlusStatic 1000000 1400 ns/op 208 B/op 10 allocs/op
+BenchmarkTigerTonic_GPlusStatic 10000000 213 ns/op 32 B/op 1 allocs/op
+BenchmarkTraffic_GPlusStatic 1000000 3091 ns/op 1208 B/op 16 allocs/op
+BenchmarkVulcan_GPlusStatic 2000000 863 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_GPlusStatic 10000000 237 ns/op 16 B/op 1 allocs/op
+BenchmarkAce_GPlusParam 3000000 435 ns/op 64 B/op 1 allocs/op
+BenchmarkBear_GPlusParam 1000000 1205 ns/op 448 B/op 5 allocs/op
+BenchmarkBeego_GPlusParam 1000000 2494 ns/op 720 B/op 10 allocs/op
+BenchmarkBone_GPlusParam 1000000 1126 ns/op 384 B/op 3 allocs/op
+BenchmarkDenco_GPlusParam 5000000 325 ns/op 64 B/op 1 allocs/op
+BenchmarkEcho_GPlusParam 10000000 168 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GPlusParam 10000000 170 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GPlusParam 1000000 1895 ns/op 656 B/op 9 allocs/op
+BenchmarkGoji_GPlusParam 1000000 1071 ns/op 336 B/op 2 allocs/op
+BenchmarkGoJsonRest_GPlusParam 1000000 2282 ns/op 657 B/op 14 allocs/op
+BenchmarkGoRestful_GPlusParam 100000 19400 ns/op 2560 B/op 33 allocs/op
+BenchmarkGorillaMux_GPlusParam 500000 5001 ns/op 784 B/op 9 allocs/op
+BenchmarkHttpRouter_GPlusParam 10000000 240 ns/op 64 B/op 1 allocs/op
+BenchmarkHttpTreeMux_GPlusParam 2000000 797 ns/op 336 B/op 2 allocs/op
+BenchmarkKocha_GPlusParam 3000000 505 ns/op 56 B/op 3 allocs/op
+BenchmarkMacaron_GPlusParam 1000000 3668 ns/op 1104 B/op 11 allocs/op
+BenchmarkMartini_GPlusParam 200000 10672 ns/op 1152 B/op 12 allocs/op
+BenchmarkPat_GPlusParam 1000000 2376 ns/op 704 B/op 14 allocs/op
+BenchmarkPossum_GPlusParam 1000000 2090 ns/op 624 B/op 7 allocs/op
+BenchmarkR2router_GPlusParam 1000000 1233 ns/op 432 B/op 6 allocs/op
+BenchmarkRevel_GPlusParam 200000 6778 ns/op 1704 B/op 28 allocs/op
+BenchmarkRivet_GPlusParam 1000000 1279 ns/op 464 B/op 5 allocs/op
+BenchmarkTango_GPlusParam 1000000 1981 ns/op 272 B/op 10 allocs/op
+BenchmarkTigerTonic_GPlusParam 500000 3893 ns/op 1064 B/op 19 allocs/op
+BenchmarkTraffic_GPlusParam 200000 6585 ns/op 2000 B/op 23 allocs/op
+BenchmarkVulcan_GPlusParam 1000000 1233 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_GPlusParam 1000000 1350 ns/op 368 B/op 3 allocs/op
+BenchmarkAce_GPlus2Params 3000000 512 ns/op 64 B/op 1 allocs/op
+BenchmarkBear_GPlus2Params 1000000 1564 ns/op 464 B/op 5 allocs/op
+BenchmarkBeego_GPlus2Params 1000000 3043 ns/op 784 B/op 11 allocs/op
+BenchmarkBone_GPlus2Params 1000000 3152 ns/op 736 B/op 7 allocs/op
+BenchmarkDenco_GPlus2Params 3000000 431 ns/op 64 B/op 1 allocs/op
+BenchmarkEcho_GPlus2Params 5000000 247 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GPlus2Params 10000000 219 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GPlus2Params 1000000 2363 ns/op 720 B/op 10 allocs/op
+BenchmarkGoji_GPlus2Params 1000000 1540 ns/op 336 B/op 2 allocs/op
+BenchmarkGoJsonRest_GPlus2Params 1000000 2872 ns/op 721 B/op 15 allocs/op
+BenchmarkGoRestful_GPlus2Params 100000 23030 ns/op 2720 B/op 35 allocs/op
+BenchmarkGorillaMux_GPlus2Params 200000 10516 ns/op 816 B/op 9 allocs/op
+BenchmarkHttpRouter_GPlus2Params 5000000 273 ns/op 64 B/op 1 allocs/op
+BenchmarkHttpTreeMux_GPlus2Params 2000000 939 ns/op 336 B/op 2 allocs/op
+BenchmarkKocha_GPlus2Params 2000000 844 ns/op 128 B/op 5 allocs/op
+BenchmarkMacaron_GPlus2Params 500000 3914 ns/op 1168 B/op 12 allocs/op
+BenchmarkMartini_GPlus2Params 50000 35759 ns/op 1280 B/op 16 allocs/op
+BenchmarkPat_GPlus2Params 200000 7089 ns/op 2304 B/op 41 allocs/op
+BenchmarkPossum_GPlus2Params 1000000 2093 ns/op 624 B/op 7 allocs/op
+BenchmarkR2router_GPlus2Params 1000000 1320 ns/op 432 B/op 6 allocs/op
+BenchmarkRevel_GPlus2Params 200000 7351 ns/op 1800 B/op 30 allocs/op
+BenchmarkRivet_GPlus2Params 1000000 1485 ns/op 480 B/op 6 allocs/op
+BenchmarkTango_GPlus2Params 1000000 2111 ns/op 448 B/op 12 allocs/op
+BenchmarkTigerTonic_GPlus2Params 300000 6271 ns/op 1528 B/op 28 allocs/op
+BenchmarkTraffic_GPlus2Params 100000 14886 ns/op 3312 B/op 34 allocs/op
+BenchmarkVulcan_GPlus2Params 1000000 1883 ns/op 98 B/op 3 allocs/op
+BenchmarkZeus_GPlus2Params 1000000 2686 ns/op 784 B/op 6 allocs/op
+BenchmarkAce_GPlusAll 300000 5912 ns/op 640 B/op 11 allocs/op
+BenchmarkBear_GPlusAll 100000 16448 ns/op 5072 B/op 61 allocs/op
+BenchmarkBeego_GPlusAll 50000 32916 ns/op 8976 B/op 129 allocs/op
+BenchmarkBone_GPlusAll 50000 25836 ns/op 6992 B/op 76 allocs/op
+BenchmarkDenco_GPlusAll 500000 4462 ns/op 672 B/op 11 allocs/op
+BenchmarkEcho_GPlusAll 500000 2806 ns/op 0 B/op 0 allocs/op
+BenchmarkGin_GPlusAll 500000 2579 ns/op 0 B/op 0 allocs/op
+BenchmarkGocraftWeb_GPlusAll 50000 25223 ns/op 8144 B/op 116 allocs/op
+BenchmarkGoji_GPlusAll 100000 14237 ns/op 3696 B/op 22 allocs/op
+BenchmarkGoJsonRest_GPlusAll 50000 29227 ns/op 8221 B/op 183 allocs/op
+BenchmarkGoRestful_GPlusAll 10000 203144 ns/op 36064 B/op 441 allocs/op
+BenchmarkGorillaMux_GPlusAll 20000 80906 ns/op 9712 B/op 115 allocs/op
+BenchmarkHttpRouter_GPlusAll 500000 3040 ns/op 640 B/op 11 allocs/op
+BenchmarkHttpTreeMux_GPlusAll 200000 9627 ns/op 3696 B/op 22 allocs/op
+BenchmarkKocha_GPlusAll 200000 8108 ns/op 976 B/op 43 allocs/op
+BenchmarkMacaron_GPlusAll 30000 48083 ns/op 13968 B/op 142 allocs/op
+BenchmarkMartini_GPlusAll 10000 196978 ns/op 15072 B/op 178 allocs/op
+BenchmarkPat_GPlusAll 30000 58865 ns/op 16880 B/op 343 allocs/op
+BenchmarkPossum_GPlusAll 100000 19685 ns/op 6240 B/op 52 allocs/op
+BenchmarkR2router_GPlusAll 100000 16251 ns/op 5040 B/op 76 allocs/op
+BenchmarkRevel_GPlusAll 20000 93489 ns/op 21656 B/op 368 allocs/op
+BenchmarkRivet_GPlusAll 100000 16907 ns/op 5408 B/op 64 allocs/op
+```
\ No newline at end of file
diff --git a/vendor/github.com/gin-gonic/gin/CHANGELOG.md b/vendor/github.com/gin-gonic/gin/CHANGELOG.md
index 9fc548ec3..5b5b6addf 100644
--- a/vendor/github.com/gin-gonic/gin/CHANGELOG.md
+++ b/vendor/github.com/gin-gonic/gin/CHANGELOG.md
@@ -1,13 +1,50 @@
-#Changelog
+#CHANGELOG
-###Gin 1.0 (...)
+###Gin 1.0rc2 (...)
+
+- [PERFORMANCE] Fast path for writting Content-Type.
+- [PERFORMANCE] Much faster 404 routing
+- [PERFORMANCE] Allocation optimizations
+- [PERFORMANCE] Faster root tree lookup
+- [PERFORMANCE] Zero overhead, String() and JSON() rendering.
+- [PERFORMANCE] Faster ClientIP parsing
+- [PERFORMANCE] Much faster SSE implementation
+- [NEW] Benchmarks suite
+- [NEW] Bind validation can be disabled and replaced with custom validators.
+- [NEW] More flexible HTML render
+- [NEW] Multipart and PostForm bindings
+- [NEW] Adds method to return all the registered routes
+- [NEW] Context.HandlerName() returns the main handler's name
+- [NEW] Adds Error.IsType() helper
+- [FIX] Binding multipart form
+- [FIX] Integration tests
+- [FIX] Crash when binding non struct object in Context.
+- [FIX] RunTLS() implementation
+- [FIX] Logger() unit tests
+- [FIX] Adds SetHTMLTemplate() warning
+- [FIX] Context.IsAborted()
+- [FIX] More unit tests
+- [FIX] JSON, XML, HTML renders accept custom content-types
+- [FIX] gin.AbortIndex is unexported
+- [FIX] Better approach to avoid directory listing in StaticFS()
+- [FIX] Context.ClientIP() always returns the IP with trimmed spaces.
+- [FIX] Better warning when running in debug mode.
+- [FIX] Google App Engine integration. debugPrint does not use os.Stdout
+- [FIX] Fixes integer overflow in error type
+- [FIX] Error implements the json.Marshaller interface
+- [FIX] MIT license in every file
+
+
+###Gin 1.0rc1 (May 22, 2015)
- [PERFORMANCE] Zero allocation router
- [PERFORMANCE] Faster JSON, XML and text rendering
- [PERFORMANCE] Custom hand optimized HttpRouter for Gin
- [PERFORMANCE] Misc code optimizations. Inlining, tail call optimizations
+- [NEW] Built-in support for golang.org/x/net/context
- [NEW] Any(path, handler). Create a route that matches any path
- [NEW] Refactored rendering pipeline (faster and static typeded)
+- [NEW] Refactored errors API
- [NEW] IndentedJSON() prints pretty JSON
- [NEW] Added gin.DefaultWriter
- [NEW] UNIX socket support
@@ -15,6 +52,8 @@
- [NEW] JSON validation using go-validate-yourself (very powerful options)
- [NEW] Completed suite of unit tests
- [NEW] HTTP streaming with c.Stream()
+- [NEW] StaticFile() creates a router for serving just one file.
+- [NEW] StaticFS() has an option to disable directory listing.
- [NEW] StaticFS() for serving static files through virtual filesystems
- [NEW] Server-Sent Events native support
- [NEW] WrapF() and WrapH() helpers for wrapping http.HandlerFunc and http.Handler
@@ -28,10 +67,11 @@
- [FIX] Redirect using built-in http.Redirect()
- [FIX] Logger when printing the requested path
- [FIX] Documentation typos
+- [FIX] Context.Engine renamed to Context.engine
- [FIX] Better debugging messages
- [FIX] ErrorLogger
- [FIX] Debug HTTP render
-- [FIX] Refactored binding and render modules
+- [FIX] Refactored binding and render modules
- [FIX] Refactored Context initialization
- [FIX] Refactored BasicAuth()
- [FIX] NoMethod/NoRoute handlers
diff --git a/vendor/github.com/gin-gonic/gin/Godeps/Godeps.json b/vendor/github.com/gin-gonic/gin/Godeps/Godeps.json
index 5760d4278..ebda5138a 100644
--- a/vendor/github.com/gin-gonic/gin/Godeps/Godeps.json
+++ b/vendor/github.com/gin-gonic/gin/Godeps/Godeps.json
@@ -1,27 +1,39 @@
{
"ImportPath": "github.com/gin-gonic/gin",
"GoVersion": "go1.4.2",
+ "Packages": [
+ "./..."
+ ],
"Deps": [
+ {
+ "ImportPath": "github.com/dustin/go-broadcast",
+ "Rev": "3bdf6d4a7164a50bc19d5f230e2981d87d2584f1"
+ },
{
"ImportPath": "github.com/manucorporat/sse",
- "Rev": "c574f6c50c8594f93d28b03a1bbd87b4a3899093"
+ "Rev": "c142f0f1baea5cef7f98a8a6c222f6134368c1f5"
+ },
+ {
+ "ImportPath": "github.com/manucorporat/stats",
+ "Rev": "8f2d6ace262eba462e9beb552382c98be51d807b"
},
{
"ImportPath": "github.com/mattn/go-colorable",
- "Rev": "043ae16291351db8465272edf465c9f388161627"
+ "Rev": "d67e0b7d1797975196499f79bcc322c08b9f218b"
},
{
"ImportPath": "github.com/stretchr/testify/assert",
- "Rev": "de7fcff264cd05cc0c90c509ea789a436a0dd206"
+ "Comment": "v1.0",
+ "Rev": "232e8563676cd15c3a36ba5e675ad4312ac4cb11"
},
{
"ImportPath": "golang.org/x/net/context",
- "Rev": "84ba27dd5b2d8135e9da1395277f2c9333a2ffda"
+ "Rev": "621fff363a1d9ad7fdd0bfa9d80a42881267deb4"
},
{
- "ImportPath": "gopkg.in/joeybloggs/go-validate-yourself.v4",
- "Comment": "v4.0",
- "Rev": "a3cb430fa1e43b15e72d7bec5b20d0bdff4c2bb8"
+ "ImportPath": "gopkg.in/bluesuncorp/validator.v5",
+ "Comment": "v5.4",
+ "Rev": "07cbdd2e6dfd947b002e83c13b775c7580fab2d5"
}
]
}
diff --git a/vendor/github.com/gin-gonic/gin/README.md b/vendor/github.com/gin-gonic/gin/README.md
index c8fe60e30..e83952d68 100644
--- a/vendor/github.com/gin-gonic/gin/README.md
+++ b/vendor/github.com/gin-gonic/gin/README.md
@@ -1,8 +1,14 @@
-#Gin Web Framework [](https://travis-ci.org/gin-gonic/gin) [](https://coveralls.io/r/gin-gonic/gin?branch=develop)
- [](https://godoc.org/github.com/gin-gonic/gin) [](https://gitter.im/gin-gonic/gin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+#Gin Web Framework
+
+[](https://travis-ci.org/gin-gonic/gin)
+[](https://coveralls.io/r/gin-gonic/gin?branch=master)
+[](https://godoc.org/github.com/gin-gonic/gin)
+[](https://gitter.im/gin-gonic/gin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+Gin is a web framework written in Golang. It features a martini-like API with much better performance, up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin.
+
-Gin is a web framework written in Golang. It features a martini-like API with much better performance, up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin.

@@ -12,105 +18,100 @@ $ cat test.go
```go
package main
-import (
- "net/http"
- "github.com/gin-gonic/gin"
-)
+import "github.com/gin-gonic/gin"
func main() {
- router := gin.Default()
- router.GET("/", func(c *gin.Context) {
- c.String(http.StatusOK, "hello world")
+ r := gin.Default()
+ r.GET("/ping", func(c *gin.Context) {
+ c.String(200, "pong")
})
- router.GET("/ping", func(c *gin.Context) {
- c.String(http.StatusOK, "pong")
- })
- router.POST("/submit", func(c *gin.Context) {
- c.String(http.StatusUnauthorized, "not authorized")
- })
- router.PUT("/error", func(c *gin.Context) {
- c.String(http.StatusInternalServerError, "an error happened :(")
- })
- router.Run(":8080")
+ r.Run(":8080") // listen and serve on 0.0.0.0:8080
}
```
-##Gin is new, will it be supported?
+## Benchmarks
-Yes, Gin is an internal tool of [Manu](https://github.com/manucorporat) and [Javi](https://github.com/javierprovecho) for many of our projects/start-ups. We developed it and we are going to continue using and improve it.
+Gin uses a custom version of [HttpRouter](https://github.com/julienschmidt/httprouter)
+
+[See all benchmarks](/BENCHMARKS.md)
-##Roadmap for v1.0
-- [ ] Ask our designer for a cool logo
-- [ ] Add tons of unit tests
-- [ ] Add internal benchmarks suite
-- [ ] More powerful validation API
-- [ ] Improve documentation
-- [ ] Add Swagger support
-- [x] Stable API
-- [x] Improve logging system
-- [x] Improve JSON/XML validation using bindings
-- [x] Improve XML support
-- [x] Flexible rendering system
-- [x] Add more cool middlewares, for example redis caching (this also helps developers to understand the framework).
-- [x] Continuous integration
-- [x] Performance improments, reduce allocation and garbage collection overhead
-- [x] Fix bugs
+Benchmark name | (1) | (2) | (3) | (4)
+--------------------------------|----------:|----------:|----------:|------:
+BenchmarkAce_GithubAll | 10000 | 109482 | 13792 | 167
+BenchmarkBear_GithubAll | 10000 | 287490 | 79952 | 943
+BenchmarkBeego_GithubAll | 3000 | 562184 | 146272 | 2092
+BenchmarkBone_GithubAll | 500 | 2578716 | 648016 | 8119
+BenchmarkDenco_GithubAll | 20000 | 94955 | 20224 | 167
+BenchmarkEcho_GithubAll | 30000 | 58705 | 0 | 0
+**BenchmarkGin_GithubAll** | **30000** | **50991** | **0** | **0**
+BenchmarkGocraftWeb_GithubAll | 5000 | 449648 | 133280 | 1889
+BenchmarkGoji_GithubAll | 2000 | 689748 | 56113 | 334
+BenchmarkGoJsonRest_GithubAll | 5000 | 537769 | 135995 | 2940
+BenchmarkGoRestful_GithubAll | 100 | 18410628 | 797236 | 7725
+BenchmarkGorillaMux_GithubAll | 200 | 8036360 | 153137 | 1791
+BenchmarkHttpRouter_GithubAll | 20000 | 63506 | 13792 | 167
+BenchmarkHttpTreeMux_GithubAll | 10000 | 165927 | 56112 | 334
+BenchmarkKocha_GithubAll | 10000 | 171362 | 23304 | 843
+BenchmarkMacaron_GithubAll | 2000 | 817008 | 224960 | 2315
+BenchmarkMartini_GithubAll | 100 | 12609209 | 237952 | 2686
+BenchmarkPat_GithubAll | 300 | 4830398 | 1504101 | 32222
+BenchmarkPossum_GithubAll | 10000 | 301716 | 97440 | 812
+BenchmarkR2router_GithubAll | 10000 | 270691 | 77328 | 1182
+BenchmarkRevel_GithubAll | 1000 | 1491919 | 345553 | 5918
+BenchmarkRivet_GithubAll | 10000 | 283860 | 84272 | 1079
+BenchmarkTango_GithubAll | 5000 | 473821 | 87078 | 2470
+BenchmarkTigerTonic_GithubAll | 2000 | 1120131 | 241088 | 6052
+BenchmarkTraffic_GithubAll | 200 | 8708979 | 2664762 | 22390
+BenchmarkVulcan_GithubAll | 5000 | 353392 | 19894 | 609
+BenchmarkZeus_GithubAll | 2000 | 944234 | 300688 | 2648
+(1): Total Repetitions
+(2): Single Repetition Duration (ns/op)
+(3): Heap Memory (B/op)
+(4): Average Allocations per Repetition (allocs/op)
+
+##Gin v1. stable
+
+- [x] Zero allocation router.
+- [x] Still the fastest http router and framework. From routing to writing.
+- [x] Complete suite of unit tests
+- [x] Battle tested
+- [x] API frozen, new releases will not break your code.
## Start using it
-Obviously, you need to have Git and Go already installed to run Gin.
-Run this in your terminal
+1. Download and install it:
-```
+```sh
go get github.com/gin-gonic/gin
```
-Then import it in your Go code:
+2. Import it in your code:
-```
+```go
import "github.com/gin-gonic/gin"
```
##API Examples
-#### Create most basic PING/PONG HTTP endpoint
-```go
-package main
-
-import (
- "net/http"
- "github.com/gin-gonic/gin"
-)
-
-func main() {
- r := gin.Default()
- r.GET("/ping", func(c *gin.Context) {
- c.String(http.StatusOK, "pong")
- })
-
- // Listen and serve on 0.0.0.0:8080
- r.Run(":8080")
-}
-```
-
#### Using GET, POST, PUT, PATCH, DELETE and OPTIONS
```go
func main() {
- // Creates a gin router + logger and recovery (crash-free) middlewares
- r := gin.Default()
+ // Creates a gin router with default middleware:
+ // logger and recovery (crash-free) middleware
+ router := gin.Default()
- r.GET("/someGet", getting)
- r.POST("/somePost", posting)
- r.PUT("/somePut", putting)
- r.DELETE("/someDelete", deleting)
- r.PATCH("/somePatch", patching)
- r.HEAD("/someHead", head)
- r.OPTIONS("/someOptions", options)
+ router.GET("/someGet", getting)
+ router.POST("/somePost", posting)
+ router.PUT("/somePut", putting)
+ router.DELETE("/someDelete", deleting)
+ router.PATCH("/somePatch", patching)
+ router.HEAD("/someHead", head)
+ router.OPTIONS("/someOptions", options)
// Listen and server on 0.0.0.0:8080
- r.Run(":8080")
+ router.Run(":8080")
}
```
@@ -118,96 +119,100 @@ func main() {
```go
func main() {
- r := gin.Default()
-
+ router := gin.Default()
+
// This handler will match /user/john but will not match neither /user/ or /user
- r.GET("/user/:name", func(c *gin.Context) {
- name := c.Params.ByName("name")
- message := "Hello "+name
- c.String(http.StatusOK, message)
+ router.GET("/user/:name", func(c *gin.Context) {
+ name := c.Param("name")
+ c.String(http.StatusOK, "Hello %s", name)
})
// However, this one will match /user/john/ and also /user/john/send
// If no other routers match /user/john, it will redirect to /user/join/
- r.GET("/user/:name/*action", func(c *gin.Context) {
- name := c.Params.ByName("name")
- action := c.Params.ByName("action")
+ router.GET("/user/:name/*action", func(c *gin.Context) {
+ name := c.Param("name")
+ action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
})
-
- // Listen and server on 0.0.0.0:8080
- r.Run(":8080")
+
+ router.Run(":8080")
}
```
-###Form parameters
+
+#### Querystring parameters
```go
func main() {
- r := gin.Default()
-
- // This will respond to urls like search?firstname=Jane&lastname=Doe
- r.GET("/search", func(c *gin.Context) {
- // You need to call ParseForm() on the request to receive url and form params first
- c.Request.ParseForm()
-
- firstname := c.Request.Form.Get("firstname")
- lastname := c.Request.Form.Get("lastname")
+ router := gin.Default()
- message := "Hello "+ firstname + lastname
- c.String(http.StatusOK, message)
- })
- r.Run(":8080")
+ // Query string parameters are parsed using the existing underlying request object.
+ // The request responds to a url matching: /welcome?firstname=Jane&lastname=Doe
+ router.GET("/welcome", func(c *gin.Context) {
+ firstname := c.DefaultQuery("firstname", "Guest")
+ lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname")
+
+ c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
+ })
+ router.Run(":8080")
}
```
-###Multipart Form
+### Multipart/Urlencoded Form
+
```go
-package main
-
-import (
- "github.com/gin-gonic/gin"
- "github.com/gin-gonic/gin/binding"
-)
-
-type LoginForm struct {
- User string `form:"user" binding:"required"`
- Password string `form:"password" binding:"required"`
-}
-
func main() {
+ router := gin.Default()
- r := gin.Default()
-
- r.POST("/login", func(c *gin.Context) {
-
- var form LoginForm
- c.BindWith(&form, binding.MultipartForm)
-
- if form.User == "user" && form.Password == "password" {
- c.JSON(200, gin.H{"status": "you are logged in"})
- } else {
- c.JSON(401, gin.H{"status": "unauthorized"})
- }
-
- })
-
- r.Run(":8080")
+ router.POST("/form_post", func(c *gin.Context) {
+ message := c.PostForm("message")
+ nick := c.DefaultPostForm("nick", "anonymous")
+ c.JSON(200, gin.H{
+ "status": "posted",
+ "message": message,
+ })
+ })
+ router.Run(":8080")
}
```
-Test it with:
-```bash
-$ curl -v --form user=user --form password=password http://localhost:8080/login
+### Another example: query + post form
+
```
+POST /post?id=1234&page=1 HTTP/1.1
+Content-Type: application/x-www-form-urlencoded
+
+name=manu&message=this_is_great
+```
+
+```go
+func main() {
+ router := gin.Default()
+
+ router.POST("/post", func(c *gin.Context) {
+ id := c.Query("id")
+ page := c.DefaultQuery("id", "0")
+ name := c.PostForm("name")
+ message := c.PostForm("message")
+
+ fmt.Println("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
+ })
+ router.Run(":8080")
+}
+```
+
+```
+id: 1234; page: 0; name: manu; message: this_is_great
+```
+
#### Grouping routes
```go
func main() {
- r := gin.Default()
+ router := gin.Default()
// Simple group: v1
- v1 := r.Group("/v1")
+ v1 := router.Group("/v1")
{
v1.POST("/login", loginEndpoint)
v1.POST("/submit", submitEndpoint)
@@ -215,20 +220,19 @@ func main() {
}
// Simple group: v2
- v2 := r.Group("/v2")
+ v2 := router.Group("/v2")
{
v2.POST("/login", loginEndpoint)
v2.POST("/submit", submitEndpoint)
v2.POST("/read", readEndpoint)
}
- // Listen and server on 0.0.0.0:8080
- r.Run(":8080")
+ router.Run(":8080")
}
```
-#### Blank Gin without middlewares by default
+#### Blank Gin without middleware by default
Use
@@ -242,24 +246,24 @@ r := gin.Default()
```
-#### Using middlewares
+#### Using middleware
```go
func main() {
// Creates a router without any middleware by default
r := gin.New()
- // Global middlewares
+ // Global middleware
r.Use(gin.Logger())
r.Use(gin.Recovery())
- // Per route middlewares, you can add as many as you desire.
+ // Per route middleware, you can add as many as you desire.
r.GET("/benchmark", MyBenchLogger(), benchEndpoint)
// Authorization group
// authorized := r.Group("/", AuthRequired())
// exactly the same than:
authorized := r.Group("/")
- // per group middlewares! in this case we use the custom created
+ // per group middleware! in this case we use the custom created
// AuthRequired() middleware just in the "authorized" group.
authorized.Use(AuthRequired())
{
@@ -283,55 +287,91 @@ To bind a request body into a type, use model binding. We currently support bind
Note that you need to set the corresponding binding tag on all fields you want to bind. For example, when binding from JSON, set `json:"fieldname"`.
-When using the Bind-method, Gin tries to infer the binder depending on the Content-Type header. If you are sure what you are binding, you can use BindWith.
+When using the Bind-method, Gin tries to infer the binder depending on the Content-Type header. If you are sure what you are binding, you can use BindWith.
You can also specify that specific fields are required. If a field is decorated with `binding:"required"` and has a empty value when binding, the current request will fail with an error.
```go
// Binding from JSON
-type LoginJSON struct {
- User string `json:"user" binding:"required"`
- Password string `json:"password" binding:"required"`
-}
-
-// Binding from form values
-type LoginForm struct {
- User string `form:"user" binding:"required"`
- Password string `form:"password" binding:"required"`
+type Login struct {
+ User string `form:"user" json:"user" binding:"required"`
+ Password string `form:"password" json:"password" binding:"required"`
}
func main() {
- r := gin.Default()
+ router := gin.Default()
// Example for binding JSON ({"user": "manu", "password": "123"})
- r.POST("/loginJSON", func(c *gin.Context) {
- var json LoginJSON
-
- c.Bind(&json) // This will infer what binder to use depending on the content-type header.
- if json.User == "manu" && json.Password == "123" {
- c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
- } else {
- c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
+ router.POST("/loginJSON", func(c *gin.Context) {
+ var json Login
+ if c.BindJSON(&json) == nil {
+ if json.User == "manu" && json.Password == "123" {
+ c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
+ } else {
+ c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
+ }
}
})
// Example for binding a HTML form (user=manu&password=123)
- r.POST("/loginHTML", func(c *gin.Context) {
- var form LoginForm
-
- c.BindWith(&form, binding.Form) // You can also specify which binder to use. We support binding.Form, binding.JSON and binding.XML.
- if form.User == "manu" && form.Password == "123" {
- c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
- } else {
- c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
+ router.POST("/loginForm", func(c *gin.Context) {
+ var form Login
+ // This will infer what binder to use depending on the content-type header.
+ if c.Bind(&form) == nil {
+ if form.User == "manu" && form.Password == "123" {
+ c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
+ } else {
+ c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
+ }
}
})
// Listen and server on 0.0.0.0:8080
- r.Run(":8080")
+ router.Run(":8080")
}
```
+
+###Multipart/Urlencoded binding
+```go
+package main
+
+import (
+ "github.com/gin-gonic/gin"
+ "github.com/gin-gonic/gin/binding"
+)
+
+type LoginForm struct {
+ User string `form:"user" binding:"required"`
+ Password string `form:"password" binding:"required"`
+}
+
+func main() {
+ router := gin.Default()
+ router.POST("/login", func(c *gin.Context) {
+ // you can bind multipart form with explicit binding declaration:
+ // c.BindWith(&form, binding.Form)
+ // or you can simply use autobinding with Bind method:
+ var form LoginForm
+ // in this case proper binding will be automatically selected
+ if c.Bind(&form) == nil {
+ if form.User == "user" && form.Password == "password" {
+ c.JSON(200, gin.H{"status": "you are logged in"})
+ } else {
+ c.JSON(401, gin.H{"status": "unauthorized"})
+ }
+ }
+ })
+ router.Run(":8080")
+}
+```
+
+Test it with:
+```bash
+$ curl -v --form user=user --form password=password http://localhost:8080/login
+```
+
+
#### XML and JSON rendering
```go
@@ -368,48 +408,41 @@ func main() {
```
####Serving static files
-Use Engine.ServeFiles(path string, root http.FileSystem):
```go
func main() {
- r := gin.Default()
- r.Static("/assets", "./assets")
+ router := gin.Default()
+ router.Static("/assets", "./assets")
+ router.StaticFS("/more_static", http.Dir("my_file_system"))
+ router.StaticFile("/favicon.ico", "./resources/favicon.ico")
// Listen and server on 0.0.0.0:8080
- r.Run(":8080")
+ router.Run(":8080")
}
```
-Use the following example to serve static files at top level route of your domain. Files are being served from directory ./html.
-
-```
-r := gin.Default()
-r.Use(static.Serve("/", static.LocalFile("html", false)))
-```
-
-Note: this will use `httpNotFound` instead of the Router's `NotFound` handler.
-
####HTML rendering
Using LoadHTMLTemplates()
```go
func main() {
- r := gin.Default()
- r.LoadHTMLGlob("templates/*")
- r.GET("/index", func(c *gin.Context) {
- obj := gin.H{"title": "Main website"}
- c.HTML(http.StatusOK, "index.tmpl", obj)
+ router := gin.Default()
+ router.LoadHTMLGlob("templates/*")
+ //router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")
+ router.GET("/index", func(c *gin.Context) {
+ c.HTML(http.StatusOK, "index.tmpl", gin.H{
+ "title": "Main website",
+ })
})
-
- // Listen and server on 0.0.0.0:8080
- r.Run(":8080")
+ router.Run(":8080")
}
```
```html
-
+
{{ .title }}
+
```
You can also use your own html template render
@@ -418,41 +451,13 @@ You can also use your own html template render
import "html/template"
func main() {
- r := gin.Default()
+ router := gin.Default()
html := template.Must(template.ParseFiles("file1", "file2"))
- r.SetHTMLTemplate(html)
-
- // Listen and server on 0.0.0.0:8080
- r.Run(":8080")
+ router.SetHTMLTemplate(html)
+ router.Run(":8080")
}
```
-#####Using layout files with templates
-```go
-var baseTemplate = "main.tmpl"
-
-r.GET("/", func(c *gin.Context) {
- r.SetHTMLTemplate(template.Must(template.ParseFiles(baseTemplate, "whatever.tmpl")))
- c.HTML(200, "base", data)
-})
-```
-main.tmpl
-```html
-{{define "base"}}
-
-
-
- {{template "content" .}}
-
-
-{{end}}
-```
-whatever.tmpl
-```html
-{{define "content"}}
-Hello World!
-{{end}}
-```
#### Redirects
@@ -466,7 +471,7 @@ r.GET("/test", func(c *gin.Context) {
Both internal and external locations are supported.
-#### Custom Middlewares
+#### Custom Middleware
```go
func Logger() gin.HandlerFunc {
diff --git a/vendor/github.com/gin-gonic/gin/auth.go b/vendor/github.com/gin-gonic/gin/auth.go
index 33f8e9a3c..ab4e35d76 100644
--- a/vendor/github.com/gin-gonic/gin/auth.go
+++ b/vendor/github.com/gin-gonic/gin/auth.go
@@ -10,9 +10,7 @@ import (
"strconv"
)
-const (
- AuthUserKey = "user"
-)
+const AuthUserKey = "user"
type (
Accounts map[string]string
@@ -35,8 +33,9 @@ func (a authPairs) searchCredential(authValue string) (string, bool) {
return "", false
}
-// Implements a basic Basic HTTP Authorization. It takes as arguments a map[string]string where
-// the key is the user name and the value is the password, as well as the name of the Realm
+// BasicAuthForRealm returns a Basic HTTP Authorization middleware. It takes as arguments a map[string]string where
+// the key is the user name and the value is the password, as well as the name of the Realm.
+// If the realm is empty, "Authorization Required" will be used by default.
// (see http://tools.ietf.org/html/rfc2617#section-1.2)
func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc {
if realm == "" {
@@ -59,7 +58,7 @@ func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc {
}
}
-// Implements a basic Basic HTTP Authorization. It takes as argument a map[string]string where
+// BasicAuth returns a Basic HTTP Authorization middleware. It takes as argument a map[string]string where
// the key is the user name and the value is the password.
func BasicAuth(accounts Accounts) HandlerFunc {
return BasicAuthForRealm(accounts, "")
@@ -91,8 +90,7 @@ func authorizationHeader(user, password string) string {
func secureCompare(given, actual string) bool {
if subtle.ConstantTimeEq(int32(len(given)), int32(len(actual))) == 1 {
return subtle.ConstantTimeCompare([]byte(given), []byte(actual)) == 1
- } else {
- /* Securely compare actual to itself to keep constant time, but always return false */
- return subtle.ConstantTimeCompare([]byte(actual), []byte(actual)) == 1 && false
}
+ /* Securely compare actual to itself to keep constant time, but always return false */
+ return subtle.ConstantTimeCompare([]byte(actual), []byte(actual)) == 1 && false
}
diff --git a/vendor/github.com/gin-gonic/gin/auth_test.go b/vendor/github.com/gin-gonic/gin/auth_test.go
index 74ac995e3..b22d9ced6 100644
--- a/vendor/github.com/gin-gonic/gin/auth_test.go
+++ b/vendor/github.com/gin-gonic/gin/auth_test.go
@@ -10,7 +10,7 @@ import (
"net/http/httptest"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
func TestBasicAuth(t *testing.T) {
diff --git a/vendor/github.com/gin-gonic/gin/benchmarks_test.go b/vendor/github.com/gin-gonic/gin/benchmarks_test.go
new file mode 100644
index 000000000..8a1c91a96
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/benchmarks_test.go
@@ -0,0 +1,157 @@
+package gin
+
+import (
+ "html/template"
+ "net/http"
+ "testing"
+)
+
+func BenchmarkOneRoute(B *testing.B) {
+ router := New()
+ router.GET("/ping", func(c *Context) {})
+ runRequest(B, router, "GET", "/ping")
+}
+
+func BenchmarkRecoveryMiddleware(B *testing.B) {
+ router := New()
+ router.Use(Recovery())
+ router.GET("/", func(c *Context) {})
+ runRequest(B, router, "GET", "/")
+}
+
+func BenchmarkLoggerMiddleware(B *testing.B) {
+ router := New()
+ router.Use(LoggerWithWriter(newMockWriter()))
+ router.GET("/", func(c *Context) {})
+ runRequest(B, router, "GET", "/")
+}
+
+func BenchmarkManyHandlers(B *testing.B) {
+ router := New()
+ router.Use(Recovery(), LoggerWithWriter(newMockWriter()))
+ router.Use(func(c *Context) {})
+ router.Use(func(c *Context) {})
+ router.GET("/ping", func(c *Context) {})
+ runRequest(B, router, "GET", "/ping")
+}
+
+func Benchmark5Params(B *testing.B) {
+ DefaultWriter = newMockWriter()
+ router := New()
+ router.Use(func(c *Context) {})
+ router.GET("/param/:param1/:params2/:param3/:param4/:param5", func(c *Context) {})
+ runRequest(B, router, "GET", "/param/path/to/parameter/john/12345")
+}
+
+func BenchmarkOneRouteJSON(B *testing.B) {
+ router := New()
+ data := struct {
+ Status string `json:"status"`
+ }{"ok"}
+ router.GET("/json", func(c *Context) {
+ c.JSON(200, data)
+ })
+ runRequest(B, router, "GET", "/json")
+}
+
+var htmlContentType = []string{"text/html; charset=utf-8"}
+
+func BenchmarkOneRouteHTML(B *testing.B) {
+ router := New()
+ t := template.Must(template.New("index").Parse(`
+ {{.}}
`))
+ router.SetHTMLTemplate(t)
+
+ router.GET("/html", func(c *Context) {
+ c.HTML(200, "index", "hola")
+ })
+ runRequest(B, router, "GET", "/html")
+}
+
+func BenchmarkOneRouteSet(B *testing.B) {
+ router := New()
+ router.GET("/ping", func(c *Context) {
+ c.Set("key", "value")
+ })
+ runRequest(B, router, "GET", "/ping")
+}
+
+func BenchmarkOneRouteString(B *testing.B) {
+ router := New()
+ router.GET("/text", func(c *Context) {
+ c.String(200, "this is a plain text")
+ })
+ runRequest(B, router, "GET", "/text")
+}
+
+func BenchmarkManyRoutesFist(B *testing.B) {
+ router := New()
+ router.Any("/ping", func(c *Context) {})
+ runRequest(B, router, "GET", "/ping")
+}
+
+func BenchmarkManyRoutesLast(B *testing.B) {
+ router := New()
+ router.Any("/ping", func(c *Context) {})
+ runRequest(B, router, "OPTIONS", "/ping")
+}
+
+func Benchmark404(B *testing.B) {
+ router := New()
+ router.Any("/something", func(c *Context) {})
+ router.NoRoute(func(c *Context) {})
+ runRequest(B, router, "GET", "/ping")
+}
+
+func Benchmark404Many(B *testing.B) {
+ router := New()
+ router.GET("/", func(c *Context) {})
+ router.GET("/path/to/something", func(c *Context) {})
+ router.GET("/post/:id", func(c *Context) {})
+ router.GET("/view/:id", func(c *Context) {})
+ router.GET("/favicon.ico", func(c *Context) {})
+ router.GET("/robots.txt", func(c *Context) {})
+ router.GET("/delete/:id", func(c *Context) {})
+ router.GET("/user/:id/:mode", func(c *Context) {})
+
+ router.NoRoute(func(c *Context) {})
+ runRequest(B, router, "GET", "/viewfake")
+}
+
+type mockWriter struct {
+ headers http.Header
+}
+
+func newMockWriter() *mockWriter {
+ return &mockWriter{
+ http.Header{},
+ }
+}
+
+func (m *mockWriter) Header() (h http.Header) {
+ return m.headers
+}
+
+func (m *mockWriter) Write(p []byte) (n int, err error) {
+ return len(p), nil
+}
+
+func (m *mockWriter) WriteString(s string) (n int, err error) {
+ return len(s), nil
+}
+
+func (m *mockWriter) WriteHeader(int) {}
+
+func runRequest(B *testing.B, r *Engine, method, path string) {
+ // create fake request
+ req, err := http.NewRequest(method, path, nil)
+ if err != nil {
+ panic(err)
+ }
+ w := newMockWriter()
+ B.ReportAllocs()
+ B.ResetTimer()
+ for i := 0; i < B.N; i++ {
+ r.ServeHTTP(w, req)
+ }
+}
diff --git a/vendor/github.com/gin-gonic/gin/binding/binding.go b/vendor/github.com/gin-gonic/gin/binding/binding.go
index ecaa5a1b9..9cf701dfb 100644
--- a/vendor/github.com/gin-gonic/gin/binding/binding.go
+++ b/vendor/github.com/gin-gonic/gin/binding/binding.go
@@ -4,11 +4,7 @@
package binding
-import (
- "net/http"
-
- "github.com/drone/drone/Godeps/_workspace/src/gopkg.in/joeybloggs/go-validate-yourself.v4"
-)
+import "net/http"
const (
MIMEJSON = "application/json"
@@ -25,12 +21,23 @@ type Binding interface {
Bind(*http.Request, interface{}) error
}
-var _validator = validator.NewValidator("binding", validator.BakedInValidators)
+type StructValidator interface {
+ // ValidateStruct can receive any kind of type and it should never panic, even if the configuration is not right.
+ // If the received type is not a struct, any validation should be skipped and nil must be returned.
+ // If the received type is a struct or pointer to a struct, the validation should be performed.
+ // If the struct is not valid or the validation itself fails, a descriptive error should be returned.
+ // Otherwise nil must be returned.
+ ValidateStruct(interface{}) error
+}
+
+var Validator StructValidator = &defaultValidator{}
var (
- JSON = jsonBinding{}
- XML = xmlBinding{}
- Form = formBinding{}
+ JSON = jsonBinding{}
+ XML = xmlBinding{}
+ Form = formBinding{}
+ FormPost = formPostBinding{}
+ FormMultipart = formMultipartBinding{}
)
func Default(method, contentType string) Binding {
@@ -42,15 +49,15 @@ func Default(method, contentType string) Binding {
return JSON
case MIMEXML, MIMEXML2:
return XML
- default:
+ default: //case MIMEPOSTForm, MIMEMultipartPOSTForm:
return Form
}
}
}
-func Validate(obj interface{}) error {
- if err := _validator.ValidateStruct(obj); err != nil {
- return error(err)
+func validate(obj interface{}) error {
+ if Validator == nil {
+ return nil
}
- return nil
+ return Validator.ValidateStruct(obj)
}
diff --git a/vendor/github.com/gin-gonic/gin/binding/binding_test.go b/vendor/github.com/gin-gonic/gin/binding/binding_test.go
index 956eb009c..713e2e5af 100644
--- a/vendor/github.com/gin-gonic/gin/binding/binding_test.go
+++ b/vendor/github.com/gin-gonic/gin/binding/binding_test.go
@@ -6,16 +6,22 @@ package binding
import (
"bytes"
+ "mime/multipart"
"net/http"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
type FooStruct struct {
Foo string `json:"foo" form:"foo" xml:"foo" binding:"required"`
}
+type FooBarStruct struct {
+ FooStruct
+ Bar string `json:"bar" form:"bar" xml:"bar" binding:"required"`
+}
+
func TestBindingDefault(t *testing.T) {
assert.Equal(t, Default("GET", ""), Form)
assert.Equal(t, Default("GET", MIMEJSON), Form)
@@ -27,7 +33,10 @@ func TestBindingDefault(t *testing.T) {
assert.Equal(t, Default("PUT", MIMEXML2), XML)
assert.Equal(t, Default("POST", MIMEPOSTForm), Form)
- assert.Equal(t, Default("DELETE", MIMEPOSTForm), Form)
+ assert.Equal(t, Default("PUT", MIMEPOSTForm), Form)
+
+ assert.Equal(t, Default("POST", MIMEMultipartPOSTForm), Form)
+ assert.Equal(t, Default("PUT", MIMEMultipartPOSTForm), Form)
}
func TestBindingJSON(t *testing.T) {
@@ -40,12 +49,12 @@ func TestBindingJSON(t *testing.T) {
func TestBindingForm(t *testing.T) {
testFormBinding(t, "POST",
"/", "/",
- "foo=bar", "bar=foo")
+ "foo=bar&bar=foo", "bar2=foo")
}
func TestBindingForm2(t *testing.T) {
testFormBinding(t, "GET",
- "/?foo=bar", "/?bar=foo",
+ "/?foo=bar&bar=foo", "/?bar2=foo",
"", "")
}
@@ -56,11 +65,67 @@ func TestBindingXML(t *testing.T) {
"", "")
}
+func createFormPostRequest() *http.Request {
+ req, _ := http.NewRequest("POST", "/?foo=getfoo&bar=getbar", bytes.NewBufferString("foo=bar&bar=foo"))
+ req.Header.Set("Content-Type", MIMEPOSTForm)
+ return req
+}
+
+func createFormMultipartRequest() *http.Request {
+ boundary := "--testboundary"
+ body := new(bytes.Buffer)
+ mw := multipart.NewWriter(body)
+ defer mw.Close()
+
+ mw.SetBoundary(boundary)
+ mw.WriteField("foo", "bar")
+ mw.WriteField("bar", "foo")
+ req, _ := http.NewRequest("POST", "/?foo=getfoo&bar=getbar", body)
+ req.Header.Set("Content-Type", MIMEMultipartPOSTForm+"; boundary="+boundary)
+ return req
+}
+
+func TestBindingFormPost(t *testing.T) {
+ req := createFormPostRequest()
+ var obj FooBarStruct
+ FormPost.Bind(req, &obj)
+
+ assert.Equal(t, obj.Foo, "bar")
+ assert.Equal(t, obj.Bar, "foo")
+}
+
+func TestBindingFormMultipart(t *testing.T) {
+ req := createFormMultipartRequest()
+ var obj FooBarStruct
+ FormMultipart.Bind(req, &obj)
+
+ assert.Equal(t, obj.Foo, "bar")
+ assert.Equal(t, obj.Bar, "foo")
+}
+
+func TestValidationFails(t *testing.T) {
+ var obj FooStruct
+ req := requestWithBody("POST", "/", `{"bar": "foo"}`)
+ err := JSON.Bind(req, &obj)
+ assert.Error(t, err)
+}
+
+func TestValidationDisabled(t *testing.T) {
+ backup := Validator
+ Validator = nil
+ defer func() { Validator = backup }()
+
+ var obj FooStruct
+ req := requestWithBody("POST", "/", `{"bar": "foo"}`)
+ err := JSON.Bind(req, &obj)
+ assert.NoError(t, err)
+}
+
func testFormBinding(t *testing.T, method, path, badPath, body, badBody string) {
b := Form
- assert.Equal(t, b.Name(), "query")
+ assert.Equal(t, b.Name(), "form")
- obj := FooStruct{}
+ obj := FooBarStruct{}
req := requestWithBody(method, path, body)
if method == "POST" {
req.Header.Add("Content-Type", MIMEPOSTForm)
@@ -68,8 +133,9 @@ func testFormBinding(t *testing.T, method, path, badPath, body, badBody string)
err := b.Bind(req, &obj)
assert.NoError(t, err)
assert.Equal(t, obj.Foo, "bar")
+ assert.Equal(t, obj.Bar, "foo")
- obj = FooStruct{}
+ obj = FooBarStruct{}
req = requestWithBody(method, badPath, badBody)
err = JSON.Bind(req, &obj)
assert.Error(t, err)
diff --git a/vendor/github.com/gin-gonic/gin/binding/default_validator.go b/vendor/github.com/gin-gonic/gin/binding/default_validator.go
new file mode 100644
index 000000000..7f12152b0
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/binding/default_validator.go
@@ -0,0 +1,40 @@
+package binding
+
+import (
+ "reflect"
+ "sync"
+
+ "gopkg.in/bluesuncorp/validator.v5"
+)
+
+type defaultValidator struct {
+ once sync.Once
+ validate *validator.Validate
+}
+
+var _ StructValidator = &defaultValidator{}
+
+func (v *defaultValidator) ValidateStruct(obj interface{}) error {
+ if kindOfData(obj) == reflect.Struct {
+ v.lazyinit()
+ if err := v.validate.Struct(obj); err != nil {
+ return error(err)
+ }
+ }
+ return nil
+}
+
+func (v *defaultValidator) lazyinit() {
+ v.once.Do(func() {
+ v.validate = validator.New("binding", validator.BakedInValidators)
+ })
+}
+
+func kindOfData(data interface{}) reflect.Kind {
+ value := reflect.ValueOf(data)
+ valueType := value.Kind()
+ if valueType == reflect.Ptr {
+ valueType = value.Elem().Kind()
+ }
+ return valueType
+}
diff --git a/vendor/github.com/gin-gonic/gin/binding/form.go b/vendor/github.com/gin-gonic/gin/binding/form.go
index 9d906b3a6..557333e6f 100644
--- a/vendor/github.com/gin-gonic/gin/binding/form.go
+++ b/vendor/github.com/gin-gonic/gin/binding/form.go
@@ -7,17 +7,48 @@ package binding
import "net/http"
type formBinding struct{}
+type formPostBinding struct{}
+type formMultipartBinding struct{}
-func (_ formBinding) Name() string {
- return "query"
+func (formBinding) Name() string {
+ return "form"
}
-func (_ formBinding) Bind(req *http.Request, obj interface{}) error {
+func (formBinding) Bind(req *http.Request, obj interface{}) error {
if err := req.ParseForm(); err != nil {
return err
}
+ req.ParseMultipartForm(32 << 10) // 32 MB
if err := mapForm(obj, req.Form); err != nil {
return err
}
- return Validate(obj)
+ return validate(obj)
+}
+
+func (formPostBinding) Name() string {
+ return "form-urlencoded"
+}
+
+func (formPostBinding) Bind(req *http.Request, obj interface{}) error {
+ if err := req.ParseForm(); err != nil {
+ return err
+ }
+ if err := mapForm(obj, req.PostForm); err != nil {
+ return err
+ }
+ return validate(obj)
+}
+
+func (formMultipartBinding) Name() string {
+ return "multipart/form-data"
+}
+
+func (formMultipartBinding) Bind(req *http.Request, obj interface{}) error {
+ if err := req.ParseMultipartForm(32 << 10); err != nil {
+ return err
+ }
+ if err := mapForm(obj, req.MultipartForm.Value); err != nil {
+ return err
+ }
+ return validate(obj)
}
diff --git a/vendor/github.com/gin-gonic/gin/binding/form_mapping.go b/vendor/github.com/gin-gonic/gin/binding/form_mapping.go
index d9aa06cfc..07c837512 100644
--- a/vendor/github.com/gin-gonic/gin/binding/form_mapping.go
+++ b/vendor/github.com/gin-gonic/gin/binding/form_mapping.go
@@ -20,9 +20,21 @@ func mapForm(ptr interface{}, form map[string][]string) error {
continue
}
+ structFieldKind := structField.Kind()
inputFieldName := typeField.Tag.Get("form")
if inputFieldName == "" {
inputFieldName = typeField.Name
+
+ // if "form" tag is nil, we inspect if the field is a struct.
+ // this would not make sense for JSON parsing but it does for a form
+ // since data is flatten
+ if structFieldKind == reflect.Struct {
+ err := mapForm(structField.Addr().Interface(), form)
+ if err != nil {
+ return err
+ }
+ continue
+ }
}
inputValue, exists := form[inputFieldName]
if !exists {
@@ -30,7 +42,7 @@ func mapForm(ptr interface{}, form map[string][]string) error {
}
numElems := len(inputValue)
- if structField.Kind() == reflect.Slice && numElems > 0 {
+ if structFieldKind == reflect.Slice && numElems > 0 {
sliceOf := structField.Type().Elem().Kind()
slice := reflect.MakeSlice(structField.Type(), numElems, numElems)
for i := 0; i < numElems; i++ {
@@ -44,7 +56,6 @@ func mapForm(ptr interface{}, form map[string][]string) error {
return err
}
}
-
}
return nil
}
diff --git a/vendor/github.com/gin-gonic/gin/binding/json.go b/vendor/github.com/gin-gonic/gin/binding/json.go
index a21192c05..6e5324433 100644
--- a/vendor/github.com/gin-gonic/gin/binding/json.go
+++ b/vendor/github.com/gin-gonic/gin/binding/json.go
@@ -12,14 +12,14 @@ import (
type jsonBinding struct{}
-func (_ jsonBinding) Name() string {
+func (jsonBinding) Name() string {
return "json"
}
-func (_ jsonBinding) Bind(req *http.Request, obj interface{}) error {
+func (jsonBinding) Bind(req *http.Request, obj interface{}) error {
decoder := json.NewDecoder(req.Body)
if err := decoder.Decode(obj); err != nil {
return err
}
- return Validate(obj)
+ return validate(obj)
}
diff --git a/vendor/github.com/gin-gonic/gin/binding/validate_test.go b/vendor/github.com/gin-gonic/gin/binding/validate_test.go
index 3647db19a..27ba7b667 100644
--- a/vendor/github.com/gin-gonic/gin/binding/validate_test.go
+++ b/vendor/github.com/gin-gonic/gin/binding/validate_test.go
@@ -7,7 +7,7 @@ package binding
import (
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
type struct1 struct {
@@ -49,5 +49,21 @@ func createStruct() struct3 {
func TestValidateGoodObject(t *testing.T) {
test := createStruct()
- assert.Nil(t, Validate(&test))
+ assert.Nil(t, validate(&test))
+}
+
+type Object map[string]interface{}
+type MyObjects []Object
+
+func TestValidateSlice(t *testing.T) {
+ var obj MyObjects
+ var obj2 Object
+ var nu = 10
+
+ assert.NoError(t, validate(obj))
+ assert.NoError(t, validate(&obj))
+ assert.NoError(t, validate(obj2))
+ assert.NoError(t, validate(&obj2))
+ assert.NoError(t, validate(nu))
+ assert.NoError(t, validate(&nu))
}
diff --git a/vendor/github.com/gin-gonic/gin/binding/xml.go b/vendor/github.com/gin-gonic/gin/binding/xml.go
index 6140ab1eb..f84a6b7f1 100644
--- a/vendor/github.com/gin-gonic/gin/binding/xml.go
+++ b/vendor/github.com/gin-gonic/gin/binding/xml.go
@@ -11,14 +11,14 @@ import (
type xmlBinding struct{}
-func (_ xmlBinding) Name() string {
+func (xmlBinding) Name() string {
return "xml"
}
-func (_ xmlBinding) Bind(req *http.Request, obj interface{}) error {
+func (xmlBinding) Bind(req *http.Request, obj interface{}) error {
decoder := xml.NewDecoder(req.Body)
if err := decoder.Decode(obj); err != nil {
return err
}
- return Validate(obj)
+ return validate(obj)
}
diff --git a/vendor/github.com/gin-gonic/gin/context.go b/vendor/github.com/gin-gonic/gin/context.go
index 1111c2c3b..b784c14bb 100644
--- a/vendor/github.com/gin-gonic/gin/context.go
+++ b/vendor/github.com/gin-gonic/gin/context.go
@@ -12,12 +12,13 @@ import (
"strings"
"time"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/gin-gonic/gin/binding"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/gin-gonic/gin/render"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/manucorporat/sse"
- "github.com/drone/drone/Godeps/_workspace/src/golang.org/x/net/context"
+ "github.com/gin-gonic/gin/binding"
+ "github.com/gin-gonic/gin/render"
+ "github.com/manucorporat/sse"
+ "golang.org/x/net/context"
)
+// Content-Type MIME of the most common data formats
const (
MIMEJSON = binding.MIMEJSON
MIMEHTML = binding.MIMEHTML
@@ -28,36 +29,7 @@ const (
MIMEMultipartPOSTForm = binding.MIMEMultipartPOSTForm
)
-const AbortIndex = math.MaxInt8 / 2
-
-var _ context.Context = &Context{}
-
-// Param is a single URL parameter, consisting of a key and a value.
-type Param struct {
- Key string
- Value string
-}
-
-// Params is a Param-slice, as returned by the router.
-// The slice is ordered, the first URL parameter is also the first slice value.
-// It is therefore safe to read values by the index.
-type Params []Param
-
-// ByName returns the value of the first Param which key matches the given name.
-// If no matching Param is found, an empty string is returned.
-func (ps Params) Get(name string) (string, bool) {
- for _, entry := range ps {
- if entry.Key == name {
- return entry.Value, true
- }
- }
- return "", false
-}
-
-func (ps Params) ByName(name string) (va string) {
- va, _ = ps.Get(name)
- return
-}
+const abortIndex int8 = math.MaxInt8 / 2
// Context is the most important part of gin. It allows us to pass variables between middleware,
// manage the flow, validate the JSON of a request and render a JSON response for example.
@@ -70,12 +42,14 @@ type Context struct {
handlers HandlersChain
index int8
- Engine *Engine
+ engine *Engine
Keys map[string]interface{}
Errors errorMsgs
Accepted []string
}
+var _ context.Context = &Context{}
+
/************************************/
/********** CONTEXT CREATION ********/
/************************************/
@@ -90,20 +64,28 @@ func (c *Context) reset() {
c.Accepted = nil
}
+// Copy returns a copy of the current context that can be safely used outside the request's scope.
+// This have to be used then the context has to be passed to a goroutine.
func (c *Context) Copy() *Context {
var cp Context = *c
cp.writermem.ResponseWriter = nil
cp.Writer = &cp.writermem
- cp.index = AbortIndex
+ cp.index = abortIndex
cp.handlers = nil
return &cp
}
+// HandlerName returns the main handle's name. For example if the handler is "handleGetUsers()", this
+// function will return "main.handleGetUsers"
+func (c *Context) HandlerName() string {
+ return nameOfFunction(c.handlers.Last())
+}
+
/************************************/
-/*************** FLOW ***************/
+/*********** FLOW CONTROL ***********/
/************************************/
-// Next should be used only in the middlewares.
+// Next should be used only inside middleware.
// It executes the pending handlers in the chain inside the calling handler.
// See example in github.
func (c *Context) Next() {
@@ -114,131 +96,63 @@ func (c *Context) Next() {
}
}
-// Forces the system to not continue calling the pending handlers in the chain.
-func (c *Context) Abort() {
- c.index = AbortIndex
+// IsAborted returns true if the currect context was aborted.
+func (c *Context) IsAborted() bool {
+ return c.index >= abortIndex
}
-// Same than AbortWithStatus() but also writes the specified response status code.
-// For example, the first handler checks if the request is authorized. If it's not, context.AbortWithStatus(401) should be called.
+// Abort stops the system to continue calling the pending handlers in the chain.
+// Let's say you have an authorization middleware that validates if the request is authorized
+// if the authorization fails (the password does not match). This method (Abort()) should be called
+// in order to stop the execution of the actual handler.
+func (c *Context) Abort() {
+ c.index = abortIndex
+}
+
+// AbortWithStatus calls `Abort()` and writes the headers with the specified status code.
+// For example, a failed attempt to authentificate a request could use: context.AbortWithStatus(401).
func (c *Context) AbortWithStatus(code int) {
c.Writer.WriteHeader(code)
c.Abort()
}
-func (c *Context) IsAborted() bool {
- return c.index == AbortIndex
+// AbortWithError calls `AbortWithStatus()` and `Error()` internally. This method stops the chain, writes the status code and
+// pushes the specified error to `c.Errors`.
+// See Context.Error() for more details.
+func (c *Context) AbortWithError(code int, err error) *Error {
+ c.AbortWithStatus(code)
+ return c.Error(err)
}
/************************************/
/********* ERROR MANAGEMENT *********/
/************************************/
-// Fail is the same as Abort plus an error message.
-// Calling `context.Fail(500, err)` is equivalent to:
-// ```
-// context.Error("Operation aborted", err)
-// context.AbortWithStatus(500)
-// ```
-func (c *Context) Fail(code int, err error) {
- c.Error(err, "Operation aborted")
- c.AbortWithStatus(code)
-}
-
-func (c *Context) ErrorTyped(err error, typ int, meta interface{}) {
- c.Errors = append(c.Errors, errorMsg{
- Error: err,
- Flags: typ,
- Meta: meta,
- })
-}
-
// Attaches an error to the current context. The error is pushed to a list of errors.
// It's a good idea to call Error for each error that occurred during the resolution of a request.
-// A middleware can be used to collect all the errors and push them to a database together, print a log, or append it in the HTTP response.
-func (c *Context) Error(err error, meta interface{}) {
- c.ErrorTyped(err, ErrorTypeExternal, meta)
-}
-
-func (c *Context) LastError() error {
- nuErrors := len(c.Errors)
- if nuErrors > 0 {
- return c.Errors[nuErrors-1].Error
+// A middleware can be used to collect all the errors
+// and push them to a database together, print a log, or append it in the HTTP response.
+func (c *Context) Error(err error) *Error {
+ var parsedError *Error
+ switch err.(type) {
+ case *Error:
+ parsedError = err.(*Error)
+ default:
+ parsedError = &Error{
+ Err: err,
+ Type: ErrorTypePrivate,
+ }
}
- return nil
-}
-
-/************************************/
-/************ INPUT DATA ************/
-/************************************/
-
-/** Shortcut for c.Request.FormValue(key) */
-func (c *Context) FormValue(key string) (va string) {
- va, _ = c.formValue(key)
- return
-}
-
-/** Shortcut for c.Request.PostFormValue(key) */
-func (c *Context) PostFormValue(key string) (va string) {
- va, _ = c.postFormValue(key)
- return
-}
-
-/** Shortcut for c.Params.ByName(key) */
-func (c *Context) ParamValue(key string) (va string) {
- va, _ = c.paramValue(key)
- return
-}
-
-func (c *Context) DefaultPostFormValue(key, defaultValue string) string {
- if va, ok := c.postFormValue(key); ok {
- return va
- }
- return defaultValue
-}
-
-func (c *Context) DefaultFormValue(key, defaultValue string) string {
- if va, ok := c.formValue(key); ok {
- return va
- }
- return defaultValue
-}
-
-func (c *Context) DefaultParamValue(key, defaultValue string) string {
- if va, ok := c.paramValue(key); ok {
- return va
- }
- return defaultValue
-}
-
-func (c *Context) paramValue(key string) (string, bool) {
- return c.Params.Get(key)
-}
-
-func (c *Context) formValue(key string) (string, bool) {
- req := c.Request
- req.ParseForm()
- if values, ok := req.Form[key]; ok && len(values) > 0 {
- return values[0], true
- }
- return "", false
-}
-
-func (c *Context) postFormValue(key string) (string, bool) {
- req := c.Request
- req.ParseForm()
- if values, ok := req.PostForm[key]; ok && len(values) > 0 {
- return values[0], true
- }
- return "", false
+ c.Errors = append(c.Errors, parsedError)
+ return parsedError
}
/************************************/
/******** METADATA MANAGEMENT********/
/************************************/
-// Sets a new pair key/value just for the specified context.
-// It also lazy initializes the hashmap.
+// Set is used to store a new key/value pair exclusivelly for this context.
+// It also lazy initializes c.Keys if it was not used previously.
func (c *Context) Set(key string, value interface{}) {
if c.Keys == nil {
c.Keys = make(map[string]interface{})
@@ -246,7 +160,8 @@ func (c *Context) Set(key string, value interface{}) {
c.Keys[key] = value
}
-// Get returns the value for the given key or an error if the key does not exist.
+// Get returns the value for the given key, ie: (value, true).
+// If the value does not exists it returns (nil, false)
func (c *Context) Get(key string) (value interface{}, exists bool) {
if c.Keys != nil {
value, exists = c.Keys[key]
@@ -254,59 +169,150 @@ func (c *Context) Get(key string) (value interface{}, exists bool) {
return
}
-// MustGet returns the value for the given key or panics if the value doesn't exist.
+// Returns the value for the given key if it exists, otherwise it panics.
func (c *Context) MustGet(key string) interface{} {
if value, exists := c.Get(key); exists {
return value
- } else {
- panic("Key \"" + key + "\" does not exist")
}
+ panic("Key \"" + key + "\" does not exist")
}
/************************************/
-/********* PARSING REQUEST **********/
+/************ INPUT DATA ************/
/************************************/
-func (c *Context) ClientIP() string {
- clientIP := c.Request.Header.Get("X-Real-IP")
- if len(clientIP) > 0 {
- return clientIP
- }
- clientIP = c.Request.Header.Get("X-Forwarded-For")
- clientIP = strings.Split(clientIP, ",")[0]
- if len(clientIP) > 0 {
- return strings.TrimSpace(clientIP)
- }
- return c.Request.RemoteAddr
+// Query is a shortcut for c.Request.URL.Query().Get(key)
+// It is used to return the url query values.
+// ?id=1234&name=Manu
+// c.Query("id") == "1234"
+// c.Query("name") == "Manu"
+// c.Query("wtf") == ""
+func (c *Context) Query(key string) (va string) {
+ va, _ = c.query(key)
+ return
}
-func (c *Context) ContentType() string {
- return filterFlags(c.Request.Header.Get("Content-Type"))
+// PostForm is a shortcut for c.Request.PostFormValue(key)
+func (c *Context) PostForm(key string) (va string) {
+ va, _ = c.postForm(key)
+ return
}
-// This function checks the Content-Type to select a binding engine automatically,
+// Param is a shortcut for c.Params.ByName(key)
+func (c *Context) Param(key string) string {
+ return c.Params.ByName(key)
+}
+
+func (c *Context) DefaultPostForm(key, defaultValue string) string {
+ if va, ok := c.postForm(key); ok {
+ return va
+ }
+ return defaultValue
+}
+
+// DefaultQuery returns the keyed url query value if it exists, othewise it returns the
+// specified defaultValue.
+// ```
+// /?name=Manu
+// c.DefaultQuery("name", "unknown") == "Manu"
+// c.DefaultQuery("id", "none") == "none"
+// ```
+func (c *Context) DefaultQuery(key, defaultValue string) string {
+ if va, ok := c.query(key); ok {
+ return va
+ }
+ return defaultValue
+}
+
+func (c *Context) query(key string) (string, bool) {
+ req := c.Request
+ if values, ok := req.URL.Query()[key]; ok && len(values) > 0 {
+ return values[0], true
+ }
+ return "", false
+}
+
+func (c *Context) postForm(key string) (string, bool) {
+ req := c.Request
+ req.ParseMultipartForm(32 << 20) // 32 MB
+ if values := req.PostForm[key]; len(values) > 0 {
+ return values[0], true
+ }
+ if req.MultipartForm != nil && req.MultipartForm.File != nil {
+ if values := req.MultipartForm.Value[key]; len(values) > 0 {
+ return values[0], true
+ }
+ }
+ return "", false
+}
+
+// Bind checks the Content-Type to select a binding engine automatically,
// Depending the "Content-Type" header different bindings are used:
// "application/json" --> JSON binding
// "application/xml" --> XML binding
-// else --> returns an error
-// if Parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. It decodes the json payload into the struct specified as a pointer.Like ParseBody() but this method also writes a 400 error if the json is not valid.
-func (c *Context) Bind(obj interface{}) bool {
+// otherwise --> returns an error
+// If Parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input.
+// It decodes the json payload into the struct specified as a pointer.
+// Like ParseBody() but this method also writes a 400 error if the json is not valid.
+func (c *Context) Bind(obj interface{}) error {
b := binding.Default(c.Request.Method, c.ContentType())
return c.BindWith(obj, b)
}
-func (c *Context) BindWith(obj interface{}, b binding.Binding) bool {
+// BindJSON is a shortcut for c.BindWith(obj, binding.JSON)
+func (c *Context) BindJSON(obj interface{}) error {
+ return c.BindWith(obj, binding.JSON)
+}
+
+// BindWith binds the passed struct pointer using the specified binding engine.
+// See the binding package.
+func (c *Context) BindWith(obj interface{}, b binding.Binding) error {
if err := b.Bind(c.Request, obj); err != nil {
- c.Fail(400, err)
- return false
+ c.AbortWithError(400, err).SetType(ErrorTypeBind)
+ return err
}
- return true
+ return nil
+}
+
+// ClientIP implements a best effort algorithm to return the real client IP, it parses
+// X-Real-IP and X-Forwarded-For in order to work properly with reverse-proxies such us: nginx or haproxy.
+func (c *Context) ClientIP() string {
+ if c.engine.ForwardedByClientIP {
+ clientIP := strings.TrimSpace(c.requestHeader("X-Real-Ip"))
+ if len(clientIP) > 0 {
+ return clientIP
+ }
+ clientIP = c.requestHeader("X-Forwarded-For")
+ if index := strings.IndexByte(clientIP, ','); index >= 0 {
+ clientIP = clientIP[0:index]
+ }
+ clientIP = strings.TrimSpace(clientIP)
+ if len(clientIP) > 0 {
+ return clientIP
+ }
+ }
+ return strings.TrimSpace(c.Request.RemoteAddr)
+}
+
+// ContentType returns the Content-Type header of the request.
+func (c *Context) ContentType() string {
+ return filterFlags(c.requestHeader("Content-Type"))
+}
+
+func (c *Context) requestHeader(key string) string {
+ if values, _ := c.Request.Header[key]; len(values) > 0 {
+ return values[0]
+ }
+ return ""
}
/************************************/
/******** RESPONSE RENDERING ********/
/************************************/
+// Header is a intelligent shortcut for c.Writer.Header().Set(key, value)
+// It writes a header in the response.
+// If value == "", this method removes the header `c.Writer.Header().Del(key)`
func (c *Context) Header(key, value string) {
if len(value) == 0 {
c.Writer.Header().Del(key)
@@ -316,47 +322,55 @@ func (c *Context) Header(key, value string) {
}
func (c *Context) Render(code int, r render.Render) {
- c.Writer.WriteHeader(code)
- if err := r.Write(c.Writer); err != nil {
- debugPrintError(err)
- c.ErrorTyped(err, ErrorTypeInternal, nil)
- c.AbortWithStatus(500)
+ c.writermem.WriteHeader(code)
+ if err := r.Render(c.Writer); err != nil {
+ c.renderError(err)
}
}
-// Renders the HTTP template specified by its file name.
+func (c *Context) renderError(err error) {
+ debugPrintError(err)
+ c.AbortWithError(500, err).SetType(ErrorTypeRender)
+}
+
+// HTML renders the HTTP template specified by its file name.
// It also updates the HTTP code and sets the Content-Type as "text/html".
// See http://golang.org/doc/articles/wiki/
func (c *Context) HTML(code int, name string, obj interface{}) {
- instance := c.Engine.HTMLRender.Instance(name, obj)
+ instance := c.engine.HTMLRender.Instance(name, obj)
c.Render(code, instance)
}
+// IndentedJSON serializes the given struct as pretty JSON (indented + endlines) into the response body.
+// It also sets the Content-Type as "application/json".
+// WARNING: we recommend to use this only for development propuses since printing pretty JSON is
+// more CPU and bandwidth consuming. Use Context.JSON() instead.
func (c *Context) IndentedJSON(code int, obj interface{}) {
c.Render(code, render.IndentedJSON{Data: obj})
}
-// Serializes the given struct as JSON into the response body in a fast and efficient way.
+// JSON serializes the given struct as JSON into the response body.
// It also sets the Content-Type as "application/json".
func (c *Context) JSON(code int, obj interface{}) {
- c.Render(code, render.JSON{Data: obj})
+ c.writermem.WriteHeader(code)
+ if err := render.WriteJSON(c.Writer, obj); err != nil {
+ c.renderError(err)
+ }
}
-// Serializes the given struct as XML into the response body in a fast and efficient way.
+// XML serializes the given struct as XML into the response body.
// It also sets the Content-Type as "application/xml".
func (c *Context) XML(code int, obj interface{}) {
c.Render(code, render.XML{Data: obj})
}
-// Writes the given string into the response body and sets the Content-Type to "text/plain".
+// String writes the given string into the response body.
func (c *Context) String(code int, format string, values ...interface{}) {
- c.Render(code, render.String{
- Format: format,
- Data: values},
- )
+ c.writermem.WriteHeader(code)
+ render.WriteString(c.Writer, format, values)
}
-// Returns a HTTP redirect to the specific location.
+// Redirect returns a HTTP redirect to the specific location.
func (c *Context) Redirect(code int, location string) {
c.Render(-1, render.Redirect{
Code: code,
@@ -365,7 +379,7 @@ func (c *Context) Redirect(code int, location string) {
})
}
-// Writes some data into the body stream and updates the HTTP code.
+// Data writes some data into the body stream and updates the HTTP code.
func (c *Context) Data(code int, contentType string, data []byte) {
c.Render(code, render.Data{
ContentType: contentType,
@@ -373,14 +387,12 @@ func (c *Context) Data(code int, contentType string, data []byte) {
})
}
-// Writes the specified file into the body stream
+// File writes the specified file into the body stream in a efficient way.
func (c *Context) File(filepath string) {
- c.Render(-1, render.File{
- Path: filepath,
- Request: c.Request,
- })
+ http.ServeFile(c.Writer, c.Request, filepath)
}
+// SSEvent writes a Server-Sent Event into the body stream.
func (c *Context) SSEvent(name string, message interface{}) {
c.Render(-1, sse.Event{
Event: name,
@@ -433,7 +445,7 @@ func (c *Context) Negotiate(code int, config Negotiate) {
c.XML(code, data)
default:
- c.Fail(http.StatusNotAcceptable, errors.New("the accepted formats are not offered by the server"))
+ c.AbortWithError(http.StatusNotAcceptable, errors.New("the accepted formats are not offered by the server"))
}
}
@@ -442,7 +454,7 @@ func (c *Context) NegotiateFormat(offered ...string) string {
panic("you must provide at least one offer")
}
if c.Accepted == nil {
- c.Accepted = parseAccept(c.Request.Header.Get("Accept"))
+ c.Accepted = parseAccept(c.requestHeader("Accept"))
}
if len(c.Accepted) == 0 {
return offered[0]
@@ -461,6 +473,10 @@ func (c *Context) SetAccepted(formats ...string) {
c.Accepted = formats
}
+/************************************/
+/***** GOLANG.ORG/X/NET/CONTEXT *****/
+/************************************/
+
func (c *Context) Deadline() (deadline time.Time, ok bool) {
return
}
diff --git a/vendor/github.com/gin-gonic/gin/context_test.go b/vendor/github.com/gin-gonic/gin/context_test.go
index 36a90bd80..efdba7b24 100644
--- a/vendor/github.com/gin-gonic/gin/context_test.go
+++ b/vendor/github.com/gin-gonic/gin/context_test.go
@@ -8,14 +8,14 @@ import (
"bytes"
"errors"
"html/template"
+ "mime/multipart"
"net/http"
"net/http/httptest"
"testing"
"time"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/gin-gonic/gin/binding"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/manucorporat/sse"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/manucorporat/sse"
+ "github.com/stretchr/testify/assert"
)
// Unit tests TODO
@@ -33,15 +33,39 @@ func createTestContext() (c *Context, w *httptest.ResponseRecorder, r *Engine) {
return
}
+func createMultipartRequest() *http.Request {
+ boundary := "--testboundary"
+ body := new(bytes.Buffer)
+ mw := multipart.NewWriter(body)
+ defer mw.Close()
+
+ must(mw.SetBoundary(boundary))
+ must(mw.WriteField("foo", "bar"))
+ must(mw.WriteField("bar", "foo"))
+ must(mw.WriteField("bar", "foo2"))
+ must(mw.WriteField("array", "first"))
+ must(mw.WriteField("array", "second"))
+ req, err := http.NewRequest("POST", "/", body)
+ must(err)
+ req.Header.Set("Content-Type", MIMEMultipartPOSTForm+"; boundary="+boundary)
+ return req
+}
+
+func must(err error) {
+ if err != nil {
+ panic(err.Error())
+ }
+}
+
func TestContextReset(t *testing.T) {
router := New()
c := router.allocateContext()
- assert.Equal(t, c.Engine, router)
+ assert.Equal(t, c.engine, router)
c.index = 2
c.Writer = &responseWriter{ResponseWriter: httptest.NewRecorder()}
c.Params = Params{Param{}}
- c.Error(errors.New("test"), nil)
+ c.Error(errors.New("test"))
c.Set("foo", "bar")
c.reset()
@@ -52,10 +76,29 @@ func TestContextReset(t *testing.T) {
assert.Empty(t, c.Errors.Errors())
assert.Empty(t, c.Errors.ByType(ErrorTypeAny))
assert.Len(t, c.Params, 0)
- assert.Equal(t, c.index, -1)
+ assert.EqualValues(t, c.index, -1)
assert.Equal(t, c.Writer.(*responseWriter), &c.writermem)
}
+func TestContextHandlers(t *testing.T) {
+ c, _, _ := createTestContext()
+ assert.Nil(t, c.handlers)
+ assert.Nil(t, c.handlers.Last())
+
+ c.handlers = HandlersChain{}
+ assert.NotNil(t, c.handlers)
+ assert.Nil(t, c.handlers.Last())
+
+ f := func(c *Context) {}
+ g := func(c *Context) {}
+
+ c.handlers = HandlersChain{f}
+ compareFunc(t, f, c.handlers.Last())
+
+ c.handlers = HandlersChain{f, g}
+ compareFunc(t, g, c.handlers.Last())
+}
+
// TestContextSetGet tests that a parameter is set correctly on the
// current context and can be retrieved using Get.
func TestContextSetGet(t *testing.T) {
@@ -108,52 +151,99 @@ func TestContextCopy(t *testing.T) {
assert.Nil(t, cp.writermem.ResponseWriter)
assert.Equal(t, &cp.writermem, cp.Writer.(*responseWriter))
assert.Equal(t, cp.Request, c.Request)
- assert.Equal(t, cp.index, AbortIndex)
+ assert.Equal(t, cp.index, abortIndex)
assert.Equal(t, cp.Keys, c.Keys)
- assert.Equal(t, cp.Engine, c.Engine)
+ assert.Equal(t, cp.engine, c.engine)
assert.Equal(t, cp.Params, c.Params)
}
-func TestContextFormParse(t *testing.T) {
+func TestContextHandlerName(t *testing.T) {
+ c, _, _ := createTestContext()
+ c.handlers = HandlersChain{func(c *Context) {}, handlerNameTest}
+
+ assert.Equal(t, c.HandlerName(), "github.com/gin-gonic/gin.handlerNameTest")
+}
+
+func handlerNameTest(c *Context) {
+
+}
+
+func TestContextQuery(t *testing.T) {
c, _, _ := createTestContext()
c.Request, _ = http.NewRequest("GET", "http://example.com/?foo=bar&page=10", nil)
- assert.Equal(t, c.DefaultFormValue("foo", "none"), "bar")
- assert.Equal(t, c.FormValue("foo"), "bar")
- assert.Empty(t, c.PostFormValue("foo"))
+ assert.Equal(t, c.DefaultQuery("foo", "none"), "bar")
+ assert.Equal(t, c.Query("foo"), "bar")
+ assert.Empty(t, c.PostForm("foo"))
- assert.Equal(t, c.DefaultFormValue("page", "0"), "10")
- assert.Equal(t, c.FormValue("page"), "10")
- assert.Empty(t, c.PostFormValue("page"))
+ assert.Equal(t, c.DefaultQuery("page", "0"), "10")
+ assert.Equal(t, c.Query("page"), "10")
+ assert.Empty(t, c.PostForm("page"))
- assert.Equal(t, c.DefaultFormValue("NoKey", "nada"), "nada")
- assert.Empty(t, c.FormValue("NoKey"))
- assert.Empty(t, c.PostFormValue("NoKey"))
+ assert.Equal(t, c.DefaultQuery("NoKey", "nada"), "nada")
+ assert.Empty(t, c.Query("NoKey"))
+ assert.Empty(t, c.PostForm("NoKey"))
}
-func TestContextPostFormParse(t *testing.T) {
+func TestContextQueryAndPostForm(t *testing.T) {
c, _, _ := createTestContext()
- body := bytes.NewBufferString("foo=bar&page=11&both=POST")
- c.Request, _ = http.NewRequest("POST", "/?both=GET&id=main", body)
+ body := bytes.NewBufferString("foo=bar&page=11&both=POST&foo=second")
+ c.Request, _ = http.NewRequest("POST", "/?both=GET&id=main&id=omit&array[]=first&array[]=second", body)
c.Request.Header.Add("Content-Type", MIMEPOSTForm)
- assert.Equal(t, c.DefaultPostFormValue("foo", "none"), "bar")
- assert.Equal(t, c.PostFormValue("foo"), "bar")
- assert.Equal(t, c.FormValue("foo"), "bar")
+ assert.Equal(t, c.DefaultPostForm("foo", "none"), "bar")
+ assert.Equal(t, c.PostForm("foo"), "bar")
+ assert.Empty(t, c.Query("foo"))
- assert.Equal(t, c.DefaultPostFormValue("page", "0"), "11")
- assert.Equal(t, c.PostFormValue("page"), "11")
- assert.Equal(t, c.FormValue("page"), "11")
+ assert.Equal(t, c.DefaultPostForm("page", "0"), "11")
+ assert.Equal(t, c.PostForm("page"), "11")
+ assert.Equal(t, c.Query("page"), "")
- assert.Equal(t, c.PostFormValue("both"), "POST")
- assert.Equal(t, c.FormValue("both"), "POST")
+ assert.Equal(t, c.PostForm("both"), "POST")
+ assert.Equal(t, c.Query("both"), "GET")
- assert.Equal(t, c.FormValue("id"), "main")
- assert.Empty(t, c.PostFormValue("id"))
+ assert.Equal(t, c.DefaultPostForm("id", "000"), "000")
+ assert.Equal(t, c.Query("id"), "main")
+ assert.Empty(t, c.PostForm("id"))
- assert.Equal(t, c.DefaultPostFormValue("NoKey", "nada"), "nada")
- assert.Empty(t, c.PostFormValue("NoKey"))
- assert.Empty(t, c.FormValue("NoKey"))
+ assert.Equal(t, c.DefaultPostForm("NoKey", "nada"), "nada")
+ assert.Empty(t, c.PostForm("NoKey"))
+ assert.Empty(t, c.Query("NoKey"))
+
+ var obj struct {
+ Foo string `form:"foo"`
+ ID string `form:"id"`
+ Page string `form:"page"`
+ Both string `form:"both"`
+ Array []string `form:"array[]"`
+ }
+ assert.NoError(t, c.Bind(&obj))
+ assert.Equal(t, obj.Foo, "bar")
+ assert.Equal(t, obj.ID, "main")
+ assert.Equal(t, obj.Page, "11")
+ assert.Equal(t, obj.Both, "POST")
+ assert.Equal(t, obj.Array, []string{"first", "second"})
+}
+
+func TestContextPostFormMultipart(t *testing.T) {
+ c, _, _ := createTestContext()
+ c.Request = createMultipartRequest()
+
+ var obj struct {
+ Foo string `form:"foo"`
+ Bar string `form:"bar"`
+ Array []string `form:"array"`
+ }
+ assert.NoError(t, c.Bind(&obj))
+ assert.Equal(t, obj.Bar, "foo")
+ assert.Equal(t, obj.Foo, "bar")
+ assert.Equal(t, obj.Array, []string{"first", "second"})
+
+ assert.Empty(t, c.Query("foo"))
+ assert.Empty(t, c.Query("bar"))
+ assert.Equal(t, c.PostForm("foo"), "bar")
+ assert.Equal(t, c.PostForm("array"), "first")
+ assert.Equal(t, c.PostForm("bar"), "foo")
}
// Tests that the response is serialized as JSON
@@ -167,6 +257,18 @@ func TestContextRenderJSON(t *testing.T) {
assert.Equal(t, w.HeaderMap.Get("Content-Type"), "application/json; charset=utf-8")
}
+// Tests that the response is serialized as JSON
+// we change the content-type before
+func TestContextRenderAPIJSON(t *testing.T) {
+ c, w, _ := createTestContext()
+ c.Header("Content-Type", "application/vnd.api+json")
+ c.JSON(201, H{"foo": "bar"})
+
+ assert.Equal(t, w.Code, 201)
+ assert.Equal(t, w.Body.String(), "{\"foo\":\"bar\"}\n")
+ assert.Equal(t, w.HeaderMap.Get("Content-Type"), "application/vnd.api+json")
+}
+
// Tests that the response is serialized as JSON
// and Content-Type is set to application/json
func TestContextRenderIndentedJSON(t *testing.T) {
@@ -249,7 +351,7 @@ func TestContextRenderSSE(t *testing.T) {
"bar": "foo",
})
- assert.Equal(t, w.Body.String(), "event: float\ndata: 1.5\n\nid: 123\ndata: text\n\nevent: chat\ndata: {\"bar\":\"foo\",\"foo\":\"bar\"}\n\n")
+ assert.Equal(t, w.Body.String(), "event:float\ndata:1.5\n\nid:123\ndata:text\n\nevent:chat\ndata:{\"bar\":\"foo\",\"foo\":\"bar\"}\n\n")
}
func TestContextRenderFile(t *testing.T) {
@@ -333,6 +435,20 @@ func TestContextNegotiationFormatCustum(t *testing.T) {
assert.Equal(t, c.NegotiateFormat(MIMEJSON), MIMEJSON)
}
+func TestContextIsAborted(t *testing.T) {
+ c, _, _ := createTestContext()
+ assert.False(t, c.IsAborted())
+
+ c.Abort()
+ assert.True(t, c.IsAborted())
+
+ c.Next()
+ assert.True(t, c.IsAborted())
+
+ c.index++
+ assert.True(t, c.IsAborted())
+}
+
// TestContextData tests that the response can be written from `bytesting`
// with specified MIME type
func TestContextAbortWithStatus(t *testing.T) {
@@ -341,7 +457,7 @@ func TestContextAbortWithStatus(t *testing.T) {
c.AbortWithStatus(401)
c.Writer.WriteHeaderNow()
- assert.Equal(t, c.index, AbortIndex)
+ assert.Equal(t, c.index, abortIndex)
assert.Equal(t, c.Writer.Status(), 401)
assert.Equal(t, w.Code, 401)
assert.True(t, c.IsAborted())
@@ -349,57 +465,51 @@ func TestContextAbortWithStatus(t *testing.T) {
func TestContextError(t *testing.T) {
c, _, _ := createTestContext()
- assert.Nil(t, c.LastError())
- assert.Empty(t, c.Errors.String())
+ assert.Empty(t, c.Errors)
- c.Error(errors.New("first error"), "some data")
- assert.Equal(t, c.LastError().Error(), "first error")
+ c.Error(errors.New("first error"))
assert.Len(t, c.Errors, 1)
- assert.Equal(t, c.Errors.String(), "Error #01: first error\n Meta: some data\n")
+ assert.Equal(t, c.Errors.String(), "Error #01: first error\n")
- c.Error(errors.New("second error"), "some data 2")
- assert.Equal(t, c.LastError().Error(), "second error")
+ c.Error(&Error{
+ Err: errors.New("second error"),
+ Meta: "some data 2",
+ Type: ErrorTypePublic,
+ })
assert.Len(t, c.Errors, 2)
- assert.Equal(t, c.Errors.String(), "Error #01: first error\n Meta: some data\n"+
- "Error #02: second error\n Meta: some data 2\n")
- assert.Equal(t, c.Errors[0].Error, errors.New("first error"))
- assert.Equal(t, c.Errors[0].Meta, "some data")
- assert.Equal(t, c.Errors[0].Flags, ErrorTypeExternal)
+ assert.Equal(t, c.Errors[0].Err, errors.New("first error"))
+ assert.Nil(t, c.Errors[0].Meta)
+ assert.Equal(t, c.Errors[0].Type, ErrorTypePrivate)
- assert.Equal(t, c.Errors[1].Error, errors.New("second error"))
+ assert.Equal(t, c.Errors[1].Err, errors.New("second error"))
assert.Equal(t, c.Errors[1].Meta, "some data 2")
- assert.Equal(t, c.Errors[1].Flags, ErrorTypeExternal)
+ assert.Equal(t, c.Errors[1].Type, ErrorTypePublic)
+
+ assert.Equal(t, c.Errors.Last(), c.Errors[1])
}
func TestContextTypedError(t *testing.T) {
c, _, _ := createTestContext()
- c.ErrorTyped(errors.New("externo 0"), ErrorTypeExternal, nil)
- c.ErrorTyped(errors.New("externo 1"), ErrorTypeExternal, nil)
- c.ErrorTyped(errors.New("interno 0"), ErrorTypeInternal, nil)
- c.ErrorTyped(errors.New("externo 2"), ErrorTypeExternal, nil)
- c.ErrorTyped(errors.New("interno 1"), ErrorTypeInternal, nil)
- c.ErrorTyped(errors.New("interno 2"), ErrorTypeInternal, nil)
+ c.Error(errors.New("externo 0")).SetType(ErrorTypePublic)
+ c.Error(errors.New("interno 0")).SetType(ErrorTypePrivate)
- for _, err := range c.Errors.ByType(ErrorTypeExternal) {
- assert.Equal(t, err.Flags, ErrorTypeExternal)
+ for _, err := range c.Errors.ByType(ErrorTypePublic) {
+ assert.Equal(t, err.Type, ErrorTypePublic)
}
-
- for _, err := range c.Errors.ByType(ErrorTypeInternal) {
- assert.Equal(t, err.Flags, ErrorTypeInternal)
+ for _, err := range c.Errors.ByType(ErrorTypePrivate) {
+ assert.Equal(t, err.Type, ErrorTypePrivate)
}
-
- assert.Equal(t, c.Errors.Errors(), []string{"externo 0", "externo 1", "interno 0", "externo 2", "interno 1", "interno 2"})
+ assert.Equal(t, c.Errors.Errors(), []string{"externo 0", "interno 0"})
}
-func TestContextFail(t *testing.T) {
+func TestContextAbortWithError(t *testing.T) {
c, w, _ := createTestContext()
- c.Fail(401, errors.New("bad input"))
+ c.AbortWithError(401, errors.New("bad input")).SetMeta("some input")
c.Writer.WriteHeaderNow()
assert.Equal(t, w.Code, 401)
- assert.Equal(t, c.LastError().Error(), "bad input")
- assert.Equal(t, c.index, AbortIndex)
+ assert.Equal(t, c.index, abortIndex)
assert.True(t, c.IsAborted())
}
@@ -407,13 +517,18 @@ func TestContextClientIP(t *testing.T) {
c, _, _ := createTestContext()
c.Request, _ = http.NewRequest("POST", "/", nil)
- c.Request.Header.Set("X-Real-IP", "10.10.10.10")
- c.Request.Header.Set("X-Forwarded-For", "20.20.20.20 , 30.30.30.30")
- c.Request.RemoteAddr = "40.40.40.40"
+ c.Request.Header.Set("X-Real-IP", " 10.10.10.10 ")
+ c.Request.Header.Set("X-Forwarded-For", " 20.20.20.20, 30.30.30.30")
+ c.Request.RemoteAddr = " 40.40.40.40 "
assert.Equal(t, c.ClientIP(), "10.10.10.10")
+
c.Request.Header.Del("X-Real-IP")
assert.Equal(t, c.ClientIP(), "20.20.20.20")
+
+ c.Request.Header.Set("X-Forwarded-For", "30.30.30.30 ")
+ assert.Equal(t, c.ClientIP(), "30.30.30.30")
+
c.Request.Header.Del("X-Forwarded-For")
assert.Equal(t, c.ClientIP(), "40.40.40.40")
}
@@ -426,15 +541,31 @@ func TestContextContentType(t *testing.T) {
assert.Equal(t, c.ContentType(), "application/json")
}
-func TestContextAutoBind(t *testing.T) {
- c, w, _ := createTestContext()
+func TestContextAutoBindJSON(t *testing.T) {
+ c, _, _ := createTestContext()
c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
c.Request.Header.Add("Content-Type", MIMEJSON)
+
var obj struct {
Foo string `json:"foo"`
Bar string `json:"bar"`
}
- assert.True(t, c.Bind(&obj))
+ assert.NoError(t, c.Bind(&obj))
+ assert.Equal(t, obj.Bar, "foo")
+ assert.Equal(t, obj.Foo, "bar")
+ assert.Empty(t, c.Errors)
+}
+
+func TestContextBindWithJSON(t *testing.T) {
+ c, w, _ := createTestContext()
+ c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
+ c.Request.Header.Add("Content-Type", MIMEXML) // set fake content-type
+
+ var obj struct {
+ Foo string `json:"foo"`
+ Bar string `json:"bar"`
+ }
+ assert.NoError(t, c.BindJSON(&obj))
assert.Equal(t, obj.Bar, "foo")
assert.Equal(t, obj.Foo, "bar")
assert.Equal(t, w.Body.Len(), 0)
@@ -450,7 +581,7 @@ func TestContextBadAutoBind(t *testing.T) {
}
assert.False(t, c.IsAborted())
- assert.False(t, c.Bind(&obj))
+ assert.Error(t, c.Bind(&obj))
c.Writer.WriteHeaderNow()
assert.Empty(t, obj.Bar)
@@ -459,20 +590,6 @@ func TestContextBadAutoBind(t *testing.T) {
assert.True(t, c.IsAborted())
}
-func TestContextBindWith(t *testing.T) {
- c, w, _ := createTestContext()
- c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
- c.Request.Header.Add("Content-Type", MIMEXML)
- var obj struct {
- Foo string `json:"foo"`
- Bar string `json:"bar"`
- }
- assert.True(t, c.BindWith(&obj, binding.JSON))
- assert.Equal(t, obj.Bar, "foo")
- assert.Equal(t, obj.Foo, "bar")
- assert.Equal(t, w.Body.Len(), 0)
-}
-
func TestContextGolangContext(t *testing.T) {
c, _, _ := createTestContext()
c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
diff --git a/vendor/github.com/gin-gonic/gin/debug.go b/vendor/github.com/gin-gonic/gin/debug.go
index 472389280..0836fc563 100644
--- a/vendor/github.com/gin-gonic/gin/debug.go
+++ b/vendor/github.com/gin-gonic/gin/debug.go
@@ -5,12 +5,17 @@
package gin
import (
+ "bytes"
+ "html/template"
"log"
- "os"
)
-var debugLogger = log.New(os.Stdout, "[GIN-debug] ", 0)
+func init() {
+ log.SetFlags(0)
+}
+// IsDebugging returns true if the framework is running in debug mode.
+// Use SetMode(gin.Release) to switch to disable the debug mode.
func IsDebugging() bool {
return ginMode == debugCode
}
@@ -18,19 +23,45 @@ func IsDebugging() bool {
func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) {
if IsDebugging() {
nuHandlers := len(handlers)
- handlerName := nameOfFunction(handlers[nuHandlers-1])
+ handlerName := nameOfFunction(handlers.Last())
debugPrint("%-5s %-25s --> %s (%d handlers)\n", httpMethod, absolutePath, handlerName, nuHandlers)
}
}
+func debugPrintLoadTemplate(tmpl *template.Template) {
+ if IsDebugging() {
+ var buf bytes.Buffer
+ for _, tmpl := range tmpl.Templates() {
+ buf.WriteString("\t- ")
+ buf.WriteString(tmpl.Name())
+ buf.WriteString("\n")
+ }
+ debugPrint("Loaded HTML Templates (%d): \n%s\n", len(tmpl.Templates()), buf.String())
+ }
+}
+
func debugPrint(format string, values ...interface{}) {
if IsDebugging() {
- debugLogger.Printf(format, values...)
+ log.Printf("[GIN-debug] "+format, values...)
}
}
-func debugPrintWARNING() {
- debugPrint("[WARNING] Running in DEBUG mode! Disable it before going production\n")
+func debugPrintWARNINGNew() {
+ debugPrint(`[WARNING] Running in "debug" mode. Switch to "release" mode in production.
+ - using env: export GIN_MODE=release
+ - using code: gin.SetMode(gin.ReleaseMode)
+
+`)
+}
+
+func debugPrintWARNINGSetHTMLTemplate() {
+ debugPrint(`[WARNING] Since SetHTMLTemplate() is NOT thread-safe. It should only be called
+at initialization. ie. before any route is registered or the router is listening in a socket:
+
+ router := gin.Default()
+ router.SetHTMLTemplate(template) // << good place
+
+`)
}
func debugPrintError(err error) {
diff --git a/vendor/github.com/gin-gonic/gin/debug_test.go b/vendor/github.com/gin-gonic/gin/debug_test.go
index 8eb60d882..7a352e6ec 100644
--- a/vendor/github.com/gin-gonic/gin/debug_test.go
+++ b/vendor/github.com/gin-gonic/gin/debug_test.go
@@ -9,13 +9,12 @@ import (
"errors"
"io"
"log"
+ "os"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
-var cachedDebugLogger *log.Logger = nil
-
// TODO
// func debugRoute(httpMethod, absolutePath string, handlers HandlersChain) {
// func debugPrint(format string, values ...interface{}) {
@@ -58,22 +57,21 @@ func TestDebugPrintError(t *testing.T) {
assert.Equal(t, w.String(), "[GIN-debug] [ERROR] this is an error\n")
}
+func TestDebugPrintRoutes(t *testing.T) {
+ var w bytes.Buffer
+ setup(&w)
+ defer teardown()
+
+ debugPrintRoute("GET", "/path/to/route/:param", HandlersChain{func(c *Context) {}, handlerNameTest})
+ assert.Equal(t, w.String(), "[GIN-debug] GET /path/to/route/:param --> github.com/gin-gonic/gin.handlerNameTest (2 handlers)\n")
+}
+
func setup(w io.Writer) {
SetMode(DebugMode)
- if cachedDebugLogger == nil {
- cachedDebugLogger = debugLogger
- debugLogger = log.New(w, debugLogger.Prefix(), 0)
- } else {
- panic("setup failed")
- }
+ log.SetOutput(w)
}
func teardown() {
SetMode(TestMode)
- if cachedDebugLogger != nil {
- debugLogger = cachedDebugLogger
- cachedDebugLogger = nil
- } else {
- panic("teardown failed")
- }
+ log.SetOutput(os.Stdout)
}
diff --git a/vendor/github.com/gin-gonic/gin/errors.go b/vendor/github.com/gin-gonic/gin/errors.go
index 73179aa19..e829c886b 100644
--- a/vendor/github.com/gin-gonic/gin/errors.go
+++ b/vendor/github.com/gin-gonic/gin/errors.go
@@ -6,55 +6,156 @@ package gin
import (
"bytes"
+ "encoding/json"
"fmt"
+ "reflect"
)
+type ErrorType uint64
+
const (
- ErrorTypeInternal = 1 << iota
- ErrorTypeExternal = 1 << iota
- ErrorTypeAny = 0xffffffff
+ ErrorTypeBind ErrorType = 1 << 63 // used when c.Bind() fails
+ ErrorTypeRender ErrorType = 1 << 62 // used when c.Render() fails
+ ErrorTypePrivate ErrorType = 1 << 0
+ ErrorTypePublic ErrorType = 1 << 1
+
+ ErrorTypeAny ErrorType = 1<<64 - 1
+ ErrorTypeNu = 2
)
-// Used internally to collect errors that occurred during an http request.
-type errorMsg struct {
- Error error `json:"error"`
- Flags int `json:"-"`
- Meta interface{} `json:"meta"`
+type (
+ Error struct {
+ Err error
+ Type ErrorType
+ Meta interface{}
+ }
+
+ errorMsgs []*Error
+)
+
+var _ error = &Error{}
+
+func (msg *Error) SetType(flags ErrorType) *Error {
+ msg.Type = flags
+ return msg
}
-type errorMsgs []errorMsg
+func (msg *Error) SetMeta(data interface{}) *Error {
+ msg.Meta = data
+ return msg
+}
-func (a errorMsgs) ByType(typ int) errorMsgs {
+func (msg *Error) JSON() interface{} {
+ json := H{}
+ if msg.Meta != nil {
+ value := reflect.ValueOf(msg.Meta)
+ switch value.Kind() {
+ case reflect.Struct:
+ return msg.Meta
+ case reflect.Map:
+ for _, key := range value.MapKeys() {
+ json[key.String()] = value.MapIndex(key).Interface()
+ }
+ default:
+ json["meta"] = msg.Meta
+ }
+ }
+ if _, ok := json["error"]; !ok {
+ json["error"] = msg.Error()
+ }
+ return json
+}
+
+// Implements the json.Marshaller interface
+func (msg *Error) MarshalJSON() ([]byte, error) {
+ return json.Marshal(msg.JSON())
+}
+
+// Implements the error interface
+func (msg *Error) Error() string {
+ return msg.Err.Error()
+}
+
+func (msg *Error) IsType(flags ErrorType) bool {
+ return (msg.Type & flags) > 0
+}
+
+// Returns a readonly copy filterd the byte.
+// ie ByType(gin.ErrorTypePublic) returns a slice of errors with type=ErrorTypePublic
+func (a errorMsgs) ByType(typ ErrorType) errorMsgs {
if len(a) == 0 {
+ return nil
+ }
+ if typ == ErrorTypeAny {
return a
}
- result := make(errorMsgs, 0, len(a))
+ var result errorMsgs = nil
for _, msg := range a {
- if msg.Flags&typ > 0 {
+ if msg.IsType(typ) {
result = append(result, msg)
}
}
return result
}
+// Returns the last error in the slice. It returns nil if the array is empty.
+// Shortcut for errors[len(errors)-1]
+func (a errorMsgs) Last() *Error {
+ length := len(a)
+ if length > 0 {
+ return a[length-1]
+ }
+ return nil
+}
+
+// Returns an array will all the error messages.
+// Example
+// ```
+// c.Error(errors.New("first"))
+// c.Error(errors.New("second"))
+// c.Error(errors.New("third"))
+// c.Errors.Errors() // == []string{"first", "second", "third"}
+// ``
func (a errorMsgs) Errors() []string {
if len(a) == 0 {
- return []string{}
+ return nil
}
errorStrings := make([]string, len(a))
for i, err := range a {
- errorStrings[i] = err.Error.Error()
+ errorStrings[i] = err.Error()
}
return errorStrings
}
+func (a errorMsgs) JSON() interface{} {
+ switch len(a) {
+ case 0:
+ return nil
+ case 1:
+ return a.Last().JSON()
+ default:
+ json := make([]interface{}, len(a))
+ for i, err := range a {
+ json[i] = err.JSON()
+ }
+ return json
+ }
+}
+
+func (a errorMsgs) MarshalJSON() ([]byte, error) {
+ return json.Marshal(a.JSON())
+}
+
func (a errorMsgs) String() string {
if len(a) == 0 {
return ""
}
var buffer bytes.Buffer
for i, msg := range a {
- fmt.Fprintf(&buffer, "Error #%02d: %s\n Meta: %v\n", (i + 1), msg.Error, msg.Meta)
+ fmt.Fprintf(&buffer, "Error #%02d: %s\n", (i + 1), msg.Err)
+ if msg.Meta != nil {
+ fmt.Fprintf(&buffer, " Meta: %v\n", msg.Meta)
+ }
}
return buffer.String()
}
diff --git a/vendor/github.com/gin-gonic/gin/errors_test.go b/vendor/github.com/gin-gonic/gin/errors_test.go
new file mode 100644
index 000000000..c9a3407b7
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/errors_test.go
@@ -0,0 +1,99 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
+package gin
+
+import (
+ "encoding/json"
+ "errors"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestError(t *testing.T) {
+ baseError := errors.New("test error")
+ err := &Error{
+ Err: baseError,
+ Type: ErrorTypePrivate,
+ }
+ assert.Equal(t, err.Error(), baseError.Error())
+ assert.Equal(t, err.JSON(), H{"error": baseError.Error()})
+
+ assert.Equal(t, err.SetType(ErrorTypePublic), err)
+ assert.Equal(t, err.Type, ErrorTypePublic)
+
+ assert.Equal(t, err.SetMeta("some data"), err)
+ assert.Equal(t, err.Meta, "some data")
+ assert.Equal(t, err.JSON(), H{
+ "error": baseError.Error(),
+ "meta": "some data",
+ })
+
+ jsonBytes, _ := json.Marshal(err)
+ assert.Equal(t, string(jsonBytes), "{\"error\":\"test error\",\"meta\":\"some data\"}")
+
+ err.SetMeta(H{
+ "status": "200",
+ "data": "some data",
+ })
+ assert.Equal(t, err.JSON(), H{
+ "error": baseError.Error(),
+ "status": "200",
+ "data": "some data",
+ })
+
+ err.SetMeta(H{
+ "error": "custom error",
+ "status": "200",
+ "data": "some data",
+ })
+ assert.Equal(t, err.JSON(), H{
+ "error": "custom error",
+ "status": "200",
+ "data": "some data",
+ })
+}
+
+func TestErrorSlice(t *testing.T) {
+ errs := errorMsgs{
+ {Err: errors.New("first"), Type: ErrorTypePrivate},
+ {Err: errors.New("second"), Type: ErrorTypePrivate, Meta: "some data"},
+ {Err: errors.New("third"), Type: ErrorTypePublic, Meta: H{"status": "400"}},
+ }
+
+ assert.Equal(t, errs, errs.ByType(ErrorTypeAny))
+ assert.Equal(t, errs.Last().Error(), "third")
+ assert.Equal(t, errs.Errors(), []string{"first", "second", "third"})
+ assert.Equal(t, errs.ByType(ErrorTypePublic).Errors(), []string{"third"})
+ assert.Equal(t, errs.ByType(ErrorTypePrivate).Errors(), []string{"first", "second"})
+ assert.Equal(t, errs.ByType(ErrorTypePublic|ErrorTypePrivate).Errors(), []string{"first", "second", "third"})
+ assert.Empty(t, errs.ByType(ErrorTypeBind))
+ assert.Empty(t, errs.ByType(ErrorTypeBind).String())
+
+ assert.Equal(t, errs.String(), `Error #01: first
+Error #02: second
+ Meta: some data
+Error #03: third
+ Meta: map[status:400]
+`)
+ assert.Equal(t, errs.JSON(), []interface{}{
+ H{"error": "first"},
+ H{"error": "second", "meta": "some data"},
+ H{"error": "third", "status": "400"},
+ })
+ jsonBytes, _ := json.Marshal(errs)
+ assert.Equal(t, string(jsonBytes), "[{\"error\":\"first\"},{\"error\":\"second\",\"meta\":\"some data\"},{\"error\":\"third\",\"status\":\"400\"}]")
+ errs = errorMsgs{
+ {Err: errors.New("first"), Type: ErrorTypePrivate},
+ }
+ assert.Equal(t, errs.JSON(), H{"error": "first"})
+ jsonBytes, _ = json.Marshal(errs)
+ assert.Equal(t, string(jsonBytes), "{\"error\":\"first\"}")
+
+ errs = errorMsgs{}
+ assert.Nil(t, errs.Last())
+ assert.Nil(t, errs.JSON())
+ assert.Empty(t, errs.String())
+}
diff --git a/vendor/github.com/gin-gonic/gin/examples/app-engine/README.md b/vendor/github.com/gin-gonic/gin/examples/app-engine/README.md
new file mode 100644
index 000000000..48505de83
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/app-engine/README.md
@@ -0,0 +1,7 @@
+# Guide to run Gin under App Engine LOCAL Development Server
+
+1. Download, install and setup Go in your computer. (That includes setting your `$GOPATH`.)
+2. Download SDK for your platform from here: `https://developers.google.com/appengine/downloads?hl=es#Google_App_Engine_SDK_for_Go`
+3. Download Gin source code using: `$ go get github.com/gin-gonic/gin`
+4. Navigate to examples folder: `$ cd $GOPATH/src/github.com/gin-gonic/gin/examples/`
+5. Run it: `$ goapp serve app-engine/`
\ No newline at end of file
diff --git a/vendor/github.com/gin-gonic/gin/examples/app-engine/app.yaml b/vendor/github.com/gin-gonic/gin/examples/app-engine/app.yaml
new file mode 100644
index 000000000..5f20cf3f2
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/app-engine/app.yaml
@@ -0,0 +1,8 @@
+application: hello
+version: 1
+runtime: go
+api_version: go1
+
+handlers:
+- url: /.*
+ script: _go_app
\ No newline at end of file
diff --git a/vendor/github.com/gin-gonic/gin/examples/app-engine/hello.go b/vendor/github.com/gin-gonic/gin/examples/app-engine/hello.go
new file mode 100644
index 000000000..f5daf824b
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/app-engine/hello.go
@@ -0,0 +1,23 @@
+package hello
+
+import (
+ "net/http"
+ "github.com/gin-gonic/gin"
+)
+
+// This function's name is a must. App Engine uses it to drive the requests properly.
+func init() {
+ // Starts a new Gin instance with no middle-ware
+ r := gin.New()
+
+ // Define your handlers
+ r.GET("/", func(c *gin.Context){
+ c.String(200, "Hello World!")
+ })
+ r.GET("/ping", func(c *gin.Context){
+ c.String(200, "pong")
+ })
+
+ // Handle all requests using net/http
+ http.Handle("/", r)
+}
\ No newline at end of file
diff --git a/vendor/github.com/gin-gonic/gin/examples/basic/main.go b/vendor/github.com/gin-gonic/gin/examples/basic/main.go
new file mode 100644
index 000000000..80f2bd3c7
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/basic/main.go
@@ -0,0 +1,56 @@
+package main
+
+import (
+ "github.com/gin-gonic/gin"
+)
+
+var DB = make(map[string]string)
+
+func main() {
+ r := gin.Default()
+
+ // Ping test
+ r.GET("/ping", func(c *gin.Context) {
+ c.String(200, "pong")
+ })
+
+ // Get user value
+ r.GET("/user/:name", func(c *gin.Context) {
+ user := c.Params.ByName("name")
+ value, ok := DB[user]
+ if ok {
+ c.JSON(200, gin.H{"user": user, "value": value})
+ } else {
+ c.JSON(200, gin.H{"user": user, "status": "no value"})
+ }
+ })
+
+ // Authorized group (uses gin.BasicAuth() middleware)
+ // Same than:
+ // authorized := r.Group("/")
+ // authorized.Use(gin.BasicAuth(gin.Credentials{
+ // "foo": "bar",
+ // "manu": "123",
+ //}))
+ authorized := r.Group("/", gin.BasicAuth(gin.Accounts{
+ "foo": "bar", // user:foo password:bar
+ "manu": "123", // user:manu password:123
+ }))
+
+ authorized.POST("admin", func(c *gin.Context) {
+ user := c.MustGet(gin.AuthUserKey).(string)
+
+ // Parse JSON
+ var json struct {
+ Value string `json:"value" binding:"required"`
+ }
+
+ if c.Bind(&json) == nil {
+ DB[user] = json.Value
+ c.JSON(200, gin.H{"status": "ok"})
+ }
+ })
+
+ // Listen and Server in 0.0.0.0:8080
+ r.Run(":8080")
+}
diff --git a/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/main.go b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/main.go
new file mode 100644
index 000000000..1f3c8585f
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/main.go
@@ -0,0 +1,39 @@
+package main
+
+import (
+ "fmt"
+ "runtime"
+
+ "github.com/gin-gonic/gin"
+)
+
+func main() {
+ ConfigRuntime()
+ StartWorkers()
+ StartGin()
+}
+
+func ConfigRuntime() {
+ nuCPU := runtime.NumCPU()
+ runtime.GOMAXPROCS(nuCPU)
+ fmt.Printf("Running with %d CPUs\n", nuCPU)
+}
+
+func StartWorkers() {
+ go statsWorker()
+}
+
+func StartGin() {
+ gin.SetMode(gin.ReleaseMode)
+
+ router := gin.New()
+ router.Use(rateLimit, gin.Recovery())
+ router.LoadHTMLGlob("resources/*.templ.html")
+ router.Static("/static", "resources/static")
+ router.GET("/", index)
+ router.GET("/room/:roomid", roomGET)
+ router.POST("/room-post/:roomid", roomPOST)
+ router.GET("/stream/:roomid", streamRoom)
+
+ router.Run(":80")
+}
diff --git a/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/resources/static/realtime.js b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/resources/static/realtime.js
new file mode 100644
index 000000000..919dae26c
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/resources/static/realtime.js
@@ -0,0 +1,144 @@
+
+
+function StartRealtime(roomid, timestamp) {
+ StartEpoch(timestamp);
+ StartSSE(roomid);
+ StartForm();
+}
+
+function StartForm() {
+ $('#chat-message').focus();
+ $('#chat-form').ajaxForm(function() {
+ $('#chat-message').val('');
+ $('#chat-message').focus();
+ });
+}
+
+function StartEpoch(timestamp) {
+ var windowSize = 60;
+ var height = 200;
+ var defaultData = histogram(windowSize, timestamp);
+
+ window.heapChart = $('#heapChart').epoch({
+ type: 'time.area',
+ axes: ['bottom', 'left'],
+ height: height,
+ historySize: 10,
+ data: [
+ {values: defaultData},
+ {values: defaultData}
+ ]
+ });
+
+ window.mallocsChart = $('#mallocsChart').epoch({
+ type: 'time.area',
+ axes: ['bottom', 'left'],
+ height: height,
+ historySize: 10,
+ data: [
+ {values: defaultData},
+ {values: defaultData}
+ ]
+ });
+
+ window.messagesChart = $('#messagesChart').epoch({
+ type: 'time.line',
+ axes: ['bottom', 'left'],
+ height: 240,
+ historySize: 10,
+ data: [
+ {values: defaultData},
+ {values: defaultData},
+ {values: defaultData}
+ ]
+ });
+}
+
+function StartSSE(roomid) {
+ if (!window.EventSource) {
+ alert("EventSource is not enabled in this browser");
+ return;
+ }
+ var source = new EventSource('/stream/'+roomid);
+ source.addEventListener('message', newChatMessage, false);
+ source.addEventListener('stats', stats, false);
+}
+
+function stats(e) {
+ var data = parseJSONStats(e.data);
+ heapChart.push(data.heap);
+ mallocsChart.push(data.mallocs);
+ messagesChart.push(data.messages);
+}
+
+function parseJSONStats(e) {
+ var data = jQuery.parseJSON(e);
+ var timestamp = data.timestamp;
+
+ var heap = [
+ {time: timestamp, y: data.HeapInuse},
+ {time: timestamp, y: data.StackInuse}
+ ];
+
+ var mallocs = [
+ {time: timestamp, y: data.Mallocs},
+ {time: timestamp, y: data.Frees}
+ ];
+ var messages = [
+ {time: timestamp, y: data.Connected},
+ {time: timestamp, y: data.Inbound},
+ {time: timestamp, y: data.Outbound}
+ ];
+
+ return {
+ heap: heap,
+ mallocs: mallocs,
+ messages: messages
+ }
+}
+
+function newChatMessage(e) {
+ var data = jQuery.parseJSON(e.data);
+ var nick = data.nick;
+ var message = data.message;
+ var style = rowStyle(nick);
+ var html = ""+nick+" | "+message+" |
";
+ $('#chat').append(html);
+
+ $("#chat-scroll").scrollTop($("#chat-scroll")[0].scrollHeight);
+}
+
+function histogram(windowSize, timestamp) {
+ var entries = new Array(windowSize);
+ for(var i = 0; i < windowSize; i++) {
+ entries[i] = {time: (timestamp-windowSize+i-1), y:0};
+ }
+ return entries;
+}
+
+var entityMap = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': '"',
+ "'": ''',
+ "/": '/'
+};
+
+function rowStyle(nick) {
+ var classes = ['active', 'success', 'info', 'warning', 'danger'];
+ var index = hashCode(nick)%5;
+ return classes[index];
+}
+
+function hashCode(s){
+ return Math.abs(s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0));
+}
+
+function escapeHtml(string) {
+ return String(string).replace(/[&<>"'\/]/g, function (s) {
+ return entityMap[s];
+ });
+}
+
+window.StartRealtime = StartRealtime
diff --git a/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/rooms.go b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/rooms.go
new file mode 100644
index 000000000..82396ba37
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/rooms.go
@@ -0,0 +1,25 @@
+package main
+
+import "github.com/dustin/go-broadcast"
+
+var roomChannels = make(map[string]broadcast.Broadcaster)
+
+func openListener(roomid string) chan interface{} {
+ listener := make(chan interface{})
+ room(roomid).Register(listener)
+ return listener
+}
+
+func closeListener(roomid string, listener chan interface{}) {
+ room(roomid).Unregister(listener)
+ close(listener)
+}
+
+func room(roomid string) broadcast.Broadcaster {
+ b, ok := roomChannels[roomid]
+ if !ok {
+ b = broadcast.NewBroadcaster(10)
+ roomChannels[roomid] = b
+ }
+ return b
+}
diff --git a/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/routes.go b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/routes.go
new file mode 100644
index 000000000..b18775658
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/routes.go
@@ -0,0 +1,96 @@
+package main
+
+import (
+ "fmt"
+ "html"
+ "io"
+ "strings"
+ "time"
+
+ "github.com/gin-gonic/gin"
+)
+
+func rateLimit(c *gin.Context) {
+
+ ip := c.ClientIP()
+ value := int(ips.Add(ip, 1))
+ if value%50 == 0 {
+ fmt.Printf("ip: %s, count: %d\n", ip, value)
+ }
+ if value >= 200 {
+ if value%200 == 0 {
+ fmt.Println("ip blocked")
+ }
+ c.Abort()
+ c.String(503, "you were automatically banned :)")
+ }
+}
+
+func index(c *gin.Context) {
+ c.Redirect(301, "/room/hn")
+}
+
+func roomGET(c *gin.Context) {
+ roomid := c.Param("roomid")
+ nick := c.Query("nick")
+ if len(nick) < 2 {
+ nick = ""
+ }
+ if len(nick) > 13 {
+ nick = nick[0:12] + "..."
+ }
+ c.HTML(200, "room_login.templ.html", gin.H{
+ "roomid": roomid,
+ "nick": nick,
+ "timestamp": time.Now().Unix(),
+ })
+
+}
+
+func roomPOST(c *gin.Context) {
+ roomid := c.Param("roomid")
+ nick := c.Query("nick")
+ message := c.PostForm("message")
+ message = strings.TrimSpace(message)
+
+ validMessage := len(message) > 1 && len(message) < 200
+ validNick := len(nick) > 1 && len(nick) < 14
+ if !validMessage || !validNick {
+ c.JSON(400, gin.H{
+ "status": "failed",
+ "error": "the message or nickname is too long",
+ })
+ return
+ }
+
+ post := gin.H{
+ "nick": html.EscapeString(nick),
+ "message": html.EscapeString(message),
+ }
+ messages.Add("inbound", 1)
+ room(roomid).Submit(post)
+ c.JSON(200, post)
+}
+
+func streamRoom(c *gin.Context) {
+ roomid := c.Param("roomid")
+ listener := openListener(roomid)
+ ticker := time.NewTicker(1 * time.Second)
+ users.Add("connected", 1)
+ defer func() {
+ closeListener(roomid, listener)
+ ticker.Stop()
+ users.Add("disconnected", 1)
+ }()
+
+ c.Stream(func(w io.Writer) bool {
+ select {
+ case msg := <-listener:
+ messages.Add("outbound", 1)
+ c.SSEvent("message", msg)
+ case <-ticker.C:
+ c.SSEvent("stats", Stats())
+ }
+ return true
+ })
+}
diff --git a/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/stats.go b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/stats.go
new file mode 100644
index 000000000..c36ecc781
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/realtime-advanced/stats.go
@@ -0,0 +1,56 @@
+package main
+
+import (
+ "runtime"
+ "sync"
+ "time"
+
+ "github.com/manucorporat/stats"
+)
+
+var ips = stats.New()
+var messages = stats.New()
+var users = stats.New()
+var mutexStats sync.RWMutex
+var savedStats map[string]uint64
+
+func statsWorker() {
+ c := time.Tick(1 * time.Second)
+ var lastMallocs uint64 = 0
+ var lastFrees uint64 = 0
+ for _ = range c {
+ var stats runtime.MemStats
+ runtime.ReadMemStats(&stats)
+
+ mutexStats.Lock()
+ savedStats = map[string]uint64{
+ "timestamp": uint64(time.Now().Unix()),
+ "HeapInuse": stats.HeapInuse,
+ "StackInuse": stats.StackInuse,
+ "Mallocs": (stats.Mallocs - lastMallocs),
+ "Frees": (stats.Frees - lastFrees),
+ "Inbound": uint64(messages.Get("inbound")),
+ "Outbound": uint64(messages.Get("outbound")),
+ "Connected": connectedUsers(),
+ }
+ lastMallocs = stats.Mallocs
+ lastFrees = stats.Frees
+ messages.Reset()
+ mutexStats.Unlock()
+ }
+}
+
+func connectedUsers() uint64 {
+ connected := users.Get("connected") - users.Get("disconnected")
+ if connected < 0 {
+ return 0
+ }
+ return uint64(connected)
+}
+
+func Stats() map[string]uint64 {
+ mutexStats.RLock()
+ defer mutexStats.RUnlock()
+
+ return savedStats
+}
diff --git a/vendor/github.com/gin-gonic/gin/examples/realtime-chat/main.go b/vendor/github.com/gin-gonic/gin/examples/realtime-chat/main.go
new file mode 100644
index 000000000..e4b55a0f0
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/realtime-chat/main.go
@@ -0,0 +1,58 @@
+package main
+
+import (
+ "fmt"
+ "io"
+ "math/rand"
+
+ "github.com/gin-gonic/gin"
+)
+
+func main() {
+ router := gin.Default()
+ router.SetHTMLTemplate(html)
+
+ router.GET("/room/:roomid", roomGET)
+ router.POST("/room/:roomid", roomPOST)
+ router.DELETE("/room/:roomid", roomDELETE)
+ router.GET("/stream/:roomid", stream)
+
+ router.Run(":8080")
+}
+
+func stream(c *gin.Context) {
+ roomid := c.Param("roomid")
+ listener := openListener(roomid)
+ defer closeListener(roomid, listener)
+
+ c.Stream(func(w io.Writer) bool {
+ c.SSEvent("message", <-listener)
+ return true
+ })
+}
+
+func roomGET(c *gin.Context) {
+ roomid := c.Param("roomid")
+ userid := fmt.Sprint(rand.Int31())
+ c.HTML(200, "chat_room", gin.H{
+ "roomid": roomid,
+ "userid": userid,
+ })
+}
+
+func roomPOST(c *gin.Context) {
+ roomid := c.Param("roomid")
+ userid := c.PostForm("user")
+ message := c.PostForm("message")
+ room(roomid).Submit(userid + ": " + message)
+
+ c.JSON(200, gin.H{
+ "status": "success",
+ "message": message,
+ })
+}
+
+func roomDELETE(c *gin.Context) {
+ roomid := c.Param("roomid")
+ deleteBroadcast(roomid)
+}
diff --git a/vendor/github.com/gin-gonic/gin/examples/realtime-chat/rooms.go b/vendor/github.com/gin-gonic/gin/examples/realtime-chat/rooms.go
new file mode 100644
index 000000000..8c62bece1
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/realtime-chat/rooms.go
@@ -0,0 +1,33 @@
+package main
+
+import "github.com/dustin/go-broadcast"
+
+var roomChannels = make(map[string]broadcast.Broadcaster)
+
+func openListener(roomid string) chan interface{} {
+ listener := make(chan interface{})
+ room(roomid).Register(listener)
+ return listener
+}
+
+func closeListener(roomid string, listener chan interface{}) {
+ room(roomid).Unregister(listener)
+ close(listener)
+}
+
+func deleteBroadcast(roomid string) {
+ b, ok := roomChannels[roomid]
+ if ok {
+ b.Close()
+ delete(roomChannels, roomid)
+ }
+}
+
+func room(roomid string) broadcast.Broadcaster {
+ b, ok := roomChannels[roomid]
+ if !ok {
+ b = broadcast.NewBroadcaster(10)
+ roomChannels[roomid] = b
+ }
+ return b
+}
diff --git a/vendor/github.com/gin-gonic/gin/examples/realtime-chat/template.go b/vendor/github.com/gin-gonic/gin/examples/realtime-chat/template.go
new file mode 100644
index 000000000..b9024de6d
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/examples/realtime-chat/template.go
@@ -0,0 +1,44 @@
+package main
+
+import "html/template"
+
+var html = template.Must(template.New("chat_room").Parse(`
+
+
+ {{.roomid}}
+
+
+
+
+
+
+ Welcome to {{.roomid}} room
+
+
+
+
+`))
diff --git a/vendor/github.com/gin-gonic/gin/fs.go b/vendor/github.com/gin-gonic/gin/fs.go
new file mode 100644
index 000000000..6af3ded55
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/fs.go
@@ -0,0 +1,42 @@
+package gin
+
+import (
+ "net/http"
+ "os"
+)
+
+type (
+ onlyfilesFS struct {
+ fs http.FileSystem
+ }
+ neuteredReaddirFile struct {
+ http.File
+ }
+)
+
+// Dir returns a http.Filesystem that can be used by http.FileServer(). It is used interally
+// in router.Static().
+// if listDirectory == true, then it works the same as http.Dir() otherwise it returns
+// a filesystem that prevents http.FileServer() to list the directory files.
+func Dir(root string, listDirectory bool) http.FileSystem {
+ fs := http.Dir(root)
+ if listDirectory {
+ return fs
+ }
+ return &onlyfilesFS{fs}
+}
+
+// Conforms to http.Filesystem
+func (fs onlyfilesFS) Open(name string) (http.File, error) {
+ f, err := fs.fs.Open(name)
+ if err != nil {
+ return nil, err
+ }
+ return neuteredReaddirFile{f}, nil
+}
+
+// Overrides the http.File default implementation
+func (f neuteredReaddirFile) Readdir(count int) ([]os.FileInfo, error) {
+ // this disables directory listing
+ return nil, nil
+}
diff --git a/vendor/github.com/gin-gonic/gin/gin.go b/vendor/github.com/gin-gonic/gin/gin.go
index e2c64f1a1..3834d67e5 100644
--- a/vendor/github.com/gin-gonic/gin/gin.go
+++ b/vendor/github.com/gin-gonic/gin/gin.go
@@ -11,27 +11,46 @@ import (
"os"
"sync"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/gin-gonic/gin/binding"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/gin-gonic/gin/render"
+ "github.com/gin-gonic/gin/render"
)
+// Framework's version
+const Version = "v1.0rc2"
+
var default404Body = []byte("404 page not found")
var default405Body = []byte("405 method not allowed")
-type (
- HandlerFunc func(*Context)
- HandlersChain []HandlerFunc
+type HandlerFunc func(*Context)
+type HandlersChain []HandlerFunc
- // Represents the web framework, it wraps the blazing fast httprouter multiplexer and a list of global middlewares.
+// Last returns the last handler in the chain. ie. the last handler is the main own.
+func (c HandlersChain) Last() HandlerFunc {
+ length := len(c)
+ if length > 0 {
+ return c[length-1]
+ }
+ return nil
+}
+
+type (
+ RoutesInfo []RouteInfo
+ RouteInfo struct {
+ Method string
+ Path string
+ Handler string
+ }
+
+ // Engine is the framework's instance, it contains the muxer, middleware and configuration settings.
+ // Create an instance of Engine, by using New() or Default()
Engine struct {
RouterGroup
HTMLRender render.HTMLRender
- pool sync.Pool
allNoRoute HandlersChain
allNoMethod HandlersChain
noRoute HandlersChain
noMethod HandlersChain
- trees map[string]*node
+ pool sync.Pool
+ trees methodTrees
// Enables automatic redirection if the current route can't be matched but a
// handler for the path with (without) the trailing slash exists.
@@ -58,22 +77,31 @@ type (
// If no other Method is allowed, the request is delegated to the NotFound
// handler.
HandleMethodNotAllowed bool
+ ForwardedByClientIP bool
}
)
-// Returns a new blank Engine instance without any middleware attached.
-// The most basic configuration
+var _ IRouter = &Engine{}
+
+// New returns a new blank Engine instance without any middleware attached.
+// By default the configuration is:
+// - RedirectTrailingSlash: true
+// - RedirectFixedPath: false
+// - HandleMethodNotAllowed: false
+// - ForwardedByClientIP: true
func New() *Engine {
- debugPrintWARNING()
+ debugPrintWARNINGNew()
engine := &Engine{
RouterGroup: RouterGroup{
Handlers: nil,
- BasePath: "/",
+ basePath: "/",
+ root: true,
},
RedirectTrailingSlash: true,
- RedirectFixedPath: true,
- HandleMethodNotAllowed: true,
- trees: make(map[string]*node),
+ RedirectFixedPath: false,
+ HandleMethodNotAllowed: false,
+ ForwardedByClientIP: true,
+ trees: make(methodTrees, 0, 9),
}
engine.RouterGroup.engine = engine
engine.pool.New = func() interface{} {
@@ -82,19 +110,20 @@ func New() *Engine {
return engine
}
-// Returns a Engine instance with the Logger and Recovery already attached.
+// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *Engine {
engine := New()
engine.Use(Recovery(), Logger())
return engine
}
-func (engine *Engine) allocateContext() (context *Context) {
- return &Context{Engine: engine}
+func (engine *Engine) allocateContext() *Context {
+ return &Context{engine: engine}
}
func (engine *Engine) LoadHTMLGlob(pattern string) {
if IsDebugging() {
+ debugPrintLoadTemplate(template.Must(template.ParseGlob(pattern)))
engine.HTMLRender = render.HTMLDebug{Glob: pattern}
} else {
templ := template.Must(template.ParseGlob(pattern))
@@ -112,6 +141,9 @@ func (engine *Engine) LoadHTMLFiles(files ...string) {
}
func (engine *Engine) SetHTMLTemplate(templ *template.Template) {
+ if len(engine.trees) > 0 {
+ debugPrintWARNINGSetHTMLTemplate()
+ }
engine.HTMLRender = render.HTMLProduction{Template: templ}
}
@@ -121,15 +153,20 @@ func (engine *Engine) NoRoute(handlers ...HandlerFunc) {
engine.rebuild404Handlers()
}
+// Sets the handlers called when... TODO
func (engine *Engine) NoMethod(handlers ...HandlerFunc) {
engine.noMethod = handlers
engine.rebuild405Handlers()
}
-func (engine *Engine) Use(middlewares ...HandlerFunc) {
- engine.RouterGroup.Use(middlewares...)
+// Attachs a global middleware to the router. ie. the middleware attached though Use() will be
+// included in the handlers chain for every single request. Even 404, 405, static files...
+// For example, this is the right place for a logger or error management middleware.
+func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
+ engine.RouterGroup.Use(middleware...)
engine.rebuild404Handlers()
engine.rebuild405Handlers()
+ return engine
}
func (engine *Engine) rebuild404Handlers() {
@@ -153,30 +190,67 @@ func (engine *Engine) addRoute(method, path string, handlers HandlersChain) {
panic("there must be at least one handler")
}
- root := engine.trees[method]
+ root := engine.trees.get(method)
if root == nil {
root = new(node)
- engine.trees[method] = root
+ engine.trees = append(engine.trees, methodTree{
+ method: method,
+ root: root,
+ })
}
root.addRoute(path, handlers)
}
-func (engine *Engine) Run(addr string) (err error) {
- debugPrint("Listening and serving HTTP on %s\n", addr)
+// Routes returns a slice of registered routes, including some useful information, such as:
+// the http method, path and the handler name.
+func (engine *Engine) Routes() (routes RoutesInfo) {
+ for _, tree := range engine.trees {
+ routes = iterate("", tree.method, routes, tree.root)
+ }
+ return routes
+}
+
+func iterate(path, method string, routes RoutesInfo, root *node) RoutesInfo {
+ path += root.path
+ if len(root.handlers) > 0 {
+ routes = append(routes, RouteInfo{
+ Method: method,
+ Path: path,
+ Handler: nameOfFunction(root.handlers.Last()),
+ })
+ }
+ for _, child := range root.children {
+ routes = iterate(path, method, routes, child)
+ }
+ return routes
+}
+
+// Run attaches the router to a http.Server and starts listening and serving HTTP requests.
+// It is a shortcut for http.ListenAndServe(addr, router)
+// Note: this method will block the calling goroutine undefinitelly unless an error happens.
+func (engine *Engine) Run(addr ...string) (err error) {
defer func() { debugPrintError(err) }()
- err = http.ListenAndServe(addr, engine)
+ address := resolveAddress(addr)
+ debugPrint("Listening and serving HTTP on %s\n", address)
+ err = http.ListenAndServe(address, engine)
return
}
-func (engine *Engine) RunTLS(addr string, cert string, key string) (err error) {
+// RunTLS attaches the router to a http.Server and starts listening and serving HTTPS (secure) requests.
+// It is a shortcut for http.ListenAndServeTLS(addr, certFile, keyFile, router)
+// Note: this method will block the calling goroutine undefinitelly unless an error happens.
+func (engine *Engine) RunTLS(addr string, certFile string, keyFile string) (err error) {
debugPrint("Listening and serving HTTPS on %s\n", addr)
defer func() { debugPrintError(err) }()
- err = http.ListenAndServe(addr, engine)
+ err = http.ListenAndServeTLS(addr, certFile, keyFile, engine)
return
}
+// RunUnix attaches the router to a http.Server and starts listening and serving HTTP requests
+// through the specified unix socket (ie. a file).
+// Note: this method will block the calling goroutine undefinitelly unless an error happens.
func (engine *Engine) RunUnix(file string) (err error) {
debugPrint("Listening and serving HTTP on unix:/%s", file)
defer func() { debugPrintError(err) }()
@@ -191,22 +265,15 @@ func (engine *Engine) RunUnix(file string) (err error) {
return
}
-// ServeHTTP makes the router implement the http.Handler interface.
+// Conforms to the http.Handler interface.
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
- c := engine.getcontext(w, req)
- engine.handleHTTPRequest(c)
- engine.putcontext(c)
-}
-
-func (engine *Engine) getcontext(w http.ResponseWriter, req *http.Request) *Context {
c := engine.pool.Get().(*Context)
c.writermem.reset(w)
c.Request = req
c.reset()
- return c
-}
-func (engine *Engine) putcontext(c *Context) {
+ engine.handleHTTPRequest(c)
+
engine.pool.Put(c)
}
@@ -215,27 +282,37 @@ func (engine *Engine) handleHTTPRequest(context *Context) {
path := context.Request.URL.Path
// Find root of the tree for the given HTTP method
- if root := engine.trees[httpMethod]; root != nil {
- // Find route in tree
- handlers, params, tsr := root.getValue(path, context.Params)
- if handlers != nil {
- context.handlers = handlers
- context.Params = params
- context.Next()
- context.writermem.WriteHeaderNow()
- return
-
- } else if httpMethod != "CONNECT" && path != "/" {
- if engine.serveAutoRedirect(context, root, tsr) {
+ t := engine.trees
+ for i, tl := 0, len(t); i < tl; i++ {
+ if t[i].method == httpMethod {
+ root := t[i].root
+ // Find route in tree
+ handlers, params, tsr := root.getValue(path, context.Params)
+ if handlers != nil {
+ context.handlers = handlers
+ context.Params = params
+ context.Next()
+ context.writermem.WriteHeaderNow()
return
+
+ } else if httpMethod != "CONNECT" && path != "/" {
+ if tsr && engine.RedirectTrailingSlash {
+ redirectTrailingSlash(context)
+ return
+ }
+ if engine.RedirectFixedPath && redirectFixedPath(context, root, engine.RedirectFixedPath) {
+ return
+ }
}
+ break
}
}
+ // TODO: unit test
if engine.HandleMethodNotAllowed {
- for method, root := range engine.trees {
- if method != httpMethod {
- if handlers, _, _ := root.getValue(path, nil); handlers != nil {
+ for _, tree := range engine.trees {
+ if tree.method != httpMethod {
+ if handlers, _, _ := tree.root.getValue(path, nil); handlers != nil {
context.handlers = engine.allNoMethod
serveError(context, 405, default405Body)
return
@@ -247,7 +324,22 @@ func (engine *Engine) handleHTTPRequest(context *Context) {
serveError(context, 404, default404Body)
}
-func (engine *Engine) serveAutoRedirect(c *Context, root *node, tsr bool) bool {
+var mimePlain = []string{MIMEPlain}
+
+func serveError(c *Context, code int, defaultMessage []byte) {
+ c.writermem.status = code
+ c.Next()
+ if !c.writermem.Written() {
+ if c.writermem.Status() == code {
+ c.writermem.Header()["Content-Type"] = mimePlain
+ c.Writer.Write(defaultMessage)
+ } else {
+ c.writermem.WriteHeaderNow()
+ }
+ }
+}
+
+func redirectTrailingSlash(c *Context) {
req := c.Request
path := req.URL.Path
code := 301 // Permanent redirect, request with GET method
@@ -255,43 +347,34 @@ func (engine *Engine) serveAutoRedirect(c *Context, root *node, tsr bool) bool {
code = 307
}
- if tsr && engine.RedirectTrailingSlash {
- if len(path) > 1 && path[len(path)-1] == '/' {
- req.URL.Path = path[:len(path)-1]
- } else {
- req.URL.Path = path + "/"
+ if len(path) > 1 && path[len(path)-1] == '/' {
+ req.URL.Path = path[:len(path)-1]
+ } else {
+ req.URL.Path = path + "/"
+ }
+ debugPrint("redirecting request %d: %s --> %s", code, path, req.URL.String())
+ http.Redirect(c.Writer, req, req.URL.String(), code)
+ c.writermem.WriteHeaderNow()
+}
+
+func redirectFixedPath(c *Context, root *node, trailingSlash bool) bool {
+ req := c.Request
+ path := req.URL.Path
+
+ fixedPath, found := root.findCaseInsensitivePath(
+ cleanPath(path),
+ trailingSlash,
+ )
+ if found {
+ code := 301 // Permanent redirect, request with GET method
+ if req.Method != "GET" {
+ code = 307
}
+ req.URL.Path = string(fixedPath)
debugPrint("redirecting request %d: %s --> %s", code, path, req.URL.String())
http.Redirect(c.Writer, req, req.URL.String(), code)
c.writermem.WriteHeaderNow()
return true
}
-
- // Try to fix the request path
- if engine.RedirectFixedPath {
- fixedPath, found := root.findCaseInsensitivePath(
- CleanPath(path),
- engine.RedirectTrailingSlash,
- )
- if found {
- req.URL.Path = string(fixedPath)
- debugPrint("redirecting request %d: %s --> %s", code, path, req.URL.String())
- http.Redirect(c.Writer, req, req.URL.String(), code)
- c.writermem.WriteHeaderNow()
- return true
- }
- }
return false
}
-
-func serveError(c *Context, code int, defaultMessage []byte) {
- c.writermem.status = code
- c.Next()
- if !c.Writer.Written() {
- if c.Writer.Status() == code {
- c.Data(-1, binding.MIMEPlain, defaultMessage)
- } else {
- c.Writer.WriteHeaderNow()
- }
- }
-}
diff --git a/vendor/github.com/gin-gonic/gin/gin_integration_test.go b/vendor/github.com/gin-gonic/gin/gin_integration_test.go
new file mode 100644
index 000000000..4777c0c9a
--- /dev/null
+++ b/vendor/github.com/gin-gonic/gin/gin_integration_test.go
@@ -0,0 +1,105 @@
+package gin
+
+import (
+ "bufio"
+ "fmt"
+ "io/ioutil"
+ "net"
+ "net/http"
+ "os"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func testRequest(t *testing.T, url string) {
+ resp, err := http.Get(url)
+ defer resp.Body.Close()
+ assert.NoError(t, err)
+
+ body, ioerr := ioutil.ReadAll(resp.Body)
+ assert.NoError(t, ioerr)
+ assert.Equal(t, "it worked", string(body), "resp body should match")
+ assert.Equal(t, "200 OK", resp.Status, "should get a 200")
+}
+
+func TestRunEmpty(t *testing.T) {
+ os.Setenv("PORT", "")
+ router := New()
+ go func() {
+ router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") })
+ assert.NoError(t, router.Run())
+ }()
+ // have to wait for the goroutine to start and run the server
+ // otherwise the main thread will complete
+ time.Sleep(5 * time.Millisecond)
+
+ assert.Error(t, router.Run(":8080"))
+ testRequest(t, "http://localhost:8080/example")
+}
+
+func TestRunEmptyWithEnv(t *testing.T) {
+ os.Setenv("PORT", "3123")
+ router := New()
+ go func() {
+ router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") })
+ assert.NoError(t, router.Run())
+ }()
+ // have to wait for the goroutine to start and run the server
+ // otherwise the main thread will complete
+ time.Sleep(5 * time.Millisecond)
+
+ assert.Error(t, router.Run(":3123"))
+ testRequest(t, "http://localhost:3123/example")
+}
+
+func TestRunTooMuchParams(t *testing.T) {
+ router := New()
+ assert.Panics(t, func() {
+ router.Run("2", "2")
+ })
+}
+
+func TestRunWithPort(t *testing.T) {
+ router := New()
+ go func() {
+ router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") })
+ assert.NoError(t, router.Run(":5150"))
+ }()
+ // have to wait for the goroutine to start and run the server
+ // otherwise the main thread will complete
+ time.Sleep(5 * time.Millisecond)
+
+ assert.Error(t, router.Run(":5150"))
+ testRequest(t, "http://localhost:5150/example")
+}
+
+func TestUnixSocket(t *testing.T) {
+ router := New()
+
+ go func() {
+ router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") })
+ assert.NoError(t, router.RunUnix("/tmp/unix_unit_test"))
+ }()
+ // have to wait for the goroutine to start and run the server
+ // otherwise the main thread will complete
+ time.Sleep(5 * time.Millisecond)
+
+ c, err := net.Dial("unix", "/tmp/unix_unit_test")
+ assert.NoError(t, err)
+
+ fmt.Fprintf(c, "GET /example HTTP/1.0\r\n\r\n")
+ scanner := bufio.NewScanner(c)
+ var response string
+ for scanner.Scan() {
+ response += scanner.Text()
+ }
+ assert.Contains(t, response, "HTTP/1.0 200", "should get a 200")
+ assert.Contains(t, response, "it worked", "resp body should match")
+}
+
+func TestBadUnixSocket(t *testing.T) {
+ router := New()
+ assert.Error(t, router.RunUnix("#/tmp/unix_unit_test"))
+}
diff --git a/vendor/github.com/gin-gonic/gin/gin_test.go b/vendor/github.com/gin-gonic/gin/gin_test.go
index d858f9f02..b3b0eb6ba 100644
--- a/vendor/github.com/gin-gonic/gin/gin_test.go
+++ b/vendor/github.com/gin-gonic/gin/gin_test.go
@@ -5,15 +5,15 @@
package gin
import (
+ "reflect"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
//TODO
// func (engine *Engine) LoadHTMLGlob(pattern string) {
// func (engine *Engine) LoadHTMLFiles(files ...string) {
-// func (engine *Engine) Run(addr string) error {
// func (engine *Engine) RunTLS(addr string, cert string, key string) error {
func init() {
@@ -22,16 +22,58 @@ func init() {
func TestCreateEngine(t *testing.T) {
router := New()
- assert.Equal(t, "/", router.BasePath)
+ assert.Equal(t, "/", router.basePath)
assert.Equal(t, router.engine, router)
assert.Empty(t, router.Handlers)
- assert.True(t, router.RedirectTrailingSlash)
- assert.True(t, router.RedirectFixedPath)
- assert.True(t, router.HandleMethodNotAllowed)
+}
+// func TestLoadHTMLDebugMode(t *testing.T) {
+// router := New()
+// SetMode(DebugMode)
+// router.LoadHTMLGlob("*.testtmpl")
+// r := router.HTMLRender.(render.HTMLDebug)
+// assert.Empty(t, r.Files)
+// assert.Equal(t, r.Glob, "*.testtmpl")
+//
+// router.LoadHTMLFiles("index.html.testtmpl", "login.html.testtmpl")
+// r = router.HTMLRender.(render.HTMLDebug)
+// assert.Empty(t, r.Glob)
+// assert.Equal(t, r.Files, []string{"index.html", "login.html"})
+// SetMode(TestMode)
+// }
+
+func TestLoadHTMLReleaseMode(t *testing.T) {
+
+}
+
+func TestAddRoute(t *testing.T) {
+ router := New()
+ router.addRoute("GET", "/", HandlersChain{func(_ *Context) {}})
+
+ assert.Len(t, router.trees, 1)
+ assert.NotNil(t, router.trees.get("GET"))
+ assert.Nil(t, router.trees.get("POST"))
+
+ router.addRoute("POST", "/", HandlersChain{func(_ *Context) {}})
+
+ assert.Len(t, router.trees, 2)
+ assert.NotNil(t, router.trees.get("GET"))
+ assert.NotNil(t, router.trees.get("POST"))
+
+ router.addRoute("POST", "/post", HandlersChain{func(_ *Context) {}})
+ assert.Len(t, router.trees, 2)
+}
+
+func TestAddRouteFails(t *testing.T) {
+ router := New()
assert.Panics(t, func() { router.addRoute("", "/", HandlersChain{func(_ *Context) {}}) })
assert.Panics(t, func() { router.addRoute("GET", "a", HandlersChain{func(_ *Context) {}}) })
assert.Panics(t, func() { router.addRoute("GET", "/", HandlersChain{}) })
+
+ router.addRoute("POST", "/post", HandlersChain{func(_ *Context) {}})
+ assert.Panics(t, func() {
+ router.addRoute("POST", "/post", HandlersChain{func(_ *Context) {}})
+ })
}
func TestCreateDefaultRouter(t *testing.T) {
@@ -40,8 +82,8 @@ func TestCreateDefaultRouter(t *testing.T) {
}
func TestNoRouteWithoutGlobalHandlers(t *testing.T) {
- middleware0 := func(c *Context) {}
- middleware1 := func(c *Context) {}
+ var middleware0 HandlerFunc = func(c *Context) {}
+ var middleware1 HandlerFunc = func(c *Context) {}
router := New()
@@ -49,22 +91,22 @@ func TestNoRouteWithoutGlobalHandlers(t *testing.T) {
assert.Nil(t, router.Handlers)
assert.Len(t, router.noRoute, 1)
assert.Len(t, router.allNoRoute, 1)
- assert.Equal(t, router.noRoute[0], middleware0)
- assert.Equal(t, router.allNoRoute[0], middleware0)
+ compareFunc(t, router.noRoute[0], middleware0)
+ compareFunc(t, router.allNoRoute[0], middleware0)
router.NoRoute(middleware1, middleware0)
assert.Len(t, router.noRoute, 2)
assert.Len(t, router.allNoRoute, 2)
- assert.Equal(t, router.noRoute[0], middleware1)
- assert.Equal(t, router.allNoRoute[0], middleware1)
- assert.Equal(t, router.noRoute[1], middleware0)
- assert.Equal(t, router.allNoRoute[1], middleware0)
+ compareFunc(t, router.noRoute[0], middleware1)
+ compareFunc(t, router.allNoRoute[0], middleware1)
+ compareFunc(t, router.noRoute[1], middleware0)
+ compareFunc(t, router.allNoRoute[1], middleware0)
}
func TestNoRouteWithGlobalHandlers(t *testing.T) {
- middleware0 := func(c *Context) {}
- middleware1 := func(c *Context) {}
- middleware2 := func(c *Context) {}
+ var middleware0 HandlerFunc = func(c *Context) {}
+ var middleware1 HandlerFunc = func(c *Context) {}
+ var middleware2 HandlerFunc = func(c *Context) {}
router := New()
router.Use(middleware2)
@@ -74,27 +116,27 @@ func TestNoRouteWithGlobalHandlers(t *testing.T) {
assert.Len(t, router.Handlers, 1)
assert.Len(t, router.noRoute, 1)
- assert.Equal(t, router.Handlers[0], middleware2)
- assert.Equal(t, router.noRoute[0], middleware0)
- assert.Equal(t, router.allNoRoute[0], middleware2)
- assert.Equal(t, router.allNoRoute[1], middleware0)
+ compareFunc(t, router.Handlers[0], middleware2)
+ compareFunc(t, router.noRoute[0], middleware0)
+ compareFunc(t, router.allNoRoute[0], middleware2)
+ compareFunc(t, router.allNoRoute[1], middleware0)
router.Use(middleware1)
assert.Len(t, router.allNoRoute, 3)
assert.Len(t, router.Handlers, 2)
assert.Len(t, router.noRoute, 1)
- assert.Equal(t, router.Handlers[0], middleware2)
- assert.Equal(t, router.Handlers[1], middleware1)
- assert.Equal(t, router.noRoute[0], middleware0)
- assert.Equal(t, router.allNoRoute[0], middleware2)
- assert.Equal(t, router.allNoRoute[1], middleware1)
- assert.Equal(t, router.allNoRoute[2], middleware0)
+ compareFunc(t, router.Handlers[0], middleware2)
+ compareFunc(t, router.Handlers[1], middleware1)
+ compareFunc(t, router.noRoute[0], middleware0)
+ compareFunc(t, router.allNoRoute[0], middleware2)
+ compareFunc(t, router.allNoRoute[1], middleware1)
+ compareFunc(t, router.allNoRoute[2], middleware0)
}
func TestNoMethodWithoutGlobalHandlers(t *testing.T) {
- middleware0 := func(c *Context) {}
- middleware1 := func(c *Context) {}
+ var middleware0 HandlerFunc = func(c *Context) {}
+ var middleware1 HandlerFunc = func(c *Context) {}
router := New()
@@ -102,16 +144,16 @@ func TestNoMethodWithoutGlobalHandlers(t *testing.T) {
assert.Empty(t, router.Handlers)
assert.Len(t, router.noMethod, 1)
assert.Len(t, router.allNoMethod, 1)
- assert.Equal(t, router.noMethod[0], middleware0)
- assert.Equal(t, router.allNoMethod[0], middleware0)
+ compareFunc(t, router.noMethod[0], middleware0)
+ compareFunc(t, router.allNoMethod[0], middleware0)
router.NoMethod(middleware1, middleware0)
assert.Len(t, router.noMethod, 2)
assert.Len(t, router.allNoMethod, 2)
- assert.Equal(t, router.noMethod[0], middleware1)
- assert.Equal(t, router.allNoMethod[0], middleware1)
- assert.Equal(t, router.noMethod[1], middleware0)
- assert.Equal(t, router.allNoMethod[1], middleware0)
+ compareFunc(t, router.noMethod[0], middleware1)
+ compareFunc(t, router.allNoMethod[0], middleware1)
+ compareFunc(t, router.noMethod[1], middleware0)
+ compareFunc(t, router.allNoMethod[1], middleware0)
}
func TestRebuild404Handlers(t *testing.T) {
@@ -119,9 +161,9 @@ func TestRebuild404Handlers(t *testing.T) {
}
func TestNoMethodWithGlobalHandlers(t *testing.T) {
- middleware0 := func(c *Context) {}
- middleware1 := func(c *Context) {}
- middleware2 := func(c *Context) {}
+ var middleware0 HandlerFunc = func(c *Context) {}
+ var middleware1 HandlerFunc = func(c *Context) {}
+ var middleware2 HandlerFunc = func(c *Context) {}
router := New()
router.Use(middleware2)
@@ -131,20 +173,73 @@ func TestNoMethodWithGlobalHandlers(t *testing.T) {
assert.Len(t, router.Handlers, 1)
assert.Len(t, router.noMethod, 1)
- assert.Equal(t, router.Handlers[0], middleware2)
- assert.Equal(t, router.noMethod[0], middleware0)
- assert.Equal(t, router.allNoMethod[0], middleware2)
- assert.Equal(t, router.allNoMethod[1], middleware0)
+ compareFunc(t, router.Handlers[0], middleware2)
+ compareFunc(t, router.noMethod[0], middleware0)
+ compareFunc(t, router.allNoMethod[0], middleware2)
+ compareFunc(t, router.allNoMethod[1], middleware0)
router.Use(middleware1)
assert.Len(t, router.allNoMethod, 3)
assert.Len(t, router.Handlers, 2)
assert.Len(t, router.noMethod, 1)
- assert.Equal(t, router.Handlers[0], middleware2)
- assert.Equal(t, router.Handlers[1], middleware1)
- assert.Equal(t, router.noMethod[0], middleware0)
- assert.Equal(t, router.allNoMethod[0], middleware2)
- assert.Equal(t, router.allNoMethod[1], middleware1)
- assert.Equal(t, router.allNoMethod[2], middleware0)
+ compareFunc(t, router.Handlers[0], middleware2)
+ compareFunc(t, router.Handlers[1], middleware1)
+ compareFunc(t, router.noMethod[0], middleware0)
+ compareFunc(t, router.allNoMethod[0], middleware2)
+ compareFunc(t, router.allNoMethod[1], middleware1)
+ compareFunc(t, router.allNoMethod[2], middleware0)
}
+
+func compareFunc(t *testing.T, a, b interface{}) {
+ sf1 := reflect.ValueOf(a)
+ sf2 := reflect.ValueOf(b)
+ if sf1.Pointer() != sf2.Pointer() {
+ t.Error("different functions")
+ }
+}
+
+func TestListOfRoutes(t *testing.T) {
+ router := New()
+ router.GET("/favicon.ico", handler_test1)
+ router.GET("/", handler_test1)
+ group := router.Group("/users")
+ {
+ group.GET("/", handler_test2)
+ group.GET("/:id", handler_test1)
+ group.POST("/:id", handler_test2)
+ }
+ router.Static("/static", ".")
+
+ list := router.Routes()
+
+ assert.Len(t, list, 7)
+ assert.Contains(t, list, RouteInfo{
+ Method: "GET",
+ Path: "/favicon.ico",
+ Handler: "github.com/gin-gonic/gin.handler_test1",
+ })
+ assert.Contains(t, list, RouteInfo{
+ Method: "GET",
+ Path: "/",
+ Handler: "github.com/gin-gonic/gin.handler_test1",
+ })
+ assert.Contains(t, list, RouteInfo{
+ Method: "GET",
+ Path: "/users/",
+ Handler: "github.com/gin-gonic/gin.handler_test2",
+ })
+ assert.Contains(t, list, RouteInfo{
+ Method: "GET",
+ Path: "/users/:id",
+ Handler: "github.com/gin-gonic/gin.handler_test1",
+ })
+ assert.Contains(t, list, RouteInfo{
+ Method: "POST",
+ Path: "/users/:id",
+ Handler: "github.com/gin-gonic/gin.handler_test2",
+ })
+}
+
+func handler_test1(c *Context) {}
+func handler_test2(c *Context) {}
diff --git a/vendor/github.com/gin-gonic/gin/githubapi_test.go b/vendor/github.com/gin-gonic/gin/githubapi_test.go
index 8936ab064..2227fa6ae 100644
--- a/vendor/github.com/gin-gonic/gin/githubapi_test.go
+++ b/vendor/github.com/gin-gonic/gin/githubapi_test.go
@@ -8,9 +8,11 @@ import (
"bytes"
"fmt"
"math/rand"
+ "net/http"
+ "net/http/httptest"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
type route struct {
@@ -282,18 +284,23 @@ var githubAPI = []route{
{"DELETE", "/user/keys/:id"},
}
-func TestGithubAPI(t *testing.T) {
- router := New()
-
+func githubConfigRouter(router *Engine) {
for _, route := range githubAPI {
router.Handle(route.method, route.path, func(c *Context) {
- output := H{"status": "good"}
+ output := make(map[string]string, len(c.Params)+1)
+ output["status"] = "good"
for _, param := range c.Params {
output[param.Key] = param.Value
}
c.JSON(200, output)
})
}
+}
+
+func TestGithubAPI(t *testing.T) {
+ DefaultWriter = newMockWriter()
+ router := Default()
+ githubConfigRouter(router)
for _, route := range githubAPI {
path, values := exampleFromPath(route.path)
@@ -342,3 +349,41 @@ func exampleFromPath(path string) (string, Params) {
return output.String(), params
}
+
+func BenchmarkGithub(b *testing.B) {
+ router := New()
+ githubConfigRouter(router)
+ runRequest(b, router, "GET", "/legacy/issues/search/:owner/:repository/:state/:keyword")
+}
+
+func BenchmarkParallelGithub(b *testing.B) {
+ DefaultWriter = newMockWriter()
+ router := New()
+ githubConfigRouter(router)
+
+ req, _ := http.NewRequest("POST", "/repos/manucorporat/sse/git/blobs", nil)
+
+ b.RunParallel(func(pb *testing.PB) {
+ // Each goroutine has its own bytes.Buffer.
+ for pb.Next() {
+ w := httptest.NewRecorder()
+ router.ServeHTTP(w, req)
+ }
+ })
+}
+
+func BenchmarkParallelGithubDefault(b *testing.B) {
+ DefaultWriter = newMockWriter()
+ router := Default()
+ githubConfigRouter(router)
+
+ req, _ := http.NewRequest("POST", "/repos/manucorporat/sse/git/blobs", nil)
+
+ b.RunParallel(func(pb *testing.PB) {
+ // Each goroutine has its own bytes.Buffer.
+ for pb.Next() {
+ w := httptest.NewRecorder()
+ router.ServeHTTP(w, req)
+ }
+ })
+}
diff --git a/vendor/github.com/gin-gonic/gin/logger.go b/vendor/github.com/gin-gonic/gin/logger.go
index bb7b2d15c..e0f9b3673 100644
--- a/vendor/github.com/gin-gonic/gin/logger.go
+++ b/vendor/github.com/gin-gonic/gin/logger.go
@@ -25,22 +25,27 @@ func ErrorLogger() HandlerFunc {
return ErrorLoggerT(ErrorTypeAny)
}
-func ErrorLoggerT(typ int) HandlerFunc {
+func ErrorLoggerT(typ ErrorType) HandlerFunc {
return func(c *Context) {
c.Next()
-
+ // avoid writting if we already wrote into the response body
if !c.Writer.Written() {
- if errs := c.Errors.ByType(typ); len(errs) > 0 {
- c.JSON(-1, errs.Errors())
+ errors := c.Errors.ByType(typ)
+ if len(errors) > 0 {
+ c.JSON(-1, errors)
}
}
}
}
+// Instances a Logger middleware that will write the logs to gin.DefaultWriter
+// By default gin.DefaultWriter = os.Stdout
func Logger() HandlerFunc {
return LoggerWithWriter(DefaultWriter)
}
+// Instance a Logger middleware with the specified writter buffer.
+// Example: os.Stdout, a file opened in write mode, a socket...
func LoggerWithWriter(out io.Writer) HandlerFunc {
return func(c *Context) {
// Start timer
@@ -59,7 +64,7 @@ func LoggerWithWriter(out io.Writer) HandlerFunc {
statusCode := c.Writer.Status()
statusColor := colorForStatus(statusCode)
methodColor := colorForMethod(method)
- comment := c.Errors.String()
+ comment := c.Errors.ByType(ErrorTypePrivate).String()
fmt.Fprintf(out, "[GIN] %v |%s %3d %s| %13v | %s |%s %s %-7s %s\n%s",
end.Format("2006/01/02 - 15:04:05"),
diff --git a/vendor/github.com/gin-gonic/gin/logger_test.go b/vendor/github.com/gin-gonic/gin/logger_test.go
index 0b21f76dd..267f9c5b2 100644
--- a/vendor/github.com/gin-gonic/gin/logger_test.go
+++ b/vendor/github.com/gin-gonic/gin/logger_test.go
@@ -6,9 +6,10 @@ package gin
import (
"bytes"
+ "errors"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
//TODO
@@ -26,10 +27,100 @@ func TestLogger(t *testing.T) {
router := New()
router.Use(LoggerWithWriter(buffer))
router.GET("/example", func(c *Context) {})
+ router.POST("/example", func(c *Context) {})
+ router.PUT("/example", func(c *Context) {})
+ router.DELETE("/example", func(c *Context) {})
+ router.PATCH("/example", func(c *Context) {})
+ router.HEAD("/example", func(c *Context) {})
+ router.OPTIONS("/example", func(c *Context) {})
performRequest(router, "GET", "/example")
-
assert.Contains(t, buffer.String(), "200")
assert.Contains(t, buffer.String(), "GET")
assert.Contains(t, buffer.String(), "/example")
+
+ // I wrote these first (extending the above) but then realized they are more
+ // like integration tests because they test the whole logging process rather
+ // than individual functions. Im not sure where these should go.
+
+ performRequest(router, "POST", "/example")
+ assert.Contains(t, buffer.String(), "200")
+ assert.Contains(t, buffer.String(), "POST")
+ assert.Contains(t, buffer.String(), "/example")
+
+ performRequest(router, "PUT", "/example")
+ assert.Contains(t, buffer.String(), "200")
+ assert.Contains(t, buffer.String(), "PUT")
+ assert.Contains(t, buffer.String(), "/example")
+
+ performRequest(router, "DELETE", "/example")
+ assert.Contains(t, buffer.String(), "200")
+ assert.Contains(t, buffer.String(), "DELETE")
+ assert.Contains(t, buffer.String(), "/example")
+
+ performRequest(router, "PATCH", "/example")
+ assert.Contains(t, buffer.String(), "200")
+ assert.Contains(t, buffer.String(), "PATCH")
+ assert.Contains(t, buffer.String(), "/example")
+
+ performRequest(router, "HEAD", "/example")
+ assert.Contains(t, buffer.String(), "200")
+ assert.Contains(t, buffer.String(), "HEAD")
+ assert.Contains(t, buffer.String(), "/example")
+
+ performRequest(router, "OPTIONS", "/example")
+ assert.Contains(t, buffer.String(), "200")
+ assert.Contains(t, buffer.String(), "OPTIONS")
+ assert.Contains(t, buffer.String(), "/example")
+
+ performRequest(router, "GET", "/notfound")
+ assert.Contains(t, buffer.String(), "404")
+ assert.Contains(t, buffer.String(), "GET")
+ assert.Contains(t, buffer.String(), "/notfound")
+
+}
+
+func TestColorForMethod(t *testing.T) {
+ assert.Equal(t, colorForMethod("GET"), string([]byte{27, 91, 57, 55, 59, 52, 52, 109}), "get should be blue")
+ assert.Equal(t, colorForMethod("POST"), string([]byte{27, 91, 57, 55, 59, 52, 54, 109}), "post should be cyan")
+ assert.Equal(t, colorForMethod("PUT"), string([]byte{27, 91, 57, 55, 59, 52, 51, 109}), "put should be yellow")
+ assert.Equal(t, colorForMethod("DELETE"), string([]byte{27, 91, 57, 55, 59, 52, 49, 109}), "delete should be red")
+ assert.Equal(t, colorForMethod("PATCH"), string([]byte{27, 91, 57, 55, 59, 52, 50, 109}), "patch should be green")
+ assert.Equal(t, colorForMethod("HEAD"), string([]byte{27, 91, 57, 55, 59, 52, 53, 109}), "head should be magenta")
+ assert.Equal(t, colorForMethod("OPTIONS"), string([]byte{27, 91, 57, 48, 59, 52, 55, 109}), "options should be white")
+ assert.Equal(t, colorForMethod("TRACE"), string([]byte{27, 91, 48, 109}), "trace is not defined and should be the reset color")
+}
+
+func TestColorForStatus(t *testing.T) {
+ assert.Equal(t, colorForStatus(200), string([]byte{27, 91, 57, 55, 59, 52, 50, 109}), "2xx should be green")
+ assert.Equal(t, colorForStatus(301), string([]byte{27, 91, 57, 48, 59, 52, 55, 109}), "3xx should be white")
+ assert.Equal(t, colorForStatus(404), string([]byte{27, 91, 57, 55, 59, 52, 51, 109}), "4xx should be yellow")
+ assert.Equal(t, colorForStatus(2), string([]byte{27, 91, 57, 55, 59, 52, 49, 109}), "other things should be red")
+}
+
+func TestErrorLogger(t *testing.T) {
+ router := New()
+ router.Use(ErrorLogger())
+ router.GET("/error", func(c *Context) {
+ c.Error(errors.New("this is an error"))
+ })
+ router.GET("/abort", func(c *Context) {
+ c.AbortWithError(401, errors.New("no authorized"))
+ })
+ router.GET("/print", func(c *Context) {
+ c.Error(errors.New("this is an error"))
+ c.String(500, "hola!")
+ })
+
+ w := performRequest(router, "GET", "/error")
+ assert.Equal(t, w.Code, 200)
+ assert.Equal(t, w.Body.String(), "{\"error\":\"this is an error\"}\n")
+
+ w = performRequest(router, "GET", "/abort")
+ assert.Equal(t, w.Code, 401)
+ assert.Equal(t, w.Body.String(), "{\"error\":\"no authorized\"}\n")
+
+ w = performRequest(router, "GET", "/print")
+ assert.Equal(t, w.Code, 500)
+ assert.Equal(t, w.Body.String(), "hola!")
}
diff --git a/vendor/github.com/gin-gonic/gin/middleware_test.go b/vendor/github.com/gin-gonic/gin/middleware_test.go
index a251cc4a6..61d27c9e6 100644
--- a/vendor/github.com/gin-gonic/gin/middleware_test.go
+++ b/vendor/github.com/gin-gonic/gin/middleware_test.go
@@ -9,7 +9,8 @@ import (
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/manucorporat/sse"
+ "github.com/stretchr/testify/assert"
)
func TestMiddlewareGeneralCase(t *testing.T) {
@@ -27,10 +28,10 @@ func TestMiddlewareGeneralCase(t *testing.T) {
signature += "D"
})
router.NoRoute(func(c *Context) {
- signature += "X"
+ signature += " X "
})
router.NoMethod(func(c *Context) {
- signature += "X"
+ signature += " XX "
})
// RUN
w := performRequest(router, "GET", "/")
@@ -40,8 +41,7 @@ func TestMiddlewareGeneralCase(t *testing.T) {
assert.Equal(t, signature, "ACDB")
}
-// TestBadAbortHandlersChain - ensure that Abort after switch context will not interrupt pending handlers
-func TestMiddlewareNextOrder(t *testing.T) {
+func TestMiddlewareNoRoute(t *testing.T) {
signature := ""
router := New()
router.Use(func(c *Context) {
@@ -52,6 +52,9 @@ func TestMiddlewareNextOrder(t *testing.T) {
router.Use(func(c *Context) {
signature += "C"
c.Next()
+ c.Next()
+ c.Next()
+ c.Next()
signature += "D"
})
router.NoRoute(func(c *Context) {
@@ -63,6 +66,9 @@ func TestMiddlewareNextOrder(t *testing.T) {
c.Next()
signature += "H"
})
+ router.NoMethod(func(c *Context) {
+ signature += " X "
+ })
// RUN
w := performRequest(router, "GET", "/")
@@ -71,8 +77,81 @@ func TestMiddlewareNextOrder(t *testing.T) {
assert.Equal(t, signature, "ACEGHFDB")
}
-// TestAbortHandlersChain - ensure that Abort interrupt used middlewares in fifo order
-func TestMiddlewareAbortHandlersChain(t *testing.T) {
+func TestMiddlewareNoMethodEnabled(t *testing.T) {
+ signature := ""
+ router := New()
+ router.HandleMethodNotAllowed = true
+ router.Use(func(c *Context) {
+ signature += "A"
+ c.Next()
+ signature += "B"
+ })
+ router.Use(func(c *Context) {
+ signature += "C"
+ c.Next()
+ signature += "D"
+ })
+ router.NoMethod(func(c *Context) {
+ signature += "E"
+ c.Next()
+ signature += "F"
+ }, func(c *Context) {
+ signature += "G"
+ c.Next()
+ signature += "H"
+ })
+ router.NoRoute(func(c *Context) {
+ signature += " X "
+ })
+ router.POST("/", func(c *Context) {
+ signature += " XX "
+ })
+ // RUN
+ w := performRequest(router, "GET", "/")
+
+ // TEST
+ assert.Equal(t, w.Code, 405)
+ assert.Equal(t, signature, "ACEGHFDB")
+}
+
+func TestMiddlewareNoMethodDisabled(t *testing.T) {
+ signature := ""
+ router := New()
+ router.HandleMethodNotAllowed = false
+ router.Use(func(c *Context) {
+ signature += "A"
+ c.Next()
+ signature += "B"
+ })
+ router.Use(func(c *Context) {
+ signature += "C"
+ c.Next()
+ signature += "D"
+ })
+ router.NoMethod(func(c *Context) {
+ signature += "E"
+ c.Next()
+ signature += "F"
+ }, func(c *Context) {
+ signature += "G"
+ c.Next()
+ signature += "H"
+ })
+ router.NoRoute(func(c *Context) {
+ signature += " X "
+ })
+ router.POST("/", func(c *Context) {
+ signature += " XX "
+ })
+ // RUN
+ w := performRequest(router, "GET", "/")
+
+ // TEST
+ assert.Equal(t, w.Code, 404)
+ assert.Equal(t, signature, "AC X DB")
+}
+
+func TestMiddlewareAbort(t *testing.T) {
signature := ""
router := New()
router.Use(func(c *Context) {
@@ -80,21 +159,21 @@ func TestMiddlewareAbortHandlersChain(t *testing.T) {
})
router.Use(func(c *Context) {
signature += "C"
- c.AbortWithStatus(409)
+ c.AbortWithStatus(401)
c.Next()
signature += "D"
})
router.GET("/", func(c *Context) {
- signature += "D"
+ signature += " X "
c.Next()
- signature += "E"
+ signature += " XX "
})
// RUN
w := performRequest(router, "GET", "/")
// TEST
- assert.Equal(t, w.Code, 409)
+ assert.Equal(t, w.Code, 401)
assert.Equal(t, signature, "ACD")
}
@@ -103,8 +182,8 @@ func TestMiddlewareAbortHandlersChainAndNext(t *testing.T) {
router := New()
router.Use(func(c *Context) {
signature += "A"
- c.AbortWithStatus(410)
c.Next()
+ c.AbortWithStatus(410)
signature += "B"
})
@@ -117,10 +196,10 @@ func TestMiddlewareAbortHandlersChainAndNext(t *testing.T) {
// TEST
assert.Equal(t, w.Code, 410)
- assert.Equal(t, signature, "AB")
+ assert.Equal(t, signature, "ACB")
}
-// TestFailHandlersChain - ensure that Fail interrupt used middlewares in fifo order as
+// TestFailHandlersChain - ensure that Fail interrupt used middleware in fifo order as
// as well as Abort
func TestMiddlewareFailHandlersChain(t *testing.T) {
// SETUP
@@ -128,7 +207,7 @@ func TestMiddlewareFailHandlersChain(t *testing.T) {
router := New()
router.Use(func(context *Context) {
signature += "A"
- context.Fail(500, errors.New("foo"))
+ context.AbortWithError(500, errors.New("foo"))
})
router.Use(func(context *Context) {
signature += "B"
@@ -142,3 +221,35 @@ func TestMiddlewareFailHandlersChain(t *testing.T) {
assert.Equal(t, w.Code, 500)
assert.Equal(t, signature, "A")
}
+
+func TestMiddlewareWrite(t *testing.T) {
+ router := New()
+ router.Use(func(c *Context) {
+ c.String(400, "hola\n")
+ })
+ router.Use(func(c *Context) {
+ c.XML(400, H{"foo": "bar"})
+ })
+ router.Use(func(c *Context) {
+ c.JSON(400, H{"foo": "bar"})
+ })
+ router.GET("/", func(c *Context) {
+ c.JSON(400, H{"foo": "bar"})
+ }, func(c *Context) {
+ c.Render(400, sse.Event{
+ Event: "test",
+ Data: "message",
+ })
+ })
+
+ w := performRequest(router, "GET", "/")
+
+ assert.Equal(t, w.Code, 400)
+ assert.Equal(t, w.Body.String(), `hola
+{"foo":"bar"}
+{"foo":"bar"}
+event:test
+data:message
+
+`)
+}
diff --git a/vendor/github.com/gin-gonic/gin/mode.go b/vendor/github.com/gin-gonic/gin/mode.go
index 8396945bf..15efaeb87 100644
--- a/vendor/github.com/gin-gonic/gin/mode.go
+++ b/vendor/github.com/gin-gonic/gin/mode.go
@@ -5,12 +5,14 @@
package gin
import (
+ "io"
"os"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/mattn/go-colorable"
+ "github.com/gin-gonic/gin/binding"
+ "github.com/mattn/go-colorable"
)
-const GIN_MODE = "GIN_MODE"
+const ENV_GIN_MODE = "GIN_MODE"
const (
DebugMode string = "debug"
@@ -23,16 +25,16 @@ const (
testCode = iota
)
-var DefaultWriter = colorable.NewColorableStdout()
+var DefaultWriter io.Writer = colorable.NewColorableStdout()
var ginMode int = debugCode
var modeName string = DebugMode
func init() {
- value := os.Getenv(GIN_MODE)
- if len(value) == 0 {
+ mode := os.Getenv(ENV_GIN_MODE)
+ if len(mode) == 0 {
SetMode(DebugMode)
} else {
- SetMode(value)
+ SetMode(mode)
}
}
@@ -50,6 +52,10 @@ func SetMode(value string) {
modeName = value
}
+func DisableBindValidation() {
+ binding.Validator = nil
+}
+
func Mode() string {
return modeName
}
diff --git a/vendor/github.com/gin-gonic/gin/mode_test.go b/vendor/github.com/gin-gonic/gin/mode_test.go
index 72d72f75d..2a23d85e9 100644
--- a/vendor/github.com/gin-gonic/gin/mode_test.go
+++ b/vendor/github.com/gin-gonic/gin/mode_test.go
@@ -7,7 +7,7 @@ package gin
import (
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
func init() {
diff --git a/vendor/github.com/gin-gonic/gin/path.go b/vendor/github.com/gin-gonic/gin/path.go
index 40b63bdb0..43cdd0472 100644
--- a/vendor/github.com/gin-gonic/gin/path.go
+++ b/vendor/github.com/gin-gonic/gin/path.go
@@ -18,7 +18,7 @@ package gin
// that is, replace "/.." by "/" at the beginning of a path.
//
// If the result of this process is an empty string, "/" is returned
-func CleanPath(p string) string {
+func cleanPath(p string) string {
// Turn empty string into "/"
if p == "" {
return "/"
diff --git a/vendor/github.com/gin-gonic/gin/path_test.go b/vendor/github.com/gin-gonic/gin/path_test.go
index 0f01a6188..01cb758a4 100644
--- a/vendor/github.com/gin-gonic/gin/path_test.go
+++ b/vendor/github.com/gin-gonic/gin/path_test.go
@@ -9,7 +9,7 @@ import (
"runtime"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
var cleanTests = []struct {
@@ -67,8 +67,8 @@ var cleanTests = []struct {
func TestPathClean(t *testing.T) {
for _, test := range cleanTests {
- assert.Equal(t, CleanPath(test.path), test.result)
- assert.Equal(t, CleanPath(test.result), test.result)
+ assert.Equal(t, cleanPath(test.path), test.result)
+ assert.Equal(t, cleanPath(test.result), test.result)
}
}
@@ -82,7 +82,7 @@ func TestPathCleanMallocs(t *testing.T) {
}
for _, test := range cleanTests {
- allocs := testing.AllocsPerRun(100, func() { CleanPath(test.result) })
- assert.Equal(t, allocs, 0)
+ allocs := testing.AllocsPerRun(100, func() { cleanPath(test.result) })
+ assert.EqualValues(t, allocs, 0)
}
}
diff --git a/vendor/github.com/gin-gonic/gin/recovery_test.go b/vendor/github.com/gin-gonic/gin/recovery_test.go
index e57fa809b..39e71e816 100644
--- a/vendor/github.com/gin-gonic/gin/recovery_test.go
+++ b/vendor/github.com/gin-gonic/gin/recovery_test.go
@@ -8,7 +8,7 @@ import (
"bytes"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
// TestPanicInHandler assert that panic has been recovered.
diff --git a/vendor/github.com/gin-gonic/gin/render/data.go b/vendor/github.com/gin-gonic/gin/render/data.go
index d8e42f8a1..efa75d559 100644
--- a/vendor/github.com/gin-gonic/gin/render/data.go
+++ b/vendor/github.com/gin-gonic/gin/render/data.go
@@ -1,3 +1,7 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
package render
import "net/http"
@@ -7,9 +11,9 @@ type Data struct {
Data []byte
}
-func (r Data) Write(w http.ResponseWriter) error {
+func (r Data) Render(w http.ResponseWriter) error {
if len(r.ContentType) > 0 {
- w.Header().Set("Content-Type", r.ContentType)
+ w.Header()["Content-Type"] = []string{r.ContentType}
}
w.Write(r.Data)
return nil
diff --git a/vendor/github.com/gin-gonic/gin/render/file.go b/vendor/github.com/gin-gonic/gin/render/file.go
deleted file mode 100644
index dd7c8ece2..000000000
--- a/vendor/github.com/gin-gonic/gin/render/file.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package render
-
-import "net/http"
-
-type File struct {
- Path string
- Request *http.Request
-}
-
-func (r File) Write(w http.ResponseWriter) error {
- http.ServeFile(w, r.Request, r.Path)
- return nil
-}
diff --git a/vendor/github.com/gin-gonic/gin/render/html.go b/vendor/github.com/gin-gonic/gin/render/html.go
index 74f31a7c7..01f6bf220 100644
--- a/vendor/github.com/gin-gonic/gin/render/html.go
+++ b/vendor/github.com/gin-gonic/gin/render/html.go
@@ -1,3 +1,7 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
package render
import (
@@ -26,6 +30,8 @@ type (
}
)
+var htmlContentType = []string{"text/html; charset=utf-8"}
+
func (r HTMLProduction) Instance(name string, data interface{}) Render {
return HTML{
Template: r.Template,
@@ -46,12 +52,16 @@ func (r HTMLDebug) loadTemplate() *template.Template {
return template.Must(template.ParseFiles(r.Files...))
}
if len(r.Glob) > 0 {
- return template.Must(template.ParseFiles(r.Files...))
+ return template.Must(template.ParseGlob(r.Glob))
}
panic("the HTML debug render was created without files or glob pattern")
}
-func (r HTML) Write(w http.ResponseWriter) error {
- w.Header().Set("Content-Type", "text/html; charset=utf-8")
- return r.Template.ExecuteTemplate(w, r.Name, r.Data)
+func (r HTML) Render(w http.ResponseWriter) error {
+ writeContentType(w, htmlContentType)
+ if len(r.Name) == 0 {
+ return r.Template.Execute(w, r.Data)
+ } else {
+ return r.Template.ExecuteTemplate(w, r.Name, r.Data)
+ }
}
diff --git a/vendor/github.com/gin-gonic/gin/render/json.go b/vendor/github.com/gin-gonic/gin/render/json.go
index 571853938..32e6058db 100644
--- a/vendor/github.com/gin-gonic/gin/render/json.go
+++ b/vendor/github.com/gin-gonic/gin/render/json.go
@@ -1,3 +1,7 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
package render
import (
@@ -15,13 +19,14 @@ type (
}
)
-func (r JSON) Write(w http.ResponseWriter) error {
- w.Header().Set("Content-Type", "application/json; charset=utf-8")
- return json.NewEncoder(w).Encode(r.Data)
+var jsonContentType = []string{"application/json; charset=utf-8"}
+
+func (r JSON) Render(w http.ResponseWriter) error {
+ return WriteJSON(w, r.Data)
}
-func (r IndentedJSON) Write(w http.ResponseWriter) error {
- w.Header().Set("Content-Type", "application/json; charset=utf-8")
+func (r IndentedJSON) Render(w http.ResponseWriter) error {
+ writeContentType(w, jsonContentType)
jsonBytes, err := json.MarshalIndent(r.Data, "", " ")
if err != nil {
return err
@@ -29,3 +34,8 @@ func (r IndentedJSON) Write(w http.ResponseWriter) error {
w.Write(jsonBytes)
return nil
}
+
+func WriteJSON(w http.ResponseWriter, obj interface{}) error {
+ writeContentType(w, jsonContentType)
+ return json.NewEncoder(w).Encode(obj)
+}
diff --git a/vendor/github.com/gin-gonic/gin/render/redirect.go b/vendor/github.com/gin-gonic/gin/render/redirect.go
index 583bf16b8..d64e4d75e 100644
--- a/vendor/github.com/gin-gonic/gin/render/redirect.go
+++ b/vendor/github.com/gin-gonic/gin/render/redirect.go
@@ -1,3 +1,7 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
package render
import (
@@ -11,7 +15,7 @@ type Redirect struct {
Location string
}
-func (r Redirect) Write(w http.ResponseWriter) error {
+func (r Redirect) Render(w http.ResponseWriter) error {
if r.Code < 300 || r.Code > 308 {
panic(fmt.Sprintf("Cannot redirect with status code %d", r.Code))
}
diff --git a/vendor/github.com/gin-gonic/gin/render/render.go b/vendor/github.com/gin-gonic/gin/render/render.go
index 57a57249b..994fcd7c7 100644
--- a/vendor/github.com/gin-gonic/gin/render/render.go
+++ b/vendor/github.com/gin-gonic/gin/render/render.go
@@ -7,7 +7,7 @@ package render
import "net/http"
type Render interface {
- Write(http.ResponseWriter) error
+ Render(http.ResponseWriter) error
}
var (
@@ -18,7 +18,13 @@ var (
_ Render = Redirect{}
_ Render = Data{}
_ Render = HTML{}
- _ Render = File{}
_ HTMLRender = HTMLDebug{}
_ HTMLRender = HTMLProduction{}
)
+
+func writeContentType(w http.ResponseWriter, value []string) {
+ header := w.Header()
+ if val := header["Content-Type"]; len(val) == 0 {
+ header["Content-Type"] = value
+ }
+}
diff --git a/vendor/github.com/gin-gonic/gin/render/render_test.go b/vendor/github.com/gin-gonic/gin/render/render_test.go
index e4e43ccd5..7a6ffb7d5 100644
--- a/vendor/github.com/gin-gonic/gin/render/render_test.go
+++ b/vendor/github.com/gin-gonic/gin/render/render_test.go
@@ -10,7 +10,7 @@ import (
"net/http/httptest"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
// TODO unit tests
@@ -22,7 +22,7 @@ func TestRenderJSON(t *testing.T) {
"foo": "bar",
}
- err := (JSON{data}).Write(w)
+ err := (JSON{data}).Render(w)
assert.NoError(t, err)
assert.Equal(t, w.Body.String(), "{\"foo\":\"bar\"}\n")
@@ -36,7 +36,7 @@ func TestRenderIndentedJSON(t *testing.T) {
"bar": "foo",
}
- err := (IndentedJSON{data}).Write(w)
+ err := (IndentedJSON{data}).Render(w)
assert.NoError(t, err)
assert.Equal(t, w.Body.String(), "{\n \"bar\": \"foo\",\n \"foo\": \"bar\"\n}")
@@ -75,7 +75,7 @@ func TestRenderXML(t *testing.T) {
"foo": "bar",
}
- err := (XML{data}).Write(w)
+ err := (XML{data}).Render(w)
assert.NoError(t, err)
assert.Equal(t, w.Body.String(), "")
@@ -93,7 +93,7 @@ func TestRenderData(t *testing.T) {
err := (Data{
ContentType: "image/png",
Data: data,
- }).Write(w)
+ }).Render(w)
assert.NoError(t, err)
assert.Equal(t, w.Body.String(), "#!PNG some raw data")
@@ -106,7 +106,7 @@ func TestRenderString(t *testing.T) {
err := (String{
Format: "hola %s %d",
Data: []interface{}{"manu", 2},
- }).Write(w)
+ }).Render(w)
assert.NoError(t, err)
assert.Equal(t, w.Body.String(), "hola manu 2")
@@ -122,7 +122,7 @@ func TestRenderHTMLTemplate(t *testing.T) {
"name": "alexandernyquist",
})
- err := instance.Write(w)
+ err := instance.Render(w)
assert.NoError(t, err)
assert.Equal(t, w.Body.String(), "Hello alexandernyquist")
diff --git a/vendor/github.com/gin-gonic/gin/render/text.go b/vendor/github.com/gin-gonic/gin/render/text.go
index 020d213a0..5a9e280bd 100644
--- a/vendor/github.com/gin-gonic/gin/render/text.go
+++ b/vendor/github.com/gin-gonic/gin/render/text.go
@@ -1,7 +1,12 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
package render
import (
"fmt"
+ "io"
"net/http"
)
@@ -10,15 +15,19 @@ type String struct {
Data []interface{}
}
-func (r String) Write(w http.ResponseWriter) error {
- header := w.Header()
- if _, exist := header["Content-Type"]; !exist {
- header.Set("Content-Type", "text/plain; charset=utf-8")
- }
- if len(r.Data) > 0 {
- fmt.Fprintf(w, r.Format, r.Data...)
- } else {
- w.Write([]byte(r.Format))
- }
+var plainContentType = []string{"text/plain; charset=utf-8"}
+
+func (r String) Render(w http.ResponseWriter) error {
+ WriteString(w, r.Format, r.Data)
return nil
}
+
+func WriteString(w http.ResponseWriter, format string, data []interface{}) {
+ writeContentType(w, plainContentType)
+
+ if len(data) > 0 {
+ fmt.Fprintf(w, format, data...)
+ } else {
+ io.WriteString(w, format)
+ }
+}
diff --git a/vendor/github.com/gin-gonic/gin/render/xml.go b/vendor/github.com/gin-gonic/gin/render/xml.go
index 2002e61bc..be22e6f21 100644
--- a/vendor/github.com/gin-gonic/gin/render/xml.go
+++ b/vendor/github.com/gin-gonic/gin/render/xml.go
@@ -1,3 +1,7 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
package render
import (
@@ -9,7 +13,9 @@ type XML struct {
Data interface{}
}
-func (r XML) Write(w http.ResponseWriter) error {
- w.Header().Set("Content-Type", "application/xml; charset=utf-8")
+var xmlContentType = []string{"application/xml; charset=utf-8"}
+
+func (r XML) Render(w http.ResponseWriter) error {
+ writeContentType(w, xmlContentType)
return xml.NewEncoder(w).Encode(r.Data)
}
diff --git a/vendor/github.com/gin-gonic/gin/response_writer.go b/vendor/github.com/gin-gonic/gin/response_writer.go
index 9b1077ed1..fcbe230d0 100644
--- a/vendor/github.com/gin-gonic/gin/response_writer.go
+++ b/vendor/github.com/gin-gonic/gin/response_writer.go
@@ -6,6 +6,7 @@ package gin
import (
"bufio"
+ "io"
"net"
"net/http"
)
@@ -22,9 +23,20 @@ type (
http.Flusher
http.CloseNotifier
+ // Returns the HTTP response status code of the current request.
Status() int
+
+ // Returns the number of bytes already written into the response http body.
+ // See Written()
Size() int
+
+ // Writes the string into the response body.
+ WriteString(string) (int, error)
+
+ // Returns true if the response body was already written.
Written() bool
+
+ // Forces to write the http header (status code + headers).
WriteHeaderNow()
}
@@ -35,6 +47,8 @@ type (
}
)
+var _ ResponseWriter = &responseWriter{}
+
func (w *responseWriter) reset(writer http.ResponseWriter) {
w.ResponseWriter = writer
w.size = noWritten
@@ -64,6 +78,13 @@ func (w *responseWriter) Write(data []byte) (n int, err error) {
return
}
+func (w *responseWriter) WriteString(s string) (n int, err error) {
+ w.WriteHeaderNow()
+ n, err = io.WriteString(w.ResponseWriter, s)
+ w.size += n
+ return
+}
+
func (w *responseWriter) Status() int {
return w.status
}
diff --git a/vendor/github.com/gin-gonic/gin/response_writer_test.go b/vendor/github.com/gin-gonic/gin/response_writer_test.go
index daad3d8d8..7306d1925 100644
--- a/vendor/github.com/gin-gonic/gin/response_writer_test.go
+++ b/vendor/github.com/gin-gonic/gin/response_writer_test.go
@@ -9,7 +9,7 @@ import (
"net/http/httptest"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
// TODO
diff --git a/vendor/github.com/gin-gonic/gin/routergroup.go b/vendor/github.com/gin-gonic/gin/routergroup.go
index c8907fcfa..f22729bbd 100644
--- a/vendor/github.com/gin-gonic/gin/routergroup.go
+++ b/vendor/github.com/gin-gonic/gin/routergroup.go
@@ -7,33 +7,75 @@ package gin
import (
"net/http"
"path"
+ "regexp"
+ "strings"
)
-// Used internally to configure router, a RouterGroup is associated with a prefix
-// and an array of handlers (middlewares)
-type RouterGroup struct {
- Handlers HandlersChain
- BasePath string
- engine *Engine
+type (
+ IRouter interface {
+ IRoutes
+ Group(string, ...HandlerFunc) *RouterGroup
+ }
+
+ IRoutes interface {
+ Use(...HandlerFunc) IRoutes
+
+ Handle(string, string, ...HandlerFunc) IRoutes
+ Any(string, ...HandlerFunc) IRoutes
+ GET(string, ...HandlerFunc) IRoutes
+ POST(string, ...HandlerFunc) IRoutes
+ DELETE(string, ...HandlerFunc) IRoutes
+ PATCH(string, ...HandlerFunc) IRoutes
+ PUT(string, ...HandlerFunc) IRoutes
+ OPTIONS(string, ...HandlerFunc) IRoutes
+ HEAD(string, ...HandlerFunc) IRoutes
+
+ StaticFile(string, string) IRoutes
+ Static(string, string) IRoutes
+ StaticFS(string, http.FileSystem) IRoutes
+ }
+
+ // RouterGroup is used internally to configure router, a RouterGroup is associated with a prefix
+ // and an array of handlers (middleware)
+ RouterGroup struct {
+ Handlers HandlersChain
+ basePath string
+ engine *Engine
+ root bool
+ }
+)
+
+var _ IRouter = &RouterGroup{}
+
+// Use adds middleware to the group, see example code in github.
+func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {
+ group.Handlers = append(group.Handlers, middleware...)
+ return group.returnObj()
}
-// Adds middlewares to the group, see example code in github.
-func (group *RouterGroup) Use(middlewares ...HandlerFunc) {
- group.Handlers = append(group.Handlers, middlewares...)
-}
-
-// Creates a new router group. You should add all the routes that have common middlwares or the same path prefix.
+// Group creates a new router group. You should add all the routes that have common middlwares or the same path prefix.
// For example, all the routes that use a common middlware for authorization could be grouped.
func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup {
return &RouterGroup{
Handlers: group.combineHandlers(handlers),
- BasePath: group.calculateAbsolutePath(relativePath),
+ basePath: group.calculateAbsolutePath(relativePath),
engine: group.engine,
}
}
-// Handle registers a new request handle and middlewares with the given path and method.
-// The last handler should be the real handler, the other ones should be middlewares that can and should be shared among different routes.
+func (group *RouterGroup) BasePath() string {
+ return group.basePath
+}
+
+func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes {
+ absolutePath := group.calculateAbsolutePath(relativePath)
+ handlers = group.combineHandlers(handlers)
+ group.engine.addRoute(httpMethod, absolutePath, handlers)
+ return group.returnObj()
+}
+
+// Handle registers a new request handle and middleware with the given path and method.
+// The last handler should be the real handler, the other ones should be middleware that can and should be shared among different routes.
// See the example code in github.
//
// For GET, POST, PUT, PATCH and DELETE requests the respective shortcut
@@ -42,53 +84,51 @@ func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *R
// This function is intended for bulk loading and to allow the usage of less
// frequently used, non-standardized or custom methods (e.g. for internal
// communication with a proxy).
-func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) {
- absolutePath := group.calculateAbsolutePath(relativePath)
- handlers = group.combineHandlers(handlers)
- group.engine.addRoute(httpMethod, absolutePath, handlers)
-}
-
-func (group *RouterGroup) Handle(httpMethod, relativePath string, handlers ...HandlerFunc) {
- group.handle(httpMethod, relativePath, handlers)
+func (group *RouterGroup) Handle(httpMethod, relativePath string, handlers ...HandlerFunc) IRoutes {
+ if matches, err := regexp.MatchString("^[A-Z]+$", httpMethod); !matches || err != nil {
+ panic("http method " + httpMethod + " is not valid")
+ }
+ return group.handle(httpMethod, relativePath, handlers)
}
// POST is a shortcut for router.Handle("POST", path, handle)
-func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) {
- group.handle("POST", relativePath, handlers)
+func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) IRoutes {
+ return group.handle("POST", relativePath, handlers)
}
// GET is a shortcut for router.Handle("GET", path, handle)
-func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) {
- group.handle("GET", relativePath, handlers)
+func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
+ return group.handle("GET", relativePath, handlers)
}
// DELETE is a shortcut for router.Handle("DELETE", path, handle)
-func (group *RouterGroup) DELETE(relativePath string, handlers ...HandlerFunc) {
- group.handle("DELETE", relativePath, handlers)
+func (group *RouterGroup) DELETE(relativePath string, handlers ...HandlerFunc) IRoutes {
+ return group.handle("DELETE", relativePath, handlers)
}
// PATCH is a shortcut for router.Handle("PATCH", path, handle)
-func (group *RouterGroup) PATCH(relativePath string, handlers ...HandlerFunc) {
- group.handle("PATCH", relativePath, handlers)
+func (group *RouterGroup) PATCH(relativePath string, handlers ...HandlerFunc) IRoutes {
+ return group.handle("PATCH", relativePath, handlers)
}
// PUT is a shortcut for router.Handle("PUT", path, handle)
-func (group *RouterGroup) PUT(relativePath string, handlers ...HandlerFunc) {
- group.handle("PUT", relativePath, handlers)
+func (group *RouterGroup) PUT(relativePath string, handlers ...HandlerFunc) IRoutes {
+ return group.handle("PUT", relativePath, handlers)
}
// OPTIONS is a shortcut for router.Handle("OPTIONS", path, handle)
-func (group *RouterGroup) OPTIONS(relativePath string, handlers ...HandlerFunc) {
- group.handle("OPTIONS", relativePath, handlers)
+func (group *RouterGroup) OPTIONS(relativePath string, handlers ...HandlerFunc) IRoutes {
+ return group.handle("OPTIONS", relativePath, handlers)
}
// HEAD is a shortcut for router.Handle("HEAD", path, handle)
-func (group *RouterGroup) HEAD(relativePath string, handlers ...HandlerFunc) {
- group.handle("HEAD", relativePath, handlers)
+func (group *RouterGroup) HEAD(relativePath string, handlers ...HandlerFunc) IRoutes {
+ return group.handle("HEAD", relativePath, handlers)
}
-func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) {
- // GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE
+// Any registers a route that matches all the HTTP methods.
+// GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE
+func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) IRoutes {
group.handle("GET", relativePath, handlers)
group.handle("POST", relativePath, handlers)
group.handle("PUT", relativePath, handlers)
@@ -98,6 +138,21 @@ func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) {
group.handle("DELETE", relativePath, handlers)
group.handle("CONNECT", relativePath, handlers)
group.handle("TRACE", relativePath, handlers)
+ return group.returnObj()
+}
+
+// StaticFile registers a single route in order to server a single file of the local filesystem.
+// router.StaticFile("favicon.ico", "./resources/favicon.ico")
+func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes {
+ if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") {
+ panic("URL parameters can not be used when serving a static file")
+ }
+ handler := func(c *Context) {
+ c.File(filepath)
+ }
+ group.GET(relativePath, handler)
+ group.HEAD(relativePath, handler)
+ return group.returnObj()
}
// Static serves files from the given file system root.
@@ -106,27 +161,42 @@ func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) {
// To use the operating system's file system implementation,
// use :
// router.Static("/static", "/var/www")
-func (group *RouterGroup) Static(relativePath, root string) {
- group.StaticFS(relativePath, http.Dir(root))
+func (group *RouterGroup) Static(relativePath, root string) IRoutes {
+ return group.StaticFS(relativePath, Dir(root, false))
}
-func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) {
+// StaticFS works just like `Static()` but a custom `http.FileSystem` can be used instead.
+// Gin by default user: gin.Dir()
+func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes {
+ if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") {
+ panic("URL parameters can not be used when serving a static folder")
+ }
handler := group.createStaticHandler(relativePath, fs)
- relativePath = path.Join(relativePath, "/*filepath")
+ urlPattern := path.Join(relativePath, "/*filepath")
// Register GET and HEAD handlers
- group.GET(relativePath, handler)
- group.HEAD(relativePath, handler)
+ group.GET(urlPattern, handler)
+ group.HEAD(urlPattern, handler)
+ return group.returnObj()
}
-func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileSystem) func(*Context) {
+func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileSystem) HandlerFunc {
absolutePath := group.calculateAbsolutePath(relativePath)
fileServer := http.StripPrefix(absolutePath, http.FileServer(fs))
- return WrapH(fileServer)
+ _, nolisting := fs.(*onlyfilesFS)
+ return func(c *Context) {
+ if nolisting {
+ c.Writer.WriteHeader(404)
+ }
+ fileServer.ServeHTTP(c.Writer, c.Request)
+ }
}
func (group *RouterGroup) combineHandlers(handlers HandlersChain) HandlersChain {
finalSize := len(group.Handlers) + len(handlers)
+ if finalSize >= int(abortIndex) {
+ panic("too many handlers")
+ }
mergedHandlers := make(HandlersChain, finalSize)
copy(mergedHandlers, group.Handlers)
copy(mergedHandlers[len(group.Handlers):], handlers)
@@ -134,5 +204,12 @@ func (group *RouterGroup) combineHandlers(handlers HandlersChain) HandlersChain
}
func (group *RouterGroup) calculateAbsolutePath(relativePath string) string {
- return joinPaths(group.BasePath, relativePath)
+ return joinPaths(group.basePath, relativePath)
+}
+
+func (group *RouterGroup) returnObj() IRoutes {
+ if group.root {
+ return group.engine
+ }
+ return group
}
diff --git a/vendor/github.com/gin-gonic/gin/routergroup_test.go b/vendor/github.com/gin-gonic/gin/routergroup_test.go
index 04342b6eb..b0589b52e 100644
--- a/vendor/github.com/gin-gonic/gin/routergroup_test.go
+++ b/vendor/github.com/gin-gonic/gin/routergroup_test.go
@@ -7,7 +7,7 @@ package gin
import (
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
func init() {
@@ -20,14 +20,14 @@ func TestRouterGroupBasic(t *testing.T) {
group.Use(func(c *Context) {})
assert.Len(t, group.Handlers, 2)
- assert.Equal(t, group.BasePath, "/hola")
+ assert.Equal(t, group.BasePath(), "/hola")
assert.Equal(t, group.engine, router)
group2 := group.Group("manu")
group2.Use(func(c *Context) {}, func(c *Context) {})
assert.Len(t, group2.Handlers, 4)
- assert.Equal(t, group2.BasePath, "/hola/manu")
+ assert.Equal(t, group2.BasePath(), "/hola/manu")
assert.Equal(t, group2.engine, router)
}
@@ -44,10 +44,10 @@ func TestRouterGroupBasicHandle(t *testing.T) {
func performRequestInGroup(t *testing.T, method string) {
router := New()
v1 := router.Group("v1", func(c *Context) {})
- assert.Equal(t, v1.BasePath, "/v1")
+ assert.Equal(t, v1.BasePath(), "/v1")
login := v1.Group("/login/", func(c *Context) {}, func(c *Context) {})
- assert.Equal(t, login.BasePath, "/v1/login/")
+ assert.Equal(t, login.BasePath(), "/v1/login/")
handler := func(c *Context) {
c.String(400, "the method was %s and index %d", c.Request.Method, c.index)
@@ -87,3 +87,91 @@ func performRequestInGroup(t *testing.T, method string) {
assert.Equal(t, w.Code, 400)
assert.Equal(t, w.Body.String(), "the method was "+method+" and index 1")
}
+
+func TestRouterGroupInvalidStatic(t *testing.T) {
+ router := New()
+ assert.Panics(t, func() {
+ router.Static("/path/:param", "/")
+ })
+
+ assert.Panics(t, func() {
+ router.Static("/path/*param", "/")
+ })
+}
+
+func TestRouterGroupInvalidStaticFile(t *testing.T) {
+ router := New()
+ assert.Panics(t, func() {
+ router.StaticFile("/path/:param", "favicon.ico")
+ })
+
+ assert.Panics(t, func() {
+ router.StaticFile("/path/*param", "favicon.ico")
+ })
+}
+
+func TestRouterGroupTooManyHandlers(t *testing.T) {
+ router := New()
+ handlers1 := make([]HandlerFunc, 40)
+ router.Use(handlers1...)
+
+ handlers2 := make([]HandlerFunc, 26)
+ assert.Panics(t, func() {
+ router.Use(handlers2...)
+ })
+ assert.Panics(t, func() {
+ router.GET("/", handlers2...)
+ })
+}
+
+func TestRouterGroupBadMethod(t *testing.T) {
+ router := New()
+ assert.Panics(t, func() {
+ router.Handle("get", "/")
+ })
+ assert.Panics(t, func() {
+ router.Handle(" GET", "/")
+ })
+ assert.Panics(t, func() {
+ router.Handle("GET ", "/")
+ })
+ assert.Panics(t, func() {
+ router.Handle("", "/")
+ })
+ assert.Panics(t, func() {
+ router.Handle("PO ST", "/")
+ })
+ assert.Panics(t, func() {
+ router.Handle("1GET", "/")
+ })
+ assert.Panics(t, func() {
+ router.Handle("PATCh", "/")
+ })
+}
+
+func TestRouterGroupPipeline(t *testing.T) {
+ router := New()
+ testRoutesInterface(t, router)
+
+ v1 := router.Group("/v1")
+ testRoutesInterface(t, v1)
+}
+
+func testRoutesInterface(t *testing.T, r IRoutes) {
+ handler := func(c *Context) {}
+ assert.Equal(t, r, r.Use(handler))
+
+ assert.Equal(t, r, r.Handle("GET", "/handler", handler))
+ assert.Equal(t, r, r.Any("/any", handler))
+ assert.Equal(t, r, r.GET("/", handler))
+ assert.Equal(t, r, r.POST("/", handler))
+ assert.Equal(t, r, r.DELETE("/", handler))
+ assert.Equal(t, r, r.PATCH("/", handler))
+ assert.Equal(t, r, r.PUT("/", handler))
+ assert.Equal(t, r, r.OPTIONS("/", handler))
+ assert.Equal(t, r, r.HEAD("/", handler))
+
+ assert.Equal(t, r, r.StaticFile("/file", "."))
+ assert.Equal(t, r, r.Static("/static", "."))
+ assert.Equal(t, r, r.StaticFS("/static2", Dir(".", false)))
+}
diff --git a/vendor/github.com/gin-gonic/gin/routes_test.go b/vendor/github.com/gin-gonic/gin/routes_test.go
index 55938e558..32f009835 100644
--- a/vendor/github.com/gin-gonic/gin/routes_test.go
+++ b/vendor/github.com/gin-gonic/gin/routes_test.go
@@ -10,10 +10,10 @@ import (
"net/http"
"net/http/httptest"
"os"
- "path"
+ "path/filepath"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
func performRequest(r http.Handler, method, path string) *httptest.ResponseRecorder {
@@ -40,7 +40,6 @@ func testRouteOK(method string, t *testing.T) {
performRequest(r, method, "/test2")
assert.True(t, passedAny)
-
}
// TestSingleRouteOK tests that POST route is correctly invoked.
@@ -61,6 +60,7 @@ func testRouteNotOK(method string, t *testing.T) {
func testRouteNotOK2(method string, t *testing.T) {
passed := false
router := New()
+ router.HandleMethodNotAllowed = true
var methodRoute string
if method == "POST" {
methodRoute = "GET"
@@ -77,33 +77,136 @@ func testRouteNotOK2(method string, t *testing.T) {
assert.Equal(t, w.Code, http.StatusMethodNotAllowed)
}
+func TestRouterMethod(t *testing.T) {
+ router := New()
+ router.PUT("/hey2", func(c *Context) {
+ c.String(200, "sup2")
+ })
+
+ router.PUT("/hey", func(c *Context) {
+ c.String(200, "called")
+ })
+
+ router.PUT("/hey3", func(c *Context) {
+ c.String(200, "sup3")
+ })
+
+ w := performRequest(router, "PUT", "/hey")
+
+ assert.Equal(t, w.Code, 200)
+ assert.Equal(t, w.Body.String(), "called")
+}
+
func TestRouterGroupRouteOK(t *testing.T) {
+ testRouteOK("GET", t)
testRouteOK("POST", t)
- testRouteOK("DELETE", t)
- testRouteOK("PATCH", t)
testRouteOK("PUT", t)
- testRouteOK("OPTIONS", t)
+ testRouteOK("PATCH", t)
testRouteOK("HEAD", t)
+ testRouteOK("OPTIONS", t)
+ testRouteOK("DELETE", t)
+ testRouteOK("CONNECT", t)
+ testRouteOK("TRACE", t)
}
-// TestSingleRouteOK tests that POST route is correctly invoked.
func TestRouteNotOK(t *testing.T) {
+ testRouteNotOK("GET", t)
testRouteNotOK("POST", t)
- testRouteNotOK("DELETE", t)
- testRouteNotOK("PATCH", t)
testRouteNotOK("PUT", t)
- testRouteNotOK("OPTIONS", t)
+ testRouteNotOK("PATCH", t)
testRouteNotOK("HEAD", t)
+ testRouteNotOK("OPTIONS", t)
+ testRouteNotOK("DELETE", t)
+ testRouteNotOK("CONNECT", t)
+ testRouteNotOK("TRACE", t)
}
-// TestSingleRouteOK tests that POST route is correctly invoked.
func TestRouteNotOK2(t *testing.T) {
+ testRouteNotOK2("GET", t)
testRouteNotOK2("POST", t)
- testRouteNotOK2("DELETE", t)
- testRouteNotOK2("PATCH", t)
testRouteNotOK2("PUT", t)
- testRouteNotOK2("OPTIONS", t)
+ testRouteNotOK2("PATCH", t)
testRouteNotOK2("HEAD", t)
+ testRouteNotOK2("OPTIONS", t)
+ testRouteNotOK2("DELETE", t)
+ testRouteNotOK2("CONNECT", t)
+ testRouteNotOK2("TRACE", t)
+}
+
+func TestRouteRedirectTrailingSlash(t *testing.T) {
+ router := New()
+ router.RedirectFixedPath = false
+ router.RedirectTrailingSlash = true
+ router.GET("/path", func(c *Context) {})
+ router.GET("/path2/", func(c *Context) {})
+ router.POST("/path3", func(c *Context) {})
+ router.PUT("/path4/", func(c *Context) {})
+
+ w := performRequest(router, "GET", "/path/")
+ assert.Equal(t, w.Header().Get("Location"), "/path")
+ assert.Equal(t, w.Code, 301)
+
+ w = performRequest(router, "GET", "/path2")
+ assert.Equal(t, w.Header().Get("Location"), "/path2/")
+ assert.Equal(t, w.Code, 301)
+
+ w = performRequest(router, "POST", "/path3/")
+ assert.Equal(t, w.Header().Get("Location"), "/path3")
+ assert.Equal(t, w.Code, 307)
+
+ w = performRequest(router, "PUT", "/path4")
+ assert.Equal(t, w.Header().Get("Location"), "/path4/")
+ assert.Equal(t, w.Code, 307)
+
+ w = performRequest(router, "GET", "/path")
+ assert.Equal(t, w.Code, 200)
+
+ w = performRequest(router, "GET", "/path2/")
+ assert.Equal(t, w.Code, 200)
+
+ w = performRequest(router, "POST", "/path3")
+ assert.Equal(t, w.Code, 200)
+
+ w = performRequest(router, "PUT", "/path4/")
+ assert.Equal(t, w.Code, 200)
+
+ router.RedirectTrailingSlash = false
+
+ w = performRequest(router, "GET", "/path/")
+ assert.Equal(t, w.Code, 404)
+ w = performRequest(router, "GET", "/path2")
+ assert.Equal(t, w.Code, 404)
+ w = performRequest(router, "POST", "/path3/")
+ assert.Equal(t, w.Code, 404)
+ w = performRequest(router, "PUT", "/path4")
+ assert.Equal(t, w.Code, 404)
+}
+
+func TestRouteRedirectFixedPath(t *testing.T) {
+ router := New()
+ router.RedirectFixedPath = true
+ router.RedirectTrailingSlash = false
+
+ router.GET("/path", func(c *Context) {})
+ router.GET("/Path2", func(c *Context) {})
+ router.POST("/PATH3", func(c *Context) {})
+ router.POST("/Path4/", func(c *Context) {})
+
+ w := performRequest(router, "GET", "/PATH")
+ assert.Equal(t, w.Header().Get("Location"), "/path")
+ assert.Equal(t, w.Code, 301)
+
+ w = performRequest(router, "GET", "/path2")
+ assert.Equal(t, w.Header().Get("Location"), "/Path2")
+ assert.Equal(t, w.Code, 301)
+
+ w = performRequest(router, "POST", "/path3")
+ assert.Equal(t, w.Header().Get("Location"), "/PATH3")
+ assert.Equal(t, w.Code, 307)
+
+ w = performRequest(router, "POST", "/path4")
+ assert.Equal(t, w.Header().Get("Location"), "/Path4/")
+ assert.Equal(t, w.Code, 307)
}
// TestContextParamsGet tests that a parameter can be parsed from the URL.
@@ -115,14 +218,20 @@ func TestRouteParamsByName(t *testing.T) {
router.GET("/test/:name/:last_name/*wild", func(c *Context) {
name = c.Params.ByName("name")
lastName = c.Params.ByName("last_name")
- wild = c.Params.ByName("wild")
+ var ok bool
+ wild, ok = c.Params.Get("wild")
- assert.Equal(t, name, c.ParamValue("name"))
- assert.Equal(t, lastName, c.ParamValue("last_name"))
+ assert.True(t, ok)
+ assert.Equal(t, name, c.Param("name"))
+ assert.Equal(t, name, c.Param("name"))
+ assert.Equal(t, lastName, c.Param("last_name"))
- assert.Equal(t, name, c.DefaultParamValue("name", "nothing"))
- assert.Equal(t, lastName, c.DefaultParamValue("last_name", "nothing"))
- assert.Equal(t, c.DefaultParamValue("noKey", "default"), "default")
+ assert.Empty(t, c.Param("wtf"))
+ assert.Empty(t, c.Params.ByName("wtf"))
+
+ wtf, ok := c.Params.Get("wtf")
+ assert.Empty(t, wtf)
+ assert.False(t, ok)
})
w := performRequest(router, "GET", "/test/john/smith/is/super/great")
@@ -142,25 +251,35 @@ func TestRouteStaticFile(t *testing.T) {
t.Error(err)
}
defer os.Remove(f.Name())
- filePath := path.Join("/", path.Base(f.Name()))
f.WriteString("Gin Web Framework")
f.Close()
+ dir, filename := filepath.Split(f.Name())
+
// SETUP gin
router := New()
- router.Static("./", testRoot)
+ router.Static("/using_static", dir)
+ router.StaticFile("/result", f.Name())
- w := performRequest(router, "GET", filePath)
+ w := performRequest(router, "GET", "/using_static/"+filename)
+ w2 := performRequest(router, "GET", "/result")
+ assert.Equal(t, w, w2)
assert.Equal(t, w.Code, 200)
assert.Equal(t, w.Body.String(), "Gin Web Framework")
assert.Equal(t, w.HeaderMap.Get("Content-Type"), "text/plain; charset=utf-8")
+
+ w3 := performRequest(router, "HEAD", "/using_static/"+filename)
+ w4 := performRequest(router, "HEAD", "/result")
+
+ assert.Equal(t, w3, w4)
+ assert.Equal(t, w3.Code, 200)
}
// TestHandleStaticDir - ensure the root/sub dir handles properly
-func TestRouteStaticDir(t *testing.T) {
+func TestRouteStaticListingDir(t *testing.T) {
router := New()
- router.Static("/", "./")
+ router.StaticFS("/", Dir("./", true))
w := performRequest(router, "GET", "/")
@@ -170,15 +289,14 @@ func TestRouteStaticDir(t *testing.T) {
}
// TestHandleHeadToDir - ensure the root/sub dir handles properly
-func TestRouteHeadToDir(t *testing.T) {
+func TestRouteStaticNoListing(t *testing.T) {
router := New()
router.Static("/", "./")
- w := performRequest(router, "HEAD", "/")
+ w := performRequest(router, "GET", "/")
- assert.Equal(t, w.Code, 200)
- assert.Contains(t, w.Body.String(), "gin.go")
- assert.Equal(t, w.HeaderMap.Get("Content-Type"), "text/html; charset=utf-8")
+ assert.Equal(t, w.Code, 404)
+ assert.NotContains(t, w.Body.String(), "gin.go")
}
func TestRouterMiddlewareAndStatic(t *testing.T) {
@@ -190,19 +308,19 @@ func TestRouterMiddlewareAndStatic(t *testing.T) {
})
static.Static("/", "./")
- w := performRequest(router, "GET", "/")
+ w := performRequest(router, "GET", "/gin.go")
assert.Equal(t, w.Code, 200)
- assert.Contains(t, w.Body.String(), "gin.go")
- assert.Equal(t, w.HeaderMap.Get("Content-Type"), "text/html; charset=utf-8")
+ assert.Contains(t, w.Body.String(), "package gin")
+ assert.Equal(t, w.HeaderMap.Get("Content-Type"), "text/plain; charset=utf-8")
assert.NotEqual(t, w.HeaderMap.Get("Last-Modified"), "Mon, 02 Jan 2006 15:04:05 MST")
assert.Equal(t, w.HeaderMap.Get("Expires"), "Mon, 02 Jan 2006 15:04:05 MST")
assert.Equal(t, w.HeaderMap.Get("x-GIN"), "Gin Framework")
}
-func TestRouteNotAllowed(t *testing.T) {
+func TestRouteNotAllowedEnabled(t *testing.T) {
router := New()
-
+ router.HandleMethodNotAllowed = true
router.POST("/path", func(c *Context) {})
w := performRequest(router, "GET", "/path")
assert.Equal(t, w.Code, http.StatusMethodNotAllowed)
@@ -215,8 +333,24 @@ func TestRouteNotAllowed(t *testing.T) {
assert.Equal(t, w.Code, http.StatusTeapot)
}
+func TestRouteNotAllowedDisabled(t *testing.T) {
+ router := New()
+ router.HandleMethodNotAllowed = false
+ router.POST("/path", func(c *Context) {})
+ w := performRequest(router, "GET", "/path")
+ assert.Equal(t, w.Code, 404)
+
+ router.NoMethod(func(c *Context) {
+ c.String(http.StatusTeapot, "responseText")
+ })
+ w = performRequest(router, "GET", "/path")
+ assert.Equal(t, w.Body.String(), "404 page not found")
+ assert.Equal(t, w.Code, 404)
+}
+
func TestRouterNotFound(t *testing.T) {
router := New()
+ router.RedirectFixedPath = true
router.GET("/path", func(c *Context) {})
router.GET("/dir/", func(c *Context) {})
router.GET("/", func(c *Context) {})
diff --git a/vendor/github.com/gin-gonic/gin/tree.go b/vendor/github.com/gin-gonic/gin/tree.go
index 169e5f107..c87e0d89b 100644
--- a/vendor/github.com/gin-gonic/gin/tree.go
+++ b/vendor/github.com/gin-gonic/gin/tree.go
@@ -9,6 +9,49 @@ import (
"unicode"
)
+// Param is a single URL parameter, consisting of a key and a value.
+type Param struct {
+ Key string
+ Value string
+}
+
+// Params is a Param-slice, as returned by the router.
+// The slice is ordered, the first URL parameter is also the first slice value.
+// It is therefore safe to read values by the index.
+type Params []Param
+
+// ByName returns the value of the first Param which key matches the given name.
+// If no matching Param is found, an empty string is returned.
+func (ps Params) Get(name string) (string, bool) {
+ for _, entry := range ps {
+ if entry.Key == name {
+ return entry.Value, true
+ }
+ }
+ return "", false
+}
+
+func (ps Params) ByName(name string) (va string) {
+ va, _ = ps.Get(name)
+ return
+}
+
+type methodTree struct {
+ method string
+ root *node
+}
+
+type methodTrees []methodTree
+
+func (trees methodTrees) get(method string) *node {
+ for _, tree := range trees {
+ if tree.method == method {
+ return tree.root
+ }
+ }
+ return nil
+}
+
func min(a, b int) int {
if a <= b {
return a
diff --git a/vendor/github.com/gin-gonic/gin/utils.go b/vendor/github.com/gin-gonic/gin/utils.go
index eaf6a5a79..533888d1e 100644
--- a/vendor/github.com/gin-gonic/gin/utils.go
+++ b/vendor/github.com/gin-gonic/gin/utils.go
@@ -7,12 +7,32 @@ package gin
import (
"encoding/xml"
"net/http"
+ "os"
"path"
"reflect"
"runtime"
"strings"
)
+const BindKey = "_gin-gonic/gin/bindkey"
+
+func Bind(val interface{}) HandlerFunc {
+ value := reflect.ValueOf(val)
+ if value.Kind() == reflect.Ptr {
+ panic(`Bind struct can not be a pointer. Example:
+ Use: gin.Bind(Struct{}) instead of gin.Bind(&Struct{})
+`)
+ }
+ typ := value.Type()
+
+ return func(c *Context) {
+ obj := reflect.New(typ).Interface()
+ if c.Bind(obj) == nil {
+ c.Set(BindKey, obj)
+ }
+ }
+}
+
func WrapF(f http.HandlerFunc) HandlerFunc {
return func(c *Context) {
f(c.Writer, c.Request)
@@ -110,3 +130,20 @@ func joinPaths(absolutePath, relativePath string) string {
}
return finalPath
}
+
+func resolveAddress(addr []string) string {
+ switch len(addr) {
+ case 0:
+ if port := os.Getenv("PORT"); len(port) > 0 {
+ debugPrint("Environment variable PORT=\"%s\"", port)
+ return ":" + port
+ } else {
+ debugPrint("Environment variable PORT is undefined. Using port :8080 by default")
+ return ":8080"
+ }
+ case 1:
+ return addr[0]
+ default:
+ panic("too much parameters")
+ }
+}
diff --git a/vendor/github.com/gin-gonic/gin/utils_test.go b/vendor/github.com/gin-gonic/gin/utils_test.go
index 4cd8e7f54..11a5b6848 100644
--- a/vendor/github.com/gin-gonic/gin/utils_test.go
+++ b/vendor/github.com/gin-gonic/gin/utils_test.go
@@ -9,7 +9,7 @@ import (
"net/http"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
func init() {
@@ -97,3 +97,30 @@ func TestJoinPaths(t *testing.T) {
assert.Equal(t, joinPaths("/a/", "/hola/"), "/a/hola/")
assert.Equal(t, joinPaths("/a/", "/hola//"), "/a/hola/")
}
+
+type bindTestStruct struct {
+ Foo string `form:"foo" binding:"required"`
+ Bar int `form:"bar" binding:"min=4"`
+}
+
+func TestBindMiddleware(t *testing.T) {
+ var value *bindTestStruct
+ var called bool
+ router := New()
+ router.GET("/", Bind(bindTestStruct{}), func(c *Context) {
+ called = true
+ value = c.MustGet(BindKey).(*bindTestStruct)
+ })
+ performRequest(router, "GET", "/?foo=hola&bar=10")
+ assert.True(t, called)
+ assert.Equal(t, value.Foo, "hola")
+ assert.Equal(t, value.Bar, 10)
+
+ called = false
+ performRequest(router, "GET", "/?foo=hola&bar=1")
+ assert.False(t, called)
+
+ assert.Panics(t, func() {
+ Bind(&bindTestStruct{})
+ })
+}
diff --git a/vendor/github.com/go-sql-driver/mysql/.gitignore b/vendor/github.com/go-sql-driver/mysql/.gitignore
deleted file mode 100644
index ba8e0cb3a..000000000
--- a/vendor/github.com/go-sql-driver/mysql/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.DS_Store
-.DS_Store?
-._*
-.Spotlight-V100
-.Trashes
-Icon?
-ehthumbs.db
-Thumbs.db
diff --git a/vendor/github.com/go-sql-driver/mysql/.travis.yml b/vendor/github.com/go-sql-driver/mysql/.travis.yml
deleted file mode 100644
index cc97c31e7..000000000
--- a/vendor/github.com/go-sql-driver/mysql/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: go
-go:
- - 1.1
- - tip
-
-before_script:
- - mysql -e 'create database gotest;'
diff --git a/vendor/github.com/google/go-github/github/github.go b/vendor/github.com/google/go-github/github/github.go
index 9b0db907c..fced10769 100644
--- a/vendor/github.com/google/go-github/github/github.go
+++ b/vendor/github.com/google/go-github/github/github.go
@@ -19,7 +19,7 @@ import (
"strings"
"time"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/google/go-querystring/query"
+ "github.com/google/go-querystring/query"
)
const (
diff --git a/vendor/github.com/google/go-github/github/search.go b/vendor/github.com/google/go-github/github/search.go
index ec604989b..d9e9b419a 100644
--- a/vendor/github.com/google/go-github/github/search.go
+++ b/vendor/github.com/google/go-github/github/search.go
@@ -8,7 +8,7 @@ package github
import (
"fmt"
- qs "github.com/drone/drone/Godeps/_workspace/src/github.com/google/go-querystring/query"
+ qs "github.com/google/go-querystring/query"
)
// SearchService provides access to the search related functions
diff --git a/vendor/github.com/gorilla/securecookie/.travis.yml b/vendor/github.com/gorilla/securecookie/.travis.yml
deleted file mode 100644
index d87d46576..000000000
--- a/vendor/github.com/gorilla/securecookie/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: go
-
-go:
- - 1.0
- - 1.1
- - 1.2
- - tip
diff --git a/vendor/github.com/gorilla/securecookie/securecookie.go b/vendor/github.com/gorilla/securecookie/securecookie.go
index 1b7acf8e4..74b8acc5c 100644
--- a/vendor/github.com/gorilla/securecookie/securecookie.go
+++ b/vendor/github.com/gorilla/securecookie/securecookie.go
@@ -196,7 +196,7 @@ func (s *SecureCookie) Decode(name, value string, dst interface{}) error {
// 3. Verify MAC. Value is "date|value|mac".
parts := bytes.SplitN(b, []byte("|"), 3)
if len(parts) != 3 {
- return ErrMacInvalid
+ return errors.New("securecookie: invalid value %v")
}
h := hmac.New(s.hashFunc, s.hashKey)
b = append([]byte(name+"|"), b[:len(b)-len(parts[2])-1]...)
@@ -255,7 +255,7 @@ func createMac(h hash.Hash, value []byte) []byte {
// verifyMac verifies that a message authentication code (MAC) is valid.
func verifyMac(h hash.Hash, value []byte, mac []byte) error {
mac2 := createMac(h, value)
- if subtle.ConstantTimeCompare(mac, mac2) == 1 {
+ if len(mac) == len(mac2) && subtle.ConstantTimeCompare(mac, mac2) == 1 {
return nil
}
return ErrMacInvalid
@@ -340,9 +340,9 @@ func decode(value []byte) ([]byte, error) {
// Helpers --------------------------------------------------------------------
-// GenerateRandomKey creates a random key with the given length in bytes.
-func GenerateRandomKey(length int) []byte {
- k := make([]byte, length)
+// GenerateRandomKey creates a random key with the given strength.
+func GenerateRandomKey(strength int) []byte {
+ k := make([]byte, strength)
if _, err := io.ReadFull(rand.Reader, k); err != nil {
return nil
}
@@ -375,11 +375,11 @@ func EncodeMulti(name string, value interface{}, codecs ...Codec) (string, error
var errors MultiError
for _, codec := range codecs {
- encoded, err := codec.Encode(name, value)
- if err == nil {
+ if encoded, err := codec.Encode(name, value); err == nil {
return encoded, nil
+ } else {
+ errors = append(errors, err)
}
- errors = append(errors, err)
}
return "", errors
}
@@ -395,11 +395,11 @@ func DecodeMulti(name string, value string, dst interface{}, codecs ...Codec) er
var errors MultiError
for _, codec := range codecs {
- err := codec.Decode(name, value, dst)
- if err == nil {
+ if err := codec.Decode(name, value, dst); err == nil {
return nil
+ } else {
+ errors = append(errors, err)
}
- errors = append(errors, err)
}
return errors
}
diff --git a/vendor/github.com/gorilla/securecookie/securecookie_test.go b/vendor/github.com/gorilla/securecookie/securecookie_test.go
index 241ff1090..fe0cdb109 100644
--- a/vendor/github.com/gorilla/securecookie/securecookie_test.go
+++ b/vendor/github.com/gorilla/securecookie/securecookie_test.go
@@ -8,7 +8,6 @@ import (
"crypto/aes"
"crypto/hmac"
"crypto/sha256"
- "encoding/base64"
"errors"
"fmt"
"strings"
@@ -67,27 +66,6 @@ func TestSecureCookie(t *testing.T) {
}
}
-func TestDecodeInvalid(t *testing.T) {
- // List of invalid cookies, which must not be accepted, base64-decoded
- // (they will be encoded before passing to Decode).
- invalidCookies := []string{
- "",
- " ",
- "\n",
- "||",
- "|||",
- "cookie",
- }
- s := New([]byte("12345"), nil)
- var dst string
- for i, v := range invalidCookies {
- err := s.Decode("name", base64.StdEncoding.EncodeToString([]byte(v)), &dst)
- if err == nil {
- t.Fatalf("%d: expected failure decoding", i)
- }
- }
-}
-
func TestAuthentication(t *testing.T) {
hash := hmac.New(sha256.New, []byte("secret-key"))
for _, value := range testStrings {
@@ -179,16 +157,6 @@ func TestMultiNoCodecs(t *testing.T) {
}
}
-func TestMissingKey(t *testing.T) {
- s1 := New(nil, nil)
-
- var dst []byte
- err := s1.Decode("sid", "value", &dst)
- if err != errHashKeyNotSet {
- t.Fatalf("Expected %#v, got %#v", errHashKeyNotSet, err)
- }
-}
-
// ----------------------------------------------------------------------------
type FooBar struct {
diff --git a/vendor/github.com/hashicorp/golang-lru/.gitignore b/vendor/github.com/hashicorp/golang-lru/.gitignore
deleted file mode 100644
index 836562412..000000000
--- a/vendor/github.com/hashicorp/golang-lru/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
diff --git a/vendor/github.com/hashicorp/golang-lru/README.md b/vendor/github.com/hashicorp/golang-lru/README.md
index 33e58cfaf..37fa54d42 100644
--- a/vendor/github.com/hashicorp/golang-lru/README.md
+++ b/vendor/github.com/hashicorp/golang-lru/README.md
@@ -20,6 +20,6 @@ for i := 0; i < 256; i++ {
l.Add(i, nil)
}
if l.Len() != 128 {
- panic(fmt.Sprintf("bad len: %v", l.Len()))
+ panic("bad len: %v", l.Len())
}
```
diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go
index b97933da5..8ccb72979 100644
--- a/vendor/github.com/hashicorp/golang-lru/lru.go
+++ b/vendor/github.com/hashicorp/golang-lru/lru.go
@@ -14,8 +14,7 @@ type Cache struct {
size int
evictList *list.List
items map[interface{}]*list.Element
- lock sync.RWMutex
- onEvicted func(key interface{}, value interface{})
+ lock sync.Mutex
}
// entry is used to hold a value in the evictList
@@ -26,10 +25,6 @@ type entry struct {
// New creates an LRU of the given size
func New(size int) (*Cache, error) {
- return NewWithEvict(size, nil)
-}
-
-func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) {
if size <= 0 {
return nil, errors.New("Must provide a positive size")
}
@@ -37,7 +32,6 @@ func NewWithEvict(size int, onEvicted func(key interface{}, value interface{}))
size: size,
evictList: list.New(),
items: make(map[interface{}]*list.Element, size),
- onEvicted: onEvicted,
}
return c, nil
}
@@ -46,19 +40,12 @@ func NewWithEvict(size int, onEvicted func(key interface{}, value interface{}))
func (c *Cache) Purge() {
c.lock.Lock()
defer c.lock.Unlock()
-
- if c.onEvicted != nil {
- for k, v := range c.items {
- c.onEvicted(k, v.Value)
- }
- }
-
c.evictList = list.New()
c.items = make(map[interface{}]*list.Element, c.size)
}
-// Add adds a value to the cache. Returns true if an eviction occured.
-func (c *Cache) Add(key, value interface{}) bool {
+// Add adds a value to the cache.
+func (c *Cache) Add(key, value interface{}) {
c.lock.Lock()
defer c.lock.Unlock()
@@ -66,7 +53,7 @@ func (c *Cache) Add(key, value interface{}) bool {
if ent, ok := c.items[key]; ok {
c.evictList.MoveToFront(ent)
ent.Value.(*entry).value = value
- return false
+ return
}
// Add new item
@@ -74,12 +61,10 @@ func (c *Cache) Add(key, value interface{}) bool {
entry := c.evictList.PushFront(ent)
c.items[key] = entry
- evict := c.evictList.Len() > c.size
// Verify size not exceeded
- if evict {
+ if c.evictList.Len() > c.size {
c.removeOldest()
}
- return evict
}
// Get looks up a key's value from the cache.
@@ -111,30 +96,6 @@ func (c *Cache) RemoveOldest() {
c.removeOldest()
}
-// Keys returns a slice of the keys in the cache, from oldest to newest.
-func (c *Cache) Keys() []interface{} {
- c.lock.RLock()
- defer c.lock.RUnlock()
-
- keys := make([]interface{}, len(c.items))
- ent := c.evictList.Back()
- i := 0
- for ent != nil {
- keys[i] = ent.Value.(*entry).key
- ent = ent.Prev()
- i++
- }
-
- return keys
-}
-
-// Len returns the number of items in the cache.
-func (c *Cache) Len() int {
- c.lock.RLock()
- defer c.lock.RUnlock()
- return c.evictList.Len()
-}
-
// removeOldest removes the oldest item from the cache.
func (c *Cache) removeOldest() {
ent := c.evictList.Back()
@@ -148,7 +109,11 @@ func (c *Cache) removeElement(e *list.Element) {
c.evictList.Remove(e)
kv := e.Value.(*entry)
delete(c.items, kv.key)
- if c.onEvicted != nil {
- c.onEvicted(kv.key, kv.value)
- }
+}
+
+// Len returns the number of items in the cache.
+func (c *Cache) Len() int {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ return c.evictList.Len()
}
diff --git a/vendor/github.com/hashicorp/golang-lru/lru_test.go b/vendor/github.com/hashicorp/golang-lru/lru_test.go
index cd0cd55d6..9c1063f92 100644
--- a/vendor/github.com/hashicorp/golang-lru/lru_test.go
+++ b/vendor/github.com/hashicorp/golang-lru/lru_test.go
@@ -1,33 +1,20 @@
package lru
-import "testing"
+import (
+ "testing"
+)
func TestLRU(t *testing.T) {
- evictCounter := 0
- onEvicted := func(k interface{}, v interface{}) {
- evictCounter += 1
- }
- l, err := NewWithEvict(128, onEvicted)
+ l, err := New(128)
if err != nil {
t.Fatalf("err: %v", err)
}
-
for i := 0; i < 256; i++ {
l.Add(i, i)
}
if l.Len() != 128 {
t.Fatalf("bad len: %v", l.Len())
}
-
- if evictCounter != 128 {
- t.Fatalf("bad evict count: %v", evictCounter)
- }
-
- for i, k := range l.Keys() {
- if v, ok := l.Get(k); !ok || v != k || v != i+128 {
- t.Fatalf("bad key: %v", k)
- }
- }
for i := 0; i < 128; i++ {
_, ok := l.Get(i)
if ok {
@@ -48,14 +35,6 @@ func TestLRU(t *testing.T) {
}
}
- l.Get(192) // expect 192 to be last key in l.Keys()
-
- for i, k := range l.Keys() {
- if (i < 63 && k != i+193) || (i == 63 && k != 192) {
- t.Fatalf("out of order key: %v", k)
- }
- }
-
l.Purge()
if l.Len() != 0 {
t.Fatalf("bad len: %v", l.Len())
@@ -64,23 +43,3 @@ func TestLRU(t *testing.T) {
t.Fatalf("should contain nothing")
}
}
-
-// test that Add return true/false if an eviction occured
-func TestLRUAdd(t *testing.T) {
- evictCounter := 0
- onEvicted := func(k interface{}, v interface{}) {
- evictCounter += 1
- }
-
- l, err := NewWithEvict(1, onEvicted)
- if err != nil {
- t.Fatalf("err: %v", err)
- }
-
- if l.Add(1, 1) == true || evictCounter != 0 {
- t.Errorf("should not have an eviction")
- }
- if l.Add(2, 2) == false || evictCounter != 1 {
- t.Errorf("should have an eviction")
- }
-}
diff --git a/vendor/github.com/lib/pq/.gitignore b/vendor/github.com/lib/pq/.gitignore
deleted file mode 100644
index 0f1d00e11..000000000
--- a/vendor/github.com/lib/pq/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.db
-*.test
-*~
-*.swp
diff --git a/vendor/github.com/lib/pq/.travis.yml b/vendor/github.com/lib/pq/.travis.yml
deleted file mode 100644
index fa3824d54..000000000
--- a/vendor/github.com/lib/pq/.travis.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-language: go
-
-go:
- - 1.1
- - 1.2
- - 1.3
- - 1.4
- - tip
-
-before_install:
- - psql --version
- - sudo /etc/init.d/postgresql stop
- - sudo apt-get -y --purge remove postgresql libpq-dev libpq5 postgresql-client-common postgresql-common
- - sudo rm -rf /var/lib/postgresql
- - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- - sudo sh -c "echo deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main $PGVERSION >> /etc/apt/sources.list.d/postgresql.list"
- - sudo apt-get update -qq
- - sudo apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::="--force-confnew" install postgresql-$PGVERSION postgresql-server-dev-$PGVERSION postgresql-contrib-$PGVERSION
- - sudo chmod 777 /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "local all postgres trust" > /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "local all all trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostnossl all pqgossltest 127.0.0.1/32 reject" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostnossl all pqgosslcert 127.0.0.1/32 reject" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostssl all pqgossltest 127.0.0.1/32 trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostssl all pqgosslcert 127.0.0.1/32 cert" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "host all all 127.0.0.1/32 trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostnossl all pqgossltest ::1/128 reject" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostnossl all pqgosslcert ::1/128 reject" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostssl all pqgossltest ::1/128 trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "hostssl all pqgosslcert ::1/128 cert" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - echo "host all all ::1/128 trust" >> /etc/postgresql/$PGVERSION/main/pg_hba.conf
- - sudo install -o postgres -g postgres -m 600 -t /var/lib/postgresql/$PGVERSION/main/ certs/server.key certs/server.crt certs/root.crt
- - sudo bash -c "[[ '${PGVERSION}' < '9.2' ]] || (echo \"ssl_cert_file = 'server.crt'\" >> /etc/postgresql/$PGVERSION/main/postgresql.conf)"
- - sudo bash -c "[[ '${PGVERSION}' < '9.2' ]] || (echo \"ssl_key_file = 'server.key'\" >> /etc/postgresql/$PGVERSION/main/postgresql.conf)"
- - sudo bash -c "[[ '${PGVERSION}' < '9.2' ]] || (echo \"ssl_ca_file = 'root.crt'\" >> /etc/postgresql/$PGVERSION/main/postgresql.conf)"
- - sudo sh -c "echo 127.0.0.1 postgres >> /etc/hosts"
- - sudo ls -l /var/lib/postgresql/$PGVERSION/main/
- - sudo cat /etc/postgresql/$PGVERSION/main/postgresql.conf
- - sudo chmod 600 $PQSSLCERTTEST_PATH/postgresql.key
- - sudo /etc/init.d/postgresql restart
-
-env:
- global:
- - PGUSER=postgres
- - PQGOSSLTESTS=1
- - PQSSLCERTTEST_PATH=$PWD/certs
- - PGHOST=127.0.0.1
- matrix:
- - PGVERSION=9.4
- - PGVERSION=9.3
- - PGVERSION=9.2
- - PGVERSION=9.1
- - PGVERSION=9.0
- - PGVERSION=8.4
-
-script:
- - go test -v ./...
-
-before_script:
- - psql -c 'create database pqgotest' -U postgres
- - psql -c 'create user pqgossltest' -U postgres
- - psql -c 'create user pqgosslcert' -U postgres
diff --git a/vendor/github.com/lib/pq/README.md b/vendor/github.com/lib/pq/README.md
index b6e6a3248..36d05fdde 100644
--- a/vendor/github.com/lib/pq/README.md
+++ b/vendor/github.com/lib/pq/README.md
@@ -55,14 +55,9 @@ code still exists in here.
* Bjørn Madsen (aeons)
* Blake Gentry (bgentry)
* Brad Fitzpatrick (bradfitz)
-* Charlie Melbye (cmelbye)
-* Chris Bandy (cbandy)
* Chris Walsh (cwds)
-* Dan Sosedoff (sosedoff)
* Daniel Farina (fdr)
* Eric Chlebek (echlebek)
-* Eric Garrido (minusnine)
-* Eric Urban (hydrogen18)
* Everyone at The Go Team
* Evan Shaw (edsrzf)
* Ewan Chou (coocood)
@@ -70,12 +65,10 @@ code still exists in here.
* Fumin (fumin)
* Gary Burd (garyburd)
* Heroku (heroku)
-* James Pozdena (jpoz)
* Jason McVetta (jmcvetta)
* Jeremy Jay (pbnjay)
* Joakim Sernbrant (serbaut)
* John Gallagher (jgallagher)
-* Jonathan Rudenberg (titanous)
* Joël Stemmer (jstemmer)
* Kamil Kisiel (kisielk)
* Kelly Dunn (kellydunn)
@@ -96,7 +89,4 @@ code still exists in here.
* Ryan Smith (ryandotsmith)
* Samuel Stauffer (samuel)
* Timothée Peignier (cyberdelia)
-* Travis Cline (tmc)
-* TruongSinh Tran-Nguyen (truongsinh)
-* Yaismel Miranda (ympons)
* notedit (notedit)
diff --git a/vendor/github.com/lib/pq/bench_test.go b/vendor/github.com/lib/pq/bench_test.go
index 98d8eeec9..2b8ec428e 100644
--- a/vendor/github.com/lib/pq/bench_test.go
+++ b/vendor/github.com/lib/pq/bench_test.go
@@ -7,6 +7,7 @@ import (
"bytes"
"database/sql"
"database/sql/driver"
+ "github.com/lib/pq/oid"
"io"
"math/rand"
"net"
@@ -16,8 +17,6 @@ import (
"sync"
"testing"
"time"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/lib/pq/oid"
)
var (
@@ -36,6 +35,7 @@ func BenchmarkSelectSeries(b *testing.B) {
}
func benchQuery(b *testing.B, query string, result interface{}) {
+ b.Skip("current pq database-backed benchmarks are inconsistent")
b.StopTimer()
db := openTestConn(b)
defer db.Close()
@@ -183,6 +183,7 @@ func BenchmarkPreparedSelectSeries(b *testing.B) {
}
func benchPreparedQuery(b *testing.B, query string, result interface{}) {
+ b.Skip("current pq database-backed benchmarks are inconsistent")
b.StopTimer()
db := openTestConn(b)
defer db.Close()
diff --git a/vendor/github.com/lib/pq/buf.go b/vendor/github.com/lib/pq/buf.go
index 9aeceabad..9f417a1eb 100644
--- a/vendor/github.com/lib/pq/buf.go
+++ b/vendor/github.com/lib/pq/buf.go
@@ -3,8 +3,7 @@ package pq
import (
"bytes"
"encoding/binary"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/lib/pq/oid"
+ "github.com/lib/pq/oid"
)
type readBuf []byte
diff --git a/vendor/github.com/lib/pq/certs/README b/vendor/github.com/lib/pq/certs/README
deleted file mode 100644
index 24ab7b256..000000000
--- a/vendor/github.com/lib/pq/certs/README
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory contains certificates and private keys for testing some
-SSL-related functionality in Travis. Do NOT use these certificates for
-anything other than testing.
diff --git a/vendor/github.com/lib/pq/certs/postgresql.crt b/vendor/github.com/lib/pq/certs/postgresql.crt
deleted file mode 100644
index 6e6b4284a..000000000
--- a/vendor/github.com/lib/pq/certs/postgresql.crt
+++ /dev/null
@@ -1,69 +0,0 @@
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 2 (0x2)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, ST=Nevada, L=Las Vegas, O=github.com/lib/pq, CN=pq CA
- Validity
- Not Before: Oct 11 15:10:11 2014 GMT
- Not After : Oct 8 15:10:11 2024 GMT
- Subject: C=US, ST=Nevada, L=Las Vegas, O=github.com/lib/pq, CN=pqgosslcert
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:e3:8c:06:9a:70:54:51:d1:34:34:83:39:cd:a2:
- 59:0f:05:ed:8d:d8:0e:34:d0:92:f4:09:4d:ee:8c:
- 78:55:49:24:f8:3c:e0:34:58:02:b2:e7:94:58:c1:
- e8:e5:bb:d1:af:f6:54:c1:40:b1:90:70:79:0d:35:
- 54:9c:8f:16:e9:c2:f0:92:e6:64:49:38:c1:76:f8:
- 47:66:c4:5b:4a:b6:a9:43:ce:c8:be:6c:4d:2b:94:
- 97:3c:55:bc:d1:d0:6e:b7:53:ae:89:5c:4b:6b:86:
- 40:be:c1:ae:1e:64:ce:9c:ae:87:0a:69:e5:c8:21:
- 12:be:ae:1d:f6:45:df:16:a7
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Subject Key Identifier:
- 9B:25:31:63:A2:D8:06:FF:CB:E3:E9:96:FF:0D:BA:DC:12:7D:04:CF
- X509v3 Authority Key Identifier:
- keyid:52:93:ED:1E:76:0A:9F:65:4F:DE:19:66:C1:D5:22:40:35:CB:A0:72
-
- X509v3 Basic Constraints:
- CA:FALSE
- X509v3 Key Usage:
- Digital Signature, Non Repudiation, Key Encipherment
- Signature Algorithm: sha256WithRSAEncryption
- 3e:f5:f8:0b:4e:11:bd:00:86:1f:ce:dc:97:02:98:91:11:f5:
- 65:f6:f2:8a:b2:3e:47:92:05:69:28:c9:e9:b4:f7:cf:93:d1:
- 2d:81:5d:00:3c:23:be:da:70:ea:59:e1:2c:d3:25:49:ae:a6:
- 95:54:c1:10:df:23:e3:fe:d6:e4:76:c7:6b:73:ad:1b:34:7c:
- e2:56:cc:c0:37:ae:c5:7a:11:20:6c:3d:05:0e:99:cd:22:6c:
- cf:59:a1:da:28:d4:65:ba:7d:2f:2b:3d:69:6d:a6:c1:ae:57:
- bf:56:64:13:79:f8:48:46:65:eb:81:67:28:0b:7b:de:47:10:
- b3:80:3c:31:d1:58:94:01:51:4a:c7:c8:1a:01:a8:af:c4:cd:
- bb:84:a5:d9:8b:b4:b9:a1:64:3e:95:d9:90:1d:d5:3f:67:cc:
- 3b:ba:f5:b4:d1:33:77:ee:c2:d2:3e:7e:c5:66:6e:b7:35:4c:
- 60:57:b0:b8:be:36:c8:f3:d3:95:8c:28:4a:c9:f7:27:a4:0d:
- e5:96:99:eb:f5:c8:bd:f3:84:6d:ef:02:f9:8a:36:7d:6b:5f:
- 36:68:37:41:d9:74:ae:c6:78:2e:44:86:a1:ad:43:ca:fb:b5:
- 3e:ba:10:23:09:02:ac:62:d1:d0:83:c8:95:b9:e3:5e:30:ff:
- 5b:2b:38:fa
------BEGIN CERTIFICATE-----
-MIIDEzCCAfugAwIBAgIBAjANBgkqhkiG9w0BAQsFADBeMQswCQYDVQQGEwJVUzEP
-MA0GA1UECBMGTmV2YWRhMRIwEAYDVQQHEwlMYXMgVmVnYXMxGjAYBgNVBAoTEWdp
-dGh1Yi5jb20vbGliL3BxMQ4wDAYDVQQDEwVwcSBDQTAeFw0xNDEwMTExNTEwMTFa
-Fw0yNDEwMDgxNTEwMTFaMGQxCzAJBgNVBAYTAlVTMQ8wDQYDVQQIEwZOZXZhZGEx
-EjAQBgNVBAcTCUxhcyBWZWdhczEaMBgGA1UEChMRZ2l0aHViLmNvbS9saWIvcHEx
-FDASBgNVBAMTC3BxZ29zc2xjZXJ0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
-gQDjjAaacFRR0TQ0gznNolkPBe2N2A400JL0CU3ujHhVSST4POA0WAKy55RYwejl
-u9Gv9lTBQLGQcHkNNVScjxbpwvCS5mRJOMF2+EdmxFtKtqlDzsi+bE0rlJc8VbzR
-0G63U66JXEtrhkC+wa4eZM6crocKaeXIIRK+rh32Rd8WpwIDAQABo1owWDAdBgNV
-HQ4EFgQUmyUxY6LYBv/L4+mW/w263BJ9BM8wHwYDVR0jBBgwFoAUUpPtHnYKn2VP
-3hlmwdUiQDXLoHIwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQEL
-BQADggEBAD71+AtOEb0Ahh/O3JcCmJER9WX28oqyPkeSBWkoyem098+T0S2BXQA8
-I77acOpZ4SzTJUmuppVUwRDfI+P+1uR2x2tzrRs0fOJWzMA3rsV6ESBsPQUOmc0i
-bM9Zodoo1GW6fS8rPWltpsGuV79WZBN5+EhGZeuBZygLe95HELOAPDHRWJQBUUrH
-yBoBqK/EzbuEpdmLtLmhZD6V2ZAd1T9nzDu69bTRM3fuwtI+fsVmbrc1TGBXsLi+
-Nsjz05WMKErJ9yekDeWWmev1yL3zhG3vAvmKNn1rXzZoN0HZdK7GeC5EhqGtQ8r7
-tT66ECMJAqxi0dCDyJW5414w/1srOPo=
------END CERTIFICATE-----
diff --git a/vendor/github.com/lib/pq/certs/postgresql.key b/vendor/github.com/lib/pq/certs/postgresql.key
deleted file mode 100644
index eb8b20be9..000000000
--- a/vendor/github.com/lib/pq/certs/postgresql.key
+++ /dev/null
@@ -1,15 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIICWwIBAAKBgQDjjAaacFRR0TQ0gznNolkPBe2N2A400JL0CU3ujHhVSST4POA0
-WAKy55RYwejlu9Gv9lTBQLGQcHkNNVScjxbpwvCS5mRJOMF2+EdmxFtKtqlDzsi+
-bE0rlJc8VbzR0G63U66JXEtrhkC+wa4eZM6crocKaeXIIRK+rh32Rd8WpwIDAQAB
-AoGAM5dM6/kp9P700i8qjOgRPym96Zoh5nGfz/rIE5z/r36NBkdvIg8OVZfR96nH
-b0b9TOMR5lsPp0sI9yivTWvX6qyvLJRWy2vvx17hXK9NxXUNTAm0PYZUTvCtcPeX
-RnJpzQKNZQPkFzF0uXBc4CtPK2Vz0+FGvAelrhYAxnw1dIkCQQD+9qaW5QhXjsjb
-Nl85CmXgxPmGROcgLQCO+omfrjf9UXrituU9Dz6auym5lDGEdMFnkzfr+wpasEy9
-mf5ZZOhDAkEA5HjXfVGaCtpydOt6hDon/uZsyssCK2lQ7NSuE3vP+sUsYMzIpEoy
-t3VWXqKbo+g9KNDTP4WEliqp1aiSIylzzQJANPeqzihQnlgEdD4MdD4rwhFJwVIp
-Le8Lcais1KaN7StzOwxB/XhgSibd2TbnPpw+3bSg5n5lvUdo+e62/31OHwJAU1jS
-I+F09KikQIr28u3UUWT2IzTT4cpVv1AHAQyV3sG3YsjSGT0IK20eyP9BEBZU2WL0
-7aNjrvR5aHxKc5FXsQJABsFtyGpgI5X4xufkJZVZ+Mklz2n7iXa+XPatMAHFxAtb
-EEMt60rngwMjXAzBSC6OYuYogRRAY3UCacNC5VhLYQ==
------END RSA PRIVATE KEY-----
diff --git a/vendor/github.com/lib/pq/certs/root.crt b/vendor/github.com/lib/pq/certs/root.crt
deleted file mode 100644
index aecf8f621..000000000
--- a/vendor/github.com/lib/pq/certs/root.crt
+++ /dev/null
@@ -1,24 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEAzCCAuugAwIBAgIJANmheROCdW1NMA0GCSqGSIb3DQEBBQUAMF4xCzAJBgNV
-BAYTAlVTMQ8wDQYDVQQIEwZOZXZhZGExEjAQBgNVBAcTCUxhcyBWZWdhczEaMBgG
-A1UEChMRZ2l0aHViLmNvbS9saWIvcHExDjAMBgNVBAMTBXBxIENBMB4XDTE0MTAx
-MTE1MDQyOVoXDTI0MTAwODE1MDQyOVowXjELMAkGA1UEBhMCVVMxDzANBgNVBAgT
-Bk5ldmFkYTESMBAGA1UEBxMJTGFzIFZlZ2FzMRowGAYDVQQKExFnaXRodWIuY29t
-L2xpYi9wcTEOMAwGA1UEAxMFcHEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCV4PxP7ShzWBzUCThcKk3qZtOLtHmszQVtbqhvgTpm1kTRtKBdVMu0
-pLAHQ3JgJCnAYgH0iZxVGoMP16T3irdgsdC48+nNTFM2T0cCdkfDURGIhSFN47cb
-Pgy306BcDUD2q7ucW33+dlFSRuGVewocoh4BWM/vMtMvvWzdi4Ag/L/jhb+5wZxZ
-sWymsadOVSDePEMKOvlCa3EdVwVFV40TVyDb+iWBUivDAYsS2a3KajuJrO6MbZiE
-Sp2RCIkZS2zFmzWxVRi9ZhzIZhh7EVF9JAaNC3T52jhGUdlRq3YpBTMnd89iOh74
-6jWXG7wSuPj3haFzyNhmJ0ZUh+2Ynoh1AgMBAAGjgcMwgcAwHQYDVR0OBBYEFFKT
-7R52Cp9lT94ZZsHVIkA1y6ByMIGQBgNVHSMEgYgwgYWAFFKT7R52Cp9lT94ZZsHV
-IkA1y6ByoWKkYDBeMQswCQYDVQQGEwJVUzEPMA0GA1UECBMGTmV2YWRhMRIwEAYD
-VQQHEwlMYXMgVmVnYXMxGjAYBgNVBAoTEWdpdGh1Yi5jb20vbGliL3BxMQ4wDAYD
-VQQDEwVwcSBDQYIJANmheROCdW1NMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF
-BQADggEBAAEhCLWkqJNMI8b4gkbmj5fqQ/4+oO83bZ3w2Oqf6eZ8I8BC4f2NOyE6
-tRUlq5+aU7eqC1cOAvGjO+YHN/bF/DFpwLlzvUSXt+JP/pYcUjL7v+pIvwqec9hD
-ndvM4iIbkD/H/OYQ3L+N3W+G1x7AcFIX+bGCb3PzYVQAjxreV6//wgKBosMGFbZo
-HPxT9RPMun61SViF04H5TNs0derVn1+5eiiYENeAhJzQNyZoOOUuX1X/Inx9bEPh
-C5vFBtSMgIytPgieRJVWAiMLYsfpIAStrHztRAbBs2DU01LmMgRvHdxgFEKinC/d
-UHZZQDP+6pT+zADrGhQGXe4eThaO6f0=
------END CERTIFICATE-----
diff --git a/vendor/github.com/lib/pq/certs/server.crt b/vendor/github.com/lib/pq/certs/server.crt
deleted file mode 100644
index ddc995a6d..000000000
--- a/vendor/github.com/lib/pq/certs/server.crt
+++ /dev/null
@@ -1,81 +0,0 @@
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 1 (0x1)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, ST=Nevada, L=Las Vegas, O=github.com/lib/pq, CN=pq CA
- Validity
- Not Before: Oct 11 15:05:15 2014 GMT
- Not After : Oct 8 15:05:15 2024 GMT
- Subject: C=US, ST=Nevada, L=Las Vegas, O=github.com/lib/pq, CN=postgres
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (2048 bit)
- Modulus (2048 bit):
- 00:d7:8a:4c:85:fb:17:a5:3c:8f:e0:72:11:29:ce:
- 3f:b0:1f:3f:7d:c6:ee:7f:a7:fc:02:2b:35:47:08:
- a6:3d:90:df:5c:56:14:94:00:c7:6d:d1:d2:e2:61:
- 95:77:b8:e3:a6:66:31:f9:1f:21:7d:62:e1:27:da:
- 94:37:61:4a:ea:63:53:a0:61:b8:9c:bb:a5:e2:e7:
- b7:a6:d8:0f:05:04:c7:29:e2:ea:49:2b:7f:de:15:
- 00:a6:18:70:50:c7:0c:de:9a:f9:5a:96:b0:e1:94:
- 06:c6:6d:4a:21:3b:b4:0f:a5:6d:92:86:34:b2:4e:
- d7:0e:a7:19:c0:77:0b:7b:87:c8:92:de:42:ff:86:
- d2:b7:9a:a4:d4:15:23:ca:ad:a5:69:21:b8:ce:7e:
- 66:cb:85:5d:b9:ed:8b:2d:09:8d:94:e4:04:1e:72:
- ec:ef:d0:76:90:15:5a:a4:f7:91:4b:e9:ce:4e:9d:
- 5d:9a:70:17:9c:d8:e9:73:83:ea:3d:61:99:a6:cd:
- ac:91:40:5a:88:77:e5:4e:2a:8e:3d:13:f3:f9:38:
- 6f:81:6b:8a:95:ca:0e:07:ab:6f:da:b4:8c:d9:ff:
- aa:78:03:aa:c7:c2:cf:6f:64:92:d3:d8:83:d5:af:
- f1:23:18:a7:2e:7b:17:0b:e7:7d:f1:fa:a8:41:a3:
- 04:57
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Subject Key Identifier:
- EE:F0:B3:46:DC:C7:09:EB:0E:B6:2F:E5:FE:62:60:45:44:9F:59:CC
- X509v3 Authority Key Identifier:
- keyid:52:93:ED:1E:76:0A:9F:65:4F:DE:19:66:C1:D5:22:40:35:CB:A0:72
-
- X509v3 Basic Constraints:
- CA:FALSE
- X509v3 Key Usage:
- Digital Signature, Non Repudiation, Key Encipherment
- Signature Algorithm: sha256WithRSAEncryption
- 7e:5a:6e:be:bf:d2:6c:c1:d6:fa:b6:fb:3f:06:53:36:08:87:
- 9d:95:b1:39:af:9e:f6:47:38:17:39:da:25:7c:f2:ad:0c:e3:
- ab:74:19:ca:fb:8c:a0:50:c0:1d:19:8a:9c:21:ed:0f:3a:d1:
- 96:54:2e:10:09:4f:b8:70:f7:2b:99:43:d2:c6:15:bc:3f:24:
- 7d:28:39:32:3f:8d:a4:4f:40:75:7f:3e:0d:1c:d1:69:f2:4e:
- 98:83:47:97:d2:25:ac:c9:36:86:2f:04:a6:c4:86:c7:c4:00:
- 5f:7f:b9:ad:fc:bf:e9:f5:78:d7:82:1a:51:0d:fc:ab:9e:92:
- 1d:5f:0c:18:d1:82:e0:14:c9:ce:91:89:71:ff:49:49:ff:35:
- bf:7b:44:78:42:c1:d0:66:65:bb:28:2e:60:ca:9b:20:12:a9:
- 90:61:b1:96:ec:15:46:c9:37:f7:07:90:8a:89:45:2a:3f:37:
- ec:dc:e3:e5:8f:c3:3a:57:80:a5:54:60:0c:e1:b2:26:99:2b:
- 40:7e:36:d1:9a:70:02:ec:63:f4:3b:72:ae:81:fb:30:20:6d:
- cb:48:46:c6:b5:8f:39:b1:84:05:25:55:8d:f5:62:f6:1b:46:
- 2e:da:a3:4c:26:12:44:d7:56:b6:b8:a9:ca:d3:ab:71:45:7c:
- 9f:48:6d:1e
------BEGIN CERTIFICATE-----
-MIIDlDCCAnygAwIBAgIBATANBgkqhkiG9w0BAQsFADBeMQswCQYDVQQGEwJVUzEP
-MA0GA1UECBMGTmV2YWRhMRIwEAYDVQQHEwlMYXMgVmVnYXMxGjAYBgNVBAoTEWdp
-dGh1Yi5jb20vbGliL3BxMQ4wDAYDVQQDEwVwcSBDQTAeFw0xNDEwMTExNTA1MTVa
-Fw0yNDEwMDgxNTA1MTVaMGExCzAJBgNVBAYTAlVTMQ8wDQYDVQQIEwZOZXZhZGEx
-EjAQBgNVBAcTCUxhcyBWZWdhczEaMBgGA1UEChMRZ2l0aHViLmNvbS9saWIvcHEx
-ETAPBgNVBAMTCHBvc3RncmVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEA14pMhfsXpTyP4HIRKc4/sB8/fcbuf6f8Ais1RwimPZDfXFYUlADHbdHS4mGV
-d7jjpmYx+R8hfWLhJ9qUN2FK6mNToGG4nLul4ue3ptgPBQTHKeLqSSt/3hUAphhw
-UMcM3pr5Wpaw4ZQGxm1KITu0D6VtkoY0sk7XDqcZwHcLe4fIkt5C/4bSt5qk1BUj
-yq2laSG4zn5my4Vdue2LLQmNlOQEHnLs79B2kBVapPeRS+nOTp1dmnAXnNjpc4Pq
-PWGZps2skUBaiHflTiqOPRPz+ThvgWuKlcoOB6tv2rSM2f+qeAOqx8LPb2SS09iD
-1a/xIxinLnsXC+d98fqoQaMEVwIDAQABo1owWDAdBgNVHQ4EFgQU7vCzRtzHCesO
-ti/l/mJgRUSfWcwwHwYDVR0jBBgwFoAUUpPtHnYKn2VP3hlmwdUiQDXLoHIwCQYD
-VR0TBAIwADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQELBQADggEBAH5abr6/0mzB
-1vq2+z8GUzYIh52VsTmvnvZHOBc52iV88q0M46t0Gcr7jKBQwB0Zipwh7Q860ZZU
-LhAJT7hw9yuZQ9LGFbw/JH0oOTI/jaRPQHV/Pg0c0WnyTpiDR5fSJazJNoYvBKbE
-hsfEAF9/ua38v+n1eNeCGlEN/Kuekh1fDBjRguAUyc6RiXH/SUn/Nb97RHhCwdBm
-ZbsoLmDKmyASqZBhsZbsFUbJN/cHkIqJRSo/N+zc4+WPwzpXgKVUYAzhsiaZK0B+
-NtGacALsY/Q7cq6B+zAgbctIRsa1jzmxhAUlVY31YvYbRi7ao0wmEkTXVra4qcrT
-q3FFfJ9IbR4=
------END CERTIFICATE-----
diff --git a/vendor/github.com/lib/pq/certs/server.key b/vendor/github.com/lib/pq/certs/server.key
deleted file mode 100644
index bd7b019b6..000000000
--- a/vendor/github.com/lib/pq/certs/server.key
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEA14pMhfsXpTyP4HIRKc4/sB8/fcbuf6f8Ais1RwimPZDfXFYU
-lADHbdHS4mGVd7jjpmYx+R8hfWLhJ9qUN2FK6mNToGG4nLul4ue3ptgPBQTHKeLq
-SSt/3hUAphhwUMcM3pr5Wpaw4ZQGxm1KITu0D6VtkoY0sk7XDqcZwHcLe4fIkt5C
-/4bSt5qk1BUjyq2laSG4zn5my4Vdue2LLQmNlOQEHnLs79B2kBVapPeRS+nOTp1d
-mnAXnNjpc4PqPWGZps2skUBaiHflTiqOPRPz+ThvgWuKlcoOB6tv2rSM2f+qeAOq
-x8LPb2SS09iD1a/xIxinLnsXC+d98fqoQaMEVwIDAQABAoIBAF3ZoihUhJ82F4+r
-Gz4QyDpv4L1reT2sb1aiabhcU8ZK5nbWJG+tRyjSS/i2dNaEcttpdCj9HR/zhgZM
-bm0OuAgG58rVwgS80CZUruq++Qs+YVojq8/gWPTiQD4SNhV2Fmx3HkwLgUk3oxuT
-SsvdqzGE3okGVrutCIcgy126eA147VPMoej1Bb3fO6npqK0pFPhZfAc0YoqJuM+k
-obRm5pAnGUipyLCFXjA9HYPKwYZw2RtfdA3CiImHeanSdqS+ctrC9y8BV40Th7gZ
-haXdKUNdjmIxV695QQ1mkGqpKLZFqhzKioGQ2/Ly2d1iaKN9fZltTusu8unepWJ2
-tlT9qMECgYEA9uHaF1t2CqE+AJvWTihHhPIIuLxoOQXYea1qvxfcH/UMtaLKzCNm
-lQ5pqCGsPvp+10f36yttO1ZehIvlVNXuJsjt0zJmPtIolNuJY76yeussfQ9jHheB
-5uPEzCFlHzxYbBUyqgWaF6W74okRGzEGJXjYSP0yHPPdU4ep2q3bGiUCgYEA34Af
-wBSuQSK7uLxArWHvQhyuvi43ZGXls6oRGl+Ysj54s8BP6XGkq9hEJ6G4yxgyV+BR
-DUOs5X8/TLT8POuIMYvKTQthQyCk0eLv2FLdESDuuKx0kBVY3s8lK3/z5HhrdOiN
-VMNZU+xDKgKc3hN9ypkk8vcZe6EtH7Y14e0rVcsCgYBTgxi8F/M5K0wG9rAqphNz
-VFBA9XKn/2M33cKjO5X5tXIEKzpAjaUQvNxexG04rJGljzG8+mar0M6ONahw5yD1
-O7i/XWgazgpuOEkkVYiYbd8RutfDgR4vFVMn3hAP3eDnRtBplRWH9Ec3HTiNIys6
-F8PKBOQjyRZQQC7jyzW3hQKBgACe5HeuFwXLSOYsb6mLmhR+6+VPT4wR1F95W27N
-USk9jyxAnngxfpmTkiziABdgS9N+pfr5cyN4BP77ia/Jn6kzkC5Cl9SN5KdIkA3z
-vPVtN/x/ThuQU5zaymmig1ThGLtMYggYOslG4LDfLPxY5YKIhle+Y+259twdr2yf
-Mf2dAoGAaGv3tWMgnIdGRk6EQL/yb9PKHo7ShN+tKNlGaK7WwzBdKs+Fe8jkgcr7
-pz4Ne887CmxejdISzOCcdT+Zm9Bx6I/uZwWOtDvWpIgIxVX9a9URj/+D1MxTE/y4
-d6H+c89yDY62I2+drMpdjCd3EtCaTlxpTbRS+s1eAHMH7aEkcCE=
------END RSA PRIVATE KEY-----
diff --git a/vendor/github.com/lib/pq/conn.go b/vendor/github.com/lib/pq/conn.go
index 27f9307b2..cef29b55d 100644
--- a/vendor/github.com/lib/pq/conn.go
+++ b/vendor/github.com/lib/pq/conn.go
@@ -4,34 +4,27 @@ import (
"bufio"
"crypto/md5"
"crypto/tls"
- "crypto/x509"
"database/sql"
"database/sql/driver"
"encoding/binary"
"errors"
"fmt"
+ "github.com/lib/pq/oid"
"io"
- "io/ioutil"
"net"
"os"
- "os/user"
"path"
- "path/filepath"
"strconv"
"strings"
"time"
"unicode"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/lib/pq/oid"
)
// Common error types
var (
- ErrNotSupported = errors.New("pq: Unsupported command")
- ErrInFailedTransaction = errors.New("pq: Could not complete operation in a failed transaction")
- ErrSSLNotSupported = errors.New("pq: SSL is not enabled on the server")
- ErrSSLKeyHasWorldPermissions = errors.New("pq: Private key file has group or world access. Permissions should be u=rw (0600) or less.")
- ErrCouldNotDetectUsername = errors.New("pq: Could not detect default username. Please provide one explicitly.")
+ ErrSSLNotSupported = errors.New("pq: SSL is not enabled on the server")
+ ErrNotSupported = errors.New("pq: Unsupported command")
+ ErrInFailedTransaction = errors.New("pq: Could not complete operation in a failed transaction")
)
type drv struct{}
@@ -73,7 +66,6 @@ func (s transactionStatus) String() string {
default:
errorf("unknown transactionStatus %d", s)
}
-
panic("not reached")
}
@@ -101,11 +93,7 @@ type conn struct {
parameterStatus parameterStatus
saveMessageType byte
- saveMessageBuffer []byte
-
- // If true, this connection is bad and all public-facing functions should
- // return ErrBadConn.
- bad bool
+ saveMessageBuffer *readBuf
}
func (c *conn) writeBuf(b byte) *writeBuf {
@@ -119,11 +107,22 @@ func Open(name string) (_ driver.Conn, err error) {
}
func DialOpen(d Dialer, name string) (_ driver.Conn, err error) {
- // Handle any panics during connection initialization. Note that we
- // specifically do *not* want to use errRecover(), as that would turn any
- // connection errors into ErrBadConns, hiding the real error message from
- // the user.
- defer errRecoverNoErrBadConn(&err)
+ defer func() {
+ // Handle any panics during connection initialization. Note that we
+ // specifically do *not* want to use errRecover(), as that would turn
+ // any connection errors into ErrBadConns, hiding the real error
+ // message from the user.
+ e := recover()
+ if e == nil {
+ // Do nothing
+ return
+ }
+ var ok bool
+ err, ok = e.(error)
+ if !ok {
+ err = fmt.Errorf("pq: unexpected error: %#v", e)
+ }
+ }()
o := make(values)
@@ -141,7 +140,7 @@ func DialOpen(d Dialer, name string) (_ driver.Conn, err error) {
o.Set(k, v)
}
- if strings.HasPrefix(name, "postgres://") || strings.HasPrefix(name, "postgresql://") {
+ if strings.HasPrefix(name, "postgres://") {
name, err = ParseURL(name)
if err != nil {
return nil, err
@@ -158,6 +157,7 @@ func DialOpen(d Dialer, name string) (_ driver.Conn, err error) {
o.Set("application_name", fallback)
}
}
+ o.Unset("fallback_application_name")
// We can't work with any client_encoding other than UTF-8 currently.
// However, we have historically allowed the user to set it to UTF-8
@@ -202,21 +202,19 @@ func DialOpen(d Dialer, name string) (_ driver.Conn, err error) {
cn.buf = bufio.NewReader(cn.c)
cn.startup(o)
// reset the deadline, in case one was set (see dial)
- if timeout := o.Get("connect_timeout"); timeout != "" && timeout != "0" {
- err = cn.c.SetDeadline(time.Time{})
- }
+ err = cn.c.SetDeadline(time.Time{})
return cn, err
}
func dial(d Dialer, o values) (net.Conn, error) {
ntw, addr := network(o)
- // SSL is not necessary or supported over UNIX domain sockets
- if ntw == "unix" {
- o["sslmode"] = "disable"
- }
+
+ timeout := o.Get("connect_timeout")
+ // Ensure the option will not be sent.
+ o.Unset("connect_timeout")
// Zero or not specified means wait indefinitely.
- if timeout := o.Get("connect_timeout"); timeout != "" && timeout != "0" {
+ if timeout != "" && timeout != "0" {
seconds, err := strconv.ParseInt(timeout, 10, 0)
if err != nil {
return nil, fmt.Errorf("invalid value for parameter connect_timeout: %s", err)
@@ -263,6 +261,10 @@ func (vs values) Isset(k string) bool {
return ok
}
+func (vs values) Unset(k string) {
+ delete(vs, k)
+}
+
// scanner implements a tokenizer for libpq-style option strings.
type scanner struct {
s []rune
@@ -381,16 +383,12 @@ func (cn *conn) isInTransaction() bool {
func (cn *conn) checkIsInTransaction(intxn bool) {
if cn.isInTransaction() != intxn {
- cn.bad = true
errorf("unexpected transaction status %v", cn.txnStatus)
}
}
func (cn *conn) Begin() (_ driver.Tx, err error) {
- if cn.bad {
- return nil, driver.ErrBadConn
- }
- defer cn.errRecover(&err)
+ defer errRecover(&err)
cn.checkIsInTransaction(false)
_, commandTag, err := cn.simpleExec("BEGIN")
@@ -398,21 +396,16 @@ func (cn *conn) Begin() (_ driver.Tx, err error) {
return nil, err
}
if commandTag != "BEGIN" {
- cn.bad = true
return nil, fmt.Errorf("unexpected command tag %s", commandTag)
}
if cn.txnStatus != txnStatusIdleInTransaction {
- cn.bad = true
return nil, fmt.Errorf("unexpected transaction status %v", cn.txnStatus)
}
return cn, nil
}
func (cn *conn) Commit() (err error) {
- if cn.bad {
- return driver.ErrBadConn
- }
- defer cn.errRecover(&err)
+ defer errRecover(&err)
cn.checkIsInTransaction(true)
// We don't want the client to think that everything is okay if it tries
@@ -430,13 +423,9 @@ func (cn *conn) Commit() (err error) {
_, commandTag, err := cn.simpleExec("COMMIT")
if err != nil {
- if cn.isInTransaction() {
- cn.bad = true
- }
return err
}
if commandTag != "COMMIT" {
- cn.bad = true
return fmt.Errorf("unexpected command tag %s", commandTag)
}
cn.checkIsInTransaction(false)
@@ -444,17 +433,11 @@ func (cn *conn) Commit() (err error) {
}
func (cn *conn) Rollback() (err error) {
- if cn.bad {
- return driver.ErrBadConn
- }
- defer cn.errRecover(&err)
+ defer errRecover(&err)
cn.checkIsInTransaction(true)
_, commandTag, err := cn.simpleExec("ROLLBACK")
if err != nil {
- if cn.isInTransaction() {
- cn.bad = true
- }
return err
}
if commandTag != "ROLLBACK" {
@@ -470,6 +453,8 @@ func (cn *conn) gname() string {
}
func (cn *conn) simpleExec(q string) (res driver.Result, commandTag string, err error) {
+ defer errRecover(&err)
+
b := cn.writeBuf('Q')
b.string(q)
cn.send(b)
@@ -478,7 +463,7 @@ func (cn *conn) simpleExec(q string) (res driver.Result, commandTag string, err
t, r := cn.recv1()
switch t {
case 'C':
- res, commandTag = cn.parseComplete(r.string())
+ res, commandTag = parseComplete(r.string())
case 'Z':
cn.processReadyForQuery(r)
// done
@@ -488,16 +473,16 @@ func (cn *conn) simpleExec(q string) (res driver.Result, commandTag string, err
case 'T', 'D', 'I':
// ignore any results
default:
- cn.bad = true
errorf("unknown response for simple query: %q", t)
}
}
+ panic("not reached")
}
func (cn *conn) simpleQuery(q string) (res driver.Rows, err error) {
- defer cn.errRecover(&err)
+ defer errRecover(&err)
- st := &stmt{cn: cn, name: ""}
+ st := &stmt{cn: cn, name: "", query: q}
b := cn.writeBuf('Q')
b.string(q)
@@ -512,7 +497,6 @@ func (cn *conn) simpleQuery(q string) (res driver.Rows, err error) {
// the user can close, though, to avoid connections from being
// leaked. A "rows" with done=true works fine for that purpose.
if err != nil {
- cn.bad = true
errorf("unexpected message %q in simple query execution", t)
}
res = &rows{st: st, done: true}
@@ -525,7 +509,6 @@ func (cn *conn) simpleQuery(q string) (res driver.Rows, err error) {
err = parseError(r)
case 'D':
if res == nil {
- cn.bad = true
errorf("unexpected DataRow in simple query execution")
}
// the query didn't fail; kick off to Next
@@ -540,14 +523,16 @@ func (cn *conn) simpleQuery(q string) (res driver.Rows, err error) {
// To work around a bug in QueryRow in Go 1.2 and earlier, wait
// until the first DataRow has been received.
default:
- cn.bad = true
errorf("unknown response for simple query: %q", t)
}
}
+ panic("not reached")
}
func (cn *conn) prepareTo(q, stmtName string) (_ *stmt, err error) {
- st := &stmt{cn: cn, name: stmtName}
+ defer errRecover(&err)
+
+ st := &stmt{cn: cn, name: stmtName, query: q}
b := cn.writeBuf('P')
b.string(st.name)
@@ -567,7 +552,7 @@ func (cn *conn) prepareTo(q, stmtName string) (_ *stmt, err error) {
switch t {
case '1':
case 't':
- nparams := r.int16()
+ nparams := int(r.int16())
st.paramTyps = make([]oid.Oid, nparams)
for i := range st.paramTyps {
@@ -583,18 +568,14 @@ func (cn *conn) prepareTo(q, stmtName string) (_ *stmt, err error) {
case 'E':
err = parseError(r)
default:
- cn.bad = true
errorf("unexpected describe rows response: %q", t)
}
}
+
+ panic("not reached")
}
-func (cn *conn) Prepare(q string) (_ driver.Stmt, err error) {
- if cn.bad {
- return nil, driver.ErrBadConn
- }
- defer cn.errRecover(&err)
-
+func (cn *conn) Prepare(q string) (driver.Stmt, error) {
if len(q) >= 4 && strings.EqualFold(q[:4], "COPY") {
return cn.prepareCopyIn(q)
}
@@ -602,10 +583,7 @@ func (cn *conn) Prepare(q string) (_ driver.Stmt, err error) {
}
func (cn *conn) Close() (err error) {
- if cn.bad {
- return driver.ErrBadConn
- }
- defer cn.errRecover(&err)
+ defer errRecover(&err)
// Don't go through send(); ListenerConn relies on us not scribbling on the
// scratch buffer of this connection.
@@ -619,10 +597,7 @@ func (cn *conn) Close() (err error) {
// Implement the "Queryer" interface
func (cn *conn) Query(query string, args []driver.Value) (_ driver.Rows, err error) {
- if cn.bad {
- return nil, driver.ErrBadConn
- }
- defer cn.errRecover(&err)
+ defer errRecover(&err)
// Check to see if we can use the "simpleQuery" interface, which is
// *much* faster than going through prepare/exec
@@ -641,10 +616,7 @@ func (cn *conn) Query(query string, args []driver.Value) (_ driver.Rows, err err
// Implement the optional "Execer" interface for one-shot queries
func (cn *conn) Exec(query string, args []driver.Value) (_ driver.Result, err error) {
- if cn.bad {
- return nil, driver.ErrBadConn
- }
- defer cn.errRecover(&err)
+ defer errRecover(&err)
// Check to see if we can use the "simpleExec" interface, which is
// *much* faster than going through prepare/exec
@@ -700,29 +672,27 @@ func (cn *conn) sendSimpleMessage(typ byte) (err error) {
// the message yourself.
func (cn *conn) saveMessage(typ byte, buf *readBuf) {
if cn.saveMessageType != 0 {
- cn.bad = true
errorf("unexpected saveMessageType %d", cn.saveMessageType)
}
cn.saveMessageType = typ
- cn.saveMessageBuffer = *buf
+ cn.saveMessageBuffer = buf
}
// recvMessage receives any message from the backend, or returns an error if
// a problem occurred while reading the message.
-func (cn *conn) recvMessage(r *readBuf) (byte, error) {
+func (cn *conn) recvMessage() (byte, *readBuf, error) {
// workaround for a QueryRow bug, see exec
if cn.saveMessageType != 0 {
- t := cn.saveMessageType
- *r = cn.saveMessageBuffer
+ t, r := cn.saveMessageType, cn.saveMessageBuffer
cn.saveMessageType = 0
cn.saveMessageBuffer = nil
- return t, nil
+ return t, r, nil
}
x := cn.scratch[:5]
_, err := io.ReadFull(cn.buf, x)
if err != nil {
- return 0, err
+ return 0, nil, err
}
// read the type and length of the message that follows
@@ -736,10 +706,10 @@ func (cn *conn) recvMessage(r *readBuf) (byte, error) {
}
_, err = io.ReadFull(cn.buf, y)
if err != nil {
- return 0, err
+ return 0, nil, err
}
- *r = y
- return t, nil
+
+ return t, (*readBuf)(&y), nil
}
// recv receives a message from the backend, but if an error happened while
@@ -749,8 +719,7 @@ func (cn *conn) recvMessage(r *readBuf) (byte, error) {
func (cn *conn) recv() (t byte, r *readBuf) {
for {
var err error
- r = &readBuf{}
- t, err = cn.recvMessage(r)
+ t, r, err = cn.recvMessage()
if err != nil {
panic(err)
}
@@ -764,13 +733,17 @@ func (cn *conn) recv() (t byte, r *readBuf) {
return
}
}
+
+ panic("not reached")
}
-// recv1Buf is exactly equivalent to recv1, except it uses a buffer supplied by
-// the caller to avoid an allocation.
-func (cn *conn) recv1Buf(r *readBuf) byte {
+// recv1 receives a message from the backend, panicking if an error occurs
+// while attempting to read it. All asynchronous messages are ignored, with
+// the exception of ErrorResponse.
+func (cn *conn) recv1() (t byte, r *readBuf) {
for {
- t, err := cn.recvMessage(r)
+ var err error
+ t, r, err = cn.recvMessage()
if err != nil {
panic(err)
}
@@ -781,31 +754,18 @@ func (cn *conn) recv1Buf(r *readBuf) byte {
case 'S':
cn.processParameterStatus(r)
default:
- return t
+ return
}
}
-}
-// recv1 receives a message from the backend, panicking if an error occurs
-// while attempting to read it. All asynchronous messages are ignored, with
-// the exception of ErrorResponse.
-func (cn *conn) recv1() (t byte, r *readBuf) {
- r = &readBuf{}
- t = cn.recv1Buf(r)
- return t, r
+ panic("not reached")
}
func (cn *conn) ssl(o values) {
- verifyCaOnly := false
tlsConf := tls.Config{}
switch mode := o.Get("sslmode"); mode {
case "require", "":
tlsConf.InsecureSkipVerify = true
- case "verify-ca":
- // We must skip TLS's own verification since it requires full
- // verification since Go 1.3.
- tlsConf.InsecureSkipVerify = true
- verifyCaOnly = true
case "verify-full":
tlsConf.ServerName = o.Get("host")
case "disable":
@@ -814,9 +774,6 @@ func (cn *conn) ssl(o values) {
errorf(`unsupported sslmode %q; only "require" (default), "verify-full", and "disable" supported`, mode)
}
- cn.setupSSLClientCertificates(&tlsConf, o)
- cn.setupSSLCA(&tlsConf, o)
-
w := cn.writeBuf(0)
w.int32(80877103)
cn.send(w)
@@ -831,135 +788,7 @@ func (cn *conn) ssl(o values) {
panic(ErrSSLNotSupported)
}
- client := tls.Client(cn.c, &tlsConf)
- if verifyCaOnly {
- cn.verifyCA(client, &tlsConf)
- }
- cn.c = client
-}
-
-// verifyCA carries out a TLS handshake to the server and verifies the
-// presented certificate against the effective CA, i.e. the one specified in
-// sslrootcert or the system CA if sslrootcert was not specified.
-func (cn *conn) verifyCA(client *tls.Conn, tlsConf *tls.Config) {
- err := client.Handshake()
- if err != nil {
- panic(err)
- }
- certs := client.ConnectionState().PeerCertificates
- opts := x509.VerifyOptions{
- DNSName: client.ConnectionState().ServerName,
- Intermediates: x509.NewCertPool(),
- Roots: tlsConf.RootCAs,
- }
- for i, cert := range certs {
- if i == 0 {
- continue
- }
- opts.Intermediates.AddCert(cert)
- }
- _, err = certs[0].Verify(opts)
- if err != nil {
- panic(err)
- }
-}
-
-// This function sets up SSL client certificates based on either the "sslkey"
-// and "sslcert" settings (possibly set via the environment variables PGSSLKEY
-// and PGSSLCERT, respectively), or if they aren't set, from the .postgresql
-// directory in the user's home directory. If the file paths are set
-// explicitly, the files must exist. The key file must also not be
-// world-readable, or this function will panic with
-// ErrSSLKeyHasWorldPermissions.
-func (cn *conn) setupSSLClientCertificates(tlsConf *tls.Config, o values) {
- var missingOk bool
-
- sslkey := o.Get("sslkey")
- sslcert := o.Get("sslcert")
- if sslkey != "" && sslcert != "" {
- // If the user has set an sslkey and sslcert, they *must* exist.
- missingOk = false
- } else {
- // Automatically load certificates from ~/.postgresql.
- user, err := user.Current()
- if err != nil {
- // user.Current() might fail when cross-compiling. We have to
- // ignore the error and continue without client certificates, since
- // we wouldn't know where to load them from.
- return
- }
-
- sslkey = filepath.Join(user.HomeDir, ".postgresql", "postgresql.key")
- sslcert = filepath.Join(user.HomeDir, ".postgresql", "postgresql.crt")
- missingOk = true
- }
-
- // Check that both files exist, and report the error or stop, depending on
- // which behaviour we want. Note that we don't do any more extensive
- // checks than this (such as checking that the paths aren't directories);
- // LoadX509KeyPair() will take care of the rest.
- keyfinfo, err := os.Stat(sslkey)
- if err != nil && missingOk {
- return
- } else if err != nil {
- panic(err)
- }
- _, err = os.Stat(sslcert)
- if err != nil && missingOk {
- return
- } else if err != nil {
- panic(err)
- }
-
- // If we got this far, the key file must also have the correct permissions
- kmode := keyfinfo.Mode()
- if kmode != kmode&0600 {
- panic(ErrSSLKeyHasWorldPermissions)
- }
-
- cert, err := tls.LoadX509KeyPair(sslcert, sslkey)
- if err != nil {
- panic(err)
- }
- tlsConf.Certificates = []tls.Certificate{cert}
-}
-
-// Sets up RootCAs in the TLS configuration if sslrootcert is set.
-func (cn *conn) setupSSLCA(tlsConf *tls.Config, o values) {
- if sslrootcert := o.Get("sslrootcert"); sslrootcert != "" {
- tlsConf.RootCAs = x509.NewCertPool()
-
- cert, err := ioutil.ReadFile(sslrootcert)
- if err != nil {
- panic(err)
- }
-
- ok := tlsConf.RootCAs.AppendCertsFromPEM(cert)
- if !ok {
- errorf("couldn't parse pem in sslrootcert")
- }
- }
-}
-
-// isDriverSetting returns true iff a setting is purely for configuring the
-// driver's options and should not be sent to the server in the connection
-// startup packet.
-func isDriverSetting(key string) bool {
- switch key {
- case "host", "port":
- return true
- case "password":
- return true
- case "sslmode", "sslcert", "sslkey", "sslrootcert":
- return true
- case "fallback_application_name":
- return true
- case "connect_timeout":
- return true
-
- default:
- return false
- }
+ cn.c = tls.Client(cn.c, &tlsConf)
}
func (cn *conn) startup(o values) {
@@ -970,8 +799,9 @@ func (cn *conn) startup(o values) {
// parameters potentially included in the connection string. If the server
// doesn't recognize any of them, it will reply with an error.
for k, v := range o {
- if isDriverSetting(k) {
- // skip options which can't be run-time parameters
+ // skip options which can't be run-time parameters
+ if k == "password" || k == "host" ||
+ k == "port" || k == "sslmode" {
continue
}
// The protocol requires us to supply the database name as "database"
@@ -1041,6 +871,7 @@ func (cn *conn) auth(r *readBuf, o values) {
type stmt struct {
cn *conn
name string
+ query string
cols []string
rowTyps []oid.Oid
paramTyps []oid.Oid
@@ -1051,10 +882,8 @@ func (st *stmt) Close() (err error) {
if st.closed {
return nil
}
- if st.cn.bad {
- return driver.ErrBadConn
- }
- defer st.cn.errRecover(&err)
+
+ defer errRecover(&err)
w := st.cn.writeBuf('C')
w.byte('S')
@@ -1065,14 +894,12 @@ func (st *stmt) Close() (err error) {
t, _ := st.cn.recv1()
if t != '3' {
- st.cn.bad = true
errorf("unexpected close response: %q", t)
}
st.closed = true
t, r := st.cn.recv1()
if t != 'Z' {
- st.cn.bad = true
errorf("expected ready for query, but got: %q", t)
}
st.cn.processReadyForQuery(r)
@@ -1081,21 +908,19 @@ func (st *stmt) Close() (err error) {
}
func (st *stmt) Query(v []driver.Value) (r driver.Rows, err error) {
- if st.cn.bad {
- return nil, driver.ErrBadConn
- }
- defer st.cn.errRecover(&err)
-
+ defer errRecover(&err)
st.exec(v)
return &rows{st: st}, nil
}
func (st *stmt) Exec(v []driver.Value) (res driver.Result, err error) {
- if st.cn.bad {
- return nil, driver.ErrBadConn
- }
- defer st.cn.errRecover(&err)
+ defer errRecover(&err)
+ if len(v) == 0 {
+ // ignore commandTag, our caller doesn't care
+ r, _, err := st.cn.simpleExec(st.query)
+ return r, err
+ }
st.exec(v)
for {
@@ -1104,24 +929,22 @@ func (st *stmt) Exec(v []driver.Value) (res driver.Result, err error) {
case 'E':
err = parseError(r)
case 'C':
- res, _ = st.cn.parseComplete(r.string())
+ res, _ = parseComplete(r.string())
case 'Z':
st.cn.processReadyForQuery(r)
// done
return
- case 'T', 'D', 'I':
+ case 'T', 'D':
// ignore any results
default:
- st.cn.bad = true
errorf("unknown exec response: %q", t)
}
}
+
+ panic("not reached")
}
func (st *stmt) exec(v []driver.Value) {
- if len(v) >= 65536 {
- errorf("got %d parameters but PostgreSQL only supports 65535 parameters", len(v))
- }
if len(v) != len(st.paramTyps) {
errorf("got %d parameters but the statement requires %d", len(v), len(st.paramTyps))
}
@@ -1168,7 +991,6 @@ func (st *stmt) exec(v []driver.Value) {
}
return
default:
- st.cn.bad = true
errorf("unexpected bind response: %q", t)
}
}
@@ -1194,13 +1016,11 @@ workaround:
return
case 'Z':
if err == nil {
- st.cn.bad = true
errorf("unexpected ReadyForQuery during extended query execution")
}
st.cn.processReadyForQuery(r)
panic(err)
default:
- st.cn.bad = true
errorf("unexpected message during query execution: %q", t)
}
}
@@ -1214,7 +1034,7 @@ func (st *stmt) NumInput() int {
// returns the number of rows affected (if applicable) and a string
// identifying only the command that was executed, e.g. "ALTER TABLE". If the
// command tag could not be parsed, parseComplete panics.
-func (cn *conn) parseComplete(commandTag string) (driver.Result, string) {
+func parseComplete(commandTag string) (driver.Result, string) {
commandsWithAffectedRows := []string{
"SELECT ",
// INSERT is handled below
@@ -1241,7 +1061,6 @@ func (cn *conn) parseComplete(commandTag string) (driver.Result, string) {
if affectedRows == nil && strings.HasPrefix(commandTag, "INSERT ") {
parts := strings.Split(commandTag, " ")
if len(parts) != 3 {
- cn.bad = true
errorf("unexpected INSERT command tag %s", commandTag)
}
affectedRows = &parts[len(parts)-1]
@@ -1253,7 +1072,6 @@ func (cn *conn) parseComplete(commandTag string) (driver.Result, string) {
}
n, err := strconv.ParseInt(*affectedRows, 10, 64)
if err != nil {
- cn.bad = true
errorf("could not parse commandTag: %s", err)
}
return driver.RowsAffected(n), commandTag
@@ -1262,11 +1080,9 @@ func (cn *conn) parseComplete(commandTag string) (driver.Result, string) {
type rows struct {
st *stmt
done bool
- rb readBuf
}
func (rs *rows) Close() error {
- // no need to look at cn.bad as Next() will
for {
err := rs.Next(nil)
switch err {
@@ -1277,6 +1093,7 @@ func (rs *rows) Close() error {
return err
}
}
+ panic("not reached")
}
func (rs *rows) Columns() []string {
@@ -1288,44 +1105,43 @@ func (rs *rows) Next(dest []driver.Value) (err error) {
return io.EOF
}
- conn := rs.st.cn
- if conn.bad {
- return driver.ErrBadConn
- }
- defer conn.errRecover(&err)
+ defer errRecover(&err)
+ conn := rs.st.cn
for {
- t := conn.recv1Buf(&rs.rb)
+ t, r := conn.recv1()
switch t {
case 'E':
- err = parseError(&rs.rb)
+ err = parseError(r)
case 'C', 'I':
continue
case 'Z':
- conn.processReadyForQuery(&rs.rb)
+ conn.processReadyForQuery(r)
rs.done = true
if err != nil {
return err
}
return io.EOF
case 'D':
- n := rs.rb.int16()
+ n := r.int16()
if n < len(dest) {
dest = dest[:n]
}
for i := range dest {
- l := rs.rb.int32()
+ l := r.int32()
if l == -1 {
dest[i] = nil
continue
}
- dest[i] = decode(&conn.parameterStatus, rs.rb.next(l), rs.st.rowTyps[i])
+ dest[i] = decode(&conn.parameterStatus, r.next(l), rs.st.rowTyps[i])
}
return
default:
errorf("unexpected message after execute: %q", t)
}
}
+
+ panic("not reached")
}
// QuoteIdentifier quotes an "identifier" (e.g. a table or a column name) to be
@@ -1442,13 +1258,7 @@ func parseEnviron(env []string) (out map[string]string) {
accrue("application_name")
case "PGSSLMODE":
accrue("sslmode")
- case "PGSSLCERT":
- accrue("sslcert")
- case "PGSSLKEY":
- accrue("sslkey")
- case "PGSSLROOTCERT":
- accrue("sslrootcert")
- case "PGREQUIRESSL", "PGSSLCRL":
+ case "PGREQUIRESSL", "PGSSLCERT", "PGSSLKEY", "PGSSLROOTCERT", "PGSSLCRL":
unsupported()
case "PGREQUIREPEER":
unsupported()
diff --git a/vendor/github.com/lib/pq/conn_test.go b/vendor/github.com/lib/pq/conn_test.go
index 741fd761a..e5e428127 100644
--- a/vendor/github.com/lib/pq/conn_test.go
+++ b/vendor/github.com/lib/pq/conn_test.go
@@ -7,6 +7,8 @@ import (
"io"
"os"
"reflect"
+ "runtime"
+ "strings"
"testing"
"time"
)
@@ -16,14 +18,22 @@ type Fatalistic interface {
}
func openTestConnConninfo(conninfo string) (*sql.DB, error) {
- defaultTo := func(envvar string, value string) {
- if os.Getenv(envvar) == "" {
- os.Setenv(envvar, value)
- }
+ datname := os.Getenv("PGDATABASE")
+ sslmode := os.Getenv("PGSSLMODE")
+ timeout := os.Getenv("PGCONNECT_TIMEOUT")
+
+ if datname == "" {
+ os.Setenv("PGDATABASE", "pqgotest")
}
- defaultTo("PGDATABASE", "pqgotest")
- defaultTo("PGSSLMODE", "disable")
- defaultTo("PGCONNECT_TIMEOUT", "20")
+
+ if sslmode == "" {
+ os.Setenv("PGSSLMODE", "disable")
+ }
+
+ if timeout == "" {
+ os.Setenv("PGCONNECT_TIMEOUT", "20")
+ }
+
return sql.Open("postgres", conninfo)
}
@@ -46,6 +56,12 @@ func getServerVersion(t *testing.T, db *sql.DB) int {
}
func TestReconnect(t *testing.T) {
+ if runtime.Version() == "go1.0.2" {
+ fmt.Println("Skipping failing test; " +
+ "fixed in database/sql on go1.0.3+")
+ return
+ }
+
db1 := openTestConn(t)
defer db1.Close()
tx, err := db1.Begin()
@@ -98,22 +114,18 @@ func TestCommitInFailedTransaction(t *testing.T) {
}
func TestOpenURL(t *testing.T) {
- testURL := func(url string) {
- db, err := openTestConnConninfo(url)
- if err != nil {
- t.Fatal(err)
- }
- defer db.Close()
- // database/sql might not call our Open at all unless we do something with
- // the connection
- txn, err := db.Begin()
- if err != nil {
- t.Fatal(err)
- }
- txn.Rollback()
+ db, err := openTestConnConninfo("postgres://")
+ if err != nil {
+ t.Fatal(err)
}
- testURL("postgres://")
- testURL("postgresql://")
+ defer db.Close()
+ // database/sql might not call our Open at all unless we do something with
+ // the connection
+ txn, err := db.Begin()
+ if err != nil {
+ t.Fatal(err)
+ }
+ txn.Rollback()
}
func TestExec(t *testing.T) {
@@ -453,38 +465,32 @@ func TestErrorDuringStartup(t *testing.T) {
e, ok := err.(*Error)
if !ok {
t.Fatalf("expected Error, got %#v", err)
- } else if e.Code.Name() != "invalid_authorization_specification" && e.Code.Name() != "invalid_password" {
- t.Fatalf("expected invalid_authorization_specification or invalid_password, got %s (%+v)", e.Code.Name(), err)
+ } else if e.Code.Name() != "invalid_authorization_specification" {
+ t.Fatalf("expected invalid_authorization_specification, got %s (%+v)", e.Code.Name(), err)
}
}
func TestBadConn(t *testing.T) {
var err error
- cn := conn{}
func() {
- defer cn.errRecover(&err)
+ defer errRecover(&err)
panic(io.EOF)
}()
+
if err != driver.ErrBadConn {
t.Fatalf("expected driver.ErrBadConn, got: %#v", err)
}
- if !cn.bad {
- t.Fatalf("expected cn.bad")
- }
- cn = conn{}
func() {
- defer cn.errRecover(&err)
+ defer errRecover(&err)
e := &Error{Severity: Efatal}
panic(e)
}()
+
if err != driver.ErrBadConn {
t.Fatalf("expected driver.ErrBadConn, got: %#v", err)
}
- if !cn.bad {
- t.Fatalf("expected cn.bad")
- }
}
func TestErrorOnExec(t *testing.T) {
@@ -826,6 +832,11 @@ func TestIssue196(t *testing.T) {
// Test that any CommandComplete messages sent before the query results are
// ignored.
func TestIssue282(t *testing.T) {
+ if strings.HasPrefix(runtime.Version(), "go1.0") {
+ fmt.Println("Skipping test due to lack of Queryer implementation")
+ return
+ }
+
db := openTestConn(t)
defer db.Close()
@@ -861,60 +872,6 @@ func TestReadFloatPrecision(t *testing.T) {
}
}
-func TestXactMultiStmt(t *testing.T) {
- // minified test case based on bug reports from
- // pico303@gmail.com and rangelspam@gmail.com
- t.Skip("Skipping failing test")
- db := openTestConn(t)
- defer db.Close()
-
- tx, err := db.Begin()
- if err != nil {
- t.Fatal(err)
- }
- defer tx.Commit()
-
- rows, err := tx.Query("select 1")
- if err != nil {
- t.Fatal(err)
- }
-
- if rows.Next() {
- var val int32
- if err = rows.Scan(&val); err != nil {
- t.Fatal(err)
- }
- } else {
- t.Fatal("Expected at least one row in first query in xact")
- }
-
- rows2, err := tx.Query("select 2")
- if err != nil {
- t.Fatal(err)
- }
-
- if rows2.Next() {
- var val2 int32
- if err := rows2.Scan(&val2); err != nil {
- t.Fatal(err)
- }
- } else {
- t.Fatal("Expected at least one row in second query in xact")
- }
-
- if err = rows.Err(); err != nil {
- t.Fatal(err)
- }
-
- if err = rows2.Err(); err != nil {
- t.Fatal(err)
- }
-
- if err = tx.Commit(); err != nil {
- t.Fatal(err)
- }
-}
-
var envParseTests = []struct {
Expected map[string]string
Env []string
@@ -951,8 +908,7 @@ func TestParseComplete(t *testing.T) {
}
}
}()
- cn := &conn{}
- res, c := cn.parseComplete(commandTag)
+ res, c := parseComplete(commandTag)
if c != command {
t.Errorf("Expected %v, got %v", command, c)
}
@@ -1205,15 +1161,14 @@ func TestRuntimeParameters(t *testing.T) {
if err != nil {
t.Fatal(err)
}
+ defer db.Close()
// application_name didn't exist before 9.0
if test.param == "application_name" && getServerVersion(t, db) < 90000 {
- db.Close()
continue
}
tryGetParameterValue := func() (value string, outcome RuntimeTestResult) {
- defer db.Close()
row := db.QueryRow("SELECT current_setting($1)", test.param)
err = row.Scan(&value)
if err != nil {
diff --git a/vendor/github.com/lib/pq/conn_xact_test.go b/vendor/github.com/lib/pq/conn_xact_test.go
new file mode 100644
index 000000000..4c635d43a
--- /dev/null
+++ b/vendor/github.com/lib/pq/conn_xact_test.go
@@ -0,0 +1,61 @@
+// +build go1.1
+
+package pq
+
+import (
+ "testing"
+)
+
+func TestXactMultiStmt(t *testing.T) {
+ // minified test case based on bug reports from
+ // pico303@gmail.com and rangelspam@gmail.com
+ t.Skip("Skipping failing test")
+ db := openTestConn(t)
+ defer db.Close()
+
+ tx, err := db.Begin()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer tx.Commit()
+
+ rows, err := tx.Query("select 1")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if rows.Next() {
+ var val int32
+ if err = rows.Scan(&val); err != nil {
+ t.Fatal(err)
+ }
+ } else {
+ t.Fatal("Expected at least one row in first query in xact")
+ }
+
+ rows2, err := tx.Query("select 2")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if rows2.Next() {
+ var val2 int32
+ if err := rows2.Scan(&val2); err != nil {
+ t.Fatal(err)
+ }
+ } else {
+ t.Fatal("Expected at least one row in second query in xact")
+ }
+
+ if err = rows.Err(); err != nil {
+ t.Fatal(err)
+ }
+
+ if err = rows2.Err(); err != nil {
+ t.Fatal(err)
+ }
+
+ if err = tx.Commit(); err != nil {
+ t.Fatal(err)
+ }
+}
diff --git a/vendor/github.com/lib/pq/copy.go b/vendor/github.com/lib/pq/copy.go
index e44fa48a5..0a9cca8be 100644
--- a/vendor/github.com/lib/pq/copy.go
+++ b/vendor/github.com/lib/pq/copy.go
@@ -4,8 +4,7 @@ import (
"database/sql/driver"
"encoding/binary"
"errors"
- "fmt"
- "sync"
+ "sync/atomic"
)
var (
@@ -49,10 +48,9 @@ type copyin struct {
rowData chan []byte
done chan bool
- closed bool
-
- sync.Mutex // guards err
- err error
+ closed bool
+ err error
+ errorset int32
}
const ciBufferSize = 64 * 1024
@@ -61,6 +59,8 @@ const ciBufferSize = 64 * 1024
const ciBufferFlushSize = 63 * 1024
func (cn *conn) prepareCopyIn(q string) (_ driver.Stmt, err error) {
+ defer errRecover(&err)
+
if !cn.isInTransaction() {
return nil, errCopyNotSupportedOutsideTxn
}
@@ -69,7 +69,7 @@ func (cn *conn) prepareCopyIn(q string) (_ driver.Stmt, err error) {
cn: cn,
buffer: make([]byte, 0, ciBufferSize),
rowData: make(chan []byte),
- done: make(chan bool, 1),
+ done: make(chan bool),
}
// add CopyData identifier + 4 bytes for message length
ci.buffer = append(ci.buffer, 'd', 0, 0, 0, 0)
@@ -96,13 +96,11 @@ awaitCopyInResponse:
err = parseError(r)
case 'Z':
if err == nil {
- cn.bad = true
errorf("unexpected ReadyForQuery in response to COPY")
}
cn.processReadyForQuery(r)
return nil, err
default:
- cn.bad = true
errorf("unknown response for copy query: %q", t)
}
}
@@ -121,10 +119,11 @@ awaitCopyInResponse:
cn.processReadyForQuery(r)
return nil, err
default:
- cn.bad = true
errorf("unknown response for CopyFail: %q", t)
}
}
+
+ panic("not reached")
}
func (ci *copyin) flush(buf []byte) {
@@ -139,50 +138,30 @@ func (ci *copyin) flush(buf []byte) {
func (ci *copyin) resploop() {
for {
- var r readBuf
- t, err := ci.cn.recvMessage(&r)
- if err != nil {
- ci.cn.bad = true
- ci.setError(err)
- ci.done <- true
- return
- }
+ t, r := ci.cn.recv1()
switch t {
case 'C':
// complete
- case 'N':
- // NoticeResponse
case 'Z':
- ci.cn.processReadyForQuery(&r)
+ ci.cn.processReadyForQuery(r)
ci.done <- true
return
case 'E':
- err := parseError(&r)
+ err := parseError(r)
ci.setError(err)
default:
- ci.cn.bad = true
- ci.setError(fmt.Errorf("unknown response during CopyIn: %q", t))
- ci.done <- true
- return
+ errorf("unknown response: %q", t)
}
}
}
func (ci *copyin) isErrorSet() bool {
- ci.Lock()
- isSet := (ci.err != nil)
- ci.Unlock()
- return isSet
+ return atomic.LoadInt32(&ci.errorset) != 0
}
-// setError() sets ci.err if one has not been set already. Caller must not be
-// holding ci.Mutex.
func (ci *copyin) setError(err error) {
- ci.Lock()
- if ci.err == nil {
- ci.err = err
- }
- ci.Unlock()
+ ci.err = err
+ atomic.StoreInt32(&ci.errorset, 1)
}
func (ci *copyin) NumInput() int {
@@ -201,15 +180,12 @@ func (ci *copyin) Query(v []driver.Value) (r driver.Rows, err error) {
// errors from pending data, since Stmt.Close() doesn't return errors
// to the user.
func (ci *copyin) Exec(v []driver.Value) (r driver.Result, err error) {
+ defer errRecover(&err)
+
if ci.closed {
return nil, errCopyInClosed
}
- if ci.cn.bad {
- return nil, driver.ErrBadConn
- }
- defer ci.cn.errRecover(&err)
-
if ci.isErrorSet() {
return nil, ci.err
}
@@ -240,15 +216,12 @@ func (ci *copyin) Exec(v []driver.Value) (r driver.Result, err error) {
}
func (ci *copyin) Close() (err error) {
+ defer errRecover(&err)
+
if ci.closed {
return errCopyInClosed
}
- if ci.cn.bad {
- return driver.ErrBadConn
- }
- defer ci.cn.errRecover(&err)
-
if len(ci.buffer) > 0 {
ci.flush(ci.buffer)
}
diff --git a/vendor/github.com/lib/pq/copy_test.go b/vendor/github.com/lib/pq/copy_test.go
index 6af4c9c76..fbd5a11b2 100644
--- a/vendor/github.com/lib/pq/copy_test.go
+++ b/vendor/github.com/lib/pq/copy_test.go
@@ -94,86 +94,6 @@ func TestCopyInMultipleValues(t *testing.T) {
}
}
-func TestCopyInRaiseStmtTrigger(t *testing.T) {
- db := openTestConn(t)
- defer db.Close()
-
- if getServerVersion(t, db) < 90000 {
- var exists int
- err := db.QueryRow("SELECT 1 FROM pg_language WHERE lanname = 'plpgsql'").Scan(&exists)
- if err == sql.ErrNoRows {
- t.Skip("language PL/PgSQL does not exist; skipping TestCopyInRaiseStmtTrigger")
- } else if err != nil {
- t.Fatal(err)
- }
- }
-
- txn, err := db.Begin()
- if err != nil {
- t.Fatal(err)
- }
- defer txn.Rollback()
-
- _, err = txn.Exec("CREATE TEMP TABLE temp (a int, b varchar)")
- if err != nil {
- t.Fatal(err)
- }
-
- _, err = txn.Exec(`
- CREATE OR REPLACE FUNCTION pg_temp.temptest()
- RETURNS trigger AS
- $BODY$ begin
- raise notice 'Hello world';
- return new;
- end $BODY$
- LANGUAGE plpgsql`)
- if err != nil {
- t.Fatal(err)
- }
-
- _, err = txn.Exec(`
- CREATE TRIGGER temptest_trigger
- BEFORE INSERT
- ON temp
- FOR EACH ROW
- EXECUTE PROCEDURE pg_temp.temptest()`)
- if err != nil {
- t.Fatal(err)
- }
-
- stmt, err := txn.Prepare(CopyIn("temp", "a", "b"))
- if err != nil {
- t.Fatal(err)
- }
-
- longString := strings.Repeat("#", 500)
-
- _, err = stmt.Exec(int64(1), longString)
- if err != nil {
- t.Fatal(err)
- }
-
- _, err = stmt.Exec()
- if err != nil {
- t.Fatal(err)
- }
-
- err = stmt.Close()
- if err != nil {
- t.Fatal(err)
- }
-
- var num int
- err = txn.QueryRow("SELECT COUNT(*) FROM temp").Scan(&num)
- if err != nil {
- t.Fatal(err)
- }
-
- if num != 1 {
- t.Fatalf("expected 1 items, not %d", num)
- }
-}
-
func TestCopyInTypes(t *testing.T) {
db := openTestConn(t)
defer db.Close()
@@ -355,64 +275,6 @@ func TestCopySyntaxError(t *testing.T) {
}
}
-// Tests for connection errors in copyin.resploop()
-func TestCopyRespLoopConnectionError(t *testing.T) {
- db := openTestConn(t)
- defer db.Close()
-
- txn, err := db.Begin()
- if err != nil {
- t.Fatal(err)
- }
- defer txn.Rollback()
-
- var pid int
- err = txn.QueryRow("SELECT pg_backend_pid()").Scan(&pid)
- if err != nil {
- t.Fatal(err)
- }
-
- _, err = txn.Exec("CREATE TEMP TABLE temp (a int)")
- if err != nil {
- t.Fatal(err)
- }
-
- stmt, err := txn.Prepare(CopyIn("temp", "a"))
- if err != nil {
- t.Fatal(err)
- }
-
- _, err = db.Exec("SELECT pg_terminate_backend($1)", pid)
- if err != nil {
- t.Fatal(err)
- }
-
- if getServerVersion(t, db) < 90500 {
- // We have to try and send something over, since postgres before
- // version 9.5 won't process SIGTERMs while it's waiting for
- // CopyData/CopyEnd messages; see tcop/postgres.c.
- _, err = stmt.Exec(1)
- if err != nil {
- t.Fatal(err)
- }
- }
- _, err = stmt.Exec()
- if err == nil {
- t.Fatalf("expected error")
- }
- pge, ok := err.(*Error)
- if !ok {
- t.Fatalf("expected *pq.Error, got %+#v", err)
- } else if pge.Code.Name() != "admin_shutdown" {
- t.Fatalf("expected admin_shutdown, got %s", pge.Code.Name())
- }
-
- err = stmt.Close()
- if err != nil {
- t.Fatal(err)
- }
-}
-
func BenchmarkCopyIn(b *testing.B) {
db := openTestConn(b)
defer db.Close()
diff --git a/vendor/github.com/lib/pq/doc.go b/vendor/github.com/lib/pq/doc.go
index f772117d0..b5155801d 100644
--- a/vendor/github.com/lib/pq/doc.go
+++ b/vendor/github.com/lib/pq/doc.go
@@ -5,9 +5,8 @@ In most cases clients will use the database/sql package instead of
using this package directly. For example:
import (
- "database/sql"
-
_ "github.com/lib/pq"
+ "database/sql"
)
func main() {
@@ -48,16 +47,12 @@ supported:
* sslmode - Whether or not to use SSL (default is require, this is not the default for libpq)
* fallback_application_name - An application_name to fall back to if one isn't provided.
* connect_timeout - Maximum wait for connection, in seconds. Zero or not specified means wait indefinitely.
- * sslcert - Cert file location. The file must contain PEM encoded data.
- * sslkey - Key file location. The file must contain PEM encoded data.
- * sslrootcert - The location of the root certificate file. The file must contain PEM encoded data.
Valid values for sslmode are:
* disable - No SSL
* require - Always SSL (skip verification)
- * verify-ca - Always SSL (verify that the certificate presented by the server was signed by a trusted CA)
- * verify-full - Always SSL (verify that the certification presented by the server was signed by a trusted CA and the server host name matches the one in the certificate)
+ * verify-full - Always SSL (require verification)
See http://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
for more information about connection string parameters.
diff --git a/vendor/github.com/lib/pq/encode.go b/vendor/github.com/lib/pq/encode.go
index 42ec015f5..a75999101 100644
--- a/vendor/github.com/lib/pq/encode.go
+++ b/vendor/github.com/lib/pq/encode.go
@@ -5,21 +5,22 @@ import (
"database/sql/driver"
"encoding/hex"
"fmt"
+ "github.com/lib/pq/oid"
"math"
"strconv"
"strings"
"sync"
"time"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/lib/pq/oid"
)
func encode(parameterStatus *parameterStatus, x interface{}, pgtypOid oid.Oid) []byte {
switch v := x.(type) {
case int64:
- return strconv.AppendInt(nil, v, 10)
+ return []byte(fmt.Sprintf("%d", v))
+ case float32:
+ return []byte(fmt.Sprintf("%.9f", v))
case float64:
- return strconv.AppendFloat(nil, v, 'f', -1, 64)
+ return []byte(fmt.Sprintf("%.17f", v))
case []byte:
if pgtypOid == oid.T_bytea {
return encodeBytea(parameterStatus.serverVersion, v)
@@ -33,7 +34,7 @@ func encode(parameterStatus *parameterStatus, x interface{}, pgtypOid oid.Oid) [
return []byte(v)
case bool:
- return strconv.AppendBool(nil, v)
+ return []byte(fmt.Sprintf("%t", v))
case time.Time:
return formatTs(v)
@@ -85,6 +86,8 @@ func appendEncodedText(parameterStatus *parameterStatus, buf []byte, x interface
switch v := x.(type) {
case int64:
return strconv.AppendInt(buf, v, 10)
+ case float32:
+ return strconv.AppendFloat(buf, float64(v), 'f', -1, 32)
case float64:
return strconv.AppendFloat(buf, v, 'f', -1, 64)
case []byte:
@@ -146,6 +149,12 @@ func appendEscapedText(buf []byte, text string) []byte {
func mustParse(f string, typ oid.Oid, s []byte) time.Time {
str := string(s)
+ // Special case until time.Parse bug is fixed:
+ // http://code.google.com/p/go/issues/detail?id=3487
+ if str[len(str)-2] == '.' {
+ str += "0"
+ }
+
// check for a 30-minute-offset timezone
if (typ == oid.T_timestamptz || typ == oid.T_timetz) &&
str[len(str)-3] == ':' {
@@ -203,75 +212,12 @@ func (c *locationCache) getLocation(offset int) *time.Location {
return location
}
-var infinityTsEnabled = false
-var infinityTsNegative time.Time
-var infinityTsPositive time.Time
-
-const (
- infinityTsEnabledAlready = "pq: infinity timestamp enabled already"
- infinityTsNegativeMustBeSmaller = "pq: infinity timestamp: negative value must be smaller (before) than positive"
-)
-
-/*
- * If EnableInfinityTs is not called, "-infinity" and "infinity" will return
- * []byte("-infinity") and []byte("infinity") respectively, and potentially
- * cause error "sql: Scan error on column index 0: unsupported driver -> Scan pair: []uint8 -> *time.Time",
- * when scanning into a time.Time value.
- *
- * Once EnableInfinityTs has been called, all connections created using this
- * driver will decode Postgres' "-infinity" and "infinity" for "timestamp",
- * "timestamp with time zone" and "date" types to the predefined minimum and
- * maximum times, respectively. When encoding time.Time values, any time which
- * equals or preceeds the predefined minimum time will be encoded to
- * "-infinity". Any values at or past the maximum time will similarly be
- * encoded to "infinity".
- *
- *
- * If EnableInfinityTs is called with negative >= positive, it will panic.
- * Calling EnableInfinityTs after a connection has been established results in
- * undefined behavior. If EnableInfinityTs is called more than once, it will
- * panic.
- */
-func EnableInfinityTs(negative time.Time, positive time.Time) {
- if infinityTsEnabled {
- panic(infinityTsEnabledAlready)
- }
- if !negative.Before(positive) {
- panic(infinityTsNegativeMustBeSmaller)
- }
- infinityTsEnabled = true
- infinityTsNegative = negative
- infinityTsPositive = positive
-}
-
-/*
- * Testing might want to toggle infinityTsEnabled
- */
-func disableInfinityTs() {
- infinityTsEnabled = false
-}
-
// This is a time function specific to the Postgres default DateStyle
// setting ("ISO, MDY"), the only one we currently support. This
// accounts for the discrepancies between the parsing available with
// time.Parse and the Postgres date formatting quirks.
-func parseTs(currentLocation *time.Location, str string) interface{} {
- switch str {
- case "-infinity":
- if infinityTsEnabled {
- return infinityTsNegative
- }
- return []byte(str)
- case "infinity":
- if infinityTsEnabled {
- return infinityTsPositive
- }
- return []byte(str)
- }
-
+func parseTs(currentLocation *time.Location, str string) (result time.Time) {
monSep := strings.IndexRune(str, '-')
- // this is Gregorian year, not ISO Year
- // In Gregorian system, the year 1 BC is followed by AD 1
year := mustAtoi(str[:monSep])
daySep := monSep + 3
month := mustAtoi(str[monSep+1 : daySep])
@@ -299,6 +245,7 @@ func parseTs(currentLocation *time.Location, str string) interface{} {
nanoSec := 0
tzOff := 0
+ bcSign := 1
if remainderIdx < len(str) && str[remainderIdx:remainderIdx+1] == "." {
fracStart := remainderIdx + 1
@@ -334,17 +281,14 @@ func parseTs(currentLocation *time.Location, str string) interface{} {
}
tzOff = tzSign * ((tzHours * 60 * 60) + (tzMin * 60) + tzSec)
}
- var isoYear int
if remainderIdx < len(str) && str[remainderIdx:remainderIdx+3] == " BC" {
- isoYear = 1 - year
+ bcSign = -1
remainderIdx += 3
- } else {
- isoYear = year
}
if remainderIdx < len(str) {
errorf("expected end of input, got %v", str[remainderIdx:])
}
- t := time.Date(isoYear, time.Month(month), day,
+ t := time.Date(bcSign*year, time.Month(month), day,
hour, minute, second, nanoSec,
globalLocationCache.getLocation(tzOff))
@@ -362,48 +306,26 @@ func parseTs(currentLocation *time.Location, str string) interface{} {
return t
}
-// formatTs formats t into a format postgres understands.
+// formatTs formats t as time.RFC3339Nano and appends time zone seconds if
+// needed.
func formatTs(t time.Time) (b []byte) {
- if infinityTsEnabled {
- // t <= -infinity : ! (t > -infinity)
- if !t.After(infinityTsNegative) {
- return []byte("-infinity")
- }
- // t >= infinity : ! (!t < infinity)
- if !t.Before(infinityTsPositive) {
- return []byte("infinity")
- }
- }
- // Need to send dates before 0001 A.D. with " BC" suffix, instead of the
- // minus sign preferred by Go.
- // Beware, "0000" in ISO is "1 BC", "-0001" is "2 BC" and so on
- bc := false
- if t.Year() <= 0 {
- // flip year sign, and add 1, e.g: "0" will be "1", and "-10" will be "11"
- t = t.AddDate((-t.Year())*2+1, 0, 0)
- bc = true
- }
b = []byte(t.Format(time.RFC3339Nano))
_, offset := t.Zone()
offset = offset % 60
- if offset != 0 {
- // RFC3339Nano already printed the minus sign
- if offset < 0 {
- offset = -offset
- }
-
- b = append(b, ':')
- if offset < 10 {
- b = append(b, '0')
- }
- b = strconv.AppendInt(b, int64(offset), 10)
+ if offset == 0 {
+ return b
}
- if bc {
- b = append(b, " BC"...)
+ if offset < 0 {
+ offset = -offset
}
- return b
+
+ b = append(b, ':')
+ if offset < 10 {
+ b = append(b, '0')
+ }
+ return strconv.AppendInt(b, int64(offset), 10)
}
// Parse a bytea value received from the server. Both "hex" and the legacy
@@ -458,10 +380,7 @@ func parseBytea(s []byte) (result []byte) {
func encodeBytea(serverVersion int, v []byte) (result []byte) {
if serverVersion >= 90000 {
// Use the hex format if we know that the server supports it
- result = make([]byte, 2+hex.EncodedLen(len(v)))
- result[0] = '\\'
- result[1] = 'x'
- hex.Encode(result[2:], v)
+ result = []byte(fmt.Sprintf("\\x%x", v))
} else {
// .. or resort to "escape"
for _, b := range v {
diff --git a/vendor/github.com/lib/pq/encode_test.go b/vendor/github.com/lib/pq/encode_test.go
index 221362988..e199a5e71 100644
--- a/vendor/github.com/lib/pq/encode_test.go
+++ b/vendor/github.com/lib/pq/encode_test.go
@@ -1,12 +1,12 @@
package pq
import (
+ "github.com/lib/pq/oid"
+
"bytes"
"fmt"
"testing"
"time"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/lib/pq/oid"
)
func TestScanTimestamp(t *testing.T) {
@@ -30,8 +30,8 @@ func TestScanNilTimestamp(t *testing.T) {
}
var timeTests = []struct {
- str string
- timeval time.Time
+ str string
+ expected time.Time
}{
{"22001-02-03", time.Date(22001, time.February, 3, 0, 0, 0, 0, time.FixedZone("", 0))},
{"2001-02-03", time.Date(2001, time.February, 3, 0, 0, 0, 0, time.FixedZone("", 0))},
@@ -57,20 +57,13 @@ var timeTests = []struct {
time.FixedZone("", -(7*60*60+30*60+9)))},
{"2001-02-03 04:05:06+07", time.Date(2001, time.February, 3, 4, 5, 6, 0,
time.FixedZone("", 7*60*60))},
- {"0011-02-03 04:05:06 BC", time.Date(-10, time.February, 3, 4, 5, 6, 0, time.FixedZone("", 0))},
- {"0011-02-03 04:05:06.123 BC", time.Date(-10, time.February, 3, 4, 5, 6, 123000000, time.FixedZone("", 0))},
- {"0011-02-03 04:05:06.123-07 BC", time.Date(-10, time.February, 3, 4, 5, 6, 123000000,
+ {"10000-02-03 04:05:06 BC", time.Date(-10000, time.February, 3, 4, 5, 6, 0, time.FixedZone("", 0))},
+ {"0010-02-03 04:05:06 BC", time.Date(-10, time.February, 3, 4, 5, 6, 0, time.FixedZone("", 0))},
+ {"0010-02-03 04:05:06.123 BC", time.Date(-10, time.February, 3, 4, 5, 6, 123000000, time.FixedZone("", 0))},
+ {"0010-02-03 04:05:06.123-07 BC", time.Date(-10, time.February, 3, 4, 5, 6, 123000000,
time.FixedZone("", -7*60*60))},
- {"0001-02-03 04:05:06.123", time.Date(1, time.February, 3, 4, 5, 6, 123000000, time.FixedZone("", 0))},
- {"0001-02-03 04:05:06.123 BC", time.Date(1, time.February, 3, 4, 5, 6, 123000000, time.FixedZone("", 0)).AddDate(-1, 0, 0)},
- {"0001-02-03 04:05:06.123 BC", time.Date(0, time.February, 3, 4, 5, 6, 123000000, time.FixedZone("", 0))},
- {"0002-02-03 04:05:06.123 BC", time.Date(0, time.February, 3, 4, 5, 6, 123000000, time.FixedZone("", 0)).AddDate(-1, 0, 0)},
- {"0002-02-03 04:05:06.123 BC", time.Date(-1, time.February, 3, 4, 5, 6, 123000000, time.FixedZone("", 0))},
- {"12345-02-03 04:05:06.1", time.Date(12345, time.February, 3, 4, 5, 6, 100000000, time.FixedZone("", 0))},
- {"123456-02-03 04:05:06.1", time.Date(123456, time.February, 3, 4, 5, 6, 100000000, time.FixedZone("", 0))},
}
-// Helper function for the two tests below
func tryParse(str string) (t time.Time, err error) {
defer func() {
if p := recover(); p != nil {
@@ -78,52 +71,19 @@ func tryParse(str string) (t time.Time, err error) {
return
}
}()
- i := parseTs(nil, str)
- t, ok := i.(time.Time)
- if !ok {
- err = fmt.Errorf("Not a time.Time type, got %#v", i)
- }
+ t = parseTs(nil, str)
return
}
-// Test that parsing the string results in the expected value.
func TestParseTs(t *testing.T) {
for i, tt := range timeTests {
val, err := tryParse(tt.str)
+ if val.String() != tt.expected.String() {
+ t.Errorf("%d: expected to parse %q into %q; got %q",
+ i, tt.str, tt.expected, val)
+ }
if err != nil {
t.Errorf("%d: got error: %v", i, err)
- } else if val.String() != tt.timeval.String() {
- t.Errorf("%d: expected to parse %q into %q; got %q",
- i, tt.str, tt.timeval, val)
- }
- }
-}
-
-// Now test that sending the value into the database and parsing it back
-// returns the same time.Time value.
-func TestEncodeAndParseTs(t *testing.T) {
- db, err := openTestConnConninfo("timezone='Etc/UTC'")
- if err != nil {
- t.Fatal(err)
- }
- defer db.Close()
-
- for i, tt := range timeTests {
- var dbstr string
- err = db.QueryRow("SELECT ($1::timestamptz)::text", tt.timeval).Scan(&dbstr)
- if err != nil {
- t.Errorf("%d: could not send value %q to the database: %s", i, tt.timeval, err)
- continue
- }
-
- val, err := tryParse(dbstr)
- if err != nil {
- t.Errorf("%d: could not parse value %q: %s", i, dbstr, err)
- continue
- }
- val = val.In(tt.timeval.Location())
- if val.String() != tt.timeval.String() {
- t.Errorf("%d: expected to parse %q into %q; got %q", i, dbstr, tt.timeval, val)
}
}
}
@@ -136,18 +96,8 @@ var formatTimeTests = []struct {
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "2001-02-03T04:05:06.123456789Z"},
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "2001-02-03T04:05:06.123456789+02:00"},
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "2001-02-03T04:05:06.123456789-06:00"},
+ {time.Date(1, time.January, 1, 0, 0, 0, 0, time.FixedZone("", 19*60+32)), "0001-01-01T00:00:00+00:19:32"},
{time.Date(2001, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "2001-02-03T04:05:06-07:30:09"},
-
- {time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "0001-02-03T04:05:06.123456789Z"},
- {time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "0001-02-03T04:05:06.123456789+02:00"},
- {time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "0001-02-03T04:05:06.123456789-06:00"},
-
- {time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "0001-02-03T04:05:06.123456789Z BC"},
- {time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "0001-02-03T04:05:06.123456789+02:00 BC"},
- {time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "0001-02-03T04:05:06.123456789-06:00 BC"},
-
- {time.Date(1, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "0001-02-03T04:05:06-07:30:09"},
- {time.Date(0, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "0001-02-03T04:05:06-07:30:09 BC"},
}
func TestFormatTs(t *testing.T) {
@@ -263,131 +213,6 @@ func TestTimestampWithOutTimezone(t *testing.T) {
test("2013-01-04T20:14:58.80033Z", "2013-01-04 20:14:58.80033")
}
-func TestInfinityTimestamp(t *testing.T) {
- db := openTestConn(t)
- defer db.Close()
- var err error
- var resultT time.Time
-
- expectedError := fmt.Errorf(`sql: Scan error on column index 0: unsupported driver -> Scan pair: []uint8 -> *time.Time`)
- type testCases []struct {
- Query string
- Param string
- ExpectedErr error
- ExpectedVal interface{}
- }
- tc := testCases{
- {"SELECT $1::timestamp", "-infinity", expectedError, "-infinity"},
- {"SELECT $1::timestamptz", "-infinity", expectedError, "-infinity"},
- {"SELECT $1::timestamp", "infinity", expectedError, "infinity"},
- {"SELECT $1::timestamptz", "infinity", expectedError, "infinity"},
- }
- // try to assert []byte to time.Time
- for _, q := range tc {
- err = db.QueryRow(q.Query, q.Param).Scan(&resultT)
- if err.Error() != q.ExpectedErr.Error() {
- t.Errorf("Scanning -/+infinity, expected error, %q, got %q", q.ExpectedErr, err)
- }
- }
- // yield []byte
- for _, q := range tc {
- var resultI interface{}
- err = db.QueryRow(q.Query, q.Param).Scan(&resultI)
- if err != nil {
- t.Errorf("Scanning -/+infinity, expected no error, got %q", err)
- }
- result, ok := resultI.([]byte)
- if !ok {
- t.Errorf("Scanning -/+infinity, expected []byte, got %#v", resultI)
- }
- if string(result) != q.ExpectedVal {
- t.Errorf("Scanning -/+infinity, expected %q, got %q", q.ExpectedVal, result)
- }
- }
-
- y1500 := time.Date(1500, time.January, 1, 0, 0, 0, 0, time.UTC)
- y2500 := time.Date(2500, time.January, 1, 0, 0, 0, 0, time.UTC)
- EnableInfinityTs(y1500, y2500)
-
- err = db.QueryRow("SELECT $1::timestamp", "infinity").Scan(&resultT)
- if err != nil {
- t.Errorf("Scanning infinity, expected no error, got %q", err)
- }
- if !resultT.Equal(y2500) {
- t.Errorf("Scanning infinity, expected %q, got %q", y2500, resultT)
- }
-
- err = db.QueryRow("SELECT $1::timestamptz", "infinity").Scan(&resultT)
- if err != nil {
- t.Errorf("Scanning infinity, expected no error, got %q", err)
- }
- if !resultT.Equal(y2500) {
- t.Errorf("Scanning Infinity, expected time %q, got %q", y2500, resultT.String())
- }
-
- err = db.QueryRow("SELECT $1::timestamp", "-infinity").Scan(&resultT)
- if err != nil {
- t.Errorf("Scanning -infinity, expected no error, got %q", err)
- }
- if !resultT.Equal(y1500) {
- t.Errorf("Scanning -infinity, expected time %q, got %q", y1500, resultT.String())
- }
-
- err = db.QueryRow("SELECT $1::timestamptz", "-infinity").Scan(&resultT)
- if err != nil {
- t.Errorf("Scanning -infinity, expected no error, got %q", err)
- }
- if !resultT.Equal(y1500) {
- t.Errorf("Scanning -infinity, expected time %q, got %q", y1500, resultT.String())
- }
-
- y_1500 := time.Date(-1500, time.January, 1, 0, 0, 0, 0, time.UTC)
- y11500 := time.Date(11500, time.January, 1, 0, 0, 0, 0, time.UTC)
- var s string
- err = db.QueryRow("SELECT $1::timestamp::text", y_1500).Scan(&s)
- if err != nil {
- t.Errorf("Encoding -infinity, expected no error, got %q", err)
- }
- if s != "-infinity" {
- t.Errorf("Encoding -infinity, expected %q, got %q", "-infinity", s)
- }
- err = db.QueryRow("SELECT $1::timestamptz::text", y_1500).Scan(&s)
- if err != nil {
- t.Errorf("Encoding -infinity, expected no error, got %q", err)
- }
- if s != "-infinity" {
- t.Errorf("Encoding -infinity, expected %q, got %q", "-infinity", s)
- }
-
- err = db.QueryRow("SELECT $1::timestamp::text", y11500).Scan(&s)
- if err != nil {
- t.Errorf("Encoding infinity, expected no error, got %q", err)
- }
- if s != "infinity" {
- t.Errorf("Encoding infinity, expected %q, got %q", "infinity", s)
- }
- err = db.QueryRow("SELECT $1::timestamptz::text", y11500).Scan(&s)
- if err != nil {
- t.Errorf("Encoding infinity, expected no error, got %q", err)
- }
- if s != "infinity" {
- t.Errorf("Encoding infinity, expected %q, got %q", "infinity", s)
- }
-
- disableInfinityTs()
-
- var panicErrorString string
- func() {
- defer func() {
- panicErrorString, _ = recover().(string)
- }()
- EnableInfinityTs(y2500, y1500)
- }()
- if panicErrorString != infinityTsNegativeMustBeSmaller {
- t.Errorf("Expected error, %q, got %q", infinityTsNegativeMustBeSmaller, panicErrorString)
- }
-}
-
func TestStringWithNul(t *testing.T) {
db := openTestConn(t)
defer db.Close()
@@ -510,13 +335,15 @@ func TestAppendEncodedText(t *testing.T) {
buf = appendEncodedText(¶meterStatus{serverVersion: 90000}, buf, int64(10))
buf = append(buf, '\t')
+ buf = appendEncodedText(¶meterStatus{serverVersion: 90000}, buf, float32(42.0000000001))
+ buf = append(buf, '\t')
buf = appendEncodedText(¶meterStatus{serverVersion: 90000}, buf, 42.0000000001)
buf = append(buf, '\t')
buf = appendEncodedText(¶meterStatus{serverVersion: 90000}, buf, "hello\tworld")
buf = append(buf, '\t')
buf = appendEncodedText(¶meterStatus{serverVersion: 90000}, buf, []byte{0, 128, 255})
- if string(buf) != "10\t42.0000000001\thello\\tworld\t\\\\x0080ff" {
+ if string(buf) != "10\t42\t42.0000000001\thello\\tworld\t\\\\x0080ff" {
t.Fatal(string(buf))
}
}
diff --git a/vendor/github.com/lib/pq/error.go b/vendor/github.com/lib/pq/error.go
index b4bb44cee..874c3564c 100644
--- a/vendor/github.com/lib/pq/error.go
+++ b/vendor/github.com/lib/pq/error.go
@@ -459,26 +459,12 @@ func errorf(s string, args ...interface{}) {
panic(fmt.Errorf("pq: %s", fmt.Sprintf(s, args...)))
}
-func errRecoverNoErrBadConn(err *error) {
- e := recover()
- if e == nil {
- // Do nothing
- return
- }
- var ok bool
- *err, ok = e.(error)
- if !ok {
- *err = fmt.Errorf("pq: unexpected error: %#v", e)
- }
-}
-
-func (c *conn) errRecover(err *error) {
+func errRecover(err *error) {
e := recover()
switch v := e.(type) {
case nil:
// Do nothing
case runtime.Error:
- c.bad = true
panic(v)
case *Error:
if v.Fatal() {
@@ -496,13 +482,6 @@ func (c *conn) errRecover(err *error) {
}
default:
- c.bad = true
panic(fmt.Sprintf("unknown error: %#v", e))
}
-
- // Any time we return ErrBadConn, we need to remember it since *Tx doesn't
- // mark the connection bad in database/sql.
- if *err == driver.ErrBadConn {
- c.bad = true
- }
}
diff --git a/vendor/github.com/lib/pq/hstore/hstore_test.go b/vendor/github.com/lib/pq/hstore/hstore_test.go
index d9e24771a..73a988f9d 100644
--- a/vendor/github.com/lib/pq/hstore/hstore_test.go
+++ b/vendor/github.com/lib/pq/hstore/hstore_test.go
@@ -2,10 +2,9 @@ package hstore
import (
"database/sql"
+ _ "github.com/lib/pq"
"os"
"testing"
-
- _ "github.com/drone/drone/Godeps/_workspace/src/github.com/lib/pq"
)
type Fatalistic interface {
@@ -39,7 +38,8 @@ func TestHstore(t *testing.T) {
// quitely create hstore if it doesn't exist
_, err := db.Exec("CREATE EXTENSION IF NOT EXISTS hstore")
if err != nil {
- t.Skipf("Skipping hstore tests - hstore extension create failed: %s", err.Error())
+ t.Log("Skipping hstore tests - hstore extension create failed. " + err.Error())
+ return
}
hs := Hstore{}
diff --git a/vendor/github.com/lib/pq/listen_example/doc.go b/vendor/github.com/lib/pq/listen_example/doc.go
index 5bc99f5c1..34496f4f9 100644
--- a/vendor/github.com/lib/pq/listen_example/doc.go
+++ b/vendor/github.com/lib/pq/listen_example/doc.go
@@ -18,11 +18,11 @@ mechanism to avoid polling the database while waiting for more work to arrive.
package main
import (
+ "github.com/lib/pq"
+
"database/sql"
"fmt"
"time"
-
- "github.com/lib/pq"
)
func doWork(db *sql.DB, work int64) {
diff --git a/vendor/github.com/lib/pq/notify.go b/vendor/github.com/lib/pq/notify.go
index c756af8b9..2c3b4cd42 100644
--- a/vendor/github.com/lib/pq/notify.go
+++ b/vendor/github.com/lib/pq/notify.go
@@ -6,6 +6,7 @@ package pq
import (
"errors"
"fmt"
+ "io"
"sync"
"sync/atomic"
"time"
@@ -86,16 +87,12 @@ func NewListenerConn(name string, notificationChan chan<- *Notification) (*Liste
// Returns an error if an unrecoverable error has occurred and the ListenerConn
// should be abandoned.
func (l *ListenerConn) acquireSenderLock() error {
- // we must acquire senderLock first to avoid deadlocks; see ExecSimpleQuery
- l.senderLock.Lock()
-
l.connectionLock.Lock()
- err := l.err
- l.connectionLock.Unlock()
- if err != nil {
- l.senderLock.Unlock()
- return err
+ defer l.connectionLock.Unlock()
+ if l.err != nil {
+ return l.err
}
+ l.senderLock.Lock()
return nil
}
@@ -128,11 +125,10 @@ func (l *ListenerConn) setState(newState int32) bool {
// away or should be discarded because we couldn't agree on the state with the
// server backend.
func (l *ListenerConn) listenerConnLoop() (err error) {
- defer errRecoverNoErrBadConn(&err)
+ defer errRecover(&err)
- r := &readBuf{}
for {
- t, err := l.cn.recvMessage(r)
+ t, r, err := l.cn.recvMessage()
if err != nil {
return err
}
@@ -143,9 +139,6 @@ func (l *ListenerConn) listenerConnLoop() (err error) {
// about the scratch buffer being overwritten.
l.notificationChan <- recvNotification(r)
- case 'T', 'D':
- // only used by tests; ignore
-
case 'E':
// We might receive an ErrorResponse even when not in a query; it
// is expected that the server will close the connection after
@@ -176,6 +169,8 @@ func (l *ListenerConn) listenerConnLoop() (err error) {
return fmt.Errorf("unexpected message %q from server in listenerConnLoop", t)
}
}
+
+ panic("not reached")
}
// This is the main routine for the goroutine receiving on the database
@@ -244,7 +239,7 @@ func (l *ListenerConn) Ping() error {
// The caller must be holding senderLock (see acquireSenderLock and
// releaseSenderLock).
func (l *ListenerConn) sendSimpleQuery(q string) (err error) {
- defer errRecoverNoErrBadConn(&err)
+ defer errRecover(&err)
// must set connection state before sending the query
if !l.setState(connStateExpectResponse) {
@@ -283,13 +278,13 @@ func (l *ListenerConn) ExecSimpleQuery(q string) (executed bool, err error) {
// We can't know what state the protocol is in, so we need to abandon
// this connection.
l.connectionLock.Lock()
+ defer l.connectionLock.Unlock()
// Set the error pointer if it hasn't been set already; see
// listenerConnMain.
if l.err == nil {
l.err = err
}
- l.connectionLock.Unlock()
- l.cn.c.Close()
+ l.cn.Close()
return false, err
}
@@ -298,11 +293,8 @@ func (l *ListenerConn) ExecSimpleQuery(q string) (executed bool, err error) {
m, ok := <-l.replyChan
if !ok {
// We lost the connection to server, don't bother waiting for a
- // a response. err should have been set already.
- l.connectionLock.Lock()
- err := l.err
- l.connectionLock.Unlock()
- return false, err
+ // a response.
+ return false, io.EOF
}
switch m.typ {
case 'Z':
@@ -325,19 +317,18 @@ func (l *ListenerConn) ExecSimpleQuery(q string) (executed bool, err error) {
return false, fmt.Errorf("unknown response for simple query: %q", m.typ)
}
}
+
+ panic("not reached")
}
func (l *ListenerConn) Close() error {
l.connectionLock.Lock()
+ defer l.connectionLock.Unlock()
if l.err != nil {
- l.connectionLock.Unlock()
return errListenerConnClosed
}
l.err = errListenerConnClosed
- l.connectionLock.Unlock()
- // We can't send anything on the connection without holding senderLock.
- // Simply close the net.Conn to wake up everyone operating on it.
- return l.cn.c.Close()
+ return l.cn.Close()
}
// Err() returns the reason the connection was closed. It is not safe to call
@@ -436,13 +427,6 @@ func NewListener(name string,
return l
}
-// Returns the notification channel for this listener. This is the same
-// channel as Notify, and will not be recreated during the life time of the
-// Listener.
-func (l *Listener) NotificationChannel() <-chan *Notification {
- return l.Notify
-}
-
// Listen starts listening for notifications on a channel. Calls to this
// function will block until an acknowledgement has been received from the
// server. Note that Listener automatically re-establishes the connection
@@ -646,6 +630,8 @@ func (l *Listener) resync(cn *ListenerConn, notificationChan <-chan *Notificatio
return err
}
}
+
+ panic("not reached")
}
// caller should NOT be holding l.lock
diff --git a/vendor/github.com/lib/pq/notify_test.go b/vendor/github.com/lib/pq/notify_test.go
index fe8941a4e..12c70bb47 100644
--- a/vendor/github.com/lib/pq/notify_test.go
+++ b/vendor/github.com/lib/pq/notify_test.go
@@ -5,9 +5,6 @@ import (
"fmt"
"io"
"os"
- "runtime"
- "sync"
- "sync/atomic"
"testing"
"time"
)
@@ -27,6 +24,7 @@ func expectNotification(t *testing.T, ch <-chan *Notification, relname string, e
case <-time.After(1500 * time.Millisecond):
return fmt.Errorf("timeout")
}
+ panic("not reached")
}
func expectNoNotification(t *testing.T, ch <-chan *Notification) error {
@@ -36,6 +34,7 @@ func expectNoNotification(t *testing.T, ch <-chan *Notification) error {
case <-time.After(100 * time.Millisecond):
return nil
}
+ panic("not reached")
}
func expectEvent(t *testing.T, eventch <-chan ListenerEventType, et ListenerEventType) error {
@@ -46,8 +45,9 @@ func expectEvent(t *testing.T, eventch <-chan ListenerEventType, et ListenerEven
}
return nil
case <-time.After(1500 * time.Millisecond):
- panic("expectEvent timeout")
+ return fmt.Errorf("timeout")
}
+ panic("not reached")
}
func expectNoEvent(t *testing.T, eventch <-chan ListenerEventType) error {
@@ -57,6 +57,7 @@ func expectNoEvent(t *testing.T, eventch <-chan ListenerEventType) error {
case <-time.After(100 * time.Millisecond):
return nil
}
+ panic("not reached")
}
func newTestListenerConn(t *testing.T) (*ListenerConn, <-chan *Notification) {
@@ -213,82 +214,13 @@ func TestConnPing(t *testing.T) {
}
}
-// Test for deadlock where a query fails while another one is queued
-func TestConnExecDeadlock(t *testing.T) {
- l, _ := newTestListenerConn(t)
- defer l.Close()
-
- var wg sync.WaitGroup
- wg.Add(2)
-
- go func() {
- l.ExecSimpleQuery("SELECT pg_sleep(60)")
- wg.Done()
- }()
- runtime.Gosched()
- go func() {
- l.ExecSimpleQuery("SELECT 1")
- wg.Done()
- }()
- // give the two goroutines some time to get into position
- runtime.Gosched()
- // calls Close on the net.Conn; equivalent to a network failure
- l.Close()
-
- var done int32 = 0
- go func() {
- time.Sleep(10 * time.Second)
- if atomic.LoadInt32(&done) != 1 {
- panic("timed out")
- }
- }()
- wg.Wait()
- atomic.StoreInt32(&done, 1)
-}
-
-// Test for ListenerConn being closed while a slow query is executing
-func TestListenerConnCloseWhileQueryIsExecuting(t *testing.T) {
- l, _ := newTestListenerConn(t)
- defer l.Close()
-
- var wg sync.WaitGroup
- wg.Add(1)
-
- go func() {
- sent, err := l.ExecSimpleQuery("SELECT pg_sleep(60)")
- if sent {
- panic("expected sent=false")
- }
- // could be any of a number of errors
- if err == nil {
- panic("expected error")
- }
- wg.Done()
- }()
- // give the above goroutine some time to get into position
- runtime.Gosched()
- err := l.Close()
- if err != nil {
- t.Fatal(err)
- }
- var done int32 = 0
- go func() {
- time.Sleep(10 * time.Second)
- if atomic.LoadInt32(&done) != 1 {
- panic("timed out")
- }
- }()
- wg.Wait()
- atomic.StoreInt32(&done, 1)
-}
-
func TestNotifyExtra(t *testing.T) {
db := openTestConn(t)
defer db.Close()
- if getServerVersion(t, db) < 90000 {
- t.Skip("skipping NOTIFY payload test since the server does not appear to support it")
- }
+ //if getServerVersion(t, db) < 90000 {
+ return
+ //}
l, channel := newTestListenerConn(t)
defer l.Close()
diff --git a/vendor/github.com/lib/pq/oid/gen.go b/vendor/github.com/lib/pq/oid/gen.go
index 9e8a84ccc..f16a51c0b 100644
--- a/vendor/github.com/lib/pq/oid/gen.go
+++ b/vendor/github.com/lib/pq/oid/gen.go
@@ -5,13 +5,13 @@
package main
import (
- "database/sql"
"fmt"
"log"
"os"
"os/exec"
- _ "github.com/drone/drone/Godeps/_workspace/src/github.com/lib/pq"
+ "database/sql"
+ _ "github.com/lib/pq"
)
func main() {
diff --git a/vendor/github.com/lib/pq/ssl_test.go b/vendor/github.com/lib/pq/ssl_test.go
deleted file mode 100644
index 932b336f5..000000000
--- a/vendor/github.com/lib/pq/ssl_test.go
+++ /dev/null
@@ -1,226 +0,0 @@
-package pq
-
-// This file contains SSL tests
-
-import (
- _ "crypto/sha256"
- "crypto/x509"
- "database/sql"
- "fmt"
- "os"
- "path/filepath"
- "testing"
-)
-
-func maybeSkipSSLTests(t *testing.T) {
- // Require some special variables for testing certificates
- if os.Getenv("PQSSLCERTTEST_PATH") == "" {
- t.Skip("PQSSLCERTTEST_PATH not set, skipping SSL tests")
- }
-
- value := os.Getenv("PQGOSSLTESTS")
- if value == "" || value == "0" {
- t.Skip("PQGOSSLTESTS not enabled, skipping SSL tests")
- } else if value != "1" {
- t.Fatalf("unexpected value %q for PQGOSSLTESTS", value)
- }
-}
-
-func openSSLConn(t *testing.T, conninfo string) (*sql.DB, error) {
- db, err := openTestConnConninfo(conninfo)
- if err != nil {
- // should never fail
- t.Fatal(err)
- }
- // Do something with the connection to see whether it's working or not.
- tx, err := db.Begin()
- if err == nil {
- return db, tx.Rollback()
- }
- _ = db.Close()
- return nil, err
-}
-
-func checkSSLSetup(t *testing.T, conninfo string) {
- db, err := openSSLConn(t, conninfo)
- if err == nil {
- db.Close()
- t.Fatalf("expected error with conninfo=%q", conninfo)
- }
-}
-
-// Connect over SSL and run a simple query to test the basics
-func TestSSLConnection(t *testing.T) {
- maybeSkipSSLTests(t)
- // Environment sanity check: should fail without SSL
- checkSSLSetup(t, "sslmode=disable user=pqgossltest")
-
- db, err := openSSLConn(t, "sslmode=require user=pqgossltest")
- if err != nil {
- t.Fatal(err)
- }
- rows, err := db.Query("SELECT 1")
- if err != nil {
- t.Fatal(err)
- }
- rows.Close()
-}
-
-// Test sslmode=verify-full
-func TestSSLVerifyFull(t *testing.T) {
- maybeSkipSSLTests(t)
- // Environment sanity check: should fail without SSL
- checkSSLSetup(t, "sslmode=disable user=pqgossltest")
-
- // Not OK according to the system CA
- _, err := openSSLConn(t, "host=postgres sslmode=verify-full user=pqgossltest")
- if err == nil {
- t.Fatal("expected error")
- }
- _, ok := err.(x509.UnknownAuthorityError)
- if !ok {
- t.Fatalf("expected x509.UnknownAuthorityError, got %#+v", err)
- }
-
- rootCertPath := filepath.Join(os.Getenv("PQSSLCERTTEST_PATH"), "root.crt")
- rootCert := "sslrootcert=" + rootCertPath + " "
- // No match on Common Name
- _, err = openSSLConn(t, rootCert+"host=127.0.0.1 sslmode=verify-full user=pqgossltest")
- if err == nil {
- t.Fatal("expected error")
- }
- _, ok = err.(x509.HostnameError)
- if !ok {
- t.Fatalf("expected x509.HostnameError, got %#+v", err)
- }
- // OK
- _, err = openSSLConn(t, rootCert+"host=postgres sslmode=verify-full user=pqgossltest")
- if err != nil {
- t.Fatal(err)
- }
-}
-
-// Test sslmode=verify-ca
-func TestSSLVerifyCA(t *testing.T) {
- maybeSkipSSLTests(t)
- // Environment sanity check: should fail without SSL
- checkSSLSetup(t, "sslmode=disable user=pqgossltest")
-
- // Not OK according to the system CA
- _, err := openSSLConn(t, "host=postgres sslmode=verify-ca user=pqgossltest")
- if err == nil {
- t.Fatal("expected error")
- }
- _, ok := err.(x509.UnknownAuthorityError)
- if !ok {
- t.Fatalf("expected x509.UnknownAuthorityError, got %#+v", err)
- }
-
- rootCertPath := filepath.Join(os.Getenv("PQSSLCERTTEST_PATH"), "root.crt")
- rootCert := "sslrootcert=" + rootCertPath + " "
- // No match on Common Name, but that's OK
- _, err = openSSLConn(t, rootCert+"host=127.0.0.1 sslmode=verify-ca user=pqgossltest")
- if err != nil {
- t.Fatal(err)
- }
- // Everything OK
- _, err = openSSLConn(t, rootCert+"host=postgres sslmode=verify-ca user=pqgossltest")
- if err != nil {
- t.Fatal(err)
- }
-}
-
-func getCertConninfo(t *testing.T, source string) string {
- var sslkey string
- var sslcert string
-
- certpath := os.Getenv("PQSSLCERTTEST_PATH")
-
- switch source {
- case "missingkey":
- sslkey = "/tmp/filedoesnotexist"
- sslcert = filepath.Join(certpath, "postgresql.crt")
- case "missingcert":
- sslkey = filepath.Join(certpath, "postgresql.key")
- sslcert = "/tmp/filedoesnotexist"
- case "certtwice":
- sslkey = filepath.Join(certpath, "postgresql.crt")
- sslcert = filepath.Join(certpath, "postgresql.crt")
- case "valid":
- sslkey = filepath.Join(certpath, "postgresql.key")
- sslcert = filepath.Join(certpath, "postgresql.crt")
- default:
- t.Fatalf("invalid source %q", source)
- }
- return fmt.Sprintf("sslmode=require user=pqgosslcert sslkey=%s sslcert=%s", sslkey, sslcert)
-}
-
-// Authenticate over SSL using client certificates
-func TestSSLClientCertificates(t *testing.T) {
- maybeSkipSSLTests(t)
- // Environment sanity check: should fail without SSL
- checkSSLSetup(t, "sslmode=disable user=pqgossltest")
-
- // Should also fail without a valid certificate
- db, err := openSSLConn(t, "sslmode=require user=pqgosslcert")
- if err == nil {
- db.Close()
- t.Fatal("expected error")
- }
- pge, ok := err.(*Error)
- if !ok {
- t.Fatal("expected pq.Error")
- }
- if pge.Code.Name() != "invalid_authorization_specification" {
- t.Fatalf("unexpected error code %q", pge.Code.Name())
- }
-
- // Should work
- db, err = openSSLConn(t, getCertConninfo(t, "valid"))
- if err != nil {
- t.Fatal(err)
- }
- rows, err := db.Query("SELECT 1")
- if err != nil {
- t.Fatal(err)
- }
- rows.Close()
-}
-
-// Test errors with ssl certificates
-func TestSSLClientCertificatesMissingFiles(t *testing.T) {
- maybeSkipSSLTests(t)
- // Environment sanity check: should fail without SSL
- checkSSLSetup(t, "sslmode=disable user=pqgossltest")
-
- // Key missing, should fail
- _, err := openSSLConn(t, getCertConninfo(t, "missingkey"))
- if err == nil {
- t.Fatal("expected error")
- }
- // should be a PathError
- _, ok := err.(*os.PathError)
- if !ok {
- t.Fatalf("expected PathError, got %#+v", err)
- }
-
- // Cert missing, should fail
- _, err = openSSLConn(t, getCertConninfo(t, "missingcert"))
- if err == nil {
- t.Fatal("expected error")
- }
- // should be a PathError
- _, ok = err.(*os.PathError)
- if !ok {
- t.Fatalf("expected PathError, got %#+v", err)
- }
-
- // Key has wrong permissions, should fail
- _, err = openSSLConn(t, getCertConninfo(t, "certtwice"))
- if err == nil {
- t.Fatal("expected error")
- }
- if err != ErrSSLKeyHasWorldPermissions {
- t.Fatalf("expected ErrSSLKeyHasWorldPermissions, got %#+v", err)
- }
-}
diff --git a/vendor/github.com/lib/pq/url.go b/vendor/github.com/lib/pq/url.go
index 9bac95c48..b83e806b8 100644
--- a/vendor/github.com/lib/pq/url.go
+++ b/vendor/github.com/lib/pq/url.go
@@ -34,7 +34,7 @@ func ParseURL(url string) (string, error) {
return "", err
}
- if u.Scheme != "postgres" && u.Scheme != "postgresql" {
+ if u.Scheme != "postgres" {
return "", fmt.Errorf("invalid connection protocol: %s", u.Scheme)
}
diff --git a/vendor/github.com/lib/pq/user_posix.go b/vendor/github.com/lib/pq/user_posix.go
index e937d7d08..aa5a3da3d 100644
--- a/vendor/github.com/lib/pq/user_posix.go
+++ b/vendor/github.com/lib/pq/user_posix.go
@@ -1,24 +1,15 @@
// Package pq is a pure Go Postgres driver for the database/sql package.
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
+// +build darwin freebsd linux nacl netbsd openbsd solaris
package pq
-import (
- "os"
- "os/user"
-)
+import "os/user"
func userCurrent() (string, error) {
u, err := user.Current()
- if err == nil {
- return u.Username, nil
+ if err != nil {
+ return "", err
}
-
- name := os.Getenv("USER")
- if name != "" {
- return name, nil
- }
-
- return "", ErrCouldNotDetectUsername
+ return u.Username, nil
}
diff --git a/vendor/github.com/lib/pq/user_windows.go b/vendor/github.com/lib/pq/user_windows.go
index 2b691267b..a7593ffbb 100644
--- a/vendor/github.com/lib/pq/user_windows.go
+++ b/vendor/github.com/lib/pq/user_windows.go
@@ -19,7 +19,7 @@ func userCurrent() (string, error) {
pwname_size := uint32(len(pw_name)) - 1
err := syscall.GetUserNameEx(syscall.NameSamCompatible, &pw_name[0], &pwname_size)
if err != nil {
- return "", ErrCouldNotDetectUsername
+ return "", err
}
s := syscall.UTF16ToString(pw_name)
u := filepath.Base(s)
diff --git a/vendor/github.com/manucorporat/sse/.travis.yml b/vendor/github.com/manucorporat/sse/.travis.yml
deleted file mode 100644
index 3d3383312..000000000
--- a/vendor/github.com/manucorporat/sse/.travis.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-language: go
-sudo: false
-go:
- - 1.3
- - 1.4
- - tip
diff --git a/vendor/github.com/stretchr/objx/LICENSE.md b/vendor/github.com/manucorporat/sse/LICENSE
similarity index 85%
rename from vendor/github.com/stretchr/objx/LICENSE.md
rename to vendor/github.com/manucorporat/sse/LICENSE
index 219994581..1ff7f3706 100644
--- a/vendor/github.com/stretchr/objx/LICENSE.md
+++ b/vendor/github.com/manucorporat/sse/LICENSE
@@ -1,8 +1,6 @@
-objx - by Mat Ryer and Tyler Bunnell
-
The MIT License (MIT)
-Copyright (c) 2014 Stretchr, Inc.
+Copyright (c) 2014 Manuel Martínez-Almeida
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -11,13 +9,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/github.com/manucorporat/sse/sse-decoder.go b/vendor/github.com/manucorporat/sse/sse-decoder.go
new file mode 100644
index 000000000..e1afc6f36
--- /dev/null
+++ b/vendor/github.com/manucorporat/sse/sse-decoder.go
@@ -0,0 +1,115 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
+package sse
+
+import (
+ "bytes"
+ "io"
+ "io/ioutil"
+)
+
+type decoder struct {
+ events []Event
+}
+
+func Decode(r io.Reader) ([]Event, error) {
+ var dec decoder
+ return dec.decode(r)
+}
+
+func (d *decoder) dispatchEvent(event Event, data string) {
+ dataLength := len(data)
+ if dataLength > 0 {
+ //If the data buffer's last character is a U+000A LINE FEED (LF) character, then remove the last character from the data buffer.
+ data = data[:dataLength-1]
+ dataLength--
+ }
+ if dataLength == 0 && event.Event == "" {
+ return
+ }
+ if event.Event == "" {
+ event.Event = "message"
+ }
+ event.Data = data
+ d.events = append(d.events, event)
+}
+
+func (d *decoder) decode(r io.Reader) ([]Event, error) {
+ buf, err := ioutil.ReadAll(r)
+ if err != nil {
+ return nil, err
+ }
+
+ var currentEvent Event
+ var dataBuffer *bytes.Buffer = new(bytes.Buffer)
+ // TODO (and unit tests)
+ // Lines must be separated by either a U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair,
+ // a single U+000A LINE FEED (LF) character,
+ // or a single U+000D CARRIAGE RETURN (CR) character.
+ lines := bytes.Split(buf, []byte{'\n'})
+ for _, line := range lines {
+ if len(line) == 0 {
+ // If the line is empty (a blank line). Dispatch the event.
+ d.dispatchEvent(currentEvent, dataBuffer.String())
+
+ // reset current event and data buffer
+ currentEvent = Event{}
+ dataBuffer.Reset()
+ continue
+ }
+ if line[0] == byte(':') {
+ // If the line starts with a U+003A COLON character (:), ignore the line.
+ continue
+ }
+
+ var field, value []byte
+ colonIndex := bytes.IndexRune(line, ':')
+ if colonIndex != -1 {
+ // If the line contains a U+003A COLON character character (:)
+ // Collect the characters on the line before the first U+003A COLON character (:),
+ // and let field be that string.
+ field = line[:colonIndex]
+ // Collect the characters on the line after the first U+003A COLON character (:),
+ // and let value be that string.
+ value = line[colonIndex+1:]
+ // If value starts with a single U+0020 SPACE character, remove it from value.
+ if len(value) > 0 && value[0] == ' ' {
+ value = value[1:]
+ }
+ } else {
+ // Otherwise, the string is not empty but does not contain a U+003A COLON character character (:)
+ // Use the whole line as the field name, and the empty string as the field value.
+ field = line
+ value = []byte{}
+ }
+ // The steps to process the field given a field name and a field value depend on the field name,
+ // as given in the following list. Field names must be compared literally,
+ // with no case folding performed.
+ switch string(field) {
+ case "event":
+ // Set the event name buffer to field value.
+ currentEvent.Event = string(value)
+ case "id":
+ // Set the event stream's last event ID to the field value.
+ currentEvent.Id = string(value)
+ case "retry":
+ // If the field value consists of only characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9),
+ // then interpret the field value as an integer in base ten, and set the event stream's reconnection time to that integer.
+ // Otherwise, ignore the field.
+ currentEvent.Id = string(value)
+ case "data":
+ // Append the field value to the data buffer,
+ dataBuffer.Write(value)
+ // then append a single U+000A LINE FEED (LF) character to the data buffer.
+ dataBuffer.WriteString("\n")
+ default:
+ //Otherwise. The field is ignored.
+ continue
+ }
+ }
+ d.dispatchEvent(currentEvent, dataBuffer.String())
+
+ return d.events, nil
+}
diff --git a/vendor/github.com/manucorporat/sse/sse-decoder_test.go b/vendor/github.com/manucorporat/sse/sse-decoder_test.go
new file mode 100644
index 000000000..068107b64
--- /dev/null
+++ b/vendor/github.com/manucorporat/sse/sse-decoder_test.go
@@ -0,0 +1,116 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
+package sse
+
+import (
+ "bytes"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestDecodeSingle1(t *testing.T) {
+ events, err := Decode(bytes.NewBufferString(
+ `data: this is a text
+event: message
+fake:
+id: 123456789010
+: we can append data
+: and multiple comments should not break it
+data: a very nice one`))
+
+ assert.NoError(t, err)
+ assert.Len(t, events, 1)
+ assert.Equal(t, events[0].Event, "message")
+ assert.Equal(t, events[0].Id, "123456789010")
+}
+
+func TestDecodeSingle2(t *testing.T) {
+ events, err := Decode(bytes.NewBufferString(
+ `: starting with a comment
+fake:
+
+data:this is a \ntext
+event:a message\n\n
+fake
+:and multiple comments\n should not break it\n\n
+id:1234567890\n10
+:we can append data
+data:a very nice one\n!
+
+
+`))
+ assert.NoError(t, err)
+ assert.Len(t, events, 1)
+ assert.Equal(t, events[0].Event, "a message\\n\\n")
+ assert.Equal(t, events[0].Id, "1234567890\\n10")
+}
+
+func TestDecodeSingle3(t *testing.T) {
+ events, err := Decode(bytes.NewBufferString(
+ `
+id:123456ABCabc789010
+event: message123
+: we can append data
+data:this is a text
+data: a very nice one
+data:
+data
+: ending with a comment`))
+
+ assert.NoError(t, err)
+ assert.Len(t, events, 1)
+ assert.Equal(t, events[0].Event, "message123")
+ assert.Equal(t, events[0].Id, "123456ABCabc789010")
+}
+
+func TestDecodeMulti1(t *testing.T) {
+ events, err := Decode(bytes.NewBufferString(
+ `
+id:
+event: weird event
+data:this is a text
+:data: this should NOT APER
+data: second line
+
+: a comment
+event: message
+id:123
+data:this is a text
+:data: this should NOT APER
+data: second line
+
+
+: a comment
+event: message
+id:123
+data:this is a text
+data: second line
+
+:hola
+
+data
+
+event:
+
+id`))
+ assert.NoError(t, err)
+ assert.Len(t, events, 3)
+ assert.Equal(t, events[0].Event, "weird event")
+ assert.Equal(t, events[0].Id, "")
+}
+
+func TestDecodeW3C(t *testing.T) {
+ events, err := Decode(bytes.NewBufferString(
+ `data
+
+data
+data
+
+data:
+`))
+ assert.NoError(t, err)
+ assert.Len(t, events, 1)
+}
diff --git a/vendor/github.com/manucorporat/sse/sse-encoder.go b/vendor/github.com/manucorporat/sse/sse-encoder.go
index 5a5bfa7a2..19a385ea7 100644
--- a/vendor/github.com/manucorporat/sse/sse-encoder.go
+++ b/vendor/github.com/manucorporat/sse/sse-encoder.go
@@ -1,3 +1,7 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
package sse
import (
@@ -6,6 +10,7 @@ import (
"io"
"net/http"
"reflect"
+ "strconv"
"strings"
)
@@ -15,6 +20,17 @@ import (
const ContentType = "text/event-stream"
+var contentType = []string{ContentType}
+var noCache = []string{"no-cache"}
+
+var fieldReplacer = strings.NewReplacer(
+ "\n", "\\n",
+ "\r", "\\r")
+
+var dataReplacer = strings.NewReplacer(
+ "\n", "\ndata:",
+ "\r", "\\r")
+
type Event struct {
Event string
Id string
@@ -22,63 +38,65 @@ type Event struct {
Data interface{}
}
-func Encode(w io.Writer, event Event) error {
+func Encode(writer io.Writer, event Event) error {
+ w := checkWriter(writer)
writeId(w, event.Id)
writeEvent(w, event.Event)
writeRetry(w, event.Retry)
return writeData(w, event.Data)
}
-func writeId(w io.Writer, id string) {
+func writeId(w stringWriter, id string) {
if len(id) > 0 {
- w.Write([]byte("id: "))
- w.Write([]byte(escape(id)))
- w.Write([]byte("\n"))
+ w.WriteString("id:")
+ fieldReplacer.WriteString(w, id)
+ w.WriteString("\n")
}
}
-func writeEvent(w io.Writer, event string) {
+func writeEvent(w stringWriter, event string) {
if len(event) > 0 {
- w.Write([]byte("event: "))
- w.Write([]byte(escape(event)))
- w.Write([]byte("\n"))
+ w.WriteString("event:")
+ fieldReplacer.WriteString(w, event)
+ w.WriteString("\n")
}
}
-func writeRetry(w io.Writer, retry uint) {
+func writeRetry(w stringWriter, retry uint) {
if retry > 0 {
- fmt.Fprintf(w, "retry: %d\n", retry)
+ w.WriteString("retry:")
+ w.WriteString(strconv.FormatUint(uint64(retry), 10))
+ w.WriteString("\n")
}
}
-func writeData(w io.Writer, data interface{}) error {
- w.Write([]byte("data: "))
- switch typeOfData(data) {
+func writeData(w stringWriter, data interface{}) error {
+ w.WriteString("data:")
+ switch kindOfData(data) {
case reflect.Struct, reflect.Slice, reflect.Map:
err := json.NewEncoder(w).Encode(data)
if err != nil {
return err
}
- w.Write([]byte("\n"))
+ w.WriteString("\n")
default:
- text := fmt.Sprint(data)
- w.Write([]byte(escape(text)))
- w.Write([]byte("\n\n"))
+ dataReplacer.WriteString(w, fmt.Sprint(data))
+ w.WriteString("\n\n")
}
return nil
}
-func (r Event) Write(w http.ResponseWriter) error {
+func (r Event) Render(w http.ResponseWriter) error {
header := w.Header()
- header.Set("Content-Type", ContentType)
+ header["Content-Type"] = contentType
if _, exist := header["Cache-Control"]; !exist {
- header.Set("Cache-Control", "no-cache")
+ header["Cache-Control"] = noCache
}
return Encode(w, r)
}
-func typeOfData(data interface{}) reflect.Kind {
+func kindOfData(data interface{}) reflect.Kind {
value := reflect.ValueOf(data)
valueType := value.Kind()
if valueType == reflect.Ptr {
@@ -86,11 +104,3 @@ func typeOfData(data interface{}) reflect.Kind {
}
return valueType
}
-
-func escape(str string) string {
- // any-char = %x0000-0009 / %x000B-000C / %x000E-10FFFF
- // ; a Unicode character other than U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR)
- str = strings.Replace(str, "\n", "\\n", -1)
- str = strings.Replace(str, "\r", "\\r", -1)
- return str
-}
diff --git a/vendor/github.com/manucorporat/sse/sse_test.go b/vendor/github.com/manucorporat/sse/sse_test.go
index f38428672..61b685b0e 100644
--- a/vendor/github.com/manucorporat/sse/sse_test.go
+++ b/vendor/github.com/manucorporat/sse/sse_test.go
@@ -1,3 +1,7 @@
+// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
+// Use of this source code is governed by a MIT style
+// license that can be found in the LICENSE file.
+
package sse
import (
@@ -5,26 +9,47 @@ import (
"net/http/httptest"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/assert"
)
func TestEncodeOnlyData(t *testing.T) {
w := new(bytes.Buffer)
- err := Encode(w, Event{
+ event := Event{
Data: "junk\n\njk\nid:fake",
- })
+ }
+ err := Encode(w, event)
assert.NoError(t, err)
- assert.Equal(t, w.String(), "data: junk\\n\\njk\\nid:fake\n\n")
+ assert.Equal(t, w.String(),
+ `data:junk
+data:
+data:jk
+data:id:fake
+
+`)
+
+ decoded, _ := Decode(w)
+ assert.Equal(t, decoded, []Event{event})
}
func TestEncodeWithEvent(t *testing.T) {
w := new(bytes.Buffer)
- err := Encode(w, Event{
+ event := Event{
Event: "t\n:<>\r\test",
Data: "junk\n\njk\nid:fake",
- })
+ }
+ err := Encode(w, event)
assert.NoError(t, err)
- assert.Equal(t, w.String(), "event: t\\n:<>\\r\test\ndata: junk\\n\\njk\\nid:fake\n\n")
+ assert.Equal(t, w.String(),
+ `event:t\n:<>\r est
+data:junk
+data:
+data:jk
+data:id:fake
+
+`)
+
+ decoded, _ := Decode(w)
+ assert.Equal(t, decoded, []Event{event})
}
func TestEncodeWithId(t *testing.T) {
@@ -34,7 +59,14 @@ func TestEncodeWithId(t *testing.T) {
Data: "junk\n\njk\nid:fa\rke",
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "id: t\\n:<>\\r\test\ndata: junk\\n\\njk\\nid:fa\\rke\n\n")
+ assert.Equal(t, w.String(),
+ `id:t\n:<>\r est
+data:junk
+data:
+data:jk
+data:id:fa\rke
+
+`)
}
func TestEncodeWithRetry(t *testing.T) {
@@ -44,7 +76,15 @@ func TestEncodeWithRetry(t *testing.T) {
Data: "junk\n\njk\nid:fake\n",
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "retry: 11\ndata: junk\\n\\njk\\nid:fake\\n\n\n")
+ assert.Equal(t, w.String(),
+ `retry:11
+data:junk
+data:
+data:jk
+data:id:fake
+data:
+
+`)
}
func TestEncodeWithEverything(t *testing.T) {
@@ -56,7 +96,7 @@ func TestEncodeWithEverything(t *testing.T) {
Data: "some data",
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "id: 12345\nevent: abc\nretry: 10\ndata: some data\n\n")
+ assert.Equal(t, w.String(), "id:12345\nevent:abc\nretry:10\ndata:some data\n\n")
}
func TestEncodeMap(t *testing.T) {
@@ -69,7 +109,7 @@ func TestEncodeMap(t *testing.T) {
},
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "event: a map\ndata: {\"bar\":\"id: 2\",\"foo\":\"b\\n\\rar\"}\n\n")
+ assert.Equal(t, w.String(), "event:a map\ndata:{\"bar\":\"id: 2\",\"foo\":\"b\\n\\rar\"}\n\n")
}
func TestEncodeSlice(t *testing.T) {
@@ -79,7 +119,7 @@ func TestEncodeSlice(t *testing.T) {
Data: []interface{}{1, "text", map[string]interface{}{"foo": "bar"}},
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "event: a slice\ndata: [1,\"text\",{\"foo\":\"bar\"}]\n\n")
+ assert.Equal(t, w.String(), "event:a slice\ndata:[1,\"text\",{\"foo\":\"bar\"}]\n\n")
}
func TestEncodeStruct(t *testing.T) {
@@ -94,7 +134,7 @@ func TestEncodeStruct(t *testing.T) {
Data: myStruct,
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "event: a struct\ndata: {\"A\":1,\"value\":\"number\"}\n\n")
+ assert.Equal(t, w.String(), "event:a struct\ndata:{\"A\":1,\"value\":\"number\"}\n\n")
w.Reset()
err = Encode(w, Event{
@@ -102,7 +142,7 @@ func TestEncodeStruct(t *testing.T) {
Data: &myStruct,
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "event: a struct\ndata: {\"A\":1,\"value\":\"number\"}\n\n")
+ assert.Equal(t, w.String(), "event:a struct\ndata:{\"A\":1,\"value\":\"number\"}\n\n")
}
func TestEncodeInteger(t *testing.T) {
@@ -112,7 +152,7 @@ func TestEncodeInteger(t *testing.T) {
Data: 1,
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "event: an integer\ndata: 1\n\n")
+ assert.Equal(t, w.String(), "event:an integer\ndata:1\n\n")
}
func TestEncodeFloat(t *testing.T) {
@@ -122,7 +162,7 @@ func TestEncodeFloat(t *testing.T) {
Data: 1.5,
})
assert.NoError(t, err)
- assert.Equal(t, w.String(), "event: Float\ndata: 1.5\n\n")
+ assert.Equal(t, w.String(), "event:Float\ndata:1.5\n\n")
}
func TestEncodeStream(t *testing.T) {
@@ -143,7 +183,7 @@ func TestEncodeStream(t *testing.T) {
Event: "chat",
Data: "hi! dude",
})
- assert.Equal(t, w.String(), "event: float\ndata: 1.5\n\nid: 123\ndata: {\"bar\":\"foo\",\"foo\":\"bar\"}\n\nid: 124\nevent: chat\ndata: hi! dude\n\n")
+ assert.Equal(t, w.String(), "event:float\ndata:1.5\n\nid:123\ndata:{\"bar\":\"foo\",\"foo\":\"bar\"}\n\nid:124\nevent:chat\ndata:hi! dude\n\n")
}
func TestRenderSSE(t *testing.T) {
@@ -152,10 +192,64 @@ func TestRenderSSE(t *testing.T) {
err := (Event{
Event: "msg",
Data: "hi! how are you?",
- }).Write(w)
+ }).Render(w)
assert.NoError(t, err)
- assert.Equal(t, w.Body.String(), "event: msg\ndata: hi! how are you?\n\n")
+ assert.Equal(t, w.Body.String(), "event:msg\ndata:hi! how are you?\n\n")
assert.Equal(t, w.Header().Get("Content-Type"), "text/event-stream")
assert.Equal(t, w.Header().Get("Cache-Control"), "no-cache")
}
+
+func BenchmarkResponseWriter(b *testing.B) {
+ w := httptest.NewRecorder()
+ b.ResetTimer()
+ b.ReportAllocs()
+ for i := 0; i < b.N; i++ {
+ (Event{
+ Event: "new_message",
+ Data: "hi! how are you? I am fine. this is a long stupid message!!!",
+ }).Render(w)
+ }
+}
+
+func BenchmarkFullSSE(b *testing.B) {
+ buf := new(bytes.Buffer)
+ b.ResetTimer()
+ b.ReportAllocs()
+ for i := 0; i < b.N; i++ {
+ Encode(buf, Event{
+ Event: "new_message",
+ Id: "13435",
+ Retry: 10,
+ Data: "hi! how are you? I am fine. this is a long stupid message!!!",
+ })
+ buf.Reset()
+ }
+}
+
+func BenchmarkNoRetrySSE(b *testing.B) {
+ buf := new(bytes.Buffer)
+ b.ResetTimer()
+ b.ReportAllocs()
+ for i := 0; i < b.N; i++ {
+ Encode(buf, Event{
+ Event: "new_message",
+ Id: "13435",
+ Data: "hi! how are you? I am fine. this is a long stupid message!!!",
+ })
+ buf.Reset()
+ }
+}
+
+func BenchmarkSimpleSSE(b *testing.B) {
+ buf := new(bytes.Buffer)
+ b.ResetTimer()
+ b.ReportAllocs()
+ for i := 0; i < b.N; i++ {
+ Encode(buf, Event{
+ Event: "new_message",
+ Data: "hi! how are you? I am fine. this is a long stupid message!!!",
+ })
+ buf.Reset()
+ }
+}
diff --git a/vendor/github.com/manucorporat/sse/writer.go b/vendor/github.com/manucorporat/sse/writer.go
new file mode 100644
index 000000000..6f9806c55
--- /dev/null
+++ b/vendor/github.com/manucorporat/sse/writer.go
@@ -0,0 +1,24 @@
+package sse
+
+import "io"
+
+type stringWriter interface {
+ io.Writer
+ WriteString(string) (int, error)
+}
+
+type stringWrapper struct {
+ io.Writer
+}
+
+func (w stringWrapper) WriteString(str string) (int, error) {
+ return w.Writer.Write([]byte(str))
+}
+
+func checkWriter(writer io.Writer) stringWriter {
+ if w, ok := writer.(stringWriter); ok {
+ return w
+ } else {
+ return stringWrapper{writer}
+ }
+}
diff --git a/vendor/github.com/manucorporat/stats/stats.go b/vendor/github.com/manucorporat/stats/stats.go
new file mode 100644
index 000000000..250e5416e
--- /dev/null
+++ b/vendor/github.com/manucorporat/stats/stats.go
@@ -0,0 +1,87 @@
+package stats
+
+import "sync"
+
+type ValueType float64
+type StatsType map[string]ValueType
+
+type StatsCollector struct {
+ lock sync.RWMutex
+ stats StatsType
+}
+
+func New() *StatsCollector {
+ s := new(StatsCollector)
+ s.Reset()
+ return s
+}
+
+func (s *StatsCollector) Reset() {
+ s.lock.Lock()
+ s.stats = make(StatsType)
+ s.lock.Unlock()
+}
+
+func (s *StatsCollector) Set(key string, value ValueType) {
+ s.lock.Lock()
+ s.stats[key] = value
+ s.lock.Unlock()
+}
+
+func (s *StatsCollector) Add(key string, delta ValueType) (v ValueType) {
+ s.lock.Lock()
+ v = s.stats[key]
+ v += delta
+ s.stats[key] = v
+ s.lock.Unlock()
+ return
+}
+
+func (s *StatsCollector) Get(key string) (v ValueType) {
+ s.lock.RLock()
+ v = s.stats[key]
+ s.lock.RUnlock()
+ return
+}
+
+func (s *StatsCollector) Del(key string) {
+ s.lock.Lock()
+ delete(s.stats, key)
+ s.lock.Unlock()
+}
+
+func (s *StatsCollector) Data() StatsType {
+ cp := make(StatsType)
+ s.lock.RLock()
+ for key, value := range s.stats {
+ cp[key] = value
+ }
+ s.lock.RUnlock()
+ return cp
+}
+
+var defaultCollector = New()
+
+func Reset() {
+ defaultCollector.Reset()
+}
+
+func Set(key string, value ValueType) {
+ defaultCollector.Set(key, value)
+}
+
+func Del(key string) {
+ defaultCollector.Del(key)
+}
+
+func Add(key string, delta ValueType) ValueType {
+ return defaultCollector.Add(key, delta)
+}
+
+func Get(key string) ValueType {
+ return defaultCollector.Get(key)
+}
+
+func Data() StatsType {
+ return defaultCollector.Data()
+}
diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md
index c69da4a76..e84226a73 100644
--- a/vendor/github.com/mattn/go-colorable/README.md
+++ b/vendor/github.com/mattn/go-colorable/README.md
@@ -17,6 +17,7 @@ This package is possible to handle escape sequence for ansi color on windows.
## Usage
```go
+logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true})
logrus.SetOutput(colorable.NewColorableStdout())
logrus.Info("succeeded")
diff --git a/vendor/github.com/mattn/go-sqlite3/.gitignore b/vendor/github.com/mattn/go-sqlite3/.gitignore
deleted file mode 100644
index bf90dfd89..000000000
--- a/vendor/github.com/mattn/go-sqlite3/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.db
-*.exe
-*.dll
diff --git a/vendor/github.com/mattn/go-sqlite3/.travis.yml b/vendor/github.com/mattn/go-sqlite3/.travis.yml
deleted file mode 100644
index ac7bfea5c..000000000
--- a/vendor/github.com/mattn/go-sqlite3/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: go
-go:
- - tip
-before_install:
- - go get github.com/axw/gocov/gocov
- - go get github.com/mattn/goveralls
- - go get golang.org/x/tools/cmd/cover
-script:
- - $HOME/gopath/bin/goveralls -repotoken 3qJVUE0iQwqnCbmNcDsjYu1nh4J4KIFXx
diff --git a/vendor/github.com/mattn/go-sqlite3/README.md b/vendor/github.com/mattn/go-sqlite3/README.md
index 4383f0cd4..9d04745fa 100644
--- a/vendor/github.com/mattn/go-sqlite3/README.md
+++ b/vendor/github.com/mattn/go-sqlite3/README.md
@@ -41,18 +41,12 @@ FAQ
> See: https://github.com/mattn/go-sqlite3/issues/106
> See also: http://www.limitlessfx.com/cross-compile-golang-app-for-windows-from-linux.html
-* Want to get time.Time with current locale
-
- Use `loc=auto` in SQLite3 filename schema like `file:foo.db?loc=auto`.
-
License
-------
MIT: http://mattn.mit-license.org/2012
-sqlite3-binding.c, sqlite3-binding.h, sqlite3ext.h
-
-The -binding suffix was added to avoid build failures under gccgo.
+sqlite.c, sqlite3.h, sqlite3ext.h
In this repository, those files are amalgamation code that copied from SQLite3. The license of those codes are depend on the license of SQLite3.
diff --git a/vendor/github.com/mattn/go-sqlite3/backup.go b/vendor/github.com/mattn/go-sqlite3/backup.go
index 3807c606b..270446aa7 100644
--- a/vendor/github.com/mattn/go-sqlite3/backup.go
+++ b/vendor/github.com/mattn/go-sqlite3/backup.go
@@ -6,7 +6,7 @@
package sqlite3
/*
-#include
+#include
#include
*/
import "C"
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c b/vendor/github.com/mattn/go-sqlite3/sqlite3.c
similarity index 100%
rename from vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c
rename to vendor/github.com/mattn/go-sqlite3/sqlite3.c
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3.go b/vendor/github.com/mattn/go-sqlite3/sqlite3.go
index 233e7e910..605474c07 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3.go
@@ -9,7 +9,7 @@ package sqlite3
#cgo CFLAGS: -std=gnu99
#cgo CFLAGS: -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE
#cgo CFLAGS: -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS
-#include
+#include
#include
#include
@@ -47,23 +47,14 @@ _sqlite3_bind_blob(sqlite3_stmt *stmt, int n, void *p, int np) {
#include
#include
-static int
-_sqlite3_exec(sqlite3* db, const char* pcmd, long* rowid, long* changes)
-{
- int rv = sqlite3_exec(db, pcmd, 0, 0, 0);
- *rowid = (long) sqlite3_last_insert_rowid(db);
- *changes = (long) sqlite3_changes(db);
- return rv;
+static long
+_sqlite3_last_insert_rowid(sqlite3* db) {
+ return (long) sqlite3_last_insert_rowid(db);
}
-static int
-_sqlite3_step(sqlite3_stmt* stmt, long* rowid, long* changes)
-{
- int rv = sqlite3_step(stmt);
- sqlite3* db = sqlite3_db_handle(stmt);
- *rowid = (long) sqlite3_last_insert_rowid(db);
- *changes = (long) sqlite3_changes(db);
- return rv;
+static long
+_sqlite3_changes(sqlite3* db) {
+ return (long) sqlite3_changes(db);
}
*/
@@ -74,7 +65,6 @@ import (
"errors"
"fmt"
"io"
- "net/url"
"runtime"
"strconv"
"strings"
@@ -117,9 +107,7 @@ type SQLiteDriver struct {
// Conn struct.
type SQLiteConn struct {
- db *C.sqlite3
- loc *time.Location
- txlock string
+ db *C.sqlite3
}
// Tx struct.
@@ -131,8 +119,6 @@ type SQLiteTx struct {
type SQLiteStmt struct {
c *SQLiteConn
s *C.sqlite3_stmt
- nv int
- nn []string
t string
closed bool
cls bool
@@ -242,18 +228,19 @@ func (c *SQLiteConn) Query(query string, args []driver.Value) (driver.Rows, erro
func (c *SQLiteConn) exec(cmd string) (driver.Result, error) {
pcmd := C.CString(cmd)
defer C.free(unsafe.Pointer(pcmd))
-
- var rowid, changes C.long
- rv := C._sqlite3_exec(c.db, pcmd, &rowid, &changes)
+ rv := C.sqlite3_exec(c.db, pcmd, nil, nil, nil)
if rv != C.SQLITE_OK {
return nil, c.lastError()
}
- return &SQLiteResult{int64(rowid), int64(changes)}, nil
+ return &SQLiteResult{
+ int64(C._sqlite3_last_insert_rowid(c.db)),
+ int64(C._sqlite3_changes(c.db)),
+ }, nil
}
// Begin transaction.
func (c *SQLiteConn) Begin() (driver.Tx, error) {
- if _, err := c.exec(c.txlock); err != nil {
+ if _, err := c.exec("BEGIN"); err != nil {
return nil, err
}
return &SQLiteTx{c}, nil
@@ -269,69 +256,11 @@ func errorString(err Error) string {
// file:test.db?cache=shared&mode=memory
// :memory:
// file::memory:
-// go-sqlite handle especially query parameters.
-// _loc=XXX
-// Specify location of time format. It's possible to specify "auto".
-// _busy_timeout=XXX
-// Specify value for sqlite3_busy_timeout.
-// _txlock=XXX
-// Specify locking behavior for transactions. XXX can be "immediate",
-// "deferred", "exclusive".
func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
if C.sqlite3_threadsafe() == 0 {
return nil, errors.New("sqlite library was not compiled for thread-safe operation")
}
- var loc *time.Location
- txlock := "BEGIN"
- busy_timeout := 5000
- pos := strings.IndexRune(dsn, '?')
- if pos >= 1 {
- params, err := url.ParseQuery(dsn[pos+1:])
- if err != nil {
- return nil, err
- }
-
- // _loc
- if val := params.Get("_loc"); val != "" {
- if val == "auto" {
- loc = time.Local
- } else {
- loc, err = time.LoadLocation(val)
- if err != nil {
- return nil, fmt.Errorf("Invalid _loc: %v: %v", val, err)
- }
- }
- }
-
- // _busy_timeout
- if val := params.Get("_busy_timeout"); val != "" {
- iv, err := strconv.ParseInt(val, 10, 64)
- if err != nil {
- return nil, fmt.Errorf("Invalid _busy_timeout: %v: %v", val, err)
- }
- busy_timeout = int(iv)
- }
-
- // _txlock
- if val := params.Get("_txlock"); val != "" {
- switch val {
- case "immediate":
- txlock = "BEGIN IMMEDIATE"
- case "exclusive":
- txlock = "BEGIN EXCLUSIVE"
- case "deferred":
- txlock = "BEGIN"
- default:
- return nil, fmt.Errorf("Invalid _txlock: %v", val)
- }
- }
-
- if !strings.HasPrefix(dsn, "file:") {
- dsn = dsn[:pos]
- }
- }
-
var db *C.sqlite3
name := C.CString(dsn)
defer C.free(unsafe.Pointer(name))
@@ -347,12 +276,12 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
return nil, errors.New("sqlite succeeded without returning a database")
}
- rv = C.sqlite3_busy_timeout(db, C.int(busy_timeout))
+ rv = C.sqlite3_busy_timeout(db, 5000)
if rv != C.SQLITE_OK {
return nil, Error{Code: ErrNo(rv)}
}
- conn := &SQLiteConn{db: db, loc: loc, txlock: txlock}
+ conn := &SQLiteConn{db}
if len(d.Extensions) > 0 {
rv = C.sqlite3_enable_load_extension(db, 1)
@@ -406,18 +335,10 @@ func (c *SQLiteConn) Prepare(query string) (driver.Stmt, error) {
return nil, c.lastError()
}
var t string
- if tail != nil && *tail != '\000' {
+ if tail != nil && C.strlen(tail) > 0 {
t = strings.TrimSpace(C.GoString(tail))
}
- nv := int(C.sqlite3_bind_parameter_count(s))
- var nn []string
- for i := 0; i < nv; i++ {
- pn := C.GoString(C.sqlite3_bind_parameter_name(s, C.int(i+1)))
- if len(pn) > 1 && pn[0] == '$' && 48 <= pn[1] && pn[1] <= 57 {
- nn = append(nn, C.GoString(C.sqlite3_bind_parameter_name(s, C.int(i+1))))
- }
- }
- ss := &SQLiteStmt{c: c, s: s, nv: nv, nn: nn, t: t}
+ ss := &SQLiteStmt{c: c, s: s, t: t}
runtime.SetFinalizer(ss, (*SQLiteStmt).Close)
return ss, nil
}
@@ -441,12 +362,7 @@ func (s *SQLiteStmt) Close() error {
// Return a number of parameters.
func (s *SQLiteStmt) NumInput() int {
- return s.nv
-}
-
-type bindArg struct {
- n int
- v driver.Value
+ return int(C.sqlite3_bind_parameter_count(s.s))
}
func (s *SQLiteStmt) bind(args []driver.Value) error {
@@ -455,24 +371,8 @@ func (s *SQLiteStmt) bind(args []driver.Value) error {
return s.c.lastError()
}
- var vargs []bindArg
- narg := len(args)
- vargs = make([]bindArg, narg)
- if len(s.nn) > 0 {
- for i, v := range s.nn {
- if pi, err := strconv.Atoi(v[1:]); err == nil {
- vargs[i] = bindArg{pi, args[i]}
- }
- }
- } else {
- for i, v := range args {
- vargs[i] = bindArg{i + 1, v}
- }
- }
-
- for _, varg := range vargs {
- n := C.int(varg.n)
- v := varg.v
+ for i, v := range args {
+ n := C.int(i + 1)
switch v := v.(type) {
case nil:
rv = C.sqlite3_bind_null(s.s, n)
@@ -533,18 +433,20 @@ func (r *SQLiteResult) RowsAffected() (int64, error) {
func (s *SQLiteStmt) Exec(args []driver.Value) (driver.Result, error) {
if err := s.bind(args); err != nil {
C.sqlite3_reset(s.s)
- C.sqlite3_clear_bindings(s.s)
return nil, err
}
- var rowid, changes C.long
- rv := C._sqlite3_step(s.s, &rowid, &changes)
+ rv := C.sqlite3_step(s.s)
if rv != C.SQLITE_ROW && rv != C.SQLITE_OK && rv != C.SQLITE_DONE {
err := s.c.lastError()
C.sqlite3_reset(s.s)
- C.sqlite3_clear_bindings(s.s)
return nil, err
}
- return &SQLiteResult{int64(rowid), int64(changes)}, nil
+
+ res := &SQLiteResult{
+ int64(C._sqlite3_last_insert_rowid(s.c.db)),
+ int64(C._sqlite3_changes(s.c.db)),
+ }
+ return res, nil
}
// Close the rows.
@@ -601,21 +503,17 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
switch rc.decltype[i] {
case "timestamp", "datetime", "date":
unixTimestamp := strconv.FormatInt(val, 10)
- var t time.Time
if len(unixTimestamp) == 13 {
duration, err := time.ParseDuration(unixTimestamp + "ms")
if err != nil {
return fmt.Errorf("error parsing %s value %d, %s", rc.decltype[i], val, err)
}
epoch := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC)
- t = epoch.Add(duration)
+ dest[i] = epoch.Add(duration)
} else {
- t = time.Unix(val, 0)
+ dest[i] = time.Unix(val, 0).Local()
}
- if rc.s.c.loc != nil {
- t = t.In(rc.s.c.loc)
- }
- dest[i] = t
+
case "boolean":
dest[i] = val > 0
default:
@@ -643,28 +541,20 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
case C.SQLITE_TEXT:
var err error
var timeVal time.Time
-
- n := int(C.sqlite3_column_bytes(rc.s.s, C.int(i)))
- s := C.GoStringN((*C.char)(unsafe.Pointer(C.sqlite3_column_text(rc.s.s, C.int(i)))), C.int(n))
+ s := C.GoString((*C.char)(unsafe.Pointer(C.sqlite3_column_text(rc.s.s, C.int(i)))))
switch rc.decltype[i] {
case "timestamp", "datetime", "date":
- var t time.Time
- s = strings.TrimSuffix(s, "Z")
for _, format := range SQLiteTimestampFormats {
if timeVal, err = time.ParseInLocation(format, s, time.UTC); err == nil {
- t = timeVal
+ dest[i] = timeVal.Local()
break
}
}
if err != nil {
// The column is a time value, so return the zero time on parse failure.
- t = time.Time{}
+ dest[i] = time.Time{}
}
- if rc.s.c.loc != nil {
- t = t.In(rc.s.c.loc)
- }
- dest[i] = t
default:
dest[i] = []byte(s)
}
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h b/vendor/github.com/mattn/go-sqlite3/sqlite3.h
similarity index 100%
rename from vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h
rename to vendor/github.com/mattn/go-sqlite3/sqlite3.h
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3_other.go b/vendor/github.com/mattn/go-sqlite3/sqlite3_other.go
index a20d02c35..54b6c7a5e 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3_other.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3_other.go
@@ -9,5 +9,6 @@ package sqlite3
/*
#cgo CFLAGS: -I.
#cgo linux LDFLAGS: -ldl
+#cgo CFLAGS: -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE
*/
import "C"
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3_test.go b/vendor/github.com/mattn/go-sqlite3/sqlite3_test.go
index 7ab233a27..a0adf303c 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3_test.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3_test.go
@@ -8,18 +8,13 @@ package sqlite3
import (
"crypto/rand"
"database/sql"
- "database/sql/driver"
"encoding/hex"
- "errors"
- "fmt"
- "net/url"
"os"
"path/filepath"
- "strings"
"testing"
"time"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/mattn/go-sqlite3/sqlite3_test"
+ "github.com/mattn/go-sqlite3/sqlite3_test"
)
func TempFilename() string {
@@ -28,17 +23,11 @@ func TempFilename() string {
return filepath.Join(os.TempDir(), "foo"+hex.EncodeToString(randBytes)+".db")
}
-func doTestOpen(t *testing.T, option string) (string, error) {
- var url string
+func TestOpen(t *testing.T) {
tempFilename := TempFilename()
- if option != "" {
- url = tempFilename + option
- } else {
- url = tempFilename
- }
- db, err := sql.Open("sqlite3", url)
+ db, err := sql.Open("sqlite3", tempFilename)
if err != nil {
- return "Failed to open database:", err
+ t.Fatal("Failed to open database:", err)
}
defer os.Remove(tempFilename)
defer db.Close()
@@ -46,38 +35,11 @@ func doTestOpen(t *testing.T, option string) (string, error) {
_, err = db.Exec("drop table foo")
_, err = db.Exec("create table foo (id integer)")
if err != nil {
- return "Failed to create table:", err
+ t.Fatal("Failed to create table:", err)
}
if stat, err := os.Stat(tempFilename); err != nil || stat.IsDir() {
- return "Failed to create ./foo.db", nil
- }
-
- return "", nil
-}
-
-func TestOpen(t *testing.T) {
- cases := map[string]bool{
- "": true,
- "?_txlock=immediate": true,
- "?_txlock=deferred": true,
- "?_txlock=exclusive": true,
- "?_txlock=bogus": false,
- }
- for option, expectedPass := range cases {
- result, err := doTestOpen(t, option)
- if result == "" {
- if !expectedPass {
- errmsg := fmt.Sprintf("_txlock error not caught at dbOpen with option: %s", option)
- t.Fatal(errmsg)
- }
- } else if expectedPass {
- if err == nil {
- t.Fatal(result)
- } else {
- t.Fatal(result, err)
- }
- }
+ t.Error("Failed to create ./foo.db")
}
}
@@ -672,102 +634,6 @@ func TestWAL(t *testing.T) {
}
}
-func TestTimezoneConversion(t *testing.T) {
- zones := []string{"UTC", "US/Central", "US/Pacific", "Local"}
- for _, tz := range zones {
- tempFilename := TempFilename()
- db, err := sql.Open("sqlite3", tempFilename+"?_loc="+url.QueryEscape(tz))
- if err != nil {
- t.Fatal("Failed to open database:", err)
- }
- defer os.Remove(tempFilename)
- defer db.Close()
-
- _, err = db.Exec("DROP TABLE foo")
- _, err = db.Exec("CREATE TABLE foo(id INTEGER, ts TIMESTAMP, dt DATETIME)")
- if err != nil {
- t.Fatal("Failed to create table:", err)
- }
-
- loc, err := time.LoadLocation(tz)
- if err != nil {
- t.Fatal("Failed to load location:", err)
- }
-
- timestamp1 := time.Date(2012, time.April, 6, 22, 50, 0, 0, time.UTC)
- timestamp2 := time.Date(2006, time.January, 2, 15, 4, 5, 123456789, time.UTC)
- timestamp3 := time.Date(2012, time.November, 4, 0, 0, 0, 0, time.UTC)
- tests := []struct {
- value interface{}
- expected time.Time
- }{
- {"nonsense", time.Time{}.In(loc)},
- {"0000-00-00 00:00:00", time.Time{}.In(loc)},
- {timestamp1, timestamp1.In(loc)},
- {timestamp1.Unix(), timestamp1.In(loc)},
- {timestamp1.In(time.FixedZone("TEST", -7*3600)), timestamp1.In(loc)},
- {timestamp1.Format("2006-01-02 15:04:05.000"), timestamp1.In(loc)},
- {timestamp1.Format("2006-01-02T15:04:05.000"), timestamp1.In(loc)},
- {timestamp1.Format("2006-01-02 15:04:05"), timestamp1.In(loc)},
- {timestamp1.Format("2006-01-02T15:04:05"), timestamp1.In(loc)},
- {timestamp2, timestamp2.In(loc)},
- {"2006-01-02 15:04:05.123456789", timestamp2.In(loc)},
- {"2006-01-02T15:04:05.123456789", timestamp2.In(loc)},
- {"2012-11-04", timestamp3.In(loc)},
- {"2012-11-04 00:00", timestamp3.In(loc)},
- {"2012-11-04 00:00:00", timestamp3.In(loc)},
- {"2012-11-04 00:00:00.000", timestamp3.In(loc)},
- {"2012-11-04T00:00", timestamp3.In(loc)},
- {"2012-11-04T00:00:00", timestamp3.In(loc)},
- {"2012-11-04T00:00:00.000", timestamp3.In(loc)},
- }
- for i := range tests {
- _, err = db.Exec("INSERT INTO foo(id, ts, dt) VALUES(?, ?, ?)", i, tests[i].value, tests[i].value)
- if err != nil {
- t.Fatal("Failed to insert timestamp:", err)
- }
- }
-
- rows, err := db.Query("SELECT id, ts, dt FROM foo ORDER BY id ASC")
- if err != nil {
- t.Fatal("Unable to query foo table:", err)
- }
- defer rows.Close()
-
- seen := 0
- for rows.Next() {
- var id int
- var ts, dt time.Time
-
- if err := rows.Scan(&id, &ts, &dt); err != nil {
- t.Error("Unable to scan results:", err)
- continue
- }
- if id < 0 || id >= len(tests) {
- t.Error("Bad row id: ", id)
- continue
- }
- seen++
- if !tests[id].expected.Equal(ts) {
- t.Errorf("Timestamp value for id %v (%v) should be %v, not %v", id, tests[id].value, tests[id].expected, ts)
- }
- if !tests[id].expected.Equal(dt) {
- t.Errorf("Datetime value for id %v (%v) should be %v, not %v", id, tests[id].value, tests[id].expected, dt)
- }
- if tests[id].expected.Location().String() != ts.Location().String() {
- t.Errorf("Location for id %v (%v) should be %v, not %v", id, tests[id].value, tests[id].expected.Location().String(), ts.Location().String())
- }
- if tests[id].expected.Location().String() != dt.Location().String() {
- t.Errorf("Location for id %v (%v) should be %v, not %v", id, tests[id].value, tests[id].expected.Location().String(), dt.Location().String())
- }
- }
-
- if seen != len(tests) {
- t.Errorf("Expected to see %d rows", len(tests))
- }
- }
-}
-
func TestSuite(t *testing.T) {
db, err := sql.Open("sqlite3", ":memory:")
if err != nil {
@@ -878,181 +744,9 @@ func TestStress(t *testing.T) {
}
}
-func TestDateTimeLocal(t *testing.T) {
- zone := "Asia/Tokyo"
- tempFilename := TempFilename()
- db, err := sql.Open("sqlite3", tempFilename+"?_loc="+zone)
- if err != nil {
- t.Fatal("Failed to open database:", err)
- }
- db.Exec("CREATE TABLE foo (dt datetime);")
- db.Exec("INSERT INTO foo VALUES('2015-03-05 15:16:17');")
-
- row := db.QueryRow("select * from foo")
- var d time.Time
- err = row.Scan(&d)
- if err != nil {
- t.Fatal("Failed to scan datetime:", err)
- }
- if d.Hour() == 15 || !strings.Contains(d.String(), "JST") {
- t.Fatal("Result should have timezone", d)
- }
- db.Close()
-
- db, err = sql.Open("sqlite3", tempFilename)
- if err != nil {
- t.Fatal("Failed to open database:", err)
- }
-
- row = db.QueryRow("select * from foo")
- err = row.Scan(&d)
- if err != nil {
- t.Fatal("Failed to scan datetime:", err)
- }
- if d.UTC().Hour() != 15 || !strings.Contains(d.String(), "UTC") {
- t.Fatalf("Result should not have timezone %v %v", zone, d.String())
- }
-
- _, err = db.Exec("DELETE FROM foo")
- if err != nil {
- t.Fatal("Failed to delete table:", err)
- }
- dt, err := time.Parse("2006/1/2 15/4/5 -0700 MST", "2015/3/5 15/16/17 +0900 JST")
- if err != nil {
- t.Fatal("Failed to parse datetime:", err)
- }
- db.Exec("INSERT INTO foo VALUES(?);", dt)
-
- db.Close()
- db, err = sql.Open("sqlite3", tempFilename+"?_loc="+zone)
- if err != nil {
- t.Fatal("Failed to open database:", err)
- }
-
- row = db.QueryRow("select * from foo")
- err = row.Scan(&d)
- if err != nil {
- t.Fatal("Failed to scan datetime:", err)
- }
- if d.Hour() != 15 || !strings.Contains(d.String(), "JST") {
- t.Fatalf("Result should have timezone %v %v", zone, d.String())
- }
-}
-
func TestVersion(t *testing.T) {
s, n, id := Version()
if s == "" || n == 0 || id == "" {
t.Errorf("Version failed %q, %d, %q\n", s, n, id)
}
}
-
-func TestNumberNamedParams(t *testing.T) {
- tempFilename := TempFilename()
- db, err := sql.Open("sqlite3", tempFilename)
- if err != nil {
- t.Fatal("Failed to open database:", err)
- }
- defer os.Remove(tempFilename)
- defer db.Close()
-
- _, err = db.Exec(`
- create table foo (id integer, name text, extra text);
- `)
- if err != nil {
- t.Error("Failed to call db.Query:", err)
- }
-
- _, err = db.Exec(`insert into foo(id, name, extra) values($1, $2, $2)`, 1, "foo")
- if err != nil {
- t.Error("Failed to call db.Exec:", err)
- }
-
- row := db.QueryRow(`select id, extra from foo where id = $1 and extra = $2`, 1, "foo")
- if row == nil {
- t.Error("Failed to call db.QueryRow")
- }
- var id int
- var extra string
- err = row.Scan(&id, &extra)
- if err != nil {
- t.Error("Failed to db.Scan:", err)
- }
- if id != 1 || extra != "foo" {
- t.Error("Failed to db.QueryRow: not matched results")
- }
-}
-
-func TestStringContainingZero(t *testing.T) {
- tempFilename := TempFilename()
- db, err := sql.Open("sqlite3", tempFilename)
- if err != nil {
- t.Fatal("Failed to open database:", err)
- }
- defer os.Remove(tempFilename)
- defer db.Close()
-
- _, err = db.Exec(`
- create table foo (id integer, name, extra text);
- `)
- if err != nil {
- t.Error("Failed to call db.Query:", err)
- }
-
- const text = "foo\x00bar"
-
- _, err = db.Exec(`insert into foo(id, name, extra) values($1, $2, $2)`, 1, text)
- if err != nil {
- t.Error("Failed to call db.Exec:", err)
- }
-
- row := db.QueryRow(`select id, extra from foo where id = $1 and extra = $2`, 1, text)
- if row == nil {
- t.Error("Failed to call db.QueryRow")
- }
-
- var id int
- var extra string
- err = row.Scan(&id, &extra)
- if err != nil {
- t.Error("Failed to db.Scan:", err)
- }
- if id != 1 || extra != text {
- t.Error("Failed to db.QueryRow: not matched results")
- }
-}
-
-const CurrentTimeStamp = "2006-01-02 15:04:05"
-
-type TimeStamp struct{ *time.Time }
-
-func (t TimeStamp) Scan(value interface{}) error {
- var err error
- switch v := value.(type) {
- case string:
- *t.Time, err = time.Parse(CurrentTimeStamp, v)
- case []byte:
- *t.Time, err = time.Parse(CurrentTimeStamp, string(v))
- default:
- err = errors.New("invalid type for current_timestamp")
- }
- return err
-}
-
-func (t TimeStamp) Value() (driver.Value, error) {
- return t.Time.Format(CurrentTimeStamp), nil
-}
-
-func TestDateTimeNow(t *testing.T) {
- tempFilename := TempFilename()
- db, err := sql.Open("sqlite3", tempFilename)
- if err != nil {
- t.Fatal("Failed to open database:", err)
- }
- defer db.Close()
-
- var d time.Time
- err = db.QueryRow("SELECT datetime('now')").Scan(TimeStamp{&d})
- if err != nil {
- t.Fatal("Failed to scan datetime:", err)
- }
-}
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go b/vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go
index abc8384e4..f47272de8 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3_windows.go
@@ -2,7 +2,6 @@
//
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file.
-// +build windows
package sqlite3
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h b/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h
index 7cc58b6f8..ecf93f62f 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h
@@ -17,7 +17,7 @@
*/
#ifndef _SQLITE3EXT_H_
#define _SQLITE3EXT_H_
-#include "sqlite3-binding.h"
+#include "sqlite3.h"
typedef struct sqlite3_api_routines sqlite3_api_routines;
diff --git a/vendor/github.com/mitchellh/cli/LICENSE b/vendor/github.com/mitchellh/cli/LICENSE
new file mode 100644
index 000000000..c33dcc7c9
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/LICENSE
@@ -0,0 +1,354 @@
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. “Contributor”
+
+ means each individual or legal entity that creates, contributes to the
+ creation of, or owns Covered Software.
+
+1.2. “Contributor Version”
+
+ means the combination of the Contributions of others (if any) used by a
+ Contributor and that particular Contributor’s Contribution.
+
+1.3. “Contribution”
+
+ means Covered Software of a particular Contributor.
+
+1.4. “Covered Software”
+
+ means Source Code Form to which the initial Contributor has attached the
+ notice in Exhibit A, the Executable Form of such Source Code Form, and
+ Modifications of such Source Code Form, in each case including portions
+ thereof.
+
+1.5. “Incompatible With Secondary Licenses”
+ means
+
+ a. that the initial Contributor has attached the notice described in
+ Exhibit B to the Covered Software; or
+
+ b. that the Covered Software was made available under the terms of version
+ 1.1 or earlier of the License, but not also under the terms of a
+ Secondary License.
+
+1.6. “Executable Form”
+
+ means any form of the work other than Source Code Form.
+
+1.7. “Larger Work”
+
+ means a work that combines Covered Software with other material, in a separate
+ file or files, that is not Covered Software.
+
+1.8. “License”
+
+ means this document.
+
+1.9. “Licensable”
+
+ means having the right to grant, to the maximum extent possible, whether at the
+ time of the initial grant or subsequently, any and all of the rights conveyed by
+ this License.
+
+1.10. “Modifications”
+
+ means any of the following:
+
+ a. any file in Source Code Form that results from an addition to, deletion
+ from, or modification of the contents of Covered Software; or
+
+ b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. “Patent Claims” of a Contributor
+
+ means any patent claim(s), including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by such Contributor that
+ would be infringed, but for the grant of the License, by the making,
+ using, selling, offering for sale, having made, import, or transfer of
+ either its Contributions or its Contributor Version.
+
+1.12. “Secondary License”
+
+ means either the GNU General Public License, Version 2.0, the GNU Lesser
+ General Public License, Version 2.1, the GNU Affero General Public
+ License, Version 3.0, or any later versions of those licenses.
+
+1.13. “Source Code Form”
+
+ means the form of the work preferred for making modifications.
+
+1.14. “You” (or “Your”)
+
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, “You” includes any entity that controls, is
+ controlled by, or is under common control with You. For purposes of this
+ definition, “control” means (a) the power, direct or indirect, to cause
+ the direction or management of such entity, whether by contract or
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
+ outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+ Each Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ a. under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or as
+ part of a Larger Work; and
+
+ b. under Patent Claims of such Contributor to make, use, sell, offer for
+ sale, have made, import, and otherwise transfer either its Contributions
+ or its Contributor Version.
+
+2.2. Effective Date
+
+ The licenses granted in Section 2.1 with respect to any Contribution become
+ effective for each Contribution on the date the Contributor first distributes
+ such Contribution.
+
+2.3. Limitations on Grant Scope
+
+ The licenses granted in this Section 2 are the only rights granted under this
+ License. No additional rights or licenses will be implied from the distribution
+ or licensing of Covered Software under this License. Notwithstanding Section
+ 2.1(b) above, no patent license is granted by a Contributor:
+
+ a. for any code that a Contributor has removed from Covered Software; or
+
+ b. for infringements caused by: (i) Your and any other third party’s
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+ c. under Patent Claims infringed by Covered Software in the absence of its
+ Contributions.
+
+ This License does not grant any rights in the trademarks, service marks, or
+ logos of any Contributor (except as may be necessary to comply with the
+ notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+ No Contributor makes additional grants as a result of Your choice to
+ distribute the Covered Software under a subsequent version of this License
+ (see Section 10.2) or under the terms of a Secondary License (if permitted
+ under the terms of Section 3.3).
+
+2.5. Representation
+
+ Each Contributor represents that the Contributor believes its Contributions
+ are its original creation(s) or it has sufficient rights to grant the
+ rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+ This License is not intended to limit any rights You have under applicable
+ copyright doctrines of fair use, fair dealing, or other equivalents.
+
+2.7. Conditions
+
+ Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+ Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+ All distribution of Covered Software in Source Code Form, including any
+ Modifications that You create or to which You contribute, must be under the
+ terms of this License. You must inform recipients that the Source Code Form
+ of the Covered Software is governed by the terms of this License, and how
+ they can obtain a copy of this License. You may not attempt to alter or
+ restrict the recipients’ rights in the Source Code Form.
+
+3.2. Distribution of Executable Form
+
+ If You distribute Covered Software in Executable Form then:
+
+ a. such Covered Software must also be made available in Source Code Form,
+ as described in Section 3.1, and You must inform recipients of the
+ Executable Form how they can obtain a copy of such Source Code Form by
+ reasonable means in a timely manner, at a charge no more than the cost
+ of distribution to the recipient; and
+
+ b. You may distribute such Executable Form under the terms of this License,
+ or sublicense it under different terms, provided that the license for
+ the Executable Form does not attempt to limit or alter the recipients’
+ rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+ You may create and distribute a Larger Work under terms of Your choice,
+ provided that You also comply with the requirements of this License for the
+ Covered Software. If the Larger Work is a combination of Covered Software
+ with a work governed by one or more Secondary Licenses, and the Covered
+ Software is not Incompatible With Secondary Licenses, this License permits
+ You to additionally distribute such Covered Software under the terms of
+ such Secondary License(s), so that the recipient of the Larger Work may, at
+ their option, further distribute the Covered Software under the terms of
+ either this License or such Secondary License(s).
+
+3.4. Notices
+
+ You may not remove or alter the substance of any license notices (including
+ copyright notices, patent notices, disclaimers of warranty, or limitations
+ of liability) contained within the Source Code Form of the Covered
+ Software, except that You may alter any license notices to the extent
+ required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+ You may choose to offer, and to charge a fee for, warranty, support,
+ indemnity or liability obligations to one or more recipients of Covered
+ Software. However, You may do so only on Your own behalf, and not on behalf
+ of any Contributor. You must make it absolutely clear that any such
+ warranty, support, indemnity, or liability obligation is offered by You
+ alone, and You hereby agree to indemnify every Contributor for any
+ liability incurred by such Contributor as a result of warranty, support,
+ indemnity or liability terms You offer. You may include additional
+ disclaimers of warranty and limitations of liability specific to any
+ jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+ If it is impossible for You to comply with any of the terms of this License
+ with respect to some or all of the Covered Software due to statute, judicial
+ order, or regulation then You must: (a) comply with the terms of this License
+ to the maximum extent possible; and (b) describe the limitations and the code
+ they affect. Such description must be placed in a text file included with all
+ distributions of the Covered Software under this License. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+ fail to comply with any of its terms. However, if You become compliant,
+ then the rights granted under this License from a particular Contributor
+ are reinstated (a) provisionally, unless and until such Contributor
+ explicitly and finally terminates Your grants, and (b) on an ongoing basis,
+ if such Contributor fails to notify You of the non-compliance by some
+ reasonable means prior to 60 days after You have come back into compliance.
+ Moreover, Your grants from a particular Contributor are reinstated on an
+ ongoing basis if such Contributor notifies You of the non-compliance by
+ some reasonable means, this is the first time You have received notice of
+ non-compliance with this License from such Contributor, and You become
+ compliant prior to 30 days after Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+ infringement claim (excluding declaratory judgment actions, counter-claims,
+ and cross-claims) alleging that a Contributor Version directly or
+ indirectly infringes any patent, then the rights granted to You by any and
+ all Contributors for the Covered Software under Section 2.1 of this License
+ shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+ license agreements (excluding distributors and resellers) which have been
+ validly granted by You or Your distributors under this License prior to
+ termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+ Covered Software is provided under this License on an “as is” basis, without
+ warranty of any kind, either expressed, implied, or statutory, including,
+ without limitation, warranties that the Covered Software is free of defects,
+ merchantable, fit for a particular purpose or non-infringing. The entire
+ risk as to the quality and performance of the Covered Software is with You.
+ Should any Covered Software prove defective in any respect, You (not any
+ Contributor) assume the cost of any necessary servicing, repair, or
+ correction. This disclaimer of warranty constitutes an essential part of this
+ License. No use of any Covered Software is authorized under this License
+ except under this disclaimer.
+
+7. Limitation of Liability
+
+ Under no circumstances and under no legal theory, whether tort (including
+ negligence), contract, or otherwise, shall any Contributor, or anyone who
+ distributes Covered Software as permitted above, be liable to You for any
+ direct, indirect, special, incidental, or consequential damages of any
+ character including, without limitation, damages for lost profits, loss of
+ goodwill, work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses, even if such party shall have been
+ informed of the possibility of such damages. This limitation of liability
+ shall not apply to liability for death or personal injury resulting from such
+ party’s negligence to the extent applicable law prohibits such limitation.
+ Some jurisdictions do not allow the exclusion or limitation of incidental or
+ consequential damages, so this exclusion and limitation may not apply to You.
+
+8. Litigation
+
+ Any litigation relating to this License may be brought only in the courts of
+ a jurisdiction where the defendant maintains its principal place of business
+ and such litigation shall be governed by laws of that jurisdiction, without
+ reference to its conflict-of-law provisions. Nothing in this Section shall
+ prevent a party’s ability to bring cross-claims or counter-claims.
+
+9. Miscellaneous
+
+ This License represents the complete agreement concerning the subject matter
+ hereof. If any provision of this License is held to be unenforceable, such
+ provision shall be reformed only to the extent necessary to make it
+ enforceable. Any law or regulation which provides that the language of a
+ contract shall be construed against the drafter shall not be used to construe
+ this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+ Mozilla Foundation is the license steward. Except as provided in Section
+ 10.3, no one other than the license steward has the right to modify or
+ publish new versions of this License. Each version will be given a
+ distinguishing version number.
+
+10.2. Effect of New Versions
+
+ You may distribute the Covered Software under the terms of the version of
+ the License under which You originally received the Covered Software, or
+ under the terms of any subsequent version published by the license
+ steward.
+
+10.3. Modified Versions
+
+ If you create software not governed by this License, and you want to
+ create a new license for such software, you may create and use a modified
+ version of this License if you rename the license and remove any
+ references to the name of the license steward (except to note that such
+ modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+ If You choose to distribute Source Code Form that is Incompatible With
+ Secondary Licenses under the terms of this version of the License, the
+ notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+
+ This Source Code Form is subject to the
+ terms of the Mozilla Public License, v.
+ 2.0. If a copy of the MPL was not
+ distributed with this file, You can
+ obtain one at
+ http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file, then
+You may include the notice in a location (such as a LICENSE file in a relevant
+directory) where a recipient would be likely to look for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+ This Source Code Form is “Incompatible
+ With Secondary Licenses”, as defined by
+ the Mozilla Public License, v. 2.0.
+
diff --git a/vendor/github.com/mitchellh/cli/README.md b/vendor/github.com/mitchellh/cli/README.md
new file mode 100644
index 000000000..60d46045d
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/README.md
@@ -0,0 +1,56 @@
+# Go CLI Library [](https://godoc.org/github.com/mitchellh/cli)
+
+cli is a library for implementing powerful command-line interfaces in Go.
+cli is the library that powers the CLI for
+[Packer](https://github.com/mitchellh/packer),
+[Serf](https://github.com/hashicorp/serf), and
+[Consul](https://github.com/hashicorp/consul).
+
+## Features
+
+* Easy sub-command based CLIs: `cli foo`, `cli bar`, etc.
+
+* Automatic help generation for listing subcommands
+
+* Automatic help flag recognition of `-h`, `--help`, etc.
+
+* Automatic version flag recognition of `-v`, `--version`.
+
+* Helpers for interacting with the terminal, such as outputting information,
+ asking for input, etc. These are optional, you can always interact with the
+ terminal however you choose.
+
+* Use of Go interfaces/types makes augmenting various parts of the library a
+ piece of cake.
+
+## Example
+
+Below is a simple example of creating and running a CLI
+
+```go
+package main
+
+import (
+ "log"
+ "os"
+
+ "github.com/mitchellh/cli"
+)
+
+func main() {
+ c := cli.NewCLI("app", "1.0.0")
+ c.Args = os.Args[1:]
+ c.Commands = map[string]cli.CommandFactory{
+ "foo": fooCommandFactory,
+ "bar": barCommandFactory,
+ }
+
+ exitStatus, err := c.Run()
+ if err != nil {
+ log.Println(err)
+ }
+
+ os.Exit(exitStatus)
+}
+```
+
diff --git a/vendor/github.com/mitchellh/cli/cli.go b/vendor/github.com/mitchellh/cli/cli.go
new file mode 100644
index 000000000..6cb43a3c2
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/cli.go
@@ -0,0 +1,157 @@
+package cli
+
+import (
+ "io"
+ "os"
+ "sync"
+)
+
+// CLI contains the state necessary to run subcommands and parse the
+// command line arguments.
+type CLI struct {
+ // Args is the list of command-line arguments received excluding
+ // the name of the app. For example, if the command "./cli foo bar"
+ // was invoked, then Args should be []string{"foo", "bar"}.
+ Args []string
+
+ // Commands is a mapping of subcommand names to a factory function
+ // for creating that Command implementation.
+ Commands map[string]CommandFactory
+
+ // Name defines the name of the CLI.
+ Name string
+
+ // Version of the CLI.
+ Version string
+
+ // HelpFunc and HelpWriter are used to output help information, if
+ // requested.
+ //
+ // HelpFunc is the function called to generate the generic help
+ // text that is shown if help must be shown for the CLI that doesn't
+ // pertain to a specific command.
+ //
+ // HelpWriter is the Writer where the help text is outputted to. If
+ // not specified, it will default to Stderr.
+ HelpFunc HelpFunc
+ HelpWriter io.Writer
+
+ once sync.Once
+ isHelp bool
+ subcommand string
+ subcommandArgs []string
+
+ isVersion bool
+}
+
+// NewClI returns a new CLI instance with sensible defaults.
+func NewCLI(app, version string) *CLI {
+ return &CLI{
+ Name: app,
+ Version: version,
+ HelpFunc: BasicHelpFunc(app),
+ }
+
+}
+
+// IsHelp returns whether or not the help flag is present within the
+// arguments.
+func (c *CLI) IsHelp() bool {
+ c.once.Do(c.init)
+ return c.isHelp
+}
+
+// IsVersion returns whether or not the version flag is present within the
+// arguments.
+func (c *CLI) IsVersion() bool {
+ c.once.Do(c.init)
+ return c.isVersion
+}
+
+// Run runs the actual CLI based on the arguments given.
+func (c *CLI) Run() (int, error) {
+ c.once.Do(c.init)
+
+ // Just show the version and exit if instructed.
+ if c.IsVersion() && c.Version != "" {
+ c.HelpWriter.Write([]byte(c.Version + "\n"))
+ return 1, nil
+ }
+
+ // Attempt to get the factory function for creating the command
+ // implementation. If the command is invalid or blank, it is an error.
+ commandFunc, ok := c.Commands[c.Subcommand()]
+ if !ok || c.Subcommand() == "" {
+ c.HelpWriter.Write([]byte(c.HelpFunc(c.Commands) + "\n"))
+ return 1, nil
+ }
+
+ command, err := commandFunc()
+ if err != nil {
+ return 0, err
+ }
+
+ // If we've been instructed to just print the help, then print it
+ if c.IsHelp() {
+ c.HelpWriter.Write([]byte(command.Help() + "\n"))
+ return 1, nil
+ }
+
+ return command.Run(c.SubcommandArgs()), nil
+}
+
+// Subcommand returns the subcommand that the CLI would execute. For
+// example, a CLI from "--version version --help" would return a Subcommand
+// of "version"
+func (c *CLI) Subcommand() string {
+ c.once.Do(c.init)
+ return c.subcommand
+}
+
+// SubcommandArgs returns the arguments that will be passed to the
+// subcommand.
+func (c *CLI) SubcommandArgs() []string {
+ c.once.Do(c.init)
+ return c.subcommandArgs
+}
+
+func (c *CLI) init() {
+ if c.HelpFunc == nil {
+ c.HelpFunc = BasicHelpFunc("app")
+
+ if c.Name != "" {
+ c.HelpFunc = BasicHelpFunc(c.Name)
+ }
+ }
+
+ if c.HelpWriter == nil {
+ c.HelpWriter = os.Stderr
+ }
+
+ c.processArgs()
+}
+
+func (c *CLI) processArgs() {
+ for i, arg := range c.Args {
+ // If the arg is a help flag, then we saw that, but don't save it.
+ if arg == "-h" || arg == "-help" || arg == "--help" {
+ c.isHelp = true
+ continue
+ }
+
+ // Also lookup for version flag
+ if arg == "-v" || arg == "-version" || arg == "--version" {
+ c.isVersion = true
+ continue
+ }
+
+ // If we didn't find a subcommand yet and this is the first non-flag
+ // argument, then this is our subcommand. j
+ if c.subcommand == "" && arg[0] != '-' {
+ c.subcommand = arg
+
+ // The remaining args the subcommand arguments
+ c.subcommandArgs = c.Args[i+1:]
+ }
+ }
+}
diff --git a/vendor/github.com/mitchellh/cli/cli_test.go b/vendor/github.com/mitchellh/cli/cli_test.go
new file mode 100644
index 000000000..23323173b
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/cli_test.go
@@ -0,0 +1,177 @@
+package cli
+
+import (
+ "bytes"
+ "reflect"
+ "testing"
+)
+
+func TestCLIIsHelp(t *testing.T) {
+ testCases := []struct {
+ args []string
+ isHelp bool
+ }{
+ {[]string{"foo", "-h"}, true},
+ {[]string{"foo", "-help"}, true},
+ {[]string{"foo", "--help"}, true},
+ {[]string{"foo", "-h", "bar"}, true},
+ {[]string{"foo", "bar"}, false},
+ {[]string{"-h", "bar"}, true},
+ }
+
+ for _, testCase := range testCases {
+ cli := &CLI{Args: testCase.args}
+ result := cli.IsHelp()
+
+ if result != testCase.isHelp {
+ t.Errorf("Expected '%#v'. Args: %#v", testCase.isHelp, testCase.args)
+ }
+ }
+}
+
+func TestCLIIsVersion(t *testing.T) {
+ testCases := []struct {
+ args []string
+ isVersion bool
+ }{
+ {[]string{"foo", "-v"}, true},
+ {[]string{"foo", "-version"}, true},
+ {[]string{"foo", "--version"}, true},
+ {[]string{"foo", "-v", "bar"}, true},
+ {[]string{"foo", "bar"}, false},
+ {[]string{"-h", "bar"}, false},
+ }
+
+ for _, testCase := range testCases {
+ cli := &CLI{Args: testCase.args}
+ result := cli.IsVersion()
+
+ if result != testCase.isVersion {
+ t.Errorf("Expected '%#v'. Args: %#v", testCase.isVersion, testCase.args)
+ }
+ }
+}
+
+func TestCLIRun(t *testing.T) {
+ command := new(MockCommand)
+ cli := &CLI{
+ Args: []string{"foo", "-bar", "-baz"},
+ Commands: map[string]CommandFactory{
+ "foo": func() (Command, error) {
+ return command, nil
+ },
+ },
+ }
+
+ exitCode, err := cli.Run()
+ if err != nil {
+ t.Fatalf("err: %s", err)
+ }
+
+ if exitCode != command.RunResult {
+ t.Fatalf("bad: %d", exitCode)
+ }
+
+ if !command.RunCalled {
+ t.Fatalf("run should be called")
+ }
+
+ if !reflect.DeepEqual(command.RunArgs, []string{"-bar", "-baz"}) {
+ t.Fatalf("bad args: %#v", command.RunArgs)
+ }
+}
+
+func TestCLIRun_printHelp(t *testing.T) {
+ testCases := [][]string{
+ {},
+ {"-h"},
+ {"i-dont-exist"},
+ }
+
+ for _, testCase := range testCases {
+ buf := new(bytes.Buffer)
+ helpText := "foo"
+
+ cli := &CLI{
+ Args: testCase,
+ HelpFunc: func(map[string]CommandFactory) string {
+ return helpText
+ },
+ HelpWriter: buf,
+ }
+
+ code, err := cli.Run()
+ if err != nil {
+ t.Errorf("Args: %#v. Error: %s", testCase, err)
+ continue
+ }
+
+ if code != 1 {
+ t.Errorf("Args: %#v. Code: %d", testCase, code)
+ continue
+ }
+
+ if buf.String() != (helpText + "\n") {
+ t.Errorf("Args: %#v. Text: %v", testCase, buf.String())
+ }
+ }
+}
+
+func TestCLIRun_printCommandHelp(t *testing.T) {
+ testCases := [][]string{
+ {"foo", "-h"},
+ {"-h", "foo"},
+ {"foo", "--help"},
+ }
+
+ for _, args := range testCases {
+ command := &MockCommand{
+ HelpText: "donuts",
+ }
+
+ buf := new(bytes.Buffer)
+ cli := &CLI{
+ Args: args,
+ Commands: map[string]CommandFactory{
+ "foo": func() (Command, error) {
+ return command, nil
+ },
+ },
+ HelpWriter: buf,
+ }
+
+ exitCode, err := cli.Run()
+ if err != nil {
+ t.Fatalf("err: %s", err)
+ }
+
+ if exitCode != 1 {
+ t.Fatalf("bad exit code: %d", exitCode)
+ }
+
+ if buf.String() != (command.HelpText + "\n") {
+ t.Fatalf("bad: %#v", buf.String())
+ }
+ }
+}
+
+func TestCLISubcommand(t *testing.T) {
+ testCases := []struct {
+ args []string
+ subcommand string
+ }{
+ {[]string{"bar"}, "bar"},
+ {[]string{"foo", "-h"}, "foo"},
+ {[]string{"-h", "bar"}, "bar"},
+ }
+
+ for _, testCase := range testCases {
+ cli := &CLI{Args: testCase.args}
+ result := cli.Subcommand()
+
+ if result != testCase.subcommand {
+ t.Errorf("Expected %#v, got %#v. Args: %#v",
+ testCase.subcommand, result, testCase.args)
+ }
+ }
+}
diff --git a/vendor/github.com/mitchellh/cli/command.go b/vendor/github.com/mitchellh/cli/command.go
new file mode 100644
index 000000000..b18d3efc6
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/command.go
@@ -0,0 +1,23 @@
+package cli
+
+// A command is a runnable sub-command of a CLI.
+type Command interface {
+ // Help should return long-form help text that includes the command-line
+ // usage, a brief few sentences explaining the function of the command,
+ // and the complete list of flags the command accepts.
+ Help() string
+
+ // Run should run the actual command with the given CLI instance and
+ // command-line arguments. It should return the exit status when it is
+ // finished.
+ Run(args []string) int
+
+ // Synopsis should return a one-line, short synopsis of the command.
+ // This should be less than 50 characters ideally.
+ Synopsis() string
+}
+
+// CommandFactory is a type of function that is a factory for commands.
+// We need a factory because we may need to setup some state on the
+// struct that implements the command itself.
+type CommandFactory func() (Command, error)
diff --git a/vendor/github.com/mitchellh/cli/command_mock.go b/vendor/github.com/mitchellh/cli/command_mock.go
new file mode 100644
index 000000000..cc6e5d1ea
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/command_mock.go
@@ -0,0 +1,30 @@
+package cli
+
+// MockCommand is an implementation of Command that can be used for tests.
+// It is publicly exported from this package in case you want to use it
+// externally.
+type MockCommand struct {
+ // Settable
+ HelpText string
+ RunResult int
+ SynopsisText string
+
+ // Set by the command
+ RunCalled bool
+ RunArgs []string
+}
+
+func (c *MockCommand) Help() string {
+ return c.HelpText
+}
+
+func (c *MockCommand) Run(args []string) int {
+ c.RunCalled = true
+ c.RunArgs = args
+
+ return c.RunResult
+}
+
+func (c *MockCommand) Synopsis() string {
+ return c.SynopsisText
+}
diff --git a/vendor/github.com/mitchellh/cli/command_mock_test.go b/vendor/github.com/mitchellh/cli/command_mock_test.go
new file mode 100644
index 000000000..241f33939
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/command_mock_test.go
@@ -0,0 +1,9 @@
+package cli
+
+import (
+ "testing"
+)
+
+func TestMockCommand_implements(t *testing.T) {
+ var _ Command = new(MockCommand)
+}
diff --git a/vendor/github.com/mitchellh/cli/help.go b/vendor/github.com/mitchellh/cli/help.go
new file mode 100644
index 000000000..cdf724ca5
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/help.go
@@ -0,0 +1,59 @@
+package cli
+
+import (
+ "bytes"
+ "fmt"
+ "log"
+ "sort"
+ "strings"
+)
+
+// HelpFunc is the type of the function that is responsible for generating
+// the help output when the CLI must show the general help text.
+type HelpFunc func(map[string]CommandFactory) string
+
+// BasicHelpFunc generates some basic help output that is usually good enough
+// for most CLI applications.
+func BasicHelpFunc(app string) HelpFunc {
+ return func(commands map[string]CommandFactory) string {
+ var buf bytes.Buffer
+ buf.WriteString(fmt.Sprintf(
+ "usage: %s [--version] [--help] []\n\n",
+ app))
+ buf.WriteString("Available commands are:\n")
+
+ // Get the list of keys so we can sort them, and also get the maximum
+ // key length so they can be aligned properly.
+ keys := make([]string, 0, len(commands))
+ maxKeyLen := 0
+ for key, _ := range commands {
+ if len(key) > maxKeyLen {
+ maxKeyLen = len(key)
+ }
+
+ keys = append(keys, key)
+ }
+ sort.Strings(keys)
+
+ for _, key := range keys {
+ commandFunc, ok := commands[key]
+ if !ok {
+ // This should never happen since we JUST built the list of
+ // keys.
+ panic("command not found: " + key)
+ }
+
+ command, err := commandFunc()
+ if err != nil {
+ log.Printf("[ERR] cli: Command '%s' failed to load: %s",
+ key, err)
+ continue
+ }
+
+ key = fmt.Sprintf("%s%s", key, strings.Repeat(" ", maxKeyLen-len(key)))
+ buf.WriteString(fmt.Sprintf(" %s %s\n", key, command.Synopsis()))
+ }
+
+ return buf.String()
+ }
+}
diff --git a/vendor/github.com/mitchellh/cli/ui.go b/vendor/github.com/mitchellh/cli/ui.go
new file mode 100644
index 000000000..5a8f151e6
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui.go
@@ -0,0 +1,140 @@
+package cli
+
+import (
+ "bufio"
+ "errors"
+ "fmt"
+ "io"
+ "os"
+ "os/signal"
+ "strings"
+)
+
+// Ui is an interface for interacting with the terminal, or "interface"
+// of a CLI. This abstraction doesn't have to be used, but helps provide
+// a simple, layerable way to manage user interactions.
+type Ui interface {
+ // Ask asks the user for input using the given query. The response is
+ // returned as the given string, or an error.
+ Ask(string) (string, error)
+
+ // Output is called for normal standard output.
+ Output(string)
+
+ // Info is called for information related to the previous output.
+ // In general this may be the exact same as Output, but this gives
+ // Ui implementors some flexibility with output formats.
+ Info(string)
+
+ // Error is used for any error messages that might appear on standard
+ // error.
+ Error(string)
+}
+
+// BasicUi is an implementation of Ui that just outputs to the given
+// writer. This UI is not threadsafe by default, but you can wrap it
+// in a ConcurrentUi to make it safe.
+type BasicUi struct {
+ Reader io.Reader
+ Writer io.Writer
+ ErrorWriter io.Writer
+}
+
+func (u *BasicUi) Ask(query string) (string, error) {
+ if _, err := fmt.Fprint(u.Writer, query+" "); err != nil {
+ return "", err
+ }
+
+ // Register for interrupts so that we can catch it and immediately
+ // return...
+ sigCh := make(chan os.Signal, 1)
+ signal.Notify(sigCh, os.Interrupt)
+ defer signal.Stop(sigCh)
+
+ // Ask for input in a go-routine so that we can ignore it.
+ errCh := make(chan error, 1)
+ lineCh := make(chan string, 1)
+ go func() {
+ r := bufio.NewReader(u.Reader)
+ line, err := r.ReadString('\n')
+ if err != nil {
+ errCh <- err
+ return
+ }
+
+ lineCh <- strings.TrimRight(line, "\r\n")
+ }()
+
+ select {
+ case err := <-errCh:
+ return "", err
+ case line := <-lineCh:
+ return line, nil
+ case <-sigCh:
+ // Print a newline so that any further output starts properly
+ // on a new line.
+ fmt.Fprintln(u.Writer)
+
+ return "", errors.New("interrupted")
+ }
+}
+
+func (u *BasicUi) Error(message string) {
+ w := u.Writer
+ if u.ErrorWriter != nil {
+ w = u.ErrorWriter
+ }
+
+ fmt.Fprint(w, message)
+ fmt.Fprint(w, "\n")
+}
+
+func (u *BasicUi) Info(message string) {
+ u.Output(message)
+}
+
+func (u *BasicUi) Output(message string) {
+ fmt.Fprint(u.Writer, message)
+ fmt.Fprint(u.Writer, "\n")
+}
+
+// PrefixedUi is an implementation of Ui that prefixes messages.
+type PrefixedUi struct {
+ AskPrefix string
+ OutputPrefix string
+ InfoPrefix string
+ ErrorPrefix string
+ Ui Ui
+}
+
+func (u *PrefixedUi) Ask(query string) (string, error) {
+ if query != "" {
+ query = fmt.Sprintf("%s%s", u.AskPrefix, query)
+ }
+
+ return u.Ui.Ask(query)
+}
+
+func (u *PrefixedUi) Error(message string) {
+ if message != "" {
+ message = fmt.Sprintf("%s%s", u.ErrorPrefix, message)
+ }
+
+ u.Ui.Error(message)
+}
+
+func (u *PrefixedUi) Info(message string) {
+ if message != "" {
+ message = fmt.Sprintf("%s%s", u.InfoPrefix, message)
+ }
+
+ u.Ui.Info(message)
+}
+
+func (u *PrefixedUi) Output(message string) {
+ if message != "" {
+ message = fmt.Sprintf("%s%s", u.OutputPrefix, message)
+ }
+
+ u.Ui.Output(message)
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_colored.go b/vendor/github.com/mitchellh/cli/ui_colored.go
new file mode 100644
index 000000000..ca8b4c303
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_colored.go
@@ -0,0 +1,60 @@
+package cli
+
+import (
+ "fmt"
+)
+
+// UiColor is a posix shell color code to use.
+type UiColor struct {
+ Code int
+ Bold bool
+}
+
+// A list of colors that are useful. These are all non-bolded by default.
+var (
+ UiColorNone UiColor = UiColor{-1, false}
+ UiColorRed = UiColor{31, false}
+ UiColorGreen = UiColor{32, false}
+ UiColorYellow = UiColor{33, false}
+ UiColorBlue = UiColor{34, false}
+ UiColorMagenta = UiColor{35, false}
+ UiColorCyan = UiColor{36, false}
+)
+
+// ColoredUi is a Ui implementation that colors its output according
+// to the given color schemes for the given type of output.
+type ColoredUi struct {
+ OutputColor UiColor
+ InfoColor UiColor
+ ErrorColor UiColor
+ Ui Ui
+}
+
+func (u *ColoredUi) Ask(query string) (string, error) {
+ return u.Ui.Ask(u.colorize(query, u.OutputColor))
+}
+
+func (u *ColoredUi) Output(message string) {
+ u.Ui.Output(u.colorize(message, u.OutputColor))
+}
+
+func (u *ColoredUi) Info(message string) {
+ u.Ui.Info(u.colorize(message, u.InfoColor))
+}
+
+func (u *ColoredUi) Error(message string) {
+ u.Ui.Error(u.colorize(message, u.ErrorColor))
+}
+
+func (u *ColoredUi) colorize(message string, color UiColor) string {
+ if color.Code == -1 {
+ return message
+ }
+
+ attr := 0
+ if color.Bold {
+ attr = 1
+ }
+
+ return fmt.Sprintf("\033[%d;%dm%s\033[0m", attr, color.Code, message)
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_colored_test.go b/vendor/github.com/mitchellh/cli/ui_colored_test.go
new file mode 100644
index 000000000..ee6532b70
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_colored_test.go
@@ -0,0 +1,61 @@
+package cli
+
+import (
+ "testing"
+)
+
+func TestColoredUi_impl(t *testing.T) {
+ var _ Ui = new(ColoredUi)
+}
+
+func TestColoredUi_noColor(t *testing.T) {
+ mock := new(MockUi)
+ ui := &ColoredUi{
+ ErrorColor: UiColorNone,
+ Ui: mock,
+ }
+ ui.Error("foo")
+
+ if mock.ErrorWriter.String() != "foo\n" {
+ t.Fatalf("bad: %#v", mock.ErrorWriter.String())
+ }
+}
+
+func TestColoredUi_Error(t *testing.T) {
+ mock := new(MockUi)
+ ui := &ColoredUi{
+ ErrorColor: UiColor{Code: 33},
+ Ui: mock,
+ }
+ ui.Error("foo")
+
+ if mock.ErrorWriter.String() != "\033[0;33mfoo\033[0m\n" {
+ t.Fatalf("bad: %#v", mock.ErrorWriter.String())
+ }
+}
+
+func TestColoredUi_Info(t *testing.T) {
+ mock := new(MockUi)
+ ui := &ColoredUi{
+ InfoColor: UiColor{Code: 33},
+ Ui: mock,
+ }
+ ui.Info("foo")
+
+ if mock.OutputWriter.String() != "\033[0;33mfoo\033[0m\n" {
+ t.Fatalf("bad: %#v %#v", mock.OutputWriter.String())
+ }
+}
+
+func TestColoredUi_Output(t *testing.T) {
+ mock := new(MockUi)
+ ui := &ColoredUi{
+ OutputColor: UiColor{Code: 33},
+ Ui: mock,
+ }
+ ui.Output("foo")
+
+ if mock.OutputWriter.String() != "\033[0;33mfoo\033[0m\n" {
+ t.Fatalf("bad: %#v %#v", mock.OutputWriter.String())
+ }
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_concurrent.go b/vendor/github.com/mitchellh/cli/ui_concurrent.go
new file mode 100644
index 000000000..b3f09d9ed
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_concurrent.go
@@ -0,0 +1,40 @@
+package cli
+
+import (
+ "sync"
+)
+
+// ConcurrentUi is a wrapper around a Ui interface (and implements that
+// interface) making the underlying Ui concurrency safe.
+type ConcurrentUi struct {
+ Ui Ui
+ l sync.Mutex
+}
+
+func (u *ConcurrentUi) Ask(query string) (string, error) {
+ u.l.Lock()
+ defer u.l.Unlock()
+
+ return u.Ui.Ask(query)
+}
+
+func (u *ConcurrentUi) Error(message string) {
+ u.l.Lock()
+ defer u.l.Unlock()
+
+ u.Ui.Error(message)
+}
+
+func (u *ConcurrentUi) Info(message string) {
+ u.l.Lock()
+ defer u.l.Unlock()
+
+ u.Ui.Info(message)
+}
+
+func (u *ConcurrentUi) Output(message string) {
+ u.l.Lock()
+ defer u.l.Unlock()
+
+ u.Ui.Output(message)
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_concurrent_test.go b/vendor/github.com/mitchellh/cli/ui_concurrent_test.go
new file mode 100644
index 000000000..d03e49809
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_concurrent_test.go
@@ -0,0 +1,9 @@
+package cli
+
+import (
+ "testing"
+)
+
+func TestConcurrentUi_impl(t *testing.T) {
+ var _ Ui = new(ConcurrentUi)
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_mock.go b/vendor/github.com/mitchellh/cli/ui_mock.go
new file mode 100644
index 000000000..b9dedd779
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_mock.go
@@ -0,0 +1,53 @@
+package cli
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "sync"
+)
+
+// MockUi is a mock UI that is used for tests and is exported publicly for
+// use in external tests if needed as well.
+type MockUi struct {
+ InputReader io.Reader
+ ErrorWriter *bytes.Buffer
+ OutputWriter *bytes.Buffer
+
+ once sync.Once
+}
+
+func (u *MockUi) Ask(query string) (string, error) {
+ u.once.Do(u.init)
+
+ var result string
+ fmt.Fprint(u.OutputWriter, query)
+ if _, err := fmt.Fscanln(u.InputReader, &result); err != nil {
+ return "", err
+ }
+
+ return result, nil
+}
+
+func (u *MockUi) Error(message string) {
+ u.once.Do(u.init)
+
+ fmt.Fprint(u.ErrorWriter, message)
+ fmt.Fprint(u.ErrorWriter, "\n")
+}
+
+func (u *MockUi) Info(message string) {
+ u.Output(message)
+}
+
+func (u *MockUi) Output(message string) {
+ u.once.Do(u.init)
+
+ fmt.Fprint(u.OutputWriter, message)
+ fmt.Fprint(u.OutputWriter, "\n")
+}
+
+func (u *MockUi) init() {
+ u.ErrorWriter = new(bytes.Buffer)
+ u.OutputWriter = new(bytes.Buffer)
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_mock_test.go b/vendor/github.com/mitchellh/cli/ui_mock_test.go
new file mode 100644
index 000000000..4cce0bef4
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_mock_test.go
@@ -0,0 +1,9 @@
+package cli
+
+import (
+ "testing"
+)
+
+func TestMockUi_implements(t *testing.T) {
+ var _ Ui = new(MockUi)
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_test.go b/vendor/github.com/mitchellh/cli/ui_test.go
new file mode 100644
index 000000000..109b56a80
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_test.go
@@ -0,0 +1,112 @@
+package cli
+
+import (
+ "bytes"
+ "io"
+ "testing"
+)
+
+func TestBasicUi_implements(t *testing.T) {
+ var _ Ui = new(BasicUi)
+}
+
+func TestBasicUi_Ask(t *testing.T) {
+ in_r, in_w := io.Pipe()
+ defer in_r.Close()
+ defer in_w.Close()
+
+ writer := new(bytes.Buffer)
+ ui := &BasicUi{
+ Reader: in_r,
+ Writer: writer,
+ }
+
+ go in_w.Write([]byte("foo bar\nbaz\n"))
+
+ result, err := ui.Ask("Name?")
+ if err != nil {
+ t.Fatalf("err: %s", err)
+ }
+
+ if writer.String() != "Name? " {
+ t.Fatalf("bad: %#v", writer.String())
+ }
+
+ if result != "foo bar" {
+ t.Fatalf("bad: %#v", result)
+ }
+}
+
+func TestBasicUi_Error(t *testing.T) {
+ writer := new(bytes.Buffer)
+ ui := &BasicUi{Writer: writer}
+ ui.Error("HELLO")
+
+ if writer.String() != "HELLO\n" {
+ t.Fatalf("bad: %s", writer.String())
+ }
+}
+
+func TestBasicUi_Error_ErrorWriter(t *testing.T) {
+ writer := new(bytes.Buffer)
+ ewriter := new(bytes.Buffer)
+ ui := &BasicUi{Writer: writer, ErrorWriter: ewriter}
+ ui.Error("HELLO")
+
+ if ewriter.String() != "HELLO\n" {
+ t.Fatalf("bad: %s", ewriter.String())
+ }
+}
+
+func TestBasicUi_Output(t *testing.T) {
+ writer := new(bytes.Buffer)
+ ui := &BasicUi{Writer: writer}
+ ui.Output("HELLO")
+
+ if writer.String() != "HELLO\n" {
+ t.Fatalf("bad: %s", writer.String())
+ }
+}
+
+func TestPrefixedUi_implements(t *testing.T) {
+ var _ Ui = new(PrefixedUi)
+}
+
+func TestPrefixedUiError(t *testing.T) {
+ ui := new(MockUi)
+ p := &PrefixedUi{
+ ErrorPrefix: "foo",
+ Ui: ui,
+ }
+
+ p.Error("bar")
+ if ui.ErrorWriter.String() != "foobar\n" {
+ t.Fatalf("bad: %s", ui.ErrorWriter.String())
+ }
+}
+
+func TestPrefixedUiInfo(t *testing.T) {
+ ui := new(MockUi)
+ p := &PrefixedUi{
+ InfoPrefix: "foo",
+ Ui: ui,
+ }
+
+ p.Info("bar")
+ if ui.OutputWriter.String() != "foobar\n" {
+ t.Fatalf("bad: %s", ui.OutputWriter.String())
+ }
+}
+
+func TestPrefixedUiOutput(t *testing.T) {
+ ui := new(MockUi)
+ p := &PrefixedUi{
+ OutputPrefix: "foo",
+ Ui: ui,
+ }
+
+ p.Output("bar")
+ if ui.OutputWriter.String() != "foobar\n" {
+ t.Fatalf("bad: %s", ui.OutputWriter.String())
+ }
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_writer.go b/vendor/github.com/mitchellh/cli/ui_writer.go
new file mode 100644
index 000000000..f4583cb22
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_writer.go
@@ -0,0 +1,18 @@
+package cli
+
+// UiWriter is an io.Writer implementation that can be used with
+// loggers that writes every line of log output data to a Ui at the
+// Info level.
+type UiWriter struct {
+ Ui Ui
+}
+
+func (w *UiWriter) Write(p []byte) (n int, err error) {
+ n = len(p)
+ if p[n-1] == '\n' {
+ p = p[:n-1]
+ }
+
+ w.Ui.Info(string(p))
+ return n, nil
+}
diff --git a/vendor/github.com/mitchellh/cli/ui_writer_test.go b/vendor/github.com/mitchellh/cli/ui_writer_test.go
new file mode 100644
index 000000000..62da6e3a9
--- /dev/null
+++ b/vendor/github.com/mitchellh/cli/ui_writer_test.go
@@ -0,0 +1,24 @@
+package cli
+
+import (
+ "io"
+ "testing"
+)
+
+func TestUiWriter_impl(t *testing.T) {
+ var _ io.Writer = new(UiWriter)
+}
+
+func TestUiWriter(t *testing.T) {
+ ui := new(MockUi)
+ w := &UiWriter{
+ Ui: ui,
+ }
+
+ w.Write([]byte("foo\n"))
+ w.Write([]byte("bar\n"))
+
+ if ui.OutputWriter.String() != "foo\nbar\n" {
+ t.Fatalf("bad: %s", ui.OutputWriter.String())
+ }
+}
diff --git a/vendor/github.com/namsral/flag/README.md b/vendor/github.com/namsral/flag/README.md
deleted file mode 100644
index b5f6f8272..000000000
--- a/vendor/github.com/namsral/flag/README.md
+++ /dev/null
@@ -1,184 +0,0 @@
-Flag
-===
-
-Flag is a drop in replacement for Go's flag package with the addition to parse files and environment variables. If you support the [twelve-factor app methodology][], Flag complies with the third factor; "Store config in the environment".
-
-[twelve-factor app methodology]: http://12factor.net
-
-An example using a gopher:
-
-```go
-$ cat > gopher.go
- package main
-
- import (
- "fmt"
- "github.com/namsral/flag"
- )
-
- var age int
-
- flag.IntVar(&age, "age", 0, "age of gopher")
- flag.Parse()
-
- fmt.Print("age:", age)
-
-$ go run gopher.go -age 1
-age: 1
-```
-
-Same code but using an environment variable:
-
-```go
-$ export AGE=2
-$ go run gopher.go
-age: 2
-```
-
-
-Same code but using a configuration file:
-
-```go
-$ cat > gopher.conf
-age 3
-
-$ go run gopher.go -config gopher.conf
-age: 3
-```
-
-The following table shows how flags are translated to environment variables and configuration files:
-
-| Type | Flag | Environment | File |
-| ------ | :------------ |:------------ |:------------ |
-| int | -age 2 | AGE=2 | age 2 |
-| bool | -female | FEMALE=true | female true |
-| float | -length 175.5 | LENGTH=175.5 | length 175.5 |
-| string | -name Gloria | NAME=Gloria | name Gloria |
-
-This package is a port of Go's [flag][] package from the standard library with the addition of two functions `ParseEnv` and `ParseFile`.
-
-[flag]: http://golang.org/src/pkg/flagconfiguration
-
-
-Why?
----
-
-Why not use one of the many INI, JSON or YAML parsers?
-
-I find it best practice to have simple configuration options to control the behaviour of an applications when it starts up. Use basic types like ints, floats and strings for configuration options and store more complex data structures in the "datastore" layer.
-
-
-Usage
----
-
-It's intended for projects which require a simple configuration made available through command-line flags, configuration files and shell environments. It's similar to the original `flag` package.
-
-Example:
-
-```go
-import "github/namsral/flag"
-
-flag.String("config", "", "help message for config")
-flag.Int("age", 24, "help message for age")
-
-flag.Parse()
-```
-
-Order of precedence:
-
-1. Command line options
-2. Environment variables
-3. Configuration file
-4. Default values
-
-
-#### Parsing Configuration Files
-
-Create a configuration file:
-
-```go
-$ cat > ./gopher.conf
-# empty newlines and lines beginning with a "#" character are ignored.
-name bob
-
-# keys and values can also be separated by the "=" character
-age=20
-
-# booleans can be empty, set with 0, 1, true, false, etc
-hacker
-```
-
-Add a "config" flag:
-
-```go
-flag.String("config", "", "help message for config")
-```
-
-Run the command:
-
-```go
-$ go run ./gopher.go -config ./gopher.conf
-```
-
-#### Parsing Environment Variables
-
-Environment variables are parsed 1-on-1 with defined flags:
-
-```go
-$ export AGE=44
-$ go run ./gopher.go
-age=44
-```
-
-
-You can also parse prefixed environment variables by setting a prefix name when creating a new empty flag set:
-
-```go
-fs := flag.NewFlagSetWithEnvPrefix(os.Args[0], "GO", 0)
-fs.Int("age", 24, "help message for age")
-fs.Parse(os.Args[1:])
-...
-$ go export GO_AGE=33
-$ go run ./gopher.go
-age=33
-```
-
-
-For more examples see the [examples][] directory in the project repository.
-
-[examples]: https://github.com/namsral/flag/tree/master/examples
-
-That's it.
-
-
-License
----
-
-
-Copyright (c) 2012 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/namsral/flag/example_test.go b/vendor/github.com/namsral/flag/example_test.go
deleted file mode 100644
index 08273cb5b..000000000
--- a/vendor/github.com/namsral/flag/example_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// These examples demonstrate more intricate uses of the flag package.
-package flag
-
-import (
- "errors"
- "fmt"
- "strings"
- "time"
-)
-
-// Example 1: A single string flag called "species" with default value "gopher".
-var species = String("species", "gopher", "the species we are studying")
-
-// Example 2: Two flags sharing a variable, so we can have a shorthand.
-// The order of initialization is undefined, so make sure both use the
-// same default value. They must be set up with an init function.
-var gopherType string
-
-func init() {
- const (
- defaultGopher = "pocket"
- usage = "the variety of gopher"
- )
- StringVar(&gopherType, "gopher_type", defaultGopher, usage)
- StringVar(&gopherType, "g", defaultGopher, usage+" (shorthand)")
-}
-
-// Example 3: A user-defined flag type, a slice of durations.
-type interval []time.Duration
-
-// String is the method to format the flag's value, part of the Value interface.
-// The String method's output will be used in diagnostics.
-func (i *interval) String() string {
- return fmt.Sprint(*i)
-}
-
-// Set is the method to set the flag value, part of the Value interface.
-// Set's argument is a string to be parsed to set the
-// It's a comma-separated list, so we split it.
-func (i *interval) Set(value string) error {
- // If we wanted to allow the flag to be set multiple times,
- // accumulating values, we would delete this if statement.
- // That would permit usages such as
- // -deltaT 10s -deltaT 15s
- // and other combinations.
- if len(*i) > 0 {
- return errors.New("interval flag already set")
- }
- for _, dt := range strings.Split(value, ",") {
- duration, err := time.ParseDuration(dt)
- if err != nil {
- return err
- }
- *i = append(*i, duration)
- }
- return nil
-}
-
-// Define a flag to accumulate durations. Because it has a special type,
-// we need to use the Var function and therefore create the flag during
-// init.
-
-var intervalFlag interval
-
-func init() {
- // Tie the command-line flag to the intervalFlag variable and
- // set a usage message.
- Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events")
-}
-
-func Example() {
- // All the interesting pieces are with the variables declared above, but
- // to enable the flag package to see the flags defined there, one must
- // execute, typically at the start of main (not init!):
- // flag.Parse()
- // We don't run it here because this is not a main function and
- // the testing suite has already parsed the flags.
-}
diff --git a/vendor/github.com/namsral/flag/examples/gopher.conf b/vendor/github.com/namsral/flag/examples/gopher.conf
deleted file mode 100644
index e0b90045b..000000000
--- a/vendor/github.com/namsral/flag/examples/gopher.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# this is a comment followed by an empty line
-
-length 175.5
-age 2
-name Gloria
\ No newline at end of file
diff --git a/vendor/github.com/namsral/flag/examples/gopher.go b/vendor/github.com/namsral/flag/examples/gopher.go
deleted file mode 100644
index 3541f1491..000000000
--- a/vendor/github.com/namsral/flag/examples/gopher.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package main
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/namsral/flag"
- "fmt"
-)
-
-func main() {
- var (
- config string
- length float64
- age int
- name string
- female bool
- )
-
- flag.StringVar(&config, "config", "", "help message")
- flag.StringVar(&name, "name", "", "help message")
- flag.IntVar(&age, "age", 0, "help message")
- flag.Float64Var(&length, "length", 0, "help message")
- flag.BoolVar(&female, "female", false, "help message")
-
- flag.Parse()
-
- fmt.Println("length:", length)
- fmt.Println("age:", age)
- fmt.Println("name:", name)
- fmt.Println("female:", female)
-}
diff --git a/vendor/github.com/namsral/flag/export_test.go b/vendor/github.com/namsral/flag/export_test.go
deleted file mode 100644
index 82b35ccbf..000000000
--- a/vendor/github.com/namsral/flag/export_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flag
-
-import "os"
-
-// Additional routines compiled into the package only during testing.
-
-// ResetForTesting clears all flag state and sets the usage function as directed.
-// After calling ResetForTesting, parse errors in flag handling will not
-// exit the program.
-func ResetForTesting(usage func()) {
- CommandLine = NewFlagSet(os.Args[0], ContinueOnError)
- Usage = usage
-}
\ No newline at end of file
diff --git a/vendor/github.com/namsral/flag/flag.go b/vendor/github.com/namsral/flag/flag.go
deleted file mode 100644
index 151cae11b..000000000
--- a/vendor/github.com/namsral/flag/flag.go
+++ /dev/null
@@ -1,1040 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*Package flag implements command-line flag parsing.
-
-Usage:
-
-Define flags using flag.String(), Bool(), Int(), etc.
-
-This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
- import "flag"
- var ip = flag.Int("flagname", 1234, "help message for flagname")
-If you like, you can bind the flag to a variable using the Var() functions.
- var flagvar int
- func init() {
- flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
- }
-Or you can create custom flags that satisfy the Value interface (with
-pointer receivers) and couple them to flag parsing by
- flag.Var(&flagVal, "name", "help message for flagname")
-For such flags, the default value is just the initial value of the variable.
-
-After all flags are defined, call
- flag.Parse()
-to parse the command line into the defined flags.
-
-Flags may then be used directly. If you're using the flags themselves,
-they are all pointers; if you bind to variables, they're values.
- fmt.Println("ip has value ", *ip)
- fmt.Println("flagvar has value ", flagvar)
-
-After parsing, the arguments after the flag are available as the
-slice flag.Args() or individually as flag.Arg(i).
-The arguments are indexed from 0 through flag.NArg()-1.
-
-Command line flag syntax:
- -flag
- -flag=x
- -flag x // non-boolean flags only
-One or two minus signs may be used; they are equivalent.
-The last form is not permitted for boolean flags because the
-meaning of the command
- cmd -x *
-will change if there is a file called 0, false, etc. You must
-use the -flag=false form to turn off a boolean flag.
-
-Flag parsing stops just before the first non-flag argument
-("-" is a non-flag argument) or after the terminator "--".
-
-Integer flags accept 1234, 0664, 0x1234 and may be negative.
-Boolean flags may be 1, 0, t, f, true, false, TRUE, FALSE, True, False.
-Duration flags accept any input valid for time.ParseDuration.
-
-The default set of command-line flags is controlled by
-top-level functions. The FlagSet type allows one to define
-independent sets of flags, such as to implement subcommands
-in a command-line interface. The methods of FlagSet are
-analogous to the top-level functions for the command-line
-flag set.
-*/
-package flag
-
-import (
- "bufio"
- "errors"
- "fmt"
- "io"
- "os"
- "sort"
- "strconv"
- "strings"
- "time"
-)
-
-// EnvironmentPrefix defines a string that will be implicitely prefixed to a
-// flag name before looking it up in the environment variables.
-var EnvironmentPrefix = ""
-
-// ErrHelp is the error returned if the flag -help is invoked but no such flag is defined.
-var ErrHelp = errors.New("flag: help requested")
-
-// -- bool Value
-type boolValue bool
-
-func newBoolValue(val bool, p *bool) *boolValue {
- *p = val
- return (*boolValue)(p)
-}
-
-func (b *boolValue) Set(s string) error {
- v, err := strconv.ParseBool(s)
- *b = boolValue(v)
- return err
-}
-
-func (b *boolValue) Get() interface{} { return bool(*b) }
-
-func (b *boolValue) String() string { return fmt.Sprintf("%v", *b) }
-
-func (b *boolValue) IsBoolFlag() bool { return true }
-
-// optional interface to indicate boolean flags that can be
-// supplied without "=value" text
-type boolFlag interface {
- Value
- IsBoolFlag() bool
-}
-
-// -- int Value
-type intValue int
-
-func newIntValue(val int, p *int) *intValue {
- *p = val
- return (*intValue)(p)
-}
-
-func (i *intValue) Set(s string) error {
- v, err := strconv.ParseInt(s, 0, 64)
- *i = intValue(v)
- return err
-}
-
-func (i *intValue) Get() interface{} { return int(*i) }
-
-func (i *intValue) String() string { return fmt.Sprintf("%v", *i) }
-
-// -- int64 Value
-type int64Value int64
-
-func newInt64Value(val int64, p *int64) *int64Value {
- *p = val
- return (*int64Value)(p)
-}
-
-func (i *int64Value) Set(s string) error {
- v, err := strconv.ParseInt(s, 0, 64)
- *i = int64Value(v)
- return err
-}
-
-func (i *int64Value) Get() interface{} { return int64(*i) }
-
-func (i *int64Value) String() string { return fmt.Sprintf("%v", *i) }
-
-// -- uint Value
-type uintValue uint
-
-func newUintValue(val uint, p *uint) *uintValue {
- *p = val
- return (*uintValue)(p)
-}
-
-func (i *uintValue) Set(s string) error {
- v, err := strconv.ParseUint(s, 0, 64)
- *i = uintValue(v)
- return err
-}
-
-func (i *uintValue) Get() interface{} { return uint(*i) }
-
-func (i *uintValue) String() string { return fmt.Sprintf("%v", *i) }
-
-// -- uint64 Value
-type uint64Value uint64
-
-func newUint64Value(val uint64, p *uint64) *uint64Value {
- *p = val
- return (*uint64Value)(p)
-}
-
-func (i *uint64Value) Set(s string) error {
- v, err := strconv.ParseUint(s, 0, 64)
- *i = uint64Value(v)
- return err
-}
-
-func (i *uint64Value) Get() interface{} { return uint64(*i) }
-
-func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) }
-
-// -- string Value
-type stringValue string
-
-func newStringValue(val string, p *string) *stringValue {
- *p = val
- return (*stringValue)(p)
-}
-
-func (s *stringValue) Set(val string) error {
- *s = stringValue(val)
- return nil
-}
-
-func (s *stringValue) Get() interface{} { return string(*s) }
-
-func (s *stringValue) String() string { return fmt.Sprintf("%s", *s) }
-
-// -- float64 Value
-type float64Value float64
-
-func newFloat64Value(val float64, p *float64) *float64Value {
- *p = val
- return (*float64Value)(p)
-}
-
-func (f *float64Value) Set(s string) error {
- v, err := strconv.ParseFloat(s, 64)
- *f = float64Value(v)
- return err
-}
-
-func (f *float64Value) Get() interface{} { return float64(*f) }
-
-func (f *float64Value) String() string { return fmt.Sprintf("%v", *f) }
-
-// -- time.Duration Value
-type durationValue time.Duration
-
-func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
- *p = val
- return (*durationValue)(p)
-}
-
-func (d *durationValue) Set(s string) error {
- v, err := time.ParseDuration(s)
- *d = durationValue(v)
- return err
-}
-
-func (d *durationValue) Get() interface{} { return time.Duration(*d) }
-
-func (d *durationValue) String() string { return (*time.Duration)(d).String() }
-
-// Value is the interface to the dynamic value stored in a flag.
-// (The default value is represented as a string.)
-//
-// If a Value has an IsBoolFlag() bool method returning true,
-// the command-line parser makes -name equivalent to -name=true
-// rather than using the next command-line argument.
-type Value interface {
- String() string
- Set(string) error
-}
-
-// Getter is an interface that allows the contents of a Value to be retrieved.
-// It wraps the Value interface, rather than being part of it, because it
-// appeared after Go 1 and its compatibility rules. All Value types provided
-// by this package satisfy the Getter interface.
-type Getter interface {
- Value
- Get() interface{}
-}
-
-// ErrorHandling defines how to handle flag parsing errors.
-type ErrorHandling int
-
-const (
- ContinueOnError ErrorHandling = iota
- ExitOnError
- PanicOnError
-)
-
-// A FlagSet represents a set of defined flags. The zero value of a FlagSet
-// has no name and has ContinueOnError error handling.
-type FlagSet struct {
- // Usage is the function called when an error occurs while parsing flags.
- // The field is a function (not a method) that may be changed to point to
- // a custom error handler.
- Usage func()
-
- name string
- parsed bool
- actual map[string]*Flag
- formal map[string]*Flag
- envPrefix string // prefix to all env variable names
- args []string // arguments after flags
- exitOnError bool // does the program exit if there's an error?
- errorHandling ErrorHandling
- output io.Writer // nil means stderr; use out() accessor
-}
-
-// A Flag represents the state of a flag.
-type Flag struct {
- Name string // name as it appears on command line
- Usage string // help message
- Value Value // value as set
- DefValue string // default value (as text); for usage message
-}
-
-// sortFlags returns the flags as a slice in lexicographical sorted order.
-func sortFlags(flags map[string]*Flag) []*Flag {
- list := make(sort.StringSlice, len(flags))
- i := 0
- for _, f := range flags {
- list[i] = f.Name
- i++
- }
- list.Sort()
- result := make([]*Flag, len(list))
- for i, name := range list {
- result[i] = flags[name]
- }
- return result
-}
-
-func (f *FlagSet) out() io.Writer {
- if f.output == nil {
- return os.Stderr
- }
- return f.output
-}
-
-// SetOutput sets the destination for usage and error messages.
-// If output is nil, os.Stderr is used.
-func (f *FlagSet) SetOutput(output io.Writer) {
- f.output = output
-}
-
-// VisitAll visits the flags in lexicographical order, calling fn for each.
-// It visits all flags, even those not set.
-func (f *FlagSet) VisitAll(fn func(*Flag)) {
- for _, flag := range sortFlags(f.formal) {
- fn(flag)
- }
-}
-
-// VisitAll visits the command-line flags in lexicographical order, calling
-// fn for each. It visits all flags, even those not set.
-func VisitAll(fn func(*Flag)) {
- CommandLine.VisitAll(fn)
-}
-
-// Visit visits the flags in lexicographical order, calling fn for each.
-// It visits only those flags that have been set.
-func (f *FlagSet) Visit(fn func(*Flag)) {
- for _, flag := range sortFlags(f.actual) {
- fn(flag)
- }
-}
-
-// Visit visits the command-line flags in lexicographical order, calling fn
-// for each. It visits only those flags that have been set.
-func Visit(fn func(*Flag)) {
- CommandLine.Visit(fn)
-}
-
-// Lookup returns the Flag structure of the named flag, returning nil if none exists.
-func (f *FlagSet) Lookup(name string) *Flag {
- return f.formal[name]
-}
-
-// Lookup returns the Flag structure of the named command-line flag,
-// returning nil if none exists.
-func Lookup(name string) *Flag {
- return CommandLine.formal[name]
-}
-
-// Set sets the value of the named flag.
-func (f *FlagSet) Set(name, value string) error {
- flag, ok := f.formal[name]
- if !ok {
- return fmt.Errorf("no such flag -%v", name)
- }
- err := flag.Value.Set(value)
- if err != nil {
- return err
- }
- if f.actual == nil {
- f.actual = make(map[string]*Flag)
- }
- f.actual[name] = flag
- return nil
-}
-
-// Set sets the value of the named command-line flag.
-func Set(name, value string) error {
- return CommandLine.Set(name, value)
-}
-
-// PrintDefaults prints, to standard error unless configured
-// otherwise, the default values of all defined flags in the set.
-func (f *FlagSet) PrintDefaults() {
- f.VisitAll(func(flag *Flag) {
- format := " -%s=%s: %s\n"
- if _, ok := flag.Value.(*stringValue); ok {
- // put quotes on the value
- format = " -%s=%q: %s\n"
- }
- fmt.Fprintf(f.out(), format, flag.Name, flag.DefValue, flag.Usage)
- })
-}
-
-// PrintDefaults prints to standard error the default values of all defined command-line flags.
-func PrintDefaults() {
- CommandLine.PrintDefaults()
-}
-
-// defaultUsage is the default function to print a usage message.
-func defaultUsage(f *FlagSet) {
- if f.name == "" {
- fmt.Fprintf(f.out(), "Usage:\n")
- } else {
- fmt.Fprintf(f.out(), "Usage of %s:\n", f.name)
- }
- f.PrintDefaults()
-}
-
-// NOTE: Usage is not just defaultUsage(CommandLine)
-// because it serves (via godoc flag Usage) as the example
-// for how to write your own usage function.
-
-// Usage prints to standard error a usage message documenting all defined command-line flags.
-// The function is a variable that may be changed to point to a custom function.
-var Usage = func() {
- fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
- PrintDefaults()
-}
-
-// NFlag returns the number of flags that have been set.
-func (f *FlagSet) NFlag() int { return len(f.actual) }
-
-// NFlag returns the number of command-line flags that have been set.
-func NFlag() int { return len(CommandLine.actual) }
-
-// Arg returns the i'th argument. Arg(0) is the first remaining argument
-// after flags have been processed.
-func (f *FlagSet) Arg(i int) string {
- if i < 0 || i >= len(f.args) {
- return ""
- }
- return f.args[i]
-}
-
-// Arg returns the i'th command-line argument. Arg(0) is the first remaining argument
-// after flags have been processed.
-func Arg(i int) string {
- return CommandLine.Arg(i)
-}
-
-// NArg is the number of arguments remaining after flags have been processed.
-func (f *FlagSet) NArg() int { return len(f.args) }
-
-// NArg is the number of arguments remaining after flags have been processed.
-func NArg() int { return len(CommandLine.args) }
-
-// Args returns the non-flag arguments.
-func (f *FlagSet) Args() []string { return f.args }
-
-// Args returns the non-flag command-line arguments.
-func Args() []string { return CommandLine.args }
-
-// BoolVar defines a bool flag with specified name, default value, and usage string.
-// The argument p points to a bool variable in which to store the value of the flag.
-func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
- f.Var(newBoolValue(value, p), name, usage)
-}
-
-// BoolVar defines a bool flag with specified name, default value, and usage string.
-// The argument p points to a bool variable in which to store the value of the flag.
-func BoolVar(p *bool, name string, value bool, usage string) {
- CommandLine.Var(newBoolValue(value, p), name, usage)
-}
-
-// Bool defines a bool flag with specified name, default value, and usage string.
-// The return value is the address of a bool variable that stores the value of the flag.
-func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
- p := new(bool)
- f.BoolVar(p, name, value, usage)
- return p
-}
-
-// Bool defines a bool flag with specified name, default value, and usage string.
-// The return value is the address of a bool variable that stores the value of the flag.
-func Bool(name string, value bool, usage string) *bool {
- return CommandLine.Bool(name, value, usage)
-}
-
-// IntVar defines an int flag with specified name, default value, and usage string.
-// The argument p points to an int variable in which to store the value of the flag.
-func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
- f.Var(newIntValue(value, p), name, usage)
-}
-
-// IntVar defines an int flag with specified name, default value, and usage string.
-// The argument p points to an int variable in which to store the value of the flag.
-func IntVar(p *int, name string, value int, usage string) {
- CommandLine.Var(newIntValue(value, p), name, usage)
-}
-
-// Int defines an int flag with specified name, default value, and usage string.
-// The return value is the address of an int variable that stores the value of the flag.
-func (f *FlagSet) Int(name string, value int, usage string) *int {
- p := new(int)
- f.IntVar(p, name, value, usage)
- return p
-}
-
-// Int defines an int flag with specified name, default value, and usage string.
-// The return value is the address of an int variable that stores the value of the flag.
-func Int(name string, value int, usage string) *int {
- return CommandLine.Int(name, value, usage)
-}
-
-// Int64Var defines an int64 flag with specified name, default value, and usage string.
-// The argument p points to an int64 variable in which to store the value of the flag.
-func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) {
- f.Var(newInt64Value(value, p), name, usage)
-}
-
-// Int64Var defines an int64 flag with specified name, default value, and usage string.
-// The argument p points to an int64 variable in which to store the value of the flag.
-func Int64Var(p *int64, name string, value int64, usage string) {
- CommandLine.Var(newInt64Value(value, p), name, usage)
-}
-
-// Int64 defines an int64 flag with specified name, default value, and usage string.
-// The return value is the address of an int64 variable that stores the value of the flag.
-func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
- p := new(int64)
- f.Int64Var(p, name, value, usage)
- return p
-}
-
-// Int64 defines an int64 flag with specified name, default value, and usage string.
-// The return value is the address of an int64 variable that stores the value of the flag.
-func Int64(name string, value int64, usage string) *int64 {
- return CommandLine.Int64(name, value, usage)
-}
-
-// UintVar defines a uint flag with specified name, default value, and usage string.
-// The argument p points to a uint variable in which to store the value of the flag.
-func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) {
- f.Var(newUintValue(value, p), name, usage)
-}
-
-// UintVar defines a uint flag with specified name, default value, and usage string.
-// The argument p points to a uint variable in which to store the value of the flag.
-func UintVar(p *uint, name string, value uint, usage string) {
- CommandLine.Var(newUintValue(value, p), name, usage)
-}
-
-// Uint defines a uint flag with specified name, default value, and usage string.
-// The return value is the address of a uint variable that stores the value of the flag.
-func (f *FlagSet) Uint(name string, value uint, usage string) *uint {
- p := new(uint)
- f.UintVar(p, name, value, usage)
- return p
-}
-
-// Uint defines a uint flag with specified name, default value, and usage string.
-// The return value is the address of a uint variable that stores the value of the flag.
-func Uint(name string, value uint, usage string) *uint {
- return CommandLine.Uint(name, value, usage)
-}
-
-// Uint64Var defines a uint64 flag with specified name, default value, and usage string.
-// The argument p points to a uint64 variable in which to store the value of the flag.
-func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) {
- f.Var(newUint64Value(value, p), name, usage)
-}
-
-// Uint64Var defines a uint64 flag with specified name, default value, and usage string.
-// The argument p points to a uint64 variable in which to store the value of the flag.
-func Uint64Var(p *uint64, name string, value uint64, usage string) {
- CommandLine.Var(newUint64Value(value, p), name, usage)
-}
-
-// Uint64 defines a uint64 flag with specified name, default value, and usage string.
-// The return value is the address of a uint64 variable that stores the value of the flag.
-func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 {
- p := new(uint64)
- f.Uint64Var(p, name, value, usage)
- return p
-}
-
-// Uint64 defines a uint64 flag with specified name, default value, and usage string.
-// The return value is the address of a uint64 variable that stores the value of the flag.
-func Uint64(name string, value uint64, usage string) *uint64 {
- return CommandLine.Uint64(name, value, usage)
-}
-
-// StringVar defines a string flag with specified name, default value, and usage string.
-// The argument p points to a string variable in which to store the value of the flag.
-func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
- f.Var(newStringValue(value, p), name, usage)
-}
-
-// StringVar defines a string flag with specified name, default value, and usage string.
-// The argument p points to a string variable in which to store the value of the flag.
-func StringVar(p *string, name string, value string, usage string) {
- CommandLine.Var(newStringValue(value, p), name, usage)
-}
-
-// String defines a string flag with specified name, default value, and usage string.
-// The return value is the address of a string variable that stores the value of the flag.
-func (f *FlagSet) String(name string, value string, usage string) *string {
- p := new(string)
- f.StringVar(p, name, value, usage)
- return p
-}
-
-// String defines a string flag with specified name, default value, and usage string.
-// The return value is the address of a string variable that stores the value of the flag.
-func String(name string, value string, usage string) *string {
- return CommandLine.String(name, value, usage)
-}
-
-// Float64Var defines a float64 flag with specified name, default value, and usage string.
-// The argument p points to a float64 variable in which to store the value of the flag.
-func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) {
- f.Var(newFloat64Value(value, p), name, usage)
-}
-
-// Float64Var defines a float64 flag with specified name, default value, and usage string.
-// The argument p points to a float64 variable in which to store the value of the flag.
-func Float64Var(p *float64, name string, value float64, usage string) {
- CommandLine.Var(newFloat64Value(value, p), name, usage)
-}
-
-// Float64 defines a float64 flag with specified name, default value, and usage string.
-// The return value is the address of a float64 variable that stores the value of the flag.
-func (f *FlagSet) Float64(name string, value float64, usage string) *float64 {
- p := new(float64)
- f.Float64Var(p, name, value, usage)
- return p
-}
-
-// Float64 defines a float64 flag with specified name, default value, and usage string.
-// The return value is the address of a float64 variable that stores the value of the flag.
-func Float64(name string, value float64, usage string) *float64 {
- return CommandLine.Float64(name, value, usage)
-}
-
-// DurationVar defines a time.Duration flag with specified name, default value, and usage string.
-// The argument p points to a time.Duration variable in which to store the value of the flag.
-func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
- f.Var(newDurationValue(value, p), name, usage)
-}
-
-// DurationVar defines a time.Duration flag with specified name, default value, and usage string.
-// The argument p points to a time.Duration variable in which to store the value of the flag.
-func DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
- CommandLine.Var(newDurationValue(value, p), name, usage)
-}
-
-// Duration defines a time.Duration flag with specified name, default value, and usage string.
-// The return value is the address of a time.Duration variable that stores the value of the flag.
-func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration {
- p := new(time.Duration)
- f.DurationVar(p, name, value, usage)
- return p
-}
-
-// Duration defines a time.Duration flag with specified name, default value, and usage string.
-// The return value is the address of a time.Duration variable that stores the value of the flag.
-func Duration(name string, value time.Duration, usage string) *time.Duration {
- return CommandLine.Duration(name, value, usage)
-}
-
-// Var defines a flag with the specified name and usage string. The type and
-// value of the flag are represented by the first argument, of type Value, which
-// typically holds a user-defined implementation of Value. For instance, the
-// caller could create a flag that turns a comma-separated string into a slice
-// of strings by giving the slice the methods of Value; in particular, Set would
-// decompose the comma-separated string into the slice.
-func (f *FlagSet) Var(value Value, name string, usage string) {
- // Remember the default value as a string; it won't change.
- flag := &Flag{name, usage, value, value.String()}
- _, alreadythere := f.formal[name]
- if alreadythere {
- var msg string
- if f.name == "" {
- msg = fmt.Sprintf("flag redefined: %s", name)
- } else {
- msg = fmt.Sprintf("%s flag redefined: %s", f.name, name)
- }
- fmt.Fprintln(f.out(), msg)
- panic(msg) // Happens only if flags are declared with identical names
- }
- if f.formal == nil {
- f.formal = make(map[string]*Flag)
- }
- f.formal[name] = flag
-}
-
-// Var defines a flag with the specified name and usage string. The type and
-// value of the flag are represented by the first argument, of type Value, which
-// typically holds a user-defined implementation of Value. For instance, the
-// caller could create a flag that turns a comma-separated string into a slice
-// of strings by giving the slice the methods of Value; in particular, Set would
-// decompose the comma-separated string into the slice.
-func Var(value Value, name string, usage string) {
- CommandLine.Var(value, name, usage)
-}
-
-// failf prints to standard error a formatted error and usage message and
-// returns the error.
-func (f *FlagSet) failf(format string, a ...interface{}) error {
- err := fmt.Errorf(format, a...)
- fmt.Fprintln(f.out(), err)
- f.usage()
- return err
-}
-
-// usage calls the Usage method for the flag set, or the usage function if
-// the flag set is CommandLine.
-func (f *FlagSet) usage() {
- if f == CommandLine {
- Usage()
- } else if f.Usage == nil {
- defaultUsage(f)
- } else {
- f.Usage()
- }
-}
-
-// parseOne parses one flag. It reports whether a flag was seen.
-func (f *FlagSet) parseOne() (bool, error) {
- if len(f.args) == 0 {
- return false, nil
- }
- s := f.args[0]
- if len(s) == 0 || s[0] != '-' || len(s) == 1 {
- return false, nil
- }
- numMinuses := 1
- if s[1] == '-' {
- numMinuses++
- if len(s) == 2 { // "--" terminates the flags
- f.args = f.args[1:]
- return false, nil
- }
- }
- name := s[numMinuses:]
- if len(name) == 0 || name[0] == '-' || name[0] == '=' {
- return false, f.failf("bad flag syntax: %s", s)
- }
-
- // it's a flag. does it have an argument?
- f.args = f.args[1:]
- hasValue := false
- value := ""
- for i := 1; i < len(name); i++ { // equals cannot be first
- if name[i] == '=' {
- value = name[i+1:]
- hasValue = true
- name = name[0:i]
- break
- }
- }
- m := f.formal
- flag, alreadythere := m[name] // BUG
- if !alreadythere {
- if name == "help" || name == "h" { // special case for nice help message.
- f.usage()
- return false, ErrHelp
- }
- return false, f.failf("flag provided but not defined: -%s", name)
- }
- if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
- if hasValue {
- if err := fv.Set(value); err != nil {
- return false, f.failf("invalid boolean value %q for -%s: %v", value, name, err)
- }
- } else {
- fv.Set("true")
- }
- } else {
- // It must have a value, which might be the next argument.
- if !hasValue && len(f.args) > 0 {
- // value is the next arg
- hasValue = true
- value, f.args = f.args[0], f.args[1:]
- }
- if !hasValue {
- return false, f.failf("flag needs an argument: -%s", name)
- }
- if err := flag.Value.Set(value); err != nil {
- return false, f.failf("invalid value %q for flag -%s: %v", value, name, err)
- }
- }
- if f.actual == nil {
- f.actual = make(map[string]*Flag)
- }
- f.actual[name] = flag
- return true, nil
-}
-
-// Parse parses flag definitions from the argument list, which should not
-// include the command name. Must be called after all flags in the FlagSet
-// are defined and before flags are accessed by the program.
-// The return value will be ErrHelp if -help was set but not defined.
-func (f *FlagSet) Parse(arguments []string) error {
- f.parsed = true
- f.args = arguments
- for {
- seen, err := f.parseOne()
- if seen {
- continue
- }
- if err == nil {
- break
- }
- switch f.errorHandling {
- case ContinueOnError:
- return err
- case ExitOnError:
- os.Exit(2)
- case PanicOnError:
- panic(err)
- }
- }
-
- // Parse environment variables
- f.ParseEnv(os.Environ())
-
- // Parse configuration from file
- configFlag := f.actual["config"]
- if configFlag != nil {
- f.ParseFile(configFlag.Value.String())
- }
-
- return nil
-}
-
-// ParseEnv parses flags from environment variables.
-// Flags already set will be ignored.
-func (f *FlagSet) ParseEnv(environ []string) error {
-
- m := f.formal
-
- env := make(map[string]string)
- for _, s := range environ {
- i := strings.Index(s, "=")
- if i < 1 {
- continue
- }
- env[s[0:i]] = s[i+1 : len(s)]
- }
-
- for _, flag := range m {
- name := flag.Name
- _, set := f.actual[name]
- if set {
- continue
- }
-
- flag, alreadythere := m[name]
- if !alreadythere {
- if name == "help" || name == "h" { // special case for nice help message.
- f.usage()
- return ErrHelp
- }
- return f.failf("environment variable provided but not defined: %s", name)
- }
-
- envKey := strings.ToUpper(flag.Name)
- if f.envPrefix != "" {
- envKey = f.envPrefix + "_" + envKey
- }
- envKey = strings.Replace(envKey, "-", "_", -1)
-
- value, isSet := env[envKey]
- if !isSet {
- continue
- }
-
- hasValue := false
- if len(value) > 0 {
- hasValue = true
- }
-
- if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
- if hasValue {
- if err := fv.Set(value); err != nil {
- return f.failf("invalid boolean value %q for environment variable %s: %v", value, name, err)
- }
- } else {
- // flag without value is regarded a bool
- fv.Set("true")
- }
- } else {
- if !hasValue {
- return f.failf("environment variable needs an value: %s", name)
- }
-
- if err := flag.Value.Set(value); err != nil {
- return f.failf("invalid value %q for environment variable %s: %v", value, name, err)
- }
- }
-
- // update f.actual
- if f.actual == nil {
- f.actual = make(map[string]*Flag)
- }
- f.actual[name] = flag
-
- }
- return nil
-}
-
-// ParseFile parses flags from the file in path.
-// Same format as commandline argumens, newlines and lines beginning with a
-// "#" charater are ignored. Flags already set will be ignored.
-func (f *FlagSet) ParseFile(path string) error {
-
- // Extract arguments from file
- fp, err := os.Open(path)
- if err != nil {
- return err
- }
- defer fp.Close()
-
- scanner := bufio.NewScanner(fp)
- for scanner.Scan() {
- line := scanner.Text()
-
- // Ignore empty lines
- if len(line) == 0 {
- continue
- }
-
- // Ignore comments
- if line[:1] == "#" {
- continue
- }
-
- // Match `key=value` and `key value`
- var name, value string
- hasValue := false
- for i, v := range line {
- if v == '=' || v == ' ' {
- hasValue = true
- name, value = line[:i], line[i+1:]
- break
- }
- }
-
- if hasValue == false {
- name = line
- }
-
- // Ignore flag when already set; arguments have precedence over file
- if f.actual[name] != nil {
- continue
- }
-
- m := f.formal
- flag, alreadythere := m[name]
- if !alreadythere {
- if name == "help" || name == "h" { // special case for nice help message.
- f.usage()
- return ErrHelp
- }
- return f.failf("configuration variable provided but not defined: %s", name)
- }
-
- if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
- if hasValue {
- if err := fv.Set(value); err != nil {
- return f.failf("invalid boolean value %q for configuration variable %s: %v", value, name, err)
- }
- } else {
- // flag without value is regarded a bool
- fv.Set("true")
- }
- } else {
- if !hasValue {
- return f.failf("configuration variable needs an argument: %s", name)
- }
-
- if err := flag.Value.Set(value); err != nil {
- return f.failf("invalid value %q for configuration variable %s: %v", value, name, err)
- }
- }
-
- // update f.actual
- if f.actual == nil {
- f.actual = make(map[string]*Flag)
- }
- f.actual[name] = flag
- }
-
- if err := scanner.Err(); err != nil {
- return err
- }
-
- return nil
-}
-
-// Parsed reports whether f.Parse has been called.
-func (f *FlagSet) Parsed() bool {
- return f.parsed
-}
-
-// Parse parses the command-line flags from os.Args[1:]. Must be called
-// after all flags are defined and before flags are accessed by the program.
-func Parse() {
- // Ignore errors; CommandLine is set for ExitOnError.
- CommandLine.Parse(os.Args[1:])
-}
-
-// Parsed returns true if the command-line flags have been parsed.
-func Parsed() bool {
- return CommandLine.Parsed()
-}
-
-// CommandLine is the default set of command-line flags, parsed from os.Args.
-// The top-level functions such as BoolVar, Arg, and on are wrappers for the
-// methods of CommandLine.
-var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
-
-// NewFlagSet returns a new, empty flag set with the specified name and
-// error handling property.
-func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
- f := &FlagSet{
- name: name,
- errorHandling: errorHandling,
- }
- return f
-}
-
-// NewFlagSetWithEnvPrefix returns a new empty flag set with the specified name,
-// environment variable prefix, and error handling property.
-func NewFlagSetWithEnvPrefix(name string, prefix string, errorHandling ErrorHandling) *FlagSet {
- f := NewFlagSet(name, errorHandling)
- f.envPrefix = prefix
- return f
-}
-
-// Init sets the name, environment name prefix, and error handling property
-// for a flag set.
-// By default, the zero FlagSet uses an empty name, EnvironmentPrefix, and the
-// ContinueOnError error handling policy.
-func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
- f.name = name
- f.envPrefix = EnvironmentPrefix
- f.errorHandling = errorHandling
-}
diff --git a/vendor/github.com/namsral/flag/flag_test.go b/vendor/github.com/namsral/flag/flag_test.go
deleted file mode 100644
index c0ed7fb15..000000000
--- a/vendor/github.com/namsral/flag/flag_test.go
+++ /dev/null
@@ -1,475 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flag
-
-import (
- "bytes"
- "fmt"
- "os"
- "sort"
- "strings"
- "syscall"
- "testing"
- "time"
-)
-
-func boolString(s string) string {
- if s == "0" {
- return "false"
- }
- return "true"
-}
-
-func TestEverything(t *testing.T) {
- ResetForTesting(nil)
- Bool("test_bool", false, "bool value")
- Int("test_int", 0, "int value")
- Int64("test_int64", 0, "int64 value")
- Uint("test_uint", 0, "uint value")
- Uint64("test_uint64", 0, "uint64 value")
- String("test_string", "0", "string value")
- Float64("test_float64", 0, "float64 value")
- Duration("test_duration", 0, "time.Duration value")
-
- m := make(map[string]*Flag)
- desired := "0"
- visitor := func(f *Flag) {
- if len(f.Name) > 5 && f.Name[0:5] == "test_" {
- m[f.Name] = f
- ok := false
- switch {
- case f.Value.String() == desired:
- ok = true
- case f.Name == "test_bool" && f.Value.String() == boolString(desired):
- ok = true
- case f.Name == "test_duration" && f.Value.String() == desired+"s":
- ok = true
- }
- if !ok {
- t.Error("Visit: bad value", f.Value.String(), "for", f.Name)
- }
- }
- }
- VisitAll(visitor)
- if len(m) != 8 {
- t.Error("VisitAll misses some flags")
- for k, v := range m {
- t.Log(k, *v)
- }
- }
- m = make(map[string]*Flag)
- Visit(visitor)
- if len(m) != 0 {
- t.Errorf("Visit sees unset flags")
- for k, v := range m {
- t.Log(k, *v)
- }
- }
- // Now set all flags
- Set("test_bool", "true")
- Set("test_int", "1")
- Set("test_int64", "1")
- Set("test_uint", "1")
- Set("test_uint64", "1")
- Set("test_string", "1")
- Set("test_float64", "1")
- Set("test_duration", "1s")
- desired = "1"
- Visit(visitor)
- if len(m) != 8 {
- t.Error("Visit fails after set")
- for k, v := range m {
- t.Log(k, *v)
- }
- }
- // Now test they're visited in sort order.
- var flagNames []string
- Visit(func(f *Flag) { flagNames = append(flagNames, f.Name) })
- if !sort.StringsAreSorted(flagNames) {
- t.Errorf("flag names not sorted: %v", flagNames)
- }
-}
-
-func TestGet(t *testing.T) {
- ResetForTesting(nil)
- Bool("test_bool", true, "bool value")
- Int("test_int", 1, "int value")
- Int64("test_int64", 2, "int64 value")
- Uint("test_uint", 3, "uint value")
- Uint64("test_uint64", 4, "uint64 value")
- String("test_string", "5", "string value")
- Float64("test_float64", 6, "float64 value")
- Duration("test_duration", 7, "time.Duration value")
-
- visitor := func(f *Flag) {
- if len(f.Name) > 5 && f.Name[0:5] == "test_" {
- g, ok := f.Value.(Getter)
- if !ok {
- t.Errorf("Visit: value does not satisfy Getter: %T", f.Value)
- return
- }
- switch f.Name {
- case "test_bool":
- ok = g.Get() == true
- case "test_int":
- ok = g.Get() == int(1)
- case "test_int64":
- ok = g.Get() == int64(2)
- case "test_uint":
- ok = g.Get() == uint(3)
- case "test_uint64":
- ok = g.Get() == uint64(4)
- case "test_string":
- ok = g.Get() == "5"
- case "test_float64":
- ok = g.Get() == float64(6)
- case "test_duration":
- ok = g.Get() == time.Duration(7)
- }
- if !ok {
- t.Errorf("Visit: bad value %T(%v) for %s", g.Get(), g.Get(), f.Name)
- }
- }
- }
- VisitAll(visitor)
-}
-
-func TestUsage(t *testing.T) {
- called := false
- ResetForTesting(func() { called = true })
- if CommandLine.Parse([]string{"-x"}) == nil {
- t.Error("parse did not fail for unknown flag")
- }
- if !called {
- t.Error("did not call Usage for unknown flag")
- }
-}
-
-func testParse(f *FlagSet, t *testing.T) {
- if f.Parsed() {
- t.Error("f.Parse() = true before Parse")
- }
- boolFlag := f.Bool("bool", false, "bool value")
- bool2Flag := f.Bool("bool2", false, "bool2 value")
- intFlag := f.Int("int", 0, "int value")
- int64Flag := f.Int64("int64", 0, "int64 value")
- uintFlag := f.Uint("uint", 0, "uint value")
- uint64Flag := f.Uint64("uint64", 0, "uint64 value")
- stringFlag := f.String("string", "0", "string value")
- float64Flag := f.Float64("float64", 0, "float64 value")
- durationFlag := f.Duration("duration", 5*time.Second, "time.Duration value")
- extra := "one-extra-argument"
- args := []string{
- "-bool",
- "-bool2=true",
- "--int", "22",
- "--int64", "0x23",
- "-uint", "24",
- "--uint64", "25",
- "-string", "hello",
- "-float64", "2718e28",
- "-duration", "2m",
- extra,
- }
- if err := f.Parse(args); err != nil {
- t.Fatal(err)
- }
- if !f.Parsed() {
- t.Error("f.Parse() = false after Parse")
- }
- if *boolFlag != true {
- t.Error("bool flag should be true, is ", *boolFlag)
- }
- if *bool2Flag != true {
- t.Error("bool2 flag should be true, is ", *bool2Flag)
- }
- if *intFlag != 22 {
- t.Error("int flag should be 22, is ", *intFlag)
- }
- if *int64Flag != 0x23 {
- t.Error("int64 flag should be 0x23, is ", *int64Flag)
- }
- if *uintFlag != 24 {
- t.Error("uint flag should be 24, is ", *uintFlag)
- }
- if *uint64Flag != 25 {
- t.Error("uint64 flag should be 25, is ", *uint64Flag)
- }
- if *stringFlag != "hello" {
- t.Error("string flag should be `hello`, is ", *stringFlag)
- }
- if *float64Flag != 2718e28 {
- t.Error("float64 flag should be 2718e28, is ", *float64Flag)
- }
- if *durationFlag != 2*time.Minute {
- t.Error("duration flag should be 2m, is ", *durationFlag)
- }
- if len(f.Args()) != 1 {
- t.Error("expected one argument, got", len(f.Args()))
- } else if f.Args()[0] != extra {
- t.Errorf("expected argument %q got %q", extra, f.Args()[0])
- }
-}
-
-func TestParse(t *testing.T) {
- ResetForTesting(func() { t.Error("bad parse") })
- testParse(CommandLine, t)
-}
-
-func TestFlagSetParse(t *testing.T) {
- testParse(NewFlagSet("test", ContinueOnError), t)
-}
-
-// Declare a user-defined flag type.
-type flagVar []string
-
-func (f *flagVar) String() string {
- return fmt.Sprint([]string(*f))
-}
-
-func (f *flagVar) Set(value string) error {
- *f = append(*f, value)
- return nil
-}
-
-func TestUserDefined(t *testing.T) {
- var flags FlagSet
- flags.Init("test", ContinueOnError)
- var v flagVar
- flags.Var(&v, "v", "usage")
- if err := flags.Parse([]string{"-v", "1", "-v", "2", "-v=3"}); err != nil {
- t.Error(err)
- }
- if len(v) != 3 {
- t.Fatal("expected 3 args; got ", len(v))
- }
- expect := "[1 2 3]"
- if v.String() != expect {
- t.Errorf("expected value %q got %q", expect, v.String())
- }
-}
-
-// Declare a user-defined boolean flag type.
-type boolFlagVar struct {
- count int
-}
-
-func (b *boolFlagVar) String() string {
- return fmt.Sprintf("%d", b.count)
-}
-
-func (b *boolFlagVar) Set(value string) error {
- if value == "true" {
- b.count++
- }
- return nil
-}
-
-func (b *boolFlagVar) IsBoolFlag() bool {
- return b.count < 4
-}
-
-func TestUserDefinedBool(t *testing.T) {
- var flags FlagSet
- flags.Init("test", ContinueOnError)
- var b boolFlagVar
- var err error
- flags.Var(&b, "b", "usage")
- if err = flags.Parse([]string{"-b", "-b", "-b", "-b=true", "-b=false", "-b", "barg", "-b"}); err != nil {
- if b.count < 4 {
- t.Error(err)
- }
- }
-
- if b.count != 4 {
- t.Errorf("want: %d; got: %d", 4, b.count)
- }
-
- if err == nil {
- t.Error("expected error; got none")
- }
-}
-
-func TestSetOutput(t *testing.T) {
- var flags FlagSet
- var buf bytes.Buffer
- flags.SetOutput(&buf)
- flags.Init("test", ContinueOnError)
- flags.Parse([]string{"-unknown"})
- if out := buf.String(); !strings.Contains(out, "-unknown") {
- t.Logf("expected output mentioning unknown; got %q", out)
- }
-}
-
-// This tests that one can reset the flags. This still works but not well, and is
-// superseded by FlagSet.
-func TestChangingArgs(t *testing.T) {
- ResetForTesting(func() { t.Fatal("bad parse") })
- oldArgs := os.Args
- defer func() { os.Args = oldArgs }()
- os.Args = []string{"cmd", "-before", "subcmd", "-after", "args"}
- before := Bool("before", false, "")
- if err := CommandLine.Parse(os.Args[1:]); err != nil {
- t.Fatal(err)
- }
- cmd := Arg(0)
- os.Args = Args()
- after := Bool("after", false, "")
- Parse()
- args := Args()
-
- if !*before || cmd != "subcmd" || !*after || len(args) != 1 || args[0] != "args" {
- t.Fatalf("expected true subcmd true [args] got %v %v %v %v", *before, cmd, *after, args)
- }
-}
-
-// Test that -help invokes the usage message and returns ErrHelp.
-func TestHelp(t *testing.T) {
- var helpCalled = false
- fs := NewFlagSet("help test", ContinueOnError)
- fs.Usage = func() { helpCalled = true }
- var flag bool
- fs.BoolVar(&flag, "flag", false, "regular flag")
- // Regular flag invocation should work
- err := fs.Parse([]string{"-flag=true"})
- if err != nil {
- t.Fatal("expected no error; got ", err)
- }
- if !flag {
- t.Error("flag was not set by -flag")
- }
- if helpCalled {
- t.Error("help called for regular flag")
- helpCalled = false // reset for next test
- }
- // Help flag should work as expected.
- err = fs.Parse([]string{"-help"})
- if err == nil {
- t.Fatal("error expected")
- }
- if err != ErrHelp {
- t.Fatal("expected ErrHelp; got ", err)
- }
- if !helpCalled {
- t.Fatal("help was not called")
- }
- // If we define a help flag, that should override.
- var help bool
- fs.BoolVar(&help, "help", false, "help flag")
- helpCalled = false
- err = fs.Parse([]string{"-help"})
- if err != nil {
- t.Fatal("expected no error for defined -help; got ", err)
- }
- if helpCalled {
- t.Fatal("help was called; should not have been for defined help flag")
- }
-}
-
-// Test parsing a environment variables
-func TestParseEnv(t *testing.T) {
-
- syscall.Setenv("BOOL", "")
- syscall.Setenv("BOOL2", "true")
- syscall.Setenv("INT", "22")
- syscall.Setenv("INT64", "0x23")
- syscall.Setenv("UINT", "24")
- syscall.Setenv("UINT64", "25")
- syscall.Setenv("STRING", "hello")
- syscall.Setenv("FLOAT64", "2718e28")
- syscall.Setenv("DURATION", "2m")
-
- f := NewFlagSet(os.Args[0], ContinueOnError)
-
- boolFlag := f.Bool("bool", false, "bool value")
- bool2Flag := f.Bool("bool2", false, "bool2 value")
- intFlag := f.Int("int", 0, "int value")
- int64Flag := f.Int64("int64", 0, "int64 value")
- uintFlag := f.Uint("uint", 0, "uint value")
- uint64Flag := f.Uint64("uint64", 0, "uint64 value")
- stringFlag := f.String("string", "0", "string value")
- float64Flag := f.Float64("float64", 0, "float64 value")
- durationFlag := f.Duration("duration", 5*time.Second, "time.Duration value")
-
- err := f.ParseEnv(os.Environ())
- if err != nil {
- t.Fatal("expected no error; got ", err)
- }
- if *boolFlag != true {
- t.Error("bool flag should be true, is ", *boolFlag)
- }
- if *bool2Flag != true {
- t.Error("bool2 flag should be true, is ", *bool2Flag)
- }
- if *intFlag != 22 {
- t.Error("int flag should be 22, is ", *intFlag)
- }
- if *int64Flag != 0x23 {
- t.Error("int64 flag should be 0x23, is ", *int64Flag)
- }
- if *uintFlag != 24 {
- t.Error("uint flag should be 24, is ", *uintFlag)
- }
- if *uint64Flag != 25 {
- t.Error("uint64 flag should be 25, is ", *uint64Flag)
- }
- if *stringFlag != "hello" {
- t.Error("string flag should be `hello`, is ", *stringFlag)
- }
- if *float64Flag != 2718e28 {
- t.Error("float64 flag should be 2718e28, is ", *float64Flag)
- }
- if *durationFlag != 2*time.Minute {
- t.Error("duration flag should be 2m, is ", *durationFlag)
- }
-}
-
-// Test parsing a configuration file
-func TestParseFile(t *testing.T) {
-
- f := NewFlagSet(os.Args[0], ContinueOnError)
-
- boolFlag := f.Bool("bool", false, "bool value")
- bool2Flag := f.Bool("bool2", false, "bool2 value")
- intFlag := f.Int("int", 0, "int value")
- int64Flag := f.Int64("int64", 0, "int64 value")
- uintFlag := f.Uint("uint", 0, "uint value")
- uint64Flag := f.Uint64("uint64", 0, "uint64 value")
- stringFlag := f.String("string", "0", "string value")
- float64Flag := f.Float64("float64", 0, "float64 value")
- durationFlag := f.Duration("duration", 5*time.Second, "time.Duration value")
-
- err := f.ParseFile("./testdata/test.conf")
- if err != nil {
- t.Fatal("expected no error; got ", err)
- }
- if *boolFlag != true {
- t.Error("bool flag should be true, is ", *boolFlag)
- }
- if *bool2Flag != true {
- t.Error("bool2 flag should be true, is ", *bool2Flag)
- }
- if *intFlag != 22 {
- t.Error("int flag should be 22, is ", *intFlag)
- }
- if *int64Flag != 0x23 {
- t.Error("int64 flag should be 0x23, is ", *int64Flag)
- }
- if *uintFlag != 24 {
- t.Error("uint flag should be 24, is ", *uintFlag)
- }
- if *uint64Flag != 25 {
- t.Error("uint64 flag should be 25, is ", *uint64Flag)
- }
- if *stringFlag != "hello" {
- t.Error("string flag should be `hello`, is ", *stringFlag)
- }
- if *float64Flag != 2718e28 {
- t.Error("float64 flag should be 2718e28, is ", *float64Flag)
- }
- if *durationFlag != 2*time.Minute {
- t.Error("duration flag should be 2m, is ", *durationFlag)
- }
-}
diff --git a/vendor/github.com/namsral/flag/testdata/test.conf b/vendor/github.com/namsral/flag/testdata/test.conf
deleted file mode 100644
index e06bbba0f..000000000
--- a/vendor/github.com/namsral/flag/testdata/test.conf
+++ /dev/null
@@ -1,11 +0,0 @@
-# this is a comment followed by an empty line
-
-bool
-bool2=true
-int 22
-int64 0x23
-uint 24
-uint64 25
-string hello
-float64 2718e28
-duration 2m
\ No newline at end of file
diff --git a/vendor/github.com/olekukonko/tablewriter/LICENCE.md b/vendor/github.com/olekukonko/tablewriter/LICENCE.md
new file mode 100644
index 000000000..1fd848425
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/LICENCE.md
@@ -0,0 +1,19 @@
+Copyright (C) 2014 by Oleku Konko
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/vendor/github.com/olekukonko/tablewriter/README.md b/vendor/github.com/olekukonko/tablewriter/README.md
new file mode 100644
index 000000000..4ee44356d
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/README.md
@@ -0,0 +1,141 @@
+ASCII Table Writer
+=========
+
+[](https://travis-ci.org/olekukonko/tablewriter) [](https://sourcegraph.com/github.com/olekukonko/tablewriter)
+
+Generate ASCII table on the fly ... Installation is simple as
+
+ go get github.com/olekukonko/tablewriter
+
+
+#### Features
+- Automatic Padding
+- Support Multiple Lines
+- Supports Alignment
+- Support Custom Separators
+- Automatic Alignment of numbers & percentage
+- Write directly to http , file etc via `io.Writer`
+- Read directly from CSV file
+- Optional row line via `SetRowLine`
+- Normalise table header
+- Make CSV Headers optional
+- Enable or disable table border
+- Set custom footer support
+
+
+#### Example 1 - Basic
+```go
+data := [][]string{
+ []string{"A", "The Good", "500"},
+ []string{"B", "The Very very Bad Man", "288"},
+ []string{"C", "The Ugly", "120"},
+ []string{"D", "The Gopher", "800"},
+}
+
+table := tablewriter.NewWriter(os.Stdout)
+table.SetHeader([]string{"Name", "Sign", "Rating"})
+
+for _, v := range data {
+ table.Append(v)
+}
+table.Render() // Send output
+```
+
+##### Output 1
+```
++------+-----------------------+--------+
+| NAME | SIGN | RATING |
++------+-----------------------+--------+
+| A | The Good | 500 |
+| B | The Very very Bad Man | 288 |
+| C | The Ugly | 120 |
+| D | The Gopher | 800 |
++------+-----------------------+--------+
+```
+
+#### Example 2 - Without Border / Footer / Bulk Append
+```go
+data := [][]string{
+ []string{"1/1/2014", "Domain name", "2233", "$10.98"},
+ []string{"1/1/2014", "January Hosting", "2233", "$54.95"},
+ []string{"1/4/2014", "February Hosting", "2233", "$51.00"},
+ []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"},
+}
+
+table := tablewriter.NewWriter(os.Stdout)
+table.SetHeader([]string{"Date", "Description", "CV2", "Amount"})
+table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer
+table.SetBorder(false) // Set Border to false
+table.AppendBulk(data) // Add Bulk Data
+table.Render()
+```
+
+##### Output 2
+```
+
+ DATE | DESCRIPTION | CV2 | AMOUNT
++----------+--------------------------+-------+---------+
+ 1/1/2014 | Domain name | 2233 | $10.98
+ 1/1/2014 | January Hosting | 2233 | $54.95
+ 1/4/2014 | February Hosting | 2233 | $51.00
+ 1/4/2014 | February Extra Bandwidth | 2233 | $30.00
++----------+--------------------------+-------+---------+
+ TOTAL | $146 93
+ +-------+---------+
+
+```
+
+
+#### Example 3 - CSV
+```go
+table, _ := tablewriter.NewCSV(os.Stdout, "test_info.csv", true)
+table.SetAlignment(tablewriter.ALIGN_LEFT) // Set Alignment
+table.Render()
+```
+
+##### Output 3
+```
++----------+--------------+------+-----+---------+----------------+
+| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
++----------+--------------+------+-----+---------+----------------+
+| user_id | smallint(5) | NO | PRI | NULL | auto_increment |
+| username | varchar(10) | NO | | NULL | |
+| password | varchar(100) | NO | | NULL | |
++----------+--------------+------+-----+---------+----------------+
+```
+
+#### Example 4 - Custom Separator
+```go
+table, _ := tablewriter.NewCSV(os.Stdout, "test.csv", true)
+table.SetRowLine(true) // Enable row line
+
+// Change table lines
+table.SetCenterSeparator("*")
+table.SetColumnSeparator("‡")
+table.SetRowSeparator("-")
+
+table.SetAlignment(tablewriter.ALIGN_LEFT)
+table.Render()
+```
+
+##### Output 4
+```
+*------------*-----------*---------*
+╪ FIRST NAME ╪ LAST NAME ╪ SSN ╪
+*------------*-----------*---------*
+╪ John ╪ Barry ╪ 123456 ╪
+*------------*-----------*---------*
+╪ Kathy ╪ Smith ╪ 687987 ╪
+*------------*-----------*---------*
+╪ Bob ╪ McCornick ╪ 3979870 ╪
+*------------*-----------*---------*
+```
+
+#### TODO
+- ~~Import Directly from CSV~~ - `done`
+- ~~Support for `SetFooter`~~ - `done`
+- ~~Support for `SetBorder`~~ - `done`
+- ~~Support table with uneven rows~~ - `done`
+- Support custom alignment
+- General Improvement & Optimisation
+- `NewHTML` Parse table from HTML
diff --git a/vendor/github.com/olekukonko/tablewriter/csv.go b/vendor/github.com/olekukonko/tablewriter/csv.go
new file mode 100644
index 000000000..98878303b
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/csv.go
@@ -0,0 +1,52 @@
+// Copyright 2014 Oleku Konko All rights reserved.
+// Use of this source code is governed by a MIT
+// license that can be found in the LICENSE file.
+
+// This module is a Table Writer API for the Go Programming Language.
+// The protocols were written in pure Go and works on windows and unix systems
+
+package tablewriter
+
+import (
+ "encoding/csv"
+ "io"
+ "os"
+)
+
+// Start A new table by importing from a CSV file
+// Takes io.Writer and csv File name
+func NewCSV(writer io.Writer, fileName string, hasHeader bool) (*Table, error) {
+ file, err := os.Open(fileName)
+ if err != nil {
+ return &Table{}, err
+ }
+ defer file.Close()
+ csvReader := csv.NewReader(file)
+ t, err := NewCSVReader(writer, csvReader, hasHeader)
+ return t, err
+}
+
+// Start a New Table Writer with csv.Reader
+// This enables customisation such as reader.Comma = ';'
+// See http://golang.org/src/pkg/encoding/csv/reader.go?s=3213:3671#L94
+func NewCSVReader(writer io.Writer, csvReader *csv.Reader, hasHeader bool) (*Table, error) {
+ t := NewWriter(writer)
+ if hasHeader {
+ // Read the first row
+ headers, err := csvReader.Read()
+ if err != nil {
+ return &Table{}, err
+ }
+ t.SetHeader(headers)
+ }
+ for {
+ record, err := csvReader.Read()
+ if err == io.EOF {
+ break
+ } else if err != nil {
+ return &Table{}, err
+ }
+ t.Append(record)
+ }
+ return t, nil
+}
diff --git a/vendor/github.com/olekukonko/tablewriter/csv2table/README.md b/vendor/github.com/olekukonko/tablewriter/csv2table/README.md
new file mode 100644
index 000000000..6cf5628ab
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/csv2table/README.md
@@ -0,0 +1,43 @@
+ASCII Table Writer Tool
+=========
+
+Generate ASCII table on the fly via command line ... Installation is simple as
+
+#### Get Tool
+
+ go get github.com/olekukonko/tablewriter/csv2table
+
+#### Install Tool
+
+ go install github.com/olekukonko/tablewriter/csv2table
+
+
+#### Usage
+
+ csv2table -f test.csv
+
+#### Support for Piping
+
+ cat test.csv | csv2table -p=true
+
+#### Output
+
+```
++------------+-----------+---------+
+| FIRST NAME | LAST NAME | SSN |
++------------+-----------+---------+
+| John | Barry | 123456 |
+| Kathy | Smith | 687987 |
+| Bob | McCornick | 3979870 |
++------------+-----------+---------+
+```
+
+#### Another Piping with Header set to `false`
+
+ echo dance,with,me | csv2table -p=true -h=false
+
+#### Output
+
+ +-------+------+-----+
+ | dance | with | me |
+ +-------+------+-----+
diff --git a/vendor/github.com/olekukonko/tablewriter/csv2table/csv2table.go b/vendor/github.com/olekukonko/tablewriter/csv2table/csv2table.go
new file mode 100644
index 000000000..411f6535c
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/csv2table/csv2table.go
@@ -0,0 +1,84 @@
+package main
+
+import (
+ "encoding/csv"
+ "flag"
+ "fmt"
+ "github.com/olekukonko/tablewriter"
+ "io"
+ "os"
+ "unicode/utf8"
+)
+
+var (
+ fileName = flag.String("f", "", "Set file with eg. sample.csv")
+ delimiter = flag.String("d", ",", "Set CSV File delimiter eg. ,|;|\t ")
+ header = flag.Bool("h", true, "Set header options eg. true|false ")
+ align = flag.String("a", "none", "Set aligmement with eg. none|left|right|centre")
+ pipe = flag.Bool("p", false, "Suport for Piping from STDIN")
+ border = flag.Bool("b", true, "Enable / disable table border")
+)
+
+func main() {
+ flag.Parse()
+ fmt.Println()
+ if *pipe || hasArg("-p") {
+ process(os.Stdin)
+ } else {
+ if *fileName == "" {
+ fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
+ flag.PrintDefaults()
+ fmt.Println()
+ os.Exit(1)
+ }
+ processFile()
+ }
+ fmt.Println()
+}
+
+func hasArg(name string) bool {
+ for _ , v := range os.Args {
+ if name == v {
+ return true
+ }
+ }
+ return false
+}
+func processFile() {
+ r, err := os.Open(*fileName)
+ if err != nil {
+ exit(err)
+ }
+ defer r.Close()
+ process(r)
+}
+func process(r io.Reader) {
+ csvReader := csv.NewReader(r)
+ rune, size := utf8.DecodeRuneInString(*delimiter)
+ if size == 0 {
+ rune = ','
+ }
+ csvReader.Comma = rune
+
+ table, err := tablewriter.NewCSVReader(os.Stdout, csvReader, *header)
+
+ if err != nil {
+ exit(err)
+ }
+
+ switch *align {
+ case "left":
+ table.SetAlignment(tablewriter.ALIGN_LEFT)
+ case "right":
+ table.SetAlignment(tablewriter.ALIGN_RIGHT)
+ case "center":
+ table.SetAlignment(tablewriter.ALIGN_CENTRE)
+ }
+ table.SetBorder(*border)
+ table.Render()
+}
+
+func exit(err error) {
+ fmt.Fprintf(os.Stderr, "#Error : %s", err)
+ os.Exit(1)
+}
diff --git a/vendor/github.com/olekukonko/tablewriter/table.go b/vendor/github.com/olekukonko/tablewriter/table.go
new file mode 100644
index 000000000..4835e31e8
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/table.go
@@ -0,0 +1,472 @@
+// Copyright 2014 Oleku Konko All rights reserved.
+// Use of this source code is governed by a MIT
+// license that can be found in the LICENSE file.
+
+// This module is a Table Writer API for the Go Programming Language.
+// The protocols were written in pure Go and works on windows and unix systems
+
+// Create & Generate text based table
+package tablewriter
+
+import (
+ "fmt"
+ "io"
+ "regexp"
+ "strings"
+)
+
+const (
+ MAX_ROW_WIDTH = 30
+)
+
+const (
+ CENTRE = "+"
+ ROW = "-"
+ COLUMN = "|"
+ SPACE = " "
+)
+
+const (
+ ALIGN_DEFAULT = iota
+ ALIGN_CENTRE
+ ALIGN_RIGHT
+ ALIGN_LEFT
+)
+
+var (
+ decimal = regexp.MustCompile(`^[0-9]+(.[0-9]+?)$`)
+ percent = regexp.MustCompile(`^[0-9]+(.[0-9]+?)%$`)
+)
+
+type Table struct {
+ out io.Writer
+ rows [][]string
+ lines [][][]string
+ cs map[int]int
+ rs map[int]int
+ headers []string
+ footers []string
+ autoFmt bool
+ autoWrap bool
+ mW int
+ pCenter string
+ pRow string
+ pColumn string
+ tColumn int
+ tRow int
+ align int
+ rowLine bool
+ border bool
+ colSize int
+}
+
+// Start New Table
+// Take io.Writer Directly
+func NewWriter(writer io.Writer) *Table {
+ t := &Table{
+ out: writer,
+ rows: [][]string{},
+ lines: [][][]string{},
+ cs: make(map[int]int),
+ rs: make(map[int]int),
+ headers: []string{},
+ footers: []string{},
+ autoFmt: true,
+ autoWrap: true,
+ mW: MAX_ROW_WIDTH,
+ pCenter: CENTRE,
+ pRow: ROW,
+ pColumn: COLUMN,
+ tColumn: -1,
+ tRow: -1,
+ align: ALIGN_DEFAULT,
+ rowLine: false,
+ border: true,
+ colSize: -1}
+ return t
+}
+
+// Render table output
+func (t Table) Render() {
+ if t.border {
+ t.printLine(true)
+ }
+ t.printHeading()
+ t.printRows()
+
+ if !t.rowLine && t.border {
+ t.printLine(true)
+ }
+ t.printFooter()
+
+}
+
+// Set table header
+func (t *Table) SetHeader(keys []string) {
+ t.colSize = len(keys)
+ for i, v := range keys {
+ t.parseDimension(v, i, -1)
+ t.headers = append(t.headers, v)
+ }
+}
+
+// Set table Footer
+func (t *Table) SetFooter(keys []string) {
+ //t.colSize = len(keys)
+ for i, v := range keys {
+ t.parseDimension(v, i, -1)
+ t.footers = append(t.footers, v)
+ }
+}
+
+// Turn header autoformatting on/off. Default is on (true).
+func (t *Table) SetAutoFormatHeaders(auto bool) {
+ t.autoFmt = auto
+}
+
+// Turn automatic multiline text adjustment on/off. Default is on (true).
+func (t *Table) SetAutoWrapText(auto bool) {
+ t.autoWrap = auto
+}
+
+// Set the Default column width
+func (t *Table) SetColWidth(width int) {
+ t.mW = width
+}
+
+// Set the Column Separator
+func (t *Table) SetColumnSeparator(sep string) {
+ t.pColumn = sep
+}
+
+// Set the Row Separator
+func (t *Table) SetRowSeparator(sep string) {
+ t.pRow = sep
+}
+
+// Set the center Separator
+func (t *Table) SetCenterSeparator(sep string) {
+ t.pCenter = sep
+}
+
+// Set Table Alignment
+func (t *Table) SetAlignment(align int) {
+ t.align = align
+}
+
+// Set Row Line
+// This would enable / disable a line on each row of the table
+func (t *Table) SetRowLine(line bool) {
+ t.rowLine = line
+}
+
+// Set Table Border
+// This would enable / disable line around the table
+func (t *Table) SetBorder(border bool) {
+ t.border = border
+}
+
+// Append row to table
+func (t *Table) Append(row []string) error {
+ rowSize := len(t.headers)
+ if rowSize > t.colSize {
+ t.colSize = rowSize
+ }
+
+ n := len(t.lines)
+ line := [][]string{}
+ for i, v := range row {
+
+ // Detect string width
+ // Detect String height
+ // Break strings into words
+ out := t.parseDimension(v, i, n)
+
+ // Append broken words
+ line = append(line, out)
+ }
+ t.lines = append(t.lines, line)
+ return nil
+}
+
+// Allow Support for Bulk Append
+// Eliminates repeated for loops
+func (t *Table) AppendBulk(rows [][]string) (err error) {
+ for _, row := range rows {
+ err = t.Append(row)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// Print line based on row width
+func (t Table) printLine(nl bool) {
+ fmt.Fprint(t.out, t.pCenter)
+ for i := 0; i < len(t.cs); i++ {
+ v := t.cs[i]
+ fmt.Fprintf(t.out, "%s%s%s%s",
+ t.pRow,
+ strings.Repeat(string(t.pRow), v),
+ t.pRow,
+ t.pCenter)
+ }
+ if nl {
+ fmt.Fprintln(t.out)
+ }
+}
+
+// Print heading information
+func (t Table) printHeading() {
+ // Check if headers is available
+ if len(t.headers) < 1 {
+ return
+ }
+
+ // Check if border is set
+ // Replace with space if not set
+ fmt.Fprint(t.out, ConditionString(t.border, t.pColumn, SPACE))
+
+ // Identify last column
+ end := len(t.cs) - 1
+
+ // Print Heading column
+ for i := 0; i <= end; i++ {
+ v := t.cs[i]
+ h := t.headers[i]
+ if t.autoFmt {
+ h = Title(h)
+ }
+ pad := ConditionString((i == end && !t.border), SPACE, t.pColumn)
+ fmt.Fprintf(t.out, " %s %s",
+ Pad(h, SPACE, v),
+ pad)
+ }
+ // Next line
+ fmt.Fprintln(t.out)
+ t.printLine(true)
+}
+
+// Print heading information
+func (t Table) printFooter() {
+ // Check if headers is available
+ if len(t.footers) < 1 {
+ return
+ }
+
+ // Only print line if border is not set
+ if !t.border {
+ t.printLine(true)
+ }
+ // Check if border is set
+ // Replace with space if not set
+ fmt.Fprint(t.out, ConditionString(t.border, t.pColumn, SPACE))
+
+ // Identify last column
+ end := len(t.cs) - 1
+
+ // Print Heading column
+ for i := 0; i <= end; i++ {
+ v := t.cs[i]
+ f := t.footers[i]
+ if t.autoFmt {
+ f = Title(f)
+ }
+ pad := ConditionString((i == end && !t.border), SPACE, t.pColumn)
+
+ if len(t.footers[i]) == 0 {
+ pad = SPACE
+ }
+ fmt.Fprintf(t.out, " %s %s",
+ Pad(f, SPACE, v),
+ pad)
+ }
+ // Next line
+ fmt.Fprintln(t.out)
+ //t.printLine(true)
+
+ hasPrinted := false
+
+ for i := 0; i <= end; i++ {
+ v := t.cs[i]
+ pad := t.pRow
+ center := t.pCenter
+ length := len(t.footers[i])
+
+ if length > 0 {
+ hasPrinted = true
+ }
+
+ // Set center to be space if length is 0
+ if length == 0 && !t.border {
+ center = SPACE
+ }
+
+ // Print first junction
+ if i == 0 {
+ fmt.Fprint(t.out, center)
+ }
+
+ // Pad With space of length is 0
+ if length == 0 {
+ pad = SPACE
+ }
+ // Ignore left space of it has printed before
+ if hasPrinted || t.border {
+ pad = t.pRow
+ center = t.pCenter
+ }
+
+ // Change Center start position
+ if center == SPACE {
+ if i < end && len(t.footers[i+1]) != 0 {
+ center = t.pCenter
+ }
+ }
+
+ // Print the footer
+ fmt.Fprintf(t.out, "%s%s%s%s",
+ pad,
+ strings.Repeat(string(pad), v),
+ pad,
+ center)
+
+ }
+
+ fmt.Fprintln(t.out)
+
+}
+
+func (t Table) printRows() {
+ for i, lines := range t.lines {
+ t.printRow(lines, i)
+ }
+
+}
+
+// Print Row Information
+// Adjust column alignment based on type
+
+func (t Table) printRow(columns [][]string, colKey int) {
+ // Get Maximum Height
+ max := t.rs[colKey]
+ total := len(columns)
+
+ // TODO Fix uneven col size
+ // if total < t.colSize {
+ // for n := t.colSize - total; n < t.colSize ; n++ {
+ // columns = append(columns, []string{SPACE})
+ // t.cs[n] = t.mW
+ // }
+ //}
+
+ // Pad Each Height
+ // pads := []int{}
+ pads := []int{}
+
+ for i, line := range columns {
+ length := len(line)
+ pad := max - length
+ pads = append(pads, pad)
+ for n := 0; n < pad; n++ {
+ columns[i] = append(columns[i], " ")
+ }
+ }
+ //fmt.Println(max, "\n")
+ for x := 0; x < max; x++ {
+ for y := 0; y < total; y++ {
+
+ // Check if border is set
+ fmt.Fprint(t.out, ConditionString((!t.border && y == 0), SPACE, t.pColumn))
+
+ fmt.Fprintf(t.out, SPACE)
+ str := columns[y][x]
+
+ // This would print alignment
+ // Default alignment would use multiple configuration
+ switch t.align {
+ case ALIGN_CENTRE: //
+ fmt.Fprintf(t.out, "%s", Pad(str, SPACE, t.cs[y]))
+ case ALIGN_RIGHT:
+ fmt.Fprintf(t.out, "%s", PadLeft(str, SPACE, t.cs[y]))
+ case ALIGN_LEFT:
+ fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y]))
+ default:
+ if decimal.MatchString(strings.TrimSpace(str)) || percent.MatchString(strings.TrimSpace(str)) {
+ fmt.Fprintf(t.out, "%s", PadLeft(str, SPACE, t.cs[y]))
+ } else {
+ fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y]))
+
+ // TODO Custom alignment per column
+ //if max == 1 || pads[y] > 0 {
+ // fmt.Fprintf(t.out, "%s", Pad(str, SPACE, t.cs[y]))
+ //} else {
+ // fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y]))
+ //}
+
+ }
+ }
+ fmt.Fprintf(t.out, SPACE)
+ }
+ // Check if border is set
+ // Replace with space if not set
+ fmt.Fprint(t.out, ConditionString(t.border, t.pColumn, SPACE))
+ fmt.Fprintln(t.out)
+ }
+
+ if t.rowLine {
+ t.printLine(true)
+ }
+
+}
+
+func (t *Table) parseDimension(str string, colKey, rowKey int) []string {
+ var (
+ raw []string
+ max int
+ )
+ w := DisplayWidth(str)
+ // Calculate Width
+ // Check if with is grater than maximum width
+ if w > t.mW {
+ w = t.mW
+ }
+
+ // Check if width exists
+ v, ok := t.cs[colKey]
+ if !ok || v < w || v == 0 {
+ t.cs[colKey] = w
+ }
+
+ if rowKey == -1 {
+ return raw
+ }
+ // Calculate Height
+ if t.autoWrap {
+ raw, _ = WrapString(str, t.cs[colKey])
+ } else {
+ raw = getLines(str)
+ }
+
+ for _, line := range raw {
+ if w := DisplayWidth(line); w > max {
+ max = w
+ }
+ }
+
+ // Make sure the with is the same length as maximum word
+ // Important for cases where the width is smaller than maxu word
+ if max > t.cs[colKey] {
+ t.cs[colKey] = max
+ }
+
+ h := len(raw)
+ v, ok = t.rs[rowKey]
+
+ if !ok || v < h || v == 0 {
+ t.rs[rowKey] = h
+ }
+ //fmt.Printf("Raw %+v %d\n", raw, len(raw))
+ return raw
+}
diff --git a/vendor/github.com/olekukonko/tablewriter/table_test.go b/vendor/github.com/olekukonko/tablewriter/table_test.go
new file mode 100644
index 000000000..dd6c794d0
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/table_test.go
@@ -0,0 +1,276 @@
+// Copyright 2014 Oleku Konko All rights reserved.
+// Use of this source code is governed by a MIT
+// license that can be found in the LICENSE file.
+
+// This module is a Table Writer API for the Go Programming Language.
+// The protocols were written in pure Go and works on windows and unix systems
+
+package tablewriter
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+ "testing"
+)
+
+func ExampleShort() {
+
+ data := [][]string{
+ []string{"A", "The Good", "500"},
+ []string{"B", "The Very very Bad Man", "288"},
+ []string{"C", "The Ugly", "120"},
+ []string{"D", "The Gopher", "800"},
+ }
+
+ table := NewWriter(os.Stdout)
+ table.SetHeader([]string{"Name", "Sign", "Rating"})
+
+ for _, v := range data {
+ table.Append(v)
+ }
+ table.Render()
+
+}
+
+func ExampleLong() {
+
+ data := [][]string{
+ []string{"Learn East has computers with adapted keyboards with enlarged print etc", " Some Data ", " Another Data"},
+ []string{"Instead of lining up the letters all ", "the way across, he splits the keyboard in two", "Like most ergonomic keyboards", "See Data"},
+ }
+
+ table := NewWriter(os.Stdout)
+ table.SetHeader([]string{"Name", "Sign", "Rating"})
+ table.SetCenterSeparator("*")
+ table.SetRowSeparator("=")
+
+ for _, v := range data {
+ table.Append(v)
+ }
+ table.Render()
+
+}
+
+func ExampleCSV() {
+ table, _ := NewCSV(os.Stdout, "test.csv", true)
+ table.SetCenterSeparator("*")
+ table.SetRowSeparator("=")
+
+ table.Render()
+}
+
+func TestCSVInfo(t *testing.T) {
+ table, err := NewCSV(os.Stdout, "test_info.csv", true)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ table.SetAlignment(ALIGN_LEFT)
+ table.SetBorder(false)
+ table.Render()
+}
+
+func TestCSVSeparator(t *testing.T) {
+ table, err := NewCSV(os.Stdout, "test.csv", true)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ table.SetRowLine(true)
+ table.SetCenterSeparator("*")
+ table.SetColumnSeparator("‡")
+ table.SetRowSeparator("-")
+ table.SetAlignment(ALIGN_LEFT)
+ table.Render()
+}
+
+func TestBorder(t *testing.T) {
+ data := [][]string{
+ []string{"1/1/2014", "Domain name", "2233", "$10.98"},
+ []string{"1/1/2014", "January Hosting", "2233", "$54.95"},
+ []string{"1/4/2014", "February Hosting", "2233", "$51.00"},
+ []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"},
+ }
+
+ table := NewWriter(os.Stdout)
+ table.SetHeader([]string{"Date", "Description", "CV2", "Amount"})
+ table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer
+ table.SetBorder(false) // Set Border to false
+ table.AppendBulk(data) // Add Bulk Data
+ table.Render()
+}
+
+func TestPrintHeading(t *testing.T) {
+ var buf bytes.Buffer
+ table := NewWriter(&buf)
+ table.SetHeader([]string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"})
+ table.printHeading()
+ want := `| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C |
++---+---+---+---+---+---+---+---+---+---+---+---+
+`
+ got := buf.String()
+ if got != want {
+ t.Errorf("header rendering failed\ngot:\n%s\nwant:\n%s\n", got, want)
+ }
+}
+
+func TestPrintHeadingWithoutAutoFormat(t *testing.T) {
+ var buf bytes.Buffer
+ table := NewWriter(&buf)
+ table.SetHeader([]string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"})
+ table.SetAutoFormatHeaders(false)
+ table.printHeading()
+ want := `| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c |
++---+---+---+---+---+---+---+---+---+---+---+---+
+`
+ got := buf.String()
+ if got != want {
+ t.Errorf("header rendering failed\ngot:\n%s\nwant:\n%s\n", got, want)
+ }
+}
+
+func TestPrintFooter(t *testing.T) {
+ var buf bytes.Buffer
+ table := NewWriter(&buf)
+ table.SetHeader([]string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"})
+ table.SetFooter([]string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"})
+ table.printFooter()
+ want := `| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C |
++---+---+---+---+---+---+---+---+---+---+---+---+
+`
+ got := buf.String()
+ if got != want {
+ t.Errorf("footer rendering failed\ngot:\n%s\nwant:\n%s\n", got, want)
+ }
+}
+
+func TestPrintFooterWithoutAutoFormat(t *testing.T) {
+ var buf bytes.Buffer
+ table := NewWriter(&buf)
+ table.SetAutoFormatHeaders(false)
+ table.SetHeader([]string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"})
+ table.SetFooter([]string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"})
+ table.printFooter()
+ want := `| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c |
++---+---+---+---+---+---+---+---+---+---+---+---+
+`
+ got := buf.String()
+ if got != want {
+ t.Errorf("footer rendering failed\ngot:\n%s\nwant:\n%s\n", got, want)
+ }
+}
+
+func TestPrintTableWithAndWithoutAutoWrap(t *testing.T) {
+ var buf bytes.Buffer
+ var multiline = `A multiline
+string with some lines being really long.`
+
+ with := NewWriter(&buf)
+ with.Append([]string{multiline})
+ with.Render()
+ want := `+--------------------------------+
+| A multiline string with some |
+| lines being really long. |
++--------------------------------+
+`
+ got := buf.String()
+ if got != want {
+ t.Errorf("multiline text rendering with wrapping failed\ngot:\n%s\nwant:\n%s\n", got, want)
+ }
+
+ buf.Truncate(0)
+ without := NewWriter(&buf)
+ without.SetAutoWrapText(false)
+ without.Append([]string{multiline})
+ without.Render()
+ want = `+-------------------------------------------+
+| A multiline |
+| string with some lines being really long. |
++-------------------------------------------+
+`
+ got = buf.String()
+ if got != want {
+ t.Errorf("multiline text rendering without wrapping rendering failed\ngot:\n%s\nwant:\n%s\n", got, want)
+ }
+}
+
+func TestPrintLine(t *testing.T) {
+ header := make([]string, 12)
+ val := " "
+ want := ""
+ for i := range header {
+ header[i] = val
+ want = fmt.Sprintf("%s+-%s-", want, strings.Replace(val, " ", "-", -1))
+ val = val + " "
+ }
+ want = want + "+"
+ var buf bytes.Buffer
+ table := NewWriter(&buf)
+ table.SetHeader(header)
+ table.printLine(false)
+ got := buf.String()
+ if got != want {
+ t.Errorf("line rendering failed\ngot:\n%s\nwant:\n%s\n", got, want)
+ }
+}
+
+func TestAnsiStrip(t *testing.T) {
+ header := make([]string, 12)
+ val := " "
+ want := ""
+ for i := range header {
+ header[i] = "\033[43;30m" + val + "\033[00m"
+ want = fmt.Sprintf("%s+-%s-", want, strings.Replace(val, " ", "-", -1))
+ val = val + " "
+ }
+ want = want + "+"
+ var buf bytes.Buffer
+ table := NewWriter(&buf)
+ table.SetHeader(header)
+ table.printLine(false)
+ got := buf.String()
+ if got != want {
+ t.Errorf("line rendering failed\ngot:\n%s\nwant:\n%s\n", got, want)
+ }
+}
+
+func NewCustomizedTable(out io.Writer) *Table {
+ table := NewWriter(out)
+ table.SetCenterSeparator("")
+ table.SetColumnSeparator("")
+ table.SetRowSeparator("")
+ table.SetBorder(false)
+ table.SetAlignment(ALIGN_LEFT)
+ table.SetHeader([]string{})
+ return table
+}
+
+func TestSubclass(t *testing.T) {
+ buf := new(bytes.Buffer)
+ table := NewCustomizedTable(buf)
+
+ data := [][]string{
+ []string{"A", "The Good", "500"},
+ []string{"B", "The Very very Bad Man", "288"},
+ []string{"C", "The Ugly", "120"},
+ []string{"D", "The Gopher", "800"},
+ }
+
+ for _, v := range data {
+ table.Append(v)
+ }
+ table.Render()
+
+ output := string(buf.Bytes())
+ want := ` A The Good 500
+ B The Very very Bad Man 288
+ C The Ugly 120
+ D The Gopher 800
+`
+ if output != want {
+ t.Error(fmt.Sprintf("Unexpected output '%v' != '%v'", output, want))
+ }
+}
diff --git a/vendor/github.com/olekukonko/tablewriter/test.csv b/vendor/github.com/olekukonko/tablewriter/test.csv
new file mode 100644
index 000000000..1609327e9
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/test.csv
@@ -0,0 +1,4 @@
+first_name,last_name,ssn
+John,Barry,123456
+Kathy,Smith,687987
+Bob,McCornick,3979870
\ No newline at end of file
diff --git a/vendor/github.com/olekukonko/tablewriter/test_info.csv b/vendor/github.com/olekukonko/tablewriter/test_info.csv
new file mode 100644
index 000000000..e4c40e983
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/test_info.csv
@@ -0,0 +1,4 @@
+Field,Type,Null,Key,Default,Extra
+user_id,smallint(5),NO,PRI,NULL,auto_increment
+username,varchar(10),NO,,NULL,
+password,varchar(100),NO,,NULL,
\ No newline at end of file
diff --git a/vendor/github.com/olekukonko/tablewriter/util.go b/vendor/github.com/olekukonko/tablewriter/util.go
new file mode 100644
index 000000000..e006ac620
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/util.go
@@ -0,0 +1,73 @@
+// Copyright 2014 Oleku Konko All rights reserved.
+// Use of this source code is governed by a MIT
+// license that can be found in the LICENSE file.
+
+// This module is a Table Writer API for the Go Programming Language.
+// The protocols were written in pure Go and works on windows and unix systems
+
+package tablewriter
+
+import (
+ "math"
+ "regexp"
+ "strings"
+ "unicode/utf8"
+)
+
+var (
+ ansi = regexp.MustCompile("\033\\[(?:[0-9]{1,3}(?:;[0-9]{1,3})*)?[m|K]")
+)
+
+func DisplayWidth(str string) int {
+ return utf8.RuneCountInString(ansi.ReplaceAllLiteralString(str, ""))
+}
+
+// Simple Condition for string
+// Returns value based on condition
+func ConditionString(cond bool, valid, inValid string) string {
+ if cond {
+ return valid
+ }
+ return inValid
+}
+
+// Format Table Header
+// Replace _ , . and spaces
+func Title(name string) string {
+ name = strings.Replace(name, "_", " ", -1)
+ name = strings.Replace(name, ".", " ", -1)
+ name = strings.TrimSpace(name)
+ return strings.ToUpper(name)
+}
+
+// Pad String
+// Attempts to play string in the center
+func Pad(s, pad string, width int) string {
+ gap := width - DisplayWidth(s)
+ if gap > 0 {
+ gapLeft := int(math.Ceil(float64(gap / 2)))
+ gapRight := gap - gapLeft
+ return strings.Repeat(string(pad), gapLeft) + s + strings.Repeat(string(pad), gapRight)
+ }
+ return s
+}
+
+// Pad String Right position
+// This would pace string at the left side fo the screen
+func PadRight(s, pad string, width int) string {
+ gap := width - DisplayWidth(s)
+ if gap > 0 {
+ return s + strings.Repeat(string(pad), gap)
+ }
+ return s
+}
+
+// Pad String Left position
+// This would pace string at the right side fo the screen
+func PadLeft(s, pad string, width int) string {
+ gap := width - DisplayWidth(s)
+ if gap > 0 {
+ return strings.Repeat(string(pad), gap) + s
+ }
+ return s
+}
diff --git a/vendor/github.com/olekukonko/tablewriter/wrap.go b/vendor/github.com/olekukonko/tablewriter/wrap.go
new file mode 100644
index 000000000..f3747d9f3
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/wrap.go
@@ -0,0 +1,103 @@
+// Copyright 2014 Oleku Konko All rights reserved.
+// Use of this source code is governed by a MIT
+// license that can be found in the LICENSE file.
+
+// This module is a Table Writer API for the Go Programming Language.
+// The protocols were written in pure Go and works on windows and unix systems
+
+package tablewriter
+
+import (
+ "math"
+ "strings"
+ "unicode/utf8"
+)
+
+var (
+ nl = "\n"
+ sp = " "
+)
+
+const defaultPenalty = 1e5
+
+// Wrap wraps s into a paragraph of lines of length lim, with minimal
+// raggedness.
+func WrapString(s string, lim int) ([]string, int) {
+ words := strings.Split(strings.Replace(strings.TrimSpace(s), nl, sp, -1), sp)
+ var lines []string
+ max := 0
+ for _, v := range words {
+ max = len(v)
+ if max > lim {
+ lim = max
+ }
+ }
+ for _, line := range WrapWords(words, 1, lim, defaultPenalty) {
+ lines = append(lines, strings.Join(line, sp))
+ }
+ return lines, lim
+}
+
+// WrapWords is the low-level line-breaking algorithm, useful if you need more
+// control over the details of the text wrapping process. For most uses,
+// WrapString will be sufficient and more convenient.
+//
+// WrapWords splits a list of words into lines with minimal "raggedness",
+// treating each rune as one unit, accounting for spc units between adjacent
+// words on each line, and attempting to limit lines to lim units. Raggedness
+// is the total error over all lines, where error is the square of the
+// difference of the length of the line and lim. Too-long lines (which only
+// happen when a single word is longer than lim units) have pen penalty units
+// added to the error.
+func WrapWords(words []string, spc, lim, pen int) [][]string {
+ n := len(words)
+
+ length := make([][]int, n)
+ for i := 0; i < n; i++ {
+ length[i] = make([]int, n)
+ length[i][i] = utf8.RuneCountInString(words[i])
+ for j := i + 1; j < n; j++ {
+ length[i][j] = length[i][j-1] + spc + utf8.RuneCountInString(words[j])
+ }
+ }
+ nbrk := make([]int, n)
+ cost := make([]int, n)
+ for i := range cost {
+ cost[i] = math.MaxInt32
+ }
+ for i := n - 1; i >= 0; i-- {
+ if length[i][n-1] <= lim {
+ cost[i] = 0
+ nbrk[i] = n
+ } else {
+ for j := i + 1; j < n; j++ {
+ d := lim - length[i][j-1]
+ c := d*d + cost[j]
+ if length[i][j-1] > lim {
+ c += pen // too-long lines get a worse penalty
+ }
+ if c < cost[i] {
+ cost[i] = c
+ nbrk[i] = j
+ }
+ }
+ }
+ }
+ var lines [][]string
+ i := 0
+ for i < n {
+ lines = append(lines, words[i:nbrk[i]])
+ i = nbrk[i]
+ }
+ return lines
+}
+
+// getLines decomposes a multiline string into a slice of strings.
+func getLines(s string) []string {
+ var lines []string
+
+ for _, line := range strings.Split(strings.TrimSpace(s), nl) {
+ lines = append(lines, line)
+ }
+ return lines
+}
diff --git a/vendor/github.com/olekukonko/tablewriter/wrap_test.go b/vendor/github.com/olekukonko/tablewriter/wrap_test.go
new file mode 100644
index 000000000..a4e2642cb
--- /dev/null
+++ b/vendor/github.com/olekukonko/tablewriter/wrap_test.go
@@ -0,0 +1,44 @@
+// Copyright 2014 Oleku Konko All rights reserved.
+// Use of this source code is governed by a MIT
+// license that can be found in the LICENSE file.
+
+// This module is a Table Writer API for the Go Programming Language.
+// The protocols were written in pure Go and works on windows and unix systems
+
+package tablewriter
+
+import (
+ "strings"
+ "testing"
+)
+
+var text = "The quick brown fox jumps over the lazy dog."
+
+func TestWrap(t *testing.T) {
+ exp := []string{
+ "The", "quick", "brown", "fox",
+ "jumps", "over", "the", "lazy", "dog."}
+
+ got, _ := WrapString(text, 6)
+ if len(exp) != len(got) {
+ t.Fail()
+ }
+}
+
+func TestWrapOneLine(t *testing.T) {
+ exp := "The quick brown fox jumps over the lazy dog."
+ words, _ := WrapString(text, 500)
+ got := strings.Join(words, string(sp))
+ if exp != got {
+ t.Fail()
+ }
+}
+
+func TestUnicode(t *testing.T) {
+ input := "Česká řeřicha"
+ wordsUnicode, _ := WrapString(input, 13)
+ // input contains 13 runes, so it fits on one line.
+ if len(wordsUnicode) != 1 {
+ t.Fail()
+ }
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/README.md b/vendor/github.com/rubenv/sql-migrate/README.md
new file mode 100644
index 000000000..897a5f698
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/README.md
@@ -0,0 +1,245 @@
+# sql-migrate
+
+> SQL Schema migration tool for [Go](http://golang.org/). Based on [gorp](https://github.com/go-gorp/gorp) and [goose](https://bitbucket.org/liamstask/goose).
+
+[](https://travis-ci.org/rubenv/sql-migrate) [](https://godoc.org/github.com/rubenv/sql-migrate)
+
+Using [modl](https://github.com/jmoiron/modl)? Check out [modl-migrate](https://github.com/rubenv/modl-migrate).
+
+## Features
+
+* Usable as a CLI tool or as a library
+* Supports SQLite, PostgreSQL, MySQL, MSSQL and Oracle databases (through [gorp](https://github.com/go-gorp/gorp))
+* Can embed migrations into your application
+* Migrations are defined with SQL for full flexibility
+* Atomic migrations
+* Up/down migrations to allow rollback
+* Supports multiple database types in one project
+
+## Installation
+
+To install the library and command line program, use the following:
+
+```bash
+go get github.com/rubenv/sql-migrate/...
+```
+
+## Usage
+### As a standalone tool
+```
+$ sql-migrate --help
+usage: sql-migrate [--version] [--help] []
+
+Available commands are:
+ down Undo a database migration
+ redo Reapply the last migration
+ status Show migration status
+ up Migrates the database to the most recent version available
+```
+
+Each command requires a configuration file (which defaults to `dbconfig.yml`, but can be specified with the `-config` flag). This config file should specify one or more environments:
+
+```yml
+development:
+ dialect: sqlite3
+ datasource: test.db
+ dir: migrations/sqlite3
+
+production:
+ dialect: postgres
+ datasource: dbname=myapp sslmode=disable
+ dir: migrations/postgres
+ table: migrations
+```
+
+The `table` setting is optional and will default to `gorp_migrations`.
+
+The environment that will be used can be specified with the `-env` flag (defaults to `development`).
+
+Use the `--help` flag in combination with any of the commands to get an overview of its usage:
+
+```
+$ sql-migrate up --help
+Usage: sql-migrate up [options] ...
+
+ Migrates the database to the most recent version available.
+
+Options:
+
+ -config=config.yml Configuration file to use.
+ -env="development" Environment.
+ -limit=0 Limit the number of migrations (0 = unlimited).
+ -dryrun Don't apply migrations, just print them.
+```
+
+The `up` command applies all available migrations. By contrast, `down` will only apply one migration by default. This behavior can be changed for both by using the `-limit` parameter.
+
+The `redo` command will unapply the last migration and reapply it. This is useful during development, when you're writing migrations.
+
+Use the `status` command to see the state of the applied migrations:
+
+```bash
+$ sql-migrate status
++---------------+-----------------------------------------+
+| MIGRATION | APPLIED |
++---------------+-----------------------------------------+
+| 1_initial.sql | 2014-09-13 08:19:06.788354925 +0000 UTC |
+| 2_record.sql | no |
++---------------+-----------------------------------------+
+```
+
+### As a library
+Import sql-migrate into your application:
+
+```go
+import "github.com/rubenv/sql-migrate"
+```
+
+Set up a source of migrations, this can be from memory, from a set of files or from bindata (more on that later):
+
+```go
+// Hardcoded strings in memory:
+migrations := &migrate.MemoryMigrationSource{
+ Migrations: []*migrate.Migration{
+ &migrate.Migration{
+ Id: "123",
+ Up: []string{"CREATE TABLE people (id int)"},
+ Down: []string{"DROP TABLE people"},
+ },
+ },
+}
+
+// OR: Read migrations from a folder:
+migrations := &migrate.FileMigrationSource{
+ Dir: "db/migrations",
+}
+
+// OR: Use migrations from bindata:
+migrations := &migrate.AssetMigrationSource{
+ Asset: Asset,
+ AssetDir: AssetDir,
+ Dir: "migrations",
+}
+```
+
+Then use the `Exec` function to upgrade your database:
+
+```go
+db, err := sql.Open("sqlite3", filename)
+if err != nil {
+ // Handle errors!
+}
+
+n, err := migrate.Exec(db, "sqlite3", migrations, migrate.Up)
+if err != nil {
+ // Handle errors!
+}
+fmt.Printf("Applied %d migrations!\n", n)
+```
+
+Note that `n` can be greater than `0` even if there is an error: any migration that succeeded will remain applied even if a later one fails.
+
+Check [the GoDoc reference](https://godoc.org/github.com/rubenv/sql-migrate) for the full documentation.
+
+## Writing migrations
+Migrations are defined in SQL files, which contain a set of SQL statements. Special comments are used to distinguish up and down migrations.
+
+```sql
+-- +migrate Up
+-- SQL in section 'Up' is executed when this migration is applied
+CREATE TABLE people (id int);
+
+
+-- +migrate Down
+-- SQL section 'Down' is executed when this migration is rolled back
+DROP TABLE people;
+```
+
+You can put multiple statements in each block, as long as you end them with a semicolon (`;`).
+
+If you have complex statements which contain semicolons, use `StatementBegin` and `StatementEnd` to indicate boundaries:
+
+```sql
+-- +migrate Up
+CREATE TABLE people (id int);
+
+-- +migrate StatementBegin
+CREATE OR REPLACE FUNCTION do_something()
+returns void AS $$
+DECLARE
+ create_query text;
+BEGIN
+ -- Do something here
+END;
+$$
+language plpgsql;
+-- +migrate StatementEnd
+
+-- +migrate Down
+DROP FUNCTION do_something();
+DROP TABLE people;
+```
+
+The order in which migrations are applied is defined through the filename: sql-migrate will sort migrations based on their name. It's recommended to use an increasing version number or a timestamp as the first part of the filename.
+
+## Embedding migrations with [bindata](https://github.com/jteeuwen/go-bindata)
+If you like your Go applications self-contained (that is: a single binary): use [bindata](https://github.com/jteeuwen/go-bindata) to embed the migration files.
+
+Just write your migration files as usual, as a set of SQL files in a folder.
+
+Then use bindata to generate a `.go` file with the migrations embedded:
+
+```bash
+go-bindata -pkg myapp -o bindata.go db/migrations/
+```
+
+The resulting `bindata.go` file will contain your migrations. Remember to regenerate your `bindata.go` file whenever you add/modify a migration (`go generate` will help here, once it arrives).
+
+Use the `AssetMigrationSource` in your application to find the migrations:
+
+```go
+migrations := &migrate.AssetMigrationSource{
+ Asset: Asset,
+ AssetDir: AssetDir,
+ Dir: "db/migrations",
+}
+```
+
+Both `Asset` and `AssetDir` are functions provided by bindata.
+
+Then proceed as usual.
+
+## Extending
+Adding a new migration source means implementing `MigrationSource`.
+
+```go
+type MigrationSource interface {
+ FindMigrations() ([]*Migration, error)
+}
+```
+
+The resulting slice of migrations will be executed in the given order, so it should usually be sorted by the `Id` field.
+
+## License
+
+ (The MIT License)
+
+ Copyright (C) 2014-2015 by Ruben Vermeersch
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
diff --git a/vendor/github.com/rubenv/sql-migrate/bindata_test.go b/vendor/github.com/rubenv/sql-migrate/bindata_test.go
new file mode 100644
index 000000000..21cd42206
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/bindata_test.go
@@ -0,0 +1,136 @@
+package migrate
+
+import (
+ "bytes"
+ "compress/gzip"
+ "fmt"
+ "io"
+ "strings"
+)
+
+func bindata_read(data []byte, name string) ([]byte, error) {
+ gz, err := gzip.NewReader(bytes.NewBuffer(data))
+ if err != nil {
+ return nil, fmt.Errorf("Read %q: %v", name, err)
+ }
+
+ var buf bytes.Buffer
+ _, err = io.Copy(&buf, gz)
+ gz.Close()
+
+ if err != nil {
+ return nil, fmt.Errorf("Read %q: %v", name, err)
+ }
+
+ return buf.Bytes(), nil
+}
+
+func test_migrations_1_initial_sql() ([]byte, error) {
+ return bindata_read([]byte{
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0x8c, 0xcd,
+ 0x3d, 0x0e, 0x82, 0x40, 0x10, 0x05, 0xe0, 0x7e, 0x4e, 0xf1, 0x3a, 0x34,
+ 0x86, 0x13, 0x50, 0xa1, 0xd0, 0x91, 0xa8, 0x08, 0x07, 0x40, 0x76, 0x22,
+ 0x13, 0xd7, 0xdd, 0x09, 0xac, 0xc1, 0xe3, 0xbb, 0xc4, 0x68, 0xb4, 0xb3,
+ 0x7c, 0x6f, 0x7e, 0xbe, 0x34, 0xc5, 0xe6, 0x26, 0x97, 0xb1, 0x0b, 0x8c,
+ 0x56, 0x29, 0xc6, 0xd3, 0xb1, 0x82, 0x38, 0x4c, 0xdc, 0x07, 0xf1, 0x0e,
+ 0x49, 0xab, 0x09, 0x64, 0x02, 0x3f, 0xb8, 0xbf, 0x07, 0x36, 0x98, 0x07,
+ 0x76, 0x08, 0x43, 0xac, 0x5e, 0x77, 0xcb, 0x52, 0x0c, 0x9d, 0xaa, 0x15,
+ 0x36, 0xb4, 0xab, 0xcb, 0xbc, 0x29, 0xd1, 0xe4, 0xdb, 0xaa, 0x84, 0xb2,
+ 0x57, 0xcb, 0x58, 0x89, 0x89, 0x2f, 0xc3, 0x3a, 0x23, 0xa2, 0x6f, 0xb0,
+ 0xf0, 0xb3, 0x7b, 0x93, 0x1f, 0x6f, 0x29, 0xff, 0x12, 0x47, 0x6f, 0x6d,
+ 0x9c, 0x9e, 0xbb, 0xfe, 0x4a, 0x45, 0xbd, 0x3f, 0xfc, 0x98, 0x19, 0x3d,
+ 0x03, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x70, 0x5e, 0xf9, 0xda, 0x00, 0x00,
+ 0x00,
+ },
+ "test-migrations/1_initial.sql",
+ )
+}
+
+func test_migrations_2_record_sql() ([]byte, error) {
+ return bindata_read([]byte{
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xd2, 0xd5,
+ 0x55, 0xd0, 0xce, 0xcd, 0x4c, 0x2f, 0x4a, 0x2c, 0x49, 0x55, 0x08, 0x2d,
+ 0xe0, 0xf2, 0xf4, 0x0b, 0x76, 0x0d, 0x0a, 0x51, 0xf0, 0xf4, 0x0b, 0xf1,
+ 0x57, 0x28, 0x48, 0xcd, 0x2f, 0xc8, 0x49, 0x55, 0xd0, 0xc8, 0x4c, 0xd1,
+ 0x54, 0x08, 0x73, 0xf4, 0x09, 0x75, 0x0d, 0x56, 0xd0, 0x30, 0xd4, 0xb4,
+ 0xe6, 0xe2, 0x42, 0xd6, 0xe3, 0x92, 0x5f, 0x9e, 0xc7, 0xe5, 0xe2, 0xea,
+ 0xe3, 0x1a, 0xe2, 0xaa, 0xe0, 0x16, 0xe4, 0xef, 0x0b, 0xd3, 0x15, 0xee,
+ 0xe1, 0x1a, 0xe4, 0xaa, 0x90, 0x99, 0x62, 0x6b, 0x68, 0xcd, 0x05, 0x08,
+ 0x00, 0x00, 0xff, 0xff, 0xf4, 0x3a, 0x7b, 0xae, 0x64, 0x00, 0x00, 0x00,
+ },
+ "test-migrations/2_record.sql",
+ )
+}
+
+// Asset loads and returns the asset for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func Asset(name string) ([]byte, error) {
+ cannonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[cannonicalName]; ok {
+ return f()
+ }
+ return nil, fmt.Errorf("Asset %s not found", name)
+}
+
+// AssetNames returns the names of the assets.
+func AssetNames() []string {
+ names := make([]string, 0, len(_bindata))
+ for name := range _bindata {
+ names = append(names, name)
+ }
+ return names
+}
+
+// _bindata is a table, holding each asset generator, mapped to its name.
+var _bindata = map[string]func() ([]byte, error){
+ "test-migrations/1_initial.sql": test_migrations_1_initial_sql,
+ "test-migrations/2_record.sql": test_migrations_2_record_sql,
+}
+// AssetDir returns the file names below a certain
+// directory embedded in the file by go-bindata.
+// For example if you run go-bindata on data/... and data contains the
+// following hierarchy:
+// data/
+// foo.txt
+// img/
+// a.png
+// b.png
+// then AssetDir("data") would return []string{"foo.txt", "img"}
+// AssetDir("data/img") would return []string{"a.png", "b.png"}
+// AssetDir("foo.txt") and AssetDir("notexist") would return an error
+// AssetDir("") will return []string{"data"}.
+func AssetDir(name string) ([]string, error) {
+ node := _bintree
+ if len(name) != 0 {
+ cannonicalName := strings.Replace(name, "\\", "/", -1)
+ pathList := strings.Split(cannonicalName, "/")
+ for _, p := range pathList {
+ node = node.Children[p]
+ if node == nil {
+ return nil, fmt.Errorf("Asset %s not found", name)
+ }
+ }
+ }
+ if node.Func != nil {
+ return nil, fmt.Errorf("Asset %s not found", name)
+ }
+ rv := make([]string, 0, len(node.Children))
+ for name := range node.Children {
+ rv = append(rv, name)
+ }
+ return rv, nil
+}
+
+type _bintree_t struct {
+ Func func() ([]byte, error)
+ Children map[string]*_bintree_t
+}
+var _bintree = &_bintree_t{nil, map[string]*_bintree_t{
+ "test-migrations": &_bintree_t{nil, map[string]*_bintree_t{
+ "1_initial.sql": &_bintree_t{test_migrations_1_initial_sql, map[string]*_bintree_t{
+ }},
+ "2_record.sql": &_bintree_t{test_migrations_2_record_sql, map[string]*_bintree_t{
+ }},
+ }},
+}}
diff --git a/vendor/github.com/rubenv/sql-migrate/doc.go b/vendor/github.com/rubenv/sql-migrate/doc.go
new file mode 100644
index 000000000..63db39f52
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/doc.go
@@ -0,0 +1,199 @@
+/*
+
+SQL Schema migration tool for Go.
+
+Key features:
+
+ * Usable as a CLI tool or as a library
+ * Supports SQLite, PostgreSQL, MySQL, MSSQL and Oracle databases (through gorp)
+ * Can embed migrations into your application
+ * Migrations are defined with SQL for full flexibility
+ * Atomic migrations
+ * Up/down migrations to allow rollback
+ * Supports multiple database types in one project
+
+Installation
+
+To install the library and command line program, use the following:
+
+ go get github.com/rubenv/sql-migrate/...
+
+Command-line tool
+
+The main command is called sql-migrate.
+
+ $ sql-migrate --help
+ usage: sql-migrate [--version] [--help] []
+
+ Available commands are:
+ down Undo a database migration
+ redo Reapply the last migration
+ status Show migration status
+ up Migrates the database to the most recent version available
+
+Each command requires a configuration file (which defaults to dbconfig.yml, but can be specified with the -config flag). This config file should specify one or more environments:
+
+ development:
+ dialect: sqlite3
+ datasource: test.db
+ dir: migrations/sqlite3
+
+ production:
+ dialect: postgres
+ datasource: dbname=myapp sslmode=disable
+ dir: migrations/postgres
+ table: migrations
+
+The `table` setting is optional and will default to `gorp_migrations`.
+
+The environment that will be used can be specified with the -env flag (defaults to development).
+
+Use the --help flag in combination with any of the commands to get an overview of its usage:
+
+ $ sql-migrate up --help
+ Usage: sql-migrate up [options] ...
+
+ Migrates the database to the most recent version available.
+
+ Options:
+
+ -config=config.yml Configuration file to use.
+ -env="development" Environment.
+ -limit=0 Limit the number of migrations (0 = unlimited).
+ -dryrun Don't apply migrations, just print them.
+
+The up command applies all available migrations. By contrast, down will only apply one migration by default. This behavior can be changed for both by using the -limit parameter.
+
+The redo command will unapply the last migration and reapply it. This is useful during development, when you're writing migrations.
+
+Use the status command to see the state of the applied migrations:
+
+ $ sql-migrate status
+ +---------------+-----------------------------------------+
+ | MIGRATION | APPLIED |
+ +---------------+-----------------------------------------+
+ | 1_initial.sql | 2014-09-13 08:19:06.788354925 +0000 UTC |
+ | 2_record.sql | no |
+ +---------------+-----------------------------------------+
+
+Library
+
+Import sql-migrate into your application:
+
+ import "github.com/rubenv/sql-migrate"
+
+Set up a source of migrations, this can be from memory, from a set of files or from bindata (more on that later):
+
+ // Hardcoded strings in memory:
+ migrations := &migrate.MemoryMigrationSource{
+ Migrations: []*migrate.Migration{
+ &migrate.Migration{
+ Id: "123",
+ Up: []string{"CREATE TABLE people (id int)"},
+ Down: []string{"DROP TABLE people"},
+ },
+ },
+ }
+
+ // OR: Read migrations from a folder:
+ migrations := &migrate.FileMigrationSource{
+ Dir: "db/migrations",
+ }
+
+ // OR: Use migrations from bindata:
+ migrations := &migrate.AssetMigrationSource{
+ Asset: Asset,
+ AssetDir: AssetDir,
+ Dir: "migrations",
+ }
+
+Then use the Exec function to upgrade your database:
+
+ db, err := sql.Open("sqlite3", filename)
+ if err != nil {
+ // Handle errors!
+ }
+
+ n, err := migrate.Exec(db, "sqlite3", migrations, migrate.Up)
+ if err != nil {
+ // Handle errors!
+ }
+ fmt.Printf("Applied %d migrations!\n", n)
+
+Note that n can be greater than 0 even if there is an error: any migration that succeeded will remain applied even if a later one fails.
+
+The full set of capabilities can be found in the API docs below.
+
+Writing migrations
+
+Migrations are defined in SQL files, which contain a set of SQL statements. Special comments are used to distinguish up and down migrations.
+
+ -- +migrate Up
+ -- SQL in section 'Up' is executed when this migration is applied
+ CREATE TABLE people (id int);
+
+
+ -- +migrate Down
+ -- SQL section 'Down' is executed when this migration is rolled back
+ DROP TABLE people;
+
+You can put multiple statements in each block, as long as you end them with a semicolon (;).
+
+If you have complex statements which contain semicolons, use StatementBegin and StatementEnd to indicate boundaries:
+
+ -- +migrate Up
+ CREATE TABLE people (id int);
+
+ -- +migrate StatementBegin
+ CREATE OR REPLACE FUNCTION do_something()
+ returns void AS $$
+ DECLARE
+ create_query text;
+ BEGIN
+ -- Do something here
+ END;
+ $$
+ language plpgsql;
+ -- +migrate StatementEnd
+
+ -- +migrate Down
+ DROP FUNCTION do_something();
+ DROP TABLE people;
+
+The order in which migrations are applied is defined through the filename: sql-migrate will sort migrations based on their name. It's recommended to use an increasing version number or a timestamp as the first part of the filename.
+
+Embedding migrations with bindata
+
+If you like your Go applications self-contained (that is: a single binary): use bindata (https://github.com/jteeuwen/go-bindata) to embed the migration files.
+
+Just write your migration files as usual, as a set of SQL files in a folder.
+
+Then use bindata to generate a .go file with the migrations embedded:
+
+ go-bindata -pkg myapp -o bindata.go db/migrations/
+
+The resulting bindata.go file will contain your migrations. Remember to regenerate your bindata.go file whenever you add/modify a migration (go generate will help here, once it arrives).
+
+Use the AssetMigrationSource in your application to find the migrations:
+
+ migrations := &migrate.AssetMigrationSource{
+ Asset: Asset,
+ AssetDir: AssetDir,
+ Dir: "db/migrations",
+ }
+
+Both Asset and AssetDir are functions provided by bindata.
+
+Then proceed as usual.
+
+Extending
+
+Adding a new migration source means implementing MigrationSource.
+
+ type MigrationSource interface {
+ FindMigrations() ([]*Migration, error)
+ }
+
+The resulting slice of migrations will be executed in the given order, so it should usually be sorted by the Id field.
+*/
+package migrate
diff --git a/vendor/github.com/rubenv/sql-migrate/init_test.go b/vendor/github.com/rubenv/sql-migrate/init_test.go
new file mode 100644
index 000000000..ce1a1716f
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/init_test.go
@@ -0,0 +1,9 @@
+package migrate
+
+import (
+ "testing"
+
+ . "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { TestingT(t) }
diff --git a/vendor/github.com/rubenv/sql-migrate/migrate.go b/vendor/github.com/rubenv/sql-migrate/migrate.go
new file mode 100644
index 000000000..4f36982f2
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/migrate.go
@@ -0,0 +1,475 @@
+package migrate
+
+import (
+ "bytes"
+ "database/sql"
+ "errors"
+ "fmt"
+ "io"
+ "os"
+ "path"
+ "regexp"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/rubenv/sql-migrate/sqlparse"
+ "gopkg.in/gorp.v1"
+)
+
+type MigrationDirection int
+
+const (
+ Up MigrationDirection = iota
+ Down
+)
+
+var tableName = "gorp_migrations"
+var schemaName = ""
+var numberPrefixRegex = regexp.MustCompile(`^(\d+).*$`)
+
+// Set the name of the table used to store migration info.
+//
+// Should be called before any other call such as (Exec, ExecMax, ...).
+func SetTable(name string) {
+ if name != "" {
+ tableName = name
+ }
+}
+
+// SetSchema sets the name of a schema that the migration table be referenced.
+func SetSchema(name string) {
+ if name != "" {
+ schemaName = name
+ }
+}
+
+func getTableName() string {
+ t := tableName
+ if schemaName != "" {
+ t = fmt.Sprintf("%s.%s", schemaName, t)
+ }
+
+ return t
+}
+
+type Migration struct {
+ Id string
+ Up []string
+ Down []string
+}
+
+func (m Migration) Less(other *Migration) bool {
+ switch {
+ case m.isNumeric() && other.isNumeric():
+ return m.VersionInt() < other.VersionInt()
+ case m.isNumeric() && !other.isNumeric():
+ return true
+ case !m.isNumeric() && other.isNumeric():
+ return false
+ default:
+ return m.Id < other.Id
+ }
+}
+
+func (m Migration) isNumeric() bool {
+ return len(m.NumberPrefixMatches()) > 0
+}
+
+func (m Migration) NumberPrefixMatches() []string {
+ return numberPrefixRegex.FindStringSubmatch(m.Id)
+}
+
+func (m Migration) VersionInt() int64 {
+ v := m.NumberPrefixMatches()[1]
+ value, err := strconv.ParseInt(v, 10, 64)
+ if err != nil {
+ panic(fmt.Sprintf("Could not parse %q into int64: %s", v, err))
+ }
+ return value
+}
+
+type PlannedMigration struct {
+ *Migration
+ Queries []string
+}
+
+type byId []*Migration
+
+func (b byId) Len() int { return len(b) }
+func (b byId) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
+func (b byId) Less(i, j int) bool { return b[i].Less(b[j]) }
+
+type MigrationRecord struct {
+ Id string `db:"id"`
+ AppliedAt time.Time `db:"applied_at"`
+}
+
+var MigrationDialects = map[string]gorp.Dialect{
+ "sqlite3": gorp.SqliteDialect{},
+ "postgres": gorp.PostgresDialect{},
+ "mysql": gorp.MySQLDialect{"InnoDB", "UTF8"},
+ "mssql": gorp.SqlServerDialect{},
+ "oci8": gorp.OracleDialect{},
+}
+
+type MigrationSource interface {
+ // Finds the migrations.
+ //
+ // The resulting slice of migrations should be sorted by Id.
+ FindMigrations() ([]*Migration, error)
+}
+
+// A hardcoded set of migrations, in-memory.
+type MemoryMigrationSource struct {
+ Migrations []*Migration
+}
+
+var _ MigrationSource = (*MemoryMigrationSource)(nil)
+
+func (m MemoryMigrationSource) FindMigrations() ([]*Migration, error) {
+ // Make sure migrations are sorted
+ sort.Sort(byId(m.Migrations))
+
+ return m.Migrations, nil
+}
+
+// A set of migrations loaded from a directory.
+type FileMigrationSource struct {
+ Dir string
+}
+
+var _ MigrationSource = (*FileMigrationSource)(nil)
+
+func (f FileMigrationSource) FindMigrations() ([]*Migration, error) {
+ migrations := make([]*Migration, 0)
+
+ file, err := os.Open(f.Dir)
+ if err != nil {
+ return nil, err
+ }
+
+ files, err := file.Readdir(0)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, info := range files {
+ if strings.HasSuffix(info.Name(), ".sql") {
+ file, err := os.Open(path.Join(f.Dir, info.Name()))
+ if err != nil {
+ return nil, err
+ }
+
+ migration, err := ParseMigration(info.Name(), file)
+ if err != nil {
+ return nil, err
+ }
+
+ migrations = append(migrations, migration)
+ }
+ }
+
+ // Make sure migrations are sorted
+ sort.Sort(byId(migrations))
+
+ return migrations, nil
+}
+
+// Migrations from a bindata asset set.
+type AssetMigrationSource struct {
+ // Asset should return content of file in path if exists
+ Asset func(path string) ([]byte, error)
+
+ // AssetDir should return list of files in the path
+ AssetDir func(path string) ([]string, error)
+
+ // Path in the bindata to use.
+ Dir string
+}
+
+var _ MigrationSource = (*AssetMigrationSource)(nil)
+
+func (a AssetMigrationSource) FindMigrations() ([]*Migration, error) {
+ migrations := make([]*Migration, 0)
+
+ files, err := a.AssetDir(a.Dir)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, name := range files {
+ if strings.HasSuffix(name, ".sql") {
+ file, err := a.Asset(path.Join(a.Dir, name))
+ if err != nil {
+ return nil, err
+ }
+
+ migration, err := ParseMigration(name, bytes.NewReader(file))
+ if err != nil {
+ return nil, err
+ }
+
+ migrations = append(migrations, migration)
+ }
+ }
+
+ // Make sure migrations are sorted
+ sort.Sort(byId(migrations))
+
+ return migrations, nil
+}
+
+// Migration parsing
+func ParseMigration(id string, r io.ReadSeeker) (*Migration, error) {
+ m := &Migration{
+ Id: id,
+ }
+
+ up, err := sqlparse.SplitSQLStatements(r, true)
+ if err != nil {
+ return nil, err
+ }
+
+ down, err := sqlparse.SplitSQLStatements(r, false)
+ if err != nil {
+ return nil, err
+ }
+
+ m.Up = up
+ m.Down = down
+
+ return m, nil
+}
+
+// Execute a set of migrations
+//
+// Returns the number of applied migrations.
+func Exec(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection) (int, error) {
+ return ExecMax(db, dialect, m, dir, 0)
+}
+
+// Execute a set of migrations
+//
+// Will apply at most `max` migrations. Pass 0 for no limit (or use Exec).
+//
+// Returns the number of applied migrations.
+func ExecMax(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, max int) (int, error) {
+ migrations, dbMap, err := PlanMigration(db, dialect, m, dir, max)
+ if err != nil {
+ return 0, err
+ }
+
+ // Apply migrations
+ applied := 0
+ for _, migration := range migrations {
+ trans, err := dbMap.Begin()
+ if err != nil {
+ return applied, err
+ }
+
+ for _, stmt := range migration.Queries {
+ _, err := trans.Exec(stmt)
+ if err != nil {
+ trans.Rollback()
+ return applied, err
+ }
+ }
+
+ if dir == Up {
+ err = trans.Insert(&MigrationRecord{
+ Id: migration.Id,
+ AppliedAt: time.Now(),
+ })
+ if err != nil {
+ return applied, err
+ }
+ } else if dir == Down {
+ _, err := trans.Delete(&MigrationRecord{
+ Id: migration.Id,
+ })
+ if err != nil {
+ return applied, err
+ }
+ } else {
+ panic("Not possible")
+ }
+
+ err = trans.Commit()
+ if err != nil {
+ return applied, err
+ }
+
+ applied++
+ }
+
+ return applied, nil
+}
+
+// Plan a migration.
+func PlanMigration(db *sql.DB, dialect string, m MigrationSource, dir MigrationDirection, max int) ([]*PlannedMigration, *gorp.DbMap, error) {
+ dbMap, err := getMigrationDbMap(db, dialect)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ migrations, err := m.FindMigrations()
+ if err != nil {
+ return nil, nil, err
+ }
+
+ var migrationRecords []MigrationRecord
+ _, err = dbMap.Select(&migrationRecords, fmt.Sprintf("SELECT * FROM %s", getTableName()))
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // Sort migrations that have been run by Id.
+ var existingMigrations []*Migration
+ for _, migrationRecord := range migrationRecords {
+ existingMigrations = append(existingMigrations, &Migration{
+ Id: migrationRecord.Id,
+ })
+ }
+ sort.Sort(byId(existingMigrations))
+
+ // Get last migration that was run
+ record := &Migration{}
+ if len(existingMigrations) > 0 {
+ record = existingMigrations[len(existingMigrations)-1]
+ }
+
+ result := make([]*PlannedMigration, 0)
+
+ // Add missing migrations up to the last run migration.
+ // This can happen for example when merges happened.
+ if len(existingMigrations) > 0 {
+ result = append(result, ToCatchup(migrations, existingMigrations, record)...)
+ }
+
+ // Figure out which migrations to apply
+ toApply := ToApply(migrations, record.Id, dir)
+ toApplyCount := len(toApply)
+ if max > 0 && max < toApplyCount {
+ toApplyCount = max
+ }
+ for _, v := range toApply[0:toApplyCount] {
+
+ if dir == Up {
+ result = append(result, &PlannedMigration{
+ Migration: v,
+ Queries: v.Up,
+ })
+ } else if dir == Down {
+ result = append(result, &PlannedMigration{
+ Migration: v,
+ Queries: v.Down,
+ })
+ }
+ }
+
+ return result, dbMap, nil
+}
+
+// Filter a slice of migrations into ones that should be applied.
+func ToApply(migrations []*Migration, current string, direction MigrationDirection) []*Migration {
+ var index = -1
+ if current != "" {
+ for index < len(migrations)-1 {
+ index++
+ if migrations[index].Id == current {
+ break
+ }
+ }
+ }
+
+ if direction == Up {
+ return migrations[index+1:]
+ } else if direction == Down {
+ if index == -1 {
+ return []*Migration{}
+ }
+
+ // Add in reverse order
+ toApply := make([]*Migration, index+1)
+ for i := 0; i < index+1; i++ {
+ toApply[index-i] = migrations[i]
+ }
+ return toApply
+ }
+
+ panic("Not possible")
+}
+
+func ToCatchup(migrations, existingMigrations []*Migration, lastRun *Migration) []*PlannedMigration {
+ missing := make([]*PlannedMigration, 0)
+ for _, migration := range migrations {
+ found := false
+ for _, existing := range existingMigrations {
+ if existing.Id == migration.Id {
+ found = true
+ break
+ }
+ }
+ if !found && migration.Less(lastRun) {
+ missing = append(missing, &PlannedMigration{Migration: migration, Queries: migration.Up})
+ }
+ }
+ return missing
+}
+
+func GetMigrationRecords(db *sql.DB, dialect string) ([]*MigrationRecord, error) {
+ dbMap, err := getMigrationDbMap(db, dialect)
+ if err != nil {
+ return nil, err
+ }
+
+ var records []*MigrationRecord
+ query := fmt.Sprintf("SELECT * FROM %s ORDER BY id ASC", getTableName())
+ _, err = dbMap.Select(&records, query)
+ if err != nil {
+ return nil, err
+ }
+
+ return records, nil
+}
+
+func getMigrationDbMap(db *sql.DB, dialect string) (*gorp.DbMap, error) {
+ d, ok := MigrationDialects[dialect]
+ if !ok {
+ return nil, fmt.Errorf("Unknown dialect: %s", dialect)
+ }
+
+ // When using the mysql driver, make sure that the parseTime option is
+ // configured, otherwise it won't map time columns to time.Time. See
+ // https://github.com/rubenv/sql-migrate/issues/2
+ if dialect == "mysql" {
+ var out *time.Time
+ err := db.QueryRow("SELECT NOW()").Scan(&out)
+ if err != nil {
+ if err.Error() == "sql: Scan error on column index 0: unsupported driver -> Scan pair: []uint8 -> *time.Time" {
+ return nil, errors.New(`Cannot parse dates.
+
+Make sure that the parseTime option is supplied to your database connection.
+Check https://github.com/go-sql-driver/mysql#parsetime for more info.`)
+ } else {
+ return nil, err
+ }
+ }
+ }
+
+ // Create migration database map
+ dbMap := &gorp.DbMap{Db: db, Dialect: d}
+ dbMap.AddTableWithNameAndSchema(MigrationRecord{}, schemaName, tableName).SetKeys(false, "Id")
+ //dbMap.TraceOn("", log.New(os.Stdout, "migrate: ", log.Lmicroseconds))
+
+ err := dbMap.CreateTablesIfNotExists()
+ if err != nil {
+ return nil, err
+ }
+
+ return dbMap, nil
+}
+
+// TODO: Run migration + record insert in transaction.
diff --git a/vendor/github.com/rubenv/sql-migrate/migrate_test.go b/vendor/github.com/rubenv/sql-migrate/migrate_test.go
new file mode 100644
index 000000000..cbe724950
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/migrate_test.go
@@ -0,0 +1,357 @@
+package migrate
+
+import (
+ "database/sql"
+ "os"
+
+ _ "github.com/mattn/go-sqlite3"
+ . "gopkg.in/check.v1"
+ "gopkg.in/gorp.v1"
+)
+
+var filename = "/tmp/sql-migrate-sqlite.db"
+var sqliteMigrations = []*Migration{
+ &Migration{
+ Id: "123",
+ Up: []string{"CREATE TABLE people (id int)"},
+ Down: []string{"DROP TABLE people"},
+ },
+ &Migration{
+ Id: "124",
+ Up: []string{"ALTER TABLE people ADD COLUMN first_name text"},
+ Down: []string{"SELECT 0"}, // Not really supported
+ },
+}
+
+type SqliteMigrateSuite struct {
+ Db *sql.DB
+ DbMap *gorp.DbMap
+}
+
+var _ = Suite(&SqliteMigrateSuite{})
+
+func (s *SqliteMigrateSuite) SetUpTest(c *C) {
+ db, err := sql.Open("sqlite3", filename)
+ c.Assert(err, IsNil)
+
+ s.Db = db
+ s.DbMap = &gorp.DbMap{Db: db, Dialect: &gorp.SqliteDialect{}}
+}
+
+func (s *SqliteMigrateSuite) TearDownTest(c *C) {
+ err := os.Remove(filename)
+ c.Assert(err, IsNil)
+}
+
+func (s *SqliteMigrateSuite) TestRunMigration(c *C) {
+ migrations := &MemoryMigrationSource{
+ Migrations: sqliteMigrations[:1],
+ }
+
+ // Executes one migration
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 1)
+
+ // Can use table now
+ _, err = s.DbMap.Exec("SELECT * FROM people")
+ c.Assert(err, IsNil)
+
+ // Shouldn't apply migration again
+ n, err = Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 0)
+}
+
+func (s *SqliteMigrateSuite) TestMigrateMultiple(c *C) {
+ migrations := &MemoryMigrationSource{
+ Migrations: sqliteMigrations[:2],
+ }
+
+ // Executes two migrations
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 2)
+
+ // Can use column now
+ _, err = s.DbMap.Exec("SELECT first_name FROM people")
+ c.Assert(err, IsNil)
+}
+
+func (s *SqliteMigrateSuite) TestMigrateIncremental(c *C) {
+ migrations := &MemoryMigrationSource{
+ Migrations: sqliteMigrations[:1],
+ }
+
+ // Executes one migration
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 1)
+
+ // Execute a new migration
+ migrations = &MemoryMigrationSource{
+ Migrations: sqliteMigrations[:2],
+ }
+ n, err = Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 1)
+
+ // Can use column now
+ _, err = s.DbMap.Exec("SELECT first_name FROM people")
+ c.Assert(err, IsNil)
+}
+
+func (s *SqliteMigrateSuite) TestFileMigrate(c *C) {
+ migrations := &FileMigrationSource{
+ Dir: "test-migrations",
+ }
+
+ // Executes two migrations
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 2)
+
+ // Has data
+ id, err := s.DbMap.SelectInt("SELECT id FROM people")
+ c.Assert(err, IsNil)
+ c.Assert(id, Equals, int64(1))
+}
+
+func (s *SqliteMigrateSuite) TestAssetMigrate(c *C) {
+ migrations := &AssetMigrationSource{
+ Asset: Asset,
+ AssetDir: AssetDir,
+ Dir: "test-migrations",
+ }
+
+ // Executes two migrations
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 2)
+
+ // Has data
+ id, err := s.DbMap.SelectInt("SELECT id FROM people")
+ c.Assert(err, IsNil)
+ c.Assert(id, Equals, int64(1))
+}
+
+func (s *SqliteMigrateSuite) TestMigrateMax(c *C) {
+ migrations := &FileMigrationSource{
+ Dir: "test-migrations",
+ }
+
+ // Executes one migration
+ n, err := ExecMax(s.Db, "sqlite3", migrations, Up, 1)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 1)
+
+ id, err := s.DbMap.SelectInt("SELECT COUNT(*) FROM people")
+ c.Assert(err, IsNil)
+ c.Assert(id, Equals, int64(0))
+}
+
+func (s *SqliteMigrateSuite) TestMigrateDown(c *C) {
+ migrations := &FileMigrationSource{
+ Dir: "test-migrations",
+ }
+
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 2)
+
+ // Has data
+ id, err := s.DbMap.SelectInt("SELECT id FROM people")
+ c.Assert(err, IsNil)
+ c.Assert(id, Equals, int64(1))
+
+ // Undo the last one
+ n, err = ExecMax(s.Db, "sqlite3", migrations, Down, 1)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 1)
+
+ // No more data
+ id, err = s.DbMap.SelectInt("SELECT COUNT(*) FROM people")
+ c.Assert(err, IsNil)
+ c.Assert(id, Equals, int64(0))
+
+ // Remove the table.
+ n, err = ExecMax(s.Db, "sqlite3", migrations, Down, 1)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 1)
+
+ // Cannot query it anymore
+ _, err = s.DbMap.SelectInt("SELECT COUNT(*) FROM people")
+ c.Assert(err, Not(IsNil))
+
+ // Nothing left to do.
+ n, err = ExecMax(s.Db, "sqlite3", migrations, Down, 1)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 0)
+}
+
+func (s *SqliteMigrateSuite) TestMigrateDownFull(c *C) {
+ migrations := &FileMigrationSource{
+ Dir: "test-migrations",
+ }
+
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 2)
+
+ // Has data
+ id, err := s.DbMap.SelectInt("SELECT id FROM people")
+ c.Assert(err, IsNil)
+ c.Assert(id, Equals, int64(1))
+
+ // Undo the last one
+ n, err = Exec(s.Db, "sqlite3", migrations, Down)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 2)
+
+ // Cannot query it anymore
+ _, err = s.DbMap.SelectInt("SELECT COUNT(*) FROM people")
+ c.Assert(err, Not(IsNil))
+
+ // Nothing left to do.
+ n, err = Exec(s.Db, "sqlite3", migrations, Down)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 0)
+}
+
+func (s *SqliteMigrateSuite) TestMigrateTransaction(c *C) {
+ migrations := &MemoryMigrationSource{
+ Migrations: []*Migration{
+ sqliteMigrations[0],
+ sqliteMigrations[1],
+ &Migration{
+ Id: "125",
+ Up: []string{"INSERT INTO people (id, first_name) VALUES (1, 'Test')", "SELECT fail"},
+ Down: []string{}, // Not important here
+ },
+ },
+ }
+
+ // Should fail, transaction should roll back the INSERT.
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, Not(IsNil))
+ c.Assert(n, Equals, 2)
+
+ // INSERT should be rolled back
+ count, err := s.DbMap.SelectInt("SELECT COUNT(*) FROM people")
+ c.Assert(err, IsNil)
+ c.Assert(count, Equals, int64(0))
+}
+
+func (s *SqliteMigrateSuite) TestPlanMigration(c *C) {
+ migrations := &MemoryMigrationSource{
+ Migrations: []*Migration{
+ &Migration{
+ Id: "1_create_table.sql",
+ Up: []string{"CREATE TABLE people (id int)"},
+ Down: []string{"DROP TABLE people"},
+ },
+ &Migration{
+ Id: "2_alter_table.sql",
+ Up: []string{"ALTER TABLE people ADD COLUMN first_name text"},
+ Down: []string{"SELECT 0"}, // Not really supported
+ },
+ &Migration{
+ Id: "10_add_last_name.sql",
+ Up: []string{"ALTER TABLE people ADD COLUMN last_name text"},
+ Down: []string{"ALTER TABLE people DROP COLUMN last_name"},
+ },
+ },
+ }
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 3)
+
+ migrations.Migrations = append(migrations.Migrations, &Migration{
+ Id: "11_add_middle_name.sql",
+ Up: []string{"ALTER TABLE people ADD COLUMN middle_name text"},
+ Down: []string{"ALTER TABLE people DROP COLUMN middle_name"},
+ })
+
+ plannedMigrations, _, err := PlanMigration(s.Db, "sqlite3", migrations, Up, 0)
+ c.Assert(err, IsNil)
+ c.Assert(plannedMigrations, HasLen, 1)
+ c.Assert(plannedMigrations[0].Migration, Equals, migrations.Migrations[3])
+
+ plannedMigrations, _, err = PlanMigration(s.Db, "sqlite3", migrations, Down, 0)
+ c.Assert(err, IsNil)
+ c.Assert(plannedMigrations, HasLen, 3)
+ c.Assert(plannedMigrations[0].Migration, Equals, migrations.Migrations[2])
+ c.Assert(plannedMigrations[1].Migration, Equals, migrations.Migrations[1])
+ c.Assert(plannedMigrations[2].Migration, Equals, migrations.Migrations[0])
+}
+
+func (s *SqliteMigrateSuite) TestPlanMigrationWithHoles(c *C) {
+ up := "SELECT 0"
+ down := "SELECT 1"
+ migrations := &MemoryMigrationSource{
+ Migrations: []*Migration{
+ &Migration{
+ Id: "1",
+ Up: []string{up},
+ Down: []string{down},
+ },
+ &Migration{
+ Id: "3",
+ Up: []string{up},
+ Down: []string{down},
+ },
+ },
+ }
+ n, err := Exec(s.Db, "sqlite3", migrations, Up)
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, 2)
+
+ migrations.Migrations = append(migrations.Migrations, &Migration{
+ Id: "2",
+ Up: []string{up},
+ Down: []string{down},
+ })
+
+ migrations.Migrations = append(migrations.Migrations, &Migration{
+ Id: "4",
+ Up: []string{up},
+ Down: []string{down},
+ })
+
+ migrations.Migrations = append(migrations.Migrations, &Migration{
+ Id: "5",
+ Up: []string{up},
+ Down: []string{down},
+ })
+
+ // apply all the missing migrations
+ plannedMigrations, _, err := PlanMigration(s.Db, "sqlite3", migrations, Up, 0)
+ c.Assert(err, IsNil)
+ c.Assert(plannedMigrations, HasLen, 3)
+ c.Assert(plannedMigrations[0].Migration.Id, Equals, "2")
+ c.Assert(plannedMigrations[0].Queries[0], Equals, up)
+ c.Assert(plannedMigrations[1].Migration.Id, Equals, "4")
+ c.Assert(plannedMigrations[1].Queries[0], Equals, up)
+ c.Assert(plannedMigrations[2].Migration.Id, Equals, "5")
+ c.Assert(plannedMigrations[2].Queries[0], Equals, up)
+
+ // first catch up to current target state 123, then migrate down 1 step to 12
+ plannedMigrations, _, err = PlanMigration(s.Db, "sqlite3", migrations, Down, 1)
+ c.Assert(err, IsNil)
+ c.Assert(plannedMigrations, HasLen, 2)
+ c.Assert(plannedMigrations[0].Migration.Id, Equals, "2")
+ c.Assert(plannedMigrations[0].Queries[0], Equals, up)
+ c.Assert(plannedMigrations[1].Migration.Id, Equals, "3")
+ c.Assert(plannedMigrations[1].Queries[0], Equals, down)
+
+ // first catch up to current target state 123, then migrate down 2 steps to 1
+ plannedMigrations, _, err = PlanMigration(s.Db, "sqlite3", migrations, Down, 2)
+ c.Assert(err, IsNil)
+ c.Assert(plannedMigrations, HasLen, 3)
+ c.Assert(plannedMigrations[0].Migration.Id, Equals, "2")
+ c.Assert(plannedMigrations[0].Queries[0], Equals, up)
+ c.Assert(plannedMigrations[1].Migration.Id, Equals, "3")
+ c.Assert(plannedMigrations[1].Queries[0], Equals, down)
+ c.Assert(plannedMigrations[2].Migration.Id, Equals, "2")
+ c.Assert(plannedMigrations[2].Queries[0], Equals, down)
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sort_test.go b/vendor/github.com/rubenv/sql-migrate/sort_test.go
new file mode 100644
index 000000000..b911260cc
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sort_test.go
@@ -0,0 +1,34 @@
+package migrate
+
+import (
+ "sort"
+ . "gopkg.in/check.v1"
+)
+
+type SortSuite struct{}
+
+var _ = Suite(&SortSuite{})
+
+func (s *SortSuite) TestSortMigrations(c *C) {
+ var migrations = byId([]*Migration{
+ &Migration{Id: "10_abc", Up: nil, Down: nil},
+ &Migration{Id: "120_cde", Up: nil, Down: nil},
+ &Migration{Id: "1_abc", Up: nil, Down: nil},
+ &Migration{Id: "efg", Up: nil, Down: nil},
+ &Migration{Id: "2_cde", Up: nil, Down: nil},
+ &Migration{Id: "35_cde", Up: nil, Down: nil},
+ &Migration{Id: "3_efg", Up: nil, Down: nil},
+ &Migration{Id: "4_abc", Up: nil, Down: nil},
+ })
+
+ sort.Sort(migrations)
+ c.Assert(migrations, HasLen, 8)
+ c.Assert(migrations[0].Id, Equals, "1_abc")
+ c.Assert(migrations[1].Id, Equals, "2_cde")
+ c.Assert(migrations[2].Id, Equals, "3_efg")
+ c.Assert(migrations[3].Id, Equals, "4_abc")
+ c.Assert(migrations[4].Id, Equals, "10_abc")
+ c.Assert(migrations[5].Id, Equals, "35_cde")
+ c.Assert(migrations[6].Id, Equals, "120_cde")
+ c.Assert(migrations[7].Id, Equals, "efg")
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_common.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_common.go
new file mode 100644
index 000000000..e5949c6a4
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_common.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/rubenv/sql-migrate"
+)
+
+func ApplyMigrations(dir migrate.MigrationDirection, dryrun bool, limit int) error {
+ env, err := GetEnvironment()
+ if err != nil {
+ return fmt.Errorf("Could not parse config: %s", err)
+ }
+
+ db, dialect, err := GetConnection(env)
+ if err != nil {
+ return err
+ }
+
+ source := migrate.FileMigrationSource{
+ Dir: env.Dir,
+ }
+
+ if dryrun {
+ migrations, _, err := migrate.PlanMigration(db, dialect, source, dir, limit)
+ if err != nil {
+ return fmt.Errorf("Cannot plan migration: %s", err)
+ }
+
+ for _, m := range migrations {
+ PrintMigration(m, dir)
+ }
+ } else {
+ n, err := migrate.ExecMax(db, dialect, source, dir, limit)
+ if err != nil {
+ return fmt.Errorf("Migration failed: %s", err)
+ }
+
+ if n == 1 {
+ ui.Output("Applied 1 migration")
+ } else {
+ ui.Output(fmt.Sprintf("Applied %d migrations", n))
+ }
+ }
+
+ return nil
+}
+
+func PrintMigration(m *migrate.PlannedMigration, dir migrate.MigrationDirection) {
+ if dir == migrate.Up {
+ ui.Output(fmt.Sprintf("==> Would apply migration %s (up)", m.Id))
+ for _, q := range m.Up {
+ ui.Output(q)
+ }
+ } else if dir == migrate.Down {
+ ui.Output(fmt.Sprintf("==> Would apply migration %s (down)", m.Id))
+ for _, q := range m.Down {
+ ui.Output(q)
+ }
+ } else {
+ panic("Not reached")
+ }
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_down.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_down.go
new file mode 100644
index 000000000..232eac400
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_down.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "flag"
+ "strings"
+
+ "github.com/rubenv/sql-migrate"
+)
+
+type DownCommand struct {
+}
+
+func (c *DownCommand) Help() string {
+ helpText := `
+Usage: sql-migrate down [options] ...
+
+ Undo a database migration.
+
+Options:
+
+ -config=dbconfig.yml Configuration file to use.
+ -env="development" Environment.
+ -limit=1 Limit the number of migrations (0 = unlimited).
+ -dryrun Don't apply migrations, just print them.
+
+`
+ return strings.TrimSpace(helpText)
+}
+
+func (c *DownCommand) Synopsis() string {
+ return "Undo a database migration"
+}
+
+func (c *DownCommand) Run(args []string) int {
+ var limit int
+ var dryrun bool
+
+ cmdFlags := flag.NewFlagSet("down", flag.ContinueOnError)
+ cmdFlags.Usage = func() { ui.Output(c.Help()) }
+ cmdFlags.IntVar(&limit, "limit", 1, "Max number of migrations to apply.")
+ cmdFlags.BoolVar(&dryrun, "dryrun", false, "Don't apply migrations, just print them.")
+ ConfigFlags(cmdFlags)
+
+ if err := cmdFlags.Parse(args); err != nil {
+ return 1
+ }
+
+ err := ApplyMigrations(migrate.Down, dryrun, limit)
+ if err != nil {
+ ui.Error(err.Error())
+ return 1
+ }
+
+ return 0
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_redo.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_redo.go
new file mode 100644
index 000000000..ccc760fc8
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_redo.go
@@ -0,0 +1,88 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "strings"
+
+ "github.com/rubenv/sql-migrate"
+)
+
+type RedoCommand struct {
+}
+
+func (c *RedoCommand) Help() string {
+ helpText := `
+Usage: sql-migrate redo [options] ...
+
+ Reapply the last migration.
+
+Options:
+
+ -config=dbconfig.yml Configuration file to use.
+ -env="development" Environment.
+ -dryrun Don't apply migrations, just print them.
+
+`
+ return strings.TrimSpace(helpText)
+}
+
+func (c *RedoCommand) Synopsis() string {
+ return "Reapply the last migration"
+}
+
+func (c *RedoCommand) Run(args []string) int {
+ var dryrun bool
+
+ cmdFlags := flag.NewFlagSet("redo", flag.ContinueOnError)
+ cmdFlags.Usage = func() { ui.Output(c.Help()) }
+ cmdFlags.BoolVar(&dryrun, "dryrun", false, "Don't apply migrations, just print them.")
+ ConfigFlags(cmdFlags)
+
+ if err := cmdFlags.Parse(args); err != nil {
+ return 1
+ }
+
+ env, err := GetEnvironment()
+ if err != nil {
+ ui.Error(fmt.Sprintf("Could not parse config: %s", err))
+ return 1
+ }
+
+ db, dialect, err := GetConnection(env)
+ if err != nil {
+ ui.Error(err.Error())
+ return 1
+ }
+
+ source := migrate.FileMigrationSource{
+ Dir: env.Dir,
+ }
+
+ migrations, _, err := migrate.PlanMigration(db, dialect, source, migrate.Down, 1)
+ if len(migrations) == 0 {
+ ui.Output("Nothing to do!")
+ return 0
+ }
+
+ if dryrun {
+ PrintMigration(migrations[0], migrate.Down)
+ PrintMigration(migrations[0], migrate.Up)
+ } else {
+ _, err := migrate.ExecMax(db, dialect, source, migrate.Down, 1)
+ if err != nil {
+ ui.Error(fmt.Sprintf("Migration (down) failed: %s", err))
+ return 1
+ }
+
+ _, err = migrate.ExecMax(db, dialect, source, migrate.Up, 1)
+ if err != nil {
+ ui.Error(fmt.Sprintf("Migration (up) failed: %s", err))
+ return 1
+ }
+
+ ui.Output(fmt.Sprintf("Reapplied migration %s.", migrations[0].Id))
+ }
+
+ return 0
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_status.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_status.go
new file mode 100644
index 000000000..bc2ca70d9
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_status.go
@@ -0,0 +1,113 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "os"
+ "strings"
+ "time"
+
+ "github.com/olekukonko/tablewriter"
+ "github.com/rubenv/sql-migrate"
+)
+
+type StatusCommand struct {
+}
+
+func (c *StatusCommand) Help() string {
+ helpText := `
+Usage: sql-migrate status [options] ...
+
+ Show migration status.
+
+Options:
+
+ -config=dbconfig.yml Configuration file to use.
+ -env="development" Environment.
+
+`
+ return strings.TrimSpace(helpText)
+}
+
+func (c *StatusCommand) Synopsis() string {
+ return "Show migration status"
+}
+
+func (c *StatusCommand) Run(args []string) int {
+ cmdFlags := flag.NewFlagSet("status", flag.ContinueOnError)
+ cmdFlags.Usage = func() { ui.Output(c.Help()) }
+ ConfigFlags(cmdFlags)
+
+ if err := cmdFlags.Parse(args); err != nil {
+ return 1
+ }
+
+ env, err := GetEnvironment()
+ if err != nil {
+ ui.Error(fmt.Sprintf("Could not parse config: %s", err))
+ return 1
+ }
+
+ db, dialect, err := GetConnection(env)
+ if err != nil {
+ ui.Error(err.Error())
+ return 1
+ }
+
+ source := migrate.FileMigrationSource{
+ Dir: env.Dir,
+ }
+ migrations, err := source.FindMigrations()
+ if err != nil {
+ ui.Error(err.Error())
+ return 1
+ }
+
+ records, err := migrate.GetMigrationRecords(db, dialect)
+ if err != nil {
+ ui.Error(err.Error())
+ return 1
+ }
+
+ table := tablewriter.NewWriter(os.Stdout)
+ table.SetHeader([]string{"Migration", "Applied"})
+ table.SetColWidth(60)
+
+ rows := make(map[string]*statusRow)
+
+ for _, m := range migrations {
+ rows[m.Id] = &statusRow{
+ Id: m.Id,
+ Migrated: false,
+ }
+ }
+
+ for _, r := range records {
+ rows[r.Id].Migrated = true
+ rows[r.Id].AppliedAt = r.AppliedAt
+ }
+
+ for _, m := range migrations {
+ if rows[m.Id].Migrated {
+ table.Append([]string{
+ m.Id,
+ rows[m.Id].AppliedAt.String(),
+ })
+ } else {
+ table.Append([]string{
+ m.Id,
+ "no",
+ })
+ }
+ }
+
+ table.Render()
+
+ return 0
+}
+
+type statusRow struct {
+ Id string
+ Migrated bool
+ AppliedAt time.Time
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_up.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_up.go
new file mode 100644
index 000000000..9e5a291fd
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/command_up.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "flag"
+ "strings"
+
+ "github.com/rubenv/sql-migrate"
+)
+
+type UpCommand struct {
+}
+
+func (c *UpCommand) Help() string {
+ helpText := `
+Usage: sql-migrate up [options] ...
+
+ Migrates the database to the most recent version available.
+
+Options:
+
+ -config=dbconfig.yml Configuration file to use.
+ -env="development" Environment.
+ -limit=0 Limit the number of migrations (0 = unlimited).
+ -dryrun Don't apply migrations, just print them.
+
+`
+ return strings.TrimSpace(helpText)
+}
+
+func (c *UpCommand) Synopsis() string {
+ return "Migrates the database to the most recent version available"
+}
+
+func (c *UpCommand) Run(args []string) int {
+ var limit int
+ var dryrun bool
+
+ cmdFlags := flag.NewFlagSet("up", flag.ContinueOnError)
+ cmdFlags.Usage = func() { ui.Output(c.Help()) }
+ cmdFlags.IntVar(&limit, "limit", 0, "Max number of migrations to apply.")
+ cmdFlags.BoolVar(&dryrun, "dryrun", false, "Don't apply migrations, just print them.")
+ ConfigFlags(cmdFlags)
+
+ if err := cmdFlags.Parse(args); err != nil {
+ return 1
+ }
+
+ err := ApplyMigrations(migrate.Up, dryrun, limit)
+ if err != nil {
+ ui.Error(err.Error())
+ return 1
+ }
+
+ return 0
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/config.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/config.go
new file mode 100644
index 000000000..d01212d16
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/config.go
@@ -0,0 +1,103 @@
+package main
+
+import (
+ "database/sql"
+ "errors"
+ "flag"
+ "fmt"
+ "io/ioutil"
+
+ "github.com/rubenv/sql-migrate"
+ "gopkg.in/gorp.v1"
+ "gopkg.in/yaml.v1"
+
+ _ "github.com/go-sql-driver/mysql"
+ _ "github.com/lib/pq"
+ _ "github.com/mattn/go-sqlite3"
+)
+
+var dialects = map[string]gorp.Dialect{
+ "sqlite3": gorp.SqliteDialect{},
+ "postgres": gorp.PostgresDialect{},
+ "mysql": gorp.MySQLDialect{"InnoDB", "UTF8"},
+}
+
+var ConfigFile string
+var ConfigEnvironment string
+
+func ConfigFlags(f *flag.FlagSet) {
+ f.StringVar(&ConfigFile, "config", "dbconfig.yml", "Configuration file to use.")
+ f.StringVar(&ConfigEnvironment, "env", "development", "Environment to use.")
+}
+
+type Environment struct {
+ Dialect string `yaml:"dialect"`
+ DataSource string `yaml:"datasource"`
+ Dir string `yaml:"dir"`
+ TableName string `yaml:"table"`
+ SchemaName string `yaml:"schema"`
+}
+
+func ReadConfig() (map[string]*Environment, error) {
+ file, err := ioutil.ReadFile(ConfigFile)
+ if err != nil {
+ return nil, err
+ }
+
+ config := make(map[string]*Environment)
+ err = yaml.Unmarshal(file, config)
+ if err != nil {
+ return nil, err
+ }
+
+ return config, nil
+}
+
+func GetEnvironment() (*Environment, error) {
+ config, err := ReadConfig()
+ if err != nil {
+ return nil, err
+ }
+
+ env := config[ConfigEnvironment]
+ if env == nil {
+ return nil, errors.New("No environment: " + ConfigEnvironment)
+ }
+
+ if env.Dialect == "" {
+ return nil, errors.New("No dialect specified")
+ }
+
+ if env.DataSource == "" {
+ return nil, errors.New("No data source specified")
+ }
+
+ if env.Dir == "" {
+ env.Dir = "migrations"
+ }
+
+ if env.TableName != "" {
+ migrate.SetTable(env.TableName)
+ }
+
+ if env.SchemaName != "" {
+ migrate.SetSchema(env.SchemaName)
+ }
+
+ return env, nil
+}
+
+func GetConnection(env *Environment) (*sql.DB, string, error) {
+ db, err := sql.Open(env.Dialect, env.DataSource)
+ if err != nil {
+ return nil, "", fmt.Errorf("Cannot connect to database: %s", err)
+ }
+
+ // Make sure we only accept dialects that were compiled in.
+ _, exists := dialects[env.Dialect]
+ if !exists {
+ return nil, "", fmt.Errorf("Unsupported dialect: %s", env.Dialect)
+ }
+
+ return db, env.Dialect, nil
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/main.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/main.go
new file mode 100644
index 000000000..c26afca22
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/main.go
@@ -0,0 +1,46 @@
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/mitchellh/cli"
+)
+
+func main() {
+ os.Exit(realMain())
+}
+
+var ui cli.Ui
+
+func realMain() int {
+ ui = &cli.BasicUi{Writer: os.Stdout}
+
+ cli := &cli.CLI{
+ Args: os.Args[1:],
+ Commands: map[string]cli.CommandFactory{
+ "up": func() (cli.Command, error) {
+ return &UpCommand{}, nil
+ },
+ "down": func() (cli.Command, error) {
+ return &DownCommand{}, nil
+ },
+ "redo": func() (cli.Command, error) {
+ return &RedoCommand{}, nil
+ },
+ "status": func() (cli.Command, error) {
+ return &StatusCommand{}, nil
+ },
+ },
+ HelpFunc: cli.BasicHelpFunc("sql-migrate"),
+ Version: "1.0.0",
+ }
+
+ exitCode, err := cli.Run()
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Error executing CLI: %s\n", err.Error())
+ return 1
+ }
+
+ return exitCode
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/main_test.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/main_test.go
new file mode 100644
index 000000000..06ab7d0f9
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/main_test.go
@@ -0,0 +1 @@
+package main
diff --git a/vendor/github.com/rubenv/sql-migrate/sql-migrate/mssql.go b/vendor/github.com/rubenv/sql-migrate/sql-migrate/mssql.go
new file mode 100644
index 000000000..2e7918af0
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sql-migrate/mssql.go
@@ -0,0 +1,12 @@
+// +build go1.3
+
+package main
+
+import (
+ _ "github.com/denisenkom/go-mssqldb"
+ "gopkg.in/gorp.v1"
+)
+
+func init() {
+ dialects["mssql"] = gorp.SqlServerDialect{}
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sqlparse/README.md b/vendor/github.com/rubenv/sql-migrate/sqlparse/README.md
new file mode 100644
index 000000000..a41706abc
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sqlparse/README.md
@@ -0,0 +1,28 @@
+# SQL migration parser
+
+Based on the [goose](https://bitbucket.org/liamstask/goose) migration parser.
+
+## License
+
+ (The MIT License)
+
+ Copyright (C) 2014 by Ruben Vermeersch
+ Copyright (C) 2012-2014 by Liam Staskawicz
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
diff --git a/vendor/github.com/rubenv/sql-migrate/sqlparse/sqlparse.go b/vendor/github.com/rubenv/sql-migrate/sqlparse/sqlparse.go
new file mode 100644
index 000000000..df95011eb
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sqlparse/sqlparse.go
@@ -0,0 +1,128 @@
+package sqlparse
+
+import (
+ "bufio"
+ "bytes"
+ "errors"
+ "io"
+
+ "strings"
+)
+
+const sqlCmdPrefix = "-- +migrate "
+
+// Checks the line to see if the line has a statement-ending semicolon
+// or if the line contains a double-dash comment.
+func endsWithSemicolon(line string) bool {
+
+ prev := ""
+ scanner := bufio.NewScanner(strings.NewReader(line))
+ scanner.Split(bufio.ScanWords)
+
+ for scanner.Scan() {
+ word := scanner.Text()
+ if strings.HasPrefix(word, "--") {
+ break
+ }
+ prev = word
+ }
+
+ return strings.HasSuffix(prev, ";")
+}
+
+// Split the given sql script into individual statements.
+//
+// The base case is to simply split on semicolons, as these
+// naturally terminate a statement.
+//
+// However, more complex cases like pl/pgsql can have semicolons
+// within a statement. For these cases, we provide the explicit annotations
+// 'StatementBegin' and 'StatementEnd' to allow the script to
+// tell us to ignore semicolons.
+func SplitSQLStatements(r io.ReadSeeker, direction bool) ([]string, error) {
+ _, err := r.Seek(0, 0)
+ if err != nil {
+ return nil, err
+ }
+
+ var buf bytes.Buffer
+ scanner := bufio.NewScanner(r)
+
+ // track the count of each section
+ // so we can diagnose scripts with no annotations
+ upSections := 0
+ downSections := 0
+
+ statementEnded := false
+ ignoreSemicolons := false
+ directionIsActive := false
+
+ stmts := make([]string, 0)
+
+ for scanner.Scan() {
+
+ line := scanner.Text()
+
+ // handle any migrate-specific commands
+ if strings.HasPrefix(line, sqlCmdPrefix) {
+ cmd := strings.TrimSpace(line[len(sqlCmdPrefix):])
+ switch cmd {
+ case "Up":
+ directionIsActive = (direction == true)
+ upSections++
+ break
+
+ case "Down":
+ directionIsActive = (direction == false)
+ downSections++
+ break
+
+ case "StatementBegin":
+ if directionIsActive {
+ ignoreSemicolons = true
+ }
+ break
+
+ case "StatementEnd":
+ if directionIsActive {
+ statementEnded = (ignoreSemicolons == true)
+ ignoreSemicolons = false
+ }
+ break
+ }
+ }
+
+ if !directionIsActive {
+ continue
+ }
+
+ if _, err := buf.WriteString(line + "\n"); err != nil {
+ return nil, err
+ }
+
+ // Wrap up the two supported cases: 1) basic with semicolon; 2) psql statement
+ // Lines that end with semicolon that are in a statement block
+ // do not conclude statement.
+ if (!ignoreSemicolons && endsWithSemicolon(line)) || statementEnded {
+ statementEnded = false
+ stmts = append(stmts, buf.String())
+ buf.Reset()
+ }
+ }
+
+ if err := scanner.Err(); err != nil {
+ return nil, err
+ }
+
+ // diagnose likely migration script errors
+ if ignoreSemicolons {
+ return nil, errors.New("ERROR: saw '-- +migrate StatementBegin' with no matching '-- +migrate StatementEnd'")
+ }
+
+ if upSections == 0 && downSections == 0 {
+ return nil, errors.New(`ERROR: no Up/Down annotations found, so no statements were executed.
+ See https://github.com/rubenv/sql-migrate for details.`)
+ }
+
+ return stmts, nil
+}
diff --git a/vendor/github.com/rubenv/sql-migrate/sqlparse/sqlparse_test.go b/vendor/github.com/rubenv/sql-migrate/sqlparse/sqlparse_test.go
new file mode 100644
index 000000000..4076e2c4e
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/sqlparse/sqlparse_test.go
@@ -0,0 +1,151 @@
+package sqlparse
+
+import (
+ "strings"
+ "testing"
+
+ . "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { TestingT(t) }
+
+type SqlParseSuite struct {
+}
+
+var _ = Suite(&SqlParseSuite{})
+
+func (s *SqlParseSuite) TestSemicolons(c *C) {
+ type testData struct {
+ line string
+ result bool
+ }
+
+ tests := []testData{
+ {
+ line: "END;",
+ result: true,
+ },
+ {
+ line: "END; -- comment",
+ result: true,
+ },
+ {
+ line: "END ; -- comment",
+ result: true,
+ },
+ {
+ line: "END -- comment",
+ result: false,
+ },
+ {
+ line: "END -- comment ;",
+ result: false,
+ },
+ {
+ line: "END \" ; \" -- comment",
+ result: false,
+ },
+ }
+
+ for _, test := range tests {
+ r := endsWithSemicolon(test.line)
+ c.Assert(r, Equals, test.result)
+ }
+}
+
+func (s *SqlParseSuite) TestSplitStatements(c *C) {
+ type testData struct {
+ sql string
+ direction bool
+ count int
+ }
+
+ tests := []testData{
+ {
+ sql: functxt,
+ direction: true,
+ count: 2,
+ },
+ {
+ sql: functxt,
+ direction: false,
+ count: 2,
+ },
+ {
+ sql: multitxt,
+ direction: true,
+ count: 2,
+ },
+ {
+ sql: multitxt,
+ direction: false,
+ count: 2,
+ },
+ }
+
+ for _, test := range tests {
+ stmts, err := SplitSQLStatements(strings.NewReader(test.sql), test.direction)
+ c.Assert(err, IsNil)
+ c.Assert(stmts, HasLen, test.count)
+ }
+}
+
+var functxt = `-- +migrate Up
+CREATE TABLE IF NOT EXISTS histories (
+ id BIGSERIAL PRIMARY KEY,
+ current_value varchar(2000) NOT NULL,
+ created_at timestamp with time zone NOT NULL
+);
+
+-- +migrate StatementBegin
+CREATE OR REPLACE FUNCTION histories_partition_creation( DATE, DATE )
+returns void AS $$
+DECLARE
+ create_query text;
+BEGIN
+ FOR create_query IN SELECT
+ 'CREATE TABLE IF NOT EXISTS histories_'
+ || TO_CHAR( d, 'YYYY_MM' )
+ || ' ( CHECK( created_at >= timestamp '''
+ || TO_CHAR( d, 'YYYY-MM-DD 00:00:00' )
+ || ''' AND created_at < timestamp '''
+ || TO_CHAR( d + INTERVAL '1 month', 'YYYY-MM-DD 00:00:00' )
+ || ''' ) ) inherits ( histories );'
+ FROM generate_series( $1, $2, '1 month' ) AS d
+ LOOP
+ EXECUTE create_query;
+ END LOOP; -- LOOP END
+END; -- FUNCTION END
+$$
+language plpgsql;
+-- +migrate StatementEnd
+
+-- +migrate Down
+drop function histories_partition_creation(DATE, DATE);
+drop TABLE histories;
+`
+
+// test multiple up/down transitions in a single script
+var multitxt = `-- +migrate Up
+CREATE TABLE post (
+ id int NOT NULL,
+ title text,
+ body text,
+ PRIMARY KEY(id)
+);
+
+-- +migrate Down
+DROP TABLE post;
+
+-- +migrate Up
+CREATE TABLE fancier_post (
+ id int NOT NULL,
+ title text,
+ body text,
+ created_on timestamp without time zone,
+ PRIMARY KEY(id)
+);
+
+-- +migrate Down
+DROP TABLE fancier_post;
+`
diff --git a/vendor/github.com/rubenv/sql-migrate/test-integration/dbconfig.yml b/vendor/github.com/rubenv/sql-migrate/test-integration/dbconfig.yml
new file mode 100644
index 000000000..6886e0040
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/test-integration/dbconfig.yml
@@ -0,0 +1,20 @@
+postgres:
+ dialect: postgres
+ datasource: dbname=test sslmode=disable
+ dir: test-migrations
+
+mysql:
+ dialect: mysql
+ datasource: root@/test?parseTime=true
+ dir: test-migrations
+
+mysql_noflag:
+ dialect: mysql
+ datasource: root@/test
+ dir: test-migrations
+
+sqlite:
+ dialect: sqlite3
+ datasource: test.db
+ dir: test-migrations
+ table: migrations
diff --git a/vendor/github.com/rubenv/sql-migrate/test-integration/mysql-flag.sh b/vendor/github.com/rubenv/sql-migrate/test-integration/mysql-flag.sh
new file mode 100644
index 000000000..3e0c940e1
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/test-integration/mysql-flag.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+# Tweak PATH for Travis
+export PATH=$PATH:$HOME/gopath/bin
+
+OPTIONS="-config=test-integration/dbconfig.yml -env mysql_noflag"
+
+set -ex
+
+sql-migrate status $OPTIONS | grep -q "Make sure that the parseTime option is supplied"
diff --git a/vendor/github.com/rubenv/sql-migrate/test-integration/mysql.sh b/vendor/github.com/rubenv/sql-migrate/test-integration/mysql.sh
new file mode 100644
index 000000000..e209c3b7e
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/test-integration/mysql.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# Tweak PATH for Travis
+export PATH=$PATH:$HOME/gopath/bin
+
+OPTIONS="-config=test-integration/dbconfig.yml -env mysql"
+
+set -ex
+
+sql-migrate status $OPTIONS
+sql-migrate up $OPTIONS
+sql-migrate down $OPTIONS
+sql-migrate redo $OPTIONS
+sql-migrate status $OPTIONS
diff --git a/vendor/github.com/rubenv/sql-migrate/test-integration/postgres.sh b/vendor/github.com/rubenv/sql-migrate/test-integration/postgres.sh
new file mode 100644
index 000000000..55a565bac
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/test-integration/postgres.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# Tweak PATH for Travis
+export PATH=$PATH:$HOME/gopath/bin
+
+OPTIONS="-config=test-integration/dbconfig.yml -env postgres"
+
+set -ex
+
+sql-migrate status $OPTIONS
+sql-migrate up $OPTIONS
+sql-migrate down $OPTIONS
+sql-migrate redo $OPTIONS
+sql-migrate status $OPTIONS
diff --git a/vendor/github.com/rubenv/sql-migrate/test-integration/sqlite.sh b/vendor/github.com/rubenv/sql-migrate/test-integration/sqlite.sh
new file mode 100644
index 000000000..210099ded
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/test-integration/sqlite.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# Tweak PATH for Travis
+export PATH=$PATH:$HOME/gopath/bin
+
+OPTIONS="-config=test-integration/dbconfig.yml -env sqlite"
+
+set -ex
+
+sql-migrate status $OPTIONS
+sql-migrate up $OPTIONS
+sql-migrate down $OPTIONS
+sql-migrate redo $OPTIONS
+sql-migrate status $OPTIONS
+
+# Should have used the custom migrations table
+sqlite3 test.db "SELECT COUNT(*) FROM migrations"
diff --git a/vendor/github.com/rubenv/sql-migrate/test-migrations/1_initial.sql b/vendor/github.com/rubenv/sql-migrate/test-migrations/1_initial.sql
new file mode 100644
index 000000000..cd896fbd7
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/test-migrations/1_initial.sql
@@ -0,0 +1,8 @@
+-- +migrate Up
+-- SQL in section 'Up' is executed when this migration is applied
+CREATE TABLE people (id int);
+
+
+-- +migrate Down
+-- SQL section 'Down' is executed when this migration is rolled back
+DROP TABLE people;
diff --git a/vendor/github.com/rubenv/sql-migrate/test-migrations/2_record.sql b/vendor/github.com/rubenv/sql-migrate/test-migrations/2_record.sql
new file mode 100644
index 000000000..c76d7691b
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/test-migrations/2_record.sql
@@ -0,0 +1,5 @@
+-- +migrate Up
+INSERT INTO people (id) VALUES (1);
+
+-- +migrate Down
+DELETE FROM people WHERE id=1;
diff --git a/vendor/github.com/rubenv/sql-migrate/toapply_test.go b/vendor/github.com/rubenv/sql-migrate/toapply_test.go
new file mode 100644
index 000000000..6206f59b5
--- /dev/null
+++ b/vendor/github.com/rubenv/sql-migrate/toapply_test.go
@@ -0,0 +1,101 @@
+package migrate
+
+import (
+ "sort"
+ . "gopkg.in/check.v1"
+)
+
+var toapplyMigrations = []*Migration{
+ &Migration{Id: "abc", Up: nil, Down: nil},
+ &Migration{Id: "cde", Up: nil, Down: nil},
+ &Migration{Id: "efg", Up: nil, Down: nil},
+}
+
+type ToApplyMigrateSuite struct {
+}
+
+var _ = Suite(&ToApplyMigrateSuite{})
+
+func (s *ToApplyMigrateSuite) TestGetAll(c *C) {
+ toApply := ToApply(toapplyMigrations, "", Up)
+ c.Assert(toApply, HasLen, 3)
+ c.Assert(toApply[0], Equals, toapplyMigrations[0])
+ c.Assert(toApply[1], Equals, toapplyMigrations[1])
+ c.Assert(toApply[2], Equals, toapplyMigrations[2])
+}
+
+func (s *ToApplyMigrateSuite) TestGetAbc(c *C) {
+ toApply := ToApply(toapplyMigrations, "abc", Up)
+ c.Assert(toApply, HasLen, 2)
+ c.Assert(toApply[0], Equals, toapplyMigrations[1])
+ c.Assert(toApply[1], Equals, toapplyMigrations[2])
+}
+
+func (s *ToApplyMigrateSuite) TestGetCde(c *C) {
+ toApply := ToApply(toapplyMigrations, "cde", Up)
+ c.Assert(toApply, HasLen, 1)
+ c.Assert(toApply[0], Equals, toapplyMigrations[2])
+}
+
+func (s *ToApplyMigrateSuite) TestGetDone(c *C) {
+ toApply := ToApply(toapplyMigrations, "efg", Up)
+ c.Assert(toApply, HasLen, 0)
+
+ toApply = ToApply(toapplyMigrations, "zzz", Up)
+ c.Assert(toApply, HasLen, 0)
+}
+
+func (s *ToApplyMigrateSuite) TestDownDone(c *C) {
+ toApply := ToApply(toapplyMigrations, "", Down)
+ c.Assert(toApply, HasLen, 0)
+}
+
+func (s *ToApplyMigrateSuite) TestDownCde(c *C) {
+ toApply := ToApply(toapplyMigrations, "cde", Down)
+ c.Assert(toApply, HasLen, 2)
+ c.Assert(toApply[0], Equals, toapplyMigrations[1])
+ c.Assert(toApply[1], Equals, toapplyMigrations[0])
+}
+
+func (s *ToApplyMigrateSuite) TestDownAbc(c *C) {
+ toApply := ToApply(toapplyMigrations, "abc", Down)
+ c.Assert(toApply, HasLen, 1)
+ c.Assert(toApply[0], Equals, toapplyMigrations[0])
+}
+
+func (s *ToApplyMigrateSuite) TestDownAll(c *C) {
+ toApply := ToApply(toapplyMigrations, "efg", Down)
+ c.Assert(toApply, HasLen, 3)
+ c.Assert(toApply[0], Equals, toapplyMigrations[2])
+ c.Assert(toApply[1], Equals, toapplyMigrations[1])
+ c.Assert(toApply[2], Equals, toapplyMigrations[0])
+
+ toApply = ToApply(toapplyMigrations, "zzz", Down)
+ c.Assert(toApply, HasLen, 3)
+ c.Assert(toApply[0], Equals, toapplyMigrations[2])
+ c.Assert(toApply[1], Equals, toapplyMigrations[1])
+ c.Assert(toApply[2], Equals, toapplyMigrations[0])
+}
+
+func (s *ToApplyMigrateSuite) TestAlphaNumericMigrations(c *C) {
+ var migrations = byId([]*Migration{
+ &Migration{Id: "10_abc", Up: nil, Down: nil},
+ &Migration{Id: "1_abc", Up: nil, Down: nil},
+ &Migration{Id: "efg", Up: nil, Down: nil},
+ &Migration{Id: "2_cde", Up: nil, Down: nil},
+ &Migration{Id: "35_cde", Up: nil, Down: nil},
+ })
+
+ sort.Sort(migrations)
+
+ toApplyUp := ToApply(migrations, "2_cde", Up)
+ c.Assert(toApplyUp, HasLen, 3)
+ c.Assert(toApplyUp[0].Id, Equals, "10_abc")
+ c.Assert(toApplyUp[1].Id, Equals, "35_cde")
+ c.Assert(toApplyUp[2].Id, Equals, "efg")
+
+ toApplyDown := ToApply(migrations, "2_cde", Down)
+ c.Assert(toApplyDown, HasLen, 2)
+ c.Assert(toApplyDown[0].Id, Equals, "2_cde")
+ c.Assert(toApplyDown[1].Id, Equals, "1_abc")
+}
diff --git a/vendor/github.com/russross/meddler/.gitignore b/vendor/github.com/russross/meddler/.gitignore
deleted file mode 100644
index 1377554eb..000000000
--- a/vendor/github.com/russross/meddler/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.swp
diff --git a/vendor/github.com/russross/meddler/meddler.go b/vendor/github.com/russross/meddler/meddler.go
index ad4157265..f79157872 100644
--- a/vendor/github.com/russross/meddler/meddler.go
+++ b/vendor/github.com/russross/meddler/meddler.go
@@ -205,10 +205,6 @@ func (elt ZeroIsNullMeddler) PreWrite(field interface{}) (saveValue interface{},
if val.String() == "" {
return nil, nil
}
- case reflect.Bool:
- if !val.Bool() {
- return nil, nil
- }
default:
return nil, fmt.Errorf("ZeroIsNullMeddler.PreWrite: unknown struct field type: %T", field)
}
diff --git a/vendor/github.com/russross/meddler/scan_test.go b/vendor/github.com/russross/meddler/scan_test.go
index f39ac6bbc..b031b1686 100644
--- a/vendor/github.com/russross/meddler/scan_test.go
+++ b/vendor/github.com/russross/meddler/scan_test.go
@@ -3,7 +3,7 @@ package meddler
import (
"database/sql"
"fmt"
- _ "github.com/drone/drone/Godeps/_workspace/src/github.com/mattn/go-sqlite3"
+ _ "github.com/mattn/go-sqlite3"
"reflect"
"sort"
"strings"
diff --git a/vendor/github.com/samalba/dockerclient/.gitignore b/vendor/github.com/samalba/dockerclient/.gitignore
deleted file mode 100644
index 00268614f..000000000
--- a/vendor/github.com/samalba/dockerclient/.gitignore
+++ /dev/null
@@ -1,22 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
diff --git a/vendor/github.com/samalba/dockerclient/README.md b/vendor/github.com/samalba/dockerclient/README.md
index 26f252895..5a5027b8b 100644
--- a/vendor/github.com/samalba/dockerclient/README.md
+++ b/vendor/github.com/samalba/dockerclient/README.md
@@ -4,7 +4,9 @@ Docker client library in Go
Well maintained docker client library.
-Example:
+# How to use it?
+
+Here is an example showing how to use it:
```go
package main
@@ -13,6 +15,7 @@ import (
"github.com/samalba/dockerclient"
"log"
"time"
+ "os"
)
// Callback used to listen to Docker's events
@@ -25,7 +28,7 @@ func main() {
docker, _ := dockerclient.NewDockerClient("unix:///var/run/docker.sock", nil)
// Get only running containers
- containers, err := docker.ListContainers(false)
+ containers, err := docker.ListContainers(false, false, "")
if err != nil {
log.Fatal(err)
}
@@ -40,15 +43,34 @@ func main() {
log.Println(info)
}
+ // Build a docker image
+ // some.tar contains the build context (Dockerfile any any files it needs to add/copy)
+ dockerBuildContext, err := os.Open("some.tar")
+ defer dockerBuildContext.Close()
+ buildImageConfig := &dockerclient.BuildImage{
+ Context: dockerBuildContext,
+ RepoName: "your_image_name",
+ SuppressOutput: false,
+ }
+ reader, err := docker.BuildImage(buildImageConfig)
+ if err != nil {
+ log.Fatal(err)
+ }
+
// Create a container
- containerConfig := &dockerclient.ContainerConfig{Image: "ubuntu:12.04", Cmd: []string{"bash"}}
- containerId, err := docker.CreateContainer(containerConfig)
+ containerConfig := &dockerclient.ContainerConfig{
+ Image: "ubuntu:14.04",
+ Cmd: []string{"bash"},
+ AttachStdin: true,
+ Tty: true}
+ containerId, err := docker.CreateContainer(containerConfig, "foobar")
if err != nil {
log.Fatal(err)
}
// Start the container
- err = docker.StartContainer(containerId)
+ hostConfig := &dockerclient.HostConfig{}
+ err = docker.StartContainer(containerId, hostConfig)
if err != nil {
log.Fatal(err)
}
@@ -58,6 +80,19 @@ func main() {
// Listen to events
docker.StartMonitorEvents(eventCallback, nil)
+
+ // Hold the execution to look at the events coming
time.Sleep(3600 * time.Second)
}
```
+
+# Maintainers
+
+List of people you can ping for feedback on Pull Requests or any questions.
+
+- [Sam Alba](https://github.com/samalba)
+- [Michael Crosby](https://github.com/crosbymichael)
+- [Andrea Luzzardi](https://github.com/aluzzardi)
+- [Victor Vieux](https://github.com/vieux)
+- [Evan Hazlett](https://github.com/ehazlett)
+- [Donald Huang](https://github.com/donhcd)
diff --git a/vendor/github.com/samalba/dockerclient/auth.go b/vendor/github.com/samalba/dockerclient/auth.go
index 022d3ddfd..48f5f90b6 100644
--- a/vendor/github.com/samalba/dockerclient/auth.go
+++ b/vendor/github.com/samalba/dockerclient/auth.go
@@ -14,8 +14,25 @@ type AuthConfig struct {
}
// encode the auth configuration struct into base64 for the X-Registry-Auth header
-func (c *AuthConfig) encode() string {
+func (c *AuthConfig) encode() (string, error) {
var buf bytes.Buffer
- json.NewEncoder(&buf).Encode(c)
- return base64.URLEncoding.EncodeToString(buf.Bytes())
+ if err := json.NewEncoder(&buf).Encode(c); err != nil {
+ return "", err
+ }
+ return base64.URLEncoding.EncodeToString(buf.Bytes()), nil
+}
+
+// ConfigFile holds parameters for authenticating during a BuildImage request
+type ConfigFile struct {
+ Configs map[string]AuthConfig `json:"configs,omitempty"`
+ rootPath string
+}
+
+// encode the configuration struct into base64 for the X-Registry-Config header
+func (c *ConfigFile) encode() (string, error) {
+ var buf bytes.Buffer
+ if err := json.NewEncoder(&buf).Encode(c); err != nil {
+ return "", err
+ }
+ return base64.URLEncoding.EncodeToString(buf.Bytes()), nil
}
diff --git a/vendor/github.com/samalba/dockerclient/auth_test.go b/vendor/github.com/samalba/dockerclient/auth_test.go
index f6eac9926..99801b225 100644
--- a/vendor/github.com/samalba/dockerclient/auth_test.go
+++ b/vendor/github.com/samalba/dockerclient/auth_test.go
@@ -7,7 +7,7 @@ import (
func TestAuthEncode(t *testing.T) {
a := AuthConfig{Username: "foo", Password: "password", Email: "bar@baz.com"}
expected := "eyJ1c2VybmFtZSI6ImZvbyIsInBhc3N3b3JkIjoicGFzc3dvcmQiLCJlbWFpbCI6ImJhckBiYXouY29tIn0K"
- got := a.encode()
+ got, _ := a.encode()
if expected != got {
t.Errorf("testAuthEncode failed. Expected [%s] got [%s]", expected, got)
diff --git a/vendor/github.com/samalba/dockerclient/dockerclient.go b/vendor/github.com/samalba/dockerclient/dockerclient.go
index 81e6aaeaa..1a6c5ee59 100644
--- a/vendor/github.com/samalba/dockerclient/dockerclient.go
+++ b/vendor/github.com/samalba/dockerclient/dockerclient.go
@@ -30,7 +30,8 @@ type DockerClient struct {
URL *url.URL
HTTPClient *http.Client
TLSConfig *tls.Config
- monitorEvents int32
+ monitorStats int32
+ eventStopChan chan (struct{})
}
type Error struct {
@@ -60,12 +61,30 @@ func NewDockerClientTimeout(daemonUrl string, tlsConfig *tls.Config, timeout tim
}
}
httpClient := newHTTPClient(u, tlsConfig, timeout)
- return &DockerClient{u, httpClient, tlsConfig, 0}, nil
+ return &DockerClient{u, httpClient, tlsConfig, 0, nil}, nil
}
func (client *DockerClient) doRequest(method string, path string, body []byte, headers map[string]string) ([]byte, error) {
b := bytes.NewBuffer(body)
- req, err := http.NewRequest(method, client.URL.String()+path, b)
+
+ reader, err := client.doStreamRequest(method, path, b, headers)
+ if err != nil {
+ return nil, err
+ }
+
+ defer reader.Close()
+ data, err := ioutil.ReadAll(reader)
+ if err != nil {
+ return nil, err
+ }
+ return data, nil
+}
+
+func (client *DockerClient) doStreamRequest(method string, path string, in io.Reader, headers map[string]string) (io.ReadCloser, error) {
+ if (method == "POST" || method == "PUT") && in == nil {
+ in = bytes.NewReader(nil)
+ }
+ req, err := http.NewRequest(method, client.URL.String()+path, in)
if err != nil {
return nil, err
}
@@ -82,18 +101,19 @@ func (client *DockerClient) doRequest(method string, path string, body []byte, h
}
return nil, err
}
- defer resp.Body.Close()
- data, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return nil, err
- }
if resp.StatusCode == 404 {
return nil, ErrNotFound
}
if resp.StatusCode >= 400 {
+ defer resp.Body.Close()
+ data, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return nil, err
+ }
return nil, Error{StatusCode: resp.StatusCode, Status: resp.Status, msg: string(data)}
}
- return data, nil
+
+ return resp.Body, nil
}
func (client *DockerClient) Info() (*Info, error) {
@@ -197,6 +217,61 @@ func (client *DockerClient) ContainerLogs(id string, options *LogOptions) (io.Re
return resp.Body, nil
}
+func (client *DockerClient) ContainerChanges(id string) ([]*ContainerChanges, error) {
+ uri := fmt.Sprintf("/%s/containers/%s/changes", APIVersion, id)
+ data, err := client.doRequest("GET", uri, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ changes := []*ContainerChanges{}
+ err = json.Unmarshal(data, &changes)
+ if err != nil {
+ return nil, err
+ }
+ return changes, nil
+}
+
+func (client *DockerClient) readJSONStream(stream io.ReadCloser, decode func(*json.Decoder) decodingResult, stopChan <-chan struct{}) <-chan decodingResult {
+ resultChan := make(chan decodingResult)
+
+ go func() {
+ decodeChan := make(chan decodingResult)
+
+ go func() {
+ decoder := json.NewDecoder(stream)
+ for {
+ decodeResult := decode(decoder)
+ decodeChan <- decodeResult
+ if decodeResult.err != nil {
+ close(decodeChan)
+ return
+ }
+ }
+ }()
+
+ defer close(resultChan)
+
+ for {
+ select {
+ case <-stopChan:
+ stream.Close()
+ for _ = range decodeChan {
+ }
+ return
+ case decodeResult := <-decodeChan:
+ resultChan <- decodeResult
+ if decodeResult.err != nil {
+ stream.Close()
+ return
+ }
+ }
+ }
+
+ }()
+
+ return resultChan
+}
+
func (client *DockerClient) StartContainer(id string, config *HostConfig) error {
data, err := json.Marshal(config)
if err != nil {
@@ -237,13 +312,119 @@ func (client *DockerClient) KillContainer(id, signal string) error {
return nil
}
-func (client *DockerClient) StartMonitorEvents(cb Callback, ec chan error, args ...interface{}) {
- atomic.StoreInt32(&client.monitorEvents, 1)
- go client.getEvents(cb, ec, args...)
+func (client *DockerClient) Wait(id string) <-chan WaitResult {
+ ch := make(chan WaitResult)
+ uri := fmt.Sprintf("/%s/containers/%s/wait", APIVersion, id)
+
+ go func() {
+ data, err := client.doRequest("POST", uri, nil, nil)
+ if err != nil {
+ ch <- WaitResult{ExitCode: -1, Error: err}
+ return
+ }
+
+ var result struct {
+ StatusCode int `json:"StatusCode"`
+ }
+ err = json.Unmarshal(data, &result)
+ ch <- WaitResult{ExitCode: result.StatusCode, Error: err}
+ }()
+ return ch
}
-func (client *DockerClient) getEvents(cb Callback, ec chan error, args ...interface{}) {
- uri := fmt.Sprintf("%s/%s/events", client.URL.String(), APIVersion)
+func (client *DockerClient) MonitorEvents(options *MonitorEventsOptions, stopChan <-chan struct{}) (<-chan EventOrError, error) {
+ v := url.Values{}
+ if options != nil {
+ if options.Since != 0 {
+ v.Add("since", strconv.Itoa(options.Since))
+ }
+ if options.Until != 0 {
+ v.Add("until", strconv.Itoa(options.Until))
+ }
+ if options.Filters != nil {
+ filterMap := make(map[string][]string)
+ if len(options.Filters.Event) > 0 {
+ filterMap["event"] = []string{options.Filters.Event}
+ }
+ if len(options.Filters.Image) > 0 {
+ filterMap["image"] = []string{options.Filters.Image}
+ }
+ if len(options.Filters.Container) > 0 {
+ filterMap["container"] = []string{options.Filters.Container}
+ }
+ if len(filterMap) > 0 {
+ filterJSONBytes, err := json.Marshal(filterMap)
+ if err != nil {
+ return nil, err
+ }
+ v.Add("filters", string(filterJSONBytes))
+ }
+ }
+ }
+ uri := fmt.Sprintf("%s/%s/events?%s", client.URL.String(), APIVersion, v.Encode())
+ resp, err := client.HTTPClient.Get(uri)
+ if err != nil {
+ return nil, err
+ }
+
+ decode := func(decoder *json.Decoder) decodingResult {
+ var event Event
+ if err := decoder.Decode(&event); err != nil {
+ return decodingResult{err: err}
+ } else {
+ return decodingResult{result: event}
+ }
+ }
+ decodingResultChan := client.readJSONStream(resp.Body, decode, stopChan)
+ eventOrErrorChan := make(chan EventOrError)
+ go func() {
+ for decodingResult := range decodingResultChan {
+ event, _ := decodingResult.result.(Event)
+ eventOrErrorChan <- EventOrError{
+ Event: event,
+ Error: decodingResult.err,
+ }
+ }
+ close(eventOrErrorChan)
+ }()
+ return eventOrErrorChan, nil
+}
+
+func (client *DockerClient) StartMonitorEvents(cb Callback, ec chan error, args ...interface{}) {
+ client.eventStopChan = make(chan struct{})
+
+ go func() {
+ eventErrChan, err := client.MonitorEvents(nil, client.eventStopChan)
+ if err != nil {
+ if ec != nil {
+ ec <- err
+ }
+ return
+ }
+
+ for e := range eventErrChan {
+ if e.Error != nil {
+ if ec != nil {
+ ec <- err
+ }
+ return
+ }
+ cb(&e.Event, ec, args...)
+ }
+ }()
+}
+
+func (client *DockerClient) StopAllMonitorEvents() {
+ close(client.eventStopChan)
+}
+
+func (client *DockerClient) StartMonitorStats(id string, cb StatCallback, ec chan error, args ...interface{}) {
+ atomic.StoreInt32(&client.monitorStats, 1)
+ go client.getStats(id, cb, ec, args...)
+}
+
+func (client *DockerClient) getStats(id string, cb StatCallback, ec chan error, args ...interface{}) {
+ uri := fmt.Sprintf("%s/%s/containers/%s/stats", client.URL.String(), APIVersion, id)
resp, err := client.HTTPClient.Get(uri)
if err != nil {
ec <- err
@@ -252,18 +433,32 @@ func (client *DockerClient) getEvents(cb Callback, ec chan error, args ...interf
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
- for atomic.LoadInt32(&client.monitorEvents) > 0 {
- var event *Event
- if err := dec.Decode(&event); err != nil {
+ for atomic.LoadInt32(&client.monitorStats) > 0 {
+ var stats *Stats
+ if err := dec.Decode(&stats); err != nil {
ec <- err
return
}
- cb(event, ec, args...)
+ cb(id, stats, ec, args...)
}
}
-func (client *DockerClient) StopAllMonitorEvents() {
- atomic.StoreInt32(&client.monitorEvents, 0)
+func (client *DockerClient) StopAllMonitorStats() {
+ atomic.StoreInt32(&client.monitorStats, 0)
+}
+
+func (client *DockerClient) TagImage(nameOrID string, repo string, tag string, force bool) error {
+ v := url.Values{}
+ v.Set("repo", repo)
+ v.Set("tag", tag)
+ if force {
+ v.Set("force", "1")
+ }
+ uri := fmt.Sprintf("/%s/images/%s/tag?%s", APIVersion, nameOrID, v.Encode())
+ if _, err := client.doRequest("POST", uri, nil, nil); err != nil {
+ return err
+ }
+ return nil
}
func (client *DockerClient) Version() (*Version, error) {
@@ -286,13 +481,29 @@ func (client *DockerClient) PullImage(name string, auth *AuthConfig) error {
uri := fmt.Sprintf("/%s/images/create?%s", APIVersion, v.Encode())
req, err := http.NewRequest("POST", client.URL.String()+uri, nil)
if auth != nil {
- req.Header.Add("X-Registry-Auth", auth.encode())
+ encoded_auth, err := auth.encode()
+ if err != nil {
+ return err
+ }
+ req.Header.Add("X-Registry-Auth", encoded_auth)
}
resp, err := client.HTTPClient.Do(req)
if err != nil {
return err
}
+
defer resp.Body.Close()
+ if resp.StatusCode == 404 {
+ return ErrNotFound
+ }
+ if resp.StatusCode >= 400 {
+ data, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return err
+ }
+ return fmt.Errorf("%s", string(data))
+ }
+
var finalObj map[string]interface{}
for decoder := json.NewDecoder(resp.Body); err == nil; err = decoder.Decode(&finalObj) {
}
@@ -305,6 +516,34 @@ func (client *DockerClient) PullImage(name string, auth *AuthConfig) error {
return nil
}
+func (client *DockerClient) InspectImage(id string) (*ImageInfo, error) {
+ uri := fmt.Sprintf("/%s/images/%s/json", APIVersion, id)
+ data, err := client.doRequest("GET", uri, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ info := &ImageInfo{}
+ err = json.Unmarshal(data, info)
+ if err != nil {
+ return nil, err
+ }
+ return info, nil
+}
+
+func (client *DockerClient) LoadImage(reader io.Reader) error {
+ data, err := ioutil.ReadAll(reader)
+ if err != nil {
+ return err
+ }
+
+ uri := fmt.Sprintf("/%s/images/load", APIVersion)
+ _, err = client.doRequest("POST", uri, data, nil)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
func (client *DockerClient) RemoveContainer(id string, force, volumes bool) error {
argForce := 0
argVolumes := 0
@@ -320,8 +559,12 @@ func (client *DockerClient) RemoveContainer(id string, force, volumes bool) erro
return err
}
-func (client *DockerClient) ListImages() ([]*Image, error) {
- uri := fmt.Sprintf("/%s/images/json", APIVersion)
+func (client *DockerClient) ListImages(all bool) ([]*Image, error) {
+ argAll := 0
+ if all {
+ argAll = 1
+ }
+ uri := fmt.Sprintf("/%s/images/json?all=%d", APIVersion, argAll)
data, err := client.doRequest("GET", uri, nil, nil)
if err != nil {
return nil, err
@@ -333,10 +576,17 @@ func (client *DockerClient) ListImages() ([]*Image, error) {
return images, nil
}
-func (client *DockerClient) RemoveImage(name string) error {
+func (client *DockerClient) RemoveImage(name string) ([]*ImageDelete, error) {
uri := fmt.Sprintf("/%s/images/%s", APIVersion, name)
- _, err := client.doRequest("DELETE", uri, nil, nil)
- return err
+ data, err := client.doRequest("DELETE", uri, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ var imageDelete []*ImageDelete
+ if err := json.Unmarshal(data, &imageDelete); err != nil {
+ return nil, err
+ }
+ return imageDelete, nil
}
func (client *DockerClient) PauseContainer(id string) error {
@@ -379,3 +629,86 @@ func (client *DockerClient) Exec(config *ExecConfig) (string, error) {
}
return createExecResp.Id, nil
}
+
+func (client *DockerClient) RenameContainer(oldName string, newName string) error {
+ uri := fmt.Sprintf("/containers/%s/rename?name=%s", oldName, newName)
+ _, err := client.doRequest("POST", uri, nil, nil)
+ return err
+}
+
+func (client *DockerClient) ImportImage(source string, repository string, tag string, tar io.Reader) (io.ReadCloser, error) {
+ var fromSrc string
+ v := &url.Values{}
+ if source == "" {
+ fromSrc = "-"
+ } else {
+ fromSrc = source
+ }
+
+ v.Set("fromSrc", fromSrc)
+ v.Set("repo", repository)
+ if tag != "" {
+ v.Set("tag", tag)
+ }
+
+ var in io.Reader
+ if fromSrc == "-" {
+ in = tar
+ }
+ return client.doStreamRequest("POST", "/images/create?"+v.Encode(), in, nil)
+}
+
+func (client *DockerClient) BuildImage(image *BuildImage) (io.ReadCloser, error) {
+ v := url.Values{}
+
+ if image.DockerfileName != "" {
+ v.Set("dockerfile", image.DockerfileName)
+ }
+ if image.RepoName != "" {
+ v.Set("t", image.RepoName)
+ }
+ if image.RemoteURL != "" {
+ v.Set("remote", image.RemoteURL)
+ }
+ if image.NoCache {
+ v.Set("nocache", "1")
+ }
+ if image.Pull {
+ v.Set("pull", "1")
+ }
+ if image.Remove {
+ v.Set("rm", "1")
+ } else {
+ v.Set("rm", "0")
+ }
+ if image.ForceRemove {
+ v.Set("forcerm", "1")
+ }
+ if image.SuppressOutput {
+ v.Set("q", "1")
+ }
+
+ v.Set("memory", strconv.FormatInt(image.Memory, 10))
+ v.Set("memswap", strconv.FormatInt(image.MemorySwap, 10))
+ v.Set("cpushares", strconv.FormatInt(image.CpuShares, 10))
+ v.Set("cpuperiod", strconv.FormatInt(image.CpuPeriod, 10))
+ v.Set("cpuquota", strconv.FormatInt(image.CpuQuota, 10))
+ v.Set("cpusetcpus", image.CpuSetCpus)
+ v.Set("cpusetmems", image.CpuSetMems)
+ v.Set("cgroupparent", image.CgroupParent)
+
+ headers := make(map[string]string)
+ if image.Config != nil {
+ encoded_config, err := image.Config.encode()
+ if err != nil {
+ return nil, err
+ }
+ headers["X-Registry-Config"] = encoded_config
+ }
+ if image.Context != nil {
+ headers["Content-Type"] = "application/tar"
+ }
+
+ uri := fmt.Sprintf("/%s/build?%s", APIVersion, v.Encode())
+ return client.doStreamRequest("POST", uri, image.Context, headers)
+}
diff --git a/vendor/github.com/samalba/dockerclient/dockerclient_test.go b/vendor/github.com/samalba/dockerclient/dockerclient_test.go
index 8d3ec2ccc..88257e01b 100644
--- a/vendor/github.com/samalba/dockerclient/dockerclient_test.go
+++ b/vendor/github.com/samalba/dockerclient/dockerclient_test.go
@@ -2,10 +2,13 @@ package dockerclient
import (
"bytes"
+ "encoding/json"
"fmt"
+ "io"
"reflect"
"strings"
"testing"
+ "time"
"github.com/docker/docker/pkg/stdcopy"
)
@@ -45,6 +48,26 @@ func TestKillContainer(t *testing.T) {
}
}
+func TestWait(t *testing.T) {
+ client := testDockerClient(t)
+
+ // This provokes an error on the server.
+ select {
+ case wr := <-client.Wait("1234"):
+ assertEqual(t, wr.ExitCode, int(-1), "")
+ case <-time.After(2 * time.Second):
+ t.Fatal("Timed out!")
+ }
+
+ // Valid case.
+ select {
+ case wr := <-client.Wait("valid-id"):
+ assertEqual(t, wr.ExitCode, int(0), "")
+ case <-time.After(2 * time.Second):
+ t.Fatal("Timed out!")
+ }
+}
+
func TestPullImage(t *testing.T) {
client := testDockerClient(t)
err := client.PullImage("busybox", nil)
@@ -74,6 +97,18 @@ func TestListContainers(t *testing.T) {
assertEqual(t, cnt.SizeRw, int64(0), "")
}
+func TestContainerChanges(t *testing.T) {
+ client := testDockerClient(t)
+ changes, err := client.ContainerChanges("foobar")
+ if err != nil {
+ t.Fatal("cannot get container changes: %s", err)
+ }
+ assertEqual(t, len(changes), 3, "unexpected number of changes")
+ c := changes[0]
+ assertEqual(t, c.Path, "/dev", "unexpected")
+ assertEqual(t, c.Kind, 0, "unexpected")
+}
+
func TestListContainersWithSize(t *testing.T) {
client := testDockerClient(t)
containers, err := client.ListContainers(true, true, "")
@@ -143,6 +178,58 @@ func TestContainerLogs(t *testing.T) {
}
}
+func TestMonitorEvents(t *testing.T) {
+ client := testDockerClient(t)
+ decoder := json.NewDecoder(bytes.NewBufferString(eventsResp))
+ var expectedEvents []Event
+ for {
+ var event Event
+ if err := decoder.Decode(&event); err != nil {
+ if err == io.EOF {
+ break
+ } else {
+ t.Fatalf("cannot parse expected resp: %s", err.Error())
+ }
+ } else {
+ expectedEvents = append(expectedEvents, event)
+ }
+ }
+
+ // test passing stop chan
+ stopChan := make(chan struct{})
+ eventInfoChan, err := client.MonitorEvents(nil, stopChan)
+ if err != nil {
+ t.Fatalf("cannot get events from server: %s", err.Error())
+ }
+
+ eventInfo := <-eventInfoChan
+ if eventInfo.Error != nil || eventInfo.Event != expectedEvents[0] {
+ t.Fatalf("got:\n%#v\nexpected:\n%#v", eventInfo, expectedEvents[0])
+ }
+ close(stopChan)
+ for i := 0; i < 3; i++ {
+ _, ok := <-eventInfoChan
+ if i == 2 && ok {
+ t.Fatalf("read more than 2 events successfully after closing stopChan")
+ }
+ }
+
+ // test when you don't pass stop chan
+ eventInfoChan, err = client.MonitorEvents(nil, nil)
+ if err != nil {
+ t.Fatalf("cannot get events from server: %s", err.Error())
+ }
+
+ for i, expectedEvent := range expectedEvents {
+ t.Logf("on iter %d\n", i)
+ eventInfo := <-eventInfoChan
+ if eventInfo.Error != nil || eventInfo.Event != expectedEvent {
+ t.Fatalf("index %d, got:\n%#v\nexpected:\n%#v", i, eventInfo, expectedEvent)
+ }
+ t.Logf("done with iter %d\n", i)
+ }
+}
+
func TestDockerClientInterface(t *testing.T) {
iface := reflect.TypeOf((*Client)(nil)).Elem()
test := testDockerClient(t)
diff --git a/vendor/github.com/samalba/dockerclient/engine_mock_test.go b/vendor/github.com/samalba/dockerclient/engine_mock_test.go
index 4d0e6a7e9..7d3a6d93b 100644
--- a/vendor/github.com/samalba/dockerclient/engine_mock_test.go
+++ b/vendor/github.com/samalba/dockerclient/engine_mock_test.go
@@ -10,10 +10,10 @@ import (
"strconv"
"time"
+ "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/jsonlog"
"github.com/docker/docker/pkg/stdcopy"
"github.com/docker/docker/pkg/timeutils"
- "github.com/docker/docker/utils"
"github.com/gorilla/mux"
)
@@ -27,8 +27,11 @@ func init() {
r.HandleFunc(baseURL+"/info", handlerGetInfo).Methods("GET")
r.HandleFunc(baseURL+"/containers/json", handlerGetContainers).Methods("GET")
r.HandleFunc(baseURL+"/containers/{id}/logs", handleContainerLogs).Methods("GET")
+ r.HandleFunc(baseURL+"/containers/{id}/changes", handleContainerChanges).Methods("GET")
r.HandleFunc(baseURL+"/containers/{id}/kill", handleContainerKill).Methods("POST")
+ r.HandleFunc(baseURL+"/containers/{id}/wait", handleWait).Methods("POST")
r.HandleFunc(baseURL+"/images/create", handleImagePull).Methods("POST")
+ r.HandleFunc(baseURL+"/events", handleEvents).Methods("GET")
testHTTPServer = httptest.NewServer(handlerAccessLog(r))
}
@@ -44,6 +47,15 @@ func handleContainerKill(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "{%q:%q", "Id", "421373210afd132")
}
+func handleWait(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ if vars["id"] == "valid-id" {
+ fmt.Fprintf(w, `{"StatusCode":0}`)
+ } else {
+ http.Error(w, "failed", 500)
+ }
+}
+
func handleImagePull(w http.ResponseWriter, r *http.Request) {
imageName := r.URL.Query()["fromImage"][0]
responses := []map[string]interface{}{{
@@ -73,7 +85,7 @@ func handleImagePull(w http.ResponseWriter, r *http.Request) {
func handleContainerLogs(w http.ResponseWriter, r *http.Request) {
var outStream, errStream io.Writer
- outStream = utils.NewWriteFlusher(w)
+ outStream = ioutils.NewWriteFlusher(w)
// not sure how to test follow
if err := r.ParseForm(); err != nil {
@@ -96,7 +108,7 @@ func handleContainerLogs(w http.ResponseWriter, r *http.Request) {
for ; i < 50; i++ {
line := fmt.Sprintf("line %d", i)
if getBoolValue(r.Form.Get("timestamps")) {
- l := &jsonlog.JSONLog{Log: line, Created: time.Now()}
+ l := &jsonlog.JSONLog{Log: line, Created: time.Now().UTC()}
line = fmt.Sprintf("%s %s", l.Created.Format(timeutils.RFC3339NanoFixed), line)
}
if i%2 == 0 && stderr {
@@ -107,6 +119,25 @@ func handleContainerLogs(w http.ResponseWriter, r *http.Request) {
}
}
+func handleContainerChanges(w http.ResponseWriter, r *http.Request) {
+ writeHeaders(w, 200, "changes")
+ body := `[
+ {
+ "Path": "/dev",
+ "Kind": 0
+ },
+ {
+ "Path": "/dev/kmsg",
+ "Kind": 1
+ },
+ {
+ "Path": "/test",
+ "Kind": 1
+ }
+ ]`
+ w.Write([]byte(body))
+}
+
func getBoolValue(boolString string) bool {
switch boolString {
case "1":
@@ -208,3 +239,7 @@ func handlerGetContainers(w http.ResponseWriter, r *http.Request) {
}
w.Write([]byte(body))
}
+
+func handleEvents(w http.ResponseWriter, r *http.Request) {
+ w.Write([]byte(eventsResp))
+}
diff --git a/vendor/github.com/samalba/dockerclient/example_responses.go b/vendor/github.com/samalba/dockerclient/example_responses.go
index 9f683f1dd..670508c07 100644
--- a/vendor/github.com/samalba/dockerclient/example_responses.go
+++ b/vendor/github.com/samalba/dockerclient/example_responses.go
@@ -9,3 +9,5 @@ var haproxyPullOutput = `{"status":"The image you are pulling has been verified"
{"status":"Already exists","progressDetail":{},"id":"511136ea3c5a"}{"status":"Already exists","progressDetail":{},"id":"1aeada447715"}{"status":"Already exists","progressDetail":{},"id":"479215127fa7"}{"status":"Already exists","progressDetail":{},"id":"66301eb54a7d"}{"status":"Already exists","progressDetail":{},"id":"e3990b07573f"}{"status":"Already exists","progressDetail":{},"id":"3d894e6f7e63"}{"status":"Already exists","progressDetail":{},"id":"4d949c40bc77"}{"status":"Already exists","progressDetail":{},"id":"55e031889365"}{"status":"Already exists","progressDetail":{},"id":"c7aa675e1876"}{"status":"The image you are pulling has been verified","id":"haproxy:latest"}
{"status":"Already exists","progressDetail":{},"id":"511136ea3c5a"}{"status":"Already exists","progressDetail":{},"id":"1aeada447715"}{"status":"Already exists","progressDetail":{},"id":"479215127fa7"}{"status":"Already exists","progressDetail":{},"id":"66301eb54a7d"}{"status":"Already exists","progressDetail":{},"id":"e3990b07573f"}{"status":"Already exists","progressDetail":{},"id":"ecb4b23ca7ce"}{"status":"Already exists","progressDetail":{},"id":"f453e940c177"}{"status":"Already exists","progressDetail":{},"id":"fc5ea1bc05ab"}{"status":"Already exists","progressDetail":{},"id":"380557f8f7b3"}{"status":"Status: Image is up to date for haproxy"}
`
+
+var eventsResp = `{"status":"pull","id":"nginx:latest","time":1428620433}{"status":"create","id":"9b818c3b8291708fdcecd7c4086b75c222cb503be10a93d9c11040886032a48b","from":"nginx:latest","time":1428620433}{"status":"start","id":"9b818c3b8291708fdcecd7c4086b75c222cb503be10a93d9c11040886032a48b","from":"nginx:latest","time":1428620433}{"status":"die","id":"9b818c3b8291708fdcecd7c4086b75c222cb503be10a93d9c11040886032a48b","from":"nginx:latest","time":1428620442}{"status":"create","id":"352d0b412aae5a5d2b14ae9d88be59dc276602d9edb9dcc33e138e475b3e4720","from":"52.11.96.81/foobar/ubuntu:latest","time":1428620444}{"status":"start","id":"352d0b412aae5a5d2b14ae9d88be59dc276602d9edb9dcc33e138e475b3e4720","from":"52.11.96.81/foobar/ubuntu:latest","time":1428620444}{"status":"die","id":"352d0b412aae5a5d2b14ae9d88be59dc276602d9edb9dcc33e138e475b3e4720","from":"52.11.96.81/foobar/ubuntu:latest","time":1428620444}{"status":"pull","id":"debian:latest","time":1428620453}{"status":"create","id":"668887b5729946546b3072655dc6da08f0e3210111b68b704eb842adfce53f6c","from":"debian:latest","time":1428620453}{"status":"start","id":"668887b5729946546b3072655dc6da08f0e3210111b68b704eb842adfce53f6c","from":"debian:latest","time":1428620453}{"status":"die","id":"668887b5729946546b3072655dc6da08f0e3210111b68b704eb842adfce53f6c","from":"debian:latest","time":1428620453}{"status":"create","id":"eb4a19ec21ab29bbbffbf3ee2e2df9d99cb749780e1eff06a591cee5ba505180","from":"nginx:latest","time":1428620458}{"status":"start","id":"eb4a19ec21ab29bbbffbf3ee2e2df9d99cb749780e1eff06a591cee5ba505180","from":"nginx:latest","time":1428620458}{"status":"pause","id":"eb4a19ec21ab29bbbffbf3ee2e2df9d99cb749780e1eff06a591cee5ba505180","from":"nginx:latest","time":1428620462}{"status":"unpause","id":"eb4a19ec21ab29bbbffbf3ee2e2df9d99cb749780e1eff06a591cee5ba505180","from":"nginx:latest","time":1428620466}{"status":"die","id":"eb4a19ec21ab29bbbffbf3ee2e2df9d99cb749780e1eff06a591cee5ba505180","from":"nginx:latest","time":1428620469}`
diff --git a/vendor/github.com/samalba/dockerclient/examples/events.go b/vendor/github.com/samalba/dockerclient/examples/events.go
index a623af60c..2d6de40c7 100644
--- a/vendor/github.com/samalba/dockerclient/examples/events.go
+++ b/vendor/github.com/samalba/dockerclient/examples/events.go
@@ -1,7 +1,7 @@
package main
import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/samalba/dockerclient"
+ "github.com/samalba/dockerclient"
"log"
"os"
"os/signal"
@@ -12,10 +12,15 @@ func eventCallback(e *dockerclient.Event, ec chan error, args ...interface{}) {
log.Println(e)
}
+var (
+ client *dockerclient.DockerClient
+)
+
func waitForInterrupt() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT)
for _ = range sigChan {
+ client.StopAllMonitorEvents()
os.Exit(0)
}
}
@@ -26,7 +31,9 @@ func main() {
log.Fatal(err)
}
- docker.StartMonitorEvents(eventCallback, nil)
+ client = docker
+
+ client.StartMonitorEvents(eventCallback, nil)
waitForInterrupt()
}
diff --git a/vendor/github.com/samalba/dockerclient/examples/stats/stats.go b/vendor/github.com/samalba/dockerclient/examples/stats/stats.go
new file mode 100644
index 000000000..9027069dd
--- /dev/null
+++ b/vendor/github.com/samalba/dockerclient/examples/stats/stats.go
@@ -0,0 +1,43 @@
+package main
+
+import (
+ "github.com/samalba/dockerclient"
+ "log"
+ "os"
+ "os/signal"
+ "syscall"
+)
+
+func statCallback(id string, stat *dockerclient.Stats, ec chan error, args ...interface{}) {
+ log.Println(stat)
+}
+
+func waitForInterrupt() {
+ sigChan := make(chan os.Signal, 1)
+ signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT)
+ for _ = range sigChan {
+ os.Exit(0)
+ }
+}
+
+func main() {
+ docker, err := dockerclient.NewDockerClient(os.Getenv("DOCKER_HOST"), nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ containerConfig := &dockerclient.ContainerConfig{Image: "busybox", Cmd: []string{"sh"}}
+ containerId, err := docker.CreateContainer(containerConfig, "")
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Start the container
+ err = docker.StartContainer(containerId, nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+ docker.StartMonitorStats(containerId, statCallback, nil)
+
+ waitForInterrupt()
+}
diff --git a/vendor/github.com/samalba/dockerclient/interface.go b/vendor/github.com/samalba/dockerclient/interface.go
index bab13aa3e..8a4881193 100644
--- a/vendor/github.com/samalba/dockerclient/interface.go
+++ b/vendor/github.com/samalba/dockerclient/interface.go
@@ -6,24 +6,41 @@ import (
type Callback func(*Event, chan error, ...interface{})
+type StatCallback func(string, *Stats, chan error, ...interface{})
+
type Client interface {
Info() (*Info, error)
ListContainers(all, size bool, filters string) ([]Container, error)
InspectContainer(id string) (*ContainerInfo, error)
+ InspectImage(id string) (*ImageInfo, error)
CreateContainer(config *ContainerConfig, name string) (string, error)
ContainerLogs(id string, options *LogOptions) (io.ReadCloser, error)
+ ContainerChanges(id string) ([]*ContainerChanges, error)
Exec(config *ExecConfig) (string, error)
StartContainer(id string, config *HostConfig) error
StopContainer(id string, timeout int) error
RestartContainer(id string, timeout int) error
KillContainer(id, signal string) error
+ Wait(id string) <-chan WaitResult
+ // MonitorEvents takes options and an optional stop channel, and returns
+ // an EventOrError channel. If an error is ever sent, then no more
+ // events will be sent. If a stop channel is provided, events will stop
+ // being monitored after the stop channel is closed.
+ MonitorEvents(options *MonitorEventsOptions, stopChan <-chan struct{}) (<-chan EventOrError, error)
StartMonitorEvents(cb Callback, ec chan error, args ...interface{})
StopAllMonitorEvents()
+ StartMonitorStats(id string, cb StatCallback, ec chan error, args ...interface{})
+ StopAllMonitorStats()
+ TagImage(nameOrID string, repo string, tag string, force bool) error
Version() (*Version, error)
PullImage(name string, auth *AuthConfig) error
+ LoadImage(reader io.Reader) error
RemoveContainer(id string, force, volumes bool) error
- ListImages() ([]*Image, error)
- RemoveImage(name string) error
+ ListImages(all bool) ([]*Image, error)
+ RemoveImage(name string) ([]*ImageDelete, error)
PauseContainer(name string) error
UnpauseContainer(name string) error
+ RenameContainer(oldName string, newName string) error
+ ImportImage(source string, repository string, tag string, tar io.Reader) (io.ReadCloser, error)
+ BuildImage(image *BuildImage) (io.ReadCloser, error)
}
diff --git a/vendor/github.com/samalba/dockerclient/mockclient/mock.go b/vendor/github.com/samalba/dockerclient/mockclient/mock.go
index ff37bebaa..ff982663a 100644
--- a/vendor/github.com/samalba/dockerclient/mockclient/mock.go
+++ b/vendor/github.com/samalba/dockerclient/mockclient/mock.go
@@ -3,8 +3,8 @@ package mockclient
import (
"io"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/samalba/dockerclient"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/mock"
+ "github.com/samalba/dockerclient"
+ "github.com/stretchr/testify/mock"
)
type MockClient struct {
@@ -30,6 +30,11 @@ func (client *MockClient) InspectContainer(id string) (*dockerclient.ContainerIn
return args.Get(0).(*dockerclient.ContainerInfo), args.Error(1)
}
+func (client *MockClient) InspectImage(id string) (*dockerclient.ImageInfo, error) {
+ args := client.Mock.Called(id)
+ return args.Get(0).(*dockerclient.ImageInfo), args.Error(1)
+}
+
func (client *MockClient) CreateContainer(config *dockerclient.ContainerConfig, name string) (string, error) {
args := client.Mock.Called(config, name)
return args.String(0), args.Error(1)
@@ -40,6 +45,11 @@ func (client *MockClient) ContainerLogs(id string, options *dockerclient.LogOpti
return args.Get(0).(io.ReadCloser), args.Error(1)
}
+func (client *MockClient) ContainerChanges(id string) ([]*dockerclient.ContainerChanges, error) {
+ args := client.Mock.Called(id)
+ return args.Get(0).([]*dockerclient.ContainerChanges), args.Error(1)
+}
+
func (client *MockClient) StartContainer(id string, config *dockerclient.HostConfig) error {
args := client.Mock.Called(id, config)
return args.Error(0)
@@ -60,6 +70,16 @@ func (client *MockClient) KillContainer(id, signal string) error {
return args.Error(0)
}
+func (client *MockClient) Wait(id string) <-chan dockerclient.WaitResult {
+ args := client.Mock.Called(id)
+ return args.Get(0).(<-chan dockerclient.WaitResult)
+}
+
+func (client *MockClient) MonitorEvents(options *dockerclient.MonitorEventsOptions, stopChan <-chan struct{}) (<-chan dockerclient.EventOrError, error) {
+ args := client.Mock.Called(options, stopChan)
+ return args.Get(0).(<-chan dockerclient.EventOrError), args.Error(1)
+}
+
func (client *MockClient) StartMonitorEvents(cb dockerclient.Callback, ec chan error, args ...interface{}) {
client.Mock.Called(cb, ec, args)
}
@@ -68,6 +88,19 @@ func (client *MockClient) StopAllMonitorEvents() {
client.Mock.Called()
}
+func (client *MockClient) TagImage(nameOrID string, repo string, tag string, force bool) error {
+ args := client.Mock.Called(nameOrID, repo, tag, force)
+ return args.Error(0)
+}
+
+func (client *MockClient) StartMonitorStats(id string, cb dockerclient.StatCallback, ec chan error, args ...interface{}) {
+ client.Mock.Called(id, cb, ec, args)
+}
+
+func (client *MockClient) StopAllMonitorStats() {
+ client.Mock.Called()
+}
+
func (client *MockClient) Version() (*dockerclient.Version, error) {
args := client.Mock.Called()
return args.Get(0).(*dockerclient.Version), args.Error(1)
@@ -78,19 +111,24 @@ func (client *MockClient) PullImage(name string, auth *dockerclient.AuthConfig)
return args.Error(0)
}
+func (client *MockClient) LoadImage(reader io.Reader) error {
+ args := client.Mock.Called(reader)
+ return args.Error(0)
+}
+
func (client *MockClient) RemoveContainer(id string, force, volumes bool) error {
args := client.Mock.Called(id, force, volumes)
return args.Error(0)
}
-func (client *MockClient) ListImages() ([]*dockerclient.Image, error) {
- args := client.Mock.Called()
+func (client *MockClient) ListImages(all bool) ([]*dockerclient.Image, error) {
+ args := client.Mock.Called(all)
return args.Get(0).([]*dockerclient.Image), args.Error(1)
}
-func (client *MockClient) RemoveImage(name string) error {
+func (client *MockClient) RemoveImage(name string) ([]*dockerclient.ImageDelete, error) {
args := client.Mock.Called(name)
- return args.Error(0)
+ return args.Get(0).([]*dockerclient.ImageDelete), args.Error(1)
}
func (client *MockClient) PauseContainer(name string) error {
@@ -107,3 +145,18 @@ func (client *MockClient) Exec(config *dockerclient.ExecConfig) (string, error)
args := client.Mock.Called(config)
return args.String(0), args.Error(1)
}
+
+func (client *MockClient) RenameContainer(oldName string, newName string) error {
+ args := client.Mock.Called(oldName, newName)
+ return args.Error(0)
+}
+
+func (client *MockClient) ImportImage(source string, repository string, tag string, tar io.Reader) (io.ReadCloser, error) {
+ args := client.Mock.Called(source, repository, tag, tar)
+ return args.Get(0).(io.ReadCloser), args.Error(1)
+}
+
+func (client *MockClient) BuildImage(image *dockerclient.BuildImage) (io.ReadCloser, error) {
+ args := client.Mock.Called(image)
+ return args.Get(0).(io.ReadCloser), args.Error(1)
+}
diff --git a/vendor/github.com/samalba/dockerclient/mockclient/mock_test.go b/vendor/github.com/samalba/dockerclient/mockclient/mock_test.go
index e0ba8fce7..8d91bcf6c 100644
--- a/vendor/github.com/samalba/dockerclient/mockclient/mock_test.go
+++ b/vendor/github.com/samalba/dockerclient/mockclient/mock_test.go
@@ -4,7 +4,7 @@ import (
"reflect"
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/samalba/dockerclient"
+ "github.com/samalba/dockerclient"
)
func TestMock(t *testing.T) {
diff --git a/vendor/github.com/samalba/dockerclient/types.go b/vendor/github.com/samalba/dockerclient/types.go
index 6504e8fa3..15e1e8bcd 100644
--- a/vendor/github.com/samalba/dockerclient/types.go
+++ b/vendor/github.com/samalba/dockerclient/types.go
@@ -1,19 +1,20 @@
package dockerclient
-import "time"
+import (
+ "fmt"
+ "io"
+ "time"
+
+ "github.com/docker/docker/pkg/units"
+)
type ContainerConfig struct {
Hostname string
Domainname string
User string
- Memory int64
- MemorySwap int64
- CpuShares int64
- Cpuset string
AttachStdin bool
AttachStdout bool
AttachStderr bool
- PortSpecs []string
ExposedPorts map[string]struct{}
Tty bool
OpenStdin bool
@@ -22,10 +23,20 @@ type ContainerConfig struct {
Cmd []string
Image string
Volumes map[string]struct{}
+ VolumeDriver string
WorkingDir string
Entrypoint []string
NetworkDisabled bool
+ MacAddress string
OnBuild []string
+ Labels map[string]string
+
+ // FIXME: The following fields have been removed since API v1.18
+ Memory int64
+ MemorySwap int64
+ CpuShares int64
+ Cpuset string
+ PortSpecs []string
// This is used only by the create command
HostConfig HostConfig
@@ -35,15 +46,42 @@ type HostConfig struct {
Binds []string
ContainerIDFile string
LxcConf []map[string]string
+ Memory int64
+ MemorySwap int64
+ CpuShares int64
+ CpuPeriod int64
+ CpusetCpus string
+ CpusetMems string
+ CpuQuota int64
+ BlkioWeight int64
+ OomKillDisable bool
Privileged bool
PortBindings map[string][]PortBinding
Links []string
PublishAllPorts bool
Dns []string
DnsSearch []string
+ ExtraHosts []string
VolumesFrom []string
+ Devices []DeviceMapping
NetworkMode string
+ IpcMode string
+ PidMode string
+ UTSMode string
+ CapAdd []string
+ CapDrop []string
RestartPolicy RestartPolicy
+ SecurityOpt []string
+ ReadonlyRootfs bool
+ Ulimits []Ulimit
+ LogConfig LogConfig
+ CgroupParent string
+}
+
+type DeviceMapping struct {
+ PathOnHost string `json:"PathOnHost"`
+ PathInContainer string `json:"PathInContainer"`
+ CgroupPermissions string `json:"CgroupPermissions"`
}
type ExecConfig struct {
@@ -64,6 +102,18 @@ type LogOptions struct {
Tail int64
}
+type MonitorEventsFilters struct {
+ Event string `json:",omitempty"`
+ Image string `json:",omitempty"`
+ Container string `json:",omitempty"`
+}
+
+type MonitorEventsOptions struct {
+ Since int
+ Until int
+ Filters *MonitorEventsFilters `json:",omitempty"`
+}
+
type RestartPolicy struct {
Name string
MaximumRetryCount int64
@@ -74,28 +124,94 @@ type PortBinding struct {
HostPort string
}
-type ContainerInfo struct {
- Id string
- Created string
- Path string
- Name string
- Args []string
- ExecIDs []string
- Config *ContainerConfig
- State struct {
- Running bool
- Paused bool
- Restarting bool
- Pid int
- ExitCode int
- StartedAt time.Time
- FinishedAt time.Time
- Ghost bool
+type State struct {
+ Running bool
+ Paused bool
+ Restarting bool
+ OOMKilled bool
+ Dead bool
+ Pid int
+ ExitCode int
+ Error string // contains last known error when starting the container
+ StartedAt time.Time
+ FinishedAt time.Time
+ Ghost bool
+}
+
+// String returns a human-readable description of the state
+// Stoken from docker/docker/daemon/state.go
+func (s *State) String() string {
+ if s.Running {
+ if s.Paused {
+ return fmt.Sprintf("Up %s (Paused)", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt)))
+ }
+ if s.Restarting {
+ return fmt.Sprintf("Restarting (%d) %s ago", s.ExitCode, units.HumanDuration(time.Now().UTC().Sub(s.FinishedAt)))
+ }
+
+ return fmt.Sprintf("Up %s", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt)))
}
+
+ if s.Dead {
+ return "Dead"
+ }
+
+ if s.FinishedAt.IsZero() {
+ return ""
+ }
+
+ return fmt.Sprintf("Exited (%d) %s ago", s.ExitCode, units.HumanDuration(time.Now().UTC().Sub(s.FinishedAt)))
+}
+
+// StateString returns a single string to describe state
+// Stoken from docker/docker/daemon/state.go
+func (s *State) StateString() string {
+ if s.Running {
+ if s.Paused {
+ return "paused"
+ }
+ if s.Restarting {
+ return "restarting"
+ }
+ return "running"
+ }
+
+ if s.Dead {
+ return "dead"
+ }
+
+ return "exited"
+}
+
+type ImageInfo struct {
+ Architecture string
+ Author string
+ Comment string
+ Config *ContainerConfig
+ Container string
+ ContainerConfig *ContainerConfig
+ Created time.Time
+ DockerVersion string
+ Id string
+ Os string
+ Parent string
+ Size int64
+ VirtualSize int64
+}
+
+type ContainerInfo struct {
+ Id string
+ Created string
+ Path string
+ Name string
+ Args []string
+ ExecIDs []string
+ Config *ContainerConfig
+ State *State
Image string
NetworkSettings struct {
- IpAddress string
- IpPrefixLen int
+ IPAddress string `json:"IpAddress"`
+ IPPrefixLen int `json:"IpPrefixLen"`
Gateway string
Bridge string
Ports map[string][]PortBinding
@@ -106,6 +222,11 @@ type ContainerInfo struct {
HostConfig *HostConfig
}
+type ContainerChanges struct {
+ Path string
+ Kind int
+}
+
type Port struct {
IP string
PrivatePort int
@@ -123,6 +244,7 @@ type Container struct {
Ports []Port
SizeRw int64
SizeRootFs int64
+ Labels map[string]string
}
type Event struct {
@@ -133,9 +255,13 @@ type Event struct {
}
type Version struct {
- Version string
- GitCommit string
- GoVersion string
+ ApiVersion string
+ Arch string
+ GitCommit string
+ GoVersion string
+ KernelVersion string
+ Os string
+ Version string
}
type RespContainersCreate struct {
@@ -152,17 +278,167 @@ type Image struct {
VirtualSize int64
}
+// Info is the struct returned by /info
+// The API is currently in flux, so Debug, MemoryLimit, SwapLimit, and
+// IPv4Forwarding are interfaces because in docker 1.6.1 they are 0 or 1 but in
+// master they are bools.
type Info struct {
- ID string
- Containers int64
- Driver string
- DriverStatus [][]string
- ExecutionDriver string
- Images int64
- KernelVersion string
- OperatingSystem string
- NCPU int64
- MemTotal int64
- Name string
- Labels []string
+ ID string
+ Containers int64
+ Driver string
+ DriverStatus [][]string
+ ExecutionDriver string
+ Images int64
+ KernelVersion string
+ OperatingSystem string
+ NCPU int64
+ MemTotal int64
+ Name string
+ Labels []string
+ Debug interface{}
+ NFd int64
+ NGoroutines int64
+ SystemTime string
+ NEventsListener int64
+ InitPath string
+ InitSha1 string
+ IndexServerAddress string
+ MemoryLimit interface{}
+ SwapLimit interface{}
+ IPv4Forwarding interface{}
+ BridgeNfIptables bool
+ BridgeNfIp6tables bool
+ DockerRootDir string
+ HttpProxy string
+ HttpsProxy string
+ NoProxy string
+}
+
+type ImageDelete struct {
+ Deleted string
+ Untagged string
+}
+
+type EventOrError struct {
+ Event
+ Error error
+}
+
+type WaitResult struct {
+ ExitCode int
+ Error error
+}
+
+type decodingResult struct {
+ result interface{}
+ err error
+}
+
+// The following are types for the API stats endpoint
+type ThrottlingData struct {
+ // Number of periods with throttling active
+ Periods uint64 `json:"periods"`
+ // Number of periods when the container hit its throttling limit.
+ ThrottledPeriods uint64 `json:"throttled_periods"`
+ // Aggregate time the container was throttled for in nanoseconds.
+ ThrottledTime uint64 `json:"throttled_time"`
+}
+
+type CpuUsage struct {
+ // Total CPU time consumed.
+ // Units: nanoseconds.
+ TotalUsage uint64 `json:"total_usage"`
+ // Total CPU time consumed per core.
+ // Units: nanoseconds.
+ PercpuUsage []uint64 `json:"percpu_usage"`
+ // Time spent by tasks of the cgroup in kernel mode.
+ // Units: nanoseconds.
+ UsageInKernelmode uint64 `json:"usage_in_kernelmode"`
+ // Time spent by tasks of the cgroup in user mode.
+ // Units: nanoseconds.
+ UsageInUsermode uint64 `json:"usage_in_usermode"`
+}
+
+type CpuStats struct {
+ CpuUsage CpuUsage `json:"cpu_usage"`
+ SystemUsage uint64 `json:"system_cpu_usage"`
+ ThrottlingData ThrottlingData `json:"throttling_data,omitempty"`
+}
+
+type NetworkStats struct {
+ RxBytes uint64 `json:"rx_bytes"`
+ RxPackets uint64 `json:"rx_packets"`
+ RxErrors uint64 `json:"rx_errors"`
+ RxDropped uint64 `json:"rx_dropped"`
+ TxBytes uint64 `json:"tx_bytes"`
+ TxPackets uint64 `json:"tx_packets"`
+ TxErrors uint64 `json:"tx_errors"`
+ TxDropped uint64 `json:"tx_dropped"`
+}
+
+type MemoryStats struct {
+ Usage uint64 `json:"usage"`
+ MaxUsage uint64 `json:"max_usage"`
+ Stats map[string]uint64 `json:"stats"`
+ Failcnt uint64 `json:"failcnt"`
+ Limit uint64 `json:"limit"`
+}
+
+type BlkioStatEntry struct {
+ Major uint64 `json:"major"`
+ Minor uint64 `json:"minor"`
+ Op string `json:"op"`
+ Value uint64 `json:"value"`
+}
+
+type BlkioStats struct {
+ // number of bytes tranferred to and from the block device
+ IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"`
+ IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"`
+ IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive"`
+ IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive"`
+ IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive"`
+ IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive"`
+ IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive"`
+ SectorsRecursive []BlkioStatEntry `json:"sectors_recursive"`
+}
+
+type Stats struct {
+ Read time.Time `json:"read"`
+ NetworkStats NetworkStats `json:"network,omitempty"`
+ CpuStats CpuStats `json:"cpu_stats,omitempty"`
+ MemoryStats MemoryStats `json:"memory_stats,omitempty"`
+ BlkioStats BlkioStats `json:"blkio_stats,omitempty"`
+}
+
+type Ulimit struct {
+ Name string `json:"name"`
+ Soft uint64 `json:"soft"`
+ Hard uint64 `json:"hard"`
+}
+
+type LogConfig struct {
+ Type string `json:"type"`
+ Config map[string]string `json:"config"`
+}
+
+type BuildImage struct {
+ Config *ConfigFile
+ DockerfileName string
+ Context io.Reader
+ RemoteURL string
+ RepoName string
+ SuppressOutput bool
+ NoCache bool
+ Remove bool
+ ForceRemove bool
+ Pull bool
+ Memory int64
+ MemorySwap int64
+ CpuShares int64
+ CpuPeriod int64
+ CpuQuota int64
+ CpuSetCpus string
+ CpuSetMems string
+ CgroupParent string
}
diff --git a/vendor/github.com/square/go-jose/.gitignore b/vendor/github.com/square/go-jose/.gitignore
deleted file mode 100644
index 5b4d73b68..000000000
--- a/vendor/github.com/square/go-jose/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-*~
-.*.swp
-*.out
-*.test
-*.pem
-*.cov
-jose-util/jose-util
diff --git a/vendor/github.com/square/go-jose/.travis.yml b/vendor/github.com/square/go-jose/.travis.yml
deleted file mode 100644
index f90eec192..000000000
--- a/vendor/github.com/square/go-jose/.travis.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-language: go
-
-sudo: false
-
-matrix:
- fast_finish: true
- allow_failures:
- - go: tip
-
-go:
-- 1.2
-- 1.3
-- 1.4
-- 1.5
-- tip
-
-before_script:
-- export PATH=$HOME/.local/bin:$PATH
-
-before_install:
-- go get github.com/axw/gocov/gocov
-- go get github.com/mattn/goveralls
-- go get golang.org/x/tools/cmd/cover || true
-- go get code.google.com/p/go.tools/cmd/cover || true
-- pip install cram --user `whoami`
-
-script:
-- go test . -v -covermode=count -coverprofile=profile.cov
-- go test ./cipher -v -covermode=count -coverprofile=cipher/profile.cov
-- cd jose-util && go build && PATH=$PWD:$PATH cram -v jose-util.t
-- cd ..
-
-after_success:
-- tail -n+2 cipher/profile.cov >> profile.cov
-- $HOME/gopath/bin/goveralls -coverprofile=profile.cov -service=travis-ci
-
diff --git a/vendor/github.com/square/go-jose/asymmetric.go b/vendor/github.com/square/go-jose/asymmetric.go
index a5494c0a2..b252619d8 100644
--- a/vendor/github.com/square/go-jose/asymmetric.go
+++ b/vendor/github.com/square/go-jose/asymmetric.go
@@ -28,7 +28,7 @@ import (
"fmt"
"math/big"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/square/go-jose/cipher"
+ "github.com/square/go-jose/cipher"
)
// A generic RSA-based encrypter/verifier
diff --git a/vendor/github.com/square/go-jose/jose-util/main.go b/vendor/github.com/square/go-jose/jose-util/main.go
index 66bbf6b47..00d539808 100644
--- a/vendor/github.com/square/go-jose/jose-util/main.go
+++ b/vendor/github.com/square/go-jose/jose-util/main.go
@@ -22,7 +22,7 @@ import (
"os"
"github.com/codegangsta/cli"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/square/go-jose"
+ "github.com/square/go-jose"
)
func main() {
diff --git a/vendor/github.com/square/go-jose/symmetric.go b/vendor/github.com/square/go-jose/symmetric.go
index 7fdef7ebc..3adab9ddb 100644
--- a/vendor/github.com/square/go-jose/symmetric.go
+++ b/vendor/github.com/square/go-jose/symmetric.go
@@ -25,7 +25,7 @@ import (
"crypto/sha512"
"crypto/subtle"
"errors"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/square/go-jose/cipher"
+ "github.com/square/go-jose/cipher"
"hash"
"io"
)
diff --git a/vendor/github.com/stretchr/objx/.gitignore b/vendor/github.com/stretchr/objx/.gitignore
deleted file mode 100644
index 00268614f..000000000
--- a/vendor/github.com/stretchr/objx/.gitignore
+++ /dev/null
@@ -1,22 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
diff --git a/vendor/github.com/stretchr/objx/README.md b/vendor/github.com/stretchr/objx/README.md
deleted file mode 100644
index 4aa180687..000000000
--- a/vendor/github.com/stretchr/objx/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# objx
-
- * Jump into the [API Documentation](http://godoc.org/github.com/stretchr/objx)
diff --git a/vendor/github.com/stretchr/objx/accessors.go b/vendor/github.com/stretchr/objx/accessors.go
deleted file mode 100644
index 721bcac79..000000000
--- a/vendor/github.com/stretchr/objx/accessors.go
+++ /dev/null
@@ -1,179 +0,0 @@
-package objx
-
-import (
- "fmt"
- "regexp"
- "strconv"
- "strings"
-)
-
-// arrayAccesRegexString is the regex used to extract the array number
-// from the access path
-const arrayAccesRegexString = `^(.+)\[([0-9]+)\]$`
-
-// arrayAccesRegex is the compiled arrayAccesRegexString
-var arrayAccesRegex = regexp.MustCompile(arrayAccesRegexString)
-
-// Get gets the value using the specified selector and
-// returns it inside a new Obj object.
-//
-// If it cannot find the value, Get will return a nil
-// value inside an instance of Obj.
-//
-// Get can only operate directly on map[string]interface{} and []interface.
-//
-// Example
-//
-// To access the title of the third chapter of the second book, do:
-//
-// o.Get("books[1].chapters[2].title")
-func (m Map) Get(selector string) *Value {
- rawObj := access(m, selector, nil, false, false)
- return &Value{data: rawObj}
-}
-
-// Set sets the value using the specified selector and
-// returns the object on which Set was called.
-//
-// Set can only operate directly on map[string]interface{} and []interface
-//
-// Example
-//
-// To set the title of the third chapter of the second book, do:
-//
-// o.Set("books[1].chapters[2].title","Time to Go")
-func (m Map) Set(selector string, value interface{}) Map {
- access(m, selector, value, true, false)
- return m
-}
-
-// access accesses the object using the selector and performs the
-// appropriate action.
-func access(current, selector, value interface{}, isSet, panics bool) interface{} {
-
- switch selector.(type) {
- case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
-
- if array, ok := current.([]interface{}); ok {
- index := intFromInterface(selector)
-
- if index >= len(array) {
- if panics {
- panic(fmt.Sprintf("objx: Index %d is out of range. Slice only contains %d items.", index, len(array)))
- }
- return nil
- }
-
- return array[index]
- }
-
- return nil
-
- case string:
-
- selStr := selector.(string)
- selSegs := strings.SplitN(selStr, PathSeparator, 2)
- thisSel := selSegs[0]
- index := -1
- var err error
-
- // https://github.com/stretchr/objx/issues/12
- if strings.Contains(thisSel, "[") {
-
- arrayMatches := arrayAccesRegex.FindStringSubmatch(thisSel)
-
- if len(arrayMatches) > 0 {
-
- // Get the key into the map
- thisSel = arrayMatches[1]
-
- // Get the index into the array at the key
- index, err = strconv.Atoi(arrayMatches[2])
-
- if err != nil {
- // This should never happen. If it does, something has gone
- // seriously wrong. Panic.
- panic("objx: Array index is not an integer. Must use array[int].")
- }
-
- }
- }
-
- if curMap, ok := current.(Map); ok {
- current = map[string]interface{}(curMap)
- }
-
- // get the object in question
- switch current.(type) {
- case map[string]interface{}:
- curMSI := current.(map[string]interface{})
- if len(selSegs) <= 1 && isSet {
- curMSI[thisSel] = value
- return nil
- } else {
- current = curMSI[thisSel]
- }
- default:
- current = nil
- }
-
- if current == nil && panics {
- panic(fmt.Sprintf("objx: '%v' invalid on object.", selector))
- }
-
- // do we need to access the item of an array?
- if index > -1 {
- if array, ok := current.([]interface{}); ok {
- if index < len(array) {
- current = array[index]
- } else {
- if panics {
- panic(fmt.Sprintf("objx: Index %d is out of range. Slice only contains %d items.", index, len(array)))
- }
- current = nil
- }
- }
- }
-
- if len(selSegs) > 1 {
- current = access(current, selSegs[1], value, isSet, panics)
- }
-
- }
-
- return current
-
-}
-
-// intFromInterface converts an interface object to the largest
-// representation of an unsigned integer using a type switch and
-// assertions
-func intFromInterface(selector interface{}) int {
- var value int
- switch selector.(type) {
- case int:
- value = selector.(int)
- case int8:
- value = int(selector.(int8))
- case int16:
- value = int(selector.(int16))
- case int32:
- value = int(selector.(int32))
- case int64:
- value = int(selector.(int64))
- case uint:
- value = int(selector.(uint))
- case uint8:
- value = int(selector.(uint8))
- case uint16:
- value = int(selector.(uint16))
- case uint32:
- value = int(selector.(uint32))
- case uint64:
- value = int(selector.(uint64))
- default:
- panic("objx: array access argument is not an integer type (this should never happen)")
- }
-
- return value
-}
diff --git a/vendor/github.com/stretchr/objx/accessors_test.go b/vendor/github.com/stretchr/objx/accessors_test.go
deleted file mode 100644
index 940264426..000000000
--- a/vendor/github.com/stretchr/objx/accessors_test.go
+++ /dev/null
@@ -1,145 +0,0 @@
-package objx
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-func TestAccessorsAccessGetSingleField(t *testing.T) {
-
- current := map[string]interface{}{"name": "Tyler"}
- assert.Equal(t, "Tyler", access(current, "name", nil, false, true))
-
-}
-func TestAccessorsAccessGetDeep(t *testing.T) {
-
- current := map[string]interface{}{"name": map[string]interface{}{"first": "Tyler", "last": "Bunnell"}}
- assert.Equal(t, "Tyler", access(current, "name.first", nil, false, true))
- assert.Equal(t, "Bunnell", access(current, "name.last", nil, false, true))
-
-}
-func TestAccessorsAccessGetDeepDeep(t *testing.T) {
-
- current := map[string]interface{}{"one": map[string]interface{}{"two": map[string]interface{}{"three": map[string]interface{}{"four": 4}}}}
- assert.Equal(t, 4, access(current, "one.two.three.four", nil, false, true))
-
-}
-func TestAccessorsAccessGetInsideArray(t *testing.T) {
-
- current := map[string]interface{}{"names": []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}}}
- assert.Equal(t, "Tyler", access(current, "names[0].first", nil, false, true))
- assert.Equal(t, "Bunnell", access(current, "names[0].last", nil, false, true))
- assert.Equal(t, "Capitol", access(current, "names[1].first", nil, false, true))
- assert.Equal(t, "Bollocks", access(current, "names[1].last", nil, false, true))
-
- assert.Panics(t, func() {
- access(current, "names[2]", nil, false, true)
- })
- assert.Nil(t, access(current, "names[2]", nil, false, false))
-
-}
-
-func TestAccessorsAccessGetFromArrayWithInt(t *testing.T) {
-
- current := []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}}
- one := access(current, 0, nil, false, false)
- two := access(current, 1, nil, false, false)
- three := access(current, 2, nil, false, false)
-
- assert.Equal(t, "Tyler", one.(map[string]interface{})["first"])
- assert.Equal(t, "Capitol", two.(map[string]interface{})["first"])
- assert.Nil(t, three)
-
-}
-
-func TestAccessorsGet(t *testing.T) {
-
- current := New(map[string]interface{}{"name": "Tyler"})
- assert.Equal(t, "Tyler", current.Get("name").data)
-
-}
-
-func TestAccessorsAccessSetSingleField(t *testing.T) {
-
- current := map[string]interface{}{"name": "Tyler"}
- access(current, "name", "Mat", true, false)
- assert.Equal(t, current["name"], "Mat")
-
- access(current, "age", 29, true, true)
- assert.Equal(t, current["age"], 29)
-
-}
-
-func TestAccessorsAccessSetSingleFieldNotExisting(t *testing.T) {
-
- current := map[string]interface{}{}
- access(current, "name", "Mat", true, false)
- assert.Equal(t, current["name"], "Mat")
-
-}
-
-func TestAccessorsAccessSetDeep(t *testing.T) {
-
- current := map[string]interface{}{"name": map[string]interface{}{"first": "Tyler", "last": "Bunnell"}}
-
- access(current, "name.first", "Mat", true, true)
- access(current, "name.last", "Ryer", true, true)
-
- assert.Equal(t, "Mat", access(current, "name.first", nil, false, true))
- assert.Equal(t, "Ryer", access(current, "name.last", nil, false, true))
-
-}
-func TestAccessorsAccessSetDeepDeep(t *testing.T) {
-
- current := map[string]interface{}{"one": map[string]interface{}{"two": map[string]interface{}{"three": map[string]interface{}{"four": 4}}}}
-
- access(current, "one.two.three.four", 5, true, true)
-
- assert.Equal(t, 5, access(current, "one.two.three.four", nil, false, true))
-
-}
-func TestAccessorsAccessSetArray(t *testing.T) {
-
- current := map[string]interface{}{"names": []interface{}{"Tyler"}}
-
- access(current, "names[0]", "Mat", true, true)
-
- assert.Equal(t, "Mat", access(current, "names[0]", nil, false, true))
-
-}
-func TestAccessorsAccessSetInsideArray(t *testing.T) {
-
- current := map[string]interface{}{"names": []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}}}
-
- access(current, "names[0].first", "Mat", true, true)
- access(current, "names[0].last", "Ryer", true, true)
- access(current, "names[1].first", "Captain", true, true)
- access(current, "names[1].last", "Underpants", true, true)
-
- assert.Equal(t, "Mat", access(current, "names[0].first", nil, false, true))
- assert.Equal(t, "Ryer", access(current, "names[0].last", nil, false, true))
- assert.Equal(t, "Captain", access(current, "names[1].first", nil, false, true))
- assert.Equal(t, "Underpants", access(current, "names[1].last", nil, false, true))
-
-}
-
-func TestAccessorsAccessSetFromArrayWithInt(t *testing.T) {
-
- current := []interface{}{map[string]interface{}{"first": "Tyler", "last": "Bunnell"}, map[string]interface{}{"first": "Capitol", "last": "Bollocks"}}
- one := access(current, 0, nil, false, false)
- two := access(current, 1, nil, false, false)
- three := access(current, 2, nil, false, false)
-
- assert.Equal(t, "Tyler", one.(map[string]interface{})["first"])
- assert.Equal(t, "Capitol", two.(map[string]interface{})["first"])
- assert.Nil(t, three)
-
-}
-
-func TestAccessorsSet(t *testing.T) {
-
- current := New(map[string]interface{}{"name": "Tyler"})
- current.Set("name", "Mat")
- assert.Equal(t, "Mat", current.Get("name").data)
-
-}
diff --git a/vendor/github.com/stretchr/objx/codegen/index.html b/vendor/github.com/stretchr/objx/codegen/index.html
deleted file mode 100644
index 379ffc3c0..000000000
--- a/vendor/github.com/stretchr/objx/codegen/index.html
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-
- Codegen
-
-
-
-
-
-
- Template
-
-
- Use {x}
as a placeholder for each argument.
-
-
-
-
- Arguments (comma separated)
-
-
- One block per line
-
-
-
-
- Output
-
-
-
-
-
-
-
-
-
diff --git a/vendor/github.com/stretchr/objx/constants.go b/vendor/github.com/stretchr/objx/constants.go
deleted file mode 100644
index f9eb42a25..000000000
--- a/vendor/github.com/stretchr/objx/constants.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package objx
-
-const (
- // PathSeparator is the character used to separate the elements
- // of the keypath.
- //
- // For example, `location.address.city`
- PathSeparator string = "."
-
- // SignatureSeparator is the character that is used to
- // separate the Base64 string from the security signature.
- SignatureSeparator = "_"
-)
diff --git a/vendor/github.com/stretchr/objx/conversions.go b/vendor/github.com/stretchr/objx/conversions.go
deleted file mode 100644
index 9cdfa9f9f..000000000
--- a/vendor/github.com/stretchr/objx/conversions.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package objx
-
-import (
- "bytes"
- "encoding/base64"
- "encoding/json"
- "errors"
- "fmt"
- "net/url"
-)
-
-// JSON converts the contained object to a JSON string
-// representation
-func (m Map) JSON() (string, error) {
-
- result, err := json.Marshal(m)
-
- if err != nil {
- err = errors.New("objx: JSON encode failed with: " + err.Error())
- }
-
- return string(result), err
-
-}
-
-// MustJSON converts the contained object to a JSON string
-// representation and panics if there is an error
-func (m Map) MustJSON() string {
- result, err := m.JSON()
- if err != nil {
- panic(err.Error())
- }
- return result
-}
-
-// Base64 converts the contained object to a Base64 string
-// representation of the JSON string representation
-func (m Map) Base64() (string, error) {
-
- var buf bytes.Buffer
-
- jsonData, err := m.JSON()
- if err != nil {
- return "", err
- }
-
- encoder := base64.NewEncoder(base64.StdEncoding, &buf)
- encoder.Write([]byte(jsonData))
- encoder.Close()
-
- return buf.String(), nil
-
-}
-
-// MustBase64 converts the contained object to a Base64 string
-// representation of the JSON string representation and panics
-// if there is an error
-func (m Map) MustBase64() string {
- result, err := m.Base64()
- if err != nil {
- panic(err.Error())
- }
- return result
-}
-
-// SignedBase64 converts the contained object to a Base64 string
-// representation of the JSON string representation and signs it
-// using the provided key.
-func (m Map) SignedBase64(key string) (string, error) {
-
- base64, err := m.Base64()
- if err != nil {
- return "", err
- }
-
- sig := HashWithKey(base64, key)
-
- return base64 + SignatureSeparator + sig, nil
-
-}
-
-// MustSignedBase64 converts the contained object to a Base64 string
-// representation of the JSON string representation and signs it
-// using the provided key and panics if there is an error
-func (m Map) MustSignedBase64(key string) string {
- result, err := m.SignedBase64(key)
- if err != nil {
- panic(err.Error())
- }
- return result
-}
-
-/*
- URL Query
- ------------------------------------------------
-*/
-
-// URLValues creates a url.Values object from an Obj. This
-// function requires that the wrapped object be a map[string]interface{}
-func (m Map) URLValues() url.Values {
-
- vals := make(url.Values)
-
- for k, v := range m {
- //TODO: can this be done without sprintf?
- vals.Set(k, fmt.Sprintf("%v", v))
- }
-
- return vals
-}
-
-// URLQuery gets an encoded URL query representing the given
-// Obj. This function requires that the wrapped object be a
-// map[string]interface{}
-func (m Map) URLQuery() (string, error) {
- return m.URLValues().Encode(), nil
-}
diff --git a/vendor/github.com/stretchr/objx/conversions_test.go b/vendor/github.com/stretchr/objx/conversions_test.go
deleted file mode 100644
index 483eb5a93..000000000
--- a/vendor/github.com/stretchr/objx/conversions_test.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package objx
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-func TestConversionJSON(t *testing.T) {
-
- jsonString := `{"name":"Mat"}`
- o := MustFromJSON(jsonString)
-
- result, err := o.JSON()
-
- if assert.NoError(t, err) {
- assert.Equal(t, jsonString, result)
- }
-
- assert.Equal(t, jsonString, o.MustJSON())
-
-}
-
-func TestConversionJSONWithError(t *testing.T) {
-
- o := MSI()
- o["test"] = func() {}
-
- assert.Panics(t, func() {
- o.MustJSON()
- })
-
- _, err := o.JSON()
-
- assert.Error(t, err)
-
-}
-
-func TestConversionBase64(t *testing.T) {
-
- o := New(map[string]interface{}{"name": "Mat"})
-
- result, err := o.Base64()
-
- if assert.NoError(t, err) {
- assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", result)
- }
-
- assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", o.MustBase64())
-
-}
-
-func TestConversionBase64WithError(t *testing.T) {
-
- o := MSI()
- o["test"] = func() {}
-
- assert.Panics(t, func() {
- o.MustBase64()
- })
-
- _, err := o.Base64()
-
- assert.Error(t, err)
-
-}
-
-func TestConversionSignedBase64(t *testing.T) {
-
- o := New(map[string]interface{}{"name": "Mat"})
-
- result, err := o.SignedBase64("key")
-
- if assert.NoError(t, err) {
- assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", result)
- }
-
- assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", o.MustSignedBase64("key"))
-
-}
-
-func TestConversionSignedBase64WithError(t *testing.T) {
-
- o := MSI()
- o["test"] = func() {}
-
- assert.Panics(t, func() {
- o.MustSignedBase64("key")
- })
-
- _, err := o.SignedBase64("key")
-
- assert.Error(t, err)
-
-}
diff --git a/vendor/github.com/stretchr/objx/doc.go b/vendor/github.com/stretchr/objx/doc.go
deleted file mode 100644
index 47bf85e46..000000000
--- a/vendor/github.com/stretchr/objx/doc.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// objx - Go package for dealing with maps, slices, JSON and other data.
-//
-// Overview
-//
-// Objx provides the `objx.Map` type, which is a `map[string]interface{}` that exposes
-// a powerful `Get` method (among others) that allows you to easily and quickly get
-// access to data within the map, without having to worry too much about type assertions,
-// missing data, default values etc.
-//
-// Pattern
-//
-// Objx uses a preditable pattern to make access data from within `map[string]interface{}'s
-// easy.
-//
-// Call one of the `objx.` functions to create your `objx.Map` to get going:
-//
-// m, err := objx.FromJSON(json)
-//
-// NOTE: Any methods or functions with the `Must` prefix will panic if something goes wrong,
-// the rest will be optimistic and try to figure things out without panicking.
-//
-// Use `Get` to access the value you're interested in. You can use dot and array
-// notation too:
-//
-// m.Get("places[0].latlng")
-//
-// Once you have saught the `Value` you're interested in, you can use the `Is*` methods
-// to determine its type.
-//
-// if m.Get("code").IsStr() { /* ... */ }
-//
-// Or you can just assume the type, and use one of the strong type methods to
-// extract the real value:
-//
-// m.Get("code").Int()
-//
-// If there's no value there (or if it's the wrong type) then a default value
-// will be returned, or you can be explicit about the default value.
-//
-// Get("code").Int(-1)
-//
-// If you're dealing with a slice of data as a value, Objx provides many useful
-// methods for iterating, manipulating and selecting that data. You can find out more
-// by exploring the index below.
-//
-// Reading data
-//
-// A simple example of how to use Objx:
-//
-// // use MustFromJSON to make an objx.Map from some JSON
-// m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`)
-//
-// // get the details
-// name := m.Get("name").Str()
-// age := m.Get("age").Int()
-//
-// // get their nickname (or use their name if they
-// // don't have one)
-// nickname := m.Get("nickname").Str(name)
-//
-// Ranging
-//
-// Since `objx.Map` is a `map[string]interface{}` you can treat it as such. For
-// example, to `range` the data, do what you would expect:
-//
-// m := objx.MustFromJSON(json)
-// for key, value := range m {
-//
-// /* ... do your magic ... */
-//
-// }
-package objx
diff --git a/vendor/github.com/stretchr/objx/fixture_test.go b/vendor/github.com/stretchr/objx/fixture_test.go
deleted file mode 100644
index bcfe21cdc..000000000
--- a/vendor/github.com/stretchr/objx/fixture_test.go
+++ /dev/null
@@ -1,98 +0,0 @@
-package objx
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-var fixtures = []struct {
- // name is the name of the fixture (used for reporting
- // failures)
- name string
- // data is the JSON data to be worked on
- data string
- // get is the argument(s) to pass to Get
- get interface{}
- // output is the expected output
- output interface{}
-}{
- {
- name: "Simple get",
- data: `{"name": "Mat"}`,
- get: "name",
- output: "Mat",
- },
- {
- name: "Get with dot notation",
- data: `{"address": {"city": "Boulder"}}`,
- get: "address.city",
- output: "Boulder",
- },
- {
- name: "Deep get with dot notation",
- data: `{"one": {"two": {"three": {"four": "hello"}}}}`,
- get: "one.two.three.four",
- output: "hello",
- },
- {
- name: "Get missing with dot notation",
- data: `{"one": {"two": {"three": {"four": "hello"}}}}`,
- get: "one.ten",
- output: nil,
- },
- {
- name: "Get with array notation",
- data: `{"tags": ["one", "two", "three"]}`,
- get: "tags[1]",
- output: "two",
- },
- {
- name: "Get with array and dot notation",
- data: `{"types": { "tags": ["one", "two", "three"]}}`,
- get: "types.tags[1]",
- output: "two",
- },
- {
- name: "Get with array and dot notation - field after array",
- data: `{"tags": [{"name":"one"}, {"name":"two"}, {"name":"three"}]}`,
- get: "tags[1].name",
- output: "two",
- },
- {
- name: "Complex get with array and dot notation",
- data: `{"tags": [{"list": [{"one":"pizza"}]}]}`,
- get: "tags[0].list[0].one",
- output: "pizza",
- },
- {
- name: "Get field from within string should be nil",
- data: `{"name":"Tyler"}`,
- get: "name.something",
- output: nil,
- },
- {
- name: "Get field from within string (using array accessor) should be nil",
- data: `{"numbers":["one", "two", "three"]}`,
- get: "numbers[0].nope",
- output: nil,
- },
-}
-
-func TestFixtures(t *testing.T) {
-
- for _, fixture := range fixtures {
-
- m := MustFromJSON(fixture.data)
-
- // get the value
- t.Logf("Running get fixture: \"%s\" (%v)", fixture.name, fixture)
- value := m.Get(fixture.get.(string))
-
- // make sure it matches
- assert.Equal(t, fixture.output, value.data,
- "Get fixture \"%s\" failed: %v", fixture.name, fixture,
- )
-
- }
-
-}
diff --git a/vendor/github.com/stretchr/objx/map.go b/vendor/github.com/stretchr/objx/map.go
deleted file mode 100644
index eb6ed8e28..000000000
--- a/vendor/github.com/stretchr/objx/map.go
+++ /dev/null
@@ -1,222 +0,0 @@
-package objx
-
-import (
- "encoding/base64"
- "encoding/json"
- "errors"
- "io/ioutil"
- "net/url"
- "strings"
-)
-
-// MSIConvertable is an interface that defines methods for converting your
-// custom types to a map[string]interface{} representation.
-type MSIConvertable interface {
- // MSI gets a map[string]interface{} (msi) representing the
- // object.
- MSI() map[string]interface{}
-}
-
-// Map provides extended functionality for working with
-// untyped data, in particular map[string]interface (msi).
-type Map map[string]interface{}
-
-// Value returns the internal value instance
-func (m Map) Value() *Value {
- return &Value{data: m}
-}
-
-// Nil represents a nil Map.
-var Nil Map = New(nil)
-
-// New creates a new Map containing the map[string]interface{} in the data argument.
-// If the data argument is not a map[string]interface, New attempts to call the
-// MSI() method on the MSIConvertable interface to create one.
-func New(data interface{}) Map {
- if _, ok := data.(map[string]interface{}); !ok {
- if converter, ok := data.(MSIConvertable); ok {
- data = converter.MSI()
- } else {
- return nil
- }
- }
- return Map(data.(map[string]interface{}))
-}
-
-// MSI creates a map[string]interface{} and puts it inside a new Map.
-//
-// The arguments follow a key, value pattern.
-//
-// Panics
-//
-// Panics if any key arugment is non-string or if there are an odd number of arguments.
-//
-// Example
-//
-// To easily create Maps:
-//
-// m := objx.MSI("name", "Mat", "age", 29, "subobj", objx.MSI("active", true))
-//
-// // creates an Map equivalent to
-// m := objx.New(map[string]interface{}{"name": "Mat", "age": 29, "subobj": map[string]interface{}{"active": true}})
-func MSI(keyAndValuePairs ...interface{}) Map {
-
- newMap := make(map[string]interface{})
- keyAndValuePairsLen := len(keyAndValuePairs)
-
- if keyAndValuePairsLen%2 != 0 {
- panic("objx: MSI must have an even number of arguments following the 'key, value' pattern.")
- }
-
- for i := 0; i < keyAndValuePairsLen; i = i + 2 {
-
- key := keyAndValuePairs[i]
- value := keyAndValuePairs[i+1]
-
- // make sure the key is a string
- keyString, keyStringOK := key.(string)
- if !keyStringOK {
- panic("objx: MSI must follow 'string, interface{}' pattern. " + keyString + " is not a valid key.")
- }
-
- newMap[keyString] = value
-
- }
-
- return New(newMap)
-}
-
-// ****** Conversion Constructors
-
-// MustFromJSON creates a new Map containing the data specified in the
-// jsonString.
-//
-// Panics if the JSON is invalid.
-func MustFromJSON(jsonString string) Map {
- o, err := FromJSON(jsonString)
-
- if err != nil {
- panic("objx: MustFromJSON failed with error: " + err.Error())
- }
-
- return o
-}
-
-// FromJSON creates a new Map containing the data specified in the
-// jsonString.
-//
-// Returns an error if the JSON is invalid.
-func FromJSON(jsonString string) (Map, error) {
-
- var data interface{}
- err := json.Unmarshal([]byte(jsonString), &data)
-
- if err != nil {
- return Nil, err
- }
-
- return New(data), nil
-
-}
-
-// FromBase64 creates a new Obj containing the data specified
-// in the Base64 string.
-//
-// The string is an encoded JSON string returned by Base64
-func FromBase64(base64String string) (Map, error) {
-
- decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(base64String))
-
- decoded, err := ioutil.ReadAll(decoder)
- if err != nil {
- return nil, err
- }
-
- return FromJSON(string(decoded))
-}
-
-// MustFromBase64 creates a new Obj containing the data specified
-// in the Base64 string and panics if there is an error.
-//
-// The string is an encoded JSON string returned by Base64
-func MustFromBase64(base64String string) Map {
-
- result, err := FromBase64(base64String)
-
- if err != nil {
- panic("objx: MustFromBase64 failed with error: " + err.Error())
- }
-
- return result
-}
-
-// FromSignedBase64 creates a new Obj containing the data specified
-// in the Base64 string.
-//
-// The string is an encoded JSON string returned by SignedBase64
-func FromSignedBase64(base64String, key string) (Map, error) {
- parts := strings.Split(base64String, SignatureSeparator)
- if len(parts) != 2 {
- return nil, errors.New("objx: Signed base64 string is malformed.")
- }
-
- sig := HashWithKey(parts[0], key)
- if parts[1] != sig {
- return nil, errors.New("objx: Signature for base64 data does not match.")
- }
-
- return FromBase64(parts[0])
-}
-
-// MustFromSignedBase64 creates a new Obj containing the data specified
-// in the Base64 string and panics if there is an error.
-//
-// The string is an encoded JSON string returned by Base64
-func MustFromSignedBase64(base64String, key string) Map {
-
- result, err := FromSignedBase64(base64String, key)
-
- if err != nil {
- panic("objx: MustFromSignedBase64 failed with error: " + err.Error())
- }
-
- return result
-}
-
-// FromURLQuery generates a new Obj by parsing the specified
-// query.
-//
-// For queries with multiple values, the first value is selected.
-func FromURLQuery(query string) (Map, error) {
-
- vals, err := url.ParseQuery(query)
-
- if err != nil {
- return nil, err
- }
-
- m := make(map[string]interface{})
- for k, vals := range vals {
- m[k] = vals[0]
- }
-
- return New(m), nil
-}
-
-// MustFromURLQuery generates a new Obj by parsing the specified
-// query.
-//
-// For queries with multiple values, the first value is selected.
-//
-// Panics if it encounters an error
-func MustFromURLQuery(query string) Map {
-
- o, err := FromURLQuery(query)
-
- if err != nil {
- panic("objx: MustFromURLQuery failed with error: " + err.Error())
- }
-
- return o
-
-}
diff --git a/vendor/github.com/stretchr/objx/map_for_test.go b/vendor/github.com/stretchr/objx/map_for_test.go
deleted file mode 100644
index 6beb50675..000000000
--- a/vendor/github.com/stretchr/objx/map_for_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package objx
-
-var TestMap map[string]interface{} = map[string]interface{}{
- "name": "Tyler",
- "address": map[string]interface{}{
- "city": "Salt Lake City",
- "state": "UT",
- },
- "numbers": []interface{}{"one", "two", "three", "four", "five"},
-}
diff --git a/vendor/github.com/stretchr/objx/map_test.go b/vendor/github.com/stretchr/objx/map_test.go
deleted file mode 100644
index 6b7fffebb..000000000
--- a/vendor/github.com/stretchr/objx/map_test.go
+++ /dev/null
@@ -1,147 +0,0 @@
-package objx
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-type Convertable struct {
- name string
-}
-
-func (c *Convertable) MSI() map[string]interface{} {
- return map[string]interface{}{"name": c.name}
-}
-
-type Unconvertable struct {
- name string
-}
-
-func TestMapCreation(t *testing.T) {
-
- o := New(nil)
- assert.Nil(t, o)
-
- o = New("Tyler")
- assert.Nil(t, o)
-
- unconvertable := &Unconvertable{name: "Tyler"}
- o = New(unconvertable)
- assert.Nil(t, o)
-
- convertable := &Convertable{name: "Tyler"}
- o = New(convertable)
- if assert.NotNil(t, convertable) {
- assert.Equal(t, "Tyler", o["name"], "Tyler")
- }
-
- o = MSI()
- if assert.NotNil(t, o) {
- assert.NotNil(t, o)
- }
-
- o = MSI("name", "Tyler")
- if assert.NotNil(t, o) {
- if assert.NotNil(t, o) {
- assert.Equal(t, o["name"], "Tyler")
- }
- }
-
-}
-
-func TestMapMustFromJSONWithError(t *testing.T) {
-
- _, err := FromJSON(`"name":"Mat"}`)
- assert.Error(t, err)
-
-}
-
-func TestMapFromJSON(t *testing.T) {
-
- o := MustFromJSON(`{"name":"Mat"}`)
-
- if assert.NotNil(t, o) {
- if assert.NotNil(t, o) {
- assert.Equal(t, "Mat", o["name"])
- }
- }
-
-}
-
-func TestMapFromJSONWithError(t *testing.T) {
-
- var m Map
-
- assert.Panics(t, func() {
- m = MustFromJSON(`"name":"Mat"}`)
- })
-
- assert.Nil(t, m)
-
-}
-
-func TestMapFromBase64String(t *testing.T) {
-
- base64String := "eyJuYW1lIjoiTWF0In0="
-
- o, err := FromBase64(base64String)
-
- if assert.NoError(t, err) {
- assert.Equal(t, o.Get("name").Str(), "Mat")
- }
-
- assert.Equal(t, MustFromBase64(base64String).Get("name").Str(), "Mat")
-
-}
-
-func TestMapFromBase64StringWithError(t *testing.T) {
-
- base64String := "eyJuYW1lIjoiTWFasd0In0="
-
- _, err := FromBase64(base64String)
-
- assert.Error(t, err)
-
- assert.Panics(t, func() {
- MustFromBase64(base64String)
- })
-
-}
-
-func TestMapFromSignedBase64String(t *testing.T) {
-
- base64String := "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6"
-
- o, err := FromSignedBase64(base64String, "key")
-
- if assert.NoError(t, err) {
- assert.Equal(t, o.Get("name").Str(), "Mat")
- }
-
- assert.Equal(t, MustFromSignedBase64(base64String, "key").Get("name").Str(), "Mat")
-
-}
-
-func TestMapFromSignedBase64StringWithError(t *testing.T) {
-
- base64String := "eyJuYW1lasdIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6"
-
- _, err := FromSignedBase64(base64String, "key")
-
- assert.Error(t, err)
-
- assert.Panics(t, func() {
- MustFromSignedBase64(base64String, "key")
- })
-
-}
-
-func TestMapFromURLQuery(t *testing.T) {
-
- m, err := FromURLQuery("name=tyler&state=UT")
- if assert.NoError(t, err) && assert.NotNil(t, m) {
- assert.Equal(t, "tyler", m.Get("name").Str())
- assert.Equal(t, "UT", m.Get("state").Str())
- }
-
-}
diff --git a/vendor/github.com/stretchr/objx/mutations.go b/vendor/github.com/stretchr/objx/mutations.go
deleted file mode 100644
index b35c86392..000000000
--- a/vendor/github.com/stretchr/objx/mutations.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package objx
-
-// Exclude returns a new Map with the keys in the specified []string
-// excluded.
-func (d Map) Exclude(exclude []string) Map {
-
- excluded := make(Map)
- for k, v := range d {
- var shouldInclude bool = true
- for _, toExclude := range exclude {
- if k == toExclude {
- shouldInclude = false
- break
- }
- }
- if shouldInclude {
- excluded[k] = v
- }
- }
-
- return excluded
-}
-
-// Copy creates a shallow copy of the Obj.
-func (m Map) Copy() Map {
- copied := make(map[string]interface{})
- for k, v := range m {
- copied[k] = v
- }
- return New(copied)
-}
-
-// Merge blends the specified map with a copy of this map and returns the result.
-//
-// Keys that appear in both will be selected from the specified map.
-// This method requires that the wrapped object be a map[string]interface{}
-func (m Map) Merge(merge Map) Map {
- return m.Copy().MergeHere(merge)
-}
-
-// Merge blends the specified map with this map and returns the current map.
-//
-// Keys that appear in both will be selected from the specified map. The original map
-// will be modified. This method requires that
-// the wrapped object be a map[string]interface{}
-func (m Map) MergeHere(merge Map) Map {
-
- for k, v := range merge {
- m[k] = v
- }
-
- return m
-
-}
-
-// Transform builds a new Obj giving the transformer a chance
-// to change the keys and values as it goes. This method requires that
-// the wrapped object be a map[string]interface{}
-func (m Map) Transform(transformer func(key string, value interface{}) (string, interface{})) Map {
- newMap := make(map[string]interface{})
- for k, v := range m {
- modifiedKey, modifiedVal := transformer(k, v)
- newMap[modifiedKey] = modifiedVal
- }
- return New(newMap)
-}
-
-// TransformKeys builds a new map using the specified key mapping.
-//
-// Unspecified keys will be unaltered.
-// This method requires that the wrapped object be a map[string]interface{}
-func (m Map) TransformKeys(mapping map[string]string) Map {
- return m.Transform(func(key string, value interface{}) (string, interface{}) {
-
- if newKey, ok := mapping[key]; ok {
- return newKey, value
- }
-
- return key, value
- })
-}
diff --git a/vendor/github.com/stretchr/objx/mutations_test.go b/vendor/github.com/stretchr/objx/mutations_test.go
deleted file mode 100644
index 5ee477b8b..000000000
--- a/vendor/github.com/stretchr/objx/mutations_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package objx
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-func TestExclude(t *testing.T) {
-
- d := make(Map)
- d["name"] = "Mat"
- d["age"] = 29
- d["secret"] = "ABC"
-
- excluded := d.Exclude([]string{"secret"})
-
- assert.Equal(t, d["name"], excluded["name"])
- assert.Equal(t, d["age"], excluded["age"])
- assert.False(t, excluded.Has("secret"), "secret should be excluded")
-
-}
-
-func TestCopy(t *testing.T) {
-
- d1 := make(map[string]interface{})
- d1["name"] = "Tyler"
- d1["location"] = "UT"
-
- d1Obj := New(d1)
- d2Obj := d1Obj.Copy()
-
- d2Obj["name"] = "Mat"
-
- assert.Equal(t, d1Obj.Get("name").Str(), "Tyler")
- assert.Equal(t, d2Obj.Get("name").Str(), "Mat")
-
-}
-
-func TestMerge(t *testing.T) {
-
- d := make(map[string]interface{})
- d["name"] = "Mat"
-
- d1 := make(map[string]interface{})
- d1["name"] = "Tyler"
- d1["location"] = "UT"
-
- dObj := New(d)
- d1Obj := New(d1)
-
- merged := dObj.Merge(d1Obj)
-
- assert.Equal(t, merged.Get("name").Str(), d1Obj.Get("name").Str())
- assert.Equal(t, merged.Get("location").Str(), d1Obj.Get("location").Str())
- assert.Empty(t, dObj.Get("location").Str())
-
-}
-
-func TestMergeHere(t *testing.T) {
-
- d := make(map[string]interface{})
- d["name"] = "Mat"
-
- d1 := make(map[string]interface{})
- d1["name"] = "Tyler"
- d1["location"] = "UT"
-
- dObj := New(d)
- d1Obj := New(d1)
-
- merged := dObj.MergeHere(d1Obj)
-
- assert.Equal(t, dObj, merged, "With MergeHere, it should return the first modified map")
- assert.Equal(t, merged.Get("name").Str(), d1Obj.Get("name").Str())
- assert.Equal(t, merged.Get("location").Str(), d1Obj.Get("location").Str())
- assert.Equal(t, merged.Get("location").Str(), dObj.Get("location").Str())
-}
diff --git a/vendor/github.com/stretchr/objx/security.go b/vendor/github.com/stretchr/objx/security.go
deleted file mode 100644
index fdd6be9cf..000000000
--- a/vendor/github.com/stretchr/objx/security.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package objx
-
-import (
- "crypto/sha1"
- "encoding/hex"
-)
-
-// HashWithKey hashes the specified string using the security
-// key.
-func HashWithKey(data, key string) string {
- hash := sha1.New()
- hash.Write([]byte(data + ":" + key))
- return hex.EncodeToString(hash.Sum(nil))
-}
diff --git a/vendor/github.com/stretchr/objx/security_test.go b/vendor/github.com/stretchr/objx/security_test.go
deleted file mode 100644
index 309567209..000000000
--- a/vendor/github.com/stretchr/objx/security_test.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package objx
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-func TestHashWithKey(t *testing.T) {
-
- assert.Equal(t, "0ce84d8d01f2c7b6e0882b784429c54d280ea2d9", HashWithKey("abc", "def"))
-
-}
diff --git a/vendor/github.com/stretchr/objx/simple_example_test.go b/vendor/github.com/stretchr/objx/simple_example_test.go
deleted file mode 100644
index 5cb51f943..000000000
--- a/vendor/github.com/stretchr/objx/simple_example_test.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package objx
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-func TestSimpleExample(t *testing.T) {
-
- // build a map from a JSON object
- o := MustFromJSON(`{"name":"Mat","foods":["indian","chinese"], "location":{"county":"hobbiton","city":"the shire"}}`)
-
- // Map can be used as a straight map[string]interface{}
- assert.Equal(t, o["name"], "Mat")
-
- // Get an Value object
- v := o.Get("name")
- assert.Equal(t, v, &Value{data: "Mat"})
-
- // Test the contained value
- assert.False(t, v.IsInt())
- assert.False(t, v.IsBool())
- assert.True(t, v.IsStr())
-
- // Get the contained value
- assert.Equal(t, v.Str(), "Mat")
-
- // Get a default value if the contained value is not of the expected type or does not exist
- assert.Equal(t, 1, v.Int(1))
-
- // Get a value by using array notation
- assert.Equal(t, "indian", o.Get("foods[0]").Data())
-
- // Set a value by using array notation
- o.Set("foods[0]", "italian")
- assert.Equal(t, "italian", o.Get("foods[0]").Str())
-
- // Get a value by using dot notation
- assert.Equal(t, "hobbiton", o.Get("location.county").Str())
-
-}
diff --git a/vendor/github.com/stretchr/objx/tests.go b/vendor/github.com/stretchr/objx/tests.go
deleted file mode 100644
index d9e0b479a..000000000
--- a/vendor/github.com/stretchr/objx/tests.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package objx
-
-// Has gets whether there is something at the specified selector
-// or not.
-//
-// If m is nil, Has will always return false.
-func (m Map) Has(selector string) bool {
- if m == nil {
- return false
- }
- return !m.Get(selector).IsNil()
-}
-
-// IsNil gets whether the data is nil or not.
-func (v *Value) IsNil() bool {
- return v == nil || v.data == nil
-}
diff --git a/vendor/github.com/stretchr/objx/tests_test.go b/vendor/github.com/stretchr/objx/tests_test.go
deleted file mode 100644
index 3af5baa83..000000000
--- a/vendor/github.com/stretchr/objx/tests_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package objx
-
-import (
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-func TestHas(t *testing.T) {
-
- m := New(TestMap)
-
- assert.True(t, m.Has("name"))
- assert.True(t, m.Has("address.state"))
- assert.True(t, m.Has("numbers[4]"))
-
- assert.False(t, m.Has("address.state.nope"))
- assert.False(t, m.Has("address.nope"))
- assert.False(t, m.Has("nope"))
- assert.False(t, m.Has("numbers[5]"))
-
- m = nil
- assert.False(t, m.Has("nothing"))
-
-}
diff --git a/vendor/github.com/stretchr/objx/type_specific_codegen.go b/vendor/github.com/stretchr/objx/type_specific_codegen.go
deleted file mode 100644
index f3ecb29b9..000000000
--- a/vendor/github.com/stretchr/objx/type_specific_codegen.go
+++ /dev/null
@@ -1,2881 +0,0 @@
-package objx
-
-/*
- Inter (interface{} and []interface{})
- --------------------------------------------------
-*/
-
-// Inter gets the value as a interface{}, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Inter(optionalDefault ...interface{}) interface{} {
- if s, ok := v.data.(interface{}); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustInter gets the value as a interface{}.
-//
-// Panics if the object is not a interface{}.
-func (v *Value) MustInter() interface{} {
- return v.data.(interface{})
-}
-
-// InterSlice gets the value as a []interface{}, returns the optionalDefault
-// value or nil if the value is not a []interface{}.
-func (v *Value) InterSlice(optionalDefault ...[]interface{}) []interface{} {
- if s, ok := v.data.([]interface{}); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustInterSlice gets the value as a []interface{}.
-//
-// Panics if the object is not a []interface{}.
-func (v *Value) MustInterSlice() []interface{} {
- return v.data.([]interface{})
-}
-
-// IsInter gets whether the object contained is a interface{} or not.
-func (v *Value) IsInter() bool {
- _, ok := v.data.(interface{})
- return ok
-}
-
-// IsInterSlice gets whether the object contained is a []interface{} or not.
-func (v *Value) IsInterSlice() bool {
- _, ok := v.data.([]interface{})
- return ok
-}
-
-// EachInter calls the specified callback for each object
-// in the []interface{}.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachInter(callback func(int, interface{}) bool) *Value {
-
- for index, val := range v.MustInterSlice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereInter uses the specified decider function to select items
-// from the []interface{}. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereInter(decider func(int, interface{}) bool) *Value {
-
- var selected []interface{}
-
- v.EachInter(func(index int, val interface{}) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupInter uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]interface{}.
-func (v *Value) GroupInter(grouper func(int, interface{}) string) *Value {
-
- groups := make(map[string][]interface{})
-
- v.EachInter(func(index int, val interface{}) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]interface{}, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceInter uses the specified function to replace each interface{}s
-// by iterating each item. The data in the returned result will be a
-// []interface{} containing the replaced items.
-func (v *Value) ReplaceInter(replacer func(int, interface{}) interface{}) *Value {
-
- arr := v.MustInterSlice()
- replaced := make([]interface{}, len(arr))
-
- v.EachInter(func(index int, val interface{}) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectInter uses the specified collector function to collect a value
-// for each of the interface{}s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectInter(collector func(int, interface{}) interface{}) *Value {
-
- arr := v.MustInterSlice()
- collected := make([]interface{}, len(arr))
-
- v.EachInter(func(index int, val interface{}) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- MSI (map[string]interface{} and []map[string]interface{})
- --------------------------------------------------
-*/
-
-// MSI gets the value as a map[string]interface{}, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) MSI(optionalDefault ...map[string]interface{}) map[string]interface{} {
- if s, ok := v.data.(map[string]interface{}); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustMSI gets the value as a map[string]interface{}.
-//
-// Panics if the object is not a map[string]interface{}.
-func (v *Value) MustMSI() map[string]interface{} {
- return v.data.(map[string]interface{})
-}
-
-// MSISlice gets the value as a []map[string]interface{}, returns the optionalDefault
-// value or nil if the value is not a []map[string]interface{}.
-func (v *Value) MSISlice(optionalDefault ...[]map[string]interface{}) []map[string]interface{} {
- if s, ok := v.data.([]map[string]interface{}); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustMSISlice gets the value as a []map[string]interface{}.
-//
-// Panics if the object is not a []map[string]interface{}.
-func (v *Value) MustMSISlice() []map[string]interface{} {
- return v.data.([]map[string]interface{})
-}
-
-// IsMSI gets whether the object contained is a map[string]interface{} or not.
-func (v *Value) IsMSI() bool {
- _, ok := v.data.(map[string]interface{})
- return ok
-}
-
-// IsMSISlice gets whether the object contained is a []map[string]interface{} or not.
-func (v *Value) IsMSISlice() bool {
- _, ok := v.data.([]map[string]interface{})
- return ok
-}
-
-// EachMSI calls the specified callback for each object
-// in the []map[string]interface{}.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachMSI(callback func(int, map[string]interface{}) bool) *Value {
-
- for index, val := range v.MustMSISlice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereMSI uses the specified decider function to select items
-// from the []map[string]interface{}. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereMSI(decider func(int, map[string]interface{}) bool) *Value {
-
- var selected []map[string]interface{}
-
- v.EachMSI(func(index int, val map[string]interface{}) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupMSI uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]map[string]interface{}.
-func (v *Value) GroupMSI(grouper func(int, map[string]interface{}) string) *Value {
-
- groups := make(map[string][]map[string]interface{})
-
- v.EachMSI(func(index int, val map[string]interface{}) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]map[string]interface{}, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceMSI uses the specified function to replace each map[string]interface{}s
-// by iterating each item. The data in the returned result will be a
-// []map[string]interface{} containing the replaced items.
-func (v *Value) ReplaceMSI(replacer func(int, map[string]interface{}) map[string]interface{}) *Value {
-
- arr := v.MustMSISlice()
- replaced := make([]map[string]interface{}, len(arr))
-
- v.EachMSI(func(index int, val map[string]interface{}) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectMSI uses the specified collector function to collect a value
-// for each of the map[string]interface{}s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectMSI(collector func(int, map[string]interface{}) interface{}) *Value {
-
- arr := v.MustMSISlice()
- collected := make([]interface{}, len(arr))
-
- v.EachMSI(func(index int, val map[string]interface{}) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- ObjxMap ((Map) and [](Map))
- --------------------------------------------------
-*/
-
-// ObjxMap gets the value as a (Map), returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) ObjxMap(optionalDefault ...(Map)) Map {
- if s, ok := v.data.((Map)); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return New(nil)
-}
-
-// MustObjxMap gets the value as a (Map).
-//
-// Panics if the object is not a (Map).
-func (v *Value) MustObjxMap() Map {
- return v.data.((Map))
-}
-
-// ObjxMapSlice gets the value as a [](Map), returns the optionalDefault
-// value or nil if the value is not a [](Map).
-func (v *Value) ObjxMapSlice(optionalDefault ...[](Map)) [](Map) {
- if s, ok := v.data.([](Map)); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustObjxMapSlice gets the value as a [](Map).
-//
-// Panics if the object is not a [](Map).
-func (v *Value) MustObjxMapSlice() [](Map) {
- return v.data.([](Map))
-}
-
-// IsObjxMap gets whether the object contained is a (Map) or not.
-func (v *Value) IsObjxMap() bool {
- _, ok := v.data.((Map))
- return ok
-}
-
-// IsObjxMapSlice gets whether the object contained is a [](Map) or not.
-func (v *Value) IsObjxMapSlice() bool {
- _, ok := v.data.([](Map))
- return ok
-}
-
-// EachObjxMap calls the specified callback for each object
-// in the [](Map).
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachObjxMap(callback func(int, Map) bool) *Value {
-
- for index, val := range v.MustObjxMapSlice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereObjxMap uses the specified decider function to select items
-// from the [](Map). The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereObjxMap(decider func(int, Map) bool) *Value {
-
- var selected [](Map)
-
- v.EachObjxMap(func(index int, val Map) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupObjxMap uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][](Map).
-func (v *Value) GroupObjxMap(grouper func(int, Map) string) *Value {
-
- groups := make(map[string][](Map))
-
- v.EachObjxMap(func(index int, val Map) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([](Map), 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceObjxMap uses the specified function to replace each (Map)s
-// by iterating each item. The data in the returned result will be a
-// [](Map) containing the replaced items.
-func (v *Value) ReplaceObjxMap(replacer func(int, Map) Map) *Value {
-
- arr := v.MustObjxMapSlice()
- replaced := make([](Map), len(arr))
-
- v.EachObjxMap(func(index int, val Map) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectObjxMap uses the specified collector function to collect a value
-// for each of the (Map)s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectObjxMap(collector func(int, Map) interface{}) *Value {
-
- arr := v.MustObjxMapSlice()
- collected := make([]interface{}, len(arr))
-
- v.EachObjxMap(func(index int, val Map) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Bool (bool and []bool)
- --------------------------------------------------
-*/
-
-// Bool gets the value as a bool, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Bool(optionalDefault ...bool) bool {
- if s, ok := v.data.(bool); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return false
-}
-
-// MustBool gets the value as a bool.
-//
-// Panics if the object is not a bool.
-func (v *Value) MustBool() bool {
- return v.data.(bool)
-}
-
-// BoolSlice gets the value as a []bool, returns the optionalDefault
-// value or nil if the value is not a []bool.
-func (v *Value) BoolSlice(optionalDefault ...[]bool) []bool {
- if s, ok := v.data.([]bool); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustBoolSlice gets the value as a []bool.
-//
-// Panics if the object is not a []bool.
-func (v *Value) MustBoolSlice() []bool {
- return v.data.([]bool)
-}
-
-// IsBool gets whether the object contained is a bool or not.
-func (v *Value) IsBool() bool {
- _, ok := v.data.(bool)
- return ok
-}
-
-// IsBoolSlice gets whether the object contained is a []bool or not.
-func (v *Value) IsBoolSlice() bool {
- _, ok := v.data.([]bool)
- return ok
-}
-
-// EachBool calls the specified callback for each object
-// in the []bool.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachBool(callback func(int, bool) bool) *Value {
-
- for index, val := range v.MustBoolSlice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereBool uses the specified decider function to select items
-// from the []bool. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereBool(decider func(int, bool) bool) *Value {
-
- var selected []bool
-
- v.EachBool(func(index int, val bool) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupBool uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]bool.
-func (v *Value) GroupBool(grouper func(int, bool) string) *Value {
-
- groups := make(map[string][]bool)
-
- v.EachBool(func(index int, val bool) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]bool, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceBool uses the specified function to replace each bools
-// by iterating each item. The data in the returned result will be a
-// []bool containing the replaced items.
-func (v *Value) ReplaceBool(replacer func(int, bool) bool) *Value {
-
- arr := v.MustBoolSlice()
- replaced := make([]bool, len(arr))
-
- v.EachBool(func(index int, val bool) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectBool uses the specified collector function to collect a value
-// for each of the bools in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectBool(collector func(int, bool) interface{}) *Value {
-
- arr := v.MustBoolSlice()
- collected := make([]interface{}, len(arr))
-
- v.EachBool(func(index int, val bool) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Str (string and []string)
- --------------------------------------------------
-*/
-
-// Str gets the value as a string, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Str(optionalDefault ...string) string {
- if s, ok := v.data.(string); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return ""
-}
-
-// MustStr gets the value as a string.
-//
-// Panics if the object is not a string.
-func (v *Value) MustStr() string {
- return v.data.(string)
-}
-
-// StrSlice gets the value as a []string, returns the optionalDefault
-// value or nil if the value is not a []string.
-func (v *Value) StrSlice(optionalDefault ...[]string) []string {
- if s, ok := v.data.([]string); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustStrSlice gets the value as a []string.
-//
-// Panics if the object is not a []string.
-func (v *Value) MustStrSlice() []string {
- return v.data.([]string)
-}
-
-// IsStr gets whether the object contained is a string or not.
-func (v *Value) IsStr() bool {
- _, ok := v.data.(string)
- return ok
-}
-
-// IsStrSlice gets whether the object contained is a []string or not.
-func (v *Value) IsStrSlice() bool {
- _, ok := v.data.([]string)
- return ok
-}
-
-// EachStr calls the specified callback for each object
-// in the []string.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachStr(callback func(int, string) bool) *Value {
-
- for index, val := range v.MustStrSlice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereStr uses the specified decider function to select items
-// from the []string. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereStr(decider func(int, string) bool) *Value {
-
- var selected []string
-
- v.EachStr(func(index int, val string) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupStr uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]string.
-func (v *Value) GroupStr(grouper func(int, string) string) *Value {
-
- groups := make(map[string][]string)
-
- v.EachStr(func(index int, val string) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]string, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceStr uses the specified function to replace each strings
-// by iterating each item. The data in the returned result will be a
-// []string containing the replaced items.
-func (v *Value) ReplaceStr(replacer func(int, string) string) *Value {
-
- arr := v.MustStrSlice()
- replaced := make([]string, len(arr))
-
- v.EachStr(func(index int, val string) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectStr uses the specified collector function to collect a value
-// for each of the strings in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectStr(collector func(int, string) interface{}) *Value {
-
- arr := v.MustStrSlice()
- collected := make([]interface{}, len(arr))
-
- v.EachStr(func(index int, val string) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Int (int and []int)
- --------------------------------------------------
-*/
-
-// Int gets the value as a int, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Int(optionalDefault ...int) int {
- if s, ok := v.data.(int); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustInt gets the value as a int.
-//
-// Panics if the object is not a int.
-func (v *Value) MustInt() int {
- return v.data.(int)
-}
-
-// IntSlice gets the value as a []int, returns the optionalDefault
-// value or nil if the value is not a []int.
-func (v *Value) IntSlice(optionalDefault ...[]int) []int {
- if s, ok := v.data.([]int); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustIntSlice gets the value as a []int.
-//
-// Panics if the object is not a []int.
-func (v *Value) MustIntSlice() []int {
- return v.data.([]int)
-}
-
-// IsInt gets whether the object contained is a int or not.
-func (v *Value) IsInt() bool {
- _, ok := v.data.(int)
- return ok
-}
-
-// IsIntSlice gets whether the object contained is a []int or not.
-func (v *Value) IsIntSlice() bool {
- _, ok := v.data.([]int)
- return ok
-}
-
-// EachInt calls the specified callback for each object
-// in the []int.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachInt(callback func(int, int) bool) *Value {
-
- for index, val := range v.MustIntSlice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereInt uses the specified decider function to select items
-// from the []int. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereInt(decider func(int, int) bool) *Value {
-
- var selected []int
-
- v.EachInt(func(index int, val int) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupInt uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]int.
-func (v *Value) GroupInt(grouper func(int, int) string) *Value {
-
- groups := make(map[string][]int)
-
- v.EachInt(func(index int, val int) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]int, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceInt uses the specified function to replace each ints
-// by iterating each item. The data in the returned result will be a
-// []int containing the replaced items.
-func (v *Value) ReplaceInt(replacer func(int, int) int) *Value {
-
- arr := v.MustIntSlice()
- replaced := make([]int, len(arr))
-
- v.EachInt(func(index int, val int) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectInt uses the specified collector function to collect a value
-// for each of the ints in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectInt(collector func(int, int) interface{}) *Value {
-
- arr := v.MustIntSlice()
- collected := make([]interface{}, len(arr))
-
- v.EachInt(func(index int, val int) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Int8 (int8 and []int8)
- --------------------------------------------------
-*/
-
-// Int8 gets the value as a int8, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Int8(optionalDefault ...int8) int8 {
- if s, ok := v.data.(int8); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustInt8 gets the value as a int8.
-//
-// Panics if the object is not a int8.
-func (v *Value) MustInt8() int8 {
- return v.data.(int8)
-}
-
-// Int8Slice gets the value as a []int8, returns the optionalDefault
-// value or nil if the value is not a []int8.
-func (v *Value) Int8Slice(optionalDefault ...[]int8) []int8 {
- if s, ok := v.data.([]int8); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustInt8Slice gets the value as a []int8.
-//
-// Panics if the object is not a []int8.
-func (v *Value) MustInt8Slice() []int8 {
- return v.data.([]int8)
-}
-
-// IsInt8 gets whether the object contained is a int8 or not.
-func (v *Value) IsInt8() bool {
- _, ok := v.data.(int8)
- return ok
-}
-
-// IsInt8Slice gets whether the object contained is a []int8 or not.
-func (v *Value) IsInt8Slice() bool {
- _, ok := v.data.([]int8)
- return ok
-}
-
-// EachInt8 calls the specified callback for each object
-// in the []int8.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachInt8(callback func(int, int8) bool) *Value {
-
- for index, val := range v.MustInt8Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereInt8 uses the specified decider function to select items
-// from the []int8. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereInt8(decider func(int, int8) bool) *Value {
-
- var selected []int8
-
- v.EachInt8(func(index int, val int8) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupInt8 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]int8.
-func (v *Value) GroupInt8(grouper func(int, int8) string) *Value {
-
- groups := make(map[string][]int8)
-
- v.EachInt8(func(index int, val int8) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]int8, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceInt8 uses the specified function to replace each int8s
-// by iterating each item. The data in the returned result will be a
-// []int8 containing the replaced items.
-func (v *Value) ReplaceInt8(replacer func(int, int8) int8) *Value {
-
- arr := v.MustInt8Slice()
- replaced := make([]int8, len(arr))
-
- v.EachInt8(func(index int, val int8) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectInt8 uses the specified collector function to collect a value
-// for each of the int8s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectInt8(collector func(int, int8) interface{}) *Value {
-
- arr := v.MustInt8Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachInt8(func(index int, val int8) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Int16 (int16 and []int16)
- --------------------------------------------------
-*/
-
-// Int16 gets the value as a int16, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Int16(optionalDefault ...int16) int16 {
- if s, ok := v.data.(int16); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustInt16 gets the value as a int16.
-//
-// Panics if the object is not a int16.
-func (v *Value) MustInt16() int16 {
- return v.data.(int16)
-}
-
-// Int16Slice gets the value as a []int16, returns the optionalDefault
-// value or nil if the value is not a []int16.
-func (v *Value) Int16Slice(optionalDefault ...[]int16) []int16 {
- if s, ok := v.data.([]int16); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustInt16Slice gets the value as a []int16.
-//
-// Panics if the object is not a []int16.
-func (v *Value) MustInt16Slice() []int16 {
- return v.data.([]int16)
-}
-
-// IsInt16 gets whether the object contained is a int16 or not.
-func (v *Value) IsInt16() bool {
- _, ok := v.data.(int16)
- return ok
-}
-
-// IsInt16Slice gets whether the object contained is a []int16 or not.
-func (v *Value) IsInt16Slice() bool {
- _, ok := v.data.([]int16)
- return ok
-}
-
-// EachInt16 calls the specified callback for each object
-// in the []int16.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachInt16(callback func(int, int16) bool) *Value {
-
- for index, val := range v.MustInt16Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereInt16 uses the specified decider function to select items
-// from the []int16. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereInt16(decider func(int, int16) bool) *Value {
-
- var selected []int16
-
- v.EachInt16(func(index int, val int16) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupInt16 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]int16.
-func (v *Value) GroupInt16(grouper func(int, int16) string) *Value {
-
- groups := make(map[string][]int16)
-
- v.EachInt16(func(index int, val int16) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]int16, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceInt16 uses the specified function to replace each int16s
-// by iterating each item. The data in the returned result will be a
-// []int16 containing the replaced items.
-func (v *Value) ReplaceInt16(replacer func(int, int16) int16) *Value {
-
- arr := v.MustInt16Slice()
- replaced := make([]int16, len(arr))
-
- v.EachInt16(func(index int, val int16) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectInt16 uses the specified collector function to collect a value
-// for each of the int16s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectInt16(collector func(int, int16) interface{}) *Value {
-
- arr := v.MustInt16Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachInt16(func(index int, val int16) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Int32 (int32 and []int32)
- --------------------------------------------------
-*/
-
-// Int32 gets the value as a int32, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Int32(optionalDefault ...int32) int32 {
- if s, ok := v.data.(int32); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustInt32 gets the value as a int32.
-//
-// Panics if the object is not a int32.
-func (v *Value) MustInt32() int32 {
- return v.data.(int32)
-}
-
-// Int32Slice gets the value as a []int32, returns the optionalDefault
-// value or nil if the value is not a []int32.
-func (v *Value) Int32Slice(optionalDefault ...[]int32) []int32 {
- if s, ok := v.data.([]int32); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustInt32Slice gets the value as a []int32.
-//
-// Panics if the object is not a []int32.
-func (v *Value) MustInt32Slice() []int32 {
- return v.data.([]int32)
-}
-
-// IsInt32 gets whether the object contained is a int32 or not.
-func (v *Value) IsInt32() bool {
- _, ok := v.data.(int32)
- return ok
-}
-
-// IsInt32Slice gets whether the object contained is a []int32 or not.
-func (v *Value) IsInt32Slice() bool {
- _, ok := v.data.([]int32)
- return ok
-}
-
-// EachInt32 calls the specified callback for each object
-// in the []int32.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachInt32(callback func(int, int32) bool) *Value {
-
- for index, val := range v.MustInt32Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereInt32 uses the specified decider function to select items
-// from the []int32. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereInt32(decider func(int, int32) bool) *Value {
-
- var selected []int32
-
- v.EachInt32(func(index int, val int32) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupInt32 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]int32.
-func (v *Value) GroupInt32(grouper func(int, int32) string) *Value {
-
- groups := make(map[string][]int32)
-
- v.EachInt32(func(index int, val int32) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]int32, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceInt32 uses the specified function to replace each int32s
-// by iterating each item. The data in the returned result will be a
-// []int32 containing the replaced items.
-func (v *Value) ReplaceInt32(replacer func(int, int32) int32) *Value {
-
- arr := v.MustInt32Slice()
- replaced := make([]int32, len(arr))
-
- v.EachInt32(func(index int, val int32) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectInt32 uses the specified collector function to collect a value
-// for each of the int32s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectInt32(collector func(int, int32) interface{}) *Value {
-
- arr := v.MustInt32Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachInt32(func(index int, val int32) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Int64 (int64 and []int64)
- --------------------------------------------------
-*/
-
-// Int64 gets the value as a int64, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Int64(optionalDefault ...int64) int64 {
- if s, ok := v.data.(int64); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustInt64 gets the value as a int64.
-//
-// Panics if the object is not a int64.
-func (v *Value) MustInt64() int64 {
- return v.data.(int64)
-}
-
-// Int64Slice gets the value as a []int64, returns the optionalDefault
-// value or nil if the value is not a []int64.
-func (v *Value) Int64Slice(optionalDefault ...[]int64) []int64 {
- if s, ok := v.data.([]int64); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustInt64Slice gets the value as a []int64.
-//
-// Panics if the object is not a []int64.
-func (v *Value) MustInt64Slice() []int64 {
- return v.data.([]int64)
-}
-
-// IsInt64 gets whether the object contained is a int64 or not.
-func (v *Value) IsInt64() bool {
- _, ok := v.data.(int64)
- return ok
-}
-
-// IsInt64Slice gets whether the object contained is a []int64 or not.
-func (v *Value) IsInt64Slice() bool {
- _, ok := v.data.([]int64)
- return ok
-}
-
-// EachInt64 calls the specified callback for each object
-// in the []int64.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachInt64(callback func(int, int64) bool) *Value {
-
- for index, val := range v.MustInt64Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereInt64 uses the specified decider function to select items
-// from the []int64. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereInt64(decider func(int, int64) bool) *Value {
-
- var selected []int64
-
- v.EachInt64(func(index int, val int64) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupInt64 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]int64.
-func (v *Value) GroupInt64(grouper func(int, int64) string) *Value {
-
- groups := make(map[string][]int64)
-
- v.EachInt64(func(index int, val int64) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]int64, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceInt64 uses the specified function to replace each int64s
-// by iterating each item. The data in the returned result will be a
-// []int64 containing the replaced items.
-func (v *Value) ReplaceInt64(replacer func(int, int64) int64) *Value {
-
- arr := v.MustInt64Slice()
- replaced := make([]int64, len(arr))
-
- v.EachInt64(func(index int, val int64) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectInt64 uses the specified collector function to collect a value
-// for each of the int64s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectInt64(collector func(int, int64) interface{}) *Value {
-
- arr := v.MustInt64Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachInt64(func(index int, val int64) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Uint (uint and []uint)
- --------------------------------------------------
-*/
-
-// Uint gets the value as a uint, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Uint(optionalDefault ...uint) uint {
- if s, ok := v.data.(uint); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustUint gets the value as a uint.
-//
-// Panics if the object is not a uint.
-func (v *Value) MustUint() uint {
- return v.data.(uint)
-}
-
-// UintSlice gets the value as a []uint, returns the optionalDefault
-// value or nil if the value is not a []uint.
-func (v *Value) UintSlice(optionalDefault ...[]uint) []uint {
- if s, ok := v.data.([]uint); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustUintSlice gets the value as a []uint.
-//
-// Panics if the object is not a []uint.
-func (v *Value) MustUintSlice() []uint {
- return v.data.([]uint)
-}
-
-// IsUint gets whether the object contained is a uint or not.
-func (v *Value) IsUint() bool {
- _, ok := v.data.(uint)
- return ok
-}
-
-// IsUintSlice gets whether the object contained is a []uint or not.
-func (v *Value) IsUintSlice() bool {
- _, ok := v.data.([]uint)
- return ok
-}
-
-// EachUint calls the specified callback for each object
-// in the []uint.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachUint(callback func(int, uint) bool) *Value {
-
- for index, val := range v.MustUintSlice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereUint uses the specified decider function to select items
-// from the []uint. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereUint(decider func(int, uint) bool) *Value {
-
- var selected []uint
-
- v.EachUint(func(index int, val uint) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupUint uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]uint.
-func (v *Value) GroupUint(grouper func(int, uint) string) *Value {
-
- groups := make(map[string][]uint)
-
- v.EachUint(func(index int, val uint) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]uint, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceUint uses the specified function to replace each uints
-// by iterating each item. The data in the returned result will be a
-// []uint containing the replaced items.
-func (v *Value) ReplaceUint(replacer func(int, uint) uint) *Value {
-
- arr := v.MustUintSlice()
- replaced := make([]uint, len(arr))
-
- v.EachUint(func(index int, val uint) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectUint uses the specified collector function to collect a value
-// for each of the uints in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectUint(collector func(int, uint) interface{}) *Value {
-
- arr := v.MustUintSlice()
- collected := make([]interface{}, len(arr))
-
- v.EachUint(func(index int, val uint) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Uint8 (uint8 and []uint8)
- --------------------------------------------------
-*/
-
-// Uint8 gets the value as a uint8, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Uint8(optionalDefault ...uint8) uint8 {
- if s, ok := v.data.(uint8); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustUint8 gets the value as a uint8.
-//
-// Panics if the object is not a uint8.
-func (v *Value) MustUint8() uint8 {
- return v.data.(uint8)
-}
-
-// Uint8Slice gets the value as a []uint8, returns the optionalDefault
-// value or nil if the value is not a []uint8.
-func (v *Value) Uint8Slice(optionalDefault ...[]uint8) []uint8 {
- if s, ok := v.data.([]uint8); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustUint8Slice gets the value as a []uint8.
-//
-// Panics if the object is not a []uint8.
-func (v *Value) MustUint8Slice() []uint8 {
- return v.data.([]uint8)
-}
-
-// IsUint8 gets whether the object contained is a uint8 or not.
-func (v *Value) IsUint8() bool {
- _, ok := v.data.(uint8)
- return ok
-}
-
-// IsUint8Slice gets whether the object contained is a []uint8 or not.
-func (v *Value) IsUint8Slice() bool {
- _, ok := v.data.([]uint8)
- return ok
-}
-
-// EachUint8 calls the specified callback for each object
-// in the []uint8.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachUint8(callback func(int, uint8) bool) *Value {
-
- for index, val := range v.MustUint8Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereUint8 uses the specified decider function to select items
-// from the []uint8. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereUint8(decider func(int, uint8) bool) *Value {
-
- var selected []uint8
-
- v.EachUint8(func(index int, val uint8) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupUint8 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]uint8.
-func (v *Value) GroupUint8(grouper func(int, uint8) string) *Value {
-
- groups := make(map[string][]uint8)
-
- v.EachUint8(func(index int, val uint8) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]uint8, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceUint8 uses the specified function to replace each uint8s
-// by iterating each item. The data in the returned result will be a
-// []uint8 containing the replaced items.
-func (v *Value) ReplaceUint8(replacer func(int, uint8) uint8) *Value {
-
- arr := v.MustUint8Slice()
- replaced := make([]uint8, len(arr))
-
- v.EachUint8(func(index int, val uint8) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectUint8 uses the specified collector function to collect a value
-// for each of the uint8s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectUint8(collector func(int, uint8) interface{}) *Value {
-
- arr := v.MustUint8Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachUint8(func(index int, val uint8) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Uint16 (uint16 and []uint16)
- --------------------------------------------------
-*/
-
-// Uint16 gets the value as a uint16, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Uint16(optionalDefault ...uint16) uint16 {
- if s, ok := v.data.(uint16); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustUint16 gets the value as a uint16.
-//
-// Panics if the object is not a uint16.
-func (v *Value) MustUint16() uint16 {
- return v.data.(uint16)
-}
-
-// Uint16Slice gets the value as a []uint16, returns the optionalDefault
-// value or nil if the value is not a []uint16.
-func (v *Value) Uint16Slice(optionalDefault ...[]uint16) []uint16 {
- if s, ok := v.data.([]uint16); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustUint16Slice gets the value as a []uint16.
-//
-// Panics if the object is not a []uint16.
-func (v *Value) MustUint16Slice() []uint16 {
- return v.data.([]uint16)
-}
-
-// IsUint16 gets whether the object contained is a uint16 or not.
-func (v *Value) IsUint16() bool {
- _, ok := v.data.(uint16)
- return ok
-}
-
-// IsUint16Slice gets whether the object contained is a []uint16 or not.
-func (v *Value) IsUint16Slice() bool {
- _, ok := v.data.([]uint16)
- return ok
-}
-
-// EachUint16 calls the specified callback for each object
-// in the []uint16.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachUint16(callback func(int, uint16) bool) *Value {
-
- for index, val := range v.MustUint16Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereUint16 uses the specified decider function to select items
-// from the []uint16. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereUint16(decider func(int, uint16) bool) *Value {
-
- var selected []uint16
-
- v.EachUint16(func(index int, val uint16) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupUint16 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]uint16.
-func (v *Value) GroupUint16(grouper func(int, uint16) string) *Value {
-
- groups := make(map[string][]uint16)
-
- v.EachUint16(func(index int, val uint16) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]uint16, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceUint16 uses the specified function to replace each uint16s
-// by iterating each item. The data in the returned result will be a
-// []uint16 containing the replaced items.
-func (v *Value) ReplaceUint16(replacer func(int, uint16) uint16) *Value {
-
- arr := v.MustUint16Slice()
- replaced := make([]uint16, len(arr))
-
- v.EachUint16(func(index int, val uint16) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectUint16 uses the specified collector function to collect a value
-// for each of the uint16s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectUint16(collector func(int, uint16) interface{}) *Value {
-
- arr := v.MustUint16Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachUint16(func(index int, val uint16) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Uint32 (uint32 and []uint32)
- --------------------------------------------------
-*/
-
-// Uint32 gets the value as a uint32, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Uint32(optionalDefault ...uint32) uint32 {
- if s, ok := v.data.(uint32); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustUint32 gets the value as a uint32.
-//
-// Panics if the object is not a uint32.
-func (v *Value) MustUint32() uint32 {
- return v.data.(uint32)
-}
-
-// Uint32Slice gets the value as a []uint32, returns the optionalDefault
-// value or nil if the value is not a []uint32.
-func (v *Value) Uint32Slice(optionalDefault ...[]uint32) []uint32 {
- if s, ok := v.data.([]uint32); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustUint32Slice gets the value as a []uint32.
-//
-// Panics if the object is not a []uint32.
-func (v *Value) MustUint32Slice() []uint32 {
- return v.data.([]uint32)
-}
-
-// IsUint32 gets whether the object contained is a uint32 or not.
-func (v *Value) IsUint32() bool {
- _, ok := v.data.(uint32)
- return ok
-}
-
-// IsUint32Slice gets whether the object contained is a []uint32 or not.
-func (v *Value) IsUint32Slice() bool {
- _, ok := v.data.([]uint32)
- return ok
-}
-
-// EachUint32 calls the specified callback for each object
-// in the []uint32.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachUint32(callback func(int, uint32) bool) *Value {
-
- for index, val := range v.MustUint32Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereUint32 uses the specified decider function to select items
-// from the []uint32. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereUint32(decider func(int, uint32) bool) *Value {
-
- var selected []uint32
-
- v.EachUint32(func(index int, val uint32) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupUint32 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]uint32.
-func (v *Value) GroupUint32(grouper func(int, uint32) string) *Value {
-
- groups := make(map[string][]uint32)
-
- v.EachUint32(func(index int, val uint32) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]uint32, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceUint32 uses the specified function to replace each uint32s
-// by iterating each item. The data in the returned result will be a
-// []uint32 containing the replaced items.
-func (v *Value) ReplaceUint32(replacer func(int, uint32) uint32) *Value {
-
- arr := v.MustUint32Slice()
- replaced := make([]uint32, len(arr))
-
- v.EachUint32(func(index int, val uint32) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectUint32 uses the specified collector function to collect a value
-// for each of the uint32s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectUint32(collector func(int, uint32) interface{}) *Value {
-
- arr := v.MustUint32Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachUint32(func(index int, val uint32) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Uint64 (uint64 and []uint64)
- --------------------------------------------------
-*/
-
-// Uint64 gets the value as a uint64, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Uint64(optionalDefault ...uint64) uint64 {
- if s, ok := v.data.(uint64); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustUint64 gets the value as a uint64.
-//
-// Panics if the object is not a uint64.
-func (v *Value) MustUint64() uint64 {
- return v.data.(uint64)
-}
-
-// Uint64Slice gets the value as a []uint64, returns the optionalDefault
-// value or nil if the value is not a []uint64.
-func (v *Value) Uint64Slice(optionalDefault ...[]uint64) []uint64 {
- if s, ok := v.data.([]uint64); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustUint64Slice gets the value as a []uint64.
-//
-// Panics if the object is not a []uint64.
-func (v *Value) MustUint64Slice() []uint64 {
- return v.data.([]uint64)
-}
-
-// IsUint64 gets whether the object contained is a uint64 or not.
-func (v *Value) IsUint64() bool {
- _, ok := v.data.(uint64)
- return ok
-}
-
-// IsUint64Slice gets whether the object contained is a []uint64 or not.
-func (v *Value) IsUint64Slice() bool {
- _, ok := v.data.([]uint64)
- return ok
-}
-
-// EachUint64 calls the specified callback for each object
-// in the []uint64.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachUint64(callback func(int, uint64) bool) *Value {
-
- for index, val := range v.MustUint64Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereUint64 uses the specified decider function to select items
-// from the []uint64. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereUint64(decider func(int, uint64) bool) *Value {
-
- var selected []uint64
-
- v.EachUint64(func(index int, val uint64) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupUint64 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]uint64.
-func (v *Value) GroupUint64(grouper func(int, uint64) string) *Value {
-
- groups := make(map[string][]uint64)
-
- v.EachUint64(func(index int, val uint64) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]uint64, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceUint64 uses the specified function to replace each uint64s
-// by iterating each item. The data in the returned result will be a
-// []uint64 containing the replaced items.
-func (v *Value) ReplaceUint64(replacer func(int, uint64) uint64) *Value {
-
- arr := v.MustUint64Slice()
- replaced := make([]uint64, len(arr))
-
- v.EachUint64(func(index int, val uint64) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectUint64 uses the specified collector function to collect a value
-// for each of the uint64s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectUint64(collector func(int, uint64) interface{}) *Value {
-
- arr := v.MustUint64Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachUint64(func(index int, val uint64) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Uintptr (uintptr and []uintptr)
- --------------------------------------------------
-*/
-
-// Uintptr gets the value as a uintptr, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Uintptr(optionalDefault ...uintptr) uintptr {
- if s, ok := v.data.(uintptr); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustUintptr gets the value as a uintptr.
-//
-// Panics if the object is not a uintptr.
-func (v *Value) MustUintptr() uintptr {
- return v.data.(uintptr)
-}
-
-// UintptrSlice gets the value as a []uintptr, returns the optionalDefault
-// value or nil if the value is not a []uintptr.
-func (v *Value) UintptrSlice(optionalDefault ...[]uintptr) []uintptr {
- if s, ok := v.data.([]uintptr); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustUintptrSlice gets the value as a []uintptr.
-//
-// Panics if the object is not a []uintptr.
-func (v *Value) MustUintptrSlice() []uintptr {
- return v.data.([]uintptr)
-}
-
-// IsUintptr gets whether the object contained is a uintptr or not.
-func (v *Value) IsUintptr() bool {
- _, ok := v.data.(uintptr)
- return ok
-}
-
-// IsUintptrSlice gets whether the object contained is a []uintptr or not.
-func (v *Value) IsUintptrSlice() bool {
- _, ok := v.data.([]uintptr)
- return ok
-}
-
-// EachUintptr calls the specified callback for each object
-// in the []uintptr.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachUintptr(callback func(int, uintptr) bool) *Value {
-
- for index, val := range v.MustUintptrSlice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereUintptr uses the specified decider function to select items
-// from the []uintptr. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereUintptr(decider func(int, uintptr) bool) *Value {
-
- var selected []uintptr
-
- v.EachUintptr(func(index int, val uintptr) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupUintptr uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]uintptr.
-func (v *Value) GroupUintptr(grouper func(int, uintptr) string) *Value {
-
- groups := make(map[string][]uintptr)
-
- v.EachUintptr(func(index int, val uintptr) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]uintptr, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceUintptr uses the specified function to replace each uintptrs
-// by iterating each item. The data in the returned result will be a
-// []uintptr containing the replaced items.
-func (v *Value) ReplaceUintptr(replacer func(int, uintptr) uintptr) *Value {
-
- arr := v.MustUintptrSlice()
- replaced := make([]uintptr, len(arr))
-
- v.EachUintptr(func(index int, val uintptr) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectUintptr uses the specified collector function to collect a value
-// for each of the uintptrs in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectUintptr(collector func(int, uintptr) interface{}) *Value {
-
- arr := v.MustUintptrSlice()
- collected := make([]interface{}, len(arr))
-
- v.EachUintptr(func(index int, val uintptr) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Float32 (float32 and []float32)
- --------------------------------------------------
-*/
-
-// Float32 gets the value as a float32, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Float32(optionalDefault ...float32) float32 {
- if s, ok := v.data.(float32); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustFloat32 gets the value as a float32.
-//
-// Panics if the object is not a float32.
-func (v *Value) MustFloat32() float32 {
- return v.data.(float32)
-}
-
-// Float32Slice gets the value as a []float32, returns the optionalDefault
-// value or nil if the value is not a []float32.
-func (v *Value) Float32Slice(optionalDefault ...[]float32) []float32 {
- if s, ok := v.data.([]float32); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustFloat32Slice gets the value as a []float32.
-//
-// Panics if the object is not a []float32.
-func (v *Value) MustFloat32Slice() []float32 {
- return v.data.([]float32)
-}
-
-// IsFloat32 gets whether the object contained is a float32 or not.
-func (v *Value) IsFloat32() bool {
- _, ok := v.data.(float32)
- return ok
-}
-
-// IsFloat32Slice gets whether the object contained is a []float32 or not.
-func (v *Value) IsFloat32Slice() bool {
- _, ok := v.data.([]float32)
- return ok
-}
-
-// EachFloat32 calls the specified callback for each object
-// in the []float32.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachFloat32(callback func(int, float32) bool) *Value {
-
- for index, val := range v.MustFloat32Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereFloat32 uses the specified decider function to select items
-// from the []float32. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereFloat32(decider func(int, float32) bool) *Value {
-
- var selected []float32
-
- v.EachFloat32(func(index int, val float32) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupFloat32 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]float32.
-func (v *Value) GroupFloat32(grouper func(int, float32) string) *Value {
-
- groups := make(map[string][]float32)
-
- v.EachFloat32(func(index int, val float32) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]float32, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceFloat32 uses the specified function to replace each float32s
-// by iterating each item. The data in the returned result will be a
-// []float32 containing the replaced items.
-func (v *Value) ReplaceFloat32(replacer func(int, float32) float32) *Value {
-
- arr := v.MustFloat32Slice()
- replaced := make([]float32, len(arr))
-
- v.EachFloat32(func(index int, val float32) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectFloat32 uses the specified collector function to collect a value
-// for each of the float32s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectFloat32(collector func(int, float32) interface{}) *Value {
-
- arr := v.MustFloat32Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachFloat32(func(index int, val float32) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Float64 (float64 and []float64)
- --------------------------------------------------
-*/
-
-// Float64 gets the value as a float64, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Float64(optionalDefault ...float64) float64 {
- if s, ok := v.data.(float64); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustFloat64 gets the value as a float64.
-//
-// Panics if the object is not a float64.
-func (v *Value) MustFloat64() float64 {
- return v.data.(float64)
-}
-
-// Float64Slice gets the value as a []float64, returns the optionalDefault
-// value or nil if the value is not a []float64.
-func (v *Value) Float64Slice(optionalDefault ...[]float64) []float64 {
- if s, ok := v.data.([]float64); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustFloat64Slice gets the value as a []float64.
-//
-// Panics if the object is not a []float64.
-func (v *Value) MustFloat64Slice() []float64 {
- return v.data.([]float64)
-}
-
-// IsFloat64 gets whether the object contained is a float64 or not.
-func (v *Value) IsFloat64() bool {
- _, ok := v.data.(float64)
- return ok
-}
-
-// IsFloat64Slice gets whether the object contained is a []float64 or not.
-func (v *Value) IsFloat64Slice() bool {
- _, ok := v.data.([]float64)
- return ok
-}
-
-// EachFloat64 calls the specified callback for each object
-// in the []float64.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachFloat64(callback func(int, float64) bool) *Value {
-
- for index, val := range v.MustFloat64Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereFloat64 uses the specified decider function to select items
-// from the []float64. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereFloat64(decider func(int, float64) bool) *Value {
-
- var selected []float64
-
- v.EachFloat64(func(index int, val float64) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupFloat64 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]float64.
-func (v *Value) GroupFloat64(grouper func(int, float64) string) *Value {
-
- groups := make(map[string][]float64)
-
- v.EachFloat64(func(index int, val float64) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]float64, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceFloat64 uses the specified function to replace each float64s
-// by iterating each item. The data in the returned result will be a
-// []float64 containing the replaced items.
-func (v *Value) ReplaceFloat64(replacer func(int, float64) float64) *Value {
-
- arr := v.MustFloat64Slice()
- replaced := make([]float64, len(arr))
-
- v.EachFloat64(func(index int, val float64) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectFloat64 uses the specified collector function to collect a value
-// for each of the float64s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectFloat64(collector func(int, float64) interface{}) *Value {
-
- arr := v.MustFloat64Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachFloat64(func(index int, val float64) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Complex64 (complex64 and []complex64)
- --------------------------------------------------
-*/
-
-// Complex64 gets the value as a complex64, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Complex64(optionalDefault ...complex64) complex64 {
- if s, ok := v.data.(complex64); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustComplex64 gets the value as a complex64.
-//
-// Panics if the object is not a complex64.
-func (v *Value) MustComplex64() complex64 {
- return v.data.(complex64)
-}
-
-// Complex64Slice gets the value as a []complex64, returns the optionalDefault
-// value or nil if the value is not a []complex64.
-func (v *Value) Complex64Slice(optionalDefault ...[]complex64) []complex64 {
- if s, ok := v.data.([]complex64); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustComplex64Slice gets the value as a []complex64.
-//
-// Panics if the object is not a []complex64.
-func (v *Value) MustComplex64Slice() []complex64 {
- return v.data.([]complex64)
-}
-
-// IsComplex64 gets whether the object contained is a complex64 or not.
-func (v *Value) IsComplex64() bool {
- _, ok := v.data.(complex64)
- return ok
-}
-
-// IsComplex64Slice gets whether the object contained is a []complex64 or not.
-func (v *Value) IsComplex64Slice() bool {
- _, ok := v.data.([]complex64)
- return ok
-}
-
-// EachComplex64 calls the specified callback for each object
-// in the []complex64.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachComplex64(callback func(int, complex64) bool) *Value {
-
- for index, val := range v.MustComplex64Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereComplex64 uses the specified decider function to select items
-// from the []complex64. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereComplex64(decider func(int, complex64) bool) *Value {
-
- var selected []complex64
-
- v.EachComplex64(func(index int, val complex64) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupComplex64 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]complex64.
-func (v *Value) GroupComplex64(grouper func(int, complex64) string) *Value {
-
- groups := make(map[string][]complex64)
-
- v.EachComplex64(func(index int, val complex64) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]complex64, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceComplex64 uses the specified function to replace each complex64s
-// by iterating each item. The data in the returned result will be a
-// []complex64 containing the replaced items.
-func (v *Value) ReplaceComplex64(replacer func(int, complex64) complex64) *Value {
-
- arr := v.MustComplex64Slice()
- replaced := make([]complex64, len(arr))
-
- v.EachComplex64(func(index int, val complex64) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectComplex64 uses the specified collector function to collect a value
-// for each of the complex64s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectComplex64(collector func(int, complex64) interface{}) *Value {
-
- arr := v.MustComplex64Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachComplex64(func(index int, val complex64) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
-
-/*
- Complex128 (complex128 and []complex128)
- --------------------------------------------------
-*/
-
-// Complex128 gets the value as a complex128, returns the optionalDefault
-// value or a system default object if the value is the wrong type.
-func (v *Value) Complex128(optionalDefault ...complex128) complex128 {
- if s, ok := v.data.(complex128); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return 0
-}
-
-// MustComplex128 gets the value as a complex128.
-//
-// Panics if the object is not a complex128.
-func (v *Value) MustComplex128() complex128 {
- return v.data.(complex128)
-}
-
-// Complex128Slice gets the value as a []complex128, returns the optionalDefault
-// value or nil if the value is not a []complex128.
-func (v *Value) Complex128Slice(optionalDefault ...[]complex128) []complex128 {
- if s, ok := v.data.([]complex128); ok {
- return s
- }
- if len(optionalDefault) == 1 {
- return optionalDefault[0]
- }
- return nil
-}
-
-// MustComplex128Slice gets the value as a []complex128.
-//
-// Panics if the object is not a []complex128.
-func (v *Value) MustComplex128Slice() []complex128 {
- return v.data.([]complex128)
-}
-
-// IsComplex128 gets whether the object contained is a complex128 or not.
-func (v *Value) IsComplex128() bool {
- _, ok := v.data.(complex128)
- return ok
-}
-
-// IsComplex128Slice gets whether the object contained is a []complex128 or not.
-func (v *Value) IsComplex128Slice() bool {
- _, ok := v.data.([]complex128)
- return ok
-}
-
-// EachComplex128 calls the specified callback for each object
-// in the []complex128.
-//
-// Panics if the object is the wrong type.
-func (v *Value) EachComplex128(callback func(int, complex128) bool) *Value {
-
- for index, val := range v.MustComplex128Slice() {
- carryon := callback(index, val)
- if carryon == false {
- break
- }
- }
-
- return v
-
-}
-
-// WhereComplex128 uses the specified decider function to select items
-// from the []complex128. The object contained in the result will contain
-// only the selected items.
-func (v *Value) WhereComplex128(decider func(int, complex128) bool) *Value {
-
- var selected []complex128
-
- v.EachComplex128(func(index int, val complex128) bool {
- shouldSelect := decider(index, val)
- if shouldSelect == false {
- selected = append(selected, val)
- }
- return true
- })
-
- return &Value{data: selected}
-
-}
-
-// GroupComplex128 uses the specified grouper function to group the items
-// keyed by the return of the grouper. The object contained in the
-// result will contain a map[string][]complex128.
-func (v *Value) GroupComplex128(grouper func(int, complex128) string) *Value {
-
- groups := make(map[string][]complex128)
-
- v.EachComplex128(func(index int, val complex128) bool {
- group := grouper(index, val)
- if _, ok := groups[group]; !ok {
- groups[group] = make([]complex128, 0)
- }
- groups[group] = append(groups[group], val)
- return true
- })
-
- return &Value{data: groups}
-
-}
-
-// ReplaceComplex128 uses the specified function to replace each complex128s
-// by iterating each item. The data in the returned result will be a
-// []complex128 containing the replaced items.
-func (v *Value) ReplaceComplex128(replacer func(int, complex128) complex128) *Value {
-
- arr := v.MustComplex128Slice()
- replaced := make([]complex128, len(arr))
-
- v.EachComplex128(func(index int, val complex128) bool {
- replaced[index] = replacer(index, val)
- return true
- })
-
- return &Value{data: replaced}
-
-}
-
-// CollectComplex128 uses the specified collector function to collect a value
-// for each of the complex128s in the slice. The data returned will be a
-// []interface{}.
-func (v *Value) CollectComplex128(collector func(int, complex128) interface{}) *Value {
-
- arr := v.MustComplex128Slice()
- collected := make([]interface{}, len(arr))
-
- v.EachComplex128(func(index int, val complex128) bool {
- collected[index] = collector(index, val)
- return true
- })
-
- return &Value{data: collected}
-}
diff --git a/vendor/github.com/stretchr/objx/type_specific_codegen_test.go b/vendor/github.com/stretchr/objx/type_specific_codegen_test.go
deleted file mode 100644
index fa0a94277..000000000
--- a/vendor/github.com/stretchr/objx/type_specific_codegen_test.go
+++ /dev/null
@@ -1,2867 +0,0 @@
-package objx
-
-import (
- "fmt"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
-)
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestInter(t *testing.T) {
-
- val := interface{}("something")
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Inter())
- assert.Equal(t, val, New(m).Get("value").MustInter())
- assert.Equal(t, interface{}(nil), New(m).Get("nothing").Inter())
- assert.Equal(t, val, New(m).Get("nothing").Inter("something"))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustInter()
- })
-
-}
-
-func TestInterSlice(t *testing.T) {
-
- val := interface{}("something")
- m := map[string]interface{}{"value": []interface{}{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").InterSlice()[0])
- assert.Equal(t, val, New(m).Get("value").MustInterSlice()[0])
- assert.Equal(t, []interface{}(nil), New(m).Get("nothing").InterSlice())
- assert.Equal(t, val, New(m).Get("nothing").InterSlice([]interface{}{interface{}("something")})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustInterSlice()
- })
-
-}
-
-func TestIsInter(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: interface{}("something")}
- assert.True(t, v.IsInter())
-
- v = &Value{data: []interface{}{interface{}("something")}}
- assert.True(t, v.IsInterSlice())
-
-}
-
-func TestEachInter(t *testing.T) {
-
- v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}}
- count := 0
- replacedVals := make([]interface{}, 0)
- assert.Equal(t, v, v.EachInter(func(i int, val interface{}) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustInterSlice()[0])
- assert.Equal(t, replacedVals[1], v.MustInterSlice()[1])
- assert.Equal(t, replacedVals[2], v.MustInterSlice()[2])
-
-}
-
-func TestWhereInter(t *testing.T) {
-
- v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}}
-
- selected := v.WhereInter(func(i int, val interface{}) bool {
- return i%2 == 0
- }).MustInterSlice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupInter(t *testing.T) {
-
- v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}}
-
- grouped := v.GroupInter(func(i int, val interface{}) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]interface{})
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceInter(t *testing.T) {
-
- v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}}
-
- rawArr := v.MustInterSlice()
-
- replaced := v.ReplaceInter(func(index int, val interface{}) interface{} {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustInterSlice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectInter(t *testing.T) {
-
- v := &Value{data: []interface{}{interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something"), interface{}("something")}}
-
- collected := v.CollectInter(func(index int, val interface{}) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestMSI(t *testing.T) {
-
- val := map[string]interface{}(map[string]interface{}{"name": "Tyler"})
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").MSI())
- assert.Equal(t, val, New(m).Get("value").MustMSI())
- assert.Equal(t, map[string]interface{}(nil), New(m).Get("nothing").MSI())
- assert.Equal(t, val, New(m).Get("nothing").MSI(map[string]interface{}{"name": "Tyler"}))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustMSI()
- })
-
-}
-
-func TestMSISlice(t *testing.T) {
-
- val := map[string]interface{}(map[string]interface{}{"name": "Tyler"})
- m := map[string]interface{}{"value": []map[string]interface{}{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").MSISlice()[0])
- assert.Equal(t, val, New(m).Get("value").MustMSISlice()[0])
- assert.Equal(t, []map[string]interface{}(nil), New(m).Get("nothing").MSISlice())
- assert.Equal(t, val, New(m).Get("nothing").MSISlice([]map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"})})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustMSISlice()
- })
-
-}
-
-func TestIsMSI(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: map[string]interface{}(map[string]interface{}{"name": "Tyler"})}
- assert.True(t, v.IsMSI())
-
- v = &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"})}}
- assert.True(t, v.IsMSISlice())
-
-}
-
-func TestEachMSI(t *testing.T) {
-
- v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}}
- count := 0
- replacedVals := make([]map[string]interface{}, 0)
- assert.Equal(t, v, v.EachMSI(func(i int, val map[string]interface{}) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustMSISlice()[0])
- assert.Equal(t, replacedVals[1], v.MustMSISlice()[1])
- assert.Equal(t, replacedVals[2], v.MustMSISlice()[2])
-
-}
-
-func TestWhereMSI(t *testing.T) {
-
- v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}}
-
- selected := v.WhereMSI(func(i int, val map[string]interface{}) bool {
- return i%2 == 0
- }).MustMSISlice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupMSI(t *testing.T) {
-
- v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}}
-
- grouped := v.GroupMSI(func(i int, val map[string]interface{}) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]map[string]interface{})
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceMSI(t *testing.T) {
-
- v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}}
-
- rawArr := v.MustMSISlice()
-
- replaced := v.ReplaceMSI(func(index int, val map[string]interface{}) map[string]interface{} {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustMSISlice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectMSI(t *testing.T) {
-
- v := &Value{data: []map[string]interface{}{map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"}), map[string]interface{}(map[string]interface{}{"name": "Tyler"})}}
-
- collected := v.CollectMSI(func(index int, val map[string]interface{}) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestObjxMap(t *testing.T) {
-
- val := (Map)(New(1))
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").ObjxMap())
- assert.Equal(t, val, New(m).Get("value").MustObjxMap())
- assert.Equal(t, (Map)(New(nil)), New(m).Get("nothing").ObjxMap())
- assert.Equal(t, val, New(m).Get("nothing").ObjxMap(New(1)))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustObjxMap()
- })
-
-}
-
-func TestObjxMapSlice(t *testing.T) {
-
- val := (Map)(New(1))
- m := map[string]interface{}{"value": [](Map){val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").ObjxMapSlice()[0])
- assert.Equal(t, val, New(m).Get("value").MustObjxMapSlice()[0])
- assert.Equal(t, [](Map)(nil), New(m).Get("nothing").ObjxMapSlice())
- assert.Equal(t, val, New(m).Get("nothing").ObjxMapSlice([](Map){(Map)(New(1))})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustObjxMapSlice()
- })
-
-}
-
-func TestIsObjxMap(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: (Map)(New(1))}
- assert.True(t, v.IsObjxMap())
-
- v = &Value{data: [](Map){(Map)(New(1))}}
- assert.True(t, v.IsObjxMapSlice())
-
-}
-
-func TestEachObjxMap(t *testing.T) {
-
- v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}}
- count := 0
- replacedVals := make([](Map), 0)
- assert.Equal(t, v, v.EachObjxMap(func(i int, val Map) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustObjxMapSlice()[0])
- assert.Equal(t, replacedVals[1], v.MustObjxMapSlice()[1])
- assert.Equal(t, replacedVals[2], v.MustObjxMapSlice()[2])
-
-}
-
-func TestWhereObjxMap(t *testing.T) {
-
- v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}}
-
- selected := v.WhereObjxMap(func(i int, val Map) bool {
- return i%2 == 0
- }).MustObjxMapSlice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupObjxMap(t *testing.T) {
-
- v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}}
-
- grouped := v.GroupObjxMap(func(i int, val Map) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][](Map))
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceObjxMap(t *testing.T) {
-
- v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}}
-
- rawArr := v.MustObjxMapSlice()
-
- replaced := v.ReplaceObjxMap(func(index int, val Map) Map {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustObjxMapSlice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectObjxMap(t *testing.T) {
-
- v := &Value{data: [](Map){(Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1)), (Map)(New(1))}}
-
- collected := v.CollectObjxMap(func(index int, val Map) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestBool(t *testing.T) {
-
- val := bool(true)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Bool())
- assert.Equal(t, val, New(m).Get("value").MustBool())
- assert.Equal(t, bool(false), New(m).Get("nothing").Bool())
- assert.Equal(t, val, New(m).Get("nothing").Bool(true))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustBool()
- })
-
-}
-
-func TestBoolSlice(t *testing.T) {
-
- val := bool(true)
- m := map[string]interface{}{"value": []bool{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").BoolSlice()[0])
- assert.Equal(t, val, New(m).Get("value").MustBoolSlice()[0])
- assert.Equal(t, []bool(nil), New(m).Get("nothing").BoolSlice())
- assert.Equal(t, val, New(m).Get("nothing").BoolSlice([]bool{bool(true)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustBoolSlice()
- })
-
-}
-
-func TestIsBool(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: bool(true)}
- assert.True(t, v.IsBool())
-
- v = &Value{data: []bool{bool(true)}}
- assert.True(t, v.IsBoolSlice())
-
-}
-
-func TestEachBool(t *testing.T) {
-
- v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true)}}
- count := 0
- replacedVals := make([]bool, 0)
- assert.Equal(t, v, v.EachBool(func(i int, val bool) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustBoolSlice()[0])
- assert.Equal(t, replacedVals[1], v.MustBoolSlice()[1])
- assert.Equal(t, replacedVals[2], v.MustBoolSlice()[2])
-
-}
-
-func TestWhereBool(t *testing.T) {
-
- v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}}
-
- selected := v.WhereBool(func(i int, val bool) bool {
- return i%2 == 0
- }).MustBoolSlice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupBool(t *testing.T) {
-
- v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}}
-
- grouped := v.GroupBool(func(i int, val bool) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]bool)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceBool(t *testing.T) {
-
- v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}}
-
- rawArr := v.MustBoolSlice()
-
- replaced := v.ReplaceBool(func(index int, val bool) bool {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustBoolSlice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectBool(t *testing.T) {
-
- v := &Value{data: []bool{bool(true), bool(true), bool(true), bool(true), bool(true), bool(true)}}
-
- collected := v.CollectBool(func(index int, val bool) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestStr(t *testing.T) {
-
- val := string("hello")
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Str())
- assert.Equal(t, val, New(m).Get("value").MustStr())
- assert.Equal(t, string(""), New(m).Get("nothing").Str())
- assert.Equal(t, val, New(m).Get("nothing").Str("hello"))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustStr()
- })
-
-}
-
-func TestStrSlice(t *testing.T) {
-
- val := string("hello")
- m := map[string]interface{}{"value": []string{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").StrSlice()[0])
- assert.Equal(t, val, New(m).Get("value").MustStrSlice()[0])
- assert.Equal(t, []string(nil), New(m).Get("nothing").StrSlice())
- assert.Equal(t, val, New(m).Get("nothing").StrSlice([]string{string("hello")})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustStrSlice()
- })
-
-}
-
-func TestIsStr(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: string("hello")}
- assert.True(t, v.IsStr())
-
- v = &Value{data: []string{string("hello")}}
- assert.True(t, v.IsStrSlice())
-
-}
-
-func TestEachStr(t *testing.T) {
-
- v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}}
- count := 0
- replacedVals := make([]string, 0)
- assert.Equal(t, v, v.EachStr(func(i int, val string) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustStrSlice()[0])
- assert.Equal(t, replacedVals[1], v.MustStrSlice()[1])
- assert.Equal(t, replacedVals[2], v.MustStrSlice()[2])
-
-}
-
-func TestWhereStr(t *testing.T) {
-
- v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}}
-
- selected := v.WhereStr(func(i int, val string) bool {
- return i%2 == 0
- }).MustStrSlice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupStr(t *testing.T) {
-
- v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}}
-
- grouped := v.GroupStr(func(i int, val string) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]string)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceStr(t *testing.T) {
-
- v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}}
-
- rawArr := v.MustStrSlice()
-
- replaced := v.ReplaceStr(func(index int, val string) string {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustStrSlice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectStr(t *testing.T) {
-
- v := &Value{data: []string{string("hello"), string("hello"), string("hello"), string("hello"), string("hello"), string("hello")}}
-
- collected := v.CollectStr(func(index int, val string) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestInt(t *testing.T) {
-
- val := int(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int())
- assert.Equal(t, val, New(m).Get("value").MustInt())
- assert.Equal(t, int(0), New(m).Get("nothing").Int())
- assert.Equal(t, val, New(m).Get("nothing").Int(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustInt()
- })
-
-}
-
-func TestIntSlice(t *testing.T) {
-
- val := int(1)
- m := map[string]interface{}{"value": []int{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").IntSlice()[0])
- assert.Equal(t, val, New(m).Get("value").MustIntSlice()[0])
- assert.Equal(t, []int(nil), New(m).Get("nothing").IntSlice())
- assert.Equal(t, val, New(m).Get("nothing").IntSlice([]int{int(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustIntSlice()
- })
-
-}
-
-func TestIsInt(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: int(1)}
- assert.True(t, v.IsInt())
-
- v = &Value{data: []int{int(1)}}
- assert.True(t, v.IsIntSlice())
-
-}
-
-func TestEachInt(t *testing.T) {
-
- v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1)}}
- count := 0
- replacedVals := make([]int, 0)
- assert.Equal(t, v, v.EachInt(func(i int, val int) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustIntSlice()[0])
- assert.Equal(t, replacedVals[1], v.MustIntSlice()[1])
- assert.Equal(t, replacedVals[2], v.MustIntSlice()[2])
-
-}
-
-func TestWhereInt(t *testing.T) {
-
- v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}}
-
- selected := v.WhereInt(func(i int, val int) bool {
- return i%2 == 0
- }).MustIntSlice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupInt(t *testing.T) {
-
- v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}}
-
- grouped := v.GroupInt(func(i int, val int) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]int)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceInt(t *testing.T) {
-
- v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}}
-
- rawArr := v.MustIntSlice()
-
- replaced := v.ReplaceInt(func(index int, val int) int {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustIntSlice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectInt(t *testing.T) {
-
- v := &Value{data: []int{int(1), int(1), int(1), int(1), int(1), int(1)}}
-
- collected := v.CollectInt(func(index int, val int) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestInt8(t *testing.T) {
-
- val := int8(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int8())
- assert.Equal(t, val, New(m).Get("value").MustInt8())
- assert.Equal(t, int8(0), New(m).Get("nothing").Int8())
- assert.Equal(t, val, New(m).Get("nothing").Int8(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustInt8()
- })
-
-}
-
-func TestInt8Slice(t *testing.T) {
-
- val := int8(1)
- m := map[string]interface{}{"value": []int8{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int8Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustInt8Slice()[0])
- assert.Equal(t, []int8(nil), New(m).Get("nothing").Int8Slice())
- assert.Equal(t, val, New(m).Get("nothing").Int8Slice([]int8{int8(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustInt8Slice()
- })
-
-}
-
-func TestIsInt8(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: int8(1)}
- assert.True(t, v.IsInt8())
-
- v = &Value{data: []int8{int8(1)}}
- assert.True(t, v.IsInt8Slice())
-
-}
-
-func TestEachInt8(t *testing.T) {
-
- v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1)}}
- count := 0
- replacedVals := make([]int8, 0)
- assert.Equal(t, v, v.EachInt8(func(i int, val int8) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustInt8Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustInt8Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustInt8Slice()[2])
-
-}
-
-func TestWhereInt8(t *testing.T) {
-
- v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}}
-
- selected := v.WhereInt8(func(i int, val int8) bool {
- return i%2 == 0
- }).MustInt8Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupInt8(t *testing.T) {
-
- v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}}
-
- grouped := v.GroupInt8(func(i int, val int8) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]int8)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceInt8(t *testing.T) {
-
- v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}}
-
- rawArr := v.MustInt8Slice()
-
- replaced := v.ReplaceInt8(func(index int, val int8) int8 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustInt8Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectInt8(t *testing.T) {
-
- v := &Value{data: []int8{int8(1), int8(1), int8(1), int8(1), int8(1), int8(1)}}
-
- collected := v.CollectInt8(func(index int, val int8) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestInt16(t *testing.T) {
-
- val := int16(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int16())
- assert.Equal(t, val, New(m).Get("value").MustInt16())
- assert.Equal(t, int16(0), New(m).Get("nothing").Int16())
- assert.Equal(t, val, New(m).Get("nothing").Int16(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustInt16()
- })
-
-}
-
-func TestInt16Slice(t *testing.T) {
-
- val := int16(1)
- m := map[string]interface{}{"value": []int16{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int16Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustInt16Slice()[0])
- assert.Equal(t, []int16(nil), New(m).Get("nothing").Int16Slice())
- assert.Equal(t, val, New(m).Get("nothing").Int16Slice([]int16{int16(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustInt16Slice()
- })
-
-}
-
-func TestIsInt16(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: int16(1)}
- assert.True(t, v.IsInt16())
-
- v = &Value{data: []int16{int16(1)}}
- assert.True(t, v.IsInt16Slice())
-
-}
-
-func TestEachInt16(t *testing.T) {
-
- v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1)}}
- count := 0
- replacedVals := make([]int16, 0)
- assert.Equal(t, v, v.EachInt16(func(i int, val int16) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustInt16Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustInt16Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustInt16Slice()[2])
-
-}
-
-func TestWhereInt16(t *testing.T) {
-
- v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}}
-
- selected := v.WhereInt16(func(i int, val int16) bool {
- return i%2 == 0
- }).MustInt16Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupInt16(t *testing.T) {
-
- v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}}
-
- grouped := v.GroupInt16(func(i int, val int16) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]int16)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceInt16(t *testing.T) {
-
- v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}}
-
- rawArr := v.MustInt16Slice()
-
- replaced := v.ReplaceInt16(func(index int, val int16) int16 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustInt16Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectInt16(t *testing.T) {
-
- v := &Value{data: []int16{int16(1), int16(1), int16(1), int16(1), int16(1), int16(1)}}
-
- collected := v.CollectInt16(func(index int, val int16) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestInt32(t *testing.T) {
-
- val := int32(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int32())
- assert.Equal(t, val, New(m).Get("value").MustInt32())
- assert.Equal(t, int32(0), New(m).Get("nothing").Int32())
- assert.Equal(t, val, New(m).Get("nothing").Int32(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustInt32()
- })
-
-}
-
-func TestInt32Slice(t *testing.T) {
-
- val := int32(1)
- m := map[string]interface{}{"value": []int32{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int32Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustInt32Slice()[0])
- assert.Equal(t, []int32(nil), New(m).Get("nothing").Int32Slice())
- assert.Equal(t, val, New(m).Get("nothing").Int32Slice([]int32{int32(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustInt32Slice()
- })
-
-}
-
-func TestIsInt32(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: int32(1)}
- assert.True(t, v.IsInt32())
-
- v = &Value{data: []int32{int32(1)}}
- assert.True(t, v.IsInt32Slice())
-
-}
-
-func TestEachInt32(t *testing.T) {
-
- v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1)}}
- count := 0
- replacedVals := make([]int32, 0)
- assert.Equal(t, v, v.EachInt32(func(i int, val int32) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustInt32Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustInt32Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustInt32Slice()[2])
-
-}
-
-func TestWhereInt32(t *testing.T) {
-
- v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}}
-
- selected := v.WhereInt32(func(i int, val int32) bool {
- return i%2 == 0
- }).MustInt32Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupInt32(t *testing.T) {
-
- v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}}
-
- grouped := v.GroupInt32(func(i int, val int32) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]int32)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceInt32(t *testing.T) {
-
- v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}}
-
- rawArr := v.MustInt32Slice()
-
- replaced := v.ReplaceInt32(func(index int, val int32) int32 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustInt32Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectInt32(t *testing.T) {
-
- v := &Value{data: []int32{int32(1), int32(1), int32(1), int32(1), int32(1), int32(1)}}
-
- collected := v.CollectInt32(func(index int, val int32) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestInt64(t *testing.T) {
-
- val := int64(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int64())
- assert.Equal(t, val, New(m).Get("value").MustInt64())
- assert.Equal(t, int64(0), New(m).Get("nothing").Int64())
- assert.Equal(t, val, New(m).Get("nothing").Int64(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustInt64()
- })
-
-}
-
-func TestInt64Slice(t *testing.T) {
-
- val := int64(1)
- m := map[string]interface{}{"value": []int64{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Int64Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustInt64Slice()[0])
- assert.Equal(t, []int64(nil), New(m).Get("nothing").Int64Slice())
- assert.Equal(t, val, New(m).Get("nothing").Int64Slice([]int64{int64(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustInt64Slice()
- })
-
-}
-
-func TestIsInt64(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: int64(1)}
- assert.True(t, v.IsInt64())
-
- v = &Value{data: []int64{int64(1)}}
- assert.True(t, v.IsInt64Slice())
-
-}
-
-func TestEachInt64(t *testing.T) {
-
- v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1)}}
- count := 0
- replacedVals := make([]int64, 0)
- assert.Equal(t, v, v.EachInt64(func(i int, val int64) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustInt64Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustInt64Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustInt64Slice()[2])
-
-}
-
-func TestWhereInt64(t *testing.T) {
-
- v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}}
-
- selected := v.WhereInt64(func(i int, val int64) bool {
- return i%2 == 0
- }).MustInt64Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupInt64(t *testing.T) {
-
- v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}}
-
- grouped := v.GroupInt64(func(i int, val int64) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]int64)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceInt64(t *testing.T) {
-
- v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}}
-
- rawArr := v.MustInt64Slice()
-
- replaced := v.ReplaceInt64(func(index int, val int64) int64 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustInt64Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectInt64(t *testing.T) {
-
- v := &Value{data: []int64{int64(1), int64(1), int64(1), int64(1), int64(1), int64(1)}}
-
- collected := v.CollectInt64(func(index int, val int64) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestUint(t *testing.T) {
-
- val := uint(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint())
- assert.Equal(t, val, New(m).Get("value").MustUint())
- assert.Equal(t, uint(0), New(m).Get("nothing").Uint())
- assert.Equal(t, val, New(m).Get("nothing").Uint(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustUint()
- })
-
-}
-
-func TestUintSlice(t *testing.T) {
-
- val := uint(1)
- m := map[string]interface{}{"value": []uint{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").UintSlice()[0])
- assert.Equal(t, val, New(m).Get("value").MustUintSlice()[0])
- assert.Equal(t, []uint(nil), New(m).Get("nothing").UintSlice())
- assert.Equal(t, val, New(m).Get("nothing").UintSlice([]uint{uint(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustUintSlice()
- })
-
-}
-
-func TestIsUint(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: uint(1)}
- assert.True(t, v.IsUint())
-
- v = &Value{data: []uint{uint(1)}}
- assert.True(t, v.IsUintSlice())
-
-}
-
-func TestEachUint(t *testing.T) {
-
- v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1)}}
- count := 0
- replacedVals := make([]uint, 0)
- assert.Equal(t, v, v.EachUint(func(i int, val uint) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustUintSlice()[0])
- assert.Equal(t, replacedVals[1], v.MustUintSlice()[1])
- assert.Equal(t, replacedVals[2], v.MustUintSlice()[2])
-
-}
-
-func TestWhereUint(t *testing.T) {
-
- v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}}
-
- selected := v.WhereUint(func(i int, val uint) bool {
- return i%2 == 0
- }).MustUintSlice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupUint(t *testing.T) {
-
- v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}}
-
- grouped := v.GroupUint(func(i int, val uint) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]uint)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceUint(t *testing.T) {
-
- v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}}
-
- rawArr := v.MustUintSlice()
-
- replaced := v.ReplaceUint(func(index int, val uint) uint {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustUintSlice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectUint(t *testing.T) {
-
- v := &Value{data: []uint{uint(1), uint(1), uint(1), uint(1), uint(1), uint(1)}}
-
- collected := v.CollectUint(func(index int, val uint) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestUint8(t *testing.T) {
-
- val := uint8(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint8())
- assert.Equal(t, val, New(m).Get("value").MustUint8())
- assert.Equal(t, uint8(0), New(m).Get("nothing").Uint8())
- assert.Equal(t, val, New(m).Get("nothing").Uint8(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustUint8()
- })
-
-}
-
-func TestUint8Slice(t *testing.T) {
-
- val := uint8(1)
- m := map[string]interface{}{"value": []uint8{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint8Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustUint8Slice()[0])
- assert.Equal(t, []uint8(nil), New(m).Get("nothing").Uint8Slice())
- assert.Equal(t, val, New(m).Get("nothing").Uint8Slice([]uint8{uint8(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustUint8Slice()
- })
-
-}
-
-func TestIsUint8(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: uint8(1)}
- assert.True(t, v.IsUint8())
-
- v = &Value{data: []uint8{uint8(1)}}
- assert.True(t, v.IsUint8Slice())
-
-}
-
-func TestEachUint8(t *testing.T) {
-
- v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}}
- count := 0
- replacedVals := make([]uint8, 0)
- assert.Equal(t, v, v.EachUint8(func(i int, val uint8) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustUint8Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustUint8Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustUint8Slice()[2])
-
-}
-
-func TestWhereUint8(t *testing.T) {
-
- v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}}
-
- selected := v.WhereUint8(func(i int, val uint8) bool {
- return i%2 == 0
- }).MustUint8Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupUint8(t *testing.T) {
-
- v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}}
-
- grouped := v.GroupUint8(func(i int, val uint8) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]uint8)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceUint8(t *testing.T) {
-
- v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}}
-
- rawArr := v.MustUint8Slice()
-
- replaced := v.ReplaceUint8(func(index int, val uint8) uint8 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustUint8Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectUint8(t *testing.T) {
-
- v := &Value{data: []uint8{uint8(1), uint8(1), uint8(1), uint8(1), uint8(1), uint8(1)}}
-
- collected := v.CollectUint8(func(index int, val uint8) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestUint16(t *testing.T) {
-
- val := uint16(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint16())
- assert.Equal(t, val, New(m).Get("value").MustUint16())
- assert.Equal(t, uint16(0), New(m).Get("nothing").Uint16())
- assert.Equal(t, val, New(m).Get("nothing").Uint16(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustUint16()
- })
-
-}
-
-func TestUint16Slice(t *testing.T) {
-
- val := uint16(1)
- m := map[string]interface{}{"value": []uint16{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint16Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustUint16Slice()[0])
- assert.Equal(t, []uint16(nil), New(m).Get("nothing").Uint16Slice())
- assert.Equal(t, val, New(m).Get("nothing").Uint16Slice([]uint16{uint16(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustUint16Slice()
- })
-
-}
-
-func TestIsUint16(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: uint16(1)}
- assert.True(t, v.IsUint16())
-
- v = &Value{data: []uint16{uint16(1)}}
- assert.True(t, v.IsUint16Slice())
-
-}
-
-func TestEachUint16(t *testing.T) {
-
- v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}}
- count := 0
- replacedVals := make([]uint16, 0)
- assert.Equal(t, v, v.EachUint16(func(i int, val uint16) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustUint16Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustUint16Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustUint16Slice()[2])
-
-}
-
-func TestWhereUint16(t *testing.T) {
-
- v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}}
-
- selected := v.WhereUint16(func(i int, val uint16) bool {
- return i%2 == 0
- }).MustUint16Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupUint16(t *testing.T) {
-
- v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}}
-
- grouped := v.GroupUint16(func(i int, val uint16) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]uint16)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceUint16(t *testing.T) {
-
- v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}}
-
- rawArr := v.MustUint16Slice()
-
- replaced := v.ReplaceUint16(func(index int, val uint16) uint16 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustUint16Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectUint16(t *testing.T) {
-
- v := &Value{data: []uint16{uint16(1), uint16(1), uint16(1), uint16(1), uint16(1), uint16(1)}}
-
- collected := v.CollectUint16(func(index int, val uint16) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestUint32(t *testing.T) {
-
- val := uint32(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint32())
- assert.Equal(t, val, New(m).Get("value").MustUint32())
- assert.Equal(t, uint32(0), New(m).Get("nothing").Uint32())
- assert.Equal(t, val, New(m).Get("nothing").Uint32(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustUint32()
- })
-
-}
-
-func TestUint32Slice(t *testing.T) {
-
- val := uint32(1)
- m := map[string]interface{}{"value": []uint32{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint32Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustUint32Slice()[0])
- assert.Equal(t, []uint32(nil), New(m).Get("nothing").Uint32Slice())
- assert.Equal(t, val, New(m).Get("nothing").Uint32Slice([]uint32{uint32(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustUint32Slice()
- })
-
-}
-
-func TestIsUint32(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: uint32(1)}
- assert.True(t, v.IsUint32())
-
- v = &Value{data: []uint32{uint32(1)}}
- assert.True(t, v.IsUint32Slice())
-
-}
-
-func TestEachUint32(t *testing.T) {
-
- v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}}
- count := 0
- replacedVals := make([]uint32, 0)
- assert.Equal(t, v, v.EachUint32(func(i int, val uint32) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustUint32Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustUint32Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustUint32Slice()[2])
-
-}
-
-func TestWhereUint32(t *testing.T) {
-
- v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}}
-
- selected := v.WhereUint32(func(i int, val uint32) bool {
- return i%2 == 0
- }).MustUint32Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupUint32(t *testing.T) {
-
- v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}}
-
- grouped := v.GroupUint32(func(i int, val uint32) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]uint32)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceUint32(t *testing.T) {
-
- v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}}
-
- rawArr := v.MustUint32Slice()
-
- replaced := v.ReplaceUint32(func(index int, val uint32) uint32 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustUint32Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectUint32(t *testing.T) {
-
- v := &Value{data: []uint32{uint32(1), uint32(1), uint32(1), uint32(1), uint32(1), uint32(1)}}
-
- collected := v.CollectUint32(func(index int, val uint32) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestUint64(t *testing.T) {
-
- val := uint64(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint64())
- assert.Equal(t, val, New(m).Get("value").MustUint64())
- assert.Equal(t, uint64(0), New(m).Get("nothing").Uint64())
- assert.Equal(t, val, New(m).Get("nothing").Uint64(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustUint64()
- })
-
-}
-
-func TestUint64Slice(t *testing.T) {
-
- val := uint64(1)
- m := map[string]interface{}{"value": []uint64{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uint64Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustUint64Slice()[0])
- assert.Equal(t, []uint64(nil), New(m).Get("nothing").Uint64Slice())
- assert.Equal(t, val, New(m).Get("nothing").Uint64Slice([]uint64{uint64(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustUint64Slice()
- })
-
-}
-
-func TestIsUint64(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: uint64(1)}
- assert.True(t, v.IsUint64())
-
- v = &Value{data: []uint64{uint64(1)}}
- assert.True(t, v.IsUint64Slice())
-
-}
-
-func TestEachUint64(t *testing.T) {
-
- v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}}
- count := 0
- replacedVals := make([]uint64, 0)
- assert.Equal(t, v, v.EachUint64(func(i int, val uint64) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustUint64Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustUint64Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustUint64Slice()[2])
-
-}
-
-func TestWhereUint64(t *testing.T) {
-
- v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}}
-
- selected := v.WhereUint64(func(i int, val uint64) bool {
- return i%2 == 0
- }).MustUint64Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupUint64(t *testing.T) {
-
- v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}}
-
- grouped := v.GroupUint64(func(i int, val uint64) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]uint64)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceUint64(t *testing.T) {
-
- v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}}
-
- rawArr := v.MustUint64Slice()
-
- replaced := v.ReplaceUint64(func(index int, val uint64) uint64 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustUint64Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectUint64(t *testing.T) {
-
- v := &Value{data: []uint64{uint64(1), uint64(1), uint64(1), uint64(1), uint64(1), uint64(1)}}
-
- collected := v.CollectUint64(func(index int, val uint64) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestUintptr(t *testing.T) {
-
- val := uintptr(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Uintptr())
- assert.Equal(t, val, New(m).Get("value").MustUintptr())
- assert.Equal(t, uintptr(0), New(m).Get("nothing").Uintptr())
- assert.Equal(t, val, New(m).Get("nothing").Uintptr(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustUintptr()
- })
-
-}
-
-func TestUintptrSlice(t *testing.T) {
-
- val := uintptr(1)
- m := map[string]interface{}{"value": []uintptr{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").UintptrSlice()[0])
- assert.Equal(t, val, New(m).Get("value").MustUintptrSlice()[0])
- assert.Equal(t, []uintptr(nil), New(m).Get("nothing").UintptrSlice())
- assert.Equal(t, val, New(m).Get("nothing").UintptrSlice([]uintptr{uintptr(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustUintptrSlice()
- })
-
-}
-
-func TestIsUintptr(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: uintptr(1)}
- assert.True(t, v.IsUintptr())
-
- v = &Value{data: []uintptr{uintptr(1)}}
- assert.True(t, v.IsUintptrSlice())
-
-}
-
-func TestEachUintptr(t *testing.T) {
-
- v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}}
- count := 0
- replacedVals := make([]uintptr, 0)
- assert.Equal(t, v, v.EachUintptr(func(i int, val uintptr) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustUintptrSlice()[0])
- assert.Equal(t, replacedVals[1], v.MustUintptrSlice()[1])
- assert.Equal(t, replacedVals[2], v.MustUintptrSlice()[2])
-
-}
-
-func TestWhereUintptr(t *testing.T) {
-
- v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}}
-
- selected := v.WhereUintptr(func(i int, val uintptr) bool {
- return i%2 == 0
- }).MustUintptrSlice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupUintptr(t *testing.T) {
-
- v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}}
-
- grouped := v.GroupUintptr(func(i int, val uintptr) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]uintptr)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceUintptr(t *testing.T) {
-
- v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}}
-
- rawArr := v.MustUintptrSlice()
-
- replaced := v.ReplaceUintptr(func(index int, val uintptr) uintptr {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustUintptrSlice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectUintptr(t *testing.T) {
-
- v := &Value{data: []uintptr{uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1), uintptr(1)}}
-
- collected := v.CollectUintptr(func(index int, val uintptr) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestFloat32(t *testing.T) {
-
- val := float32(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Float32())
- assert.Equal(t, val, New(m).Get("value").MustFloat32())
- assert.Equal(t, float32(0), New(m).Get("nothing").Float32())
- assert.Equal(t, val, New(m).Get("nothing").Float32(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustFloat32()
- })
-
-}
-
-func TestFloat32Slice(t *testing.T) {
-
- val := float32(1)
- m := map[string]interface{}{"value": []float32{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Float32Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustFloat32Slice()[0])
- assert.Equal(t, []float32(nil), New(m).Get("nothing").Float32Slice())
- assert.Equal(t, val, New(m).Get("nothing").Float32Slice([]float32{float32(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustFloat32Slice()
- })
-
-}
-
-func TestIsFloat32(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: float32(1)}
- assert.True(t, v.IsFloat32())
-
- v = &Value{data: []float32{float32(1)}}
- assert.True(t, v.IsFloat32Slice())
-
-}
-
-func TestEachFloat32(t *testing.T) {
-
- v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1)}}
- count := 0
- replacedVals := make([]float32, 0)
- assert.Equal(t, v, v.EachFloat32(func(i int, val float32) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustFloat32Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustFloat32Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustFloat32Slice()[2])
-
-}
-
-func TestWhereFloat32(t *testing.T) {
-
- v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}}
-
- selected := v.WhereFloat32(func(i int, val float32) bool {
- return i%2 == 0
- }).MustFloat32Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupFloat32(t *testing.T) {
-
- v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}}
-
- grouped := v.GroupFloat32(func(i int, val float32) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]float32)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceFloat32(t *testing.T) {
-
- v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}}
-
- rawArr := v.MustFloat32Slice()
-
- replaced := v.ReplaceFloat32(func(index int, val float32) float32 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustFloat32Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectFloat32(t *testing.T) {
-
- v := &Value{data: []float32{float32(1), float32(1), float32(1), float32(1), float32(1), float32(1)}}
-
- collected := v.CollectFloat32(func(index int, val float32) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestFloat64(t *testing.T) {
-
- val := float64(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Float64())
- assert.Equal(t, val, New(m).Get("value").MustFloat64())
- assert.Equal(t, float64(0), New(m).Get("nothing").Float64())
- assert.Equal(t, val, New(m).Get("nothing").Float64(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustFloat64()
- })
-
-}
-
-func TestFloat64Slice(t *testing.T) {
-
- val := float64(1)
- m := map[string]interface{}{"value": []float64{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Float64Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustFloat64Slice()[0])
- assert.Equal(t, []float64(nil), New(m).Get("nothing").Float64Slice())
- assert.Equal(t, val, New(m).Get("nothing").Float64Slice([]float64{float64(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustFloat64Slice()
- })
-
-}
-
-func TestIsFloat64(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: float64(1)}
- assert.True(t, v.IsFloat64())
-
- v = &Value{data: []float64{float64(1)}}
- assert.True(t, v.IsFloat64Slice())
-
-}
-
-func TestEachFloat64(t *testing.T) {
-
- v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1)}}
- count := 0
- replacedVals := make([]float64, 0)
- assert.Equal(t, v, v.EachFloat64(func(i int, val float64) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustFloat64Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustFloat64Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustFloat64Slice()[2])
-
-}
-
-func TestWhereFloat64(t *testing.T) {
-
- v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}}
-
- selected := v.WhereFloat64(func(i int, val float64) bool {
- return i%2 == 0
- }).MustFloat64Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupFloat64(t *testing.T) {
-
- v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}}
-
- grouped := v.GroupFloat64(func(i int, val float64) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]float64)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceFloat64(t *testing.T) {
-
- v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}}
-
- rawArr := v.MustFloat64Slice()
-
- replaced := v.ReplaceFloat64(func(index int, val float64) float64 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustFloat64Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectFloat64(t *testing.T) {
-
- v := &Value{data: []float64{float64(1), float64(1), float64(1), float64(1), float64(1), float64(1)}}
-
- collected := v.CollectFloat64(func(index int, val float64) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestComplex64(t *testing.T) {
-
- val := complex64(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Complex64())
- assert.Equal(t, val, New(m).Get("value").MustComplex64())
- assert.Equal(t, complex64(0), New(m).Get("nothing").Complex64())
- assert.Equal(t, val, New(m).Get("nothing").Complex64(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustComplex64()
- })
-
-}
-
-func TestComplex64Slice(t *testing.T) {
-
- val := complex64(1)
- m := map[string]interface{}{"value": []complex64{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Complex64Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustComplex64Slice()[0])
- assert.Equal(t, []complex64(nil), New(m).Get("nothing").Complex64Slice())
- assert.Equal(t, val, New(m).Get("nothing").Complex64Slice([]complex64{complex64(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustComplex64Slice()
- })
-
-}
-
-func TestIsComplex64(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: complex64(1)}
- assert.True(t, v.IsComplex64())
-
- v = &Value{data: []complex64{complex64(1)}}
- assert.True(t, v.IsComplex64Slice())
-
-}
-
-func TestEachComplex64(t *testing.T) {
-
- v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}}
- count := 0
- replacedVals := make([]complex64, 0)
- assert.Equal(t, v, v.EachComplex64(func(i int, val complex64) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustComplex64Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustComplex64Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustComplex64Slice()[2])
-
-}
-
-func TestWhereComplex64(t *testing.T) {
-
- v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}}
-
- selected := v.WhereComplex64(func(i int, val complex64) bool {
- return i%2 == 0
- }).MustComplex64Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupComplex64(t *testing.T) {
-
- v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}}
-
- grouped := v.GroupComplex64(func(i int, val complex64) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]complex64)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceComplex64(t *testing.T) {
-
- v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}}
-
- rawArr := v.MustComplex64Slice()
-
- replaced := v.ReplaceComplex64(func(index int, val complex64) complex64 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustComplex64Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectComplex64(t *testing.T) {
-
- v := &Value{data: []complex64{complex64(1), complex64(1), complex64(1), complex64(1), complex64(1), complex64(1)}}
-
- collected := v.CollectComplex64(func(index int, val complex64) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
-
-// ************************************************************
-// TESTS
-// ************************************************************
-
-func TestComplex128(t *testing.T) {
-
- val := complex128(1)
- m := map[string]interface{}{"value": val, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Complex128())
- assert.Equal(t, val, New(m).Get("value").MustComplex128())
- assert.Equal(t, complex128(0), New(m).Get("nothing").Complex128())
- assert.Equal(t, val, New(m).Get("nothing").Complex128(1))
-
- assert.Panics(t, func() {
- New(m).Get("age").MustComplex128()
- })
-
-}
-
-func TestComplex128Slice(t *testing.T) {
-
- val := complex128(1)
- m := map[string]interface{}{"value": []complex128{val}, "nothing": nil}
- assert.Equal(t, val, New(m).Get("value").Complex128Slice()[0])
- assert.Equal(t, val, New(m).Get("value").MustComplex128Slice()[0])
- assert.Equal(t, []complex128(nil), New(m).Get("nothing").Complex128Slice())
- assert.Equal(t, val, New(m).Get("nothing").Complex128Slice([]complex128{complex128(1)})[0])
-
- assert.Panics(t, func() {
- New(m).Get("nothing").MustComplex128Slice()
- })
-
-}
-
-func TestIsComplex128(t *testing.T) {
-
- var v *Value
-
- v = &Value{data: complex128(1)}
- assert.True(t, v.IsComplex128())
-
- v = &Value{data: []complex128{complex128(1)}}
- assert.True(t, v.IsComplex128Slice())
-
-}
-
-func TestEachComplex128(t *testing.T) {
-
- v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}}
- count := 0
- replacedVals := make([]complex128, 0)
- assert.Equal(t, v, v.EachComplex128(func(i int, val complex128) bool {
-
- count++
- replacedVals = append(replacedVals, val)
-
- // abort early
- if i == 2 {
- return false
- }
-
- return true
-
- }))
-
- assert.Equal(t, count, 3)
- assert.Equal(t, replacedVals[0], v.MustComplex128Slice()[0])
- assert.Equal(t, replacedVals[1], v.MustComplex128Slice()[1])
- assert.Equal(t, replacedVals[2], v.MustComplex128Slice()[2])
-
-}
-
-func TestWhereComplex128(t *testing.T) {
-
- v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}}
-
- selected := v.WhereComplex128(func(i int, val complex128) bool {
- return i%2 == 0
- }).MustComplex128Slice()
-
- assert.Equal(t, 3, len(selected))
-
-}
-
-func TestGroupComplex128(t *testing.T) {
-
- v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}}
-
- grouped := v.GroupComplex128(func(i int, val complex128) string {
- return fmt.Sprintf("%v", i%2 == 0)
- }).data.(map[string][]complex128)
-
- assert.Equal(t, 2, len(grouped))
- assert.Equal(t, 3, len(grouped["true"]))
- assert.Equal(t, 3, len(grouped["false"]))
-
-}
-
-func TestReplaceComplex128(t *testing.T) {
-
- v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}}
-
- rawArr := v.MustComplex128Slice()
-
- replaced := v.ReplaceComplex128(func(index int, val complex128) complex128 {
- if index < len(rawArr)-1 {
- return rawArr[index+1]
- }
- return rawArr[0]
- })
-
- replacedArr := replaced.MustComplex128Slice()
- if assert.Equal(t, 6, len(replacedArr)) {
- assert.Equal(t, replacedArr[0], rawArr[1])
- assert.Equal(t, replacedArr[1], rawArr[2])
- assert.Equal(t, replacedArr[2], rawArr[3])
- assert.Equal(t, replacedArr[3], rawArr[4])
- assert.Equal(t, replacedArr[4], rawArr[5])
- assert.Equal(t, replacedArr[5], rawArr[0])
- }
-
-}
-
-func TestCollectComplex128(t *testing.T) {
-
- v := &Value{data: []complex128{complex128(1), complex128(1), complex128(1), complex128(1), complex128(1), complex128(1)}}
-
- collected := v.CollectComplex128(func(index int, val complex128) interface{} {
- return index
- })
-
- collectedArr := collected.MustInterSlice()
- if assert.Equal(t, 6, len(collectedArr)) {
- assert.Equal(t, collectedArr[0], 0)
- assert.Equal(t, collectedArr[1], 1)
- assert.Equal(t, collectedArr[2], 2)
- assert.Equal(t, collectedArr[3], 3)
- assert.Equal(t, collectedArr[4], 4)
- assert.Equal(t, collectedArr[5], 5)
- }
-
-}
diff --git a/vendor/github.com/stretchr/objx/value.go b/vendor/github.com/stretchr/objx/value.go
deleted file mode 100644
index 7aaef06b1..000000000
--- a/vendor/github.com/stretchr/objx/value.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package objx
-
-// Value provides methods for extracting interface{} data in various
-// types.
-type Value struct {
- // data contains the raw data being managed by this Value
- data interface{}
-}
-
-// Data returns the raw data contained by this Value
-func (v *Value) Data() interface{} {
- return v.data
-}
diff --git a/vendor/github.com/stretchr/objx/value_test.go b/vendor/github.com/stretchr/objx/value_test.go
deleted file mode 100644
index 0bc65d92c..000000000
--- a/vendor/github.com/stretchr/objx/value_test.go
+++ /dev/null
@@ -1 +0,0 @@
-package objx
diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go
deleted file mode 100644
index e4a920f4b..000000000
--- a/vendor/github.com/stretchr/testify/assert/assertions.go
+++ /dev/null
@@ -1,844 +0,0 @@
-package assert
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "reflect"
- "regexp"
- "runtime"
- "strings"
- "time"
-)
-
-// TestingT is an interface wrapper around *testing.T
-type TestingT interface {
- Errorf(format string, args ...interface{})
-}
-
-// Comparison a custom function that returns true on success and false on failure
-type Comparison func() (success bool)
-
-/*
- Helper functions
-*/
-
-// ObjectsAreEqual determines if two objects are considered equal.
-//
-// This function does no assertion of any kind.
-func ObjectsAreEqual(expected, actual interface{}) bool {
-
- if expected == nil || actual == nil {
- return expected == actual
- }
-
- if reflect.DeepEqual(expected, actual) {
- return true
- }
-
- return false
-
-}
-
-// ObjectsAreEqualValues gets whether two objects are equal, or if their
-// values are equal.
-func ObjectsAreEqualValues(expected, actual interface{}) bool {
- if ObjectsAreEqual(expected, actual) {
- return true
- }
-
- actualType := reflect.TypeOf(actual)
- expectedValue := reflect.ValueOf(expected)
- if expectedValue.Type().ConvertibleTo(actualType) {
- // Attempt comparison after type conversion
- if reflect.DeepEqual(actual, expectedValue.Convert(actualType).Interface()) {
- return true
- }
- }
-
- return false
-}
-
-/* CallerInfo is necessary because the assert functions use the testing object
-internally, causing it to print the file:line of the assert method, rather than where
-the problem actually occured in calling code.*/
-
-// CallerInfo returns a string containing the file and line number of the assert call
-// that failed.
-func CallerInfo() string {
-
- file := ""
- line := 0
- ok := false
-
- for i := 0; ; i++ {
- _, file, line, ok = runtime.Caller(i)
- if !ok {
- return ""
- }
- parts := strings.Split(file, "/")
- dir := parts[len(parts)-2]
- file = parts[len(parts)-1]
- if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" {
- break
- }
- }
-
- return fmt.Sprintf("%s:%d", file, line)
-}
-
-// getWhitespaceString returns a string that is long enough to overwrite the default
-// output from the go testing framework.
-func getWhitespaceString() string {
-
- _, file, line, ok := runtime.Caller(1)
- if !ok {
- return ""
- }
- parts := strings.Split(file, "/")
- file = parts[len(parts)-1]
-
- return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line)))
-
-}
-
-func messageFromMsgAndArgs(msgAndArgs ...interface{}) string {
- if len(msgAndArgs) == 0 || msgAndArgs == nil {
- return ""
- }
- if len(msgAndArgs) == 1 {
- return msgAndArgs[0].(string)
- }
- if len(msgAndArgs) > 1 {
- return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...)
- }
- return ""
-}
-
-// Indents all lines of the message by appending a number of tabs to each line, in an output format compatible with Go's
-// test printing (see inner comment for specifics)
-func indentMessageLines(message string, tabs int) string {
- outBuf := new(bytes.Buffer)
-
- for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ {
- if i != 0 {
- outBuf.WriteRune('\n')
- }
- for ii := 0; ii < tabs; ii++ {
- outBuf.WriteRune('\t')
- // Bizarrely, all lines except the first need one fewer tabs prepended, so deliberately advance the counter
- // by 1 prematurely.
- if ii == 0 && i > 0 {
- ii++
- }
- }
- outBuf.WriteString(scanner.Text())
- }
-
- return outBuf.String()
-}
-
-// Fail reports a failure through
-func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {
-
- message := messageFromMsgAndArgs(msgAndArgs...)
-
- if len(message) > 0 {
- t.Errorf("\r%s\r\tLocation:\t%s\n"+
- "\r\tError:%s\n"+
- "\r\tMessages:\t%s\n\r",
- getWhitespaceString(),
- CallerInfo(),
- indentMessageLines(failureMessage, 2),
- message)
- } else {
- t.Errorf("\r%s\r\tLocation:\t%s\n"+
- "\r\tError:%s\n\r",
- getWhitespaceString(),
- CallerInfo(),
- indentMessageLines(failureMessage, 2))
- }
-
- return false
-}
-
-// Implements asserts that an object is implemented by the specified interface.
-//
-// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject")
-func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
-
- interfaceType := reflect.TypeOf(interfaceObject).Elem()
-
- if !reflect.TypeOf(object).Implements(interfaceType) {
- return Fail(t, fmt.Sprintf("Object must implement %v", interfaceType), msgAndArgs...)
- }
-
- return true
-
-}
-
-// IsType asserts that the specified objects are of the same type.
-func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
-
- if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) {
- return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...)
- }
-
- return true
-}
-
-// Equal asserts that two objects are equal.
-//
-// assert.Equal(t, 123, 123, "123 and 123 should be equal")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
-
- if !ObjectsAreEqual(expected, actual) {
- return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+
- " != %#v (actual)", expected, actual), msgAndArgs...)
- }
-
- return true
-
-}
-
-// EqualValues asserts that two objects are equal or convertable to the same types
-// and equal.
-//
-// assert.EqualValues(t, uint32(123), int32(123), "123 and 123 should be equal")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
-
- if !ObjectsAreEqualValues(expected, actual) {
- return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+
- " != %#v (actual)", expected, actual), msgAndArgs...)
- }
-
- return true
-
-}
-
-// Exactly asserts that two objects are equal is value and type.
-//
-// assert.Exactly(t, int32(123), int64(123), "123 and 123 should NOT be equal")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
-
- aType := reflect.TypeOf(expected)
- bType := reflect.TypeOf(actual)
-
- if aType != bType {
- return Fail(t, "Types expected to match exactly", "%v != %v", aType, bType)
- }
-
- return Equal(t, expected, actual, msgAndArgs...)
-
-}
-
-// NotNil asserts that the specified object is not nil.
-//
-// assert.NotNil(t, err, "err should be something")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-
- success := true
-
- if object == nil {
- success = false
- } else {
- value := reflect.ValueOf(object)
- kind := value.Kind()
- if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() {
- success = false
- }
- }
-
- if !success {
- Fail(t, "Expected not to be nil.", msgAndArgs...)
- }
-
- return success
-}
-
-// isNil checks if a specified object is nil or not, without Failing.
-func isNil(object interface{}) bool {
- if object == nil {
- return true
- }
-
- value := reflect.ValueOf(object)
- kind := value.Kind()
- if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() {
- return true
- }
-
- return false
-}
-
-// Nil asserts that the specified object is nil.
-//
-// assert.Nil(t, err, "err should be nothing")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
- if isNil(object) {
- return true
- }
- return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...)
-}
-
-var zeros = []interface{}{
- int(0),
- int8(0),
- int16(0),
- int32(0),
- int64(0),
- uint(0),
- uint8(0),
- uint16(0),
- uint32(0),
- uint64(0),
- float32(0),
- float64(0),
-}
-
-// isEmpty gets whether the specified object is considered empty or not.
-func isEmpty(object interface{}) bool {
-
- if object == nil {
- return true
- } else if object == "" {
- return true
- } else if object == false {
- return true
- }
-
- for _, v := range zeros {
- if object == v {
- return true
- }
- }
-
- objValue := reflect.ValueOf(object)
-
- switch objValue.Kind() {
- case reflect.Map:
- fallthrough
- case reflect.Slice, reflect.Chan:
- {
- return (objValue.Len() == 0)
- }
- case reflect.Ptr:
- {
- switch object.(type) {
- case *time.Time:
- return object.(*time.Time).IsZero()
- default:
- return false
- }
- }
- }
- return false
-}
-
-// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
-// a slice or a channel with len == 0.
-//
-// assert.Empty(t, obj)
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-
- pass := isEmpty(object)
- if !pass {
- Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...)
- }
-
- return pass
-
-}
-
-// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
-// a slice or a channel with len == 0.
-//
-// if assert.NotEmpty(t, obj) {
-// assert.Equal(t, "two", obj[1])
-// }
-//
-// Returns whether the assertion was successful (true) or not (false).
-func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-
- pass := !isEmpty(object)
- if !pass {
- Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...)
- }
-
- return pass
-
-}
-
-// getLen try to get length of object.
-// return (false, 0) if impossible.
-func getLen(x interface{}) (ok bool, length int) {
- v := reflect.ValueOf(x)
- defer func() {
- if e := recover(); e != nil {
- ok = false
- }
- }()
- return true, v.Len()
-}
-
-// Len asserts that the specified object has specific length.
-// Len also fails if the object has a type that len() not accept.
-//
-// assert.Len(t, mySlice, 3, "The size of slice is not 3")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool {
- ok, l := getLen(object)
- if !ok {
- return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...)
- }
-
- if l != length {
- return Fail(t, fmt.Sprintf("\"%s\" should have %d item(s), but has %d", object, length, l), msgAndArgs...)
- }
- return true
-}
-
-// True asserts that the specified value is true.
-//
-// assert.True(t, myBool, "myBool should be true")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func True(t TestingT, value bool, msgAndArgs ...interface{}) bool {
-
- if value != true {
- return Fail(t, "Should be true", msgAndArgs...)
- }
-
- return true
-
-}
-
-// False asserts that the specified value is true.
-//
-// assert.False(t, myBool, "myBool should be false")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func False(t TestingT, value bool, msgAndArgs ...interface{}) bool {
-
- if value != false {
- return Fail(t, "Should be false", msgAndArgs...)
- }
-
- return true
-
-}
-
-// NotEqual asserts that the specified values are NOT equal.
-//
-// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
-
- if ObjectsAreEqual(expected, actual) {
- return Fail(t, "Should not be equal", msgAndArgs...)
- }
-
- return true
-
-}
-
-// containsElement try loop over the list check if the list includes the element.
-// return (false, false) if impossible.
-// return (true, false) if element was not found.
-// return (true, true) if element was found.
-func includeElement(list interface{}, element interface{}) (ok, found bool) {
-
- listValue := reflect.ValueOf(list)
- elementValue := reflect.ValueOf(element)
- defer func() {
- if e := recover(); e != nil {
- ok = false
- found = false
- }
- }()
-
- if reflect.TypeOf(list).Kind() == reflect.String {
- return true, strings.Contains(listValue.String(), elementValue.String())
- }
-
- for i := 0; i < listValue.Len(); i++ {
- if ObjectsAreEqual(listValue.Index(i).Interface(), element) {
- return true, true
- }
- }
- return true, false
-
-}
-
-// Contains asserts that the specified string or list(array, slice...) contains the
-// specified substring or element.
-//
-// assert.Contains(t, "Hello World", "World", "But 'Hello World' does contain 'World'")
-// assert.Contains(t, ["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
-
- ok, found := includeElement(s, contains)
- if !ok {
- return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...)
- }
- if !found {
- return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...)
- }
-
- return true
-
-}
-
-// NotContains asserts that the specified string or list(array, slice...) does NOT contain the
-// specified substring or element.
-//
-// assert.NotContains(t, "Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'")
-// assert.NotContains(t, ["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {
-
- ok, found := includeElement(s, contains)
- if !ok {
- return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...)
- }
- if found {
- return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...)
- }
-
- return true
-
-}
-
-// Condition uses a Comparison to assert a complex condition.
-func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
- result := comp()
- if !result {
- Fail(t, "Condition failed!", msgAndArgs...)
- }
- return result
-}
-
-// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics
-// methods, and represents a simple func that takes no arguments, and returns nothing.
-type PanicTestFunc func()
-
-// didPanic returns true if the function passed to it panics. Otherwise, it returns false.
-func didPanic(f PanicTestFunc) (bool, interface{}) {
-
- didPanic := false
- var message interface{}
- func() {
-
- defer func() {
- if message = recover(); message != nil {
- didPanic = true
- }
- }()
-
- // call the target function
- f()
-
- }()
-
- return didPanic, message
-
-}
-
-// Panics asserts that the code inside the specified PanicTestFunc panics.
-//
-// assert.Panics(t, func(){
-// GoCrazy()
-// }, "Calling GoCrazy() should panic")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
-
- if funcDidPanic, panicValue := didPanic(f); !funcDidPanic {
- return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...)
- }
-
- return true
-}
-
-// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
-//
-// assert.NotPanics(t, func(){
-// RemainCalm()
-// }, "Calling RemainCalm() should NOT panic")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {
-
- if funcDidPanic, panicValue := didPanic(f); funcDidPanic {
- return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...)
- }
-
- return true
-}
-
-// WithinDuration asserts that the two times are within duration delta of each other.
-//
-// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
-
- dt := expected.Sub(actual)
- if dt < -delta || dt > delta {
- return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...)
- }
-
- return true
-}
-
-func toFloat(x interface{}) (float64, bool) {
- var xf float64
- xok := true
-
- switch xn := x.(type) {
- case uint8:
- xf = float64(xn)
- case uint16:
- xf = float64(xn)
- case uint32:
- xf = float64(xn)
- case uint64:
- xf = float64(xn)
- case int:
- xf = float64(xn)
- case int8:
- xf = float64(xn)
- case int16:
- xf = float64(xn)
- case int32:
- xf = float64(xn)
- case int64:
- xf = float64(xn)
- case float32:
- xf = float64(xn)
- case float64:
- xf = float64(xn)
- default:
- xok = false
- }
-
- return xf, xok
-}
-
-// InDelta asserts that the two numerals are within delta of each other.
-//
-// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01)
-//
-// Returns whether the assertion was successful (true) or not (false).
-func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
-
- af, aok := toFloat(expected)
- bf, bok := toFloat(actual)
-
- if !aok || !bok {
- return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...)
- }
-
- dt := af - bf
- if dt < -delta || dt > delta {
- return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...)
- }
-
- return true
-}
-
-// InDeltaSlice is the same as InDelta, except it compares two slices.
-func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
- if expected == nil || actual == nil ||
- reflect.TypeOf(actual).Kind() != reflect.Slice ||
- reflect.TypeOf(expected).Kind() != reflect.Slice {
- return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...)
- }
-
- actualSlice := reflect.ValueOf(actual)
- expectedSlice := reflect.ValueOf(expected)
-
- for i := 0; i < actualSlice.Len(); i++ {
- result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta)
- if !result {
- return result
- }
- }
-
- return true
-}
-
-// min(|expected|, |actual|) * epsilon
-func calcEpsilonDelta(expected, actual interface{}, epsilon float64) float64 {
- af, aok := toFloat(expected)
- bf, bok := toFloat(actual)
-
- if !aok || !bok {
- // invalid input
- return 0
- }
-
- if af < 0 {
- af = -af
- }
- if bf < 0 {
- bf = -bf
- }
- var delta float64
- if af < bf {
- delta = af * epsilon
- } else {
- delta = bf * epsilon
- }
- return delta
-}
-
-// InEpsilon asserts that expected and actual have a relative error less than epsilon
-//
-// Returns whether the assertion was successful (true) or not (false).
-func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
- delta := calcEpsilonDelta(expected, actual, epsilon)
-
- return InDelta(t, expected, actual, delta, msgAndArgs...)
-}
-
-// InEpsilonSlice is the same as InEpsilon, except it compares two slices.
-func InEpsilonSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
- if expected == nil || actual == nil ||
- reflect.TypeOf(actual).Kind() != reflect.Slice ||
- reflect.TypeOf(expected).Kind() != reflect.Slice {
- return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...)
- }
-
- actualSlice := reflect.ValueOf(actual)
- expectedSlice := reflect.ValueOf(expected)
-
- for i := 0; i < actualSlice.Len(); i++ {
- result := InEpsilon(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta)
- if !result {
- return result
- }
- }
-
- return true
-}
-
-/*
- Errors
-*/
-
-// NoError asserts that a function returned no error (i.e. `nil`).
-//
-// actualObj, err := SomeFunction()
-// if assert.NoError(t, err) {
-// assert.Equal(t, actualObj, expectedObj)
-// }
-//
-// Returns whether the assertion was successful (true) or not (false).
-func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
- if isNil(err) {
- return true
- }
-
- return Fail(t, fmt.Sprintf("No error is expected but got %v", err), msgAndArgs...)
-}
-
-// Error asserts that a function returned an error (i.e. not `nil`).
-//
-// actualObj, err := SomeFunction()
-// if assert.Error(t, err, "An error was expected") {
-// assert.Equal(t, err, expectedError)
-// }
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
-
- message := messageFromMsgAndArgs(msgAndArgs...)
- return NotNil(t, err, "An error is expected but got nil. %s", message)
-
-}
-
-// EqualError asserts that a function returned an error (i.e. not `nil`)
-// and that it is equal to the provided error.
-//
-// actualObj, err := SomeFunction()
-// if assert.Error(t, err, "An error was expected") {
-// assert.Equal(t, err, expectedError)
-// }
-//
-// Returns whether the assertion was successful (true) or not (false).
-func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {
-
- message := messageFromMsgAndArgs(msgAndArgs...)
- if !NotNil(t, theError, "An error is expected but got nil. %s", message) {
- return false
- }
- s := "An error with value \"%s\" is expected but got \"%s\". %s"
- return Equal(t, theError.Error(), errString,
- s, errString, theError.Error(), message)
-}
-
-// matchRegexp return true if a specified regexp matches a string.
-func matchRegexp(rx interface{}, str interface{}) bool {
-
- var r *regexp.Regexp
- if rr, ok := rx.(*regexp.Regexp); ok {
- r = rr
- } else {
- r = regexp.MustCompile(fmt.Sprint(rx))
- }
-
- return (r.FindStringIndex(fmt.Sprint(str)) != nil)
-
-}
-
-// Regexp asserts that a specified regexp matches a string.
-//
-// assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
-// assert.Regexp(t, "start...$", "it's not starting")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
-
- match := matchRegexp(rx, str)
-
- if !match {
- Fail(t, fmt.Sprintf("Expect \"%v\" to match \"%v\"", str, rx), msgAndArgs...)
- }
-
- return match
-}
-
-// NotRegexp asserts that a specified regexp does not match a string.
-//
-// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
-// assert.NotRegexp(t, "^start", "it's not starting")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
- match := matchRegexp(rx, str)
-
- if match {
- Fail(t, fmt.Sprintf("Expect \"%v\" to NOT match \"%v\"", str, rx), msgAndArgs...)
- }
-
- return !match
-
-}
diff --git a/vendor/github.com/stretchr/testify/assert/assertions_test.go b/vendor/github.com/stretchr/testify/assert/assertions_test.go
deleted file mode 100644
index d4d06ec7f..000000000
--- a/vendor/github.com/stretchr/testify/assert/assertions_test.go
+++ /dev/null
@@ -1,788 +0,0 @@
-package assert
-
-import (
- "errors"
- "regexp"
- "testing"
- "time"
-)
-
-// AssertionTesterInterface defines an interface to be used for testing assertion methods
-type AssertionTesterInterface interface {
- TestMethod()
-}
-
-// AssertionTesterConformingObject is an object that conforms to the AssertionTesterInterface interface
-type AssertionTesterConformingObject struct {
-}
-
-func (a *AssertionTesterConformingObject) TestMethod() {
-}
-
-// AssertionTesterNonConformingObject is an object that does not conform to the AssertionTesterInterface interface
-type AssertionTesterNonConformingObject struct {
-}
-
-func TestObjectsAreEqual(t *testing.T) {
-
- if !ObjectsAreEqual("Hello World", "Hello World") {
- t.Error("objectsAreEqual should return true")
- }
- if !ObjectsAreEqual(123, 123) {
- t.Error("objectsAreEqual should return true")
- }
- if !ObjectsAreEqual(123.5, 123.5) {
- t.Error("objectsAreEqual should return true")
- }
- if !ObjectsAreEqual([]byte("Hello World"), []byte("Hello World")) {
- t.Error("objectsAreEqual should return true")
- }
- if !ObjectsAreEqual(nil, nil) {
- t.Error("objectsAreEqual should return true")
- }
- if ObjectsAreEqual(map[int]int{5: 10}, map[int]int{10: 20}) {
- t.Error("objectsAreEqual should return false")
- }
- if ObjectsAreEqual('x', "x") {
- t.Error("objectsAreEqual should return false")
- }
- if ObjectsAreEqual("x", 'x') {
- t.Error("objectsAreEqual should return false")
- }
- if ObjectsAreEqual(0, 0.1) {
- t.Error("objectsAreEqual should return false")
- }
- if ObjectsAreEqual(0.1, 0) {
- t.Error("objectsAreEqual should return false")
- }
- if ObjectsAreEqual(uint32(10), int32(10)) {
- t.Error("objectsAreEqual should return false")
- }
- if !ObjectsAreEqualValues(uint32(10), int32(10)) {
- t.Error("ObjectsAreEqualValues should return true")
- }
-
-}
-
-func TestImplements(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) {
- t.Error("Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface")
- }
- if Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) {
- t.Error("Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface")
- }
-
-}
-
-func TestIsType(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) {
- t.Error("IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject")
- }
- if IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) {
- t.Error("IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject")
- }
-
-}
-
-func TestEqual(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !Equal(mockT, "Hello World", "Hello World") {
- t.Error("Equal should return true")
- }
- if !Equal(mockT, 123, 123) {
- t.Error("Equal should return true")
- }
- if !Equal(mockT, 123.5, 123.5) {
- t.Error("Equal should return true")
- }
- if !Equal(mockT, []byte("Hello World"), []byte("Hello World")) {
- t.Error("Equal should return true")
- }
- if !Equal(mockT, nil, nil) {
- t.Error("Equal should return true")
- }
- if !Equal(mockT, int32(123), int32(123)) {
- t.Error("Equal should return true")
- }
- if !Equal(mockT, uint64(123), uint64(123)) {
- t.Error("Equal should return true")
- }
-
-}
-
-func TestNotNil(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !NotNil(mockT, new(AssertionTesterConformingObject)) {
- t.Error("NotNil should return true: object is not nil")
- }
- if NotNil(mockT, nil) {
- t.Error("NotNil should return false: object is nil")
- }
-
-}
-
-func TestNil(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !Nil(mockT, nil) {
- t.Error("Nil should return true: object is nil")
- }
- if Nil(mockT, new(AssertionTesterConformingObject)) {
- t.Error("Nil should return false: object is not nil")
- }
-
-}
-
-func TestTrue(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !True(mockT, true) {
- t.Error("True should return true")
- }
- if True(mockT, false) {
- t.Error("True should return false")
- }
-
-}
-
-func TestFalse(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !False(mockT, false) {
- t.Error("False should return true")
- }
- if False(mockT, true) {
- t.Error("False should return false")
- }
-
-}
-
-func TestExactly(t *testing.T) {
-
- mockT := new(testing.T)
-
- a := float32(1)
- b := float64(1)
- c := float32(1)
- d := float32(2)
-
- if Exactly(mockT, a, b) {
- t.Error("Exactly should return false")
- }
- if Exactly(mockT, a, d) {
- t.Error("Exactly should return false")
- }
- if !Exactly(mockT, a, c) {
- t.Error("Exactly should return true")
- }
-
- if Exactly(mockT, nil, a) {
- t.Error("Exactly should return false")
- }
- if Exactly(mockT, a, nil) {
- t.Error("Exactly should return false")
- }
-
-}
-
-func TestNotEqual(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !NotEqual(mockT, "Hello World", "Hello World!") {
- t.Error("NotEqual should return true")
- }
- if !NotEqual(mockT, 123, 1234) {
- t.Error("NotEqual should return true")
- }
- if !NotEqual(mockT, 123.5, 123.55) {
- t.Error("NotEqual should return true")
- }
- if !NotEqual(mockT, []byte("Hello World"), []byte("Hello World!")) {
- t.Error("NotEqual should return true")
- }
- if !NotEqual(mockT, nil, new(AssertionTesterConformingObject)) {
- t.Error("NotEqual should return true")
- }
- funcA := func() int { return 23 }
- funcB := func() int { return 42 }
- if !NotEqual(mockT, funcA, funcB) {
- t.Error("NotEqual should return true")
- }
-
- if NotEqual(mockT, "Hello World", "Hello World") {
- t.Error("NotEqual should return false")
- }
- if NotEqual(mockT, 123, 123) {
- t.Error("NotEqual should return false")
- }
- if NotEqual(mockT, 123.5, 123.5) {
- t.Error("NotEqual should return false")
- }
- if NotEqual(mockT, []byte("Hello World"), []byte("Hello World")) {
- t.Error("NotEqual should return false")
- }
- if NotEqual(mockT, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) {
- t.Error("NotEqual should return false")
- }
-}
-
-type A struct {
- Name, Value string
-}
-
-func TestContains(t *testing.T) {
-
- mockT := new(testing.T)
- list := []string{"Foo", "Bar"}
- complexList := []*A{
- {"b", "c"},
- {"d", "e"},
- {"g", "h"},
- {"j", "k"},
- }
-
- if !Contains(mockT, "Hello World", "Hello") {
- t.Error("Contains should return true: \"Hello World\" contains \"Hello\"")
- }
- if Contains(mockT, "Hello World", "Salut") {
- t.Error("Contains should return false: \"Hello World\" does not contain \"Salut\"")
- }
-
- if !Contains(mockT, list, "Bar") {
- t.Error("Contains should return true: \"[\"Foo\", \"Bar\"]\" contains \"Bar\"")
- }
- if Contains(mockT, list, "Salut") {
- t.Error("Contains should return false: \"[\"Foo\", \"Bar\"]\" does not contain \"Salut\"")
- }
- if !Contains(mockT, complexList, &A{"g", "h"}) {
- t.Error("Contains should return true: complexList contains {\"g\", \"h\"}")
- }
- if Contains(mockT, complexList, &A{"g", "e"}) {
- t.Error("Contains should return false: complexList contains {\"g\", \"e\"}")
- }
-}
-
-func TestNotContains(t *testing.T) {
-
- mockT := new(testing.T)
- list := []string{"Foo", "Bar"}
-
- if !NotContains(mockT, "Hello World", "Hello!") {
- t.Error("NotContains should return true: \"Hello World\" does not contain \"Hello!\"")
- }
- if NotContains(mockT, "Hello World", "Hello") {
- t.Error("NotContains should return false: \"Hello World\" contains \"Hello\"")
- }
-
- if !NotContains(mockT, list, "Foo!") {
- t.Error("NotContains should return true: \"[\"Foo\", \"Bar\"]\" does not contain \"Foo!\"")
- }
- if NotContains(mockT, list, "Foo") {
- t.Error("NotContains should return false: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"")
- }
-
-}
-
-func Test_includeElement(t *testing.T) {
-
- list1 := []string{"Foo", "Bar"}
- list2 := []int{1, 2}
-
- ok, found := includeElement("Hello World", "World")
- True(t, ok)
- True(t, found)
-
- ok, found = includeElement(list1, "Foo")
- True(t, ok)
- True(t, found)
-
- ok, found = includeElement(list1, "Bar")
- True(t, ok)
- True(t, found)
-
- ok, found = includeElement(list2, 1)
- True(t, ok)
- True(t, found)
-
- ok, found = includeElement(list2, 2)
- True(t, ok)
- True(t, found)
-
- ok, found = includeElement(list1, "Foo!")
- True(t, ok)
- False(t, found)
-
- ok, found = includeElement(list2, 3)
- True(t, ok)
- False(t, found)
-
- ok, found = includeElement(list2, "1")
- True(t, ok)
- False(t, found)
-
- ok, found = includeElement(1433, "1")
- False(t, ok)
- False(t, found)
-
-}
-
-func TestCondition(t *testing.T) {
- mockT := new(testing.T)
-
- if !Condition(mockT, func() bool { return true }, "Truth") {
- t.Error("Condition should return true")
- }
-
- if Condition(mockT, func() bool { return false }, "Lie") {
- t.Error("Condition should return false")
- }
-
-}
-
-func TestDidPanic(t *testing.T) {
-
- if funcDidPanic, _ := didPanic(func() {
- panic("Panic!")
- }); !funcDidPanic {
- t.Error("didPanic should return true")
- }
-
- if funcDidPanic, _ := didPanic(func() {
- }); funcDidPanic {
- t.Error("didPanic should return false")
- }
-
-}
-
-func TestPanics(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !Panics(mockT, func() {
- panic("Panic!")
- }) {
- t.Error("Panics should return true")
- }
-
- if Panics(mockT, func() {
- }) {
- t.Error("Panics should return false")
- }
-
-}
-
-func TestNotPanics(t *testing.T) {
-
- mockT := new(testing.T)
-
- if !NotPanics(mockT, func() {
- }) {
- t.Error("NotPanics should return true")
- }
-
- if NotPanics(mockT, func() {
- panic("Panic!")
- }) {
- t.Error("NotPanics should return false")
- }
-
-}
-
-func TestNoError(t *testing.T) {
-
- mockT := new(testing.T)
-
- // start with a nil error
- var err error
-
- True(t, NoError(mockT, err), "NoError should return True for nil arg")
-
- // now set an error
- err = errors.New("some error")
-
- False(t, NoError(mockT, err), "NoError with error should return False")
-
-}
-
-func TestError(t *testing.T) {
-
- mockT := new(testing.T)
-
- // start with a nil error
- var err error
-
- False(t, Error(mockT, err), "Error should return False for nil arg")
-
- // now set an error
- err = errors.New("some error")
-
- True(t, Error(mockT, err), "Error with error should return True")
-
-}
-
-func TestEqualError(t *testing.T) {
- mockT := new(testing.T)
-
- // start with a nil error
- var err error
- False(t, EqualError(mockT, err, ""),
- "EqualError should return false for nil arg")
-
- // now set an error
- err = errors.New("some error")
- False(t, EqualError(mockT, err, "Not some error"),
- "EqualError should return false for different error string")
- True(t, EqualError(mockT, err, "some error"),
- "EqualError should return true")
-}
-
-func Test_isEmpty(t *testing.T) {
-
- chWithValue := make(chan struct{}, 1)
- chWithValue <- struct{}{}
-
- True(t, isEmpty(""))
- True(t, isEmpty(nil))
- True(t, isEmpty([]string{}))
- True(t, isEmpty(0))
- True(t, isEmpty(int32(0)))
- True(t, isEmpty(int64(0)))
- True(t, isEmpty(false))
- True(t, isEmpty(map[string]string{}))
- True(t, isEmpty(new(time.Time)))
- True(t, isEmpty(make(chan struct{})))
- False(t, isEmpty("something"))
- False(t, isEmpty(errors.New("something")))
- False(t, isEmpty([]string{"something"}))
- False(t, isEmpty(1))
- False(t, isEmpty(true))
- False(t, isEmpty(map[string]string{"Hello": "World"}))
- False(t, isEmpty(chWithValue))
-
-}
-
-func TestEmpty(t *testing.T) {
-
- mockT := new(testing.T)
- chWithValue := make(chan struct{}, 1)
- chWithValue <- struct{}{}
-
- True(t, Empty(mockT, ""), "Empty string is empty")
- True(t, Empty(mockT, nil), "Nil is empty")
- True(t, Empty(mockT, []string{}), "Empty string array is empty")
- True(t, Empty(mockT, 0), "Zero int value is empty")
- True(t, Empty(mockT, false), "False value is empty")
- True(t, Empty(mockT, make(chan struct{})), "Channel without values is empty")
-
- False(t, Empty(mockT, "something"), "Non Empty string is not empty")
- False(t, Empty(mockT, errors.New("something")), "Non nil object is not empty")
- False(t, Empty(mockT, []string{"something"}), "Non empty string array is not empty")
- False(t, Empty(mockT, 1), "Non-zero int value is not empty")
- False(t, Empty(mockT, true), "True value is not empty")
- False(t, Empty(mockT, chWithValue), "Channel with values is not empty")
-}
-
-func TestNotEmpty(t *testing.T) {
-
- mockT := new(testing.T)
- chWithValue := make(chan struct{}, 1)
- chWithValue <- struct{}{}
-
- False(t, NotEmpty(mockT, ""), "Empty string is empty")
- False(t, NotEmpty(mockT, nil), "Nil is empty")
- False(t, NotEmpty(mockT, []string{}), "Empty string array is empty")
- False(t, NotEmpty(mockT, 0), "Zero int value is empty")
- False(t, NotEmpty(mockT, false), "False value is empty")
- False(t, NotEmpty(mockT, make(chan struct{})), "Channel without values is empty")
-
- True(t, NotEmpty(mockT, "something"), "Non Empty string is not empty")
- True(t, NotEmpty(mockT, errors.New("something")), "Non nil object is not empty")
- True(t, NotEmpty(mockT, []string{"something"}), "Non empty string array is not empty")
- True(t, NotEmpty(mockT, 1), "Non-zero int value is not empty")
- True(t, NotEmpty(mockT, true), "True value is not empty")
- True(t, NotEmpty(mockT, chWithValue), "Channel with values is not empty")
-}
-
-func Test_getLen(t *testing.T) {
- falseCases := []interface{}{
- nil,
- 0,
- true,
- false,
- 'A',
- struct{}{},
- }
- for _, v := range falseCases {
- ok, l := getLen(v)
- False(t, ok, "Expected getLen fail to get length of %#v", v)
- Equal(t, 0, l, "getLen should return 0 for %#v", v)
- }
-
- ch := make(chan int, 5)
- ch <- 1
- ch <- 2
- ch <- 3
- trueCases := []struct {
- v interface{}
- l int
- }{
- {[]int{1, 2, 3}, 3},
- {[...]int{1, 2, 3}, 3},
- {"ABC", 3},
- {map[int]int{1: 2, 2: 4, 3: 6}, 3},
- {ch, 3},
-
- {[]int{}, 0},
- {map[int]int{}, 0},
- {make(chan int), 0},
-
- {[]int(nil), 0},
- {map[int]int(nil), 0},
- {(chan int)(nil), 0},
- }
-
- for _, c := range trueCases {
- ok, l := getLen(c.v)
- True(t, ok, "Expected getLen success to get length of %#v", c.v)
- Equal(t, c.l, l)
- }
-}
-
-func TestLen(t *testing.T) {
- mockT := new(testing.T)
-
- False(t, Len(mockT, nil, 0), "nil does not have length")
- False(t, Len(mockT, 0, 0), "int does not have length")
- False(t, Len(mockT, true, 0), "true does not have length")
- False(t, Len(mockT, false, 0), "false does not have length")
- False(t, Len(mockT, 'A', 0), "Rune does not have length")
- False(t, Len(mockT, struct{}{}, 0), "Struct does not have length")
-
- ch := make(chan int, 5)
- ch <- 1
- ch <- 2
- ch <- 3
-
- cases := []struct {
- v interface{}
- l int
- }{
- {[]int{1, 2, 3}, 3},
- {[...]int{1, 2, 3}, 3},
- {"ABC", 3},
- {map[int]int{1: 2, 2: 4, 3: 6}, 3},
- {ch, 3},
-
- {[]int{}, 0},
- {map[int]int{}, 0},
- {make(chan int), 0},
-
- {[]int(nil), 0},
- {map[int]int(nil), 0},
- {(chan int)(nil), 0},
- }
-
- for _, c := range cases {
- True(t, Len(mockT, c.v, c.l), "%#v have %d items", c.v, c.l)
- }
-
- cases = []struct {
- v interface{}
- l int
- }{
- {[]int{1, 2, 3}, 4},
- {[...]int{1, 2, 3}, 2},
- {"ABC", 2},
- {map[int]int{1: 2, 2: 4, 3: 6}, 4},
- {ch, 2},
-
- {[]int{}, 1},
- {map[int]int{}, 1},
- {make(chan int), 1},
-
- {[]int(nil), 1},
- {map[int]int(nil), 1},
- {(chan int)(nil), 1},
- }
-
- for _, c := range cases {
- False(t, Len(mockT, c.v, c.l), "%#v have %d items", c.v, c.l)
- }
-}
-
-func TestWithinDuration(t *testing.T) {
-
- mockT := new(testing.T)
- a := time.Now()
- b := a.Add(10 * time.Second)
-
- True(t, WithinDuration(mockT, a, b, 10*time.Second), "A 10s difference is within a 10s time difference")
- True(t, WithinDuration(mockT, b, a, 10*time.Second), "A 10s difference is within a 10s time difference")
-
- False(t, WithinDuration(mockT, a, b, 9*time.Second), "A 10s difference is not within a 9s time difference")
- False(t, WithinDuration(mockT, b, a, 9*time.Second), "A 10s difference is not within a 9s time difference")
-
- False(t, WithinDuration(mockT, a, b, -9*time.Second), "A 10s difference is not within a 9s time difference")
- False(t, WithinDuration(mockT, b, a, -9*time.Second), "A 10s difference is not within a 9s time difference")
-
- False(t, WithinDuration(mockT, a, b, -11*time.Second), "A 10s difference is not within a 9s time difference")
- False(t, WithinDuration(mockT, b, a, -11*time.Second), "A 10s difference is not within a 9s time difference")
-}
-
-func TestInDelta(t *testing.T) {
- mockT := new(testing.T)
-
- True(t, InDelta(mockT, 1.001, 1, 0.01), "|1.001 - 1| <= 0.01")
- True(t, InDelta(mockT, 1, 1.001, 0.01), "|1 - 1.001| <= 0.01")
- True(t, InDelta(mockT, 1, 2, 1), "|1 - 2| <= 1")
- False(t, InDelta(mockT, 1, 2, 0.5), "Expected |1 - 2| <= 0.5 to fail")
- False(t, InDelta(mockT, 2, 1, 0.5), "Expected |2 - 1| <= 0.5 to fail")
- False(t, InDelta(mockT, "", nil, 1), "Expected non numerals to fail")
-
- cases := []struct {
- a, b interface{}
- delta float64
- }{
- {uint8(2), uint8(1), 1},
- {uint16(2), uint16(1), 1},
- {uint32(2), uint32(1), 1},
- {uint64(2), uint64(1), 1},
-
- {int(2), int(1), 1},
- {int8(2), int8(1), 1},
- {int16(2), int16(1), 1},
- {int32(2), int32(1), 1},
- {int64(2), int64(1), 1},
-
- {float32(2), float32(1), 1},
- {float64(2), float64(1), 1},
- }
-
- for _, tc := range cases {
- True(t, InDelta(mockT, tc.a, tc.b, tc.delta), "Expected |%V - %V| <= %v", tc.a, tc.b, tc.delta)
- }
-}
-
-func TestInDeltaSlice(t *testing.T) {
- mockT := new(testing.T)
-
- True(t, InDeltaSlice(mockT,
- []float64{1.001, 0.999},
- []float64{1, 1},
- 0.1), "{1.001, 0.009} is element-wise close to {1, 1} in delta=0.1")
-
- True(t, InDeltaSlice(mockT,
- []float64{1, 2},
- []float64{0, 3},
- 1), "{1, 2} is element-wise close to {0, 3} in delta=1")
-
- False(t, InDeltaSlice(mockT,
- []float64{1, 2},
- []float64{0, 3},
- 0.1), "{1, 2} is not element-wise close to {0, 3} in delta=0.1")
-
- False(t, InDeltaSlice(mockT, "", nil, 1), "Expected non numeral slices to fail")
-}
-
-func TestInEpsilon(t *testing.T) {
- mockT := new(testing.T)
-
- cases := []struct {
- a, b interface{}
- epsilon float64
- }{
- {uint8(2), uint16(2), .001},
- {2.1, 2.2, 0.1},
- {2.2, 2.1, 0.1},
- {-2.1, -2.2, 0.1},
- {-2.2, -2.1, 0.1},
- {uint64(100), uint8(101), 0.01},
- {0.1, -0.1, 2},
- }
-
- for _, tc := range cases {
- True(t, InEpsilon(mockT, tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon))
- }
-
- cases = []struct {
- a, b interface{}
- epsilon float64
- }{
- {uint8(2), int16(-2), .001},
- {uint64(100), uint8(102), 0.01},
- {2.1, 2.2, 0.001},
- {2.2, 2.1, 0.001},
- {2.1, -2.2, 1},
- {2.1, "bla-bla", 0},
- {0.1, -0.1, 1.99},
- }
-
- for _, tc := range cases {
- False(t, InEpsilon(mockT, tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon))
- }
-
-}
-
-func TestInEpsilonSlice(t *testing.T) {
- mockT := new(testing.T)
-
- True(t, InEpsilonSlice(mockT,
- []float64{2.2, 2.0},
- []float64{2.1, 2.1},
- 0.06), "{2.2, 2.0} is element-wise close to {2.1, 2.1} in espilon=0.06")
-
- False(t, InEpsilonSlice(mockT,
- []float64{2.2, 2.0},
- []float64{2.1, 2.1},
- 0.04), "{2.2, 2.0} is not element-wise close to {2.1, 2.1} in espilon=0.04")
-
- False(t, InEpsilonSlice(mockT, "", nil, 1), "Expected non numeral slices to fail")
-}
-
-func TestRegexp(t *testing.T) {
- mockT := new(testing.T)
-
- cases := []struct {
- rx, str string
- }{
- {"^start", "start of the line"},
- {"end$", "in the end"},
- {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12.34"},
- }
-
- for _, tc := range cases {
- True(t, Regexp(mockT, tc.rx, tc.str))
- True(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str))
- False(t, NotRegexp(mockT, tc.rx, tc.str))
- False(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str))
- }
-
- cases = []struct {
- rx, str string
- }{
- {"^asdfastart", "Not the start of the line"},
- {"end$", "in the end."},
- {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12a.34"},
- }
-
- for _, tc := range cases {
- False(t, Regexp(mockT, tc.rx, tc.str), "Expected \"%s\" to not match \"%s\"", tc.rx, tc.str)
- False(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str))
- True(t, NotRegexp(mockT, tc.rx, tc.str))
- True(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str))
- }
-}
diff --git a/vendor/github.com/stretchr/testify/assert/doc.go b/vendor/github.com/stretchr/testify/assert/doc.go
deleted file mode 100644
index f67810628..000000000
--- a/vendor/github.com/stretchr/testify/assert/doc.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system.
-//
-// Example Usage
-//
-// The following is a complete example using assert in a standard test function:
-// import (
-// "testing"
-// "github.com/stretchr/testify/assert"
-// )
-//
-// func TestSomething(t *testing.T) {
-//
-// var a string = "Hello"
-// var b string = "Hello"
-//
-// assert.Equal(t, a, b, "The two words should be the same.")
-//
-// }
-//
-// if you assert many times, use the below:
-//
-// import (
-// "testing"
-// "github.com/stretchr/testify/assert"
-// )
-//
-// func TestSomething(t *testing.T) {
-// assert := assert.New(t)
-//
-// var a string = "Hello"
-// var b string = "Hello"
-//
-// assert.Equal(a, b, "The two words should be the same.")
-// }
-//
-// Assertions
-//
-// Assertions allow you to easily write test code, and are global funcs in the `assert` package.
-// All assertion functions take, as the first argument, the `*testing.T` object provided by the
-// testing framework. This allows the assertion funcs to write the failings and other details to
-// the correct place.
-//
-// Every assertion function also takes an optional string message as the final argument,
-// allowing custom error messages to be appended to the message the assertion method outputs.
-//
-// Here is an overview of the assert functions:
-//
-// assert.Equal(t, expected, actual [, message [, format-args]])
-//
-// assert.EqualValues(t, expected, actual [, message [, format-args]])
-//
-// assert.NotEqual(t, notExpected, actual [, message [, format-args]])
-//
-// assert.True(t, actualBool [, message [, format-args]])
-//
-// assert.False(t, actualBool [, message [, format-args]])
-//
-// assert.Nil(t, actualObject [, message [, format-args]])
-//
-// assert.NotNil(t, actualObject [, message [, format-args]])
-//
-// assert.Empty(t, actualObject [, message [, format-args]])
-//
-// assert.NotEmpty(t, actualObject [, message [, format-args]])
-//
-// assert.Len(t, actualObject, expectedLength, [, message [, format-args]])
-//
-// assert.Error(t, errorObject [, message [, format-args]])
-//
-// assert.NoError(t, errorObject [, message [, format-args]])
-//
-// assert.EqualError(t, theError, errString [, message [, format-args]])
-//
-// assert.Implements(t, (*MyInterface)(nil), new(MyObject) [,message [, format-args]])
-//
-// assert.IsType(t, expectedObject, actualObject [, message [, format-args]])
-//
-// assert.Contains(t, stringOrSlice, substringOrElement [, message [, format-args]])
-//
-// assert.NotContains(t, stringOrSlice, substringOrElement [, message [, format-args]])
-//
-// assert.Panics(t, func(){
-//
-// // call code that should panic
-//
-// } [, message [, format-args]])
-//
-// assert.NotPanics(t, func(){
-//
-// // call code that should not panic
-//
-// } [, message [, format-args]])
-//
-// assert.WithinDuration(t, timeA, timeB, deltaTime, [, message [, format-args]])
-//
-// assert.InDelta(t, numA, numB, delta, [, message [, format-args]])
-//
-// assert.InEpsilon(t, numA, numB, epsilon, [, message [, format-args]])
-//
-// assert package contains Assertions object. it has assertion methods.
-//
-// Here is an overview of the assert functions:
-// assert.Equal(expected, actual [, message [, format-args]])
-//
-// assert.EqualValues(expected, actual [, message [, format-args]])
-//
-// assert.NotEqual(notExpected, actual [, message [, format-args]])
-//
-// assert.True(actualBool [, message [, format-args]])
-//
-// assert.False(actualBool [, message [, format-args]])
-//
-// assert.Nil(actualObject [, message [, format-args]])
-//
-// assert.NotNil(actualObject [, message [, format-args]])
-//
-// assert.Empty(actualObject [, message [, format-args]])
-//
-// assert.NotEmpty(actualObject [, message [, format-args]])
-//
-// assert.Len(actualObject, expectedLength, [, message [, format-args]])
-//
-// assert.Error(errorObject [, message [, format-args]])
-//
-// assert.NoError(errorObject [, message [, format-args]])
-//
-// assert.EqualError(theError, errString [, message [, format-args]])
-//
-// assert.Implements((*MyInterface)(nil), new(MyObject) [,message [, format-args]])
-//
-// assert.IsType(expectedObject, actualObject [, message [, format-args]])
-//
-// assert.Contains(stringOrSlice, substringOrElement [, message [, format-args]])
-//
-// assert.NotContains(stringOrSlice, substringOrElement [, message [, format-args]])
-//
-// assert.Panics(func(){
-//
-// // call code that should panic
-//
-// } [, message [, format-args]])
-//
-// assert.NotPanics(func(){
-//
-// // call code that should not panic
-//
-// } [, message [, format-args]])
-//
-// assert.WithinDuration(timeA, timeB, deltaTime, [, message [, format-args]])
-//
-// assert.InDelta(numA, numB, delta, [, message [, format-args]])
-//
-// assert.InEpsilon(numA, numB, epsilon, [, message [, format-args]])
-package assert
diff --git a/vendor/github.com/stretchr/testify/assert/errors.go b/vendor/github.com/stretchr/testify/assert/errors.go
deleted file mode 100644
index ac9dc9d1d..000000000
--- a/vendor/github.com/stretchr/testify/assert/errors.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package assert
-
-import (
- "errors"
-)
-
-// AnError is an error instance useful for testing. If the code does not care
-// about error specifics, and only needs to return the error for example, this
-// error should be used to make the test code more readable.
-var AnError = errors.New("assert.AnError general error for testing")
diff --git a/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/stretchr/testify/assert/forward_assertions.go
deleted file mode 100644
index d8d3f531e..000000000
--- a/vendor/github.com/stretchr/testify/assert/forward_assertions.go
+++ /dev/null
@@ -1,265 +0,0 @@
-package assert
-
-import "time"
-
-// Assertions provides assertion methods around the
-// TestingT interface.
-type Assertions struct {
- t TestingT
-}
-
-// New makes a new Assertions object for the specified TestingT.
-func New(t TestingT) *Assertions {
- return &Assertions{
- t: t,
- }
-}
-
-// Fail reports a failure through
-func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {
- return Fail(a.t, failureMessage, msgAndArgs...)
-}
-
-// Implements asserts that an object is implemented by the specified interface.
-//
-// assert.Implements((*MyInterface)(nil), new(MyObject), "MyObject")
-func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
- return Implements(a.t, interfaceObject, object, msgAndArgs...)
-}
-
-// IsType asserts that the specified objects are of the same type.
-func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
- return IsType(a.t, expectedType, object, msgAndArgs...)
-}
-
-// Equal asserts that two objects are equal.
-//
-// assert.Equal(123, 123, "123 and 123 should be equal")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Equal(expected, actual interface{}, msgAndArgs ...interface{}) bool {
- return Equal(a.t, expected, actual, msgAndArgs...)
-}
-
-// EqualValues asserts that two objects are equal or convertable to the same types
-// and equal.
-//
-// assert.EqualValues(uint32(123), int32(123), "123 and 123 should be equal")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) EqualValues(expected, actual interface{}, msgAndArgs ...interface{}) bool {
- return EqualValues(a.t, expected, actual, msgAndArgs...)
-}
-
-// Exactly asserts that two objects are equal is value and type.
-//
-// assert.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Exactly(expected, actual interface{}, msgAndArgs ...interface{}) bool {
- return Exactly(a.t, expected, actual, msgAndArgs...)
-}
-
-// NotNil asserts that the specified object is not nil.
-//
-// assert.NotNil(err, "err should be something")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool {
- return NotNil(a.t, object, msgAndArgs...)
-}
-
-// Nil asserts that the specified object is nil.
-//
-// assert.Nil(err, "err should be nothing")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {
- return Nil(a.t, object, msgAndArgs...)
-}
-
-// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or a
-// slice with len == 0.
-//
-// assert.Empty(obj)
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {
- return Empty(a.t, object, msgAndArgs...)
-}
-
-// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or a
-// slice with len == 0.
-//
-// if assert.NotEmpty(obj) {
-// assert.Equal("two", obj[1])
-// }
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool {
- return NotEmpty(a.t, object, msgAndArgs...)
-}
-
-// Len asserts that the specified object has specific length.
-// Len also fails if the object has a type that len() not accept.
-//
-// assert.Len(mySlice, 3, "The size of slice is not 3")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool {
- return Len(a.t, object, length, msgAndArgs...)
-}
-
-// True asserts that the specified value is true.
-//
-// assert.True(myBool, "myBool should be true")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {
- return True(a.t, value, msgAndArgs...)
-}
-
-// False asserts that the specified value is true.
-//
-// assert.False(myBool, "myBool should be false")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {
- return False(a.t, value, msgAndArgs...)
-}
-
-// NotEqual asserts that the specified values are NOT equal.
-//
-// assert.NotEqual(obj1, obj2, "two objects shouldn't be equal")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) NotEqual(expected, actual interface{}, msgAndArgs ...interface{}) bool {
- return NotEqual(a.t, expected, actual, msgAndArgs...)
-}
-
-// Contains asserts that the specified string contains the specified substring.
-//
-// assert.Contains("Hello World", "World", "But 'Hello World' does contain 'World'")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Contains(s, contains interface{}, msgAndArgs ...interface{}) bool {
- return Contains(a.t, s, contains, msgAndArgs...)
-}
-
-// NotContains asserts that the specified string does NOT contain the specified substring.
-//
-// assert.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) NotContains(s, contains interface{}, msgAndArgs ...interface{}) bool {
- return NotContains(a.t, s, contains, msgAndArgs...)
-}
-
-// Condition uses a Comparison to assert a complex condition.
-func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {
- return Condition(a.t, comp, msgAndArgs...)
-}
-
-// Panics asserts that the code inside the specified PanicTestFunc panics.
-//
-// assert.Panics(func(){
-// GoCrazy()
-// }, "Calling GoCrazy() should panic")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
- return Panics(a.t, f, msgAndArgs...)
-}
-
-// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
-//
-// assert.NotPanics(func(){
-// RemainCalm()
-// }, "Calling RemainCalm() should NOT panic")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
- return NotPanics(a.t, f, msgAndArgs...)
-}
-
-// WithinDuration asserts that the two times are within duration delta of each other.
-//
-// assert.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) WithinDuration(expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
- return WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
-}
-
-// InDelta asserts that the two numerals are within delta of each other.
-//
-// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01)
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) InDelta(expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
- return InDelta(a.t, expected, actual, delta, msgAndArgs...)
-}
-
-// InEpsilon asserts that expected and actual have a relative error less than epsilon
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) InEpsilon(expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
- return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
-}
-
-// NoError asserts that a function returned no error (i.e. `nil`).
-//
-// actualObj, err := SomeFunction()
-// if assert.NoError(err) {
-// assert.Equal(actualObj, expectedObj)
-// }
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) NoError(theError error, msgAndArgs ...interface{}) bool {
- return NoError(a.t, theError, msgAndArgs...)
-}
-
-// Error asserts that a function returned an error (i.e. not `nil`).
-//
-// actualObj, err := SomeFunction()
-// if assert.Error(err, "An error was expected") {
-// assert.Equal(err, expectedError)
-// }
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Error(theError error, msgAndArgs ...interface{}) bool {
- return Error(a.t, theError, msgAndArgs...)
-}
-
-// EqualError asserts that a function returned an error (i.e. not `nil`)
-// and that it is equal to the provided error.
-//
-// actualObj, err := SomeFunction()
-// if assert.Error(err, "An error was expected") {
-// assert.Equal(err, expectedError)
-// }
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {
- return EqualError(a.t, theError, errString, msgAndArgs...)
-}
-
-// Regexp asserts that a specified regexp matches a string.
-//
-// assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
-// assert.Regexp(t, "start...$", "it's not starting")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
- return Regexp(a.t, rx, str, msgAndArgs...)
-}
-
-// NotRegexp asserts that a specified regexp does not match a string.
-//
-// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
-// assert.NotRegexp(t, "^start", "it's not starting")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
- return NotRegexp(a.t, rx, str, msgAndArgs...)
-}
diff --git a/vendor/github.com/stretchr/testify/assert/forward_assertions_test.go b/vendor/github.com/stretchr/testify/assert/forward_assertions_test.go
deleted file mode 100644
index 3df3f3917..000000000
--- a/vendor/github.com/stretchr/testify/assert/forward_assertions_test.go
+++ /dev/null
@@ -1,511 +0,0 @@
-package assert
-
-import (
- "errors"
- "regexp"
- "testing"
- "time"
-)
-
-func TestImplementsWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- if !assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) {
- t.Error("Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface")
- }
- if assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) {
- t.Error("Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface")
- }
-}
-
-func TestIsTypeWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- if !assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) {
- t.Error("IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject")
- }
- if assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) {
- t.Error("IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject")
- }
-
-}
-
-func TestEqualWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- if !assert.Equal("Hello World", "Hello World") {
- t.Error("Equal should return true")
- }
- if !assert.Equal(123, 123) {
- t.Error("Equal should return true")
- }
- if !assert.Equal(123.5, 123.5) {
- t.Error("Equal should return true")
- }
- if !assert.Equal([]byte("Hello World"), []byte("Hello World")) {
- t.Error("Equal should return true")
- }
- if !assert.Equal(nil, nil) {
- t.Error("Equal should return true")
- }
-}
-
-func TestEqualValuesWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- if !assert.EqualValues(uint32(10), int32(10)) {
- t.Error("EqualValues should return true")
- }
-}
-
-func TestNotNilWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- if !assert.NotNil(new(AssertionTesterConformingObject)) {
- t.Error("NotNil should return true: object is not nil")
- }
- if assert.NotNil(nil) {
- t.Error("NotNil should return false: object is nil")
- }
-
-}
-
-func TestNilWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- if !assert.Nil(nil) {
- t.Error("Nil should return true: object is nil")
- }
- if assert.Nil(new(AssertionTesterConformingObject)) {
- t.Error("Nil should return false: object is not nil")
- }
-
-}
-
-func TestTrueWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- if !assert.True(true) {
- t.Error("True should return true")
- }
- if assert.True(false) {
- t.Error("True should return false")
- }
-
-}
-
-func TestFalseWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- if !assert.False(false) {
- t.Error("False should return true")
- }
- if assert.False(true) {
- t.Error("False should return false")
- }
-
-}
-
-func TestExactlyWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- a := float32(1)
- b := float64(1)
- c := float32(1)
- d := float32(2)
-
- if assert.Exactly(a, b) {
- t.Error("Exactly should return false")
- }
- if assert.Exactly(a, d) {
- t.Error("Exactly should return false")
- }
- if !assert.Exactly(a, c) {
- t.Error("Exactly should return true")
- }
-
- if assert.Exactly(nil, a) {
- t.Error("Exactly should return false")
- }
- if assert.Exactly(a, nil) {
- t.Error("Exactly should return false")
- }
-
-}
-
-func TestNotEqualWrapper(t *testing.T) {
-
- assert := New(new(testing.T))
-
- if !assert.NotEqual("Hello World", "Hello World!") {
- t.Error("NotEqual should return true")
- }
- if !assert.NotEqual(123, 1234) {
- t.Error("NotEqual should return true")
- }
- if !assert.NotEqual(123.5, 123.55) {
- t.Error("NotEqual should return true")
- }
- if !assert.NotEqual([]byte("Hello World"), []byte("Hello World!")) {
- t.Error("NotEqual should return true")
- }
- if !assert.NotEqual(nil, new(AssertionTesterConformingObject)) {
- t.Error("NotEqual should return true")
- }
-}
-
-func TestContainsWrapper(t *testing.T) {
-
- assert := New(new(testing.T))
- list := []string{"Foo", "Bar"}
-
- if !assert.Contains("Hello World", "Hello") {
- t.Error("Contains should return true: \"Hello World\" contains \"Hello\"")
- }
- if assert.Contains("Hello World", "Salut") {
- t.Error("Contains should return false: \"Hello World\" does not contain \"Salut\"")
- }
-
- if !assert.Contains(list, "Foo") {
- t.Error("Contains should return true: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"")
- }
- if assert.Contains(list, "Salut") {
- t.Error("Contains should return false: \"[\"Foo\", \"Bar\"]\" does not contain \"Salut\"")
- }
-
-}
-
-func TestNotContainsWrapper(t *testing.T) {
-
- assert := New(new(testing.T))
- list := []string{"Foo", "Bar"}
-
- if !assert.NotContains("Hello World", "Hello!") {
- t.Error("NotContains should return true: \"Hello World\" does not contain \"Hello!\"")
- }
- if assert.NotContains("Hello World", "Hello") {
- t.Error("NotContains should return false: \"Hello World\" contains \"Hello\"")
- }
-
- if !assert.NotContains(list, "Foo!") {
- t.Error("NotContains should return true: \"[\"Foo\", \"Bar\"]\" does not contain \"Foo!\"")
- }
- if assert.NotContains(list, "Foo") {
- t.Error("NotContains should return false: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"")
- }
-
-}
-
-func TestConditionWrapper(t *testing.T) {
-
- assert := New(new(testing.T))
-
- if !assert.Condition(func() bool { return true }, "Truth") {
- t.Error("Condition should return true")
- }
-
- if assert.Condition(func() bool { return false }, "Lie") {
- t.Error("Condition should return false")
- }
-
-}
-
-func TestDidPanicWrapper(t *testing.T) {
-
- if funcDidPanic, _ := didPanic(func() {
- panic("Panic!")
- }); !funcDidPanic {
- t.Error("didPanic should return true")
- }
-
- if funcDidPanic, _ := didPanic(func() {
- }); funcDidPanic {
- t.Error("didPanic should return false")
- }
-
-}
-
-func TestPanicsWrapper(t *testing.T) {
-
- assert := New(new(testing.T))
-
- if !assert.Panics(func() {
- panic("Panic!")
- }) {
- t.Error("Panics should return true")
- }
-
- if assert.Panics(func() {
- }) {
- t.Error("Panics should return false")
- }
-
-}
-
-func TestNotPanicsWrapper(t *testing.T) {
-
- assert := New(new(testing.T))
-
- if !assert.NotPanics(func() {
- }) {
- t.Error("NotPanics should return true")
- }
-
- if assert.NotPanics(func() {
- panic("Panic!")
- }) {
- t.Error("NotPanics should return false")
- }
-
-}
-
-func TestNoErrorWrapper(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
-
- // start with a nil error
- var err error
-
- assert.True(mockAssert.NoError(err), "NoError should return True for nil arg")
-
- // now set an error
- err = errors.New("Some error")
-
- assert.False(mockAssert.NoError(err), "NoError with error should return False")
-
-}
-
-func TestErrorWrapper(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
-
- // start with a nil error
- var err error
-
- assert.False(mockAssert.Error(err), "Error should return False for nil arg")
-
- // now set an error
- err = errors.New("Some error")
-
- assert.True(mockAssert.Error(err), "Error with error should return True")
-
-}
-
-func TestEqualErrorWrapper(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
-
- // start with a nil error
- var err error
- assert.False(mockAssert.EqualError(err, ""),
- "EqualError should return false for nil arg")
-
- // now set an error
- err = errors.New("some error")
- assert.False(mockAssert.EqualError(err, "Not some error"),
- "EqualError should return false for different error string")
- assert.True(mockAssert.EqualError(err, "some error"),
- "EqualError should return true")
-}
-
-func TestEmptyWrapper(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
-
- assert.True(mockAssert.Empty(""), "Empty string is empty")
- assert.True(mockAssert.Empty(nil), "Nil is empty")
- assert.True(mockAssert.Empty([]string{}), "Empty string array is empty")
- assert.True(mockAssert.Empty(0), "Zero int value is empty")
- assert.True(mockAssert.Empty(false), "False value is empty")
-
- assert.False(mockAssert.Empty("something"), "Non Empty string is not empty")
- assert.False(mockAssert.Empty(errors.New("something")), "Non nil object is not empty")
- assert.False(mockAssert.Empty([]string{"something"}), "Non empty string array is not empty")
- assert.False(mockAssert.Empty(1), "Non-zero int value is not empty")
- assert.False(mockAssert.Empty(true), "True value is not empty")
-
-}
-
-func TestNotEmptyWrapper(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
-
- assert.False(mockAssert.NotEmpty(""), "Empty string is empty")
- assert.False(mockAssert.NotEmpty(nil), "Nil is empty")
- assert.False(mockAssert.NotEmpty([]string{}), "Empty string array is empty")
- assert.False(mockAssert.NotEmpty(0), "Zero int value is empty")
- assert.False(mockAssert.NotEmpty(false), "False value is empty")
-
- assert.True(mockAssert.NotEmpty("something"), "Non Empty string is not empty")
- assert.True(mockAssert.NotEmpty(errors.New("something")), "Non nil object is not empty")
- assert.True(mockAssert.NotEmpty([]string{"something"}), "Non empty string array is not empty")
- assert.True(mockAssert.NotEmpty(1), "Non-zero int value is not empty")
- assert.True(mockAssert.NotEmpty(true), "True value is not empty")
-
-}
-
-func TestLenWrapper(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
-
- assert.False(mockAssert.Len(nil, 0), "nil does not have length")
- assert.False(mockAssert.Len(0, 0), "int does not have length")
- assert.False(mockAssert.Len(true, 0), "true does not have length")
- assert.False(mockAssert.Len(false, 0), "false does not have length")
- assert.False(mockAssert.Len('A', 0), "Rune does not have length")
- assert.False(mockAssert.Len(struct{}{}, 0), "Struct does not have length")
-
- ch := make(chan int, 5)
- ch <- 1
- ch <- 2
- ch <- 3
-
- cases := []struct {
- v interface{}
- l int
- }{
- {[]int{1, 2, 3}, 3},
- {[...]int{1, 2, 3}, 3},
- {"ABC", 3},
- {map[int]int{1: 2, 2: 4, 3: 6}, 3},
- {ch, 3},
-
- {[]int{}, 0},
- {map[int]int{}, 0},
- {make(chan int), 0},
-
- {[]int(nil), 0},
- {map[int]int(nil), 0},
- {(chan int)(nil), 0},
- }
-
- for _, c := range cases {
- assert.True(mockAssert.Len(c.v, c.l), "%#v have %d items", c.v, c.l)
- }
-}
-
-func TestWithinDurationWrapper(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
- a := time.Now()
- b := a.Add(10 * time.Second)
-
- assert.True(mockAssert.WithinDuration(a, b, 10*time.Second), "A 10s difference is within a 10s time difference")
- assert.True(mockAssert.WithinDuration(b, a, 10*time.Second), "A 10s difference is within a 10s time difference")
-
- assert.False(mockAssert.WithinDuration(a, b, 9*time.Second), "A 10s difference is not within a 9s time difference")
- assert.False(mockAssert.WithinDuration(b, a, 9*time.Second), "A 10s difference is not within a 9s time difference")
-
- assert.False(mockAssert.WithinDuration(a, b, -9*time.Second), "A 10s difference is not within a 9s time difference")
- assert.False(mockAssert.WithinDuration(b, a, -9*time.Second), "A 10s difference is not within a 9s time difference")
-
- assert.False(mockAssert.WithinDuration(a, b, -11*time.Second), "A 10s difference is not within a 9s time difference")
- assert.False(mockAssert.WithinDuration(b, a, -11*time.Second), "A 10s difference is not within a 9s time difference")
-}
-
-func TestInDeltaWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- True(t, assert.InDelta(1.001, 1, 0.01), "|1.001 - 1| <= 0.01")
- True(t, assert.InDelta(1, 1.001, 0.01), "|1 - 1.001| <= 0.01")
- True(t, assert.InDelta(1, 2, 1), "|1 - 2| <= 1")
- False(t, assert.InDelta(1, 2, 0.5), "Expected |1 - 2| <= 0.5 to fail")
- False(t, assert.InDelta(2, 1, 0.5), "Expected |2 - 1| <= 0.5 to fail")
- False(t, assert.InDelta("", nil, 1), "Expected non numerals to fail")
-
- cases := []struct {
- a, b interface{}
- delta float64
- }{
- {uint8(2), uint8(1), 1},
- {uint16(2), uint16(1), 1},
- {uint32(2), uint32(1), 1},
- {uint64(2), uint64(1), 1},
-
- {int(2), int(1), 1},
- {int8(2), int8(1), 1},
- {int16(2), int16(1), 1},
- {int32(2), int32(1), 1},
- {int64(2), int64(1), 1},
-
- {float32(2), float32(1), 1},
- {float64(2), float64(1), 1},
- }
-
- for _, tc := range cases {
- True(t, assert.InDelta(tc.a, tc.b, tc.delta), "Expected |%V - %V| <= %v", tc.a, tc.b, tc.delta)
- }
-}
-
-func TestInEpsilonWrapper(t *testing.T) {
- assert := New(new(testing.T))
-
- cases := []struct {
- a, b interface{}
- epsilon float64
- }{
- {uint8(2), uint16(2), .001},
- {2.1, 2.2, 0.1},
- {2.2, 2.1, 0.1},
- {-2.1, -2.2, 0.1},
- {-2.2, -2.1, 0.1},
- {uint64(100), uint8(101), 0.01},
- {0.1, -0.1, 2},
- }
-
- for _, tc := range cases {
- True(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon))
- }
-
- cases = []struct {
- a, b interface{}
- epsilon float64
- }{
- {uint8(2), int16(-2), .001},
- {uint64(100), uint8(102), 0.01},
- {2.1, 2.2, 0.001},
- {2.2, 2.1, 0.001},
- {2.1, -2.2, 1},
- {2.1, "bla-bla", 0},
- {0.1, -0.1, 1.99},
- }
-
- for _, tc := range cases {
- False(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon))
- }
-}
-
-func TestRegexpWrapper(t *testing.T) {
-
- assert := New(new(testing.T))
-
- cases := []struct {
- rx, str string
- }{
- {"^start", "start of the line"},
- {"end$", "in the end"},
- {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12.34"},
- }
-
- for _, tc := range cases {
- True(t, assert.Regexp(tc.rx, tc.str))
- True(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str))
- False(t, assert.NotRegexp(tc.rx, tc.str))
- False(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str))
- }
-
- cases = []struct {
- rx, str string
- }{
- {"^asdfastart", "Not the start of the line"},
- {"end$", "in the end."},
- {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12a.34"},
- }
-
- for _, tc := range cases {
- False(t, assert.Regexp(tc.rx, tc.str), "Expected \"%s\" to not match \"%s\"", tc.rx, tc.str)
- False(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str))
- True(t, assert.NotRegexp(tc.rx, tc.str))
- True(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str))
- }
-}
diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go
deleted file mode 100644
index 1246e58e0..000000000
--- a/vendor/github.com/stretchr/testify/assert/http_assertions.go
+++ /dev/null
@@ -1,157 +0,0 @@
-package assert
-
-import (
- "fmt"
- "net/http"
- "net/http/httptest"
- "net/url"
- "strings"
-)
-
-// httpCode is a helper that returns HTTP code of the response. It returns -1
-// if building a new request fails.
-func httpCode(handler http.HandlerFunc, mode, url string, values url.Values) int {
- w := httptest.NewRecorder()
- req, err := http.NewRequest(mode, url+"?"+values.Encode(), nil)
- if err != nil {
- return -1
- }
- handler(w, req)
- return w.Code
-}
-
-// HTTPSuccess asserts that a specified handler returns a success status code.
-//
-// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
-//
-// Returns whether the assertion was successful (true) or not (false).
-func HTTPSuccess(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values) bool {
- code := httpCode(handler, mode, url, values)
- if code == -1 {
- return false
- }
- return code >= http.StatusOK && code <= http.StatusPartialContent
-}
-
-// HTTPRedirect asserts that a specified handler returns a redirect status code.
-//
-// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
-//
-// Returns whether the assertion was successful (true) or not (false).
-func HTTPRedirect(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values) bool {
- code := httpCode(handler, mode, url, values)
- if code == -1 {
- return false
- }
- return code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect
-}
-
-// HTTPError asserts that a specified handler returns an error status code.
-//
-// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
-//
-// Returns whether the assertion was successful (true) or not (false).
-func HTTPError(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values) bool {
- code := httpCode(handler, mode, url, values)
- if code == -1 {
- return false
- }
- return code >= http.StatusBadRequest
-}
-
-// HTTPBody is a helper that returns HTTP body of the response. It returns
-// empty string if building a new request fails.
-func HTTPBody(handler http.HandlerFunc, mode, url string, values url.Values) string {
- w := httptest.NewRecorder()
- req, err := http.NewRequest(mode, url+"?"+values.Encode(), nil)
- if err != nil {
- return ""
- }
- handler(w, req)
- return w.Body.String()
-}
-
-// HTTPBodyContains asserts that a specified handler returns a
-// body that contains a string.
-//
-// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func HTTPBodyContains(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values, str interface{}) bool {
- body := HTTPBody(handler, mode, url, values)
-
- contains := strings.Contains(body, fmt.Sprint(str))
- if !contains {
- Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body))
- }
-
- return contains
-}
-
-// HTTPBodyNotContains asserts that a specified handler returns a
-// body that does not contain a string.
-//
-// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, mode, url string, values url.Values, str interface{}) bool {
- body := HTTPBody(handler, mode, url, values)
-
- contains := strings.Contains(body, fmt.Sprint(str))
- if contains {
- Fail(t, "Expected response body for %s to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)
- }
-
- return !contains
-}
-
-//
-// Assertions Wrappers
-//
-
-// HTTPSuccess asserts that a specified handler returns a success status code.
-//
-// assert.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil)
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, mode, url string, values url.Values) bool {
- return HTTPSuccess(a.t, handler, mode, url, values)
-}
-
-// HTTPRedirect asserts that a specified handler returns a redirect status code.
-//
-// assert.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, mode, url string, values url.Values) bool {
- return HTTPRedirect(a.t, handler, mode, url, values)
-}
-
-// HTTPError asserts that a specified handler returns an error status code.
-//
-// assert.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) HTTPError(handler http.HandlerFunc, mode, url string, values url.Values) bool {
- return HTTPError(a.t, handler, mode, url, values)
-}
-
-// HTTPBodyContains asserts that a specified handler returns a
-// body that contains a string.
-//
-// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, mode, url string, values url.Values, str interface{}) bool {
- return HTTPBodyContains(a.t, handler, mode, url, values, str)
-}
-
-// HTTPBodyNotContains asserts that a specified handler returns a
-// body that does not contain a string.
-//
-// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
-//
-// Returns whether the assertion was successful (true) or not (false).
-func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, mode, url string, values url.Values, str interface{}) bool {
- return HTTPBodyNotContains(a.t, handler, mode, url, values, str)
-}
diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions_test.go b/vendor/github.com/stretchr/testify/assert/http_assertions_test.go
deleted file mode 100644
index 684c2d5d1..000000000
--- a/vendor/github.com/stretchr/testify/assert/http_assertions_test.go
+++ /dev/null
@@ -1,86 +0,0 @@
-package assert
-
-import (
- "fmt"
- "net/http"
- "net/url"
- "testing"
-)
-
-func httpOK(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(http.StatusOK)
-}
-
-func httpRedirect(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(http.StatusTemporaryRedirect)
-}
-
-func httpError(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(http.StatusInternalServerError)
-}
-
-func TestHTTPStatuses(t *testing.T) {
- assert := New(t)
- mockT := new(testing.T)
-
- assert.Equal(HTTPSuccess(mockT, httpOK, "GET", "/", nil), true)
- assert.Equal(HTTPSuccess(mockT, httpRedirect, "GET", "/", nil), false)
- assert.Equal(HTTPSuccess(mockT, httpError, "GET", "/", nil), false)
-
- assert.Equal(HTTPRedirect(mockT, httpOK, "GET", "/", nil), false)
- assert.Equal(HTTPRedirect(mockT, httpRedirect, "GET", "/", nil), true)
- assert.Equal(HTTPRedirect(mockT, httpError, "GET", "/", nil), false)
-
- assert.Equal(HTTPError(mockT, httpOK, "GET", "/", nil), false)
- assert.Equal(HTTPError(mockT, httpRedirect, "GET", "/", nil), false)
- assert.Equal(HTTPError(mockT, httpError, "GET", "/", nil), true)
-}
-
-func TestHTTPStatusesWrapper(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
-
- assert.Equal(mockAssert.HTTPSuccess(httpOK, "GET", "/", nil), true)
- assert.Equal(mockAssert.HTTPSuccess(httpRedirect, "GET", "/", nil), false)
- assert.Equal(mockAssert.HTTPSuccess(httpError, "GET", "/", nil), false)
-
- assert.Equal(mockAssert.HTTPRedirect(httpOK, "GET", "/", nil), false)
- assert.Equal(mockAssert.HTTPRedirect(httpRedirect, "GET", "/", nil), true)
- assert.Equal(mockAssert.HTTPRedirect(httpError, "GET", "/", nil), false)
-
- assert.Equal(mockAssert.HTTPError(httpOK, "GET", "/", nil), false)
- assert.Equal(mockAssert.HTTPError(httpRedirect, "GET", "/", nil), false)
- assert.Equal(mockAssert.HTTPError(httpError, "GET", "/", nil), true)
-}
-
-func httpHelloName(w http.ResponseWriter, r *http.Request) {
- name := r.FormValue("name")
- w.Write([]byte(fmt.Sprintf("Hello, %s!", name)))
-}
-
-func TestHttpBody(t *testing.T) {
- assert := New(t)
- mockT := new(testing.T)
-
- assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!"))
- assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World"))
- assert.False(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world"))
-
- assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!"))
- assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World"))
- assert.True(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world"))
-}
-
-func TestHttpBodyWrappers(t *testing.T) {
- assert := New(t)
- mockAssert := New(new(testing.T))
-
- assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!"))
- assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World"))
- assert.False(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world"))
-
- assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!"))
- assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World"))
- assert.True(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world"))
-
-}
diff --git a/vendor/github.com/stretchr/testify/mock/doc.go b/vendor/github.com/stretchr/testify/mock/doc.go
deleted file mode 100644
index dd385074b..000000000
--- a/vendor/github.com/stretchr/testify/mock/doc.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Provides a system by which it is possible to mock your objects and verify calls are happening as expected.
-//
-// Example Usage
-//
-// The mock package provides an object, Mock, that tracks activity on another object. It is usually
-// embedded into a test object as shown below:
-//
-// type MyTestObject struct {
-// // add a Mock object instance
-// mock.Mock
-//
-// // other fields go here as normal
-// }
-//
-// When implementing the methods of an interface, you wire your functions up
-// to call the Mock.Called(args...) method, and return the appropriate values.
-//
-// For example, to mock a method that saves the name and age of a person and returns
-// the year of their birth or an error, you might write this:
-//
-// func (o *MyTestObject) SavePersonDetails(firstname, lastname string, age int) (int, error) {
-// args := o.Called(firstname, lastname, age)
-// return args.Int(0), args.Error(1)
-// }
-//
-// The Int, Error and Bool methods are examples of strongly typed getters that take the argument
-// index position. Given this argument list:
-//
-// (12, true, "Something")
-//
-// You could read them out strongly typed like this:
-//
-// args.Int(0)
-// args.Bool(1)
-// args.String(2)
-//
-// For objects of your own type, use the generic Arguments.Get(index) method and make a type assertion:
-//
-// return args.Get(0).(*MyObject), args.Get(1).(*AnotherObjectOfMine)
-//
-// This may cause a panic if the object you are getting is nil (the type assertion will fail), in those
-// cases you should check for nil first.
-package mock
diff --git a/vendor/github.com/stretchr/testify/mock/mock.go b/vendor/github.com/stretchr/testify/mock/mock.go
deleted file mode 100644
index dc1f39af3..000000000
--- a/vendor/github.com/stretchr/testify/mock/mock.go
+++ /dev/null
@@ -1,559 +0,0 @@
-package mock
-
-import (
- "fmt"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/objx"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "reflect"
- "runtime"
- "strings"
- "sync"
- "time"
-)
-
-// TestingT is an interface wrapper around *testing.T
-type TestingT interface {
- Logf(format string, args ...interface{})
- Errorf(format string, args ...interface{})
-}
-
-/*
- Call
-*/
-
-// Call represents a method call and is used for setting expectations,
-// as well as recording activity.
-type Call struct {
-
- // The name of the method that was or will be called.
- Method string
-
- // Holds the arguments of the method.
- Arguments Arguments
-
- // Holds the arguments that should be returned when
- // this method is called.
- ReturnArguments Arguments
-
- // The number of times to return the return arguments when setting
- // expectations. 0 means to always return the value.
- Repeatability int
-
- // Holds a channel that will be used to block the Return until it either
- // recieves a message or is closed. nil means it returns immediately.
- WaitFor <-chan time.Time
-
- // Holds a handler used to manipulate arguments content that are passed by
- // reference. It's useful when mocking methods such as unmarshalers or
- // decoders.
- Run func(Arguments)
-}
-
-// Mock is the workhorse used to track activity on another object.
-// For an example of its usage, refer to the "Example Usage" section at the top of this document.
-type Mock struct {
-
- // The method name that is currently
- // being referred to by the On method.
- onMethodName string
-
- // An array of the arguments that are
- // currently being referred to by the On method.
- onMethodArguments Arguments
-
- // Represents the calls that are expected of
- // an object.
- ExpectedCalls []Call
-
- // Holds the calls that were made to this mocked object.
- Calls []Call
-
- // TestData holds any data that might be useful for testing. Testify ignores
- // this data completely allowing you to do whatever you like with it.
- testData objx.Map
-
- mutex sync.Mutex
-}
-
-// TestData holds any data that might be useful for testing. Testify ignores
-// this data completely allowing you to do whatever you like with it.
-func (m *Mock) TestData() objx.Map {
-
- if m.testData == nil {
- m.testData = make(objx.Map)
- }
-
- return m.testData
-}
-
-/*
- Setting expectations
-*/
-
-// On starts a description of an expectation of the specified method
-// being called.
-//
-// Mock.On("MyMethod", arg1, arg2)
-func (m *Mock) On(methodName string, arguments ...interface{}) *Mock {
- m.onMethodName = methodName
- m.onMethodArguments = arguments
- return m
-}
-
-// Return finishes a description of an expectation of the method (and arguments)
-// specified in the most recent On method call.
-//
-// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2)
-func (m *Mock) Return(returnArguments ...interface{}) *Mock {
- m.ExpectedCalls = append(m.ExpectedCalls, Call{m.onMethodName, m.onMethodArguments, returnArguments, 0, nil, nil})
- return m
-}
-
-// Once indicates that that the mock should only return the value once.
-//
-// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Once()
-func (m *Mock) Once() {
- m.ExpectedCalls[len(m.ExpectedCalls)-1].Repeatability = 1
-}
-
-// Twice indicates that that the mock should only return the value twice.
-//
-// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Twice()
-func (m *Mock) Twice() {
- m.ExpectedCalls[len(m.ExpectedCalls)-1].Repeatability = 2
-}
-
-// Times indicates that that the mock should only return the indicated number
-// of times.
-//
-// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Times(5)
-func (m *Mock) Times(i int) {
- m.ExpectedCalls[len(m.ExpectedCalls)-1].Repeatability = i
-}
-
-// WaitUntil sets the channel that will block the mock's return until its closed
-// or a message is received.
-//
-// Mock.On("MyMethod", arg1, arg2).WaitUntil(time.After(time.Second))
-func (m *Mock) WaitUntil(w <-chan time.Time) *Mock {
- m.ExpectedCalls[len(m.ExpectedCalls)-1].WaitFor = w
- return m
-}
-
-// After sets how long to block until the call returns
-//
-// Mock.On("MyMethod", arg1, arg2).After(time.Second)
-func (m *Mock) After(d time.Duration) *Mock {
- return m.WaitUntil(time.After(d))
-}
-
-// Run sets a handler to be called before returning. It can be used when
-// mocking a method such as unmarshalers that takes a pointer to a struct and
-// sets properties in such struct
-//
-// Mock.On("Unmarshal", AnythingOfType("*map[string]interface{}").Return().Run(function(args Arguments) {
-// arg := args.Get(0).(*map[string]interface{})
-// arg["foo"] = "bar"
-// })
-func (m *Mock) Run(fn func(Arguments)) *Mock {
- m.ExpectedCalls[len(m.ExpectedCalls)-1].Run = fn
- return m
-}
-
-/*
- Recording and responding to activity
-*/
-
-func (m *Mock) findExpectedCall(method string, arguments ...interface{}) (int, *Call) {
- for i, call := range m.ExpectedCalls {
- if call.Method == method && call.Repeatability > -1 {
-
- _, diffCount := call.Arguments.Diff(arguments)
- if diffCount == 0 {
- return i, &call
- }
-
- }
- }
- return -1, nil
-}
-
-func (m *Mock) findClosestCall(method string, arguments ...interface{}) (bool, *Call) {
-
- diffCount := 0
- var closestCall *Call = nil
-
- for _, call := range m.ExpectedCalls {
- if call.Method == method {
-
- _, tempDiffCount := call.Arguments.Diff(arguments)
- if tempDiffCount < diffCount || diffCount == 0 {
- diffCount = tempDiffCount
- closestCall = &call
- }
-
- }
- }
-
- if closestCall == nil {
- return false, nil
- }
-
- return true, closestCall
-}
-
-func callString(method string, arguments Arguments, includeArgumentValues bool) string {
-
- var argValsString string = ""
- if includeArgumentValues {
- var argVals []string
- for argIndex, arg := range arguments {
- argVals = append(argVals, fmt.Sprintf("%d: %v", argIndex, arg))
- }
- argValsString = fmt.Sprintf("\n\t\t%s", strings.Join(argVals, "\n\t\t"))
- }
-
- return fmt.Sprintf("%s(%s)%s", method, arguments.String(), argValsString)
-}
-
-// Called tells the mock object that a method has been called, and gets an array
-// of arguments to return. Panics if the call is unexpected (i.e. not preceeded by
-// appropriate .On .Return() calls)
-// If Call.WaitFor is set, blocks until the channel is closed or receives a message.
-func (m *Mock) Called(arguments ...interface{}) Arguments {
- defer m.mutex.Unlock()
- m.mutex.Lock()
-
- // get the calling function's name
- pc, _, _, ok := runtime.Caller(1)
- if !ok {
- panic("Couldn't get the caller information")
- }
- functionPath := runtime.FuncForPC(pc).Name()
- parts := strings.Split(functionPath, ".")
- functionName := parts[len(parts)-1]
-
- found, call := m.findExpectedCall(functionName, arguments...)
-
- switch {
- case found < 0:
- // we have to fail here - because we don't know what to do
- // as the return arguments. This is because:
- //
- // a) this is a totally unexpected call to this method,
- // b) the arguments are not what was expected, or
- // c) the developer has forgotten to add an accompanying On...Return pair.
-
- closestFound, closestCall := m.findClosestCall(functionName, arguments...)
-
- if closestFound {
- panic(fmt.Sprintf("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n", callString(functionName, arguments, true), callString(functionName, closestCall.Arguments, true)))
- } else {
- panic(fmt.Sprintf("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", functionName, functionName, callString(functionName, arguments, true), assert.CallerInfo()))
- }
- case call.Repeatability == 1:
- call.Repeatability = -1
- m.ExpectedCalls[found] = *call
- case call.Repeatability > 1:
- call.Repeatability -= 1
- m.ExpectedCalls[found] = *call
- }
-
- // add the call
- m.Calls = append(m.Calls, Call{functionName, arguments, make([]interface{}, 0), 0, nil, nil})
-
- // block if specified
- if call.WaitFor != nil {
- <-call.WaitFor
- }
-
- if call.Run != nil {
- call.Run(arguments)
- }
-
- return call.ReturnArguments
-
-}
-
-/*
- Assertions
-*/
-
-// AssertExpectationsForObjects asserts that everything specified with On and Return
-// of the specified objects was in fact called as expected.
-//
-// Calls may have occurred in any order.
-func AssertExpectationsForObjects(t TestingT, testObjects ...interface{}) bool {
- var success bool = true
- for _, obj := range testObjects {
- mockObj := obj.(Mock)
- success = success && mockObj.AssertExpectations(t)
- }
- return success
-}
-
-// AssertExpectations asserts that everything specified with On and Return was
-// in fact called as expected. Calls may have occurred in any order.
-func (m *Mock) AssertExpectations(t TestingT) bool {
-
- var somethingMissing bool = false
- var failedExpectations int = 0
-
- // iterate through each expectation
- for _, expectedCall := range m.ExpectedCalls {
- switch {
- case !m.methodWasCalled(expectedCall.Method, expectedCall.Arguments):
- somethingMissing = true
- failedExpectations++
- t.Logf("\u274C\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String())
- case expectedCall.Repeatability > 0:
- somethingMissing = true
- failedExpectations++
- default:
- t.Logf("\u2705\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String())
- }
- }
-
- if somethingMissing {
- t.Errorf("FAIL: %d out of %d expectation(s) were met.\n\tThe code you are testing needs to make %d more call(s).\n\tat: %s", len(m.ExpectedCalls)-failedExpectations, len(m.ExpectedCalls), failedExpectations, assert.CallerInfo())
- }
-
- return !somethingMissing
-}
-
-// AssertNumberOfCalls asserts that the method was called expectedCalls times.
-func (m *Mock) AssertNumberOfCalls(t TestingT, methodName string, expectedCalls int) bool {
- var actualCalls int = 0
- for _, call := range m.Calls {
- if call.Method == methodName {
- actualCalls++
- }
- }
- return assert.Equal(t, actualCalls, expectedCalls, fmt.Sprintf("Expected number of calls (%d) does not match the actual number of calls (%d).", expectedCalls, actualCalls))
-}
-
-// AssertCalled asserts that the method was called.
-func (m *Mock) AssertCalled(t TestingT, methodName string, arguments ...interface{}) bool {
- if !assert.True(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method should have been called with %d argument(s), but was not.", methodName, len(arguments))) {
- t.Logf("%v", m.ExpectedCalls)
- return false
- }
- return true
-}
-
-// AssertNotCalled asserts that the method was not called.
-func (m *Mock) AssertNotCalled(t TestingT, methodName string, arguments ...interface{}) bool {
- if !assert.False(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method was called with %d argument(s), but should NOT have been.", methodName, len(arguments))) {
- t.Logf("%v", m.ExpectedCalls)
- return false
- }
- return true
-}
-
-func (m *Mock) methodWasCalled(methodName string, expected []interface{}) bool {
- for _, call := range m.Calls {
- if call.Method == methodName {
-
- _, differences := Arguments(expected).Diff(call.Arguments)
-
- if differences == 0 {
- // found the expected call
- return true
- }
-
- }
- }
- // we didn't find the expected call
- return false
-}
-
-/*
- Arguments
-*/
-
-// Arguments holds an array of method arguments or return values.
-type Arguments []interface{}
-
-const (
- // The "any" argument. Used in Diff and Assert when
- // the argument being tested shouldn't be taken into consideration.
- Anything string = "mock.Anything"
-)
-
-// AnythingOfTypeArgument is a string that contains the type of an argument
-// for use when type checking. Used in Diff and Assert.
-type AnythingOfTypeArgument string
-
-// AnythingOfType returns an AnythingOfTypeArgument object containing the
-// name of the type to check for. Used in Diff and Assert.
-//
-// For example:
-// Assert(t, AnythingOfType("string"), AnythingOfType("int"))
-func AnythingOfType(t string) AnythingOfTypeArgument {
- return AnythingOfTypeArgument(t)
-}
-
-// Get Returns the argument at the specified index.
-func (args Arguments) Get(index int) interface{} {
- if index+1 > len(args) {
- panic(fmt.Sprintf("assert: arguments: Cannot call Get(%d) because there are %d argument(s).", index, len(args)))
- }
- return args[index]
-}
-
-// Is gets whether the objects match the arguments specified.
-func (args Arguments) Is(objects ...interface{}) bool {
- for i, obj := range args {
- if obj != objects[i] {
- return false
- }
- }
- return true
-}
-
-// Diff gets a string describing the differences between the arguments
-// and the specified objects.
-//
-// Returns the diff string and number of differences found.
-func (args Arguments) Diff(objects []interface{}) (string, int) {
-
- var output string = "\n"
- var differences int
-
- var maxArgCount int = len(args)
- if len(objects) > maxArgCount {
- maxArgCount = len(objects)
- }
-
- for i := 0; i < maxArgCount; i++ {
- var actual, expected interface{}
-
- if len(objects) <= i {
- actual = "(Missing)"
- } else {
- actual = objects[i]
- }
-
- if len(args) <= i {
- expected = "(Missing)"
- } else {
- expected = args[i]
- }
-
- if reflect.TypeOf(expected) == reflect.TypeOf((*AnythingOfTypeArgument)(nil)).Elem() {
-
- // type checking
- if reflect.TypeOf(actual).Name() != string(expected.(AnythingOfTypeArgument)) && reflect.TypeOf(actual).String() != string(expected.(AnythingOfTypeArgument)) {
- // not match
- differences++
- output = fmt.Sprintf("%s\t%d: \u274C type %s != type %s - %s\n", output, i, expected, reflect.TypeOf(actual).Name(), actual)
- }
-
- } else {
-
- // normal checking
-
- if assert.ObjectsAreEqual(expected, Anything) || assert.ObjectsAreEqual(actual, Anything) || assert.ObjectsAreEqual(actual, expected) {
- // match
- output = fmt.Sprintf("%s\t%d: \u2705 %s == %s\n", output, i, actual, expected)
- } else {
- // not match
- differences++
- output = fmt.Sprintf("%s\t%d: \u274C %s != %s\n", output, i, actual, expected)
- }
- }
-
- }
-
- if differences == 0 {
- return "No differences.", differences
- }
-
- return output, differences
-
-}
-
-// Assert compares the arguments with the specified objects and fails if
-// they do not exactly match.
-func (args Arguments) Assert(t TestingT, objects ...interface{}) bool {
-
- // get the differences
- diff, diffCount := args.Diff(objects)
-
- if diffCount == 0 {
- return true
- }
-
- // there are differences... report them...
- t.Logf(diff)
- t.Errorf("%sArguments do not match.", assert.CallerInfo())
-
- return false
-
-}
-
-// String gets the argument at the specified index. Panics if there is no argument, or
-// if the argument is of the wrong type.
-//
-// If no index is provided, String() returns a complete string representation
-// of the arguments.
-func (args Arguments) String(indexOrNil ...int) string {
-
- if len(indexOrNil) == 0 {
- // normal String() method - return a string representation of the args
- var argsStr []string
- for _, arg := range args {
- argsStr = append(argsStr, fmt.Sprintf("%s", reflect.TypeOf(arg)))
- }
- return strings.Join(argsStr, ",")
- } else if len(indexOrNil) == 1 {
- // Index has been specified - get the argument at that index
- var index int = indexOrNil[0]
- var s string
- var ok bool
- if s, ok = args.Get(index).(string); !ok {
- panic(fmt.Sprintf("assert: arguments: String(%d) failed because object wasn't correct type: %s", index, args.Get(index)))
- }
- return s
- }
-
- panic(fmt.Sprintf("assert: arguments: Wrong number of arguments passed to String. Must be 0 or 1, not %d", len(indexOrNil)))
-
-}
-
-// Int gets the argument at the specified index. Panics if there is no argument, or
-// if the argument is of the wrong type.
-func (args Arguments) Int(index int) int {
- var s int
- var ok bool
- if s, ok = args.Get(index).(int); !ok {
- panic(fmt.Sprintf("assert: arguments: Int(%d) failed because object wasn't correct type: %v", index, args.Get(index)))
- }
- return s
-}
-
-// Error gets the argument at the specified index. Panics if there is no argument, or
-// if the argument is of the wrong type.
-func (args Arguments) Error(index int) error {
- obj := args.Get(index)
- var s error
- var ok bool
- if obj == nil {
- return nil
- }
- if s, ok = obj.(error); !ok {
- panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index)))
- }
- return s
-}
-
-// Bool gets the argument at the specified index. Panics if there is no argument, or
-// if the argument is of the wrong type.
-func (args Arguments) Bool(index int) bool {
- var s bool
- var ok bool
- if s, ok = args.Get(index).(bool); !ok {
- panic(fmt.Sprintf("assert: arguments: Bool(%d) failed because object wasn't correct type: %v", index, args.Get(index)))
- }
- return s
-}
diff --git a/vendor/github.com/stretchr/testify/mock/mock_test.go b/vendor/github.com/stretchr/testify/mock/mock_test.go
deleted file mode 100644
index 053942a51..000000000
--- a/vendor/github.com/stretchr/testify/mock/mock_test.go
+++ /dev/null
@@ -1,794 +0,0 @@
-package mock
-
-import (
- "errors"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/stretchr/testify/assert"
- "testing"
- "time"
-)
-
-/*
- Test objects
-*/
-
-// ExampleInterface represents an example interface.
-type ExampleInterface interface {
- TheExampleMethod(a, b, c int) (int, error)
-}
-
-// TestExampleImplementation is a test implementation of ExampleInterface
-type TestExampleImplementation struct {
- Mock
-}
-
-func (i *TestExampleImplementation) TheExampleMethod(a, b, c int) (int, error) {
- args := i.Called(a, b, c)
- return args.Int(0), errors.New("Whoops")
-}
-
-func (i *TestExampleImplementation) TheExampleMethod2(yesorno bool) {
- i.Called(yesorno)
-}
-
-type ExampleType struct {
- ran bool
-}
-
-func (i *TestExampleImplementation) TheExampleMethod3(et *ExampleType) error {
- args := i.Called(et)
- return args.Error(0)
-}
-
-/*
- Mock
-*/
-
-func Test_Mock_TestData(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- if assert.NotNil(t, mockedService.TestData()) {
-
- mockedService.TestData().Set("something", 123)
- assert.Equal(t, 123, mockedService.TestData().Get("something").Data())
-
- }
-
-}
-
-func Test_Mock_On(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- assert.Equal(t, mockedService.On("TheExampleMethod"), &mockedService.Mock)
- assert.Equal(t, "TheExampleMethod", mockedService.onMethodName)
-
-}
-
-func Test_Mock_On_WithArgs(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- assert.Equal(t, mockedService.On("TheExampleMethod", 1, 2, 3), &mockedService.Mock)
- assert.Equal(t, "TheExampleMethod", mockedService.onMethodName)
- assert.Equal(t, 1, mockedService.onMethodArguments[0])
- assert.Equal(t, 2, mockedService.onMethodArguments[1])
- assert.Equal(t, 3, mockedService.onMethodArguments[2])
-
-}
-
-func Test_Mock_Return(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- assert.Equal(t, mockedService.On("TheExampleMethod", "A", "B", true).Return(1, "two", true), &mockedService.Mock)
-
- // ensure the call was created
- if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) {
- call := mockedService.ExpectedCalls[0]
-
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 0, call.Repeatability)
- assert.Nil(t, call.WaitFor)
-
- }
-
-}
-
-func Test_Mock_Return_WaitUntil(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
- ch := time.After(time.Second)
-
- assert.Equal(t, mockedService.Mock.On("TheExampleMethod", "A", "B", true).Return(1, "two", true).WaitUntil(ch), &mockedService.Mock)
-
- // ensure the call was created
- if assert.Equal(t, 1, len(mockedService.Mock.ExpectedCalls)) {
- call := mockedService.Mock.ExpectedCalls[0]
-
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 0, call.Repeatability)
- assert.Equal(t, ch, call.WaitFor)
-
- }
-
-}
-
-func Test_Mock_Return_After(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- assert.Equal(t, mockedService.Mock.On("TheExampleMethod", "A", "B", true).Return(1, "two", true).After(time.Second), &mockedService.Mock)
-
- // ensure the call was created
- if assert.Equal(t, 1, len(mockedService.Mock.ExpectedCalls)) {
- call := mockedService.Mock.ExpectedCalls[0]
-
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 0, call.Repeatability)
- assert.NotEqual(t, nil, call.WaitFor)
-
- }
-
-}
-
-func Test_Mock_Return_Run(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- assert.Equal(t, mockedService.Mock.On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).Return(nil).Run(func(args Arguments) {
- arg := args.Get(0).(*ExampleType)
- arg.ran = true
- }), &mockedService.Mock)
-
- // ensure the call was created
- if assert.Equal(t, 1, len(mockedService.Mock.ExpectedCalls)) {
- call := mockedService.Mock.ExpectedCalls[0]
-
- assert.Equal(t, "TheExampleMethod3", call.Method)
- assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0])
- assert.Equal(t, nil, call.ReturnArguments[0])
- assert.Equal(t, 0, call.Repeatability)
- assert.NotEqual(t, nil, call.WaitFor)
- assert.NotNil(t, call.Run)
-
- }
-
- et := ExampleType{}
- assert.Equal(t, false, et.ran)
- mockedService.TheExampleMethod3(&et)
- assert.Equal(t, true, et.ran)
-
-}
-
-func Test_Mock_Return_Once(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("TheExampleMethod", "A", "B", true).Return(1, "two", true).Once()
-
- // ensure the call was created
- if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) {
- call := mockedService.ExpectedCalls[0]
-
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 1, call.Repeatability)
- assert.Nil(t, call.WaitFor)
-
- }
-
-}
-
-func Test_Mock_Return_Twice(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("TheExampleMethod", "A", "B", true).Return(1, "two", true).Twice()
-
- // ensure the call was created
- if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) {
- call := mockedService.ExpectedCalls[0]
-
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 2, call.Repeatability)
- assert.Nil(t, call.WaitFor)
-
- }
-
-}
-
-func Test_Mock_Return_Times(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("TheExampleMethod", "A", "B", true).Return(1, "two", true).Times(5)
-
- // ensure the call was created
- if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) {
- call := mockedService.ExpectedCalls[0]
-
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 5, call.Repeatability)
- assert.Nil(t, call.WaitFor)
-
- }
-
-}
-
-func Test_Mock_Return_Nothing(t *testing.T) {
-
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- assert.Equal(t, mockedService.On("TheExampleMethod", "A", "B", true).Return(), &mockedService.Mock)
-
- // ensure the call was created
- if assert.Equal(t, 1, len(mockedService.ExpectedCalls)) {
- call := mockedService.ExpectedCalls[0]
-
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 0, len(call.ReturnArguments))
-
- }
-
-}
-
-func Test_Mock_findExpectedCall(t *testing.T) {
-
- m := new(Mock)
- m.On("One", 1).Return("one")
- m.On("Two", 2).Return("two")
- m.On("Two", 3).Return("three")
-
- f, c := m.findExpectedCall("Two", 3)
-
- if assert.Equal(t, 2, f) {
- if assert.NotNil(t, c) {
- assert.Equal(t, "Two", c.Method)
- assert.Equal(t, 3, c.Arguments[0])
- assert.Equal(t, "three", c.ReturnArguments[0])
- }
- }
-
-}
-
-func Test_Mock_findExpectedCall_For_Unknown_Method(t *testing.T) {
-
- m := new(Mock)
- m.On("One", 1).Return("one")
- m.On("Two", 2).Return("two")
- m.On("Two", 3).Return("three")
-
- f, _ := m.findExpectedCall("Two")
-
- assert.Equal(t, -1, f)
-
-}
-
-func Test_Mock_findExpectedCall_Respects_Repeatability(t *testing.T) {
-
- m := new(Mock)
- m.On("One", 1).Return("one")
- m.On("Two", 2).Return("two").Once()
- m.On("Two", 3).Return("three").Twice()
- m.On("Two", 3).Return("three").Times(8)
-
- f, c := m.findExpectedCall("Two", 3)
-
- if assert.Equal(t, 2, f) {
- if assert.NotNil(t, c) {
- assert.Equal(t, "Two", c.Method)
- assert.Equal(t, 3, c.Arguments[0])
- assert.Equal(t, "three", c.ReturnArguments[0])
- }
- }
-
-}
-
-func Test_callString(t *testing.T) {
-
- assert.Equal(t, `Method(int,bool,string)`, callString("Method", []interface{}{1, true, "something"}, false))
-
-}
-
-func Test_Mock_Called(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_Called", 1, 2, 3).Return(5, "6", true)
-
- returnArguments := mockedService.Called(1, 2, 3)
-
- if assert.Equal(t, 1, len(mockedService.Calls)) {
- assert.Equal(t, "Test_Mock_Called", mockedService.Calls[0].Method)
- assert.Equal(t, 1, mockedService.Calls[0].Arguments[0])
- assert.Equal(t, 2, mockedService.Calls[0].Arguments[1])
- assert.Equal(t, 3, mockedService.Calls[0].Arguments[2])
- }
-
- if assert.Equal(t, 3, len(returnArguments)) {
- assert.Equal(t, 5, returnArguments[0])
- assert.Equal(t, "6", returnArguments[1])
- assert.Equal(t, true, returnArguments[2])
- }
-
-}
-
-func asyncCall(m *Mock, ch chan Arguments) {
- ch <- m.Called(1, 2, 3)
-}
-
-func Test_Mock_Called_blocks(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.Mock.On("asyncCall", 1, 2, 3).Return(5, "6", true).After(2 * time.Millisecond)
-
- ch := make(chan Arguments)
-
- go asyncCall(&mockedService.Mock, ch)
-
- select {
- case <-ch:
- t.Fatal("should have waited")
- case <-time.After(1 * time.Millisecond):
- }
-
- returnArguments := <-ch
-
- if assert.Equal(t, 1, len(mockedService.Mock.Calls)) {
- assert.Equal(t, "asyncCall", mockedService.Mock.Calls[0].Method)
- assert.Equal(t, 1, mockedService.Mock.Calls[0].Arguments[0])
- assert.Equal(t, 2, mockedService.Mock.Calls[0].Arguments[1])
- assert.Equal(t, 3, mockedService.Mock.Calls[0].Arguments[2])
- }
-
- if assert.Equal(t, 3, len(returnArguments)) {
- assert.Equal(t, 5, returnArguments[0])
- assert.Equal(t, "6", returnArguments[1])
- assert.Equal(t, true, returnArguments[2])
- }
-
-}
-
-func Test_Mock_Called_For_Bounded_Repeatability(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).Return(5, "6", true).Once()
- mockedService.On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).Return(-1, "hi", false)
-
- returnArguments1 := mockedService.Called(1, 2, 3)
- returnArguments2 := mockedService.Called(1, 2, 3)
-
- if assert.Equal(t, 2, len(mockedService.Calls)) {
- assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[0].Method)
- assert.Equal(t, 1, mockedService.Calls[0].Arguments[0])
- assert.Equal(t, 2, mockedService.Calls[0].Arguments[1])
- assert.Equal(t, 3, mockedService.Calls[0].Arguments[2])
-
- assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[1].Method)
- assert.Equal(t, 1, mockedService.Calls[1].Arguments[0])
- assert.Equal(t, 2, mockedService.Calls[1].Arguments[1])
- assert.Equal(t, 3, mockedService.Calls[1].Arguments[2])
- }
-
- if assert.Equal(t, 3, len(returnArguments1)) {
- assert.Equal(t, 5, returnArguments1[0])
- assert.Equal(t, "6", returnArguments1[1])
- assert.Equal(t, true, returnArguments1[2])
- }
-
- if assert.Equal(t, 3, len(returnArguments2)) {
- assert.Equal(t, -1, returnArguments2[0])
- assert.Equal(t, "hi", returnArguments2[1])
- assert.Equal(t, false, returnArguments2[2])
- }
-
-}
-
-func Test_Mock_Called_For_SetTime_Expectation(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("TheExampleMethod", 1, 2, 3).Return(5, "6", true).Times(4)
-
- mockedService.TheExampleMethod(1, 2, 3)
- mockedService.TheExampleMethod(1, 2, 3)
- mockedService.TheExampleMethod(1, 2, 3)
- mockedService.TheExampleMethod(1, 2, 3)
- assert.Panics(t, func() {
- mockedService.TheExampleMethod(1, 2, 3)
- })
-
-}
-
-func Test_Mock_Called_Unexpected(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- // make sure it panics if no expectation was made
- assert.Panics(t, func() {
- mockedService.Called(1, 2, 3)
- }, "Calling unexpected method should panic")
-
-}
-
-func Test_AssertExpectationsForObjects_Helper(t *testing.T) {
-
- var mockedService1 *TestExampleImplementation = new(TestExampleImplementation)
- var mockedService2 *TestExampleImplementation = new(TestExampleImplementation)
- var mockedService3 *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService1.On("Test_AssertExpectationsForObjects_Helper", 1).Return()
- mockedService2.On("Test_AssertExpectationsForObjects_Helper", 2).Return()
- mockedService3.On("Test_AssertExpectationsForObjects_Helper", 3).Return()
-
- mockedService1.Called(1)
- mockedService2.Called(2)
- mockedService3.Called(3)
-
- assert.True(t, AssertExpectationsForObjects(t, mockedService1.Mock, mockedService2.Mock, mockedService3.Mock))
-
-}
-
-func Test_AssertExpectationsForObjects_Helper_Failed(t *testing.T) {
-
- var mockedService1 *TestExampleImplementation = new(TestExampleImplementation)
- var mockedService2 *TestExampleImplementation = new(TestExampleImplementation)
- var mockedService3 *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService1.On("Test_AssertExpectationsForObjects_Helper_Failed", 1).Return()
- mockedService2.On("Test_AssertExpectationsForObjects_Helper_Failed", 2).Return()
- mockedService3.On("Test_AssertExpectationsForObjects_Helper_Failed", 3).Return()
-
- mockedService1.Called(1)
- mockedService3.Called(3)
-
- tt := new(testing.T)
- assert.False(t, AssertExpectationsForObjects(tt, mockedService1.Mock, mockedService2.Mock, mockedService3.Mock))
-
-}
-
-func Test_Mock_AssertExpectations(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_AssertExpectations", 1, 2, 3).Return(5, 6, 7)
-
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
-
- // make the call now
- mockedService.Called(1, 2, 3)
-
- // now assert expectations
- assert.True(t, mockedService.AssertExpectations(tt))
-
-}
-
-func Test_Mock_AssertExpectationsCustomType(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).Return(nil).Once()
-
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
-
- // make the call now
- mockedService.TheExampleMethod3(&ExampleType{})
-
- // now assert expectations
- assert.True(t, mockedService.AssertExpectations(tt))
-
-}
-
-func Test_Mock_AssertExpectations_With_Repeatability(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_AssertExpectations_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Twice()
-
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
-
- // make the call now
- mockedService.Called(1, 2, 3)
-
- assert.False(t, mockedService.AssertExpectations(tt))
-
- mockedService.Called(1, 2, 3)
-
- // now assert expectations
- assert.True(t, mockedService.AssertExpectations(tt))
-
-}
-
-func Test_Mock_TwoCallsWithDifferentArguments(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 1, 2, 3).Return(5, 6, 7)
- mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 4, 5, 6).Return(5, 6, 7)
-
- args1 := mockedService.Called(1, 2, 3)
- assert.Equal(t, 5, args1.Int(0))
- assert.Equal(t, 6, args1.Int(1))
- assert.Equal(t, 7, args1.Int(2))
-
- args2 := mockedService.Called(4, 5, 6)
- assert.Equal(t, 5, args2.Int(0))
- assert.Equal(t, 6, args2.Int(1))
- assert.Equal(t, 7, args2.Int(2))
-
-}
-
-func Test_Mock_AssertNumberOfCalls(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_AssertNumberOfCalls", 1, 2, 3).Return(5, 6, 7)
-
- mockedService.Called(1, 2, 3)
- assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 1))
-
- mockedService.Called(1, 2, 3)
- assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 2))
-
-}
-
-func Test_Mock_AssertCalled(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_AssertCalled", 1, 2, 3).Return(5, 6, 7)
-
- mockedService.Called(1, 2, 3)
-
- assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled", 1, 2, 3))
-
-}
-
-func Test_Mock_AssertCalled_WithAnythingOfTypeArgument(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_AssertCalled_WithAnythingOfTypeArgument", Anything, Anything, Anything).Return()
-
- mockedService.Called(1, "two", []uint8("three"))
-
- assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled_WithAnythingOfTypeArgument", AnythingOfType("int"), AnythingOfType("string"), AnythingOfType("[]uint8")))
-
-}
-
-func Test_Mock_AssertCalled_WithArguments(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_AssertCalled_WithArguments", 1, 2, 3).Return(5, 6, 7)
-
- mockedService.Called(1, 2, 3)
-
- tt := new(testing.T)
- assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 1, 2, 3))
- assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 2, 3, 4))
-
-}
-
-func Test_Mock_AssertCalled_WithArguments_With_Repeatability(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Once()
- mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4).Return(5, 6, 7).Once()
-
- mockedService.Called(1, 2, 3)
- mockedService.Called(2, 3, 4)
-
- tt := new(testing.T)
- assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3))
- assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4))
- assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 3, 4, 5))
-
-}
-
-func Test_Mock_AssertNotCalled(t *testing.T) {
-
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
-
- mockedService.On("Test_Mock_AssertNotCalled", 1, 2, 3).Return(5, 6, 7)
-
- mockedService.Called(1, 2, 3)
-
- assert.True(t, mockedService.AssertNotCalled(t, "Test_Mock_NotCalled"))
-
-}
-
-/*
- Arguments helper methods
-*/
-func Test_Arguments_Get(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
-
- assert.Equal(t, "string", args.Get(0).(string))
- assert.Equal(t, 123, args.Get(1).(int))
- assert.Equal(t, true, args.Get(2).(bool))
-
-}
-
-func Test_Arguments_Is(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
-
- assert.True(t, args.Is("string", 123, true))
- assert.False(t, args.Is("wrong", 456, false))
-
-}
-
-func Test_Arguments_Diff(t *testing.T) {
-
- var args Arguments = []interface{}{"Hello World", 123, true}
- var diff string
- var count int
- diff, count = args.Diff([]interface{}{"Hello World", 456, "false"})
-
- assert.Equal(t, 2, count)
- assert.Contains(t, diff, `%!s(int=456) != %!s(int=123)`)
- assert.Contains(t, diff, `false != %!s(bool=true)`)
-
-}
-
-func Test_Arguments_Diff_DifferentNumberOfArgs(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
- var diff string
- var count int
- diff, count = args.Diff([]interface{}{"string", 456, "false", "extra"})
-
- assert.Equal(t, 3, count)
- assert.Contains(t, diff, `extra != (Missing)`)
-
-}
-
-func Test_Arguments_Diff_WithAnythingArgument(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
- var count int
- _, count = args.Diff([]interface{}{"string", Anything, true})
-
- assert.Equal(t, 0, count)
-
-}
-
-func Test_Arguments_Diff_WithAnythingArgument_InActualToo(t *testing.T) {
-
- var args Arguments = []interface{}{"string", Anything, true}
- var count int
- _, count = args.Diff([]interface{}{"string", 123, true})
-
- assert.Equal(t, 0, count)
-
-}
-
-func Test_Arguments_Diff_WithAnythingOfTypeArgument(t *testing.T) {
-
- var args Arguments = []interface{}{"string", AnythingOfType("int"), true}
- var count int
- _, count = args.Diff([]interface{}{"string", 123, true})
-
- assert.Equal(t, 0, count)
-
-}
-
-func Test_Arguments_Diff_WithAnythingOfTypeArgument_Failing(t *testing.T) {
-
- var args Arguments = []interface{}{"string", AnythingOfType("string"), true}
- var count int
- var diff string
- diff, count = args.Diff([]interface{}{"string", 123, true})
-
- assert.Equal(t, 1, count)
- assert.Contains(t, diff, `string != type int - %!s(int=123)`)
-
-}
-
-func Test_Arguments_Assert(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
-
- assert.True(t, args.Assert(t, "string", 123, true))
-
-}
-
-func Test_Arguments_String_Representation(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
- assert.Equal(t, `string,int,bool`, args.String())
-
-}
-
-func Test_Arguments_String(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
- assert.Equal(t, "string", args.String(0))
-
-}
-
-func Test_Arguments_Error(t *testing.T) {
-
- var err error = errors.New("An Error")
- var args Arguments = []interface{}{"string", 123, true, err}
- assert.Equal(t, err, args.Error(3))
-
-}
-
-func Test_Arguments_Error_Nil(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true, nil}
- assert.Equal(t, nil, args.Error(3))
-
-}
-
-func Test_Arguments_Int(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
- assert.Equal(t, 123, args.Int(1))
-
-}
-
-func Test_Arguments_Bool(t *testing.T) {
-
- var args Arguments = []interface{}{"string", 123, true}
- assert.Equal(t, true, args.Bool(2))
-
-}
diff --git a/vendor/github.com/franela/goblin/LICENSE b/vendor/github.com/tobi/airbrake-go/LICENSE
similarity index 94%
rename from vendor/github.com/franela/goblin/LICENSE
rename to vendor/github.com/tobi/airbrake-go/LICENSE
index b2d652206..91ec67707 100644
--- a/vendor/github.com/franela/goblin/LICENSE
+++ b/vendor/github.com/tobi/airbrake-go/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2013 Marcos Lilljedahl and Jonathan Leibiusky
+Copyright (c) 2015 Tobias Lütke
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/github.com/tobi/airbrake-go/README b/vendor/github.com/tobi/airbrake-go/README
new file mode 100644
index 000000000..771c633bf
--- /dev/null
+++ b/vendor/github.com/tobi/airbrake-go/README
@@ -0,0 +1,28 @@
+Config
+======
+
+set airbrake.Endpoint and airbrake.ApiKey globals
+
+Methods
+=======
+
+airbrake.Error(err) reports an error
+
+airbrake.RequestError(err, *http.Request) can be used to add more context if you are in a http context
+
+
+You can also automatically have this library report panics, use this method:
+
+airbrake.CapturePanic(*http.Request)
+
+
+example:
+
+ func serve(w http.ResponseWriter, r *http.Request) {
+ defer airbrake.CapturePanic(r)
+
+ [...]
+
+ panic("Oh no :-(") // will be recorded by airbrake
+
+ }
\ No newline at end of file
diff --git a/vendor/github.com/tobi/airbrake-go/airbrake.go b/vendor/github.com/tobi/airbrake-go/airbrake.go
new file mode 100644
index 000000000..ab02d5178
--- /dev/null
+++ b/vendor/github.com/tobi/airbrake-go/airbrake.go
@@ -0,0 +1,263 @@
+package airbrake
+
+import (
+ "bytes"
+ "errors"
+ "io/ioutil"
+ "log"
+ "net/http"
+ "os"
+ "reflect"
+ "regexp"
+ "runtime"
+ "sync"
+ "text/template"
+)
+
+var (
+ ApiKey = ""
+ Endpoint = "https://api.airbrake.io/notifier_api/v2/notices"
+ Environment = "development"
+ Verbose = false
+
+ // PrettyParams allows including request query/form parameters on the Environment tab
+ // which is more readable than the raw text of the Parameters tab (in Errbit).
+ // The param keys will be rendered as "?" so they will sort together at the top of the tab.
+ PrettyParams = false
+
+ sensitive = regexp.MustCompile(`password|token|secret|key`)
+ badResponse = errors.New("Bad response")
+ apiKeyMissing = errors.New("Please set the airbrake.ApiKey before doing calls")
+ dunno = []byte("???")
+ centerDot = []byte("·")
+ dot = []byte(".")
+ tmpl = template.Must(template.New("error").Parse(source))
+)
+
+type Line struct {
+ Function string
+ File string
+ Line int
+}
+
+// stack implements Stack, skipping N frames
+func stacktrace(skip int) (lines []Line) {
+ for i := skip; ; i++ {
+ pc, file, line, ok := runtime.Caller(i)
+ if !ok {
+ break
+ }
+
+ item := Line{string(function(pc)), string(file), line}
+
+ // ignore panic method
+ if item.Function != "panic" {
+ lines = append(lines, item)
+ }
+ }
+ return
+}
+
+var channel chan map[string]interface{}
+var once sync.Once
+
+// function returns, if possible, the name of the function containing the PC.
+func function(pc uintptr) []byte {
+ fn := runtime.FuncForPC(pc)
+ if fn == nil {
+ return dunno
+ }
+ name := []byte(fn.Name())
+ // The name includes the path name to the package, which is unnecessary
+ // since the file name is already included. Plus, it has center dots.
+ // That is, we see
+ // runtime/debug.*T·ptrmethod
+ // and want
+ // *T.ptrmethod
+ if period := bytes.Index(name, dot); period >= 0 {
+ name = name[period+1:]
+ }
+ name = bytes.Replace(name, centerDot, dot, -1)
+ return name
+}
+
+func initChannel() {
+ channel = make(chan map[string]interface{}, 100)
+
+ go func() {
+ for params := range channel {
+ post(params)
+ }
+ }()
+}
+
+func post(params map[string]interface{}) error {
+ buffer := bytes.NewBufferString("")
+
+ if err := tmpl.Execute(buffer, params); err != nil {
+ log.Printf("Airbrake error: %s", err)
+ return err
+ }
+
+ if Verbose {
+ log.Printf("Airbrake payload for endpoint %s: %s", Endpoint, buffer)
+ }
+
+ response, err := http.Post(Endpoint, "text/xml", buffer)
+ if err != nil {
+ log.Printf("Airbrake error: %s", err)
+ return err
+ }
+
+ if Verbose {
+ body, _ := ioutil.ReadAll(response.Body)
+ log.Printf("response: %s", body)
+ }
+ response.Body.Close()
+
+ if Verbose {
+ log.Printf("Airbrake post: %s status code: %d", params["Error"], response.StatusCode)
+ }
+
+ return nil
+}
+
+func Error(e error, request *http.Request) error {
+ once.Do(initChannel)
+
+ if ApiKey == "" {
+ return apiKeyMissing
+ }
+
+ return post(params(e, request))
+}
+
+func Notify(e error) error {
+ once.Do(initChannel)
+
+ if ApiKey == "" {
+ return apiKeyMissing
+ }
+
+ return post(params(e, nil))
+}
+
+func params(e error, request *http.Request) map[string]interface{} {
+ params := map[string]interface{}{
+ "Class": reflect.TypeOf(e).String(),
+ "Error": e,
+ "ApiKey": ApiKey,
+ "ErrorName": e.Error(),
+ "Environment": Environment,
+ }
+
+ if params["Class"] == "" {
+ params["Class"] = "Panic"
+ }
+
+ pwd, err := os.Getwd()
+ if err == nil {
+ params["Pwd"] = pwd
+ }
+
+ hostname, err := os.Hostname()
+ if err == nil {
+ params["Hostname"] = hostname
+ }
+
+ params["Backtrace"] = stacktrace(3)
+
+ if request == nil || request.ParseForm() != nil {
+ return params
+ }
+
+ // Compile relevant request parameters into a map.
+ req := make(map[string]interface{})
+ params["Request"] = req
+ req["Component"] = ""
+ req["Action"] = ""
+ // Nested http Muxes muck with the URL, prefer RequestURI.
+ if request.RequestURI != "" {
+ req["URL"] = request.RequestURI
+ } else {
+ req["URL"] = request.URL
+ }
+
+ // Compile header parameters.
+ header := make(map[string]string)
+ req["Header"] = header
+ header["Method"] = request.Method
+ header["Protocol"] = request.Proto
+ for k, v := range request.Header {
+ if !omit(k, v) {
+ header[k] = v[0]
+ }
+ }
+
+ // Compile query/form parameters.
+ form := make(map[string]string)
+ req["Form"] = form
+ for k, v := range request.Form {
+ if !omit(k, v) {
+ form[k] = v[0]
+ if PrettyParams {
+ header["?"+k] = v[0]
+ }
+ }
+ }
+
+ return params
+}
+
+// omit checks the key, values for emptiness or sensitivity.
+func omit(key string, values []string) bool {
+ return len(key) == 0 || len(values) == 0 || len(values[0]) == 0 || sensitive.FindString(key) != ""
+}
+
+func CapturePanic(r *http.Request) {
+ if rec := recover(); rec != nil {
+
+ if err, ok := rec.(error); ok {
+ log.Printf("Recording err %s", err)
+ Error(err, r)
+ } else if err, ok := rec.(string); ok {
+ log.Printf("Recording string %s", err)
+ Error(errors.New(err), r)
+ }
+
+ panic(rec)
+ }
+}
+
+const source = `
+
+ {{ .ApiKey }}
+
+ Airbrake Golang
+ 0.0.1
+ http://airbrake.io
+
+
+ {{ html .Class }}
+ {{ html .ErrorName }}
+ {{ range .Backtrace }}
+ {{ end }}
+
+ {{ with .Request }}
+
+ {{html .URL}}
+ {{ .Component }}
+ {{ .Action }}
+ {{ range $key, $value := .Form }}
+ {{ $value }}{{ end }}
+
+ {{ range $key, $value := .Header }}
+ {{ $value }}{{ end }}
+
+ {{ end }}
+
+ {{ html .Pwd }}
+ {{ .Environment }}
+ {{ html .Hostname }}
+
+`
diff --git a/vendor/github.com/tobi/airbrake-go/airbrake_test.go b/vendor/github.com/tobi/airbrake-go/airbrake_test.go
new file mode 100644
index 000000000..ddd367406
--- /dev/null
+++ b/vendor/github.com/tobi/airbrake-go/airbrake_test.go
@@ -0,0 +1,125 @@
+package airbrake
+
+import (
+ "bytes"
+ "errors"
+ "net/http"
+ "regexp"
+ "testing"
+ "time"
+)
+
+const API_KEY = ""
+
+func TestError(t *testing.T) {
+ Verbose = true
+ ApiKey = API_KEY
+ Endpoint = "https://api.airbrake.io/notifier_api/v2/notices"
+
+ err := Error(errors.New("Test Error"), nil)
+ if err != nil {
+
+ t.Error(err)
+ }
+
+ time.Sleep(1e9)
+}
+
+func TestRequest(t *testing.T) {
+ Verbose = true
+ ApiKey = API_KEY
+ Endpoint = "https://api.airbrake.io/notifier_api/v2/notices"
+
+ request, _ := http.NewRequest("GET", "/some/path?a=1", bytes.NewBufferString(""))
+
+ err := Error(errors.New("Test Error"), request)
+
+ if err != nil {
+ t.Error(err)
+ }
+
+ time.Sleep(1e9)
+}
+
+func TestNotify(t *testing.T) {
+ Verbose = true
+ ApiKey = API_KEY
+ Endpoint = "https://api.airbrake.io/notifier_api/v2/notices"
+
+ err := Notify(errors.New("Test Error"))
+
+ if err != nil {
+ t.Error(err)
+ }
+
+ time.Sleep(1e9)
+}
+
+// Make sure we match https://help.airbrake.io/kb/api-2/notifier-api-version-23
+func TestTemplateV2(t *testing.T) {
+ var p map[string]interface{}
+ request, _ := http.NewRequest("GET", "/query?t=xxx&q=SHOW+x+BY+y+FROM+z&key=sesame&timezone=", nil)
+ request.Header.Set("Host", "Zulu")
+ request.Header.Set("Keep_Secret", "Sesame")
+ PrettyParams = true
+ defer func() { PrettyParams = false }()
+
+ // Trigger and recover a panic, so that we have something to render.
+ func() {
+ defer func() {
+ if r := recover(); r != nil {
+ p = params(r.(error), request)
+ }
+ }()
+ panic(errors.New("Boom!"))
+ }()
+
+ // Did that work?
+ if p == nil {
+ t.Fail()
+ }
+
+ // Crude backtrace check.
+ if len(p["Backtrace"].([]Line)) < 3 {
+ t.Fail()
+ }
+
+ // It's messy to generically test rendered backtrace, drop it.
+ delete(p, "Backtrace")
+
+ // Render the params.
+ var b bytes.Buffer
+ if err := tmpl.Execute(&b, p); err != nil {
+ t.Fatalf("Template error: %s", err)
+ }
+
+ // Validate the node.
+ chunk := regexp.MustCompile(`(?s).*`).FindString(b.String())
+ if chunk != `
+ *errors.errorString
+ Boom!
+ ` {
+ t.Fatal(chunk)
+ }
+
+ // Validate the node.
+ chunk = regexp.MustCompile(`(?s).*`).FindString(b.String())
+ if chunk != `
+ /query?t=xxx&q=SHOW+x+BY+y+FROM+z&key=sesame&timezone=
+
+
+
+ SHOW x BY y FROM z
+ xxx
+
+
+ SHOW x BY y FROM z
+ xxx
+ Zulu
+ GET
+ HTTP/1.1
+
+ ` {
+ t.Fatal(chunk)
+ }
+}
diff --git a/vendor/github.com/tobi/airbrake-go/handler.go b/vendor/github.com/tobi/airbrake-go/handler.go
new file mode 100644
index 000000000..d62e98259
--- /dev/null
+++ b/vendor/github.com/tobi/airbrake-go/handler.go
@@ -0,0 +1,17 @@
+package airbrake
+
+import (
+ "net/http"
+)
+
+// CapturePanicHandler "middleware".
+// Wraps the http handler so that all panics will be dutifully reported to airbrake
+//
+// Example:
+// http.HandleFunc("/", airbrake.CapturePanicHandler(MyServerFunc))
+func CapturePanicHandler(app http.HandlerFunc) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ defer CapturePanic(r)
+ app(w, r)
+ }
+}
diff --git a/vendor/github.com/ungerik/go-gravatar/.gitignore b/vendor/github.com/ungerik/go-gravatar/.gitignore
deleted file mode 100644
index 5422cbd77..000000000
--- a/vendor/github.com/ungerik/go-gravatar/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-#############################
-# OS generated files:
-
-.DS_Store
-Icon?
-Thumbs.db
-
-#############################
-# Dropbox:
-
-.dropbox
-
-#############################
-# Go specific files:
-
-_obj
-_test
-*.[568vq]
-[568vq].out
-*.o
-*.a
-*.so
-*.exe
-
diff --git a/vendor/github.com/ungerik/go-gravatar/LICENSE b/vendor/github.com/ungerik/go-gravatar/LICENSE
deleted file mode 100644
index bf2b7db6b..000000000
--- a/vendor/github.com/ungerik/go-gravatar/LICENSE
+++ /dev/null
@@ -1,9 +0,0 @@
-MIT License:
-
-Copyright (c) 2012 Erik Unger
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/vendor/github.com/ungerik/go-gravatar/README b/vendor/github.com/ungerik/go-gravatar/README
deleted file mode 100644
index 1c335bbef..000000000
--- a/vendor/github.com/ungerik/go-gravatar/README
+++ /dev/null
@@ -1,12 +0,0 @@
-Go wrapper for the Gravatar API.
-
-See: http://en.gravatar.com/site/implement/
-
-MIT License
-Copyright (c) 2012 Erik Unger
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/vendor/github.com/ungerik/go-gravatar/gravatar.go b/vendor/github.com/ungerik/go-gravatar/gravatar.go
deleted file mode 100644
index f39f011b3..000000000
--- a/vendor/github.com/ungerik/go-gravatar/gravatar.go
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
-Wrapper for the Gravatar API.
-
-See: http://en.gravatar.com/site/implement/
-*/
-package gravatar
-
-import (
- "crypto/md5"
- "fmt"
- "net/http"
- "net/url"
- "strings"
-)
-
-// Default images (used as defaultURL)
-const (
- HTTP404 = "404" // do not load any image if none is associated with the email hash, instead return an HTTP 404 (File Not Found) response
- MysteryMan = "mm" // (mystery-man) a simple, cartoon-style silhouetted outline of a person (does not vary by email hash)
- IdentIcon = "identicon" // a geometric pattern based on an email hash
- MonsterID = "monsterid" // a generated 'monster' with different colors, faces, etc
- Wavatar = "wavatar" // generated faces with differing features and backgrounds
- Retro = "retro" // awesome generated, 8-bit arcade-style pixelated faces
-)
-
-func Hash(email string) string {
- email = strings.ToLower(strings.TrimSpace(email))
- hash := md5.New()
- hash.Write([]byte(email))
- return fmt.Sprintf("%x", hash.Sum(nil))
-}
-
-func Url(email string) string {
- return "http://www.gravatar.com/avatar/" + Hash(email)
-}
-
-func UrlDefault(email, defaultURL string) string {
- return Url(email) + "?d=" + url.QueryEscape(defaultURL)
-}
-
-// You may request images anywhere from 1px up to 512px
-func UrlSize(email string, size int) string {
- return fmt.Sprintf("http://www.gravatar.com/avatar/%s?s=%d", Hash(email), size)
-}
-
-func UrlSizeDefault(email string, size int, defaultURL string) string {
- return UrlSize(email, size) + "&d=" + url.QueryEscape(defaultURL)
-}
-
-func SecureUrl(email string) string {
- return "https://secure.gravatar.com/avatar/" + Hash(email)
-}
-
-func SecureUrlDefault(email, defaultURL string) string {
- return SecureUrl(email) + "?d=" + url.QueryEscape(defaultURL)
-}
-
-func SecureUrlSize(email string, size int) string {
- return fmt.Sprintf("https://secure.gravatar.com/avatar/%s?s=%d", Hash(email), size)
-}
-
-func SecureUrlSizeDefault(email string, size int, defaultURL string) string {
- return SecureUrlSize(email, size) + "&d=" + url.QueryEscape(defaultURL)
-}
-
-func Available(email string) (ok bool, err error) {
- url := fmt.Sprintf("http://www.gravatar.com/avatar/%s?d=404", Hash(email))
- response, err := http.Get(url)
- if err != nil {
- return false, err
- }
- return response.StatusCode != 404, nil
-}
diff --git a/vendor/github.com/vrischmann/envconfig/.travis.yml b/vendor/github.com/vrischmann/envconfig/.travis.yml
deleted file mode 100644
index 048470b70..000000000
--- a/vendor/github.com/vrischmann/envconfig/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: go
-
-go:
- - 1.2
- - 1.3
- - 1.4
- - tip
diff --git a/vendor/github.com/vrischmann/envconfig/README.md b/vendor/github.com/vrischmann/envconfig/README.md
deleted file mode 100644
index b8bda0e42..000000000
--- a/vendor/github.com/vrischmann/envconfig/README.md
+++ /dev/null
@@ -1,81 +0,0 @@
-envconfig
-=========
-
-[](https://travis-ci.org/vrischmann/envconfig)
-[](https://godoc.org/github.com/vrischmann/envconfig)
-
-envconfig is a library which allows you to parse your configuration from environment variables and fill an arbitrary struct.
-
-See [the example](https://godoc.org/github.com/vrischmann/envconfig#example-Init) to understand how to use it, it's pretty simple.
-
-Supported types
----------------
-
- * Almost all standard types plus `time.Duration` are supported by default.
- * Slices and arrays
- * Arbitrary structs
- * Custom types via the [Unmarshaler](https://godoc.org/github.com/vrischmann/envconfig/#Unmarshaler) interface.
-
-How does it work
-----------------
-
-*envconfig* takes the hierarchy of your configuration struct and the names of the fields to create a environment variable key.
-
-For example:
-
-```go
-var conf struct {
- Name string
- Shard struct {
- Host string
- Port int
- }
-}
-```
-
-This will check for those 3 keys:
-
- * NAME
- * SHARD\_HOST
- * SHARD\_PORT
-
-With slices or arrays, the same naming is applied for the slice. To put multiple elements into the slice or array, you need to separate
-them with a *,* (will probably be configurable in the future, or at least have a way to escape)
-
-For example:
-
-```go
-var conf struct {
- Ports []int
-}
-```
-
-This will check for the key __PORTS__:
-
- * if your variable is *9000* the slice will contain only 9000
- * if your variable is *9000,100* the slice will contain 9000 and 100
-
-For slices of structs, it's a little more complicated. The same splitting of slice elements is done with a *comma*, however, each token must follow
-a specific format like this: `{,,...}`
-
-For example:
-
-```go
-var conf struct {
- Shards []struct {
- Name string
- Port int
- }
-}
-```
-
-This will check for the key __SHARDS__. Example variable content: `{foobar,9000},{barbaz,20000}`
-
-This will result in two struct defined in the *Shards* slice.
-
-Future work
------------
-
- * support for defaut values ? don't know how to yet
- * support for time.Time values with a layout defined via a field tag
- * support for complex types
diff --git a/vendor/github.com/vrischmann/envconfig/doc.go b/vendor/github.com/vrischmann/envconfig/doc.go
deleted file mode 100644
index 23083a10f..000000000
--- a/vendor/github.com/vrischmann/envconfig/doc.go
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-Package envconfig implements a configuration reader which reads each value from an environment variable.
-
-The basic idea is that you define a configuration struct, like this:
-
- var conf struct {
- Addr string
- Port int
- Auth struct {
- Key string
- Endpoint string
- }
- Partitions []int
- Shards []struct {
- Name string
- Id int
- }
- }
-
-Once you have that, you need to initialize the configuration:
-
- if err := envconfig.Init(&conf); err != nil {
- log.Fatalln(err)
- }
-
-Then it's just a matter of setting the environment variables when calling your binary:
-
- ADDR=localhost PORT=6379 AUTH_KEY=foobar ./mybinary
-
-Layout of the conf struct
-
-Your conf struct must follow the following rules:
- - no unexported fields
- - only supported types (no map fields for example)
-
-Naming of the keys
-
-By default, keys must follow a specific naming scheme:
- - all uppercase
- - a single _ to go down a level in the hierarchy of the struct
-
-Examples:
- - ADDR
- - AUTH_ENDPOINT
- - PARTITIONS
-
-You can override the expected name of the key for a single field using a field tag:
-
- var conf struct {
- Name `envconfig:"customName"`
- }
-
-Now envconfig will read the environment variable named "customName".
-
-Content of the variables
-
-There are three types of content for a single variable:
-
- - for simple types, a single string representing the value, and parseable into the type.
- - for slices or arrays, a comma-separated list of strings. Each string must be parseable into the element type of the slice or array.
- - for structs, a comma-separated list of specially formatted strings representing structs.
-
-Example of a valid slice value:
- foo,bar,baz
-
-The format for a struct is as follow:
- - prefixed with {
- - suffixed with }
- - contains a comma-separated list of field values, in the order in which they are defined in the struct
-
-Example of a valid struct value:
- type MyStruct struct {
- Name string
- Id int
- Timeout time.Duration
- }
-
- {foobar,10,120s}
-
-Example of a valid slice of struct values:
- {foobar,10,120s},{barbaz,20,50s}
-
-Optional values
-
-Sometimes you don't absolutely need a value. Here's how we tell envconfig a value is optional:
-
- var conf struct {
- Name string `envconfig:"optional"`
- }
-
-Supported types
-
- - bool
- - string
- - intX
- - uintX
- - floatX
- - time.Duration
- - pointers to all of the above types
-
-Custom unmarshaler
-
-When the standard types are not enough, you will want to use a custom unmarshaler for your types.
-
-You do this by implementing Unmarshaler on your type. Here's an example:
-
- type connectionType uint
-
- const (
- tlsConnection connectionType = iota
- insecureConnection
- )
-
- func (t *connectionType) Unmarshal(s string) error {
- switch s {
- case "tls":
- *t = tlsConnection
- case "insecure":
- *t = insecureConnection
- default:
- return fmt.Errorf("unable to unmarshal %s to a connection type", s)
- }
-
- return nil
- }
-
-*/
-package envconfig
diff --git a/vendor/github.com/vrischmann/envconfig/envconfig.go b/vendor/github.com/vrischmann/envconfig/envconfig.go
deleted file mode 100644
index e67f39a1f..000000000
--- a/vendor/github.com/vrischmann/envconfig/envconfig.go
+++ /dev/null
@@ -1,350 +0,0 @@
-package envconfig
-
-import (
- "encoding/base64"
- "errors"
- "fmt"
- "os"
- "reflect"
- "strconv"
- "strings"
- "time"
-)
-
-var (
- ErrUnexportedField = errors.New("envconfig: unexported field")
-)
-
-// Unmarshaler is the interface implemented by objects that can unmarshal
-// a environment variable string of themselves.
-type Unmarshaler interface {
- Unmarshal(s string) error
-}
-
-// Init reads the configuration from environment variables and populates the conf object. conf must be a pointer
-func Init(conf interface{}) error {
- return InitWithPrefix(conf, "")
-}
-
-// InitWithPrefix reads the configuration from environment variables and populates the conf object. conf must be a pointer.
-// Each key read will be prefixed with the prefix string.
-func InitWithPrefix(conf interface{}, prefix string) error {
- value := reflect.ValueOf(conf)
- if value.Kind() != reflect.Ptr {
- return errors.New("envconfig: value is not a pointer")
- }
-
- elem := value.Elem()
-
- switch elem.Kind() {
- case reflect.Ptr:
- elem.Set(reflect.New(elem.Type().Elem()))
- return readStruct(elem.Elem(), prefix, false)
- case reflect.Struct:
- return readStruct(elem, prefix, false)
- default:
- return errors.New("envconfig: invalid value kind, only works on structs")
- }
-}
-
-type tag struct {
- customName string
- optional bool
- skip bool
-}
-
-func parseTag(s string) *tag {
- tag := &tag{}
-
- tokens := strings.Split(s, ",")
- if len(tokens) == 0 {
- return tag
- }
-
- for _, v := range tokens {
- switch v {
- case "-":
- tag.skip = true
- case "optional":
- tag.optional = true
- default:
- tag.customName = v
- }
- }
-
- return tag
-}
-
-func readStruct(value reflect.Value, parentName string, optional bool) (err error) {
- for i := 0; i < value.NumField(); i++ {
- field := value.Field(i)
- name := value.Type().Field(i).Name
-
- tag := parseTag(value.Type().Field(i).Tag.Get("envconfig"))
-
- var combinedName string
- if tag.customName != "" {
- combinedName = tag.customName
- } else {
- combinedName = combineName(parentName, name)
- }
-
- if tag.skip {
- continue
- }
-
- doRead:
- switch field.Kind() {
- case reflect.Ptr:
- // it's a pointer, create a new value and restart the switch
- field.Set(reflect.New(field.Type().Elem()))
- field = field.Elem()
- goto doRead
- case reflect.Struct:
- err = readStruct(field, combinedName, optional || tag.optional)
- default:
- err = setField(field, combinedName, tag.customName != "", optional || tag.optional)
- }
-
- if err != nil {
- return err
- }
- }
-
- return
-}
-
-var byteSliceType = reflect.TypeOf([]byte(nil))
-
-func setField(value reflect.Value, name string, customName, optional bool) (err error) {
- str, err := readValue(name, customName, optional)
- if err != nil {
- return err
- }
- if len(str) == 0 && optional {
- return nil
- }
-
- switch value.Kind() {
- case reflect.Slice:
- if value.Type() == byteSliceType {
- return parseBytesValue(value, str)
- }
- return setSliceField(value, str)
- default:
- return parseValue(value, str)
- }
-}
-
-func setSliceField(value reflect.Value, str string) error {
- elType := value.Type().Elem()
- tnz := newSliceTokenizer(str)
-
- slice := reflect.MakeSlice(value.Type(), value.Len(), value.Cap())
-
- for tnz.scan() {
- token := tnz.text()
-
- el := reflect.New(elType).Elem()
-
- if err := parseValue(el, token); err != nil {
- return err
- }
-
- slice = reflect.Append(slice, el)
- }
-
- value.Set(slice)
-
- return tnz.Err()
-}
-
-var (
- durationType = reflect.TypeOf(new(time.Duration)).Elem()
- unmarshalerType = reflect.TypeOf(new(Unmarshaler)).Elem()
-)
-
-func isDurationField(t reflect.Type) bool {
- return t.AssignableTo(durationType)
-}
-
-func isUnmarshaler(t reflect.Type) bool {
- return t.Implements(unmarshalerType) || reflect.PtrTo(t).Implements(unmarshalerType)
-}
-
-func parseValue(v reflect.Value, str string) (err error) {
- if !v.CanSet() {
- return ErrUnexportedField
- }
-
- vtype := v.Type()
-
- // Special case for Unmarshaler
- if isUnmarshaler(vtype) {
- return parseWithUnmarshaler(v, str)
- }
-
- // Special case for time.Duration
- if isDurationField(vtype) {
- return parseDuration(v, str)
- }
-
- kind := vtype.Kind()
- switch kind {
- case reflect.Bool:
- err = parseBoolValue(v, str)
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- err = parseIntValue(v, str)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- err = parseUintValue(v, str)
- case reflect.Float32, reflect.Float64:
- err = parseFloatValue(v, str)
- case reflect.Ptr:
- v.Set(reflect.New(vtype.Elem()))
- return parseValue(v.Elem(), str)
- case reflect.String:
- v.SetString(str)
- case reflect.Struct:
- err = parseStruct(v, str)
- default:
- return fmt.Errorf("envconfig: slice element type %v not supported", kind)
- }
-
- return
-}
-
-func parseWithUnmarshaler(v reflect.Value, str string) error {
- var u Unmarshaler
- vtype := v.Type()
-
- if vtype.Implements(unmarshalerType) {
- u = v.Interface().(Unmarshaler)
- } else if reflect.PtrTo(vtype).Implements(unmarshalerType) {
- // We know the interface has a pointer receiver, but our value might not be a pointer, so we get one
- if v.Kind() != reflect.Ptr {
- u = v.Addr().Interface().(Unmarshaler)
- } else {
- u = v.Interface().(Unmarshaler)
- }
- }
-
- return u.Unmarshal(str)
-}
-
-func parseDuration(v reflect.Value, str string) error {
- d, err := time.ParseDuration(str)
- if err != nil {
- return err
- }
-
- v.SetInt(int64(d))
-
- return nil
-}
-
-func parseStruct(value reflect.Value, token string) error {
- tokens := strings.Split(token[1:len(token)-1], ",")
- if len(tokens) == 0 {
- return errors.New("envconfig: struct token should not be empty")
- }
-
- if len(tokens) != value.NumField() {
- return fmt.Errorf("envconfig: struct token has %d fields but struct has %d",
- len(tokens), value.NumField(),
- )
- }
-
- for i := 0; i < value.NumField(); i++ {
- field := value.Field(i)
- t := tokens[i]
-
- if err := parseValue(field, t); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func parseBoolValue(v reflect.Value, str string) error {
- val, err := strconv.ParseBool(str)
- if err != nil {
- return err
- }
- v.SetBool(val)
-
- return nil
-}
-
-func parseIntValue(v reflect.Value, str string) error {
- val, err := strconv.ParseInt(str, 10, 64)
- if err != nil {
- return err
- }
- v.SetInt(val)
-
- return nil
-}
-
-func parseUintValue(v reflect.Value, str string) error {
- val, err := strconv.ParseUint(str, 10, 64)
- if err != nil {
- return err
- }
- v.SetUint(val)
-
- return nil
-}
-
-func parseFloatValue(v reflect.Value, str string) error {
- val, err := strconv.ParseFloat(str, 64)
- if err != nil {
- return err
- }
- v.SetFloat(val)
-
- return nil
-}
-
-func parseBytesValue(v reflect.Value, str string) error {
- val, err := base64.StdEncoding.DecodeString(str)
- if err != nil {
- return err
- }
- v.SetBytes(val)
-
- return nil
-}
-
-func nameToKey(name string) string {
- s := strings.Replace(name, ".", "_", -1)
- s = strings.ToUpper(s)
-
- return s
-}
-
-func combineName(parentName, name string) string {
- if parentName == "" {
- return name
- }
-
- return parentName + "." + name
-}
-
-func readValue(name string, customName, optional bool) (string, error) {
- key := name
- if !customName {
- key = nameToKey(name)
- }
-
- str := os.Getenv(key)
- if str != "" {
- return str, nil
- }
-
- if optional {
- return str, nil
- }
-
- return "", fmt.Errorf("envconfig: key %v not found", key)
-}
diff --git a/vendor/github.com/vrischmann/envconfig/envconfig_test.go b/vendor/github.com/vrischmann/envconfig/envconfig_test.go
deleted file mode 100644
index 44df705d1..000000000
--- a/vendor/github.com/vrischmann/envconfig/envconfig_test.go
+++ /dev/null
@@ -1,361 +0,0 @@
-package envconfig_test
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "reflect"
- "runtime"
- "strings"
- "testing"
- "time"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/vrischmann/envconfig"
-)
-
-func TestParseSimpleConfig(t *testing.T) {
- var conf struct {
- Name string
- Log struct {
- Path string
- }
- }
-
- // Go 1.2 and 1.3 don't have os.Unsetenv
- os.Setenv("NAME", "")
- os.Setenv("LOG_PATH", "")
-
- err := envconfig.Init(&conf)
- equals(t, "envconfig: key NAME not found", err.Error())
-
- os.Setenv("NAME", "foobar")
- err = envconfig.Init(&conf)
- equals(t, "envconfig: key LOG_PATH not found", err.Error())
-
- os.Setenv("LOG_PATH", "/var/log/foobar")
- err = envconfig.Init(&conf)
- ok(t, err)
-
- equals(t, "foobar", conf.Name)
- equals(t, "/var/log/foobar", conf.Log.Path)
-}
-
-func TestParseIntegerConfig(t *testing.T) {
- var conf struct {
- Port int
- Long uint64
- Version uint8
- }
-
- timestamp := time.Now().UnixNano()
-
- os.Setenv("PORT", "80")
- os.Setenv("LONG", fmt.Sprintf("%d", timestamp))
- os.Setenv("VERSION", "2")
-
- err := envconfig.Init(&conf)
- ok(t, err)
-
- equals(t, 80, conf.Port)
- equals(t, uint64(timestamp), conf.Long)
- equals(t, uint8(2), conf.Version)
-}
-
-func TestParseBoolConfig(t *testing.T) {
- var conf struct {
- DoIt bool
- }
-
- os.Setenv("DOIT", "true")
-
- err := envconfig.Init(&conf)
- ok(t, err)
- equals(t, true, conf.DoIt)
-}
-
-func TestParseBytesConfig(t *testing.T) {
- var conf struct {
- Data []byte
- }
-
- os.Setenv("DATA", "Rk9PQkFS")
-
- err := envconfig.Init(&conf)
- ok(t, err)
- equals(t, []byte("FOOBAR"), conf.Data)
-}
-
-func TestParseFloatConfig(t *testing.T) {
- var conf struct {
- Delta float32
- DeltaV float64
- }
-
- os.Setenv("DELTA", "0.02")
- os.Setenv("DELTAV", "400.20000000001")
-
- err := envconfig.Init(&conf)
- ok(t, err)
- equals(t, float32(0.02), conf.Delta)
- equals(t, float64(400.20000000001), conf.DeltaV)
-}
-
-func TestParseSliceConfig(t *testing.T) {
- var conf struct {
- Names []string
- Ports []int
- Shards []struct {
- Name string
- Addr string
- }
- }
-
- os.Setenv("NAMES", "foobar,barbaz")
- os.Setenv("PORTS", "900,100")
- os.Setenv("SHARDS", "{foobar,localhost:2929},{barbaz,localhost:2828}")
-
- err := envconfig.Init(&conf)
- ok(t, err)
-
- equals(t, 2, len(conf.Names))
- equals(t, "foobar", conf.Names[0])
- equals(t, "barbaz", conf.Names[1])
- equals(t, 2, len(conf.Ports))
- equals(t, 900, conf.Ports[0])
- equals(t, 100, conf.Ports[1])
- equals(t, 2, len(conf.Shards))
- equals(t, "foobar", conf.Shards[0].Name)
- equals(t, "localhost:2929", conf.Shards[0].Addr)
- equals(t, "barbaz", conf.Shards[1].Name)
- equals(t, "localhost:2828", conf.Shards[1].Addr)
-}
-
-func TestDurationConfig(t *testing.T) {
- var conf struct {
- Timeout time.Duration
- }
-
- os.Setenv("TIMEOUT", "1m")
-
- err := envconfig.Init(&conf)
- ok(t, err)
-
- equals(t, time.Minute*1, conf.Timeout)
-}
-
-func TestInvalidDurationConfig(t *testing.T) {
- var conf struct {
- Timeout time.Duration
- }
-
- os.Setenv("TIMEOUT", "foo")
-
- err := envconfig.Init(&conf)
- assert(t, err != nil, "err should not be nil")
-}
-
-func TestAllPointerConfig(t *testing.T) {
- var conf struct {
- Name *string
- Port *int
- Delta *float32
- DeltaV *float64
- Hosts *[]string
- Shards *[]*struct {
- Name *string
- Addr *string
- }
- Master *struct {
- Name *string
- Addr *string
- }
- Timeout *time.Duration
- }
-
- os.Setenv("NAME", "foobar")
- os.Setenv("PORT", "9000")
- os.Setenv("DELTA", "40.01")
- os.Setenv("DELTAV", "200.00001")
- os.Setenv("HOSTS", "localhost,free.fr")
- os.Setenv("SHARDS", "{foobar,localhost:2828},{barbaz,localhost:2929}")
- os.Setenv("MASTER_NAME", "master")
- os.Setenv("MASTER_ADDR", "localhost:2727")
- os.Setenv("TIMEOUT", "1m")
-
- err := envconfig.Init(&conf)
- ok(t, err)
-
- equals(t, "foobar", *conf.Name)
- equals(t, 9000, *conf.Port)
- equals(t, float32(40.01), *conf.Delta)
- equals(t, 200.00001, *conf.DeltaV)
- equals(t, 2, len(*conf.Hosts))
- equals(t, "localhost", (*conf.Hosts)[0])
- equals(t, "free.fr", (*conf.Hosts)[1])
- equals(t, 2, len(*conf.Shards))
- equals(t, "foobar", *(*conf.Shards)[0].Name)
- equals(t, "localhost:2828", *(*conf.Shards)[0].Addr)
- equals(t, "barbaz", *(*conf.Shards)[1].Name)
- equals(t, "localhost:2929", *(*conf.Shards)[1].Addr)
- equals(t, "master", *conf.Master.Name)
- equals(t, "localhost:2727", *conf.Master.Addr)
- equals(t, time.Minute*1, *conf.Timeout)
-}
-
-type logMode uint
-
-const (
- logFile logMode = iota + 1
- logStdout
-)
-
-func (m *logMode) Unmarshal(s string) error {
- switch strings.ToLower(s) {
- case "file":
- *m = logFile
- case "stdout":
- *m = logStdout
- default:
- return fmt.Errorf("unable to unmarshal %s", s)
- }
-
- return nil
-}
-
-func TestUnmarshaler(t *testing.T) {
- var conf struct {
- LogMode logMode
- }
-
- os.Setenv("LOGMODE", "file")
-
- err := envconfig.Init(&conf)
- ok(t, err)
-
- equals(t, logFile, conf.LogMode)
-}
-
-func TestParseOptionalConfig(t *testing.T) {
- var conf struct {
- Name string `envconfig:"optional"`
- Flag bool `envconfig:"optional"`
- Timeout time.Duration `envconfig:"optional"`
- Port int `envconfig:"optional"`
- Port2 uint `envconfig:"optional"`
- Delta float32 `envconfig:"optional"`
- DeltaV float64 `envconfig:"optional"`
- Slice []string `envconfig:"optional"`
- Struct struct {
- A string
- B int
- } `envconfig:"optional"`
- }
-
- os.Setenv("NAME", "")
- os.Setenv("FLAG", "")
- os.Setenv("TIMEOUT", "")
- os.Setenv("PORT", "")
- os.Setenv("PORT2", "")
- os.Setenv("DELTA", "")
- os.Setenv("DELTAV", "")
- os.Setenv("SLICE", "")
- os.Setenv("STRUCT", "")
-
- err := envconfig.Init(&conf)
- ok(t, err)
- equals(t, "", conf.Name)
-}
-
-func TestParseSkippableConfig(t *testing.T) {
- var conf struct {
- Flag bool `envconfig:"-"`
- }
-
- os.Setenv("FLAG", "true")
-
- err := envconfig.Init(&conf)
- ok(t, err)
- equals(t, false, conf.Flag)
-}
-
-func TestParseCustomNameConfig(t *testing.T) {
- var conf struct {
- Name string `envconfig:"customName"`
- }
-
- os.Setenv("customName", "foobar")
-
- err := envconfig.Init(&conf)
- ok(t, err)
- equals(t, "foobar", conf.Name)
-}
-
-func TestParseOptionalStruct(t *testing.T) {
- var conf struct {
- Master struct {
- Name string
- } `envconfig:"optional"`
- }
-
- os.Setenv("MASTER_NAME", "")
-
- err := envconfig.Init(&conf)
- ok(t, err)
- equals(t, "", conf.Master.Name)
-}
-
-func TestParsePrefixedStruct(t *testing.T) {
- var conf struct {
- Name string
- }
-
- os.Setenv("NAME", "")
- os.Setenv("FOO_NAME", "")
-
- os.Setenv("NAME", "bad")
- err := envconfig.InitWithPrefix(&conf, "FOO")
- assert(t, err != nil, "err should not be nil")
-
- os.Setenv("FOO_NAME", "good")
- err = envconfig.InitWithPrefix(&conf, "FOO")
- ok(t, err)
- equals(t, "good", conf.Name)
-}
-
-func TestUnexportedField(t *testing.T) {
- var conf struct {
- name string
- }
-
- os.Setenv("NAME", "foobar")
-
- err := envconfig.Init(&conf)
- equals(t, envconfig.ErrUnexportedField, err)
-}
-
-// assert fails the test if the condition is false.
-func assert(tb testing.TB, condition bool, msg string, v ...interface{}) {
- if !condition {
- _, file, line, _ := runtime.Caller(1)
- fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...)
- tb.FailNow()
- }
-}
-
-// ok fails the test if an err is not nil.
-func ok(tb testing.TB, err error) {
- if err != nil {
- _, file, line, _ := runtime.Caller(1)
- fmt.Printf("\033[31m%s:%d: unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error())
- tb.FailNow()
- }
-}
-
-// equals fails the test if exp is not equal to act.
-func equals(tb testing.TB, exp, act interface{}) {
- if !reflect.DeepEqual(exp, act) {
- _, file, line, _ := runtime.Caller(1)
- fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act)
- tb.FailNow()
- }
-}
diff --git a/vendor/github.com/vrischmann/envconfig/example_test.go b/vendor/github.com/vrischmann/envconfig/example_test.go
deleted file mode 100644
index 6fe8a93ac..000000000
--- a/vendor/github.com/vrischmann/envconfig/example_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-package envconfig_test
-
-import (
- "fmt"
- "os"
- "time"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/vrischmann/envconfig"
-)
-
-func ExampleInit() {
- var conf struct {
- MySQL struct {
- Host string
- Port int
- Database struct {
- User string
- Password string
- Name string
- }
- Params struct {
- Charset string `envconfig:"-"`
- }
- }
- Log struct {
- Path string
- Rotate bool
- }
- NbWorkers int
- Timeout time.Duration
- }
-
- os.Setenv("MYSQL_HOST", "localhost")
- os.Setenv("MYSQL_PORT", "3306")
- os.Setenv("MYSQL_DATABASE_USER", "root")
- os.Setenv("MYSQL_DATABASE_PASSWORD", "foobar")
- os.Setenv("MYSQL_DATABASE_NAME", "default")
- os.Setenv("LOG_PATH", "/var/log/foobar.log")
- os.Setenv("LOG_ROTATE", "true")
- os.Setenv("NBWORKERS", "10")
- os.Setenv("TIMEOUT", "120s")
-
- if err := envconfig.Init(&conf); err != nil {
- fmt.Printf("err=%s\n", err)
- }
-
- fmt.Println(conf.MySQL.Database.User)
- fmt.Println(conf.Log.Rotate)
- fmt.Println(conf.Timeout)
- // Output:
- // root
- // true
- // 2m0s
-}
-
-func ExampleInitWithPrefix() {
- var conf struct {
- Name string
- }
-
- os.Setenv("NAME", "")
- os.Setenv("FOO_NAME", "")
-
- os.Setenv("NAME", "foobar")
-
- err := envconfig.InitWithPrefix(&conf, "FOO")
- fmt.Println(err)
-
- os.Setenv("FOO_NAME", "foobar")
- err = envconfig.InitWithPrefix(&conf, "FOO")
- fmt.Println(err)
-
- fmt.Println(conf.Name)
- // Output:
- // envconfig: key FOO_NAME not found
- //
- // foobar
-}
diff --git a/vendor/github.com/vrischmann/envconfig/slice.go b/vendor/github.com/vrischmann/envconfig/slice.go
deleted file mode 100644
index 5ba16a831..000000000
--- a/vendor/github.com/vrischmann/envconfig/slice.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package envconfig
-
-import (
- "bufio"
- "bytes"
- "io"
- "strings"
-)
-
-type sliceTokenizer struct {
- err error
- r *bufio.Reader
- buf bytes.Buffer
- inBraces bool
-}
-
-var eof = rune(0)
-
-func newSliceTokenizer(str string) *sliceTokenizer {
- return &sliceTokenizer{
- r: bufio.NewReader(strings.NewReader(str)),
- }
-}
-
-func (t *sliceTokenizer) scan() bool {
- for {
- if t.err == io.EOF && t.buf.Len() == 0 {
- return false
- }
-
- ch := t.readRune()
- if ch == eof {
- return true
- }
-
- if ch == '{' {
- t.inBraces = true
- }
- if ch == '}' {
- t.inBraces = false
- }
-
- if ch == ',' && !t.inBraces {
- return true
- }
-
- _, t.err = t.buf.WriteRune(ch)
- if t.err != nil {
- return false
- }
- }
-}
-
-func (t *sliceTokenizer) readRune() rune {
- ch, _, err := t.r.ReadRune()
- if err != nil {
- t.err = err
- return eof
- }
-
- return ch
-}
-
-func (t *sliceTokenizer) text() string {
- str := t.buf.String()
- t.buf.Reset()
-
- return str
-}
-
-func (t *sliceTokenizer) Err() error {
- if t.err == io.EOF {
- return nil
- }
- return t.err
-}
diff --git a/vendor/github.com/vrischmann/envconfig/slice_test.go b/vendor/github.com/vrischmann/envconfig/slice_test.go
deleted file mode 100644
index 4ad100dec..000000000
--- a/vendor/github.com/vrischmann/envconfig/slice_test.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package envconfig
-
-import (
- "fmt"
- "path/filepath"
- "reflect"
- "runtime"
- "testing"
-)
-
-func TestSliceTokenizer(t *testing.T) {
- str := "foobar,barbaz"
- tnz := newSliceTokenizer(str)
-
- b := tnz.scan()
- ok(t, tnz.Err())
- equals(t, true, b)
-
- equals(t, "foobar", tnz.text())
-
- b = tnz.scan()
- ok(t, tnz.Err())
- equals(t, true, b)
- equals(t, "barbaz", tnz.text())
-
- b = tnz.scan()
- ok(t, tnz.Err())
- equals(t, false, b)
-}
-
-func TestSliceOfStructsTokenizer(t *testing.T) {
- str := "{foobar,100},{barbaz,200}"
- tnz := newSliceTokenizer(str)
-
- b := tnz.scan()
- ok(t, tnz.Err())
- equals(t, true, b)
-
- equals(t, "{foobar,100}", tnz.text())
-
- b = tnz.scan()
- ok(t, tnz.Err())
- equals(t, true, b)
- equals(t, "{barbaz,200}", tnz.text())
-
- b = tnz.scan()
- ok(t, tnz.Err())
- equals(t, false, b)
-}
-
-// assert fails the test if the condition is false.
-func assert(tb testing.TB, condition bool, msg string, v ...interface{}) {
- if !condition {
- _, file, line, _ := runtime.Caller(1)
- fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...)
- tb.FailNow()
- }
-}
-
-// ok fails the test if an err is not nil.
-func ok(tb testing.TB, err error) {
- if err != nil {
- _, file, line, _ := runtime.Caller(1)
- fmt.Printf("\033[31m%s:%d: unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error())
- tb.FailNow()
- }
-}
-
-// equals fails the test if exp is not equal to act.
-func equals(tb testing.TB, exp, act interface{}) {
- if !reflect.DeepEqual(exp, act) {
- _, file, line, _ := runtime.Caller(1)
- fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act)
- tb.FailNow()
- }
-}
diff --git a/vendor/golang.org/x/crypto/md4/md4.go b/vendor/golang.org/x/crypto/md4/md4.go
new file mode 100644
index 000000000..6d9ba9e5f
--- /dev/null
+++ b/vendor/golang.org/x/crypto/md4/md4.go
@@ -0,0 +1,118 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package md4 implements the MD4 hash algorithm as defined in RFC 1320.
+package md4 // import "golang.org/x/crypto/md4"
+
+import (
+ "crypto"
+ "hash"
+)
+
+func init() {
+ crypto.RegisterHash(crypto.MD4, New)
+}
+
+// The size of an MD4 checksum in bytes.
+const Size = 16
+
+// The blocksize of MD4 in bytes.
+const BlockSize = 64
+
+const (
+ _Chunk = 64
+ _Init0 = 0x67452301
+ _Init1 = 0xEFCDAB89
+ _Init2 = 0x98BADCFE
+ _Init3 = 0x10325476
+)
+
+// digest represents the partial evaluation of a checksum.
+type digest struct {
+ s [4]uint32
+ x [_Chunk]byte
+ nx int
+ len uint64
+}
+
+func (d *digest) Reset() {
+ d.s[0] = _Init0
+ d.s[1] = _Init1
+ d.s[2] = _Init2
+ d.s[3] = _Init3
+ d.nx = 0
+ d.len = 0
+}
+
+// New returns a new hash.Hash computing the MD4 checksum.
+func New() hash.Hash {
+ d := new(digest)
+ d.Reset()
+ return d
+}
+
+func (d *digest) Size() int { return Size }
+
+func (d *digest) BlockSize() int { return BlockSize }
+
+func (d *digest) Write(p []byte) (nn int, err error) {
+ nn = len(p)
+ d.len += uint64(nn)
+ if d.nx > 0 {
+ n := len(p)
+ if n > _Chunk-d.nx {
+ n = _Chunk - d.nx
+ }
+ for i := 0; i < n; i++ {
+ d.x[d.nx+i] = p[i]
+ }
+ d.nx += n
+ if d.nx == _Chunk {
+ _Block(d, d.x[0:])
+ d.nx = 0
+ }
+ p = p[n:]
+ }
+ n := _Block(d, p)
+ p = p[n:]
+ if len(p) > 0 {
+ d.nx = copy(d.x[:], p)
+ }
+ return
+}
+
+func (d0 *digest) Sum(in []byte) []byte {
+ // Make a copy of d0, so that caller can keep writing and summing.
+ d := new(digest)
+ *d = *d0
+
+ // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64.
+ len := d.len
+ var tmp [64]byte
+ tmp[0] = 0x80
+ if len%64 < 56 {
+ d.Write(tmp[0 : 56-len%64])
+ } else {
+ d.Write(tmp[0 : 64+56-len%64])
+ }
+
+ // Length in bits.
+ len <<= 3
+ for i := uint(0); i < 8; i++ {
+ tmp[i] = byte(len >> (8 * i))
+ }
+ d.Write(tmp[0:8])
+
+ if d.nx != 0 {
+ panic("d.nx != 0")
+ }
+
+ for _, s := range d.s {
+ in = append(in, byte(s>>0))
+ in = append(in, byte(s>>8))
+ in = append(in, byte(s>>16))
+ in = append(in, byte(s>>24))
+ }
+ return in
+}
diff --git a/vendor/golang.org/x/crypto/md4/md4_test.go b/vendor/golang.org/x/crypto/md4/md4_test.go
new file mode 100644
index 000000000..b56edd787
--- /dev/null
+++ b/vendor/golang.org/x/crypto/md4/md4_test.go
@@ -0,0 +1,71 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package md4
+
+import (
+ "fmt"
+ "io"
+ "testing"
+)
+
+type md4Test struct {
+ out string
+ in string
+}
+
+var golden = []md4Test{
+ {"31d6cfe0d16ae931b73c59d7e0c089c0", ""},
+ {"bde52cb31de33e46245e05fbdbd6fb24", "a"},
+ {"ec388dd78999dfc7cf4632465693b6bf", "ab"},
+ {"a448017aaf21d8525fc10ae87aa6729d", "abc"},
+ {"41decd8f579255c5200f86a4bb3ba740", "abcd"},
+ {"9803f4a34e8eb14f96adba49064a0c41", "abcde"},
+ {"804e7f1c2586e50b49ac65db5b645131", "abcdef"},
+ {"752f4adfe53d1da0241b5bc216d098fc", "abcdefg"},
+ {"ad9daf8d49d81988590a6f0e745d15dd", "abcdefgh"},
+ {"1e4e28b05464316b56402b3815ed2dfd", "abcdefghi"},
+ {"dc959c6f5d6f9e04e4380777cc964b3d", "abcdefghij"},
+ {"1b5701e265778898ef7de5623bbe7cc0", "Discard medicine more than two years old."},
+ {"d7f087e090fe7ad4a01cb59dacc9a572", "He who has a shady past knows that nice guys finish last."},
+ {"a6f8fd6df617c72837592fc3570595c9", "I wouldn't marry him with a ten foot pole."},
+ {"c92a84a9526da8abc240c05d6b1a1ce0", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
+ {"f6013160c4dcb00847069fee3bb09803", "The days of the digital watch are numbered. -Tom Stoppard"},
+ {"2c3bb64f50b9107ed57640fe94bec09f", "Nepal premier won't resign."},
+ {"45b7d8a32c7806f2f7f897332774d6e4", "For every action there is an equal and opposite government program."},
+ {"b5b4f9026b175c62d7654bdc3a1cd438", "His money is twice tainted: 'taint yours and 'taint mine."},
+ {"caf44e80f2c20ce19b5ba1cab766e7bd", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
+ {"191fae6707f496aa54a6bce9f2ecf74d", "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
+ {"9ddc753e7a4ccee6081cd1b45b23a834", "size: a.out: bad magic"},
+ {"8d050f55b1cadb9323474564be08a521", "The major problem is with sendmail. -Mark Horton"},
+ {"ad6e2587f74c3e3cc19146f6127fa2e3", "Give me a rock, paper and scissors and I will move the world. CCFestoon"},
+ {"1d616d60a5fabe85589c3f1566ca7fca", "If the enemy is within range, then so are you."},
+ {"aec3326a4f496a2ced65a1963f84577f", "It's well we cannot hear the screams/That we create in others' dreams."},
+ {"77b4fd762d6b9245e61c50bf6ebf118b", "You remind me of a TV show, but that's all right: I watch it anyway."},
+ {"e8f48c726bae5e516f6ddb1a4fe62438", "C is as portable as Stonehedge!!"},
+ {"a3a84366e7219e887423b01f9be7166e", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
+ {"a6b7aa35157e984ef5d9b7f32e5fbb52", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction. Lewis-Randall Rule"},
+ {"75661f0545955f8f9abeeb17845f3fd6", "How can you write a big system without C++? -Paul Glick"},
+}
+
+func TestGolden(t *testing.T) {
+ for i := 0; i < len(golden); i++ {
+ g := golden[i]
+ c := New()
+ for j := 0; j < 3; j++ {
+ if j < 2 {
+ io.WriteString(c, g.in)
+ } else {
+ io.WriteString(c, g.in[0:len(g.in)/2])
+ c.Sum(nil)
+ io.WriteString(c, g.in[len(g.in)/2:])
+ }
+ s := fmt.Sprintf("%x", c.Sum(nil))
+ if s != g.out {
+ t.Fatalf("md4[%d](%s) = %s want %s", j, g.in, s, g.out)
+ }
+ c.Reset()
+ }
+ }
+}
diff --git a/vendor/golang.org/x/crypto/md4/md4block.go b/vendor/golang.org/x/crypto/md4/md4block.go
new file mode 100644
index 000000000..3fed475f3
--- /dev/null
+++ b/vendor/golang.org/x/crypto/md4/md4block.go
@@ -0,0 +1,89 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// MD4 block step.
+// In its own file so that a faster assembly or C version
+// can be substituted easily.
+
+package md4
+
+var shift1 = []uint{3, 7, 11, 19}
+var shift2 = []uint{3, 5, 9, 13}
+var shift3 = []uint{3, 9, 11, 15}
+
+var xIndex2 = []uint{0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15}
+var xIndex3 = []uint{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}
+
+func _Block(dig *digest, p []byte) int {
+ a := dig.s[0]
+ b := dig.s[1]
+ c := dig.s[2]
+ d := dig.s[3]
+ n := 0
+ var X [16]uint32
+ for len(p) >= _Chunk {
+ aa, bb, cc, dd := a, b, c, d
+
+ j := 0
+ for i := 0; i < 16; i++ {
+ X[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24
+ j += 4
+ }
+
+ // If this needs to be made faster in the future,
+ // the usual trick is to unroll each of these
+ // loops by a factor of 4; that lets you replace
+ // the shift[] lookups with constants and,
+ // with suitable variable renaming in each
+ // unrolled body, delete the a, b, c, d = d, a, b, c
+ // (or you can let the optimizer do the renaming).
+ //
+ // The index variables are uint so that % by a power
+ // of two can be optimized easily by a compiler.
+
+ // Round 1.
+ for i := uint(0); i < 16; i++ {
+ x := i
+ s := shift1[i%4]
+ f := ((c ^ d) & b) ^ d
+ a += f + X[x]
+ a = a<>(32-s)
+ a, b, c, d = d, a, b, c
+ }
+
+ // Round 2.
+ for i := uint(0); i < 16; i++ {
+ x := xIndex2[i]
+ s := shift2[i%4]
+ g := (b & c) | (b & d) | (c & d)
+ a += g + X[x] + 0x5a827999
+ a = a<>(32-s)
+ a, b, c, d = d, a, b, c
+ }
+
+ // Round 3.
+ for i := uint(0); i < 16; i++ {
+ x := xIndex3[i]
+ s := shift3[i%4]
+ h := b ^ c ^ d
+ a += h + X[x] + 0x6ed9eba1
+ a = a<>(32-s)
+ a, b, c, d = d, a, b, c
+ }
+
+ a += aa
+ b += bb
+ c += cc
+ d += dd
+
+ p = p[_Chunk:]
+ n += _Chunk
+ }
+
+ dig.s[0] = a
+ dig.s[1] = b
+ dig.s[2] = c
+ dig.s[3] = d
+ return n
+}
diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go
index ef2f3e86f..e7ee376c4 100644
--- a/vendor/golang.org/x/net/context/context.go
+++ b/vendor/golang.org/x/net/context/context.go
@@ -34,7 +34,7 @@
//
// See http://blog.golang.org/context for example code for a server that uses
// Contexts.
-package context
+package context // import "golang.org/x/net/context"
import (
"errors"
diff --git a/vendor/golang.org/x/net/context/context_test.go b/vendor/golang.org/x/net/context/context_test.go
index faf67722a..e64afa64c 100644
--- a/vendor/golang.org/x/net/context/context_test.go
+++ b/vendor/golang.org/x/net/context/context_test.go
@@ -375,7 +375,7 @@ func TestAllocs(t *testing.T) {
<-c.Done()
},
limit: 8,
- gccgoLimit: 13,
+ gccgoLimit: 15,
},
{
desc: "WithCancel(bg)",
diff --git a/vendor/golang.org/x/net/context/ctxhttp/cancelreq.go b/vendor/golang.org/x/net/context/ctxhttp/cancelreq.go
new file mode 100644
index 000000000..48610e362
--- /dev/null
+++ b/vendor/golang.org/x/net/context/ctxhttp/cancelreq.go
@@ -0,0 +1,18 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.5
+
+package ctxhttp
+
+import "net/http"
+
+func canceler(client *http.Client, req *http.Request) func() {
+ ch := make(chan struct{})
+ req.Cancel = ch
+
+ return func() {
+ close(ch)
+ }
+}
diff --git a/vendor/golang.org/x/net/context/ctxhttp/cancelreq_go14.go b/vendor/golang.org/x/net/context/ctxhttp/cancelreq_go14.go
new file mode 100644
index 000000000..56bcbadb8
--- /dev/null
+++ b/vendor/golang.org/x/net/context/ctxhttp/cancelreq_go14.go
@@ -0,0 +1,23 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.5
+
+package ctxhttp
+
+import "net/http"
+
+type requestCanceler interface {
+ CancelRequest(*http.Request)
+}
+
+func canceler(client *http.Client, req *http.Request) func() {
+ rc, ok := client.Transport.(requestCanceler)
+ if !ok {
+ return func() {}
+ }
+ return func() {
+ rc.CancelRequest(req)
+ }
+}
diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go
new file mode 100644
index 000000000..504dd63ed
--- /dev/null
+++ b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go
@@ -0,0 +1,79 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package ctxhttp provides helper functions for performing context-aware HTTP requests.
+package ctxhttp // import "golang.org/x/net/context/ctxhttp"
+
+import (
+ "io"
+ "net/http"
+ "net/url"
+ "strings"
+
+ "golang.org/x/net/context"
+)
+
+// Do sends an HTTP request with the provided http.Client and returns an HTTP response.
+// If the client is nil, http.DefaultClient is used.
+// If the context is canceled or times out, ctx.Err() will be returned.
+func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
+ if client == nil {
+ client = http.DefaultClient
+ }
+
+ // Request cancelation changed in Go 1.5, see cancelreq.go and cancelreq_go14.go.
+ cancel := canceler(client, req)
+
+ type responseAndError struct {
+ resp *http.Response
+ err error
+ }
+ result := make(chan responseAndError, 1)
+
+ go func() {
+ resp, err := client.Do(req)
+ result <- responseAndError{resp, err}
+ }()
+
+ select {
+ case <-ctx.Done():
+ cancel()
+ return nil, ctx.Err()
+ case r := <-result:
+ return r.resp, r.err
+ }
+}
+
+// Get issues a GET request via the Do function.
+func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
+ req, err := http.NewRequest("GET", url, nil)
+ if err != nil {
+ return nil, err
+ }
+ return Do(ctx, client, req)
+}
+
+// Head issues a HEAD request via the Do function.
+func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
+ req, err := http.NewRequest("HEAD", url, nil)
+ if err != nil {
+ return nil, err
+ }
+ return Do(ctx, client, req)
+}
+
+// Post issues a POST request via the Do function.
+func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) {
+ req, err := http.NewRequest("POST", url, body)
+ if err != nil {
+ return nil, err
+ }
+ req.Header.Set("Content-Type", bodyType)
+ return Do(ctx, client, req)
+}
+
+// PostForm issues a POST request via the Do function.
+func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) {
+ return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
+}
diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go
new file mode 100644
index 000000000..47b53d7f1
--- /dev/null
+++ b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go
@@ -0,0 +1,72 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ctxhttp
+
+import (
+ "io/ioutil"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+ "time"
+
+ "golang.org/x/net/context"
+)
+
+const (
+ requestDuration = 100 * time.Millisecond
+ requestBody = "ok"
+)
+
+func TestNoTimeout(t *testing.T) {
+ ctx := context.Background()
+ resp, err := doRequest(ctx)
+
+ if resp == nil || err != nil {
+ t.Fatalf("error received from client: %v %v", err, resp)
+ }
+}
+func TestCancel(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+ go func() {
+ time.Sleep(requestDuration / 2)
+ cancel()
+ }()
+
+ resp, err := doRequest(ctx)
+
+ if resp != nil || err == nil {
+ t.Fatalf("expected error, didn't get one. resp: %v", resp)
+ }
+ if err != ctx.Err() {
+ t.Fatalf("expected error from context but got: %v", err)
+ }
+}
+
+func TestCancelAfterRequest(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+
+ resp, err := doRequest(ctx)
+
+ // Cancel before reading the body.
+ // Request.Body should still be readable after the context is canceled.
+ cancel()
+
+ b, err := ioutil.ReadAll(resp.Body)
+ if err != nil || string(b) != requestBody {
+ t.Fatalf("could not read body: %q %v", b, err)
+ }
+}
+
+func doRequest(ctx context.Context) (*http.Response, error) {
+ var okHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ time.Sleep(requestDuration)
+ w.Write([]byte(requestBody))
+ })
+
+ serv := httptest.NewServer(okHandler)
+ defer serv.Close()
+
+ return Get(ctx, nil, serv.URL)
+}
diff --git a/vendor/golang.org/x/net/context/withtimeout_test.go b/vendor/golang.org/x/net/context/withtimeout_test.go
index 9c30ee68c..a6754dc36 100644
--- a/vendor/golang.org/x/net/context/withtimeout_test.go
+++ b/vendor/golang.org/x/net/context/withtimeout_test.go
@@ -8,7 +8,7 @@ import (
"fmt"
"time"
- "github.com/drone/drone/Godeps/_workspace/src/golang.org/x/net/context"
+ "golang.org/x/net/context"
)
func ExampleWithTimeout() {
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/LICENSE b/vendor/gopkg.in/bluesuncorp/validator.v5/LICENSE
similarity index 100%
rename from vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/LICENSE
rename to vendor/gopkg.in/bluesuncorp/validator.v5/LICENSE
diff --git a/vendor/gopkg.in/bluesuncorp/validator.v5/README.md b/vendor/gopkg.in/bluesuncorp/validator.v5/README.md
new file mode 100644
index 000000000..ac50d6e09
--- /dev/null
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/README.md
@@ -0,0 +1,154 @@
+Package validator
+================
+
+[](https://gitter.im/bluesuncorp/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[](https://semaphoreci.com/joeybloggs/validator)
+[](https://coveralls.io/r/bluesuncorp/validator?branch=v5)
+[](https://godoc.org/gopkg.in/bluesuncorp/validator.v5)
+
+Package validator implements value validations for structs and individual fields based on tags.
+
+It has the following **unique** features:
+
+- Cross Field and Cross Struct validations.
+- Slice, Array and Map diving, which allows any or all levels of a multidimensional field to be validated.
+- Handles type interface by determining it's underlying type prior to validation.
+
+Installation
+------------
+
+Use go get.
+
+ go get gopkg.in/bluesuncorp/validator.v5
+
+or to update
+
+ go get -u gopkg.in/bluesuncorp/validator.v5
+
+Then import the validator package into your own code.
+
+ import "gopkg.in/bluesuncorp/validator.v5"
+
+Usage and documentation
+------
+
+Please see http://godoc.org/gopkg.in/bluesuncorp/validator.v5 for detailed usage docs.
+
+##### Example:
+```go
+package main
+
+import (
+ "fmt"
+
+ "gopkg.in/bluesuncorp/validator.v5"
+)
+
+// User contains user information
+type User struct {
+ FirstName string `validate:"required"`
+ LastName string `validate:"required"`
+ Age uint8 `validate:"gte=0,lte=130"`
+ Email string `validate:"required,email"`
+ FavouriteColor string `validate:"hexcolor|rgb|rgba"`
+ Addresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage...
+}
+
+// Address houses a users address information
+type Address struct {
+ Street string `validate:"required"`
+ City string `validate:"required"`
+ Planet string `validate:"required"`
+ Phone string `validate:"required"`
+}
+
+var validate *validator.Validate
+
+func main() {
+
+ validate = validator.New("validate", validator.BakedInValidators)
+
+ address := &Address{
+ Street: "Eavesdown Docks",
+ Planet: "Persphone",
+ Phone: "none",
+ }
+
+ user := &User{
+ FirstName: "Badger",
+ LastName: "Smith",
+ Age: 135,
+ Email: "Badger.Smith@gmail.com",
+ FavouriteColor: "#000",
+ Addresses: []*Address{address},
+ }
+
+ // returns nil or *StructErrors
+ errs := validate.Struct(user)
+
+ if errs != nil {
+
+ // err will be of type *FieldError
+ err := errs.Errors["Age"]
+ fmt.Println(err.Error()) // output: Field validation for "Age" failed on the "lte" tag
+ fmt.Println(err.Field) // output: Age
+ fmt.Println(err.Tag) // output: lte
+ fmt.Println(err.Kind) // output: uint8
+ fmt.Println(err.Type) // output: uint8
+ fmt.Println(err.Param) // output: 130
+ fmt.Println(err.Value) // output: 135
+
+ // or if you prefer you can use the Flatten function
+ // NOTE: I find this usefull when using a more hard static approach of checking field errors.
+ // The above, is best for passing to some generic code to say parse the errors. i.e. I pass errs
+ // to a routine which loops through the errors, creates and translates the error message into the
+ // users locale and returns a map of map[string]string // field and error which I then use
+ // within the HTML rendering.
+
+ flat := errs.Flatten()
+ fmt.Println(flat) // output: map[Age:Field validation for "Age" failed on the "lte" tag Addresses[0].Address.City:Field validation for "City" failed on the "required" tag]
+ err = flat["Addresses[0].Address.City"]
+ fmt.Println(err.Field) // output: City
+ fmt.Println(err.Tag) // output: required
+ fmt.Println(err.Kind) // output: string
+ fmt.Println(err.Type) // output: string
+ fmt.Println(err.Param) // output:
+ fmt.Println(err.Value) // output:
+
+ // from here you can create your own error messages in whatever language you wish
+ return
+ }
+
+ // save user to database
+}
+```
+
+Benchmarks
+------
+###### Run on MacBook Pro (Retina, 15-inch, Late 2013) 2.6 GHz Intel Core i7 16 GB 1600 MHz DDR3
+```go
+$ go test -cpu=4 -bench=. -benchmem=true
+PASS
+BenchmarkValidateField-4 3000000 429 ns/op 192 B/op 2 allocs/op
+BenchmarkValidateStructSimple-4 500000 2877 ns/op 657 B/op 10 allocs/op
+BenchmarkTemplateParallelSimple-4 500000 3097 ns/op 657 B/op 10 allocs/op
+BenchmarkValidateStructLarge-4 100000 15228 ns/op 4350 B/op 62 allocs/op
+BenchmarkTemplateParallelLarge-4 100000 14257 ns/op 4354 B/op 62 allocs/op
+```
+
+How to Contribute
+------
+
+There will always be a development branch for each version i.e. `v1-development`. In order to contribute,
+please make your pull requests against those branches.
+
+If the changes being proposed or requested are breaking changes, please create an issue, for discussion
+or create a pull request against the highest development branch for example this package has a
+v1 and v1-development branch however, there will also be a v2-development brach even though v2 doesn't exist yet.
+
+I strongly encourage everyone whom creates a custom validation function to contribute them and
+help make this package even better.
+
+License
+------
+Distributed under MIT License, please see license file in code for more details.
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/baked_in.go b/vendor/gopkg.in/bluesuncorp/validator.v5/baked_in.go
similarity index 63%
rename from vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/baked_in.go
rename to vendor/gopkg.in/bluesuncorp/validator.v5/baked_in.go
index a3795ab5b..82868ccfd 100644
--- a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/baked_in.go
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/baked_in.go
@@ -5,38 +5,337 @@ import (
"net/url"
"reflect"
"strconv"
+ "strings"
"time"
+ "unicode/utf8"
)
// BakedInValidators is the default map of ValidationFunc
// you can add, remove or even replace items to suite your needs,
// or even disregard and use your own map if so desired.
-var BakedInValidators = map[string]ValidationFunc{
- "required": hasValue,
- "len": hasLengthOf,
- "min": hasMinOf,
- "max": hasMaxOf,
- "lt": isLt,
- "lte": isLte,
- "gt": isGt,
- "gte": isGte,
- "gtefield": isGteField,
- "gtfield": isGtField,
- "ltefield": isLteField,
- "ltfield": isLtField,
- "alpha": isAlpha,
- "alphanum": isAlphanum,
- "numeric": isNumeric,
- "number": isNumber,
- "hexadecimal": isHexadecimal,
- "hexcolor": isHexcolor,
- "rgb": isRgb,
- "rgba": isRgba,
- "hsl": isHsl,
- "hsla": isHsla,
- "email": isEmail,
- "url": isURL,
- "uri": isURI,
+var BakedInValidators = map[string]Func{
+ "required": hasValue,
+ "len": hasLengthOf,
+ "min": hasMinOf,
+ "max": hasMaxOf,
+ "eq": isEq,
+ "ne": isNe,
+ "lt": isLt,
+ "lte": isLte,
+ "gt": isGt,
+ "gte": isGte,
+ "eqfield": isEqField,
+ "nefield": isNeField,
+ "gtefield": isGteField,
+ "gtfield": isGtField,
+ "ltefield": isLteField,
+ "ltfield": isLtField,
+ "alpha": isAlpha,
+ "alphanum": isAlphanum,
+ "numeric": isNumeric,
+ "number": isNumber,
+ "hexadecimal": isHexadecimal,
+ "hexcolor": isHexcolor,
+ "rgb": isRgb,
+ "rgba": isRgba,
+ "hsl": isHsl,
+ "hsla": isHsla,
+ "email": isEmail,
+ "url": isURL,
+ "uri": isURI,
+ "base64": isBase64,
+ "contains": contains,
+ "containsany": containsAny,
+ "containsrune": containsRune,
+ "excludes": excludes,
+ "excludesall": excludesAll,
+ "excludesrune": excludesRune,
+ "isbn": isISBN,
+ "isbn10": isISBN10,
+ "isbn13": isISBN13,
+ "uuid": isUUID,
+ "uuid3": isUUID3,
+ "uuid4": isUUID4,
+ "uuid5": isUUID5,
+ "ascii": isASCII,
+ "printascii": isPrintableASCII,
+ "multibyte": hasMultiByteCharacter,
+ "datauri": isDataURI,
+ "latitude": isLatitude,
+ "longitude": isLongitude,
+ "ssn": isSSN,
+}
+
+func isSSN(top interface{}, current interface{}, field interface{}, param string) bool {
+
+ if len(field.(string)) != 11 {
+ return false
+ }
+
+ return matchesRegex(sSNRegex, field)
+}
+
+func isLongitude(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(longitudeRegex, field)
+}
+
+func isLatitude(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(latitudeRegex, field)
+}
+
+func isDataURI(top interface{}, current interface{}, field interface{}, param string) bool {
+
+ uri := strings.SplitN(field.(string), ",", 2)
+
+ if len(uri) != 2 {
+ return false
+ }
+
+ if !matchesRegex(dataURIRegex, uri[0]) {
+ return false
+ }
+
+ return isBase64(top, current, uri[1], param)
+}
+
+func hasMultiByteCharacter(top interface{}, current interface{}, field interface{}, param string) bool {
+
+ if len(field.(string)) == 0 {
+ return true
+ }
+
+ return matchesRegex(multibyteRegex, field)
+}
+
+func isPrintableASCII(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(printableASCIIRegex, field)
+}
+
+func isASCII(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(aSCIIRegex, field)
+}
+
+func isUUID5(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(uUID5Regex, field)
+}
+
+func isUUID4(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(uUID4Regex, field)
+}
+
+func isUUID3(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(uUID3Regex, field)
+}
+
+func isUUID(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(uUIDRegex, field)
+}
+
+func isISBN(top interface{}, current interface{}, field interface{}, param string) bool {
+ return isISBN10(top, current, field, param) || isISBN13(top, current, field, param)
+}
+
+func isISBN13(top interface{}, current interface{}, field interface{}, param string) bool {
+
+ s := strings.Replace(strings.Replace(field.(string), "-", "", 4), " ", "", 4)
+
+ if !matchesRegex(iSBN13Regex, s) {
+ return false
+ }
+
+ var checksum int32
+ var i int32
+
+ factor := []int32{1, 3}
+
+ for i = 0; i < 12; i++ {
+ checksum += factor[i%2] * int32(s[i]-'0')
+ }
+
+ if (int32(s[12]-'0'))-((10-(checksum%10))%10) == 0 {
+ return true
+ }
+
+ return false
+}
+
+func isISBN10(top interface{}, current interface{}, field interface{}, param string) bool {
+
+ s := strings.Replace(strings.Replace(field.(string), "-", "", 3), " ", "", 3)
+
+ if !matchesRegex(iSBN10Regex, s) {
+ return false
+ }
+
+ var checksum int32
+ var i int32
+
+ for i = 0; i < 9; i++ {
+ checksum += (i + 1) * int32(s[i]-'0')
+ }
+
+ if s[9] == 'X' {
+ checksum += 10 * 10
+ } else {
+ checksum += 10 * int32(s[9]-'0')
+ }
+
+ if checksum%11 == 0 {
+ return true
+ }
+
+ return false
+}
+
+func excludesRune(top interface{}, current interface{}, field interface{}, param string) bool {
+ return !containsRune(top, current, field, param)
+}
+
+func excludesAll(top interface{}, current interface{}, field interface{}, param string) bool {
+ return !containsAny(top, current, field, param)
+}
+
+func excludes(top interface{}, current interface{}, field interface{}, param string) bool {
+ return !contains(top, current, field, param)
+}
+
+func containsRune(top interface{}, current interface{}, field interface{}, param string) bool {
+ r, _ := utf8.DecodeRuneInString(param)
+
+ return strings.ContainsRune(field.(string), r)
+}
+
+func containsAny(top interface{}, current interface{}, field interface{}, param string) bool {
+ return strings.ContainsAny(field.(string), param)
+}
+
+func contains(top interface{}, current interface{}, field interface{}, param string) bool {
+ return strings.Contains(field.(string), param)
+}
+
+func isNeField(top interface{}, current interface{}, field interface{}, param string) bool {
+ return !isEqField(top, current, field, param)
+}
+
+func isNe(top interface{}, current interface{}, field interface{}, param string) bool {
+ return !isEq(top, current, field, param)
+}
+
+func isEqField(top interface{}, current interface{}, field interface{}, param string) bool {
+
+ if current == nil {
+ panic("struct not passed for cross validation")
+ }
+
+ currentVal := reflect.ValueOf(current)
+
+ if currentVal.Kind() == reflect.Ptr && !currentVal.IsNil() {
+ currentVal = reflect.ValueOf(currentVal.Elem().Interface())
+ }
+
+ var currentFielVal reflect.Value
+
+ switch currentVal.Kind() {
+
+ case reflect.Struct:
+
+ if currentVal.Type() == reflect.TypeOf(time.Time{}) {
+ currentFielVal = currentVal
+ break
+ }
+
+ f := currentVal.FieldByName(param)
+
+ if f.Kind() == reflect.Invalid {
+ panic(fmt.Sprintf("Field \"%s\" not found in struct", param))
+ }
+
+ currentFielVal = f
+
+ default:
+
+ currentFielVal = currentVal
+ }
+
+ if currentFielVal.Kind() == reflect.Ptr && !currentFielVal.IsNil() {
+
+ currentFielVal = reflect.ValueOf(currentFielVal.Elem().Interface())
+ }
+
+ fv := reflect.ValueOf(field)
+
+ switch fv.Kind() {
+
+ case reflect.String:
+ return fv.String() == currentFielVal.String()
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+
+ return fv.Int() == currentFielVal.Int()
+
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+
+ return fv.Uint() == currentFielVal.Uint()
+
+ case reflect.Float32, reflect.Float64:
+
+ return fv.Float() == currentFielVal.Float()
+ case reflect.Slice, reflect.Map, reflect.Array:
+
+ return int64(fv.Len()) == int64(currentFielVal.Len())
+ case reflect.Struct:
+
+ if fv.Type() == reflect.TypeOf(time.Time{}) {
+
+ if currentFielVal.Type() != reflect.TypeOf(time.Time{}) {
+ panic("Bad Top Level field type")
+ }
+
+ t := currentFielVal.Interface().(time.Time)
+ fieldTime := field.(time.Time)
+
+ return fieldTime.Equal(t)
+ }
+ }
+
+ panic(fmt.Sprintf("Bad field type %T", field))
+}
+
+func isEq(top interface{}, current interface{}, field interface{}, param string) bool {
+
+ st := reflect.ValueOf(field)
+
+ switch st.Kind() {
+
+ case reflect.String:
+
+ return st.String() == param
+
+ case reflect.Slice, reflect.Map, reflect.Array:
+ p := asInt(param)
+
+ return int64(st.Len()) == p
+
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ p := asInt(param)
+
+ return st.Int() == p
+
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ p := asUint(param)
+
+ return st.Uint() == p
+
+ case reflect.Float32, reflect.Float64:
+ p := asFloat(param)
+
+ return st.Float() == p
+ }
+
+ panic(fmt.Sprintf("Bad field type %T", field))
+}
+
+func isBase64(top interface{}, current interface{}, field interface{}, param string) bool {
+ return matchesRegex(base64Regex, field)
}
func isURI(top interface{}, current interface{}, field interface{}, param string) bool {
@@ -125,10 +424,12 @@ func hasValue(top interface{}, current interface{}, field interface{}, param str
st := reflect.ValueOf(field)
switch st.Kind() {
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return field != nil && int64(st.Len()) > 0
-
+ case reflect.Invalid:
+ return false
+ case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:
+ return !st.IsNil()
+ case reflect.Array:
+ return field != reflect.Zero(reflect.TypeOf(field)).Interface()
default:
return field != nil && field != reflect.Zero(reflect.TypeOf(field)).Interface()
}
@@ -293,7 +594,7 @@ func isGte(top interface{}, current interface{}, field interface{}, param string
case reflect.String:
p := asInt(param)
- return int64(len(st.String())) >= p
+ return int64(utf8.RuneCountInString(st.String())) >= p
case reflect.Slice, reflect.Map, reflect.Array:
p := asInt(param)
@@ -338,7 +639,7 @@ func isGt(top interface{}, current interface{}, field interface{}, param string)
case reflect.String:
p := asInt(param)
- return int64(len(st.String())) > p
+ return int64(utf8.RuneCountInString(st.String())) > p
case reflect.Slice, reflect.Map, reflect.Array:
p := asInt(param)
@@ -382,7 +683,7 @@ func hasLengthOf(top interface{}, current interface{}, field interface{}, param
case reflect.String:
p := asInt(param)
- return int64(len(st.String())) == p
+ return int64(utf8.RuneCountInString(st.String())) == p
case reflect.Slice, reflect.Map, reflect.Array:
p := asInt(param)
@@ -576,7 +877,7 @@ func isLte(top interface{}, current interface{}, field interface{}, param string
case reflect.String:
p := asInt(param)
- return int64(len(st.String())) <= p
+ return int64(utf8.RuneCountInString(st.String())) <= p
case reflect.Slice, reflect.Map, reflect.Array:
p := asInt(param)
@@ -621,7 +922,7 @@ func isLt(top interface{}, current interface{}, field interface{}, param string)
case reflect.String:
p := asInt(param)
- return int64(len(st.String())) < p
+ return int64(utf8.RuneCountInString(st.String())) < p
case reflect.Slice, reflect.Map, reflect.Array:
p := asInt(param)
diff --git a/vendor/gopkg.in/bluesuncorp/validator.v5/benchmarks_test.go b/vendor/gopkg.in/bluesuncorp/validator.v5/benchmarks_test.go
new file mode 100644
index 000000000..ee836c288
--- /dev/null
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/benchmarks_test.go
@@ -0,0 +1,163 @@
+package validator
+
+import "testing"
+
+func BenchmarkValidateField(b *testing.B) {
+ for n := 0; n < b.N; n++ {
+ validate.Field("1", "len=1")
+ }
+}
+
+func BenchmarkValidateStructSimple(b *testing.B) {
+
+ type Foo struct {
+ StringValue string `validate:"min=5,max=10"`
+ IntValue int `validate:"min=5,max=10"`
+ }
+
+ validFoo := &Foo{StringValue: "Foobar", IntValue: 7}
+ invalidFoo := &Foo{StringValue: "Fo", IntValue: 3}
+
+ for n := 0; n < b.N; n++ {
+ validate.Struct(validFoo)
+ validate.Struct(invalidFoo)
+ }
+}
+
+func BenchmarkTemplateParallelSimple(b *testing.B) {
+
+ type Foo struct {
+ StringValue string `validate:"min=5,max=10"`
+ IntValue int `validate:"min=5,max=10"`
+ }
+
+ validFoo := &Foo{StringValue: "Foobar", IntValue: 7}
+ invalidFoo := &Foo{StringValue: "Fo", IntValue: 3}
+
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ validate.Struct(validFoo)
+ validate.Struct(invalidFoo)
+ }
+ })
+}
+
+func BenchmarkValidateStructLarge(b *testing.B) {
+
+ tFail := &TestString{
+ Required: "",
+ Len: "",
+ Min: "",
+ Max: "12345678901",
+ MinMax: "",
+ Lt: "0123456789",
+ Lte: "01234567890",
+ Gt: "1",
+ Gte: "1",
+ OmitEmpty: "12345678901",
+ Sub: &SubTest{
+ Test: "",
+ },
+ Anonymous: struct {
+ A string `validate:"required"`
+ }{
+ A: "",
+ },
+ Iface: &Impl{
+ F: "12",
+ },
+ }
+
+ tSuccess := &TestString{
+ Required: "Required",
+ Len: "length==10",
+ Min: "min=1",
+ Max: "1234567890",
+ MinMax: "12345",
+ Lt: "012345678",
+ Lte: "0123456789",
+ Gt: "01234567890",
+ Gte: "0123456789",
+ OmitEmpty: "",
+ Sub: &SubTest{
+ Test: "1",
+ },
+ SubIgnore: &SubTest{
+ Test: "",
+ },
+ Anonymous: struct {
+ A string `validate:"required"`
+ }{
+ A: "1",
+ },
+ Iface: &Impl{
+ F: "123",
+ },
+ }
+
+ for n := 0; n < b.N; n++ {
+ validate.Struct(tSuccess)
+ validate.Struct(tFail)
+ }
+}
+
+func BenchmarkTemplateParallelLarge(b *testing.B) {
+
+ tFail := &TestString{
+ Required: "",
+ Len: "",
+ Min: "",
+ Max: "12345678901",
+ MinMax: "",
+ Lt: "0123456789",
+ Lte: "01234567890",
+ Gt: "1",
+ Gte: "1",
+ OmitEmpty: "12345678901",
+ Sub: &SubTest{
+ Test: "",
+ },
+ Anonymous: struct {
+ A string `validate:"required"`
+ }{
+ A: "",
+ },
+ Iface: &Impl{
+ F: "12",
+ },
+ }
+
+ tSuccess := &TestString{
+ Required: "Required",
+ Len: "length==10",
+ Min: "min=1",
+ Max: "1234567890",
+ MinMax: "12345",
+ Lt: "012345678",
+ Lte: "0123456789",
+ Gt: "01234567890",
+ Gte: "0123456789",
+ OmitEmpty: "",
+ Sub: &SubTest{
+ Test: "1",
+ },
+ SubIgnore: &SubTest{
+ Test: "",
+ },
+ Anonymous: struct {
+ A string `validate:"required"`
+ }{
+ A: "1",
+ },
+ Iface: &Impl{
+ F: "123",
+ },
+ }
+
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ validate.Struct(tSuccess)
+ validate.Struct(tFail)
+ }
+ })
+}
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/doc.go b/vendor/gopkg.in/bluesuncorp/validator.v5/doc.go
similarity index 52%
rename from vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/doc.go
rename to vendor/gopkg.in/bluesuncorp/validator.v5/doc.go
index 06ccee38b..74db756f9 100644
--- a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/doc.go
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/doc.go
@@ -1,16 +1,16 @@
/*
-Package validator implements value validations for structs and individual fields based on tags. It can also handle Cross Field validation and even Cross Field Cross Struct validation for nested structs.
+Package validator implements value validations for structs and individual fields based on tags. It can also handle Cross Field and Cross Struct validation for nested structs.
-Built In Validator
+Validate
- myValidator = validator.NewValidator("validate", validator.BakedInValidators)
+ validate := validator.New("validate", validator.BakedInValidators)
- errs := myValidator.ValidateStruct(//your struct)
- valErr := myValidator.ValidateFieldByTag(field, "omitempty,min=1,max=10")
+ errs := validate.Struct(//your struct)
+ valErr := validate.Field(field, "omitempty,min=1,max=10")
A simple example usage:
- type UserDetail {
+ type UserDetail struct {
Details string `validate:"-"`
}
@@ -25,17 +25,17 @@ A simple example usage:
}
// errs will contain a hierarchical list of errors
- // using the StructValidationErrors struct
+ // using the StructErrors struct
// or nil if no errors exist
- errs := myValidator.ValidateStruct(user)
+ errs := validate.Struct(user)
// in this case 1 error Name is required
errs.Struct will be "User"
errs.StructErrors will be empty <-- fields that were structs
- errs.Errors will have 1 error of type FieldValidationError
+ errs.Errors will have 1 error of type FieldError
NOTE: Anonymous Structs - they don't have names so expect the Struct name
- within StructValidationErrors to be blank.
+ within StructErrors to be blank.
Error Handling
@@ -45,7 +45,7 @@ The error can be used like so
fieldErr.Field // "Name"
fieldErr.ErrorTag // "required"
-Both StructValidationErrors and FieldValidationError implement the Error interface but it's
+Both StructErrors and FieldError implement the Error interface but it's
intended use is for development + debugging, not a production error message.
fieldErr.Error() // Field validation for "Name" failed on the "required" tag
@@ -67,7 +67,7 @@ I needed to know the field and what validation failed so that I could provide an
}
The hierarchical error structure is hard to work with sometimes.. Agreed Flatten function to the rescue!
-Flatten will return a map of FieldValidationError's but the field name will be namespaced.
+Flatten will return a map of FieldError's but the field name will be namespaced.
// if UserDetail Details field failed validation
Field will be "Sub.Details"
@@ -89,7 +89,7 @@ Custom functions can be added
return true
}
- myValidator.AddFunction("custom tag name", customFunc)
+ validate.AddFunction("custom tag name", customFunc)
// NOTES: using the same tag name as an existing function
// will overwrite the existing one
@@ -97,11 +97,11 @@ Cross Field Validation
Cross Field Validation can be implemented, for example Start & End Date range validation
- // NOTE: when calling myValidator.validateStruct(val) val will be the top level struct passed
+ // NOTE: when calling validate.Struct(val) val will be the top level struct passed
// into the function
- // when calling myValidator.ValidateFieldByTagAndValue(val, field, tag) val will be
+ // when calling validate.FieldWithValue(val, field, tag) val will be
// whatever you pass, struct, field...
- // when calling myValidator.ValidateFieldByTag(field, tag) val will be nil
+ // when calling validate.Field(field, tag) val will be nil
//
// Because of the specific requirements and field names within each persons project that
// uses this library it is likely that custom functions will need to be created for your
@@ -143,6 +143,11 @@ NOTE: Baked In Cross field validation only compares fields on the same struct,
if cross field + cross struct validation is needed your own custom validator
should be implemented.
+NOTE2: comma is the default separator of validation tags, if you wish to have a comma
+included within the parameter i.e. excludesall=, you will need to use the UTF-8 hex
+representation 0x2C, which is replaced in the code as a comma, so the above will
+become excludesall=0x2C
+
Here is a list of the current built in validators:
-
@@ -162,16 +167,44 @@ Here is a list of the current built in validators:
inside of you program you know the struct will be valid, but need to
verify it has been assigned.
+ exists
+ Is a special tag without a validation function attached. It is used when a field
+ is a Pointer, Interface or Invalid and you wish to validate that it exists.
+ Example: want to ensure a bool exists if you define the bool as a pointer and
+ use exists it will ensure there is a value; couldn't use required as it would
+ fail when the bool was false. exists will fail is the value is a Pointer, Interface
+ or Invalid and is nil. (Usage: exists)
+
omitempty
- Allows conitional validation, for example if a field is not set with
+ Allows conditional validation, for example if a field is not set with
a value (Determined by the required validator) then other validation
such as min or max won't run, but if a value is set validation will run.
(Usage: omitempty)
+ dive
+ This tells the validator to dive into a slice, array or map and validate that
+ level of the slice, array or map with the validation tags that follow.
+ Multidimensional nesting is also supported, each level you wish to dive will
+ require another dive tag. (Usage: dive)
+ Example: [][]string with validation tag "gt=0,dive,len=1,dive,required"
+ gt=0 will be applied to []
+ len=1 will be applied to []string
+ required will be applied to string
+ Example2: [][]string with validation tag "gt=0,dive,dive,required"
+ gt=0 will be applied to []
+ []string will be spared validation
+ required will be applied to string
+ NOTE: in Example2 if the required validation failed, but all others passed
+ the hierarchy of FieldError's in the middle with have their IsPlaceHolder field
+ set to true. If a FieldError has IsSliceOrMap=true or IsMap=true then the
+ FieldError is a Slice or Map field and if IsPlaceHolder=true then contains errors
+ within its SliceOrArrayErrs or MapErrs fields.
+
required
- This validates that the value is not the data types default value.
+ This validates that the value is not the data types default zero value.
For numbers ensures value is not zero. For strings ensures value is
- not "". For slices, arrays, and maps, ensures the length is not zero.
+ not "". For slices, maps, pointers, interfaces, channels and functions
+ ensures the value is not nil.
(Usage: required)
len
@@ -192,6 +225,16 @@ Here is a list of the current built in validators:
the string length is at least that number of characters. For slices,
arrays, and maps, validates the number of items. (Usage: min=10)
+ eq
+ For strings & numbers, eq will ensure that the value is
+ equal to the parameter given. For slices, arrays, and maps,
+ validates the number of items. (Usage: eq=10)
+
+ ne
+ For strings & numbers, eq will ensure that the value is not
+ equal to the parameter given. For slices, arrays, and maps,
+ validates the number of items. (Usage: eq=10)
+
gt
For numbers, this will ensure that the value is greater than the
parameter given. For strings, it checks that the string length
@@ -221,86 +264,192 @@ Here is a list of the current built in validators:
For time.Time ensures the time value is less than or equal to time.Now.UTC()
(Usage: lte)
+ eqfield
+ This will validate the field value against another fields value either within
+ a struct or passed in field.
+ usage examples are for validation of a password and confirm password:
+ Validation on Password field using validate.Struct Usage(eqfield=ConfirmPassword)
+ Validating by field validate.FieldWithValue(password, confirmpassword, "eqfield")
+
+ nefield
+ This will validate the field value against another fields value either within
+ a struct or passed in field.
+ usage examples are for ensuring two colors are not the same:
+ Validation on Color field using validate.Struct Usage(nefield=Color2)
+ Validating by field validate.FieldWithValue(color1, color2, "nefield")
+
gtfield
Only valid for Numbers and time.Time types, this will validate the field value
against another fields value either within a struct or passed in field.
usage examples are for validation of a Start and End date:
- Validation on End field using ValidateByStruct Usage(gtfield=Start)
- Validating by field ValidateFieldByTagAndValue(start, end, "gtfield")
+ Validation on End field using validate.Struct Usage(gtfield=Start)
+ Validating by field validate.FieldWithValue(start, end, "gtfield")
gtefield
Only valid for Numbers and time.Time types, this will validate the field value
against another fields value either within a struct or passed in field.
usage examples are for validation of a Start and End date:
- Validation on End field using ValidateByStruct Usage(gtefield=Start)
- Validating by field ValidateFieldByTagAndValue(start, end, "gtefield")
+ Validation on End field using validate.Struct Usage(gtefield=Start)
+ Validating by field validate.FieldWithValue(start, end, "gtefield")
ltfield
Only valid for Numbers and time.Time types, this will validate the field value
against another fields value either within a struct or passed in field.
usage examples are for validation of a Start and End date:
- Validation on End field using ValidateByStruct Usage(ltfield=Start)
- Validating by field ValidateFieldByTagAndValue(start, end, "ltfield")
+ Validation on End field using validate.Struct Usage(ltfield=Start)
+ Validating by field validate.FieldWithValue(start, end, "ltfield")
ltefield
Only valid for Numbers and time.Time types, this will validate the field value
against another fields value either within a struct or passed in field.
usage examples are for validation of a Start and End date:
- Validation on End field using ValidateByStruct Usage(ltefield=Start)
- Validating by field ValidateFieldByTagAndValue(start, end, "ltefield")
+ Validation on End field using validate.Struct Usage(ltefield=Start)
+ Validating by field validate.FieldWithValue(start, end, "ltefield")
alpha
- This validates that a strings value contains alpha characters only
+ This validates that a string value contains alpha characters only
(Usage: alpha)
alphanum
- This validates that a strings value contains alphanumeric characters only
+ This validates that a string value contains alphanumeric characters only
(Usage: alphanum)
numeric
- This validates that a strings value contains a basic numeric value.
+ This validates that a string value contains a basic numeric value.
basic excludes exponents etc...
(Usage: numeric)
hexadecimal
- This validates that a strings value contains a valid hexadecimal.
+ This validates that a string value contains a valid hexadecimal.
(Usage: hexadecimal)
hexcolor
- This validates that a strings value contains a valid hex color including
+ This validates that a string value contains a valid hex color including
hashtag (#)
(Usage: hexcolor)
rgb
- This validates that a strings value contains a valid rgb color
+ This validates that a string value contains a valid rgb color
(Usage: rgb)
rgba
- This validates that a strings value contains a valid rgba color
+ This validates that a string value contains a valid rgba color
(Usage: rgba)
hsl
- This validates that a strings value contains a valid hsl color
+ This validates that a string value contains a valid hsl color
(Usage: hsl)
hsla
- This validates that a strings value contains a valid hsla color
+ This validates that a string value contains a valid hsla color
(Usage: hsla)
email
- This validates that a strings value contains a valid email
+ This validates that a string value contains a valid email
This may not conform to all possibilities of any rfc standard, but neither
does any email provider accept all posibilities...
(Usage: email)
+
url
- This validates that a strings value contains a valid url
+ This validates that a string value contains a valid url
This will accept any url the golang request uri accepts but must contain
a schema for example http:// or rtmp://
(Usage: url)
+
uri
- This validates that a strings value contains a valid uri
+ This validates that a string value contains a valid uri
This will accept any uri the golang request uri accepts (Usage: uri)
+ base64
+ This validates that a string value contains a valid base64 value.
+ Although an empty string is valid base64 this will report an empty string
+ as an error, if you wish to accept an empty string as valid you can use
+ this with the omitempty tag. (Usage: base64)
+
+ contains
+ This validates that a string value contains the substring value.
+ (Usage: contains=@)
+
+ containsany
+ This validates that a string value contains any Unicode code points
+ in the substring value. (Usage: containsany=!@#?)
+
+ containsrune
+ This validates that a string value contains the supplied rune value.
+ (Usage: containsrune=@)
+
+ excludes
+ This validates that a string value does not contain the substring value.
+ (Usage: excludes=@)
+
+ excludesall
+ This validates that a string value does not contain any Unicode code
+ points in the substring value. (Usage: excludesall=!@#?)
+
+ excludesrune
+ This validates that a string value does not contain the supplied rune value.
+ (Usage: excludesrune=@)
+
+ isbn
+ This validates that a string value contains a valid isbn10 or isbn13 value.
+ (Usage: isbn)
+
+ isbn10
+ This validates that a string value contains a valid isbn10 value.
+ (Usage: isbn10)
+
+ isbn13
+ This validates that a string value contains a valid isbn13 value.
+ (Usage: isbn13)
+
+ uuid
+ This validates that a string value contains a valid UUID.
+ (Usage: uuid)
+
+ uuid3
+ This validates that a string value contains a valid version 3 UUID.
+ (Usage: uuid3)
+
+ uuid4
+ This validates that a string value contains a valid version 4 UUID.
+ (Usage: uuid4)
+
+ uuid5
+ This validates that a string value contains a valid version 5 UUID.
+ (Usage: uuid5)
+
+ ascii
+ This validates that a string value contains only ASCII characters.
+ NOTE: if the string is blank, this validates as true.
+ (Usage: ascii)
+
+ asciiprint
+ This validates that a string value contains only printable ASCII characters.
+ NOTE: if the string is blank, this validates as true.
+ (Usage: asciiprint)
+
+ multibyte
+ This validates that a string value contains one or more multibyte characters.
+ NOTE: if the string is blank, this validates as true.
+ (Usage: multibyte)
+
+ datauri
+ This validates that a string value contains a valid DataURI.
+ NOTE: this will also validate that the data portion is valid base64
+ (Usage: datauri)
+
+ latitude
+ This validates that a string value contains a valid latitude.
+ (Usage: latitude)
+
+ longitude
+ This validates that a string value contains a valid longitude.
+ (Usage: longitude)
+
+ ssn
+ This validates that a string value contains a valid U.S. Social Security Number.
+ (Usage: ssn)
+
Validator notes:
regex
@@ -314,7 +463,7 @@ Validator notes:
used within the validator function and even be precompiled for better efficiency
within regexes.go.
- And the best reason, you can sumit a pull request and we can keep on adding to the
+ And the best reason, you can submit a pull request and we can keep on adding to the
validation library of this package!
Panics
@@ -329,6 +478,6 @@ This package panics when bad input is provided, this is by design, bad code like
TestField: "Test"
}
- myValidator.ValidateStruct(t) // this will panic
+ validate.Struct(t) // this will panic
*/
package validator
diff --git a/vendor/gopkg.in/bluesuncorp/validator.v5/examples/simple.go b/vendor/gopkg.in/bluesuncorp/validator.v5/examples/simple.go
new file mode 100644
index 000000000..59cb1a938
--- /dev/null
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/examples/simple.go
@@ -0,0 +1,85 @@
+package main
+
+import (
+ "fmt"
+
+ "gopkg.in/bluesuncorp/validator.v5"
+)
+
+// User contains user information
+type User struct {
+ FirstName string `validate:"required"`
+ LastName string `validate:"required"`
+ Age uint8 `validate:"gte=0,lte=130"`
+ Email string `validate:"required,email"`
+ FavouriteColor string `validate:"hexcolor|rgb|rgba"`
+ Addresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage...
+}
+
+// Address houses a users address information
+type Address struct {
+ Street string `validate:"required"`
+ City string `validate:"required"`
+ Planet string `validate:"required"`
+ Phone string `validate:"required"`
+}
+
+var validate *validator.Validate
+
+func main() {
+
+ validate = validator.New("validate", validator.BakedInValidators)
+
+ address := &Address{
+ Street: "Eavesdown Docks",
+ Planet: "Persphone",
+ Phone: "none",
+ }
+
+ user := &User{
+ FirstName: "Badger",
+ LastName: "Smith",
+ Age: 135,
+ Email: "Badger.Smith@gmail.com",
+ FavouriteColor: "#000",
+ Addresses: []*Address{address},
+ }
+
+ // returns nil or *StructErrors
+ errs := validate.Struct(user)
+
+ if errs != nil {
+
+ // err will be of type *FieldError
+ err := errs.Errors["Age"]
+ fmt.Println(err.Error()) // output: Field validation for "Age" failed on the "lte" tag
+ fmt.Println(err.Field) // output: Age
+ fmt.Println(err.Tag) // output: lte
+ fmt.Println(err.Kind) // output: uint8
+ fmt.Println(err.Type) // output: uint8
+ fmt.Println(err.Param) // output: 130
+ fmt.Println(err.Value) // output: 135
+
+ // or if you prefer you can use the Flatten function
+ // NOTE: I find this usefull when using a more hard static approach of checking field errors.
+ // The above, is best for passing to some generic code to say parse the errors. i.e. I pass errs
+ // to a routine which loops through the errors, creates and translates the error message into the
+ // users locale and returns a map of map[string]string // field and error which I then use
+ // within the HTML rendering.
+
+ flat := errs.Flatten()
+ fmt.Println(flat) // output: map[Age:Field validation for "Age" failed on the "lte" tag Addresses[0].Address.City:Field validation for "City" failed on the "required" tag]
+ err = flat["Addresses[0].Address.City"]
+ fmt.Println(err.Field) // output: City
+ fmt.Println(err.Tag) // output: required
+ fmt.Println(err.Kind) // output: string
+ fmt.Println(err.Type) // output: string
+ fmt.Println(err.Param) // output:
+ fmt.Println(err.Value) // output:
+
+ // from here you can create your own error messages in whatever language you wish
+ return
+ }
+
+ // save user to database
+}
diff --git a/vendor/gopkg.in/bluesuncorp/validator.v5/examples_test.go b/vendor/gopkg.in/bluesuncorp/validator.v5/examples_test.go
new file mode 100644
index 000000000..c5dd3517d
--- /dev/null
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/examples_test.go
@@ -0,0 +1,95 @@
+package validator_test
+
+import (
+ "fmt"
+
+ "../validator"
+)
+
+func ExampleValidate_new() {
+ validator.New("validate", validator.BakedInValidators)
+}
+
+func ExampleValidate_addFunction() {
+ // This should be stored somewhere globally
+ var validate *validator.Validate
+
+ validate = validator.New("validate", validator.BakedInValidators)
+
+ fn := func(top interface{}, current interface{}, field interface{}, param string) bool {
+ return field.(string) == "hello"
+ }
+
+ validate.AddFunction("valueishello", fn)
+
+ message := "hello"
+ err := validate.Field(message, "valueishello")
+ fmt.Println(err)
+ //Output:
+ //
+}
+
+func ExampleValidate_field() {
+ // This should be stored somewhere globally
+ var validate *validator.Validate
+
+ validate = validator.New("validate", validator.BakedInValidators)
+
+ i := 0
+ err := validate.Field(i, "gt=1,lte=10")
+ fmt.Println(err.Field)
+ fmt.Println(err.Tag)
+ fmt.Println(err.Kind) // NOTE: Kind and Type can be different i.e. time Kind=struct and Type=time.Time
+ fmt.Println(err.Type)
+ fmt.Println(err.Param)
+ fmt.Println(err.Value)
+ //Output:
+ //
+ //gt
+ //int
+ //int
+ //1
+ //0
+}
+
+func ExampleValidate_struct() {
+ // This should be stored somewhere globally
+ var validate *validator.Validate
+
+ validate = validator.New("validate", validator.BakedInValidators)
+
+ type ContactInformation struct {
+ Phone string `validate:"required"`
+ Street string `validate:"required"`
+ City string `validate:"required"`
+ }
+
+ type User struct {
+ Name string `validate:"required,excludesall=!@#$%^&*()_+-=:;?/0x2C"` // 0x2C = comma (,)
+ Age int8 `validate:"required,gt=0,lt=150"`
+ Email string `validate:"email"`
+ ContactInformation []*ContactInformation
+ }
+
+ contactInfo := &ContactInformation{
+ Street: "26 Here Blvd.",
+ City: "Paradeso",
+ }
+
+ user := &User{
+ Name: "Joey Bloggs",
+ Age: 31,
+ Email: "joeybloggs@gmail.com",
+ ContactInformation: []*ContactInformation{contactInfo},
+ }
+
+ structError := validate.Struct(user)
+ for _, fieldError := range structError.Errors {
+ fmt.Println(fieldError.Field) // Phone
+ fmt.Println(fieldError.Tag) // required
+ //... and so forth
+ //Output:
+ //Phone
+ //required
+ }
+}
diff --git a/vendor/gopkg.in/bluesuncorp/validator.v5/regexes.go b/vendor/gopkg.in/bluesuncorp/validator.v5/regexes.go
new file mode 100644
index 000000000..d3e8d80ee
--- /dev/null
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/regexes.go
@@ -0,0 +1,64 @@
+package validator
+
+import "regexp"
+
+const (
+ alphaRegexString = "^[a-zA-Z]+$"
+ alphaNumericRegexString = "^[a-zA-Z0-9]+$"
+ numericRegexString = "^[-+]?[0-9]+(?:\\.[0-9]+)?$"
+ numberRegexString = "^[0-9]+$"
+ hexadecimalRegexString = "^[0-9a-fA-F]+$"
+ hexcolorRegexString = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
+ rgbRegexString = "^rgb\\(\\s*(?:(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])|(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%)\\s*\\)$"
+ rgbaRegexString = "^rgba\\(\\s*(?:(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])|(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$"
+ hslRegexString = "^hsl\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*\\)$"
+ hslaRegexString = "^hsla\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$"
+ emailRegexString = "^(?:(?:(?:(?:[a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(?:\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|(?:(?:\\x22)(?:(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(?:\\x20|\\x09)+)?(?:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:\\(?:[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(\\x20|\\x09)+)?(?:\\x22)))@(?:(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
+ base64RegexString = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"
+ iSBN10RegexString = "^(?:[0-9]{9}X|[0-9]{10})$"
+ iSBN13RegexString = "^(?:(?:97(?:8|9))[0-9]{10})$"
+ uUID3RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"
+ uUID4RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
+ uUID5RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
+ uUIDRegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
+ aSCIIRegexString = "^[\x00-\x7F]*$"
+ printableASCIIRegexString = "^[\x20-\x7E]*$"
+ multibyteRegexString = "[^\x00-\x7F]"
+ dataURIRegexString = "^data:.+\\/(.+);base64$"
+ latitudeRegexString = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$"
+ longitudeRegexString = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"
+ sSNRegexString = `^\d{3}[- ]?\d{2}[- ]?\d{4}$`
+)
+
+var (
+ alphaRegex = regexp.MustCompile(alphaRegexString)
+ alphaNumericRegex = regexp.MustCompile(alphaNumericRegexString)
+ numericRegex = regexp.MustCompile(numericRegexString)
+ numberRegex = regexp.MustCompile(numberRegexString)
+ hexadecimalRegex = regexp.MustCompile(hexadecimalRegexString)
+ hexcolorRegex = regexp.MustCompile(hexcolorRegexString)
+ rgbRegex = regexp.MustCompile(rgbRegexString)
+ rgbaRegex = regexp.MustCompile(rgbaRegexString)
+ hslRegex = regexp.MustCompile(hslRegexString)
+ hslaRegex = regexp.MustCompile(hslaRegexString)
+ emailRegex = regexp.MustCompile(emailRegexString)
+ base64Regex = regexp.MustCompile(base64RegexString)
+ iSBN10Regex = regexp.MustCompile(iSBN10RegexString)
+ iSBN13Regex = regexp.MustCompile(iSBN13RegexString)
+ uUID3Regex = regexp.MustCompile(uUID3RegexString)
+ uUID4Regex = regexp.MustCompile(uUID4RegexString)
+ uUID5Regex = regexp.MustCompile(uUID5RegexString)
+ uUIDRegex = regexp.MustCompile(uUIDRegexString)
+ aSCIIRegex = regexp.MustCompile(aSCIIRegexString)
+ printableASCIIRegex = regexp.MustCompile(printableASCIIRegexString)
+ multibyteRegex = regexp.MustCompile(multibyteRegexString)
+ dataURIRegex = regexp.MustCompile(dataURIRegexString)
+ latitudeRegex = regexp.MustCompile(latitudeRegexString)
+ longitudeRegex = regexp.MustCompile(longitudeRegexString)
+ sSNRegex = regexp.MustCompile(sSNRegexString)
+)
+
+func matchesRegex(regex *regexp.Regexp, field interface{}) bool {
+ fieldAsString := field.(string) //this will panic inherently
+ return regex.MatchString(fieldAsString)
+}
diff --git a/vendor/gopkg.in/bluesuncorp/validator.v5/validator.go b/vendor/gopkg.in/bluesuncorp/validator.v5/validator.go
new file mode 100644
index 000000000..f195647ba
--- /dev/null
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/validator.go
@@ -0,0 +1,1031 @@
+/**
+ * Package validator
+ *
+ * MISC:
+ * - anonymous structs - they don't have names so expect the Struct name within StructErrors to be blank
+ *
+ */
+
+package validator
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "reflect"
+ "strings"
+ "sync"
+ "time"
+ "unicode"
+)
+
+const (
+ utf8HexComma = "0x2C"
+ tagSeparator = ","
+ orSeparator = "|"
+ noValidationTag = "-"
+ tagKeySeparator = "="
+ structOnlyTag = "structonly"
+ omitempty = "omitempty"
+ required = "required"
+ fieldErrMsg = "Field validation for \"%s\" failed on the \"%s\" tag"
+ sliceErrMsg = "Field validation for \"%s\" failed at index \"%d\" with error(s): %s"
+ mapErrMsg = "Field validation for \"%s\" failed on key \"%v\" with error(s): %s"
+ structErrMsg = "Struct:%s\n"
+ diveTag = "dive"
+ existsTag = "exists"
+ arrayIndexFieldName = "%s[%d]"
+ mapIndexFieldName = "%s[%v]"
+)
+
+var structPool *sync.Pool
+
+// returns new *StructErrors to the pool
+func newStructErrors() interface{} {
+ return &StructErrors{
+ Errors: map[string]*FieldError{},
+ StructErrors: map[string]*StructErrors{},
+ }
+}
+
+type cachedTags struct {
+ keyVals [][]string
+ isOrVal bool
+}
+
+type cachedField struct {
+ index int
+ name string
+ tags []*cachedTags
+ tag string
+ kind reflect.Kind
+ typ reflect.Type
+ isTime bool
+ isSliceOrArray bool
+ isMap bool
+ isTimeSubtype bool
+ sliceSubtype reflect.Type
+ mapSubtype reflect.Type
+ sliceSubKind reflect.Kind
+ mapSubKind reflect.Kind
+ dive bool
+ diveTag string
+}
+
+type cachedStruct struct {
+ children int
+ name string
+ kind reflect.Kind
+ fields []*cachedField
+}
+
+type structsCacheMap struct {
+ lock sync.RWMutex
+ m map[reflect.Type]*cachedStruct
+}
+
+func (s *structsCacheMap) Get(key reflect.Type) (*cachedStruct, bool) {
+ s.lock.RLock()
+ defer s.lock.RUnlock()
+ value, ok := s.m[key]
+ return value, ok
+}
+
+func (s *structsCacheMap) Set(key reflect.Type, value *cachedStruct) {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+ s.m[key] = value
+}
+
+var structCache = &structsCacheMap{m: map[reflect.Type]*cachedStruct{}}
+
+type fieldsCacheMap struct {
+ lock sync.RWMutex
+ m map[string][]*cachedTags
+}
+
+func (s *fieldsCacheMap) Get(key string) ([]*cachedTags, bool) {
+ s.lock.RLock()
+ defer s.lock.RUnlock()
+ value, ok := s.m[key]
+ return value, ok
+}
+
+func (s *fieldsCacheMap) Set(key string, value []*cachedTags) {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+ s.m[key] = value
+}
+
+var fieldsCache = &fieldsCacheMap{m: map[string][]*cachedTags{}}
+
+// FieldError contains a single field's validation error along
+// with other properties that may be needed for error message creation
+type FieldError struct {
+ Field string
+ Tag string
+ Kind reflect.Kind
+ Type reflect.Type
+ Param string
+ Value interface{}
+ IsPlaceholderErr bool
+ IsSliceOrArray bool
+ IsMap bool
+ SliceOrArrayErrs map[int]error // counld be FieldError, StructErrors
+ MapErrs map[interface{}]error // counld be FieldError, StructErrors
+}
+
+// This is intended for use in development + debugging and not intended to be a production error message.
+// it also allows FieldError to be used as an Error interface
+func (e *FieldError) Error() string {
+
+ if e.IsPlaceholderErr {
+
+ buff := bytes.NewBufferString("")
+
+ if e.IsSliceOrArray {
+
+ for j, err := range e.SliceOrArrayErrs {
+ buff.WriteString("\n")
+ buff.WriteString(fmt.Sprintf(sliceErrMsg, e.Field, j, "\n"+err.Error()))
+ }
+
+ } else if e.IsMap {
+
+ for key, err := range e.MapErrs {
+ buff.WriteString(fmt.Sprintf(mapErrMsg, e.Field, key, "\n"+err.Error()))
+ }
+ }
+
+ return strings.TrimSpace(buff.String())
+ }
+
+ return fmt.Sprintf(fieldErrMsg, e.Field, e.Tag)
+}
+
+// Flatten flattens the FieldError hierarchical structure into a flat namespace style field name
+// for those that want/need it.
+// This is now needed because of the new dive functionality
+func (e *FieldError) Flatten() map[string]*FieldError {
+
+ errs := map[string]*FieldError{}
+
+ if e.IsPlaceholderErr {
+
+ if e.IsSliceOrArray {
+ for key, err := range e.SliceOrArrayErrs {
+
+ fe, ok := err.(*FieldError)
+
+ if ok {
+
+ if flat := fe.Flatten(); flat != nil && len(flat) > 0 {
+ for k, v := range flat {
+ if fe.IsPlaceholderErr {
+ errs[fmt.Sprintf("[%#v]%s", key, k)] = v
+ } else {
+ errs[fmt.Sprintf("[%#v]", key)] = v
+ }
+
+ }
+ }
+ } else {
+
+ se := err.(*StructErrors)
+
+ if flat := se.Flatten(); flat != nil && len(flat) > 0 {
+ for k, v := range flat {
+ errs[fmt.Sprintf("[%#v].%s.%s", key, se.Struct, k)] = v
+ }
+ }
+ }
+ }
+ }
+
+ if e.IsMap {
+ for key, err := range e.MapErrs {
+
+ fe, ok := err.(*FieldError)
+
+ if ok {
+
+ if flat := fe.Flatten(); flat != nil && len(flat) > 0 {
+ for k, v := range flat {
+ if fe.IsPlaceholderErr {
+ errs[fmt.Sprintf("[%#v]%s", key, k)] = v
+ } else {
+ errs[fmt.Sprintf("[%#v]", key)] = v
+ }
+ }
+ }
+ } else {
+
+ se := err.(*StructErrors)
+
+ if flat := se.Flatten(); flat != nil && len(flat) > 0 {
+ for k, v := range flat {
+ errs[fmt.Sprintf("[%#v].%s.%s", key, se.Struct, k)] = v
+ }
+ }
+ }
+ }
+ }
+
+ return errs
+ }
+
+ errs[e.Field] = e
+
+ return errs
+}
+
+// StructErrors is hierarchical list of field and struct validation errors
+// for a non hierarchical representation please see the Flatten method for StructErrors
+type StructErrors struct {
+ // Name of the Struct
+ Struct string
+ // Struct Field Errors
+ Errors map[string]*FieldError
+ // Struct Fields of type struct and their errors
+ // key = Field Name of current struct, but internally Struct will be the actual struct name unless anonymous struct, it will be blank
+ StructErrors map[string]*StructErrors
+}
+
+// This is intended for use in development + debugging and not intended to be a production error message.
+// it also allows StructErrors to be used as an Error interface
+func (e *StructErrors) Error() string {
+ buff := bytes.NewBufferString(fmt.Sprintf(structErrMsg, e.Struct))
+
+ for _, err := range e.Errors {
+ buff.WriteString(err.Error())
+ buff.WriteString("\n")
+ }
+
+ for _, err := range e.StructErrors {
+ buff.WriteString(err.Error())
+ }
+
+ return strings.TrimSpace(buff.String())
+}
+
+// Flatten flattens the StructErrors hierarchical structure into a flat namespace style field name
+// for those that want/need it
+func (e *StructErrors) Flatten() map[string]*FieldError {
+
+ if e == nil {
+ return nil
+ }
+
+ errs := map[string]*FieldError{}
+
+ for _, f := range e.Errors {
+
+ if flat := f.Flatten(); flat != nil && len(flat) > 0 {
+
+ for k, fe := range flat {
+
+ if f.IsPlaceholderErr {
+ errs[f.Field+k] = fe
+ } else {
+ errs[k] = fe
+ }
+ }
+ }
+ }
+
+ for key, val := range e.StructErrors {
+
+ otherErrs := val.Flatten()
+
+ for _, f2 := range otherErrs {
+
+ f2.Field = fmt.Sprintf("%s.%s", key, f2.Field)
+ errs[f2.Field] = f2
+ }
+ }
+
+ return errs
+}
+
+// Func accepts all values needed for file and cross field validation
+// top = top level struct when validating by struct otherwise nil
+// current = current level struct when validating by struct otherwise optional comparison value
+// f = field value for validation
+// param = parameter used in validation i.e. gt=0 param would be 0
+type Func func(top interface{}, current interface{}, f interface{}, param string) bool
+
+// Validate implements the Validate Struct
+// NOTE: Fields within are not thread safe and that is on purpose
+// Functions and Tags should all be predifined before use, so subscribe to the philosiphy
+// or make it thread safe on your end
+type Validate struct {
+ // tagName being used.
+ tagName string
+ // validateFuncs is a map of validation functions and the tag keys
+ validationFuncs map[string]Func
+}
+
+// New creates a new Validate instance for use.
+func New(tagName string, funcs map[string]Func) *Validate {
+
+ structPool = &sync.Pool{New: newStructErrors}
+
+ return &Validate{
+ tagName: tagName,
+ validationFuncs: funcs,
+ }
+}
+
+// SetTag sets tagName of the Validator to one of your choosing after creation
+// perhaps to dodge a tag name conflict in a specific section of code
+// NOTE: this method is not thread-safe
+func (v *Validate) SetTag(tagName string) {
+ v.tagName = tagName
+}
+
+// SetMaxStructPoolSize sets the struct pools max size. this may be usefull for fine grained
+// performance tuning towards your application, however, the default should be fine for
+// nearly all cases. only increase if you have a deeply nested struct structure.
+// NOTE: this method is not thread-safe
+// NOTE: this is only here to keep compatibility with v5, in v6 the method will be removed
+func (v *Validate) SetMaxStructPoolSize(max int) {
+ structPool = &sync.Pool{New: newStructErrors}
+}
+
+// AddFunction adds a validation Func to a Validate's map of validators denoted by the key
+// NOTE: if the key already exists, it will get replaced.
+// NOTE: this method is not thread-safe
+func (v *Validate) AddFunction(key string, f Func) error {
+
+ if len(key) == 0 {
+ return errors.New("Function Key cannot be empty")
+ }
+
+ if f == nil {
+ return errors.New("Function cannot be empty")
+ }
+
+ v.validationFuncs[key] = f
+
+ return nil
+}
+
+// Struct validates a struct, even it's nested structs, and returns a struct containing the errors
+// NOTE: Nested Arrays, or Maps of structs do not get validated only the Array or Map itself; the reason is that there is no good
+// way to represent or report which struct within the array has the error, besides can validate the struct prior to adding it to
+// the Array or Map.
+func (v *Validate) Struct(s interface{}) *StructErrors {
+
+ return v.structRecursive(s, s, s)
+}
+
+// structRecursive validates a struct recursivly and passes the top level and current struct around for use in validator functions and returns a struct containing the errors
+func (v *Validate) structRecursive(top interface{}, current interface{}, s interface{}) *StructErrors {
+
+ structValue := reflect.ValueOf(s)
+
+ if structValue.Kind() == reflect.Ptr && !structValue.IsNil() {
+ return v.structRecursive(top, current, structValue.Elem().Interface())
+ }
+
+ if structValue.Kind() != reflect.Struct && structValue.Kind() != reflect.Interface {
+ panic("interface passed for validation is not a struct")
+ }
+
+ structType := reflect.TypeOf(s)
+
+ var structName string
+ var numFields int
+ var cs *cachedStruct
+ var isCached bool
+
+ cs, isCached = structCache.Get(structType)
+
+ if isCached {
+ structName = cs.name
+ numFields = cs.children
+ } else {
+ structName = structType.Name()
+ numFields = structValue.NumField()
+ cs = &cachedStruct{name: structName, children: numFields}
+ }
+
+ validationErrors := structPool.Get().(*StructErrors)
+ validationErrors.Struct = structName
+
+ for i := 0; i < numFields; i++ {
+
+ var valueField reflect.Value
+ var cField *cachedField
+ var typeField reflect.StructField
+
+ if isCached {
+ cField = cs.fields[i]
+ valueField = structValue.Field(cField.index)
+
+ if valueField.Kind() == reflect.Ptr && !valueField.IsNil() {
+ valueField = valueField.Elem()
+ }
+ } else {
+ valueField = structValue.Field(i)
+
+ if valueField.Kind() == reflect.Ptr && !valueField.IsNil() {
+ valueField = valueField.Elem()
+ }
+
+ typeField = structType.Field(i)
+
+ cField = &cachedField{index: i, tag: typeField.Tag.Get(v.tagName), isTime: (valueField.Type() == reflect.TypeOf(time.Time{}) || valueField.Type() == reflect.TypeOf(&time.Time{}))}
+
+ if cField.tag == noValidationTag {
+ cs.children--
+ continue
+ }
+
+ // if no validation and not a struct (which may containt fields for validation)
+ if cField.tag == "" && ((valueField.Kind() != reflect.Struct && valueField.Kind() != reflect.Interface) || valueField.Type() == reflect.TypeOf(time.Time{})) {
+ cs.children--
+ continue
+ }
+
+ cField.name = typeField.Name
+ cField.kind = valueField.Kind()
+ cField.typ = valueField.Type()
+ }
+
+ // this can happen if the first cache value was nil
+ // but the second actually has a value
+ if cField.kind == reflect.Ptr {
+ cField.kind = valueField.Kind()
+ }
+
+ switch cField.kind {
+
+ case reflect.Struct, reflect.Interface:
+
+ if !unicode.IsUpper(rune(cField.name[0])) {
+ cs.children--
+ continue
+ }
+
+ if cField.isTime {
+
+ if fieldError := v.fieldWithNameAndValue(top, current, valueField.Interface(), cField.tag, cField.name, false, cField); fieldError != nil {
+ validationErrors.Errors[fieldError.Field] = fieldError
+ // free up memory reference
+ fieldError = nil
+ }
+
+ } else {
+
+ if strings.Contains(cField.tag, structOnlyTag) {
+ cs.children--
+ continue
+ }
+
+ if (valueField.Kind() == reflect.Ptr || cField.kind == reflect.Interface) && valueField.IsNil() {
+
+ if strings.Contains(cField.tag, omitempty) {
+ goto CACHEFIELD
+ }
+
+ tags := strings.Split(cField.tag, tagSeparator)
+
+ if len(tags) > 0 {
+
+ var param string
+ vals := strings.SplitN(tags[0], tagKeySeparator, 2)
+
+ if len(vals) > 1 {
+ param = vals[1]
+ }
+
+ validationErrors.Errors[cField.name] = &FieldError{
+ Field: cField.name,
+ Tag: vals[0],
+ Param: param,
+ Value: valueField.Interface(),
+ Kind: valueField.Kind(),
+ Type: valueField.Type(),
+ }
+
+ goto CACHEFIELD
+ }
+ }
+
+ // if we get here, the field is interface and could be a struct or a field
+ // and we need to check the inner type and validate
+ if cField.kind == reflect.Interface {
+
+ valueField = valueField.Elem()
+
+ if valueField.Kind() == reflect.Ptr && !valueField.IsNil() {
+ valueField = valueField.Elem()
+ }
+
+ if valueField.Kind() == reflect.Struct {
+ goto VALIDATESTRUCT
+ }
+
+ // sending nil for cField as it was type interface and could be anything
+ // each time and so must be calculated each time and can't be cached reliably
+ if fieldError := v.fieldWithNameAndValue(top, current, valueField.Interface(), cField.tag, cField.name, false, nil); fieldError != nil {
+ validationErrors.Errors[fieldError.Field] = fieldError
+ // free up memory reference
+ fieldError = nil
+ }
+
+ goto CACHEFIELD
+ }
+
+ VALIDATESTRUCT:
+ if structErrors := v.structRecursive(top, valueField.Interface(), valueField.Interface()); structErrors != nil {
+ validationErrors.StructErrors[cField.name] = structErrors
+ // free up memory map no longer needed
+ structErrors = nil
+ }
+ }
+
+ case reflect.Slice, reflect.Array:
+ cField.isSliceOrArray = true
+ cField.sliceSubtype = cField.typ.Elem()
+ cField.isTimeSubtype = (cField.sliceSubtype == reflect.TypeOf(time.Time{}) || cField.sliceSubtype == reflect.TypeOf(&time.Time{}))
+ cField.sliceSubKind = cField.sliceSubtype.Kind()
+
+ if fieldError := v.fieldWithNameAndValue(top, current, valueField.Interface(), cField.tag, cField.name, false, cField); fieldError != nil {
+ validationErrors.Errors[fieldError.Field] = fieldError
+ // free up memory reference
+ fieldError = nil
+ }
+
+ case reflect.Map:
+ cField.isMap = true
+ cField.mapSubtype = cField.typ.Elem()
+ cField.isTimeSubtype = (cField.mapSubtype == reflect.TypeOf(time.Time{}) || cField.mapSubtype == reflect.TypeOf(&time.Time{}))
+ cField.mapSubKind = cField.mapSubtype.Kind()
+
+ if fieldError := v.fieldWithNameAndValue(top, current, valueField.Interface(), cField.tag, cField.name, false, cField); fieldError != nil {
+ validationErrors.Errors[fieldError.Field] = fieldError
+ // free up memory reference
+ fieldError = nil
+ }
+
+ default:
+ if fieldError := v.fieldWithNameAndValue(top, current, valueField.Interface(), cField.tag, cField.name, false, cField); fieldError != nil {
+ validationErrors.Errors[fieldError.Field] = fieldError
+ // free up memory reference
+ fieldError = nil
+ }
+ }
+
+ CACHEFIELD:
+ if !isCached {
+ cs.fields = append(cs.fields, cField)
+ }
+ }
+
+ structCache.Set(structType, cs)
+
+ if len(validationErrors.Errors) == 0 && len(validationErrors.StructErrors) == 0 {
+ structPool.Put(validationErrors)
+ return nil
+ }
+
+ return validationErrors
+}
+
+// Field allows validation of a single field, still using tag style validation to check multiple errors
+func (v *Validate) Field(f interface{}, tag string) *FieldError {
+ return v.FieldWithValue(nil, f, tag)
+}
+
+// FieldWithValue allows validation of a single field, possibly even against another fields value, still using tag style validation to check multiple errors
+func (v *Validate) FieldWithValue(val interface{}, f interface{}, tag string) *FieldError {
+ return v.fieldWithNameAndValue(nil, val, f, tag, "", true, nil)
+}
+
+func (v *Validate) fieldWithNameAndValue(val interface{}, current interface{}, f interface{}, tag string, name string, isSingleField bool, cacheField *cachedField) *FieldError {
+
+ var cField *cachedField
+ var isCached bool
+ var valueField reflect.Value
+
+ // This is a double check if coming from validate.Struct but need to be here in case function is called directly
+ if tag == noValidationTag || tag == "" {
+ return nil
+ }
+
+ if strings.Contains(tag, omitempty) && !hasValue(val, current, f, "") {
+ return nil
+ }
+
+ valueField = reflect.ValueOf(f)
+
+ if cacheField == nil {
+
+ if valueField.Kind() == reflect.Ptr && !valueField.IsNil() {
+ valueField = valueField.Elem()
+ f = valueField.Interface()
+ }
+
+ cField = &cachedField{name: name, kind: valueField.Kind(), tag: tag}
+
+ if cField.kind != reflect.Invalid {
+ cField.typ = valueField.Type()
+ }
+
+ switch cField.kind {
+ case reflect.Slice, reflect.Array:
+ isSingleField = false // cached tags mean nothing because it will be split up while diving
+ cField.isSliceOrArray = true
+ cField.sliceSubtype = cField.typ.Elem()
+ cField.isTimeSubtype = (cField.sliceSubtype == reflect.TypeOf(time.Time{}) || cField.sliceSubtype == reflect.TypeOf(&time.Time{}))
+ cField.sliceSubKind = cField.sliceSubtype.Kind()
+ case reflect.Map:
+ isSingleField = false // cached tags mean nothing because it will be split up while diving
+ cField.isMap = true
+ cField.mapSubtype = cField.typ.Elem()
+ cField.isTimeSubtype = (cField.mapSubtype == reflect.TypeOf(time.Time{}) || cField.mapSubtype == reflect.TypeOf(&time.Time{}))
+ cField.mapSubKind = cField.mapSubtype.Kind()
+ }
+ } else {
+ cField = cacheField
+ }
+
+ switch cField.kind {
+ case reflect.Invalid:
+ return &FieldError{
+ Field: cField.name,
+ Tag: cField.tag,
+ Kind: cField.kind,
+ }
+
+ case reflect.Struct, reflect.Interface:
+
+ if cField.typ != reflect.TypeOf(time.Time{}) {
+ panic("Invalid field passed to fieldWithNameAndValue")
+ }
+ }
+
+ if len(cField.tags) == 0 {
+
+ if isSingleField {
+ cField.tags, isCached = fieldsCache.Get(tag)
+ }
+
+ if !isCached {
+
+ for _, t := range strings.Split(tag, tagSeparator) {
+
+ if t == diveTag {
+
+ cField.dive = true
+ cField.diveTag = strings.TrimLeft(strings.SplitN(tag, diveTag, 2)[1], ",")
+ break
+ }
+
+ orVals := strings.Split(t, orSeparator)
+ cTag := &cachedTags{isOrVal: len(orVals) > 1, keyVals: make([][]string, len(orVals))}
+ cField.tags = append(cField.tags, cTag)
+
+ for i, val := range orVals {
+ vals := strings.SplitN(val, tagKeySeparator, 2)
+
+ key := strings.TrimSpace(vals[0])
+
+ if len(key) == 0 {
+ panic(fmt.Sprintf("Invalid validation tag on field %s", name))
+ }
+
+ param := ""
+ if len(vals) > 1 {
+ param = strings.Replace(vals[1], utf8HexComma, ",", -1)
+ }
+
+ cTag.keyVals[i] = []string{key, param}
+ }
+ }
+
+ if isSingleField {
+ fieldsCache.Set(cField.tag, cField.tags)
+ }
+ }
+ }
+
+ var fieldErr *FieldError
+ var err error
+
+ for _, cTag := range cField.tags {
+
+ if cTag.isOrVal {
+
+ errTag := ""
+
+ for _, val := range cTag.keyVals {
+
+ // if (idxField.Kind() == reflect.Ptr || idxField.Kind() == reflect.Interface) && idxField.IsNil() {
+ // if val[0] == existsTag {
+ // if (cField.kind == reflect.Ptr || cField.kind == reflect.Interface) && valueField.IsNil() {
+ // fieldErr = &FieldError{
+ // Field: name,
+ // Tag: val[0],
+ // Value: f,
+ // Param: val[1],
+ // }
+ // err = errors.New(fieldErr.Tag)
+ // }
+
+ // } else {
+
+ fieldErr, err = v.fieldWithNameAndSingleTag(val, current, f, val[0], val[1], name)
+ // }
+
+ if err == nil {
+ return nil
+ }
+
+ errTag += orSeparator + fieldErr.Tag
+ }
+
+ errTag = strings.TrimLeft(errTag, orSeparator)
+
+ fieldErr.Tag = errTag
+ fieldErr.Kind = cField.kind
+ fieldErr.Type = cField.typ
+
+ return fieldErr
+ }
+
+ if cTag.keyVals[0][0] == existsTag {
+ if (cField.kind == reflect.Ptr || cField.kind == reflect.Interface) && valueField.IsNil() {
+ return &FieldError{
+ Field: name,
+ Tag: cTag.keyVals[0][0],
+ Value: f,
+ Param: cTag.keyVals[0][1],
+ }
+ }
+ continue
+ }
+
+ if fieldErr, err = v.fieldWithNameAndSingleTag(val, current, f, cTag.keyVals[0][0], cTag.keyVals[0][1], name); err != nil {
+
+ fieldErr.Kind = cField.kind
+ fieldErr.Type = cField.typ
+
+ return fieldErr
+ }
+ }
+
+ if cField.dive {
+
+ if cField.isSliceOrArray {
+
+ if errs := v.traverseSliceOrArray(val, current, valueField, cField); errs != nil && len(errs) > 0 {
+
+ return &FieldError{
+ Field: cField.name,
+ Kind: cField.kind,
+ Type: cField.typ,
+ Value: f,
+ IsPlaceholderErr: true,
+ IsSliceOrArray: true,
+ SliceOrArrayErrs: errs,
+ }
+ }
+
+ } else if cField.isMap {
+ if errs := v.traverseMap(val, current, valueField, cField); errs != nil && len(errs) > 0 {
+
+ return &FieldError{
+ Field: cField.name,
+ Kind: cField.kind,
+ Type: cField.typ,
+ Value: f,
+ IsPlaceholderErr: true,
+ IsMap: true,
+ MapErrs: errs,
+ }
+ }
+ } else {
+ // throw error, if not a slice or map then should not have gotten here
+ panic("dive error! can't dive on a non slice or map")
+ }
+ }
+
+ return nil
+}
+
+func (v *Validate) traverseMap(val interface{}, current interface{}, valueField reflect.Value, cField *cachedField) map[interface{}]error {
+
+ errs := map[interface{}]error{}
+
+ for _, key := range valueField.MapKeys() {
+
+ idxField := valueField.MapIndex(key)
+
+ if cField.mapSubKind == reflect.Ptr && !idxField.IsNil() {
+ idxField = idxField.Elem()
+ cField.mapSubKind = idxField.Kind()
+ }
+
+ switch cField.mapSubKind {
+ case reflect.Struct, reflect.Interface:
+
+ if cField.isTimeSubtype {
+
+ if fieldError := v.fieldWithNameAndValue(val, current, idxField.Interface(), cField.diveTag, fmt.Sprintf(mapIndexFieldName, cField.name, key.Interface()), false, nil); fieldError != nil {
+ errs[key.Interface()] = fieldError
+ }
+
+ continue
+ }
+
+ if (idxField.Kind() == reflect.Ptr || idxField.Kind() == reflect.Interface) && idxField.IsNil() {
+
+ if strings.Contains(cField.diveTag, omitempty) {
+ continue
+ }
+
+ tags := strings.Split(cField.diveTag, tagSeparator)
+
+ if len(tags) > 0 {
+
+ var param string
+ vals := strings.SplitN(tags[0], tagKeySeparator, 2)
+
+ if len(vals) > 1 {
+ param = vals[1]
+ }
+
+ errs[key.Interface()] = &FieldError{
+ Field: fmt.Sprintf(mapIndexFieldName, cField.name, key.Interface()),
+ Tag: vals[0],
+ Param: param,
+ Value: idxField.Interface(),
+ Kind: idxField.Kind(),
+ Type: cField.mapSubtype,
+ }
+ }
+
+ continue
+ }
+
+ // if we get here, the field is interface and could be a struct or a field
+ // and we need to check the inner type and validate
+ if idxField.Kind() == reflect.Interface {
+
+ idxField = idxField.Elem()
+
+ if idxField.Kind() == reflect.Ptr && !idxField.IsNil() {
+ idxField = idxField.Elem()
+ }
+
+ if idxField.Kind() == reflect.Struct {
+ goto VALIDATESTRUCT
+ }
+
+ // sending nil for cField as it was type interface and could be anything
+ // each time and so must be calculated each time and can't be cached reliably
+ if fieldError := v.fieldWithNameAndValue(val, current, idxField.Interface(), cField.diveTag, fmt.Sprintf(mapIndexFieldName, cField.name, key.Interface()), false, nil); fieldError != nil {
+ errs[key.Interface()] = fieldError
+ }
+
+ continue
+ }
+
+ VALIDATESTRUCT:
+ if structErrors := v.structRecursive(val, current, idxField.Interface()); structErrors != nil {
+ errs[key.Interface()] = structErrors
+ }
+
+ default:
+ if fieldError := v.fieldWithNameAndValue(val, current, idxField.Interface(), cField.diveTag, fmt.Sprintf(mapIndexFieldName, cField.name, key.Interface()), false, nil); fieldError != nil {
+ errs[key.Interface()] = fieldError
+ }
+ }
+ }
+
+ return errs
+}
+
+func (v *Validate) traverseSliceOrArray(val interface{}, current interface{}, valueField reflect.Value, cField *cachedField) map[int]error {
+
+ errs := map[int]error{}
+
+ for i := 0; i < valueField.Len(); i++ {
+
+ idxField := valueField.Index(i)
+
+ if cField.sliceSubKind == reflect.Ptr && !idxField.IsNil() {
+ idxField = idxField.Elem()
+ cField.sliceSubKind = idxField.Kind()
+ }
+
+ switch cField.sliceSubKind {
+ case reflect.Struct, reflect.Interface:
+
+ if cField.isTimeSubtype {
+
+ if fieldError := v.fieldWithNameAndValue(val, current, idxField.Interface(), cField.diveTag, fmt.Sprintf(arrayIndexFieldName, cField.name, i), false, nil); fieldError != nil {
+ errs[i] = fieldError
+ }
+
+ continue
+ }
+
+ if (idxField.Kind() == reflect.Ptr || idxField.Kind() == reflect.Interface) && idxField.IsNil() {
+
+ if strings.Contains(cField.diveTag, omitempty) {
+ continue
+ }
+
+ tags := strings.Split(cField.diveTag, tagSeparator)
+
+ if len(tags) > 0 {
+
+ var param string
+ vals := strings.SplitN(tags[0], tagKeySeparator, 2)
+
+ if len(vals) > 1 {
+ param = vals[1]
+ }
+
+ errs[i] = &FieldError{
+ Field: fmt.Sprintf(arrayIndexFieldName, cField.name, i),
+ Tag: vals[0],
+ Param: param,
+ Value: idxField.Interface(),
+ Kind: idxField.Kind(),
+ Type: cField.sliceSubtype,
+ }
+ }
+
+ continue
+ }
+
+ // if we get here, the field is interface and could be a struct or a field
+ // and we need to check the inner type and validate
+ if idxField.Kind() == reflect.Interface {
+
+ idxField = idxField.Elem()
+
+ if idxField.Kind() == reflect.Ptr && !idxField.IsNil() {
+ idxField = idxField.Elem()
+ }
+
+ if idxField.Kind() == reflect.Struct {
+ goto VALIDATESTRUCT
+ }
+
+ // sending nil for cField as it was type interface and could be anything
+ // each time and so must be calculated each time and can't be cached reliably
+ if fieldError := v.fieldWithNameAndValue(val, current, idxField.Interface(), cField.diveTag, fmt.Sprintf(arrayIndexFieldName, cField.name, i), false, nil); fieldError != nil {
+ errs[i] = fieldError
+ }
+
+ continue
+ }
+
+ VALIDATESTRUCT:
+ if structErrors := v.structRecursive(val, current, idxField.Interface()); structErrors != nil {
+ errs[i] = structErrors
+ }
+
+ default:
+ if fieldError := v.fieldWithNameAndValue(val, current, idxField.Interface(), cField.diveTag, fmt.Sprintf(arrayIndexFieldName, cField.name, i), false, nil); fieldError != nil {
+ errs[i] = fieldError
+ }
+ }
+ }
+
+ return errs
+}
+
+func (v *Validate) fieldWithNameAndSingleTag(val interface{}, current interface{}, f interface{}, key string, param string, name string) (*FieldError, error) {
+
+ // OK to continue because we checked it's existance before getting into this loop
+ if key == omitempty {
+ return nil, nil
+ }
+
+ // if key == existsTag {
+ // continue
+ // }
+
+ valFunc, ok := v.validationFuncs[key]
+ if !ok {
+ panic(fmt.Sprintf("Undefined validation function on field %s", name))
+ }
+
+ if err := valFunc(val, current, f, param); err {
+ return nil, nil
+ }
+
+ return &FieldError{
+ Field: name,
+ Tag: key,
+ Value: f,
+ Param: param,
+ }, errors.New(key)
+}
diff --git a/vendor/gopkg.in/bluesuncorp/validator.v5/validator_test.go b/vendor/gopkg.in/bluesuncorp/validator.v5/validator_test.go
new file mode 100644
index 000000000..fb6fa9dc7
--- /dev/null
+++ b/vendor/gopkg.in/bluesuncorp/validator.v5/validator_test.go
@@ -0,0 +1,3927 @@
+package validator
+
+import (
+ "encoding/json"
+ "fmt"
+ "path"
+ "reflect"
+ "runtime"
+ "testing"
+ "time"
+)
+
+// NOTES:
+// - Run "go test" to run tests
+// - Run "gocov test | gocov report" to report on test converage by file
+// - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called
+//
+// or
+//
+// -- may be a good idea to change to output path to somewherelike /tmp
+// go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html
+//
+//
+// go test -cpuprofile cpu.out
+// ./validator.test -test.bench=. -test.cpuprofile=cpu.prof
+// go tool pprof validator.test cpu.prof
+//
+//
+// go test -memprofile mem.out
+
+type I interface {
+ Foo() string
+}
+
+type Impl struct {
+ F string `validate:"len=3"`
+}
+
+func (i *Impl) Foo() string {
+ return i.F
+}
+
+type SubTest struct {
+ Test string `validate:"required"`
+}
+
+type TestInterface struct {
+ Iface I
+}
+
+type TestString struct {
+ BlankTag string `validate:""`
+ Required string `validate:"required"`
+ Len string `validate:"len=10"`
+ Min string `validate:"min=1"`
+ Max string `validate:"max=10"`
+ MinMax string `validate:"min=1,max=10"`
+ Lt string `validate:"lt=10"`
+ Lte string `validate:"lte=10"`
+ Gt string `validate:"gt=10"`
+ Gte string `validate:"gte=10"`
+ OmitEmpty string `validate:"omitempty,min=1,max=10"`
+ Sub *SubTest
+ SubIgnore *SubTest `validate:"-"`
+ Anonymous struct {
+ A string `validate:"required"`
+ }
+ Iface I
+}
+
+type TestInt32 struct {
+ Required int `validate:"required"`
+ Len int `validate:"len=10"`
+ Min int `validate:"min=1"`
+ Max int `validate:"max=10"`
+ MinMax int `validate:"min=1,max=10"`
+ Lt int `validate:"lt=10"`
+ Lte int `validate:"lte=10"`
+ Gt int `validate:"gt=10"`
+ Gte int `validate:"gte=10"`
+ OmitEmpty int `validate:"omitempty,min=1,max=10"`
+}
+
+type TestUint64 struct {
+ Required uint64 `validate:"required"`
+ Len uint64 `validate:"len=10"`
+ Min uint64 `validate:"min=1"`
+ Max uint64 `validate:"max=10"`
+ MinMax uint64 `validate:"min=1,max=10"`
+ OmitEmpty uint64 `validate:"omitempty,min=1,max=10"`
+}
+
+type TestFloat64 struct {
+ Required float64 `validate:"required"`
+ Len float64 `validate:"len=10"`
+ Min float64 `validate:"min=1"`
+ Max float64 `validate:"max=10"`
+ MinMax float64 `validate:"min=1,max=10"`
+ Lte float64 `validate:"lte=10"`
+ OmitEmpty float64 `validate:"omitempty,min=1,max=10"`
+}
+
+type TestSlice struct {
+ Required []int `validate:"required"`
+ Len []int `validate:"len=10"`
+ Min []int `validate:"min=1"`
+ Max []int `validate:"max=10"`
+ MinMax []int `validate:"min=1,max=10"`
+ OmitEmpty []int `validate:"omitempty,min=1,max=10"`
+}
+
+var validate = New("validate", BakedInValidators)
+
+func IsEqual(t *testing.T, val1, val2 interface{}) bool {
+ v1 := reflect.ValueOf(val1)
+ v2 := reflect.ValueOf(val2)
+
+ if v1.Kind() == reflect.Ptr {
+ v1 = v1.Elem()
+ }
+
+ if v2.Kind() == reflect.Ptr {
+ v2 = v2.Elem()
+ }
+
+ if !v1.IsValid() && !v2.IsValid() {
+ return true
+ }
+
+ v1Underlying := reflect.Zero(reflect.TypeOf(v1)).Interface()
+ v2Underlying := reflect.Zero(reflect.TypeOf(v2)).Interface()
+
+ if v1 == v1Underlying {
+ if v2 == v2Underlying {
+ goto CASE4
+ } else {
+ goto CASE3
+ }
+ } else {
+ if v2 == v2Underlying {
+ goto CASE2
+ } else {
+ goto CASE1
+ }
+ }
+
+CASE1:
+ return reflect.DeepEqual(v1.Interface(), v2.Interface())
+
+CASE2:
+ return reflect.DeepEqual(v1.Interface(), v2)
+CASE3:
+ return reflect.DeepEqual(v1, v2.Interface())
+CASE4:
+ return reflect.DeepEqual(v1, v2)
+}
+
+func Equal(t *testing.T, val1, val2 interface{}) {
+ EqualSkip(t, 2, val1, val2)
+}
+
+func EqualSkip(t *testing.T, skip int, val1, val2 interface{}) {
+
+ if !IsEqual(t, val1, val2) {
+
+ _, file, line, _ := runtime.Caller(skip)
+ fmt.Printf("%s:%d %v does not equal %v\n", path.Base(file), line, val1, val2)
+ t.FailNow()
+ }
+}
+
+func NotEqual(t *testing.T, val1, val2 interface{}) {
+ NotEqualSkip(t, 2, val1, val2)
+}
+
+func NotEqualSkip(t *testing.T, skip int, val1, val2 interface{}) {
+
+ if IsEqual(t, val1, val2) {
+ _, file, line, _ := runtime.Caller(skip)
+ fmt.Printf("%s:%d %v should not be equal %v\n", path.Base(file), line, val1, val2)
+ t.FailNow()
+ }
+}
+
+func PanicMatches(t *testing.T, fn func(), matches string) {
+ PanicMatchesSkip(t, 2, fn, matches)
+}
+
+func PanicMatchesSkip(t *testing.T, skip int, fn func(), matches string) {
+
+ _, file, line, _ := runtime.Caller(skip)
+
+ defer func() {
+ if r := recover(); r != nil {
+ err := fmt.Sprintf("%s", r)
+
+ if err != matches {
+ fmt.Printf("%s:%d Panic... expected [%s] received [%s]", path.Base(file), line, matches, err)
+ t.FailNow()
+ }
+ }
+ }()
+
+ fn()
+}
+
+func AssertStruct(t *testing.T, s *StructErrors, structFieldName string, expectedStructName string) *StructErrors {
+
+ val, ok := s.StructErrors[structFieldName]
+ EqualSkip(t, 2, ok, true)
+ NotEqualSkip(t, 2, val, nil)
+ EqualSkip(t, 2, val.Struct, expectedStructName)
+
+ return val
+}
+
+func AssertFieldError(t *testing.T, s *StructErrors, field string, expectedTag string) {
+
+ val, ok := s.Errors[field]
+ EqualSkip(t, 2, ok, true)
+ NotEqualSkip(t, 2, val, nil)
+ EqualSkip(t, 2, val.Field, field)
+ EqualSkip(t, 2, val.Tag, expectedTag)
+}
+
+func AssertMapFieldError(t *testing.T, s map[string]*FieldError, field string, expectedTag string) {
+
+ val, ok := s[field]
+ EqualSkip(t, 2, ok, true)
+ NotEqualSkip(t, 2, val, nil)
+ EqualSkip(t, 2, val.Field, field)
+ EqualSkip(t, 2, val.Tag, expectedTag)
+}
+
+func TestExistsValidation(t *testing.T) {
+
+ jsonText := "{ \"truthiness2\": true }"
+
+ type Thing struct {
+ Truthiness *bool `json:"truthiness" validate:"exists,required"`
+ }
+
+ var ting Thing
+
+ err := json.Unmarshal([]byte(jsonText), &ting)
+ Equal(t, err, nil)
+ NotEqual(t, ting, nil)
+ Equal(t, ting.Truthiness, nil)
+
+ errs := validate.Struct(ting)
+ NotEqual(t, errs, nil)
+ AssertFieldError(t, errs, "Truthiness", "exists")
+
+ jsonText = "{ \"truthiness\": true }"
+
+ err = json.Unmarshal([]byte(jsonText), &ting)
+ Equal(t, err, nil)
+ NotEqual(t, ting, nil)
+ Equal(t, ting.Truthiness, true)
+
+ errs = validate.Struct(ting)
+ Equal(t, errs, nil)
+}
+
+func TestSliceMapArrayChanFuncPtrInterfaceRequiredValidation(t *testing.T) {
+
+ var m map[string]string
+
+ errs := validate.Field(m, "required")
+ NotEqual(t, errs, nil)
+ // AssertError(t, errs, "", "", "required")
+
+ m = map[string]string{}
+ errs = validate.Field(m, "required")
+ Equal(t, errs, nil)
+
+ var arr [5]string
+ errs = validate.Field(arr, "required")
+ NotEqual(t, errs, nil)
+ // AssertError(t, errs, "", "", "required")
+
+ arr[0] = "ok"
+ errs = validate.Field(arr, "required")
+ Equal(t, errs, nil)
+
+ var s []string
+ errs = validate.Field(s, "required")
+ NotEqual(t, errs, nil)
+ // AssertError(t, errs, "", "", "required")
+
+ s = []string{}
+ errs = validate.Field(s, "required")
+ Equal(t, errs, nil)
+
+ var c chan string
+ errs = validate.Field(c, "required")
+ NotEqual(t, errs, nil)
+ // AssertError(t, errs, "", "", "required")
+
+ c = make(chan string)
+ errs = validate.Field(c, "required")
+ Equal(t, errs, nil)
+
+ var tst *int
+ errs = validate.Field(tst, "required")
+ NotEqual(t, errs, nil)
+ // AssertError(t, errs, "", "", "required")
+
+ one := 1
+ tst = &one
+ errs = validate.Field(tst, "required")
+ Equal(t, errs, nil)
+
+ var iface interface{}
+
+ errs = validate.Field(iface, "required")
+ NotEqual(t, errs, nil)
+ // AssertError(t, errs, "", "", "required")
+
+ errs = validate.Field(iface, "omitempty,required")
+ Equal(t, errs, nil)
+
+ errs = validate.Field(iface, "")
+ Equal(t, errs, nil)
+
+ errs = validate.Field(iface, "len=1")
+ NotEqual(t, errs, nil)
+
+ var f func(string)
+
+ errs = validate.Field(f, "required")
+ NotEqual(t, errs, nil)
+ // AssertError(t, errs, "", "", "required")
+
+ f = func(name string) {}
+
+ errs = validate.Field(f, "required")
+ Equal(t, errs, nil)
+}
+
+func TestBadKeyValidation(t *testing.T) {
+ type Test struct {
+ Name string `validate:"required, "`
+ }
+
+ tst := &Test{
+ Name: "test",
+ }
+
+ PanicMatches(t, func() { validate.Struct(tst) }, "Invalid validation tag on field Name")
+}
+
+func TestFlattenValidation(t *testing.T) {
+
+ type Inner struct {
+ Name string `validate:"required"`
+ }
+
+ type TestMultiDimensionalStructsPtr struct {
+ Errs [][]*Inner `validate:"gt=0,dive,dive,required"`
+ }
+
+ var errStructPtrArray [][]*Inner
+
+ errStructPtrArray = append(errStructPtrArray, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{"ok"}})
+
+ tmsp := &TestMultiDimensionalStructsPtr{
+ Errs: errStructPtrArray,
+ }
+
+ errs := validate.Struct(tmsp)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+ // for full test coverage
+ fmt.Sprint(errs.Error())
+
+ fieldErr := errs.Errors["Errs"]
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, fieldErr.Field, "Errs")
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 1)
+
+ innerSlice1, ok := fieldErr.SliceOrArrayErrs[0].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerSlice1.IsPlaceholderErr, true)
+ Equal(t, innerSlice1.Field, "Errs[0]")
+
+ flatFieldErr, ok := fieldErr.Flatten()["[0][1].Inner.Name"]
+ Equal(t, ok, true)
+ Equal(t, flatFieldErr.Field, "Name")
+ Equal(t, flatFieldErr.Tag, "required")
+
+ structErrFlatten, ok := errs.Flatten()["Errs[0][1].Inner.Name"]
+ Equal(t, ok, true)
+ Equal(t, structErrFlatten.Field, "Name")
+ Equal(t, structErrFlatten.Tag, "required")
+
+ errStructPtrArray = [][]*Inner{}
+ errStructPtrArray = append(errStructPtrArray, []*Inner{&Inner{"ok"}, nil, &Inner{"ok"}})
+
+ tmsp = &TestMultiDimensionalStructsPtr{
+ Errs: errStructPtrArray,
+ }
+
+ errs = validate.Struct(tmsp)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+ // for full test coverage
+ fmt.Sprint(errs.Error())
+
+ fieldErr = errs.Errors["Errs"]
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, fieldErr.Field, "Errs")
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 1)
+
+ innerSlice1, ok = fieldErr.SliceOrArrayErrs[0].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerSlice1.IsPlaceholderErr, true)
+ Equal(t, innerSlice1.Field, "Errs[0]")
+
+ flatFieldErr, ok = fieldErr.Flatten()["[0][1]"]
+ Equal(t, ok, true)
+ Equal(t, flatFieldErr.Field, "Errs[0][1]")
+ Equal(t, flatFieldErr.Tag, "required")
+
+ type TestMapStructPtr struct {
+ Errs map[int]*Inner `validate:"gt=0,dive,required"`
+ }
+
+ mip := map[int]*Inner{0: &Inner{"ok"}, 3: &Inner{""}, 4: &Inner{"ok"}}
+
+ msp := &TestMapStructPtr{
+ Errs: mip,
+ }
+
+ errs = validate.Struct(msp)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldError := errs.Errors["Errs"]
+ Equal(t, fieldError.IsPlaceholderErr, true)
+ Equal(t, fieldError.IsMap, true)
+ Equal(t, len(fieldError.MapErrs), 1)
+
+ innerStructError, ok := fieldError.MapErrs[3].(*StructErrors)
+ Equal(t, ok, true)
+ Equal(t, innerStructError.Struct, "Inner")
+ Equal(t, len(innerStructError.Errors), 1)
+
+ innerInnerFieldError, ok := innerStructError.Errors["Name"]
+ Equal(t, ok, true)
+ Equal(t, innerInnerFieldError.IsPlaceholderErr, false)
+ Equal(t, innerInnerFieldError.IsSliceOrArray, false)
+ Equal(t, innerInnerFieldError.Field, "Name")
+ Equal(t, innerInnerFieldError.Tag, "required")
+
+ flatErrs, ok := errs.Flatten()["Errs[3].Inner.Name"]
+ Equal(t, ok, true)
+ Equal(t, flatErrs.Field, "Name")
+ Equal(t, flatErrs.Tag, "required")
+
+ mip2 := map[int]*Inner{0: &Inner{"ok"}, 3: nil, 4: &Inner{"ok"}}
+
+ msp2 := &TestMapStructPtr{
+ Errs: mip2,
+ }
+
+ errs = validate.Struct(msp2)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldError = errs.Errors["Errs"]
+ Equal(t, fieldError.IsPlaceholderErr, true)
+ Equal(t, fieldError.IsMap, true)
+ Equal(t, len(fieldError.MapErrs), 1)
+
+ innerFieldError, ok := fieldError.MapErrs[3].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerFieldError.IsPlaceholderErr, false)
+ Equal(t, innerFieldError.IsSliceOrArray, false)
+ Equal(t, innerFieldError.Field, "Errs[3]")
+ Equal(t, innerFieldError.Tag, "required")
+
+ flatErrs, ok = errs.Flatten()["Errs[3]"]
+ Equal(t, ok, true)
+ Equal(t, flatErrs.Field, "Errs[3]")
+ Equal(t, flatErrs.Tag, "required")
+
+ type TestMapInnerArrayStruct struct {
+ Errs map[int][]string `validate:"gt=0,dive,dive,required"`
+ }
+
+ mias := map[int][]string{0: []string{"ok"}, 3: []string{"ok", ""}, 4: []string{"ok"}}
+
+ mia := &TestMapInnerArrayStruct{
+ Errs: mias,
+ }
+
+ errs = validate.Struct(mia)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ flatErrs, ok = errs.Flatten()["Errs[3][1]"]
+ Equal(t, ok, true)
+ Equal(t, flatErrs.Field, "Errs[3][1]")
+ Equal(t, flatErrs.Tag, "required")
+}
+
+func TestInterfaceErrValidation(t *testing.T) {
+
+ var v1 interface{}
+ var v2 interface{}
+
+ v2 = 1
+ v1 = v2
+
+ err := validate.Field(v1, "len=1")
+ Equal(t, err, nil)
+ err = validate.Field(v2, "len=1")
+ Equal(t, err, nil)
+
+ type ExternalCMD struct {
+ Userid string `json:"userid"`
+ Action uint32 `json:"action"`
+ Data interface{} `json:"data,omitempty" validate:"required"`
+ }
+
+ s := &ExternalCMD{
+ Userid: "123456",
+ Action: 10000,
+ // Data: 1,
+ }
+
+ errs := validate.Struct(s)
+ NotEqual(t, errs, nil)
+ Equal(t, errs.Errors["Data"].Field, "Data")
+ Equal(t, errs.Errors["Data"].Tag, "required")
+
+ type ExternalCMD2 struct {
+ Userid string `json:"userid"`
+ Action uint32 `json:"action"`
+ Data interface{} `json:"data,omitempty" validate:"len=1"`
+ }
+
+ s2 := &ExternalCMD2{
+ Userid: "123456",
+ Action: 10000,
+ // Data: 1,
+ }
+
+ errs = validate.Struct(s2)
+ NotEqual(t, errs, nil)
+ Equal(t, errs.Errors["Data"].Field, "Data")
+ Equal(t, errs.Errors["Data"].Tag, "len")
+ Equal(t, errs.Errors["Data"].Param, "1")
+
+ s3 := &ExternalCMD2{
+ Userid: "123456",
+ Action: 10000,
+ Data: 2,
+ }
+
+ errs = validate.Struct(s3)
+ NotEqual(t, errs, nil)
+ Equal(t, errs.Errors["Data"].Field, "Data")
+ Equal(t, errs.Errors["Data"].Tag, "len")
+ Equal(t, errs.Errors["Data"].Param, "1")
+
+ type Inner struct {
+ Name string `validate:"required"`
+ }
+
+ inner := &Inner{
+ Name: "",
+ }
+
+ s4 := &ExternalCMD{
+ Userid: "123456",
+ Action: 10000,
+ Data: inner,
+ }
+
+ errs = validate.Struct(s4)
+ NotEqual(t, errs, nil)
+ Equal(t, errs.StructErrors["Data"].Struct, "Inner")
+ Equal(t, errs.StructErrors["Data"].Errors["Name"].Field, "Name")
+ Equal(t, errs.StructErrors["Data"].Errors["Name"].Tag, "required")
+
+ type TestMapStructPtr struct {
+ Errs map[int]interface{} `validate:"gt=0,dive,len=2"`
+ }
+
+ mip := map[int]interface{}{0: &Inner{"ok"}, 3: nil, 4: &Inner{"ok"}}
+
+ msp := &TestMapStructPtr{
+ Errs: mip,
+ }
+
+ errs = validate.Struct(msp)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldError := errs.Errors["Errs"]
+ Equal(t, fieldError.IsPlaceholderErr, true)
+ Equal(t, fieldError.IsMap, true)
+ Equal(t, len(fieldError.MapErrs), 1)
+
+ innerFieldError, ok := fieldError.MapErrs[3].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerFieldError.IsPlaceholderErr, false)
+ Equal(t, innerFieldError.IsMap, false)
+ Equal(t, len(innerFieldError.MapErrs), 0)
+ Equal(t, innerFieldError.Field, "Errs[3]")
+ Equal(t, innerFieldError.Tag, "len")
+
+ type TestMultiDimensionalStructs struct {
+ Errs [][]interface{} `validate:"gt=0,dive,dive,len=2"`
+ }
+
+ var errStructArray [][]interface{}
+
+ errStructArray = append(errStructArray, []interface{}{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructArray = append(errStructArray, []interface{}{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+
+ tms := &TestMultiDimensionalStructs{
+ Errs: errStructArray,
+ }
+
+ errs = validate.Struct(tms)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok := errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 2)
+
+ sliceError1, ok := fieldErr.SliceOrArrayErrs[0].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+
+ innerSliceStructError1, ok := sliceError1.SliceOrArrayErrs[1].(*StructErrors)
+ Equal(t, ok, true)
+ Equal(t, len(innerSliceStructError1.Errors), 1)
+
+ innerInnersliceError1 := innerSliceStructError1.Errors["Name"]
+ Equal(t, innerInnersliceError1.IsPlaceholderErr, false)
+ Equal(t, innerInnersliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerInnersliceError1.SliceOrArrayErrs), 0)
+
+ type TestMultiDimensionalStructsPtr2 struct {
+ Errs [][]*Inner `validate:"gt=0,dive,dive,len=2"`
+ }
+
+ var errStructPtr2Array [][]*Inner
+
+ errStructPtr2Array = append(errStructPtr2Array, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructPtr2Array = append(errStructPtr2Array, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructPtr2Array = append(errStructPtr2Array, []*Inner{&Inner{"ok"}, &Inner{""}, nil})
+
+ tmsp2 := &TestMultiDimensionalStructsPtr2{
+ Errs: errStructPtr2Array,
+ }
+
+ errs = validate.Struct(tmsp2)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 3)
+
+ sliceError1, ok = fieldErr.SliceOrArrayErrs[2].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+
+ innerSliceStructError1, ok = sliceError1.SliceOrArrayErrs[1].(*StructErrors)
+ Equal(t, ok, true)
+ Equal(t, len(innerSliceStructError1.Errors), 1)
+
+ innerSliceStructError2, ok := sliceError1.SliceOrArrayErrs[2].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerSliceStructError2.IsPlaceholderErr, false)
+ Equal(t, innerSliceStructError2.IsSliceOrArray, false)
+ Equal(t, len(innerSliceStructError2.SliceOrArrayErrs), 0)
+ Equal(t, innerSliceStructError2.Field, "Errs[2][2]")
+
+ innerInnersliceError1 = innerSliceStructError1.Errors["Name"]
+ Equal(t, innerInnersliceError1.IsPlaceholderErr, false)
+ Equal(t, innerInnersliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerInnersliceError1.SliceOrArrayErrs), 0)
+
+ m := map[int]interface{}{0: "ok", 3: "", 4: "ok"}
+
+ err = validate.Field(m, "len=3,dive,len=2")
+ NotEqual(t, err, nil)
+ Equal(t, err.IsPlaceholderErr, true)
+ Equal(t, err.IsMap, true)
+ Equal(t, len(err.MapErrs), 1)
+
+ err = validate.Field(m, "len=2,dive,required")
+ NotEqual(t, err, nil)
+ Equal(t, err.IsPlaceholderErr, false)
+ Equal(t, err.IsMap, false)
+ Equal(t, len(err.MapErrs), 0)
+
+ arr := []interface{}{"ok", "", "ok"}
+
+ err = validate.Field(arr, "len=3,dive,len=2")
+ NotEqual(t, err, nil)
+ Equal(t, err.IsPlaceholderErr, true)
+ Equal(t, err.IsSliceOrArray, true)
+ Equal(t, len(err.SliceOrArrayErrs), 1)
+
+ err = validate.Field(arr, "len=2,dive,required")
+ NotEqual(t, err, nil)
+ Equal(t, err.IsPlaceholderErr, false)
+ Equal(t, err.IsSliceOrArray, false)
+ Equal(t, len(err.SliceOrArrayErrs), 0)
+
+ type MyStruct struct {
+ A, B string
+ C interface{}
+ }
+
+ var a MyStruct
+
+ a.A = "value"
+ a.C = "nu"
+
+ errs = validate.Struct(a)
+ Equal(t, errs, nil)
+}
+
+func TestMapDiveValidation(t *testing.T) {
+
+ n := map[int]interface{}{0: nil}
+ err := validate.Field(n, "omitempty,required")
+
+ m := map[int]string{0: "ok", 3: "", 4: "ok"}
+
+ err = validate.Field(m, "len=3,dive,required")
+ NotEqual(t, err, nil)
+ Equal(t, err.IsPlaceholderErr, true)
+ Equal(t, err.IsMap, true)
+ Equal(t, len(err.MapErrs), 1)
+
+ err = validate.Field(m, "len=2,dive,required")
+ NotEqual(t, err, nil)
+ Equal(t, err.IsPlaceholderErr, false)
+ Equal(t, err.IsMap, false)
+ Equal(t, len(err.MapErrs), 0)
+
+ type Inner struct {
+ Name string `validate:"required"`
+ }
+
+ type TestMapStruct struct {
+ Errs map[int]Inner `validate:"gt=0,dive"`
+ }
+
+ mi := map[int]Inner{0: Inner{"ok"}, 3: Inner{""}, 4: Inner{"ok"}}
+
+ ms := &TestMapStruct{
+ Errs: mi,
+ }
+
+ errs := validate.Struct(ms)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+ // for full test coverage
+ fmt.Sprint(errs.Error())
+
+ fieldError := errs.Errors["Errs"]
+ Equal(t, fieldError.IsPlaceholderErr, true)
+ Equal(t, fieldError.IsMap, true)
+ Equal(t, len(fieldError.MapErrs), 1)
+
+ structErr, ok := fieldError.MapErrs[3].(*StructErrors)
+ Equal(t, ok, true)
+ Equal(t, len(structErr.Errors), 1)
+
+ innerErr := structErr.Errors["Name"]
+ Equal(t, innerErr.IsPlaceholderErr, false)
+ Equal(t, innerErr.IsMap, false)
+ Equal(t, len(innerErr.MapErrs), 0)
+ Equal(t, innerErr.Field, "Name")
+ Equal(t, innerErr.Tag, "required")
+
+ type TestMapTimeStruct struct {
+ Errs map[int]*time.Time `validate:"gt=0,dive,required"`
+ }
+
+ t1 := time.Now().UTC()
+
+ mta := map[int]*time.Time{0: &t1, 3: nil, 4: nil}
+
+ mt := &TestMapTimeStruct{
+ Errs: mta,
+ }
+
+ errs = validate.Struct(mt)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldError = errs.Errors["Errs"]
+ Equal(t, fieldError.IsPlaceholderErr, true)
+ Equal(t, fieldError.IsMap, true)
+ Equal(t, len(fieldError.MapErrs), 2)
+
+ innerErr, ok = fieldError.MapErrs[3].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerErr.IsPlaceholderErr, false)
+ Equal(t, innerErr.IsMap, false)
+ Equal(t, len(innerErr.MapErrs), 0)
+ Equal(t, innerErr.Field, "Errs[3]")
+ Equal(t, innerErr.Tag, "required")
+
+ type TestMapStructPtr struct {
+ Errs map[int]*Inner `validate:"gt=0,dive,required"`
+ }
+
+ mip := map[int]*Inner{0: &Inner{"ok"}, 3: nil, 4: &Inner{"ok"}}
+
+ msp := &TestMapStructPtr{
+ Errs: mip,
+ }
+
+ errs = validate.Struct(msp)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldError = errs.Errors["Errs"]
+ Equal(t, fieldError.IsPlaceholderErr, true)
+ Equal(t, fieldError.IsMap, true)
+ Equal(t, len(fieldError.MapErrs), 1)
+
+ innerFieldError, ok := fieldError.MapErrs[3].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerFieldError.IsPlaceholderErr, false)
+ Equal(t, innerFieldError.IsMap, false)
+ Equal(t, len(innerFieldError.MapErrs), 0)
+ Equal(t, innerFieldError.Field, "Errs[3]")
+ Equal(t, innerFieldError.Tag, "required")
+
+ type TestMapStructPtr2 struct {
+ Errs map[int]*Inner `validate:"gt=0,dive,omitempty,required"`
+ }
+
+ mip2 := map[int]*Inner{0: &Inner{"ok"}, 3: nil, 4: &Inner{"ok"}}
+
+ msp2 := &TestMapStructPtr2{
+ Errs: mip2,
+ }
+
+ errs = validate.Struct(msp2)
+ Equal(t, errs, nil)
+}
+
+func TestArrayDiveValidation(t *testing.T) {
+
+ arr := []string{"ok", "", "ok"}
+
+ err := validate.Field(arr, "len=3,dive,required")
+ NotEqual(t, err, nil)
+ Equal(t, err.IsPlaceholderErr, true)
+ Equal(t, err.IsSliceOrArray, true)
+ Equal(t, len(err.SliceOrArrayErrs), 1)
+
+ // flat := err.Flatten()
+ // fe, ok := flat["[1]"]
+ // Equal(t, ok, true)
+ // Equal(t, fe.Tag, "required")
+
+ err = validate.Field(arr, "len=2,dive,required")
+ NotEqual(t, err, nil)
+ Equal(t, err.IsPlaceholderErr, false)
+ Equal(t, err.IsSliceOrArray, false)
+ Equal(t, len(err.SliceOrArrayErrs), 0)
+
+ type BadDive struct {
+ Name string `validate:"dive"`
+ }
+
+ bd := &BadDive{
+ Name: "TEST",
+ }
+
+ PanicMatches(t, func() { validate.Struct(bd) }, "dive error! can't dive on a non slice or map")
+
+ type Test struct {
+ Errs []string `validate:"gt=0,dive,required"`
+ }
+
+ test := &Test{
+ Errs: []string{"ok", "", "ok"},
+ }
+
+ errs := validate.Struct(test)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ // flat = errs.Flatten()
+ // me, ok := flat["Errs[1]"]
+ // Equal(t, ok, true)
+ // Equal(t, me.Field, "Errs[1]")
+ // Equal(t, me.Tag, "required")
+
+ fieldErr, ok := errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 1)
+
+ innerErr, ok := fieldErr.SliceOrArrayErrs[1].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerErr.Tag, required)
+ Equal(t, innerErr.IsPlaceholderErr, false)
+ Equal(t, innerErr.Field, "Errs[1]")
+
+ test = &Test{
+ Errs: []string{"ok", "ok", ""},
+ }
+
+ errs = validate.Struct(test)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 1)
+
+ innerErr, ok = fieldErr.SliceOrArrayErrs[2].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerErr.Tag, required)
+ Equal(t, innerErr.IsPlaceholderErr, false)
+ Equal(t, innerErr.Field, "Errs[2]")
+
+ type TestMultiDimensional struct {
+ Errs [][]string `validate:"gt=0,dive,dive,required"`
+ }
+
+ var errArray [][]string
+
+ errArray = append(errArray, []string{"ok", "", ""})
+ errArray = append(errArray, []string{"ok", "", ""})
+
+ tm := &TestMultiDimensional{
+ Errs: errArray,
+ }
+
+ errs = validate.Struct(tm)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 2)
+
+ sliceError1, ok := fieldErr.SliceOrArrayErrs[0].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+ Equal(t, sliceError1.Field, "Errs[0]")
+
+ innerSliceError1, ok := sliceError1.SliceOrArrayErrs[1].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerSliceError1.IsPlaceholderErr, false)
+ Equal(t, innerSliceError1.Tag, required)
+ Equal(t, innerSliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerSliceError1.SliceOrArrayErrs), 0)
+ Equal(t, innerSliceError1.Field, "Errs[0][1]")
+
+ type Inner struct {
+ Name string `validate:"required"`
+ }
+
+ type TestMultiDimensionalStructs struct {
+ Errs [][]Inner `validate:"gt=0,dive,dive"`
+ }
+
+ var errStructArray [][]Inner
+
+ errStructArray = append(errStructArray, []Inner{Inner{"ok"}, Inner{""}, Inner{""}})
+ errStructArray = append(errStructArray, []Inner{Inner{"ok"}, Inner{""}, Inner{""}})
+
+ tms := &TestMultiDimensionalStructs{
+ Errs: errStructArray,
+ }
+
+ errs = validate.Struct(tms)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 2)
+
+ sliceError1, ok = fieldErr.SliceOrArrayErrs[0].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+
+ innerSliceStructError1, ok := sliceError1.SliceOrArrayErrs[1].(*StructErrors)
+ Equal(t, ok, true)
+ Equal(t, len(innerSliceStructError1.Errors), 1)
+
+ innerInnersliceError1 := innerSliceStructError1.Errors["Name"]
+ Equal(t, innerInnersliceError1.IsPlaceholderErr, false)
+ Equal(t, innerInnersliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerInnersliceError1.SliceOrArrayErrs), 0)
+
+ type TestMultiDimensionalStructsPtr struct {
+ Errs [][]*Inner `validate:"gt=0,dive,dive"`
+ }
+
+ var errStructPtrArray [][]*Inner
+
+ errStructPtrArray = append(errStructPtrArray, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructPtrArray = append(errStructPtrArray, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructPtrArray = append(errStructPtrArray, []*Inner{&Inner{"ok"}, &Inner{""}, nil})
+
+ tmsp := &TestMultiDimensionalStructsPtr{
+ Errs: errStructPtrArray,
+ }
+
+ errs = validate.Struct(tmsp)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+ // for full test coverage
+ fmt.Sprint(errs.Error())
+
+ // flat := errs.Flatten()
+ // // fmt.Println(errs)
+ // fmt.Println(flat)
+ // expect Errs[0][1].Inner.Name
+ // me, ok := flat["Errs[1]"]
+ // Equal(t, ok, true)
+ // Equal(t, me.Field, "Errs[1]")
+ // Equal(t, me.Tag, "required")
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 3)
+
+ // flat := fieldErr.Flatten()
+ // fmt.Println(errs)
+ // fmt.Println(flat)
+
+ sliceError1, ok = fieldErr.SliceOrArrayErrs[0].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+
+ innerSliceStructError1, ok = sliceError1.SliceOrArrayErrs[1].(*StructErrors)
+ Equal(t, ok, true)
+ Equal(t, len(innerSliceStructError1.Errors), 1)
+
+ innerInnersliceError1 = innerSliceStructError1.Errors["Name"]
+ Equal(t, innerInnersliceError1.IsPlaceholderErr, false)
+ Equal(t, innerInnersliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerInnersliceError1.SliceOrArrayErrs), 0)
+
+ type TestMultiDimensionalStructsPtr2 struct {
+ Errs [][]*Inner `validate:"gt=0,dive,dive,required"`
+ }
+
+ var errStructPtr2Array [][]*Inner
+
+ errStructPtr2Array = append(errStructPtr2Array, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructPtr2Array = append(errStructPtr2Array, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructPtr2Array = append(errStructPtr2Array, []*Inner{&Inner{"ok"}, &Inner{""}, nil})
+
+ tmsp2 := &TestMultiDimensionalStructsPtr2{
+ Errs: errStructPtr2Array,
+ }
+
+ errs = validate.Struct(tmsp2)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 3)
+
+ sliceError1, ok = fieldErr.SliceOrArrayErrs[2].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+
+ innerSliceStructError1, ok = sliceError1.SliceOrArrayErrs[1].(*StructErrors)
+ Equal(t, ok, true)
+ Equal(t, len(innerSliceStructError1.Errors), 1)
+
+ innerSliceStructError2, ok := sliceError1.SliceOrArrayErrs[2].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerSliceStructError2.IsPlaceholderErr, false)
+ Equal(t, innerSliceStructError2.IsSliceOrArray, false)
+ Equal(t, len(innerSliceStructError2.SliceOrArrayErrs), 0)
+ Equal(t, innerSliceStructError2.Field, "Errs[2][2]")
+
+ innerInnersliceError1 = innerSliceStructError1.Errors["Name"]
+ Equal(t, innerInnersliceError1.IsPlaceholderErr, false)
+ Equal(t, innerInnersliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerInnersliceError1.SliceOrArrayErrs), 0)
+
+ type TestMultiDimensionalStructsPtr3 struct {
+ Errs [][]*Inner `validate:"gt=0,dive,dive,omitempty"`
+ }
+
+ var errStructPtr3Array [][]*Inner
+
+ errStructPtr3Array = append(errStructPtr3Array, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructPtr3Array = append(errStructPtr3Array, []*Inner{&Inner{"ok"}, &Inner{""}, &Inner{""}})
+ errStructPtr3Array = append(errStructPtr3Array, []*Inner{&Inner{"ok"}, &Inner{""}, nil})
+
+ tmsp3 := &TestMultiDimensionalStructsPtr3{
+ Errs: errStructPtr3Array,
+ }
+
+ errs = validate.Struct(tmsp3)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 3)
+
+ sliceError1, ok = fieldErr.SliceOrArrayErrs[0].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+
+ innerSliceStructError1, ok = sliceError1.SliceOrArrayErrs[1].(*StructErrors)
+ Equal(t, ok, true)
+ Equal(t, len(innerSliceStructError1.Errors), 1)
+
+ innerInnersliceError1 = innerSliceStructError1.Errors["Name"]
+ Equal(t, innerInnersliceError1.IsPlaceholderErr, false)
+ Equal(t, innerInnersliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerInnersliceError1.SliceOrArrayErrs), 0)
+
+ type TestMultiDimensionalTimeTime struct {
+ Errs [][]*time.Time `validate:"gt=0,dive,dive,required"`
+ }
+
+ var errTimePtr3Array [][]*time.Time
+
+ t1 := time.Now().UTC()
+ t2 := time.Now().UTC()
+ t3 := time.Now().UTC().Add(time.Hour * 24)
+
+ errTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, &t2, &t3})
+ errTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, &t2, nil})
+ errTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, nil, nil})
+
+ tmtp3 := &TestMultiDimensionalTimeTime{
+ Errs: errTimePtr3Array,
+ }
+
+ errs = validate.Struct(tmtp3)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 2)
+
+ sliceError1, ok = fieldErr.SliceOrArrayErrs[2].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+
+ innerSliceError1, ok = sliceError1.SliceOrArrayErrs[1].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerSliceError1.IsPlaceholderErr, false)
+ Equal(t, innerSliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerSliceError1.SliceOrArrayErrs), 0)
+ Equal(t, innerSliceError1.Field, "Errs[2][1]")
+ Equal(t, innerSliceError1.Tag, required)
+
+ type TestMultiDimensionalTimeTime2 struct {
+ Errs [][]*time.Time `validate:"gt=0,dive,dive,required"`
+ }
+
+ var errTimeArray [][]*time.Time
+
+ t1 = time.Now().UTC()
+ t2 = time.Now().UTC()
+ t3 = time.Now().UTC().Add(time.Hour * 24)
+
+ errTimeArray = append(errTimeArray, []*time.Time{&t1, &t2, &t3})
+ errTimeArray = append(errTimeArray, []*time.Time{&t1, &t2, nil})
+ errTimeArray = append(errTimeArray, []*time.Time{&t1, nil, nil})
+
+ tmtp := &TestMultiDimensionalTimeTime2{
+ Errs: errTimeArray,
+ }
+
+ errs = validate.Struct(tmtp)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.Errors), 1)
+
+ fieldErr, ok = errs.Errors["Errs"]
+ Equal(t, ok, true)
+ Equal(t, fieldErr.IsPlaceholderErr, true)
+ Equal(t, fieldErr.IsSliceOrArray, true)
+ Equal(t, len(fieldErr.SliceOrArrayErrs), 2)
+
+ sliceError1, ok = fieldErr.SliceOrArrayErrs[2].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, sliceError1.IsPlaceholderErr, true)
+ Equal(t, sliceError1.IsSliceOrArray, true)
+ Equal(t, len(sliceError1.SliceOrArrayErrs), 2)
+
+ innerSliceError1, ok = sliceError1.SliceOrArrayErrs[1].(*FieldError)
+ Equal(t, ok, true)
+ Equal(t, innerSliceError1.IsPlaceholderErr, false)
+ Equal(t, innerSliceError1.IsSliceOrArray, false)
+ Equal(t, len(innerSliceError1.SliceOrArrayErrs), 0)
+ Equal(t, innerSliceError1.Field, "Errs[2][1]")
+ Equal(t, innerSliceError1.Tag, required)
+}
+
+func TestNilStructPointerValidation(t *testing.T) {
+ type Inner struct {
+ Data string
+ }
+
+ type Outer struct {
+ Inner *Inner `validate:"omitempty"`
+ }
+
+ inner := &Inner{
+ Data: "test",
+ }
+
+ outer := &Outer{
+ Inner: inner,
+ }
+
+ errs := validate.Struct(outer)
+ Equal(t, errs, nil)
+
+ outer = &Outer{
+ Inner: nil,
+ }
+
+ errs = validate.Struct(outer)
+ Equal(t, errs, nil)
+
+ type Inner2 struct {
+ Data string
+ }
+
+ type Outer2 struct {
+ Inner2 *Inner2 `validate:"required"`
+ }
+
+ inner2 := &Inner2{
+ Data: "test",
+ }
+
+ outer2 := &Outer2{
+ Inner2: inner2,
+ }
+
+ errs = validate.Struct(outer2)
+ Equal(t, errs, nil)
+
+ outer2 = &Outer2{
+ Inner2: nil,
+ }
+
+ errs = validate.Struct(outer2)
+ NotEqual(t, errs, nil)
+
+ type Inner3 struct {
+ Data string
+ }
+
+ type Outer3 struct {
+ Inner3 *Inner3
+ }
+
+ inner3 := &Inner3{
+ Data: "test",
+ }
+
+ outer3 := &Outer3{
+ Inner3: inner3,
+ }
+
+ errs = validate.Struct(outer3)
+ Equal(t, errs, nil)
+
+ type Inner4 struct {
+ Data string
+ }
+
+ type Outer4 struct {
+ Inner4 *Inner4 `validate:"-"`
+ }
+
+ inner4 := &Inner4{
+ Data: "test",
+ }
+
+ outer4 := &Outer4{
+ Inner4: inner4,
+ }
+
+ errs = validate.Struct(outer4)
+ Equal(t, errs, nil)
+}
+
+func TestSSNValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"00-90-8787", false},
+ {"66690-76", false},
+ {"191 60 2869", true},
+ {"191-60-2869", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "ssn")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d SSN failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "ssn") {
+ t.Fatalf("Index: %d SSN failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestLongitudeValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"-180.000", true},
+ {"180.1", false},
+ {"+73.234", true},
+ {"+382.3811", false},
+ {"23.11111111", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "longitude")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d Longitude failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "longitude") {
+ t.Fatalf("Index: %d Longitude failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestLatitudeValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"-90.000", true},
+ {"+90", true},
+ {"47.1231231", true},
+ {"+99.9", false},
+ {"108", false},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "latitude")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d Latitude failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "latitude") {
+ t.Fatalf("Index: %d Latitude failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestDataURIValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"data:image/png;base64,TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=", true},
+ {"data:text/plain;base64,Vml2YW11cyBmZXJtZW50dW0gc2VtcGVyIHBvcnRhLg==", true},
+ {"image/gif;base64,U3VzcGVuZGlzc2UgbGVjdHVzIGxlbw==", false},
+ {"data:image/gif;base64,MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuMPNS1Ufof9EW/M98FNw" +
+ "UAKrwflsqVxaxQjBQnHQmiI7Vac40t8x7pIb8gLGV6wL7sBTJiPovJ0V7y7oc0Ye" +
+ "rhKh0Rm4skP2z/jHwwZICgGzBvA0rH8xlhUiTvcwDCJ0kc+fh35hNt8srZQM4619" +
+ "FTgB66Xmp4EtVyhpQV+t02g6NzK72oZI0vnAvqhpkxLeLiMCyrI416wHm5Tkukhx" +
+ "QmcL2a6hNOyu0ixX/x2kSFXApEnVrJ+/IxGyfyw8kf4N2IZpW5nEP847lpfj0SZZ" +
+ "Fwrd1mnfnDbYohX2zRptLy2ZUn06Qo9pkG5ntvFEPo9bfZeULtjYzIl6K8gJ2uGZ" + "HQIDAQAB", true},
+ {"data:image/png;base64,12345", false},
+ {"", false},
+ {"data:text,:;base85,U3VzcGVuZGlzc2UgbGVjdHVzIGxlbw==", false},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "datauri")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d DataURI failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "datauri") {
+ t.Fatalf("Index: %d DataURI failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestMultibyteValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", true},
+ {"abc", false},
+ {"123", false},
+ {"<>@;.-=", false},
+ {"ひらがな・カタカナ、.漢字", true},
+ {"あいうえお foobar", true},
+ {"test@example.com", true},
+ {"test@example.com", true},
+ {"1234abcDExyz", true},
+ {"カタカナ", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "multibyte")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d Multibyte failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "multibyte") {
+ t.Fatalf("Index: %d Multibyte failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestPrintableASCIIValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", true},
+ {"foobar", false},
+ {"xyz098", false},
+ {"123456", false},
+ {"カタカナ", false},
+ {"foobar", true},
+ {"0987654321", true},
+ {"test@example.com", true},
+ {"1234abcDEF", true},
+ {"newline\n", false},
+ {"\x19test\x7F", false},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "printascii")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d Printable ASCII failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "printascii") {
+ t.Fatalf("Index: %d Printable ASCII failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestASCIIValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", true},
+ {"foobar", false},
+ {"xyz098", false},
+ {"123456", false},
+ {"カタカナ", false},
+ {"foobar", true},
+ {"0987654321", true},
+ {"test@example.com", true},
+ {"1234abcDEF", true},
+ {"", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "ascii")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d ASCII failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "ascii") {
+ t.Fatalf("Index: %d ASCII failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestUUID5Validation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+
+ {"", false},
+ {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
+ {"9c858901-8a57-4791-81fe-4c455b099bc9", false},
+ {"a987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
+ {"987fbc97-4bed-5078-af07-9141ba07c9f3", true},
+ {"987fbc97-4bed-5078-9f07-9141ba07c9f3", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "uuid5")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d UUID5 failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "uuid5") {
+ t.Fatalf("Index: %d UUID5 failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestUUID4Validation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
+ {"a987fbc9-4bed-5078-af07-9141ba07c9f3", false},
+ {"934859", false},
+ {"57b73598-8764-4ad0-a76a-679bb6640eb1", true},
+ {"625e63f3-58f5-40b7-83a1-a72ad31acffb", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "uuid4")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d UUID4 failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "uuid4") {
+ t.Fatalf("Index: %d UUID4 failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestUUID3Validation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"412452646", false},
+ {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
+ {"a987fbc9-4bed-4078-8f07-9141ba07c9f3", false},
+ {"a987fbc9-4bed-3078-cf07-9141ba07c9f3", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "uuid3")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d UUID3 failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "uuid3") {
+ t.Fatalf("Index: %d UUID3 failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestUUIDValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3", false},
+ {"a987fbc9-4bed-3078-cf07-9141ba07c9f3xxx", false},
+ {"a987fbc94bed3078cf079141ba07c9f3", false},
+ {"934859", false},
+ {"987fbc9-4bed-3078-cf07a-9141ba07c9f3", false},
+ {"aaaaaaaa-1111-1111-aaag-111111111111", false},
+ {"a987fbc9-4bed-3078-cf07-9141ba07c9f3", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "uuid")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d UUID failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "uuid") {
+ t.Fatalf("Index: %d UUID failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestISBNValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"foo", false},
+ {"3836221195", true},
+ {"1-61729-085-8", true},
+ {"3 423 21412 0", true},
+ {"3 401 01319 X", true},
+ {"9784873113685", true},
+ {"978-4-87311-368-5", true},
+ {"978 3401013190", true},
+ {"978-3-8362-2119-1", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "isbn")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d ISBN failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "isbn") {
+ t.Fatalf("Index: %d ISBN failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestISBN13Validation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"foo", false},
+ {"3-8362-2119-5", false},
+ {"01234567890ab", false},
+ {"978 3 8362 2119 0", false},
+ {"9784873113685", true},
+ {"978-4-87311-368-5", true},
+ {"978 3401013190", true},
+ {"978-3-8362-2119-1", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "isbn13")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d ISBN13 failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "isbn13") {
+ t.Fatalf("Index: %d ISBN13 failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestISBN10Validation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"", false},
+ {"foo", false},
+ {"3423214121", false},
+ {"978-3836221191", false},
+ {"3-423-21412-1", false},
+ {"3 423 21412 1", false},
+ {"3836221195", true},
+ {"1-61729-085-8", true},
+ {"3 423 21412 0", true},
+ {"3 401 01319 X", true},
+ }
+
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "isbn10")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d ISBN10 failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "isbn10") {
+ t.Fatalf("Index: %d ISBN10 failed Error: %s", i, err)
+ }
+ }
+ }
+}
+
+func TestExcludesRuneValidation(t *testing.T) {
+
+ tests := []struct {
+ Value string `validate:"excludesrune=☻"`
+ Tag string
+ ExpectedNil bool
+ }{
+ {Value: "a☺b☻c☹d", Tag: "excludesrune=☻", ExpectedNil: false},
+ {Value: "abcd", Tag: "excludesrune=☻", ExpectedNil: true},
+ }
+
+ for i, s := range tests {
+ err := validate.Field(s.Value, s.Tag)
+
+ if (s.ExpectedNil && err != nil) || (!s.ExpectedNil && err == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, err)
+ }
+
+ errs := validate.Struct(s)
+
+ if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, errs)
+ }
+ }
+}
+
+func TestExcludesAllValidation(t *testing.T) {
+
+ tests := []struct {
+ Value string `validate:"excludesall=@!{}[]"`
+ Tag string
+ ExpectedNil bool
+ }{
+ {Value: "abcd@!jfk", Tag: "excludesall=@!{}[]", ExpectedNil: false},
+ {Value: "abcdefg", Tag: "excludesall=@!{}[]", ExpectedNil: true},
+ }
+
+ for i, s := range tests {
+ err := validate.Field(s.Value, s.Tag)
+
+ if (s.ExpectedNil && err != nil) || (!s.ExpectedNil && err == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, err)
+ }
+
+ errs := validate.Struct(s)
+
+ if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, errs)
+ }
+ }
+
+ username := "joeybloggs "
+
+ err := validate.Field(username, "excludesall=@ ")
+ NotEqual(t, err, nil)
+
+ excluded := ","
+
+ err = validate.Field(excluded, "excludesall=!@#$%^&*()_+.0x2C?")
+ NotEqual(t, err, nil)
+
+ excluded = "="
+
+ err = validate.Field(excluded, "excludesall=!@#$%^&*()_+.0x2C=?")
+ NotEqual(t, err, nil)
+}
+
+func TestExcludesValidation(t *testing.T) {
+
+ tests := []struct {
+ Value string `validate:"excludes=@"`
+ Tag string
+ ExpectedNil bool
+ }{
+ {Value: "abcd@!jfk", Tag: "excludes=@", ExpectedNil: false},
+ {Value: "abcdq!jfk", Tag: "excludes=@", ExpectedNil: true},
+ }
+
+ for i, s := range tests {
+ err := validate.Field(s.Value, s.Tag)
+
+ if (s.ExpectedNil && err != nil) || (!s.ExpectedNil && err == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, err)
+ }
+
+ errs := validate.Struct(s)
+
+ if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, errs)
+ }
+ }
+}
+
+func TestContainsRuneValidation(t *testing.T) {
+
+ tests := []struct {
+ Value string `validate:"containsrune=☻"`
+ Tag string
+ ExpectedNil bool
+ }{
+ {Value: "a☺b☻c☹d", Tag: "containsrune=☻", ExpectedNil: true},
+ {Value: "abcd", Tag: "containsrune=☻", ExpectedNil: false},
+ }
+
+ for i, s := range tests {
+ err := validate.Field(s.Value, s.Tag)
+
+ if (s.ExpectedNil && err != nil) || (!s.ExpectedNil && err == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, err)
+ }
+
+ errs := validate.Struct(s)
+
+ if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, errs)
+ }
+ }
+}
+
+func TestContainsAnyValidation(t *testing.T) {
+
+ tests := []struct {
+ Value string `validate:"containsany=@!{}[]"`
+ Tag string
+ ExpectedNil bool
+ }{
+ {Value: "abcd@!jfk", Tag: "containsany=@!{}[]", ExpectedNil: true},
+ {Value: "abcdefg", Tag: "containsany=@!{}[]", ExpectedNil: false},
+ }
+
+ for i, s := range tests {
+ err := validate.Field(s.Value, s.Tag)
+
+ if (s.ExpectedNil && err != nil) || (!s.ExpectedNil && err == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, err)
+ }
+
+ errs := validate.Struct(s)
+
+ if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, errs)
+ }
+ }
+}
+
+func TestContainsValidation(t *testing.T) {
+
+ tests := []struct {
+ Value string `validate:"contains=@"`
+ Tag string
+ ExpectedNil bool
+ }{
+ {Value: "abcd@!jfk", Tag: "contains=@", ExpectedNil: true},
+ {Value: "abcdq!jfk", Tag: "contains=@", ExpectedNil: false},
+ }
+
+ for i, s := range tests {
+ err := validate.Field(s.Value, s.Tag)
+
+ if (s.ExpectedNil && err != nil) || (!s.ExpectedNil && err == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, err)
+ }
+
+ errs := validate.Struct(s)
+
+ if (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {
+ t.Fatalf("Index: %d failed Error: %s", i, errs)
+ }
+ }
+}
+
+func TestIsNeFieldValidation(t *testing.T) {
+
+ var j uint64
+ var k float64
+ s := "abcd"
+ i := 1
+ j = 1
+ k = 1.543
+ arr := []string{"test"}
+ now := time.Now().UTC()
+
+ var j2 uint64
+ var k2 float64
+ s2 := "abcdef"
+ i2 := 3
+ j2 = 2
+ k2 = 1.5434456
+ arr2 := []string{"test", "test2"}
+ arr3 := []string{"test"}
+ now2 := now
+
+ err := validate.FieldWithValue(s, s2, "nefield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(i2, i, "nefield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(j2, j, "nefield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(k2, k, "nefield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(arr2, arr, "nefield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(now2, now, "nefield")
+ NotEqual(t, err, nil)
+
+ err = validate.FieldWithValue(arr3, arr, "nefield")
+ NotEqual(t, err, nil)
+
+ type Test struct {
+ Start *time.Time `validate:"nefield=End"`
+ End *time.Time
+ }
+
+ sv := &Test{
+ Start: &now,
+ End: &now,
+ }
+
+ errs := validate.Struct(sv)
+ NotEqual(t, errs, nil)
+
+ now3 := time.Now().UTC()
+
+ sv = &Test{
+ Start: &now,
+ End: &now3,
+ }
+
+ errs = validate.Struct(sv)
+ Equal(t, errs, nil)
+
+ channel := make(chan string)
+
+ PanicMatches(t, func() { validate.FieldWithValue(nil, 1, "nefield") }, "struct not passed for cross validation")
+ PanicMatches(t, func() { validate.FieldWithValue(5, channel, "nefield") }, "Bad field type chan string")
+ PanicMatches(t, func() { validate.FieldWithValue(5, now, "nefield") }, "Bad Top Level field type")
+
+ type Test2 struct {
+ Start *time.Time `validate:"nefield=NonExistantField"`
+ End *time.Time
+ }
+
+ sv2 := &Test2{
+ Start: &now,
+ End: &now,
+ }
+
+ PanicMatches(t, func() { validate.Struct(sv2) }, "Field \"NonExistantField\" not found in struct")
+}
+
+func TestIsNeValidation(t *testing.T) {
+
+ var j uint64
+ var k float64
+ s := "abcdef"
+ i := 3
+ j = 2
+ k = 1.5434
+ arr := []string{"test"}
+ now := time.Now().UTC()
+
+ err := validate.Field(s, "ne=abcd")
+ Equal(t, err, nil)
+
+ err = validate.Field(i, "ne=1")
+ Equal(t, err, nil)
+
+ err = validate.Field(j, "ne=1")
+ Equal(t, err, nil)
+
+ err = validate.Field(k, "ne=1.543")
+ Equal(t, err, nil)
+
+ err = validate.Field(arr, "ne=2")
+ Equal(t, err, nil)
+
+ err = validate.Field(arr, "ne=1")
+ NotEqual(t, err, nil)
+
+ PanicMatches(t, func() { validate.Field(now, "ne=now") }, "Bad field type time.Time")
+}
+
+func TestIsEqFieldValidation(t *testing.T) {
+
+ var j uint64
+ var k float64
+ s := "abcd"
+ i := 1
+ j = 1
+ k = 1.543
+ arr := []string{"test"}
+ now := time.Now().UTC()
+
+ var j2 uint64
+ var k2 float64
+ s2 := "abcd"
+ i2 := 1
+ j2 = 1
+ k2 = 1.543
+ arr2 := []string{"test"}
+ arr3 := []string{"test", "test2"}
+ now2 := now
+
+ err := validate.FieldWithValue(s, s2, "eqfield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(i2, i, "eqfield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(j2, j, "eqfield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(k2, k, "eqfield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(arr2, arr, "eqfield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(now2, now, "eqfield")
+ Equal(t, err, nil)
+
+ err = validate.FieldWithValue(arr3, arr, "eqfield")
+ NotEqual(t, err, nil)
+
+ type Test struct {
+ Start *time.Time `validate:"eqfield=End"`
+ End *time.Time
+ }
+
+ sv := &Test{
+ Start: &now,
+ End: &now,
+ }
+
+ errs := validate.Struct(sv)
+ Equal(t, errs, nil)
+
+ now3 := time.Now().UTC()
+
+ sv = &Test{
+ Start: &now,
+ End: &now3,
+ }
+
+ errs = validate.Struct(sv)
+ NotEqual(t, errs, nil)
+
+ channel := make(chan string)
+
+ PanicMatches(t, func() { validate.FieldWithValue(nil, 1, "eqfield") }, "struct not passed for cross validation")
+ PanicMatches(t, func() { validate.FieldWithValue(5, channel, "eqfield") }, "Bad field type chan string")
+ PanicMatches(t, func() { validate.FieldWithValue(5, now, "eqfield") }, "Bad Top Level field type")
+
+ type Test2 struct {
+ Start *time.Time `validate:"eqfield=NonExistantField"`
+ End *time.Time
+ }
+
+ sv2 := &Test2{
+ Start: &now,
+ End: &now,
+ }
+
+ PanicMatches(t, func() { validate.Struct(sv2) }, "Field \"NonExistantField\" not found in struct")
+}
+
+func TestIsEqValidation(t *testing.T) {
+
+ var j uint64
+ var k float64
+ s := "abcd"
+ i := 1
+ j = 1
+ k = 1.543
+ arr := []string{"test"}
+ now := time.Now().UTC()
+
+ err := validate.Field(s, "eq=abcd")
+ Equal(t, err, nil)
+
+ err = validate.Field(i, "eq=1")
+ Equal(t, err, nil)
+
+ err = validate.Field(j, "eq=1")
+ Equal(t, err, nil)
+
+ err = validate.Field(k, "eq=1.543")
+ Equal(t, err, nil)
+
+ err = validate.Field(arr, "eq=1")
+ Equal(t, err, nil)
+
+ err = validate.Field(arr, "eq=2")
+ NotEqual(t, err, nil)
+
+ PanicMatches(t, func() { validate.Field(now, "eq=now") }, "Bad field type time.Time")
+}
+
+func TestBase64Validation(t *testing.T) {
+
+ s := "dW5pY29ybg=="
+
+ err := validate.Field(s, "base64")
+ Equal(t, err, nil)
+
+ s = "dGhpIGlzIGEgdGVzdCBiYXNlNjQ="
+ err = validate.Field(s, "base64")
+ Equal(t, err, nil)
+
+ s = ""
+ err = validate.Field(s, "base64")
+ NotEqual(t, err, nil)
+
+ s = "dW5pY29ybg== foo bar"
+ err = validate.Field(s, "base64")
+ NotEqual(t, err, nil)
+}
+
+func TestStructOnlyValidation(t *testing.T) {
+
+ type Inner struct {
+ Test string `validate:"len=5"`
+ }
+
+ type Outer struct {
+ InnerStruct *Inner `validate:"required,structonly"`
+ }
+
+ outer := &Outer{
+ InnerStruct: nil,
+ }
+
+ errs := validate.Struct(outer)
+ NotEqual(t, errs, nil)
+
+ inner := &Inner{
+ Test: "1234",
+ }
+
+ outer = &Outer{
+ InnerStruct: inner,
+ }
+
+ errs = validate.Struct(outer)
+ Equal(t, errs, nil)
+}
+
+func TestGtField(t *testing.T) {
+
+ type TimeTest struct {
+ Start *time.Time `validate:"required,gt"`
+ End *time.Time `validate:"required,gt,gtfield=Start"`
+ }
+
+ now := time.Now()
+ start := now.Add(time.Hour * 24)
+ end := start.Add(time.Hour * 24)
+
+ timeTest := &TimeTest{
+ Start: &start,
+ End: &end,
+ }
+
+ errs := validate.Struct(timeTest)
+ Equal(t, errs, nil)
+
+ timeTest = &TimeTest{
+ Start: &end,
+ End: &start,
+ }
+
+ errs2 := validate.Struct(timeTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "End", "gtfield")
+
+ err3 := validate.FieldWithValue(&start, &end, "gtfield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(&end, &start, "gtfield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "gtfield")
+
+ type IntTest struct {
+ Val1 int `validate:"required"`
+ Val2 int `validate:"required,gtfield=Val1"`
+ }
+
+ intTest := &IntTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs = validate.Struct(intTest)
+ Equal(t, errs, nil)
+
+ intTest = &IntTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs2 = validate.Struct(intTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "gtfield")
+
+ err3 = validate.FieldWithValue(int(1), int(5), "gtfield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(int(5), int(1), "gtfield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "gtfield")
+
+ type UIntTest struct {
+ Val1 uint `validate:"required"`
+ Val2 uint `validate:"required,gtfield=Val1"`
+ }
+
+ uIntTest := &UIntTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs = validate.Struct(uIntTest)
+ Equal(t, errs, nil)
+
+ uIntTest = &UIntTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs2 = validate.Struct(uIntTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "gtfield")
+
+ err3 = validate.FieldWithValue(uint(1), uint(5), "gtfield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(uint(5), uint(1), "gtfield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "gtfield")
+
+ type FloatTest struct {
+ Val1 float64 `validate:"required"`
+ Val2 float64 `validate:"required,gtfield=Val1"`
+ }
+
+ floatTest := &FloatTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs = validate.Struct(floatTest)
+ Equal(t, errs, nil)
+
+ floatTest = &FloatTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs2 = validate.Struct(floatTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "gtfield")
+
+ err3 = validate.FieldWithValue(float32(1), float32(5), "gtfield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(float32(5), float32(1), "gtfield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "gtfield")
+
+ PanicMatches(t, func() { validate.FieldWithValue(nil, 1, "gtfield") }, "struct not passed for cross validation")
+ PanicMatches(t, func() { validate.FieldWithValue(5, "T", "gtfield") }, "Bad field type string")
+ PanicMatches(t, func() { validate.FieldWithValue(5, start, "gtfield") }, "Bad Top Level field type")
+
+ type TimeTest2 struct {
+ Start *time.Time `validate:"required"`
+ End *time.Time `validate:"required,gtfield=NonExistantField"`
+ }
+
+ timeTest2 := &TimeTest2{
+ Start: &start,
+ End: &end,
+ }
+
+ PanicMatches(t, func() { validate.Struct(timeTest2) }, "Field \"NonExistantField\" not found in struct")
+}
+
+func TestLtField(t *testing.T) {
+
+ type TimeTest struct {
+ Start *time.Time `validate:"required,lt,ltfield=End"`
+ End *time.Time `validate:"required,lt"`
+ }
+
+ now := time.Now()
+ start := now.Add(time.Hour * 24 * -1 * 2)
+ end := start.Add(time.Hour * 24)
+
+ timeTest := &TimeTest{
+ Start: &start,
+ End: &end,
+ }
+
+ errs := validate.Struct(timeTest)
+ Equal(t, errs, nil)
+
+ timeTest = &TimeTest{
+ Start: &end,
+ End: &start,
+ }
+
+ errs2 := validate.Struct(timeTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Start", "ltfield")
+
+ err3 := validate.FieldWithValue(&end, &start, "ltfield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(&start, &end, "ltfield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "ltfield")
+
+ type IntTest struct {
+ Val1 int `validate:"required"`
+ Val2 int `validate:"required,ltfield=Val1"`
+ }
+
+ intTest := &IntTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs = validate.Struct(intTest)
+ Equal(t, errs, nil)
+
+ intTest = &IntTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs2 = validate.Struct(intTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "ltfield")
+
+ err3 = validate.FieldWithValue(int(5), int(1), "ltfield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(int(1), int(5), "ltfield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "ltfield")
+
+ type UIntTest struct {
+ Val1 uint `validate:"required"`
+ Val2 uint `validate:"required,ltfield=Val1"`
+ }
+
+ uIntTest := &UIntTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs = validate.Struct(uIntTest)
+ Equal(t, errs, nil)
+
+ uIntTest = &UIntTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs2 = validate.Struct(uIntTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "ltfield")
+
+ err3 = validate.FieldWithValue(uint(5), uint(1), "ltfield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(uint(1), uint(5), "ltfield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "ltfield")
+
+ type FloatTest struct {
+ Val1 float64 `validate:"required"`
+ Val2 float64 `validate:"required,ltfield=Val1"`
+ }
+
+ floatTest := &FloatTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs = validate.Struct(floatTest)
+ Equal(t, errs, nil)
+
+ floatTest = &FloatTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs2 = validate.Struct(floatTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "ltfield")
+
+ err3 = validate.FieldWithValue(float32(5), float32(1), "ltfield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(float32(1), float32(5), "ltfield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "ltfield")
+
+ PanicMatches(t, func() { validate.FieldWithValue(nil, 5, "ltfield") }, "struct not passed for cross validation")
+ PanicMatches(t, func() { validate.FieldWithValue(1, "T", "ltfield") }, "Bad field type string")
+ PanicMatches(t, func() { validate.FieldWithValue(1, end, "ltfield") }, "Bad Top Level field type")
+
+ type TimeTest2 struct {
+ Start *time.Time `validate:"required"`
+ End *time.Time `validate:"required,ltfield=NonExistantField"`
+ }
+
+ timeTest2 := &TimeTest2{
+ Start: &end,
+ End: &start,
+ }
+
+ PanicMatches(t, func() { validate.Struct(timeTest2) }, "Field \"NonExistantField\" not found in struct")
+}
+
+func TestLteField(t *testing.T) {
+
+ type TimeTest struct {
+ Start *time.Time `validate:"required,lte,ltefield=End"`
+ End *time.Time `validate:"required,lte"`
+ }
+
+ now := time.Now()
+ start := now.Add(time.Hour * 24 * -1 * 2)
+ end := start.Add(time.Hour * 24)
+
+ timeTest := &TimeTest{
+ Start: &start,
+ End: &end,
+ }
+
+ errs := validate.Struct(timeTest)
+ Equal(t, errs, nil)
+
+ timeTest = &TimeTest{
+ Start: &end,
+ End: &start,
+ }
+
+ errs2 := validate.Struct(timeTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Start", "ltefield")
+
+ err3 := validate.FieldWithValue(&end, &start, "ltefield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(&start, &end, "ltefield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "ltefield")
+
+ type IntTest struct {
+ Val1 int `validate:"required"`
+ Val2 int `validate:"required,ltefield=Val1"`
+ }
+
+ intTest := &IntTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs = validate.Struct(intTest)
+ Equal(t, errs, nil)
+
+ intTest = &IntTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs2 = validate.Struct(intTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "ltefield")
+
+ err3 = validate.FieldWithValue(int(5), int(1), "ltefield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(int(1), int(5), "ltefield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "ltefield")
+
+ type UIntTest struct {
+ Val1 uint `validate:"required"`
+ Val2 uint `validate:"required,ltefield=Val1"`
+ }
+
+ uIntTest := &UIntTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs = validate.Struct(uIntTest)
+ Equal(t, errs, nil)
+
+ uIntTest = &UIntTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs2 = validate.Struct(uIntTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "ltefield")
+
+ err3 = validate.FieldWithValue(uint(5), uint(1), "ltefield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(uint(1), uint(5), "ltefield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "ltefield")
+
+ type FloatTest struct {
+ Val1 float64 `validate:"required"`
+ Val2 float64 `validate:"required,ltefield=Val1"`
+ }
+
+ floatTest := &FloatTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs = validate.Struct(floatTest)
+ Equal(t, errs, nil)
+
+ floatTest = &FloatTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs2 = validate.Struct(floatTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "ltefield")
+
+ err3 = validate.FieldWithValue(float32(5), float32(1), "ltefield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(float32(1), float32(5), "ltefield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "ltefield")
+
+ PanicMatches(t, func() { validate.FieldWithValue(nil, 5, "ltefield") }, "struct not passed for cross validation")
+ PanicMatches(t, func() { validate.FieldWithValue(1, "T", "ltefield") }, "Bad field type string")
+ PanicMatches(t, func() { validate.FieldWithValue(1, end, "ltefield") }, "Bad Top Level field type")
+
+ type TimeTest2 struct {
+ Start *time.Time `validate:"required"`
+ End *time.Time `validate:"required,ltefield=NonExistantField"`
+ }
+
+ timeTest2 := &TimeTest2{
+ Start: &end,
+ End: &start,
+ }
+
+ PanicMatches(t, func() { validate.Struct(timeTest2) }, "Field \"NonExistantField\" not found in struct")
+}
+
+func TestGteField(t *testing.T) {
+
+ type TimeTest struct {
+ Start *time.Time `validate:"required,gte"`
+ End *time.Time `validate:"required,gte,gtefield=Start"`
+ }
+
+ now := time.Now()
+ start := now.Add(time.Hour * 24)
+ end := start.Add(time.Hour * 24)
+
+ timeTest := &TimeTest{
+ Start: &start,
+ End: &end,
+ }
+
+ errs := validate.Struct(timeTest)
+ Equal(t, errs, nil)
+
+ timeTest = &TimeTest{
+ Start: &end,
+ End: &start,
+ }
+
+ errs2 := validate.Struct(timeTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "End", "gtefield")
+
+ err3 := validate.FieldWithValue(&start, &end, "gtefield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(&end, &start, "gtefield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "gtefield")
+
+ type IntTest struct {
+ Val1 int `validate:"required"`
+ Val2 int `validate:"required,gtefield=Val1"`
+ }
+
+ intTest := &IntTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs = validate.Struct(intTest)
+ Equal(t, errs, nil)
+
+ intTest = &IntTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs2 = validate.Struct(intTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "gtefield")
+
+ err3 = validate.FieldWithValue(int(1), int(5), "gtefield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(int(5), int(1), "gtefield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "gtefield")
+
+ type UIntTest struct {
+ Val1 uint `validate:"required"`
+ Val2 uint `validate:"required,gtefield=Val1"`
+ }
+
+ uIntTest := &UIntTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs = validate.Struct(uIntTest)
+ Equal(t, errs, nil)
+
+ uIntTest = &UIntTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs2 = validate.Struct(uIntTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "gtefield")
+
+ err3 = validate.FieldWithValue(uint(1), uint(5), "gtefield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(uint(5), uint(1), "gtefield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "gtefield")
+
+ type FloatTest struct {
+ Val1 float64 `validate:"required"`
+ Val2 float64 `validate:"required,gtefield=Val1"`
+ }
+
+ floatTest := &FloatTest{
+ Val1: 1,
+ Val2: 5,
+ }
+
+ errs = validate.Struct(floatTest)
+ Equal(t, errs, nil)
+
+ floatTest = &FloatTest{
+ Val1: 5,
+ Val2: 1,
+ }
+
+ errs2 = validate.Struct(floatTest).Flatten()
+ NotEqual(t, errs2, nil)
+ AssertMapFieldError(t, errs2, "Val2", "gtefield")
+
+ err3 = validate.FieldWithValue(float32(1), float32(5), "gtefield")
+ Equal(t, err3, nil)
+
+ err3 = validate.FieldWithValue(float32(5), float32(1), "gtefield")
+ NotEqual(t, err3, nil)
+ Equal(t, err3.Tag, "gtefield")
+
+ PanicMatches(t, func() { validate.FieldWithValue(nil, 1, "gtefield") }, "struct not passed for cross validation")
+ PanicMatches(t, func() { validate.FieldWithValue(5, "T", "gtefield") }, "Bad field type string")
+ PanicMatches(t, func() { validate.FieldWithValue(5, start, "gtefield") }, "Bad Top Level field type")
+
+ type TimeTest2 struct {
+ Start *time.Time `validate:"required"`
+ End *time.Time `validate:"required,gtefield=NonExistantField"`
+ }
+
+ timeTest2 := &TimeTest2{
+ Start: &start,
+ End: &end,
+ }
+
+ PanicMatches(t, func() { validate.Struct(timeTest2) }, "Field \"NonExistantField\" not found in struct")
+}
+
+func TestValidateByTagAndValue(t *testing.T) {
+
+ val := "test"
+ field := "test"
+ err := validate.FieldWithValue(val, field, "required")
+ Equal(t, err, nil)
+
+ fn := func(val interface{}, current interface{}, field interface{}, param string) bool {
+
+ return current.(string) == field.(string)
+ }
+
+ validate.AddFunction("isequaltestfunc", fn)
+
+ err = validate.FieldWithValue(val, field, "isequaltestfunc")
+ Equal(t, err, nil)
+
+ val = "unequal"
+
+ err = validate.FieldWithValue(val, field, "isequaltestfunc")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "isequaltestfunc")
+}
+
+func TestAddFunctions(t *testing.T) {
+
+ fn := func(val interface{}, current interface{}, field interface{}, param string) bool {
+
+ return true
+ }
+
+ validate := New("validateme", BakedInValidators)
+
+ err := validate.AddFunction("new", fn)
+ Equal(t, err, nil)
+
+ err = validate.AddFunction("", fn)
+ NotEqual(t, err, nil)
+
+ validate.AddFunction("new", nil)
+ NotEqual(t, err, nil)
+
+ err = validate.AddFunction("new", fn)
+ Equal(t, err, nil)
+}
+
+func TestChangeTag(t *testing.T) {
+
+ validate := New("validateme", BakedInValidators)
+ validate.SetTag("val")
+
+ type Test struct {
+ Name string `val:"len=4"`
+ }
+ s := &Test{
+ Name: "TEST",
+ }
+
+ err := validate.Struct(s)
+ Equal(t, err, nil)
+}
+
+func TestUnexposedStruct(t *testing.T) {
+
+ type Test struct {
+ Name string
+ unexposed struct {
+ A string `validate:"required"`
+ }
+ }
+
+ s := &Test{
+ Name: "TEST",
+ }
+
+ err := validate.Struct(s)
+ Equal(t, err, nil)
+}
+
+func TestBadParams(t *testing.T) {
+
+ i := 1
+ err := validate.Field(i, "-")
+ Equal(t, err, nil)
+
+ PanicMatches(t, func() { validate.Field(i, "len=a") }, "strconv.ParseInt: parsing \"a\": invalid syntax")
+ PanicMatches(t, func() { validate.Field(i, "len=a") }, "strconv.ParseInt: parsing \"a\": invalid syntax")
+
+ var ui uint = 1
+ PanicMatches(t, func() { validate.Field(ui, "len=a") }, "strconv.ParseUint: parsing \"a\": invalid syntax")
+
+ f := 1.23
+ PanicMatches(t, func() { validate.Field(f, "len=a") }, "strconv.ParseFloat: parsing \"a\": invalid syntax")
+}
+
+func TestLength(t *testing.T) {
+
+ i := true
+ PanicMatches(t, func() { validate.Field(i, "len") }, "Bad field type bool")
+}
+
+func TestIsGt(t *testing.T) {
+
+ myMap := map[string]string{}
+ err := validate.Field(myMap, "gt=0")
+ NotEqual(t, err, nil)
+
+ f := 1.23
+ err = validate.Field(f, "gt=5")
+ NotEqual(t, err, nil)
+
+ var ui uint = 5
+ err = validate.Field(ui, "gt=10")
+ NotEqual(t, err, nil)
+
+ i := true
+ PanicMatches(t, func() { validate.Field(i, "gt") }, "Bad field type bool")
+
+ tm := time.Now().UTC()
+ tm = tm.Add(time.Hour * 24)
+
+ err = validate.Field(tm, "gt")
+ Equal(t, err, nil)
+
+ t2 := time.Now().UTC()
+
+ err = validate.Field(t2, "gt")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "gt")
+
+ type Test struct {
+ Now *time.Time `validate:"gt"`
+ }
+ s := &Test{
+ Now: &tm,
+ }
+
+ errs := validate.Struct(s)
+ Equal(t, errs, nil)
+
+ s = &Test{
+ Now: &t2,
+ }
+
+ errs = validate.Struct(s)
+ NotEqual(t, errs, nil)
+}
+
+func TestIsGte(t *testing.T) {
+
+ i := true
+ PanicMatches(t, func() { validate.Field(i, "gte") }, "Bad field type bool")
+
+ t1 := time.Now().UTC()
+ t1 = t1.Add(time.Hour * 24)
+
+ err := validate.Field(t1, "gte")
+ Equal(t, err, nil)
+
+ t2 := time.Now().UTC()
+
+ err = validate.Field(t2, "gte")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "gte")
+ Equal(t, err.Type, reflect.TypeOf(time.Time{}))
+
+ type Test struct {
+ Now *time.Time `validate:"gte"`
+ }
+ s := &Test{
+ Now: &t1,
+ }
+
+ errs := validate.Struct(s)
+ Equal(t, errs, nil)
+
+ s = &Test{
+ Now: &t2,
+ }
+
+ errs = validate.Struct(s)
+ NotEqual(t, errs, nil)
+}
+
+func TestIsLt(t *testing.T) {
+
+ myMap := map[string]string{}
+ err := validate.Field(myMap, "lt=0")
+ NotEqual(t, err, nil)
+
+ f := 1.23
+ err = validate.Field(f, "lt=0")
+ NotEqual(t, err, nil)
+
+ var ui uint = 5
+ err = validate.Field(ui, "lt=0")
+ NotEqual(t, err, nil)
+
+ i := true
+ PanicMatches(t, func() { validate.Field(i, "lt") }, "Bad field type bool")
+
+ t1 := time.Now().UTC()
+
+ err = validate.Field(t1, "lt")
+ Equal(t, err, nil)
+
+ t2 := time.Now().UTC()
+ t2 = t2.Add(time.Hour * 24)
+
+ err = validate.Field(t2, "lt")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "lt")
+
+ type Test struct {
+ Now *time.Time `validate:"lt"`
+ }
+
+ s := &Test{
+ Now: &t1,
+ }
+
+ errs := validate.Struct(s)
+ Equal(t, errs, nil)
+
+ s = &Test{
+ Now: &t2,
+ }
+
+ errs = validate.Struct(s)
+ NotEqual(t, errs, nil)
+}
+
+func TestIsLte(t *testing.T) {
+
+ i := true
+ PanicMatches(t, func() { validate.Field(i, "lte") }, "Bad field type bool")
+
+ t1 := time.Now().UTC()
+
+ err := validate.Field(t1, "lte")
+ Equal(t, err, nil)
+
+ t2 := time.Now().UTC()
+ t2 = t2.Add(time.Hour * 24)
+
+ err = validate.Field(t2, "lte")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "lte")
+
+ type Test struct {
+ Now *time.Time `validate:"lte"`
+ }
+
+ s := &Test{
+ Now: &t1,
+ }
+
+ errs := validate.Struct(s)
+ Equal(t, errs, nil)
+
+ s = &Test{
+ Now: &t2,
+ }
+
+ errs = validate.Struct(s)
+ NotEqual(t, errs, nil)
+}
+
+func TestUrl(t *testing.T) {
+
+ var tests = []struct {
+ param string
+ expected bool
+ }{
+ {"http://foo.bar#com", true},
+ {"http://foobar.com", true},
+ {"https://foobar.com", true},
+ {"foobar.com", false},
+ {"http://foobar.coffee/", true},
+ {"http://foobar.中文网/", true},
+ {"http://foobar.org/", true},
+ {"http://foobar.org:8080/", true},
+ {"ftp://foobar.ru/", true},
+ {"http://user:pass@www.foobar.com/", true},
+ {"http://127.0.0.1/", true},
+ {"http://duckduckgo.com/?q=%2F", true},
+ {"http://localhost:3000/", true},
+ {"http://foobar.com/?foo=bar#baz=qux", true},
+ {"http://foobar.com?foo=bar", true},
+ {"http://www.xn--froschgrn-x9a.net/", true},
+ {"", false},
+ {"xyz://foobar.com", true},
+ {"invalid.", false},
+ {".com", false},
+ {"rtmp://foobar.com", true},
+ {"http://www.foo_bar.com/", true},
+ {"http://localhost:3000/", true},
+ {"http://foobar.com#baz=qux", true},
+ {"http://foobar.com/t$-_.+!*\\'(),", true},
+ {"http://www.foobar.com/~foobar", true},
+ {"http://www.-foobar.com/", true},
+ {"http://www.foo---bar.com/", true},
+ {"mailto:someone@example.com", true},
+ {"irc://irc.server.org/channel", true},
+ {"irc://#channel@network", true},
+ {"/abs/test/dir", false},
+ {"./rel/test/dir", false},
+ }
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "url")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d URL failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "url") {
+ t.Fatalf("Index: %d URL failed Error: %s", i, err)
+ }
+ }
+ }
+
+ i := 1
+ PanicMatches(t, func() { validate.Field(i, "url") }, "Bad field type int")
+}
+
+func TestUri(t *testing.T) {
+
+ var tests = []struct {
+ param string
+ expected bool
+ }{
+ {"http://foo.bar#com", true},
+ {"http://foobar.com", true},
+ {"https://foobar.com", true},
+ {"foobar.com", false},
+ {"http://foobar.coffee/", true},
+ {"http://foobar.中文网/", true},
+ {"http://foobar.org/", true},
+ {"http://foobar.org:8080/", true},
+ {"ftp://foobar.ru/", true},
+ {"http://user:pass@www.foobar.com/", true},
+ {"http://127.0.0.1/", true},
+ {"http://duckduckgo.com/?q=%2F", true},
+ {"http://localhost:3000/", true},
+ {"http://foobar.com/?foo=bar#baz=qux", true},
+ {"http://foobar.com?foo=bar", true},
+ {"http://www.xn--froschgrn-x9a.net/", true},
+ {"", false},
+ {"xyz://foobar.com", true},
+ {"invalid.", false},
+ {".com", false},
+ {"rtmp://foobar.com", true},
+ {"http://www.foo_bar.com/", true},
+ {"http://localhost:3000/", true},
+ {"http://foobar.com#baz=qux", true},
+ {"http://foobar.com/t$-_.+!*\\'(),", true},
+ {"http://www.foobar.com/~foobar", true},
+ {"http://www.-foobar.com/", true},
+ {"http://www.foo---bar.com/", true},
+ {"mailto:someone@example.com", true},
+ {"irc://irc.server.org/channel", true},
+ {"irc://#channel@network", true},
+ {"/abs/test/dir", true},
+ {"./rel/test/dir", false},
+ }
+ for i, test := range tests {
+
+ err := validate.Field(test.param, "uri")
+
+ if test.expected == true {
+ if !IsEqual(t, err, nil) {
+ t.Fatalf("Index: %d URI failed Error: %s", i, err)
+ }
+ } else {
+ if IsEqual(t, err, nil) || !IsEqual(t, err.Tag, "uri") {
+ t.Fatalf("Index: %d URI failed Error: %s", i, err)
+ }
+ }
+ }
+
+ i := 1
+ PanicMatches(t, func() { validate.Field(i, "uri") }, "Bad field type int")
+}
+
+func TestOrTag(t *testing.T) {
+ s := "rgba(0,31,255,0.5)"
+ err := validate.Field(s, "rgb|rgba")
+ Equal(t, err, nil)
+
+ s = "rgba(0,31,255,0.5)"
+ err = validate.Field(s, "rgb|rgba|len=18")
+ Equal(t, err, nil)
+
+ s = "this ain't right"
+ err = validate.Field(s, "rgb|rgba")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgb|rgba")
+
+ s = "this ain't right"
+ err = validate.Field(s, "rgb|rgba|len=10")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgb|rgba|len")
+
+ s = "this is right"
+ err = validate.Field(s, "rgb|rgba|len=13")
+ Equal(t, err, nil)
+
+ s = ""
+ err = validate.Field(s, "omitempty,rgb|rgba")
+ Equal(t, err, nil)
+}
+
+func TestHsla(t *testing.T) {
+
+ s := "hsla(360,100%,100%,1)"
+ err := validate.Field(s, "hsla")
+ Equal(t, err, nil)
+
+ s = "hsla(360,100%,100%,0.5)"
+ err = validate.Field(s, "hsla")
+ Equal(t, err, nil)
+
+ s = "hsla(0,0%,0%, 0)"
+ err = validate.Field(s, "hsla")
+ Equal(t, err, nil)
+
+ s = "hsl(361,100%,50%,1)"
+ err = validate.Field(s, "hsla")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsla")
+
+ s = "hsl(361,100%,50%)"
+ err = validate.Field(s, "hsla")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsla")
+
+ s = "hsla(361,100%,50%)"
+ err = validate.Field(s, "hsla")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsla")
+
+ s = "hsla(360,101%,50%)"
+ err = validate.Field(s, "hsla")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsla")
+
+ s = "hsla(360,100%,101%)"
+ err = validate.Field(s, "hsla")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsla")
+
+ i := 1
+ PanicMatches(t, func() { validate.Field(i, "hsla") }, "interface conversion: interface is int, not string")
+}
+
+func TestHsl(t *testing.T) {
+
+ s := "hsl(360,100%,50%)"
+ err := validate.Field(s, "hsl")
+ Equal(t, err, nil)
+
+ s = "hsl(0,0%,0%)"
+ err = validate.Field(s, "hsl")
+ Equal(t, err, nil)
+
+ s = "hsl(361,100%,50%)"
+ err = validate.Field(s, "hsl")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsl")
+
+ s = "hsl(361,101%,50%)"
+ err = validate.Field(s, "hsl")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsl")
+
+ s = "hsl(361,100%,101%)"
+ err = validate.Field(s, "hsl")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsl")
+
+ s = "hsl(-10,100%,100%)"
+ err = validate.Field(s, "hsl")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hsl")
+
+ i := 1
+ PanicMatches(t, func() { validate.Field(i, "hsl") }, "interface conversion: interface is int, not string")
+}
+
+func TestRgba(t *testing.T) {
+
+ s := "rgba(0,31,255,0.5)"
+ err := validate.Field(s, "rgba")
+ Equal(t, err, nil)
+
+ s = "rgba(0,31,255,0.12)"
+ err = validate.Field(s, "rgba")
+ Equal(t, err, nil)
+
+ s = "rgba(12%,55%,100%,0.12)"
+ err = validate.Field(s, "rgba")
+ Equal(t, err, nil)
+
+ s = "rgba( 0, 31, 255, 0.5)"
+ err = validate.Field(s, "rgba")
+ Equal(t, err, nil)
+
+ s = "rgba(12%,55,100%,0.12)"
+ err = validate.Field(s, "rgba")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgba")
+
+ s = "rgb(0, 31, 255)"
+ err = validate.Field(s, "rgba")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgba")
+
+ s = "rgb(1,349,275,0.5)"
+ err = validate.Field(s, "rgba")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgba")
+
+ s = "rgb(01,31,255,0.5)"
+ err = validate.Field(s, "rgba")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgba")
+
+ i := 1
+ PanicMatches(t, func() { validate.Field(i, "rgba") }, "interface conversion: interface is int, not string")
+}
+
+func TestRgb(t *testing.T) {
+
+ s := "rgb(0,31,255)"
+ err := validate.Field(s, "rgb")
+ Equal(t, err, nil)
+
+ s = "rgb(0, 31, 255)"
+ err = validate.Field(s, "rgb")
+ Equal(t, err, nil)
+
+ s = "rgb(10%, 50%, 100%)"
+ err = validate.Field(s, "rgb")
+ Equal(t, err, nil)
+
+ s = "rgb(10%, 50%, 55)"
+ err = validate.Field(s, "rgb")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgb")
+
+ s = "rgb(1,349,275)"
+ err = validate.Field(s, "rgb")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgb")
+
+ s = "rgb(01,31,255)"
+ err = validate.Field(s, "rgb")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgb")
+
+ s = "rgba(0,31,255)"
+ err = validate.Field(s, "rgb")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "rgb")
+
+ i := 1
+ PanicMatches(t, func() { validate.Field(i, "rgb") }, "interface conversion: interface is int, not string")
+}
+
+func TestEmail(t *testing.T) {
+
+ s := "test@mail.com"
+ err := validate.Field(s, "email")
+ Equal(t, err, nil)
+
+ s = ""
+ err = validate.Field(s, "email")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "email")
+
+ s = "test@email"
+ err = validate.Field(s, "email")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "email")
+
+ s = "test@email."
+ err = validate.Field(s, "email")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "email")
+
+ s = "@email.com"
+ err = validate.Field(s, "email")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "email")
+
+ i := true
+ PanicMatches(t, func() { validate.Field(i, "email") }, "interface conversion: interface is bool, not string")
+}
+
+func TestHexColor(t *testing.T) {
+
+ s := "#fff"
+ err := validate.Field(s, "hexcolor")
+ Equal(t, err, nil)
+
+ s = "#c2c2c2"
+ err = validate.Field(s, "hexcolor")
+ Equal(t, err, nil)
+
+ s = "fff"
+ err = validate.Field(s, "hexcolor")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hexcolor")
+
+ s = "fffFF"
+ err = validate.Field(s, "hexcolor")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hexcolor")
+
+ i := true
+ PanicMatches(t, func() { validate.Field(i, "hexcolor") }, "interface conversion: interface is bool, not string")
+}
+
+func TestHexadecimal(t *testing.T) {
+
+ s := "ff0044"
+ err := validate.Field(s, "hexadecimal")
+ Equal(t, err, nil)
+
+ s = "abcdefg"
+ err = validate.Field(s, "hexadecimal")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "hexadecimal")
+
+ i := true
+ PanicMatches(t, func() { validate.Field(i, "hexadecimal") }, "interface conversion: interface is bool, not string")
+}
+
+func TestNumber(t *testing.T) {
+
+ s := "1"
+ err := validate.Field(s, "number")
+ Equal(t, err, nil)
+
+ s = "+1"
+ err = validate.Field(s, "number")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "number")
+
+ s = "-1"
+ err = validate.Field(s, "number")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "number")
+
+ s = "1.12"
+ err = validate.Field(s, "number")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "number")
+
+ s = "+1.12"
+ err = validate.Field(s, "number")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "number")
+
+ s = "-1.12"
+ err = validate.Field(s, "number")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "number")
+
+ s = "1."
+ err = validate.Field(s, "number")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "number")
+
+ s = "1.o"
+ err = validate.Field(s, "number")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "number")
+
+ i := 1
+ PanicMatches(t, func() { validate.Field(i, "number") }, "interface conversion: interface is int, not string")
+}
+
+func TestNumeric(t *testing.T) {
+
+ s := "1"
+ err := validate.Field(s, "numeric")
+ Equal(t, err, nil)
+
+ s = "+1"
+ err = validate.Field(s, "numeric")
+ Equal(t, err, nil)
+
+ s = "-1"
+ err = validate.Field(s, "numeric")
+ Equal(t, err, nil)
+
+ s = "1.12"
+ err = validate.Field(s, "numeric")
+ Equal(t, err, nil)
+
+ s = "+1.12"
+ err = validate.Field(s, "numeric")
+ Equal(t, err, nil)
+
+ s = "-1.12"
+ err = validate.Field(s, "numeric")
+ Equal(t, err, nil)
+
+ s = "1."
+ err = validate.Field(s, "numeric")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "numeric")
+
+ s = "1.o"
+ err = validate.Field(s, "numeric")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "numeric")
+
+ i := 1
+ PanicMatches(t, func() { validate.Field(i, "numeric") }, "interface conversion: interface is int, not string")
+}
+
+func TestAlphaNumeric(t *testing.T) {
+
+ s := "abcd123"
+ err := validate.Field(s, "alphanum")
+ Equal(t, err, nil)
+
+ s = "abc!23"
+ err = validate.Field(s, "alphanum")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "alphanum")
+
+ PanicMatches(t, func() { validate.Field(1, "alphanum") }, "interface conversion: interface is int, not string")
+}
+
+func TestAlpha(t *testing.T) {
+
+ s := "abcd"
+ err := validate.Field(s, "alpha")
+ Equal(t, err, nil)
+
+ s = "abc1"
+ err = validate.Field(s, "alpha")
+ NotEqual(t, err, nil)
+ Equal(t, err.Tag, "alpha")
+
+ PanicMatches(t, func() { validate.Field(1, "alpha") }, "interface conversion: interface is int, not string")
+}
+
+func TestFlattening(t *testing.T) {
+
+ tSuccess := &TestString{
+ Required: "Required",
+ Len: "length==10",
+ Min: "min=1",
+ Max: "1234567890",
+ MinMax: "12345",
+ Lt: "012345678",
+ Lte: "0123456789",
+ Gt: "01234567890",
+ Gte: "0123456789",
+ OmitEmpty: "",
+ Sub: &SubTest{
+ Test: "1",
+ },
+ SubIgnore: &SubTest{
+ Test: "",
+ },
+ Anonymous: struct {
+ A string `validate:"required"`
+ }{
+ A: "1",
+ },
+ Iface: &Impl{
+ F: "123",
+ },
+ }
+
+ err1 := validate.Struct(tSuccess).Flatten()
+ Equal(t, len(err1), 0)
+
+ tFail := &TestString{
+ Required: "",
+ Len: "",
+ Min: "",
+ Max: "12345678901",
+ MinMax: "",
+ OmitEmpty: "12345678901",
+ Sub: &SubTest{
+ Test: "",
+ },
+ Anonymous: struct {
+ A string `validate:"required"`
+ }{
+ A: "",
+ },
+ Iface: &Impl{
+ F: "12",
+ },
+ }
+
+ err2 := validate.Struct(tFail).Flatten()
+
+ // Assert Top Level
+ NotEqual(t, err2, nil)
+
+ // Assert Fields
+ AssertMapFieldError(t, err2, "Len", "len")
+ AssertMapFieldError(t, err2, "Gt", "gt")
+ AssertMapFieldError(t, err2, "Gte", "gte")
+
+ // Assert Struct Field
+ AssertMapFieldError(t, err2, "Sub.Test", "required")
+
+ // Assert Anonymous Struct Field
+ AssertMapFieldError(t, err2, "Anonymous.A", "required")
+
+ // Assert Interface Field
+ AssertMapFieldError(t, err2, "Iface.F", "len")
+}
+
+func TestStructStringValidation(t *testing.T) {
+
+ validate.SetMaxStructPoolSize(11)
+
+ tSuccess := &TestString{
+ Required: "Required",
+ Len: "length==10",
+ Min: "min=1",
+ Max: "1234567890",
+ MinMax: "12345",
+ Lt: "012345678",
+ Lte: "0123456789",
+ Gt: "01234567890",
+ Gte: "0123456789",
+ OmitEmpty: "",
+ Sub: &SubTest{
+ Test: "1",
+ },
+ SubIgnore: &SubTest{
+ Test: "",
+ },
+ Anonymous: struct {
+ A string `validate:"required"`
+ }{
+ A: "1",
+ },
+ Iface: &Impl{
+ F: "123",
+ },
+ }
+
+ err := validate.Struct(tSuccess)
+ Equal(t, err, nil)
+
+ tFail := &TestString{
+ Required: "",
+ Len: "",
+ Min: "",
+ Max: "12345678901",
+ MinMax: "",
+ Lt: "0123456789",
+ Lte: "01234567890",
+ Gt: "1",
+ Gte: "1",
+ OmitEmpty: "12345678901",
+ Sub: &SubTest{
+ Test: "",
+ },
+ Anonymous: struct {
+ A string `validate:"required"`
+ }{
+ A: "",
+ },
+ Iface: &Impl{
+ F: "12",
+ },
+ }
+
+ err = validate.Struct(tFail)
+
+ // Assert Top Level
+ NotEqual(t, err, nil)
+ Equal(t, err.Struct, "TestString")
+ Equal(t, len(err.Errors), 10)
+ Equal(t, len(err.StructErrors), 3)
+
+ // Assert Fields
+ AssertFieldError(t, err, "Required", "required")
+ AssertFieldError(t, err, "Len", "len")
+ AssertFieldError(t, err, "Min", "min")
+ AssertFieldError(t, err, "Max", "max")
+ AssertFieldError(t, err, "MinMax", "min")
+ AssertFieldError(t, err, "Gt", "gt")
+ AssertFieldError(t, err, "Gte", "gte")
+ AssertFieldError(t, err, "OmitEmpty", "max")
+
+ // Assert Anonymous embedded struct
+ AssertStruct(t, err, "Anonymous", "")
+
+ // Assert SubTest embedded struct
+ val := AssertStruct(t, err, "Sub", "SubTest")
+ Equal(t, len(val.Errors), 1)
+ Equal(t, len(val.StructErrors), 0)
+
+ AssertFieldError(t, val, "Test", "required")
+
+ errors := err.Error()
+ NotEqual(t, errors, nil)
+}
+
+func TestStructInt32Validation(t *testing.T) {
+
+ tSuccess := &TestInt32{
+ Required: 1,
+ Len: 10,
+ Min: 1,
+ Max: 10,
+ MinMax: 5,
+ Lt: 9,
+ Lte: 10,
+ Gt: 11,
+ Gte: 10,
+ OmitEmpty: 0,
+ }
+
+ err := validate.Struct(tSuccess)
+ Equal(t, err, nil)
+
+ tFail := &TestInt32{
+ Required: 0,
+ Len: 11,
+ Min: -1,
+ Max: 11,
+ MinMax: -1,
+ Lt: 10,
+ Lte: 11,
+ Gt: 10,
+ Gte: 9,
+ OmitEmpty: 11,
+ }
+
+ err = validate.Struct(tFail)
+
+ // Assert Top Level
+ NotEqual(t, err, nil)
+ Equal(t, err.Struct, "TestInt32")
+ Equal(t, len(err.Errors), 10)
+ Equal(t, len(err.StructErrors), 0)
+
+ // Assert Fields
+ AssertFieldError(t, err, "Required", "required")
+ AssertFieldError(t, err, "Len", "len")
+ AssertFieldError(t, err, "Min", "min")
+ AssertFieldError(t, err, "Max", "max")
+ AssertFieldError(t, err, "MinMax", "min")
+ AssertFieldError(t, err, "Lt", "lt")
+ AssertFieldError(t, err, "Lte", "lte")
+ AssertFieldError(t, err, "Gt", "gt")
+ AssertFieldError(t, err, "Gte", "gte")
+ AssertFieldError(t, err, "OmitEmpty", "max")
+}
+
+func TestStructUint64Validation(t *testing.T) {
+
+ tSuccess := &TestUint64{
+ Required: 1,
+ Len: 10,
+ Min: 1,
+ Max: 10,
+ MinMax: 5,
+ OmitEmpty: 0,
+ }
+
+ err := validate.Struct(tSuccess)
+ Equal(t, err, nil)
+
+ tFail := &TestUint64{
+ Required: 0,
+ Len: 11,
+ Min: 0,
+ Max: 11,
+ MinMax: 0,
+ OmitEmpty: 11,
+ }
+
+ err = validate.Struct(tFail)
+
+ // Assert Top Level
+ NotEqual(t, err, nil)
+ Equal(t, err.Struct, "TestUint64")
+ Equal(t, len(err.Errors), 6)
+ Equal(t, len(err.StructErrors), 0)
+
+ // Assert Fields
+ AssertFieldError(t, err, "Required", "required")
+ AssertFieldError(t, err, "Len", "len")
+ AssertFieldError(t, err, "Min", "min")
+ AssertFieldError(t, err, "Max", "max")
+ AssertFieldError(t, err, "MinMax", "min")
+ AssertFieldError(t, err, "OmitEmpty", "max")
+}
+
+func TestStructFloat64Validation(t *testing.T) {
+
+ tSuccess := &TestFloat64{
+ Required: 1,
+ Len: 10,
+ Min: 1,
+ Max: 10,
+ MinMax: 5,
+ OmitEmpty: 0,
+ }
+
+ err := validate.Struct(tSuccess)
+ Equal(t, err, nil)
+
+ tFail := &TestFloat64{
+ Required: 0,
+ Len: 11,
+ Min: 0,
+ Max: 11,
+ MinMax: 0,
+ OmitEmpty: 11,
+ }
+
+ err = validate.Struct(tFail)
+
+ // Assert Top Level
+ NotEqual(t, err, nil)
+ Equal(t, err.Struct, "TestFloat64")
+ Equal(t, len(err.Errors), 6)
+ Equal(t, len(err.StructErrors), 0)
+
+ // Assert Fields
+ AssertFieldError(t, err, "Required", "required")
+ AssertFieldError(t, err, "Len", "len")
+ AssertFieldError(t, err, "Min", "min")
+ AssertFieldError(t, err, "Max", "max")
+ AssertFieldError(t, err, "MinMax", "min")
+ AssertFieldError(t, err, "OmitEmpty", "max")
+}
+
+func TestStructSliceValidation(t *testing.T) {
+
+ tSuccess := &TestSlice{
+ Required: []int{1},
+ Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+ Min: []int{1, 2},
+ Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+ MinMax: []int{1, 2, 3, 4, 5},
+ OmitEmpty: nil,
+ }
+
+ err := validate.Struct(tSuccess)
+ Equal(t, err, nil)
+
+ tFail := &TestSlice{
+ Required: nil,
+ Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
+ Min: []int{},
+ Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
+ MinMax: []int{},
+ OmitEmpty: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
+ }
+
+ err = validate.Struct(tFail)
+
+ // Assert Top Level
+ NotEqual(t, err, nil)
+ Equal(t, err.Struct, "TestSlice")
+ Equal(t, len(err.Errors), 6)
+ Equal(t, len(err.StructErrors), 0)
+
+ // Assert Fields
+ AssertFieldError(t, err, "Required", "required")
+ AssertFieldError(t, err, "Len", "len")
+ AssertFieldError(t, err, "Min", "min")
+ AssertFieldError(t, err, "Max", "max")
+ AssertFieldError(t, err, "MinMax", "min")
+ AssertFieldError(t, err, "OmitEmpty", "max")
+}
+
+func TestInvalidStruct(t *testing.T) {
+ s := &SubTest{
+ Test: "1",
+ }
+
+ PanicMatches(t, func() { validate.Struct(s.Test) }, "interface passed for validation is not a struct")
+}
+
+func TestInvalidField(t *testing.T) {
+ s := &SubTest{
+ Test: "1",
+ }
+
+ PanicMatches(t, func() { validate.Field(s, "required") }, "Invalid field passed to fieldWithNameAndValue")
+}
+
+func TestInvalidTagField(t *testing.T) {
+ s := &SubTest{
+ Test: "1",
+ }
+
+ PanicMatches(t, func() { validate.Field(s.Test, "") }, fmt.Sprintf("Invalid validation tag on field %s", ""))
+}
+
+func TestInvalidValidatorFunction(t *testing.T) {
+ s := &SubTest{
+ Test: "1",
+ }
+
+ PanicMatches(t, func() { validate.Field(s.Test, "zzxxBadFunction") }, fmt.Sprintf("Undefined validation function on field %s", ""))
+}
+
+func TestPoolObjectMaxSizeValidation(t *testing.T) {
+ // this will ensure that the pool objects are let go
+ // when the pool is saturated
+ validate.SetMaxStructPoolSize(0)
+
+ tSuccess := &TestSlice{
+ Required: []int{1},
+ Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+ Min: []int{1, 2},
+ Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+ MinMax: []int{1, 2, 3, 4, 5},
+ OmitEmpty: nil,
+ }
+
+ for i := 0; i < 2; i++ {
+ err := validate.Struct(tSuccess)
+ Equal(t, err, nil)
+ }
+}
diff --git a/vendor/gopkg.in/gorp.v1/LICENSE b/vendor/gopkg.in/gorp.v1/LICENSE
new file mode 100644
index 000000000..b661111d0
--- /dev/null
+++ b/vendor/gopkg.in/gorp.v1/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2012 James Cooper
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/gopkg.in/gorp.v1/Makefile b/vendor/gopkg.in/gorp.v1/Makefile
new file mode 100644
index 000000000..edf771c17
--- /dev/null
+++ b/vendor/gopkg.in/gorp.v1/Makefile
@@ -0,0 +1,6 @@
+include $(GOROOT)/src/Make.inc
+
+TARG = github.com/coopernurse/gorp
+GOFILES = gorp.go dialect.go
+
+include $(GOROOT)/src/Make.pkg
\ No newline at end of file
diff --git a/vendor/gopkg.in/gorp.v1/README.md b/vendor/gopkg.in/gorp.v1/README.md
new file mode 100644
index 000000000..c7cd5d8a2
--- /dev/null
+++ b/vendor/gopkg.in/gorp.v1/README.md
@@ -0,0 +1,672 @@
+# Go Relational Persistence
+
+[](http://travis-ci.org/go-gorp/gorp)
+
+I hesitate to call gorp an ORM. Go doesn't really have objects, at least
+not in the classic Smalltalk/Java sense. There goes the "O". gorp doesn't
+know anything about the relationships between your structs (at least not
+yet). So the "R" is questionable too (but I use it in the name because,
+well, it seemed more clever).
+
+The "M" is alive and well. Given some Go structs and a database, gorp
+should remove a fair amount of boilerplate busy-work from your code.
+
+I hope that gorp saves you time, minimizes the drudgery of getting data
+in and out of your database, and helps your code focus on algorithms,
+not infrastructure.
+
+* Bind struct fields to table columns via API or tag
+* Support for embedded structs
+* Support for transactions
+* Forward engineer db schema from structs (great for unit tests)
+* Pre/post insert/update/delete hooks
+* Automatically generate insert/update/delete statements for a struct
+* Automatic binding of auto increment PKs back to struct after insert
+* Delete by primary key(s)
+* Select by primary key(s)
+* Optional trace sql logging
+* Bind arbitrary SQL queries to a struct
+* Bind slice to SELECT query results without type assertions
+* Use positional or named bind parameters in custom SELECT queries
+* Optional optimistic locking using a version column (for update/deletes)
+
+## Installation
+
+ # install the library:
+ go get gopkg.in/gorp.v1
+
+ // use in your .go code:
+ import (
+ "gopkg.in/gorp.v1"
+ )
+
+## Versioning
+
+This project provides a stable release (v1.x tags) and a bleeding edge codebase (master).
+
+`gopkg.in/gorp.v1` points to the latest v1.x tag. The API's for v1 are stable and shouldn't change. Development takes place at the master branch. Althought the code in master should always compile and test successfully, it might break API's. We aim to maintain backwards compatibility, but API's and behaviour might be changed to fix a bug. Also note that API's that are new in the master branch can change until released as v2.
+
+If you want to use bleeding edge, use `github.com/go-gorp/gorp` as import path.
+
+## API Documentation
+
+Full godoc output from the latest v1 release is available here:
+
+https://godoc.org/gopkg.in/gorp.v1
+
+For the latest code in master:
+
+https://godoc.org/github.com/go-gorp/gorp
+
+## Quickstart
+
+```go
+package main
+
+import (
+ "database/sql"
+ "gopkg.in/gorp.v1"
+ _ "github.com/mattn/go-sqlite3"
+ "log"
+ "time"
+)
+
+func main() {
+ // initialize the DbMap
+ dbmap := initDb()
+ defer dbmap.Db.Close()
+
+ // delete any existing rows
+ err := dbmap.TruncateTables()
+ checkErr(err, "TruncateTables failed")
+
+ // create two posts
+ p1 := newPost("Go 1.1 released!", "Lorem ipsum lorem ipsum")
+ p2 := newPost("Go 1.2 released!", "Lorem ipsum lorem ipsum")
+
+ // insert rows - auto increment PKs will be set properly after the insert
+ err = dbmap.Insert(&p1, &p2)
+ checkErr(err, "Insert failed")
+
+ // use convenience SelectInt
+ count, err := dbmap.SelectInt("select count(*) from posts")
+ checkErr(err, "select count(*) failed")
+ log.Println("Rows after inserting:", count)
+
+ // update a row
+ p2.Title = "Go 1.2 is better than ever"
+ count, err = dbmap.Update(&p2)
+ checkErr(err, "Update failed")
+ log.Println("Rows updated:", count)
+
+ // fetch one row - note use of "post_id" instead of "Id" since column is aliased
+ //
+ // Postgres users should use $1 instead of ? placeholders
+ // See 'Known Issues' below
+ //
+ err = dbmap.SelectOne(&p2, "select * from posts where post_id=?", p2.Id)
+ checkErr(err, "SelectOne failed")
+ log.Println("p2 row:", p2)
+
+ // fetch all rows
+ var posts []Post
+ _, err = dbmap.Select(&posts, "select * from posts order by post_id")
+ checkErr(err, "Select failed")
+ log.Println("All rows:")
+ for x, p := range posts {
+ log.Printf(" %d: %v\n", x, p)
+ }
+
+ // delete row by PK
+ count, err = dbmap.Delete(&p1)
+ checkErr(err, "Delete failed")
+ log.Println("Rows deleted:", count)
+
+ // delete row manually via Exec
+ _, err = dbmap.Exec("delete from posts where post_id=?", p2.Id)
+ checkErr(err, "Exec failed")
+
+ // confirm count is zero
+ count, err = dbmap.SelectInt("select count(*) from posts")
+ checkErr(err, "select count(*) failed")
+ log.Println("Row count - should be zero:", count)
+
+ log.Println("Done!")
+}
+
+type Post struct {
+ // db tag lets you specify the column name if it differs from the struct field
+ Id int64 `db:"post_id"`
+ Created int64
+ Title string
+ Body string
+}
+
+func newPost(title, body string) Post {
+ return Post{
+ Created: time.Now().UnixNano(),
+ Title: title,
+ Body: body,
+ }
+}
+
+func initDb() *gorp.DbMap {
+ // connect to db using standard Go database/sql API
+ // use whatever database/sql driver you wish
+ db, err := sql.Open("sqlite3", "/tmp/post_db.bin")
+ checkErr(err, "sql.Open failed")
+
+ // construct a gorp DbMap
+ dbmap := &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
+
+ // add a table, setting the table name to 'posts' and
+ // specifying that the Id property is an auto incrementing PK
+ dbmap.AddTableWithName(Post{}, "posts").SetKeys(true, "Id")
+
+ // create the table. in a production system you'd generally
+ // use a migration tool, or create the tables via scripts
+ err = dbmap.CreateTablesIfNotExists()
+ checkErr(err, "Create tables failed")
+
+ return dbmap
+}
+
+func checkErr(err error, msg string) {
+ if err != nil {
+ log.Fatalln(msg, err)
+ }
+}
+```
+
+## Examples
+
+### Mapping structs to tables
+
+First define some types:
+
+```go
+type Invoice struct {
+ Id int64
+ Created int64
+ Updated int64
+ Memo string
+ PersonId int64
+}
+
+type Person struct {
+ Id int64
+ Created int64
+ Updated int64
+ FName string
+ LName string
+}
+
+// Example of using tags to alias fields to column names
+// The 'db' value is the column name
+//
+// A hyphen will cause gorp to skip this field, similar to the
+// Go json package.
+//
+// This is equivalent to using the ColMap methods:
+//
+// table := dbmap.AddTableWithName(Product{}, "product")
+// table.ColMap("Id").Rename("product_id")
+// table.ColMap("Price").Rename("unit_price")
+// table.ColMap("IgnoreMe").SetTransient(true)
+//
+type Product struct {
+ Id int64 `db:"product_id"`
+ Price int64 `db:"unit_price"`
+ IgnoreMe string `db:"-"`
+}
+```
+
+Then create a mapper, typically you'd do this one time at app startup:
+
+```go
+// connect to db using standard Go database/sql API
+// use whatever database/sql driver you wish
+db, err := sql.Open("mymysql", "tcp:localhost:3306*mydb/myuser/mypassword")
+
+// construct a gorp DbMap
+dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}
+
+// register the structs you wish to use with gorp
+// you can also use the shorter dbmap.AddTable() if you
+// don't want to override the table name
+//
+// SetKeys(true) means we have a auto increment primary key, which
+// will get automatically bound to your struct post-insert
+//
+t1 := dbmap.AddTableWithName(Invoice{}, "invoice_test").SetKeys(true, "Id")
+t2 := dbmap.AddTableWithName(Person{}, "person_test").SetKeys(true, "Id")
+t3 := dbmap.AddTableWithName(Product{}, "product_test").SetKeys(true, "Id")
+```
+
+### Struct Embedding
+
+gorp supports embedding structs. For example:
+
+```go
+type Names struct {
+ FirstName string
+ LastName string
+}
+
+type WithEmbeddedStruct struct {
+ Id int64
+ Names
+}
+
+es := &WithEmbeddedStruct{-1, Names{FirstName: "Alice", LastName: "Smith"}}
+err := dbmap.Insert(es)
+```
+
+See the `TestWithEmbeddedStruct` function in `gorp_test.go` for a full example.
+
+### Create/Drop Tables ###
+
+Automatically create / drop registered tables. This is useful for unit tests
+but is entirely optional. You can of course use gorp with tables created manually,
+or with a separate migration tool (like goose: https://bitbucket.org/liamstask/goose).
+
+```go
+// create all registered tables
+dbmap.CreateTables()
+
+// same as above, but uses "if not exists" clause to skip tables that are
+// already defined
+dbmap.CreateTablesIfNotExists()
+
+// drop
+dbmap.DropTables()
+```
+
+### SQL Logging
+
+Optionally you can pass in a logger to trace all SQL statements.
+I recommend enabling this initially while you're getting the feel for what
+gorp is doing on your behalf.
+
+Gorp defines a `GorpLogger` interface that Go's built in `log.Logger` satisfies.
+However, you can write your own `GorpLogger` implementation, or use a package such
+as `glog` if you want more control over how statements are logged.
+
+```go
+// Will log all SQL statements + args as they are run
+// The first arg is a string prefix to prepend to all log messages
+dbmap.TraceOn("[gorp]", log.New(os.Stdout, "myapp:", log.Lmicroseconds))
+
+// Turn off tracing
+dbmap.TraceOff()
+```
+
+### Insert
+
+```go
+// Must declare as pointers so optional callback hooks
+// can operate on your data, not copies
+inv1 := &Invoice{0, 100, 200, "first order", 0}
+inv2 := &Invoice{0, 100, 200, "second order", 0}
+
+// Insert your rows
+err := dbmap.Insert(inv1, inv2)
+
+// Because we called SetKeys(true) on Invoice, the Id field
+// will be populated after the Insert() automatically
+fmt.Printf("inv1.Id=%d inv2.Id=%d\n", inv1.Id, inv2.Id)
+```
+
+### Update
+
+Continuing the above example, use the `Update` method to modify an Invoice:
+
+```go
+// count is the # of rows updated, which should be 1 in this example
+count, err := dbmap.Update(inv1)
+```
+
+### Delete
+
+If you have primary key(s) defined for a struct, you can use the `Delete`
+method to remove rows:
+
+```go
+count, err := dbmap.Delete(inv1)
+```
+
+### Select by Key
+
+Use the `Get` method to fetch a single row by primary key. It returns
+nil if no row is found.
+
+```go
+// fetch Invoice with Id=99
+obj, err := dbmap.Get(Invoice{}, 99)
+inv := obj.(*Invoice)
+```
+
+### Ad Hoc SQL
+
+#### SELECT
+
+`Select()` and `SelectOne()` provide a simple way to bind arbitrary queries to a slice
+or a single struct.
+
+```go
+// Select a slice - first return value is not needed when a slice pointer is passed to Select()
+var posts []Post
+_, err := dbmap.Select(&posts, "select * from post order by id")
+
+// You can also use primitive types
+var ids []string
+_, err := dbmap.Select(&ids, "select id from post")
+
+// Select a single row.
+// Returns an error if no row found, or if more than one row is found
+var post Post
+err := dbmap.SelectOne(&post, "select * from post where id=?", id)
+```
+
+Want to do joins? Just write the SQL and the struct. gorp will bind them:
+
+```go
+// Define a type for your join
+// It *must* contain all the columns in your SELECT statement
+//
+// The names here should match the aliased column names you specify
+// in your SQL - no additional binding work required. simple.
+//
+type InvoicePersonView struct {
+ InvoiceId int64
+ PersonId int64
+ Memo string
+ FName string
+}
+
+// Create some rows
+p1 := &Person{0, 0, 0, "bob", "smith"}
+dbmap.Insert(p1)
+
+// notice how we can wire up p1.Id to the invoice easily
+inv1 := &Invoice{0, 0, 0, "xmas order", p1.Id}
+dbmap.Insert(inv1)
+
+// Run your query
+query := "select i.Id InvoiceId, p.Id PersonId, i.Memo, p.FName " +
+ "from invoice_test i, person_test p " +
+ "where i.PersonId = p.Id"
+
+// pass a slice to Select()
+var list []InvoicePersonView
+_, err := dbmap.Select(&list, query)
+
+// this should test true
+expected := InvoicePersonView{inv1.Id, p1.Id, inv1.Memo, p1.FName}
+if reflect.DeepEqual(list[0], expected) {
+ fmt.Println("Woot! My join worked!")
+}
+```
+
+#### SELECT string or int64
+
+gorp provides a few convenience methods for selecting a single string or int64.
+
+```go
+// select single int64 from db (use $1 instead of ? for postgresql)
+i64, err := dbmap.SelectInt("select count(*) from foo where blah=?", blahVal)
+
+// select single string from db:
+s, err := dbmap.SelectStr("select name from foo where blah=?", blahVal)
+
+```
+
+#### Named bind parameters
+
+You may use a map or struct to bind parameters by name. This is currently
+only supported in SELECT queries.
+
+```go
+_, err := dbm.Select(&dest, "select * from Foo where name = :name and age = :age", map[string]interface{}{
+ "name": "Rob",
+ "age": 31,
+})
+```
+
+#### UPDATE / DELETE
+
+You can execute raw SQL if you wish. Particularly good for batch operations.
+
+```go
+res, err := dbmap.Exec("delete from invoice_test where PersonId=?", 10)
+```
+
+### Transactions
+
+You can batch operations into a transaction:
+
+```go
+func InsertInv(dbmap *DbMap, inv *Invoice, per *Person) error {
+ // Start a new transaction
+ trans, err := dbmap.Begin()
+ if err != nil {
+ return err
+ }
+
+ trans.Insert(per)
+ inv.PersonId = per.Id
+ trans.Insert(inv)
+
+ // if the commit is successful, a nil error is returned
+ return trans.Commit()
+}
+```
+
+### Hooks
+
+Use hooks to update data before/after saving to the db. Good for timestamps:
+
+```go
+// implement the PreInsert and PreUpdate hooks
+func (i *Invoice) PreInsert(s gorp.SqlExecutor) error {
+ i.Created = time.Now().UnixNano()
+ i.Updated = i.Created
+ return nil
+}
+
+func (i *Invoice) PreUpdate(s gorp.SqlExecutor) error {
+ i.Updated = time.Now().UnixNano()
+ return nil
+}
+
+// You can use the SqlExecutor to cascade additional SQL
+// Take care to avoid cycles. gorp won't prevent them.
+//
+// Here's an example of a cascading delete
+//
+func (p *Person) PreDelete(s gorp.SqlExecutor) error {
+ query := "delete from invoice_test where PersonId=?"
+ err := s.Exec(query, p.Id); if err != nil {
+ return err
+ }
+ return nil
+}
+```
+
+Full list of hooks that you can implement:
+
+ PostGet
+ PreInsert
+ PostInsert
+ PreUpdate
+ PostUpdate
+ PreDelete
+ PostDelete
+
+ All have the same signature. for example:
+
+ func (p *MyStruct) PostUpdate(s gorp.SqlExecutor) error
+
+### Optimistic Locking
+
+gorp provides a simple optimistic locking feature, similar to Java's JPA, that
+will raise an error if you try to update/delete a row whose `version` column
+has a value different than the one in memory. This provides a safe way to do
+"select then update" style operations without explicit read and write locks.
+
+```go
+// Version is an auto-incremented number, managed by gorp
+// If this property is present on your struct, update
+// operations will be constrained
+//
+// For example, say we defined Person as:
+
+type Person struct {
+ Id int64
+ Created int64
+ Updated int64
+ FName string
+ LName string
+
+ // automatically used as the Version col
+ // use table.SetVersionCol("columnName") to map a different
+ // struct field as the version field
+ Version int64
+}
+
+p1 := &Person{0, 0, 0, "Bob", "Smith", 0}
+dbmap.Insert(p1) // Version is now 1
+
+obj, err := dbmap.Get(Person{}, p1.Id)
+p2 := obj.(*Person)
+p2.LName = "Edwards"
+dbmap.Update(p2) // Version is now 2
+
+p1.LName = "Howard"
+
+// Raises error because p1.Version == 1, which is out of date
+count, err := dbmap.Update(p1)
+_, ok := err.(gorp.OptimisticLockError)
+if ok {
+ // should reach this statement
+
+ // in a real app you might reload the row and retry, or
+ // you might propegate this to the user, depending on the desired
+ // semantics
+ fmt.Printf("Tried to update row with stale data: %v\n", err)
+} else {
+ // some other db error occurred - log or return up the stack
+ fmt.Printf("Unknown db err: %v\n", err)
+}
+```
+
+## Database Drivers
+
+gorp uses the Go 1 `database/sql` package. A full list of compliant drivers is available here:
+
+http://code.google.com/p/go-wiki/wiki/SQLDrivers
+
+Sadly, SQL databases differ on various issues. gorp provides a Dialect interface that should be
+implemented per database vendor. Dialects are provided for:
+
+* MySQL
+* PostgreSQL
+* sqlite3
+
+Each of these three databases pass the test suite. See `gorp_test.go` for example
+DSNs for these three databases.
+
+Support is also provided for:
+
+* Oracle (contributed by @klaidliadon)
+* SQL Server (contributed by @qrawl) - use driver: github.com/denisenkom/go-mssqldb
+
+Note that these databases are not covered by CI and I (@coopernurse) have no good way to
+test them locally. So please try them and send patches as needed, but expect a bit more
+unpredicability.
+
+## Known Issues
+
+### SQL placeholder portability
+
+Different databases use different strings to indicate variable placeholders in
+prepared SQL statements. Unlike some database abstraction layers (such as JDBC),
+Go's `database/sql` does not standardize this.
+
+SQL generated by gorp in the `Insert`, `Update`, `Delete`, and `Get` methods delegates
+to a Dialect implementation for each database, and will generate portable SQL.
+
+Raw SQL strings passed to `Exec`, `Select`, `SelectOne`, `SelectInt`, etc will not be
+parsed. Consequently you may have portability issues if you write a query like this:
+
+```go
+// works on MySQL and Sqlite3, but not with Postgresql
+err := dbmap.SelectOne(&val, "select * from foo where id = ?", 30)
+```
+
+In `Select` and `SelectOne` you can use named parameters to work around this.
+The following is portable:
+
+```go
+err := dbmap.SelectOne(&val, "select * from foo where id = :id",
+ map[string]interface{} { "id": 30})
+```
+
+### time.Time and time zones
+
+gorp will pass `time.Time` fields through to the `database/sql` driver, but note that
+the behavior of this type varies across database drivers.
+
+MySQL users should be especially cautious. See: https://github.com/ziutek/mymysql/pull/77
+
+To avoid any potential issues with timezone/DST, consider using an integer field for time
+data and storing UNIX time.
+
+## Running the tests
+
+The included tests may be run against MySQL, Postgresql, or sqlite3.
+You must set two environment variables so the test code knows which driver to
+use, and how to connect to your database.
+
+```sh
+# MySQL example:
+export GORP_TEST_DSN=gomysql_test/gomysql_test/abc123
+export GORP_TEST_DIALECT=mysql
+
+# run the tests
+go test
+
+# run the tests and benchmarks
+go test -bench="Bench" -benchtime 10
+```
+
+Valid `GORP_TEST_DIALECT` values are: "mysql", "postgres", "sqlite3"
+See the `test_all.sh` script for examples of all 3 databases. This is the script I run
+locally to test the library.
+
+## Performance
+
+gorp uses reflection to construct SQL queries and bind parameters. See the BenchmarkNativeCrud vs BenchmarkGorpCrud in gorp_test.go for a simple perf test. On my MacBook Pro gorp is about 2-3% slower than hand written SQL.
+
+## Help/Support
+
+IRC: #gorp
+Mailing list: gorp-dev@googlegroups.com
+Bugs/Enhancements: Create a github issue
+
+## Pull requests / Contributions
+
+Contributions are very welcome. Please follow these guidelines:
+
+* Fork the `master` branch and issue pull requests targeting the `master` branch
+* If you are adding an enhancement, please open an issue first with your proposed change.
+* Changes that break backwards compatibility in the public API are only accepted after we
+ discuss on a GitHub issue for a while.
+
+Thanks!
+
+## Contributors
+
+* matthias-margush - column aliasing via tags
+* Rob Figueiredo - @robfig
+* Quinn Slack - @sqs
diff --git a/vendor/gopkg.in/gorp.v1/dialect.go b/vendor/gopkg.in/gorp.v1/dialect.go
new file mode 100644
index 000000000..5e8fdc667
--- /dev/null
+++ b/vendor/gopkg.in/gorp.v1/dialect.go
@@ -0,0 +1,692 @@
+package gorp
+
+import (
+ "errors"
+ "fmt"
+ "reflect"
+ "strings"
+)
+
+// The Dialect interface encapsulates behaviors that differ across
+// SQL databases. At present the Dialect is only used by CreateTables()
+// but this could change in the future
+type Dialect interface {
+
+ // adds a suffix to any query, usually ";"
+ QuerySuffix() string
+
+ // ToSqlType returns the SQL column type to use when creating a
+ // table of the given Go Type. maxsize can be used to switch based on
+ // size. For example, in MySQL []byte could map to BLOB, MEDIUMBLOB,
+ // or LONGBLOB depending on the maxsize
+ ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string
+
+ // string to append to primary key column definitions
+ AutoIncrStr() string
+
+ // string to bind autoincrement columns to. Empty string will
+ // remove reference to those columns in the INSERT statement.
+ AutoIncrBindValue() string
+
+ AutoIncrInsertSuffix(col *ColumnMap) string
+
+ // string to append to "create table" statement for vendor specific
+ // table attributes
+ CreateTableSuffix() string
+
+ // string to truncate tables
+ TruncateClause() string
+
+ // bind variable string to use when forming SQL statements
+ // in many dbs it is "?", but Postgres appears to use $1
+ //
+ // i is a zero based index of the bind variable in this statement
+ //
+ BindVar(i int) string
+
+ // Handles quoting of a field name to ensure that it doesn't raise any
+ // SQL parsing exceptions by using a reserved word as a field name.
+ QuoteField(field string) string
+
+ // Handles building up of a schema.database string that is compatible with
+ // the given dialect
+ //
+ // schema - The schema that lives in
+ // table - The table name
+ QuotedTableForQuery(schema string, table string) string
+
+ // Existance clause for table creation / deletion
+ IfSchemaNotExists(command, schema string) string
+ IfTableExists(command, schema, table string) string
+ IfTableNotExists(command, schema, table string) string
+}
+
+// IntegerAutoIncrInserter is implemented by dialects that can perform
+// inserts with automatically incremented integer primary keys. If
+// the dialect can handle automatic assignment of more than just
+// integers, see TargetedAutoIncrInserter.
+type IntegerAutoIncrInserter interface {
+ InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error)
+}
+
+// TargetedAutoIncrInserter is implemented by dialects that can
+// perform automatic assignment of any primary key type (i.e. strings
+// for uuids, integers for serials, etc).
+type TargetedAutoIncrInserter interface {
+ // InsertAutoIncrToTarget runs an insert operation and assigns the
+ // automatically generated primary key directly to the passed in
+ // target. The target should be a pointer to the primary key
+ // field of the value being inserted.
+ InsertAutoIncrToTarget(exec SqlExecutor, insertSql string, target interface{}, params ...interface{}) error
+}
+
+func standardInsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error) {
+ res, err := exec.Exec(insertSql, params...)
+ if err != nil {
+ return 0, err
+ }
+ return res.LastInsertId()
+}
+
+///////////////////////////////////////////////////////
+// sqlite3 //
+/////////////
+
+type SqliteDialect struct {
+ suffix string
+}
+
+func (d SqliteDialect) QuerySuffix() string { return ";" }
+
+func (d SqliteDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string {
+ switch val.Kind() {
+ case reflect.Ptr:
+ return d.ToSqlType(val.Elem(), maxsize, isAutoIncr)
+ case reflect.Bool:
+ return "integer"
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return "integer"
+ case reflect.Float64, reflect.Float32:
+ return "real"
+ case reflect.Slice:
+ if val.Elem().Kind() == reflect.Uint8 {
+ return "blob"
+ }
+ }
+
+ switch val.Name() {
+ case "NullInt64":
+ return "integer"
+ case "NullFloat64":
+ return "real"
+ case "NullBool":
+ return "integer"
+ case "Time":
+ return "datetime"
+ }
+
+ if maxsize < 1 {
+ maxsize = 255
+ }
+ return fmt.Sprintf("varchar(%d)", maxsize)
+}
+
+// Returns autoincrement
+func (d SqliteDialect) AutoIncrStr() string {
+ return "autoincrement"
+}
+
+func (d SqliteDialect) AutoIncrBindValue() string {
+ return "null"
+}
+
+func (d SqliteDialect) AutoIncrInsertSuffix(col *ColumnMap) string {
+ return ""
+}
+
+// Returns suffix
+func (d SqliteDialect) CreateTableSuffix() string {
+ return d.suffix
+}
+
+// With sqlite, there technically isn't a TRUNCATE statement,
+// but a DELETE FROM uses a truncate optimization:
+// http://www.sqlite.org/lang_delete.html
+func (d SqliteDialect) TruncateClause() string {
+ return "delete from"
+}
+
+// Returns "?"
+func (d SqliteDialect) BindVar(i int) string {
+ return "?"
+}
+
+func (d SqliteDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error) {
+ return standardInsertAutoIncr(exec, insertSql, params...)
+}
+
+func (d SqliteDialect) QuoteField(f string) string {
+ return `"` + f + `"`
+}
+
+// sqlite does not have schemas like PostgreSQL does, so just escape it like normal
+func (d SqliteDialect) QuotedTableForQuery(schema string, table string) string {
+ return d.QuoteField(table)
+}
+
+func (d SqliteDialect) IfSchemaNotExists(command, schema string) string {
+ return fmt.Sprintf("%s if not exists", command)
+}
+
+func (d SqliteDialect) IfTableExists(command, schema, table string) string {
+ return fmt.Sprintf("%s if exists", command)
+}
+
+func (d SqliteDialect) IfTableNotExists(command, schema, table string) string {
+ return fmt.Sprintf("%s if not exists", command)
+}
+
+///////////////////////////////////////////////////////
+// PostgreSQL //
+////////////////
+
+type PostgresDialect struct {
+ suffix string
+}
+
+func (d PostgresDialect) QuerySuffix() string { return ";" }
+
+func (d PostgresDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string {
+ switch val.Kind() {
+ case reflect.Ptr:
+ return d.ToSqlType(val.Elem(), maxsize, isAutoIncr)
+ case reflect.Bool:
+ return "boolean"
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint8, reflect.Uint16, reflect.Uint32:
+ if isAutoIncr {
+ return "serial"
+ }
+ return "integer"
+ case reflect.Int64, reflect.Uint64:
+ if isAutoIncr {
+ return "bigserial"
+ }
+ return "bigint"
+ case reflect.Float64:
+ return "double precision"
+ case reflect.Float32:
+ return "real"
+ case reflect.Slice:
+ if val.Elem().Kind() == reflect.Uint8 {
+ return "bytea"
+ }
+ }
+
+ switch val.Name() {
+ case "NullInt64":
+ return "bigint"
+ case "NullFloat64":
+ return "double precision"
+ case "NullBool":
+ return "boolean"
+ case "Time":
+ return "timestamp with time zone"
+ }
+
+ if maxsize > 0 {
+ return fmt.Sprintf("varchar(%d)", maxsize)
+ } else {
+ return "text"
+ }
+
+}
+
+// Returns empty string
+func (d PostgresDialect) AutoIncrStr() string {
+ return ""
+}
+
+func (d PostgresDialect) AutoIncrBindValue() string {
+ return "default"
+}
+
+func (d PostgresDialect) AutoIncrInsertSuffix(col *ColumnMap) string {
+ return " returning " + col.ColumnName
+}
+
+// Returns suffix
+func (d PostgresDialect) CreateTableSuffix() string {
+ return d.suffix
+}
+
+func (d PostgresDialect) TruncateClause() string {
+ return "truncate"
+}
+
+// Returns "$(i+1)"
+func (d PostgresDialect) BindVar(i int) string {
+ return fmt.Sprintf("$%d", i+1)
+}
+
+func (d PostgresDialect) InsertAutoIncrToTarget(exec SqlExecutor, insertSql string, target interface{}, params ...interface{}) error {
+ rows, err := exec.query(insertSql, params...)
+ if err != nil {
+ return err
+ }
+ defer rows.Close()
+
+ if rows.Next() {
+ err := rows.Scan(target)
+ return err
+ }
+
+ return errors.New("No serial value returned for insert: " + insertSql + " Encountered error: " + rows.Err().Error())
+}
+
+func (d PostgresDialect) QuoteField(f string) string {
+ return `"` + strings.ToLower(f) + `"`
+}
+
+func (d PostgresDialect) QuotedTableForQuery(schema string, table string) string {
+ if strings.TrimSpace(schema) == "" {
+ return d.QuoteField(table)
+ }
+
+ return schema + "." + d.QuoteField(table)
+}
+
+func (d PostgresDialect) IfSchemaNotExists(command, schema string) string {
+ return fmt.Sprintf("%s if not exists", command)
+}
+
+func (d PostgresDialect) IfTableExists(command, schema, table string) string {
+ return fmt.Sprintf("%s if exists", command)
+}
+
+func (d PostgresDialect) IfTableNotExists(command, schema, table string) string {
+ return fmt.Sprintf("%s if not exists", command)
+}
+
+///////////////////////////////////////////////////////
+// MySQL //
+///////////
+
+// Implementation of Dialect for MySQL databases.
+type MySQLDialect struct {
+
+ // Engine is the storage engine to use "InnoDB" vs "MyISAM" for example
+ Engine string
+
+ // Encoding is the character encoding to use for created tables
+ Encoding string
+}
+
+func (d MySQLDialect) QuerySuffix() string { return ";" }
+
+func (d MySQLDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string {
+ switch val.Kind() {
+ case reflect.Ptr:
+ return d.ToSqlType(val.Elem(), maxsize, isAutoIncr)
+ case reflect.Bool:
+ return "boolean"
+ case reflect.Int8:
+ return "tinyint"
+ case reflect.Uint8:
+ return "tinyint unsigned"
+ case reflect.Int16:
+ return "smallint"
+ case reflect.Uint16:
+ return "smallint unsigned"
+ case reflect.Int, reflect.Int32:
+ return "int"
+ case reflect.Uint, reflect.Uint32:
+ return "int unsigned"
+ case reflect.Int64:
+ return "bigint"
+ case reflect.Uint64:
+ return "bigint unsigned"
+ case reflect.Float64, reflect.Float32:
+ return "double"
+ case reflect.Slice:
+ if val.Elem().Kind() == reflect.Uint8 {
+ return "mediumblob"
+ }
+ }
+
+ switch val.Name() {
+ case "NullInt64":
+ return "bigint"
+ case "NullFloat64":
+ return "double"
+ case "NullBool":
+ return "tinyint"
+ case "Time":
+ return "datetime"
+ }
+
+ if maxsize < 1 {
+ maxsize = 255
+ }
+ return fmt.Sprintf("varchar(%d)", maxsize)
+}
+
+// Returns auto_increment
+func (d MySQLDialect) AutoIncrStr() string {
+ return "auto_increment"
+}
+
+func (d MySQLDialect) AutoIncrBindValue() string {
+ return "null"
+}
+
+func (d MySQLDialect) AutoIncrInsertSuffix(col *ColumnMap) string {
+ return ""
+}
+
+// Returns engine=%s charset=%s based on values stored on struct
+func (d MySQLDialect) CreateTableSuffix() string {
+ if d.Engine == "" || d.Encoding == "" {
+ msg := "gorp - undefined"
+
+ if d.Engine == "" {
+ msg += " MySQLDialect.Engine"
+ }
+ if d.Engine == "" && d.Encoding == "" {
+ msg += ","
+ }
+ if d.Encoding == "" {
+ msg += " MySQLDialect.Encoding"
+ }
+ msg += ". Check that your MySQLDialect was correctly initialized when declared."
+ panic(msg)
+ }
+
+ return fmt.Sprintf(" engine=%s charset=%s", d.Engine, d.Encoding)
+}
+
+func (d MySQLDialect) TruncateClause() string {
+ return "truncate"
+}
+
+// Returns "?"
+func (d MySQLDialect) BindVar(i int) string {
+ return "?"
+}
+
+func (d MySQLDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error) {
+ return standardInsertAutoIncr(exec, insertSql, params...)
+}
+
+func (d MySQLDialect) QuoteField(f string) string {
+ return "`" + f + "`"
+}
+
+func (d MySQLDialect) QuotedTableForQuery(schema string, table string) string {
+ if strings.TrimSpace(schema) == "" {
+ return d.QuoteField(table)
+ }
+
+ return schema + "." + d.QuoteField(table)
+}
+
+func (d MySQLDialect) IfSchemaNotExists(command, schema string) string {
+ return fmt.Sprintf("%s if not exists", command)
+}
+
+func (d MySQLDialect) IfTableExists(command, schema, table string) string {
+ return fmt.Sprintf("%s if exists", command)
+}
+
+func (d MySQLDialect) IfTableNotExists(command, schema, table string) string {
+ return fmt.Sprintf("%s if not exists", command)
+}
+
+///////////////////////////////////////////////////////
+// Sql Server //
+////////////////
+
+// Implementation of Dialect for Microsoft SQL Server databases.
+// Tested on SQL Server 2008 with driver: github.com/denisenkom/go-mssqldb
+
+type SqlServerDialect struct {
+ suffix string
+}
+
+func (d SqlServerDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string {
+ switch val.Kind() {
+ case reflect.Ptr:
+ return d.ToSqlType(val.Elem(), maxsize, isAutoIncr)
+ case reflect.Bool:
+ return "bit"
+ case reflect.Int8:
+ return "tinyint"
+ case reflect.Uint8:
+ return "smallint"
+ case reflect.Int16:
+ return "smallint"
+ case reflect.Uint16:
+ return "int"
+ case reflect.Int, reflect.Int32:
+ return "int"
+ case reflect.Uint, reflect.Uint32:
+ return "bigint"
+ case reflect.Int64:
+ return "bigint"
+ case reflect.Uint64:
+ return "bigint"
+ case reflect.Float32:
+ return "real"
+ case reflect.Float64:
+ return "float(53)"
+ case reflect.Slice:
+ if val.Elem().Kind() == reflect.Uint8 {
+ return "varbinary"
+ }
+ }
+
+ switch val.Name() {
+ case "NullInt64":
+ return "bigint"
+ case "NullFloat64":
+ return "float(53)"
+ case "NullBool":
+ return "tinyint"
+ case "Time":
+ return "datetime"
+ }
+
+ if maxsize < 1 {
+ maxsize = 255
+ }
+ return fmt.Sprintf("varchar(%d)", maxsize)
+}
+
+// Returns auto_increment
+func (d SqlServerDialect) AutoIncrStr() string {
+ return "identity(0,1)"
+}
+
+// Empty string removes autoincrement columns from the INSERT statements.
+func (d SqlServerDialect) AutoIncrBindValue() string {
+ return ""
+}
+
+func (d SqlServerDialect) AutoIncrInsertSuffix(col *ColumnMap) string {
+ return ""
+}
+
+// Returns suffix
+func (d SqlServerDialect) CreateTableSuffix() string {
+
+ return d.suffix
+}
+
+func (d SqlServerDialect) TruncateClause() string {
+ return "delete from"
+}
+
+// Returns "?"
+func (d SqlServerDialect) BindVar(i int) string {
+ return "?"
+}
+
+func (d SqlServerDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error) {
+ return standardInsertAutoIncr(exec, insertSql, params...)
+}
+
+func (d SqlServerDialect) QuoteField(f string) string {
+ return `"` + f + `"`
+}
+
+func (d SqlServerDialect) QuotedTableForQuery(schema string, table string) string {
+ if strings.TrimSpace(schema) == "" {
+ return table
+ }
+ return schema + "." + table
+}
+
+func (d SqlServerDialect) QuerySuffix() string { return ";" }
+
+func (d SqlServerDialect) IfSchemaNotExists(command, schema string) string {
+ s := fmt.Sprintf("if not exists (select name from sys.schemas where name = '%s') %s", schema, command)
+ return s
+}
+
+func (d SqlServerDialect) IfTableExists(command, schema, table string) string {
+ var schema_clause string
+ if strings.TrimSpace(schema) != "" {
+ schema_clause = fmt.Sprintf("table_schema = '%s' and ", schema)
+ }
+ s := fmt.Sprintf("if exists (select * from information_schema.tables where %stable_name = '%s') %s", schema_clause, table, command)
+ return s
+}
+
+func (d SqlServerDialect) IfTableNotExists(command, schema, table string) string {
+ var schema_clause string
+ if strings.TrimSpace(schema) != "" {
+ schema_clause = fmt.Sprintf("table_schema = '%s' and ", schema)
+ }
+ s := fmt.Sprintf("if not exists (select * from information_schema.tables where %stable_name = '%s') %s", schema_clause, table, command)
+ return s
+}
+
+///////////////////////////////////////////////////////
+// Oracle //
+///////////
+
+// Implementation of Dialect for Oracle databases.
+type OracleDialect struct{}
+
+func (d OracleDialect) QuerySuffix() string { return "" }
+
+func (d OracleDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string {
+ switch val.Kind() {
+ case reflect.Ptr:
+ return d.ToSqlType(val.Elem(), maxsize, isAutoIncr)
+ case reflect.Bool:
+ return "boolean"
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint8, reflect.Uint16, reflect.Uint32:
+ if isAutoIncr {
+ return "serial"
+ }
+ return "integer"
+ case reflect.Int64, reflect.Uint64:
+ if isAutoIncr {
+ return "bigserial"
+ }
+ return "bigint"
+ case reflect.Float64:
+ return "double precision"
+ case reflect.Float32:
+ return "real"
+ case reflect.Slice:
+ if val.Elem().Kind() == reflect.Uint8 {
+ return "bytea"
+ }
+ }
+
+ switch val.Name() {
+ case "NullInt64":
+ return "bigint"
+ case "NullFloat64":
+ return "double precision"
+ case "NullBool":
+ return "boolean"
+ case "NullTime", "Time":
+ return "timestamp with time zone"
+ }
+
+ if maxsize > 0 {
+ return fmt.Sprintf("varchar(%d)", maxsize)
+ } else {
+ return "text"
+ }
+
+}
+
+// Returns empty string
+func (d OracleDialect) AutoIncrStr() string {
+ return ""
+}
+
+func (d OracleDialect) AutoIncrBindValue() string {
+ return "default"
+}
+
+func (d OracleDialect) AutoIncrInsertSuffix(col *ColumnMap) string {
+ return " returning " + col.ColumnName
+}
+
+// Returns suffix
+func (d OracleDialect) CreateTableSuffix() string {
+ return ""
+}
+
+func (d OracleDialect) TruncateClause() string {
+ return "truncate"
+}
+
+// Returns "$(i+1)"
+func (d OracleDialect) BindVar(i int) string {
+ return fmt.Sprintf(":%d", i+1)
+}
+
+func (d OracleDialect) InsertAutoIncr(exec SqlExecutor, insertSql string, params ...interface{}) (int64, error) {
+ rows, err := exec.query(insertSql, params...)
+ if err != nil {
+ return 0, err
+ }
+ defer rows.Close()
+
+ if rows.Next() {
+ var id int64
+ err := rows.Scan(&id)
+ return id, err
+ }
+
+ return 0, errors.New("No serial value returned for insert: " + insertSql + " Encountered error: " + rows.Err().Error())
+}
+
+func (d OracleDialect) QuoteField(f string) string {
+ return `"` + strings.ToUpper(f) + `"`
+}
+
+func (d OracleDialect) QuotedTableForQuery(schema string, table string) string {
+ if strings.TrimSpace(schema) == "" {
+ return d.QuoteField(table)
+ }
+
+ return schema + "." + d.QuoteField(table)
+}
+
+func (d OracleDialect) IfSchemaNotExists(command, schema string) string {
+ return fmt.Sprintf("%s if not exists", command)
+}
+
+func (d OracleDialect) IfTableExists(command, schema, table string) string {
+ return fmt.Sprintf("%s if exists", command)
+}
+
+func (d OracleDialect) IfTableNotExists(command, schema, table string) string {
+ return fmt.Sprintf("%s if not exists", command)
+}
diff --git a/vendor/gopkg.in/gorp.v1/errors.go b/vendor/gopkg.in/gorp.v1/errors.go
new file mode 100644
index 000000000..356d68475
--- /dev/null
+++ b/vendor/gopkg.in/gorp.v1/errors.go
@@ -0,0 +1,26 @@
+package gorp
+
+import (
+ "fmt"
+)
+
+// A non-fatal error, when a select query returns columns that do not exist
+// as fields in the struct it is being mapped to
+type NoFieldInTypeError struct {
+ TypeName string
+ MissingColNames []string
+}
+
+func (err *NoFieldInTypeError) Error() string {
+ return fmt.Sprintf("gorp: No fields %+v in type %s", err.MissingColNames, err.TypeName)
+}
+
+// returns true if the error is non-fatal (ie, we shouldn't immediately return)
+func NonFatalError(err error) bool {
+ switch err.(type) {
+ case *NoFieldInTypeError:
+ return true
+ default:
+ return false
+ }
+}
diff --git a/vendor/gopkg.in/gorp.v1/gorp.go b/vendor/gopkg.in/gorp.v1/gorp.go
new file mode 100644
index 000000000..1ad61870f
--- /dev/null
+++ b/vendor/gopkg.in/gorp.v1/gorp.go
@@ -0,0 +1,2085 @@
+// Copyright 2012 James Cooper. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+// Package gorp provides a simple way to marshal Go structs to and from
+// SQL databases. It uses the database/sql package, and should work with any
+// compliant database/sql driver.
+//
+// Source code and project home:
+// https://github.com/coopernurse/gorp
+//
+package gorp
+
+import (
+ "bytes"
+ "database/sql"
+ "database/sql/driver"
+ "errors"
+ "fmt"
+ "reflect"
+ "regexp"
+ "strings"
+ "time"
+ "log"
+ "os"
+)
+
+// Oracle String (empty string is null)
+type OracleString struct {
+ sql.NullString
+}
+
+// Scan implements the Scanner interface.
+func (os *OracleString) Scan(value interface{}) error {
+ if value == nil {
+ os.String, os.Valid = "", false
+ return nil
+ }
+ os.Valid = true
+ return os.NullString.Scan(value)
+}
+
+// Value implements the driver Valuer interface.
+func (os OracleString) Value() (driver.Value, error) {
+ if !os.Valid || os.String == "" {
+ return nil, nil
+ }
+ return os.String, nil
+}
+
+// A nullable Time value
+type NullTime struct {
+ Time time.Time
+ Valid bool // Valid is true if Time is not NULL
+}
+
+// Scan implements the Scanner interface.
+func (nt *NullTime) Scan(value interface{}) error {
+ nt.Time, nt.Valid = value.(time.Time)
+ return nil
+}
+
+// Value implements the driver Valuer interface.
+func (nt NullTime) Value() (driver.Value, error) {
+ if !nt.Valid {
+ return nil, nil
+ }
+ return nt.Time, nil
+}
+
+var zeroVal reflect.Value
+var versFieldConst = "[gorp_ver_field]"
+
+// OptimisticLockError is returned by Update() or Delete() if the
+// struct being modified has a Version field and the value is not equal to
+// the current value in the database
+type OptimisticLockError struct {
+ // Table name where the lock error occurred
+ TableName string
+
+ // Primary key values of the row being updated/deleted
+ Keys []interface{}
+
+ // true if a row was found with those keys, indicating the
+ // LocalVersion is stale. false if no value was found with those
+ // keys, suggesting the row has been deleted since loaded, or
+ // was never inserted to begin with
+ RowExists bool
+
+ // Version value on the struct passed to Update/Delete. This value is
+ // out of sync with the database.
+ LocalVersion int64
+}
+
+// Error returns a description of the cause of the lock error
+func (e OptimisticLockError) Error() string {
+ if e.RowExists {
+ return fmt.Sprintf("gorp: OptimisticLockError table=%s keys=%v out of date version=%d", e.TableName, e.Keys, e.LocalVersion)
+ }
+
+ return fmt.Sprintf("gorp: OptimisticLockError no row found for table=%s keys=%v", e.TableName, e.Keys)
+}
+
+// The TypeConverter interface provides a way to map a value of one
+// type to another type when persisting to, or loading from, a database.
+//
+// Example use cases: Implement type converter to convert bool types to "y"/"n" strings,
+// or serialize a struct member as a JSON blob.
+type TypeConverter interface {
+ // ToDb converts val to another type. Called before INSERT/UPDATE operations
+ ToDb(val interface{}) (interface{}, error)
+
+ // FromDb returns a CustomScanner appropriate for this type. This will be used
+ // to hold values returned from SELECT queries.
+ //
+ // In particular the CustomScanner returned should implement a Binder
+ // function appropriate for the Go type you wish to convert the db value to
+ //
+ // If bool==false, then no custom scanner will be used for this field.
+ FromDb(target interface{}) (CustomScanner, bool)
+}
+
+// CustomScanner binds a database column value to a Go type
+type CustomScanner struct {
+ // After a row is scanned, Holder will contain the value from the database column.
+ // Initialize the CustomScanner with the concrete Go type you wish the database
+ // driver to scan the raw column into.
+ Holder interface{}
+ // Target typically holds a pointer to the target struct field to bind the Holder
+ // value to.
+ Target interface{}
+ // Binder is a custom function that converts the holder value to the target type
+ // and sets target accordingly. This function should return error if a problem
+ // occurs converting the holder to the target.
+ Binder func(holder interface{}, target interface{}) error
+}
+
+// Bind is called automatically by gorp after Scan()
+func (me CustomScanner) Bind() error {
+ return me.Binder(me.Holder, me.Target)
+}
+
+// DbMap is the root gorp mapping object. Create one of these for each
+// database schema you wish to map. Each DbMap contains a list of
+// mapped tables.
+//
+// Example:
+//
+// dialect := gorp.MySQLDialect{"InnoDB", "UTF8"}
+// dbmap := &gorp.DbMap{Db: db, Dialect: dialect}
+//
+type DbMap struct {
+ // Db handle to use with this map
+ Db *sql.DB
+
+ // Dialect implementation to use with this map
+ Dialect Dialect
+
+ TypeConverter TypeConverter
+
+ tables []*TableMap
+ logger GorpLogger
+ logPrefix string
+}
+
+// TableMap represents a mapping between a Go struct and a database table
+// Use dbmap.AddTable() or dbmap.AddTableWithName() to create these
+type TableMap struct {
+ // Name of database table.
+ TableName string
+ SchemaName string
+ gotype reflect.Type
+ Columns []*ColumnMap
+ keys []*ColumnMap
+ uniqueTogether [][]string
+ version *ColumnMap
+ insertPlan bindPlan
+ updatePlan bindPlan
+ deletePlan bindPlan
+ getPlan bindPlan
+ dbmap *DbMap
+}
+
+// ResetSql removes cached insert/update/select/delete SQL strings
+// associated with this TableMap. Call this if you've modified
+// any column names or the table name itself.
+func (t *TableMap) ResetSql() {
+ t.insertPlan = bindPlan{}
+ t.updatePlan = bindPlan{}
+ t.deletePlan = bindPlan{}
+ t.getPlan = bindPlan{}
+}
+
+// SetKeys lets you specify the fields on a struct that map to primary
+// key columns on the table. If isAutoIncr is set, result.LastInsertId()
+// will be used after INSERT to bind the generated id to the Go struct.
+//
+// Automatically calls ResetSql() to ensure SQL statements are regenerated.
+//
+// Panics if isAutoIncr is true, and fieldNames length != 1
+//
+func (t *TableMap) SetKeys(isAutoIncr bool, fieldNames ...string) *TableMap {
+ if isAutoIncr && len(fieldNames) != 1 {
+ panic(fmt.Sprintf(
+ "gorp: SetKeys: fieldNames length must be 1 if key is auto-increment. (Saw %v fieldNames)",
+ len(fieldNames)))
+ }
+ t.keys = make([]*ColumnMap, 0)
+ for _, name := range fieldNames {
+ colmap := t.ColMap(name)
+ colmap.isPK = true
+ colmap.isAutoIncr = isAutoIncr
+ t.keys = append(t.keys, colmap)
+ }
+ t.ResetSql()
+
+ return t
+}
+
+// SetUniqueTogether lets you specify uniqueness constraints across multiple
+// columns on the table. Each call adds an additional constraint for the
+// specified columns.
+//
+// Automatically calls ResetSql() to ensure SQL statements are regenerated.
+//
+// Panics if fieldNames length < 2.
+//
+func (t *TableMap) SetUniqueTogether(fieldNames ...string) *TableMap {
+ if len(fieldNames) < 2 {
+ panic(fmt.Sprintf(
+ "gorp: SetUniqueTogether: must provide at least two fieldNames to set uniqueness constraint."))
+ }
+
+ columns := make([]string, 0)
+ for _, name := range fieldNames {
+ columns = append(columns, name)
+ }
+ t.uniqueTogether = append(t.uniqueTogether, columns)
+ t.ResetSql()
+
+ return t
+}
+
+// ColMap returns the ColumnMap pointer matching the given struct field
+// name. It panics if the struct does not contain a field matching this
+// name.
+func (t *TableMap) ColMap(field string) *ColumnMap {
+ col := colMapOrNil(t, field)
+ if col == nil {
+ e := fmt.Sprintf("No ColumnMap in table %s type %s with field %s",
+ t.TableName, t.gotype.Name(), field)
+
+ panic(e)
+ }
+ return col
+}
+
+func colMapOrNil(t *TableMap, field string) *ColumnMap {
+ for _, col := range t.Columns {
+ if col.fieldName == field || col.ColumnName == field {
+ return col
+ }
+ }
+ return nil
+}
+
+// SetVersionCol sets the column to use as the Version field. By default
+// the "Version" field is used. Returns the column found, or panics
+// if the struct does not contain a field matching this name.
+//
+// Automatically calls ResetSql() to ensure SQL statements are regenerated.
+func (t *TableMap) SetVersionCol(field string) *ColumnMap {
+ c := t.ColMap(field)
+ t.version = c
+ t.ResetSql()
+ return c
+}
+
+type bindPlan struct {
+ query string
+ argFields []string
+ keyFields []string
+ versField string
+ autoIncrIdx int
+ autoIncrFieldName string
+}
+
+func (plan bindPlan) createBindInstance(elem reflect.Value, conv TypeConverter) (bindInstance, error) {
+ bi := bindInstance{query: plan.query, autoIncrIdx: plan.autoIncrIdx, autoIncrFieldName: plan.autoIncrFieldName, versField: plan.versField}
+ if plan.versField != "" {
+ bi.existingVersion = elem.FieldByName(plan.versField).Int()
+ }
+
+ var err error
+
+ for i := 0; i < len(plan.argFields); i++ {
+ k := plan.argFields[i]
+ if k == versFieldConst {
+ newVer := bi.existingVersion + 1
+ bi.args = append(bi.args, newVer)
+ if bi.existingVersion == 0 {
+ elem.FieldByName(plan.versField).SetInt(int64(newVer))
+ }
+ } else {
+ val := elem.FieldByName(k).Interface()
+ if conv != nil {
+ val, err = conv.ToDb(val)
+ if err != nil {
+ return bindInstance{}, err
+ }
+ }
+ bi.args = append(bi.args, val)
+ }
+ }
+
+ for i := 0; i < len(plan.keyFields); i++ {
+ k := plan.keyFields[i]
+ val := elem.FieldByName(k).Interface()
+ if conv != nil {
+ val, err = conv.ToDb(val)
+ if err != nil {
+ return bindInstance{}, err
+ }
+ }
+ bi.keys = append(bi.keys, val)
+ }
+
+ return bi, nil
+}
+
+type bindInstance struct {
+ query string
+ args []interface{}
+ keys []interface{}
+ existingVersion int64
+ versField string
+ autoIncrIdx int
+ autoIncrFieldName string
+}
+
+func (t *TableMap) bindInsert(elem reflect.Value) (bindInstance, error) {
+ plan := t.insertPlan
+ if plan.query == "" {
+ plan.autoIncrIdx = -1
+
+ s := bytes.Buffer{}
+ s2 := bytes.Buffer{}
+ s.WriteString(fmt.Sprintf("insert into %s (", t.dbmap.Dialect.QuotedTableForQuery(t.SchemaName, t.TableName)))
+
+ x := 0
+ first := true
+ for y := range t.Columns {
+ col := t.Columns[y]
+ if !(col.isAutoIncr && t.dbmap.Dialect.AutoIncrBindValue() == "") {
+ if !col.Transient {
+ if !first {
+ s.WriteString(",")
+ s2.WriteString(",")
+ }
+ s.WriteString(t.dbmap.Dialect.QuoteField(col.ColumnName))
+
+ if col.isAutoIncr {
+ s2.WriteString(t.dbmap.Dialect.AutoIncrBindValue())
+ plan.autoIncrIdx = y
+ plan.autoIncrFieldName = col.fieldName
+ } else {
+ s2.WriteString(t.dbmap.Dialect.BindVar(x))
+ if col == t.version {
+ plan.versField = col.fieldName
+ plan.argFields = append(plan.argFields, versFieldConst)
+ } else {
+ plan.argFields = append(plan.argFields, col.fieldName)
+ }
+
+ x++
+ }
+ first = false
+ }
+ } else {
+ plan.autoIncrIdx = y
+ plan.autoIncrFieldName = col.fieldName
+ }
+ }
+ s.WriteString(") values (")
+ s.WriteString(s2.String())
+ s.WriteString(")")
+ if plan.autoIncrIdx > -1 {
+ s.WriteString(t.dbmap.Dialect.AutoIncrInsertSuffix(t.Columns[plan.autoIncrIdx]))
+ }
+ s.WriteString(t.dbmap.Dialect.QuerySuffix())
+
+ plan.query = s.String()
+ t.insertPlan = plan
+ }
+
+ return plan.createBindInstance(elem, t.dbmap.TypeConverter)
+}
+
+func (t *TableMap) bindUpdate(elem reflect.Value) (bindInstance, error) {
+ plan := t.updatePlan
+ if plan.query == "" {
+
+ s := bytes.Buffer{}
+ s.WriteString(fmt.Sprintf("update %s set ", t.dbmap.Dialect.QuotedTableForQuery(t.SchemaName, t.TableName)))
+ x := 0
+
+ for y := range t.Columns {
+ col := t.Columns[y]
+ if !col.isAutoIncr && !col.Transient {
+ if x > 0 {
+ s.WriteString(", ")
+ }
+ s.WriteString(t.dbmap.Dialect.QuoteField(col.ColumnName))
+ s.WriteString("=")
+ s.WriteString(t.dbmap.Dialect.BindVar(x))
+
+ if col == t.version {
+ plan.versField = col.fieldName
+ plan.argFields = append(plan.argFields, versFieldConst)
+ } else {
+ plan.argFields = append(plan.argFields, col.fieldName)
+ }
+ x++
+ }
+ }
+
+ s.WriteString(" where ")
+ for y := range t.keys {
+ col := t.keys[y]
+ if y > 0 {
+ s.WriteString(" and ")
+ }
+ s.WriteString(t.dbmap.Dialect.QuoteField(col.ColumnName))
+ s.WriteString("=")
+ s.WriteString(t.dbmap.Dialect.BindVar(x))
+
+ plan.argFields = append(plan.argFields, col.fieldName)
+ plan.keyFields = append(plan.keyFields, col.fieldName)
+ x++
+ }
+ if plan.versField != "" {
+ s.WriteString(" and ")
+ s.WriteString(t.dbmap.Dialect.QuoteField(t.version.ColumnName))
+ s.WriteString("=")
+ s.WriteString(t.dbmap.Dialect.BindVar(x))
+ plan.argFields = append(plan.argFields, plan.versField)
+ }
+ s.WriteString(t.dbmap.Dialect.QuerySuffix())
+
+ plan.query = s.String()
+ t.updatePlan = plan
+ }
+
+ return plan.createBindInstance(elem, t.dbmap.TypeConverter)
+}
+
+func (t *TableMap) bindDelete(elem reflect.Value) (bindInstance, error) {
+ plan := t.deletePlan
+ if plan.query == "" {
+
+ s := bytes.Buffer{}
+ s.WriteString(fmt.Sprintf("delete from %s", t.dbmap.Dialect.QuotedTableForQuery(t.SchemaName, t.TableName)))
+
+ for y := range t.Columns {
+ col := t.Columns[y]
+ if !col.Transient {
+ if col == t.version {
+ plan.versField = col.fieldName
+ }
+ }
+ }
+
+ s.WriteString(" where ")
+ for x := range t.keys {
+ k := t.keys[x]
+ if x > 0 {
+ s.WriteString(" and ")
+ }
+ s.WriteString(t.dbmap.Dialect.QuoteField(k.ColumnName))
+ s.WriteString("=")
+ s.WriteString(t.dbmap.Dialect.BindVar(x))
+
+ plan.keyFields = append(plan.keyFields, k.fieldName)
+ plan.argFields = append(plan.argFields, k.fieldName)
+ }
+ if plan.versField != "" {
+ s.WriteString(" and ")
+ s.WriteString(t.dbmap.Dialect.QuoteField(t.version.ColumnName))
+ s.WriteString("=")
+ s.WriteString(t.dbmap.Dialect.BindVar(len(plan.argFields)))
+
+ plan.argFields = append(plan.argFields, plan.versField)
+ }
+ s.WriteString(t.dbmap.Dialect.QuerySuffix())
+
+ plan.query = s.String()
+ t.deletePlan = plan
+ }
+
+ return plan.createBindInstance(elem, t.dbmap.TypeConverter)
+}
+
+func (t *TableMap) bindGet() bindPlan {
+ plan := t.getPlan
+ if plan.query == "" {
+
+ s := bytes.Buffer{}
+ s.WriteString("select ")
+
+ x := 0
+ for _, col := range t.Columns {
+ if !col.Transient {
+ if x > 0 {
+ s.WriteString(",")
+ }
+ s.WriteString(t.dbmap.Dialect.QuoteField(col.ColumnName))
+ plan.argFields = append(plan.argFields, col.fieldName)
+ x++
+ }
+ }
+ s.WriteString(" from ")
+ s.WriteString(t.dbmap.Dialect.QuotedTableForQuery(t.SchemaName, t.TableName))
+ s.WriteString(" where ")
+ for x := range t.keys {
+ col := t.keys[x]
+ if x > 0 {
+ s.WriteString(" and ")
+ }
+ s.WriteString(t.dbmap.Dialect.QuoteField(col.ColumnName))
+ s.WriteString("=")
+ s.WriteString(t.dbmap.Dialect.BindVar(x))
+
+ plan.keyFields = append(plan.keyFields, col.fieldName)
+ }
+ s.WriteString(t.dbmap.Dialect.QuerySuffix())
+
+ plan.query = s.String()
+ t.getPlan = plan
+ }
+
+ return plan
+}
+
+// ColumnMap represents a mapping between a Go struct field and a single
+// column in a table.
+// Unique and MaxSize only inform the
+// CreateTables() function and are not used by Insert/Update/Delete/Get.
+type ColumnMap struct {
+ // Column name in db table
+ ColumnName string
+
+ // If true, this column is skipped in generated SQL statements
+ Transient bool
+
+ // If true, " unique" is added to create table statements.
+ // Not used elsewhere
+ Unique bool
+
+ // Passed to Dialect.ToSqlType() to assist in informing the
+ // correct column type to map to in CreateTables()
+ // Not used elsewhere
+ MaxSize int
+
+ fieldName string
+ gotype reflect.Type
+ isPK bool
+ isAutoIncr bool
+ isNotNull bool
+}
+
+// Rename allows you to specify the column name in the table
+//
+// Example: table.ColMap("Updated").Rename("date_updated")
+//
+func (c *ColumnMap) Rename(colname string) *ColumnMap {
+ c.ColumnName = colname
+ return c
+}
+
+// SetTransient allows you to mark the column as transient. If true
+// this column will be skipped when SQL statements are generated
+func (c *ColumnMap) SetTransient(b bool) *ColumnMap {
+ c.Transient = b
+ return c
+}
+
+// SetUnique adds "unique" to the create table statements for this
+// column, if b is true.
+func (c *ColumnMap) SetUnique(b bool) *ColumnMap {
+ c.Unique = b
+ return c
+}
+
+// SetNotNull adds "not null" to the create table statements for this
+// column, if nn is true.
+func (c *ColumnMap) SetNotNull(nn bool) *ColumnMap {
+ c.isNotNull = nn
+ return c
+}
+
+// SetMaxSize specifies the max length of values of this column. This is
+// passed to the dialect.ToSqlType() function, which can use the value
+// to alter the generated type for "create table" statements
+func (c *ColumnMap) SetMaxSize(size int) *ColumnMap {
+ c.MaxSize = size
+ return c
+}
+
+// Transaction represents a database transaction.
+// Insert/Update/Delete/Get/Exec operations will be run in the context
+// of that transaction. Transactions should be terminated with
+// a call to Commit() or Rollback()
+type Transaction struct {
+ dbmap *DbMap
+ tx *sql.Tx
+ closed bool
+}
+
+// SqlExecutor exposes gorp operations that can be run from Pre/Post
+// hooks. This hides whether the current operation that triggered the
+// hook is in a transaction.
+//
+// See the DbMap function docs for each of the functions below for more
+// information.
+type SqlExecutor interface {
+ Get(i interface{}, keys ...interface{}) (interface{}, error)
+ Insert(list ...interface{}) error
+ Update(list ...interface{}) (int64, error)
+ Delete(list ...interface{}) (int64, error)
+ Exec(query string, args ...interface{}) (sql.Result, error)
+ Select(i interface{}, query string,
+ args ...interface{}) ([]interface{}, error)
+ SelectInt(query string, args ...interface{}) (int64, error)
+ SelectNullInt(query string, args ...interface{}) (sql.NullInt64, error)
+ SelectFloat(query string, args ...interface{}) (float64, error)
+ SelectNullFloat(query string, args ...interface{}) (sql.NullFloat64, error)
+ SelectStr(query string, args ...interface{}) (string, error)
+ SelectNullStr(query string, args ...interface{}) (sql.NullString, error)
+ SelectOne(holder interface{}, query string, args ...interface{}) error
+ query(query string, args ...interface{}) (*sql.Rows, error)
+ queryRow(query string, args ...interface{}) *sql.Row
+}
+
+// Compile-time check that DbMap and Transaction implement the SqlExecutor
+// interface.
+var _, _ SqlExecutor = &DbMap{}, &Transaction{}
+
+type GorpLogger interface {
+ Printf(format string, v ...interface{})
+}
+
+// TraceOn turns on SQL statement logging for this DbMap. After this is
+// called, all SQL statements will be sent to the logger. If prefix is
+// a non-empty string, it will be written to the front of all logged
+// strings, which can aid in filtering log lines.
+//
+// Use TraceOn if you want to spy on the SQL statements that gorp
+// generates.
+//
+// Note that the base log.Logger type satisfies GorpLogger, but adapters can
+// easily be written for other logging packages (e.g., the golang-sanctioned
+// glog framework).
+func (m *DbMap) TraceOn(prefix string, logger GorpLogger) {
+ m.logger = logger
+ if prefix == "" {
+ m.logPrefix = prefix
+ } else {
+ m.logPrefix = fmt.Sprintf("%s ", prefix)
+ }
+}
+
+// TraceOff turns off tracing. It is idempotent.
+func (m *DbMap) TraceOff() {
+ m.logger = nil
+ m.logPrefix = ""
+}
+
+// AddTable registers the given interface type with gorp. The table name
+// will be given the name of the TypeOf(i). You must call this function,
+// or AddTableWithName, for any struct type you wish to persist with
+// the given DbMap.
+//
+// This operation is idempotent. If i's type is already mapped, the
+// existing *TableMap is returned
+func (m *DbMap) AddTable(i interface{}) *TableMap {
+ return m.AddTableWithName(i, "")
+}
+
+// AddTableWithName has the same behavior as AddTable, but sets
+// table.TableName to name.
+func (m *DbMap) AddTableWithName(i interface{}, name string) *TableMap {
+ return m.AddTableWithNameAndSchema(i, "", name)
+}
+
+// AddTableWithNameAndSchema has the same behavior as AddTable, but sets
+// table.TableName to name.
+func (m *DbMap) AddTableWithNameAndSchema(i interface{}, schema string, name string) *TableMap {
+ t := reflect.TypeOf(i)
+ if name == "" {
+ name = t.Name()
+ }
+
+ // check if we have a table for this type already
+ // if so, update the name and return the existing pointer
+ for i := range m.tables {
+ table := m.tables[i]
+ if table.gotype == t {
+ table.TableName = name
+ return table
+ }
+ }
+
+ tmap := &TableMap{gotype: t, TableName: name, SchemaName: schema, dbmap: m}
+ tmap.Columns, tmap.version = m.readStructColumns(t)
+ m.tables = append(m.tables, tmap)
+
+ return tmap
+}
+
+func (m *DbMap) readStructColumns(t reflect.Type) (cols []*ColumnMap, version *ColumnMap) {
+ n := t.NumField()
+ for i := 0; i < n; i++ {
+ f := t.Field(i)
+ if f.Anonymous && f.Type.Kind() == reflect.Struct {
+ // Recursively add nested fields in embedded structs.
+ subcols, subversion := m.readStructColumns(f.Type)
+ // Don't append nested fields that have the same field
+ // name as an already-mapped field.
+ for _, subcol := range subcols {
+ shouldAppend := true
+ for _, col := range cols {
+ if !subcol.Transient && subcol.fieldName == col.fieldName {
+ shouldAppend = false
+ break
+ }
+ }
+ if shouldAppend {
+ cols = append(cols, subcol)
+ }
+ }
+ if subversion != nil {
+ version = subversion
+ }
+ } else {
+ columnName := f.Tag.Get("db")
+ if columnName == "" {
+ columnName = f.Name
+ }
+ gotype := f.Type
+ if m.TypeConverter != nil {
+ // Make a new pointer to a value of type gotype and
+ // pass it to the TypeConverter's FromDb method to see
+ // if a different type should be used for the column
+ // type during table creation.
+ value := reflect.New(gotype).Interface()
+ scanner, useHolder := m.TypeConverter.FromDb(value)
+ if useHolder {
+ gotype = reflect.TypeOf(scanner.Holder)
+ }
+ }
+ cm := &ColumnMap{
+ ColumnName: columnName,
+ Transient: columnName == "-",
+ fieldName: f.Name,
+ gotype: gotype,
+ }
+ // Check for nested fields of the same field name and
+ // override them.
+ shouldAppend := true
+ for index, col := range cols {
+ if !col.Transient && col.fieldName == cm.fieldName {
+ cols[index] = cm
+ shouldAppend = false
+ break
+ }
+ }
+ if shouldAppend {
+ cols = append(cols, cm)
+ }
+ if cm.fieldName == "Version" {
+ log.New(os.Stderr, "", log.LstdFlags).Println("Warning: Automatic mapping of Version struct members to version columns (see optimistic locking) will be deprecated in next version (V2) See: https://github.com/go-gorp/gorp/pull/214")
+ version = cm
+ }
+ }
+ }
+ return
+}
+
+// CreateTables iterates through TableMaps registered to this DbMap and
+// executes "create table" statements against the database for each.
+//
+// This is particularly useful in unit tests where you want to create
+// and destroy the schema automatically.
+func (m *DbMap) CreateTables() error {
+ return m.createTables(false)
+}
+
+// CreateTablesIfNotExists is similar to CreateTables, but starts
+// each statement with "create table if not exists" so that existing
+// tables do not raise errors
+func (m *DbMap) CreateTablesIfNotExists() error {
+ return m.createTables(true)
+}
+
+func (m *DbMap) createTables(ifNotExists bool) error {
+ var err error
+ for i := range m.tables {
+ table := m.tables[i]
+
+ s := bytes.Buffer{}
+
+ if strings.TrimSpace(table.SchemaName) != "" {
+ schemaCreate := "create schema"
+ if ifNotExists {
+ s.WriteString(m.Dialect.IfSchemaNotExists(schemaCreate, table.SchemaName))
+ } else {
+ s.WriteString(schemaCreate)
+ }
+ s.WriteString(fmt.Sprintf(" %s;", table.SchemaName))
+ }
+
+ tableCreate := "create table"
+ if ifNotExists {
+ s.WriteString(m.Dialect.IfTableNotExists(tableCreate, table.SchemaName, table.TableName))
+ } else {
+ s.WriteString(tableCreate)
+ }
+ s.WriteString(fmt.Sprintf(" %s (", m.Dialect.QuotedTableForQuery(table.SchemaName, table.TableName)))
+
+ x := 0
+ for _, col := range table.Columns {
+ if !col.Transient {
+ if x > 0 {
+ s.WriteString(", ")
+ }
+ stype := m.Dialect.ToSqlType(col.gotype, col.MaxSize, col.isAutoIncr)
+ s.WriteString(fmt.Sprintf("%s %s", m.Dialect.QuoteField(col.ColumnName), stype))
+
+ if col.isPK || col.isNotNull {
+ s.WriteString(" not null")
+ }
+ if col.isPK && len(table.keys) == 1 {
+ s.WriteString(" primary key")
+ }
+ if col.Unique {
+ s.WriteString(" unique")
+ }
+ if col.isAutoIncr {
+ s.WriteString(fmt.Sprintf(" %s", m.Dialect.AutoIncrStr()))
+ }
+
+ x++
+ }
+ }
+ if len(table.keys) > 1 {
+ s.WriteString(", primary key (")
+ for x := range table.keys {
+ if x > 0 {
+ s.WriteString(", ")
+ }
+ s.WriteString(m.Dialect.QuoteField(table.keys[x].ColumnName))
+ }
+ s.WriteString(")")
+ }
+ if len(table.uniqueTogether) > 0 {
+ for _, columns := range table.uniqueTogether {
+ s.WriteString(", unique (")
+ for i, column := range columns {
+ if i > 0 {
+ s.WriteString(", ")
+ }
+ s.WriteString(m.Dialect.QuoteField(column))
+ }
+ s.WriteString(")")
+ }
+ }
+ s.WriteString(") ")
+ s.WriteString(m.Dialect.CreateTableSuffix())
+ s.WriteString(m.Dialect.QuerySuffix())
+ _, err = m.Exec(s.String())
+ if err != nil {
+ break
+ }
+ }
+ return err
+}
+
+// DropTable drops an individual table. Will throw an error
+// if the table does not exist.
+func (m *DbMap) DropTable(table interface{}) error {
+ t := reflect.TypeOf(table)
+ return m.dropTable(t, false)
+}
+
+// DropTable drops an individual table. Will NOT throw an error
+// if the table does not exist.
+func (m *DbMap) DropTableIfExists(table interface{}) error {
+ t := reflect.TypeOf(table)
+ return m.dropTable(t, true)
+}
+
+// DropTables iterates through TableMaps registered to this DbMap and
+// executes "drop table" statements against the database for each.
+func (m *DbMap) DropTables() error {
+ return m.dropTables(false)
+}
+
+// DropTablesIfExists is the same as DropTables, but uses the "if exists" clause to
+// avoid errors for tables that do not exist.
+func (m *DbMap) DropTablesIfExists() error {
+ return m.dropTables(true)
+}
+
+// Goes through all the registered tables, dropping them one by one.
+// If an error is encountered, then it is returned and the rest of
+// the tables are not dropped.
+func (m *DbMap) dropTables(addIfExists bool) (err error) {
+ for _, table := range m.tables {
+ err = m.dropTableImpl(table, addIfExists)
+ if err != nil {
+ return
+ }
+ }
+ return err
+}
+
+// Implementation of dropping a single table.
+func (m *DbMap) dropTable(t reflect.Type, addIfExists bool) error {
+ table := tableOrNil(m, t)
+ if table == nil {
+ return errors.New(fmt.Sprintf("table %s was not registered!", table.TableName))
+ }
+
+ return m.dropTableImpl(table, addIfExists)
+}
+
+func (m *DbMap) dropTableImpl(table *TableMap, ifExists bool) (err error) {
+ tableDrop := "drop table"
+ if ifExists {
+ tableDrop = m.Dialect.IfTableExists(tableDrop, table.SchemaName, table.TableName)
+ }
+ _, err = m.Exec(fmt.Sprintf("%s %s;", tableDrop, m.Dialect.QuotedTableForQuery(table.SchemaName, table.TableName)))
+ return err
+}
+
+// TruncateTables iterates through TableMaps registered to this DbMap and
+// executes "truncate table" statements against the database for each, or in the case of
+// sqlite, a "delete from" with no "where" clause, which uses the truncate optimization
+// (http://www.sqlite.org/lang_delete.html)
+func (m *DbMap) TruncateTables() error {
+ var err error
+ for i := range m.tables {
+ table := m.tables[i]
+ _, e := m.Exec(fmt.Sprintf("%s %s;", m.Dialect.TruncateClause(), m.Dialect.QuotedTableForQuery(table.SchemaName, table.TableName)))
+ if e != nil {
+ err = e
+ }
+ }
+ return err
+}
+
+// Insert runs a SQL INSERT statement for each element in list. List
+// items must be pointers.
+//
+// Any interface whose TableMap has an auto-increment primary key will
+// have its last insert id bound to the PK field on the struct.
+//
+// The hook functions PreInsert() and/or PostInsert() will be executed
+// before/after the INSERT statement if the interface defines them.
+//
+// Panics if any interface in the list has not been registered with AddTable
+func (m *DbMap) Insert(list ...interface{}) error {
+ return insert(m, m, list...)
+}
+
+// Update runs a SQL UPDATE statement for each element in list. List
+// items must be pointers.
+//
+// The hook functions PreUpdate() and/or PostUpdate() will be executed
+// before/after the UPDATE statement if the interface defines them.
+//
+// Returns the number of rows updated.
+//
+// Returns an error if SetKeys has not been called on the TableMap
+// Panics if any interface in the list has not been registered with AddTable
+func (m *DbMap) Update(list ...interface{}) (int64, error) {
+ return update(m, m, list...)
+}
+
+// Delete runs a SQL DELETE statement for each element in list. List
+// items must be pointers.
+//
+// The hook functions PreDelete() and/or PostDelete() will be executed
+// before/after the DELETE statement if the interface defines them.
+//
+// Returns the number of rows deleted.
+//
+// Returns an error if SetKeys has not been called on the TableMap
+// Panics if any interface in the list has not been registered with AddTable
+func (m *DbMap) Delete(list ...interface{}) (int64, error) {
+ return delete(m, m, list...)
+}
+
+// Get runs a SQL SELECT to fetch a single row from the table based on the
+// primary key(s)
+//
+// i should be an empty value for the struct to load. keys should be
+// the primary key value(s) for the row to load. If multiple keys
+// exist on the table, the order should match the column order
+// specified in SetKeys() when the table mapping was defined.
+//
+// The hook function PostGet() will be executed after the SELECT
+// statement if the interface defines them.
+//
+// Returns a pointer to a struct that matches or nil if no row is found.
+//
+// Returns an error if SetKeys has not been called on the TableMap
+// Panics if any interface in the list has not been registered with AddTable
+func (m *DbMap) Get(i interface{}, keys ...interface{}) (interface{}, error) {
+ return get(m, m, i, keys...)
+}
+
+// Select runs an arbitrary SQL query, binding the columns in the result
+// to fields on the struct specified by i. args represent the bind
+// parameters for the SQL statement.
+//
+// Column names on the SELECT statement should be aliased to the field names
+// on the struct i. Returns an error if one or more columns in the result
+// do not match. It is OK if fields on i are not part of the SQL
+// statement.
+//
+// The hook function PostGet() will be executed after the SELECT
+// statement if the interface defines them.
+//
+// Values are returned in one of two ways:
+// 1. If i is a struct or a pointer to a struct, returns a slice of pointers to
+// matching rows of type i.
+// 2. If i is a pointer to a slice, the results will be appended to that slice
+// and nil returned.
+//
+// i does NOT need to be registered with AddTable()
+func (m *DbMap) Select(i interface{}, query string, args ...interface{}) ([]interface{}, error) {
+ return hookedselect(m, m, i, query, args...)
+}
+
+// Exec runs an arbitrary SQL statement. args represent the bind parameters.
+// This is equivalent to running: Exec() using database/sql
+func (m *DbMap) Exec(query string, args ...interface{}) (sql.Result, error) {
+ m.trace(query, args...)
+ return m.Db.Exec(query, args...)
+}
+
+// SelectInt is a convenience wrapper around the gorp.SelectInt function
+func (m *DbMap) SelectInt(query string, args ...interface{}) (int64, error) {
+ return SelectInt(m, query, args...)
+}
+
+// SelectNullInt is a convenience wrapper around the gorp.SelectNullInt function
+func (m *DbMap) SelectNullInt(query string, args ...interface{}) (sql.NullInt64, error) {
+ return SelectNullInt(m, query, args...)
+}
+
+// SelectFloat is a convenience wrapper around the gorp.SelectFlot function
+func (m *DbMap) SelectFloat(query string, args ...interface{}) (float64, error) {
+ return SelectFloat(m, query, args...)
+}
+
+// SelectNullFloat is a convenience wrapper around the gorp.SelectNullFloat function
+func (m *DbMap) SelectNullFloat(query string, args ...interface{}) (sql.NullFloat64, error) {
+ return SelectNullFloat(m, query, args...)
+}
+
+// SelectStr is a convenience wrapper around the gorp.SelectStr function
+func (m *DbMap) SelectStr(query string, args ...interface{}) (string, error) {
+ return SelectStr(m, query, args...)
+}
+
+// SelectNullStr is a convenience wrapper around the gorp.SelectNullStr function
+func (m *DbMap) SelectNullStr(query string, args ...interface{}) (sql.NullString, error) {
+ return SelectNullStr(m, query, args...)
+}
+
+// SelectOne is a convenience wrapper around the gorp.SelectOne function
+func (m *DbMap) SelectOne(holder interface{}, query string, args ...interface{}) error {
+ return SelectOne(m, m, holder, query, args...)
+}
+
+// Begin starts a gorp Transaction
+func (m *DbMap) Begin() (*Transaction, error) {
+ m.trace("begin;")
+ tx, err := m.Db.Begin()
+ if err != nil {
+ return nil, err
+ }
+ return &Transaction{m, tx, false}, nil
+}
+
+// TableFor returns the *TableMap corresponding to the given Go Type
+// If no table is mapped to that type an error is returned.
+// If checkPK is true and the mapped table has no registered PKs, an error is returned.
+func (m *DbMap) TableFor(t reflect.Type, checkPK bool) (*TableMap, error) {
+ table := tableOrNil(m, t)
+ if table == nil {
+ return nil, errors.New(fmt.Sprintf("No table found for type: %v", t.Name()))
+ }
+
+ if checkPK && len(table.keys) < 1 {
+ e := fmt.Sprintf("gorp: No keys defined for table: %s",
+ table.TableName)
+ return nil, errors.New(e)
+ }
+
+ return table, nil
+}
+
+// Prepare creates a prepared statement for later queries or executions.
+// Multiple queries or executions may be run concurrently from the returned statement.
+// This is equivalent to running: Prepare() using database/sql
+func (m *DbMap) Prepare(query string) (*sql.Stmt, error) {
+ m.trace(query, nil)
+ return m.Db.Prepare(query)
+}
+
+func tableOrNil(m *DbMap, t reflect.Type) *TableMap {
+ for i := range m.tables {
+ table := m.tables[i]
+ if table.gotype == t {
+ return table
+ }
+ }
+ return nil
+}
+
+func (m *DbMap) tableForPointer(ptr interface{}, checkPK bool) (*TableMap, reflect.Value, error) {
+ ptrv := reflect.ValueOf(ptr)
+ if ptrv.Kind() != reflect.Ptr {
+ e := fmt.Sprintf("gorp: passed non-pointer: %v (kind=%v)", ptr,
+ ptrv.Kind())
+ return nil, reflect.Value{}, errors.New(e)
+ }
+ elem := ptrv.Elem()
+ etype := reflect.TypeOf(elem.Interface())
+ t, err := m.TableFor(etype, checkPK)
+ if err != nil {
+ return nil, reflect.Value{}, err
+ }
+
+ return t, elem, nil
+}
+
+func (m *DbMap) queryRow(query string, args ...interface{}) *sql.Row {
+ m.trace(query, args...)
+ return m.Db.QueryRow(query, args...)
+}
+
+func (m *DbMap) query(query string, args ...interface{}) (*sql.Rows, error) {
+ m.trace(query, args...)
+ return m.Db.Query(query, args...)
+}
+
+func (m *DbMap) trace(query string, args ...interface{}) {
+ if m.logger != nil {
+ var margs = argsString(args...)
+ m.logger.Printf("%s%s [%s]", m.logPrefix, query, margs)
+ }
+}
+
+func argsString(args ...interface{}) string {
+ var margs string
+ for i, a := range args {
+ var v interface{} = a
+ if x, ok := v.(driver.Valuer); ok {
+ y, err := x.Value()
+ if err == nil {
+ v = y
+ }
+ }
+ switch v.(type) {
+ case string:
+ v = fmt.Sprintf("%q", v)
+ default:
+ v = fmt.Sprintf("%v", v)
+ }
+ margs += fmt.Sprintf("%d:%s", i+1, v)
+ if i+1 < len(args) {
+ margs += " "
+ }
+ }
+ return margs
+}
+
+///////////////
+
+// Insert has the same behavior as DbMap.Insert(), but runs in a transaction.
+func (t *Transaction) Insert(list ...interface{}) error {
+ return insert(t.dbmap, t, list...)
+}
+
+// Update had the same behavior as DbMap.Update(), but runs in a transaction.
+func (t *Transaction) Update(list ...interface{}) (int64, error) {
+ return update(t.dbmap, t, list...)
+}
+
+// Delete has the same behavior as DbMap.Delete(), but runs in a transaction.
+func (t *Transaction) Delete(list ...interface{}) (int64, error) {
+ return delete(t.dbmap, t, list...)
+}
+
+// Get has the same behavior as DbMap.Get(), but runs in a transaction.
+func (t *Transaction) Get(i interface{}, keys ...interface{}) (interface{}, error) {
+ return get(t.dbmap, t, i, keys...)
+}
+
+// Select has the same behavior as DbMap.Select(), but runs in a transaction.
+func (t *Transaction) Select(i interface{}, query string, args ...interface{}) ([]interface{}, error) {
+ return hookedselect(t.dbmap, t, i, query, args...)
+}
+
+// Exec has the same behavior as DbMap.Exec(), but runs in a transaction.
+func (t *Transaction) Exec(query string, args ...interface{}) (sql.Result, error) {
+ t.dbmap.trace(query, args...)
+ return t.tx.Exec(query, args...)
+}
+
+// SelectInt is a convenience wrapper around the gorp.SelectInt function.
+func (t *Transaction) SelectInt(query string, args ...interface{}) (int64, error) {
+ return SelectInt(t, query, args...)
+}
+
+// SelectNullInt is a convenience wrapper around the gorp.SelectNullInt function.
+func (t *Transaction) SelectNullInt(query string, args ...interface{}) (sql.NullInt64, error) {
+ return SelectNullInt(t, query, args...)
+}
+
+// SelectFloat is a convenience wrapper around the gorp.SelectFloat function.
+func (t *Transaction) SelectFloat(query string, args ...interface{}) (float64, error) {
+ return SelectFloat(t, query, args...)
+}
+
+// SelectNullFloat is a convenience wrapper around the gorp.SelectNullFloat function.
+func (t *Transaction) SelectNullFloat(query string, args ...interface{}) (sql.NullFloat64, error) {
+ return SelectNullFloat(t, query, args...)
+}
+
+// SelectStr is a convenience wrapper around the gorp.SelectStr function.
+func (t *Transaction) SelectStr(query string, args ...interface{}) (string, error) {
+ return SelectStr(t, query, args...)
+}
+
+// SelectNullStr is a convenience wrapper around the gorp.SelectNullStr function.
+func (t *Transaction) SelectNullStr(query string, args ...interface{}) (sql.NullString, error) {
+ return SelectNullStr(t, query, args...)
+}
+
+// SelectOne is a convenience wrapper around the gorp.SelectOne function.
+func (t *Transaction) SelectOne(holder interface{}, query string, args ...interface{}) error {
+ return SelectOne(t.dbmap, t, holder, query, args...)
+}
+
+// Commit commits the underlying database transaction.
+func (t *Transaction) Commit() error {
+ if !t.closed {
+ t.closed = true
+ t.dbmap.trace("commit;")
+ return t.tx.Commit()
+ }
+
+ return sql.ErrTxDone
+}
+
+// Rollback rolls back the underlying database transaction.
+func (t *Transaction) Rollback() error {
+ if !t.closed {
+ t.closed = true
+ t.dbmap.trace("rollback;")
+ return t.tx.Rollback()
+ }
+
+ return sql.ErrTxDone
+}
+
+// Savepoint creates a savepoint with the given name. The name is interpolated
+// directly into the SQL SAVEPOINT statement, so you must sanitize it if it is
+// derived from user input.
+func (t *Transaction) Savepoint(name string) error {
+ query := "savepoint " + t.dbmap.Dialect.QuoteField(name)
+ t.dbmap.trace(query, nil)
+ _, err := t.tx.Exec(query)
+ return err
+}
+
+// RollbackToSavepoint rolls back to the savepoint with the given name. The
+// name is interpolated directly into the SQL SAVEPOINT statement, so you must
+// sanitize it if it is derived from user input.
+func (t *Transaction) RollbackToSavepoint(savepoint string) error {
+ query := "rollback to savepoint " + t.dbmap.Dialect.QuoteField(savepoint)
+ t.dbmap.trace(query, nil)
+ _, err := t.tx.Exec(query)
+ return err
+}
+
+// ReleaseSavepint releases the savepoint with the given name. The name is
+// interpolated directly into the SQL SAVEPOINT statement, so you must sanitize
+// it if it is derived from user input.
+func (t *Transaction) ReleaseSavepoint(savepoint string) error {
+ query := "release savepoint " + t.dbmap.Dialect.QuoteField(savepoint)
+ t.dbmap.trace(query, nil)
+ _, err := t.tx.Exec(query)
+ return err
+}
+
+// Prepare has the same behavior as DbMap.Prepare(), but runs in a transaction.
+func (t *Transaction) Prepare(query string) (*sql.Stmt, error) {
+ t.dbmap.trace(query, nil)
+ return t.tx.Prepare(query)
+}
+
+func (t *Transaction) queryRow(query string, args ...interface{}) *sql.Row {
+ t.dbmap.trace(query, args...)
+ return t.tx.QueryRow(query, args...)
+}
+
+func (t *Transaction) query(query string, args ...interface{}) (*sql.Rows, error) {
+ t.dbmap.trace(query, args...)
+ return t.tx.Query(query, args...)
+}
+
+///////////////
+
+// SelectInt executes the given query, which should be a SELECT statement for a single
+// integer column, and returns the value of the first row returned. If no rows are
+// found, zero is returned.
+func SelectInt(e SqlExecutor, query string, args ...interface{}) (int64, error) {
+ var h int64
+ err := selectVal(e, &h, query, args...)
+ if err != nil && err != sql.ErrNoRows {
+ return 0, err
+ }
+ return h, nil
+}
+
+// SelectNullInt executes the given query, which should be a SELECT statement for a single
+// integer column, and returns the value of the first row returned. If no rows are
+// found, the empty sql.NullInt64 value is returned.
+func SelectNullInt(e SqlExecutor, query string, args ...interface{}) (sql.NullInt64, error) {
+ var h sql.NullInt64
+ err := selectVal(e, &h, query, args...)
+ if err != nil && err != sql.ErrNoRows {
+ return h, err
+ }
+ return h, nil
+}
+
+// SelectFloat executes the given query, which should be a SELECT statement for a single
+// float column, and returns the value of the first row returned. If no rows are
+// found, zero is returned.
+func SelectFloat(e SqlExecutor, query string, args ...interface{}) (float64, error) {
+ var h float64
+ err := selectVal(e, &h, query, args...)
+ if err != nil && err != sql.ErrNoRows {
+ return 0, err
+ }
+ return h, nil
+}
+
+// SelectNullFloat executes the given query, which should be a SELECT statement for a single
+// float column, and returns the value of the first row returned. If no rows are
+// found, the empty sql.NullInt64 value is returned.
+func SelectNullFloat(e SqlExecutor, query string, args ...interface{}) (sql.NullFloat64, error) {
+ var h sql.NullFloat64
+ err := selectVal(e, &h, query, args...)
+ if err != nil && err != sql.ErrNoRows {
+ return h, err
+ }
+ return h, nil
+}
+
+// SelectStr executes the given query, which should be a SELECT statement for a single
+// char/varchar column, and returns the value of the first row returned. If no rows are
+// found, an empty string is returned.
+func SelectStr(e SqlExecutor, query string, args ...interface{}) (string, error) {
+ var h string
+ err := selectVal(e, &h, query, args...)
+ if err != nil && err != sql.ErrNoRows {
+ return "", err
+ }
+ return h, nil
+}
+
+// SelectNullStr executes the given query, which should be a SELECT
+// statement for a single char/varchar column, and returns the value
+// of the first row returned. If no rows are found, the empty
+// sql.NullString is returned.
+func SelectNullStr(e SqlExecutor, query string, args ...interface{}) (sql.NullString, error) {
+ var h sql.NullString
+ err := selectVal(e, &h, query, args...)
+ if err != nil && err != sql.ErrNoRows {
+ return h, err
+ }
+ return h, nil
+}
+
+// SelectOne executes the given query (which should be a SELECT statement)
+// and binds the result to holder, which must be a pointer.
+//
+// If no row is found, an error (sql.ErrNoRows specifically) will be returned
+//
+// If more than one row is found, an error will be returned.
+//
+func SelectOne(m *DbMap, e SqlExecutor, holder interface{}, query string, args ...interface{}) error {
+ t := reflect.TypeOf(holder)
+ if t.Kind() == reflect.Ptr {
+ t = t.Elem()
+ } else {
+ return fmt.Errorf("gorp: SelectOne holder must be a pointer, but got: %t", holder)
+ }
+
+ // Handle pointer to pointer
+ isptr := false
+ if t.Kind() == reflect.Ptr {
+ isptr = true
+ t = t.Elem()
+ }
+
+ if t.Kind() == reflect.Struct {
+ var nonFatalErr error
+
+ list, err := hookedselect(m, e, holder, query, args...)
+ if err != nil {
+ if !NonFatalError(err) {
+ return err
+ }
+ nonFatalErr = err
+ }
+
+ dest := reflect.ValueOf(holder)
+ if isptr {
+ dest = dest.Elem()
+ }
+
+ if list != nil && len(list) > 0 {
+ // check for multiple rows
+ if len(list) > 1 {
+ return fmt.Errorf("gorp: multiple rows returned for: %s - %v", query, args)
+ }
+
+ // Initialize if nil
+ if dest.IsNil() {
+ dest.Set(reflect.New(t))
+ }
+
+ // only one row found
+ src := reflect.ValueOf(list[0])
+ dest.Elem().Set(src.Elem())
+ } else {
+ // No rows found, return a proper error.
+ return sql.ErrNoRows
+ }
+
+ return nonFatalErr
+ }
+
+ return selectVal(e, holder, query, args...)
+}
+
+func selectVal(e SqlExecutor, holder interface{}, query string, args ...interface{}) error {
+ if len(args) == 1 {
+ switch m := e.(type) {
+ case *DbMap:
+ query, args = maybeExpandNamedQuery(m, query, args)
+ case *Transaction:
+ query, args = maybeExpandNamedQuery(m.dbmap, query, args)
+ }
+ }
+ rows, err := e.query(query, args...)
+ if err != nil {
+ return err
+ }
+ defer rows.Close()
+
+ if !rows.Next() {
+ return sql.ErrNoRows
+ }
+
+ return rows.Scan(holder)
+}
+
+///////////////
+
+func hookedselect(m *DbMap, exec SqlExecutor, i interface{}, query string,
+ args ...interface{}) ([]interface{}, error) {
+
+ var nonFatalErr error
+
+ list, err := rawselect(m, exec, i, query, args...)
+ if err != nil {
+ if !NonFatalError(err) {
+ return nil, err
+ }
+ nonFatalErr = err
+ }
+
+ // Determine where the results are: written to i, or returned in list
+ if t, _ := toSliceType(i); t == nil {
+ for _, v := range list {
+ if v, ok := v.(HasPostGet); ok {
+ err := v.PostGet(exec)
+ if err != nil {
+ return nil, err
+ }
+ }
+ }
+ } else {
+ resultsValue := reflect.Indirect(reflect.ValueOf(i))
+ for i := 0; i < resultsValue.Len(); i++ {
+ if v, ok := resultsValue.Index(i).Interface().(HasPostGet); ok {
+ err := v.PostGet(exec)
+ if err != nil {
+ return nil, err
+ }
+ }
+ }
+ }
+ return list, nonFatalErr
+}
+
+func rawselect(m *DbMap, exec SqlExecutor, i interface{}, query string,
+ args ...interface{}) ([]interface{}, error) {
+ var (
+ appendToSlice = false // Write results to i directly?
+ intoStruct = true // Selecting into a struct?
+ pointerElements = true // Are the slice elements pointers (vs values)?
+ )
+
+ var nonFatalErr error
+
+ // get type for i, verifying it's a supported destination
+ t, err := toType(i)
+ if err != nil {
+ var err2 error
+ if t, err2 = toSliceType(i); t == nil {
+ if err2 != nil {
+ return nil, err2
+ }
+ return nil, err
+ }
+ pointerElements = t.Kind() == reflect.Ptr
+ if pointerElements {
+ t = t.Elem()
+ }
+ appendToSlice = true
+ intoStruct = t.Kind() == reflect.Struct
+ }
+
+ // If the caller supplied a single struct/map argument, assume a "named
+ // parameter" query. Extract the named arguments from the struct/map, create
+ // the flat arg slice, and rewrite the query to use the dialect's placeholder.
+ if len(args) == 1 {
+ query, args = maybeExpandNamedQuery(m, query, args)
+ }
+
+ // Run the query
+ rows, err := exec.query(query, args...)
+ if err != nil {
+ return nil, err
+ }
+ defer rows.Close()
+
+ // Fetch the column names as returned from db
+ cols, err := rows.Columns()
+ if err != nil {
+ return nil, err
+ }
+
+ if !intoStruct && len(cols) > 1 {
+ return nil, fmt.Errorf("gorp: select into non-struct slice requires 1 column, got %d", len(cols))
+ }
+
+ var colToFieldIndex [][]int
+ if intoStruct {
+ if colToFieldIndex, err = columnToFieldIndex(m, t, cols); err != nil {
+ if !NonFatalError(err) {
+ return nil, err
+ }
+ nonFatalErr = err
+ }
+ }
+
+ conv := m.TypeConverter
+
+ // Add results to one of these two slices.
+ var (
+ list = make([]interface{}, 0)
+ sliceValue = reflect.Indirect(reflect.ValueOf(i))
+ )
+
+ for {
+ if !rows.Next() {
+ // if error occured return rawselect
+ if rows.Err() != nil {
+ return nil, rows.Err()
+ }
+ // time to exit from outer "for" loop
+ break
+ }
+ v := reflect.New(t)
+ dest := make([]interface{}, len(cols))
+
+ custScan := make([]CustomScanner, 0)
+
+ for x := range cols {
+ f := v.Elem()
+ if intoStruct {
+ index := colToFieldIndex[x]
+ if index == nil {
+ // this field is not present in the struct, so create a dummy
+ // value for rows.Scan to scan into
+ var dummy sql.RawBytes
+ dest[x] = &dummy
+ continue
+ }
+ f = f.FieldByIndex(index)
+ }
+ target := f.Addr().Interface()
+ if conv != nil {
+ scanner, ok := conv.FromDb(target)
+ if ok {
+ target = scanner.Holder
+ custScan = append(custScan, scanner)
+ }
+ }
+ dest[x] = target
+ }
+
+ err = rows.Scan(dest...)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, c := range custScan {
+ err = c.Bind()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ if appendToSlice {
+ if !pointerElements {
+ v = v.Elem()
+ }
+ sliceValue.Set(reflect.Append(sliceValue, v))
+ } else {
+ list = append(list, v.Interface())
+ }
+ }
+
+ if appendToSlice && sliceValue.IsNil() {
+ sliceValue.Set(reflect.MakeSlice(sliceValue.Type(), 0, 0))
+ }
+
+ return list, nonFatalErr
+}
+
+// maybeExpandNamedQuery checks the given arg to see if it's eligible to be used
+// as input to a named query. If so, it rewrites the query to use
+// dialect-dependent bindvars and instantiates the corresponding slice of
+// parameters by extracting data from the map / struct.
+// If not, returns the input values unchanged.
+func maybeExpandNamedQuery(m *DbMap, query string, args []interface{}) (string, []interface{}) {
+ arg := reflect.ValueOf(args[0])
+ for arg.Kind() == reflect.Ptr {
+ arg = arg.Elem()
+ }
+ switch {
+ case arg.Kind() == reflect.Map && arg.Type().Key().Kind() == reflect.String:
+ return expandNamedQuery(m, query, func(key string) reflect.Value {
+ return arg.MapIndex(reflect.ValueOf(key))
+ })
+ // #84 - ignore time.Time structs here - there may be a cleaner way to do this
+ case arg.Kind() == reflect.Struct && !(arg.Type().PkgPath() == "time" && arg.Type().Name() == "Time"):
+ return expandNamedQuery(m, query, arg.FieldByName)
+ }
+ return query, args
+}
+
+var keyRegexp = regexp.MustCompile(`:[[:word:]]+`)
+
+// expandNamedQuery accepts a query with placeholders of the form ":key", and a
+// single arg of Kind Struct or Map[string]. It returns the query with the
+// dialect's placeholders, and a slice of args ready for positional insertion
+// into the query.
+func expandNamedQuery(m *DbMap, query string, keyGetter func(key string) reflect.Value) (string, []interface{}) {
+ var (
+ n int
+ args []interface{}
+ )
+ return keyRegexp.ReplaceAllStringFunc(query, func(key string) string {
+ val := keyGetter(key[1:])
+ if !val.IsValid() {
+ return key
+ }
+ args = append(args, val.Interface())
+ newVar := m.Dialect.BindVar(n)
+ n++
+ return newVar
+ }), args
+}
+
+func columnToFieldIndex(m *DbMap, t reflect.Type, cols []string) ([][]int, error) {
+ colToFieldIndex := make([][]int, len(cols))
+
+ // check if type t is a mapped table - if so we'll
+ // check the table for column aliasing below
+ tableMapped := false
+ table := tableOrNil(m, t)
+ if table != nil {
+ tableMapped = true
+ }
+
+ // Loop over column names and find field in i to bind to
+ // based on column name. all returned columns must match
+ // a field in the i struct
+ missingColNames := []string{}
+ for x := range cols {
+ colName := strings.ToLower(cols[x])
+ field, found := t.FieldByNameFunc(func(fieldName string) bool {
+ field, _ := t.FieldByName(fieldName)
+ fieldName = field.Tag.Get("db")
+
+ if fieldName == "-" {
+ return false
+ } else if fieldName == "" {
+ fieldName = field.Name
+ }
+ if tableMapped {
+ colMap := colMapOrNil(table, fieldName)
+ if colMap != nil {
+ fieldName = colMap.ColumnName
+ }
+ }
+ return colName == strings.ToLower(fieldName)
+ })
+ if found {
+ colToFieldIndex[x] = field.Index
+ }
+ if colToFieldIndex[x] == nil {
+ missingColNames = append(missingColNames, colName)
+ }
+ }
+ if len(missingColNames) > 0 {
+ return colToFieldIndex, &NoFieldInTypeError{
+ TypeName: t.Name(),
+ MissingColNames: missingColNames,
+ }
+ }
+ return colToFieldIndex, nil
+}
+
+func fieldByName(val reflect.Value, fieldName string) *reflect.Value {
+ // try to find field by exact match
+ f := val.FieldByName(fieldName)
+
+ if f != zeroVal {
+ return &f
+ }
+
+ // try to find by case insensitive match - only the Postgres driver
+ // seems to require this - in the case where columns are aliased in the sql
+ fieldNameL := strings.ToLower(fieldName)
+ fieldCount := val.NumField()
+ t := val.Type()
+ for i := 0; i < fieldCount; i++ {
+ sf := t.Field(i)
+ if strings.ToLower(sf.Name) == fieldNameL {
+ f := val.Field(i)
+ return &f
+ }
+ }
+
+ return nil
+}
+
+// toSliceType returns the element type of the given object, if the object is a
+// "*[]*Element" or "*[]Element". If not, returns nil.
+// err is returned if the user was trying to pass a pointer-to-slice but failed.
+func toSliceType(i interface{}) (reflect.Type, error) {
+ t := reflect.TypeOf(i)
+ if t.Kind() != reflect.Ptr {
+ // If it's a slice, return a more helpful error message
+ if t.Kind() == reflect.Slice {
+ return nil, fmt.Errorf("gorp: Cannot SELECT into a non-pointer slice: %v", t)
+ }
+ return nil, nil
+ }
+ if t = t.Elem(); t.Kind() != reflect.Slice {
+ return nil, nil
+ }
+ return t.Elem(), nil
+}
+
+func toType(i interface{}) (reflect.Type, error) {
+ t := reflect.TypeOf(i)
+
+ // If a Pointer to a type, follow
+ for t.Kind() == reflect.Ptr {
+ t = t.Elem()
+ }
+
+ if t.Kind() != reflect.Struct {
+ return nil, fmt.Errorf("gorp: Cannot SELECT into this type: %v", reflect.TypeOf(i))
+ }
+ return t, nil
+}
+
+func get(m *DbMap, exec SqlExecutor, i interface{},
+ keys ...interface{}) (interface{}, error) {
+
+ t, err := toType(i)
+ if err != nil {
+ return nil, err
+ }
+
+ table, err := m.TableFor(t, true)
+ if err != nil {
+ return nil, err
+ }
+
+ plan := table.bindGet()
+
+ v := reflect.New(t)
+ dest := make([]interface{}, len(plan.argFields))
+
+ conv := m.TypeConverter
+ custScan := make([]CustomScanner, 0)
+
+ for x, fieldName := range plan.argFields {
+ f := v.Elem().FieldByName(fieldName)
+ target := f.Addr().Interface()
+ if conv != nil {
+ scanner, ok := conv.FromDb(target)
+ if ok {
+ target = scanner.Holder
+ custScan = append(custScan, scanner)
+ }
+ }
+ dest[x] = target
+ }
+
+ row := exec.queryRow(plan.query, keys...)
+ err = row.Scan(dest...)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ err = nil
+ }
+ return nil, err
+ }
+
+ for _, c := range custScan {
+ err = c.Bind()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ if v, ok := v.Interface().(HasPostGet); ok {
+ err := v.PostGet(exec)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return v.Interface(), nil
+}
+
+func delete(m *DbMap, exec SqlExecutor, list ...interface{}) (int64, error) {
+ count := int64(0)
+ for _, ptr := range list {
+ table, elem, err := m.tableForPointer(ptr, true)
+ if err != nil {
+ return -1, err
+ }
+
+ eval := elem.Addr().Interface()
+ if v, ok := eval.(HasPreDelete); ok {
+ err = v.PreDelete(exec)
+ if err != nil {
+ return -1, err
+ }
+ }
+
+ bi, err := table.bindDelete(elem)
+ if err != nil {
+ return -1, err
+ }
+
+ res, err := exec.Exec(bi.query, bi.args...)
+ if err != nil {
+ return -1, err
+ }
+ rows, err := res.RowsAffected()
+ if err != nil {
+ return -1, err
+ }
+
+ if rows == 0 && bi.existingVersion > 0 {
+ return lockError(m, exec, table.TableName,
+ bi.existingVersion, elem, bi.keys...)
+ }
+
+ count += rows
+
+ if v, ok := eval.(HasPostDelete); ok {
+ err := v.PostDelete(exec)
+ if err != nil {
+ return -1, err
+ }
+ }
+ }
+
+ return count, nil
+}
+
+func update(m *DbMap, exec SqlExecutor, list ...interface{}) (int64, error) {
+ count := int64(0)
+ for _, ptr := range list {
+ table, elem, err := m.tableForPointer(ptr, true)
+ if err != nil {
+ return -1, err
+ }
+
+ eval := elem.Addr().Interface()
+ if v, ok := eval.(HasPreUpdate); ok {
+ err = v.PreUpdate(exec)
+ if err != nil {
+ return -1, err
+ }
+ }
+
+ bi, err := table.bindUpdate(elem)
+ if err != nil {
+ return -1, err
+ }
+
+ res, err := exec.Exec(bi.query, bi.args...)
+ if err != nil {
+ return -1, err
+ }
+
+ rows, err := res.RowsAffected()
+ if err != nil {
+ return -1, err
+ }
+
+ if rows == 0 && bi.existingVersion > 0 {
+ return lockError(m, exec, table.TableName,
+ bi.existingVersion, elem, bi.keys...)
+ }
+
+ if bi.versField != "" {
+ elem.FieldByName(bi.versField).SetInt(bi.existingVersion + 1)
+ }
+
+ count += rows
+
+ if v, ok := eval.(HasPostUpdate); ok {
+ err = v.PostUpdate(exec)
+ if err != nil {
+ return -1, err
+ }
+ }
+ }
+ return count, nil
+}
+
+func insert(m *DbMap, exec SqlExecutor, list ...interface{}) error {
+ for _, ptr := range list {
+ table, elem, err := m.tableForPointer(ptr, false)
+ if err != nil {
+ return err
+ }
+
+ eval := elem.Addr().Interface()
+ if v, ok := eval.(HasPreInsert); ok {
+ err := v.PreInsert(exec)
+ if err != nil {
+ return err
+ }
+ }
+
+ bi, err := table.bindInsert(elem)
+ if err != nil {
+ return err
+ }
+
+ if bi.autoIncrIdx > -1 {
+ f := elem.FieldByName(bi.autoIncrFieldName)
+ switch inserter := m.Dialect.(type) {
+ case IntegerAutoIncrInserter:
+ id, err := inserter.InsertAutoIncr(exec, bi.query, bi.args...)
+ if err != nil {
+ return err
+ }
+ k := f.Kind()
+ if (k == reflect.Int) || (k == reflect.Int16) || (k == reflect.Int32) || (k == reflect.Int64) {
+ f.SetInt(id)
+ } else if (k == reflect.Uint) || (k == reflect.Uint16) || (k == reflect.Uint32) || (k == reflect.Uint64) {
+ f.SetUint(uint64(id))
+ } else {
+ return fmt.Errorf("gorp: Cannot set autoincrement value on non-Int field. SQL=%s autoIncrIdx=%d autoIncrFieldName=%s", bi.query, bi.autoIncrIdx, bi.autoIncrFieldName)
+ }
+ case TargetedAutoIncrInserter:
+ err := inserter.InsertAutoIncrToTarget(exec, bi.query, f.Addr().Interface(), bi.args...)
+ if err != nil {
+ return err
+ }
+ default:
+ return fmt.Errorf("gorp: Cannot use autoincrement fields on dialects that do not implement an autoincrementing interface")
+ }
+ } else {
+ _, err := exec.Exec(bi.query, bi.args...)
+ if err != nil {
+ return err
+ }
+ }
+
+ if v, ok := eval.(HasPostInsert); ok {
+ err := v.PostInsert(exec)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
+func lockError(m *DbMap, exec SqlExecutor, tableName string,
+ existingVer int64, elem reflect.Value,
+ keys ...interface{}) (int64, error) {
+
+ existing, err := get(m, exec, elem.Interface(), keys...)
+ if err != nil {
+ return -1, err
+ }
+
+ ole := OptimisticLockError{tableName, keys, true, existingVer}
+ if existing == nil {
+ ole.RowExists = false
+ }
+ return -1, ole
+}
+
+// PostUpdate() will be executed after the GET statement.
+type HasPostGet interface {
+ PostGet(SqlExecutor) error
+}
+
+// PostUpdate() will be executed after the DELETE statement
+type HasPostDelete interface {
+ PostDelete(SqlExecutor) error
+}
+
+// PostUpdate() will be executed after the UPDATE statement
+type HasPostUpdate interface {
+ PostUpdate(SqlExecutor) error
+}
+
+// PostInsert() will be executed after the INSERT statement
+type HasPostInsert interface {
+ PostInsert(SqlExecutor) error
+}
+
+// PreDelete() will be executed before the DELETE statement.
+type HasPreDelete interface {
+ PreDelete(SqlExecutor) error
+}
+
+// PreUpdate() will be executed before UPDATE statement.
+type HasPreUpdate interface {
+ PreUpdate(SqlExecutor) error
+}
+
+// PreInsert() will be executed before INSERT statement.
+type HasPreInsert interface {
+ PreInsert(SqlExecutor) error
+}
diff --git a/vendor/gopkg.in/gorp.v1/gorp_test.go b/vendor/gopkg.in/gorp.v1/gorp_test.go
new file mode 100644
index 000000000..551823712
--- /dev/null
+++ b/vendor/gopkg.in/gorp.v1/gorp_test.go
@@ -0,0 +1,2083 @@
+package gorp
+
+import (
+ "bytes"
+ "database/sql"
+ "encoding/json"
+ "errors"
+ "fmt"
+ _ "github.com/go-sql-driver/mysql"
+ _ "github.com/lib/pq"
+ _ "github.com/mattn/go-sqlite3"
+ _ "github.com/ziutek/mymysql/godrv"
+ "log"
+ "math/rand"
+ "os"
+ "reflect"
+ "strings"
+ "testing"
+ "time"
+)
+
+// verify interface compliance
+var _ Dialect = SqliteDialect{}
+var _ Dialect = PostgresDialect{}
+var _ Dialect = MySQLDialect{}
+var _ Dialect = SqlServerDialect{}
+var _ Dialect = OracleDialect{}
+
+type testable interface {
+ GetId() int64
+ Rand()
+}
+
+type Invoice struct {
+ Id int64
+ Created int64
+ Updated int64
+ Memo string
+ PersonId int64
+ IsPaid bool
+}
+
+func (me *Invoice) GetId() int64 { return me.Id }
+func (me *Invoice) Rand() {
+ me.Memo = fmt.Sprintf("random %d", rand.Int63())
+ me.Created = rand.Int63()
+ me.Updated = rand.Int63()
+}
+
+type InvoiceTag struct {
+ Id int64 `db:"myid"`
+ Created int64 `db:"myCreated"`
+ Updated int64 `db:"date_updated"`
+ Memo string
+ PersonId int64 `db:"person_id"`
+ IsPaid bool `db:"is_Paid"`
+}
+
+func (me *InvoiceTag) GetId() int64 { return me.Id }
+func (me *InvoiceTag) Rand() {
+ me.Memo = fmt.Sprintf("random %d", rand.Int63())
+ me.Created = rand.Int63()
+ me.Updated = rand.Int63()
+}
+
+// See: https://github.com/coopernurse/gorp/issues/175
+type AliasTransientField struct {
+ Id int64 `db:"id"`
+ Bar int64 `db:"-"`
+ BarStr string `db:"bar"`
+}
+
+func (me *AliasTransientField) GetId() int64 { return me.Id }
+func (me *AliasTransientField) Rand() {
+ me.BarStr = fmt.Sprintf("random %d", rand.Int63())
+}
+
+type OverriddenInvoice struct {
+ Invoice
+ Id string
+}
+
+type Person struct {
+ Id int64
+ Created int64
+ Updated int64
+ FName string
+ LName string
+ Version int64
+}
+
+type FNameOnly struct {
+ FName string
+}
+
+type InvoicePersonView struct {
+ InvoiceId int64
+ PersonId int64
+ Memo string
+ FName string
+ LegacyVersion int64
+}
+
+type TableWithNull struct {
+ Id int64
+ Str sql.NullString
+ Int64 sql.NullInt64
+ Float64 sql.NullFloat64
+ Bool sql.NullBool
+ Bytes []byte
+}
+
+type WithIgnoredColumn struct {
+ internal int64 `db:"-"`
+ Id int64
+ Created int64
+}
+
+type IdCreated struct {
+ Id int64
+ Created int64
+}
+
+type IdCreatedExternal struct {
+ IdCreated
+ External int64
+}
+
+type WithStringPk struct {
+ Id string
+ Name string
+}
+
+type CustomStringType string
+
+type TypeConversionExample struct {
+ Id int64
+ PersonJSON Person
+ Name CustomStringType
+}
+
+type PersonUInt32 struct {
+ Id uint32
+ Name string
+}
+
+type PersonUInt64 struct {
+ Id uint64
+ Name string
+}
+
+type PersonUInt16 struct {
+ Id uint16
+ Name string
+}
+
+type WithEmbeddedStruct struct {
+ Id int64
+ Names
+}
+
+type WithEmbeddedStructBeforeAutoincrField struct {
+ Names
+ Id int64
+}
+
+type WithEmbeddedAutoincr struct {
+ WithEmbeddedStruct
+ MiddleName string
+}
+
+type Names struct {
+ FirstName string
+ LastName string
+}
+
+type UniqueColumns struct {
+ FirstName string
+ LastName string
+ City string
+ ZipCode int64
+}
+
+type SingleColumnTable struct {
+ SomeId string
+}
+
+type CustomDate struct {
+ time.Time
+}
+
+type WithCustomDate struct {
+ Id int64
+ Added CustomDate
+}
+
+type testTypeConverter struct{}
+
+func (me testTypeConverter) ToDb(val interface{}) (interface{}, error) {
+
+ switch t := val.(type) {
+ case Person:
+ b, err := json.Marshal(t)
+ if err != nil {
+ return "", err
+ }
+ return string(b), nil
+ case CustomStringType:
+ return string(t), nil
+ case CustomDate:
+ return t.Time, nil
+ }
+
+ return val, nil
+}
+
+func (me testTypeConverter) FromDb(target interface{}) (CustomScanner, bool) {
+ switch target.(type) {
+ case *Person:
+ binder := func(holder, target interface{}) error {
+ s, ok := holder.(*string)
+ if !ok {
+ return errors.New("FromDb: Unable to convert Person to *string")
+ }
+ b := []byte(*s)
+ return json.Unmarshal(b, target)
+ }
+ return CustomScanner{new(string), target, binder}, true
+ case *CustomStringType:
+ binder := func(holder, target interface{}) error {
+ s, ok := holder.(*string)
+ if !ok {
+ return errors.New("FromDb: Unable to convert CustomStringType to *string")
+ }
+ st, ok := target.(*CustomStringType)
+ if !ok {
+ return errors.New(fmt.Sprint("FromDb: Unable to convert target to *CustomStringType: ", reflect.TypeOf(target)))
+ }
+ *st = CustomStringType(*s)
+ return nil
+ }
+ return CustomScanner{new(string), target, binder}, true
+ case *CustomDate:
+ binder := func(holder, target interface{}) error {
+ t, ok := holder.(*time.Time)
+ if !ok {
+ return errors.New("FromDb: Unable to convert CustomDate to *time.Time")
+ }
+ dateTarget, ok := target.(*CustomDate)
+ if !ok {
+ return errors.New(fmt.Sprint("FromDb: Unable to convert target to *CustomDate: ", reflect.TypeOf(target)))
+ }
+ dateTarget.Time = *t
+ return nil
+ }
+ return CustomScanner{new(time.Time), target, binder}, true
+ }
+
+ return CustomScanner{}, false
+}
+
+func (p *Person) PreInsert(s SqlExecutor) error {
+ p.Created = time.Now().UnixNano()
+ p.Updated = p.Created
+ if p.FName == "badname" {
+ return fmt.Errorf("Invalid name: %s", p.FName)
+ }
+ return nil
+}
+
+func (p *Person) PostInsert(s SqlExecutor) error {
+ p.LName = "postinsert"
+ return nil
+}
+
+func (p *Person) PreUpdate(s SqlExecutor) error {
+ p.FName = "preupdate"
+ return nil
+}
+
+func (p *Person) PostUpdate(s SqlExecutor) error {
+ p.LName = "postupdate"
+ return nil
+}
+
+func (p *Person) PreDelete(s SqlExecutor) error {
+ p.FName = "predelete"
+ return nil
+}
+
+func (p *Person) PostDelete(s SqlExecutor) error {
+ p.LName = "postdelete"
+ return nil
+}
+
+func (p *Person) PostGet(s SqlExecutor) error {
+ p.LName = "postget"
+ return nil
+}
+
+type PersistentUser struct {
+ Key int32
+ Id string
+ PassedTraining bool
+}
+
+func TestCreateTablesIfNotExists(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ err := dbmap.CreateTablesIfNotExists()
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTruncateTables(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+ err := dbmap.CreateTablesIfNotExists()
+ if err != nil {
+ t.Error(err)
+ }
+
+ // Insert some data
+ p1 := &Person{0, 0, 0, "Bob", "Smith", 0}
+ dbmap.Insert(p1)
+ inv := &Invoice{0, 0, 1, "my invoice", 0, true}
+ dbmap.Insert(inv)
+
+ err = dbmap.TruncateTables()
+ if err != nil {
+ t.Error(err)
+ }
+
+ // Make sure all rows are deleted
+ rows, _ := dbmap.Select(Person{}, "SELECT * FROM person_test")
+ if len(rows) != 0 {
+ t.Errorf("Expected 0 person rows, got %d", len(rows))
+ }
+ rows, _ = dbmap.Select(Invoice{}, "SELECT * FROM invoice_test")
+ if len(rows) != 0 {
+ t.Errorf("Expected 0 invoice rows, got %d", len(rows))
+ }
+}
+
+func TestCustomDateType(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.TypeConverter = testTypeConverter{}
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ dbmap.AddTable(WithCustomDate{}).SetKeys(true, "Id")
+ err := dbmap.CreateTables()
+ if err != nil {
+ panic(err)
+ }
+ defer dropAndClose(dbmap)
+
+ test1 := &WithCustomDate{Added: CustomDate{Time: time.Now().Truncate(time.Second)}}
+ err = dbmap.Insert(test1)
+ if err != nil {
+ t.Errorf("Could not insert struct with custom date field: %s", err)
+ t.FailNow()
+ }
+ // Unfortunately, the mysql driver doesn't handle time.Time
+ // values properly during Get(). I can't find a way to work
+ // around that problem - every other type that I've tried is just
+ // silently converted. time.Time is the only type that causes
+ // the issue that this test checks for. As such, if the driver is
+ // mysql, we'll just skip the rest of this test.
+ if _, driver := dialectAndDriver(); driver == "mysql" {
+ t.Skip("TestCustomDateType can't run Get() with the mysql driver; skipping the rest of this test...")
+ }
+ result, err := dbmap.Get(new(WithCustomDate), test1.Id)
+ if err != nil {
+ t.Errorf("Could not get struct with custom date field: %s", err)
+ t.FailNow()
+ }
+ test2 := result.(*WithCustomDate)
+ if test2.Added.UTC() != test1.Added.UTC() {
+ t.Errorf("Custom dates do not match: %v != %v", test2.Added.UTC(), test1.Added.UTC())
+ }
+}
+
+func TestUIntPrimaryKey(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ dbmap.AddTable(PersonUInt64{}).SetKeys(true, "Id")
+ dbmap.AddTable(PersonUInt32{}).SetKeys(true, "Id")
+ dbmap.AddTable(PersonUInt16{}).SetKeys(true, "Id")
+ err := dbmap.CreateTablesIfNotExists()
+ if err != nil {
+ panic(err)
+ }
+ defer dropAndClose(dbmap)
+
+ p1 := &PersonUInt64{0, "name1"}
+ p2 := &PersonUInt32{0, "name2"}
+ p3 := &PersonUInt16{0, "name3"}
+ err = dbmap.Insert(p1, p2, p3)
+ if err != nil {
+ t.Error(err)
+ }
+ if p1.Id != 1 {
+ t.Errorf("%d != 1", p1.Id)
+ }
+ if p2.Id != 1 {
+ t.Errorf("%d != 1", p2.Id)
+ }
+ if p3.Id != 1 {
+ t.Errorf("%d != 1", p3.Id)
+ }
+}
+
+func TestSetUniqueTogether(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ dbmap.AddTable(UniqueColumns{}).SetUniqueTogether("FirstName", "LastName").SetUniqueTogether("City", "ZipCode")
+ err := dbmap.CreateTablesIfNotExists()
+ if err != nil {
+ panic(err)
+ }
+ defer dropAndClose(dbmap)
+
+ n1 := &UniqueColumns{"Steve", "Jobs", "Cupertino", 95014}
+ err = dbmap.Insert(n1)
+ if err != nil {
+ t.Error(err)
+ }
+
+ // Should fail because of the first constraint
+ n2 := &UniqueColumns{"Steve", "Jobs", "Sunnyvale", 94085}
+ err = dbmap.Insert(n2)
+ if err == nil {
+ t.Error(err)
+ }
+ // "unique" for Postgres/SQLite, "Duplicate entry" for MySQL
+ errLower := strings.ToLower(err.Error())
+ if !strings.Contains(errLower, "unique") && !strings.Contains(errLower, "duplicate entry") {
+ t.Error(err)
+ }
+
+ // Should also fail because of the second unique-together
+ n3 := &UniqueColumns{"Steve", "Wozniak", "Cupertino", 95014}
+ err = dbmap.Insert(n3)
+ if err == nil {
+ t.Error(err)
+ }
+ // "unique" for Postgres/SQLite, "Duplicate entry" for MySQL
+ errLower = strings.ToLower(err.Error())
+ if !strings.Contains(errLower, "unique") && !strings.Contains(errLower, "duplicate entry") {
+ t.Error(err)
+ }
+
+ // This one should finally succeed
+ n4 := &UniqueColumns{"Steve", "Wozniak", "Sunnyvale", 94085}
+ err = dbmap.Insert(n4)
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+func TestPersistentUser(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.Exec("drop table if exists PersistentUser")
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ table := dbmap.AddTable(PersistentUser{}).SetKeys(false, "Key")
+ table.ColMap("Key").Rename("mykey")
+ err := dbmap.CreateTablesIfNotExists()
+ if err != nil {
+ panic(err)
+ }
+ defer dropAndClose(dbmap)
+ pu := &PersistentUser{43, "33r", false}
+ err = dbmap.Insert(pu)
+ if err != nil {
+ panic(err)
+ }
+
+ // prove we can pass a pointer into Get
+ pu2, err := dbmap.Get(pu, pu.Key)
+ if err != nil {
+ panic(err)
+ }
+ if !reflect.DeepEqual(pu, pu2) {
+ t.Errorf("%v!=%v", pu, pu2)
+ }
+
+ arr, err := dbmap.Select(pu, "select * from PersistentUser")
+ if err != nil {
+ panic(err)
+ }
+ if !reflect.DeepEqual(pu, arr[0]) {
+ t.Errorf("%v!=%v", pu, arr[0])
+ }
+
+ // prove we can get the results back in a slice
+ var puArr []*PersistentUser
+ _, err = dbmap.Select(&puArr, "select * from PersistentUser")
+ if err != nil {
+ panic(err)
+ }
+ if len(puArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+ if !reflect.DeepEqual(pu, puArr[0]) {
+ t.Errorf("%v!=%v", pu, puArr[0])
+ }
+
+ // prove we can get the results back in a non-pointer slice
+ var puValues []PersistentUser
+ _, err = dbmap.Select(&puValues, "select * from PersistentUser")
+ if err != nil {
+ panic(err)
+ }
+ if len(puValues) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+ if !reflect.DeepEqual(*pu, puValues[0]) {
+ t.Errorf("%v!=%v", *pu, puValues[0])
+ }
+
+ // prove we can get the results back in a string slice
+ var idArr []*string
+ _, err = dbmap.Select(&idArr, "select Id from PersistentUser")
+ if err != nil {
+ panic(err)
+ }
+ if len(idArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+ if !reflect.DeepEqual(pu.Id, *idArr[0]) {
+ t.Errorf("%v!=%v", pu.Id, *idArr[0])
+ }
+
+ // prove we can get the results back in an int slice
+ var keyArr []*int32
+ _, err = dbmap.Select(&keyArr, "select mykey from PersistentUser")
+ if err != nil {
+ panic(err)
+ }
+ if len(keyArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+ if !reflect.DeepEqual(pu.Key, *keyArr[0]) {
+ t.Errorf("%v!=%v", pu.Key, *keyArr[0])
+ }
+
+ // prove we can get the results back in a bool slice
+ var passedArr []*bool
+ _, err = dbmap.Select(&passedArr, "select PassedTraining from PersistentUser")
+ if err != nil {
+ panic(err)
+ }
+ if len(passedArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+ if !reflect.DeepEqual(pu.PassedTraining, *passedArr[0]) {
+ t.Errorf("%v!=%v", pu.PassedTraining, *passedArr[0])
+ }
+
+ // prove we can get the results back in a non-pointer slice
+ var stringArr []string
+ _, err = dbmap.Select(&stringArr, "select Id from PersistentUser")
+ if err != nil {
+ panic(err)
+ }
+ if len(stringArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+ if !reflect.DeepEqual(pu.Id, stringArr[0]) {
+ t.Errorf("%v!=%v", pu.Id, stringArr[0])
+ }
+}
+
+func TestNamedQueryMap(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.Exec("drop table if exists PersistentUser")
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ table := dbmap.AddTable(PersistentUser{}).SetKeys(false, "Key")
+ table.ColMap("Key").Rename("mykey")
+ err := dbmap.CreateTablesIfNotExists()
+ if err != nil {
+ panic(err)
+ }
+ defer dropAndClose(dbmap)
+ pu := &PersistentUser{43, "33r", false}
+ pu2 := &PersistentUser{500, "abc", false}
+ err = dbmap.Insert(pu, pu2)
+ if err != nil {
+ panic(err)
+ }
+
+ // Test simple case
+ var puArr []*PersistentUser
+ _, err = dbmap.Select(&puArr, "select * from PersistentUser where mykey = :Key", map[string]interface{}{
+ "Key": 43,
+ })
+ if err != nil {
+ t.Errorf("Failed to select: %s", err)
+ t.FailNow()
+ }
+ if len(puArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+ if !reflect.DeepEqual(pu, puArr[0]) {
+ t.Errorf("%v!=%v", pu, puArr[0])
+ }
+
+ // Test more specific map value type is ok
+ puArr = nil
+ _, err = dbmap.Select(&puArr, "select * from PersistentUser where mykey = :Key", map[string]int{
+ "Key": 43,
+ })
+ if err != nil {
+ t.Errorf("Failed to select: %s", err)
+ t.FailNow()
+ }
+ if len(puArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+
+ // Test multiple parameters set.
+ puArr = nil
+ _, err = dbmap.Select(&puArr, `
+select * from PersistentUser
+ where mykey = :Key
+ and PassedTraining = :PassedTraining
+ and Id = :Id`, map[string]interface{}{
+ "Key": 43,
+ "PassedTraining": false,
+ "Id": "33r",
+ })
+ if err != nil {
+ t.Errorf("Failed to select: %s", err)
+ t.FailNow()
+ }
+ if len(puArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+
+ // Test colon within a non-key string
+ // Test having extra, unused properties in the map.
+ puArr = nil
+ _, err = dbmap.Select(&puArr, `
+select * from PersistentUser
+ where mykey = :Key
+ and Id != 'abc:def'`, map[string]interface{}{
+ "Key": 43,
+ "PassedTraining": false,
+ })
+ if err != nil {
+ t.Errorf("Failed to select: %s", err)
+ t.FailNow()
+ }
+ if len(puArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+}
+
+func TestNamedQueryStruct(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.Exec("drop table if exists PersistentUser")
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ table := dbmap.AddTable(PersistentUser{}).SetKeys(false, "Key")
+ table.ColMap("Key").Rename("mykey")
+ err := dbmap.CreateTablesIfNotExists()
+ if err != nil {
+ panic(err)
+ }
+ defer dropAndClose(dbmap)
+ pu := &PersistentUser{43, "33r", false}
+ pu2 := &PersistentUser{500, "abc", false}
+ err = dbmap.Insert(pu, pu2)
+ if err != nil {
+ panic(err)
+ }
+
+ // Test select self
+ var puArr []*PersistentUser
+ _, err = dbmap.Select(&puArr, `
+select * from PersistentUser
+ where mykey = :Key
+ and PassedTraining = :PassedTraining
+ and Id = :Id`, pu)
+ if err != nil {
+ t.Errorf("Failed to select: %s", err)
+ t.FailNow()
+ }
+ if len(puArr) != 1 {
+ t.Errorf("Expected one persistentuser, found none")
+ }
+ if !reflect.DeepEqual(pu, puArr[0]) {
+ t.Errorf("%v!=%v", pu, puArr[0])
+ }
+}
+
+// Ensure that the slices containing SQL results are non-nil when the result set is empty.
+func TestReturnsNonNilSlice(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+ noResultsSQL := "select * from invoice_test where id=99999"
+ var r1 []*Invoice
+ _rawselect(dbmap, &r1, noResultsSQL)
+ if r1 == nil {
+ t.Errorf("r1==nil")
+ }
+
+ r2 := _rawselect(dbmap, Invoice{}, noResultsSQL)
+ if r2 == nil {
+ t.Errorf("r2==nil")
+ }
+}
+
+func TestOverrideVersionCol(t *testing.T) {
+ dbmap := newDbMap()
+ t1 := dbmap.AddTable(InvoicePersonView{}).SetKeys(false, "InvoiceId", "PersonId")
+ err := dbmap.CreateTables()
+ if err != nil {
+ panic(err)
+ }
+ defer dropAndClose(dbmap)
+ c1 := t1.SetVersionCol("LegacyVersion")
+ if c1.ColumnName != "LegacyVersion" {
+ t.Errorf("Wrong col returned: %v", c1)
+ }
+
+ ipv := &InvoicePersonView{1, 2, "memo", "fname", 0}
+ _update(dbmap, ipv)
+ if ipv.LegacyVersion != 1 {
+ t.Errorf("LegacyVersion not updated: %d", ipv.LegacyVersion)
+ }
+}
+
+func TestOptimisticLocking(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ p1 := &Person{0, 0, 0, "Bob", "Smith", 0}
+ dbmap.Insert(p1) // Version is now 1
+ if p1.Version != 1 {
+ t.Errorf("Insert didn't incr Version: %d != %d", 1, p1.Version)
+ return
+ }
+ if p1.Id == 0 {
+ t.Errorf("Insert didn't return a generated PK")
+ return
+ }
+
+ obj, err := dbmap.Get(Person{}, p1.Id)
+ if err != nil {
+ panic(err)
+ }
+ p2 := obj.(*Person)
+ p2.LName = "Edwards"
+ dbmap.Update(p2) // Version is now 2
+ if p2.Version != 2 {
+ t.Errorf("Update didn't incr Version: %d != %d", 2, p2.Version)
+ }
+
+ p1.LName = "Howard"
+ count, err := dbmap.Update(p1)
+ if _, ok := err.(OptimisticLockError); !ok {
+ t.Errorf("update - Expected OptimisticLockError, got: %v", err)
+ }
+ if count != -1 {
+ t.Errorf("update - Expected -1 count, got: %d", count)
+ }
+
+ count, err = dbmap.Delete(p1)
+ if _, ok := err.(OptimisticLockError); !ok {
+ t.Errorf("delete - Expected OptimisticLockError, got: %v", err)
+ }
+ if count != -1 {
+ t.Errorf("delete - Expected -1 count, got: %d", count)
+ }
+}
+
+// what happens if a legacy table has a null value?
+func TestDoubleAddTable(t *testing.T) {
+ dbmap := newDbMap()
+ t1 := dbmap.AddTable(TableWithNull{}).SetKeys(false, "Id")
+ t2 := dbmap.AddTable(TableWithNull{})
+ if t1 != t2 {
+ t.Errorf("%v != %v", t1, t2)
+ }
+}
+
+// what happens if a legacy table has a null value?
+func TestNullValues(t *testing.T) {
+ dbmap := initDbMapNulls()
+ defer dropAndClose(dbmap)
+
+ // insert a row directly
+ _rawexec(dbmap, "insert into TableWithNull values (10, null, "+
+ "null, null, null, null)")
+
+ // try to load it
+ expected := &TableWithNull{Id: 10}
+ obj := _get(dbmap, TableWithNull{}, 10)
+ t1 := obj.(*TableWithNull)
+ if !reflect.DeepEqual(expected, t1) {
+ t.Errorf("%v != %v", expected, t1)
+ }
+
+ // update it
+ t1.Str = sql.NullString{"hi", true}
+ expected.Str = t1.Str
+ t1.Int64 = sql.NullInt64{999, true}
+ expected.Int64 = t1.Int64
+ t1.Float64 = sql.NullFloat64{53.33, true}
+ expected.Float64 = t1.Float64
+ t1.Bool = sql.NullBool{true, true}
+ expected.Bool = t1.Bool
+ t1.Bytes = []byte{1, 30, 31, 33}
+ expected.Bytes = t1.Bytes
+ _update(dbmap, t1)
+
+ obj = _get(dbmap, TableWithNull{}, 10)
+ t1 = obj.(*TableWithNull)
+ if t1.Str.String != "hi" {
+ t.Errorf("%s != hi", t1.Str.String)
+ }
+ if !reflect.DeepEqual(expected, t1) {
+ t.Errorf("%v != %v", expected, t1)
+ }
+}
+
+func TestColumnProps(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ t1 := dbmap.AddTable(Invoice{}).SetKeys(true, "Id")
+ t1.ColMap("Created").Rename("date_created")
+ t1.ColMap("Updated").SetTransient(true)
+ t1.ColMap("Memo").SetMaxSize(10)
+ t1.ColMap("PersonId").SetUnique(true)
+
+ err := dbmap.CreateTables()
+ if err != nil {
+ panic(err)
+ }
+ defer dropAndClose(dbmap)
+
+ // test transient
+ inv := &Invoice{0, 0, 1, "my invoice", 0, true}
+ _insert(dbmap, inv)
+ obj := _get(dbmap, Invoice{}, inv.Id)
+ inv = obj.(*Invoice)
+ if inv.Updated != 0 {
+ t.Errorf("Saved transient column 'Updated'")
+ }
+
+ // test max size
+ inv.Memo = "this memo is too long"
+ err = dbmap.Insert(inv)
+ if err == nil {
+ t.Errorf("max size exceeded, but Insert did not fail.")
+ }
+
+ // test unique - same person id
+ inv = &Invoice{0, 0, 1, "my invoice2", 0, false}
+ err = dbmap.Insert(inv)
+ if err == nil {
+ t.Errorf("same PersonId inserted, but Insert did not fail.")
+ }
+}
+
+func TestRawSelect(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ p1 := &Person{0, 0, 0, "bob", "smith", 0}
+ _insert(dbmap, p1)
+
+ inv1 := &Invoice{0, 0, 0, "xmas order", p1.Id, true}
+ _insert(dbmap, inv1)
+
+ expected := &InvoicePersonView{inv1.Id, p1.Id, inv1.Memo, p1.FName, 0}
+
+ query := "select i.Id InvoiceId, p.Id PersonId, i.Memo, p.FName " +
+ "from invoice_test i, person_test p " +
+ "where i.PersonId = p.Id"
+ list := _rawselect(dbmap, InvoicePersonView{}, query)
+ if len(list) != 1 {
+ t.Errorf("len(list) != 1: %d", len(list))
+ } else if !reflect.DeepEqual(expected, list[0]) {
+ t.Errorf("%v != %v", expected, list[0])
+ }
+}
+
+func TestHooks(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ p1 := &Person{0, 0, 0, "bob", "smith", 0}
+ _insert(dbmap, p1)
+ if p1.Created == 0 || p1.Updated == 0 {
+ t.Errorf("p1.PreInsert() didn't run: %v", p1)
+ } else if p1.LName != "postinsert" {
+ t.Errorf("p1.PostInsert() didn't run: %v", p1)
+ }
+
+ obj := _get(dbmap, Person{}, p1.Id)
+ p1 = obj.(*Person)
+ if p1.LName != "postget" {
+ t.Errorf("p1.PostGet() didn't run: %v", p1)
+ }
+
+ _update(dbmap, p1)
+ if p1.FName != "preupdate" {
+ t.Errorf("p1.PreUpdate() didn't run: %v", p1)
+ } else if p1.LName != "postupdate" {
+ t.Errorf("p1.PostUpdate() didn't run: %v", p1)
+ }
+
+ var persons []*Person
+ bindVar := dbmap.Dialect.BindVar(0)
+ _rawselect(dbmap, &persons, "select * from person_test where id = "+bindVar, p1.Id)
+ if persons[0].LName != "postget" {
+ t.Errorf("p1.PostGet() didn't run after select: %v", p1)
+ }
+
+ _del(dbmap, p1)
+ if p1.FName != "predelete" {
+ t.Errorf("p1.PreDelete() didn't run: %v", p1)
+ } else if p1.LName != "postdelete" {
+ t.Errorf("p1.PostDelete() didn't run: %v", p1)
+ }
+
+ // Test error case
+ p2 := &Person{0, 0, 0, "badname", "", 0}
+ err := dbmap.Insert(p2)
+ if err == nil {
+ t.Errorf("p2.PreInsert() didn't return an error")
+ }
+}
+
+func TestTransaction(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ inv1 := &Invoice{0, 100, 200, "t1", 0, true}
+ inv2 := &Invoice{0, 100, 200, "t2", 0, false}
+
+ trans, err := dbmap.Begin()
+ if err != nil {
+ panic(err)
+ }
+ trans.Insert(inv1, inv2)
+ err = trans.Commit()
+ if err != nil {
+ panic(err)
+ }
+
+ obj, err := dbmap.Get(Invoice{}, inv1.Id)
+ if err != nil {
+ panic(err)
+ }
+ if !reflect.DeepEqual(inv1, obj) {
+ t.Errorf("%v != %v", inv1, obj)
+ }
+ obj, err = dbmap.Get(Invoice{}, inv2.Id)
+ if err != nil {
+ panic(err)
+ }
+ if !reflect.DeepEqual(inv2, obj) {
+ t.Errorf("%v != %v", inv2, obj)
+ }
+}
+
+func TestSavepoint(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ inv1 := &Invoice{0, 100, 200, "unpaid", 0, false}
+
+ trans, err := dbmap.Begin()
+ if err != nil {
+ panic(err)
+ }
+ trans.Insert(inv1)
+
+ var checkMemo = func(want string) {
+ memo, err := trans.SelectStr("select memo from invoice_test")
+ if err != nil {
+ panic(err)
+ }
+ if memo != want {
+ t.Errorf("%q != %q", want, memo)
+ }
+ }
+ checkMemo("unpaid")
+
+ err = trans.Savepoint("foo")
+ if err != nil {
+ panic(err)
+ }
+ checkMemo("unpaid")
+
+ inv1.Memo = "paid"
+ _, err = trans.Update(inv1)
+ if err != nil {
+ panic(err)
+ }
+ checkMemo("paid")
+
+ err = trans.RollbackToSavepoint("foo")
+ if err != nil {
+ panic(err)
+ }
+ checkMemo("unpaid")
+
+ err = trans.Rollback()
+ if err != nil {
+ panic(err)
+ }
+}
+
+func TestMultiple(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ inv1 := &Invoice{0, 100, 200, "a", 0, false}
+ inv2 := &Invoice{0, 100, 200, "b", 0, true}
+ _insert(dbmap, inv1, inv2)
+
+ inv1.Memo = "c"
+ inv2.Memo = "d"
+ _update(dbmap, inv1, inv2)
+
+ count := _del(dbmap, inv1, inv2)
+ if count != 2 {
+ t.Errorf("%d != 2", count)
+ }
+}
+
+func TestCrud(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ inv := &Invoice{0, 100, 200, "first order", 0, true}
+ testCrudInternal(t, dbmap, inv)
+
+ invtag := &InvoiceTag{0, 300, 400, "some order", 33, false}
+ testCrudInternal(t, dbmap, invtag)
+
+ foo := &AliasTransientField{BarStr: "some bar"}
+ testCrudInternal(t, dbmap, foo)
+}
+
+func testCrudInternal(t *testing.T, dbmap *DbMap, val testable) {
+ table, _, err := dbmap.tableForPointer(val, false)
+ if err != nil {
+ t.Errorf("couldn't call TableFor: val=%v err=%v", val, err)
+ }
+
+ _, err = dbmap.Exec("delete from " + table.TableName)
+ if err != nil {
+ t.Errorf("couldn't delete rows from: val=%v err=%v", val, err)
+ }
+
+ // INSERT row
+ _insert(dbmap, val)
+ if val.GetId() == 0 {
+ t.Errorf("val.GetId() was not set on INSERT")
+ return
+ }
+
+ // SELECT row
+ val2 := _get(dbmap, val, val.GetId())
+ if !reflect.DeepEqual(val, val2) {
+ t.Errorf("%v != %v", val, val2)
+ }
+
+ // UPDATE row and SELECT
+ val.Rand()
+ count := _update(dbmap, val)
+ if count != 1 {
+ t.Errorf("update 1 != %d", count)
+ }
+ val2 = _get(dbmap, val, val.GetId())
+ if !reflect.DeepEqual(val, val2) {
+ t.Errorf("%v != %v", val, val2)
+ }
+
+ // Select *
+ rows, err := dbmap.Select(val, "select * from "+table.TableName)
+ if err != nil {
+ t.Errorf("couldn't select * from %s err=%v", table.TableName, err)
+ } else if len(rows) != 1 {
+ t.Errorf("unexpected row count in %s: %d", table.TableName, len(rows))
+ } else if !reflect.DeepEqual(val, rows[0]) {
+ t.Errorf("select * result: %v != %v", val, rows[0])
+ }
+
+ // DELETE row
+ deleted := _del(dbmap, val)
+ if deleted != 1 {
+ t.Errorf("Did not delete row with Id: %d", val.GetId())
+ return
+ }
+
+ // VERIFY deleted
+ val2 = _get(dbmap, val, val.GetId())
+ if val2 != nil {
+ t.Errorf("Found invoice with id: %d after Delete()", val.GetId())
+ }
+}
+
+func TestWithIgnoredColumn(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ ic := &WithIgnoredColumn{-1, 0, 1}
+ _insert(dbmap, ic)
+ expected := &WithIgnoredColumn{0, 1, 1}
+ ic2 := _get(dbmap, WithIgnoredColumn{}, ic.Id).(*WithIgnoredColumn)
+
+ if !reflect.DeepEqual(expected, ic2) {
+ t.Errorf("%v != %v", expected, ic2)
+ }
+ if _del(dbmap, ic) != 1 {
+ t.Errorf("Did not delete row with Id: %d", ic.Id)
+ return
+ }
+ if _get(dbmap, WithIgnoredColumn{}, ic.Id) != nil {
+ t.Errorf("Found id: %d after Delete()", ic.Id)
+ }
+}
+
+func TestTypeConversionExample(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ p := Person{FName: "Bob", LName: "Smith"}
+ tc := &TypeConversionExample{-1, p, CustomStringType("hi")}
+ _insert(dbmap, tc)
+
+ expected := &TypeConversionExample{1, p, CustomStringType("hi")}
+ tc2 := _get(dbmap, TypeConversionExample{}, tc.Id).(*TypeConversionExample)
+ if !reflect.DeepEqual(expected, tc2) {
+ t.Errorf("tc2 %v != %v", expected, tc2)
+ }
+
+ tc2.Name = CustomStringType("hi2")
+ tc2.PersonJSON = Person{FName: "Jane", LName: "Doe"}
+ _update(dbmap, tc2)
+
+ expected = &TypeConversionExample{1, tc2.PersonJSON, CustomStringType("hi2")}
+ tc3 := _get(dbmap, TypeConversionExample{}, tc.Id).(*TypeConversionExample)
+ if !reflect.DeepEqual(expected, tc3) {
+ t.Errorf("tc3 %v != %v", expected, tc3)
+ }
+
+ if _del(dbmap, tc) != 1 {
+ t.Errorf("Did not delete row with Id: %d", tc.Id)
+ }
+
+}
+
+func TestWithEmbeddedStruct(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ es := &WithEmbeddedStruct{-1, Names{FirstName: "Alice", LastName: "Smith"}}
+ _insert(dbmap, es)
+ expected := &WithEmbeddedStruct{1, Names{FirstName: "Alice", LastName: "Smith"}}
+ es2 := _get(dbmap, WithEmbeddedStruct{}, es.Id).(*WithEmbeddedStruct)
+ if !reflect.DeepEqual(expected, es2) {
+ t.Errorf("%v != %v", expected, es2)
+ }
+
+ es2.FirstName = "Bob"
+ expected.FirstName = "Bob"
+ _update(dbmap, es2)
+ es2 = _get(dbmap, WithEmbeddedStruct{}, es.Id).(*WithEmbeddedStruct)
+ if !reflect.DeepEqual(expected, es2) {
+ t.Errorf("%v != %v", expected, es2)
+ }
+
+ ess := _rawselect(dbmap, WithEmbeddedStruct{}, "select * from embedded_struct_test")
+ if !reflect.DeepEqual(es2, ess[0]) {
+ t.Errorf("%v != %v", es2, ess[0])
+ }
+}
+
+func TestWithEmbeddedStructBeforeAutoincr(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ esba := &WithEmbeddedStructBeforeAutoincrField{Names: Names{FirstName: "Alice", LastName: "Smith"}}
+ _insert(dbmap, esba)
+ var expectedAutoincrId int64 = 1
+ if esba.Id != expectedAutoincrId {
+ t.Errorf("%d != %d", expectedAutoincrId, esba.Id)
+ }
+}
+
+func TestWithEmbeddedAutoincr(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ esa := &WithEmbeddedAutoincr{
+ WithEmbeddedStruct: WithEmbeddedStruct{Names: Names{FirstName: "Alice", LastName: "Smith"}},
+ MiddleName: "Rose",
+ }
+ _insert(dbmap, esa)
+ var expectedAutoincrId int64 = 1
+ if esa.Id != expectedAutoincrId {
+ t.Errorf("%d != %d", expectedAutoincrId, esa.Id)
+ }
+}
+
+func TestSelectVal(t *testing.T) {
+ dbmap := initDbMapNulls()
+ defer dropAndClose(dbmap)
+
+ bindVar := dbmap.Dialect.BindVar(0)
+
+ t1 := TableWithNull{Str: sql.NullString{"abc", true},
+ Int64: sql.NullInt64{78, true},
+ Float64: sql.NullFloat64{32.2, true},
+ Bool: sql.NullBool{true, true},
+ Bytes: []byte("hi")}
+ _insert(dbmap, &t1)
+
+ // SelectInt
+ i64 := selectInt(dbmap, "select Int64 from TableWithNull where Str='abc'")
+ if i64 != 78 {
+ t.Errorf("int64 %d != 78", i64)
+ }
+ i64 = selectInt(dbmap, "select count(*) from TableWithNull")
+ if i64 != 1 {
+ t.Errorf("int64 count %d != 1", i64)
+ }
+ i64 = selectInt(dbmap, "select count(*) from TableWithNull where Str="+bindVar, "asdfasdf")
+ if i64 != 0 {
+ t.Errorf("int64 no rows %d != 0", i64)
+ }
+
+ // SelectNullInt
+ n := selectNullInt(dbmap, "select Int64 from TableWithNull where Str='notfound'")
+ if !reflect.DeepEqual(n, sql.NullInt64{0, false}) {
+ t.Errorf("nullint %v != 0,false", n)
+ }
+
+ n = selectNullInt(dbmap, "select Int64 from TableWithNull where Str='abc'")
+ if !reflect.DeepEqual(n, sql.NullInt64{78, true}) {
+ t.Errorf("nullint %v != 78, true", n)
+ }
+
+ // SelectFloat
+ f64 := selectFloat(dbmap, "select Float64 from TableWithNull where Str='abc'")
+ if f64 != 32.2 {
+ t.Errorf("float64 %d != 32.2", f64)
+ }
+ f64 = selectFloat(dbmap, "select min(Float64) from TableWithNull")
+ if f64 != 32.2 {
+ t.Errorf("float64 min %d != 32.2", f64)
+ }
+ f64 = selectFloat(dbmap, "select count(*) from TableWithNull where Str="+bindVar, "asdfasdf")
+ if f64 != 0 {
+ t.Errorf("float64 no rows %d != 0", f64)
+ }
+
+ // SelectNullFloat
+ nf := selectNullFloat(dbmap, "select Float64 from TableWithNull where Str='notfound'")
+ if !reflect.DeepEqual(nf, sql.NullFloat64{0, false}) {
+ t.Errorf("nullfloat %v != 0,false", nf)
+ }
+
+ nf = selectNullFloat(dbmap, "select Float64 from TableWithNull where Str='abc'")
+ if !reflect.DeepEqual(nf, sql.NullFloat64{32.2, true}) {
+ t.Errorf("nullfloat %v != 32.2, true", nf)
+ }
+
+ // SelectStr
+ s := selectStr(dbmap, "select Str from TableWithNull where Int64="+bindVar, 78)
+ if s != "abc" {
+ t.Errorf("s %s != abc", s)
+ }
+ s = selectStr(dbmap, "select Str from TableWithNull where Str='asdfasdf'")
+ if s != "" {
+ t.Errorf("s no rows %s != ''", s)
+ }
+
+ // SelectNullStr
+ ns := selectNullStr(dbmap, "select Str from TableWithNull where Int64="+bindVar, 78)
+ if !reflect.DeepEqual(ns, sql.NullString{"abc", true}) {
+ t.Errorf("nullstr %v != abc,true", ns)
+ }
+ ns = selectNullStr(dbmap, "select Str from TableWithNull where Str='asdfasdf'")
+ if !reflect.DeepEqual(ns, sql.NullString{"", false}) {
+ t.Errorf("nullstr no rows %v != '',false", ns)
+ }
+
+ // SelectInt/Str with named parameters
+ i64 = selectInt(dbmap, "select Int64 from TableWithNull where Str=:abc", map[string]string{"abc": "abc"})
+ if i64 != 78 {
+ t.Errorf("int64 %d != 78", i64)
+ }
+ ns = selectNullStr(dbmap, "select Str from TableWithNull where Int64=:num", map[string]int{"num": 78})
+ if !reflect.DeepEqual(ns, sql.NullString{"abc", true}) {
+ t.Errorf("nullstr %v != abc,true", ns)
+ }
+}
+
+func TestVersionMultipleRows(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ persons := []*Person{
+ &Person{0, 0, 0, "Bob", "Smith", 0},
+ &Person{0, 0, 0, "Jane", "Smith", 0},
+ &Person{0, 0, 0, "Mike", "Smith", 0},
+ }
+
+ _insert(dbmap, persons[0], persons[1], persons[2])
+
+ for x, p := range persons {
+ if p.Version != 1 {
+ t.Errorf("person[%d].Version != 1: %d", x, p.Version)
+ }
+ }
+}
+
+func TestWithStringPk(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ dbmap.AddTableWithName(WithStringPk{}, "string_pk_test").SetKeys(true, "Id")
+ _, err := dbmap.Exec("create table string_pk_test (Id varchar(255), Name varchar(255));")
+ if err != nil {
+ t.Errorf("couldn't create string_pk_test: %v", err)
+ }
+ defer dropAndClose(dbmap)
+
+ row := &WithStringPk{"1", "foo"}
+ err = dbmap.Insert(row)
+ if err == nil {
+ t.Errorf("Expected error when inserting into table w/non Int PK and autoincr set true")
+ }
+}
+
+// TestSqlExecutorInterfaceSelects ensures that all DbMap methods starting with Select...
+// are also exposed in the SqlExecutor interface. Select... functions can always
+// run on Pre/Post hooks.
+func TestSqlExecutorInterfaceSelects(t *testing.T) {
+ dbMapType := reflect.TypeOf(&DbMap{})
+ sqlExecutorType := reflect.TypeOf((*SqlExecutor)(nil)).Elem()
+ numDbMapMethods := dbMapType.NumMethod()
+ for i := 0; i < numDbMapMethods; i += 1 {
+ dbMapMethod := dbMapType.Method(i)
+ if !strings.HasPrefix(dbMapMethod.Name, "Select") {
+ continue
+ }
+ if _, found := sqlExecutorType.MethodByName(dbMapMethod.Name); !found {
+ t.Errorf("Method %s is defined on DbMap but not implemented in SqlExecutor",
+ dbMapMethod.Name)
+ }
+ }
+}
+
+type WithTime struct {
+ Id int64
+ Time time.Time
+}
+
+type Times struct {
+ One time.Time
+ Two time.Time
+}
+
+type EmbeddedTime struct {
+ Id string
+ Times
+}
+
+func parseTimeOrPanic(format, date string) time.Time {
+ t1, err := time.Parse(format, date)
+ if err != nil {
+ panic(err)
+ }
+ return t1
+}
+
+// TODO: re-enable next two tests when this is merged:
+// https://github.com/ziutek/mymysql/pull/77
+//
+// This test currently fails w/MySQL b/c tz info is lost
+func testWithTime(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ t1 := parseTimeOrPanic("2006-01-02 15:04:05 -0700 MST",
+ "2013-08-09 21:30:43 +0800 CST")
+ w1 := WithTime{1, t1}
+ _insert(dbmap, &w1)
+
+ obj := _get(dbmap, WithTime{}, w1.Id)
+ w2 := obj.(*WithTime)
+ if w1.Time.UnixNano() != w2.Time.UnixNano() {
+ t.Errorf("%v != %v", w1, w2)
+ }
+}
+
+// See: https://github.com/coopernurse/gorp/issues/86
+func testEmbeddedTime(t *testing.T) {
+ dbmap := newDbMap()
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ dbmap.AddTable(EmbeddedTime{}).SetKeys(false, "Id")
+ defer dropAndClose(dbmap)
+ err := dbmap.CreateTables()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time1 := parseTimeOrPanic("2006-01-02 15:04:05", "2013-08-09 21:30:43")
+
+ t1 := &EmbeddedTime{Id: "abc", Times: Times{One: time1, Two: time1.Add(10 * time.Second)}}
+ _insert(dbmap, t1)
+
+ x := _get(dbmap, EmbeddedTime{}, t1.Id)
+ t2, _ := x.(*EmbeddedTime)
+ if t1.One.UnixNano() != t2.One.UnixNano() || t1.Two.UnixNano() != t2.Two.UnixNano() {
+ t.Errorf("%v != %v", t1, t2)
+ }
+}
+
+func TestWithTimeSelect(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ halfhourago := time.Now().UTC().Add(-30 * time.Minute)
+
+ w1 := WithTime{1, halfhourago.Add(time.Minute * -1)}
+ w2 := WithTime{2, halfhourago.Add(time.Second)}
+ _insert(dbmap, &w1, &w2)
+
+ var caseIds []int64
+ _, err := dbmap.Select(&caseIds, "SELECT id FROM time_test WHERE Time < "+dbmap.Dialect.BindVar(0), halfhourago)
+
+ if err != nil {
+ t.Error(err)
+ }
+ if len(caseIds) != 1 {
+ t.Errorf("%d != 1", len(caseIds))
+ }
+ if caseIds[0] != w1.Id {
+ t.Errorf("%d != %d", caseIds[0], w1.Id)
+ }
+}
+
+func TestInvoicePersonView(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ // Create some rows
+ p1 := &Person{0, 0, 0, "bob", "smith", 0}
+ dbmap.Insert(p1)
+
+ // notice how we can wire up p1.Id to the invoice easily
+ inv1 := &Invoice{0, 0, 0, "xmas order", p1.Id, false}
+ dbmap.Insert(inv1)
+
+ // Run your query
+ query := "select i.Id InvoiceId, p.Id PersonId, i.Memo, p.FName " +
+ "from invoice_test i, person_test p " +
+ "where i.PersonId = p.Id"
+
+ // pass a slice of pointers to Select()
+ // this avoids the need to type assert after the query is run
+ var list []*InvoicePersonView
+ _, err := dbmap.Select(&list, query)
+ if err != nil {
+ panic(err)
+ }
+
+ // this should test true
+ expected := &InvoicePersonView{inv1.Id, p1.Id, inv1.Memo, p1.FName, 0}
+ if !reflect.DeepEqual(list[0], expected) {
+ t.Errorf("%v != %v", list[0], expected)
+ }
+}
+
+func TestQuoteTableNames(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ quotedTableName := dbmap.Dialect.QuoteField("person_test")
+
+ // Use a buffer to hold the log to check generated queries
+ logBuffer := &bytes.Buffer{}
+ dbmap.TraceOn("", log.New(logBuffer, "gorptest:", log.Lmicroseconds))
+
+ // Create some rows
+ p1 := &Person{0, 0, 0, "bob", "smith", 0}
+ errorTemplate := "Expected quoted table name %v in query but didn't find it"
+
+ // Check if Insert quotes the table name
+ id := dbmap.Insert(p1)
+ if !bytes.Contains(logBuffer.Bytes(), []byte(quotedTableName)) {
+ t.Errorf(errorTemplate, quotedTableName)
+ }
+ logBuffer.Reset()
+
+ // Check if Get quotes the table name
+ dbmap.Get(Person{}, id)
+ if !bytes.Contains(logBuffer.Bytes(), []byte(quotedTableName)) {
+ t.Errorf(errorTemplate, quotedTableName)
+ }
+ logBuffer.Reset()
+}
+
+func TestSelectTooManyCols(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ p1 := &Person{0, 0, 0, "bob", "smith", 0}
+ p2 := &Person{0, 0, 0, "jane", "doe", 0}
+ _insert(dbmap, p1)
+ _insert(dbmap, p2)
+
+ obj := _get(dbmap, Person{}, p1.Id)
+ p1 = obj.(*Person)
+ obj = _get(dbmap, Person{}, p2.Id)
+ p2 = obj.(*Person)
+
+ params := map[string]interface{}{
+ "Id": p1.Id,
+ }
+
+ var p3 FNameOnly
+ err := dbmap.SelectOne(&p3, "select * from person_test where Id=:Id", params)
+ if err != nil {
+ if !NonFatalError(err) {
+ t.Error(err)
+ }
+ } else {
+ t.Errorf("Non-fatal error expected")
+ }
+
+ if p1.FName != p3.FName {
+ t.Errorf("%v != %v", p1.FName, p3.FName)
+ }
+
+ var pSlice []FNameOnly
+ _, err = dbmap.Select(&pSlice, "select * from person_test order by fname asc")
+ if err != nil {
+ if !NonFatalError(err) {
+ t.Error(err)
+ }
+ } else {
+ t.Errorf("Non-fatal error expected")
+ }
+
+ if p1.FName != pSlice[0].FName {
+ t.Errorf("%v != %v", p1.FName, pSlice[0].FName)
+ }
+ if p2.FName != pSlice[1].FName {
+ t.Errorf("%v != %v", p2.FName, pSlice[1].FName)
+ }
+}
+
+func TestSelectSingleVal(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ p1 := &Person{0, 0, 0, "bob", "smith", 0}
+ _insert(dbmap, p1)
+
+ obj := _get(dbmap, Person{}, p1.Id)
+ p1 = obj.(*Person)
+
+ params := map[string]interface{}{
+ "Id": p1.Id,
+ }
+
+ var p2 Person
+ err := dbmap.SelectOne(&p2, "select * from person_test where Id=:Id", params)
+ if err != nil {
+ t.Error(err)
+ }
+
+ if !reflect.DeepEqual(p1, &p2) {
+ t.Errorf("%v != %v", p1, &p2)
+ }
+
+ // verify SelectOne allows non-struct holders
+ var s string
+ err = dbmap.SelectOne(&s, "select FName from person_test where Id=:Id", params)
+ if err != nil {
+ t.Error(err)
+ }
+ if s != "bob" {
+ t.Error("Expected bob but got: " + s)
+ }
+
+ // verify SelectOne requires pointer receiver
+ err = dbmap.SelectOne(s, "select FName from person_test where Id=:Id", params)
+ if err == nil {
+ t.Error("SelectOne should have returned error for non-pointer holder")
+ }
+
+ // verify SelectOne works with uninitialized pointers
+ var p3 *Person
+ err = dbmap.SelectOne(&p3, "select * from person_test where Id=:Id", params)
+ if err != nil {
+ t.Error(err)
+ }
+
+ if !reflect.DeepEqual(p1, p3) {
+ t.Errorf("%v != %v", p1, p3)
+ }
+
+ // verify that the receiver is still nil if nothing was found
+ var p4 *Person
+ dbmap.SelectOne(&p3, "select * from person_test where 2<1 AND Id=:Id", params)
+ if p4 != nil {
+ t.Error("SelectOne should not have changed a nil receiver when no rows were found")
+ }
+
+ // verify that the error is set to sql.ErrNoRows if not found
+ err = dbmap.SelectOne(&p2, "select * from person_test where Id=:Id", map[string]interface{}{
+ "Id": -2222,
+ })
+ if err == nil || err != sql.ErrNoRows {
+ t.Error("SelectOne should have returned an sql.ErrNoRows")
+ }
+
+ _insert(dbmap, &Person{0, 0, 0, "bob", "smith", 0})
+ err = dbmap.SelectOne(&p2, "select * from person_test where Fname='bob'")
+ if err == nil {
+ t.Error("Expected error when two rows found")
+ }
+
+ // tests for #150
+ var tInt int64
+ var tStr string
+ var tBool bool
+ var tFloat float64
+ primVals := []interface{}{tInt, tStr, tBool, tFloat}
+ for _, prim := range primVals {
+ err = dbmap.SelectOne(&prim, "select * from person_test where Id=-123")
+ if err == nil || err != sql.ErrNoRows {
+ t.Error("primVals: SelectOne should have returned sql.ErrNoRows")
+ }
+ }
+}
+
+func TestSelectAlias(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ p1 := &IdCreatedExternal{IdCreated: IdCreated{Id: 1, Created: 3}, External: 2}
+
+ // Insert using embedded IdCreated, which reflects the structure of the table
+ _insert(dbmap, &p1.IdCreated)
+
+ // Select into IdCreatedExternal type, which includes some fields not present
+ // in id_created_test
+ var p2 IdCreatedExternal
+ err := dbmap.SelectOne(&p2, "select * from id_created_test where Id=1")
+ if err != nil {
+ t.Error(err)
+ }
+ if p2.Id != 1 || p2.Created != 3 || p2.External != 0 {
+ t.Error("Expected ignored field defaults to not set")
+ }
+
+ // Prove that we can supply an aliased value in the select, and that it will
+ // automatically map to IdCreatedExternal.External
+ err = dbmap.SelectOne(&p2, "SELECT *, 1 AS external FROM id_created_test")
+ if err != nil {
+ t.Error(err)
+ }
+ if p2.External != 1 {
+ t.Error("Expected select as can map to exported field.")
+ }
+
+ var rows *sql.Rows
+ var cols []string
+ rows, err = dbmap.Db.Query("SELECT * FROM id_created_test")
+ cols, err = rows.Columns()
+ if err != nil || len(cols) != 2 {
+ t.Error("Expected ignored column not created")
+ }
+}
+
+func TestMysqlPanicIfDialectNotInitialized(t *testing.T) {
+ _, driver := dialectAndDriver()
+ // this test only applies to MySQL
+ if os.Getenv("GORP_TEST_DIALECT") != "mysql" {
+ return
+ }
+
+ // The expected behaviour is to catch a panic.
+ // Here is the deferred function which will check if a panic has indeed occurred :
+ defer func() {
+ r := recover()
+ if r == nil {
+ t.Error("db.CreateTables() should panic if db is initialized with an incorrect MySQLDialect")
+ }
+ }()
+
+ // invalid MySQLDialect : does not contain Engine or Encoding specification
+ dialect := MySQLDialect{}
+ db := &DbMap{Db: connect(driver), Dialect: dialect}
+ db.AddTableWithName(Invoice{}, "invoice")
+ // the following call should panic :
+ db.CreateTables()
+}
+
+func TestSingleColumnKeyDbReturnsZeroRowsUpdatedOnPKChange(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+ dbmap.AddTableWithName(SingleColumnTable{}, "single_column_table").SetKeys(false, "SomeId")
+ err := dbmap.DropTablesIfExists()
+ if err != nil {
+ t.Error("Drop tables failed")
+ }
+ err = dbmap.CreateTablesIfNotExists()
+ if err != nil {
+ t.Error("Create tables failed")
+ }
+ err = dbmap.TruncateTables()
+ if err != nil {
+ t.Error("Truncate tables failed")
+ }
+
+ sct := SingleColumnTable{
+ SomeId: "A Unique Id String",
+ }
+
+ count, err := dbmap.Update(&sct)
+ if err != nil {
+ t.Error(err)
+ }
+ if count != 0 {
+ t.Errorf("Expected 0 updated rows, got %d", count)
+ }
+
+}
+
+func TestPrepare(t *testing.T) {
+ dbmap := initDbMap()
+ defer dropAndClose(dbmap)
+
+ inv1 := &Invoice{0, 100, 200, "prepare-foo", 0, false}
+ inv2 := &Invoice{0, 100, 200, "prepare-bar", 0, false}
+ _insert(dbmap, inv1, inv2)
+
+ bindVar0 := dbmap.Dialect.BindVar(0)
+ bindVar1 := dbmap.Dialect.BindVar(1)
+ stmt, err := dbmap.Prepare(fmt.Sprintf("UPDATE invoice_test SET Memo=%s WHERE Id=%s", bindVar0, bindVar1))
+ if err != nil {
+ t.Error(err)
+ }
+ defer stmt.Close()
+ _, err = stmt.Exec("prepare-baz", inv1.Id)
+ if err != nil {
+ t.Error(err)
+ }
+ err = dbmap.SelectOne(inv1, "SELECT * from invoice_test WHERE Memo='prepare-baz'")
+ if err != nil {
+ t.Error(err)
+ }
+
+ trans, err := dbmap.Begin()
+ if err != nil {
+ t.Error(err)
+ }
+ transStmt, err := trans.Prepare(fmt.Sprintf("UPDATE invoice_test SET IsPaid=%s WHERE Id=%s", bindVar0, bindVar1))
+ if err != nil {
+ t.Error(err)
+ }
+ defer transStmt.Close()
+ _, err = transStmt.Exec(true, inv2.Id)
+ if err != nil {
+ t.Error(err)
+ }
+ err = dbmap.SelectOne(inv2, fmt.Sprintf("SELECT * from invoice_test WHERE IsPaid=%s", bindVar0), true)
+ if err == nil || err != sql.ErrNoRows {
+ t.Error("SelectOne should have returned an sql.ErrNoRows")
+ }
+ err = trans.SelectOne(inv2, fmt.Sprintf("SELECT * from invoice_test WHERE IsPaid=%s", bindVar0), true)
+ if err != nil {
+ t.Error(err)
+ }
+ err = trans.Commit()
+ if err != nil {
+ t.Error(err)
+ }
+ err = dbmap.SelectOne(inv2, fmt.Sprintf("SELECT * from invoice_test WHERE IsPaid=%s", bindVar0), true)
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+func BenchmarkNativeCrud(b *testing.B) {
+ b.StopTimer()
+ dbmap := initDbMapBench()
+ defer dropAndClose(dbmap)
+ b.StartTimer()
+
+ insert := "insert into invoice_test (Created, Updated, Memo, PersonId) values (?, ?, ?, ?)"
+ sel := "select Id, Created, Updated, Memo, PersonId from invoice_test where Id=?"
+ update := "update invoice_test set Created=?, Updated=?, Memo=?, PersonId=? where Id=?"
+ delete := "delete from invoice_test where Id=?"
+
+ inv := &Invoice{0, 100, 200, "my memo", 0, false}
+
+ for i := 0; i < b.N; i++ {
+ res, err := dbmap.Db.Exec(insert, inv.Created, inv.Updated,
+ inv.Memo, inv.PersonId)
+ if err != nil {
+ panic(err)
+ }
+
+ newid, err := res.LastInsertId()
+ if err != nil {
+ panic(err)
+ }
+ inv.Id = newid
+
+ row := dbmap.Db.QueryRow(sel, inv.Id)
+ err = row.Scan(&inv.Id, &inv.Created, &inv.Updated, &inv.Memo,
+ &inv.PersonId)
+ if err != nil {
+ panic(err)
+ }
+
+ inv.Created = 1000
+ inv.Updated = 2000
+ inv.Memo = "my memo 2"
+ inv.PersonId = 3000
+
+ _, err = dbmap.Db.Exec(update, inv.Created, inv.Updated, inv.Memo,
+ inv.PersonId, inv.Id)
+ if err != nil {
+ panic(err)
+ }
+
+ _, err = dbmap.Db.Exec(delete, inv.Id)
+ if err != nil {
+ panic(err)
+ }
+ }
+
+}
+
+func BenchmarkGorpCrud(b *testing.B) {
+ b.StopTimer()
+ dbmap := initDbMapBench()
+ defer dropAndClose(dbmap)
+ b.StartTimer()
+
+ inv := &Invoice{0, 100, 200, "my memo", 0, true}
+ for i := 0; i < b.N; i++ {
+ err := dbmap.Insert(inv)
+ if err != nil {
+ panic(err)
+ }
+
+ obj, err := dbmap.Get(Invoice{}, inv.Id)
+ if err != nil {
+ panic(err)
+ }
+
+ inv2, ok := obj.(*Invoice)
+ if !ok {
+ panic(fmt.Sprintf("expected *Invoice, got: %v", obj))
+ }
+
+ inv2.Created = 1000
+ inv2.Updated = 2000
+ inv2.Memo = "my memo 2"
+ inv2.PersonId = 3000
+ _, err = dbmap.Update(inv2)
+ if err != nil {
+ panic(err)
+ }
+
+ _, err = dbmap.Delete(inv2)
+ if err != nil {
+ panic(err)
+ }
+
+ }
+}
+
+func initDbMapBench() *DbMap {
+ dbmap := newDbMap()
+ dbmap.Db.Exec("drop table if exists invoice_test")
+ dbmap.AddTableWithName(Invoice{}, "invoice_test").SetKeys(true, "Id")
+ err := dbmap.CreateTables()
+ if err != nil {
+ panic(err)
+ }
+ return dbmap
+}
+
+func initDbMap() *DbMap {
+ dbmap := newDbMap()
+ dbmap.AddTableWithName(Invoice{}, "invoice_test").SetKeys(true, "Id")
+ dbmap.AddTableWithName(InvoiceTag{}, "invoice_tag_test").SetKeys(true, "myid")
+ dbmap.AddTableWithName(AliasTransientField{}, "alias_trans_field_test").SetKeys(true, "id")
+ dbmap.AddTableWithName(OverriddenInvoice{}, "invoice_override_test").SetKeys(false, "Id")
+ dbmap.AddTableWithName(Person{}, "person_test").SetKeys(true, "Id")
+ dbmap.AddTableWithName(WithIgnoredColumn{}, "ignored_column_test").SetKeys(true, "Id")
+ dbmap.AddTableWithName(IdCreated{}, "id_created_test").SetKeys(true, "Id")
+ dbmap.AddTableWithName(TypeConversionExample{}, "type_conv_test").SetKeys(true, "Id")
+ dbmap.AddTableWithName(WithEmbeddedStruct{}, "embedded_struct_test").SetKeys(true, "Id")
+ dbmap.AddTableWithName(WithEmbeddedStructBeforeAutoincrField{}, "embedded_struct_before_autoincr_test").SetKeys(true, "Id")
+ dbmap.AddTableWithName(WithEmbeddedAutoincr{}, "embedded_autoincr_test").SetKeys(true, "Id")
+ dbmap.AddTableWithName(WithTime{}, "time_test").SetKeys(true, "Id")
+ dbmap.TypeConverter = testTypeConverter{}
+ err := dbmap.DropTablesIfExists()
+ if err != nil {
+ panic(err)
+ }
+ err = dbmap.CreateTables()
+ if err != nil {
+ panic(err)
+ }
+
+ // See #146 and TestSelectAlias - this type is mapped to the same
+ // table as IdCreated, but includes an extra field that isn't in the table
+ dbmap.AddTableWithName(IdCreatedExternal{}, "id_created_test").SetKeys(true, "Id")
+
+ return dbmap
+}
+
+func initDbMapNulls() *DbMap {
+ dbmap := newDbMap()
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ dbmap.AddTable(TableWithNull{}).SetKeys(false, "Id")
+ err := dbmap.CreateTables()
+ if err != nil {
+ panic(err)
+ }
+ return dbmap
+}
+
+func newDbMap() *DbMap {
+ dialect, driver := dialectAndDriver()
+ dbmap := &DbMap{Db: connect(driver), Dialect: dialect}
+ dbmap.TraceOn("", log.New(os.Stdout, "gorptest: ", log.Lmicroseconds))
+ return dbmap
+}
+
+func dropAndClose(dbmap *DbMap) {
+ dbmap.DropTablesIfExists()
+ dbmap.Db.Close()
+}
+
+func connect(driver string) *sql.DB {
+ dsn := os.Getenv("GORP_TEST_DSN")
+ if dsn == "" {
+ panic("GORP_TEST_DSN env variable is not set. Please see README.md")
+ }
+
+ db, err := sql.Open(driver, dsn)
+ if err != nil {
+ panic("Error connecting to db: " + err.Error())
+ }
+ return db
+}
+
+func dialectAndDriver() (Dialect, string) {
+ switch os.Getenv("GORP_TEST_DIALECT") {
+ case "mysql":
+ return MySQLDialect{"InnoDB", "UTF8"}, "mymysql"
+ case "gomysql":
+ return MySQLDialect{"InnoDB", "UTF8"}, "mysql"
+ case "postgres":
+ return PostgresDialect{}, "postgres"
+ case "sqlite":
+ return SqliteDialect{}, "sqlite3"
+ }
+ panic("GORP_TEST_DIALECT env variable is not set or is invalid. Please see README.md")
+}
+
+func _insert(dbmap *DbMap, list ...interface{}) {
+ err := dbmap.Insert(list...)
+ if err != nil {
+ panic(err)
+ }
+}
+
+func _update(dbmap *DbMap, list ...interface{}) int64 {
+ count, err := dbmap.Update(list...)
+ if err != nil {
+ panic(err)
+ }
+ return count
+}
+
+func _del(dbmap *DbMap, list ...interface{}) int64 {
+ count, err := dbmap.Delete(list...)
+ if err != nil {
+ panic(err)
+ }
+
+ return count
+}
+
+func _get(dbmap *DbMap, i interface{}, keys ...interface{}) interface{} {
+ obj, err := dbmap.Get(i, keys...)
+ if err != nil {
+ panic(err)
+ }
+
+ return obj
+}
+
+func selectInt(dbmap *DbMap, query string, args ...interface{}) int64 {
+ i64, err := SelectInt(dbmap, query, args...)
+ if err != nil {
+ panic(err)
+ }
+
+ return i64
+}
+
+func selectNullInt(dbmap *DbMap, query string, args ...interface{}) sql.NullInt64 {
+ i64, err := SelectNullInt(dbmap, query, args...)
+ if err != nil {
+ panic(err)
+ }
+
+ return i64
+}
+
+func selectFloat(dbmap *DbMap, query string, args ...interface{}) float64 {
+ f64, err := SelectFloat(dbmap, query, args...)
+ if err != nil {
+ panic(err)
+ }
+
+ return f64
+}
+
+func selectNullFloat(dbmap *DbMap, query string, args ...interface{}) sql.NullFloat64 {
+ f64, err := SelectNullFloat(dbmap, query, args...)
+ if err != nil {
+ panic(err)
+ }
+
+ return f64
+}
+
+func selectStr(dbmap *DbMap, query string, args ...interface{}) string {
+ s, err := SelectStr(dbmap, query, args...)
+ if err != nil {
+ panic(err)
+ }
+
+ return s
+}
+
+func selectNullStr(dbmap *DbMap, query string, args ...interface{}) sql.NullString {
+ s, err := SelectNullStr(dbmap, query, args...)
+ if err != nil {
+ panic(err)
+ }
+
+ return s
+}
+
+func _rawexec(dbmap *DbMap, query string, args ...interface{}) sql.Result {
+ res, err := dbmap.Exec(query, args...)
+ if err != nil {
+ panic(err)
+ }
+ return res
+}
+
+func _rawselect(dbmap *DbMap, i interface{}, query string, args ...interface{}) []interface{} {
+ list, err := dbmap.Select(i, query, args...)
+ if err != nil {
+ panic(err)
+ }
+ return list
+}
diff --git a/vendor/gopkg.in/gorp.v1/test_all.sh b/vendor/gopkg.in/gorp.v1/test_all.sh
new file mode 100644
index 000000000..f870b39a3
--- /dev/null
+++ b/vendor/gopkg.in/gorp.v1/test_all.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# on macs, you may need to:
+# export GOBUILDFLAG=-ldflags -linkmode=external
+
+set -e
+
+export GORP_TEST_DSN=gorptest/gorptest/gorptest
+export GORP_TEST_DIALECT=mysql
+go test $GOBUILDFLAG .
+
+export GORP_TEST_DSN=gorptest:gorptest@/gorptest
+export GORP_TEST_DIALECT=gomysql
+go test $GOBUILDFLAG .
+
+export GORP_TEST_DSN="user=gorptest password=gorptest dbname=gorptest sslmode=disable"
+export GORP_TEST_DIALECT=postgres
+go test $GOBUILDFLAG .
+
+export GORP_TEST_DSN=/tmp/gorptest.bin
+export GORP_TEST_DIALECT=sqlite
+go test $GOBUILDFLAG .
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/.gitignore b/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/.gitignore
deleted file mode 100644
index daf913b1b..000000000
--- a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.prof
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/.travis.yml b/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/.travis.yml
deleted file mode 100644
index d8545ccac..000000000
--- a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: go
-
-notificaitons:
- email:
- recipients: bluesuncorp01@gmail.com
- on_success: change
- on_failure: always
-
-before_script:
-- go get gopkg.in/check.v1
-
-go:
- - 1.2
- - 1.3
- - 1.4
- - tip
\ No newline at end of file
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/README.md b/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/README.md
deleted file mode 100644
index 7704f4d88..000000000
--- a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/README.md
+++ /dev/null
@@ -1,43 +0,0 @@
-Package go-validate-yourself
-================
-[](https://travis-ci.org/bluesuncorp/go-validate-yourself)
-[](https://godoc.org/gopkg.in/bluesuncorp/go-validate-yourself.v4)
-
-Package validator implements value validations for structs and individual fields based on tags.
-
-Installation
-============
-
-Just use go get.
-
- go get gopkg.in/bluesuncorp/go-validate-yourself.v4
-
-or to update
-
- go get -u gopkg.in/bluesuncorp/go-validate-yourself.v4
-
-And then just import the package into your own code.
-
- import "gopkg.in/bluesuncorp/go-validate-yourself.v4"
-
-Usage
-=====
-
-Please see http://godoc.org/gopkg.in/bluesuncorp/go-validate-yourself.v4 for detailed usage docs.
-
-Contributing
-============
-
-There will be a development branch for each version of this package i.e. v1-development, please
-make your pull requests against those branches.
-
-If changes are breaking please create an issue, for discussion and create a pull request against
-the highest development branch for example this package has a v1 and v1-development branch
-however, there will also be a v2-development brach even though v2 doesn't exist yet.
-
-I strongly encourage everyone whom creates a custom validation function to contribute them and
-help make this package even better.
-
-License
-=======
-Distributed under MIT License, please see license file in code for more details.
\ No newline at end of file
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/regexes.go b/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/regexes.go
deleted file mode 100644
index 8107a2160..000000000
--- a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/regexes.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package validator
-
-import "regexp"
-
-const (
- alphaRegexString = "^[a-zA-Z]+$"
- alphaNumericRegexString = "^[a-zA-Z0-9]+$"
- numericRegexString = "^[-+]?[0-9]+(?:\\.[0-9]+)?$"
- numberRegexString = "^[0-9]+$"
- hexadecimalRegexString = "^[0-9a-fA-F]+$"
- hexcolorRegexString = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
- rgbRegexString = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$"
- rgbaRegexString = "^rgba\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*((0.[1-9]*)|[01])\\s*\\)$"
- hslRegexString = "^hsl\\(\\s*(0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*\\)$"
- hslaRegexString = "^hsla\\(\\s*(0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*,\\s*((0.[1-9]*)|[01])\\s*\\)$"
- emailRegexString = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
-)
-
-var (
- alphaRegex = regexp.MustCompile(alphaRegexString)
- alphaNumericRegex = regexp.MustCompile(alphaNumericRegexString)
- numericRegex = regexp.MustCompile(numericRegexString)
- numberRegex = regexp.MustCompile(numberRegexString)
- hexadecimalRegex = regexp.MustCompile(hexadecimalRegexString)
- hexcolorRegex = regexp.MustCompile(hexcolorRegexString)
- rgbRegex = regexp.MustCompile(rgbRegexString)
- rgbaRegex = regexp.MustCompile(rgbaRegexString)
- hslRegex = regexp.MustCompile(hslRegexString)
- hslaRegex = regexp.MustCompile(hslaRegexString)
- emailRegex = regexp.MustCompile(emailRegexString)
-)
-
-func matchesRegex(regex *regexp.Regexp, field interface{}) bool {
- fieldAsString := field.(string) //this will panic inherently
- return regex.MatchString(fieldAsString)
-}
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/validator.go b/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/validator.go
deleted file mode 100644
index f8f2a3fdd..000000000
--- a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/validator.go
+++ /dev/null
@@ -1,375 +0,0 @@
-/**
- * Package validator
- *
- * MISC:
- * - anonymous structs - they don't have names so expect the Struct name within StructValidationErrors to be blank
- *
- */
-
-package validator
-
-import (
- "bytes"
- "errors"
- "fmt"
- "reflect"
- "strings"
- "time"
- "unicode"
-)
-
-const (
- tagSeparator = ","
- orSeparator = "|"
- noValidationTag = "-"
- tagKeySeparator = "="
- structOnlyTag = "structonly"
- omitempty = "omitempty"
- validationFieldErrMsg = "Field validation for \"%s\" failed on the \"%s\" tag\n"
- validationStructErrMsg = "Struct:%s\n"
-)
-
-// FieldValidationError contains a single field's validation error along
-// with other properties that may be needed for error message creation
-type FieldValidationError struct {
- Field string
- ErrorTag string
- Kind reflect.Kind
- Type reflect.Type
- Param string
- Value interface{}
-}
-
-// This is intended for use in development + debugging and not intended to be a production error message.
-// it also allows FieldValidationError to be used as an Error interface
-func (e *FieldValidationError) Error() string {
- return fmt.Sprintf(validationFieldErrMsg, e.Field, e.ErrorTag)
-}
-
-// StructValidationErrors is hierarchical list of field and struct validation errors
-// for a non hierarchical representation please see the Flatten method for StructValidationErrors
-type StructValidationErrors struct {
- // Name of the Struct
- Struct string
- // Struct Field Errors
- Errors map[string]*FieldValidationError
- // Struct Fields of type struct and their errors
- // key = Field Name of current struct, but internally Struct will be the actual struct name unless anonymous struct, it will be blank
- StructErrors map[string]*StructValidationErrors
-}
-
-// This is intended for use in development + debugging and not intended to be a production error message.
-// it also allows StructValidationErrors to be used as an Error interface
-func (e *StructValidationErrors) Error() string {
- buff := bytes.NewBufferString(fmt.Sprintf(validationStructErrMsg, e.Struct))
-
- for _, err := range e.Errors {
- buff.WriteString(err.Error())
- }
-
- for _, err := range e.StructErrors {
- buff.WriteString(err.Error())
- }
- buff.WriteString("\n\n")
- return buff.String()
-}
-
-// Flatten flattens the StructValidationErrors hierarchical structure into a flat namespace style field name
-// for those that want/need it
-func (e *StructValidationErrors) Flatten() map[string]*FieldValidationError {
-
- if e == nil {
- return nil
- }
-
- errs := map[string]*FieldValidationError{}
-
- for _, f := range e.Errors {
-
- errs[f.Field] = f
- }
-
- for key, val := range e.StructErrors {
-
- otherErrs := val.Flatten()
-
- for _, f2 := range otherErrs {
-
- f2.Field = fmt.Sprintf("%s.%s", key, f2.Field)
- errs[f2.Field] = f2
- }
- }
-
- return errs
-}
-
-// ValidationFunc accepts all values needed for file and cross field validation
-// top = top level struct when validating by struct otherwise nil
-// current = current level struct when validating by struct otherwise optional comparison value
-// f = field value for validation
-// param = parameter used in validation i.e. gt=0 param would be 0
-type ValidationFunc func(top interface{}, current interface{}, f interface{}, param string) bool
-
-// Validator implements the Validator Struct
-// NOTE: Fields within are not thread safe and that is on purpose
-// Functions and Tags should all be predifined before use, so subscribe to the philosiphy
-// or make it thread safe on your end
-type Validator struct {
- // tagName being used.
- tagName string
- // validationFuncs is a map of validation functions and the tag keys
- validationFuncs map[string]ValidationFunc
-}
-
-// NewValidator creates a new Validator instance for use.
-func NewValidator(tagName string, funcs map[string]ValidationFunc) *Validator {
- return &Validator{
- tagName: tagName,
- validationFuncs: funcs,
- }
-}
-
-// SetTag sets tagName of the Validator to one of your choosing after creation
-// perhaps to dodge a tag name conflict in a specific section of code
-func (v *Validator) SetTag(tagName string) {
- v.tagName = tagName
-}
-
-// AddFunction adds a ValidationFunc to a Validator's map of validators denoted by the key
-// NOTE: if the key already exists, it will get replaced.
-func (v *Validator) AddFunction(key string, f ValidationFunc) error {
-
- if len(key) == 0 {
- return errors.New("Function Key cannot be empty")
- }
-
- if f == nil {
- return errors.New("Function cannot be empty")
- }
-
- v.validationFuncs[key] = f
-
- return nil
-}
-
-// ValidateStruct validates a struct, even it's nested structs, and returns a struct containing the errors
-// NOTE: Nested Arrays, or Maps of structs do not get validated only the Array or Map itself; the reason is that there is no good
-// way to represent or report which struct within the array has the error, besides can validate the struct prior to adding it to
-// the Array or Map.
-func (v *Validator) ValidateStruct(s interface{}) *StructValidationErrors {
-
- return v.validateStructRecursive(s, s, s)
-}
-
-// validateStructRecursive validates a struct recursivly and passes the top level and current struct around for use in validator functions and returns a struct containing the errors
-func (v *Validator) validateStructRecursive(top interface{}, current interface{}, s interface{}) *StructValidationErrors {
-
- structValue := reflect.ValueOf(s)
- structType := reflect.TypeOf(s)
- structName := structType.Name()
-
- if structValue.Kind() == reflect.Ptr && !structValue.IsNil() {
- return v.validateStructRecursive(top, current, structValue.Elem().Interface())
- }
-
- if structValue.Kind() != reflect.Struct && structValue.Kind() != reflect.Interface {
- panic("interface passed for validation is not a struct")
- }
-
- validationErrors := &StructValidationErrors{
- Struct: structName,
- Errors: map[string]*FieldValidationError{},
- StructErrors: map[string]*StructValidationErrors{},
- }
-
- var numFields = structValue.NumField()
-
- for i := 0; i < numFields; i++ {
-
- valueField := structValue.Field(i)
- typeField := structType.Field(i)
-
- if valueField.Kind() == reflect.Ptr && !valueField.IsNil() {
- valueField = valueField.Elem()
- }
-
- tag := typeField.Tag.Get(v.tagName)
-
- if tag == noValidationTag {
- continue
- }
-
- // if no validation and not a struct (which may containt fields for validation)
- if tag == "" && valueField.Kind() != reflect.Struct && valueField.Kind() != reflect.Interface {
- continue
- }
-
- switch valueField.Kind() {
-
- case reflect.Struct, reflect.Interface:
-
- if !unicode.IsUpper(rune(typeField.Name[0])) {
- continue
- }
-
- if valueField.Type() == reflect.TypeOf(time.Time{}) {
-
- if fieldError := v.validateFieldByNameAndTagAndValue(top, current, valueField.Interface(), typeField.Name, tag); fieldError != nil {
- validationErrors.Errors[fieldError.Field] = fieldError
- // free up memory reference
- fieldError = nil
- }
-
- } else {
-
- if strings.Contains(tag, structOnlyTag) {
- continue
- }
-
- if structErrors := v.validateStructRecursive(top, valueField.Interface(), valueField.Interface()); structErrors != nil {
- validationErrors.StructErrors[typeField.Name] = structErrors
- // free up memory map no longer needed
- structErrors = nil
- }
- }
-
- default:
-
- if fieldError := v.validateFieldByNameAndTagAndValue(top, current, valueField.Interface(), typeField.Name, tag); fieldError != nil {
- validationErrors.Errors[fieldError.Field] = fieldError
- // free up memory reference
- fieldError = nil
- }
- }
- }
-
- if len(validationErrors.Errors) == 0 && len(validationErrors.StructErrors) == 0 {
- return nil
- }
-
- return validationErrors
-}
-
-// ValidateFieldByTag allows validation of a single field, still using tag style validation to check multiple errors
-func (v *Validator) ValidateFieldByTag(f interface{}, tag string) *FieldValidationError {
-
- return v.ValidateFieldByTagAndValue(nil, f, tag)
-}
-
-// ValidateFieldByTagAndValue allows validation of a single field, possibly even against another fields value, still using tag style validation to check multiple errors
-func (v *Validator) ValidateFieldByTagAndValue(val interface{}, f interface{}, tag string) *FieldValidationError {
-
- return v.validateFieldByNameAndTagAndValue(nil, val, f, "", tag)
-}
-
-func (v *Validator) validateFieldByNameAndTagAndValue(val interface{}, current interface{}, f interface{}, name string, tag string) *FieldValidationError {
-
- // This is a double check if coming from ValidateStruct but need to be here in case function is called directly
- if tag == noValidationTag {
- return nil
- }
-
- if strings.Contains(tag, omitempty) && !hasValue(val, current, f, "") {
- return nil
- }
-
- valueField := reflect.ValueOf(f)
- fieldKind := valueField.Kind()
-
- if fieldKind == reflect.Ptr && !valueField.IsNil() {
- return v.validateFieldByNameAndTagAndValue(val, current, valueField.Elem().Interface(), name, tag)
- }
-
- fieldType := valueField.Type()
-
- switch fieldKind {
-
- case reflect.Struct, reflect.Interface, reflect.Invalid:
-
- if fieldType != reflect.TypeOf(time.Time{}) {
- panic("Invalid field passed to ValidateFieldWithTag")
- }
- }
-
- var valErr *FieldValidationError
- var err error
- valTags := strings.Split(tag, tagSeparator)
-
- for _, valTag := range valTags {
-
- orVals := strings.Split(valTag, orSeparator)
-
- if len(orVals) > 1 {
-
- errTag := ""
-
- for _, val := range orVals {
-
- valErr, err = v.validateFieldByNameAndSingleTag(val, current, f, name, val)
-
- if err == nil {
- return nil
- }
-
- errTag += orSeparator + valErr.ErrorTag
-
- }
-
- errTag = strings.TrimLeft(errTag, orSeparator)
-
- valErr.ErrorTag = errTag
- valErr.Kind = fieldKind
-
- return valErr
- }
-
- if valErr, err = v.validateFieldByNameAndSingleTag(val, current, f, name, valTag); err != nil {
-
- valErr.Kind = valueField.Kind()
- valErr.Type = fieldType
-
- return valErr
- }
- }
-
- return nil
-}
-
-func (v *Validator) validateFieldByNameAndSingleTag(val interface{}, current interface{}, f interface{}, name string, valTag string) (*FieldValidationError, error) {
-
- vals := strings.Split(valTag, tagKeySeparator)
- key := strings.Trim(vals[0], " ")
-
- if len(key) == 0 {
- panic(fmt.Sprintf("Invalid validation tag on field %s", name))
- }
-
- valErr := &FieldValidationError{
- Field: name,
- ErrorTag: key,
- Value: f,
- Param: "",
- }
-
- // OK to continue because we checked it's existance before getting into this loop
- if key == omitempty {
- return valErr, nil
- }
-
- valFunc, ok := v.validationFuncs[key]
- if !ok {
- panic(fmt.Sprintf("Undefined validation function on field %s", name))
- }
-
- param := ""
- if len(vals) > 1 {
- param = strings.Trim(vals[1], " ")
- }
-
- if err := valFunc(val, current, f, param); !err {
- valErr.Param = param
- return valErr, errors.New(key)
- }
-
- return valErr, nil
-}
diff --git a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/validator_test.go b/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/validator_test.go
deleted file mode 100644
index 4d8f0c085..000000000
--- a/vendor/gopkg.in/joeybloggs/go-validate-yourself.v4/validator_test.go
+++ /dev/null
@@ -1,1809 +0,0 @@
-package validator_test
-
-import (
- "fmt"
- "reflect"
- "testing"
- "time"
-
- "gopkg.in/bluesuncorp/go-validate-yourself.v4"
- . "gopkg.in/check.v1"
-)
-
-type I interface {
- Foo() string
-}
-
-type Impl struct {
- F string `validate:"len=3"`
-}
-
-func (i *Impl) Foo() string {
- return i.F
-}
-
-type SubTest struct {
- Test string `validate:"required"`
-}
-
-type TestInterface struct {
- Iface I
-}
-
-type TestString struct {
- BlankTag string `validate:""`
- Required string `validate:"required"`
- Len string `validate:"len=10"`
- Min string `validate:"min=1"`
- Max string `validate:"max=10"`
- MinMax string `validate:"min=1,max=10"`
- Lt string `validate:"lt=10"`
- Lte string `validate:"lte=10"`
- Gt string `validate:"gt=10"`
- Gte string `validate:"gte=10"`
- OmitEmpty string `validate:"omitempty,min=1,max=10"`
- Sub *SubTest
- SubIgnore *SubTest `validate:"-"`
- Anonymous struct {
- A string `validate:"required"`
- }
- Iface I
-}
-
-type TestInt32 struct {
- Required int `validate:"required"`
- Len int `validate:"len=10"`
- Min int `validate:"min=1"`
- Max int `validate:"max=10"`
- MinMax int `validate:"min=1,max=10"`
- Lt int `validate:"lt=10"`
- Lte int `validate:"lte=10"`
- Gt int `validate:"gt=10"`
- Gte int `validate:"gte=10"`
- OmitEmpty int `validate:"omitempty,min=1,max=10"`
-}
-
-type TestUint64 struct {
- Required uint64 `validate:"required"`
- Len uint64 `validate:"len=10"`
- Min uint64 `validate:"min=1"`
- Max uint64 `validate:"max=10"`
- MinMax uint64 `validate:"min=1,max=10"`
- OmitEmpty uint64 `validate:"omitempty,min=1,max=10"`
-}
-
-type TestFloat64 struct {
- Required float64 `validate:"required"`
- Len float64 `validate:"len=10"`
- Min float64 `validate:"min=1"`
- Max float64 `validate:"max=10"`
- MinMax float64 `validate:"min=1,max=10"`
- Lte float64 `validate:"lte=10"`
- OmitEmpty float64 `validate:"omitempty,min=1,max=10"`
-}
-
-type TestSlice struct {
- Required []int `validate:"required"`
- Len []int `validate:"len=10"`
- Min []int `validate:"min=1"`
- Max []int `validate:"max=10"`
- MinMax []int `validate:"min=1,max=10"`
- OmitEmpty []int `validate:"omitempty,min=1,max=10"`
-}
-
-func Test(t *testing.T) { TestingT(t) }
-
-type MySuite struct{}
-
-var _ = Suite(&MySuite{})
-
-var myValidator = validator.NewValidator("validate", validator.BakedInValidators)
-
-func AssetStruct(s *validator.StructValidationErrors, structFieldName string, expectedStructName string, c *C) *validator.StructValidationErrors {
-
- val, ok := s.StructErrors[structFieldName]
- c.Assert(ok, Equals, true)
- c.Assert(val, NotNil)
- c.Assert(val.Struct, Equals, expectedStructName)
-
- return val
-}
-
-func AssertFieldError(s *validator.StructValidationErrors, field string, expectedTag string, c *C) {
-
- val, ok := s.Errors[field]
- c.Assert(ok, Equals, true)
- c.Assert(val, NotNil)
- c.Assert(val.Field, Equals, field)
- c.Assert(val.ErrorTag, Equals, expectedTag)
-}
-
-func AssertMapFieldError(s map[string]*validator.FieldValidationError, field string, expectedTag string, c *C) {
-
- val, ok := s[field]
- c.Assert(ok, Equals, true)
- c.Assert(val, NotNil)
- c.Assert(val.Field, Equals, field)
- c.Assert(val.ErrorTag, Equals, expectedTag)
-}
-
-func newValidatorFunc(val interface{}, current interface{}, field interface{}, param string) bool {
-
- return true
-}
-
-func isEqualFunc(val interface{}, current interface{}, field interface{}, param string) bool {
-
- return current.(string) == field.(string)
-}
-
-func (ms *MySuite) TestStructOnlyValidation(c *C) {
-
- type Inner struct {
- Test string `validate:"len=5"`
- }
-
- type Outer struct {
- InnerStruct *Inner `validate:"required,structonly"`
- }
-
- outer := &Outer{
- InnerStruct: nil,
- }
-
- errs := myValidator.ValidateStruct(outer).Flatten()
- c.Assert(errs, NotNil)
-
- inner := &Inner{
- Test: "1234",
- }
-
- outer = &Outer{
- InnerStruct: inner,
- }
-
- errs = myValidator.ValidateStruct(outer).Flatten()
- c.Assert(errs, IsNil)
-}
-
-func (ms *MySuite) TestGtField(c *C) {
-
- type TimeTest struct {
- Start *time.Time `validate:"required,gt"`
- End *time.Time `validate:"required,gt,gtfield=Start"`
- }
-
- now := time.Now()
- start := now.Add(time.Hour * 24)
- end := start.Add(time.Hour * 24)
-
- timeTest := &TimeTest{
- Start: &start,
- End: &end,
- }
-
- errs := myValidator.ValidateStruct(timeTest)
- c.Assert(errs, IsNil)
-
- timeTest = &TimeTest{
- Start: &end,
- End: &start,
- }
-
- errs2 := myValidator.ValidateStruct(timeTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "End", "gtfield", c)
-
- err3 := myValidator.ValidateFieldByTagAndValue(&start, &end, "gtfield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(&end, &start, "gtfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtfield")
-
- type IntTest struct {
- Val1 int `validate:"required"`
- Val2 int `validate:"required,gtfield=Val1"`
- }
-
- intTest := &IntTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs = myValidator.ValidateStruct(intTest)
- c.Assert(errs, IsNil)
-
- intTest = &IntTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs2 = myValidator.ValidateStruct(intTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtfield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "gtfield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "gtfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtfield")
-
- type UIntTest struct {
- Val1 uint `validate:"required"`
- Val2 uint `validate:"required,gtfield=Val1"`
- }
-
- uIntTest := &UIntTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs = myValidator.ValidateStruct(uIntTest)
- c.Assert(errs, IsNil)
-
- uIntTest = &UIntTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtfield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "gtfield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "gtfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtfield")
-
- type FloatTest struct {
- Val1 float64 `validate:"required"`
- Val2 float64 `validate:"required,gtfield=Val1"`
- }
-
- floatTest := &FloatTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs = myValidator.ValidateStruct(floatTest)
- c.Assert(errs, IsNil)
-
- floatTest = &FloatTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs2 = myValidator.ValidateStruct(floatTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtfield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "gtfield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "gtfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtfield")
-
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 1, "gtfield") }, PanicMatches, "struct not passed for cross validation")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, "T", "gtfield") }, PanicMatches, "Bad field type string")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, start, "gtfield") }, PanicMatches, "Bad Top Level field type")
-
- type TimeTest2 struct {
- Start *time.Time `validate:"required"`
- End *time.Time `validate:"required,gtfield=NonExistantField"`
- }
-
- timeTest2 := &TimeTest2{
- Start: &start,
- End: &end,
- }
-
- c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
-}
-
-func (ms *MySuite) TestLtField(c *C) {
-
- type TimeTest struct {
- Start *time.Time `validate:"required,lt,ltfield=End"`
- End *time.Time `validate:"required,lt"`
- }
-
- now := time.Now()
- start := now.Add(time.Hour * 24 * -1 * 2)
- end := start.Add(time.Hour * 24)
-
- timeTest := &TimeTest{
- Start: &start,
- End: &end,
- }
-
- errs := myValidator.ValidateStruct(timeTest)
- c.Assert(errs, IsNil)
-
- timeTest = &TimeTest{
- Start: &end,
- End: &start,
- }
-
- errs2 := myValidator.ValidateStruct(timeTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Start", "ltfield", c)
-
- err3 := myValidator.ValidateFieldByTagAndValue(&end, &start, "ltfield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(&start, &end, "ltfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltfield")
-
- type IntTest struct {
- Val1 int `validate:"required"`
- Val2 int `validate:"required,ltfield=Val1"`
- }
-
- intTest := &IntTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs = myValidator.ValidateStruct(intTest)
- c.Assert(errs, IsNil)
-
- intTest = &IntTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs2 = myValidator.ValidateStruct(intTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltfield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "ltfield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "ltfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltfield")
-
- type UIntTest struct {
- Val1 uint `validate:"required"`
- Val2 uint `validate:"required,ltfield=Val1"`
- }
-
- uIntTest := &UIntTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs = myValidator.ValidateStruct(uIntTest)
- c.Assert(errs, IsNil)
-
- uIntTest = &UIntTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltfield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "ltfield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "ltfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltfield")
-
- type FloatTest struct {
- Val1 float64 `validate:"required"`
- Val2 float64 `validate:"required,ltfield=Val1"`
- }
-
- floatTest := &FloatTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs = myValidator.ValidateStruct(floatTest)
- c.Assert(errs, IsNil)
-
- floatTest = &FloatTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs2 = myValidator.ValidateStruct(floatTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltfield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "ltfield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "ltfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltfield")
-
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 5, "ltfield") }, PanicMatches, "struct not passed for cross validation")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, "T", "ltfield") }, PanicMatches, "Bad field type string")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, end, "ltfield") }, PanicMatches, "Bad Top Level field type")
-
- type TimeTest2 struct {
- Start *time.Time `validate:"required"`
- End *time.Time `validate:"required,ltfield=NonExistantField"`
- }
-
- timeTest2 := &TimeTest2{
- Start: &end,
- End: &start,
- }
-
- c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
-}
-
-func (ms *MySuite) TestLteField(c *C) {
-
- type TimeTest struct {
- Start *time.Time `validate:"required,lte,ltefield=End"`
- End *time.Time `validate:"required,lte"`
- }
-
- now := time.Now()
- start := now.Add(time.Hour * 24 * -1 * 2)
- end := start.Add(time.Hour * 24)
-
- timeTest := &TimeTest{
- Start: &start,
- End: &end,
- }
-
- errs := myValidator.ValidateStruct(timeTest)
- c.Assert(errs, IsNil)
-
- timeTest = &TimeTest{
- Start: &end,
- End: &start,
- }
-
- errs2 := myValidator.ValidateStruct(timeTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Start", "ltefield", c)
-
- err3 := myValidator.ValidateFieldByTagAndValue(&end, &start, "ltefield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(&start, &end, "ltefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltefield")
-
- type IntTest struct {
- Val1 int `validate:"required"`
- Val2 int `validate:"required,ltefield=Val1"`
- }
-
- intTest := &IntTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs = myValidator.ValidateStruct(intTest)
- c.Assert(errs, IsNil)
-
- intTest = &IntTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs2 = myValidator.ValidateStruct(intTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltefield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "ltefield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "ltefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltefield")
-
- type UIntTest struct {
- Val1 uint `validate:"required"`
- Val2 uint `validate:"required,ltefield=Val1"`
- }
-
- uIntTest := &UIntTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs = myValidator.ValidateStruct(uIntTest)
- c.Assert(errs, IsNil)
-
- uIntTest = &UIntTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltefield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "ltefield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "ltefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltefield")
-
- type FloatTest struct {
- Val1 float64 `validate:"required"`
- Val2 float64 `validate:"required,ltefield=Val1"`
- }
-
- floatTest := &FloatTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs = myValidator.ValidateStruct(floatTest)
- c.Assert(errs, IsNil)
-
- floatTest = &FloatTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs2 = myValidator.ValidateStruct(floatTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltefield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "ltefield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "ltefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltefield")
-
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 5, "ltefield") }, PanicMatches, "struct not passed for cross validation")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, "T", "ltefield") }, PanicMatches, "Bad field type string")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, end, "ltefield") }, PanicMatches, "Bad Top Level field type")
-
- type TimeTest2 struct {
- Start *time.Time `validate:"required"`
- End *time.Time `validate:"required,ltefield=NonExistantField"`
- }
-
- timeTest2 := &TimeTest2{
- Start: &end,
- End: &start,
- }
-
- c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
-}
-
-func (ms *MySuite) TestGteField(c *C) {
-
- type TimeTest struct {
- Start *time.Time `validate:"required,gte"`
- End *time.Time `validate:"required,gte,gtefield=Start"`
- }
-
- now := time.Now()
- start := now.Add(time.Hour * 24)
- end := start.Add(time.Hour * 24)
-
- timeTest := &TimeTest{
- Start: &start,
- End: &end,
- }
-
- errs := myValidator.ValidateStruct(timeTest)
- c.Assert(errs, IsNil)
-
- timeTest = &TimeTest{
- Start: &end,
- End: &start,
- }
-
- errs2 := myValidator.ValidateStruct(timeTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "End", "gtefield", c)
-
- err3 := myValidator.ValidateFieldByTagAndValue(&start, &end, "gtefield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(&end, &start, "gtefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtefield")
-
- type IntTest struct {
- Val1 int `validate:"required"`
- Val2 int `validate:"required,gtefield=Val1"`
- }
-
- intTest := &IntTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs = myValidator.ValidateStruct(intTest)
- c.Assert(errs, IsNil)
-
- intTest = &IntTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs2 = myValidator.ValidateStruct(intTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtefield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "gtefield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "gtefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtefield")
-
- type UIntTest struct {
- Val1 uint `validate:"required"`
- Val2 uint `validate:"required,gtefield=Val1"`
- }
-
- uIntTest := &UIntTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs = myValidator.ValidateStruct(uIntTest)
- c.Assert(errs, IsNil)
-
- uIntTest = &UIntTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtefield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "gtefield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "gtefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtefield")
-
- type FloatTest struct {
- Val1 float64 `validate:"required"`
- Val2 float64 `validate:"required,gtefield=Val1"`
- }
-
- floatTest := &FloatTest{
- Val1: 1,
- Val2: 5,
- }
-
- errs = myValidator.ValidateStruct(floatTest)
- c.Assert(errs, IsNil)
-
- floatTest = &FloatTest{
- Val1: 5,
- Val2: 1,
- }
-
- errs2 = myValidator.ValidateStruct(floatTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtefield", c)
-
- err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "gtefield")
- c.Assert(err3, IsNil)
-
- err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "gtefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtefield")
-
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 1, "gtefield") }, PanicMatches, "struct not passed for cross validation")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, "T", "gtefield") }, PanicMatches, "Bad field type string")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, start, "gtefield") }, PanicMatches, "Bad Top Level field type")
-
- type TimeTest2 struct {
- Start *time.Time `validate:"required"`
- End *time.Time `validate:"required,gtefield=NonExistantField"`
- }
-
- timeTest2 := &TimeTest2{
- Start: &start,
- End: &end,
- }
-
- c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
-}
-
-func (ms *MySuite) TestValidateByTagAndValue(c *C) {
-
- val := "test"
- field := "test"
- err := myValidator.ValidateFieldByTagAndValue(val, field, "required")
- c.Assert(err, IsNil)
-
- myValidator.AddFunction("isequaltestfunc", isEqualFunc)
-
- err = myValidator.ValidateFieldByTagAndValue(val, field, "isequaltestfunc")
- c.Assert(err, IsNil)
-
- val = "unequal"
-
- err = myValidator.ValidateFieldByTagAndValue(val, field, "isequaltestfunc")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "isequaltestfunc")
-}
-
-func (ms *MySuite) TestAddFunctions(c *C) {
-
- validate := validator.NewValidator("validateme", validator.BakedInValidators)
-
- err := validate.AddFunction("new", newValidatorFunc)
- c.Assert(err, IsNil)
-
- err = validate.AddFunction("", newValidatorFunc)
- c.Assert(err, NotNil)
-
- validate.AddFunction("new", nil)
- c.Assert(err, NotNil)
-
- err = validate.AddFunction("new", newValidatorFunc)
- c.Assert(err, IsNil)
-}
-
-func (ms *MySuite) TestChangeTag(c *C) {
-
- validate := validator.NewValidator("validateme", validator.BakedInValidators)
- validate.SetTag("val")
-
- type Test struct {
- Name string `val:"len=4"`
- }
- s := &Test{
- Name: "TEST",
- }
-
- err := validate.ValidateStruct(s)
- c.Assert(err, IsNil)
-
- // validator.SetTag("v")
- // validator.SetTag("validate")
-}
-
-func (ms *MySuite) TestUnexposedStruct(c *C) {
-
- type Test struct {
- Name string
- unexposed struct {
- A string `validate:"required"`
- }
- }
-
- s := &Test{
- Name: "TEST",
- }
-
- err := myValidator.ValidateStruct(s)
- c.Assert(err, IsNil)
-}
-
-func (ms *MySuite) TestBadParams(c *C) {
-
- i := 1
- err := myValidator.ValidateFieldByTag(i, "-")
- c.Assert(err, IsNil)
-
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "len=a") }, PanicMatches, "strconv.ParseInt: parsing \"a\": invalid syntax")
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "len=a") }, PanicMatches, "strconv.ParseInt: parsing \"a\": invalid syntax")
-
- var ui uint = 1
- c.Assert(func() { myValidator.ValidateFieldByTag(ui, "len=a") }, PanicMatches, "strconv.ParseUint: parsing \"a\": invalid syntax")
-
- f := 1.23
- c.Assert(func() { myValidator.ValidateFieldByTag(f, "len=a") }, PanicMatches, "strconv.ParseFloat: parsing \"a\": invalid syntax")
-}
-
-func (ms *MySuite) TestLength(c *C) {
-
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "len") }, PanicMatches, "Bad field type bool")
-}
-
-func (ms *MySuite) TestIsGt(c *C) {
-
- myMap := map[string]string{}
- err := myValidator.ValidateFieldByTag(myMap, "gt=0")
- c.Assert(err, NotNil)
-
- f := 1.23
- err = myValidator.ValidateFieldByTag(f, "gt=5")
- c.Assert(err, NotNil)
-
- var ui uint = 5
- err = myValidator.ValidateFieldByTag(ui, "gt=10")
- c.Assert(err, NotNil)
-
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "gt") }, PanicMatches, "Bad field type bool")
-
- t := time.Now().UTC()
- t = t.Add(time.Hour * 24)
-
- err = myValidator.ValidateFieldByTag(t, "gt")
- c.Assert(err, IsNil)
-
- t2 := time.Now().UTC()
-
- err = myValidator.ValidateFieldByTag(t2, "gt")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "gt")
-
- type Test struct {
- Now *time.Time `validate:"gt"`
- }
- s := &Test{
- Now: &t,
- }
-
- errs := myValidator.ValidateStruct(s)
- c.Assert(errs, IsNil)
-
- s = &Test{
- Now: &t2,
- }
-
- errs = myValidator.ValidateStruct(s)
- c.Assert(errs, NotNil)
-}
-
-func (ms *MySuite) TestIsGte(c *C) {
-
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "gte") }, PanicMatches, "Bad field type bool")
-
- t := time.Now().UTC()
- t = t.Add(time.Hour * 24)
-
- err := myValidator.ValidateFieldByTag(t, "gte")
- c.Assert(err, IsNil)
-
- t2 := time.Now().UTC()
-
- err = myValidator.ValidateFieldByTag(t2, "gte")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "gte")
- c.Assert(err.Type, Equals, reflect.TypeOf(time.Time{}))
-
- type Test struct {
- Now *time.Time `validate:"gte"`
- }
- s := &Test{
- Now: &t,
- }
-
- errs := myValidator.ValidateStruct(s)
- c.Assert(errs, IsNil)
-
- s = &Test{
- Now: &t2,
- }
-
- errs = myValidator.ValidateStruct(s)
- c.Assert(errs, NotNil)
-}
-
-func (ms *MySuite) TestIsLt(c *C) {
-
- myMap := map[string]string{}
- err := myValidator.ValidateFieldByTag(myMap, "lt=0")
- c.Assert(err, NotNil)
-
- f := 1.23
- err = myValidator.ValidateFieldByTag(f, "lt=0")
- c.Assert(err, NotNil)
-
- var ui uint = 5
- err = myValidator.ValidateFieldByTag(ui, "lt=0")
- c.Assert(err, NotNil)
-
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "lt") }, PanicMatches, "Bad field type bool")
-
- t := time.Now().UTC()
-
- err = myValidator.ValidateFieldByTag(t, "lt")
- c.Assert(err, IsNil)
-
- t2 := time.Now().UTC()
- t2 = t2.Add(time.Hour * 24)
-
- err = myValidator.ValidateFieldByTag(t2, "lt")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "lt")
-
- type Test struct {
- Now *time.Time `validate:"lt"`
- }
-
- s := &Test{
- Now: &t,
- }
-
- errs := myValidator.ValidateStruct(s)
- c.Assert(errs, IsNil)
-
- s = &Test{
- Now: &t2,
- }
-
- errs = myValidator.ValidateStruct(s)
- c.Assert(errs, NotNil)
-}
-
-func (ms *MySuite) TestIsLte(c *C) {
-
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "lte") }, PanicMatches, "Bad field type bool")
-
- t := time.Now().UTC()
-
- err := myValidator.ValidateFieldByTag(t, "lte")
- c.Assert(err, IsNil)
-
- t2 := time.Now().UTC()
- t2 = t2.Add(time.Hour * 24)
-
- err = myValidator.ValidateFieldByTag(t2, "lte")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "lte")
-
- type Test struct {
- Now *time.Time `validate:"lte"`
- }
-
- s := &Test{
- Now: &t,
- }
-
- errs := myValidator.ValidateStruct(s)
- c.Assert(errs, IsNil)
-
- s = &Test{
- Now: &t2,
- }
-
- errs = myValidator.ValidateStruct(s)
- c.Assert(errs, NotNil)
-}
-
-func (ms *MySuite) TestUrl(c *C) {
-
- var tests = []struct {
- param string
- expected bool
- }{
- {"http://foo.bar#com", true},
- {"http://foobar.com", true},
- {"https://foobar.com", true},
- {"foobar.com", false},
- {"http://foobar.coffee/", true},
- {"http://foobar.中文网/", true},
- {"http://foobar.org/", true},
- {"http://foobar.org:8080/", true},
- {"ftp://foobar.ru/", true},
- {"http://user:pass@www.foobar.com/", true},
- {"http://127.0.0.1/", true},
- {"http://duckduckgo.com/?q=%2F", true},
- {"http://localhost:3000/", true},
- {"http://foobar.com/?foo=bar#baz=qux", true},
- {"http://foobar.com?foo=bar", true},
- {"http://www.xn--froschgrn-x9a.net/", true},
- {"", false},
- {"xyz://foobar.com", true},
- {"invalid.", false},
- {".com", false},
- {"rtmp://foobar.com", true},
- {"http://www.foo_bar.com/", true},
- {"http://localhost:3000/", true},
- {"http://foobar.com#baz=qux", true},
- {"http://foobar.com/t$-_.+!*\\'(),", true},
- {"http://www.foobar.com/~foobar", true},
- {"http://www.-foobar.com/", true},
- {"http://www.foo---bar.com/", true},
- {"mailto:someone@example.com", true},
- {"irc://irc.server.org/channel", true},
- {"irc://#channel@network", true},
- {"/abs/test/dir", false},
- {"./rel/test/dir", false},
- }
- for _, test := range tests {
-
- err := myValidator.ValidateFieldByTag(test.param, "url")
-
- if test.expected == true {
- c.Assert(err, IsNil)
- } else {
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "url")
- }
- }
-
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "url") }, PanicMatches, "Bad field type int")
-}
-
-func (ms *MySuite) TestUri(c *C) {
-
- var tests = []struct {
- param string
- expected bool
- }{
- {"http://foo.bar#com", true},
- {"http://foobar.com", true},
- {"https://foobar.com", true},
- {"foobar.com", false},
- {"http://foobar.coffee/", true},
- {"http://foobar.中文网/", true},
- {"http://foobar.org/", true},
- {"http://foobar.org:8080/", true},
- {"ftp://foobar.ru/", true},
- {"http://user:pass@www.foobar.com/", true},
- {"http://127.0.0.1/", true},
- {"http://duckduckgo.com/?q=%2F", true},
- {"http://localhost:3000/", true},
- {"http://foobar.com/?foo=bar#baz=qux", true},
- {"http://foobar.com?foo=bar", true},
- {"http://www.xn--froschgrn-x9a.net/", true},
- {"", false},
- {"xyz://foobar.com", true},
- {"invalid.", false},
- {".com", false},
- {"rtmp://foobar.com", true},
- {"http://www.foo_bar.com/", true},
- {"http://localhost:3000/", true},
- {"http://foobar.com#baz=qux", true},
- {"http://foobar.com/t$-_.+!*\\'(),", true},
- {"http://www.foobar.com/~foobar", true},
- {"http://www.-foobar.com/", true},
- {"http://www.foo---bar.com/", true},
- {"mailto:someone@example.com", true},
- {"irc://irc.server.org/channel", true},
- {"irc://#channel@network", true},
- {"/abs/test/dir", true},
- {"./rel/test/dir", false},
- }
- for _, test := range tests {
-
- err := myValidator.ValidateFieldByTag(test.param, "uri")
-
- if test.expected == true {
- c.Assert(err, IsNil)
- } else {
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "uri")
- }
- }
-
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "uri") }, PanicMatches, "Bad field type int")
-}
-
-func (ms *MySuite) TestOrTag(c *C) {
- s := "rgba(0,31,255,0.5)"
- err := myValidator.ValidateFieldByTag(s, "rgb|rgba")
- c.Assert(err, IsNil)
-
- s = "rgba(0,31,255,0.5)"
- err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=18")
- c.Assert(err, IsNil)
-
- s = "this ain't right"
- err = myValidator.ValidateFieldByTag(s, "rgb|rgba")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb|rgba")
-
- s = "this ain't right"
- err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=10")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb|rgba|len")
-
- s = "this is right"
- err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=13")
- c.Assert(err, IsNil)
-
- s = ""
- err = myValidator.ValidateFieldByTag(s, "omitempty,rgb|rgba")
- c.Assert(err, IsNil)
-}
-
-func (ms *MySuite) TestHsla(c *C) {
-
- s := "hsla(360,100%,100%,1)"
- err := myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, IsNil)
-
- s = "hsla(360,100%,100%,0.5)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, IsNil)
-
- s = "hsla(0,0%,0%, 0)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, IsNil)
-
- s = "hsl(361,100%,50%,1)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
-
- s = "hsl(361,100%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
-
- s = "hsla(361,100%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
-
- s = "hsla(360,101%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
-
- s = "hsla(360,100%,101%)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
-
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "hsla") }, PanicMatches, "interface conversion: interface is int, not string")
-}
-
-func (ms *MySuite) TestHsl(c *C) {
-
- s := "hsl(360,100%,50%)"
- err := myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, IsNil)
-
- s = "hsl(0,0%,0%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, IsNil)
-
- s = "hsl(361,100%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsl")
-
- s = "hsl(361,101%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsl")
-
- s = "hsl(361,100%,101%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsl")
-
- s = "hsl(-10,100%,100%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsl")
-
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "hsl") }, PanicMatches, "interface conversion: interface is int, not string")
-}
-
-func (ms *MySuite) TestRgba(c *C) {
-
- s := "rgba(0,31,255,0.5)"
- err := myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, IsNil)
-
- s = "rgba(0,31,255,0.12)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, IsNil)
-
- s = "rgba( 0, 31, 255, 0.5)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, IsNil)
-
- s = "rgb(0, 31, 255)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgba")
-
- s = "rgb(1,349,275,0.5)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgba")
-
- s = "rgb(01,31,255,0.5)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgba")
-
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "rgba") }, PanicMatches, "interface conversion: interface is int, not string")
-}
-
-func (ms *MySuite) TestRgb(c *C) {
-
- s := "rgb(0,31,255)"
- err := myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, IsNil)
-
- s = "rgb(0, 31, 255)"
- err = myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, IsNil)
-
- s = "rgb(1,349,275)"
- err = myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb")
-
- s = "rgb(01,31,255)"
- err = myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb")
-
- s = "rgba(0,31,255)"
- err = myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb")
-
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "rgb") }, PanicMatches, "interface conversion: interface is int, not string")
-}
-
-func (ms *MySuite) TestEmail(c *C) {
-
- s := "test@mail.com"
- err := myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, IsNil)
-
- s = ""
- err = myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "email")
-
- s = "test@email"
- err = myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "email")
-
- s = "test@email."
- err = myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "email")
-
- s = "@email.com"
- err = myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "email")
-
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "email") }, PanicMatches, "interface conversion: interface is bool, not string")
-}
-
-func (ms *MySuite) TestHexColor(c *C) {
-
- s := "#fff"
- err := myValidator.ValidateFieldByTag(s, "hexcolor")
- c.Assert(err, IsNil)
-
- s = "#c2c2c2"
- err = myValidator.ValidateFieldByTag(s, "hexcolor")
- c.Assert(err, IsNil)
-
- s = "fff"
- err = myValidator.ValidateFieldByTag(s, "hexcolor")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hexcolor")
-
- s = "fffFF"
- err = myValidator.ValidateFieldByTag(s, "hexcolor")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hexcolor")
-
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "hexcolor") }, PanicMatches, "interface conversion: interface is bool, not string")
-}
-
-func (ms *MySuite) TestHexadecimal(c *C) {
-
- s := "ff0044"
- err := myValidator.ValidateFieldByTag(s, "hexadecimal")
- c.Assert(err, IsNil)
-
- s = "abcdefg"
- err = myValidator.ValidateFieldByTag(s, "hexadecimal")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hexadecimal")
-
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "hexadecimal") }, PanicMatches, "interface conversion: interface is bool, not string")
-}
-
-func (ms *MySuite) TestNumber(c *C) {
-
- s := "1"
- err := myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, IsNil)
-
- s = "+1"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
-
- s = "-1"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
-
- s = "1.12"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
-
- s = "+1.12"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
-
- s = "-1.12"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
-
- s = "1."
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
-
- s = "1.o"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
-
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "number") }, PanicMatches, "interface conversion: interface is int, not string")
-}
-
-func (ms *MySuite) TestNumeric(c *C) {
-
- s := "1"
- err := myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
-
- s = "+1"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
-
- s = "-1"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
-
- s = "1.12"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
-
- s = "+1.12"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
-
- s = "-1.12"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
-
- s = "1."
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "numeric")
-
- s = "1.o"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "numeric")
-
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "numeric") }, PanicMatches, "interface conversion: interface is int, not string")
-}
-
-func (ms *MySuite) TestAlphaNumeric(c *C) {
-
- s := "abcd123"
- err := myValidator.ValidateFieldByTag(s, "alphanum")
- c.Assert(err, IsNil)
-
- s = "abc!23"
- err = myValidator.ValidateFieldByTag(s, "alphanum")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "alphanum")
-
- c.Assert(func() { myValidator.ValidateFieldByTag(1, "alphanum") }, PanicMatches, "interface conversion: interface is int, not string")
-}
-
-func (ms *MySuite) TestAlpha(c *C) {
-
- s := "abcd"
- err := myValidator.ValidateFieldByTag(s, "alpha")
- c.Assert(err, IsNil)
-
- s = "abc1"
- err = myValidator.ValidateFieldByTag(s, "alpha")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "alpha")
-
- c.Assert(func() { myValidator.ValidateFieldByTag(1, "alpha") }, PanicMatches, "interface conversion: interface is int, not string")
-}
-
-func (ms *MySuite) TestFlattening(c *C) {
-
- tSuccess := &TestString{
- Required: "Required",
- Len: "length==10",
- Min: "min=1",
- Max: "1234567890",
- MinMax: "12345",
- Lt: "012345678",
- Lte: "0123456789",
- Gt: "01234567890",
- Gte: "0123456789",
- OmitEmpty: "",
- Sub: &SubTest{
- Test: "1",
- },
- SubIgnore: &SubTest{
- Test: "",
- },
- Anonymous: struct {
- A string `validate:"required"`
- }{
- A: "1",
- },
- Iface: &Impl{
- F: "123",
- },
- }
-
- err1 := myValidator.ValidateStruct(tSuccess).Flatten()
- c.Assert(err1, IsNil)
-
- tFail := &TestString{
- Required: "",
- Len: "",
- Min: "",
- Max: "12345678901",
- MinMax: "",
- OmitEmpty: "12345678901",
- Sub: &SubTest{
- Test: "",
- },
- Anonymous: struct {
- A string `validate:"required"`
- }{
- A: "",
- },
- Iface: &Impl{
- F: "12",
- },
- }
-
- err2 := myValidator.ValidateStruct(tFail).Flatten()
-
- // Assert Top Level
- c.Assert(err2, NotNil)
-
- // Assert Fields
- AssertMapFieldError(err2, "Len", "len", c)
- AssertMapFieldError(err2, "Gt", "gt", c)
- AssertMapFieldError(err2, "Gte", "gte", c)
-
- // Assert Struct Field
- AssertMapFieldError(err2, "Sub.Test", "required", c)
-
- // Assert Anonymous Struct Field
- AssertMapFieldError(err2, "Anonymous.A", "required", c)
-
- // Assert Interface Field
- AssertMapFieldError(err2, "Iface.F", "len", c)
-}
-
-func (ms *MySuite) TestStructStringValidation(c *C) {
-
- tSuccess := &TestString{
- Required: "Required",
- Len: "length==10",
- Min: "min=1",
- Max: "1234567890",
- MinMax: "12345",
- Lt: "012345678",
- Lte: "0123456789",
- Gt: "01234567890",
- Gte: "0123456789",
- OmitEmpty: "",
- Sub: &SubTest{
- Test: "1",
- },
- SubIgnore: &SubTest{
- Test: "",
- },
- Anonymous: struct {
- A string `validate:"required"`
- }{
- A: "1",
- },
- Iface: &Impl{
- F: "123",
- },
- }
-
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
-
- tFail := &TestString{
- Required: "",
- Len: "",
- Min: "",
- Max: "12345678901",
- MinMax: "",
- Lt: "0123456789",
- Lte: "01234567890",
- Gt: "1",
- Gte: "1",
- OmitEmpty: "12345678901",
- Sub: &SubTest{
- Test: "",
- },
- Anonymous: struct {
- A string `validate:"required"`
- }{
- A: "",
- },
- Iface: &Impl{
- F: "12",
- },
- }
-
- err = myValidator.ValidateStruct(tFail)
-
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestString")
- c.Assert(len(err.Errors), Equals, 10)
- c.Assert(len(err.StructErrors), Equals, 3)
-
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "Gt", "gt", c)
- AssertFieldError(err, "Gte", "gte", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
-
- // Assert Anonymous embedded struct
- AssetStruct(err, "Anonymous", "", c)
-
- // Assert SubTest embedded struct
- val := AssetStruct(err, "Sub", "SubTest", c)
- c.Assert(len(val.Errors), Equals, 1)
- c.Assert(len(val.StructErrors), Equals, 0)
-
- AssertFieldError(val, "Test", "required", c)
-
- errors := err.Error()
- c.Assert(errors, NotNil)
-}
-
-func (ms *MySuite) TestStructInt32Validation(c *C) {
-
- tSuccess := &TestInt32{
- Required: 1,
- Len: 10,
- Min: 1,
- Max: 10,
- MinMax: 5,
- Lt: 9,
- Lte: 10,
- Gt: 11,
- Gte: 10,
- OmitEmpty: 0,
- }
-
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
-
- tFail := &TestInt32{
- Required: 0,
- Len: 11,
- Min: -1,
- Max: 11,
- MinMax: -1,
- Lt: 10,
- Lte: 11,
- Gt: 10,
- Gte: 9,
- OmitEmpty: 11,
- }
-
- err = myValidator.ValidateStruct(tFail)
-
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestInt32")
- c.Assert(len(err.Errors), Equals, 10)
- c.Assert(len(err.StructErrors), Equals, 0)
-
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "Lt", "lt", c)
- AssertFieldError(err, "Lte", "lte", c)
- AssertFieldError(err, "Gt", "gt", c)
- AssertFieldError(err, "Gte", "gte", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
-}
-
-func (ms *MySuite) TestStructUint64Validation(c *C) {
-
- tSuccess := &TestUint64{
- Required: 1,
- Len: 10,
- Min: 1,
- Max: 10,
- MinMax: 5,
- OmitEmpty: 0,
- }
-
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
-
- tFail := &TestUint64{
- Required: 0,
- Len: 11,
- Min: 0,
- Max: 11,
- MinMax: 0,
- OmitEmpty: 11,
- }
-
- err = myValidator.ValidateStruct(tFail)
-
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestUint64")
- c.Assert(len(err.Errors), Equals, 6)
- c.Assert(len(err.StructErrors), Equals, 0)
-
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
-}
-
-func (ms *MySuite) TestStructFloat64Validation(c *C) {
-
- tSuccess := &TestFloat64{
- Required: 1,
- Len: 10,
- Min: 1,
- Max: 10,
- MinMax: 5,
- OmitEmpty: 0,
- }
-
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
-
- tFail := &TestFloat64{
- Required: 0,
- Len: 11,
- Min: 0,
- Max: 11,
- MinMax: 0,
- OmitEmpty: 11,
- }
-
- err = myValidator.ValidateStruct(tFail)
-
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestFloat64")
- c.Assert(len(err.Errors), Equals, 6)
- c.Assert(len(err.StructErrors), Equals, 0)
-
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
-}
-
-func (ms *MySuite) TestStructSliceValidation(c *C) {
-
- tSuccess := &TestSlice{
- Required: []int{1},
- Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
- Min: []int{1, 2},
- Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
- MinMax: []int{1, 2, 3, 4, 5},
- OmitEmpty: []int{},
- }
-
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
-
- tFail := &TestSlice{
- Required: []int{},
- Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
- Min: []int{},
- Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
- MinMax: []int{},
- OmitEmpty: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
- }
-
- err = myValidator.ValidateStruct(tFail)
-
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestSlice")
- c.Assert(len(err.Errors), Equals, 6)
- c.Assert(len(err.StructErrors), Equals, 0)
-
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
-}
-
-func (ms *MySuite) TestInvalidStruct(c *C) {
- s := &SubTest{
- Test: "1",
- }
-
- c.Assert(func() { myValidator.ValidateStruct(s.Test) }, PanicMatches, "interface passed for validation is not a struct")
-}
-
-func (ms *MySuite) TestInvalidField(c *C) {
- s := &SubTest{
- Test: "1",
- }
-
- c.Assert(func() { myValidator.ValidateFieldByTag(s, "required") }, PanicMatches, "Invalid field passed to ValidateFieldWithTag")
-}
-
-func (ms *MySuite) TestInvalidTagField(c *C) {
- s := &SubTest{
- Test: "1",
- }
-
- c.Assert(func() { myValidator.ValidateFieldByTag(s.Test, "") }, PanicMatches, fmt.Sprintf("Invalid validation tag on field %s", ""))
-}
-
-func (ms *MySuite) TestInvalidValidatorFunction(c *C) {
- s := &SubTest{
- Test: "1",
- }
-
- c.Assert(func() { myValidator.ValidateFieldByTag(s.Test, "zzxxBadFunction") }, PanicMatches, fmt.Sprintf("Undefined validation function on field %s", ""))
-}
diff --git a/vendor/gopkg.in/yaml.v1/LICENSE b/vendor/gopkg.in/yaml.v1/LICENSE
new file mode 100644
index 000000000..53320c352
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/LICENSE
@@ -0,0 +1,185 @@
+This software is licensed under the LGPLv3, included below.
+
+As a special exception to the GNU Lesser General Public License version 3
+("LGPL3"), the copyright holders of this Library give you permission to
+convey to a third party a Combined Work that links statically or dynamically
+to this Library without providing any Minimal Corresponding Source or
+Minimal Application Code as set out in 4d or providing the installation
+information set out in section 4e, provided that you comply with the other
+provisions of LGPL3 and provided that you meet, for the Application the
+terms and conditions of the license(s) which apply to the Application.
+
+Except as stated in this special exception, the provisions of LGPL3 will
+continue to comply in full to this Library. If you modify this Library, you
+may apply this exception to your version of this Library, but you are not
+obliged to do so. If you do not wish to do so, delete this exception
+statement from your version. This exception does not (and cannot) modify any
+license terms which apply to the Application, with which you must still
+comply.
+
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/vendor/gopkg.in/yaml.v1/LICENSE.libyaml b/vendor/gopkg.in/yaml.v1/LICENSE.libyaml
new file mode 100644
index 000000000..050ced23f
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/LICENSE.libyaml
@@ -0,0 +1,19 @@
+Copyright (c) 2006 Kirill Simonov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/gopkg.in/yaml.v1/README.md b/vendor/gopkg.in/yaml.v1/README.md
new file mode 100644
index 000000000..896687b1d
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/README.md
@@ -0,0 +1,128 @@
+# YAML support for the Go language
+
+Introduction
+------------
+
+The yaml package enables Go programs to comfortably encode and decode YAML
+values. It was developed within [Canonical](https://www.canonical.com) as
+part of the [juju](https://juju.ubuntu.com) project, and is based on a
+pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML)
+C library to parse and generate YAML data quickly and reliably.
+
+Compatibility
+-------------
+
+The yaml package is almost compatible with YAML 1.1, including support for
+anchors, tags, etc. There are still a few missing bits, such as document
+merging, base-60 floats (huh?), and multi-document unmarshalling. These
+features are not hard to add, and will be introduced as necessary.
+
+Installation and usage
+----------------------
+
+The import path for the package is *gopkg.in/yaml.v1*.
+
+To install it, run:
+
+ go get gopkg.in/yaml.v1
+
+API documentation
+-----------------
+
+If opened in a browser, the import path itself leads to the API documentation:
+
+ * [https://gopkg.in/yaml.v1](https://gopkg.in/yaml.v1)
+
+API stability
+-------------
+
+The package API for yaml v1 will remain stable as described in [gopkg.in](https://gopkg.in).
+
+
+License
+-------
+
+The yaml package is licensed under the LGPL with an exception that allows it to be linked statically. Please see the LICENSE file for details.
+
+
+Example
+-------
+
+```Go
+package main
+
+import (
+ "fmt"
+ "log"
+
+ "gopkg.in/yaml.v1"
+)
+
+var data = `
+a: Easy!
+b:
+ c: 2
+ d: [3, 4]
+`
+
+type T struct {
+ A string
+ B struct{C int; D []int ",flow"}
+}
+
+func main() {
+ t := T{}
+
+ err := yaml.Unmarshal([]byte(data), &t)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- t:\n%v\n\n", t)
+
+ d, err := yaml.Marshal(&t)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- t dump:\n%s\n\n", string(d))
+
+ m := make(map[interface{}]interface{})
+
+ err = yaml.Unmarshal([]byte(data), &m)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- m:\n%v\n\n", m)
+
+ d, err = yaml.Marshal(&m)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- m dump:\n%s\n\n", string(d))
+}
+```
+
+This example will generate the following output:
+
+```
+--- t:
+{Easy! {2 [3 4]}}
+
+--- t dump:
+a: Easy!
+b:
+ c: 2
+ d: [3, 4]
+
+
+--- m:
+map[a:Easy! b:map[c:2 d:[3 4]]]
+
+--- m dump:
+a: Easy!
+b:
+ c: 2
+ d:
+ - 3
+ - 4
+```
+
diff --git a/vendor/gopkg.in/yaml.v1/apic.go b/vendor/gopkg.in/yaml.v1/apic.go
new file mode 100644
index 000000000..95ec014e8
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/apic.go
@@ -0,0 +1,742 @@
+package yaml
+
+import (
+ "io"
+ "os"
+)
+
+func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) {
+ //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens))
+
+ // Check if we can move the queue at the beginning of the buffer.
+ if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) {
+ if parser.tokens_head != len(parser.tokens) {
+ copy(parser.tokens, parser.tokens[parser.tokens_head:])
+ }
+ parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head]
+ parser.tokens_head = 0
+ }
+ parser.tokens = append(parser.tokens, *token)
+ if pos < 0 {
+ return
+ }
+ copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:])
+ parser.tokens[parser.tokens_head+pos] = *token
+}
+
+// Create a new parser object.
+func yaml_parser_initialize(parser *yaml_parser_t) bool {
+ *parser = yaml_parser_t{
+ raw_buffer: make([]byte, 0, input_raw_buffer_size),
+ buffer: make([]byte, 0, input_buffer_size),
+ }
+ return true
+}
+
+// Destroy a parser object.
+func yaml_parser_delete(parser *yaml_parser_t) {
+ *parser = yaml_parser_t{}
+}
+
+// String read handler.
+func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
+ if parser.input_pos == len(parser.input) {
+ return 0, io.EOF
+ }
+ n = copy(buffer, parser.input[parser.input_pos:])
+ parser.input_pos += n
+ return n, nil
+}
+
+// File read handler.
+func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
+ return parser.input_file.Read(buffer)
+}
+
+// Set a string input.
+func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) {
+ if parser.read_handler != nil {
+ panic("must set the input source only once")
+ }
+ parser.read_handler = yaml_string_read_handler
+ parser.input = input
+ parser.input_pos = 0
+}
+
+// Set a file input.
+func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) {
+ if parser.read_handler != nil {
+ panic("must set the input source only once")
+ }
+ parser.read_handler = yaml_file_read_handler
+ parser.input_file = file
+}
+
+// Set the source encoding.
+func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) {
+ if parser.encoding != yaml_ANY_ENCODING {
+ panic("must set the encoding only once")
+ }
+ parser.encoding = encoding
+}
+
+// Create a new emitter object.
+func yaml_emitter_initialize(emitter *yaml_emitter_t) bool {
+ *emitter = yaml_emitter_t{
+ buffer: make([]byte, output_buffer_size),
+ raw_buffer: make([]byte, 0, output_raw_buffer_size),
+ states: make([]yaml_emitter_state_t, 0, initial_stack_size),
+ events: make([]yaml_event_t, 0, initial_queue_size),
+ }
+ return true
+}
+
+// Destroy an emitter object.
+func yaml_emitter_delete(emitter *yaml_emitter_t) {
+ *emitter = yaml_emitter_t{}
+}
+
+// String write handler.
+func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
+ *emitter.output_buffer = append(*emitter.output_buffer, buffer...)
+ return nil
+}
+
+// File write handler.
+func yaml_file_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
+ _, err := emitter.output_file.Write(buffer)
+ return err
+}
+
+// Set a string output.
+func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) {
+ if emitter.write_handler != nil {
+ panic("must set the output target only once")
+ }
+ emitter.write_handler = yaml_string_write_handler
+ emitter.output_buffer = output_buffer
+}
+
+// Set a file output.
+func yaml_emitter_set_output_file(emitter *yaml_emitter_t, file io.Writer) {
+ if emitter.write_handler != nil {
+ panic("must set the output target only once")
+ }
+ emitter.write_handler = yaml_file_write_handler
+ emitter.output_file = file
+}
+
+// Set the output encoding.
+func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) {
+ if emitter.encoding != yaml_ANY_ENCODING {
+ panic("must set the output encoding only once")
+ }
+ emitter.encoding = encoding
+}
+
+// Set the canonical output style.
+func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) {
+ emitter.canonical = canonical
+}
+
+//// Set the indentation increment.
+func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) {
+ if indent < 2 || indent > 9 {
+ indent = 2
+ }
+ emitter.best_indent = indent
+}
+
+// Set the preferred line width.
+func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) {
+ if width < 0 {
+ width = -1
+ }
+ emitter.best_width = width
+}
+
+// Set if unescaped non-ASCII characters are allowed.
+func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) {
+ emitter.unicode = unicode
+}
+
+// Set the preferred line break character.
+func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) {
+ emitter.line_break = line_break
+}
+
+///*
+// * Destroy a token object.
+// */
+//
+//YAML_DECLARE(void)
+//yaml_token_delete(yaml_token_t *token)
+//{
+// assert(token); // Non-NULL token object expected.
+//
+// switch (token.type)
+// {
+// case YAML_TAG_DIRECTIVE_TOKEN:
+// yaml_free(token.data.tag_directive.handle);
+// yaml_free(token.data.tag_directive.prefix);
+// break;
+//
+// case YAML_ALIAS_TOKEN:
+// yaml_free(token.data.alias.value);
+// break;
+//
+// case YAML_ANCHOR_TOKEN:
+// yaml_free(token.data.anchor.value);
+// break;
+//
+// case YAML_TAG_TOKEN:
+// yaml_free(token.data.tag.handle);
+// yaml_free(token.data.tag.suffix);
+// break;
+//
+// case YAML_SCALAR_TOKEN:
+// yaml_free(token.data.scalar.value);
+// break;
+//
+// default:
+// break;
+// }
+//
+// memset(token, 0, sizeof(yaml_token_t));
+//}
+//
+///*
+// * Check if a string is a valid UTF-8 sequence.
+// *
+// * Check 'reader.c' for more details on UTF-8 encoding.
+// */
+//
+//static int
+//yaml_check_utf8(yaml_char_t *start, size_t length)
+//{
+// yaml_char_t *end = start+length;
+// yaml_char_t *pointer = start;
+//
+// while (pointer < end) {
+// unsigned char octet;
+// unsigned int width;
+// unsigned int value;
+// size_t k;
+//
+// octet = pointer[0];
+// width = (octet & 0x80) == 0x00 ? 1 :
+// (octet & 0xE0) == 0xC0 ? 2 :
+// (octet & 0xF0) == 0xE0 ? 3 :
+// (octet & 0xF8) == 0xF0 ? 4 : 0;
+// value = (octet & 0x80) == 0x00 ? octet & 0x7F :
+// (octet & 0xE0) == 0xC0 ? octet & 0x1F :
+// (octet & 0xF0) == 0xE0 ? octet & 0x0F :
+// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
+// if (!width) return 0;
+// if (pointer+width > end) return 0;
+// for (k = 1; k < width; k ++) {
+// octet = pointer[k];
+// if ((octet & 0xC0) != 0x80) return 0;
+// value = (value << 6) + (octet & 0x3F);
+// }
+// if (!((width == 1) ||
+// (width == 2 && value >= 0x80) ||
+// (width == 3 && value >= 0x800) ||
+// (width == 4 && value >= 0x10000))) return 0;
+//
+// pointer += width;
+// }
+//
+// return 1;
+//}
+//
+
+// Create STREAM-START.
+func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_STREAM_START_EVENT,
+ encoding: encoding,
+ }
+ return true
+}
+
+// Create STREAM-END.
+func yaml_stream_end_event_initialize(event *yaml_event_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_STREAM_END_EVENT,
+ }
+ return true
+}
+
+// Create DOCUMENT-START.
+func yaml_document_start_event_initialize(event *yaml_event_t, version_directive *yaml_version_directive_t,
+ tag_directives []yaml_tag_directive_t, implicit bool) bool {
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_START_EVENT,
+ version_directive: version_directive,
+ tag_directives: tag_directives,
+ implicit: implicit,
+ }
+ return true
+}
+
+// Create DOCUMENT-END.
+func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) bool {
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_END_EVENT,
+ implicit: implicit,
+ }
+ return true
+}
+
+///*
+// * Create ALIAS.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t)
+//{
+// mark yaml_mark_t = { 0, 0, 0 }
+// anchor_copy *yaml_char_t = NULL
+//
+// assert(event) // Non-NULL event object is expected.
+// assert(anchor) // Non-NULL anchor is expected.
+//
+// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0
+//
+// anchor_copy = yaml_strdup(anchor)
+// if (!anchor_copy)
+// return 0
+//
+// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark)
+//
+// return 1
+//}
+
+// Create SCALAR.
+func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_SCALAR_EVENT,
+ anchor: anchor,
+ tag: tag,
+ value: value,
+ implicit: plain_implicit,
+ quoted_implicit: quoted_implicit,
+ style: yaml_style_t(style),
+ }
+ return true
+}
+
+// Create SEQUENCE-START.
+func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_START_EVENT,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(style),
+ }
+ return true
+}
+
+// Create SEQUENCE-END.
+func yaml_sequence_end_event_initialize(event *yaml_event_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_END_EVENT,
+ }
+ return true
+}
+
+// Create MAPPING-START.
+func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_START_EVENT,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(style),
+ }
+ return true
+}
+
+// Create MAPPING-END.
+func yaml_mapping_end_event_initialize(event *yaml_event_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_END_EVENT,
+ }
+ return true
+}
+
+// Destroy an event object.
+func yaml_event_delete(event *yaml_event_t) {
+ *event = yaml_event_t{}
+}
+
+///*
+// * Create a document object.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_initialize(document *yaml_document_t,
+// version_directive *yaml_version_directive_t,
+// tag_directives_start *yaml_tag_directive_t,
+// tag_directives_end *yaml_tag_directive_t,
+// start_implicit int, end_implicit int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// struct {
+// start *yaml_node_t
+// end *yaml_node_t
+// top *yaml_node_t
+// } nodes = { NULL, NULL, NULL }
+// version_directive_copy *yaml_version_directive_t = NULL
+// struct {
+// start *yaml_tag_directive_t
+// end *yaml_tag_directive_t
+// top *yaml_tag_directive_t
+// } tag_directives_copy = { NULL, NULL, NULL }
+// value yaml_tag_directive_t = { NULL, NULL }
+// mark yaml_mark_t = { 0, 0, 0 }
+//
+// assert(document) // Non-NULL document object is expected.
+// assert((tag_directives_start && tag_directives_end) ||
+// (tag_directives_start == tag_directives_end))
+// // Valid tag directives are expected.
+//
+// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error
+//
+// if (version_directive) {
+// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t))
+// if (!version_directive_copy) goto error
+// version_directive_copy.major = version_directive.major
+// version_directive_copy.minor = version_directive.minor
+// }
+//
+// if (tag_directives_start != tag_directives_end) {
+// tag_directive *yaml_tag_directive_t
+// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
+// goto error
+// for (tag_directive = tag_directives_start
+// tag_directive != tag_directives_end; tag_directive ++) {
+// assert(tag_directive.handle)
+// assert(tag_directive.prefix)
+// if (!yaml_check_utf8(tag_directive.handle,
+// strlen((char *)tag_directive.handle)))
+// goto error
+// if (!yaml_check_utf8(tag_directive.prefix,
+// strlen((char *)tag_directive.prefix)))
+// goto error
+// value.handle = yaml_strdup(tag_directive.handle)
+// value.prefix = yaml_strdup(tag_directive.prefix)
+// if (!value.handle || !value.prefix) goto error
+// if (!PUSH(&context, tag_directives_copy, value))
+// goto error
+// value.handle = NULL
+// value.prefix = NULL
+// }
+// }
+//
+// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
+// tag_directives_copy.start, tag_directives_copy.top,
+// start_implicit, end_implicit, mark, mark)
+//
+// return 1
+//
+//error:
+// STACK_DEL(&context, nodes)
+// yaml_free(version_directive_copy)
+// while (!STACK_EMPTY(&context, tag_directives_copy)) {
+// value yaml_tag_directive_t = POP(&context, tag_directives_copy)
+// yaml_free(value.handle)
+// yaml_free(value.prefix)
+// }
+// STACK_DEL(&context, tag_directives_copy)
+// yaml_free(value.handle)
+// yaml_free(value.prefix)
+//
+// return 0
+//}
+//
+///*
+// * Destroy a document object.
+// */
+//
+//YAML_DECLARE(void)
+//yaml_document_delete(document *yaml_document_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// tag_directive *yaml_tag_directive_t
+//
+// context.error = YAML_NO_ERROR // Eliminate a compliler warning.
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// while (!STACK_EMPTY(&context, document.nodes)) {
+// node yaml_node_t = POP(&context, document.nodes)
+// yaml_free(node.tag)
+// switch (node.type) {
+// case YAML_SCALAR_NODE:
+// yaml_free(node.data.scalar.value)
+// break
+// case YAML_SEQUENCE_NODE:
+// STACK_DEL(&context, node.data.sequence.items)
+// break
+// case YAML_MAPPING_NODE:
+// STACK_DEL(&context, node.data.mapping.pairs)
+// break
+// default:
+// assert(0) // Should not happen.
+// }
+// }
+// STACK_DEL(&context, document.nodes)
+//
+// yaml_free(document.version_directive)
+// for (tag_directive = document.tag_directives.start
+// tag_directive != document.tag_directives.end
+// tag_directive++) {
+// yaml_free(tag_directive.handle)
+// yaml_free(tag_directive.prefix)
+// }
+// yaml_free(document.tag_directives.start)
+//
+// memset(document, 0, sizeof(yaml_document_t))
+//}
+//
+///**
+// * Get a document node.
+// */
+//
+//YAML_DECLARE(yaml_node_t *)
+//yaml_document_get_node(document *yaml_document_t, index int)
+//{
+// assert(document) // Non-NULL document object is expected.
+//
+// if (index > 0 && document.nodes.start + index <= document.nodes.top) {
+// return document.nodes.start + index - 1
+// }
+// return NULL
+//}
+//
+///**
+// * Get the root object.
+// */
+//
+//YAML_DECLARE(yaml_node_t *)
+//yaml_document_get_root_node(document *yaml_document_t)
+//{
+// assert(document) // Non-NULL document object is expected.
+//
+// if (document.nodes.top != document.nodes.start) {
+// return document.nodes.start
+// }
+// return NULL
+//}
+//
+///*
+// * Add a scalar node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_scalar(document *yaml_document_t,
+// tag *yaml_char_t, value *yaml_char_t, length int,
+// style yaml_scalar_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// value_copy *yaml_char_t = NULL
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+// assert(value) // Non-NULL value is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (length < 0) {
+// length = strlen((char *)value)
+// }
+//
+// if (!yaml_check_utf8(value, length)) goto error
+// value_copy = yaml_malloc(length+1)
+// if (!value_copy) goto error
+// memcpy(value_copy, value, length)
+// value_copy[length] = '\0'
+//
+// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// yaml_free(tag_copy)
+// yaml_free(value_copy)
+//
+// return 0
+//}
+//
+///*
+// * Add a sequence node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_sequence(document *yaml_document_t,
+// tag *yaml_char_t, style yaml_sequence_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// struct {
+// start *yaml_node_item_t
+// end *yaml_node_item_t
+// top *yaml_node_item_t
+// } items = { NULL, NULL, NULL }
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error
+//
+// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
+// style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// STACK_DEL(&context, items)
+// yaml_free(tag_copy)
+//
+// return 0
+//}
+//
+///*
+// * Add a mapping node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_mapping(document *yaml_document_t,
+// tag *yaml_char_t, style yaml_mapping_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// struct {
+// start *yaml_node_pair_t
+// end *yaml_node_pair_t
+// top *yaml_node_pair_t
+// } pairs = { NULL, NULL, NULL }
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error
+//
+// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
+// style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// STACK_DEL(&context, pairs)
+// yaml_free(tag_copy)
+//
+// return 0
+//}
+//
+///*
+// * Append an item to a sequence node.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_append_sequence_item(document *yaml_document_t,
+// sequence int, item int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+//
+// assert(document) // Non-NULL document is required.
+// assert(sequence > 0
+// && document.nodes.start + sequence <= document.nodes.top)
+// // Valid sequence id is required.
+// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE)
+// // A sequence node is required.
+// assert(item > 0 && document.nodes.start + item <= document.nodes.top)
+// // Valid item id is required.
+//
+// if (!PUSH(&context,
+// document.nodes.start[sequence-1].data.sequence.items, item))
+// return 0
+//
+// return 1
+//}
+//
+///*
+// * Append a pair of a key and a value to a mapping node.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_append_mapping_pair(document *yaml_document_t,
+// mapping int, key int, value int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+//
+// pair yaml_node_pair_t
+//
+// assert(document) // Non-NULL document is required.
+// assert(mapping > 0
+// && document.nodes.start + mapping <= document.nodes.top)
+// // Valid mapping id is required.
+// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE)
+// // A mapping node is required.
+// assert(key > 0 && document.nodes.start + key <= document.nodes.top)
+// // Valid key id is required.
+// assert(value > 0 && document.nodes.start + value <= document.nodes.top)
+// // Valid value id is required.
+//
+// pair.key = key
+// pair.value = value
+//
+// if (!PUSH(&context,
+// document.nodes.start[mapping-1].data.mapping.pairs, pair))
+// return 0
+//
+// return 1
+//}
+//
+//
diff --git a/vendor/gopkg.in/yaml.v1/decode.go b/vendor/gopkg.in/yaml.v1/decode.go
new file mode 100644
index 000000000..74eda3cb0
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/decode.go
@@ -0,0 +1,538 @@
+package yaml
+
+import (
+ "reflect"
+ "strconv"
+ "time"
+)
+
+const (
+ documentNode = 1 << iota
+ mappingNode
+ sequenceNode
+ scalarNode
+ aliasNode
+)
+
+type node struct {
+ kind int
+ line, column int
+ tag string
+ value string
+ implicit bool
+ children []*node
+ anchors map[string]*node
+}
+
+// ----------------------------------------------------------------------------
+// Parser, produces a node tree out of a libyaml event stream.
+
+type parser struct {
+ parser yaml_parser_t
+ event yaml_event_t
+ doc *node
+}
+
+func newParser(b []byte) *parser {
+ p := parser{}
+ if !yaml_parser_initialize(&p.parser) {
+ panic("Failed to initialize YAML emitter")
+ }
+
+ if len(b) == 0 {
+ b = []byte{'\n'}
+ }
+
+ yaml_parser_set_input_string(&p.parser, b)
+
+ p.skip()
+ if p.event.typ != yaml_STREAM_START_EVENT {
+ panic("Expected stream start event, got " + strconv.Itoa(int(p.event.typ)))
+ }
+ p.skip()
+ return &p
+}
+
+func (p *parser) destroy() {
+ if p.event.typ != yaml_NO_EVENT {
+ yaml_event_delete(&p.event)
+ }
+ yaml_parser_delete(&p.parser)
+}
+
+func (p *parser) skip() {
+ if p.event.typ != yaml_NO_EVENT {
+ if p.event.typ == yaml_STREAM_END_EVENT {
+ panic("Attempted to go past the end of stream. Corrupted value?")
+ }
+ yaml_event_delete(&p.event)
+ }
+ if !yaml_parser_parse(&p.parser, &p.event) {
+ p.fail()
+ }
+}
+
+func (p *parser) fail() {
+ var where string
+ var line int
+ if p.parser.problem_mark.line != 0 {
+ line = p.parser.problem_mark.line
+ } else if p.parser.context_mark.line != 0 {
+ line = p.parser.context_mark.line
+ }
+ if line != 0 {
+ where = "line " + strconv.Itoa(line) + ": "
+ }
+ var msg string
+ if len(p.parser.problem) > 0 {
+ msg = p.parser.problem
+ } else {
+ msg = "Unknown problem parsing YAML content"
+ }
+ panic(where + msg)
+}
+
+func (p *parser) anchor(n *node, anchor []byte) {
+ if anchor != nil {
+ p.doc.anchors[string(anchor)] = n
+ }
+}
+
+func (p *parser) parse() *node {
+ switch p.event.typ {
+ case yaml_SCALAR_EVENT:
+ return p.scalar()
+ case yaml_ALIAS_EVENT:
+ return p.alias()
+ case yaml_MAPPING_START_EVENT:
+ return p.mapping()
+ case yaml_SEQUENCE_START_EVENT:
+ return p.sequence()
+ case yaml_DOCUMENT_START_EVENT:
+ return p.document()
+ case yaml_STREAM_END_EVENT:
+ // Happens when attempting to decode an empty buffer.
+ return nil
+ default:
+ panic("Attempted to parse unknown event: " +
+ strconv.Itoa(int(p.event.typ)))
+ }
+ panic("Unreachable")
+}
+
+func (p *parser) node(kind int) *node {
+ return &node{
+ kind: kind,
+ line: p.event.start_mark.line,
+ column: p.event.start_mark.column,
+ }
+}
+
+func (p *parser) document() *node {
+ n := p.node(documentNode)
+ n.anchors = make(map[string]*node)
+ p.doc = n
+ p.skip()
+ n.children = append(n.children, p.parse())
+ if p.event.typ != yaml_DOCUMENT_END_EVENT {
+ panic("Expected end of document event but got " +
+ strconv.Itoa(int(p.event.typ)))
+ }
+ p.skip()
+ return n
+}
+
+func (p *parser) alias() *node {
+ n := p.node(aliasNode)
+ n.value = string(p.event.anchor)
+ p.skip()
+ return n
+}
+
+func (p *parser) scalar() *node {
+ n := p.node(scalarNode)
+ n.value = string(p.event.value)
+ n.tag = string(p.event.tag)
+ n.implicit = p.event.implicit
+ p.anchor(n, p.event.anchor)
+ p.skip()
+ return n
+}
+
+func (p *parser) sequence() *node {
+ n := p.node(sequenceNode)
+ p.anchor(n, p.event.anchor)
+ p.skip()
+ for p.event.typ != yaml_SEQUENCE_END_EVENT {
+ n.children = append(n.children, p.parse())
+ }
+ p.skip()
+ return n
+}
+
+func (p *parser) mapping() *node {
+ n := p.node(mappingNode)
+ p.anchor(n, p.event.anchor)
+ p.skip()
+ for p.event.typ != yaml_MAPPING_END_EVENT {
+ n.children = append(n.children, p.parse(), p.parse())
+ }
+ p.skip()
+ return n
+}
+
+// ----------------------------------------------------------------------------
+// Decoder, unmarshals a node into a provided value.
+
+type decoder struct {
+ doc *node
+ aliases map[string]bool
+}
+
+func newDecoder() *decoder {
+ d := &decoder{}
+ d.aliases = make(map[string]bool)
+ return d
+}
+
+// d.setter deals with setters and pointer dereferencing and initialization.
+//
+// It's a slightly convoluted case to handle properly:
+//
+// - nil pointers should be initialized, unless being set to nil
+// - we don't know at this point yet what's the value to SetYAML() with.
+// - we can't separate pointer deref/init and setter checking, because
+// a setter may be found while going down a pointer chain.
+//
+// Thus, here is how it takes care of it:
+//
+// - out is provided as a pointer, so that it can be replaced.
+// - when looking at a non-setter ptr, *out=ptr.Elem(), unless tag=!!null
+// - when a setter is found, *out=interface{}, and a set() function is
+// returned to call SetYAML() with the value of *out once it's defined.
+//
+func (d *decoder) setter(tag string, out *reflect.Value, good *bool) (set func()) {
+ if (*out).Kind() != reflect.Ptr && (*out).CanAddr() {
+ setter, _ := (*out).Addr().Interface().(Setter)
+ if setter != nil {
+ var arg interface{}
+ *out = reflect.ValueOf(&arg).Elem()
+ return func() {
+ *good = setter.SetYAML(tag, arg)
+ }
+ }
+ }
+ again := true
+ for again {
+ again = false
+ setter, _ := (*out).Interface().(Setter)
+ if tag != "!!null" || setter != nil {
+ if pv := (*out); pv.Kind() == reflect.Ptr {
+ if pv.IsNil() {
+ *out = reflect.New(pv.Type().Elem()).Elem()
+ pv.Set((*out).Addr())
+ } else {
+ *out = pv.Elem()
+ }
+ setter, _ = pv.Interface().(Setter)
+ again = true
+ }
+ }
+ if setter != nil {
+ var arg interface{}
+ *out = reflect.ValueOf(&arg).Elem()
+ return func() {
+ *good = setter.SetYAML(tag, arg)
+ }
+ }
+ }
+ return nil
+}
+
+func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) {
+ switch n.kind {
+ case documentNode:
+ good = d.document(n, out)
+ case scalarNode:
+ good = d.scalar(n, out)
+ case aliasNode:
+ good = d.alias(n, out)
+ case mappingNode:
+ good = d.mapping(n, out)
+ case sequenceNode:
+ good = d.sequence(n, out)
+ default:
+ panic("Internal error: unknown node kind: " + strconv.Itoa(n.kind))
+ }
+ return
+}
+
+func (d *decoder) document(n *node, out reflect.Value) (good bool) {
+ if len(n.children) == 1 {
+ d.doc = n
+ d.unmarshal(n.children[0], out)
+ return true
+ }
+ return false
+}
+
+func (d *decoder) alias(n *node, out reflect.Value) (good bool) {
+ an, ok := d.doc.anchors[n.value]
+ if !ok {
+ panic("Unknown anchor '" + n.value + "' referenced")
+ }
+ if d.aliases[n.value] {
+ panic("Anchor '" + n.value + "' value contains itself")
+ }
+ d.aliases[n.value] = true
+ good = d.unmarshal(an, out)
+ delete(d.aliases, n.value)
+ return good
+}
+
+var durationType = reflect.TypeOf(time.Duration(0))
+
+func (d *decoder) scalar(n *node, out reflect.Value) (good bool) {
+ var tag string
+ var resolved interface{}
+ if n.tag == "" && !n.implicit {
+ tag = "!!str"
+ resolved = n.value
+ } else {
+ tag, resolved = resolve(n.tag, n.value)
+ }
+ if set := d.setter(tag, &out, &good); set != nil {
+ defer set()
+ }
+ switch out.Kind() {
+ case reflect.String:
+ if resolved != nil {
+ out.SetString(n.value)
+ good = true
+ }
+ case reflect.Interface:
+ if resolved == nil {
+ out.Set(reflect.Zero(out.Type()))
+ } else {
+ out.Set(reflect.ValueOf(resolved))
+ }
+ good = true
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ switch resolved := resolved.(type) {
+ case int:
+ if !out.OverflowInt(int64(resolved)) {
+ out.SetInt(int64(resolved))
+ good = true
+ }
+ case int64:
+ if !out.OverflowInt(resolved) {
+ out.SetInt(resolved)
+ good = true
+ }
+ case float64:
+ if resolved < 1<<63-1 && !out.OverflowInt(int64(resolved)) {
+ out.SetInt(int64(resolved))
+ good = true
+ }
+ case string:
+ if out.Type() == durationType {
+ d, err := time.ParseDuration(resolved)
+ if err == nil {
+ out.SetInt(int64(d))
+ good = true
+ }
+ }
+ }
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ switch resolved := resolved.(type) {
+ case int:
+ if resolved >= 0 {
+ out.SetUint(uint64(resolved))
+ good = true
+ }
+ case int64:
+ if resolved >= 0 {
+ out.SetUint(uint64(resolved))
+ good = true
+ }
+ case float64:
+ if resolved < 1<<64-1 && !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ good = true
+ }
+ }
+ case reflect.Bool:
+ switch resolved := resolved.(type) {
+ case bool:
+ out.SetBool(resolved)
+ good = true
+ }
+ case reflect.Float32, reflect.Float64:
+ switch resolved := resolved.(type) {
+ case int:
+ out.SetFloat(float64(resolved))
+ good = true
+ case int64:
+ out.SetFloat(float64(resolved))
+ good = true
+ case float64:
+ out.SetFloat(resolved)
+ good = true
+ }
+ case reflect.Ptr:
+ switch resolved.(type) {
+ case nil:
+ out.Set(reflect.Zero(out.Type()))
+ good = true
+ default:
+ if out.Type().Elem() == reflect.TypeOf(resolved) {
+ elem := reflect.New(out.Type().Elem())
+ elem.Elem().Set(reflect.ValueOf(resolved))
+ out.Set(elem)
+ good = true
+ }
+ }
+ }
+ return good
+}
+
+func settableValueOf(i interface{}) reflect.Value {
+ v := reflect.ValueOf(i)
+ sv := reflect.New(v.Type()).Elem()
+ sv.Set(v)
+ return sv
+}
+
+func (d *decoder) sequence(n *node, out reflect.Value) (good bool) {
+ if set := d.setter("!!seq", &out, &good); set != nil {
+ defer set()
+ }
+ var iface reflect.Value
+ if out.Kind() == reflect.Interface {
+ // No type hints. Will have to use a generic sequence.
+ iface = out
+ out = settableValueOf(make([]interface{}, 0))
+ }
+
+ if out.Kind() != reflect.Slice {
+ return false
+ }
+ et := out.Type().Elem()
+
+ l := len(n.children)
+ for i := 0; i < l; i++ {
+ e := reflect.New(et).Elem()
+ if ok := d.unmarshal(n.children[i], e); ok {
+ out.Set(reflect.Append(out, e))
+ }
+ }
+ if iface.IsValid() {
+ iface.Set(out)
+ }
+ return true
+}
+
+func (d *decoder) mapping(n *node, out reflect.Value) (good bool) {
+ if set := d.setter("!!map", &out, &good); set != nil {
+ defer set()
+ }
+ if out.Kind() == reflect.Struct {
+ return d.mappingStruct(n, out)
+ }
+
+ if out.Kind() == reflect.Interface {
+ // No type hints. Will have to use a generic map.
+ iface := out
+ out = settableValueOf(make(map[interface{}]interface{}))
+ iface.Set(out)
+ }
+
+ if out.Kind() != reflect.Map {
+ return false
+ }
+ outt := out.Type()
+ kt := outt.Key()
+ et := outt.Elem()
+
+ if out.IsNil() {
+ out.Set(reflect.MakeMap(outt))
+ }
+ l := len(n.children)
+ for i := 0; i < l; i += 2 {
+ if isMerge(n.children[i]) {
+ d.merge(n.children[i+1], out)
+ continue
+ }
+ k := reflect.New(kt).Elem()
+ if d.unmarshal(n.children[i], k) {
+ e := reflect.New(et).Elem()
+ if d.unmarshal(n.children[i+1], e) {
+ out.SetMapIndex(k, e)
+ }
+ }
+ }
+ return true
+}
+
+func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) {
+ sinfo, err := getStructInfo(out.Type())
+ if err != nil {
+ panic(err)
+ }
+ name := settableValueOf("")
+ l := len(n.children)
+ for i := 0; i < l; i += 2 {
+ ni := n.children[i]
+ if isMerge(ni) {
+ d.merge(n.children[i+1], out)
+ continue
+ }
+ if !d.unmarshal(ni, name) {
+ continue
+ }
+ if info, ok := sinfo.FieldsMap[name.String()]; ok {
+ var field reflect.Value
+ if info.Inline == nil {
+ field = out.Field(info.Num)
+ } else {
+ field = out.FieldByIndex(info.Inline)
+ }
+ d.unmarshal(n.children[i+1], field)
+ }
+ }
+ return true
+}
+
+func (d *decoder) merge(n *node, out reflect.Value) {
+ const wantMap = "map merge requires map or sequence of maps as the value"
+ switch n.kind {
+ case mappingNode:
+ d.unmarshal(n, out)
+ case aliasNode:
+ an, ok := d.doc.anchors[n.value]
+ if ok && an.kind != mappingNode {
+ panic(wantMap)
+ }
+ d.unmarshal(n, out)
+ case sequenceNode:
+ // Step backwards as earlier nodes take precedence.
+ for i := len(n.children)-1; i >= 0; i-- {
+ ni := n.children[i]
+ if ni.kind == aliasNode {
+ an, ok := d.doc.anchors[ni.value]
+ if ok && an.kind != mappingNode {
+ panic(wantMap)
+ }
+ } else if ni.kind != mappingNode {
+ panic(wantMap)
+ }
+ d.unmarshal(ni, out)
+ }
+ default:
+ panic(wantMap)
+ }
+}
+
+func isMerge(n *node) bool {
+ return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == "!!merge" || n.tag == "tag:yaml.org,2002:merge")
+}
diff --git a/vendor/gopkg.in/yaml.v1/decode_test.go b/vendor/gopkg.in/yaml.v1/decode_test.go
new file mode 100644
index 000000000..d2b45b37d
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/decode_test.go
@@ -0,0 +1,648 @@
+package yaml_test
+
+import (
+ . "gopkg.in/check.v1"
+ "gopkg.in/yaml.v1"
+ "math"
+ "reflect"
+ "time"
+)
+
+var unmarshalIntTest = 123
+
+var unmarshalTests = []struct {
+ data string
+ value interface{}
+}{
+ {
+ "",
+ &struct{}{},
+ }, {
+ "{}", &struct{}{},
+ }, {
+ "v: hi",
+ map[string]string{"v": "hi"},
+ }, {
+ "v: hi", map[string]interface{}{"v": "hi"},
+ }, {
+ "v: true",
+ map[string]string{"v": "true"},
+ }, {
+ "v: true",
+ map[string]interface{}{"v": true},
+ }, {
+ "v: 10",
+ map[string]interface{}{"v": 10},
+ }, {
+ "v: 0b10",
+ map[string]interface{}{"v": 2},
+ }, {
+ "v: 0xA",
+ map[string]interface{}{"v": 10},
+ }, {
+ "v: 4294967296",
+ map[string]int64{"v": 4294967296},
+ }, {
+ "v: 0.1",
+ map[string]interface{}{"v": 0.1},
+ }, {
+ "v: .1",
+ map[string]interface{}{"v": 0.1},
+ }, {
+ "v: .Inf",
+ map[string]interface{}{"v": math.Inf(+1)},
+ }, {
+ "v: -.Inf",
+ map[string]interface{}{"v": math.Inf(-1)},
+ }, {
+ "v: -10",
+ map[string]interface{}{"v": -10},
+ }, {
+ "v: -.1",
+ map[string]interface{}{"v": -0.1},
+ },
+
+ // Simple values.
+ {
+ "123",
+ &unmarshalIntTest,
+ },
+
+ // Floats from spec
+ {
+ "canonical: 6.8523e+5",
+ map[string]interface{}{"canonical": 6.8523e+5},
+ }, {
+ "expo: 685.230_15e+03",
+ map[string]interface{}{"expo": 685.23015e+03},
+ }, {
+ "fixed: 685_230.15",
+ map[string]interface{}{"fixed": 685230.15},
+ }, {
+ "neginf: -.inf",
+ map[string]interface{}{"neginf": math.Inf(-1)},
+ }, {
+ "fixed: 685_230.15",
+ map[string]float64{"fixed": 685230.15},
+ },
+ //{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported
+ //{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails.
+
+ // Bools from spec
+ {
+ "canonical: y",
+ map[string]interface{}{"canonical": true},
+ }, {
+ "answer: NO",
+ map[string]interface{}{"answer": false},
+ }, {
+ "logical: True",
+ map[string]interface{}{"logical": true},
+ }, {
+ "option: on",
+ map[string]interface{}{"option": true},
+ }, {
+ "option: on",
+ map[string]bool{"option": true},
+ },
+ // Ints from spec
+ {
+ "canonical: 685230",
+ map[string]interface{}{"canonical": 685230},
+ }, {
+ "decimal: +685_230",
+ map[string]interface{}{"decimal": 685230},
+ }, {
+ "octal: 02472256",
+ map[string]interface{}{"octal": 685230},
+ }, {
+ "hexa: 0x_0A_74_AE",
+ map[string]interface{}{"hexa": 685230},
+ }, {
+ "bin: 0b1010_0111_0100_1010_1110",
+ map[string]interface{}{"bin": 685230},
+ }, {
+ "bin: -0b101010",
+ map[string]interface{}{"bin": -42},
+ }, {
+ "decimal: +685_230",
+ map[string]int{"decimal": 685230},
+ },
+
+ //{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported
+
+ // Nulls from spec
+ {
+ "empty:",
+ map[string]interface{}{"empty": nil},
+ }, {
+ "canonical: ~",
+ map[string]interface{}{"canonical": nil},
+ }, {
+ "english: null",
+ map[string]interface{}{"english": nil},
+ }, {
+ "~: null key",
+ map[interface{}]string{nil: "null key"},
+ }, {
+ "empty:",
+ map[string]*bool{"empty": nil},
+ },
+
+ // Flow sequence
+ {
+ "seq: [A,B]",
+ map[string]interface{}{"seq": []interface{}{"A", "B"}},
+ }, {
+ "seq: [A,B,C,]",
+ map[string][]string{"seq": []string{"A", "B", "C"}},
+ }, {
+ "seq: [A,1,C]",
+ map[string][]string{"seq": []string{"A", "1", "C"}},
+ }, {
+ "seq: [A,1,C]",
+ map[string][]int{"seq": []int{1}},
+ }, {
+ "seq: [A,1,C]",
+ map[string]interface{}{"seq": []interface{}{"A", 1, "C"}},
+ },
+ // Block sequence
+ {
+ "seq:\n - A\n - B",
+ map[string]interface{}{"seq": []interface{}{"A", "B"}},
+ }, {
+ "seq:\n - A\n - B\n - C",
+ map[string][]string{"seq": []string{"A", "B", "C"}},
+ }, {
+ "seq:\n - A\n - 1\n - C",
+ map[string][]string{"seq": []string{"A", "1", "C"}},
+ }, {
+ "seq:\n - A\n - 1\n - C",
+ map[string][]int{"seq": []int{1}},
+ }, {
+ "seq:\n - A\n - 1\n - C",
+ map[string]interface{}{"seq": []interface{}{"A", 1, "C"}},
+ },
+
+ // Literal block scalar
+ {
+ "scalar: | # Comment\n\n literal\n\n \ttext\n\n",
+ map[string]string{"scalar": "\nliteral\n\n\ttext\n"},
+ },
+
+ // Folded block scalar
+ {
+ "scalar: > # Comment\n\n folded\n line\n \n next\n line\n * one\n * two\n\n last\n line\n\n",
+ map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"},
+ },
+
+ // Map inside interface with no type hints.
+ {
+ "a: {b: c}",
+ map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}},
+ },
+
+ // Structs and type conversions.
+ {
+ "hello: world",
+ &struct{ Hello string }{"world"},
+ }, {
+ "a: {b: c}",
+ &struct{ A struct{ B string } }{struct{ B string }{"c"}},
+ }, {
+ "a: {b: c}",
+ &struct{ A *struct{ B string } }{&struct{ B string }{"c"}},
+ }, {
+ "a: {b: c}",
+ &struct{ A map[string]string }{map[string]string{"b": "c"}},
+ }, {
+ "a: {b: c}",
+ &struct{ A *map[string]string }{&map[string]string{"b": "c"}},
+ }, {
+ "a:",
+ &struct{ A map[string]string }{},
+ }, {
+ "a: 1",
+ &struct{ A int }{1},
+ }, {
+ "a: 1",
+ &struct{ A float64 }{1},
+ }, {
+ "a: 1.0",
+ &struct{ A int }{1},
+ }, {
+ "a: 1.0",
+ &struct{ A uint }{1},
+ }, {
+ "a: [1, 2]",
+ &struct{ A []int }{[]int{1, 2}},
+ }, {
+ "a: 1",
+ &struct{ B int }{0},
+ }, {
+ "a: 1",
+ &struct {
+ B int "a"
+ }{1},
+ }, {
+ "a: y",
+ &struct{ A bool }{true},
+ },
+
+ // Some cross type conversions
+ {
+ "v: 42",
+ map[string]uint{"v": 42},
+ }, {
+ "v: -42",
+ map[string]uint{},
+ }, {
+ "v: 4294967296",
+ map[string]uint64{"v": 4294967296},
+ }, {
+ "v: -4294967296",
+ map[string]uint64{},
+ },
+
+ // Overflow cases.
+ {
+ "v: 4294967297",
+ map[string]int32{},
+ }, {
+ "v: 128",
+ map[string]int8{},
+ },
+
+ // Quoted values.
+ {
+ "'1': '\"2\"'",
+ map[interface{}]interface{}{"1": "\"2\""},
+ }, {
+ "v:\n- A\n- 'B\n\n C'\n",
+ map[string][]string{"v": []string{"A", "B\nC"}},
+ },
+
+ // Explicit tags.
+ {
+ "v: !!float '1.1'",
+ map[string]interface{}{"v": 1.1},
+ }, {
+ "v: !!null ''",
+ map[string]interface{}{"v": nil},
+ }, {
+ "%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'",
+ map[string]interface{}{"v": 1},
+ },
+
+ // Anchors and aliases.
+ {
+ "a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
+ &struct{ A, B, C, D int }{1, 2, 1, 2},
+ }, {
+ "a: &a {c: 1}\nb: *a",
+ &struct {
+ A, B struct {
+ C int
+ }
+ }{struct{ C int }{1}, struct{ C int }{1}},
+ }, {
+ "a: &a [1, 2]\nb: *a",
+ &struct{ B []int }{[]int{1, 2}},
+ },
+
+ // Bug #1133337
+ {
+ "foo: ''",
+ map[string]*string{"foo": new(string)},
+ }, {
+ "foo: null",
+ map[string]string{},
+ },
+
+ // Ignored field
+ {
+ "a: 1\nb: 2\n",
+ &struct {
+ A int
+ B int "-"
+ }{1, 0},
+ },
+
+ // Bug #1191981
+ {
+ "" +
+ "%YAML 1.1\n" +
+ "--- !!str\n" +
+ `"Generic line break (no glyph)\n\` + "\n" +
+ ` Generic line break (glyphed)\n\` + "\n" +
+ ` Line separator\u2028\` + "\n" +
+ ` Paragraph separator\u2029"` + "\n",
+ "" +
+ "Generic line break (no glyph)\n" +
+ "Generic line break (glyphed)\n" +
+ "Line separator\u2028Paragraph separator\u2029",
+ },
+
+ // Struct inlining
+ {
+ "a: 1\nb: 2\nc: 3\n",
+ &struct {
+ A int
+ C inlineB `yaml:",inline"`
+ }{1, inlineB{2, inlineC{3}}},
+ },
+
+ // bug 1243827
+ {
+ "a: -b_c",
+ map[string]interface{}{"a": "-b_c"},
+ },
+ {
+ "a: +b_c",
+ map[string]interface{}{"a": "+b_c"},
+ },
+ {
+ "a: 50cent_of_dollar",
+ map[string]interface{}{"a": "50cent_of_dollar"},
+ },
+
+ // Duration
+ {
+ "a: 3s",
+ map[string]time.Duration{"a": 3 * time.Second},
+ },
+}
+
+type inlineB struct {
+ B int
+ inlineC `yaml:",inline"`
+}
+
+type inlineC struct {
+ C int
+}
+
+func (s *S) TestUnmarshal(c *C) {
+ for i, item := range unmarshalTests {
+ t := reflect.ValueOf(item.value).Type()
+ var value interface{}
+ switch t.Kind() {
+ case reflect.Map:
+ value = reflect.MakeMap(t).Interface()
+ case reflect.String:
+ t := reflect.ValueOf(item.value).Type()
+ v := reflect.New(t)
+ value = v.Interface()
+ default:
+ pt := reflect.ValueOf(item.value).Type()
+ pv := reflect.New(pt.Elem())
+ value = pv.Interface()
+ }
+ err := yaml.Unmarshal([]byte(item.data), value)
+ c.Assert(err, IsNil, Commentf("Item #%d", i))
+ if t.Kind() == reflect.String {
+ c.Assert(*value.(*string), Equals, item.value, Commentf("Item #%d", i))
+ } else {
+ c.Assert(value, DeepEquals, item.value, Commentf("Item #%d", i))
+ }
+ }
+}
+
+func (s *S) TestUnmarshalNaN(c *C) {
+ value := map[string]interface{}{}
+ err := yaml.Unmarshal([]byte("notanum: .NaN"), &value)
+ c.Assert(err, IsNil)
+ c.Assert(math.IsNaN(value["notanum"].(float64)), Equals, true)
+}
+
+var unmarshalErrorTests = []struct {
+ data, error string
+}{
+ {"v: !!float 'error'", "YAML error: Can't decode !!str 'error' as a !!float"},
+ {"v: [A,", "YAML error: line 1: did not find expected node content"},
+ {"v:\n- [A,", "YAML error: line 2: did not find expected node content"},
+ {"a: *b\n", "YAML error: Unknown anchor 'b' referenced"},
+ {"a: &a\n b: *a\n", "YAML error: Anchor 'a' value contains itself"},
+ {"value: -", "YAML error: block sequence entries are not allowed in this context"},
+}
+
+func (s *S) TestUnmarshalErrors(c *C) {
+ for _, item := range unmarshalErrorTests {
+ var value interface{}
+ err := yaml.Unmarshal([]byte(item.data), &value)
+ c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value))
+ }
+}
+
+var setterTests = []struct {
+ data, tag string
+ value interface{}
+}{
+ {"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}},
+ {"_: [1,A]", "!!seq", []interface{}{1, "A"}},
+ {"_: 10", "!!int", 10},
+ {"_: null", "!!null", nil},
+ {`_: BAR!`, "!!str", "BAR!"},
+ {`_: "BAR!"`, "!!str", "BAR!"},
+ {"_: !!foo 'BAR!'", "!!foo", "BAR!"},
+}
+
+var setterResult = map[int]bool{}
+
+type typeWithSetter struct {
+ tag string
+ value interface{}
+}
+
+func (o *typeWithSetter) SetYAML(tag string, value interface{}) (ok bool) {
+ o.tag = tag
+ o.value = value
+ if i, ok := value.(int); ok {
+ if result, ok := setterResult[i]; ok {
+ return result
+ }
+ }
+ return true
+}
+
+type setterPointerType struct {
+ Field *typeWithSetter "_"
+}
+
+type setterValueType struct {
+ Field typeWithSetter "_"
+}
+
+func (s *S) TestUnmarshalWithPointerSetter(c *C) {
+ for _, item := range setterTests {
+ obj := &setterPointerType{}
+ err := yaml.Unmarshal([]byte(item.data), obj)
+ c.Assert(err, IsNil)
+ c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value))
+ c.Assert(obj.Field.tag, Equals, item.tag)
+ c.Assert(obj.Field.value, DeepEquals, item.value)
+ }
+}
+
+func (s *S) TestUnmarshalWithValueSetter(c *C) {
+ for _, item := range setterTests {
+ obj := &setterValueType{}
+ err := yaml.Unmarshal([]byte(item.data), obj)
+ c.Assert(err, IsNil)
+ c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value))
+ c.Assert(obj.Field.tag, Equals, item.tag)
+ c.Assert(obj.Field.value, DeepEquals, item.value)
+ }
+}
+
+func (s *S) TestUnmarshalWholeDocumentWithSetter(c *C) {
+ obj := &typeWithSetter{}
+ err := yaml.Unmarshal([]byte(setterTests[0].data), obj)
+ c.Assert(err, IsNil)
+ c.Assert(obj.tag, Equals, setterTests[0].tag)
+ value, ok := obj.value.(map[interface{}]interface{})
+ c.Assert(ok, Equals, true)
+ c.Assert(value["_"], DeepEquals, setterTests[0].value)
+}
+
+func (s *S) TestUnmarshalWithFalseSetterIgnoresValue(c *C) {
+ setterResult[2] = false
+ setterResult[4] = false
+ defer func() {
+ delete(setterResult, 2)
+ delete(setterResult, 4)
+ }()
+
+ m := map[string]*typeWithSetter{}
+ data := `{abc: 1, def: 2, ghi: 3, jkl: 4}`
+ err := yaml.Unmarshal([]byte(data), m)
+ c.Assert(err, IsNil)
+ c.Assert(m["abc"], NotNil)
+ c.Assert(m["def"], IsNil)
+ c.Assert(m["ghi"], NotNil)
+ c.Assert(m["jkl"], IsNil)
+
+ c.Assert(m["abc"].value, Equals, 1)
+ c.Assert(m["ghi"].value, Equals, 3)
+}
+
+// From http://yaml.org/type/merge.html
+var mergeTests = `
+anchors:
+ - &CENTER { "x": 1, "y": 2 }
+ - &LEFT { "x": 0, "y": 2 }
+ - &BIG { "r": 10 }
+ - &SMALL { "r": 1 }
+
+# All the following maps are equal:
+
+plain:
+ # Explicit keys
+ "x": 1
+ "y": 2
+ "r": 10
+ label: center/big
+
+mergeOne:
+ # Merge one map
+ << : *CENTER
+ "r": 10
+ label: center/big
+
+mergeMultiple:
+ # Merge multiple maps
+ << : [ *CENTER, *BIG ]
+ label: center/big
+
+override:
+ # Override
+ << : [ *BIG, *LEFT, *SMALL ]
+ "x": 1
+ label: center/big
+
+shortTag:
+ # Explicit short merge tag
+ !!merge "<<" : [ *CENTER, *BIG ]
+ label: center/big
+
+longTag:
+ # Explicit merge long tag
+ ! "<<" : [ *CENTER, *BIG ]
+ label: center/big
+
+inlineMap:
+ # Inlined map
+ << : {"x": 1, "y": 2, "r": 10}
+ label: center/big
+
+inlineSequenceMap:
+ # Inlined map in sequence
+ << : [ *CENTER, {"r": 10} ]
+ label: center/big
+`
+
+func (s *S) TestMerge(c *C) {
+ var want = map[interface{}]interface{}{
+ "x": 1,
+ "y": 2,
+ "r": 10,
+ "label": "center/big",
+ }
+
+ var m map[string]interface{}
+ err := yaml.Unmarshal([]byte(mergeTests), &m)
+ c.Assert(err, IsNil)
+ for name, test := range m {
+ if name == "anchors" {
+ continue
+ }
+ c.Assert(test, DeepEquals, want, Commentf("test %q failed", name))
+ }
+}
+
+func (s *S) TestMergeStruct(c *C) {
+ type Data struct {
+ X, Y, R int
+ Label string
+ }
+ want := Data{1, 2, 10, "center/big"}
+
+ var m map[string]Data
+ err := yaml.Unmarshal([]byte(mergeTests), &m)
+ c.Assert(err, IsNil)
+ for name, test := range m {
+ if name == "anchors" {
+ continue
+ }
+ c.Assert(test, Equals, want, Commentf("test %q failed", name))
+ }
+}
+
+//var data []byte
+//func init() {
+// var err error
+// data, err = ioutil.ReadFile("/tmp/file.yaml")
+// if err != nil {
+// panic(err)
+// }
+//}
+//
+//func (s *S) BenchmarkUnmarshal(c *C) {
+// var err error
+// for i := 0; i < c.N; i++ {
+// var v map[string]interface{}
+// err = yaml.Unmarshal(data, &v)
+// }
+// if err != nil {
+// panic(err)
+// }
+//}
+//
+//func (s *S) BenchmarkMarshal(c *C) {
+// var v map[string]interface{}
+// yaml.Unmarshal(data, &v)
+// c.ResetTimer()
+// for i := 0; i < c.N; i++ {
+// yaml.Marshal(&v)
+// }
+//}
diff --git a/vendor/gopkg.in/yaml.v1/emitterc.go b/vendor/gopkg.in/yaml.v1/emitterc.go
new file mode 100644
index 000000000..542ffd278
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/emitterc.go
@@ -0,0 +1,1682 @@
+package yaml
+
+import (
+ "bytes"
+)
+
+// Flush the buffer if needed.
+func flush(emitter *yaml_emitter_t) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) {
+ return yaml_emitter_flush(emitter)
+ }
+ return true
+}
+
+// Put a character to the output buffer.
+func put(emitter *yaml_emitter_t, value byte) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
+ return false
+ }
+ emitter.buffer[emitter.buffer_pos] = value
+ emitter.buffer_pos++
+ emitter.column++
+ return true
+}
+
+// Put a line break to the output buffer.
+func put_break(emitter *yaml_emitter_t) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
+ return false
+ }
+ switch emitter.line_break {
+ case yaml_CR_BREAK:
+ emitter.buffer[emitter.buffer_pos] = '\r'
+ emitter.buffer_pos += 1
+ case yaml_LN_BREAK:
+ emitter.buffer[emitter.buffer_pos] = '\n'
+ emitter.buffer_pos += 1
+ case yaml_CRLN_BREAK:
+ emitter.buffer[emitter.buffer_pos+0] = '\r'
+ emitter.buffer[emitter.buffer_pos+1] = '\n'
+ emitter.buffer_pos += 2
+ default:
+ panic("unknown line break setting")
+ }
+ emitter.column = 0
+ emitter.line++
+ return true
+}
+
+// Copy a character from a string into buffer.
+func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
+ return false
+ }
+ p := emitter.buffer_pos
+ w := width(s[*i])
+ switch w {
+ case 4:
+ emitter.buffer[p+3] = s[*i+3]
+ fallthrough
+ case 3:
+ emitter.buffer[p+2] = s[*i+2]
+ fallthrough
+ case 2:
+ emitter.buffer[p+1] = s[*i+1]
+ fallthrough
+ case 1:
+ emitter.buffer[p+0] = s[*i+0]
+ default:
+ panic("unknown character width")
+ }
+ emitter.column++
+ emitter.buffer_pos += w
+ *i += w
+ return true
+}
+
+// Write a whole string into buffer.
+func write_all(emitter *yaml_emitter_t, s []byte) bool {
+ for i := 0; i < len(s); {
+ if !write(emitter, s, &i) {
+ return false
+ }
+ }
+ return true
+}
+
+// Copy a line break character from a string into buffer.
+func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
+ if s[*i] == '\n' {
+ if !put_break(emitter) {
+ return false
+ }
+ *i++
+ } else {
+ if !write(emitter, s, i) {
+ return false
+ }
+ emitter.column = 0
+ emitter.line++
+ }
+ return true
+}
+
+// Set an emitter error and return false.
+func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
+ emitter.error = yaml_EMITTER_ERROR
+ emitter.problem = problem
+ return false
+}
+
+// Emit an event.
+func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ emitter.events = append(emitter.events, *event)
+ for !yaml_emitter_need_more_events(emitter) {
+ event := &emitter.events[emitter.events_head]
+ if !yaml_emitter_analyze_event(emitter, event) {
+ return false
+ }
+ if !yaml_emitter_state_machine(emitter, event) {
+ return false
+ }
+ yaml_event_delete(event)
+ emitter.events_head++
+ }
+ return true
+}
+
+// Check if we need to accumulate more events before emitting.
+//
+// We accumulate extra
+// - 1 event for DOCUMENT-START
+// - 2 events for SEQUENCE-START
+// - 3 events for MAPPING-START
+//
+func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
+ if emitter.events_head == len(emitter.events) {
+ return true
+ }
+ var accumulate int
+ switch emitter.events[emitter.events_head].typ {
+ case yaml_DOCUMENT_START_EVENT:
+ accumulate = 1
+ break
+ case yaml_SEQUENCE_START_EVENT:
+ accumulate = 2
+ break
+ case yaml_MAPPING_START_EVENT:
+ accumulate = 3
+ break
+ default:
+ return false
+ }
+ if len(emitter.events)-emitter.events_head > accumulate {
+ return false
+ }
+ var level int
+ for i := emitter.events_head; i < len(emitter.events); i++ {
+ switch emitter.events[i].typ {
+ case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
+ level++
+ case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
+ level--
+ }
+ if level == 0 {
+ return false
+ }
+ }
+ return true
+}
+
+// Append a directive to the directives stack.
+func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
+ for i := 0; i < len(emitter.tag_directives); i++ {
+ if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
+ if allow_duplicates {
+ return true
+ }
+ return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
+ }
+ }
+
+ // [Go] Do we actually need to copy this given garbage collection
+ // and the lack of deallocating destructors?
+ tag_copy := yaml_tag_directive_t{
+ handle: make([]byte, len(value.handle)),
+ prefix: make([]byte, len(value.prefix)),
+ }
+ copy(tag_copy.handle, value.handle)
+ copy(tag_copy.prefix, value.prefix)
+ emitter.tag_directives = append(emitter.tag_directives, tag_copy)
+ return true
+}
+
+// Increase the indentation level.
+func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
+ emitter.indents = append(emitter.indents, emitter.indent)
+ if emitter.indent < 0 {
+ if flow {
+ emitter.indent = emitter.best_indent
+ } else {
+ emitter.indent = 0
+ }
+ } else if !indentless {
+ emitter.indent += emitter.best_indent
+ }
+ return true
+}
+
+// State dispatcher.
+func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ switch emitter.state {
+ default:
+ case yaml_EMIT_STREAM_START_STATE:
+ return yaml_emitter_emit_stream_start(emitter, event)
+
+ case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
+ return yaml_emitter_emit_document_start(emitter, event, true)
+
+ case yaml_EMIT_DOCUMENT_START_STATE:
+ return yaml_emitter_emit_document_start(emitter, event, false)
+
+ case yaml_EMIT_DOCUMENT_CONTENT_STATE:
+ return yaml_emitter_emit_document_content(emitter, event)
+
+ case yaml_EMIT_DOCUMENT_END_STATE:
+ return yaml_emitter_emit_document_end(emitter, event)
+
+ case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
+ return yaml_emitter_emit_flow_sequence_item(emitter, event, true)
+
+ case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
+ return yaml_emitter_emit_flow_sequence_item(emitter, event, false)
+
+ case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
+ return yaml_emitter_emit_flow_mapping_key(emitter, event, true)
+
+ case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
+ return yaml_emitter_emit_flow_mapping_key(emitter, event, false)
+
+ case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
+ return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
+
+ case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
+ return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
+
+ case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
+ return yaml_emitter_emit_block_sequence_item(emitter, event, true)
+
+ case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
+ return yaml_emitter_emit_block_sequence_item(emitter, event, false)
+
+ case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return yaml_emitter_emit_block_mapping_key(emitter, event, true)
+
+ case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
+ return yaml_emitter_emit_block_mapping_key(emitter, event, false)
+
+ case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
+ return yaml_emitter_emit_block_mapping_value(emitter, event, true)
+
+ case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
+ return yaml_emitter_emit_block_mapping_value(emitter, event, false)
+
+ case yaml_EMIT_END_STATE:
+ return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
+ }
+ panic("invalid emitter state")
+}
+
+// Expect STREAM-START.
+func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if event.typ != yaml_STREAM_START_EVENT {
+ return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
+ }
+ if emitter.encoding == yaml_ANY_ENCODING {
+ emitter.encoding = event.encoding
+ if emitter.encoding == yaml_ANY_ENCODING {
+ emitter.encoding = yaml_UTF8_ENCODING
+ }
+ }
+ if emitter.best_indent < 2 || emitter.best_indent > 9 {
+ emitter.best_indent = 2
+ }
+ if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
+ emitter.best_width = 80
+ }
+ if emitter.best_width < 0 {
+ emitter.best_width = 1<<31 - 1
+ }
+ if emitter.line_break == yaml_ANY_BREAK {
+ emitter.line_break = yaml_LN_BREAK
+ }
+
+ emitter.indent = -1
+ emitter.line = 0
+ emitter.column = 0
+ emitter.whitespace = true
+ emitter.indention = true
+
+ if emitter.encoding != yaml_UTF8_ENCODING {
+ if !yaml_emitter_write_bom(emitter) {
+ return false
+ }
+ }
+ emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
+ return true
+}
+
+// Expect DOCUMENT-START or STREAM-END.
+func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+
+ if event.typ == yaml_DOCUMENT_START_EVENT {
+
+ if event.version_directive != nil {
+ if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
+ return false
+ }
+ }
+
+ for i := 0; i < len(event.tag_directives); i++ {
+ tag_directive := &event.tag_directives[i]
+ if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
+ return false
+ }
+ if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
+ return false
+ }
+ }
+
+ for i := 0; i < len(default_tag_directives); i++ {
+ tag_directive := &default_tag_directives[i]
+ if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
+ return false
+ }
+ }
+
+ implicit := event.implicit
+ if !first || emitter.canonical {
+ implicit = false
+ }
+
+ if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
+ if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+
+ if event.version_directive != nil {
+ implicit = false
+ if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+
+ if len(event.tag_directives) > 0 {
+ implicit = false
+ for i := 0; i < len(event.tag_directives); i++ {
+ tag_directive := &event.tag_directives[i]
+ if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
+ return false
+ }
+ if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ }
+
+ if yaml_emitter_check_empty_document(emitter) {
+ implicit = false
+ }
+ if !implicit {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
+ return false
+ }
+ if emitter.canonical {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ }
+
+ emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
+ return true
+ }
+
+ if event.typ == yaml_STREAM_END_EVENT {
+ if emitter.open_ended {
+ if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_flush(emitter) {
+ return false
+ }
+ emitter.state = yaml_EMIT_END_STATE
+ return true
+ }
+
+ return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
+}
+
+// Expect the root node.
+func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
+ return yaml_emitter_emit_node(emitter, event, true, false, false, false)
+}
+
+// Expect DOCUMENT-END.
+func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if event.typ != yaml_DOCUMENT_END_EVENT {
+ return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if !event.implicit {
+ // [Go] Allocate the slice elsewhere.
+ if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_flush(emitter) {
+ return false
+ }
+ emitter.state = yaml_EMIT_DOCUMENT_START_STATE
+ emitter.tag_directives = emitter.tag_directives[:0]
+ return true
+}
+
+// Expect a flow item node.
+func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+ if first {
+ if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
+ return false
+ }
+ if !yaml_emitter_increase_indent(emitter, true, false) {
+ return false
+ }
+ emitter.flow_level++
+ }
+
+ if event.typ == yaml_SEQUENCE_END_EVENT {
+ emitter.flow_level--
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ if emitter.canonical && !first {
+ if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+
+ return true
+ }
+
+ if !first {
+ if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
+ return false
+ }
+ }
+
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, true, false, false)
+}
+
+// Expect a flow key node.
+func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+ if first {
+ if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
+ return false
+ }
+ if !yaml_emitter_increase_indent(emitter, true, false) {
+ return false
+ }
+ emitter.flow_level++
+ }
+
+ if event.typ == yaml_MAPPING_END_EVENT {
+ emitter.flow_level--
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ if emitter.canonical && !first {
+ if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+
+ if !first {
+ if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
+ return false
+ }
+ }
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+
+ if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, true)
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, false)
+}
+
+// Expect a flow value node.
+func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
+ if simple {
+ if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
+ return false
+ }
+ } else {
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
+ return false
+ }
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, false)
+}
+
+// Expect a block item node.
+func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+ if first {
+ if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) {
+ return false
+ }
+ }
+ if event.typ == yaml_SEQUENCE_END_EVENT {
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, true, false, false)
+}
+
+// Expect a block key node.
+func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+ if first {
+ if !yaml_emitter_increase_indent(emitter, false, false) {
+ return false
+ }
+ }
+ if event.typ == yaml_MAPPING_END_EVENT {
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if yaml_emitter_check_simple_key(emitter) {
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, true)
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, false)
+}
+
+// Expect a block value node.
+func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
+ if simple {
+ if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
+ return false
+ }
+ } else {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
+ return false
+ }
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, false)
+}
+
+// Expect a node.
+func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
+ root bool, sequence bool, mapping bool, simple_key bool) bool {
+
+ emitter.root_context = root
+ emitter.sequence_context = sequence
+ emitter.mapping_context = mapping
+ emitter.simple_key_context = simple_key
+
+ switch event.typ {
+ case yaml_ALIAS_EVENT:
+ return yaml_emitter_emit_alias(emitter, event)
+ case yaml_SCALAR_EVENT:
+ return yaml_emitter_emit_scalar(emitter, event)
+ case yaml_SEQUENCE_START_EVENT:
+ return yaml_emitter_emit_sequence_start(emitter, event)
+ case yaml_MAPPING_START_EVENT:
+ return yaml_emitter_emit_mapping_start(emitter, event)
+ default:
+ return yaml_emitter_set_emitter_error(emitter,
+ "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS")
+ }
+ return false
+}
+
+// Expect ALIAS.
+func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if !yaml_emitter_process_anchor(emitter) {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+}
+
+// Expect SCALAR.
+func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if !yaml_emitter_select_scalar_style(emitter, event) {
+ return false
+ }
+ if !yaml_emitter_process_anchor(emitter) {
+ return false
+ }
+ if !yaml_emitter_process_tag(emitter) {
+ return false
+ }
+ if !yaml_emitter_increase_indent(emitter, true, false) {
+ return false
+ }
+ if !yaml_emitter_process_scalar(emitter) {
+ return false
+ }
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+}
+
+// Expect SEQUENCE-START.
+func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if !yaml_emitter_process_anchor(emitter) {
+ return false
+ }
+ if !yaml_emitter_process_tag(emitter) {
+ return false
+ }
+ if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
+ yaml_emitter_check_empty_sequence(emitter) {
+ emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
+ } else {
+ emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
+ }
+ return true
+}
+
+// Expect MAPPING-START.
+func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if !yaml_emitter_process_anchor(emitter) {
+ return false
+ }
+ if !yaml_emitter_process_tag(emitter) {
+ return false
+ }
+ if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
+ yaml_emitter_check_empty_mapping(emitter) {
+ emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
+ } else {
+ emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
+ }
+ return true
+}
+
+// Check if the document content is an empty scalar.
+func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
+ return false // [Go] Huh?
+}
+
+// Check if the next events represent an empty sequence.
+func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
+ if len(emitter.events)-emitter.events_head < 2 {
+ return false
+ }
+ return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
+ emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
+}
+
+// Check if the next events represent an empty mapping.
+func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
+ if len(emitter.events)-emitter.events_head < 2 {
+ return false
+ }
+ return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
+ emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
+}
+
+// Check if the next node can be expressed as a simple key.
+func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
+ length := 0
+ switch emitter.events[emitter.events_head].typ {
+ case yaml_ALIAS_EVENT:
+ length += len(emitter.anchor_data.anchor)
+ case yaml_SCALAR_EVENT:
+ if emitter.scalar_data.multiline {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix) +
+ len(emitter.scalar_data.value)
+ case yaml_SEQUENCE_START_EVENT:
+ if !yaml_emitter_check_empty_sequence(emitter) {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix)
+ case yaml_MAPPING_START_EVENT:
+ if !yaml_emitter_check_empty_mapping(emitter) {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix)
+ default:
+ return false
+ }
+ return length <= 128
+}
+
+// Determine an acceptable scalar style.
+func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+
+ no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
+ if no_tag && !event.implicit && !event.quoted_implicit {
+ return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
+ }
+
+ style := event.scalar_style()
+ if style == yaml_ANY_SCALAR_STYLE {
+ style = yaml_PLAIN_SCALAR_STYLE
+ }
+ if emitter.canonical {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ if emitter.simple_key_context && emitter.scalar_data.multiline {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+
+ if style == yaml_PLAIN_SCALAR_STYLE {
+ if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
+ emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ if no_tag && !event.implicit {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ }
+ if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
+ if !emitter.scalar_data.single_quoted_allowed {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ }
+ if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
+ if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ }
+
+ if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
+ emitter.tag_data.handle = []byte{'!'}
+ }
+ emitter.scalar_data.style = style
+ return true
+}
+
+// Write an achor.
+func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
+ if emitter.anchor_data.anchor == nil {
+ return true
+ }
+ c := []byte{'&'}
+ if emitter.anchor_data.alias {
+ c[0] = '*'
+ }
+ if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
+ return false
+ }
+ return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
+}
+
+// Write a tag.
+func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
+ if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
+ return true
+ }
+ if len(emitter.tag_data.handle) > 0 {
+ if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
+ return false
+ }
+ if len(emitter.tag_data.suffix) > 0 {
+ if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
+ return false
+ }
+ }
+ } else {
+ // [Go] Allocate these slices elsewhere.
+ if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
+ return false
+ }
+ }
+ return true
+}
+
+// Write a scalar.
+func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
+ switch emitter.scalar_data.style {
+ case yaml_PLAIN_SCALAR_STYLE:
+ return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_SINGLE_QUOTED_SCALAR_STYLE:
+ return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
+ return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_LITERAL_SCALAR_STYLE:
+ return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
+
+ case yaml_FOLDED_SCALAR_STYLE:
+ return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
+ }
+ panic("unknown scalar style")
+}
+
+// Check if a %YAML directive is valid.
+func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
+ if version_directive.major != 1 || version_directive.minor != 1 {
+ return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
+ }
+ return true
+}
+
+// Check if a %TAG directive is valid.
+func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
+ handle := tag_directive.handle
+ prefix := tag_directive.prefix
+ if len(handle) == 0 {
+ return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
+ }
+ if handle[0] != '!' {
+ return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
+ }
+ if handle[len(handle)-1] != '!' {
+ return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
+ }
+ for i := 1; i < len(handle)-1; i += width(handle[i]) {
+ if !is_alpha(handle, i) {
+ return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
+ }
+ }
+ if len(prefix) == 0 {
+ return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
+ }
+ return true
+}
+
+// Check if an anchor is valid.
+func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
+ if len(anchor) == 0 {
+ problem := "anchor value must not be empty"
+ if alias {
+ problem = "alias value must not be empty"
+ }
+ return yaml_emitter_set_emitter_error(emitter, problem)
+ }
+ for i := 0; i < len(anchor); i += width(anchor[i]) {
+ if !is_alpha(anchor, i) {
+ problem := "anchor value must contain alphanumerical characters only"
+ if alias {
+ problem = "alias value must contain alphanumerical characters only"
+ }
+ return yaml_emitter_set_emitter_error(emitter, problem)
+ }
+ }
+ emitter.anchor_data.anchor = anchor
+ emitter.anchor_data.alias = alias
+ return true
+}
+
+// Check if a tag is valid.
+func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
+ if len(tag) == 0 {
+ return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
+ }
+ for i := 0; i < len(emitter.tag_directives); i++ {
+ tag_directive := &emitter.tag_directives[i]
+ if bytes.HasPrefix(tag, tag_directive.prefix) {
+ emitter.tag_data.handle = tag_directive.handle
+ emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
+ }
+ return true
+ }
+ emitter.tag_data.suffix = tag
+ return true
+}
+
+// Check if a scalar is valid.
+func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
+ var (
+ block_indicators = false
+ flow_indicators = false
+ line_breaks = false
+ special_characters = false
+
+ leading_space = false
+ leading_break = false
+ trailing_space = false
+ trailing_break = false
+ break_space = false
+ space_break = false
+
+ preceeded_by_whitespace = false
+ followed_by_whitespace = false
+ previous_space = false
+ previous_break = false
+ )
+
+ emitter.scalar_data.value = value
+
+ if len(value) == 0 {
+ emitter.scalar_data.multiline = false
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = true
+ emitter.scalar_data.single_quoted_allowed = true
+ emitter.scalar_data.block_allowed = false
+ return true
+ }
+
+ if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
+ block_indicators = true
+ flow_indicators = true
+ }
+
+ preceeded_by_whitespace = true
+ for i, w := 0, 0; i < len(value); i += w {
+ w = width(value[0])
+ followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
+
+ if i == 0 {
+ switch value[i] {
+ case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
+ flow_indicators = true
+ block_indicators = true
+ case '?', ':':
+ flow_indicators = true
+ if followed_by_whitespace {
+ block_indicators = true
+ }
+ case '-':
+ if followed_by_whitespace {
+ flow_indicators = true
+ block_indicators = true
+ }
+ }
+ } else {
+ switch value[i] {
+ case ',', '?', '[', ']', '{', '}':
+ flow_indicators = true
+ case ':':
+ flow_indicators = true
+ if followed_by_whitespace {
+ block_indicators = true
+ }
+ case '#':
+ if preceeded_by_whitespace {
+ flow_indicators = true
+ block_indicators = true
+ }
+ }
+ }
+
+ if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
+ special_characters = true
+ }
+ if is_space(value, i) {
+ if i == 0 {
+ leading_space = true
+ }
+ if i+width(value[i]) == len(value) {
+ trailing_space = true
+ }
+ if previous_break {
+ break_space = true
+ }
+ previous_space = true
+ previous_break = false
+ } else if is_break(value, i) {
+ line_breaks = true
+ if i == 0 {
+ leading_break = true
+ }
+ if i+width(value[i]) == len(value) {
+ trailing_break = true
+ }
+ if previous_space {
+ space_break = true
+ }
+ previous_space = false
+ previous_break = true
+ } else {
+ previous_space = false
+ previous_break = false
+ }
+
+ // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
+ preceeded_by_whitespace = is_blankz(value, i)
+ }
+
+ emitter.scalar_data.multiline = line_breaks
+ emitter.scalar_data.flow_plain_allowed = true
+ emitter.scalar_data.block_plain_allowed = true
+ emitter.scalar_data.single_quoted_allowed = true
+ emitter.scalar_data.block_allowed = true
+
+ if leading_space || leading_break || trailing_space || trailing_break {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ if trailing_space {
+ emitter.scalar_data.block_allowed = false
+ }
+ if break_space {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ emitter.scalar_data.single_quoted_allowed = false
+ }
+ if space_break || special_characters {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ emitter.scalar_data.single_quoted_allowed = false
+ emitter.scalar_data.block_allowed = false
+ }
+ if line_breaks {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ if flow_indicators {
+ emitter.scalar_data.flow_plain_allowed = false
+ }
+ if block_indicators {
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ return true
+}
+
+// Check if the event data is valid.
+func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+
+ emitter.anchor_data.anchor = nil
+ emitter.tag_data.handle = nil
+ emitter.tag_data.suffix = nil
+ emitter.scalar_data.value = nil
+
+ switch event.typ {
+ case yaml_ALIAS_EVENT:
+ if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
+ return false
+ }
+
+ case yaml_SCALAR_EVENT:
+ if len(event.anchor) > 0 {
+ if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
+ if !yaml_emitter_analyze_tag(emitter, event.tag) {
+ return false
+ }
+ }
+ if !yaml_emitter_analyze_scalar(emitter, event.value) {
+ return false
+ }
+
+ case yaml_SEQUENCE_START_EVENT:
+ if len(event.anchor) > 0 {
+ if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
+ if !yaml_emitter_analyze_tag(emitter, event.tag) {
+ return false
+ }
+ }
+
+ case yaml_MAPPING_START_EVENT:
+ if len(event.anchor) > 0 {
+ if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
+ if !yaml_emitter_analyze_tag(emitter, event.tag) {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+// Write the BOM character.
+func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
+ if !flush(emitter) {
+ return false
+ }
+ pos := emitter.buffer_pos
+ emitter.buffer[pos+0] = '\xEF'
+ emitter.buffer[pos+1] = '\xBB'
+ emitter.buffer[pos+2] = '\xBF'
+ emitter.buffer_pos += 3
+ return true
+}
+
+func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
+ indent := emitter.indent
+ if indent < 0 {
+ indent = 0
+ }
+ if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
+ if !put_break(emitter) {
+ return false
+ }
+ }
+ for emitter.column < indent {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+ emitter.whitespace = true
+ emitter.indention = true
+ return true
+}
+
+func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
+ if need_whitespace && !emitter.whitespace {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+ if !write_all(emitter, indicator) {
+ return false
+ }
+ emitter.whitespace = is_whitespace
+ emitter.indention = (emitter.indention && is_indention)
+ emitter.open_ended = false
+ return true
+}
+
+func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
+ if !write_all(emitter, value) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
+ if !emitter.whitespace {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+ if !write_all(emitter, value) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
+ if need_whitespace && !emitter.whitespace {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+ for i := 0; i < len(value); {
+ var must_write bool
+ switch value[i] {
+ case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
+ must_write = true
+ default:
+ must_write = is_alpha(value, i)
+ }
+ if must_write {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ } else {
+ w := width(value[i])
+ for k := 0; k < w; k++ {
+ octet := value[i]
+ i++
+
+ c := octet >> 4
+ if c < 10 {
+ c += '0'
+ } else {
+ c += 'A' - 10
+ }
+ if !put(emitter, c) {
+ return false
+ }
+
+ c = octet & 0x0f
+ if c < 10 {
+ c += '0'
+ } else {
+ c += 'A' - 10
+ }
+ if !put(emitter, c) {
+ return false
+ }
+ }
+ }
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
+ if !emitter.whitespace {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+
+ spaces := false
+ breaks := false
+ for i := 0; i < len(value); {
+ if is_space(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ }
+ spaces = true
+ } else if is_break(value, i) {
+ if !breaks && value[i] == '\n' {
+ if !put_break(emitter) {
+ return false
+ }
+ }
+ if !write_break(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !write(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = false
+ spaces = false
+ breaks = false
+ }
+ }
+
+ emitter.whitespace = false
+ emitter.indention = false
+ if emitter.root_context {
+ emitter.open_ended = true
+ }
+
+ return true
+}
+
+func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
+
+ if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
+ return false
+ }
+
+ spaces := false
+ breaks := false
+ for i := 0; i < len(value); {
+ if is_space(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ }
+ spaces = true
+ } else if is_break(value, i) {
+ if !breaks && value[i] == '\n' {
+ if !put_break(emitter) {
+ return false
+ }
+ }
+ if !write_break(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if value[i] == '\'' {
+ if !put(emitter, '\'') {
+ return false
+ }
+ }
+ if !write(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = false
+ spaces = false
+ breaks = false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
+ spaces := false
+ if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
+ return false
+ }
+
+ for i := 0; i < len(value); {
+ if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
+ is_bom(value, i) || is_break(value, i) ||
+ value[i] == '"' || value[i] == '\\' {
+
+ octet := value[i]
+
+ var w int
+ var v rune
+ switch {
+ case octet&0x80 == 0x00:
+ w, v = 1, rune(octet&0x7F)
+ case octet&0xE0 == 0xC0:
+ w, v = 2, rune(octet&0x1F)
+ case octet&0xF0 == 0xE0:
+ w, v = 3, rune(octet&0x0F)
+ case octet&0xF8 == 0xF0:
+ w, v = 4, rune(octet&0x07)
+ }
+ for k := 1; k < w; k++ {
+ octet = value[i+k]
+ v = (v << 6) + (rune(octet) & 0x3F)
+ }
+ i += w
+
+ if !put(emitter, '\\') {
+ return false
+ }
+
+ var ok bool
+ switch v {
+ case 0x00:
+ ok = put(emitter, '0')
+ case 0x07:
+ ok = put(emitter, 'a')
+ case 0x08:
+ ok = put(emitter, 'b')
+ case 0x09:
+ ok = put(emitter, 't')
+ case 0x0A:
+ ok = put(emitter, 'n')
+ case 0x0b:
+ ok = put(emitter, 'v')
+ case 0x0c:
+ ok = put(emitter, 'f')
+ case 0x0d:
+ ok = put(emitter, 'r')
+ case 0x1b:
+ ok = put(emitter, 'e')
+ case 0x22:
+ ok = put(emitter, '"')
+ case 0x5c:
+ ok = put(emitter, '\\')
+ case 0x85:
+ ok = put(emitter, 'N')
+ case 0xA0:
+ ok = put(emitter, '_')
+ case 0x2028:
+ ok = put(emitter, 'L')
+ case 0x2029:
+ ok = put(emitter, 'P')
+ default:
+ if v <= 0xFF {
+ ok = put(emitter, 'x')
+ w = 2
+ } else if v <= 0xFFFF {
+ ok = put(emitter, 'u')
+ w = 4
+ } else {
+ ok = put(emitter, 'U')
+ w = 8
+ }
+ for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
+ digit := byte((v >> uint(k)) & 0x0F)
+ if digit < 10 {
+ ok = put(emitter, digit+'0')
+ } else {
+ ok = put(emitter, digit+'A'-10)
+ }
+ }
+ }
+ if !ok {
+ return false
+ }
+ spaces = false
+ } else if is_space(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if is_space(value, i+1) {
+ if !put(emitter, '\\') {
+ return false
+ }
+ }
+ i += width(value[i])
+ } else if !write(emitter, value, &i) {
+ return false
+ }
+ spaces = true
+ } else {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ spaces = false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
+ if is_space(value, 0) || is_break(value, 0) {
+ indent_hint := []byte{'0' + byte(emitter.best_indent)}
+ if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
+ return false
+ }
+ }
+
+ emitter.open_ended = false
+
+ var chomp_hint [1]byte
+ if len(value) == 0 {
+ chomp_hint[0] = '-'
+ } else {
+ i := len(value) - 1
+ for value[i]&0xC0 == 0x80 {
+ i--
+ }
+ if !is_break(value, i) {
+ chomp_hint[0] = '-'
+ } else if i == 0 {
+ chomp_hint[0] = '+'
+ emitter.open_ended = true
+ } else {
+ i--
+ for value[i]&0xC0 == 0x80 {
+ i--
+ }
+ if is_break(value, i) {
+ chomp_hint[0] = '+'
+ emitter.open_ended = true
+ }
+ }
+ }
+ if chomp_hint[0] != 0 {
+ if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
+ return false
+ }
+ }
+ return true
+}
+
+func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
+ if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_block_scalar_hints(emitter, value) {
+ return false
+ }
+ if !put_break(emitter) {
+ return false
+ }
+ emitter.indention = true
+ emitter.whitespace = true
+ breaks := true
+ for i := 0; i < len(value); {
+ if is_break(value, i) {
+ if !write_break(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !write(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = false
+ breaks = false
+ }
+ }
+
+ return true
+}
+
+func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
+ if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_block_scalar_hints(emitter, value) {
+ return false
+ }
+
+ if !put_break(emitter) {
+ return false
+ }
+ emitter.indention = true
+ emitter.whitespace = true
+
+ breaks := true
+ leading_spaces := true
+ for i := 0; i < len(value); {
+ if is_break(value, i) {
+ if !breaks && !leading_spaces && value[i] == '\n' {
+ k := 0
+ for is_break(value, k) {
+ k += width(value[k])
+ }
+ if !is_blankz(value, k) {
+ if !put_break(emitter) {
+ return false
+ }
+ }
+ }
+ if !write_break(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ leading_spaces = is_blank(value, i)
+ }
+ if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ }
+ emitter.indention = false
+ breaks = false
+ }
+ }
+ return true
+}
diff --git a/vendor/gopkg.in/yaml.v1/encode.go b/vendor/gopkg.in/yaml.v1/encode.go
new file mode 100644
index 000000000..1d928b00d
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/encode.go
@@ -0,0 +1,226 @@
+package yaml
+
+import (
+ "reflect"
+ "sort"
+ "strconv"
+ "time"
+)
+
+type encoder struct {
+ emitter yaml_emitter_t
+ event yaml_event_t
+ out []byte
+ flow bool
+}
+
+func newEncoder() (e *encoder) {
+ e = &encoder{}
+ e.must(yaml_emitter_initialize(&e.emitter))
+ yaml_emitter_set_output_string(&e.emitter, &e.out)
+ e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING))
+ e.emit()
+ e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true))
+ e.emit()
+ return e
+}
+
+func (e *encoder) finish() {
+ e.must(yaml_document_end_event_initialize(&e.event, true))
+ e.emit()
+ e.emitter.open_ended = false
+ e.must(yaml_stream_end_event_initialize(&e.event))
+ e.emit()
+}
+
+func (e *encoder) destroy() {
+ yaml_emitter_delete(&e.emitter)
+}
+
+func (e *encoder) emit() {
+ // This will internally delete the e.event value.
+ if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT {
+ e.must(false)
+ }
+}
+
+func (e *encoder) must(ok bool) {
+ if !ok {
+ msg := e.emitter.problem
+ if msg == "" {
+ msg = "Unknown problem generating YAML content"
+ }
+ panic(msg)
+ }
+}
+
+func (e *encoder) marshal(tag string, in reflect.Value) {
+ var value interface{}
+ if getter, ok := in.Interface().(Getter); ok {
+ tag, value = getter.GetYAML()
+ if value == nil {
+ e.nilv()
+ return
+ }
+ in = reflect.ValueOf(value)
+ }
+ switch in.Kind() {
+ case reflect.Interface:
+ if in.IsNil() {
+ e.nilv()
+ } else {
+ e.marshal(tag, in.Elem())
+ }
+ case reflect.Map:
+ e.mapv(tag, in)
+ case reflect.Ptr:
+ if in.IsNil() {
+ e.nilv()
+ } else {
+ e.marshal(tag, in.Elem())
+ }
+ case reflect.Struct:
+ e.structv(tag, in)
+ case reflect.Slice:
+ e.slicev(tag, in)
+ case reflect.String:
+ e.stringv(tag, in)
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ if in.Type() == durationType {
+ e.stringv(tag, reflect.ValueOf(in.Interface().(time.Duration).String()))
+ } else {
+ e.intv(tag, in)
+ }
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ e.uintv(tag, in)
+ case reflect.Float32, reflect.Float64:
+ e.floatv(tag, in)
+ case reflect.Bool:
+ e.boolv(tag, in)
+ default:
+ panic("Can't marshal type yet: " + in.Type().String())
+ }
+}
+
+func (e *encoder) mapv(tag string, in reflect.Value) {
+ e.mappingv(tag, func() {
+ keys := keyList(in.MapKeys())
+ sort.Sort(keys)
+ for _, k := range keys {
+ e.marshal("", k)
+ e.marshal("", in.MapIndex(k))
+ }
+ })
+}
+
+func (e *encoder) structv(tag string, in reflect.Value) {
+ sinfo, err := getStructInfo(in.Type())
+ if err != nil {
+ panic(err)
+ }
+ e.mappingv(tag, func() {
+ for _, info := range sinfo.FieldsList {
+ var value reflect.Value
+ if info.Inline == nil {
+ value = in.Field(info.Num)
+ } else {
+ value = in.FieldByIndex(info.Inline)
+ }
+ if info.OmitEmpty && isZero(value) {
+ continue
+ }
+ e.marshal("", reflect.ValueOf(info.Key))
+ e.flow = info.Flow
+ e.marshal("", value)
+ }
+ })
+}
+
+func (e *encoder) mappingv(tag string, f func()) {
+ implicit := tag == ""
+ style := yaml_BLOCK_MAPPING_STYLE
+ if e.flow {
+ e.flow = false
+ style = yaml_FLOW_MAPPING_STYLE
+ }
+ e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
+ e.emit()
+ f()
+ e.must(yaml_mapping_end_event_initialize(&e.event))
+ e.emit()
+}
+
+func (e *encoder) slicev(tag string, in reflect.Value) {
+ implicit := tag == ""
+ style := yaml_BLOCK_SEQUENCE_STYLE
+ if e.flow {
+ e.flow = false
+ style = yaml_FLOW_SEQUENCE_STYLE
+ }
+ e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
+ e.emit()
+ n := in.Len()
+ for i := 0; i < n; i++ {
+ e.marshal("", in.Index(i))
+ }
+ e.must(yaml_sequence_end_event_initialize(&e.event))
+ e.emit()
+}
+
+func (e *encoder) stringv(tag string, in reflect.Value) {
+ var style yaml_scalar_style_t
+ s := in.String()
+ if rtag, _ := resolve("", s); rtag != "!!str" {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ } else {
+ style = yaml_PLAIN_SCALAR_STYLE
+ }
+ e.emitScalar(s, "", tag, style)
+}
+
+func (e *encoder) boolv(tag string, in reflect.Value) {
+ var s string
+ if in.Bool() {
+ s = "true"
+ } else {
+ s = "false"
+ }
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) intv(tag string, in reflect.Value) {
+ s := strconv.FormatInt(in.Int(), 10)
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) uintv(tag string, in reflect.Value) {
+ s := strconv.FormatUint(in.Uint(), 10)
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) floatv(tag string, in reflect.Value) {
+ // FIXME: Handle 64 bits here.
+ s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32)
+ switch s {
+ case "+Inf":
+ s = ".inf"
+ case "-Inf":
+ s = "-.inf"
+ case "NaN":
+ s = ".nan"
+ }
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) nilv() {
+ e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) {
+ implicit := tag == ""
+ if !implicit {
+ style = yaml_PLAIN_SCALAR_STYLE
+ }
+ e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style))
+ e.emit()
+}
diff --git a/vendor/gopkg.in/yaml.v1/encode_test.go b/vendor/gopkg.in/yaml.v1/encode_test.go
new file mode 100644
index 000000000..c7461d573
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/encode_test.go
@@ -0,0 +1,386 @@
+package yaml_test
+
+import (
+ "fmt"
+ "gopkg.in/yaml.v1"
+ . "gopkg.in/check.v1"
+ "math"
+ "strconv"
+ "strings"
+ "time"
+)
+
+var marshalIntTest = 123
+
+var marshalTests = []struct {
+ value interface{}
+ data string
+}{
+ {
+ &struct{}{},
+ "{}\n",
+ }, {
+ map[string]string{"v": "hi"},
+ "v: hi\n",
+ }, {
+ map[string]interface{}{"v": "hi"},
+ "v: hi\n",
+ }, {
+ map[string]string{"v": "true"},
+ "v: \"true\"\n",
+ }, {
+ map[string]string{"v": "false"},
+ "v: \"false\"\n",
+ }, {
+ map[string]interface{}{"v": true},
+ "v: true\n",
+ }, {
+ map[string]interface{}{"v": false},
+ "v: false\n",
+ }, {
+ map[string]interface{}{"v": 10},
+ "v: 10\n",
+ }, {
+ map[string]interface{}{"v": -10},
+ "v: -10\n",
+ }, {
+ map[string]uint{"v": 42},
+ "v: 42\n",
+ }, {
+ map[string]interface{}{"v": int64(4294967296)},
+ "v: 4294967296\n",
+ }, {
+ map[string]int64{"v": int64(4294967296)},
+ "v: 4294967296\n",
+ }, {
+ map[string]uint64{"v": 4294967296},
+ "v: 4294967296\n",
+ }, {
+ map[string]interface{}{"v": "10"},
+ "v: \"10\"\n",
+ }, {
+ map[string]interface{}{"v": 0.1},
+ "v: 0.1\n",
+ }, {
+ map[string]interface{}{"v": float64(0.1)},
+ "v: 0.1\n",
+ }, {
+ map[string]interface{}{"v": -0.1},
+ "v: -0.1\n",
+ }, {
+ map[string]interface{}{"v": math.Inf(+1)},
+ "v: .inf\n",
+ }, {
+ map[string]interface{}{"v": math.Inf(-1)},
+ "v: -.inf\n",
+ }, {
+ map[string]interface{}{"v": math.NaN()},
+ "v: .nan\n",
+ }, {
+ map[string]interface{}{"v": nil},
+ "v: null\n",
+ }, {
+ map[string]interface{}{"v": ""},
+ "v: \"\"\n",
+ }, {
+ map[string][]string{"v": []string{"A", "B"}},
+ "v:\n- A\n- B\n",
+ }, {
+ map[string][]string{"v": []string{"A", "B\nC"}},
+ "v:\n- A\n- 'B\n\n C'\n",
+ }, {
+ map[string][]interface{}{"v": []interface{}{"A", 1, map[string][]int{"B": []int{2, 3}}}},
+ "v:\n- A\n- 1\n- B:\n - 2\n - 3\n",
+ }, {
+ map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}},
+ "a:\n b: c\n",
+ }, {
+ map[string]interface{}{"a": "-"},
+ "a: '-'\n",
+ },
+
+ // Simple values.
+ {
+ &marshalIntTest,
+ "123\n",
+ },
+
+ // Structures
+ {
+ &struct{ Hello string }{"world"},
+ "hello: world\n",
+ }, {
+ &struct {
+ A struct {
+ B string
+ }
+ }{struct{ B string }{"c"}},
+ "a:\n b: c\n",
+ }, {
+ &struct {
+ A *struct {
+ B string
+ }
+ }{&struct{ B string }{"c"}},
+ "a:\n b: c\n",
+ }, {
+ &struct {
+ A *struct {
+ B string
+ }
+ }{},
+ "a: null\n",
+ }, {
+ &struct{ A int }{1},
+ "a: 1\n",
+ }, {
+ &struct{ A []int }{[]int{1, 2}},
+ "a:\n- 1\n- 2\n",
+ }, {
+ &struct {
+ B int "a"
+ }{1},
+ "a: 1\n",
+ }, {
+ &struct{ A bool }{true},
+ "a: true\n",
+ },
+
+ // Conditional flag
+ {
+ &struct {
+ A int "a,omitempty"
+ B int "b,omitempty"
+ }{1, 0},
+ "a: 1\n",
+ }, {
+ &struct {
+ A int "a,omitempty"
+ B int "b,omitempty"
+ }{0, 0},
+ "{}\n",
+ }, {
+ &struct {
+ A *struct{ X int } "a,omitempty"
+ B int "b,omitempty"
+ }{nil, 0},
+ "{}\n",
+ },
+
+ // Flow flag
+ {
+ &struct {
+ A []int "a,flow"
+ }{[]int{1, 2}},
+ "a: [1, 2]\n",
+ }, {
+ &struct {
+ A map[string]string "a,flow"
+ }{map[string]string{"b": "c", "d": "e"}},
+ "a: {b: c, d: e}\n",
+ }, {
+ &struct {
+ A struct {
+ B, D string
+ } "a,flow"
+ }{struct{ B, D string }{"c", "e"}},
+ "a: {b: c, d: e}\n",
+ },
+
+ // Unexported field
+ {
+ &struct {
+ u int
+ A int
+ }{0, 1},
+ "a: 1\n",
+ },
+
+ // Ignored field
+ {
+ &struct {
+ A int
+ B int "-"
+ }{1, 2},
+ "a: 1\n",
+ },
+
+ // Struct inlining
+ {
+ &struct {
+ A int
+ C inlineB `yaml:",inline"`
+ }{1, inlineB{2, inlineC{3}}},
+ "a: 1\nb: 2\nc: 3\n",
+ },
+
+ // Duration
+ {
+ map[string]time.Duration{"a": 3 * time.Second},
+ "a: 3s\n",
+ },
+}
+
+func (s *S) TestMarshal(c *C) {
+ for _, item := range marshalTests {
+ data, err := yaml.Marshal(item.value)
+ c.Assert(err, IsNil)
+ c.Assert(string(data), Equals, item.data)
+ }
+}
+
+var marshalErrorTests = []struct {
+ value interface{}
+ error string
+}{
+ {
+ &struct {
+ B int
+ inlineB ",inline"
+ }{1, inlineB{2, inlineC{3}}},
+ `Duplicated key 'b' in struct struct \{ B int; .*`,
+ },
+}
+
+func (s *S) TestMarshalErrors(c *C) {
+ for _, item := range marshalErrorTests {
+ _, err := yaml.Marshal(item.value)
+ c.Assert(err, ErrorMatches, item.error)
+ }
+}
+
+var marshalTaggedIfaceTest interface{} = &struct{ A string }{"B"}
+
+var getterTests = []struct {
+ data, tag string
+ value interface{}
+}{
+ {"_:\n hi: there\n", "", map[interface{}]interface{}{"hi": "there"}},
+ {"_:\n- 1\n- A\n", "", []interface{}{1, "A"}},
+ {"_: 10\n", "", 10},
+ {"_: null\n", "", nil},
+ {"_: !foo BAR!\n", "!foo", "BAR!"},
+ {"_: !foo 1\n", "!foo", "1"},
+ {"_: !foo '\"1\"'\n", "!foo", "\"1\""},
+ {"_: !foo 1.1\n", "!foo", 1.1},
+ {"_: !foo 1\n", "!foo", 1},
+ {"_: !foo 1\n", "!foo", uint(1)},
+ {"_: !foo true\n", "!foo", true},
+ {"_: !foo\n- A\n- B\n", "!foo", []string{"A", "B"}},
+ {"_: !foo\n A: B\n", "!foo", map[string]string{"A": "B"}},
+ {"_: !foo\n a: B\n", "!foo", &marshalTaggedIfaceTest},
+}
+
+func (s *S) TestMarshalTypeCache(c *C) {
+ var data []byte
+ var err error
+ func() {
+ type T struct{ A int }
+ data, err = yaml.Marshal(&T{})
+ c.Assert(err, IsNil)
+ }()
+ func() {
+ type T struct{ B int }
+ data, err = yaml.Marshal(&T{})
+ c.Assert(err, IsNil)
+ }()
+ c.Assert(string(data), Equals, "b: 0\n")
+}
+
+type typeWithGetter struct {
+ tag string
+ value interface{}
+}
+
+func (o typeWithGetter) GetYAML() (tag string, value interface{}) {
+ return o.tag, o.value
+}
+
+type typeWithGetterField struct {
+ Field typeWithGetter "_"
+}
+
+func (s *S) TestMashalWithGetter(c *C) {
+ for _, item := range getterTests {
+ obj := &typeWithGetterField{}
+ obj.Field.tag = item.tag
+ obj.Field.value = item.value
+ data, err := yaml.Marshal(obj)
+ c.Assert(err, IsNil)
+ c.Assert(string(data), Equals, string(item.data))
+ }
+}
+
+func (s *S) TestUnmarshalWholeDocumentWithGetter(c *C) {
+ obj := &typeWithGetter{}
+ obj.tag = ""
+ obj.value = map[string]string{"hello": "world!"}
+ data, err := yaml.Marshal(obj)
+ c.Assert(err, IsNil)
+ c.Assert(string(data), Equals, "hello: world!\n")
+}
+
+func (s *S) TestSortedOutput(c *C) {
+ order := []interface{}{
+ false,
+ true,
+ 1,
+ uint(1),
+ 1.0,
+ 1.1,
+ 1.2,
+ 2,
+ uint(2),
+ 2.0,
+ 2.1,
+ "",
+ ".1",
+ ".2",
+ ".a",
+ "1",
+ "2",
+ "a!10",
+ "a/2",
+ "a/10",
+ "a~10",
+ "ab/1",
+ "b/1",
+ "b/01",
+ "b/2",
+ "b/02",
+ "b/3",
+ "b/03",
+ "b1",
+ "b01",
+ "b3",
+ "c2.10",
+ "c10.2",
+ "d1",
+ "d12",
+ "d12a",
+ }
+ m := make(map[interface{}]int)
+ for _, k := range order {
+ m[k] = 1
+ }
+ data, err := yaml.Marshal(m)
+ c.Assert(err, IsNil)
+ out := "\n" + string(data)
+ last := 0
+ for i, k := range order {
+ repr := fmt.Sprint(k)
+ if s, ok := k.(string); ok {
+ if _, err = strconv.ParseFloat(repr, 32); s == "" || err == nil {
+ repr = `"` + repr + `"`
+ }
+ }
+ index := strings.Index(out, "\n"+repr+":")
+ if index == -1 {
+ c.Fatalf("%#v is not in the output: %#v", k, out)
+ }
+ if index < last {
+ c.Fatalf("%#v was generated before %#v: %q", k, order[i-1], out)
+ }
+ last = index
+ }
+}
diff --git a/vendor/gopkg.in/yaml.v1/parserc.go b/vendor/gopkg.in/yaml.v1/parserc.go
new file mode 100644
index 000000000..0a7037ad1
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/parserc.go
@@ -0,0 +1,1096 @@
+package yaml
+
+import (
+ "bytes"
+)
+
+// The parser implements the following grammar:
+//
+// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
+// implicit_document ::= block_node DOCUMENT-END*
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+// block_node_or_indentless_sequence ::=
+// ALIAS
+// | properties (block_content | indentless_block_sequence)?
+// | block_content
+// | indentless_block_sequence
+// block_node ::= ALIAS
+// | properties block_content?
+// | block_content
+// flow_node ::= ALIAS
+// | properties flow_content?
+// | flow_content
+// properties ::= TAG ANCHOR? | ANCHOR TAG?
+// block_content ::= block_collection | flow_collection | SCALAR
+// flow_content ::= flow_collection | SCALAR
+// block_collection ::= block_sequence | block_mapping
+// flow_collection ::= flow_sequence | flow_mapping
+// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
+// block_mapping ::= BLOCK-MAPPING_START
+// ((KEY block_node_or_indentless_sequence?)?
+// (VALUE block_node_or_indentless_sequence?)?)*
+// BLOCK-END
+// flow_sequence ::= FLOW-SEQUENCE-START
+// (flow_sequence_entry FLOW-ENTRY)*
+// flow_sequence_entry?
+// FLOW-SEQUENCE-END
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// flow_mapping ::= FLOW-MAPPING-START
+// (flow_mapping_entry FLOW-ENTRY)*
+// flow_mapping_entry?
+// FLOW-MAPPING-END
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+
+// Peek the next token in the token queue.
+func peek_token(parser *yaml_parser_t) *yaml_token_t {
+ if parser.token_available || yaml_parser_fetch_more_tokens(parser) {
+ return &parser.tokens[parser.tokens_head]
+ }
+ return nil
+}
+
+// Remove the next token from the queue (must be called after peek_token).
+func skip_token(parser *yaml_parser_t) {
+ parser.token_available = false
+ parser.tokens_parsed++
+ parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN
+ parser.tokens_head++
+}
+
+// Get the next event.
+func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool {
+ // Erase the event object.
+ *event = yaml_event_t{}
+
+ // No events after the end of the stream or error.
+ if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE {
+ return true
+ }
+
+ // Generate the next event.
+ return yaml_parser_state_machine(parser, event)
+}
+
+// Set parser error.
+func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool {
+ parser.error = yaml_PARSER_ERROR
+ parser.problem = problem
+ parser.problem_mark = problem_mark
+ return false
+}
+
+func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool {
+ parser.error = yaml_PARSER_ERROR
+ parser.context = context
+ parser.context_mark = context_mark
+ parser.problem = problem
+ parser.problem_mark = problem_mark
+ return false
+}
+
+// State dispatcher.
+func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool {
+ //trace("yaml_parser_state_machine", "state:", parser.state.String())
+
+ switch parser.state {
+ case yaml_PARSE_STREAM_START_STATE:
+ return yaml_parser_parse_stream_start(parser, event)
+
+ case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
+ return yaml_parser_parse_document_start(parser, event, true)
+
+ case yaml_PARSE_DOCUMENT_START_STATE:
+ return yaml_parser_parse_document_start(parser, event, false)
+
+ case yaml_PARSE_DOCUMENT_CONTENT_STATE:
+ return yaml_parser_parse_document_content(parser, event)
+
+ case yaml_PARSE_DOCUMENT_END_STATE:
+ return yaml_parser_parse_document_end(parser, event)
+
+ case yaml_PARSE_BLOCK_NODE_STATE:
+ return yaml_parser_parse_node(parser, event, true, false)
+
+ case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
+ return yaml_parser_parse_node(parser, event, true, true)
+
+ case yaml_PARSE_FLOW_NODE_STATE:
+ return yaml_parser_parse_node(parser, event, false, false)
+
+ case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
+ return yaml_parser_parse_block_sequence_entry(parser, event, true)
+
+ case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
+ return yaml_parser_parse_block_sequence_entry(parser, event, false)
+
+ case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
+ return yaml_parser_parse_indentless_sequence_entry(parser, event)
+
+ case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return yaml_parser_parse_block_mapping_key(parser, event, true)
+
+ case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
+ return yaml_parser_parse_block_mapping_key(parser, event, false)
+
+ case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
+ return yaml_parser_parse_block_mapping_value(parser, event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
+ return yaml_parser_parse_flow_sequence_entry(parser, event, true)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
+ return yaml_parser_parse_flow_sequence_entry(parser, event, false)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
+ return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
+ return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
+ return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event)
+
+ case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
+ return yaml_parser_parse_flow_mapping_key(parser, event, true)
+
+ case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
+ return yaml_parser_parse_flow_mapping_key(parser, event, false)
+
+ case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
+ return yaml_parser_parse_flow_mapping_value(parser, event, false)
+
+ case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
+ return yaml_parser_parse_flow_mapping_value(parser, event, true)
+
+ default:
+ panic("invalid parser state")
+ }
+ return false
+}
+
+// Parse the production:
+// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
+// ************
+func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_STREAM_START_TOKEN {
+ return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark)
+ }
+ parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE
+ *event = yaml_event_t{
+ typ: yaml_STREAM_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ encoding: token.encoding,
+ }
+ skip_token(parser)
+ return true
+}
+
+// Parse the productions:
+// implicit_document ::= block_node DOCUMENT-END*
+// *
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+// *************************
+func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool {
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ // Parse extra document end indicators.
+ if !implicit {
+ for token.typ == yaml_DOCUMENT_END_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ }
+ }
+
+ if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN &&
+ token.typ != yaml_TAG_DIRECTIVE_TOKEN &&
+ token.typ != yaml_DOCUMENT_START_TOKEN &&
+ token.typ != yaml_STREAM_END_TOKEN {
+ // Parse an implicit document.
+ if !yaml_parser_process_directives(parser, nil, nil) {
+ return false
+ }
+ parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
+ parser.state = yaml_PARSE_BLOCK_NODE_STATE
+
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+
+ } else if token.typ != yaml_STREAM_END_TOKEN {
+ // Parse an explicit document.
+ var version_directive *yaml_version_directive_t
+ var tag_directives []yaml_tag_directive_t
+ start_mark := token.start_mark
+ if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) {
+ return false
+ }
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_DOCUMENT_START_TOKEN {
+ yaml_parser_set_parser_error(parser,
+ "did not find expected ", token.start_mark)
+ return false
+ }
+ parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
+ parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE
+ end_mark := token.end_mark
+
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ version_directive: version_directive,
+ tag_directives: tag_directives,
+ implicit: false,
+ }
+ skip_token(parser)
+
+ } else {
+ // Parse the stream end.
+ parser.state = yaml_PARSE_END_STATE
+ *event = yaml_event_t{
+ typ: yaml_STREAM_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ skip_token(parser)
+ }
+
+ return true
+}
+
+// Parse the productions:
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+// ***********
+//
+func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_VERSION_DIRECTIVE_TOKEN ||
+ token.typ == yaml_TAG_DIRECTIVE_TOKEN ||
+ token.typ == yaml_DOCUMENT_START_TOKEN ||
+ token.typ == yaml_DOCUMENT_END_TOKEN ||
+ token.typ == yaml_STREAM_END_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ return yaml_parser_process_empty_scalar(parser, event,
+ token.start_mark)
+ }
+ return yaml_parser_parse_node(parser, event, true, false)
+}
+
+// Parse the productions:
+// implicit_document ::= block_node DOCUMENT-END*
+// *************
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+//
+func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ start_mark := token.start_mark
+ end_mark := token.start_mark
+
+ implicit := true
+ if token.typ == yaml_DOCUMENT_END_TOKEN {
+ end_mark = token.end_mark
+ skip_token(parser)
+ implicit = false
+ }
+
+ parser.tag_directives = parser.tag_directives[:0]
+
+ parser.state = yaml_PARSE_DOCUMENT_START_STATE
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_END_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ implicit: implicit,
+ }
+ return true
+}
+
+// Parse the productions:
+// block_node_or_indentless_sequence ::=
+// ALIAS
+// *****
+// | properties (block_content | indentless_block_sequence)?
+// ********** *
+// | block_content | indentless_block_sequence
+// *
+// block_node ::= ALIAS
+// *****
+// | properties block_content?
+// ********** *
+// | block_content
+// *
+// flow_node ::= ALIAS
+// *****
+// | properties flow_content?
+// ********** *
+// | flow_content
+// *
+// properties ::= TAG ANCHOR? | ANCHOR TAG?
+// *************************
+// block_content ::= block_collection | flow_collection | SCALAR
+// ******
+// flow_content ::= flow_collection | SCALAR
+// ******
+func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool {
+ //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_ALIAS_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ *event = yaml_event_t{
+ typ: yaml_ALIAS_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ anchor: token.value,
+ }
+ skip_token(parser)
+ return true
+ }
+
+ start_mark := token.start_mark
+ end_mark := token.start_mark
+
+ var tag_token bool
+ var tag_handle, tag_suffix, anchor []byte
+ var tag_mark yaml_mark_t
+ if token.typ == yaml_ANCHOR_TOKEN {
+ anchor = token.value
+ start_mark = token.start_mark
+ end_mark = token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_TAG_TOKEN {
+ tag_token = true
+ tag_handle = token.value
+ tag_suffix = token.suffix
+ tag_mark = token.start_mark
+ end_mark = token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ }
+ } else if token.typ == yaml_TAG_TOKEN {
+ tag_token = true
+ tag_handle = token.value
+ tag_suffix = token.suffix
+ start_mark = token.start_mark
+ tag_mark = token.start_mark
+ end_mark = token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_ANCHOR_TOKEN {
+ anchor = token.value
+ end_mark = token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ }
+ }
+
+ var tag []byte
+ if tag_token {
+ if len(tag_handle) == 0 {
+ tag = tag_suffix
+ tag_suffix = nil
+ } else {
+ for i := range parser.tag_directives {
+ if bytes.Equal(parser.tag_directives[i].handle, tag_handle) {
+ tag = append([]byte(nil), parser.tag_directives[i].prefix...)
+ tag = append(tag, tag_suffix...)
+ break
+ }
+ }
+ if len(tag) == 0 {
+ yaml_parser_set_parser_error_context(parser,
+ "while parsing a node", start_mark,
+ "found undefined tag handle", tag_mark)
+ return false
+ }
+ }
+ }
+
+ implicit := len(tag) == 0
+ if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
+ }
+ return true
+ }
+ if token.typ == yaml_SCALAR_TOKEN {
+ var plain_implicit, quoted_implicit bool
+ end_mark = token.end_mark
+ if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') {
+ plain_implicit = true
+ } else if len(tag) == 0 {
+ quoted_implicit = true
+ }
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ value: token.value,
+ implicit: plain_implicit,
+ quoted_implicit: quoted_implicit,
+ style: yaml_style_t(token.style),
+ }
+ skip_token(parser)
+ return true
+ }
+ if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN {
+ // [Go] Some of the events below can be merged as they differ only on style.
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE),
+ }
+ return true
+ }
+ if token.typ == yaml_FLOW_MAPPING_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
+ }
+ return true
+ }
+ if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
+ }
+ return true
+ }
+ if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE),
+ }
+ return true
+ }
+ if len(anchor) > 0 || len(tag) > 0 {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ quoted_implicit: false,
+ style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
+ }
+ return true
+ }
+
+ context := "while parsing a flow node"
+ if block {
+ context = "while parsing a block node"
+ }
+ yaml_parser_set_parser_error_context(parser, context, start_mark,
+ "did not find expected node content", token.start_mark)
+ return false
+}
+
+// Parse the productions:
+// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+// ******************** *********** * *********
+//
+func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
+ if first {
+ token := peek_token(parser)
+ parser.marks = append(parser.marks, token.start_mark)
+ skip_token(parser)
+ }
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ mark := token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE)
+ return yaml_parser_parse_node(parser, event, true, false)
+ } else {
+ parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+ }
+ }
+ if token.typ == yaml_BLOCK_END_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+
+ skip_token(parser)
+ return true
+ }
+
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return yaml_parser_set_parser_error_context(parser,
+ "while parsing a block collection", context_mark,
+ "did not find expected '-' indicator", token.start_mark)
+}
+
+// Parse the productions:
+// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
+// *********** *
+func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ mark := token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_BLOCK_ENTRY_TOKEN &&
+ token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE)
+ return yaml_parser_parse_node(parser, event, true, false)
+ }
+ parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+ }
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark?
+ }
+ return true
+}
+
+// Parse the productions:
+// block_mapping ::= BLOCK-MAPPING_START
+// *******************
+// ((KEY block_node_or_indentless_sequence?)?
+// *** *
+// (VALUE block_node_or_indentless_sequence?)?)*
+//
+// BLOCK-END
+// *********
+//
+func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
+ if first {
+ token := peek_token(parser)
+ parser.marks = append(parser.marks, token.start_mark)
+ skip_token(parser)
+ }
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_KEY_TOKEN {
+ mark := token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE)
+ return yaml_parser_parse_node(parser, event, true, true)
+ } else {
+ parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+ }
+ } else if token.typ == yaml_BLOCK_END_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ skip_token(parser)
+ return true
+ }
+
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return yaml_parser_set_parser_error_context(parser,
+ "while parsing a block mapping", context_mark,
+ "did not find expected key", token.start_mark)
+}
+
+// Parse the productions:
+// block_mapping ::= BLOCK-MAPPING_START
+//
+// ((KEY block_node_or_indentless_sequence?)?
+//
+// (VALUE block_node_or_indentless_sequence?)?)*
+// ***** *
+// BLOCK-END
+//
+//
+func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ mark := token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE)
+ return yaml_parser_parse_node(parser, event, true, true)
+ }
+ parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+ }
+ parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+}
+
+// Parse the productions:
+// flow_sequence ::= FLOW-SEQUENCE-START
+// *******************
+// (flow_sequence_entry FLOW-ENTRY)*
+// * **********
+// flow_sequence_entry?
+// *
+// FLOW-SEQUENCE-END
+// *****************
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// *
+//
+func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
+ if first {
+ token := peek_token(parser)
+ parser.marks = append(parser.marks, token.start_mark)
+ skip_token(parser)
+ }
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ if !first {
+ if token.typ == yaml_FLOW_ENTRY_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ } else {
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return yaml_parser_set_parser_error_context(parser,
+ "while parsing a flow sequence", context_mark,
+ "did not find expected ',' or ']'", token.start_mark)
+ }
+ }
+
+ if token.typ == yaml_KEY_TOKEN {
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ implicit: true,
+ style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
+ }
+ skip_token(parser)
+ return true
+ } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ }
+
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+
+ skip_token(parser)
+ return true
+}
+
+//
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// *** *
+//
+func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_FLOW_ENTRY_TOKEN &&
+ token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ mark := token.end_mark
+ skip_token(parser)
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+}
+
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// ***** *
+//
+func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ skip_token(parser)
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ }
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+}
+
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// *
+//
+func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.start_mark, // [Go] Shouldn't this be end_mark?
+ }
+ return true
+}
+
+// Parse the productions:
+// flow_mapping ::= FLOW-MAPPING-START
+// ******************
+// (flow_mapping_entry FLOW-ENTRY)*
+// * **********
+// flow_mapping_entry?
+// ******************
+// FLOW-MAPPING-END
+// ****************
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// * *** *
+//
+func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
+ if first {
+ token := peek_token(parser)
+ parser.marks = append(parser.marks, token.start_mark)
+ skip_token(parser)
+ }
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ if !first {
+ if token.typ == yaml_FLOW_ENTRY_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ } else {
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return yaml_parser_set_parser_error_context(parser,
+ "while parsing a flow mapping", context_mark,
+ "did not find expected ',' or '}'", token.start_mark)
+ }
+ }
+
+ if token.typ == yaml_KEY_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_FLOW_ENTRY_TOKEN &&
+ token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ } else {
+ parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+ }
+ } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ }
+
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ skip_token(parser)
+ return true
+}
+
+// Parse the productions:
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// * ***** *
+//
+func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if empty {
+ parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ }
+ parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+}
+
+// Generate an empty scalar event.
+func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: mark,
+ end_mark: mark,
+ value: nil, // Empty
+ implicit: true,
+ style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
+ }
+ return true
+}
+
+var default_tag_directives = []yaml_tag_directive_t{
+ {[]byte("!"), []byte("!")},
+ {[]byte("!!"), []byte("tag:yaml.org,2002:")},
+}
+
+// Parse directives.
+func yaml_parser_process_directives(parser *yaml_parser_t,
+ version_directive_ref **yaml_version_directive_t,
+ tag_directives_ref *[]yaml_tag_directive_t) bool {
+
+ var version_directive *yaml_version_directive_t
+ var tag_directives []yaml_tag_directive_t
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN {
+ if token.typ == yaml_VERSION_DIRECTIVE_TOKEN {
+ if version_directive != nil {
+ yaml_parser_set_parser_error(parser,
+ "found duplicate %YAML directive", token.start_mark)
+ return false
+ }
+ if token.major != 1 || token.minor != 1 {
+ yaml_parser_set_parser_error(parser,
+ "found incompatible YAML document", token.start_mark)
+ return false
+ }
+ version_directive = &yaml_version_directive_t{
+ major: token.major,
+ minor: token.minor,
+ }
+ } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN {
+ value := yaml_tag_directive_t{
+ handle: token.value,
+ prefix: token.prefix,
+ }
+ if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) {
+ return false
+ }
+ tag_directives = append(tag_directives, value)
+ }
+
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ }
+
+ for i := range default_tag_directives {
+ if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) {
+ return false
+ }
+ }
+
+ if version_directive_ref != nil {
+ *version_directive_ref = version_directive
+ }
+ if tag_directives_ref != nil {
+ *tag_directives_ref = tag_directives
+ }
+ return true
+}
+
+// Append a tag directive to the directives stack.
+func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool {
+ for i := range parser.tag_directives {
+ if bytes.Equal(value.handle, parser.tag_directives[i].handle) {
+ if allow_duplicates {
+ return true
+ }
+ return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark)
+ }
+ }
+
+ // [Go] I suspect the copy is unnecessary. This was likely done
+ // because there was no way to track ownership of the data.
+ value_copy := yaml_tag_directive_t{
+ handle: make([]byte, len(value.handle)),
+ prefix: make([]byte, len(value.prefix)),
+ }
+ copy(value_copy.handle, value.handle)
+ copy(value_copy.prefix, value.prefix)
+ parser.tag_directives = append(parser.tag_directives, value_copy)
+ return true
+}
diff --git a/vendor/gopkg.in/yaml.v1/readerc.go b/vendor/gopkg.in/yaml.v1/readerc.go
new file mode 100644
index 000000000..d5fb09727
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/readerc.go
@@ -0,0 +1,391 @@
+package yaml
+
+import (
+ "io"
+)
+
+// Set the reader error and return 0.
+func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool {
+ parser.error = yaml_READER_ERROR
+ parser.problem = problem
+ parser.problem_offset = offset
+ parser.problem_value = value
+ return false
+}
+
+// Byte order marks.
+const (
+ bom_UTF8 = "\xef\xbb\xbf"
+ bom_UTF16LE = "\xff\xfe"
+ bom_UTF16BE = "\xfe\xff"
+)
+
+// Determine the input stream encoding by checking the BOM symbol. If no BOM is
+// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
+func yaml_parser_determine_encoding(parser *yaml_parser_t) bool {
+ // Ensure that we had enough bytes in the raw buffer.
+ for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 {
+ if !yaml_parser_update_raw_buffer(parser) {
+ return false
+ }
+ }
+
+ // Determine the encoding.
+ buf := parser.raw_buffer
+ pos := parser.raw_buffer_pos
+ avail := len(buf) - pos
+ if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] {
+ parser.encoding = yaml_UTF16LE_ENCODING
+ parser.raw_buffer_pos += 2
+ parser.offset += 2
+ } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] {
+ parser.encoding = yaml_UTF16BE_ENCODING
+ parser.raw_buffer_pos += 2
+ parser.offset += 2
+ } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] {
+ parser.encoding = yaml_UTF8_ENCODING
+ parser.raw_buffer_pos += 3
+ parser.offset += 3
+ } else {
+ parser.encoding = yaml_UTF8_ENCODING
+ }
+ return true
+}
+
+// Update the raw buffer.
+func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool {
+ size_read := 0
+
+ // Return if the raw buffer is full.
+ if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) {
+ return true
+ }
+
+ // Return on EOF.
+ if parser.eof {
+ return true
+ }
+
+ // Move the remaining bytes in the raw buffer to the beginning.
+ if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) {
+ copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:])
+ }
+ parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos]
+ parser.raw_buffer_pos = 0
+
+ // Call the read handler to fill the buffer.
+ size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)])
+ parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read]
+ if err == io.EOF {
+ parser.eof = true
+ } else if err != nil {
+ return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1)
+ }
+ return true
+}
+
+// Ensure that the buffer contains at least `length` characters.
+// Return true on success, false on failure.
+//
+// The length is supposed to be significantly less that the buffer size.
+func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool {
+ if parser.read_handler == nil {
+ panic("read handler must be set")
+ }
+
+ // If the EOF flag is set and the raw buffer is empty, do nothing.
+ if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) {
+ return true
+ }
+
+ // Return if the buffer contains enough characters.
+ if parser.unread >= length {
+ return true
+ }
+
+ // Determine the input encoding if it is not known yet.
+ if parser.encoding == yaml_ANY_ENCODING {
+ if !yaml_parser_determine_encoding(parser) {
+ return false
+ }
+ }
+
+ // Move the unread characters to the beginning of the buffer.
+ buffer_len := len(parser.buffer)
+ if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len {
+ copy(parser.buffer, parser.buffer[parser.buffer_pos:])
+ buffer_len -= parser.buffer_pos
+ parser.buffer_pos = 0
+ } else if parser.buffer_pos == buffer_len {
+ buffer_len = 0
+ parser.buffer_pos = 0
+ }
+
+ // Open the whole buffer for writing, and cut it before returning.
+ parser.buffer = parser.buffer[:cap(parser.buffer)]
+
+ // Fill the buffer until it has enough characters.
+ first := true
+ for parser.unread < length {
+
+ // Fill the raw buffer if necessary.
+ if !first || parser.raw_buffer_pos == len(parser.raw_buffer) {
+ if !yaml_parser_update_raw_buffer(parser) {
+ parser.buffer = parser.buffer[:buffer_len]
+ return false
+ }
+ }
+ first = false
+
+ // Decode the raw buffer.
+ inner:
+ for parser.raw_buffer_pos != len(parser.raw_buffer) {
+ var value rune
+ var width int
+
+ raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos
+
+ // Decode the next character.
+ switch parser.encoding {
+ case yaml_UTF8_ENCODING:
+ // Decode a UTF-8 character. Check RFC 3629
+ // (http://www.ietf.org/rfc/rfc3629.txt) for more details.
+ //
+ // The following table (taken from the RFC) is used for
+ // decoding.
+ //
+ // Char. number range | UTF-8 octet sequence
+ // (hexadecimal) | (binary)
+ // --------------------+------------------------------------
+ // 0000 0000-0000 007F | 0xxxxxxx
+ // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+ // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+ // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ //
+ // Additionally, the characters in the range 0xD800-0xDFFF
+ // are prohibited as they are reserved for use with UTF-16
+ // surrogate pairs.
+
+ // Determine the length of the UTF-8 sequence.
+ octet := parser.raw_buffer[parser.raw_buffer_pos]
+ switch {
+ case octet&0x80 == 0x00:
+ width = 1
+ case octet&0xE0 == 0xC0:
+ width = 2
+ case octet&0xF0 == 0xE0:
+ width = 3
+ case octet&0xF8 == 0xF0:
+ width = 4
+ default:
+ // The leading octet is invalid.
+ return yaml_parser_set_reader_error(parser,
+ "invalid leading UTF-8 octet",
+ parser.offset, int(octet))
+ }
+
+ // Check if the raw buffer contains an incomplete character.
+ if width > raw_unread {
+ if parser.eof {
+ return yaml_parser_set_reader_error(parser,
+ "incomplete UTF-8 octet sequence",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Decode the leading octet.
+ switch {
+ case octet&0x80 == 0x00:
+ value = rune(octet & 0x7F)
+ case octet&0xE0 == 0xC0:
+ value = rune(octet & 0x1F)
+ case octet&0xF0 == 0xE0:
+ value = rune(octet & 0x0F)
+ case octet&0xF8 == 0xF0:
+ value = rune(octet & 0x07)
+ default:
+ value = 0
+ }
+
+ // Check and decode the trailing octets.
+ for k := 1; k < width; k++ {
+ octet = parser.raw_buffer[parser.raw_buffer_pos+k]
+
+ // Check if the octet is valid.
+ if (octet & 0xC0) != 0x80 {
+ return yaml_parser_set_reader_error(parser,
+ "invalid trailing UTF-8 octet",
+ parser.offset+k, int(octet))
+ }
+
+ // Decode the octet.
+ value = (value << 6) + rune(octet&0x3F)
+ }
+
+ // Check the length of the sequence against the value.
+ switch {
+ case width == 1:
+ case width == 2 && value >= 0x80:
+ case width == 3 && value >= 0x800:
+ case width == 4 && value >= 0x10000:
+ default:
+ return yaml_parser_set_reader_error(parser,
+ "invalid length of a UTF-8 sequence",
+ parser.offset, -1)
+ }
+
+ // Check the range of the value.
+ if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF {
+ return yaml_parser_set_reader_error(parser,
+ "invalid Unicode character",
+ parser.offset, int(value))
+ }
+
+ case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING:
+ var low, high int
+ if parser.encoding == yaml_UTF16LE_ENCODING {
+ low, high = 0, 1
+ } else {
+ high, low = 1, 0
+ }
+
+ // The UTF-16 encoding is not as simple as one might
+ // naively think. Check RFC 2781
+ // (http://www.ietf.org/rfc/rfc2781.txt).
+ //
+ // Normally, two subsequent bytes describe a Unicode
+ // character. However a special technique (called a
+ // surrogate pair) is used for specifying character
+ // values larger than 0xFFFF.
+ //
+ // A surrogate pair consists of two pseudo-characters:
+ // high surrogate area (0xD800-0xDBFF)
+ // low surrogate area (0xDC00-0xDFFF)
+ //
+ // The following formulas are used for decoding
+ // and encoding characters using surrogate pairs:
+ //
+ // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF)
+ // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF)
+ // W1 = 110110yyyyyyyyyy
+ // W2 = 110111xxxxxxxxxx
+ //
+ // where U is the character value, W1 is the high surrogate
+ // area, W2 is the low surrogate area.
+
+ // Check for incomplete UTF-16 character.
+ if raw_unread < 2 {
+ if parser.eof {
+ return yaml_parser_set_reader_error(parser,
+ "incomplete UTF-16 character",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Get the character.
+ value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) +
+ (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8)
+
+ // Check for unexpected low surrogate area.
+ if value&0xFC00 == 0xDC00 {
+ return yaml_parser_set_reader_error(parser,
+ "unexpected low surrogate area",
+ parser.offset, int(value))
+ }
+
+ // Check for a high surrogate area.
+ if value&0xFC00 == 0xD800 {
+ width = 4
+
+ // Check for incomplete surrogate pair.
+ if raw_unread < 4 {
+ if parser.eof {
+ return yaml_parser_set_reader_error(parser,
+ "incomplete UTF-16 surrogate pair",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Get the next character.
+ value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) +
+ (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8)
+
+ // Check for a low surrogate area.
+ if value2&0xFC00 != 0xDC00 {
+ return yaml_parser_set_reader_error(parser,
+ "expected low surrogate area",
+ parser.offset+2, int(value2))
+ }
+
+ // Generate the value of the surrogate pair.
+ value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF)
+ } else {
+ width = 2
+ }
+
+ default:
+ panic("impossible")
+ }
+
+ // Check if the character is in the allowed range:
+ // #x9 | #xA | #xD | [#x20-#x7E] (8 bit)
+ // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit)
+ // | [#x10000-#x10FFFF] (32 bit)
+ switch {
+ case value == 0x09:
+ case value == 0x0A:
+ case value == 0x0D:
+ case value >= 0x20 && value <= 0x7E:
+ case value == 0x85:
+ case value >= 0xA0 && value <= 0xD7FF:
+ case value >= 0xE000 && value <= 0xFFFD:
+ case value >= 0x10000 && value <= 0x10FFFF:
+ default:
+ return yaml_parser_set_reader_error(parser,
+ "control characters are not allowed",
+ parser.offset, int(value))
+ }
+
+ // Move the raw pointers.
+ parser.raw_buffer_pos += width
+ parser.offset += width
+
+ // Finally put the character into the buffer.
+ if value <= 0x7F {
+ // 0000 0000-0000 007F . 0xxxxxxx
+ parser.buffer[buffer_len+0] = byte(value)
+ } else if value <= 0x7FF {
+ // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6))
+ parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F))
+ } else if value <= 0xFFFF {
+ // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12))
+ parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F))
+ parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F))
+ } else {
+ // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18))
+ parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F))
+ parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F))
+ parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F))
+ }
+ buffer_len += width
+
+ parser.unread++
+ }
+
+ // On EOF, put NUL into the buffer and return.
+ if parser.eof {
+ parser.buffer[buffer_len] = 0
+ buffer_len++
+ parser.unread++
+ break
+ }
+ }
+ parser.buffer = parser.buffer[:buffer_len]
+ return true
+}
diff --git a/vendor/gopkg.in/yaml.v1/resolve.go b/vendor/gopkg.in/yaml.v1/resolve.go
new file mode 100644
index 000000000..fdc49098b
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/resolve.go
@@ -0,0 +1,148 @@
+package yaml
+
+import (
+ "math"
+ "strconv"
+ "strings"
+)
+
+// TODO: merge, timestamps, base 60 floats, omap.
+
+type resolveMapItem struct {
+ value interface{}
+ tag string
+}
+
+var resolveTable = make([]byte, 256)
+var resolveMap = make(map[string]resolveMapItem)
+
+func init() {
+ t := resolveTable
+ t[int('+')] = 'S' // Sign
+ t[int('-')] = 'S'
+ for _, c := range "0123456789" {
+ t[int(c)] = 'D' // Digit
+ }
+ for _, c := range "yYnNtTfFoO~" {
+ t[int(c)] = 'M' // In map
+ }
+ t[int('.')] = '.' // Float (potentially in map)
+ t[int('<')] = '<' // Merge
+
+ var resolveMapList = []struct {
+ v interface{}
+ tag string
+ l []string
+ }{
+ {true, "!!bool", []string{"y", "Y", "yes", "Yes", "YES"}},
+ {true, "!!bool", []string{"true", "True", "TRUE"}},
+ {true, "!!bool", []string{"on", "On", "ON"}},
+ {false, "!!bool", []string{"n", "N", "no", "No", "NO"}},
+ {false, "!!bool", []string{"false", "False", "FALSE"}},
+ {false, "!!bool", []string{"off", "Off", "OFF"}},
+ {nil, "!!null", []string{"~", "null", "Null", "NULL"}},
+ {math.NaN(), "!!float", []string{".nan", ".NaN", ".NAN"}},
+ {math.Inf(+1), "!!float", []string{".inf", ".Inf", ".INF"}},
+ {math.Inf(+1), "!!float", []string{"+.inf", "+.Inf", "+.INF"}},
+ {math.Inf(-1), "!!float", []string{"-.inf", "-.Inf", "-.INF"}},
+ {"<<", "!!merge", []string{"<<"}},
+ }
+
+ m := resolveMap
+ for _, item := range resolveMapList {
+ for _, s := range item.l {
+ m[s] = resolveMapItem{item.v, item.tag}
+ }
+ }
+}
+
+const longTagPrefix = "tag:yaml.org,2002:"
+
+func shortTag(tag string) string {
+ if strings.HasPrefix(tag, longTagPrefix) {
+ return "!!" + tag[len(longTagPrefix):]
+ }
+ return tag
+}
+
+func resolvableTag(tag string) bool {
+ switch tag {
+ case "", "!!str", "!!bool", "!!int", "!!float", "!!null":
+ return true
+ }
+ return false
+}
+
+func resolve(tag string, in string) (rtag string, out interface{}) {
+ tag = shortTag(tag)
+ if !resolvableTag(tag) {
+ return tag, in
+ }
+
+ defer func() {
+ if tag != "" && tag != rtag {
+ panic("Can't decode " + rtag + " '" + in + "' as a " + tag)
+ }
+ }()
+
+ if in == "" {
+ return "!!null", nil
+ }
+
+ c := resolveTable[in[0]]
+ if c == 0 {
+ // It's a string for sure. Nothing to do.
+ return "!!str", in
+ }
+
+ // Handle things we can lookup in a map.
+ if item, ok := resolveMap[in]; ok {
+ return item.tag, item.value
+ }
+
+ switch c {
+ case 'M':
+ // We've already checked the map above.
+
+ case '.':
+ // Not in the map, so maybe a normal float.
+ floatv, err := strconv.ParseFloat(in, 64)
+ if err == nil {
+ return "!!float", floatv
+ }
+ // XXX Handle base 60 floats here (WTF!)
+
+ case 'D', 'S':
+ // Int, float, or timestamp.
+ plain := strings.Replace(in, "_", "", -1)
+ intv, err := strconv.ParseInt(plain, 0, 64)
+ if err == nil {
+ if intv == int64(int(intv)) {
+ return "!!int", int(intv)
+ } else {
+ return "!!int", intv
+ }
+ }
+ floatv, err := strconv.ParseFloat(plain, 64)
+ if err == nil {
+ return "!!float", floatv
+ }
+ if strings.HasPrefix(plain, "0b") {
+ intv, err := strconv.ParseInt(plain[2:], 2, 64)
+ if err == nil {
+ return "!!int", int(intv)
+ }
+ } else if strings.HasPrefix(plain, "-0b") {
+ intv, err := strconv.ParseInt(plain[3:], 2, 64)
+ if err == nil {
+ return "!!int", -int(intv)
+ }
+ }
+ // XXX Handle timestamps here.
+
+ default:
+ panic("resolveTable item not yet handled: " +
+ string([]byte{c}) + " (with " + in + ")")
+ }
+ return "!!str", in
+}
diff --git a/vendor/gopkg.in/yaml.v1/scannerc.go b/vendor/gopkg.in/yaml.v1/scannerc.go
new file mode 100644
index 000000000..fe93b190c
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/scannerc.go
@@ -0,0 +1,2710 @@
+package yaml
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// Introduction
+// ************
+//
+// The following notes assume that you are familiar with the YAML specification
+// (http://yaml.org/spec/cvs/current.html). We mostly follow it, although in
+// some cases we are less restrictive that it requires.
+//
+// The process of transforming a YAML stream into a sequence of events is
+// divided on two steps: Scanning and Parsing.
+//
+// The Scanner transforms the input stream into a sequence of tokens, while the
+// parser transform the sequence of tokens produced by the Scanner into a
+// sequence of parsing events.
+//
+// The Scanner is rather clever and complicated. The Parser, on the contrary,
+// is a straightforward implementation of a recursive-descendant parser (or,
+// LL(1) parser, as it is usually called).
+//
+// Actually there are two issues of Scanning that might be called "clever", the
+// rest is quite straightforward. The issues are "block collection start" and
+// "simple keys". Both issues are explained below in details.
+//
+// Here the Scanning step is explained and implemented. We start with the list
+// of all the tokens produced by the Scanner together with short descriptions.
+//
+// Now, tokens:
+//
+// STREAM-START(encoding) # The stream start.
+// STREAM-END # The stream end.
+// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive.
+// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive.
+// DOCUMENT-START # '---'
+// DOCUMENT-END # '...'
+// BLOCK-SEQUENCE-START # Indentation increase denoting a block
+// BLOCK-MAPPING-START # sequence or a block mapping.
+// BLOCK-END # Indentation decrease.
+// FLOW-SEQUENCE-START # '['
+// FLOW-SEQUENCE-END # ']'
+// BLOCK-SEQUENCE-START # '{'
+// BLOCK-SEQUENCE-END # '}'
+// BLOCK-ENTRY # '-'
+// FLOW-ENTRY # ','
+// KEY # '?' or nothing (simple keys).
+// VALUE # ':'
+// ALIAS(anchor) # '*anchor'
+// ANCHOR(anchor) # '&anchor'
+// TAG(handle,suffix) # '!handle!suffix'
+// SCALAR(value,style) # A scalar.
+//
+// The following two tokens are "virtual" tokens denoting the beginning and the
+// end of the stream:
+//
+// STREAM-START(encoding)
+// STREAM-END
+//
+// We pass the information about the input stream encoding with the
+// STREAM-START token.
+//
+// The next two tokens are responsible for tags:
+//
+// VERSION-DIRECTIVE(major,minor)
+// TAG-DIRECTIVE(handle,prefix)
+//
+// Example:
+//
+// %YAML 1.1
+// %TAG ! !foo
+// %TAG !yaml! tag:yaml.org,2002:
+// ---
+//
+// The correspoding sequence of tokens:
+//
+// STREAM-START(utf-8)
+// VERSION-DIRECTIVE(1,1)
+// TAG-DIRECTIVE("!","!foo")
+// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:")
+// DOCUMENT-START
+// STREAM-END
+//
+// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole
+// line.
+//
+// The document start and end indicators are represented by:
+//
+// DOCUMENT-START
+// DOCUMENT-END
+//
+// Note that if a YAML stream contains an implicit document (without '---'
+// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be
+// produced.
+//
+// In the following examples, we present whole documents together with the
+// produced tokens.
+//
+// 1. An implicit document:
+//
+// 'a scalar'
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// SCALAR("a scalar",single-quoted)
+// STREAM-END
+//
+// 2. An explicit document:
+//
+// ---
+// 'a scalar'
+// ...
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// DOCUMENT-START
+// SCALAR("a scalar",single-quoted)
+// DOCUMENT-END
+// STREAM-END
+//
+// 3. Several documents in a stream:
+//
+// 'a scalar'
+// ---
+// 'another scalar'
+// ---
+// 'yet another scalar'
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// SCALAR("a scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("another scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("yet another scalar",single-quoted)
+// STREAM-END
+//
+// We have already introduced the SCALAR token above. The following tokens are
+// used to describe aliases, anchors, tag, and scalars:
+//
+// ALIAS(anchor)
+// ANCHOR(anchor)
+// TAG(handle,suffix)
+// SCALAR(value,style)
+//
+// The following series of examples illustrate the usage of these tokens:
+//
+// 1. A recursive sequence:
+//
+// &A [ *A ]
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// ANCHOR("A")
+// FLOW-SEQUENCE-START
+// ALIAS("A")
+// FLOW-SEQUENCE-END
+// STREAM-END
+//
+// 2. A tagged scalar:
+//
+// !!float "3.14" # A good approximation.
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// TAG("!!","float")
+// SCALAR("3.14",double-quoted)
+// STREAM-END
+//
+// 3. Various scalar styles:
+//
+// --- # Implicit empty plain scalars do not produce tokens.
+// --- a plain scalar
+// --- 'a single-quoted scalar'
+// --- "a double-quoted scalar"
+// --- |-
+// a literal scalar
+// --- >-
+// a folded
+// scalar
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// DOCUMENT-START
+// DOCUMENT-START
+// SCALAR("a plain scalar",plain)
+// DOCUMENT-START
+// SCALAR("a single-quoted scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("a double-quoted scalar",double-quoted)
+// DOCUMENT-START
+// SCALAR("a literal scalar",literal)
+// DOCUMENT-START
+// SCALAR("a folded scalar",folded)
+// STREAM-END
+//
+// Now it's time to review collection-related tokens. We will start with
+// flow collections:
+//
+// FLOW-SEQUENCE-START
+// FLOW-SEQUENCE-END
+// FLOW-MAPPING-START
+// FLOW-MAPPING-END
+// FLOW-ENTRY
+// KEY
+// VALUE
+//
+// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and
+// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}'
+// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the
+// indicators '?' and ':', which are used for denoting mapping keys and values,
+// are represented by the KEY and VALUE tokens.
+//
+// The following examples show flow collections:
+//
+// 1. A flow sequence:
+//
+// [item 1, item 2, item 3]
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// FLOW-SEQUENCE-START
+// SCALAR("item 1",plain)
+// FLOW-ENTRY
+// SCALAR("item 2",plain)
+// FLOW-ENTRY
+// SCALAR("item 3",plain)
+// FLOW-SEQUENCE-END
+// STREAM-END
+//
+// 2. A flow mapping:
+//
+// {
+// a simple key: a value, # Note that the KEY token is produced.
+// ? a complex key: another value,
+// }
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// FLOW-MAPPING-START
+// KEY
+// SCALAR("a simple key",plain)
+// VALUE
+// SCALAR("a value",plain)
+// FLOW-ENTRY
+// KEY
+// SCALAR("a complex key",plain)
+// VALUE
+// SCALAR("another value",plain)
+// FLOW-ENTRY
+// FLOW-MAPPING-END
+// STREAM-END
+//
+// A simple key is a key which is not denoted by the '?' indicator. Note that
+// the Scanner still produce the KEY token whenever it encounters a simple key.
+//
+// For scanning block collections, the following tokens are used (note that we
+// repeat KEY and VALUE here):
+//
+// BLOCK-SEQUENCE-START
+// BLOCK-MAPPING-START
+// BLOCK-END
+// BLOCK-ENTRY
+// KEY
+// VALUE
+//
+// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
+// increase that precedes a block collection (cf. the INDENT token in Python).
+// The token BLOCK-END denote indentation decrease that ends a block collection
+// (cf. the DEDENT token in Python). However YAML has some syntax pecularities
+// that makes detections of these tokens more complex.
+//
+// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
+// '-', '?', and ':' correspondingly.
+//
+// The following examples show how the tokens BLOCK-SEQUENCE-START,
+// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner:
+//
+// 1. Block sequences:
+//
+// - item 1
+// - item 2
+// -
+// - item 3.1
+// - item 3.2
+// -
+// key 1: value 1
+// key 2: value 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-ENTRY
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 3.1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 3.2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// 2. Block mappings:
+//
+// a simple key: a value # The KEY token is produced here.
+// ? a complex key
+// : another value
+// a mapping:
+// key 1: value 1
+// key 2: value 2
+// a sequence:
+// - item 1
+// - item 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("a simple key",plain)
+// VALUE
+// SCALAR("a value",plain)
+// KEY
+// SCALAR("a complex key",plain)
+// VALUE
+// SCALAR("another value",plain)
+// KEY
+// SCALAR("a mapping",plain)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// KEY
+// SCALAR("a sequence",plain)
+// VALUE
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// YAML does not always require to start a new block collection from a new
+// line. If the current line contains only '-', '?', and ':' indicators, a new
+// block collection may start at the current line. The following examples
+// illustrate this case:
+//
+// 1. Collections in a sequence:
+//
+// - - item 1
+// - item 2
+// - key 1: value 1
+// key 2: value 2
+// - ? complex key
+// : complex value
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("complex key")
+// VALUE
+// SCALAR("complex value")
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// 2. Collections in a mapping:
+//
+// ? a sequence
+// : - item 1
+// - item 2
+// ? a mapping
+// : key 1: value 1
+// key 2: value 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("a sequence",plain)
+// VALUE
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// KEY
+// SCALAR("a mapping",plain)
+// VALUE
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// YAML also permits non-indented sequences if they are included into a block
+// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced:
+//
+// key:
+// - item 1 # BLOCK-SEQUENCE-START is NOT produced here.
+// - item 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key",plain)
+// VALUE
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+//
+
+// Ensure that the buffer contains the required number of characters.
+// Return true on success, false on failure (reader error or memory error).
+func cache(parser *yaml_parser_t, length int) bool {
+ // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B)
+ return parser.unread >= length || yaml_parser_update_buffer(parser, length)
+}
+
+// Advance the buffer pointer.
+func skip(parser *yaml_parser_t) {
+ parser.mark.index++
+ parser.mark.column++
+ parser.unread--
+ parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
+}
+
+func skip_line(parser *yaml_parser_t) {
+ if is_crlf(parser.buffer, parser.buffer_pos) {
+ parser.mark.index += 2
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread -= 2
+ parser.buffer_pos += 2
+ } else if is_break(parser.buffer, parser.buffer_pos) {
+ parser.mark.index++
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread--
+ parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
+ }
+}
+
+// Copy a character to a string buffer and advance pointers.
+func read(parser *yaml_parser_t, s []byte) []byte {
+ w := width(parser.buffer[parser.buffer_pos])
+ if w == 0 {
+ panic("invalid character sequence")
+ }
+ if len(s) == 0 {
+ s = make([]byte, 0, 32)
+ }
+ if w == 1 && len(s)+w <= cap(s) {
+ s = s[:len(s)+1]
+ s[len(s)-1] = parser.buffer[parser.buffer_pos]
+ parser.buffer_pos++
+ } else {
+ s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
+ parser.buffer_pos += w
+ }
+ parser.mark.index++
+ parser.mark.column++
+ parser.unread--
+ return s
+}
+
+// Copy a line break character to a string buffer and advance pointers.
+func read_line(parser *yaml_parser_t, s []byte) []byte {
+ buf := parser.buffer
+ pos := parser.buffer_pos
+ switch {
+ case buf[pos] == '\r' && buf[pos+1] == '\n':
+ // CR LF . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 2
+ parser.mark.index++
+ parser.unread--
+ case buf[pos] == '\r' || buf[pos] == '\n':
+ // CR|LF . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 1
+ case buf[pos] == '\xC2' && buf[pos+1] == '\x85':
+ // NEL . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 2
+ case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'):
+ // LS|PS . LS|PS
+ s = append(s, buf[parser.buffer_pos:pos+3]...)
+ parser.buffer_pos += 3
+ default:
+ return s
+ }
+ parser.mark.index++
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread--
+ return s
+}
+
+// Get the next token.
+func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool {
+ // Erase the token object.
+ *token = yaml_token_t{} // [Go] Is this necessary?
+
+ // No tokens after STREAM-END or error.
+ if parser.stream_end_produced || parser.error != yaml_NO_ERROR {
+ return true
+ }
+
+ // Ensure that the tokens queue contains enough tokens.
+ if !parser.token_available {
+ if !yaml_parser_fetch_more_tokens(parser) {
+ return false
+ }
+ }
+
+ // Fetch the next token from the queue.
+ *token = parser.tokens[parser.tokens_head]
+ parser.tokens_head++
+ parser.tokens_parsed++
+ parser.token_available = false
+
+ if token.typ == yaml_STREAM_END_TOKEN {
+ parser.stream_end_produced = true
+ }
+ return true
+}
+
+// Set the scanner error and return false.
+func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool {
+ parser.error = yaml_SCANNER_ERROR
+ parser.context = context
+ parser.context_mark = context_mark
+ parser.problem = problem
+ parser.problem_mark = parser.mark
+ return false
+}
+
+func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool {
+ context := "while parsing a tag"
+ if directive {
+ context = "while parsing a %TAG directive"
+ }
+ return yaml_parser_set_scanner_error(parser, context, context_mark, "did not find URI escaped octet")
+}
+
+func trace(args ...interface{}) func() {
+ pargs := append([]interface{}{"+++"}, args...)
+ fmt.Println(pargs...)
+ pargs = append([]interface{}{"---"}, args...)
+ return func() { fmt.Println(pargs...) }
+}
+
+// Ensure that the tokens queue contains at least one token which can be
+// returned to the Parser.
+func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool {
+ // While we need more tokens to fetch, do it.
+ for {
+ // Check if we really need to fetch more tokens.
+ need_more_tokens := false
+
+ if parser.tokens_head == len(parser.tokens) {
+ // Queue is empty.
+ need_more_tokens = true
+ } else {
+ // Check if any potential simple key may occupy the head position.
+ if !yaml_parser_stale_simple_keys(parser) {
+ return false
+ }
+
+ for i := range parser.simple_keys {
+ simple_key := &parser.simple_keys[i]
+ if simple_key.possible && simple_key.token_number == parser.tokens_parsed {
+ need_more_tokens = true
+ break
+ }
+ }
+ }
+
+ // We are finished.
+ if !need_more_tokens {
+ break
+ }
+ // Fetch the next token.
+ if !yaml_parser_fetch_next_token(parser) {
+ return false
+ }
+ }
+
+ parser.token_available = true
+ return true
+}
+
+// The dispatcher for token fetchers.
+func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool {
+ // Ensure that the buffer is initialized.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ // Check if we just started scanning. Fetch STREAM-START then.
+ if !parser.stream_start_produced {
+ return yaml_parser_fetch_stream_start(parser)
+ }
+
+ // Eat whitespaces and comments until we reach the next token.
+ if !yaml_parser_scan_to_next_token(parser) {
+ return false
+ }
+
+ // Remove obsolete potential simple keys.
+ if !yaml_parser_stale_simple_keys(parser) {
+ return false
+ }
+
+ // Check the indentation level against the current column.
+ if !yaml_parser_unroll_indent(parser, parser.mark.column) {
+ return false
+ }
+
+ // Ensure that the buffer contains at least 4 characters. 4 is the length
+ // of the longest indicators ('--- ' and '... ').
+ if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
+ return false
+ }
+
+ // Is it the end of the stream?
+ if is_z(parser.buffer, parser.buffer_pos) {
+ return yaml_parser_fetch_stream_end(parser)
+ }
+
+ // Is it a directive?
+ if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' {
+ return yaml_parser_fetch_directive(parser)
+ }
+
+ buf := parser.buffer
+ pos := parser.buffer_pos
+
+ // Is it the document start indicator?
+ if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) {
+ return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN)
+ }
+
+ // Is it the document end indicator?
+ if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) {
+ return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN)
+ }
+
+ // Is it the flow sequence start indicator?
+ if buf[pos] == '[' {
+ return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN)
+ }
+
+ // Is it the flow mapping start indicator?
+ if parser.buffer[parser.buffer_pos] == '{' {
+ return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN)
+ }
+
+ // Is it the flow sequence end indicator?
+ if parser.buffer[parser.buffer_pos] == ']' {
+ return yaml_parser_fetch_flow_collection_end(parser,
+ yaml_FLOW_SEQUENCE_END_TOKEN)
+ }
+
+ // Is it the flow mapping end indicator?
+ if parser.buffer[parser.buffer_pos] == '}' {
+ return yaml_parser_fetch_flow_collection_end(parser,
+ yaml_FLOW_MAPPING_END_TOKEN)
+ }
+
+ // Is it the flow entry indicator?
+ if parser.buffer[parser.buffer_pos] == ',' {
+ return yaml_parser_fetch_flow_entry(parser)
+ }
+
+ // Is it the block entry indicator?
+ if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) {
+ return yaml_parser_fetch_block_entry(parser)
+ }
+
+ // Is it the key indicator?
+ if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
+ return yaml_parser_fetch_key(parser)
+ }
+
+ // Is it the value indicator?
+ if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
+ return yaml_parser_fetch_value(parser)
+ }
+
+ // Is it an alias?
+ if parser.buffer[parser.buffer_pos] == '*' {
+ return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN)
+ }
+
+ // Is it an anchor?
+ if parser.buffer[parser.buffer_pos] == '&' {
+ return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN)
+ }
+
+ // Is it a tag?
+ if parser.buffer[parser.buffer_pos] == '!' {
+ return yaml_parser_fetch_tag(parser)
+ }
+
+ // Is it a literal scalar?
+ if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 {
+ return yaml_parser_fetch_block_scalar(parser, true)
+ }
+
+ // Is it a folded scalar?
+ if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 {
+ return yaml_parser_fetch_block_scalar(parser, false)
+ }
+
+ // Is it a single-quoted scalar?
+ if parser.buffer[parser.buffer_pos] == '\'' {
+ return yaml_parser_fetch_flow_scalar(parser, true)
+ }
+
+ // Is it a double-quoted scalar?
+ if parser.buffer[parser.buffer_pos] == '"' {
+ return yaml_parser_fetch_flow_scalar(parser, false)
+ }
+
+ // Is it a plain scalar?
+ //
+ // A plain scalar may start with any non-blank characters except
+ //
+ // '-', '?', ':', ',', '[', ']', '{', '}',
+ // '#', '&', '*', '!', '|', '>', '\'', '\"',
+ // '%', '@', '`'.
+ //
+ // In the block context (and, for the '-' indicator, in the flow context
+ // too), it may also start with the characters
+ //
+ // '-', '?', ':'
+ //
+ // if it is followed by a non-space character.
+ //
+ // The last rule is more restrictive than the specification requires.
+ // [Go] Make this logic more reasonable.
+ //switch parser.buffer[parser.buffer_pos] {
+ //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`':
+ //}
+ if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' ||
+ parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' ||
+ parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
+ parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' ||
+ parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' ||
+ parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' ||
+ parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' ||
+ parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' ||
+ parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') ||
+ (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) ||
+ (parser.flow_level == 0 &&
+ (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') &&
+ !is_blankz(parser.buffer, parser.buffer_pos+1)) {
+ return yaml_parser_fetch_plain_scalar(parser)
+ }
+
+ // If we don't determine the token type so far, it is an error.
+ return yaml_parser_set_scanner_error(parser,
+ "while scanning for the next token", parser.mark,
+ "found character that cannot start any token")
+}
+
+// Check the list of potential simple keys and remove the positions that
+// cannot contain simple keys anymore.
+func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool {
+ // Check for a potential simple key for each flow level.
+ for i := range parser.simple_keys {
+ simple_key := &parser.simple_keys[i]
+
+ // The specification requires that a simple key
+ //
+ // - is limited to a single line,
+ // - is shorter than 1024 characters.
+ if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) {
+
+ // Check if the potential simple key to be removed is required.
+ if simple_key.required {
+ return yaml_parser_set_scanner_error(parser,
+ "while scanning a simple key", simple_key.mark,
+ "could not find expected ':'")
+ }
+ simple_key.possible = false
+ }
+ }
+ return true
+}
+
+// Check if a simple key may start at the current position and add it if
+// needed.
+func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
+ // A simple key is required at the current position if the scanner is in
+ // the block context and the current column coincides with the indentation
+ // level.
+
+ required := parser.flow_level == 0 && parser.indent == parser.mark.column
+
+ // A simple key is required only when it is the first token in the current
+ // line. Therefore it is always allowed. But we add a check anyway.
+ if required && !parser.simple_key_allowed {
+ panic("should not happen")
+ }
+
+ //
+ // If the current position may start a simple key, save it.
+ //
+ if parser.simple_key_allowed {
+ simple_key := yaml_simple_key_t{
+ possible: true,
+ required: required,
+ token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
+ }
+ simple_key.mark = parser.mark
+
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+ parser.simple_keys[len(parser.simple_keys)-1] = simple_key
+ }
+ return true
+}
+
+// Remove a potential simple key at the current flow level.
+func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
+ i := len(parser.simple_keys) - 1
+ if parser.simple_keys[i].possible {
+ // If the key is required, it is an error.
+ if parser.simple_keys[i].required {
+ return yaml_parser_set_scanner_error(parser,
+ "while scanning a simple key", parser.simple_keys[i].mark,
+ "could not find expected ':'")
+ }
+ }
+ // Remove the key from the stack.
+ parser.simple_keys[i].possible = false
+ return true
+}
+
+// Increase the flow level and resize the simple key list if needed.
+func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
+ // Reset the simple key on the next level.
+ parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
+
+ // Increase the flow level.
+ parser.flow_level++
+ return true
+}
+
+// Decrease the flow level.
+func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool {
+ if parser.flow_level > 0 {
+ parser.flow_level--
+ parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1]
+ }
+ return true
+}
+
+// Push the current indentation level to the stack and set the new level
+// the current column is greater than the indentation level. In this case,
+// append or insert the specified token into the token queue.
+func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool {
+ // In the flow context, do nothing.
+ if parser.flow_level > 0 {
+ return true
+ }
+
+ if parser.indent < column {
+ // Push the current indentation level to the stack and set the new
+ // indentation level.
+ parser.indents = append(parser.indents, parser.indent)
+ parser.indent = column
+
+ // Create a token and insert it into the queue.
+ token := yaml_token_t{
+ typ: typ,
+ start_mark: mark,
+ end_mark: mark,
+ }
+ if number > -1 {
+ number -= parser.tokens_parsed
+ }
+ yaml_insert_token(parser, number, &token)
+ }
+ return true
+}
+
+// Pop indentation levels from the indents stack until the current level
+// becomes less or equal to the column. For each intendation level, append
+// the BLOCK-END token.
+func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool {
+ // In the flow context, do nothing.
+ if parser.flow_level > 0 {
+ return true
+ }
+
+ // Loop through the intendation levels in the stack.
+ for parser.indent > column {
+ // Create a token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_BLOCK_END_TOKEN,
+ start_mark: parser.mark,
+ end_mark: parser.mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+
+ // Pop the indentation level.
+ parser.indent = parser.indents[len(parser.indents)-1]
+ parser.indents = parser.indents[:len(parser.indents)-1]
+ }
+ return true
+}
+
+// Initialize the scanner and produce the STREAM-START token.
+func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
+
+ // Set the initial indentation.
+ parser.indent = -1
+
+ // Initialize the simple key stack.
+ parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
+
+ // A simple key is allowed at the beginning of the stream.
+ parser.simple_key_allowed = true
+
+ // We have started.
+ parser.stream_start_produced = true
+
+ // Create the STREAM-START token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_STREAM_START_TOKEN,
+ start_mark: parser.mark,
+ end_mark: parser.mark,
+ encoding: parser.encoding,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the STREAM-END token and shut down the scanner.
+func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool {
+
+ // Force new line.
+ if parser.mark.column != 0 {
+ parser.mark.column = 0
+ parser.mark.line++
+ }
+
+ // Reset the indentation level.
+ if !yaml_parser_unroll_indent(parser, -1) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Create the STREAM-END token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_STREAM_END_TOKEN,
+ start_mark: parser.mark,
+ end_mark: parser.mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token.
+func yaml_parser_fetch_directive(parser *yaml_parser_t) bool {
+ // Reset the indentation level.
+ if !yaml_parser_unroll_indent(parser, -1) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token.
+ token := yaml_token_t{}
+ if !yaml_parser_scan_directive(parser, &token) {
+ return false
+ }
+ // Append the token to the queue.
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the DOCUMENT-START or DOCUMENT-END token.
+func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool {
+ // Reset the indentation level.
+ if !yaml_parser_unroll_indent(parser, -1) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Consume the token.
+ start_mark := parser.mark
+
+ skip(parser)
+ skip(parser)
+ skip(parser)
+
+ end_mark := parser.mark
+
+ // Create the DOCUMENT-START or DOCUMENT-END token.
+ token := yaml_token_t{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.
+func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool {
+ // The indicators '[' and '{' may start a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // Increase the flow level.
+ if !yaml_parser_increase_flow_level(parser) {
+ return false
+ }
+
+ // A simple key may follow the indicators '[' and '{'.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token.
+ token := yaml_token_t{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.
+func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool {
+ // Reset any potential simple key on the current flow level.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // Decrease the flow level.
+ if !yaml_parser_decrease_flow_level(parser) {
+ return false
+ }
+
+ // No simple keys after the indicators ']' and '}'.
+ parser.simple_key_allowed = false
+
+ // Consume the token.
+
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token.
+ token := yaml_token_t{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the FLOW-ENTRY token.
+func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool {
+ // Reset any potential simple keys on the current flow level.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // Simple keys are allowed after ','.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the FLOW-ENTRY token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_FLOW_ENTRY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the BLOCK-ENTRY token.
+func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool {
+ // Check if the scanner is in the block context.
+ if parser.flow_level == 0 {
+ // Check if we are allowed to start a new entry.
+ if !parser.simple_key_allowed {
+ return yaml_parser_set_scanner_error(parser, "", parser.mark,
+ "block sequence entries are not allowed in this context")
+ }
+ // Add the BLOCK-SEQUENCE-START token if needed.
+ if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) {
+ return false
+ }
+ } else {
+ // It is an error for the '-' indicator to occur in the flow context,
+ // but we let the Parser detect and report about it because the Parser
+ // is able to point to the context.
+ }
+
+ // Reset any potential simple keys on the current flow level.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // Simple keys are allowed after '-'.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the BLOCK-ENTRY token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_BLOCK_ENTRY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the KEY token.
+func yaml_parser_fetch_key(parser *yaml_parser_t) bool {
+
+ // In the block context, additional checks are required.
+ if parser.flow_level == 0 {
+ // Check if we are allowed to start a new key (not nessesary simple).
+ if !parser.simple_key_allowed {
+ return yaml_parser_set_scanner_error(parser, "", parser.mark,
+ "mapping keys are not allowed in this context")
+ }
+ // Add the BLOCK-MAPPING-START token if needed.
+ if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
+ return false
+ }
+ }
+
+ // Reset any potential simple keys on the current flow level.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // Simple keys are allowed after '?' in the block context.
+ parser.simple_key_allowed = parser.flow_level == 0
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the KEY token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_KEY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the VALUE token.
+func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
+
+ simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
+
+ // Have we found a simple key?
+ if simple_key.possible {
+ // Create the KEY token and insert it into the queue.
+ token := yaml_token_t{
+ typ: yaml_KEY_TOKEN,
+ start_mark: simple_key.mark,
+ end_mark: simple_key.mark,
+ }
+ yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token)
+
+ // In the block context, we may need to add the BLOCK-MAPPING-START token.
+ if !yaml_parser_roll_indent(parser, simple_key.mark.column,
+ simple_key.token_number,
+ yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) {
+ return false
+ }
+
+ // Remove the simple key.
+ simple_key.possible = false
+
+ // A simple key cannot follow another simple key.
+ parser.simple_key_allowed = false
+
+ } else {
+ // The ':' indicator follows a complex key.
+
+ // In the block context, extra checks are required.
+ if parser.flow_level == 0 {
+
+ // Check if we are allowed to start a complex value.
+ if !parser.simple_key_allowed {
+ return yaml_parser_set_scanner_error(parser, "", parser.mark,
+ "mapping values are not allowed in this context")
+ }
+
+ // Add the BLOCK-MAPPING-START token if needed.
+ if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
+ return false
+ }
+ }
+
+ // Simple keys after ':' are allowed in the block context.
+ parser.simple_key_allowed = parser.flow_level == 0
+ }
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the VALUE token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_VALUE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the ALIAS or ANCHOR token.
+func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool {
+ // An anchor or an alias could be a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // A simple key cannot follow an anchor or an alias.
+ parser.simple_key_allowed = false
+
+ // Create the ALIAS or ANCHOR token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_anchor(parser, &token, typ) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the TAG token.
+func yaml_parser_fetch_tag(parser *yaml_parser_t) bool {
+ // A tag could be a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // A simple key cannot follow a tag.
+ parser.simple_key_allowed = false
+
+ // Create the TAG token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_tag(parser, &token) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.
+func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool {
+ // Remove any potential simple keys.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // A simple key may follow a block scalar.
+ parser.simple_key_allowed = true
+
+ // Create the SCALAR token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_block_scalar(parser, &token, literal) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.
+func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool {
+ // A plain scalar could be a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // A simple key cannot follow a flow scalar.
+ parser.simple_key_allowed = false
+
+ // Create the SCALAR token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_flow_scalar(parser, &token, single) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,plain) token.
+func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool {
+ // A plain scalar could be a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // A simple key cannot follow a flow scalar.
+ parser.simple_key_allowed = false
+
+ // Create the SCALAR token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_plain_scalar(parser, &token) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Eat whitespaces and comments until the next token is found.
+func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool {
+
+ // Until the next token is not found.
+ for {
+ // Allow the BOM mark to start a line.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ }
+
+ // Eat whitespaces.
+ // Tabs are allowed:
+ // - in the flow context
+ // - in the block context, but not at the beginning of the line or
+ // after '-', '?', or ':' (complex value).
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Eat a comment until a line break.
+ if parser.buffer[parser.buffer_pos] == '#' {
+ for !is_breakz(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ }
+
+ // If it is a line break, eat it.
+ if is_break(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ skip_line(parser)
+
+ // In the block context, a new line may start a simple key.
+ if parser.flow_level == 0 {
+ parser.simple_key_allowed = true
+ }
+ } else {
+ break // We have found a token.
+ }
+ }
+
+ return true
+}
+
+// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
+//
+// Scope:
+// %YAML 1.1 # a comment \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool {
+ // Eat '%'.
+ start_mark := parser.mark
+ skip(parser)
+
+ // Scan the directive name.
+ var name []byte
+ if !yaml_parser_scan_directive_name(parser, start_mark, &name) {
+ return false
+ }
+
+ // Is it a YAML directive?
+ if bytes.Equal(name, []byte("YAML")) {
+ // Scan the VERSION directive value.
+ var major, minor int8
+ if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) {
+ return false
+ }
+ end_mark := parser.mark
+
+ // Create a VERSION-DIRECTIVE token.
+ *token = yaml_token_t{
+ typ: yaml_VERSION_DIRECTIVE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ major: major,
+ minor: minor,
+ }
+
+ // Is it a TAG directive?
+ } else if bytes.Equal(name, []byte("TAG")) {
+ // Scan the TAG directive value.
+ var handle, prefix []byte
+ if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) {
+ return false
+ }
+ end_mark := parser.mark
+
+ // Create a TAG-DIRECTIVE token.
+ *token = yaml_token_t{
+ typ: yaml_TAG_DIRECTIVE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: handle,
+ prefix: prefix,
+ }
+
+ // Unknown directive.
+ } else {
+ yaml_parser_set_scanner_error(parser, "while scanning a directive",
+ start_mark, "found uknown directive name")
+ return false
+ }
+
+ // Eat the rest of the line including any comments.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ if parser.buffer[parser.buffer_pos] == '#' {
+ for !is_breakz(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ }
+
+ // Check if we are at the end of the line.
+ if !is_breakz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a directive",
+ start_mark, "did not find expected comment or line break")
+ return false
+ }
+
+ // Eat a line break.
+ if is_break(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ skip_line(parser)
+ }
+
+ return true
+}
+
+// Scan the directive name.
+//
+// Scope:
+// %YAML 1.1 # a comment \n
+// ^^^^
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^
+//
+func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool {
+ // Consume the directive name.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ var s []byte
+ for is_alpha(parser.buffer, parser.buffer_pos) {
+ s = read(parser, s)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check if the name is empty.
+ if len(s) == 0 {
+ yaml_parser_set_scanner_error(parser, "while scanning a directive",
+ start_mark, "could not find expected directive name")
+ return false
+ }
+
+ // Check for an blank character after the name.
+ if !is_blankz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a directive",
+ start_mark, "found unexpected non-alphabetical character")
+ return false
+ }
+ *name = s
+ return true
+}
+
+// Scan the value of VERSION-DIRECTIVE.
+//
+// Scope:
+// %YAML 1.1 # a comment \n
+// ^^^^^^
+func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool {
+ // Eat whitespaces.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Consume the major version number.
+ if !yaml_parser_scan_version_directive_number(parser, start_mark, major) {
+ return false
+ }
+
+ // Eat '.'.
+ if parser.buffer[parser.buffer_pos] != '.' {
+ return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+ start_mark, "did not find expected digit or '.' character")
+ }
+
+ skip(parser)
+
+ // Consume the minor version number.
+ if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) {
+ return false
+ }
+ return true
+}
+
+const max_number_length = 2
+
+// Scan the version number of VERSION-DIRECTIVE.
+//
+// Scope:
+// %YAML 1.1 # a comment \n
+// ^
+// %YAML 1.1 # a comment \n
+// ^
+func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool {
+
+ // Repeat while the next character is digit.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ var value, length int8
+ for is_digit(parser.buffer, parser.buffer_pos) {
+ // Check if the number is too long.
+ length++
+ if length > max_number_length {
+ return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+ start_mark, "found extremely long version number")
+ }
+ value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos))
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check if the number was present.
+ if length == 0 {
+ return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+ start_mark, "did not find expected version number")
+ }
+ *number = value
+ return true
+}
+
+// Scan the value of a TAG-DIRECTIVE token.
+//
+// Scope:
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool {
+ var handle_value, prefix_value []byte
+
+ // Eat whitespaces.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Scan a handle.
+ if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) {
+ return false
+ }
+
+ // Expect a whitespace.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if !is_blank(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
+ start_mark, "did not find expected whitespace")
+ return false
+ }
+
+ // Eat whitespaces.
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Scan a prefix.
+ if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) {
+ return false
+ }
+
+ // Expect a whitespace or line break.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if !is_blankz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
+ start_mark, "did not find expected whitespace or line break")
+ return false
+ }
+
+ *handle = handle_value
+ *prefix = prefix_value
+ return true
+}
+
+func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool {
+ var s []byte
+
+ // Eat the indicator character.
+ start_mark := parser.mark
+ skip(parser)
+
+ // Consume the value.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_alpha(parser.buffer, parser.buffer_pos) {
+ s = read(parser, s)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ end_mark := parser.mark
+
+ /*
+ * Check if length of the anchor is greater than 0 and it is followed by
+ * a whitespace character or one of the indicators:
+ *
+ * '?', ':', ',', ']', '}', '%', '@', '`'.
+ */
+
+ if len(s) == 0 ||
+ !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' ||
+ parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' ||
+ parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' ||
+ parser.buffer[parser.buffer_pos] == '`') {
+ context := "while scanning an alias"
+ if typ == yaml_ANCHOR_TOKEN {
+ context = "while scanning an anchor"
+ }
+ yaml_parser_set_scanner_error(parser, context, start_mark,
+ "did not find expected alphabetic or numeric character")
+ return false
+ }
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ }
+
+ return true
+}
+
+/*
+ * Scan a TAG token.
+ */
+
+func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool {
+ var handle, suffix []byte
+
+ start_mark := parser.mark
+
+ // Check if the tag is in the canonical form.
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+
+ if parser.buffer[parser.buffer_pos+1] == '<' {
+ // Keep the handle as ''
+
+ // Eat '!<'
+ skip(parser)
+ skip(parser)
+
+ // Consume the tag value.
+ if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
+ return false
+ }
+
+ // Check for '>' and eat it.
+ if parser.buffer[parser.buffer_pos] != '>' {
+ yaml_parser_set_scanner_error(parser, "while scanning a tag",
+ start_mark, "did not find the expected '>'")
+ return false
+ }
+
+ skip(parser)
+ } else {
+ // The tag has either the '!suffix' or the '!handle!suffix' form.
+
+ // First, try to scan a handle.
+ if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) {
+ return false
+ }
+
+ // Check if it is, indeed, handle.
+ if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' {
+ // Scan the suffix now.
+ if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
+ return false
+ }
+ } else {
+ // It wasn't a handle after all. Scan the rest of the tag.
+ if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) {
+ return false
+ }
+
+ // Set the handle to '!'.
+ handle = []byte{'!'}
+
+ // A special case: the '!' tag. Set the handle to '' and the
+ // suffix to '!'.
+ if len(suffix) == 0 {
+ handle, suffix = suffix, handle
+ }
+ }
+ }
+
+ // Check the character which ends the tag.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if !is_blankz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a tag",
+ start_mark, "did not find expected whitespace or line break")
+ return false
+ }
+
+ end_mark := parser.mark
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: yaml_TAG_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: handle,
+ suffix: suffix,
+ }
+ return true
+}
+
+// Scan a tag handle.
+func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool {
+ // Check the initial '!' character.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if parser.buffer[parser.buffer_pos] != '!' {
+ yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "did not find expected '!'")
+ return false
+ }
+
+ var s []byte
+
+ // Copy the '!' character.
+ s = read(parser, s)
+
+ // Copy all subsequent alphabetical and numerical characters.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ for is_alpha(parser.buffer, parser.buffer_pos) {
+ s = read(parser, s)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check if the trailing character is '!' and copy it.
+ if parser.buffer[parser.buffer_pos] == '!' {
+ s = read(parser, s)
+ } else {
+ // It's either the '!' tag or not really a tag handle. If it's a %TAG
+ // directive, it's an error. If it's a tag token, it must be a part of URI.
+ if directive && !(s[0] == '!' && s[1] == 0) {
+ yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "did not find expected '!'")
+ return false
+ }
+ }
+
+ *handle = s
+ return true
+}
+
+// Scan a tag.
+func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool {
+ //size_t length = head ? strlen((char *)head) : 0
+ var s []byte
+
+ // Copy the head if needed.
+ //
+ // Note that we don't copy the leading '!' character.
+ if len(head) > 1 {
+ s = append(s, head[1:]...)
+ }
+
+ // Scan the tag.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ // The set of characters that may appear in URI is as follows:
+ //
+ // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
+ // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
+ // '%'.
+ // [Go] Convert this into more reasonable logic.
+ for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' ||
+ parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' ||
+ parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' ||
+ parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' ||
+ parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' ||
+ parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' ||
+ parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' ||
+ parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' ||
+ parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' ||
+ parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' ||
+ parser.buffer[parser.buffer_pos] == '%' {
+ // Check if it is a URI-escape sequence.
+ if parser.buffer[parser.buffer_pos] == '%' {
+ if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) {
+ return false
+ }
+ } else {
+ s = read(parser, s)
+ }
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check if the tag is non-empty.
+ if len(s) == 0 {
+ yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "did not find expected tag URI")
+ return false
+ }
+ *uri = s
+ return true
+}
+
+// Decode an URI-escape sequence corresponding to a single UTF-8 character.
+func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool {
+
+ // Decode the required number of characters.
+ w := 1024
+ for w > 0 {
+ // Check for a URI-escaped octet.
+ if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
+ return false
+ }
+
+ if !(parser.buffer[parser.buffer_pos] == '%' &&
+ is_hex(parser.buffer, parser.buffer_pos+1) &&
+ is_hex(parser.buffer, parser.buffer_pos+2)) {
+ return yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "did not find URI escaped octet")
+ }
+
+ // Get the octet.
+ octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2))
+
+ // If it is the leading octet, determine the length of the UTF-8 sequence.
+ if w == 1024 {
+ w = width(octet)
+ if w == 0 {
+ return yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "found an incorrect leading UTF-8 octet")
+ }
+ } else {
+ // Check if the trailing octet is correct.
+ if octet&0xC0 != 0x80 {
+ return yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "found an incorrect trailing UTF-8 octet")
+ }
+ }
+
+ // Copy the octet and move the pointers.
+ *s = append(*s, octet)
+ skip(parser)
+ skip(parser)
+ skip(parser)
+ w--
+ }
+ return true
+}
+
+// Scan a block scalar.
+func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool {
+ // Eat the indicator '|' or '>'.
+ start_mark := parser.mark
+ skip(parser)
+
+ // Scan the additional block scalar indicators.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ // Check for a chomping indicator.
+ var chomping, increment int
+ if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
+ // Set the chomping method and eat the indicator.
+ if parser.buffer[parser.buffer_pos] == '+' {
+ chomping = +1
+ } else {
+ chomping = -1
+ }
+ skip(parser)
+
+ // Check for an indentation indicator.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if is_digit(parser.buffer, parser.buffer_pos) {
+ // Check that the intendation is greater than 0.
+ if parser.buffer[parser.buffer_pos] == '0' {
+ yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+ start_mark, "found an intendation indicator equal to 0")
+ return false
+ }
+
+ // Get the intendation level and eat the indicator.
+ increment = as_digit(parser.buffer, parser.buffer_pos)
+ skip(parser)
+ }
+
+ } else if is_digit(parser.buffer, parser.buffer_pos) {
+ // Do the same as above, but in the opposite order.
+
+ if parser.buffer[parser.buffer_pos] == '0' {
+ yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+ start_mark, "found an intendation indicator equal to 0")
+ return false
+ }
+ increment = as_digit(parser.buffer, parser.buffer_pos)
+ skip(parser)
+
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
+ if parser.buffer[parser.buffer_pos] == '+' {
+ chomping = +1
+ } else {
+ chomping = -1
+ }
+ skip(parser)
+ }
+ }
+
+ // Eat whitespaces and comments to the end of the line.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ if parser.buffer[parser.buffer_pos] == '#' {
+ for !is_breakz(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ }
+
+ // Check if we are at the end of the line.
+ if !is_breakz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+ start_mark, "did not find expected comment or line break")
+ return false
+ }
+
+ // Eat a line break.
+ if is_break(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ skip_line(parser)
+ }
+
+ end_mark := parser.mark
+
+ // Set the intendation level if it was specified.
+ var indent int
+ if increment > 0 {
+ if parser.indent >= 0 {
+ indent = parser.indent + increment
+ } else {
+ indent = increment
+ }
+ }
+
+ // Scan the leading line breaks and determine the indentation level if needed.
+ var s, leading_break, trailing_breaks []byte
+ if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
+ return false
+ }
+
+ // Scan the block scalar content.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ var leading_blank, trailing_blank bool
+ for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) {
+ // We are at the beginning of a non-empty line.
+
+ // Is it a trailing whitespace?
+ trailing_blank = is_blank(parser.buffer, parser.buffer_pos)
+
+ // Check if we need to fold the leading line break.
+ if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' {
+ // Do we need to join the lines by space?
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ }
+ } else {
+ s = append(s, leading_break...)
+ }
+ leading_break = leading_break[:0]
+
+ // Append the remaining line breaks.
+ s = append(s, trailing_breaks...)
+ trailing_breaks = trailing_breaks[:0]
+
+ // Is it a leading whitespace?
+ leading_blank = is_blank(parser.buffer, parser.buffer_pos)
+
+ // Consume the current line.
+ for !is_breakz(parser.buffer, parser.buffer_pos) {
+ s = read(parser, s)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Consume the line break.
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+
+ leading_break = read_line(parser, leading_break)
+
+ // Eat the following intendation spaces and line breaks.
+ if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
+ return false
+ }
+ }
+
+ // Chomp the tail.
+ if chomping != -1 {
+ s = append(s, leading_break...)
+ }
+ if chomping == 1 {
+ s = append(s, trailing_breaks...)
+ }
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_LITERAL_SCALAR_STYLE,
+ }
+ if !literal {
+ token.style = yaml_FOLDED_SCALAR_STYLE
+ }
+ return true
+}
+
+// Scan intendation spaces and line breaks for a block scalar. Determine the
+// intendation level if needed.
+func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool {
+ *end_mark = parser.mark
+
+ // Eat the intendation spaces and line breaks.
+ max_indent := 0
+ for {
+ // Eat the intendation spaces.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ if parser.mark.column > max_indent {
+ max_indent = parser.mark.column
+ }
+
+ // Check for a tab character messing the intendation.
+ if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) {
+ return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+ start_mark, "found a tab character where an intendation space is expected")
+ }
+
+ // Have we found a non-empty line?
+ if !is_break(parser.buffer, parser.buffer_pos) {
+ break
+ }
+
+ // Consume the line break.
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ // [Go] Should really be returning breaks instead.
+ *breaks = read_line(parser, *breaks)
+ *end_mark = parser.mark
+ }
+
+ // Determine the indentation level if needed.
+ if *indent == 0 {
+ *indent = max_indent
+ if *indent < parser.indent+1 {
+ *indent = parser.indent + 1
+ }
+ if *indent < 1 {
+ *indent = 1
+ }
+ }
+ return true
+}
+
+// Scan a quoted scalar.
+func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool {
+ // Eat the left quote.
+ start_mark := parser.mark
+ skip(parser)
+
+ // Consume the content of the quoted scalar.
+ var s, leading_break, trailing_breaks, whitespaces []byte
+ for {
+ // Check that there are no document indicators at the beginning of the line.
+ if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
+ return false
+ }
+
+ if parser.mark.column == 0 &&
+ ((parser.buffer[parser.buffer_pos+0] == '-' &&
+ parser.buffer[parser.buffer_pos+1] == '-' &&
+ parser.buffer[parser.buffer_pos+2] == '-') ||
+ (parser.buffer[parser.buffer_pos+0] == '.' &&
+ parser.buffer[parser.buffer_pos+1] == '.' &&
+ parser.buffer[parser.buffer_pos+2] == '.')) &&
+ is_blankz(parser.buffer, parser.buffer_pos+3) {
+ yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
+ start_mark, "found unexpected document indicator")
+ return false
+ }
+
+ // Check for EOF.
+ if is_z(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
+ start_mark, "found unexpected end of stream")
+ return false
+ }
+
+ // Consume non-blank characters.
+ leading_blanks := false
+ for !is_blankz(parser.buffer, parser.buffer_pos) {
+ if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {
+ // Is is an escaped single quote.
+ s = append(s, '\'')
+ skip(parser)
+ skip(parser)
+
+ } else if single && parser.buffer[parser.buffer_pos] == '\'' {
+ // It is a right single quote.
+ break
+ } else if !single && parser.buffer[parser.buffer_pos] == '"' {
+ // It is a right double quote.
+ break
+
+ } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) {
+ // It is an escaped line break.
+ if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
+ return false
+ }
+ skip(parser)
+ skip_line(parser)
+ leading_blanks = true
+ break
+
+ } else if !single && parser.buffer[parser.buffer_pos] == '\\' {
+ // It is an escape sequence.
+ code_length := 0
+
+ // Check the escape character.
+ switch parser.buffer[parser.buffer_pos+1] {
+ case '0':
+ s = append(s, 0)
+ case 'a':
+ s = append(s, '\x07')
+ case 'b':
+ s = append(s, '\x08')
+ case 't', '\t':
+ s = append(s, '\x09')
+ case 'n':
+ s = append(s, '\x0A')
+ case 'v':
+ s = append(s, '\x0B')
+ case 'f':
+ s = append(s, '\x0C')
+ case 'r':
+ s = append(s, '\x0D')
+ case 'e':
+ s = append(s, '\x1B')
+ case ' ':
+ s = append(s, '\x20')
+ case '"':
+ s = append(s, '"')
+ case '\'':
+ s = append(s, '\'')
+ case '\\':
+ s = append(s, '\\')
+ case 'N': // NEL (#x85)
+ s = append(s, '\xC2')
+ s = append(s, '\x85')
+ case '_': // #xA0
+ s = append(s, '\xC2')
+ s = append(s, '\xA0')
+ case 'L': // LS (#x2028)
+ s = append(s, '\xE2')
+ s = append(s, '\x80')
+ s = append(s, '\xA8')
+ case 'P': // PS (#x2029)
+ s = append(s, '\xE2')
+ s = append(s, '\x80')
+ s = append(s, '\xA9')
+ case 'x':
+ code_length = 2
+ case 'u':
+ code_length = 4
+ case 'U':
+ code_length = 8
+ default:
+ yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+ start_mark, "found unknown escape character")
+ return false
+ }
+
+ skip(parser)
+ skip(parser)
+
+ // Consume an arbitrary escape code.
+ if code_length > 0 {
+ var value int
+
+ // Scan the character value.
+ if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) {
+ return false
+ }
+ for k := 0; k < code_length; k++ {
+ if !is_hex(parser.buffer, parser.buffer_pos+k) {
+ yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+ start_mark, "did not find expected hexdecimal number")
+ return false
+ }
+ value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k)
+ }
+
+ // Check the value and write the character.
+ if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF {
+ yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+ start_mark, "found invalid Unicode character escape code")
+ return false
+ }
+ if value <= 0x7F {
+ s = append(s, byte(value))
+ } else if value <= 0x7FF {
+ s = append(s, byte(0xC0+(value>>6)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ } else if value <= 0xFFFF {
+ s = append(s, byte(0xE0+(value>>12)))
+ s = append(s, byte(0x80+((value>>6)&0x3F)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ } else {
+ s = append(s, byte(0xF0+(value>>18)))
+ s = append(s, byte(0x80+((value>>12)&0x3F)))
+ s = append(s, byte(0x80+((value>>6)&0x3F)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ }
+
+ // Advance the pointer.
+ for k := 0; k < code_length; k++ {
+ skip(parser)
+ }
+ }
+ } else {
+ // It is a non-escaped non-blank character.
+ s = read(parser, s)
+ }
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ }
+
+ // Check if we are at the end of the scalar.
+ if single {
+ if parser.buffer[parser.buffer_pos] == '\'' {
+ break
+ }
+ } else {
+ if parser.buffer[parser.buffer_pos] == '"' {
+ break
+ }
+ }
+
+ // Consume blank characters.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
+ if is_blank(parser.buffer, parser.buffer_pos) {
+ // Consume a space or a tab character.
+ if !leading_blanks {
+ whitespaces = read(parser, whitespaces)
+ } else {
+ skip(parser)
+ }
+ } else {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+
+ // Check if it is a first line break.
+ if !leading_blanks {
+ whitespaces = whitespaces[:0]
+ leading_break = read_line(parser, leading_break)
+ leading_blanks = true
+ } else {
+ trailing_breaks = read_line(parser, trailing_breaks)
+ }
+ }
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Join the whitespaces or fold line breaks.
+ if leading_blanks {
+ // Do we need to fold line breaks?
+ if len(leading_break) > 0 && leading_break[0] == '\n' {
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ } else {
+ s = append(s, trailing_breaks...)
+ }
+ } else {
+ s = append(s, leading_break...)
+ s = append(s, trailing_breaks...)
+ }
+ trailing_breaks = trailing_breaks[:0]
+ leading_break = leading_break[:0]
+ } else {
+ s = append(s, whitespaces...)
+ whitespaces = whitespaces[:0]
+ }
+ }
+
+ // Eat the right quote.
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_SINGLE_QUOTED_SCALAR_STYLE,
+ }
+ if !single {
+ token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ return true
+}
+
+// Scan a plain scalar.
+func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool {
+
+ var s, leading_break, trailing_breaks, whitespaces []byte
+ var leading_blanks bool
+ var indent = parser.indent + 1
+
+ start_mark := parser.mark
+ end_mark := parser.mark
+
+ // Consume the content of the plain scalar.
+ for {
+ // Check for a document indicator.
+ if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
+ return false
+ }
+ if parser.mark.column == 0 &&
+ ((parser.buffer[parser.buffer_pos+0] == '-' &&
+ parser.buffer[parser.buffer_pos+1] == '-' &&
+ parser.buffer[parser.buffer_pos+2] == '-') ||
+ (parser.buffer[parser.buffer_pos+0] == '.' &&
+ parser.buffer[parser.buffer_pos+1] == '.' &&
+ parser.buffer[parser.buffer_pos+2] == '.')) &&
+ is_blankz(parser.buffer, parser.buffer_pos+3) {
+ break
+ }
+
+ // Check for a comment.
+ if parser.buffer[parser.buffer_pos] == '#' {
+ break
+ }
+
+ // Consume non-blank characters.
+ for !is_blankz(parser.buffer, parser.buffer_pos) {
+
+ // Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13".
+ if parser.flow_level > 0 &&
+ parser.buffer[parser.buffer_pos] == ':' &&
+ !is_blankz(parser.buffer, parser.buffer_pos+1) {
+ yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
+ start_mark, "found unexpected ':'")
+ return false
+ }
+
+ // Check for indicators that may end a plain scalar.
+ if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) ||
+ (parser.flow_level > 0 &&
+ (parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == ':' ||
+ parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
+ parser.buffer[parser.buffer_pos] == '}')) {
+ break
+ }
+
+ // Check if we need to join whitespaces and breaks.
+ if leading_blanks || len(whitespaces) > 0 {
+ if leading_blanks {
+ // Do we need to fold line breaks?
+ if leading_break[0] == '\n' {
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ } else {
+ s = append(s, trailing_breaks...)
+ }
+ } else {
+ s = append(s, leading_break...)
+ s = append(s, trailing_breaks...)
+ }
+ trailing_breaks = trailing_breaks[:0]
+ leading_break = leading_break[:0]
+ leading_blanks = false
+ } else {
+ s = append(s, whitespaces...)
+ whitespaces = whitespaces[:0]
+ }
+ }
+
+ // Copy the character.
+ s = read(parser, s)
+
+ end_mark = parser.mark
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ }
+
+ // Is it the end?
+ if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) {
+ break
+ }
+
+ // Consume blank characters.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
+ if is_blank(parser.buffer, parser.buffer_pos) {
+
+ // Check for tab character that abuse intendation.
+ if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
+ start_mark, "found a tab character that violate intendation")
+ return false
+ }
+
+ // Consume a space or a tab character.
+ if !leading_blanks {
+ whitespaces = read(parser, whitespaces)
+ } else {
+ skip(parser)
+ }
+ } else {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+
+ // Check if it is a first line break.
+ if !leading_blanks {
+ whitespaces = whitespaces[:0]
+ leading_break = read_line(parser, leading_break)
+ leading_blanks = true
+ } else {
+ trailing_breaks = read_line(parser, trailing_breaks)
+ }
+ }
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check intendation level.
+ if parser.flow_level == 0 && parser.mark.column < indent {
+ break
+ }
+ }
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_PLAIN_SCALAR_STYLE,
+ }
+
+ // Note that we change the 'simple_key_allowed' flag.
+ if leading_blanks {
+ parser.simple_key_allowed = true
+ }
+ return true
+}
diff --git a/vendor/gopkg.in/yaml.v1/sorter.go b/vendor/gopkg.in/yaml.v1/sorter.go
new file mode 100644
index 000000000..5958822f9
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/sorter.go
@@ -0,0 +1,104 @@
+package yaml
+
+import (
+ "reflect"
+ "unicode"
+)
+
+type keyList []reflect.Value
+
+func (l keyList) Len() int { return len(l) }
+func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
+func (l keyList) Less(i, j int) bool {
+ a := l[i]
+ b := l[j]
+ ak := a.Kind()
+ bk := b.Kind()
+ for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
+ a = a.Elem()
+ ak = a.Kind()
+ }
+ for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
+ b = b.Elem()
+ bk = b.Kind()
+ }
+ af, aok := keyFloat(a)
+ bf, bok := keyFloat(b)
+ if aok && bok {
+ if af != bf {
+ return af < bf
+ }
+ if ak != bk {
+ return ak < bk
+ }
+ return numLess(a, b)
+ }
+ if ak != reflect.String || bk != reflect.String {
+ return ak < bk
+ }
+ ar, br := []rune(a.String()), []rune(b.String())
+ for i := 0; i < len(ar) && i < len(br); i++ {
+ if ar[i] == br[i] {
+ continue
+ }
+ al := unicode.IsLetter(ar[i])
+ bl := unicode.IsLetter(br[i])
+ if al && bl {
+ return ar[i] < br[i]
+ }
+ if al || bl {
+ return bl
+ }
+ var ai, bi int
+ var an, bn int64
+ for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
+ an = an*10 + int64(ar[ai]-'0')
+ }
+ for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
+ bn = bn*10 + int64(br[bi]-'0')
+ }
+ if an != bn {
+ return an < bn
+ }
+ if ai != bi {
+ return ai < bi
+ }
+ return ar[i] < br[i]
+ }
+ return len(ar) < len(br)
+}
+
+// keyFloat returns a float value for v if it is a number/bool
+// and whether it is a number/bool or not.
+func keyFloat(v reflect.Value) (f float64, ok bool) {
+ switch v.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return float64(v.Int()), true
+ case reflect.Float32, reflect.Float64:
+ return v.Float(), true
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return float64(v.Uint()), true
+ case reflect.Bool:
+ if v.Bool() {
+ return 1, true
+ }
+ return 0, true
+ }
+ return 0, false
+}
+
+// numLess returns whether a < b.
+// a and b must necessarily have the same kind.
+func numLess(a, b reflect.Value) bool {
+ switch a.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return a.Int() < b.Int()
+ case reflect.Float32, reflect.Float64:
+ return a.Float() < b.Float()
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return a.Uint() < b.Uint()
+ case reflect.Bool:
+ return !a.Bool() && b.Bool()
+ }
+ panic("not a number")
+}
diff --git a/vendor/gopkg.in/yaml.v1/suite_test.go b/vendor/gopkg.in/yaml.v1/suite_test.go
new file mode 100644
index 000000000..c5cf1ed4f
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/suite_test.go
@@ -0,0 +1,12 @@
+package yaml_test
+
+import (
+ . "gopkg.in/check.v1"
+ "testing"
+)
+
+func Test(t *testing.T) { TestingT(t) }
+
+type S struct{}
+
+var _ = Suite(&S{})
diff --git a/vendor/gopkg.in/yaml.v1/writerc.go b/vendor/gopkg.in/yaml.v1/writerc.go
new file mode 100644
index 000000000..190362f25
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/writerc.go
@@ -0,0 +1,89 @@
+package yaml
+
+// Set the writer error and return false.
+func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool {
+ emitter.error = yaml_WRITER_ERROR
+ emitter.problem = problem
+ return false
+}
+
+// Flush the output buffer.
+func yaml_emitter_flush(emitter *yaml_emitter_t) bool {
+ if emitter.write_handler == nil {
+ panic("write handler not set")
+ }
+
+ // Check if the buffer is empty.
+ if emitter.buffer_pos == 0 {
+ return true
+ }
+
+ // If the output encoding is UTF-8, we don't need to recode the buffer.
+ if emitter.encoding == yaml_UTF8_ENCODING {
+ if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil {
+ return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
+ }
+ emitter.buffer_pos = 0
+ return true
+ }
+
+ // Recode the buffer into the raw buffer.
+ var low, high int
+ if emitter.encoding == yaml_UTF16LE_ENCODING {
+ low, high = 0, 1
+ } else {
+ high, low = 1, 0
+ }
+
+ pos := 0
+ for pos < emitter.buffer_pos {
+ // See the "reader.c" code for more details on UTF-8 encoding. Note
+ // that we assume that the buffer contains a valid UTF-8 sequence.
+
+ // Read the next UTF-8 character.
+ octet := emitter.buffer[pos]
+
+ var w int
+ var value rune
+ switch {
+ case octet&0x80 == 0x00:
+ w, value = 1, rune(octet&0x7F)
+ case octet&0xE0 == 0xC0:
+ w, value = 2, rune(octet&0x1F)
+ case octet&0xF0 == 0xE0:
+ w, value = 3, rune(octet&0x0F)
+ case octet&0xF8 == 0xF0:
+ w, value = 4, rune(octet&0x07)
+ }
+ for k := 1; k < w; k++ {
+ octet = emitter.buffer[pos+k]
+ value = (value << 6) + (rune(octet) & 0x3F)
+ }
+ pos += w
+
+ // Write the character.
+ if value < 0x10000 {
+ var b [2]byte
+ b[high] = byte(value >> 8)
+ b[low] = byte(value & 0xFF)
+ emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1])
+ } else {
+ // Write the character using a surrogate pair (check "reader.c").
+ var b [4]byte
+ value -= 0x10000
+ b[high] = byte(0xD8 + (value >> 18))
+ b[low] = byte((value >> 10) & 0xFF)
+ b[high+2] = byte(0xDC + ((value >> 8) & 0xFF))
+ b[low+2] = byte(value & 0xFF)
+ emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3])
+ }
+ }
+
+ // Write the raw buffer.
+ if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil {
+ return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
+ }
+ emitter.buffer_pos = 0
+ emitter.raw_buffer = emitter.raw_buffer[:0]
+ return true
+}
diff --git a/vendor/gopkg.in/yaml.v1/yaml.go b/vendor/gopkg.in/yaml.v1/yaml.go
new file mode 100644
index 000000000..44b0cc65d
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/yaml.go
@@ -0,0 +1,306 @@
+// Package yaml implements YAML support for the Go language.
+//
+// Source code and other details for the project are available at GitHub:
+//
+// https://github.com/go-yaml/yaml
+//
+package yaml
+
+import (
+ "errors"
+ "fmt"
+ "reflect"
+ "runtime"
+ "strings"
+ "sync"
+)
+
+func handleErr(err *error) {
+ if r := recover(); r != nil {
+ if _, ok := r.(runtime.Error); ok {
+ panic(r)
+ } else if _, ok := r.(*reflect.ValueError); ok {
+ panic(r)
+ } else if _, ok := r.(externalPanic); ok {
+ panic(r)
+ } else if s, ok := r.(string); ok {
+ *err = errors.New("YAML error: " + s)
+ } else if e, ok := r.(error); ok {
+ *err = e
+ } else {
+ panic(r)
+ }
+ }
+}
+
+// The Setter interface may be implemented by types to do their own custom
+// unmarshalling of YAML values, rather than being implicitly assigned by
+// the yaml package machinery. If setting the value works, the method should
+// return true. If it returns false, the value is considered unsupported
+// and is omitted from maps and slices.
+type Setter interface {
+ SetYAML(tag string, value interface{}) bool
+}
+
+// The Getter interface is implemented by types to do their own custom
+// marshalling into a YAML tag and value.
+type Getter interface {
+ GetYAML() (tag string, value interface{})
+}
+
+// Unmarshal decodes the first document found within the in byte slice
+// and assigns decoded values into the out value.
+//
+// Maps and pointers (to a struct, string, int, etc) are accepted as out
+// values. If an internal pointer within a struct is not initialized,
+// the yaml package will initialize it if necessary for unmarshalling
+// the provided data. The out parameter must not be nil.
+//
+// The type of the decoded values and the type of out will be considered,
+// and Unmarshal will do the best possible job to unmarshal values
+// appropriately. It is NOT considered an error, though, to skip values
+// because they are not available in the decoded YAML, or if they are not
+// compatible with the out value. To ensure something was properly
+// unmarshaled use a map or compare against the previous value for the
+// field (usually the zero value).
+//
+// Struct fields are only unmarshalled if they are exported (have an
+// upper case first letter), and are unmarshalled using the field name
+// lowercased as the default key. Custom keys may be defined via the
+// "yaml" name in the field tag: the content preceding the first comma
+// is used as the key, and the following comma-separated options are
+// used to tweak the marshalling process (see Marshal).
+// Conflicting names result in a runtime error.
+//
+// For example:
+//
+// type T struct {
+// F int `yaml:"a,omitempty"`
+// B int
+// }
+// var T t
+// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
+//
+// See the documentation of Marshal for the format of tags and a list of
+// supported tag options.
+//
+func Unmarshal(in []byte, out interface{}) (err error) {
+ defer handleErr(&err)
+ d := newDecoder()
+ p := newParser(in)
+ defer p.destroy()
+ node := p.parse()
+ if node != nil {
+ d.unmarshal(node, reflect.ValueOf(out))
+ }
+ return nil
+}
+
+// Marshal serializes the value provided into a YAML document. The structure
+// of the generated document will reflect the structure of the value itself.
+// Maps and pointers (to struct, string, int, etc) are accepted as the in value.
+//
+// Struct fields are only unmarshalled if they are exported (have an upper case
+// first letter), and are unmarshalled using the field name lowercased as the
+// default key. Custom keys may be defined via the "yaml" name in the field
+// tag: the content preceding the first comma is used as the key, and the
+// following comma-separated options are used to tweak the marshalling process.
+// Conflicting names result in a runtime error.
+//
+// The field tag format accepted is:
+//
+// `(...) yaml:"[][,[,]]" (...)`
+//
+// The following flags are currently supported:
+//
+// omitempty Only include the field if it's not set to the zero
+// value for the type or to empty slices or maps.
+// Does not apply to zero valued structs.
+//
+// flow Marshal using a flow style (useful for structs,
+// sequences and maps.
+//
+// inline Inline the struct it's applied to, so its fields
+// are processed as if they were part of the outer
+// struct.
+//
+// In addition, if the key is "-", the field is ignored.
+//
+// For example:
+//
+// type T struct {
+// F int "a,omitempty"
+// B int
+// }
+// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
+// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
+//
+func Marshal(in interface{}) (out []byte, err error) {
+ defer handleErr(&err)
+ e := newEncoder()
+ defer e.destroy()
+ e.marshal("", reflect.ValueOf(in))
+ e.finish()
+ out = e.out
+ return
+}
+
+// --------------------------------------------------------------------------
+// Maintain a mapping of keys to structure field indexes
+
+// The code in this section was copied from mgo/bson.
+
+// structInfo holds details for the serialization of fields of
+// a given struct.
+type structInfo struct {
+ FieldsMap map[string]fieldInfo
+ FieldsList []fieldInfo
+
+ // InlineMap is the number of the field in the struct that
+ // contains an ,inline map, or -1 if there's none.
+ InlineMap int
+}
+
+type fieldInfo struct {
+ Key string
+ Num int
+ OmitEmpty bool
+ Flow bool
+
+ // Inline holds the field index if the field is part of an inlined struct.
+ Inline []int
+}
+
+var structMap = make(map[reflect.Type]*structInfo)
+var fieldMapMutex sync.RWMutex
+
+type externalPanic string
+
+func (e externalPanic) String() string {
+ return string(e)
+}
+
+func getStructInfo(st reflect.Type) (*structInfo, error) {
+ fieldMapMutex.RLock()
+ sinfo, found := structMap[st]
+ fieldMapMutex.RUnlock()
+ if found {
+ return sinfo, nil
+ }
+
+ n := st.NumField()
+ fieldsMap := make(map[string]fieldInfo)
+ fieldsList := make([]fieldInfo, 0, n)
+ inlineMap := -1
+ for i := 0; i != n; i++ {
+ field := st.Field(i)
+ if field.PkgPath != "" {
+ continue // Private field
+ }
+
+ info := fieldInfo{Num: i}
+
+ tag := field.Tag.Get("yaml")
+ if tag == "" && strings.Index(string(field.Tag), ":") < 0 {
+ tag = string(field.Tag)
+ }
+ if tag == "-" {
+ continue
+ }
+
+ inline := false
+ fields := strings.Split(tag, ",")
+ if len(fields) > 1 {
+ for _, flag := range fields[1:] {
+ switch flag {
+ case "omitempty":
+ info.OmitEmpty = true
+ case "flow":
+ info.Flow = true
+ case "inline":
+ inline = true
+ default:
+ msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st)
+ panic(externalPanic(msg))
+ }
+ }
+ tag = fields[0]
+ }
+
+ if inline {
+ switch field.Type.Kind() {
+ //case reflect.Map:
+ // if inlineMap >= 0 {
+ // return nil, errors.New("Multiple ,inline maps in struct " + st.String())
+ // }
+ // if field.Type.Key() != reflect.TypeOf("") {
+ // return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String())
+ // }
+ // inlineMap = info.Num
+ case reflect.Struct:
+ sinfo, err := getStructInfo(field.Type)
+ if err != nil {
+ return nil, err
+ }
+ for _, finfo := range sinfo.FieldsList {
+ if _, found := fieldsMap[finfo.Key]; found {
+ msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String()
+ return nil, errors.New(msg)
+ }
+ if finfo.Inline == nil {
+ finfo.Inline = []int{i, finfo.Num}
+ } else {
+ finfo.Inline = append([]int{i}, finfo.Inline...)
+ }
+ fieldsMap[finfo.Key] = finfo
+ fieldsList = append(fieldsList, finfo)
+ }
+ default:
+ //panic("Option ,inline needs a struct value or map field")
+ panic("Option ,inline needs a struct value field")
+ }
+ continue
+ }
+
+ if tag != "" {
+ info.Key = tag
+ } else {
+ info.Key = strings.ToLower(field.Name)
+ }
+
+ if _, found = fieldsMap[info.Key]; found {
+ msg := "Duplicated key '" + info.Key + "' in struct " + st.String()
+ return nil, errors.New(msg)
+ }
+
+ fieldsList = append(fieldsList, info)
+ fieldsMap[info.Key] = info
+ }
+
+ sinfo = &structInfo{fieldsMap, fieldsList, inlineMap}
+
+ fieldMapMutex.Lock()
+ structMap[st] = sinfo
+ fieldMapMutex.Unlock()
+ return sinfo, nil
+}
+
+func isZero(v reflect.Value) bool {
+ switch v.Kind() {
+ case reflect.String:
+ return len(v.String()) == 0
+ case reflect.Interface, reflect.Ptr:
+ return v.IsNil()
+ case reflect.Slice:
+ return v.Len() == 0
+ case reflect.Map:
+ return v.Len() == 0
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return v.Int() == 0
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return v.Uint() == 0
+ case reflect.Bool:
+ return !v.Bool()
+ }
+ return false
+}
diff --git a/vendor/gopkg.in/yaml.v1/yamlh.go b/vendor/gopkg.in/yaml.v1/yamlh.go
new file mode 100644
index 000000000..6624d6c69
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/yamlh.go
@@ -0,0 +1,712 @@
+package yaml
+
+import (
+ "io"
+)
+
+// The version directive data.
+type yaml_version_directive_t struct {
+ major int8 // The major version number.
+ minor int8 // The minor version number.
+}
+
+// The tag directive data.
+type yaml_tag_directive_t struct {
+ handle []byte // The tag handle.
+ prefix []byte // The tag prefix.
+}
+
+type yaml_encoding_t int
+
+// The stream encoding.
+const (
+ // Let the parser choose the encoding.
+ yaml_ANY_ENCODING yaml_encoding_t = iota
+
+ yaml_UTF8_ENCODING // The default UTF-8 encoding.
+ yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM.
+ yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM.
+)
+
+type yaml_break_t int
+
+// Line break types.
+const (
+ // Let the parser choose the break type.
+ yaml_ANY_BREAK yaml_break_t = iota
+
+ yaml_CR_BREAK // Use CR for line breaks (Mac style).
+ yaml_LN_BREAK // Use LN for line breaks (Unix style).
+ yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style).
+)
+
+type yaml_error_type_t int
+
+// Many bad things could happen with the parser and emitter.
+const (
+ // No error is produced.
+ yaml_NO_ERROR yaml_error_type_t = iota
+
+ yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory.
+ yaml_READER_ERROR // Cannot read or decode the input stream.
+ yaml_SCANNER_ERROR // Cannot scan the input stream.
+ yaml_PARSER_ERROR // Cannot parse the input stream.
+ yaml_COMPOSER_ERROR // Cannot compose a YAML document.
+ yaml_WRITER_ERROR // Cannot write to the output stream.
+ yaml_EMITTER_ERROR // Cannot emit a YAML stream.
+)
+
+// The pointer position.
+type yaml_mark_t struct {
+ index int // The position index.
+ line int // The position line.
+ column int // The position column.
+}
+
+// Node Styles
+
+type yaml_style_t int8
+
+type yaml_scalar_style_t yaml_style_t
+
+// Scalar styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota
+
+ yaml_PLAIN_SCALAR_STYLE // The plain scalar style.
+ yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style.
+ yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style.
+ yaml_LITERAL_SCALAR_STYLE // The literal scalar style.
+ yaml_FOLDED_SCALAR_STYLE // The folded scalar style.
+)
+
+type yaml_sequence_style_t yaml_style_t
+
+// Sequence styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota
+
+ yaml_BLOCK_SEQUENCE_STYLE // The block sequence style.
+ yaml_FLOW_SEQUENCE_STYLE // The flow sequence style.
+)
+
+type yaml_mapping_style_t yaml_style_t
+
+// Mapping styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota
+
+ yaml_BLOCK_MAPPING_STYLE // The block mapping style.
+ yaml_FLOW_MAPPING_STYLE // The flow mapping style.
+)
+
+// Tokens
+
+type yaml_token_type_t int
+
+// Token types.
+const (
+ // An empty token.
+ yaml_NO_TOKEN yaml_token_type_t = iota
+
+ yaml_STREAM_START_TOKEN // A STREAM-START token.
+ yaml_STREAM_END_TOKEN // A STREAM-END token.
+
+ yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token.
+ yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token.
+ yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token.
+ yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token.
+
+ yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token.
+ yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token.
+ yaml_BLOCK_END_TOKEN // A BLOCK-END token.
+
+ yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token.
+ yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token.
+ yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token.
+ yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token.
+
+ yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token.
+ yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token.
+ yaml_KEY_TOKEN // A KEY token.
+ yaml_VALUE_TOKEN // A VALUE token.
+
+ yaml_ALIAS_TOKEN // An ALIAS token.
+ yaml_ANCHOR_TOKEN // An ANCHOR token.
+ yaml_TAG_TOKEN // A TAG token.
+ yaml_SCALAR_TOKEN // A SCALAR token.
+)
+
+func (tt yaml_token_type_t) String() string {
+ switch tt {
+ case yaml_NO_TOKEN:
+ return "yaml_NO_TOKEN"
+ case yaml_STREAM_START_TOKEN:
+ return "yaml_STREAM_START_TOKEN"
+ case yaml_STREAM_END_TOKEN:
+ return "yaml_STREAM_END_TOKEN"
+ case yaml_VERSION_DIRECTIVE_TOKEN:
+ return "yaml_VERSION_DIRECTIVE_TOKEN"
+ case yaml_TAG_DIRECTIVE_TOKEN:
+ return "yaml_TAG_DIRECTIVE_TOKEN"
+ case yaml_DOCUMENT_START_TOKEN:
+ return "yaml_DOCUMENT_START_TOKEN"
+ case yaml_DOCUMENT_END_TOKEN:
+ return "yaml_DOCUMENT_END_TOKEN"
+ case yaml_BLOCK_SEQUENCE_START_TOKEN:
+ return "yaml_BLOCK_SEQUENCE_START_TOKEN"
+ case yaml_BLOCK_MAPPING_START_TOKEN:
+ return "yaml_BLOCK_MAPPING_START_TOKEN"
+ case yaml_BLOCK_END_TOKEN:
+ return "yaml_BLOCK_END_TOKEN"
+ case yaml_FLOW_SEQUENCE_START_TOKEN:
+ return "yaml_FLOW_SEQUENCE_START_TOKEN"
+ case yaml_FLOW_SEQUENCE_END_TOKEN:
+ return "yaml_FLOW_SEQUENCE_END_TOKEN"
+ case yaml_FLOW_MAPPING_START_TOKEN:
+ return "yaml_FLOW_MAPPING_START_TOKEN"
+ case yaml_FLOW_MAPPING_END_TOKEN:
+ return "yaml_FLOW_MAPPING_END_TOKEN"
+ case yaml_BLOCK_ENTRY_TOKEN:
+ return "yaml_BLOCK_ENTRY_TOKEN"
+ case yaml_FLOW_ENTRY_TOKEN:
+ return "yaml_FLOW_ENTRY_TOKEN"
+ case yaml_KEY_TOKEN:
+ return "yaml_KEY_TOKEN"
+ case yaml_VALUE_TOKEN:
+ return "yaml_VALUE_TOKEN"
+ case yaml_ALIAS_TOKEN:
+ return "yaml_ALIAS_TOKEN"
+ case yaml_ANCHOR_TOKEN:
+ return "yaml_ANCHOR_TOKEN"
+ case yaml_TAG_TOKEN:
+ return "yaml_TAG_TOKEN"
+ case yaml_SCALAR_TOKEN:
+ return "yaml_SCALAR_TOKEN"
+ }
+ return ""
+}
+
+// The token structure.
+type yaml_token_t struct {
+ // The token type.
+ typ yaml_token_type_t
+
+ // The start/end of the token.
+ start_mark, end_mark yaml_mark_t
+
+ // The stream encoding (for yaml_STREAM_START_TOKEN).
+ encoding yaml_encoding_t
+
+ // The alias/anchor/scalar value or tag/tag directive handle
+ // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN).
+ value []byte
+
+ // The tag suffix (for yaml_TAG_TOKEN).
+ suffix []byte
+
+ // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN).
+ prefix []byte
+
+ // The scalar style (for yaml_SCALAR_TOKEN).
+ style yaml_scalar_style_t
+
+ // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN).
+ major, minor int8
+}
+
+// Events
+
+type yaml_event_type_t int8
+
+// Event types.
+const (
+ // An empty event.
+ yaml_NO_EVENT yaml_event_type_t = iota
+
+ yaml_STREAM_START_EVENT // A STREAM-START event.
+ yaml_STREAM_END_EVENT // A STREAM-END event.
+ yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event.
+ yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event.
+ yaml_ALIAS_EVENT // An ALIAS event.
+ yaml_SCALAR_EVENT // A SCALAR event.
+ yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event.
+ yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event.
+ yaml_MAPPING_START_EVENT // A MAPPING-START event.
+ yaml_MAPPING_END_EVENT // A MAPPING-END event.
+)
+
+// The event structure.
+type yaml_event_t struct {
+
+ // The event type.
+ typ yaml_event_type_t
+
+ // The start and end of the event.
+ start_mark, end_mark yaml_mark_t
+
+ // The document encoding (for yaml_STREAM_START_EVENT).
+ encoding yaml_encoding_t
+
+ // The version directive (for yaml_DOCUMENT_START_EVENT).
+ version_directive *yaml_version_directive_t
+
+ // The list of tag directives (for yaml_DOCUMENT_START_EVENT).
+ tag_directives []yaml_tag_directive_t
+
+ // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT).
+ anchor []byte
+
+ // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
+ tag []byte
+
+ // The scalar value (for yaml_SCALAR_EVENT).
+ value []byte
+
+ // Is the document start/end indicator implicit, or the tag optional?
+ // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT).
+ implicit bool
+
+ // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT).
+ quoted_implicit bool
+
+ // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
+ style yaml_style_t
+}
+
+func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) }
+func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) }
+func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) }
+
+// Nodes
+
+const (
+ yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null.
+ yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false.
+ yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values.
+ yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values.
+ yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values.
+ yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values.
+
+ yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences.
+ yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping.
+
+ yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str.
+ yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq.
+ yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map.
+)
+
+type yaml_node_type_t int
+
+// Node types.
+const (
+ // An empty node.
+ yaml_NO_NODE yaml_node_type_t = iota
+
+ yaml_SCALAR_NODE // A scalar node.
+ yaml_SEQUENCE_NODE // A sequence node.
+ yaml_MAPPING_NODE // A mapping node.
+)
+
+// An element of a sequence node.
+type yaml_node_item_t int
+
+// An element of a mapping node.
+type yaml_node_pair_t struct {
+ key int // The key of the element.
+ value int // The value of the element.
+}
+
+// The node structure.
+type yaml_node_t struct {
+ typ yaml_node_type_t // The node type.
+ tag []byte // The node tag.
+
+ // The node data.
+
+ // The scalar parameters (for yaml_SCALAR_NODE).
+ scalar struct {
+ value []byte // The scalar value.
+ length int // The length of the scalar value.
+ style yaml_scalar_style_t // The scalar style.
+ }
+
+ // The sequence parameters (for YAML_SEQUENCE_NODE).
+ sequence struct {
+ items_data []yaml_node_item_t // The stack of sequence items.
+ style yaml_sequence_style_t // The sequence style.
+ }
+
+ // The mapping parameters (for yaml_MAPPING_NODE).
+ mapping struct {
+ pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value).
+ pairs_start *yaml_node_pair_t // The beginning of the stack.
+ pairs_end *yaml_node_pair_t // The end of the stack.
+ pairs_top *yaml_node_pair_t // The top of the stack.
+ style yaml_mapping_style_t // The mapping style.
+ }
+
+ start_mark yaml_mark_t // The beginning of the node.
+ end_mark yaml_mark_t // The end of the node.
+
+}
+
+// The document structure.
+type yaml_document_t struct {
+
+ // The document nodes.
+ nodes []yaml_node_t
+
+ // The version directive.
+ version_directive *yaml_version_directive_t
+
+ // The list of tag directives.
+ tag_directives_data []yaml_tag_directive_t
+ tag_directives_start int // The beginning of the tag directives list.
+ tag_directives_end int // The end of the tag directives list.
+
+ start_implicit int // Is the document start indicator implicit?
+ end_implicit int // Is the document end indicator implicit?
+
+ // The start/end of the document.
+ start_mark, end_mark yaml_mark_t
+}
+
+// The prototype of a read handler.
+//
+// The read handler is called when the parser needs to read more bytes from the
+// source. The handler should write not more than size bytes to the buffer.
+// The number of written bytes should be set to the size_read variable.
+//
+// [in,out] data A pointer to an application data specified by
+// yaml_parser_set_input().
+// [out] buffer The buffer to write the data from the source.
+// [in] size The size of the buffer.
+// [out] size_read The actual number of bytes read from the source.
+//
+// On success, the handler should return 1. If the handler failed,
+// the returned value should be 0. On EOF, the handler should set the
+// size_read to 0 and return 1.
+type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error)
+
+// This structure holds information about a potential simple key.
+type yaml_simple_key_t struct {
+ possible bool // Is a simple key possible?
+ required bool // Is a simple key required?
+ token_number int // The number of the token.
+ mark yaml_mark_t // The position mark.
+}
+
+// The states of the parser.
+type yaml_parser_state_t int
+
+const (
+ yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota
+
+ yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document.
+ yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START.
+ yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document.
+ yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END.
+ yaml_PARSE_BLOCK_NODE_STATE // Expect a block node.
+ yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence.
+ yaml_PARSE_FLOW_NODE_STATE // Expect a flow node.
+ yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence.
+ yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence.
+ yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence.
+ yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
+ yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key.
+ yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value.
+ yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry.
+ yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping.
+ yaml_PARSE_END_STATE // Expect nothing.
+)
+
+func (ps yaml_parser_state_t) String() string {
+ switch ps {
+ case yaml_PARSE_STREAM_START_STATE:
+ return "yaml_PARSE_STREAM_START_STATE"
+ case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
+ return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE"
+ case yaml_PARSE_DOCUMENT_START_STATE:
+ return "yaml_PARSE_DOCUMENT_START_STATE"
+ case yaml_PARSE_DOCUMENT_CONTENT_STATE:
+ return "yaml_PARSE_DOCUMENT_CONTENT_STATE"
+ case yaml_PARSE_DOCUMENT_END_STATE:
+ return "yaml_PARSE_DOCUMENT_END_STATE"
+ case yaml_PARSE_BLOCK_NODE_STATE:
+ return "yaml_PARSE_BLOCK_NODE_STATE"
+ case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
+ return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE"
+ case yaml_PARSE_FLOW_NODE_STATE:
+ return "yaml_PARSE_FLOW_NODE_STATE"
+ case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
+ return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE"
+ case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE"
+ case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE"
+ case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_KEY_STATE"
+ case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE"
+ case yaml_PARSE_END_STATE:
+ return "yaml_PARSE_END_STATE"
+ }
+ return ""
+}
+
+// This structure holds aliases data.
+type yaml_alias_data_t struct {
+ anchor []byte // The anchor.
+ index int // The node id.
+ mark yaml_mark_t // The anchor mark.
+}
+
+// The parser structure.
+//
+// All members are internal. Manage the structure using the
+// yaml_parser_ family of functions.
+type yaml_parser_t struct {
+
+ // Error handling
+
+ error yaml_error_type_t // Error type.
+
+ problem string // Error description.
+
+ // The byte about which the problem occured.
+ problem_offset int
+ problem_value int
+ problem_mark yaml_mark_t
+
+ // The error context.
+ context string
+ context_mark yaml_mark_t
+
+ // Reader stuff
+
+ read_handler yaml_read_handler_t // Read handler.
+
+ input_file io.Reader // File input data.
+ input []byte // String input data.
+ input_pos int
+
+ eof bool // EOF flag
+
+ buffer []byte // The working buffer.
+ buffer_pos int // The current position of the buffer.
+
+ unread int // The number of unread characters in the buffer.
+
+ raw_buffer []byte // The raw buffer.
+ raw_buffer_pos int // The current position of the buffer.
+
+ encoding yaml_encoding_t // The input encoding.
+
+ offset int // The offset of the current position (in bytes).
+ mark yaml_mark_t // The mark of the current position.
+
+ // Scanner stuff
+
+ stream_start_produced bool // Have we started to scan the input stream?
+ stream_end_produced bool // Have we reached the end of the input stream?
+
+ flow_level int // The number of unclosed '[' and '{' indicators.
+
+ tokens []yaml_token_t // The tokens queue.
+ tokens_head int // The head of the tokens queue.
+ tokens_parsed int // The number of tokens fetched from the queue.
+ token_available bool // Does the tokens queue contain a token ready for dequeueing.
+
+ indent int // The current indentation level.
+ indents []int // The indentation levels stack.
+
+ simple_key_allowed bool // May a simple key occur at the current position?
+ simple_keys []yaml_simple_key_t // The stack of simple keys.
+
+ // Parser stuff
+
+ state yaml_parser_state_t // The current parser state.
+ states []yaml_parser_state_t // The parser states stack.
+ marks []yaml_mark_t // The stack of marks.
+ tag_directives []yaml_tag_directive_t // The list of TAG directives.
+
+ // Dumper stuff
+
+ aliases []yaml_alias_data_t // The alias data.
+
+ document *yaml_document_t // The currently parsed document.
+}
+
+// Emitter Definitions
+
+// The prototype of a write handler.
+//
+// The write handler is called when the emitter needs to flush the accumulated
+// characters to the output. The handler should write @a size bytes of the
+// @a buffer to the output.
+//
+// @param[in,out] data A pointer to an application data specified by
+// yaml_emitter_set_output().
+// @param[in] buffer The buffer with bytes to be written.
+// @param[in] size The size of the buffer.
+//
+// @returns On success, the handler should return @c 1. If the handler failed,
+// the returned value should be @c 0.
+//
+type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error
+
+type yaml_emitter_state_t int
+
+// The emitter states.
+const (
+ // Expect STREAM-START.
+ yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota
+
+ yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END.
+ yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END.
+ yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document.
+ yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END.
+ yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence.
+ yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence.
+ yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
+ yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence.
+ yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence.
+ yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping.
+ yaml_EMIT_END_STATE // Expect nothing.
+)
+
+// The emitter structure.
+//
+// All members are internal. Manage the structure using the @c yaml_emitter_
+// family of functions.
+type yaml_emitter_t struct {
+
+ // Error handling
+
+ error yaml_error_type_t // Error type.
+ problem string // Error description.
+
+ // Writer stuff
+
+ write_handler yaml_write_handler_t // Write handler.
+
+ output_buffer *[]byte // String output data.
+ output_file io.Writer // File output data.
+
+ buffer []byte // The working buffer.
+ buffer_pos int // The current position of the buffer.
+
+ raw_buffer []byte // The raw buffer.
+ raw_buffer_pos int // The current position of the buffer.
+
+ encoding yaml_encoding_t // The stream encoding.
+
+ // Emitter stuff
+
+ canonical bool // If the output is in the canonical style?
+ best_indent int // The number of indentation spaces.
+ best_width int // The preferred width of the output lines.
+ unicode bool // Allow unescaped non-ASCII characters?
+ line_break yaml_break_t // The preferred line break.
+
+ state yaml_emitter_state_t // The current emitter state.
+ states []yaml_emitter_state_t // The stack of states.
+
+ events []yaml_event_t // The event queue.
+ events_head int // The head of the event queue.
+
+ indents []int // The stack of indentation levels.
+
+ tag_directives []yaml_tag_directive_t // The list of tag directives.
+
+ indent int // The current indentation level.
+
+ flow_level int // The current flow level.
+
+ root_context bool // Is it the document root context?
+ sequence_context bool // Is it a sequence context?
+ mapping_context bool // Is it a mapping context?
+ simple_key_context bool // Is it a simple mapping key context?
+
+ line int // The current line.
+ column int // The current column.
+ whitespace bool // If the last character was a whitespace?
+ indention bool // If the last character was an indentation character (' ', '-', '?', ':')?
+ open_ended bool // If an explicit document end is required?
+
+ // Anchor analysis.
+ anchor_data struct {
+ anchor []byte // The anchor value.
+ alias bool // Is it an alias?
+ }
+
+ // Tag analysis.
+ tag_data struct {
+ handle []byte // The tag handle.
+ suffix []byte // The tag suffix.
+ }
+
+ // Scalar analysis.
+ scalar_data struct {
+ value []byte // The scalar value.
+ multiline bool // Does the scalar contain line breaks?
+ flow_plain_allowed bool // Can the scalar be expessed in the flow plain style?
+ block_plain_allowed bool // Can the scalar be expressed in the block plain style?
+ single_quoted_allowed bool // Can the scalar be expressed in the single quoted style?
+ block_allowed bool // Can the scalar be expressed in the literal or folded styles?
+ style yaml_scalar_style_t // The output style.
+ }
+
+ // Dumper stuff
+
+ opened bool // If the stream was already opened?
+ closed bool // If the stream was already closed?
+
+ // The information associated with the document nodes.
+ anchors *struct {
+ references int // The number of references.
+ anchor int // The anchor id.
+ serialized bool // If the node has been emitted?
+ }
+
+ last_anchor_id int // The last assigned anchor id.
+
+ document *yaml_document_t // The currently emitted document.
+}
diff --git a/vendor/gopkg.in/yaml.v1/yamlprivateh.go b/vendor/gopkg.in/yaml.v1/yamlprivateh.go
new file mode 100644
index 000000000..8110ce3c3
--- /dev/null
+++ b/vendor/gopkg.in/yaml.v1/yamlprivateh.go
@@ -0,0 +1,173 @@
+package yaml
+
+const (
+ // The size of the input raw buffer.
+ input_raw_buffer_size = 512
+
+ // The size of the input buffer.
+ // It should be possible to decode the whole raw buffer.
+ input_buffer_size = input_raw_buffer_size * 3
+
+ // The size of the output buffer.
+ output_buffer_size = 128
+
+ // The size of the output raw buffer.
+ // It should be possible to encode the whole output buffer.
+ output_raw_buffer_size = (output_buffer_size*2 + 2)
+
+ // The size of other stacks and queues.
+ initial_stack_size = 16
+ initial_queue_size = 16
+ initial_string_size = 16
+)
+
+// Check if the character at the specified position is an alphabetical
+// character, a digit, '_', or '-'.
+func is_alpha(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-'
+}
+
+// Check if the character at the specified position is a digit.
+func is_digit(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9'
+}
+
+// Get the value of a digit.
+func as_digit(b []byte, i int) int {
+ return int(b[i]) - '0'
+}
+
+// Check if the character at the specified position is a hex-digit.
+func is_hex(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f'
+}
+
+// Get the value of a hex-digit.
+func as_hex(b []byte, i int) int {
+ bi := b[i]
+ if bi >= 'A' && bi <= 'F' {
+ return int(bi) - 'A' + 10
+ }
+ if bi >= 'a' && bi <= 'f' {
+ return int(bi) - 'a' + 10
+ }
+ return int(bi) - '0'
+}
+
+// Check if the character is ASCII.
+func is_ascii(b []byte, i int) bool {
+ return b[i] <= 0x7F
+}
+
+// Check if the character at the start of the buffer can be printed unescaped.
+func is_printable(b []byte, i int) bool {
+ return ((b[i] == 0x0A) || // . == #x0A
+ (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E
+ (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF
+ (b[i] > 0xC2 && b[i] < 0xED) ||
+ (b[i] == 0xED && b[i+1] < 0xA0) ||
+ (b[i] == 0xEE) ||
+ (b[i] == 0xEF && // #xE000 <= . <= #xFFFD
+ !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF
+ !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF))))
+}
+
+// Check if the character at the specified position is NUL.
+func is_z(b []byte, i int) bool {
+ return b[i] == 0x00
+}
+
+// Check if the beginning of the buffer is a BOM.
+func is_bom(b []byte, i int) bool {
+ return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
+}
+
+// Check if the character at the specified position is space.
+func is_space(b []byte, i int) bool {
+ return b[i] == ' '
+}
+
+// Check if the character at the specified position is tab.
+func is_tab(b []byte, i int) bool {
+ return b[i] == '\t'
+}
+
+// Check if the character at the specified position is blank (space or tab).
+func is_blank(b []byte, i int) bool {
+ //return is_space(b, i) || is_tab(b, i)
+ return b[i] == ' ' || b[i] == '\t'
+}
+
+// Check if the character at the specified position is a line break.
+func is_break(b []byte, i int) bool {
+ return (b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029)
+}
+
+func is_crlf(b []byte, i int) bool {
+ return b[i] == '\r' && b[i+1] == '\n'
+}
+
+// Check if the character is a line break or NUL.
+func is_breakz(b []byte, i int) bool {
+ //return is_break(b, i) || is_z(b, i)
+ return ( // is_break:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ // is_z:
+ b[i] == 0)
+}
+
+// Check if the character is a line break, space, or NUL.
+func is_spacez(b []byte, i int) bool {
+ //return is_space(b, i) || is_breakz(b, i)
+ return ( // is_space:
+ b[i] == ' ' ||
+ // is_breakz:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ b[i] == 0)
+}
+
+// Check if the character is a line break, space, tab, or NUL.
+func is_blankz(b []byte, i int) bool {
+ //return is_blank(b, i) || is_breakz(b, i)
+ return ( // is_blank:
+ b[i] == ' ' || b[i] == '\t' ||
+ // is_breakz:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ b[i] == 0)
+}
+
+// Determine the width of the character.
+func width(b byte) int {
+ // Don't replace these by a switch without first
+ // confirming that it is being inlined.
+ if b&0x80 == 0x00 {
+ return 1
+ }
+ if b&0xE0 == 0xC0 {
+ return 2
+ }
+ if b&0xF0 == 0xE0 {
+ return 3
+ }
+ if b&0xF8 == 0xF0 {
+ return 4
+ }
+ return 0
+
+}
diff --git a/vendor/gopkg.in/yaml.v2/decode_test.go b/vendor/gopkg.in/yaml.v2/decode_test.go
index 3d63af3ff..179f2cea4 100644
--- a/vendor/gopkg.in/yaml.v2/decode_test.go
+++ b/vendor/gopkg.in/yaml.v2/decode_test.go
@@ -2,8 +2,8 @@ package yaml_test
import (
"errors"
- "github.com/drone/drone/Godeps/_workspace/src/gopkg.in/yaml.v2"
. "gopkg.in/check.v1"
+ "gopkg.in/yaml.v2"
"math"
"net"
"reflect"
@@ -549,10 +549,6 @@ var unmarshalTests = []struct {
"a: 1.2.3.4\n",
map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)},
},
- {
- "a: 2015-02-24T18:19:39Z\n",
- map[string]time.Time{"a": time.Unix(1424801979, 0)},
- },
// Encode empty lists as zero-length slices.
{
diff --git a/vendor/gopkg.in/yaml.v2/encode_test.go b/vendor/gopkg.in/yaml.v2/encode_test.go
index b513e69c1..e340f58c9 100644
--- a/vendor/gopkg.in/yaml.v2/encode_test.go
+++ b/vendor/gopkg.in/yaml.v2/encode_test.go
@@ -7,10 +7,9 @@ import (
"strings"
"time"
- "github.com/drone/drone/Godeps/_workspace/src/gopkg.in/yaml.v2"
. "gopkg.in/check.v1"
+ "gopkg.in/yaml.v2"
"net"
- "os"
)
var marshalIntTest = 123
@@ -296,10 +295,6 @@ var marshalTests = []struct {
map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)},
"a: 1.2.3.4\n",
},
- {
- map[string]time.Time{"a": time.Unix(1424801979, 0)},
- "a: 2015-02-24T18:19:39Z\n",
- },
// Ensure strings containing ": " are quoted (reported as PR #43, but not reproducible).
{
@@ -309,8 +304,6 @@ var marshalTests = []struct {
}
func (s *S) TestMarshal(c *C) {
- defer os.Setenv("TZ", os.Getenv("TZ"))
- os.Setenv("TZ", "UTC")
for _, item := range marshalTests {
data, err := yaml.Marshal(item.value)
c.Assert(err, IsNil)
@@ -330,7 +323,7 @@ var marshalErrorTests = []struct {
panic: `Duplicated key 'b' in struct struct \{ B int; .*`,
}, {
value: &struct {
- A int
+ A int
B map[string]int ",inline"
}{1, map[string]int{"a": 2}},
panic: `Can't have key "a" in inlined map; conflicts with struct field`,
diff --git a/vendor/gopkg.in/yaml.v2/yaml.go b/vendor/gopkg.in/yaml.v2/yaml.go
index af4df8a42..6af88c00e 100644
--- a/vendor/gopkg.in/yaml.v2/yaml.go
+++ b/vendor/gopkg.in/yaml.v2/yaml.go
@@ -117,7 +117,7 @@ func Unmarshal(in []byte, out interface{}) (err error) {
// Does not apply to zero valued structs.
//
// flow Marshal using a flow style (useful for structs,
-// sequences and maps).
+// sequences and maps.
//
// inline Inline the field, which must be a struct or a map,
// causing all of its fields or keys to be processed as if
diff --git a/yaml/matrix/matrix.go b/yaml/matrix/matrix.go
index 44dca5774..f22a4adae 100644
--- a/yaml/matrix/matrix.go
+++ b/yaml/matrix/matrix.go
@@ -3,7 +3,7 @@ package matrix
import (
"strings"
- "github.com/drone/drone/Godeps/_workspace/src/gopkg.in/yaml.v2"
+ "gopkg.in/yaml.v2"
)
const (
diff --git a/yaml/matrix/matrix_test.go b/yaml/matrix/matrix_test.go
index 8086cf2ac..5906c0c17 100644
--- a/yaml/matrix/matrix_test.go
+++ b/yaml/matrix/matrix_test.go
@@ -3,7 +3,7 @@ package matrix
import (
"testing"
- "github.com/drone/drone/Godeps/_workspace/src/github.com/franela/goblin"
+ "github.com/franela/goblin"
)
func Test_Matrix(t *testing.T) {
@@ -11,12 +11,7 @@ func Test_Matrix(t *testing.T) {
g := goblin.Goblin(t)
g.Describe("Calculate matrix", func() {
- m := map[string][]string{}
- m["go_version"] = []string{"go1", "go1.2"}
- m["python_version"] = []string{"3.2", "3.3"}
- m["django_version"] = []string{"1.7", "1.7.1", "1.7.2"}
- m["redis_version"] = []string{"2.6", "2.8"}
- axis := Calc(m)
+ axis, _ := Parse(fakeMatrix)
g.It("Should calculate permutations", func() {
g.Assert(len(axis)).Equal(24)
@@ -29,5 +24,28 @@ func Test_Matrix(t *testing.T) {
}
g.Assert(len(set)).Equal(24)
})
+
+ g.It("Should return nil if no matrix", func() {
+ axis, err := Parse("")
+ g.Assert(err == nil).IsTrue()
+ g.Assert(axis == nil).IsTrue()
+ })
})
}
+
+var fakeMatrix = `
+matrix:
+ go_version:
+ - go1
+ - go1.2
+ python_version:
+ - 3.2
+ - 3.3
+ django_version:
+ - 1.7
+ - 1.7.1
+ - 1.7.2
+ redis_version:
+ - 2.6
+ - 2.8
+`
diff --git a/yaml/parse.go b/yaml/parse.go
deleted file mode 100644
index 6908743bd..000000000
--- a/yaml/parse.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package parser
-
-import (
- "github.com/drone/drone/pkg/types"
-
- "github.com/drone/drone/Godeps/_workspace/src/gopkg.in/yaml.v2"
-)
-
-func ParseCondition(raw string) (*types.Condition, error) {
- c := struct {
- Condition *types.Condition `yaml:"when"`
- }{}
- err := yaml.Unmarshal([]byte(raw), c)
- return c.Condition, err
-}
diff --git a/yaml/secure/secure.go b/yaml/secure/secure.go
deleted file mode 100644
index 71c2e732c..000000000
--- a/yaml/secure/secure.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package secure
-
-import (
- "crypto/rsa"
- "crypto/x509"
- "encoding/pem"
-
- "github.com/drone/drone/Godeps/_workspace/src/github.com/square/go-jose"
-)
-
-// Encrypt encrypts a secret string.
-func Encrypt(in, privKey string) (string, error) {
- rsaPrivKey, err := decodePrivateKey(privKey)
- if err != nil {
- return "", err
- }
-
- return encrypt(in, &rsaPrivKey.PublicKey)
-}
-
-// decodePrivateKey is a helper function that unmarshals a PEM
-// bytes to an RSA Private Key
-func decodePrivateKey(privateKey string) (*rsa.PrivateKey, error) {
- derBlock, _ := pem.Decode([]byte(privateKey))
- return x509.ParsePKCS1PrivateKey(derBlock.Bytes)
-}
-
-// encrypt encrypts a plaintext variable using JOSE with
-// RSA_OAEP and A128GCM algorithms.
-func encrypt(text string, pubKey *rsa.PublicKey) (string, error) {
- var encrypted string
- var plaintext = []byte(text)
-
- // Creates a new encrypter using defaults
- encrypter, err := jose.NewEncrypter(jose.RSA_OAEP, jose.A128GCM, pubKey)
- if err != nil {
- return encrypted, err
- }
- // Encrypts the plaintext value and serializes
- // as a JOSE string.
- object, err := encrypter.Encrypt(plaintext)
- if err != nil {
- return encrypted, err
- }
- return object.CompactSerialize()
-}
diff --git a/yaml/yaml.go b/yaml/yaml.go
new file mode 100644
index 000000000..6767ba211
--- /dev/null
+++ b/yaml/yaml.go
@@ -0,0 +1,16 @@
+package yaml
+
+import (
+ "gopkg.in/yaml.v2"
+)
+
+type Config struct {
+ Debug bool `yaml:"debug"`
+ Branches []string `yaml:"branches"`
+}
+
+func Parse(raw string) (*Config, error) {
+ c := &Config{}
+ err := yaml.Unmarshal([]byte(raw), c)
+ return c, err
+}